From 00d6f8eb460ede774dfedab2e63f4a13124f5e82 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 12 Dec 2016 19:56:36 -0800 Subject: [PATCH 001/595] Initial stab at 1.11 About halfway. --- build.gradle | 4 +- gradle.properties | 15 +- .../java/WayofTime/bloodmagic/BloodMagic.java | 36 +--- .../api/recipe/AlchemyTableRecipe.java | 4 +- .../api/registry/RitualRegistry.java | 2 + .../api/teleport/TeleporterBloodMagic.java | 2 +- .../block/base/BlockEnumStairs.java | 3 +- .../compat/buttons/BloodMagicPlugin.java | 25 --- .../buttons/button/ButtonFillNetwork.java | 41 ---- .../guideapi/CompatibilityGuideAPI.java | 70 ------ .../compat/guideapi/GuideBloodMagic.java | 42 ++-- .../guideapi/page/PageAlchemyArray.java | 11 +- .../compat/guideapi/page/PageAltarRecipe.java | 2 +- .../AlchemyArrayCraftingCategory.java | 14 +- .../AlchemyArrayCraftingRecipeHandler.java | 8 - .../AlchemyArrayCraftingRecipeJEI.java | 15 +- .../AlchemyTableRecipeCategory.java | 20 +- .../AlchemyTableRecipeHandler.java | 8 - .../alchemyTable/AlchemyTableRecipeJEI.java | 31 +-- .../compat/jei/altar/AltarRecipeCategory.java | 14 +- .../compat/jei/altar/AltarRecipeHandler.java | 8 - .../compat/jei/altar/AltarRecipeJEI.java | 19 +- .../ArmourDowngradeRecipeCategory.java | 20 +- .../ArmourDowngradeRecipeHandler.java | 10 +- .../ArmourDowngradeRecipeJEI.java | 45 +--- .../minecraft/CrossVersionProxy110.java | 39 ---- .../compat/minecraft/CrossVersionProxy19.java | 31 --- .../compat/minecraft/ICrossVersionProxy.java | 17 -- .../compat/waila/WailaCallbackHandler.java | 6 - .../provider/DataProviderAlchemyArray.java | 4 +- .../provider/DataProviderBloodAltar.java | 8 +- .../waila/provider/DataProviderBloodTank.java | 2 +- .../waila/provider/DataProviderMimic.java | 2 +- .../waila/provider/DataProviderPillar.java | 43 ---- .../DataProviderRitualController.java | 2 +- .../waila/provider/DataProviderTeleposer.java | 2 +- .../compress/AdvancedCompressionHandler.java | 32 +-- .../compress/BaseCompressionHandler.java | 12 +- .../compress/StorageBlockCraftingManager.java | 30 +-- ...StorageBlockCraftingRecipeAssimilator.java | 14 +- .../bloodmagic/demonAura/WillChunk.java | 10 +- .../demonAura/WorldDemonWillHandler.java | 3 + .../entity/ai/EntityAIAttackRangedBow.java | 4 +- .../entity/ai/EntityAIAttackStealthMelee.java | 2 +- .../entity/ai/EntityAIEatAndCorruptBlock.java | 2 +- .../entity/ai/EntityAIFollowOwner.java | 10 +- .../ai/EntityAIGrabEffectsFromOwner.java | 10 +- .../entity/ai/EntityAIPickUpAlly.java | 4 +- .../entity/ai/EntityAIProtectAlly.java | 2 +- .../entity/ai/EntityAIRetreatToHeal.java | 2 +- .../entity/ai/EntityAIStealthRetreat.java | 2 +- .../ai/EntityAIStealthTowardsTarget.java | 4 +- .../entity/mob/EntityAspectedDemonBase.java | 6 +- .../entity/mob/EntityCorruptedChicken.java | 4 +- .../entity/mob/EntityCorruptedSheep.java | 4 +- .../entity/mob/EntityCorruptedSpider.java | 20 +- .../entity/mob/EntityCorruptedZombie.java | 27 +-- .../entity/mob/EntityDemonBase.java | 40 ++-- .../bloodmagic/entity/mob/EntityMimic.java | 26 +-- .../entity/mob/EntitySentientSpecter.java | 58 +++-- .../entity/projectile/EntityBloodLight.java | 12 +- .../entity/projectile/EntityMeteor.java | 6 +- .../projectile/EntitySentientArrow.java | 2 +- .../entity/projectile/EntitySoulSnare.java | 6 +- .../fakePlayer/FakeNetHandlerPlayServer.java | 73 ++++--- .../bloodmagic/fakePlayer/FakePlayerBM.java | 2 - .../bloodmagic/gson/Serializers.java | 2 +- .../inversion/InversionPillarHandler.java | 33 +-- .../item/armour/ItemLivingArmour.java | 12 +- .../bloodmagic/livingArmour/LivingArmour.java | 4 +- .../LivingArmourUpgradeDisoriented.java | 4 +- .../LivingArmourUpgradeMeleeDecrease.java | 2 +- .../LivingArmourUpgradeSlowness.java | 2 +- .../LivingArmourUpgradeFallProtect.java | 2 +- .../LivingArmourUpgradeHealthboost.java | 2 +- .../LivingArmourUpgradeKnockbackResist.java | 4 +- .../LivingArmourUpgradeMeleeDamage.java | 2 +- .../upgrade/LivingArmourUpgradeRepairing.java | 2 +- .../LivingArmourUpgradeSolarPowered.java | 2 +- .../upgrade/LivingArmourUpgradeSpeed.java | 2 +- .../bloodmagic/meteor/MeteorComponent.java | 6 +- .../PlayerVelocityPacketProcessor.java | 2 +- .../bloodmagic/potion/BMPotionUtils.java | 2 +- .../potion/PotionEventHandlers.java | 6 +- .../potion/item/ItemPotionFlask.java | 3 +- .../AlchemyTableDyeableRecipe.java | 29 +-- .../AlchemyTablePotionAugmentRecipe.java | 18 +- .../AlchemyTablePotionRecipe.java | 47 ++-- .../bloodmagic/registry/ModCompatibility.java | 2 - .../bloodmagic/registry/ModEntities.java | 26 ++- .../bloodmagic/registry/ModRecipes.java | 2 +- .../bloodmagic/ritual/RitualAltarBuilder.java | 42 ++-- .../bloodmagic/ritual/RitualAnimalGrowth.java | 9 +- .../bloodmagic/ritual/RitualArmourEvolve.java | 2 +- .../bloodmagic/ritual/RitualCobblestone.java | 2 +- .../bloodmagic/ritual/RitualCrushing.java | 58 ++--- .../bloodmagic/ritual/RitualExpulsion.java | 30 +-- .../ritual/RitualFeatheredKnife.java | 2 +- .../bloodmagic/ritual/RitualFelling.java | 8 +- .../bloodmagic/ritual/RitualForsakenSoul.java | 2 +- .../bloodmagic/ritual/RitualFullStomach.java | 2 +- .../bloodmagic/ritual/RitualJumping.java | 33 ++- .../bloodmagic/ritual/RitualMagnetic.java | 5 +- .../bloodmagic/ritual/RitualMeteor.java | 2 +- .../bloodmagic/ritual/RitualPlacer.java | 34 +-- .../bloodmagic/ritual/RitualPortal.java | 14 +- .../bloodmagic/ritual/RitualPump.java | 16 +- .../ritual/RitualUpgradeRemove.java | 4 +- .../ritual/RitualWellOfSuffering.java | 2 +- .../bloodmagic/ritual/RitualZephyr.java | 40 ++-- .../harvest/HarvestHandlerPlantable.java | 6 +- .../ritual/harvest/HarvestHandlerStem.java | 2 +- .../ritual/harvest/HarvestHandlerTall.java | 2 +- .../imperfect/ImperfectRitualZombie.java | 2 +- .../bloodmagic/ritual/portal/Teleports.java | 32 +-- .../bloodmagic/routing/DefaultItemFilter.java | 25 +-- .../routing/IgnoreNBTItemFilter.java | 2 +- .../bloodmagic/routing/ModIdItemFilter.java | 2 +- .../bloodmagic/routing/TestItemFilter.java | 49 ++--- .../structures/BuildTestStructure.java | 4 +- .../bloodmagic/structures/Dungeon.java | 12 +- .../bloodmagic/tile/TileAlchemyArray.java | 4 +- .../bloodmagic/tile/TileAlchemyTable.java | 61 ++---- .../bloodmagic/tile/TileDemonCrucible.java | 22 +- .../bloodmagic/tile/TileDemonCrystal.java | 34 +-- .../tile/TileDemonCrystallizer.java | 20 +- .../bloodmagic/tile/TileDemonPylon.java | 10 +- .../bloodmagic/tile/TileIncenseAltar.java | 18 +- .../bloodmagic/tile/TileInventory.java | 32 +-- .../bloodmagic/tile/TileInversionPillar.java | 52 ++--- .../tile/TileMasterRitualStone.java | 2 +- .../WayofTime/bloodmagic/tile/TileMimic.java | 63 +++--- .../bloodmagic/tile/TilePhantomBlock.java | 4 +- .../tile/TilePurificationAltar.java | 8 +- .../bloodmagic/tile/TileSoulForge.java | 46 ++-- .../bloodmagic/tile/TileSpectralBlock.java | 4 +- .../bloodmagic/tile/TileTeleposer.java | 27 ++- .../tile/container/ContainerAlchemyTable.java | 24 +-- .../container/ContainerItemRoutingNode.java | 24 +-- .../container/ContainerMasterRoutingNode.java | 2 +- .../tile/container/ContainerSoulForge.java | 22 +- .../tile/container/ContainerTeleposer.java | 18 +- .../tile/routing/TileFilteredRoutingNode.java | 14 +- .../tile/routing/TileInputRoutingNode.java | 4 +- .../tile/routing/TileMasterRoutingNode.java | 20 +- .../tile/routing/TileOutputRoutingNode.java | 4 +- .../tile/routing/TileRoutingNode.java | 10 +- .../WayofTime/bloodmagic/util/ChatUtil.java | 2 +- .../bloodmagic/util/GhostItemHelper.java | 2 +- .../java/WayofTime/bloodmagic/util/Utils.java | 201 ++++++++---------- .../util/handler/event/ClientHandler.java | 55 ++--- .../util/handler/event/CraftingHandler.java | 2 - .../util/handler/event/GenericHandler.java | 34 +-- .../handler/event/LivingArmourHandler.java | 4 +- .../handler/event/StatTrackerHandler.java | 6 +- .../util/handler/event/WillHandler.java | 12 +- .../bloodmagic/util/helper/RecipeHelper.java | 6 +- 157 files changed, 1036 insertions(+), 1554 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/buttons/BloodMagicPlugin.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/buttons/button/ButtonFillNetwork.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/CompatibilityGuideAPI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy110.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy19.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/minecraft/ICrossVersionProxy.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderPillar.java diff --git a/build.gradle b/build.gradle index fafe77aa..f41cd6e5 100644 --- a/build.gradle +++ b/build.gradle @@ -45,7 +45,6 @@ if (new File(projectDir, '.git').exists()) repositories { maven { url "http://dvs1.progwml6.com/files/maven" } - maven { url "http://mobiusstrip.eu/maven" } maven { url "http://tehnut.info/maven" } ivy { @@ -60,9 +59,8 @@ repositories { dependencies { deobfCompile "mezz.jei:jei_${mc_version}:${jei_version}" - deobfCompile "mcp.mobius.waila:Waila:${waila_version}_${mc_version}:dev" + deobfCompile "mcp.mobius.waila:Hwyla:${waila_version}_${mc_version}" deobfCompile "info.amerifrance.guideapi:Guide-API:${mc_version}-${guideapi_version}" - deobfCompile "info.tehnut.buttons:Buttons:${buttons_version}:api" // compile name: "Thaumcraft", version: "${mc_version}-${thaumcraft_version}", ext: "jar" // compile name: 'Baubles', version: "${baubles_version}", ext: 'jar' diff --git a/gradle.properties b/gradle.properties index 2fd30a99..bd15f2b6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,15 +1,12 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic mod_version=2.1.0 -mc_version=1.9.4 -forge_version=12.17.0.1957 +mc_version=1.11 +forge_version=13.19.1.2189 curse_id=224791 -mappings_version=snapshot_20160518 +mappings_version=snapshot_20161212 -jei_version=3.6.8.225 -waila_version=1.7.0-B3 -thaumcraft_version=5.1.5 -baubles_version=1.1.3.0 -guideapi_version=2.0.0-37 -buttons_version=1.10.2-0.0.3-3 \ No newline at end of file +jei_version=4.0.5.203 +waila_version=1.8.5-B19 +guideapi_version=2.1.0-47 \ 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 776ab881..22651882 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic; import java.io.File; -import java.util.Map; import WayofTime.bloodmagic.meteor.MeteorConfigHandler; import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.launchwrapper.Launch; import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; @@ -25,7 +23,6 @@ import WayofTime.bloodmagic.api.util.helper.LogHelper; import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.compat.ICompatibility; -import WayofTime.bloodmagic.compat.minecraft.ICrossVersionProxy; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.proxy.CommonProxy; import WayofTime.bloodmagic.registry.ModArmourTrackers; @@ -42,8 +39,6 @@ import WayofTime.bloodmagic.structures.ModDungeons; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.handler.IMCHandler; -import com.google.common.collect.ImmutableMap; - @Mod(modid = Constants.Mod.MODID, name = Constants.Mod.NAME, version = Constants.Mod.VERSION, dependencies = Constants.Mod.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory") @Getter public class BloodMagic @@ -57,18 +52,18 @@ public class BloodMagic public static CreativeTabs tabBloodMagic = new CreativeTabs(Constants.Mod.MODID + ".creativeTab") { @Override - public Item getTabIconItem() + public ItemStack getTabIconItem() { - return ModItems.BLOOD_ORB; + return new ItemStack(ModItems.BLOOD_ORB); } }; public static CreativeTabs tabUpgradeTome = new CreativeTabs(Constants.Mod.MODID + ".creativeTabTome") { @Override - public Item getTabIconItem() + public ItemStack getTabIconItem() { - return ModItems.UPGRADE_TOME; + return new ItemStack(ModItems.UPGRADE_TOME); } @Override @@ -76,32 +71,13 @@ public class BloodMagic { return true; } - }; + }.setNoTitle().setBackgroundImageName("upgrade_tomes.png"); @Getter private static boolean isDev = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); - @Getter - private static ICrossVersionProxy crossVersionProxy; - private static final Map PROXY_MAP = ImmutableMap.of("1.9.4", "WayofTime.bloodmagic.compat.minecraft.CrossVersionProxy19", "1.10", "WayofTime.bloodmagic.compat.minecraft.CrossVersionProxy110", "1.10.2", "WayofTime.bloodmagic.compat.minecraft.CrossVersionProxy110"); - static { - try - { - String mcVersion = (String) Loader.class.getDeclaredField("MC_VERSION").get(null); - - if (!PROXY_MAP.containsKey(mcVersion)) - throw new IllegalStateException("Blood Magic couldn't find a cross version proxy!"); - - Class proxyClass = Class.forName(PROXY_MAP.get(mcVersion)); - crossVersionProxy = (ICrossVersionProxy) proxyClass.newInstance(); - } - catch (Exception e) - { - throw new IllegalArgumentException("Blood Magic could not find a cross version proxy!", e); - } - tabUpgradeTome.setNoTitle().setBackgroundImageName("upgrade_tomes.png"); FluidRegistry.enableUniversalBucket(); diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java index 457d180f..ba317b86 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java @@ -15,7 +15,7 @@ import net.minecraftforge.oredict.OreDictionary; public class AlchemyTableRecipe { protected ItemStack output = null; - protected ArrayList input = new ArrayList(); + protected ArrayList input = new ArrayList(); @Getter protected int lpDrained; @Getter @@ -148,7 +148,7 @@ public class AlchemyTableRecipe * * @return The recipes input vales. */ - public ArrayList getInput() + public ArrayList getInput() { return this.input; } diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java index ff0c43d9..f348f630 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.ritual.Ritual; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -57,6 +58,7 @@ public class RitualRegistry registerRitual(ritual, ritual.getName()); } + @Nullable public static Ritual getRitualForId(String id) { Ritual ritual = registry.get(id); diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java b/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java index 2c164ee8..e24c0da2 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java @@ -33,6 +33,6 @@ public class TeleporterBloodMagic extends Teleporter @Override public void placeInPortal(Entity entity, float rotationYaw) { - entity.setLocationAndAngles(MathHelper.floor_double(entity.posX), MathHelper.floor_double(entity.posY) + 2, MathHelper.floor_double(entity.posZ), entity.rotationYaw, entity.rotationPitch); + 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/block/base/BlockEnumStairs.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java index a1d62f6a..77a857e2 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java @@ -27,6 +27,7 @@ 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 WayofTime.bloodmagic.BloodMagic; @@ -368,7 +369,7 @@ public class BlockEnumStairs & IStringSerializable> extends Bl @Override public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) { - if (BloodMagic.getCrossVersionProxy().disableStairSlabCulling()) + if (ForgeModContainer.disableStairSlabCulling) return super.doesSideBlockRendering(state, world, pos, face); if (state.isOpaqueCube()) diff --git a/src/main/java/WayofTime/bloodmagic/compat/buttons/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/buttons/BloodMagicPlugin.java deleted file mode 100644 index ae82e9c0..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/buttons/BloodMagicPlugin.java +++ /dev/null @@ -1,25 +0,0 @@ -package WayofTime.bloodmagic.compat.buttons; - -import WayofTime.bloodmagic.compat.buttons.button.ButtonFillNetwork; -import net.minecraft.util.ResourceLocation; -import tehnut.buttons.api.ButtonsPlugin; -import tehnut.buttons.api.IWidgetPlugin; -import tehnut.buttons.api.IWidgetRegistry; -import tehnut.buttons.api.WidgetTexture; - -@ButtonsPlugin -public class BloodMagicPlugin extends IWidgetPlugin.Base { - - public static final WidgetTexture FILL_BUTTON = new WidgetTexture( - new ResourceLocation("bloodmagic", "textures/gui/buttons_compat.png"), - 0, - 0, - 20, - 20 - ); - - @Override - public void register(IWidgetRegistry widgetRegistry) { - widgetRegistry.addUtilityButton(new ButtonFillNetwork()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/buttons/button/ButtonFillNetwork.java b/src/main/java/WayofTime/bloodmagic/compat/buttons/button/ButtonFillNetwork.java deleted file mode 100644 index c058ce03..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/buttons/button/ButtonFillNetwork.java +++ /dev/null @@ -1,41 +0,0 @@ -package WayofTime.bloodmagic.compat.buttons.button; - -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.compat.buttons.BloodMagicPlugin; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentTranslation; -import tehnut.buttons.api.button.utility.Button; - -import javax.annotation.Nullable; -import java.util.Collections; -import java.util.List; - -public class ButtonFillNetwork extends Button { - - public ButtonFillNetwork() { - super(BloodMagicPlugin.FILL_BUTTON); - - setServerRequired(); - } - - @Nullable - @Override - public List getTooltip() { - return Collections.singletonList(new TextComponentTranslation("button.bloodmagic.tooltip.fill")); - } - - @Override - public void onServerClick(EntityPlayerMP player) { - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - network.setCurrentEssence(Integer.MAX_VALUE); - } - - @Override - public ResourceLocation getButtonId() { - return new ResourceLocation(Constants.Mod.MODID, "button_fillnetwork"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/CompatibilityGuideAPI.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/CompatibilityGuideAPI.java deleted file mode 100644 index 138544cf..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/CompatibilityGuideAPI.java +++ /dev/null @@ -1,70 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; -import WayofTime.bloodmagic.compat.ICompatibility; -import amerifrance.guideapi.api.GuideAPI; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -public class CompatibilityGuideAPI implements ICompatibility -{ - private static IRecipe guideRecipe = null; - private static boolean worldFlag; - - @Override - public void loadCompatibility(InitializationPhase phase) - { - switch (phase) - { - case PRE_INIT: - { - GuideBloodMagic.initBook(); - GameRegistry.register(GuideBloodMagic.guideBook); - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) - GuideAPI.setModel(GuideBloodMagic.guideBook); - - break; - } - case INIT: - { - guideRecipe = new ShapelessOreRecipe(GuideAPI.getStackFromBook(GuideBloodMagic.guideBook), new ItemStack(Items.BOOK), Blocks.GLASS, Items.FEATHER); - break; - } - case POST_INIT: - { - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) - GuideBloodMagic.initCategories(); - break; - } - case MAPPING: - { - if (!worldFlag) { - GameRegistry.addRecipe(guideRecipe); - worldFlag = true; - } else { - CraftingManager.getInstance().getRecipeList().remove(guideRecipe); - worldFlag = false; - } - break; - } - } - } - - @Override - public String getModId() - { - return "guideapi"; - } - - @Override - public boolean enableCompat() - { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java index dc06383b..73cb0fdb 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java @@ -1,50 +1,56 @@ package WayofTime.bloodmagic.compat.guideapi; +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.compat.guideapi.book.*; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.registry.ModItems; import amerifrance.guideapi.api.GuideAPI; +import amerifrance.guideapi.api.GuideBook; +import amerifrance.guideapi.api.IGuideBook; import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.util.NBTBookTags; import amerifrance.guideapi.category.CategoryItemStack; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.relauncher.Side; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.oredict.ShapelessOreRecipe; +import javax.annotation.Nullable; import java.awt.Color; -public class GuideBloodMagic +@GuideBook +public class GuideBloodMagic implements IGuideBook { public static Book guideBook; - public static void initBook() - { + @Nullable + @Override + public Book buildBook() { guideBook = new Book(); guideBook.setTitle("guide.BloodMagic.title"); guideBook.setDisplayName("guide.BloodMagic.display"); guideBook.setWelcomeMessage("guide.BloodMagic.welcome"); guideBook.setAuthor("guide.BloodMagic.author"); - guideBook.setRegistryName("BloodMagic"); + guideBook.setRegistryName(new ResourceLocation(Constants.Mod.MODID, "guide")); guideBook.setColor(Color.RED); - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) - GuideAPI.setModel(guideBook); + return guideBook; } - public static void initCategories() - { + @Override + public void handleModel(ItemStack bookStack) { + GuideAPI.setModel(guideBook); + } + + @Override + public void handlePost(ItemStack bookStack) { guideBook.addCategory(new CategoryItemStack(CategoryAlchemy.buildCategory(), "guide.BloodMagic.category.alchemy", new ItemStack(ModItems.ARCANE_ASHES))); guideBook.addCategory(new CategoryItemStack(CategoryArchitect.buildCategory(), "guide.BloodMagic.category.architect", new ItemStack(ModItems.SIGIL_DIVINATION))); guideBook.addCategory(new CategoryItemStack(CategoryDemon.buildCategory(), "guide.BloodMagic.category.demon", new ItemStack(ModItems.BLOOD_SHARD))); guideBook.addCategory(new CategoryItemStack(CategoryRitual.buildCategory(), "guide.BloodMagic.category.ritual", new ItemStack(ModBlocks.RITUAL_CONTROLLER))); // guideBook.addCategory(new CategoryItemStack(CategorySpell.buildCategory(), "guide.BloodMagic.category.spell", new ItemStack(ModItems.ritualDiviner))); - } - public static void initJEIBlacklist() - { - if (Loader.isModLoaded("JEI")) - BloodMagicPlugin.jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(GuideAPI.guideBook, NBTBookTags.BOOK_TAG, NBTBookTags.CATEGORY_PAGE_TAG, NBTBookTags.CATEGORY_TAG, NBTBookTags.ENTRY_PAGE_TAG, NBTBookTags.ENTRY_TAG, NBTBookTags.KEY_TAG, NBTBookTags.PAGE_TAG); + GameRegistry.addRecipe(new ShapelessOreRecipe(GuideAPI.getStackFromBook(GuideBloodMagic.guideBook), new ItemStack(Items.BOOK), Blocks.GLASS, Items.FEATHER)); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java index 0c2defc9..b8fd8cfc 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.compat.guideapi.page; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import lombok.AllArgsConstructor; @@ -32,17 +33,17 @@ public class PageAlchemyArray extends Page public PageAlchemyArray(List resources, ItemStack inputStack, ItemStack catalystStack) { - this(resources, inputStack, catalystStack, null); + this(resources, inputStack, catalystStack, ItemStack.EMPTY); } public PageAlchemyArray(ResourceLocation resource, ItemStack inputStack, ItemStack catalystStack, ItemStack outputStack) { - this(Arrays.asList(resource), inputStack, catalystStack, outputStack); + this(Collections.singletonList(resource), inputStack, catalystStack, outputStack); } public PageAlchemyArray(ResourceLocation resource, ItemStack inputStack, ItemStack catalystStack) { - this(Arrays.asList(resource), inputStack, catalystStack); + this(Collections.singletonList(resource), inputStack, catalystStack); } @Override @@ -53,7 +54,7 @@ public class PageAlchemyArray extends Page int y = guiTop + 30; Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/alchemyArrayCrafting.png")); - guiBase.drawTexturedModalRect(x, y, 0, 0, 62, 88 + (outputStack == null ? 0 : 26)); + 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); @@ -85,7 +86,7 @@ public class PageAlchemyArray extends Page guiBase.renderToolTip(catalystStack, mouseX, mouseY); } - if (outputStack != null) + if (!outputStack.isEmpty()) { int outputX = x + 43; int outputY = y + 95; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java index 72369163..48490476 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java @@ -53,7 +53,7 @@ public class PageAltarRecipe extends Page guiBase.renderToolTip(input.get(0), mouseX, mouseY); } - if (output == null) + if (output.isEmpty()) { output = new ItemStack(Blocks.BARRIER); } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java index 72653f5f..d2afe677 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java @@ -1,12 +1,15 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; import javax.annotation.Nonnull; +import javax.annotation.Nullable; 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 WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; @@ -50,14 +53,15 @@ public class AlchemyArrayCraftingCategory implements IRecipeCategory } + @Nullable @Override - public void drawAnimations(Minecraft minecraft) + public IDrawable getIcon() { - + return null; } @Override - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) + 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); @@ -66,9 +70,9 @@ public class AlchemyArrayCraftingCategory implements IRecipeCategory if (recipeWrapper instanceof AlchemyArrayCraftingRecipeJEI) { AlchemyArrayCraftingRecipeJEI alchemyArrayWrapper = (AlchemyArrayCraftingRecipeJEI) recipeWrapper; - recipeLayout.getItemStacks().set(INPUT_SLOT, alchemyArrayWrapper.getInputs()); + recipeLayout.getItemStacks().set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); recipeLayout.getItemStacks().set(CATALYST_SLOT, alchemyArrayWrapper.getCatalyst()); - recipeLayout.getItemStacks().set(OUTPUT_SLOT, alchemyArrayWrapper.getOutputs()); + recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0).get(0)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java index 0d6f2acb..42d996db 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java @@ -15,14 +15,6 @@ public class AlchemyArrayCraftingRecipeHandler implements IRecipeHandler getInputs() - { - return inputs; - } - public ItemStack getCatalyst() { return catalyst; } @Override - @Nonnull - public List getOutputs() - { - return Collections.singletonList(output); + public void getIngredients(IIngredients ingredients) { + ingredients.setOutputs(ItemStack.class, Collections.singletonList(output)); + ingredients.setInputs(ItemStack.class, inputs); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java index 7f4c84d7..34b16e28 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -1,14 +1,13 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import java.util.ArrayList; -import java.util.List; - import javax.annotation.Nonnull; +import javax.annotation.Nullable; 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; @@ -63,15 +62,16 @@ public class AlchemyTableRecipeCategory implements IRecipeCategory } + @Nullable @Override - public void drawAnimations(Minecraft minecraft) + public IDrawable getIcon() { - + return null; } - @Override @SuppressWarnings("unchecked") - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) + @Override + public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); @@ -90,9 +90,9 @@ public class AlchemyTableRecipeCategory implements IRecipeCategory if (recipeWrapper instanceof AlchemyTableRecipeJEI) { AlchemyTableRecipeJEI recipe = (AlchemyTableRecipeJEI) recipeWrapper; - guiItemStacks.set(ORB_SLOT, (ArrayList) recipe.getInputs().get(1)); - craftingGridHelper.setOutput(guiItemStacks, recipe.getOutputs()); - craftingGridHelper.setInput(guiItemStacks, (List) recipe.getInputs().get(0), 3, 2); + guiItemStacks.set(ORB_SLOT, ingredients.getInputs(ItemStack.class).get(1)); + craftingGridHelper.setOutput(guiItemStacks, ingredients.getOutputs(ItemStack.class).get(0)); + craftingGridHelper.setInputs(guiItemStacks, ingredients.getInputs(ItemStack.class), 3, 2); } } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java index 91755902..f271d1c4 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java @@ -15,14 +15,6 @@ public class AlchemyTableRecipeHandler implements IRecipeHandler validGems = new ArrayList(); - public AlchemyTableRecipeJEI(AlchemyTableRecipe recipe) { this.recipe = recipe; } @Override - @Nonnull - public List getInputs() - { - ArrayList ret = new ArrayList(); - ret.add(recipe.getInput()); - ret.add(OrbRegistry.getOrbsDownToTier(recipe.getTierRequired())); - return ret; + public void getIngredients(IIngredients ingredients) { +// ingredients.setInputLists(ItemStack.class, Lists.newArrayList(recipe.getInput(), OrbRegistry.getOrbsDownToTier(recipe.getTierRequired()))); + ingredients.setOutput(ItemStack.class, recipe.getRecipeOutput(new ArrayList())); } - @Override - @Nonnull - public List getOutputs() - { - return Collections.singletonList(recipe.getRecipeOutput(new ArrayList())); - } - - @Nullable @Override public List getTooltipStrings(int mouseX, int mouseY) { @@ -54,8 +34,7 @@ public class AlchemyTableRecipeJEI extends BlankRecipeWrapper { ret.add(TextHelper.localize("jei.BloodMagic.recipe.lpDrained", recipe.getLpDrained())); ret.add(TextHelper.localize("jei.BloodMagic.recipe.ticksRequired", recipe.getTicksRequired())); - return ret; } - return null; + return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java index a4a7fc70..b27cb37e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java @@ -1,11 +1,13 @@ package WayofTime.bloodmagic.compat.jei.altar; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.List; 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; @@ -52,14 +54,14 @@ public class AltarRecipeCategory implements IRecipeCategory } + @Nullable @Override - public void drawAnimations(Minecraft minecraft) - { - + public IDrawable getIcon() { + return null; } @Override - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) + public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { recipeLayout.getItemStacks().init(INPUT_SLOT, true, 31, 0); recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 125, 30); @@ -67,9 +69,9 @@ public class AltarRecipeCategory implements IRecipeCategory if (recipeWrapper instanceof AltarRecipeJEI) { AltarRecipeJEI altarRecipeWrapper = (AltarRecipeJEI) recipeWrapper; - List> inputs = altarRecipeWrapper.getInputs(); + List> inputs = ingredients.getInputs(ItemStack.class); recipeLayout.getItemStacks().set(INPUT_SLOT, inputs.get(0)); - recipeLayout.getItemStacks().set(OUTPUT_SLOT, altarRecipeWrapper.getOutputs()); + recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java index dc414295..7fc390e2 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java @@ -15,14 +15,6 @@ public class AltarRecipeHandler implements IRecipeHandler return AltarRecipeJEI.class; } - @Deprecated - @Nonnull - @Override - public String getRecipeCategoryUid() - { - return Constants.Compat.JEI_CATEGORY_ALTAR; - } - @Override public String getRecipeCategoryUid(@Nonnull AltarRecipeJEI recipe) { diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java index 7b9e00cc..a9e1cf18 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java @@ -2,13 +2,12 @@ package WayofTime.bloodmagic.compat.jei.altar; import java.awt.Color; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import WayofTime.bloodmagic.util.helper.NumeralHelper; +import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; @@ -37,18 +36,11 @@ public class AltarRecipeJEI extends BlankRecipeWrapper } @Override - public List> getInputs() - { - return Collections.singletonList(input); + public void getIngredients(IIngredients ingredients) { + ingredients.setInputs(ItemStack.class, input); + ingredients.setOutput(ItemStack.class, output); } - @Override - public List getOutputs() - { - return Collections.singletonList(output); - } - - @Nullable @Override public List getTooltipStrings(int mouseX, int mouseY) { @@ -57,9 +49,8 @@ public class AltarRecipeJEI extends BlankRecipeWrapper { ret.add(TextHelper.localize("jei.BloodMagic.recipe.consumptionRate", consumptionRate)); ret.add(TextHelper.localize("jei.BloodMagic.recipe.drainRate", drainRate)); - return ret; } - return null; + return ret; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java index 83e8efd5..5ca3e731 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java @@ -1,14 +1,13 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import java.util.ArrayList; -import java.util.List; - import javax.annotation.Nonnull; +import javax.annotation.Nullable; 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; @@ -63,15 +62,15 @@ public class ArmourDowngradeRecipeCategory implements IRecipeCategory } + @Nullable @Override - public void drawAnimations(Minecraft minecraft) - { - + public IDrawable getIcon() { + return null; } @Override @SuppressWarnings("unchecked") - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) + public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper, IIngredients ingredients) { IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); @@ -89,10 +88,9 @@ public class ArmourDowngradeRecipeCategory implements IRecipeCategory if (recipeWrapper instanceof ArmourDowngradeRecipeJEI) { - ArmourDowngradeRecipeJEI recipe = (ArmourDowngradeRecipeJEI) recipeWrapper; - guiItemStacks.set(KEY_SLOT, (ArrayList) recipe.getInputs().get(1)); - craftingGridHelper.setOutput(guiItemStacks, recipe.getOutputs()); - craftingGridHelper.setInput(guiItemStacks, (List) recipe.getInputs().get(0), 3, 2); + guiItemStacks.set(KEY_SLOT, ingredients.getInputs(ItemStack.class).get(1)); + craftingGridHelper.setOutput(guiItemStacks, ingredients.getOutputs(ItemStack.class).get(0)); + craftingGridHelper.setInputs(guiItemStacks, ingredients.getInputs(ItemStack.class), 3, 2); } } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java index 757f1c32..b532e9ea 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java @@ -15,14 +15,6 @@ public class ArmourDowngradeRecipeHandler implements IRecipeHandler 0 && recipe.getOutputs().size() > 0; + 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 index a66d53f6..8ab68515 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java @@ -1,65 +1,28 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import lombok.Getter; +import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.registry.ModItems; -import com.google.common.collect.Lists; - public class ArmourDowngradeRecipeJEI extends BlankRecipeWrapper { @Getter private LivingArmourDowngradeRecipe recipe; -// @Getter -// private ArrayList validGems = new ArrayList(); - public ArmourDowngradeRecipeJEI(LivingArmourDowngradeRecipe recipe) { this.recipe = recipe; } @Override - @Nonnull - public List getInputs() - { - ArrayList ret = new ArrayList(); - ret.add(recipe.getInput()); - ret.add(Lists.newArrayList(recipe.getKey())); - return ret; - } - - @Override - @Nonnull - public List getOutputs() - { + public void getIngredients(IIngredients ingredients) { + // TODO - inputs ItemStack upgradeStack = new ItemStack(ModItems.UPGRADE_TOME); LivingUpgrades.setUpgrade(upgradeStack, recipe.getRecipeOutput()); - return Collections.singletonList(upgradeStack); - } - - @Nullable - @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("jei.BloodMagic.recipe.lpDrained", recipe.getLpDrained())); -// ret.add(TextHelper.localize("jei.BloodMagic.recipe.ticksRequired", recipe.getTicksRequired())); -// return ret; -// } - return null; + ingredients.setOutput(ItemStack.class, upgradeStack); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy110.java b/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy110.java deleted file mode 100644 index 937fbcde..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy110.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.compat.minecraft; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeModContainer; -import net.minecraftforge.fml.relauncher.ReflectionHelper; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -public class CrossVersionProxy110 implements ICrossVersionProxy { - - @Override - public TileEntity createTileFromData(World world, NBTTagCompound tagCompound) - { - Method m = ReflectionHelper.findMethod(TileEntity.class, null, new String[] { "create", "func_190200_a", "a" }, World.class, NBTTagCompound.class); - try - { - return (TileEntity) m.invoke(null, world, tagCompound); - } catch (Exception e) - { - return null; - } - } - - @Override - public boolean disableStairSlabCulling() - { - Field disableStairSlabCulling = ReflectionHelper.findField(ForgeModContainer.class, "disableStairSlabCulling"); - try - { - return (Boolean) disableStairSlabCulling.get(null); - } catch (Exception e) - { - return false; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy19.java b/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy19.java deleted file mode 100644 index 8c1253bb..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy19.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.compat.minecraft; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.ReflectionHelper; - -import java.lang.reflect.Method; - -public class CrossVersionProxy19 implements ICrossVersionProxy -{ - - @Override - public TileEntity createTileFromData(World world, NBTTagCompound tagCompound) - { - Method m = ReflectionHelper.findMethod(TileEntity.class, null, new String[] { "create", "func_189514_c", "c" }, NBTTagCompound.class); - try - { - return (TileEntity) m.invoke(null, tagCompound); - } catch (Exception e) - { - return null; - } - } - - @Override - public boolean disableStairSlabCulling() - { - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/minecraft/ICrossVersionProxy.java b/src/main/java/WayofTime/bloodmagic/compat/minecraft/ICrossVersionProxy.java deleted file mode 100644 index f8bd12de..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/minecraft/ICrossVersionProxy.java +++ /dev/null @@ -1,17 +0,0 @@ -package WayofTime.bloodmagic.compat.minecraft; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -/** - * Allows for Blood Magic to support multiple MC versions that have only slight changes. - * - * Implementation copied from Botania. - */ -public interface ICrossVersionProxy -{ - TileEntity createTileFromData(World world, NBTTagCompound tagCompound); - - boolean disableStairSlabCulling(); -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaCallbackHandler.java b/src/main/java/WayofTime/bloodmagic/compat/waila/WailaCallbackHandler.java index f88c75c8..dd76cf93 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaCallbackHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/WailaCallbackHandler.java @@ -4,9 +4,6 @@ import WayofTime.bloodmagic.block.*; import WayofTime.bloodmagic.compat.waila.provider.*; import mcp.mobius.waila.api.IWailaRegistrar; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.block.base.BlockEnumPillar; -import WayofTime.bloodmagic.block.base.BlockEnumPillarCap; -import WayofTime.bloodmagic.block.base.BlockEnumStairs; public class WailaCallbackHandler { @@ -22,9 +19,6 @@ public class WailaCallbackHandler registrar.registerStackProvider(new DataProviderAlchemyArray(), BlockAlchemyArray.class); registrar.registerStackProvider(new DataProviderMimic(), BlockMimic.class); registrar.registerNBTProvider(new DataProviderMimic(), BlockMimic.class); - registrar.registerStackProvider(DataProviderPillar.INSTANCE, BlockEnumPillarCap.class); - registrar.registerStackProvider(DataProviderPillar.INSTANCE, BlockEnumPillar.class); - registrar.registerStackProvider(DataProviderPillar.INSTANCE, BlockEnumStairs.class); registrar.addConfig(Constants.Mod.MODID, Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK, false); registrar.addConfig(Constants.Mod.MODID, Constants.Compat.WAILA_CONFIG_ALTAR, true); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index 3ff12659..f840c83e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -43,10 +43,10 @@ public class DataProviderAlchemyArray implements IWailaDataProvider if (tile instanceof TileAlchemyArray) { TileAlchemyArray tileArray = (TileAlchemyArray) tile; - if (tileArray.getStackInSlot(0) != null) + if (!tileArray.getStackInSlot(0).isEmpty()) currenttip.add(TextHelper.localize("waila.BloodMagic.array.reagent", tileArray.getStackInSlot(0).getDisplayName())); - if (tileArray.getStackInSlot(1) != null) + if (!tileArray.getStackInSlot(1).isEmpty()) currenttip.add(TextHelper.localize("waila.BloodMagic.array.catalyst", tileArray.getStackInSlot(1).getDisplayName())); } } else diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index 2638641b..7a877071 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -129,10 +129,10 @@ public class DataProviderBloodAltar implements IWailaDataProvider private static boolean holdingSeerSigil(EntityPlayer player) { - if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() instanceof ItemSigilSeer) + if (player.getHeldItemMainhand().getItem() instanceof ItemSigilSeer) return true; - if (player.getHeldItemOffhand() != null && player.getHeldItemOffhand().getItem() instanceof ItemSigilSeer) + if (player.getHeldItemOffhand().getItem() instanceof ItemSigilSeer) return true; return false; @@ -140,10 +140,10 @@ public class DataProviderBloodAltar implements IWailaDataProvider private static boolean holdingDivinationSigil(EntityPlayer player) { - if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() instanceof ItemSigilDivination) + if (player.getHeldItemMainhand().getItem() instanceof ItemSigilDivination) return true; - if (player.getHeldItemOffhand() != null && player.getHeldItemOffhand().getItem() instanceof ItemSigilDivination) + if (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 index 6f381db5..5e39a63b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -35,7 +35,7 @@ public class DataProviderBloodTank implements IWailaDataProvider @Override public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (!config.getConfig(Constants.Compat.WAILA_CONFIG_BLOOD_TANK)) + if (!config.getConfig(Constants.Compat.WAILA_CONFIG_BLOOD_TANK) && !config.getConfig("capability.tankinfo")) return currenttip; if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java index 3f42d8db..1ce57020 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java @@ -20,7 +20,7 @@ public class DataProviderMimic implements IWailaDataProvider public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { if (accessor.getNBTData().getBoolean("hasItem")) - return ItemStack.loadItemStackFromNBT(accessor.getNBTData()); + return new ItemStack(accessor.getNBTData()); return new ItemStack(accessor.getBlock(), 1, accessor.getMetadata()); } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderPillar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderPillar.java deleted file mode 100644 index c24886ae..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderPillar.java +++ /dev/null @@ -1,43 +0,0 @@ -package WayofTime.bloodmagic.compat.waila.provider; - -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; - -public class DataProviderPillar implements IWailaDataProvider { - - public static final DataProviderPillar INSTANCE = new DataProviderPillar(); - - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return new ItemStack(accessor.getBlock(), 1, accessor.getBlock().damageDropped(accessor.getBlockState())); - } - - @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - - @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - - @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index b9c1106c..6e2910fc 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -65,7 +65,7 @@ public class DataProviderRitualController implements IWailaDataProvider if (accessor.getBlock().getMetaFromState(accessor.getBlockState()) == 1 && accessor.getTileEntity() instanceof TileImperfectRitualStone) { - if (accessor.getWorld().getBlockState(accessor.getPosition().up()).getBlock() != null) + if (accessor.getWorld().isAirBlock(accessor.getPosition().up())) { Block up = accessor.getWorld().getBlockState(accessor.getPosition().up()).getBlock(); int meta = up.getMetaFromState(accessor.getWorld().getBlockState(accessor.getPosition().up())); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java index 18136cee..7a787263 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java @@ -42,7 +42,7 @@ public class DataProviderTeleposer implements IWailaDataProvider if (accessor.getBlock() instanceof BlockTeleposer && accessor.getTileEntity() instanceof TileTeleposer) { TileTeleposer teleposer = (TileTeleposer) accessor.getTileEntity(); - if (teleposer.getStackInSlot(0) != null) + if (!teleposer.getStackInSlot(0).isEmpty()) { ItemStack contained = teleposer.getStackInSlot(0); BlockPos toPos = ((ItemTelepositionFocus) contained.getItem()).getBlockPos(contained); diff --git a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java index 5a04209c..9c681f00 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java @@ -20,15 +20,15 @@ public class AdvancedCompressionHandler extends CompressionHandler { for (ItemStack invStack : inv) { - if (invStack == null) + if (invStack.isEmpty()) { continue; } for (int i = 2; i <= 3; i++) { - ItemStack stacky = getRecipe(invStack, world, i); - if (stacky != null) + ItemStack stack = getRecipe(invStack, world, i); + if (!stack.isEmpty()) { int threshold = CompressionRegistry.getItemThreshold(invStack); @@ -37,13 +37,13 @@ public class AdvancedCompressionHandler extends CompressionHandler if (neededLeft <= 0) { iterateThroughInventory(invStack, 0, inv, needed, true); - return stacky; + return stack; } } } } - return null; + return ItemStack.EMPTY; } public int iterateThroughInventory(ItemStack required, int kept, ItemStack[] inv, int needed, boolean doDrain) @@ -54,14 +54,14 @@ public class AdvancedCompressionHandler extends CompressionHandler { i++; - if (invStack == null) + if (invStack.isEmpty()) { continue; } if (invStack.isItemEqual(required) && (invStack.getTagCompound() == null ? required.getTagCompound() == null : invStack.getTagCompound().equals(required.getTagCompound()))) { - int stackSize = invStack.stackSize; + int stackSize = invStack.getCount(); int used = 0; if (kept > 0) { @@ -76,10 +76,10 @@ public class AdvancedCompressionHandler extends CompressionHandler int remainingFromStack = Math.max(stackSize - used - needed, 0); if (doDrain) { - invStack.stackSize = remainingFromStack + used; - if (invStack.stackSize <= 0) + invStack.setCount(remainingFromStack + used); + if (invStack.isEmpty()) { - inv[i] = null; + inv[i] = ItemStack.EMPTY; } } @@ -98,7 +98,7 @@ public class AdvancedCompressionHandler extends CompressionHandler public static boolean isResultStackReversible(ItemStack stack, int gridSize, World world) { - if (stack == null) + if (stack.isEmpty()) { return false; } @@ -113,12 +113,12 @@ public class AdvancedCompressionHandler extends CompressionHandler inventory.setInventorySlotContents(0, stack); ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world); - if (returnStack == null) + if (returnStack.isEmpty()) { return false; } - ItemStack compressedStack = null; + ItemStack compressedStack = ItemStack.EMPTY; switch (gridSize) { case 2: @@ -129,7 +129,7 @@ public class AdvancedCompressionHandler extends CompressionHandler break; } - return compressedStack != null && CompressionRegistry.areItemStacksEqual(stack, compressedStack); + return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); } public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) @@ -151,7 +151,7 @@ public class AdvancedCompressionHandler extends CompressionHandler public static boolean has22Recipe(ItemStack stack, World world) { - return get22Recipe(stack, world) != null; + return !get22Recipe(stack, world).isEmpty(); } public static ItemStack get22Recipe(ItemStack stack, World world) @@ -161,7 +161,7 @@ public class AdvancedCompressionHandler extends CompressionHandler public static boolean has33Recipe(ItemStack stack, World world) { - return get33Recipe(stack, world) != null; + return !get33Recipe(stack, world).isEmpty(); } public static ItemStack get33Recipe(ItemStack stack, World world) diff --git a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java index 7eba6bb3..4573bde1 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java @@ -38,7 +38,7 @@ public class BaseCompressionHandler extends CompressionHandler return this.getResultStack(); } - return null; + return ItemStack.EMPTY; } public int getRemainingNeeded(ItemStack[] inv) @@ -53,7 +53,7 @@ public class BaseCompressionHandler extends CompressionHandler public int iterateThroughInventory(ItemStack[] inv, boolean doDrain) { - int needed = this.required.stackSize; + int needed = this.required.getCount(); int kept = this.getLeftover(); int i = -1; @@ -68,7 +68,7 @@ public class BaseCompressionHandler extends CompressionHandler if (invStack.isItemEqual(this.required) && (invStack.getTagCompound() == null ? this.required.getTagCompound() == null : invStack.getTagCompound().equals(this.required.getTagCompound()))) { - int stackSize = invStack.stackSize; + int stackSize = invStack.getCount(); int used = 0; if (kept > 0) { @@ -83,10 +83,10 @@ public class BaseCompressionHandler extends CompressionHandler int remainingFromStack = Math.max(stackSize - used - needed, 0); if (doDrain) { - invStack.stackSize = remainingFromStack + used; - if (invStack.stackSize <= 0) + invStack.setCount(remainingFromStack + used); + if (invStack.isEmpty()) { - inv[i] = null; + inv[i] = ItemStack.EMPTY; } } diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 21b6357b..7a2844a2 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -32,7 +32,7 @@ public class StorageBlockCraftingManager private static boolean isResultStackReversible(ItemStack stack, int gridSize, World world, List list) { - if (stack == null) + if (stack.isEmpty()) { return false; } @@ -47,12 +47,12 @@ public class StorageBlockCraftingManager inventory.setInventorySlotContents(0, stack); ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); - if (returnStack == null || returnStack.getItem() == null) + if (returnStack.isEmpty()) { return false; } - ItemStack compressedStack = null; + ItemStack compressedStack = ItemStack.EMPTY; switch (gridSize) { case 2: @@ -63,7 +63,7 @@ public class StorageBlockCraftingManager break; } - return compressedStack != null && CompressionRegistry.areItemStacksEqual(stack, compressedStack); + return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); } private static ItemStack getRecipe(ItemStack stack, World world, int gridSize, List list) @@ -85,7 +85,7 @@ public class StorageBlockCraftingManager private static boolean has22Recipe(ItemStack stack, World world, List list) { - return get22Recipe(stack, world, list) != null; + return !get22Recipe(stack, world, list).isEmpty(); } private static ItemStack get22Recipe(ItemStack stack, World world, List list) @@ -95,7 +95,7 @@ public class StorageBlockCraftingManager private static boolean has33Recipe(ItemStack stack, World world, List list) { - return get33Recipe(stack, world, list) != null; + return !get33Recipe(stack, world, list).isEmpty(); } private static ItemStack get33Recipe(ItemStack stack, World world, List list) @@ -111,15 +111,15 @@ public class StorageBlockCraftingManager private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, List list) { int i = 0; - ItemStack itemstack = null; - ItemStack itemstack1 = null; + ItemStack itemstack = ItemStack.EMPTY; + ItemStack itemstack1 = ItemStack.EMPTY; int j; for (j = 0; j < craftingInventory.getSizeInventory(); ++j) { ItemStack itemstack2 = craftingInventory.getStackInSlot(j); - if (itemstack2 != null) + if (!itemstack2.isEmpty()) { if (i == 0) { @@ -135,13 +135,13 @@ public class StorageBlockCraftingManager } } - if (i == 2 && itemstack.getItem() == itemstack1.getItem() && itemstack.stackSize == 1 && itemstack1.stackSize == 1 && itemstack.getItem().isRepairable()) + 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.getItemDamage(); - int k = item.getMaxDamage() - itemstack1.getItemDamage(); - int l = j1 + k + item.getMaxDamage() * 5 / 100; - int i1 = item.getMaxDamage() - l; + 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) { @@ -161,7 +161,7 @@ public class StorageBlockCraftingManager } } - return null; + return ItemStack.EMPTY; } } } diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java index 5dc209df..20316b3d 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java @@ -33,10 +33,10 @@ public class StorageBlockCraftingRecipeAssimilator continue; ItemStack output = recipe.getRecipeOutput(); - if (output == null || output.getItem() == null) + if (output.isEmpty()) continue; - if (output.stackSize == 1) + if (output.getCount() == 1) { PackingRecipe packingRecipe = getPackingRecipe(recipe); @@ -44,7 +44,7 @@ public class StorageBlockCraftingRecipeAssimilator { packingRecipes.add(packingRecipe); } - } else if ((output.stackSize == 4 || output.stackSize == 9) && recipe.getRecipeSize() == 1) + } else if ((output.getCount() == 4 || output.getCount() == 9) && recipe.getRecipeSize() == 1) { unpackingRecipes.add(recipe); } @@ -81,7 +81,7 @@ public class StorageBlockCraftingRecipeAssimilator { // the recipe could be parsed, use its inputs directly since that's faster verify recipe size - if (recipePack.inputCount != unpacked.stackSize) + if (recipePack.inputCount != unpacked.getCount()) continue; // check if any of the input options matches the unpacked @@ -99,14 +99,14 @@ public class StorageBlockCraftingRecipeAssimilator { // unknown IRecipe, check through the recipe conventionally verify recipe size for 3x3 to skip anything smaller quickly - if (unpacked.stackSize == 9 && recipePack.recipe.getRecipeSize() < 9) + if (unpacked.getCount() == 9 && recipePack.recipe.getRecipeSize() < 9) continue; // initialize inventory late, but only once per unpack recipe if (inventory == null) { - if (unpacked.stackSize == 4) + if (unpacked.getCount() == 4) { inventory = inventory2x2; } else @@ -114,7 +114,7 @@ public class StorageBlockCraftingRecipeAssimilator inventory = inventory3x3; } - for (int i = 0; i < unpacked.stackSize; i++) + for (int i = 0; i < unpacked.getCount(); i++) { inventory.setInventorySlotContents(i, unpacked.copy()); } diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java index 37f31156..15db5c60 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java @@ -29,13 +29,7 @@ public class WillChunk this.currentWill = currentWill; } - public boolean isModified() - { - if ((this.chunkRef != null) && (this.chunkRef.get() != null)) - { - return ((Chunk) this.chunkRef.get()).needsSaving(false); - } - - return false; + public boolean isModified() { + return (this.chunkRef != null) && (this.chunkRef.get() != null) && this.chunkRef.get().needsSaving(false); } } diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index b5a1a6bf..23109866 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -7,6 +7,7 @@ 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; @@ -15,6 +16,7 @@ public class WorldDemonWillHandler static ConcurrentHashMap containedWills = new ConcurrentHashMap(); public static ConcurrentHashMap> dirtyChunks = new ConcurrentHashMap>(); + @Nullable public static DemonWillHolder getWillHolder(int dim, int x, int y) { WillChunk chunk = getWillChunk(dim, x, y); @@ -36,6 +38,7 @@ public class WorldDemonWillHandler return containedWills.get(dim); } + @Nullable public static WillChunk getWillChunk(int dim, int x, int y) { if (!containedWills.containsKey(dim)) diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java index 09db9725..deb2f90c 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java @@ -37,12 +37,12 @@ public class EntityAIAttackRangedBow extends EntityAIBase */ public boolean shouldExecute() { - return this.entity.getAttackTarget() == null ? false : this.isBowInMainhand(); + return this.entity.getAttackTarget() != null && this.isBowInMainhand(); } protected boolean isBowInMainhand() { - return this.entity.getHeldItemMainhand() != null && this.entity.getHeldItemMainhand().getItem() instanceof ItemBow; + return this.entity.getHeldItemMainhand().getItem() instanceof ItemBow; } /** diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java index e54d3c1e..6a5ca700 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java @@ -37,7 +37,7 @@ public class EntityAIAttackStealthMelee extends EntityAIBase public EntityAIAttackStealthMelee(EntityCorruptedChicken creature, double speedIn, boolean useLongMemory) { this.chicken = creature; - this.worldObj = creature.worldObj; + this.worldObj = creature.getEntityWorld(); this.speedTowardsTarget = speedIn; this.longMemory = useLongMemory; this.setMutexBits(3); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java index 6c95a68a..288fc685 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java @@ -20,7 +20,7 @@ public class EntityAIEatAndCorruptBlock extends EntityAIBase public EntityAIEatAndCorruptBlock(EntityAspectedDemonBase entity) { this.grassEaterEntity = entity; - this.world = entity.worldObj; + this.world = entity.getEntityWorld(); this.setMutexBits(7); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java index 7227f8cf..cac00901 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java @@ -29,7 +29,7 @@ public class EntityAIFollowOwner extends EntityAIBase public EntityAIFollowOwner(EntityDemonBase thePetIn, double followSpeedIn, float minDistIn, float maxDistIn) { this.thePet = thePetIn; - this.theWorld = thePetIn.worldObj; + this.theWorld = thePetIn.getEntityWorld(); this.followSpeed = followSpeedIn; this.petPathfinder = thePetIn.getNavigator(); this.minDist = minDistIn; @@ -100,7 +100,7 @@ public class EntityAIFollowOwner extends EntityAIBase { IBlockState iblockstate = this.theWorld.getBlockState(pos); Block block = iblockstate.getBlock(); - return block == Blocks.AIR ? true : !iblockstate.isFullCube(); + return block == Blocks.AIR || !iblockstate.isFullCube(); } /** @@ -122,9 +122,9 @@ public class EntityAIFollowOwner extends EntityAIBase { if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D) { - int i = MathHelper.floor_double(this.theOwner.posX) - 2; - int j = MathHelper.floor_double(this.theOwner.posZ) - 2; - int k = MathHelper.floor_double(this.theOwner.getEntityBoundingBox().minY); + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java index 04e5fc62..1559d2b2 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java @@ -32,7 +32,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase public EntityAIGrabEffectsFromOwner(EntitySentientSpecter thePetIn, double followSpeedIn, float minDistIn) { this.thePet = thePetIn; - this.theWorld = thePetIn.worldObj; + this.theWorld = thePetIn.getEntityWorld(); this.followSpeed = followSpeedIn; this.petPathfinder = thePetIn.getNavigator(); this.minDist = minDistIn; @@ -105,7 +105,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { IBlockState iblockstate = this.theWorld.getBlockState(pos); Block block = iblockstate.getBlock(); - return block == Blocks.AIR ? true : !iblockstate.isFullCube(); + return block == Blocks.AIR || !iblockstate.isFullCube(); } /** @@ -135,9 +135,9 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D) { - int i = MathHelper.floor_double(this.theOwner.posX) - 2; - int j = MathHelper.floor_double(this.theOwner.posZ) - 2; - int k = MathHelper.floor_double(this.theOwner.getEntityBoundingBox().minY); + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java index c1ac0d59..62477326 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java @@ -40,7 +40,7 @@ public class EntityAIPickUpAlly extends EntityAIBase public EntityAIPickUpAlly(EntityAspectedDemonBase creature, double speedIn, boolean useLongMemory) { this.entity = creature; - this.worldObj = creature.worldObj; + this.worldObj = creature.getEntityWorld(); this.speedTowardsTarget = speedIn; this.longMemory = useLongMemory; this.setMutexBits(3); @@ -57,7 +57,7 @@ public class EntityAIPickUpAlly extends EntityAIBase } 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).expandXyz(5); - List list = this.entity.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); + List list = this.entity.getEntityWorld().getEntitiesWithinAABB(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); for (EntityLivingBase testEntity : list) { if (testEntity != this.entity) diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java index ad46d8ca..23b345ca 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java @@ -21,7 +21,7 @@ public class EntityAIProtectAlly extends EntityAIBase public EntityAIProtectAlly(EntityCorruptedSheep entity) { this.entity = entity; - this.world = entity.worldObj; + this.world = entity.getEntityWorld(); this.setMutexBits(7); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java index c4b08304..57561229 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java @@ -69,7 +69,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase } //This part almost doesn't matter - List list = this.theEntity.worldObj.getEntitiesWithinAABB(this.classToAvoid, this.theEntity.getEntityBoundingBox().expand((double) this.avoidDistance, 3.0D, (double) this.avoidDistance), Predicates.and(new Predicate[] { EntitySelectors.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector })); + List list = this.theEntity.getEntityWorld().getEntitiesWithinAABB(this.classToAvoid, this.theEntity.getEntityBoundingBox().expand((double) this.avoidDistance, 3.0D, (double) this.avoidDistance), Predicates.and(new Predicate[] { EntitySelectors.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector })); if (list.isEmpty()) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java index 68d84d7b..533af52b 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java @@ -82,7 +82,7 @@ public class EntityAIStealthRetreat extends EntityAIBase @Override public void startExecuting() { - ticksLeft = this.entity.worldObj.rand.nextInt(100) + 100; + ticksLeft = this.entity.getEntityWorld().rand.nextInt(100) + 100; this.entityPathNavigate.setPath(this.entityPathEntity, this.farSpeed); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java index fa9a52fe..cba52335 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java @@ -47,7 +47,7 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase return false; } else { - ticksLeft = this.entity.worldObj.rand.nextInt(200) + 100; + ticksLeft = this.entity.getEntityWorld().rand.nextInt(200) + 100; this.xPosition = vec3d.xCoord; this.yPosition = vec3d.yCoord; this.zPosition = vec3d.zCoord; @@ -75,7 +75,7 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase if (this.entity.getNavigator().noPath()) { EntityLivingBase target = this.entity.getAttackTarget(); - Vec3d vec3d = null; + Vec3d vec3d; if (target instanceof EntityCreature) { vec3d = RandomPositionGenerator.findRandomTarget((EntityCreature) target, 10, 7); diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java index a3ba864b..caeedfd3 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java @@ -180,15 +180,15 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase float newAmount = amount; if (source.isProjectile()) { - newAmount *= MathHelper.clamp_double(1 - getProjectileResist(), 0, 1); + newAmount *= MathHelper.clamp(1 - getProjectileResist(), 0, 1); } else { - newAmount *= MathHelper.clamp_double(1 - getMeleeResist(), 0, 1); + newAmount *= MathHelper.clamp(1 - getMeleeResist(), 0, 1); } if (source.isMagicDamage()) { - newAmount *= MathHelper.clamp_double(1 - getMagicResist(), 0, 1); + newAmount *= MathHelper.clamp(1 - getMagicResist(), 0, 1); } return super.attackEntityFrom(source, newAmount); diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java index 474343cf..77058576 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java @@ -139,7 +139,7 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase 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_float(this.destPos, 0.0F, 1.0F); + this.destPos = MathHelper.clamp(this.destPos, 0.0F, 1.0F); if (!this.onGround && this.wingRotDelta < 1.0F) { @@ -155,7 +155,7 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase this.wingRotation += this.wingRotDelta * 2.0F; - if (!this.worldObj.isRemote && !this.isChild() && --this.timeUntilNextEgg <= 0) + 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); diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java index 516ff8d2..b6ceb3c6 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java @@ -121,7 +121,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh @Override public void onLivingUpdate() { - if (this.worldObj.isRemote) + if (this.getEntityWorld().isRemote) { this.sheepTimer = Math.max(0, this.sheepTimer - 1); this.castTimer = Math.max(0, castTimer - 1); @@ -359,7 +359,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh public IEntityLivingData onInitialSpawn(DifficultyInstance difficulty, @Nullable IEntityLivingData livingdata) { livingdata = super.onInitialSpawn(difficulty, livingdata); - this.setFleeceColor(getRandomSheepColor(this.worldObj.rand)); + this.setFleeceColor(getRandomSheepColor(this.getEntityWorld().rand)); return livingdata; } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java index ee512510..1b6ec0cc 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java @@ -52,7 +52,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase this.tasks.addTask(5, new EntityAIWander(this, 0.8D)); this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false, new Class[0])); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); @@ -95,7 +95,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase } @Override - protected PathNavigate getNewNavigator(World worldIn) + protected PathNavigate createNavigator(World worldIn) { return new PathNavigateClimber(this, worldIn); } @@ -104,7 +104,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase protected void entityInit() { super.entityInit(); - this.dataManager.register(CLIMBING, Byte.valueOf((byte) 0)); + this.dataManager.register(CLIMBING, (byte) 0); } @Override @@ -112,7 +112,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase { super.onUpdate(); - if (!this.worldObj.isRemote) + if (!this.getEntityWorld().isRemote) { this.setBesideClimbableBlock(this.isCollidedHorizontally); } @@ -168,17 +168,17 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase @Override public boolean isPotionApplicable(PotionEffect potioneffectIn) { - return potioneffectIn.getPotion() == MobEffects.POISON ? false : super.isPotionApplicable(potioneffectIn); + return potioneffectIn.getPotion() != MobEffects.POISON && super.isPotionApplicable(potioneffectIn); } public boolean isBesideClimbableBlock() { - return (((Byte) this.dataManager.get(CLIMBING)).byteValue() & 1) != 0; + return (this.dataManager.get(CLIMBING) & 1) != 0; } public void setBesideClimbableBlock(boolean climbing) { - byte b0 = ((Byte) this.dataManager.get(CLIMBING)).byteValue(); + byte b0 = this.dataManager.get(CLIMBING); if (climbing) { @@ -188,7 +188,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase b0 = (byte) (b0 & -2); } - this.dataManager.set(CLIMBING, Byte.valueOf(b0)); + this.dataManager.set(CLIMBING, b0); } @Override @@ -213,7 +213,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase if (f >= 0.5F && this.attacker.getRNG().nextInt(100) == 0) { - this.attacker.setAttackTarget((EntityLivingBase) null); + this.attacker.setAttackTarget(null); return false; } else { @@ -240,7 +240,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase public boolean shouldExecute() { float f = this.taskOwner.getBrightness(1.0F); - return f >= 0.5F ? false : super.shouldExecute(); + 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 index 34b0825e..719b98de 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java @@ -73,17 +73,17 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase @Override public void setCombatTask() { - if (this.worldObj != null && !this.worldObj.isRemote) + if (!this.getEntityWorld().isRemote) { this.tasks.removeTask(this.aiAttackOnCollide); this.tasks.removeTask(this.aiArrowAttack); ItemStack itemstack = this.getHeldItemMainhand(); - if (itemstack != null && itemstack.getItem() instanceof ItemBow) + if (!itemstack.isEmpty() && itemstack.getItem() instanceof ItemBow) { int i = 20; - if (this.worldObj.getDifficulty() != EnumDifficulty.HARD) + if (this.getEntityWorld().getDifficulty() != EnumDifficulty.HARD) { i = 40; } @@ -100,7 +100,7 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase @Override public boolean attackEntityFrom(DamageSource source, float amount) { - return this.isEntityInvulnerable(source) ? false : super.attackEntityFrom(source, amount); + return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); } /** @@ -128,7 +128,7 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase */ public double absorbWillFromAuraToHeal(double toHeal) { - if (worldObj.isRemote) + if (getEntityWorld().isRemote) { return 0; } @@ -139,13 +139,13 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase return 0; } - double will = WorldDemonWillHandler.getCurrentWill(worldObj, getPosition(), getType()); + 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(worldObj, getPosition(), getType(), toHeal * getWillToHealth(), true); + return WorldDemonWillHandler.drainWill(getEntityWorld(), getPosition(), getType(), toHeal * getWillToHealth(), true); } return 0; @@ -164,7 +164,7 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase public void onUpdate() { - if (!this.worldObj.isRemote && this.ticksExisted % 20 == 0) + if (!this.getEntityWorld().isRemote && this.ticksExisted % 20 == 0) { absorbWillFromAuraToHeal(2); } @@ -174,15 +174,8 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase //TODO: Change to fit the given AI @Override - public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) - { - if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) - { - return super.shouldAttackEntity(attacker, owner); - } else - { - return false; - } + public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { + return !(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast) && super.shouldAttackEntity(attacker, owner); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java index 70d99fa1..7373eea7 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java @@ -39,8 +39,8 @@ import com.google.common.base.Predicate; public class EntityDemonBase extends EntityCreature 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); + 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) { @@ -51,7 +51,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable protected void entityInit() { super.entityInit(); - this.dataManager.register(TAMED, Byte.valueOf((byte) 0)); + this.dataManager.register(TAMED, (byte) 0); this.dataManager.register(OWNER_UNIQUE_ID, Optional.absent()); } @@ -84,7 +84,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable @Override public boolean attackEntityFrom(DamageSource source, float amount) { - return this.isEntityInvulnerable(source) ? false : super.attackEntityFrom(source, amount); + return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); } /** @@ -106,7 +106,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable if (flag) { - if (i > 0 && attackedEntity instanceof EntityLivingBase) + if (i > 0) { ((EntityLivingBase) 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; @@ -124,16 +124,16 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { EntityPlayer entityplayer = (EntityPlayer) attackedEntity; ItemStack itemstack = this.getHeldItemMainhand(); - ItemStack itemstack1 = entityplayer.isHandActive() ? entityplayer.getActiveItemStack() : null; + ItemStack itemstack1 = entityplayer.isHandActive() ? entityplayer.getActiveItemStack() : ItemStack.EMPTY; - if (itemstack != null && itemstack1 != null && itemstack.getItem() instanceof ItemAxe && itemstack1.getItem() == Items.SHIELD) + if (!itemstack.isEmpty() && !itemstack1.isEmpty() && itemstack.getItem() instanceof ItemAxe && 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.worldObj.setEntityState(entityplayer, (byte) 30); + this.getEntityWorld().setEntityState(entityplayer, (byte) 30); } } } @@ -149,7 +149,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { super.setItemStackToSlot(slotIn, stack); - if (!this.worldObj.isRemote && slotIn == EntityEquipmentSlot.MAINHAND) + if (!this.getEntityWorld().isRemote && slotIn == EntityEquipmentSlot.MAINHAND) { this.setCombatTask(); } @@ -169,10 +169,10 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { this.heal((float) toHeal); - if (worldObj instanceof WorldServer) + if (getEntityWorld() instanceof WorldServer) { - WorldServer server = (WorldServer) worldObj; - 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, new int[0]); + WorldServer server = (WorldServer) 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); } } @@ -207,7 +207,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { super.readEntityFromNBT(tag); - String s = ""; + String s; if (tag.hasKey("OwnerUUID", 8)) { @@ -248,7 +248,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable } } - return attacker instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) attacker) ? false : !(attacker instanceof EntityHorse) || !((EntityHorse) attacker).isTame(); + return !(attacker instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) attacker)) && (!(attacker instanceof EntityHorse) || !((EntityHorse) attacker).isTame()); } else { return false; @@ -262,19 +262,19 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable public boolean isTamed() { - return (((Byte) this.dataManager.get(TAMED)).byteValue() & 4) != 0; + return (this.dataManager.get(TAMED) & 4) != 0; } public void setTamed(boolean tamed) { - byte b0 = ((Byte) this.dataManager.get(TAMED)).byteValue(); + byte b0 = this.dataManager.get(TAMED); if (tamed) { - this.dataManager.set(TAMED, Byte.valueOf((byte) (b0 | 4))); + this.dataManager.set(TAMED, (byte) (b0 | 4)); } else { - this.dataManager.set(TAMED, Byte.valueOf((byte) (b0 & -5))); + this.dataManager.set(TAMED, (byte) (b0 & -5)); } // this.setupTamedAI(); @@ -316,7 +316,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable @Override public UUID getOwnerId() { - return (UUID) (this.dataManager.get(OWNER_UNIQUE_ID)).orNull(); + return (this.dataManager.get(OWNER_UNIQUE_ID)).orNull(); } public void setOwnerId(UUID uuid) @@ -330,7 +330,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable try { UUID uuid = this.getOwnerId(); - return uuid == null ? null : this.worldObj.getPlayerEntityByUUID(uuid); + return uuid == null ? null : this.getEntityWorld().getPlayerEntityByUUID(uuid); } catch (IllegalArgumentException var2) { return null; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index 37c32741..cfe63b1a 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -43,7 +43,7 @@ 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); + private static final DataParameter CLIMBING = EntityDataManager.createKey(EntityMimic.class, DataSerializers.BYTE); public boolean dropItemsOnBreak = true; public NBTTagCompound tileTag = new NBTTagCompound(); @@ -64,7 +64,7 @@ public class EntityMimic extends EntityDemonBase this.tasks.addTask(8, new EntityAILookIdle(this)); this.tasks.addTask(7, new EntityAIMimicReform(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false, new Class[0])); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); this.targetTasks.addTask(2, new EntityMimic.AISpiderTarget(this, EntityPlayer.class)); this.targetTasks.addTask(3, new EntityMimic.AISpiderTarget(this, EntityIronGolem.class)); } @@ -160,7 +160,7 @@ public class EntityMimic extends EntityDemonBase } BlockPos newPos = centerPos.add(i, j, k); - if (spawnMimicBlockAtPosition(worldObj, newPos)) + if (spawnMimicBlockAtPosition(getEntityWorld(), newPos)) { return true; } @@ -178,7 +178,7 @@ public class EntityMimic extends EntityDemonBase { super.onDeath(cause); - if (!worldObj.isRemote) + if (!getEntityWorld().isRemote) { BlockPos centerPos = this.getPosition(); @@ -201,7 +201,7 @@ public class EntityMimic extends EntityDemonBase } BlockPos newPos = centerPos.add(i, j, k); - if (spawnHeldBlockOnDeath(worldObj, newPos)) + if (spawnHeldBlockOnDeath(getEntityWorld(), newPos)) { return; } @@ -227,7 +227,7 @@ public class EntityMimic extends EntityDemonBase * Returns new PathNavigateGround instance */ @Override - protected PathNavigate getNewNavigator(World worldIn) + protected PathNavigate createNavigator(World worldIn) { return new PathNavigateClimber(this, worldIn); } @@ -236,7 +236,7 @@ public class EntityMimic extends EntityDemonBase protected void entityInit() { super.entityInit(); - this.dataManager.register(CLIMBING, Byte.valueOf((byte) 0)); + this.dataManager.register(CLIMBING, (byte) 0); // this.dataManager.register(ITEMSTACK, null); } @@ -246,7 +246,7 @@ public class EntityMimic extends EntityDemonBase @Override public void onUpdate() { - if (!this.worldObj.isRemote && this.worldObj.getDifficulty() == EnumDifficulty.PEACEFUL) + if (!this.getEntityWorld().isRemote && this.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL) { if (reformIntoMimicBlock(this.getPosition())) { @@ -256,7 +256,7 @@ public class EntityMimic extends EntityDemonBase super.onUpdate(); - if (!this.worldObj.isRemote) + if (!this.getEntityWorld().isRemote) { this.setBesideClimbableBlock(this.isCollidedHorizontally); } @@ -324,7 +324,7 @@ public class EntityMimic extends EntityDemonBase @Override public boolean isPotionApplicable(PotionEffect potioneffectIn) { - return potioneffectIn.getPotion() == MobEffects.POISON ? false : super.isPotionApplicable(potioneffectIn); + return potioneffectIn.getPotion() != MobEffects.POISON && super.isPotionApplicable(potioneffectIn); } /** @@ -333,7 +333,7 @@ public class EntityMimic extends EntityDemonBase */ public boolean isBesideClimbableBlock() { - return (((Byte) this.dataManager.get(CLIMBING)).byteValue() & 1) != 0; + return (this.dataManager.get(CLIMBING) & 1) != 0; } /** @@ -342,7 +342,7 @@ public class EntityMimic extends EntityDemonBase */ public void setBesideClimbableBlock(boolean climbing) { - byte b0 = ((Byte) this.dataManager.get(CLIMBING)).byteValue(); + byte b0 = this.dataManager.get(CLIMBING); if (climbing) { @@ -352,7 +352,7 @@ public class EntityMimic extends EntityDemonBase b0 = (byte) (b0 & -2); } - this.dataManager.set(CLIMBING, Byte.valueOf(b0)); + this.dataManager.set(CLIMBING, b0); } public float getEyeHeight() diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 6e6c15a9..11eb66eb 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -107,17 +107,17 @@ public class EntitySentientSpecter extends EntityDemonBase @Override public void setCombatTask() { - if (this.worldObj != null && !this.worldObj.isRemote) + if (!this.getEntityWorld().isRemote) { this.tasks.removeTask(this.aiAttackOnCollide); this.tasks.removeTask(this.aiArrowAttack); ItemStack itemstack = this.getHeldItemMainhand(); - if (itemstack != null && itemstack.getItem() instanceof ItemBow) + if (!itemstack.isEmpty() && itemstack.getItem() instanceof ItemBow) { int i = 20; - if (this.worldObj.getDifficulty() != EnumDifficulty.HARD) + if (this.getEntityWorld().getDifficulty() != EnumDifficulty.HARD) { i = 40; } @@ -132,16 +132,11 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - public boolean isPotionApplicable(PotionEffect effect) - { + public boolean isPotionApplicable(PotionEffect effect) { Potion potion = effect.getPotion(); - if (potion == MobEffects.REGENERATION || potion == MobEffects.INSTANT_HEALTH) //Specter cannot be healed by normal means - { - return false; - } - - return super.isPotionApplicable(effect); + //Specter cannot be healed by normal means + return !(potion == MobEffects.REGENERATION || potion == MobEffects.INSTANT_HEALTH) && super.isPotionApplicable(effect); } public boolean canStealEffectFromOwner(EntityLivingBase owner, PotionEffect effect) @@ -280,7 +275,7 @@ public class EntitySentientSpecter extends EntityDemonBase @Override public boolean attackEntityFrom(DamageSource source, float amount) { - return this.isEntityInvulnerable(source) ? false : super.attackEntityFrom(source, amount); + return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); } /** @@ -311,7 +306,7 @@ public class EntitySentientSpecter extends EntityDemonBase { super.onDeath(cause); - if (!worldObj.isRemote && getHeldItemMainhand() != null) + if (!getEntityWorld().isRemote && !getHeldItemMainhand().isEmpty()) { this.entityDropItem(getHeldItemMainhand(), 0); } @@ -339,20 +334,21 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - public boolean processInteract(EntityPlayer player, EnumHand hand, @Nullable ItemStack stack) + public boolean processInteract(EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (this.isTamed() && player.equals(this.getOwner()) && hand == EnumHand.MAIN_HAND) { - if (stack == null && player.isSneaking()) //Should return to the entity + if (stack.isEmpty() && player.isSneaking()) //Should return to the entity { - if (!worldObj.isRemote) + if (!getEntityWorld().isRemote) { - if (getHeldItemMainhand() != null) + if (!getHeldItemMainhand().isEmpty()) { this.entityDropItem(getHeldItemMainhand(), 0); } - if (getHeldItemOffhand() != null) + if (!getHeldItemOffhand().isEmpty()) { this.entityDropItem(getHeldItemOffhand(), 0); } @@ -367,7 +363,7 @@ public class EntitySentientSpecter extends EntityDemonBase } } - return super.processInteract(player, hand, stack); + return super.processInteract(player, hand); } public boolean isEntityInvulnerable(DamageSource source) @@ -380,9 +376,9 @@ public class EntitySentientSpecter extends EntityDemonBase { this.heal((float) toHeal); - if (worldObj instanceof WorldServer) + if (getEntityWorld() instanceof WorldServer) { - WorldServer server = (WorldServer) worldObj; + WorldServer server = (WorldServer) 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, new int[0]); } } @@ -394,7 +390,7 @@ public class EntitySentientSpecter extends EntityDemonBase */ public double absorbWillFromAuraToHeal(double toHeal) { - if (worldObj.isRemote) + if (getEntityWorld().isRemote) { return 0; } @@ -405,13 +401,13 @@ public class EntitySentientSpecter extends EntityDemonBase return 0; } - double will = WorldDemonWillHandler.getCurrentWill(worldObj, getPosition(), getType()); + 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(worldObj, getPosition(), getType(), toHeal * getWillToHealth(), true); + return WorldDemonWillHandler.drainWill(getEntityWorld(), getPosition(), getType(), toHeal * getWillToHealth(), true); } return 0; @@ -430,7 +426,7 @@ public class EntitySentientSpecter extends EntityDemonBase public void onUpdate() { - if (!this.worldObj.isRemote && this.ticksExisted % 20 == 0) + if (!this.getEntityWorld().isRemote && this.ticksExisted % 20 == 0) { absorbWillFromAuraToHeal(2); } @@ -485,7 +481,7 @@ public class EntitySentientSpecter extends EntityDemonBase ItemStack heldStack = this.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); if (heldStack != null && heldStack.getItem() == ModItems.SENTIENT_BOW) { - EntityTippedArrow arrowEntity = ((ItemSentientBow) heldStack.getItem()).getArrowEntity(worldObj, heldStack, target, this, velocity); + EntityTippedArrow arrowEntity = ((ItemSentientBow) heldStack.getItem()).getArrowEntity(getEntityWorld(), heldStack, target, this, velocity); if (arrowEntity != null) { List effects = getPotionEffectsForArrowRemovingDuration(0.2f); @@ -495,19 +491,19 @@ public class EntitySentientSpecter extends EntityDemonBase } this.playSound(SoundEvents.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); - this.worldObj.spawnEntityInWorld(arrowEntity); + this.getEntityWorld().spawnEntity(arrowEntity); } } else { - EntityTippedArrow entitytippedarrow = new EntityTippedArrow(this.worldObj, this); //TODO: Change to an arrow created by the Sentient Bow + EntityTippedArrow entitytippedarrow = new EntityTippedArrow(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_double(d0 * d0 + d2 * d2); + double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); entitytippedarrow.setThrowableHeading(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.worldObj.getDifficulty().getDifficultyId() * 0.11F)); + entitytippedarrow.setDamage((double) (velocity * 2.0F) + this.rand.nextGaussian() * 0.25D + (double) ((float) this.getEntityWorld().getDifficulty().getDifficultyId() * 0.11F)); if (i > 0) { @@ -533,7 +529,7 @@ public class EntitySentientSpecter extends EntityDemonBase } this.playSound(SoundEvents.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); - this.worldObj.spawnEntityInWorld(entitytippedarrow); + this.getEntityWorld().spawnEntity(entitytippedarrow); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index d2bb8bd4..6d8f86ef 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -61,7 +61,7 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit @Override public void setThrowableHeading(double var1, double var3, double var5, float var7, float var8) { - float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5); + float var9 = MathHelper.sqrt(var1 * var1 + var3 * var3 + var5 * var5); var1 /= var9; var3 /= var9; var5 /= var9; @@ -74,7 +74,7 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit motionX = var1; motionY = var3; motionZ = var5; - float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * 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); } @@ -105,9 +105,9 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit EnumFacing sideHit = mop.sideHit; BlockPos blockPos = mop.getBlockPos().offset(sideHit); - if (worldObj.isAirBlock(blockPos)) + if (getEntityWorld().isAirBlock(blockPos)) { - worldObj.setBlockState(blockPos, ModBlocks.BLOOD_LIGHT.getDefaultState()); + getEntityWorld().setBlockState(blockPos, ModBlocks.BLOOD_LIGHT.getDefaultState()); } } @@ -129,9 +129,9 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit } } - if (worldObj.isAirBlock(new BlockPos((int) this.posX, (int) this.posY, (int) this.posZ))) + if (getEntityWorld().isAirBlock(new BlockPos((int) this.posX, (int) this.posY, (int) this.posZ))) { - worldObj.setBlockState(new BlockPos((int) this.posX, (int) this.posY, (int) this.posZ), Blocks.FIRE.getDefaultState()); + getEntityWorld().setBlockState(new BlockPos((int) this.posX, (int) this.posY, (int) this.posZ), Blocks.FIRE.getDefaultState()); } // spawnHitParticles("magicCrit", 8); diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index 6735b95b..5170be8c 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -95,12 +95,12 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity public void generateMeteor(BlockPos pos) { - MeteorRegistry.generateMeteorForItem(meteorStack, worldObj, pos, Blocks.STONE.getDefaultState(), radiusModifier, explosionModifier, fillerChance); + MeteorRegistry.generateMeteorForItem(meteorStack, getEntityWorld(), pos, Blocks.STONE.getDefaultState(), radiusModifier, explosionModifier, fillerChance); } public DamageSource getDamageSource() { - return DamageSource.anvil; + return DamageSource.ANVIL; } @Override @@ -127,7 +127,7 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity radiusModifier = nbt.getDouble("radiusModifier"); explosionModifier = nbt.getDouble("explosionModifier"); fillerChance = nbt.getDouble("fillerChance"); - meteorStack = ItemStack.loadItemStackFromNBT(nbt); + meteorStack = new ItemStack(nbt); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index c9dc343e..c6cf622f 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -41,7 +41,7 @@ public class EntitySentientArrow extends EntityTippedArrow { if (this.shootingEntity instanceof EntityPlayer) { - if (hitEntity.worldObj.getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) + if (hitEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) { return; } diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java index aa26da03..ee30ed6d 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java @@ -39,7 +39,7 @@ public class EntitySoulSnare extends EntityThrowable if (result.entityHit != null && result.entityHit != this.getThrower()) { - if (result.entityHit instanceof EntityLivingBase && result.entityHit.worldObj.rand.nextDouble() < 0.25) + if (result.entityHit instanceof EntityLivingBase && result.entityHit.getEntityWorld().rand.nextDouble() < 0.25) { ((EntityLivingBase) result.entityHit).addPotionEffect(new PotionEffect(ModPotions.soulSnare, 300, 0)); } @@ -49,10 +49,10 @@ public class EntitySoulSnare extends EntityThrowable for (int j = 0; j < 8; ++j) { - this.worldObj.spawnParticle(EnumParticleTypes.SNOWBALL, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D, new int[0]); + this.getEntityWorld().spawnParticle(EnumParticleTypes.SNOWBALL, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D); } - if (!this.worldObj.isRemote) + if (!this.getEntityWorld().isRemote) { this.setDead(); } diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java index 7486c89b..b807b886 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java @@ -5,31 +5,13 @@ import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; -import net.minecraft.network.play.client.CPacketAnimation; -import net.minecraft.network.play.client.CPacketChatMessage; -import net.minecraft.network.play.client.CPacketClickWindow; -import net.minecraft.network.play.client.CPacketClientSettings; -import net.minecraft.network.play.client.CPacketClientStatus; -import net.minecraft.network.play.client.CPacketCloseWindow; -import net.minecraft.network.play.client.CPacketConfirmTransaction; -import net.minecraft.network.play.client.CPacketCreativeInventoryAction; -import net.minecraft.network.play.client.CPacketEnchantItem; -import net.minecraft.network.play.client.CPacketEntityAction; -import net.minecraft.network.play.client.CPacketHeldItemChange; -import net.minecraft.network.play.client.CPacketInput; -import net.minecraft.network.play.client.CPacketKeepAlive; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.network.play.client.CPacketPlayerAbilities; -import net.minecraft.network.play.client.CPacketPlayerDigging; -import net.minecraft.network.play.client.CPacketPlayerTryUseItem; -import net.minecraft.network.play.client.CPacketResourcePackStatus; -import net.minecraft.network.play.client.CPacketSpectate; -import net.minecraft.network.play.client.CPacketTabComplete; -import net.minecraft.network.play.client.CPacketUpdateSign; -import net.minecraft.network.play.client.CPacketUseEntity; +import net.minecraft.network.play.client.*; +import net.minecraft.network.play.server.SPacketPlayerPosLook; 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 */ @@ -47,7 +29,47 @@ public class FakeNetHandlerPlayServer extends NetHandlerPlayServer } @Override - public void kickPlayerFromServer(String p_147360_1_) + public void update() + { + } + + @Override + public void disconnect(String reason) + { + } + + @Override + public void processVehicleMove(CPacketVehicleMove packetIn) + { + } + + @Override + public void processConfirmTeleport(CPacketConfirmTeleport packetIn) + { + } + + @Override + public void setPlayerLocation(double x, double y, double z, float yaw, float pitch, Set relativeSet) + { + } + + @Override + public void processTryUseItemOnBlock(CPacketPlayerTryUseItemOnBlock packetIn) + { + } + + @Override + public void processTryUseItem(CPacketPlayerTryUseItem packetIn) + { + } + + @Override + public void processSteerBoat(CPacketSteerBoat packetIn) + { + } + + @Override + public void processCustomPayload(CPacketCustomPayload packetIn) { } @@ -71,11 +93,6 @@ public class FakeNetHandlerPlayServer extends NetHandlerPlayServer { } - @Override - public void processPlayerBlockPlacement(CPacketPlayerTryUseItem packetIn) - { - } - @Override public void onDisconnect(ITextComponent p_147231_1_) { diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java index 18e2c0d4..1de85e6b 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java @@ -16,8 +16,6 @@ import com.mojang.authlib.GameProfile; */ public class FakePlayerBM extends FakePlayer { - ItemStack prevWeapon; - public FakePlayerBM(World world, BlockPos pos, GameProfile profile) { super(FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(world.provider.getDimension()), profile); diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java index 51945b5e..3b67c610 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -34,7 +34,7 @@ public class Serializers @Override public EnumDemonWillType read(PacketBuffer buf) { - return (EnumDemonWillType) buf.readEnumValue(EnumDemonWillType.class); + return buf.readEnumValue(EnumDemonWillType.class); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java index 512cb8cb..1a13c8f5 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java @@ -94,12 +94,8 @@ public class InversionPillarHandler { List otherPosList = willMap.get(type); - Iterator posIterator = otherPosList.iterator(); - while (posIterator.hasNext()) - { - BlockPos closePos = posIterator.next(); - if (!closePos.equals(pos) && closePos.distanceSq(pos) <= farthestDistanceSquared) - { + for (BlockPos closePos : otherPosList) { + if (!closePos.equals(pos) && closePos.distanceSq(pos) <= farthestDistanceSquared) { closePosList.add(closePos); } } @@ -113,16 +109,11 @@ public class InversionPillarHandler { Map> posMap = willMap.get(type); - Iterator closePosIterator = closePosList.iterator(); - while (closePosIterator.hasNext()) - { - BlockPos closePos = closePosIterator.next(); + for (BlockPos closePos : closePosList) { List posList = posMap.get(closePos); - if (posList != null && !posList.contains(pos)) - { + if (posList != null && !posList.contains(pos)) { posList.add(pos); - } else - { + } else { posList = new ArrayList(); posList.add(pos); posMap.put(closePos, posList); @@ -220,18 +211,12 @@ public class InversionPillarHandler //Positions that are new this iteration and need to be dumped into uncheckedPosList next iteration. List newPosList = new ArrayList(); - Iterator itr = uncheckedPosList.iterator(); - while (itr.hasNext()) - { - BlockPos checkPos = itr.next(); + for (BlockPos checkPos : uncheckedPosList) { List posList = posMap.get(checkPos); - if (posList != null) - { - for (BlockPos testPos : posList) - { + 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)) - { + if (!checkedPosList.contains(testPos) && !uncheckedPosList.contains(testPos) && !newPosList.contains(testPos)) { newPosList.add(testPos); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index d94bdcca..db0523da 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -52,6 +52,8 @@ import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import javax.annotation.Nullable; + public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshProvider { private static Field _FLAGS = ReflectionHelper.findField(Entity.class, "FLAGS", "field_184240_ax"); @@ -138,12 +140,12 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP int maxAbsorption = 100000; - if (source.equals(DamageSource.drown)) + if (source.equals(DamageSource.DROWN)) { return new ArmorProperties(-1, 0, 0); } - if (source.equals(DamageSource.outOfWorld)) + if (source.equals(DamageSource.OUT_OF_WORLD)) { return new ArmorProperties(-1, 0, 0); } @@ -243,7 +245,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (damage > this.getMaxDamage(stack) - this.getDamage(stack)) { //TODO: Syphon a load of LP. - if (entity.worldObj.isRemote && entity instanceof EntityPlayer) + if (entity.getEntityWorld().isRemote && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; SoulNetwork network = NetworkHelper.getSoulNetwork(player); @@ -307,7 +309,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (tracker != null) { double progress = tracker.getProgress(armour, upgrade.getUpgradeLevel()); - tooltip.add(TextHelper.localize("tooltip.BloodMagic.livingArmour.upgrade.progress", TextHelper.localize(upgrade.getUnlocalizedName()), MathHelper.clamp_int((int) (progress * 100D), 0, 100))); + tooltip.add(TextHelper.localize("tooltip.BloodMagic.livingArmour.upgrade.progress", TextHelper.localize(upgrade.getUnlocalizedName()), MathHelper.clamp((int) (progress * 100D), 0, 100))); } } else { @@ -458,6 +460,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return ret; } + @Nullable public static LivingArmour getLivingArmourFromStack(ItemStack stack) { NBTTagCompound livingTag = getArmourTag(stack); @@ -549,6 +552,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return uuid != null && armourMap.containsKey(uuid); } + @Nullable public static LivingArmour getLivingArmour(ItemStack stack) { UUID uuid = Utils.getUUID(stack); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index 6c880de0..9c1e1728 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -197,7 +197,7 @@ public class LivingArmour implements ILivingArmour continue; } - if ((world.isRemote && upgrade.runOnClient()) || !world.isRemote) + if (!world.isRemote || upgrade.runOnClient()) { upgrade.onTick(world, player, this); } @@ -385,7 +385,7 @@ public class LivingArmour implements ILivingArmour continue; } ItemStack slotStack = player.getItemStackFromSlot(slot); - if (slotStack == null || !(slotStack.getItem() instanceof ItemLivingArmour)) + if (slotStack.isEmpty() || !(slotStack.getItem() instanceof ItemLivingArmour)) return false; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java index 61f0be8e..81b1ae68 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java @@ -22,8 +22,8 @@ public class LivingArmourUpgradeDisoriented extends LivingArmourUpgrade { if (world.isRemote && player.ticksExisted % 20 == 0 && world.rand.nextDouble() <= chance[this.level]) { - player.rotationYaw = (float) (world.rand.nextFloat() * 360); - player.rotationPitch = (float) (world.rand.nextFloat() * 180 - 90); + player.rotationYaw = world.rand.nextFloat() * 360; + player.rotationPitch = world.rand.nextFloat() * 180 - 90; } } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java index 96dc33fa..76ec099f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -36,7 +36,7 @@ public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0271023, 5321), "damage modifier" + 2, meleeDamage[this.level], 1)); + modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(new UUID(271023, 5321), "damage modifier" + 2, meleeDamage[this.level], 1)); return modifierMap; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java index ad67cfe4..b516db11 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -29,7 +29,7 @@ public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(85472, 8502), "speed modifier" + 2, speedModifier[this.level], 1)); + modifierMap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(new UUID(85472, 8502), "speed modifier" + 2, speedModifier[this.level], 1)); return modifierMap; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java index 12e23ef7..39d51dc5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -19,7 +19,7 @@ public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade @Override public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { - if (source.equals(DamageSource.fall)) + if (source.equals(DamageSource.FALL)) { return protectionLevel[this.level]; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java index b593da5a..4dc51e55 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -34,7 +34,7 @@ public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(9423688, 1), "Health modifier" + 1, healthModifier[this.level], 0)); + modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(9423688, 1), "Health modifier" + 1, healthModifier[this.level], 0)); return modifierMap; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java index 078aa21f..c59f4e48 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -26,11 +26,11 @@ public class LivingArmourUpgradeKnockbackResist extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.KNOCKBACK_RESISTANCE.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(895132, 1), "Knockback modifier" + 1, kbModifier[this.level], 0)); + modifierMap.put(SharedMonsterAttributes.KNOCKBACK_RESISTANCE.getName(), new AttributeModifier(new UUID(895132, 1), "Knockback modifier" + 1, kbModifier[this.level], 0)); if (healthModifier[this.level] > 0) { - modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(952142, 1), "Health modifier" + 1, healthModifier[this.level], 0)); + modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(952142, 1), "Health modifier" + 1, healthModifier[this.level], 0)); } return modifierMap; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java index 228404de..4bbe2fc7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -34,7 +34,7 @@ public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(9423688, 1), "damage modifier" + 1, meleeDamage[this.level], 0)); + modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(new UUID(9423688, 1), "damage modifier" + 1, meleeDamage[this.level], 0)); return modifierMap; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java index 818e177b..00f17e9f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java @@ -32,7 +32,7 @@ public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade EntityEquipmentSlot randomSlot = EntityEquipmentSlot.values()[2 + world.rand.nextInt(4)]; ItemStack repairStack = player.getItemStackFromSlot(randomSlot); - if (repairStack != null) + if (!repairStack.isEmpty()) { if (repairStack.isItemStackDamageable() && repairStack.isItemDamaged()) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java index b86b39cc..5196c902 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -29,7 +29,7 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade @Override public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { - if (wearer.worldObj.canSeeSky(wearer.getPosition()) || wearer.worldObj.provider.isDaytime()) + if (wearer.getEntityWorld().canSeeSky(wearer.getPosition()) || wearer.getEntityWorld().provider.isDaytime()) { return protectionLevel[this.level]; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index eca1937e..6e591e7a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -61,7 +61,7 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade if (healthModifier[this.level] > 0) { - modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(952142, 1), "Health modifier" + 1, healthModifier[this.level], 0)); + modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(952142, 1), "Health modifier" + 1, healthModifier[this.level], 0)); } return modifierMap; diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java index af778bd4..1c230eef 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java @@ -7,9 +7,11 @@ import lombok.Getter; import lombok.Setter; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.util.Utils; @@ -34,8 +36,8 @@ public class MeteorComponent meta = Integer.parseInt(stringList[2]); } - Block ore = Block.REGISTRY.getObject(new ResourceLocation(domain, block)); - if (ore != null) + Block ore = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(domain, block)); + if (ore != Blocks.AIR) { return ore.getStateFromMeta(meta); } diff --git a/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java index d2a1c13f..e9a6f608 100644 --- a/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java @@ -59,7 +59,7 @@ public class PlayerVelocityPacketProcessor implements IMessage, IMessageHandler< @SideOnly(Side.CLIENT) public void onMessageFromServer() { - EntityPlayer player = Minecraft.getMinecraft().thePlayer; + EntityPlayer player = Minecraft.getMinecraft().player; player.motionX = motionX; player.motionY = motionY; player.motionZ = motionZ; diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index 1296ed4b..4306fdfa 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -30,7 +30,7 @@ public class BMPotionUtils public static double damageMobAndGrowSurroundingPlants(EntityLivingBase entity, int horizontalRadius, int verticalRadius, double damageRatio, int maxPlantsGrown) { - World world = entity.worldObj; + World world = entity.getEntityWorld(); if (world.isRemote) { return 0; diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 58813ea4..081d1a87 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -59,12 +59,10 @@ public class PotionEventHandlers { int d0 = 3; AxisAlignedBB axisAlignedBB = new AxisAlignedBB(event.getEntityLiving().posX - 0.5, event.getEntityLiving().posY - 0.5, event.getEntityLiving().posZ - 0.5, event.getEntityLiving().posX + 0.5, event.getEntityLiving().posY + 0.5, event.getEntityLiving().posZ + 0.5).expand(d0, d0, d0); - List entityList = event.getEntityLiving().worldObj.getEntitiesWithinAABB(Entity.class, axisAlignedBB); + List entityList = event.getEntityLiving().getEntityWorld().getEntitiesWithinAABB(Entity.class, axisAlignedBB); - for (Object thing : entityList) + for (Entity projectile : entityList) { - Entity projectile = (Entity) thing; - if (projectile == null) continue; if (!(projectile instanceof IProjectile)) diff --git a/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java index d96ae079..05fc2117 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java @@ -76,8 +76,9 @@ public class ItemPotionFlask extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); int remainingUses = stack.getMaxDamage() - stack.getItemDamage(); if (remainingUses <= 0) { diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index 465ecef2..d94d13bd 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -51,13 +51,11 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe if (match) { inputItemLocation = x; - continue; } else { if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) { nameTagOrDyeLocation = x; - continue; } } } @@ -108,30 +106,19 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe boolean hasNameTagOrDye = false; boolean hasInputItem = false; - for (int x = 0; x < checkedList.size(); x++) - { - ItemStack slot = checkedList.get(x); - - if (slot != null) - { + for (ItemStack slot : checkedList) { + if (slot != null) { boolean match = OreDictionary.itemMatches(inputItem, slot, false); - if (match && hasInputItem) - { + if (match && hasInputItem) { return false; - } else if (match) - { + } else if (match) { hasInputItem = true; - continue; - } else - { - if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) - { - if (hasNameTagOrDye) - { + } else { + if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) { + if (hasNameTagOrDye) { return false; - } else - { + } else { hasNameTagOrDye = true; } } diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java index 4769bcc9..f10586cb 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java @@ -1,9 +1,6 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; +import java.util.*; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; @@ -38,7 +35,7 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect baseEffect, double lengthAugment, int powerAugment) { - this(lpDrained, ticksRequired, tierRequired, Arrays.asList(inputItem), baseEffect, lengthAugment, powerAugment); + this(lpDrained, ticksRequired, tierRequired, Collections.singletonList(inputItem), baseEffect, lengthAugment, powerAugment); } @Override @@ -79,19 +76,14 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe List effectList = PotionUtils.getEffectsFromStack(outputStack); List newEffectList = new ArrayList(); - Iterator effectIterator = effectList.iterator(); - while (effectIterator.hasNext()) - { - PotionEffect effect = effectIterator.next(); - if (effect.getPotion() == wantedPotion) - { + for (PotionEffect 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 PotionEffect(wantedPotion, potionLength, currentPowerAugment)); BMPotionUtils.setLengthAugment(outputStack, wantedPotion, currentLengthAugment); - } else - { + } else { newEffectList.add(effect); } } diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index 48d9c4bf..23e24887 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -1,9 +1,6 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; +import java.util.*; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; @@ -40,7 +37,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect baseEffect) { - this(lpDrained, ticksRequired, tierRequired, Arrays.asList(inputItem), baseEffect); + this(lpDrained, ticksRequired, tierRequired, Collections.singletonList(inputItem), baseEffect); } @Override @@ -58,7 +55,6 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe if (match) { flaskLocation = x; - continue; } } } @@ -68,7 +64,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe return getModifiedFlaskForInput(inputList.get(flaskLocation)); } - return getModifiedFlaskForInput(null); + return getModifiedFlaskForInput(ItemStack.EMPTY); } @Override @@ -76,39 +72,27 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { ArrayList required = new ArrayList(input); - for (int x = 0; x < checkedList.size(); x++) - { - ItemStack slot = checkedList.get(x); - - if (slot != null) - { + for (ItemStack slot : checkedList) { + if (slot != null) { boolean inRecipe = false; - Iterator req = required.iterator(); - while (req.hasNext()) - { + for (Object aRequired : required) { boolean match = false; - Object next = req.next(); + Object next = aRequired; - if (next instanceof ItemStack) - { + if (next instanceof ItemStack) { match = OreDictionary.itemMatches((ItemStack) next, slot, false); - } else if (next instanceof List) - { + } else if (next instanceof List) { Iterator itr = ((List) next).iterator(); - while (itr.hasNext() && !match) - { + while (itr.hasNext() && !match) { match = OreDictionary.itemMatches(itr.next(), slot, false); } } - if (match) - { - if (next instanceof ItemStack && ((ItemStack) next).getItem() == ModItems.POTION_FLASK) - { - if (!isPotionFlaskValidInput(slot)) - { + if (match) { + if (next instanceof ItemStack && ((ItemStack) next).getItem() == ModItems.POTION_FLASK) { + if (!isPotionFlaskValidInput(slot)) { break; } } @@ -119,8 +103,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe } } - if (!inRecipe) - { + if (!inRecipe) { return false; } } @@ -150,7 +133,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe public ItemStack getModifiedFlaskForInput(ItemStack inputStack) { - if (inputStack == null) + if (inputStack.isEmpty()) { ItemStack outputStack = new ItemStack(ModItems.POTION_FLASK); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java b/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java index fdf91ba5..5496ba23 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.compat.ICompatibility; -import WayofTime.bloodmagic.compat.guideapi.CompatibilityGuideAPI; import WayofTime.bloodmagic.compat.jei.CompatibilityJustEnoughItems; import WayofTime.bloodmagic.compat.waila.CompatibilityWaila; import net.minecraftforge.fml.common.Loader; @@ -16,7 +15,6 @@ public class ModCompatibility { compatibilities.add(new CompatibilityJustEnoughItems()); compatibilities.add(new CompatibilityWaila()); - compatibilities.add(new CompatibilityGuideAPI()); // compatibilities.add(new CompatibilityThaumcraft()); } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java b/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java index 0fce4e69..b7ff118d 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.registry; -import net.minecraftforge.fml.common.registry.EntityRegistry; -import WayofTime.bloodmagic.BloodMagic; +import net.minecraftforge.fml.common.registry.EntityEntry; import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; @@ -12,22 +11,21 @@ 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 net.minecraftforge.fml.common.registry.GameRegistry; public class ModEntities { public static void init() { - int id = 0; - - EntityRegistry.registerModEntity(EntityBloodLight.class, "BloodLight", id++, BloodMagic.instance, 64, 20, true); - EntityRegistry.registerModEntity(EntitySoulSnare.class, "SoulSnare", id++, BloodMagic.instance, 64, 1, true); - EntityRegistry.registerModEntity(EntitySentientArrow.class, "SoulArrow", id++, BloodMagic.instance, 64, 1, true); - EntityRegistry.registerModEntity(EntityMeteor.class, "Meteor", id++, BloodMagic.instance, 64, 1, true); - EntityRegistry.registerModEntity(EntitySentientSpecter.class, "SentientSpecter", id++, BloodMagic.instance, 64, 1, true); - EntityRegistry.registerModEntity(EntityMimic.class, "Mimic", id++, BloodMagic.instance, 64, 1, true); - EntityRegistry.registerModEntity(EntityCorruptedZombie.class, "CorruptedZombie", id++, BloodMagic.instance, 64, 1, true); - EntityRegistry.registerModEntity(EntityCorruptedSheep.class, "CorruptedSheep", id++, BloodMagic.instance, 64, 1, true); - EntityRegistry.registerModEntity(EntityCorruptedChicken.class, "CorruptedChicken", id++, BloodMagic.instance, 64, 1, true); - EntityRegistry.registerModEntity(EntityCorruptedSpider.class, "CorruptedSpider", id++, BloodMagic.instance, 64, 1, true); + GameRegistry.register(new EntityEntry(EntityBloodLight.class, "BloodLight").setRegistryName("BloodLight")); + GameRegistry.register(new EntityEntry(EntitySoulSnare.class, "SoulSnare").setRegistryName("SoulSnare")); + GameRegistry.register(new EntityEntry(EntitySentientArrow.class, "SoulArrow").setRegistryName("SoulArrow")); + GameRegistry.register(new EntityEntry(EntityMeteor.class, "Meteor").setRegistryName("Meteor")); + GameRegistry.register(new EntityEntry(EntitySentientSpecter.class, "SentientSpecter").setRegistryName("SentientSpecter")); + GameRegistry.register(new EntityEntry(EntityMimic.class, "Mimic").setRegistryName("Mimic")); + GameRegistry.register(new EntityEntry(EntityCorruptedZombie.class, "CorruptedZombie").setRegistryName("CorruptedZombie")); + GameRegistry.register(new EntityEntry(EntityCorruptedSheep.class, "CorruptedSheep").setRegistryName("CorruptedSheep")); + GameRegistry.register(new EntityEntry(EntityCorruptedChicken.class, "CorruptedChicken").setRegistryName("CorruptedChicken")); + GameRegistry.register(new EntityEntry(EntityCorruptedSpider.class, "CorruptedSpider").setRegistryName("CorruptedSpider")); } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 7226d51e..82a41b2e 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -456,7 +456,7 @@ public class ModRecipes if (dustList != null && dustList.size() > 0) { ItemStack dustStack = dustList.get(0).copy(); - dustStack.stackSize = 2; + dustStack.setCount(2); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(dustStack, 400, 200, 1, ore, ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); addedOreRecipeList.add(ore); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index 6a093244..90a5e8a1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -203,16 +203,16 @@ public class RitualAltarBuilder extends Ritual { if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler iItemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (iItemHandler.getSlots() <= 0) + if (itemHandler.getSlots() <= 0) { return false; } - for (int i = 0; i < iItemHandler.getSlots(); i++) + for (int i = 0; i < itemHandler.getSlots(); i++) { - if (iItemHandler.getStackInSlot(i) != null && iItemHandler.getStackInSlot(i).stackSize > 0 && iItemHandler.getStackInSlot(i).getItem() == item && iItemHandler.getStackInSlot(i).getItemDamage() == damage && iItemHandler.extractItem(i, 1, !consumeItem) != null) + if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() == item && itemHandler.getStackInSlot(i).getItemDamage() == damage && !itemHandler.extractItem(i, 1, !consumeItem).isEmpty()) { return true; } @@ -222,7 +222,7 @@ public class RitualAltarBuilder extends Ritual IInventory inv = (IInventory) tileEntity; for (int i = 0; i < inv.getSizeInventory(); i++) { - if (inv.getStackInSlot(i) != null && inv.getStackInSlot(i).stackSize > 0 && inv.getStackInSlot(i).getItem() == item && inv.getStackInSlot(i).getItemDamage() == damage) + if (!inv.getStackInSlot(0).isEmpty() && inv.getStackInSlot(i).getItem() == item && inv.getStackInSlot(i).getItemDamage() == damage) { if (consumeItem) { @@ -242,19 +242,19 @@ public class RitualAltarBuilder extends Ritual { if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler iItemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (iItemHandler.getSlots() <= 0) + if (itemHandler.getSlots() <= 0) { return null; } - for (int i = 0; i < iItemHandler.getSlots(); i++) + for (int i = 0; i < itemHandler.getSlots(); i++) { - if (iItemHandler.getStackInSlot(i) != null && iItemHandler.getStackInSlot(i).stackSize > 0 && iItemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(iItemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune && iItemHandler.extractItem(i, 1, true) != null) + if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune && itemHandler.extractItem(i, 1, true) != null) { - BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(EnumAltarComponent.BLOODRUNE), iItemHandler.getStackInSlot(i).getItemDamage()); - iItemHandler.extractItem(i, 1, false); + BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(EnumAltarComponent.BLOODRUNE), itemHandler.getStackInSlot(i).getItemDamage()); + itemHandler.extractItem(i, 1, false); return blockStack; } } @@ -263,7 +263,7 @@ public class RitualAltarBuilder extends Ritual IInventory inv = (IInventory) tileEntity; for (int i = 0; i < inv.getSizeInventory(); i++) { - if (inv.getStackInSlot(i) != null && inv.getStackInSlot(i).stackSize > 0 && inv.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune) + if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune) { BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(EnumAltarComponent.BLOODRUNE), inv.getStackInSlot(i).getItemDamage()); inv.decrStackSize(i, 1); @@ -281,22 +281,22 @@ public class RitualAltarBuilder extends Ritual { if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler iItemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (iItemHandler.getSlots() <= 0) + if (itemHandler.getSlots() <= 0) { return null; } - for (int i = 0; i < iItemHandler.getSlots(); i++) + for (int i = 0; i < itemHandler.getSlots(); i++) { - if (iItemHandler.getStackInSlot(i) != null && iItemHandler.getStackInSlot(i).stackSize > 0 && iItemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(iItemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune) && iItemHandler.extractItem(i, 1, true) != null) + if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune) && itemHandler.extractItem(i, 1, true) != null) { - Block block = Block.getBlockFromItem(iItemHandler.getStackInSlot(i).getItem()); + Block block = Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()); if (block != null && block != Blocks.GLOWSTONE && block != ModBlocks.BLOOD_STONE && block != ModBlocks.CRYSTAL) { - BlockStack blockStack = new BlockStack(block, iItemHandler.getStackInSlot(i).getItemDamage()); - iItemHandler.extractItem(i, 1, false); + BlockStack blockStack = new BlockStack(block, itemHandler.getStackInSlot(i).getItemDamage()); + itemHandler.extractItem(i, 1, false); return blockStack; } } @@ -306,10 +306,10 @@ public class RitualAltarBuilder extends Ritual IInventory inv = (IInventory) tileEntity; for (int i = 0; i < inv.getSizeInventory(); i++) { - if (inv.getStackInSlot(i) != null && inv.getStackInSlot(i).stackSize > 0 && inv.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune)) + if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune)) { Block block = Block.getBlockFromItem(inv.getStackInSlot(i).getItem()); - if (block != null && block != Blocks.GLOWSTONE && block != ModBlocks.BLOOD_STONE && block != ModBlocks.CRYSTAL) + if (block != Blocks.GLOWSTONE && block != ModBlocks.BLOOD_STONE && block != ModBlocks.CRYSTAL) { BlockStack blockStack = new BlockStack(block, inv.getStackInSlot(i).getItemDamage()); inv.decrStackSize(i, 1); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java index 6b2728fd..7e7c7c19 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java @@ -232,7 +232,14 @@ public class RitualAnimalGrowth extends Ritual @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") }; + return new ITextComponent[] { + new TextComponentTranslation(this.getUnlocalizedName() + ".info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") + }; } public int getBreedingDecreaseForWill(double vengefulWill) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java index 2fb686f9..caff98f0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java @@ -55,7 +55,7 @@ public class RitualArmourEvolve extends Ritual masterRitualStone.setActive(false); - world.spawnEntityInWorld(new EntityLightningBolt(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); + world.spawnEntity(new EntityLightningBolt(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java index 3f8a2d0e..7756789a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java @@ -48,7 +48,7 @@ public class RitualCobblestone extends Ritual if (tileEntity != null && tileEntity instanceof TileAlchemyArray) { TileAlchemyArray alchemyArray = (TileAlchemyArray) tileEntity; - if (alchemyArray.getStackInSlot(0) != null && alchemyArray.getStackInSlot(0).getItem() instanceof ItemComponent) + if (!alchemyArray.getStackInSlot(0).isEmpty() && alchemyArray.getStackInSlot(0).getItem() instanceof ItemComponent) { switch (alchemyArray.getStackInSlot(0).getItemDamage()) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index c88dd481..3c11f58c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -129,7 +129,7 @@ public class RitualCrushing extends Ritual if (useCuttingFluid) { ItemStack checkStack = block.getItem(world, newPos, state); - if (checkStack == null) + if (checkStack.isEmpty()) { continue; } @@ -159,7 +159,7 @@ public class RitualCrushing extends Ritual } ItemStack result = recipe.getRecipeOutput(input); - if (result == null) + if (result.isEmpty()) { continue; } @@ -167,7 +167,7 @@ public class RitualCrushing extends Ritual if (tile != null) { result = Utils.insertStackIntoTile(result, tile, EnumFacing.DOWN); - if (result != null && result.stackSize > 0) + if (!result.isEmpty()) { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, result); } @@ -189,7 +189,7 @@ public class RitualCrushing extends Ritual if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, null)) { ItemStack checkStack = block.getItem(world, newPos, state); - if (checkStack == null) + if (checkStack.isEmpty()) { continue; } @@ -210,7 +210,7 @@ public class RitualCrushing extends Ritual else Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); - if (copyStack != null && copyStack.stackSize > 0) + if (!copyStack.isEmpty()) { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); } @@ -223,31 +223,28 @@ public class RitualCrushing extends Ritual List stackList = block.getDrops(world, newPos, state, fortune); - if (stackList != null && !stackList.isEmpty()) + for (ItemStack item : stackList) { - for (ItemStack item : stackList) - { - ItemStack copyStack = ItemStack.copyItemStack(item); + ItemStack copyStack = item.copy(); - if (tile != null) - { - copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); - } else - { - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); - continue; - } - if (copyStack != null && copyStack.stackSize > 0) - { - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); - } - } - - if (fortune > 0) + if (tile != null) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveWillDrain, true); - destructiveWill -= destructiveWillDrain; + copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + } else + { + Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); + continue; } + if (!copyStack.isEmpty()) + { + Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); + } + } + + if (fortune > 0) + { + WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveWillDrain, true); + destructiveWill -= destructiveWillDrain; } } @@ -323,7 +320,14 @@ public class RitualCrushing extends Ritual @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") }; + return new ITextComponent[] { + new TextComponentTranslation(this.getUnlocalizedName() + ".info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), + new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") + }; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index 694cc40a..ed43dd81 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -136,20 +136,20 @@ public class RitualExpulsion extends Ritual moveEntityViaTeleport(entityLiving, event.getTargetX(), event.getTargetY(), event.getTargetZ()); boolean flag = false; - int i = MathHelper.floor_double(entityLiving.posX); - int j = MathHelper.floor_double(entityLiving.posY); - int k = MathHelper.floor_double(entityLiving.posZ); + int i = MathHelper.floor(entityLiving.posX); + int j = MathHelper.floor(entityLiving.posY); + int k = MathHelper.floor(entityLiving.posZ); int l; - if (!entityLiving.worldObj.isAirBlock(new BlockPos(i, j, k))) + if (!entityLiving.getEntityWorld().isAirBlock(new BlockPos(i, j, k))) { boolean flag1 = false; while (!flag1 && j > 0) { - IBlockState state = entityLiving.worldObj.getBlockState(new BlockPos(i, j - 1, k)); + IBlockState state = entityLiving.getEntityWorld().getBlockState(new BlockPos(i, j - 1, k)); - if (state != null && state.getMaterial().blocksMovement()) + if (state.getMaterial().blocksMovement()) { flag1 = true; } else @@ -163,7 +163,7 @@ public class RitualExpulsion extends Ritual { moveEntityViaTeleport(entityLiving, entityLiving.posX, entityLiving.posY, entityLiving.posZ); - if (!entityLiving.isCollided && !entityLiving.worldObj.containsAnyLiquid(entityLiving.getEntityBoundingBox())) + if (!entityLiving.isCollided && !entityLiving.getEntityWorld().containsAnyLiquid(entityLiving.getEntityBoundingBox())) { flag = true; } @@ -179,13 +179,13 @@ public class RitualExpulsion extends Ritual for (l = 0; l < 128; ++l) { double lengthVal = (double) l / ((double) 128 - 1.0D); - float randF1 = (entityLiving.worldObj.rand.nextFloat() - 0.5F) * 0.2F; - float randF2 = (entityLiving.worldObj.rand.nextFloat() - 0.5F) * 0.2F; - float randF3 = (entityLiving.worldObj.rand.nextFloat() - 0.5F) * 0.2F; - double lengthValX = lastX + (entityLiving.posX - lastX) * lengthVal + (entityLiving.worldObj.rand.nextDouble() - 0.5D) * (double) entityLiving.width * 2.0D; - double lengthValY = lastY + (entityLiving.posY - lastY) * lengthVal + entityLiving.worldObj.rand.nextDouble() * (double) entityLiving.height; - double lengthValZ = lastZ + (entityLiving.posZ - lastZ) * lengthVal + (entityLiving.worldObj.rand.nextDouble() - 0.5D) * (double) entityLiving.width * 2.0D; - entityLiving.worldObj.spawnParticle(EnumParticleTypes.PORTAL, lengthValX, lengthValY, lengthValZ, (double) randF1, (double) randF2, (double) randF3); + 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; @@ -200,7 +200,7 @@ public class RitualExpulsion extends Ritual { EntityPlayerMP entityplayermp = (EntityPlayerMP) entityLiving; - if (entityplayermp.worldObj == entityLiving.worldObj) + if (entityplayermp.getEntityWorld() == entityLiving.getEntityWorld()) { EnderTeleportEvent event = new EnderTeleportEvent(entityplayermp, x, y, z, 5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index 20097edd..8a1ef785 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -138,7 +138,7 @@ public class RitualFeatheredKnife extends Ritual float sacrificedHealth = 1; double lpModifier = 1; - if ((health / player.getMaxHealth() > healthThreshold) && ((useIncense && !player.isPotionActive(ModPotions.soulFray)) || !useIncense)) + if ((health / player.getMaxHealth() > healthThreshold) && (!useIncense || !player.isPotionActive(ModPotions.soulFray))) { if (useIncense) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java index e235c7ba..9ee51f61 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java @@ -114,17 +114,17 @@ public class RitualFelling extends Ritual private void placeInInventory(IBlockState blockState, World world, BlockPos blockPos, BlockPos tileEntityPos) { TileEntity tile = world.getTileEntity(tileEntityPos); - if (tile != null && blockState.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), 0) != null) + if (tile != null) { if (tile instanceof IInventory) { for (ItemStack stack : blockState.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), 0)) { ItemStack copyStack = stack.copy(); - Utils.insertStackIntoInventory(copyStack, (IInventory) tile, EnumFacing.DOWN); - if (copyStack.stackSize > 0) + Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + if (!copyStack.isEmpty()) { - world.spawnEntityInWorld(new EntityItem(world, blockPos.getX() + 0.4, blockPos.getY() + 2, blockPos.getZ() + 0.4, copyStack)); + world.spawnEntity(new EntityItem(world, blockPos.getX() + 0.4, blockPos.getY() + 2, blockPos.getZ() + 0.4, copyStack)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 0659e5d4..7ac7ad56 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -123,7 +123,7 @@ public class RitualForsakenSoul extends Ritual { if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { - if (entity.attackEntityFrom(DamageSource.outOfWorld, 1)) + if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) { if (!entity.isEntityAlive()) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java index 19c80230..2a811bcd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java @@ -67,7 +67,7 @@ public class RitualFullStomach extends Ritual for (int i = lastSlot; i < inventory.getSizeInventory(); i++) { ItemStack stack = inventory.getStackInSlot(i); - if (stack != null && stack.getItem() instanceof ItemFood) + if (!stack.isEmpty() && stack.getItem() instanceof ItemFood) { ItemFood foodItem = (ItemFood) stack.getItem(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java index f5e2e7b4..e2f1c1ec 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java @@ -42,30 +42,27 @@ public class RitualJumping extends Ritual AreaDescriptor jumpRange = getBlockRange(JUMP_RANGE); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, jumpRange.getAABB(masterRitualStone.getBlockPos())); - if (entities != null) + for (EntityLivingBase entity : entities) { - for (EntityLivingBase entity : entities) + if (totalEffects >= maxEffects) { - if (totalEffects >= maxEffects) - { - break; - } + break; + } - double motionY = 1.5; + double motionY = 1.5; - entity.fallDistance = 0; - if (entity.isSneaking()) - { - continue; - } + entity.fallDistance = 0; + if (entity.isSneaking()) + { + continue; + } - entity.motionY = motionY; - totalEffects++; + entity.motionY = motionY; + totalEffects++; - if (entity instanceof EntityPlayer) - { - Utils.setPlayerSpeedFromServer((EntityPlayer) entity, entity.motionX, entity.motionY, entity.motionZ); - } + if (entity instanceof EntityPlayer) + { + Utils.setPlayerSpeedFromServer((EntityPlayer) entity, entity.motionX, entity.motionY, entity.motionZ); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java index 9f4ee548..ddf403dc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java @@ -9,6 +9,7 @@ import net.minecraft.block.BlockOre; import net.minecraft.block.BlockRedstoneOre; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -50,7 +51,7 @@ public class RitualMagnetic extends Ritual if (block instanceof BlockOre || block instanceof BlockRedstoneOre) return true; - if (Item.getItemFromBlock(block) == null) + if (Item.getItemFromBlock(block) == Items.AIR) return false; BlockStack type = new BlockStack(block, meta); @@ -71,7 +72,7 @@ public class RitualMagnetic extends Ritual public static boolean isBlockOre(ItemStack stack) { - if (stack == null) + if (stack.isEmpty()) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index 1ef24b08..cc690201 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -65,7 +65,7 @@ public class RitualMeteor extends Ritual { EntityMeteor meteor = new EntityMeteor(world, pos.getX(), 260, pos.getZ(), 0, -0.1, 0, radiusModifier, explosionModifier, fillerChance); meteor.setMeteorStack(stack.copy()); - world.spawnEntityInWorld(meteor); + world.spawnEntity(meteor); entityItem.setDead(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java index f373eb83..fdc32722 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java @@ -49,32 +49,32 @@ public class RitualPlacer extends Ritual } AreaDescriptor areaDescriptor = getBlockRange(PLACER_RANGE); - IInventory iInventory; + IInventory inventory; if (tileEntity != null) { // Using the new Forge inventory system if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler iItemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (iItemHandler.getSlots() <= 0) + if (itemHandler.getSlots() <= 0) { return; } for (BlockPos blockPos : areaDescriptor.getContainedPositions(masterRitualStone.getBlockPos())) { - for (int inv = 0; inv < iItemHandler.getSlots(); inv++) + for (int inv = 0; inv < itemHandler.getSlots(); inv++) { - if (world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos) && iItemHandler.getStackInSlot(inv) != null && iItemHandler.getStackInSlot(inv).stackSize != 0) + if (world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos) && !itemHandler.getStackInSlot(inv).isEmpty()) { - if (iItemHandler.getStackInSlot(inv).getItem() instanceof ItemBlock && world.getBlockState(blockPos.down()) != null) + if (itemHandler.getStackInSlot(inv).getItem() instanceof ItemBlock && world.isAirBlock(blockPos.down())) { - if (iItemHandler.extractItem(inv, 1, true) != null) + if (!itemHandler.extractItem(inv, 1, true).isEmpty()) { - world.setBlockState(blockPos, Block.getBlockFromItem(iItemHandler.getStackInSlot(inv).getItem()).getStateFromMeta(iItemHandler.getStackInSlot(inv).getItemDamage())); - iItemHandler.extractItem(inv, 1, false); + world.setBlockState(blockPos, Block.getBlockFromItem(itemHandler.getStackInSlot(inv).getItem()).getStateFromMeta(itemHandler.getStackInSlot(inv).getItemDamage())); + itemHandler.extractItem(inv, 1, false); tileEntity.markDirty(); network.syphon(getRefreshCost()); } @@ -85,24 +85,24 @@ public class RitualPlacer extends Ritual //Compatibility with the old system, as it still exists } else if (tileEntity instanceof IInventory) { - iInventory = (IInventory) tileEntity; + inventory = (IInventory) tileEntity; - if (iInventory.getSizeInventory() <= 0) + if (inventory.getSizeInventory() <= 0) { return; } for (BlockPos blockPos : areaDescriptor.getContainedPositions(masterRitualStone.getBlockPos())) { - for (int inv = 0; inv < iInventory.getSizeInventory(); inv++) + for (int inv = 0; inv < inventory.getSizeInventory(); inv++) { - if (world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos) && iInventory.getStackInSlot(inv) != null && iInventory.getStackInSlot(inv).stackSize != 0) + if (world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos) && !inventory.getStackInSlot(inv).isEmpty()) { - if (iInventory.getStackInSlot(inv).getItem() instanceof ItemBlock && world.getBlockState(blockPos.down()) != null) + if (inventory.getStackInSlot(inv).getItem() instanceof ItemBlock && world.isAirBlock(blockPos.down())) { - world.setBlockState(blockPos, Block.getBlockFromItem(iInventory.getStackInSlot(inv).getItem()).getStateFromMeta(iInventory.getStackInSlot(inv).getItemDamage())); - iInventory.decrStackSize(inv, 1); - iInventory.markDirty(); + world.setBlockState(blockPos, Block.getBlockFromItem(inventory.getStackInSlot(inv).getItem()).getStateFromMeta(inventory.getStackInSlot(inv).getItemDamage())); + inventory.decrStackSize(inv, 1); + inventory.markDirty(); network.syphon(getRefreshCost()); break; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java index 586943ea..215e313a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java @@ -109,13 +109,10 @@ public class RitualPortal extends Ritual } } - if (LocationsHandler.getLocationsHandler() != null) + if (LocationsHandler.getLocationsHandler().addLocation(name, new PortalLocation(x, y + 1, z, world.provider.getDimension()))) { - if (LocationsHandler.getLocationsHandler().addLocation(name, new PortalLocation(x, y + 1, z, world.provider.getDimension()))) - { - portalRitualTag.setString(PORTAL_ID_TAG, name); - return true; - } + portalRitualTag.setString(PORTAL_ID_TAG, name); + return true; } } return false; @@ -191,10 +188,7 @@ public class RitualPortal extends Ritual int z = masterRitualStone.getBlockPos().getZ(); EnumFacing direction = masterRitualStone.getDirection(); - if (LocationsHandler.getLocationsHandler() != null) - { - LocationsHandler.getLocationsHandler().removeLocation(portalRitualTag.getString(PORTAL_ID_TAG), new PortalLocation(x, y + 1, z, world.provider.getDimension())); - } + LocationsHandler.getLocationsHandler().removeLocation(portalRitualTag.getString(PORTAL_ID_TAG), new PortalLocation(x, y + 1, z, world.provider.getDimension())); if (direction == EnumFacing.NORTH || direction == EnumFacing.SOUTH) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index 5111d5f9..2a7c9471 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -11,7 +11,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import java.util.ArrayList; import java.util.Iterator; @@ -49,14 +50,17 @@ public class RitualPump extends Ritual return; } - if (tileEntity != null && tileEntity instanceof IFluidHandler) + if (tileEntity != null && tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IFluidHandler fluidHandler = (IFluidHandler) tileEntity; + IFluidHandler fluidHandler = tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN); if (!cached || liquidsCache.isEmpty()) { - if (fluidHandler.drain(EnumFacing.DOWN, 1000, false) != null) + if (fluidHandler.drain(1000, false) != null) { - FluidStack fluidStack = fluidHandler.drain(EnumFacing.DOWN, 1000, false); + FluidStack fluidStack = fluidHandler.drain(1000, false); + if (fluidStack == null) + return; + for (BlockPos blockPos : getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) { if (!liquidsCache.contains(blockPos)) @@ -77,7 +81,7 @@ public class RitualPump extends Ritual { network.syphon(getRefreshCost()); currentPos = blockPosIterator.next(); - fluidHandler.fill(EnumFacing.DOWN, fluidHandler.drain(EnumFacing.DOWN, 1000, false), true); + fluidHandler.fill(fluidHandler.drain(1000, false), true); world.setBlockState(currentPos, Blocks.STONE.getDefaultState()); blockPosIterator.remove(); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java index c859c7f2..79dacbe7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java @@ -79,7 +79,7 @@ public class RitualUpgradeRemove extends Ritual if (successful) { removedUpgrade = true; - world.spawnEntityInWorld(new EntityItem(world, player.posX, player.posY, player.posZ, upgradeStack)); + world.spawnEntity(new EntityItem(world, player.posX, player.posY, player.posZ, upgradeStack)); for (Entry trackerEntry : armour.trackerMap.entrySet()) { StatTracker tracker = trackerEntry.getValue(); @@ -102,7 +102,7 @@ public class RitualUpgradeRemove extends Ritual masterRitualStone.setActive(false); - world.spawnEntityInWorld(new EntityLightningBolt(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); + world.spawnEntity(new EntityLightningBolt(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index df2f176f..5f1fbb4f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -97,7 +97,7 @@ public class RitualWellOfSuffering extends Ritual if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { - if (entity.attackEntityFrom(DamageSource.outOfWorld, 1)) + if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) { String entityName = entity.getClass().getSimpleName(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java index 7f45574d..e8b2d377 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java @@ -43,7 +43,6 @@ public class RitualZephyr extends Ritual BlockPos masterPos = masterRitualStone.getBlockPos(); AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - if (!masterRitualStone.getWorldObj().isRemote && tileInventory != null) { if (currentEssence < getRefreshCost()) @@ -57,32 +56,29 @@ public class RitualZephyr extends Ritual List itemList = world.getEntitiesWithinAABB(EntityItem.class, zephyrRange.getAABB(masterRitualStone.getBlockPos())); int count = 0; - if (itemList != null) + for (EntityItem entityItem : itemList) { - for (EntityItem entityItem : itemList) + if (entityItem.isDead) { - if (entityItem.isDead) - { - continue; - } + continue; + } - ItemStack copyStack = entityItem.getEntityItem().copy(); - int originalAmount = copyStack.stackSize; - ItemStack newStack = Utils.insertStackIntoTile(copyStack, tileInventory, EnumFacing.DOWN); + ItemStack copyStack = entityItem.getEntityItem().copy(); + int originalAmount = copyStack.getCount(); + ItemStack newStack = Utils.insertStackIntoTile(copyStack, tileInventory, EnumFacing.DOWN); - if (newStack != null && newStack.stackSize < originalAmount) - { - count++; - if (newStack.stackSize <= 0) - entityItem.setDead(); - - entityItem.getEntityItem().stackSize = newStack.stackSize; - } - - if (newStack == null) - { + if (!newStack.isEmpty() && newStack.getCount() < originalAmount) + { + count++; + if (newStack.isEmpty()) entityItem.setDead(); - } + + entityItem.getEntityItem().setCount(newStack.getCount()); + } + + if (newStack.isEmpty()) + { + entityItem.setDead(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index 74b5b1cd..ff8db2e9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -51,8 +51,8 @@ public class HarvestHandlerPlantable implements IHarvestHandler if (stack.getItem() instanceof IPlantable) { - if (stack.stackSize > 1) - stack.stackSize--; + if (stack.getCount() > 1) + stack.shrink(1); else drops.remove(stack); @@ -70,7 +70,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler if (!world.isRemote) { EntityItem toDrop = new EntityItem(world, pos.getX(), pos.getY() + 0.5, pos.getZ(), stack); - world.spawnEntityInWorld(toDrop); + world.spawnEntity(toDrop); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java index 16984fd4..1d98a5f1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -61,7 +61,7 @@ public class HarvestHandlerStem implements IHarvestHandler for (ItemStack drop : drops) { EntityItem item = new EntityItem(world, cropPos.getX(), cropPos.getY() + 0.5, cropPos.getZ(), drop); - world.spawnEntityInWorld(item); + world.spawnEntity(item); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java index 8bcdecf8..4325a79b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java @@ -47,7 +47,7 @@ public class HarvestHandlerTall implements IHarvestHandler for (ItemStack drop : drops) { EntityItem item = new EntityItem(world, pos.getX(), pos.getY() + 0.5, pos.getZ(), drop); - world.spawnEntityInWorld(item); + world.spawnEntity(item); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java index 362fe1b8..75dfaf5d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java @@ -28,7 +28,7 @@ public class ImperfectRitualZombie extends ImperfectRitual zombie.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, 20000, 3)); if (!imperfectRitualStone.getRitualWorld().isRemote) - imperfectRitualStone.getRitualWorld().spawnEntityInWorld(zombie); + imperfectRitualStone.getRitualWorld().spawnEntity(zombie); return true; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index e3c035d1..f15568ad 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -54,7 +54,7 @@ public class Teleports return; if (teleposer) - if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.worldObj, entity.getPosition(), entity.worldObj, new BlockPos(x, y, z)))) + if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z)))) return; network.syphon(getTeleportCost()); @@ -62,13 +62,13 @@ public class Teleports EntityPlayerMP player = (EntityPlayerMP) entity; player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); - player.worldObj.updateEntityWithOptionalForce(player, false); + player.getEntityWorld().updateEntityWithOptionalForce(player, false); player.connection.sendPacket(new SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); player.timeUntilPortal = 150; - player.worldObj.playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); + 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.worldObj, entity.getPosition(), entity.worldObj, new BlockPos(x, y, z))); + MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z))); } else { SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); @@ -76,20 +76,20 @@ public class Teleports return; if (teleposer) - if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.worldObj, entity.getPosition(), entity.worldObj, new BlockPos(x, y, z)))) + if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z)))) return; network.syphon(getTeleportCost() / 10); - WorldServer world = (WorldServer) entity.worldObj; + WorldServer world = (WorldServer) entity.getEntityWorld(); entity.setPosition(x + 0.5, y + 0.5, z + 0.5); entity.timeUntilPortal = 150; world.resetUpdateEntityTick(); - entity.worldObj.playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); + 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.worldObj, entity.getPosition(), entity.worldObj, new BlockPos(x, y, z))); + MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z))); } } } @@ -137,14 +137,14 @@ public class Teleports { EntityPlayerMP player = (EntityPlayerMP) entity; - if (!player.worldObj.isRemote) + if (!player.getEntityWorld().isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); if (network.getCurrentEssence() < getTeleportCost()) return; if (teleposer) - if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.worldObj, entity.getPosition(), newWorldServer, new BlockPos(x, y, z)))) + if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z)))) return; network.syphon(getTeleportCost()); @@ -152,20 +152,20 @@ public class Teleports player.changeDimension(newWorldID); //TODO: UNTESTED // server.getConfigurationManager().transferPlayerToDimension(player, newWorldID, new TeleporterBloodMagic(newWorldServer)); player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); - player.worldObj.updateEntityWithOptionalForce(player, false); + player.getEntityWorld().updateEntityWithOptionalForce(player, false); player.connection.sendPacket(new SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); if (teleposer) - MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.worldObj, entity.getPosition(), newWorldServer, new BlockPos(x, y, z))); + MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z))); } - } else if (!entity.worldObj.isRemote) + } else if (!entity.getEntityWorld().isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); if (network.getCurrentEssence() < (getTeleportCost() / 10)) return; if (teleposer) - if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.worldObj, entity.getPosition(), newWorldServer, new BlockPos(x, y, z)))) + if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z)))) return; network.syphon(getTeleportCost() / 10); @@ -181,7 +181,7 @@ public class Teleports { teleportedEntity.setLocationAndAngles(x + 0.5, y + 0.5, z + 0.5, entity.rotationYaw, entity.rotationPitch); teleportedEntity.forceSpawn = true; - newWorldServer.spawnEntityInWorld(teleportedEntity); + newWorldServer.spawnEntity(teleportedEntity); teleportedEntity.setWorld(newWorldServer); teleportedEntity.timeUntilPortal = teleportedEntity instanceof EntityPlayer ? 150 : 20; } @@ -189,7 +189,7 @@ public class Teleports oldWorldServer.resetUpdateEntityTick(); newWorldServer.resetUpdateEntityTick(); if (teleposer) - MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.worldObj, entity.getPosition(), newWorldServer, new BlockPos(x, y, z))); + MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z))); } entity.timeUntilPortal = entity instanceof EntityLiving ? 150 : 20; newWorldServer.playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); diff --git a/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java index 5e220868..b436f7e6 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java @@ -27,12 +27,9 @@ public class DefaultItemFilter implements IItemFilter * * @param filteredList * - The list of ItemStacks that the filter is set to. - * @param inventory + * @param itemHandler * - The inventory that is being accessed. This inventory is either * being pulled from or pushed to. - * @param side - * - The side that the inventory is being accessed from. Used for - * pulling/pushing from/to the inventory. * @param isFilterOutput * - Tells the filter what actions to expect. If true, it should be * initialized as an output filter. If false, it should be @@ -59,7 +56,7 @@ public class DefaultItemFilter implements IItemFilter @Override public ItemStack transferStackThroughOutputFilter(ItemStack inputStack) { - int allowedAmount = inputStack.stackSize; //This is done to make the migration to a maximum amount transfered a lot easier + int allowedAmount = inputStack.getCount(); //This is done to make the migration to a maximum amount transfered a lot easier if (allowedAmount <= 0) { @@ -67,12 +64,12 @@ public class DefaultItemFilter implements IItemFilter } ItemStack testStack = inputStack.copy(); - testStack.stackSize = allowedAmount; + testStack.setCount(allowedAmount); ItemStack remainderStack = Utils.insertStackIntoTile(testStack, itemHandler); - int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize); + int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); testStack = inputStack.copy(); - testStack.stackSize -= changeAmount; + testStack.shrink(changeAmount); World world = accessedTile.getWorld(); BlockPos pos = accessedTile.getPos(); @@ -91,26 +88,24 @@ public class DefaultItemFilter implements IItemFilter for (int slot = 0; slot < itemHandler.getSlots(); slot++) { ItemStack inputStack = itemHandler.getStackInSlot(slot); - if (inputStack == null || itemHandler.extractItem(slot, inputStack.stackSize, true) == null)//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) + 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.stackSize, true).stackSize, maxTransfer); + int allowedAmount = Math.min(itemHandler.extractItem(slot, inputStack.getCount(), true).getCount(), maxTransfer); ItemStack testStack = inputStack.copy(); - testStack.stackSize = allowedAmount; + testStack.setCount(allowedAmount); ItemStack remainderStack = outputFilter.transferStackThroughOutputFilter(testStack); - int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize); + int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); - if (remainderStack != null && remainderStack.stackSize == allowedAmount) + if (!remainderStack.isEmpty() && remainderStack.getCount() == allowedAmount) { //Nothing has changed. Moving on! continue; } - maxTransfer -= changeAmount; - itemHandler.extractItem(slot, changeAmount, false); World world = accessedTile.getWorld(); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java index cc0a9288..334959b6 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java @@ -21,6 +21,6 @@ public class IgnoreNBTItemFilter extends TestItemFilter @Override public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { - return filterStack != null && testStack != null && filterStack.getItem() == testStack.getItem() && filterStack.getMetadata() == testStack.getMetadata(); + 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 index 5d7157e4..8b0afb1b 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java @@ -11,7 +11,7 @@ public class ModIdItemFilter extends TestItemFilter @Override public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { - if (filterStack != null && testStack != null && filterStack.getItem() != null && testStack.getItem() != null) + if (ItemStack.areItemsEqualIgnoreDurability(filterStack, testStack)) { String keyId = getModID(filterStack.getItem()); String checkedId = getModID(testStack.getItem()); diff --git a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java index f0905745..3af3502e 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java @@ -40,9 +40,6 @@ public class TestItemFilter implements IItemFilter * being pulled from or pushed to. * @param itemHandler * - The item handler - * @param side - * - The side that the inventory is being accessed from. Used for - * pulling/pushing from/to the inventory. * @param isFilterOutput * - Tells the filter what actions to expect. If true, it should be * initialized as an output filter. If false, it should be @@ -60,23 +57,23 @@ public class TestItemFilter implements IItemFilter for (int slot = 0; slot < itemHandler.getSlots(); slot++) { ItemStack checkedStack = itemHandler.getStackInSlot(slot); - if (checkedStack == null) + if (checkedStack.isEmpty()) { continue; } - int stackSize = checkedStack.stackSize; + int stackSize = checkedStack.getCount(); for (ItemStack filterStack : requestList) { - if (filterStack.stackSize == 0) + if (filterStack.getCount() == 0) { continue; } if (doStacksMatch(filterStack, checkedStack)) { - filterStack.stackSize = Math.max(filterStack.stackSize - stackSize, 0); + filterStack.setCount(Math.max(filterStack.getCount() - stackSize, 0)); } } } @@ -85,24 +82,24 @@ public class TestItemFilter implements IItemFilter requestList = filteredList; for (ItemStack filterStack : requestList) { - filterStack.stackSize *= -1; //Invert the stack size so that + 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 == null) + if (checkedStack.isEmpty()) { continue; } - int stackSize = checkedStack.stackSize; + int stackSize = checkedStack.getCount(); for (ItemStack filterStack : filteredList) { if (doStacksMatch(filterStack, checkedStack)) { - filterStack.stackSize += stackSize; + filterStack.grow(stackSize); } } } @@ -112,7 +109,7 @@ public class TestItemFilter implements IItemFilter while (iterator.hasNext()) { ItemStack filterStack = iterator.next(); - if (filterStack.stackSize <= 0) + if (filterStack.isEmpty()) { iterator.remove(); } @@ -137,7 +134,7 @@ public class TestItemFilter implements IItemFilter { if (doStacksMatch(filterStack, inputStack)) { - allowedAmount = Math.min(filterStack.stackSize, inputStack.stackSize); + allowedAmount = Math.min(filterStack.getCount(), inputStack.getCount()); break; } } @@ -148,12 +145,12 @@ public class TestItemFilter implements IItemFilter } ItemStack testStack = inputStack.copy(); - testStack.stackSize = allowedAmount; + testStack.setCount(allowedAmount); ItemStack remainderStack = Utils.insertStackIntoTile(testStack, itemHandler); - int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize); + int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); testStack = inputStack.copy(); - testStack.stackSize -= changeAmount; + testStack.shrink(changeAmount); Iterator itr = requestList.iterator(); while (itr.hasNext()) @@ -161,8 +158,8 @@ public class TestItemFilter implements IItemFilter ItemStack filterStack = itr.next(); if (doStacksMatch(filterStack, inputStack)) { - filterStack.stackSize -= changeAmount; - if (filterStack.stackSize <= 0) + filterStack.shrink(changeAmount); + if (filterStack.isEmpty()) { itr.remove(); } @@ -186,7 +183,7 @@ public class TestItemFilter implements IItemFilter for (int slot = 0; slot < itemHandler.getSlots(); slot++) { ItemStack inputStack = itemHandler.getStackInSlot(slot); - if (inputStack == null || itemHandler.extractItem(slot, inputStack.stackSize, true) == null)//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) + if (inputStack.isEmpty() || itemHandler.extractItem(slot, inputStack.getCount(), true).isEmpty())//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) { continue; } @@ -196,7 +193,7 @@ public class TestItemFilter implements IItemFilter { if (doStacksMatch(filterStack, inputStack)) { - allowedAmount = Math.min(maxTransfer, Math.min(filterStack.stackSize, itemHandler.extractItem(slot, inputStack.stackSize, true).stackSize)); + allowedAmount = Math.min(maxTransfer, Math.min(filterStack.getCount(), itemHandler.extractItem(slot, inputStack.getCount(), true).getCount())); break; } } @@ -207,18 +204,16 @@ public class TestItemFilter implements IItemFilter } ItemStack testStack = inputStack.copy(); - testStack.stackSize = allowedAmount; + testStack.setCount(allowedAmount); ItemStack remainderStack = outputFilter.transferStackThroughOutputFilter(testStack); - int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize); + int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); - if (remainderStack != null && remainderStack.stackSize == allowedAmount) + if (!remainderStack.isEmpty() && remainderStack.getCount() == allowedAmount) { //Nothing has changed. Moving on! continue; } - maxTransfer -= changeAmount; - itemHandler.extractItem(slot, changeAmount, false); Iterator itr = requestList.iterator(); @@ -227,8 +222,8 @@ public class TestItemFilter implements IItemFilter ItemStack filterStack = itr.next(); if (doStacksMatch(filterStack, inputStack)) { - filterStack.stackSize -= changeAmount; - if (filterStack.stackSize <= 0) + filterStack.shrink(changeAmount); + if (filterStack.isEmpty()) { itr.remove(); } diff --git a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java index 5618a689..1957af31 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java @@ -45,8 +45,8 @@ public class BuildTestStructure settings.setRotation(rot); settings.setIgnoreEntities(true); - settings.setChunk((ChunkPos) null); - settings.setReplacedBlock((Block) null); + settings.setChunk(null); + settings.setReplacedBlock(null); settings.setIgnoreStructureBlock(false); // settings.func_189946_a(MathHelper.clamp_float(schema.integrity, 0.0F, 1.0F)); diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index 0d640d3c..4a00f85c 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -40,8 +40,8 @@ public class Dungeon settings.setRotation(rot); settings.setIgnoreEntities(true); - settings.setChunk((ChunkPos) null); - settings.setReplacedBlock((Block) null); + settings.setChunk(null); + settings.setReplacedBlock(null); settings.setIgnoreStructureBlock(false); DungeonRoom room = getRandomRoom(rand); @@ -142,10 +142,8 @@ public class Dungeon EnumFacing face = removedDoor1.getKey(); if (availableDoorMap.containsKey(face)) { - availableDoorMap.get(face).remove(removedDoor1); + availableDoorMap.get(face).remove(removedDoor1.getRight()); } - - removedDoor1 = null; } if (removedDoor2 != null) @@ -153,10 +151,8 @@ public class Dungeon EnumFacing face = removedDoor2.getKey(); if (availableDoorMap.containsKey(face)) { - availableDoorMap.get(face).remove(removedDoor2); + availableDoorMap.get(face).remove(removedDoor2.getRight()); } - - removedDoor2 = null; } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index b9aade81..a1ebd2cf 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -35,7 +35,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche { if (arrayEffect != null) { - arrayEffect.onEntityCollidedWithBlock(this, worldObj, pos, state, entity); + arrayEffect.onEntityCollidedWithBlock(this, getWorld(), pos, state, entity); } } @@ -145,7 +145,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche { this.decrStackSize(0, 1); this.decrStackSize(1, 1); - this.worldObj.setBlockToAir(getPos()); + this.getWorld().setBlockToAir(getPos()); } return true; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 2e1c3d1a..c3e9a446 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -76,7 +76,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, { if (blockedSlots.contains(slot)) { - blockedSlots.remove((Object) slot); + blockedSlots.remove(slot); } else { blockedSlots.add(slot); @@ -136,7 +136,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, { if (this.isSlave()) { - TileEntity tile = worldObj.getTileEntity(connectedPos); + TileEntity tile = getWorld().getTileEntity(connectedPos); if (tile instanceof TileAlchemyTable) { return (T) new SidedInvWrapper((TileAlchemyTable) tile, facing); @@ -172,7 +172,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, case DOWN: return index != outputSlot && index != orbSlot && index != toolSlot; case UP: - if (index == orbSlot && stack != null && stack.getItem() instanceof IBloodOrb) + if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) { return true; } else if (index == toolSlot) @@ -195,7 +195,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, case DOWN: return index == outputSlot; case UP: - if (index == orbSlot && stack != null && stack.getItem() instanceof IBloodOrb) + if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) { return true; } else if (index == toolSlot) @@ -237,7 +237,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, for (int i = 0; i < 6; i++) { - if (getStackInSlot(i) != null) + if (!getStackInSlot(i).isEmpty()) { inputList.add(getStackInSlot(i)); } @@ -246,12 +246,12 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, int tier = getTierOfOrb(); AlchemyTableRecipe recipe = AlchemyTableRecipeRegistry.getMatchingRecipe(inputList, getWorld(), getPos()); - if (recipe != null && (burnTime > 0 || (!worldObj.isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) + if (recipe != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) { if (burnTime == 1) { - IBlockState state = worldObj.getBlockState(pos); - worldObj.notifyBlockUpdate(getPos(), state, state, 3); + IBlockState state = getWorld().getBlockState(pos); + getWorld().notifyBlockUpdate(getPos(), state, state, 3); } if (canCraft(inputList, recipe)) @@ -261,18 +261,18 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, if (burnTime == ticksRequired) { - if (!worldObj.isRemote) + if (!getWorld().isRemote) { int requiredLp = recipe.getLpDrained(); if (requiredLp > 0) { - if (!worldObj.isRemote) + if (!getWorld().isRemote) { consumeLp(requiredLp); } } - if (!worldObj.isRemote) + if (!getWorld().isRemote) { craftItem(inputList, recipe); } @@ -280,8 +280,8 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, burnTime = 0; - IBlockState state = worldObj.getBlockState(pos); - worldObj.notifyBlockUpdate(getPos(), state, state, 3); + IBlockState state = getWorld().getBlockState(pos); + getWorld().notifyBlockUpdate(getPos(), state, state, 3); } else if (burnTime > ticksRequired + 10) { burnTime = 0; @@ -310,13 +310,13 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, ItemStack outputStack = recipe.getRecipeOutput(inputList); ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (outputStack == null) + if (outputStack.isEmpty()) return false; - if (currentOutputStack == null) + if (currentOutputStack.isEmpty()) return true; if (!currentOutputStack.isItemEqual(outputStack)) return false; - int result = currentOutputStack.stackSize + outputStack.stackSize; + int result = currentOutputStack.getCount() + outputStack.getCount(); return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); } @@ -324,7 +324,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public int getTierOfOrb() { ItemStack orbStack = getStackInSlot(orbSlot); - if (orbStack != null) + if (!orbStack.isEmpty()) { if (orbStack.getItem() instanceof IBloodOrb) { @@ -338,7 +338,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public int getContainedLp() { ItemStack orbStack = getStackInSlot(orbSlot); - if (orbStack != null) + if (!orbStack.isEmpty()) { if (orbStack.getItem() instanceof IBloodOrb) { @@ -372,12 +372,12 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, ItemStack outputStack = recipe.getRecipeOutput(inputList); ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (currentOutputStack == null) + if (currentOutputStack.isEmpty()) { setInventorySlotContents(outputSlot, outputStack); } else if (currentOutputStack.getItem() == currentOutputStack.getItem()) { - currentOutputStack.stackSize += outputStack.stackSize; + currentOutputStack.setCount(outputStack.getCount()); } consumeInventory(recipe); @@ -388,7 +388,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, { ItemStack orbStack = getStackInSlot(orbSlot); - if (orbStack != null) + if (!orbStack.isEmpty()) { if (orbStack.getItem() instanceof IBloodOrb) { @@ -416,24 +416,5 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, { setInventorySlotContents(i, result[i]); } -// for (int i = 0; i < 6; i++) -// { -// ItemStack inputStack = getStackInSlot(i); -// if (inputStack != null) -// { -// if (inputStack.getItem().hasContainerItem(inputStack)) -// { -// setInventorySlotContents(i, inputStack.getItem().getContainerItem(inputStack)); -// continue; -// } -// -// inputStack.stackSize--; -// if (inputStack.stackSize <= 0) -// { -// setInventorySlotContents(i, null); -// continue; -// } -// } -// } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index e34b3c0f..61c75ec9 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -30,14 +30,14 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo @Override public void update() { - if (worldObj.isRemote) + if (getWorld().isRemote) { return; } internalCounter++; - if (worldObj.isBlockPowered(getPos())) + if (getWorld().isBlockPowered(getPos())) { //TODO: Fill the contained gem if it is there. ItemStack stack = this.getStackInSlot(0); @@ -70,28 +70,28 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo } else { ItemStack stack = this.getStackInSlot(0); - if (stack != null) + if (!stack.isEmpty()) { if (stack.getItem() instanceof IDemonWillGem) { IDemonWillGem gemItem = (IDemonWillGem) stack.getItem(); for (EnumDemonWillType type : EnumDemonWillType.values()) { - double currentAmount = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type); + double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double drainAmount = Math.min(maxWill - currentAmount, gemDrainRate); - double filled = WorldDemonWillHandler.fillWillToMaximum(worldObj, pos, type, drainAmount, maxWill, false); + 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(worldObj, pos, type, filled, maxWill, 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(worldObj, pos, type); + double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double needed = maxWill - currentAmount; double discreteAmount = willItem.getDiscretization(stack); if (needed >= discreteAmount) @@ -99,10 +99,10 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo double filled = willItem.drainWill(stack, discreteAmount); if (filled > 0) { - WorldDemonWillHandler.fillWillToMaximum(worldObj, pos, type, filled, maxWill, true); - if (stack.stackSize <= 0) + WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, filled, maxWill, true); + if (stack.getCount() <= 0) { - this.setInventorySlotContents(0, null); + this.setInventorySlotContents(0, ItemStack.EMPTY); } } } @@ -252,7 +252,7 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo @Override public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) { - return stack != null ? stack.getItem() instanceof IDemonWillGem || stack.getItem() instanceof IDiscreteDemonWill : false; + return !stack.isEmpty() && (stack.getItem() instanceof IDemonWillGem || stack.getItem() instanceof IDiscreteDemonWill); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index 44fbc634..b1083df8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -41,7 +41,7 @@ public class TileDemonCrystal extends TileTicking @Override public void onUpdate() { - if (worldObj.isRemote) + if (getWorld().isRemote) { return; } @@ -52,20 +52,20 @@ public class TileDemonCrystal extends TileTicking { EnumDemonWillType type = EnumDemonWillType.values()[this.getBlockMetadata()]; - double value = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type); + double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); if (type != EnumDemonWillType.DEFAULT) { if (value >= 100) { double nextProgress = getCrystalGrowthPerSecond(value); - progressToNextCrystal += WorldDemonWillHandler.drainWill(worldObj, getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; + progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; } else { - value = WorldDemonWillHandler.getCurrentWill(worldObj, pos, EnumDemonWillType.DEFAULT); + value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT); if (value > 0.5) { double nextProgress = getCrystalGrowthPerSecond(value) * timeDelayForWrongWill; - progressToNextCrystal += WorldDemonWillHandler.drainWill(worldObj, getPos(), EnumDemonWillType.DEFAULT, nextProgress * defaultWillConversionRate, true) / defaultWillConversionRate; + progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), EnumDemonWillType.DEFAULT, nextProgress * defaultWillConversionRate, true) / defaultWillConversionRate; } } } else @@ -73,17 +73,17 @@ public class TileDemonCrystal extends TileTicking if (value > 0.5) { double nextProgress = getCrystalGrowthPerSecond(value); - progressToNextCrystal += WorldDemonWillHandler.drainWill(worldObj, getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; + progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; } } checkAndGrowCrystal(); } -// if (worldObj.getWorldTime() % 200 == 0) +// if (getWorld().getWorldTime() % 200 == 0) // { // crystalCount = Math.min(crystalCount + 1, 7); -// worldObj.markBlockForUpdate(pos); +// getWorld().markBlockForUpdate(pos); // } } @@ -105,11 +105,11 @@ public class TileDemonCrystal extends TileTicking return 0; } - IBlockState state = worldObj.getBlockState(pos); + IBlockState state = getWorld().getBlockState(pos); int meta = this.getBlockType().getMetaFromState(state); EnumDemonWillType type = EnumDemonWillType.values()[meta]; - double value = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type); + double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double percentDrain = willDrain <= 0 ? 1 : Math.min(1, value / willDrain); if (percentDrain <= 0) { @@ -117,7 +117,7 @@ public class TileDemonCrystal extends TileTicking } // Verification that you can actually drain the will from this chunk, for future proofing. - WorldDemonWillHandler.drainWill(worldObj, pos, type, percentDrain * willDrain, true); + WorldDemonWillHandler.drainWill(getWorld(), pos, type, percentDrain * willDrain, true); progressToNextCrystal += percentDrain * progressPercentage; checkAndGrowCrystal(); @@ -131,8 +131,8 @@ public class TileDemonCrystal extends TileTicking { progressToNextCrystal--; crystalCount++; - IBlockState thisState = worldObj.getBlockState(pos); - worldObj.notifyBlockUpdate(pos, thisState, thisState, 3); + IBlockState thisState = getWorld().getBlockState(pos); + getWorld().notifyBlockUpdate(pos, thisState, thisState, 3); markDirty(); } } @@ -144,15 +144,15 @@ public class TileDemonCrystal extends TileTicking public boolean dropSingleCrystal() { - if (!worldObj.isRemote && crystalCount > 1) + if (!getWorld().isRemote && crystalCount > 1) { - IBlockState state = worldObj.getBlockState(pos); + IBlockState state = getWorld().getBlockState(pos); EnumDemonWillType type = state.getValue(BlockDemonCrystal.TYPE); ItemStack stack = BlockDemonCrystal.getItemStackDropped(type, 1); if (stack != null) { crystalCount--; - worldObj.spawnEntityInWorld(new EntityItem(worldObj, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, stack)); + getWorld().spawnEntity(new EntityItem(getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, stack)); return true; } } @@ -167,7 +167,7 @@ public class TileDemonCrystal extends TileTicking public int getCrystalCountForRender() { - return MathHelper.clamp_int(crystalCount - 1, 0, 6); + return MathHelper.clamp(crystalCount - 1, 0, 6); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index cb088dd9..a0acb3ee 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -30,26 +30,26 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond @Override public void onUpdate() { - if (worldObj.isRemote) + if (getWorld().isRemote) { return; } BlockPos offsetPos = pos.offset(EnumFacing.UP); - if (worldObj.isAirBlock(offsetPos)) //Room for a crystal to grow + if (getWorld().isAirBlock(offsetPos)) //Room for a crystal to grow { - EnumDemonWillType highestType = WorldDemonWillHandler.getHighestDemonWillType(worldObj, pos); - double amount = WorldDemonWillHandler.getCurrentWill(worldObj, pos, highestType); + 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(worldObj, getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) + if (WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) { if (highestType == EnumDemonWillType.DEFAULT && formRandomSpecialCrystal(offsetPos) || formCrystal(highestType, offsetPos)) { - WorldDemonWillHandler.drainWill(worldObj, getPos(), highestType, willToFormCrystal, true); + WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, true); internalCounter = 0; } } @@ -60,8 +60,8 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond public boolean formCrystal(EnumDemonWillType type, BlockPos position) { - worldObj.setBlockState(position, ModBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal())); - TileEntity tile = worldObj.getTileEntity(position); + getWorld().setBlockState(position, ModBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal())); + TileEntity tile = getWorld().getTileEntity(position); if (tile instanceof TileDemonCrystal) { ((TileDemonCrystal) tile).setPlacement(EnumFacing.UP); @@ -73,11 +73,11 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond public boolean formRandomSpecialCrystal(BlockPos position) { - if (worldObj.rand.nextDouble() > 0.1) + if (getWorld().rand.nextDouble() > 0.1) { return formCrystal(EnumDemonWillType.DEFAULT, position); } - EnumDemonWillType crystalType = EnumDemonWillType.values()[worldObj.rand.nextInt(EnumDemonWillType.values().length - 1) + 1]; + EnumDemonWillType crystalType = EnumDemonWillType.values()[getWorld().rand.nextInt(EnumDemonWillType.values().length - 1) + 1]; return formCrystal(crystalType, position); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java index ca95170d..475f73c8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java @@ -23,24 +23,24 @@ public class TileDemonPylon extends TileTicking implements IDemonWillConduit @Override public void onUpdate() { - if (worldObj.isRemote) + if (getWorld().isRemote) { return; } for (EnumDemonWillType type : EnumDemonWillType.values()) { - double currentAmount = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type); + double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); for (EnumFacing side : EnumFacing.HORIZONTALS) { BlockPos offsetPos = pos.offset(side, 16); - double sideAmount = WorldDemonWillHandler.getCurrentWill(worldObj, offsetPos, type); + double sideAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), offsetPos, type); if (sideAmount > currentAmount) { double drainAmount = Math.min((sideAmount - currentAmount) / 2, drainRate); - double drain = WorldDemonWillHandler.drainWill(worldObj, offsetPos, type, drainAmount, true); - WorldDemonWillHandler.fillWill(worldObj, pos, type, drain, true); + double drain = WorldDemonWillHandler.drainWill(getWorld(), offsetPos, type, drainAmount, true); + WorldDemonWillHandler.fillWill(getWorld(), pos, type, drain, true); } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index f08dcf94..6ebf9778 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -42,13 +42,13 @@ public class TileIncenseAltar extends TileInventory implements ITickable public void update() { AxisAlignedBB aabb = incenseArea.getAABB(getPos()); - List playerList = worldObj.getEntitiesWithinAABB(EntityPlayer.class, aabb); + List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, aabb); if (playerList.isEmpty()) { return; } - if (worldObj.getTotalWorldTime() % 100 == 0) + if (getWorld().getTotalWorldTime() % 100 == 0) { recheckConstruction(); } @@ -65,9 +65,9 @@ public class TileIncenseAltar extends TileInventory implements ITickable if (hasPerformed) { - if (worldObj.rand.nextInt(4) == 0 && worldObj instanceof WorldServer) + if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) { - WorldServer server = (WorldServer) worldObj; + WorldServer server = (WorldServer) 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, new int[0]); } } @@ -113,9 +113,9 @@ public class TileIncenseAltar extends TileInventory implements ITickable for (int j = -1; j <= 1; j++) { BlockPos offsetPos = facingOffsetPos.offset(horizontalFacing.rotateY(), j); - IBlockState state = worldObj.getBlockState(offsetPos); + IBlockState state = getWorld().getBlockState(offsetPos); Block block = state.getBlock(); - if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(worldObj, offsetPos, state) >= currentDistance - 2)) + if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(getWorld(), offsetPos, state) >= currentDistance - 2)) { canFormRoad = false; break level; @@ -144,9 +144,9 @@ public class TileIncenseAltar extends TileInventory implements ITickable for (int y = 0 + yOffset; y <= 2 + yOffset; y++) { BlockPos offsetPos = pos.add(i, y, j); - IBlockState state = worldObj.getBlockState(offsetPos); + IBlockState state = getWorld().getBlockState(offsetPos); Block block = state.getBlock(); - TranquilityStack stack = IncenseTranquilityRegistry.getTranquilityOfBlock(worldObj, offsetPos, block, state); + TranquilityStack stack = IncenseTranquilityRegistry.getTranquilityOfBlock(getWorld(), offsetPos, block, state); if (stack != null) { if (!tranquilityMap.containsKey(stack.type)) @@ -186,7 +186,7 @@ public class TileIncenseAltar extends TileInventory implements ITickable appliedTranquility += Math.sqrt(entry.getValue()); } - double bonus = IncenseAltarHandler.getIncenseBonusFromComponents(worldObj, pos, appliedTranquility, roadDistance); + 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 3e34ccdd..2480bb68 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -61,7 +61,7 @@ public class TileInventory extends TileBase implements IInventory if (j >= 0 && j < inventory.length) { - inventory[j] = ItemStack.loadItemStackFromNBT(data); + inventory[j] = new ItemStack(data); } } } @@ -75,7 +75,7 @@ public class TileInventory extends TileBase implements IInventory for (int i = 0; i < inventory.length; i++) { - if ((inventory[i] != null) && !isSyncedSlot(i)) + if ((!inventory[i].isEmpty()) && !isSyncedSlot(i)) { NBTTagCompound data = new NBTTagCompound(); data.setByte("Slot", (byte) i); @@ -115,7 +115,7 @@ public class TileInventory extends TileBase implements IInventory if (!getWorld().isRemote) getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); - if (inventory[index].stackSize <= count) + if (inventory[index].getCount() <= count) { ItemStack itemStack = inventory[index]; inventory[index] = null; @@ -124,7 +124,7 @@ public class TileInventory extends TileBase implements IInventory } ItemStack itemStack = inventory[index].splitStack(count); - if (inventory[index].stackSize == 0) + if (inventory[index].getCount() == 0) inventory[index] = null; markDirty(); @@ -150,8 +150,8 @@ public class TileInventory extends TileBase implements IInventory public void setInventorySlotContents(int slot, ItemStack stack) { inventory[slot] = stack; - if (stack != null && stack.stackSize > getInventoryStackLimit()) - stack.stackSize = getInventoryStackLimit(); + if (!stack.isEmpty() && stack.getCount() > getInventoryStackLimit()) + stack.setCount(getInventoryStackLimit()); markDirty(); if (!getWorld().isRemote) getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); @@ -163,12 +163,6 @@ public class TileInventory extends TileBase implements IInventory return 64; } - @Override - public boolean isUseableByPlayer(EntityPlayer player) - { - return true; - } - @Override public void openInventory(EntityPlayer player) { @@ -211,6 +205,20 @@ public class TileInventory extends TileBase implements IInventory this.inventory = new ItemStack[size]; } + @Override + public boolean isEmpty() { + for (ItemStack stack : inventory) + if (!stack.isEmpty()) + return false; + + return true; + } + + @Override + public boolean isUsableByPlayer(EntityPlayer player) { + return true; + } + // IWorldNameable @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index 62bad390..a2a5f56a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -82,23 +82,23 @@ public class TileInversionPillar extends TileTicking { if (animationOffsetValue < 0) { - animationOffsetValue = worldObj.getTotalWorldTime() * worldObj.rand.nextFloat(); + animationOffsetValue = getWorld().getTotalWorldTime() * getWorld().rand.nextFloat(); animationOffset.setValue(animationOffsetValue); } - if (worldObj.isRemote) + if (getWorld().isRemote) { return; } if (!isRegistered) { - isRegistered = InversionPillarHandler.addPillarToMap(worldObj, getType(), getPos()); + isRegistered = InversionPillarHandler.addPillarToMap(getWorld(), getType(), getPos()); } counter++; - double currentWill = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type); + double currentWill = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); if (counter % 1 == 0) { List pillarList = getNearbyPillarsExcludingThis(); @@ -151,17 +151,17 @@ public class TileInversionPillar extends TileTicking if (currentInfectionRadius >= 8 && currentInversion >= inversionToAddPillar) { //TODO: Improve algorithm - List allConnectedPos = InversionPillarHandler.getAllConnectedPillars(worldObj, type, pos); - BlockPos candidatePos = findCandidatePositionForPillar(worldObj, type, pos, allConnectedPos, 5, 10); + List allConnectedPos = InversionPillarHandler.getAllConnectedPillars(getWorld(), type, pos); + BlockPos candidatePos = findCandidatePositionForPillar(getWorld(), type, pos, allConnectedPos, 5, 10); if (!candidatePos.equals(BlockPos.ORIGIN)) { currentInversion = 0; IBlockState pillarState = ModBlocks.INVERSION_PILLAR.getStateFromMeta(type.ordinal()); IBlockState bottomState = ModBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2); IBlockState topState = ModBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2 + 1); - worldObj.setBlockState(candidatePos, pillarState); - worldObj.setBlockState(candidatePos.down(), bottomState); - worldObj.setBlockState(candidatePos.up(), topState); + getWorld().setBlockState(candidatePos, pillarState); + getWorld().setBlockState(candidatePos.down(), bottomState); + getWorld().setBlockState(candidatePos.up(), topState); } } } @@ -176,11 +176,11 @@ public class TileInversionPillar extends TileTicking { if (currentInversion > 1000) { - Vec3d vec = new Vec3d(worldObj.rand.nextDouble() * 2 - 1, worldObj.rand.nextDouble() * 2 - 1, worldObj.rand.nextDouble() * 2 - 1).normalize().scale(2 * currentInfectionRadius); + 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.xCoord, vec.yCoord, vec.zCoord); - worldObj.setBlockState(centralPos, ModBlocks.DEMON_EXTRAS.getStateFromMeta(0)); + getWorld().setBlockState(centralPos, ModBlocks.DEMON_EXTRAS.getStateFromMeta(0)); currentInversion -= 1000; } } @@ -236,7 +236,7 @@ public class TileInversionPillar extends TileTicking public void spreadWillToSurroundingChunks() { - double currentAmount = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type); + double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); if (currentAmount <= minimumWillForChunkWhenSpreading) { return; @@ -245,7 +245,7 @@ public class TileInversionPillar extends TileTicking for (EnumFacing side : EnumFacing.HORIZONTALS) { BlockPos offsetPos = pos.offset(side, 16); - double sideAmount = WorldDemonWillHandler.getCurrentWill(worldObj, offsetPos, type); + double sideAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), offsetPos, type); if (currentAmount > sideAmount) { double drainAmount = Math.min((currentAmount - sideAmount) / 2, willPushRate); @@ -254,8 +254,8 @@ public class TileInversionPillar extends TileTicking continue; } - double drain = WorldDemonWillHandler.drainWill(worldObj, pos, type, drainAmount, true); - drain = WorldDemonWillHandler.fillWillToMaximum(worldObj, offsetPos, type, drain, maxWillForChunk, true); + double drain = WorldDemonWillHandler.drainWill(getWorld(), pos, type, drainAmount, true); + drain = WorldDemonWillHandler.fillWillToMaximum(getWorld(), offsetPos, type, drain, maxWillForChunk, true); currentInversion -= drain * inversionCostPerWillSpread; } @@ -264,15 +264,15 @@ public class TileInversionPillar extends TileTicking public void removePillarFromMap() { - if (!worldObj.isRemote) + if (!getWorld().isRemote) { - InversionPillarHandler.removePillarFromMap(worldObj, type, pos); + InversionPillarHandler.removePillarFromMap(getWorld(), type, pos); } } public List getNearbyPillarsExcludingThis() { - return InversionPillarHandler.getNearbyPillars(worldObj, type, pos); + return InversionPillarHandler.getNearbyPillars(getWorld(), type, pos); } @Override @@ -322,7 +322,7 @@ public class TileInversionPillar extends TileTicking if (totalGeneratedWill > 0) { - WorldDemonWillHandler.fillWillToMaximum(worldObj, pos, type, totalGeneratedWill, maxWillForChunk, true); + WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, totalGeneratedWill, maxWillForChunk, true); } } @@ -359,9 +359,9 @@ public class TileInversionPillar extends TileTicking for (int i = 0; i < currentInfectionRadius; i++) { - double xOff = (worldObj.rand.nextBoolean() ? 1 : -1) * (worldObj.rand.nextGaussian() + 1) * (currentInfectionRadius); - double yOff = (worldObj.rand.nextBoolean() ? 1 : -1) * (worldObj.rand.nextGaussian() + 1) * (currentInfectionRadius); - double zOff = (worldObj.rand.nextBoolean() ? 1 : -1) * (worldObj.rand.nextGaussian() + 1) * (currentInfectionRadius); + 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) @@ -378,16 +378,16 @@ public class TileInversionPillar extends TileTicking return 1; //Invalid block (itself!) } - IBlockState state = worldObj.getBlockState(offsetPos); - if (!state.getBlock().isAir(state, worldObj, offsetPos)) + IBlockState 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 (worldObj.setBlockState(offsetPos, ModBlocks.DEMON_EXTRAS.getStateFromMeta(0))) + if (getWorld().setBlockState(offsetPos, ModBlocks.DEMON_EXTRAS.getStateFromMeta(0))) { - WorldDemonWillHandler.drainWill(worldObj, pos, type, willPerOperation, true); + WorldDemonWillHandler.drainWill(getWorld(), pos, type, willPerOperation, true); currentInversion -= inversionPerOperation; return 0; //Successfully placed diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 58f0b59b..f5167081 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -51,7 +51,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS @Override public void onUpdate() { - if (worldObj.isRemote) + if (getWorld().isRemote) return; if (getWorld().isBlockPowered(getPos()) && isActive()) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index 122f3cff..b36f1e8d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -32,6 +32,8 @@ import WayofTime.bloodmagic.registry.ModItems; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; +import javax.annotation.Nullable; + public class TileMimic extends TileInventory implements ITickable { private static Field _blockMetadata = ReflectionHelper.findField(TileEntity.class, "blockMetadata", "field_145847_g"); @@ -55,7 +57,7 @@ public class TileMimic extends TileInventory implements ITickable @Override public void update() { - if (worldObj.isRemote) + if (getWorld().isRemote) { return; } @@ -67,36 +69,36 @@ public class TileMimic extends TileInventory implements ITickable if (potionStack != null) { AxisAlignedBB bb = new AxisAlignedBB(this.getPos()).expand(playerCheckRadius, playerCheckRadius, playerCheckRadius); - List playerList = worldObj.getEntitiesWithinAABB(EntityPlayer.class, bb); + List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, bb); for (EntityPlayer player : playerList) { if (!player.capabilities.isCreativeMode) { - double posX = this.pos.getX() + 0.5 + (2 * worldObj.rand.nextDouble() - 1) * potionSpawnRadius; - double posY = this.pos.getY() + 0.5 + (2 * worldObj.rand.nextDouble() - 1) * potionSpawnRadius; - double posZ = this.pos.getZ() + 0.5 + (2 * worldObj.rand.nextDouble() - 1) * potionSpawnRadius; + 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() == ModItems.POTION_FLASK ? Items.SPLASH_POTION : potionStack.getItem()); newStack.setTagCompound(potionStack.getTagCompound()); - EntityPotion potionEntity = new EntityPotion(worldObj, posX, posY, posZ, newStack); + EntityPotion potionEntity = new EntityPotion(getWorld(), posX, posY, posZ, newStack); - worldObj.spawnEntityInWorld(potionEntity); + getWorld().spawnEntity(potionEntity); break; } } } } - if (this.getBlockMetadata() == BlockMimic.sentientMimicMeta && worldObj.getDifficulty() != EnumDifficulty.PEACEFUL && !(mimicedTile instanceof IInventory)) + if (this.getBlockMetadata() == BlockMimic.sentientMimicMeta && getWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(mimicedTile instanceof IInventory)) { AxisAlignedBB bb = new AxisAlignedBB(this.getPos()).expand(playerCheckRadius, playerCheckRadius, playerCheckRadius); - List playerList = worldObj.getEntitiesWithinAABB(EntityPlayer.class, bb); + List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, bb); for (EntityPlayer player : playerList) { - if (!player.capabilities.isCreativeMode && Utils.canEntitySeeBlock(worldObj, player, getPos())) + if (!player.capabilities.isCreativeMode && Utils.canEntitySeeBlock(getWorld(), player, getPos())) { spawnMimicEntity(player); break; @@ -108,10 +110,10 @@ public class TileMimic extends TileInventory implements ITickable public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side) { - if (heldItem != null && player.capabilities.isCreativeMode) + if (!heldItem.isEmpty() && player.capabilities.isCreativeMode) { List list = PotionUtils.getEffectsFromStack(heldItem); - if (list != null && !list.isEmpty()) + if (!list.isEmpty()) { if (!world.isRemote) { @@ -141,10 +143,10 @@ public class TileMimic extends TileInventory implements ITickable if (player.isSneaking()) return false; - if (player.getHeldItem(hand) != null && player.getHeldItem(hand).getItem() == new ItemStack(ModBlocks.MIMIC).getItem()) + if (!player.getHeldItem(hand).isEmpty() && player.getHeldItem(hand).getItem() == new ItemStack(ModBlocks.MIMIC).getItem()) return false; - if (getStackInSlot(0) != null && player.getHeldItem(hand) != null) + if (!getStackInSlot(0).isEmpty() && !player.getHeldItem(hand).isEmpty()) return false; if (!dropItemsOnBreak && !player.capabilities.isCreativeMode) @@ -155,7 +157,7 @@ public class TileMimic extends TileInventory implements ITickable if (player.capabilities.isCreativeMode) { - dropItemsOnBreak = getStackInSlot(0) == null; + dropItemsOnBreak = getStackInSlot(0).isEmpty(); } world.notifyBlockUpdate(pos, state, state, 3); @@ -189,7 +191,7 @@ public class TileMimic extends TileInventory implements ITickable return false; } - if (player.getActiveItemStack() == null && getStackInSlot(1) != null) + if (player.getActiveItemStack().isEmpty() && !getStackInSlot(1).isEmpty()) { switch (sideHit) { @@ -242,31 +244,31 @@ public class TileMimic extends TileInventory implements ITickable public boolean spawnMimicEntity(EntityPlayer target) { - if (this.worldObj.getDifficulty() == EnumDifficulty.PEACEFUL) + if (this.getWorld().getDifficulty() == EnumDifficulty.PEACEFUL) { return false; } - if (this.getStackInSlot(0) == null || worldObj.isRemote) + if (this.getStackInSlot(0).isEmpty() || getWorld().isRemote) { return false; } - EntityMimic mimicEntity = new EntityMimic(worldObj); + EntityMimic mimicEntity = new EntityMimic(getWorld()); mimicEntity.setPosition(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); mimicEntity.initializeMimic(getStackInSlot(0), tileTag, dropItemsOnBreak, metaOfReplacedBlock, playerCheckRadius, pos); tileTag = null; mimicedTile = null; - this.setInventorySlotContents(0, null); + this.setInventorySlotContents(0, ItemStack.EMPTY); - worldObj.spawnEntityInWorld(mimicEntity); + getWorld().spawnEntity(mimicEntity); if (target != null) { mimicEntity.setAttackTarget(target); } - worldObj.setBlockToAir(pos); + getWorld().setBlockToAir(pos); return true; } @@ -277,7 +279,7 @@ public class TileMimic extends TileInventory implements ITickable { dropMimicedTileInventory(); } - mimicedTile = getTileFromStackWithTag(worldObj, pos, getStackInSlot(0), tileTag, metaOfReplacedBlock); + mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, metaOfReplacedBlock); } @Override @@ -288,7 +290,7 @@ public class TileMimic extends TileInventory implements ITickable dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); tileTag = tag.getCompoundTag("tileTag"); metaOfReplacedBlock = tag.getInteger("metaOfReplacedBlock"); - mimicedTile = getTileFromStackWithTag(worldObj, pos, getStackInSlot(0), tileTag, metaOfReplacedBlock); + mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, metaOfReplacedBlock); playerCheckRadius = tag.getInteger("playerCheckRadius"); potionSpawnRadius = tag.getInteger("potionSpawnRadius"); potionSpawnInterval = Math.max(1, tag.getInteger("potionSpawnInterval")); @@ -319,7 +321,7 @@ public class TileMimic extends TileInventory implements ITickable public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, int replacedMeta) { - if (stack != null && stack.getItem() instanceof ItemBlock) + if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); IBlockState state = block.getStateFromMeta(replacedMeta); @@ -341,9 +343,10 @@ public class TileMimic extends TileInventory implements ITickable return false; } - public static TileEntity getTileFromStackWithTag(World world, BlockPos pos, ItemStack stack, NBTTagCompound tag, int replacementMeta) + @Nullable + public static TileEntity getTileFromStackWithTag(World world, BlockPos pos, ItemStack stack, @Nullable NBTTagCompound tag, int replacementMeta) { - if (stack != null && stack.getItem() instanceof ItemBlock) + if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); IBlockState state = block.getStateFromMeta(stack.getItemDamage()); @@ -356,14 +359,14 @@ public class TileMimic extends TileInventory implements ITickable if (tag != null) { - NBTTagCompound copyTag = (NBTTagCompound) (tag.copy()); + NBTTagCompound copyTag = tag.copy(); copyTag.setInteger("x", pos.getX()); copyTag.setInteger("y", pos.getY()); copyTag.setInteger("z", pos.getZ()); tile.readFromNBT(copyTag); } - tile.setWorldObj(world); + tile.setWorld(world); try { @@ -396,7 +399,7 @@ public class TileMimic extends TileInventory implements ITickable public void dropMimicedTileInventory() { - if (!worldObj.isRemote && mimicedTile instanceof IInventory) + if (!getWorld().isRemote && mimicedTile instanceof IInventory) { InventoryHelper.dropInventoryItems(getWorld(), getPos(), (IInventory) mimicedTile); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index 4c5b8f76..d495095b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -35,8 +35,8 @@ public class TilePhantomBlock extends TileTicking if (ticksRemaining <= 0) { - worldObj.setBlockToAir(getPos()); - worldObj.removeTileEntity(getPos()); + getWorld().setBlockToAir(getPos()); + getWorld().removeTileEntity(getPos()); } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java index 387f5562..f393ee0b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -33,7 +33,7 @@ public class TilePurificationAltar extends TileInventory implements ITickable if (totalPurity <= 0) { ItemStack stack = this.getStackInSlot(0); - if (stack != null && stack.getItem() instanceof IPurificationAsh) + if (!stack.isEmpty() && stack.getItem() instanceof IPurificationAsh) { totalPurity = ((IPurificationAsh) stack.getItem()).getTotalPurity(stack); maxPurity = ((IPurificationAsh) stack.getItem()).getMaxPurity(stack); @@ -45,7 +45,7 @@ public class TilePurificationAltar extends TileInventory implements ITickable } AxisAlignedBB aabb = purityArea.getAABB(getPos()); - List animalList = worldObj.getEntitiesWithinAABB(EntityAnimal.class, aabb); + List animalList = getWorld().getEntitiesWithinAABB(EntityAnimal.class, aabb); if (animalList.isEmpty()) { return; @@ -65,9 +65,9 @@ public class TilePurificationAltar extends TileInventory implements ITickable if (hasPerformed) { - if (worldObj.rand.nextInt(4) == 0 && worldObj instanceof WorldServer) + if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) { - WorldServer server = (WorldServer) worldObj; + WorldServer server = (WorldServer) 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, new int[0]); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 183f8516..a99b696c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -52,22 +52,22 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil @Override public void update() { - if (!worldObj.isRemote) + if (!getWorld().isRemote) { for (EnumDemonWillType type : EnumDemonWillType.values()) { - double willInWorld = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type); + double willInWorld = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double filled = Math.min(willInWorld, worldWillTransferRate); if (filled > 0) { filled = this.fillDemonWill(type, filled, false); - filled = WorldDemonWillHandler.drainWill(worldObj, pos, type, filled, false); + filled = WorldDemonWillHandler.drainWill(getWorld(), pos, type, filled, false); if (filled > 0) { this.fillDemonWill(type, filled, true); - WorldDemonWillHandler.drainWill(worldObj, pos, type, filled, true); + WorldDemonWillHandler.drainWill(getWorld(), pos, type, filled, true); } } } @@ -85,7 +85,7 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil for (int i = 0; i < 4; i++) { - if (getStackInSlot(i) != null) + if (!getStackInSlot(i).isEmpty()) { inputList.add(getStackInSlot(i)); } @@ -100,18 +100,18 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil if (burnTime == ticksRequired) { - if (!worldObj.isRemote) + if (!getWorld().isRemote) { double requiredSouls = recipe.getSoulsDrained(); if (requiredSouls > 0) { - if (!worldObj.isRemote && soulsInGem >= recipe.getMinimumSouls()) + if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) { consumeSouls(EnumDemonWillType.DEFAULT, requiredSouls); } } - if (!worldObj.isRemote && soulsInGem >= recipe.getMinimumSouls()) + if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) craftItem(recipe); } @@ -144,13 +144,13 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil ItemStack outputStack = recipe.getRecipeOutput(); ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (outputStack == null) + if (outputStack.isEmpty()) return false; - if (currentOutputStack == null) + if (currentOutputStack.isEmpty()) return true; if (!currentOutputStack.isItemEqual(outputStack)) return false; - int result = currentOutputStack.stackSize + outputStack.stackSize; + int result = currentOutputStack.getCount() + outputStack.getCount(); return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); } @@ -162,12 +162,12 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil ItemStack outputStack = recipe.getRecipeOutput(); ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (currentOutputStack == null) + if (currentOutputStack.isEmpty()) { setInventorySlotContents(outputSlot, outputStack); } else if (currentOutputStack.getItem() == currentOutputStack.getItem()) { - currentOutputStack.stackSize += outputStack.stackSize; + currentOutputStack.grow(outputStack.getCount()); } consumeInventory(); @@ -178,7 +178,7 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil { ItemStack soulStack = getStackInSlot(soulSlot); - if (soulStack != null) + if (!soulStack.isEmpty()) { if (soulStack.getItem() instanceof IDemonWill || soulStack.getItem() instanceof IDemonWillGem) { @@ -243,7 +243,7 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil for (int i = 0; i < 4; i++) { ItemStack inputStack = getStackInSlot(i); - if (inputStack != null) + if (!inputStack.isEmpty()) { if (inputStack.getItem().hasContainerItem(inputStack)) { @@ -251,11 +251,10 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil continue; } - inputStack.stackSize--; - if (inputStack.stackSize <= 0) + inputStack.shrink(1); + if (inputStack.isEmpty()) { - setInventorySlotContents(i, null); - continue; + setInventorySlotContents(i, ItemStack.EMPTY); } } } @@ -281,23 +280,20 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } ItemStack stack = this.getStackInSlot(soulSlot); - if (stack == null || !(stack.getItem() instanceof IDemonWillGem)) + if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) { return 0; } IDemonWillGem willGem = (IDemonWillGem) stack.getItem(); - - double filled = willGem.fillWill(type, stack, amount, doFill); - - return filled; + return willGem.fillWill(type, stack, amount, doFill); } @Override public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { ItemStack stack = this.getStackInSlot(soulSlot); - if (stack == null || !(stack.getItem() instanceof IDemonWillGem)) + if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) { return 0; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java index c8eafe62..22c48fef 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java @@ -42,7 +42,7 @@ public class TileSpectralBlock extends TileTicking @Override public void onUpdate() { - if (worldObj.isRemote) + if (getWorld().isRemote) { return; } @@ -79,7 +79,7 @@ public class TileSpectralBlock extends TileTicking if (!Strings.isNullOrEmpty(containedBlockName)) block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(containedBlockName)); - if (block != null && worldObj.setBlockState(pos, block.getStateFromMeta(containedBlockMeta))) + if (block != null && getWorld().setBlockState(pos, block.getStateFromMeta(containedBlockMeta))) getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index fc016bb3..625eeb8e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -52,9 +52,9 @@ public class TileTeleposer extends TileInventory implements ITickable @Override public void update() { - if (!worldObj.isRemote) + if (!getWorld().isRemote) { - int currentInput = worldObj.getStrongPower(pos); + int currentInput = getWorld().getStrongPower(pos); if (previousInput == 0 && currentInput != 0) { @@ -67,17 +67,16 @@ public class TileTeleposer extends TileInventory implements ITickable public void initiateTeleport() { - if (!worldObj.isRemote && worldObj.getTileEntity(pos) != null && worldObj.getTileEntity(pos) instanceof TileTeleposer && canInitiateTeleport((TileTeleposer) worldObj.getTileEntity(pos)) && worldObj.getBlockState(pos).getBlock() instanceof BlockTeleposer) + if (!getWorld().isRemote && canInitiateTeleport(this) && getBlockType() instanceof BlockTeleposer) { - TileTeleposer teleposer = (TileTeleposer) worldObj.getTileEntity(pos); - ItemStack focusStack = NBTHelper.checkNBT(teleposer.getStackInSlot(0)); + ItemStack focusStack = NBTHelper.checkNBT(getStackInSlot(0)); ItemTelepositionFocus focus = (ItemTelepositionFocus) focusStack.getItem(); - BlockPos focusPos = focus.getBlockPos(teleposer.getStackInSlot(0)); - World focusWorld = focus.getWorld(teleposer.getStackInSlot(0)); + BlockPos focusPos = focus.getBlockPos(getStackInSlot(0)); + World focusWorld = focus.getWorld(getStackInSlot(0)); if (focusWorld != null && focusWorld.getTileEntity(focusPos) instanceof TileTeleposer && !focusWorld.getTileEntity(focusPos).equals(this)) { - final int focusLevel = (teleposer.getStackInSlot(0).getItemDamage() + 1); + final int focusLevel = (getStackInSlot(0).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.getSoulNetwork(focus.getOwnerUUID(focusStack)).syphonAndDamage(PlayerHelper.getPlayerFromUUID(focus.getOwnerUUID(focusStack)), lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1))) @@ -90,7 +89,7 @@ public class TileTeleposer extends TileInventory implements ITickable { for (int k = -(focusLevel - 1); k <= (focusLevel - 1); k++) { - TeleposeEvent event = new TeleposeEvent(worldObj, pos.add(i, 1 + j, k), focusWorld, focusPos.add(i, 1 + j, k)); + TeleposeEvent event = new TeleposeEvent(getWorld(), pos.add(i, 1 + j, k), focusWorld, focusPos.add(i, 1 + j, k)); if (Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos) && !MinecraftForge.EVENT_BUS.post(event)) { blocksTransported++; @@ -104,11 +103,11 @@ public class TileTeleposer extends TileInventory implements ITickable 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 = worldObj.getEntitiesWithinAABB(Entity.class, originalArea); + 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); - if (focusWorld.equals(worldObj)) + if (focusWorld.equals(getWorld())) { if (!originalWorldEntities.isEmpty()) { @@ -131,7 +130,7 @@ public class TileTeleposer extends TileInventory implements ITickable { 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), worldObj, focusWorld.provider.getDimension(), true)); + 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), getWorld(), focusWorld.provider.getDimension(), true)); } } @@ -139,7 +138,7 @@ public class TileTeleposer extends TileInventory implements ITickable { 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), focusWorld, worldObj.provider.getDimension(), true)); + 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), focusWorld, getWorld().provider.getDimension(), true)); } } } @@ -150,6 +149,6 @@ public class TileTeleposer extends TileInventory implements ITickable private boolean canInitiateTeleport(TileTeleposer teleposer) { - return teleposer.getStackInSlot(0) != null && teleposer.getStackInSlot(0).getItem() instanceof ItemTelepositionFocus && !Strings.isNullOrEmpty(((ItemTelepositionFocus) teleposer.getStackInSlot(0).getItem()).getOwnerName(teleposer.getStackInSlot(0))); + return !teleposer.getStackInSlot(0).isEmpty() && teleposer.getStackInSlot(0).getItem() instanceof ItemTelepositionFocus && !Strings.isNullOrEmpty(((ItemTelepositionFocus) teleposer.getStackInSlot(0).getItem()).getOwnerName(teleposer.getStackInSlot(0))); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java index 79e2923d..4cf8c221 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java @@ -49,7 +49,7 @@ public class ContainerAlchemyTable extends Container if (slotId < 6 && slotId >= 0) { Slot slot = this.getSlot(slotId); - if (!slot.getHasStack() && inventoryPlayer.getItemStack() == null) + if (!slot.getHasStack() && inventoryPlayer.getItemStack().isEmpty()) { ((TileAlchemyTable) tileTable).toggleInputSlotAccessible(slotId); } @@ -61,7 +61,7 @@ public class ContainerAlchemyTable extends Container @Override public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { - ItemStack itemstack = null; + ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); if (slot != null && slot.getHasStack()) @@ -73,7 +73,7 @@ public class ContainerAlchemyTable extends Container { if (!this.mergeItemStack(itemstack1, 9, 9 + 36, true)) { - return null; + return ItemStack.EMPTY; } slot.onSlotChange(itemstack1, itemstack); @@ -83,31 +83,31 @@ public class ContainerAlchemyTable extends Container { if (!this.mergeItemStack(itemstack1, 7, 8, false)) //TODO: Add alchemy tools to list { - return null; + return ItemStack.EMPTY; } } else if (!this.mergeItemStack(itemstack1, 0, 6, false)) { - return null; + return ItemStack.EMPTY; } } else if (!this.mergeItemStack(itemstack1, 9, 9 + 36, false)) { - return null; + return ItemStack.EMPTY; } - if (itemstack1.stackSize == 0) + if (itemstack1.getCount() == 0) { - slot.putStack(null); + slot.putStack(ItemStack.EMPTY); } else { slot.onSlotChanged(); } - if (itemstack1.stackSize == itemstack.stackSize) + if (itemstack1.getCount() == itemstack.getCount()) { - return null; + return ItemStack.EMPTY; } - slot.onPickupFromSlot(playerIn, itemstack1); + slot.onTake(playerIn, itemstack1); } return itemstack; @@ -116,7 +116,7 @@ public class ContainerAlchemyTable extends Container @Override public boolean canInteractWith(EntityPlayer playerIn) { - return this.tileTable.isUseableByPlayer(playerIn); + return this.tileTable.isUsableByPlayer(playerIn); } private class SlotOrb extends Slot diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java index c422d24c..be325890 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java @@ -98,7 +98,7 @@ public class ContainerItemRoutingNode extends Container ItemStack copyStack = heldStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); - copyStack.stackSize = 1; + copyStack.setCount(1); slot.putStack(copyStack); } } @@ -124,7 +124,7 @@ public class ContainerItemRoutingNode extends Container @Override public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { - ItemStack itemstack = null; + ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); if (slot != null && slot.getHasStack()) @@ -136,7 +136,7 @@ public class ContainerItemRoutingNode extends Container { if (!this.mergeItemStack(itemstack1, slotsOccupied, slotsOccupied + 36, true)) { - return null; + return ItemStack.EMPTY; } slot.onSlotChange(itemstack1, itemstack); @@ -147,28 +147,28 @@ public class ContainerItemRoutingNode extends Container { if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; + return ItemStack.EMPTY; } } - } else if (!this.mergeItemStack(itemstack1, 0 + slotsOccupied, 36 + slotsOccupied, false)) + } else if (!this.mergeItemStack(itemstack1, slotsOccupied, 36 + slotsOccupied, false)) { - return null; + return ItemStack.EMPTY; } - if (itemstack1.stackSize == 0) + if (itemstack1.getCount() == 0) { - slot.putStack(null); + slot.putStack(ItemStack.EMPTY); } else { slot.onSlotChanged(); } - if (itemstack1.stackSize == itemstack.stackSize) + if (itemstack1.getCount() == itemstack.getCount()) { - return null; + return ItemStack.EMPTY; } - slot.onPickupFromSlot(playerIn, itemstack1); + slot.onTake(playerIn, itemstack1); } return itemstack; @@ -177,7 +177,7 @@ public class ContainerItemRoutingNode extends Container @Override public boolean canInteractWith(EntityPlayer playerIn) { - return this.tileItemRoutingNode.isUseableByPlayer(playerIn); + return this.tileItemRoutingNode.isUsableByPlayer(playerIn); } private class SlotItemFilter extends Slot diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java index 77121ecf..64cd4de9 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java @@ -18,6 +18,6 @@ public class ContainerMasterRoutingNode extends Container @Override public boolean canInteractWith(EntityPlayer playerIn) { - return this.tileMasterRoutingNode.isUseableByPlayer(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 index 85497373..ecf995d3 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java @@ -41,7 +41,7 @@ public class ContainerSoulForge extends Container @Override public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { - ItemStack itemstack = null; + ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); if (slot != null && slot.getHasStack()) @@ -53,7 +53,7 @@ public class ContainerSoulForge extends Container { if (!this.mergeItemStack(itemstack1, 6, 6 + 36, true)) { - return null; + return ItemStack.EMPTY; } slot.onSlotChange(itemstack1, itemstack); @@ -63,31 +63,31 @@ public class ContainerSoulForge extends Container { if (!this.mergeItemStack(itemstack1, 4, 5, false)) { - return null; + return ItemStack.EMPTY; } } else if (!this.mergeItemStack(itemstack1, 0, 4, false)) { - return null; + return ItemStack.EMPTY; } } else if (!this.mergeItemStack(itemstack1, 6, 42, false)) { - return null; + return ItemStack.EMPTY; } - if (itemstack1.stackSize == 0) + if (itemstack1.getCount() == 0) { - slot.putStack(null); + slot.putStack(ItemStack.EMPTY); } else { slot.onSlotChanged(); } - if (itemstack1.stackSize == itemstack.stackSize) + if (itemstack1.getCount() == itemstack.getCount()) { - return null; + return ItemStack.EMPTY; } - slot.onPickupFromSlot(playerIn, itemstack1); + slot.onTake(playerIn, itemstack1); } return itemstack; @@ -96,7 +96,7 @@ public class ContainerSoulForge extends Container @Override public boolean canInteractWith(EntityPlayer playerIn) { - return this.tileForge.isUseableByPlayer(playerIn); + return this.tileForge.isUsableByPlayer(playerIn); } private class SlotSoul extends Slot diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java index 2b3e93eb..163361a0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java @@ -34,7 +34,7 @@ public class ContainerTeleposer extends Container @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot) { - ItemStack stack = null; + ItemStack stack = ItemStack.EMPTY; Slot slotObject = inventorySlots.get(slot); int slots = inventorySlots.size(); @@ -49,28 +49,28 @@ public class ContainerTeleposer extends Container { if (!this.mergeItemStack(stackInSlot, 0, slots, false)) { - return null; + return ItemStack.EMPTY; } } else if (!this.mergeItemStack(stackInSlot, slots, 36 + slots, false)) { - return null; + return ItemStack.EMPTY; } } - if (stackInSlot.stackSize == 0) + if (stackInSlot.getCount() == 0) { - slotObject.putStack(null); + slotObject.putStack(ItemStack.EMPTY); } else { slotObject.onSlotChanged(); } - if (stackInSlot.stackSize == stack.stackSize) + if (stackInSlot.getCount() == stack.getCount()) { - return null; + return ItemStack.EMPTY; } - slotObject.onPickupFromSlot(player, stackInSlot); + slotObject.onTake(player, stackInSlot); } return stack; @@ -79,7 +79,7 @@ public class ContainerTeleposer extends Container @Override public boolean canInteractWith(EntityPlayer playerIn) { - return this.tileTeleposer.isUseableByPlayer(playerIn); + return this.tileTeleposer.isUsableByPlayer(playerIn); } private class SlotTeleposer extends Slot diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java index a6ae7453..ba4ac2be 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java @@ -32,7 +32,7 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn public void setGhostItemAmount(int ghostItemSlot, int amount) { ItemStack stack = itemInventory.getStackInSlot(ghostItemSlot); - if (stack != null) + if (!stack.isEmpty()) { GhostItemHelper.setItemGhostAmount(stack, amount); } @@ -70,10 +70,10 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn if (j == 0) { - inventory[currentActiveSlot] = ItemStack.loadItemStackFromNBT(data); + inventory[currentActiveSlot] = new ItemStack(data); } else if (j >= 1 && j < inventory.length + 1) { - inventory[j - 1] = ItemStack.loadItemStackFromNBT(data); + inventory[j - 1] = new ItemStack(data); } } } @@ -126,14 +126,14 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn public void incrementCurrentPriotiryToMaximum(int max) { priorities[currentActiveSlot] = Math.min(priorities[currentActiveSlot] + 1, max); - IBlockState state = worldObj.getBlockState(pos); - worldObj.notifyBlockUpdate(pos, state, state, 3); + IBlockState state = getWorld().getBlockState(pos); + getWorld().notifyBlockUpdate(pos, state, state, 3); } public void decrementCurrentPriority() { priorities[currentActiveSlot] = Math.max(priorities[currentActiveSlot] - 1, 0); - IBlockState state = worldObj.getBlockState(pos); - worldObj.notifyBlockUpdate(pos, state, state, 3); + IBlockState 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 index 3ac56f0b..a4df1665 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java @@ -26,7 +26,7 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn @Override public IItemFilter getInputFilterForSide(EnumFacing side) { - TileEntity tile = worldObj.getTileEntity(pos.offset(side)); + TileEntity tile = getWorld().getTileEntity(pos.offset(side)); if (tile != null) { IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); @@ -34,7 +34,7 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn { ItemStack filterStack = this.getFilterStack(side); - if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) { IItemFilter filter = new DefaultItemFilter(); filter.initializeFilter(null, tile, handler, false); diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index 0bebb147..074e9117 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -45,15 +45,15 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti @Override public void update() { - if (!worldObj.isRemote) + if (!getWorld().isRemote) { -// currentInput = worldObj.isBlockIndirectlyGettingPowered(pos); - currentInput = worldObj.getStrongPower(pos); +// currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); + currentInput = getWorld().getStrongPower(pos); // System.out.println(currentInput); } - if (worldObj.isRemote || worldObj.getTotalWorldTime() % tickRate != 0) //Temporary tick rate solver + if (getWorld().isRemote || getWorld().getTotalWorldTime() % tickRate != 0) //Temporary tick rate solver { return; } @@ -62,7 +62,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti for (BlockPos outputPos : outputNodeList) { - TileEntity outputTile = worldObj.getTileEntity(outputPos); + TileEntity outputTile = getWorld().getTileEntity(outputPos); if (outputTile instanceof IOutputItemRoutingNode && this.isConnected(new LinkedList(), outputPos)) { IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; @@ -96,7 +96,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti for (BlockPos inputPos : inputNodeList) { - TileEntity inputTile = worldObj.getTileEntity(inputPos); + TileEntity inputTile = getWorld().getTileEntity(inputPos); if (inputTile instanceof IInputItemRoutingNode && this.isConnected(new LinkedList(), inputPos)) { IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; @@ -126,7 +126,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(worldObj, pos, EnumDemonWillType.DEFAULT)); + int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT)); for (Entry> outputEntry : outputMap.entrySet()) { @@ -231,7 +231,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti // { // return false; // } - TileEntity tile = worldObj.getTileEntity(nodePos); + TileEntity tile = getWorld().getTileEntity(nodePos); if (!(tile instanceof IRoutingNode)) { // connectionMap.remove(nodePos); @@ -254,7 +254,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti // path.clear(); // path.addAll(testPath); return true; - } else if (NodeHelper.isNodeConnectionEnabled(worldObj, node, testPos)) + } else if (NodeHelper.isNodeConnectionEnabled(getWorld(), node, testPos)) { if (isConnected(path, testPos)) { @@ -401,7 +401,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti while (itr.hasNext()) { BlockPos testPos = itr.next(); - TileEntity tile = worldObj.getTileEntity(testPos); + TileEntity tile = getWorld().getTileEntity(testPos); if (tile instanceof IRoutingNode) { ((IRoutingNode) tile).removeConnection(pos); diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java index a538eebb..135a8a0d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java @@ -26,7 +26,7 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO @Override public IItemFilter getOutputFilterForSide(EnumFacing side) { - TileEntity tile = worldObj.getTileEntity(pos.offset(side)); + TileEntity tile = getWorld().getTileEntity(pos.offset(side)); if (tile != null) { IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); @@ -34,7 +34,7 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO { ItemStack filterStack = this.getFilterStack(side); - if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) { IItemFilter filter = new DefaultItemFilter(); filter.initializeFilter(null, tile, handler, true); diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java index 2dfadd98..ac00e276 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -30,10 +30,10 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte @Override public void update() { - if (!worldObj.isRemote) + if (!getWorld().isRemote) { - currentInput = worldObj.isBlockIndirectlyGettingPowered(pos); -// currentInput = worldObj.getStrongPower(pos); + currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); +// currentInput = getWorld().getStrongPower(pos); } } @@ -83,14 +83,14 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte @Override public void removeAllConnections() { - TileEntity testTile = worldObj.getTileEntity(getMasterPos()); + 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 = worldObj.getTileEntity(testPos); + TileEntity tile = getWorld().getTileEntity(testPos); if (tile instanceof IRoutingNode) { ((IRoutingNode) tile).removeConnection(pos); diff --git a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java index d3b022e4..100d5b30 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java @@ -110,7 +110,7 @@ public class ChatUtil { for (ITextComponent c : lines) { - player.addChatComponentMessage(c); + player.sendMessage(c); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java index 4b899b49..f70598e6 100644 --- a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java @@ -59,7 +59,7 @@ public class GhostItemHelper { newStack.setTagCompound(null); } - newStack.stackSize = amount; + newStack.setCount(amount); return newStack; } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 5d3e89d6..1c3c383d 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -46,9 +46,13 @@ import net.minecraftforge.common.ISpecialArmor.ArmorProperties; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fml.common.discovery.ASMDataTable; +import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; +import net.minecraftforge.items.wrapper.PlayerInvWrapper; +import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; import net.minecraftforge.items.wrapper.SidedInvWrapper; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; @@ -86,32 +90,6 @@ public class Utils return added; } - public static Item getItem(ResourceLocation resource) - { - return Item.REGISTRY.getObject(resource); - } - - public static Block getBlock(ResourceLocation resource) - { - return Block.REGISTRY.getObject(resource); - } - - public static ResourceLocation getResourceForItem(ItemStack stack) - { - if (stack != null) - { - if (stack.getItem() instanceof ItemBlock) - { - return Block.REGISTRY.getNameForObject(((ItemBlock) stack.getItem()).getBlock()); - } else - { - return Item.REGISTRY.getNameForObject(stack.getItem()); - } - } - - return null; - } - public static boolean isImmuneToFireDamage(EntityLivingBase entity) { return entity.isImmuneToFire() || entity.isPotionActive(MobEffects.FIRE_RESISTANCE); @@ -119,7 +97,7 @@ public class Utils public static boolean isPlayerBesideSolidBlockFace(EntityPlayer player) { - World world = player.worldObj; + World world = player.getEntityWorld(); double minimumDistanceFromAxis = 0.7; BlockPos centralPos = player.getPosition(); for (EnumFacing facing : EnumFacing.HORIZONTALS) @@ -142,16 +120,17 @@ public class Utils public static boolean canPlayerSeeDemonWill(EntityPlayer player) { - ItemStack[] mainInventory = player.inventory.mainInventory; + IItemHandler inventory = new PlayerMainInvWrapper(player.inventory); - for (ItemStack stack : mainInventory) + for (int i = 0; i < inventory.getSlots(); i++) { - if (stack == null) + ItemStack stack = inventory.getStackInSlot(i); + if (stack.isEmpty()) { continue; } - if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.worldObj, stack, player)) + if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.getEntityWorld(), stack, player)) { return true; } @@ -165,12 +144,7 @@ public class Utils 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); EnumFacing dir = EnumFacing.getFacingFromVector((float) relativePosition.xCoord, (float) relativePosition.yCoord, (float) relativePosition.zCoord); RayTraceResult result = world.rayTraceBlocks(new Vec3d(entity.posX, entity.posY + (double) entity.getEyeHeight(), entity.posZ), new Vec3d(pos.getX() + 0.5 + dir.getFrontOffsetX() * 0.4, pos.getY() + 0.5 + dir.getFrontOffsetY() * 0.4, pos.getZ() + 0.5 + dir.getFrontOffsetZ() * 0.4), false, true, true); - if (result != null) - { - return pos.equals(result.getBlockPos()); - } - - return result != null; + return result == null || pos.equals(result.getBlockPos()); } public static int plantSeedsInArea(World world, AxisAlignedBB aabb, int horizontalRadius, int verticalRadius) @@ -188,7 +162,7 @@ public class Utils public static int plantItemStack(World world, BlockPos centralPos, ItemStack stack, int horizontalRadius, int verticalRadius) { - if (stack == null || stack.stackSize <= 0) + if (stack.isEmpty()) { return 0; } @@ -226,9 +200,9 @@ public class Utils IBlockState 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.stackSize--; + stack.shrink(1); planted++; - if (stack.stackSize <= 0) + if (stack.isEmpty() || stack.getCount() <= 0) { return planted; } @@ -250,13 +224,13 @@ public class Utils return 0; } - World world = itemEntity.worldObj; + World world = itemEntity.getEntityWorld(); BlockPos pos = itemEntity.getPosition(); ItemStack stack = itemEntity.getEntityItem(); int planted = plantItemStack(world, pos, stack, horizontalRadius, verticalRadius); - if (stack.stackSize <= 0) + if (stack.isEmpty()) { itemEntity.setDead(); } @@ -266,18 +240,19 @@ public class Utils public static int getDemonWillResolution(EntityPlayer player) { - ItemStack[] mainInventory = player.inventory.mainInventory; + IItemHandler inventory = new PlayerMainInvWrapper(player.inventory); - for (ItemStack stack : mainInventory) + for (int i = 0; i < inventory.getSlots(); i++) { - if (stack == null) + ItemStack stack = inventory.getStackInSlot(i); + if (stack.isEmpty()) { continue; } - if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.worldObj, stack, player)) + if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.getEntityWorld(), stack, player)) { - return ((IDemonWillViewer) stack.getItem()).getDemonWillAuraResolution(player.worldObj, stack, player); + return ((IDemonWillViewer) stack.getItem()).getDemonWillAuraResolution(player.getEntityWorld(), stack, player); } } @@ -300,7 +275,7 @@ public class Utils public static void setPlayerSpeedFromServer(EntityPlayer player, double motionX, double motionY, double motionZ) { - if (!player.worldObj.isRemote && player instanceof EntityPlayerMP) + if (!player.getEntityWorld().isRemote && player instanceof EntityPlayerMP) { BloodMagicPacketHandler.sendTo(new PlayerVelocityPacketProcessor(motionX, motionY, motionZ), (EntityPlayerMP) player); } @@ -363,19 +338,19 @@ public class Utils */ public static boolean insertItemToTile(TileInventory tile, EntityPlayer player, int slot) { - if (tile.getStackInSlot(slot) == null && player.getHeldItemMainhand() != null) + if (tile.getStackInSlot(slot).isEmpty() && !player.getHeldItemMainhand().isEmpty()) { ItemStack input = player.getHeldItemMainhand().copy(); - input.stackSize = 1; - player.getHeldItemMainhand().stackSize--; + input.setCount(1); + player.getHeldItemMainhand().shrink(1); tile.setInventorySlotContents(slot, input); return true; - } else if (tile.getStackInSlot(slot) != null && player.getHeldItemMainhand() == null) + } else if (!tile.getStackInSlot(slot).isEmpty() && player.getHeldItemMainhand().isEmpty()) { if (!tile.getWorld().isRemote) { EntityItem invItem = new EntityItem(tile.getWorld(), player.posX, player.posY + 0.25, player.posZ, tile.getStackInSlot(slot)); - tile.getWorld().spawnEntityInWorld(invItem); + tile.getWorld().spawnEntity(invItem); } tile.clear(); return false; @@ -523,7 +498,7 @@ public class Utils return damage; } else { - if (attackedEntity.isPotionActive(resistance) && source != DamageSource.outOfWorld) + if (attackedEntity.isPotionActive(resistance) && source != DamageSource.OUT_OF_WORLD) { int i = (attackedEntity.getActivePotionEffect(resistance).getAmplifier() + 1) * 5; int j = 25 - i; @@ -564,20 +539,23 @@ public class Utils * @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) { - if (stack1 == null || stack1.isItemStackDamageable() ^ stack2.isItemStackDamageable()) - { - return false; - } - - if (stack2 == null) - { - return true; - } - - return stack1.getItem() == stack2.getItem() && stack1.getItemDamage() == stack2.getItemDamage() && ItemStack.areItemStackTagsEqual(stack1, stack2); + return ItemHandlerHelper.canItemStacksStack(stack1, stack2); +// if (stack1.isEmpty() || stack1.isItemStackDamageable() ^ stack2.isItemStackDamageable()) +// { +// return false; +// } +// +// if (stack2.isEmpty()) +// { +// return true; +// } +// +// return stack1.getItem() == stack2.getItem() && stack1.getItemDamage() == stack2.getItemDamage() && ItemStack.areItemStackTagsEqual(stack1, stack2); } /** @@ -591,18 +569,18 @@ public class Utils { ItemStack[] returned = new ItemStack[2]; - if (canCombine(stack1, stack2)) + if (ItemHandlerHelper.canItemStacksStack(stack1, stack2)) { - int transferedAmount = Math.min(transferMax, stack2 == null ? stack1.stackSize : Math.min(stack2.getMaxStackSize() - stack2.stackSize, stack1.stackSize)); + 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 == null) + if (stack2.isEmpty()) { stack2 = copyStack; } else { - stack2.stackSize += transferedAmount; + stack2.grow(transferedAmount); } } } @@ -624,18 +602,18 @@ public class Utils { ItemStack[] returned = new ItemStack[2]; - if (canCombine(stack1, stack2)) + if (ItemHandlerHelper.canItemStacksStack(stack1, stack2)) { - int transferedAmount = stack2 == null ? stack1.stackSize : Math.min(stack2.getMaxStackSize() - stack2.stackSize, stack1.stackSize); + int transferedAmount = stack2.isEmpty() ? stack1.getCount() : Math.min(stack2.getMaxStackSize() - stack2.getCount(), stack1.getCount()); if (transferedAmount > 0) { ItemStack copyStack = stack1.splitStack(transferedAmount); - if (stack2 == null) + if (stack2.isEmpty()) { stack2 = copyStack; } else { - stack2.stackSize += transferedAmount; + stack2.grow(transferedAmount); } } } @@ -733,9 +711,9 @@ public class Utils { ItemStack invStack = handler.getStackInSlot(slot); - if (invStack != null && canCombine(stack, invStack)) + if (!invStack.isEmpty() && ItemHandlerHelper.canItemStacksStack(stack, invStack)) { - numberMatching += invStack.stackSize; + numberMatching += invStack.getCount(); } } @@ -749,23 +727,23 @@ public class Utils for (int slot = 0; slot < numberOfSlots; slot++) { ItemStack newCopyStack = copyStack.copy(); - newCopyStack.stackSize = Math.min(copyStack.stackSize, newLimit); + newCopyStack.setCount(Math.min(copyStack.getCount(), newLimit)); newCopyStack = handler.insertItem(slot, newCopyStack, false); - if (newCopyStack == null) + if (newCopyStack.isEmpty()) { - return null; + return ItemStack.EMPTY; } - newLimit -= (copyStack.stackSize - newCopyStack.stackSize); + newLimit -= (copyStack.getCount() - newCopyStack.getCount()); if (newLimit <= 0) { - return null; //TODO + return ItemStack.EMPTY; //TODO } - copyStack.stackSize -= (copyStack.stackSize - newCopyStack.stackSize); + copyStack.shrink(copyStack.getCount() - newCopyStack.getCount()); } return copyStack; @@ -779,9 +757,9 @@ public class Utils public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir) { - if (stack == null) + if (stack.isEmpty()) { - return null; + return ItemStack.EMPTY; } boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; @@ -812,9 +790,9 @@ public class Utils stack = combinedStacks[0]; inventory.setInventorySlotContents(i, combinedStacks[1]); - if (stack.stackSize <= 0) + if (stack.isEmpty()) { - return stack; + return ItemStack.EMPTY; } } @@ -828,12 +806,12 @@ public class Utils public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir, boolean fillToLimit, int limit) { - if (stack == null) + if (stack.isEmpty()) { return true; } - int itemsLeft = stack.stackSize; + int itemsLeft = stack.getCount(); boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; @@ -865,14 +843,14 @@ public class Utils ItemStack invStack = inventory.getStackInSlot(i); - if (invStack != null && canCombine(stack, invStack)) + if (!invStack.isEmpty() && ItemHandlerHelper.canItemStacksStack(stack, invStack)) { - numberMatching += invStack.stackSize; + numberMatching += invStack.getCount(); } } } - if (fillToLimit && limit < stack.stackSize + numberMatching) + if (fillToLimit && limit < stack.getCount() + numberMatching) { return false; } @@ -888,12 +866,12 @@ public class Utils boolean canCombine = canCombine(stack, invStack); if (canCombine) { - if (invStack == null) + if (invStack.isEmpty()) { itemsLeft = 0; } else { - itemsLeft -= (invStack.getMaxStackSize() - invStack.stackSize); + itemsLeft -= (invStack.getMaxStackSize() - invStack.getCount()); } } @@ -918,9 +896,9 @@ public class Utils */ public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir, int limit) { - if (stack == null) + if (stack.isEmpty()) { - return null; + return ItemStack.EMPTY; } boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; @@ -953,7 +931,7 @@ public class Utils if (invStack != null && canCombine(stack, invStack)) { - numberMatching += invStack.stackSize; + numberMatching += invStack.getCount(); } } @@ -971,15 +949,15 @@ public class Utils continue; } - int prevStackSize = stack.stackSize; + int prevStackSize = stack.getCount(); ItemStack[] combinedStacks = combineStacks(stack, inventory.getStackInSlot(i), newLimit); stack = combinedStacks[0]; inventory.setInventorySlotContents(i, combinedStacks[1]); //TODO - newLimit -= (prevStackSize - stack.stackSize); + newLimit -= (prevStackSize - stack.getCount()); - if (newLimit <= 0 || stack.stackSize <= 0) + if (newLimit <= 0 || stack.isEmpty()) { return stack; } @@ -1050,7 +1028,7 @@ public class Utils } entityItem.setEntityItemStack(stack); - return world.spawnEntityInWorld(entityItem); + return world.spawnEntity(entityItem); } public static boolean swapLocations(World initialWorld, BlockPos initialPos, World finalWorld, BlockPos finalPos) @@ -1094,26 +1072,27 @@ public class Utils if (initialTile != null) { - TileEntity newTileInitial = BloodMagic.getCrossVersionProxy().createTileFromData(finalWorld, initialTag); + TileEntity newTileInitial = TileEntity.create(finalWorld, initialTag); + finalWorld.setTileEntity(finalPos, newTileInitial); newTileInitial.setPos(finalPos); - newTileInitial.setWorldObj(finalWorld); + newTileInitial.setWorld(finalWorld); } initialWorld.setBlockState(initialPos, finalBlockState, 3); if (finalTile != null) { - TileEntity newTileFinal = BloodMagic.getCrossVersionProxy().createTileFromData(initialWorld, finalTag); + TileEntity newTileFinal = TileEntity.create(initialWorld, finalTag); initialWorld.setTileEntity(initialPos, newTileFinal); newTileFinal.setPos(initialPos); - newTileFinal.setWorldObj(initialWorld); + newTileFinal.setWorld(initialWorld); } - initialWorld.notifyNeighborsOfStateChange(initialPos, finalStack.getBlock()); - finalWorld.notifyNeighborsOfStateChange(finalPos, initialStack.getBlock()); + initialWorld.notifyNeighborsOfStateChange(initialPos, finalStack.getBlock(), true); + finalWorld.notifyNeighborsOfStateChange(finalPos, initialStack.getBlock(), true); return true; } @@ -1122,25 +1101,25 @@ public class Utils public static ItemStack consumeItem(ItemStack stack) { Item item = stack.getItem(); - boolean largerStack = stack.stackSize > 1; + boolean largerStack = stack.getCount() > 1; if (largerStack) { - stack.stackSize -= 1; + stack.shrink(1); } if (item.hasContainerItem(stack)) { ItemStack ret = item.getContainerItem(stack); - if (ret == null) + if (ret.isEmpty()) { - return null; + return ItemStack.EMPTY; } if (ret.isItemStackDamageable() && ret.getItemDamage() > ret.getMaxDamage()) { - ret = null; + ret = ItemStack.EMPTY; } return ret; } - return largerStack ? stack : null; + return largerStack ? stack : ItemStack.EMPTY; } public static void registerHandlers(Set eventHandlers) diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index eeead4a8..af60ddc4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -6,8 +6,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.annotation.Nullable; - import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.client.render.model.CustomModelFactory; import net.minecraft.client.Minecraft; @@ -93,14 +91,11 @@ public class ClientHandler private static EnumFacing mrsHoloDirection; private static boolean mrsHoloDisplay; - boolean doCrystalRenderTest = true; - public static ResourceLocation crystalResource = new ResourceLocation(Constants.Mod.DOMAIN + "textures/entities/defaultCrystalLayer.png"); - @SubscribeEvent public void onTooltipEvent(ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); - if (stack == null) + if (stack.isEmpty()) { return; } @@ -121,7 +116,7 @@ public class ClientHandler @SubscribeEvent public void onSoundEvent(PlaySoundEvent event) { - EntityPlayer player = Minecraft.getMinecraft().thePlayer; + EntityPlayer player = Minecraft.getMinecraft().player; if (player != null && player.isPotionActive(ModPotions.deafness)) { event.setResultSound(null); @@ -152,8 +147,8 @@ public class ClientHandler @SubscribeEvent public void render(RenderWorldLastEvent event) { - EntityPlayerSP player = minecraft.thePlayer; - World world = player.worldObj; + EntityPlayerSP player = minecraft.player; + World world = player.getEntityWorld(); if (mrsHoloTile != null) { @@ -174,20 +169,20 @@ public class ClientHandler TileEntity tileEntity = world.getTileEntity(minecraft.objectMouseOver.getBlockPos()); - if (tileEntity instanceof TileMasterRitualStone && player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() instanceof ItemRitualDiviner) + if (tileEntity instanceof TileMasterRitualStone && !player.getHeldItemMainhand().isEmpty() && player.getHeldItemMainhand().getItem() instanceof ItemRitualDiviner) renderRitualStones(player, event.getPartialTicks()); } @SubscribeEvent public void onMouseEvent(MouseEvent event) { - EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + EntityPlayerSP player = Minecraft.getMinecraft().player; if (event.getDwheel() != 0 && player != null && player.isSneaking()) { ItemStack stack = player.getHeldItemMainhand(); - if (stack != null) + if (!stack.isEmpty()) { Item item = stack.getItem(); @@ -226,7 +221,7 @@ public class ClientHandler ModelResourceLocation location = new ModelResourceLocation("bloodmagic:BlockBloodTank", "inventory"); IBakedModel model = event.getModelRegistry().getObject(location); - if (model instanceof IBakedModel) + if (model != null) event.getModelRegistry().putObject(location, new CustomModelFactory(model)); if (BloodMagic.isDev() && SUPPRESS_ASSET_ERRORS) @@ -310,8 +305,8 @@ public class ClientHandler ItemSigilHolding.cycleToNextSigil(stack, mode); BloodMagicPacketHandler.INSTANCE.sendToServer(new SigilHoldingPacketProcessor(player.inventory.currentItem, mode)); ItemStack newStack = ItemSigilHolding.getItemStackInSlot(stack, ItemSigilHolding.getCurrentItemOrdinal(stack)); - if (newStack != null) - Minecraft.getMinecraft().ingameGUI.setRecordPlaying(newStack.getDisplayName(), false); + if (!newStack.isEmpty()) + player.sendStatusMessage(newStack.getTextComponent(), true); } private static TextureAtlasSprite forName(TextureMap textureMap, String name, String dir) @@ -321,7 +316,7 @@ public class ClientHandler private void renderRitualStones(EntityPlayerSP player, float partialTicks) { - World world = player.worldObj; + World world = player.getEntityWorld(); ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); EnumFacing direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); Ritual ritual = RitualRegistry.getRitualForId(ritualDiviner.getCurrentRitual(player.inventory.getCurrentItem())); @@ -385,8 +380,8 @@ public class ClientHandler public static void renderRitualStones(TileMasterRitualStone masterRitualStone, float partialTicks) { - EntityPlayerSP player = minecraft.thePlayer; - World world = player.worldObj; + EntityPlayerSP player = minecraft.player; + World world = player.world; EnumFacing direction = mrsHoloDirection; Ritual ritual = mrsHoloRitual; @@ -462,28 +457,4 @@ public class ClientHandler mrsHoloRitual = null; mrsHoloDirection = EnumFacing.NORTH; } - - protected void renderHotbarItem(int x, int y, float partialTicks, EntityPlayer player, @Nullable ItemStack stack) - { - if (stack != null) - { - float animation = (float) stack.animationsToGo - 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.getRenderItem().renderItemAndEffectIntoGUI(player, stack, x, y); - - if (animation > 0.0F) - GlStateManager.popMatrix(); - - minecraft.getRenderItem().renderItemOverlays(minecraft.fontRendererObj, stack, x, y); - } - } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index 0aa39f1d..81fceba7 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -147,8 +147,6 @@ public class CraftingHandler event.setCost(1); event.setOutput(outputStack); - - return; } } } 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 2d269a0b..0865ab77 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.util.handler.event; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -101,7 +102,7 @@ public class GenericHandler { event.setDamageMultiplier(0); - if (player.worldObj.isRemote) + if (player.getEntityWorld().isRemote) { player.motionY *= -0.9; player.fallDistance = 0; @@ -197,14 +198,14 @@ public class GenericHandler @SubscribeEvent public void onEntityHurt(LivingHurtEvent event) { - if (event.getEntity().worldObj.isRemote) + if (event.getEntity().getEntityWorld().isRemote) return; if (event.getSource().getEntity() instanceof EntityPlayer && !PlayerHelper.isFakePlayer((EntityPlayer) event.getSource().getEntity())) { EntityPlayer player = (EntityPlayer) event.getSource().getEntity(); - if (player.getItemStackFromSlot(EntityEquipmentSlot.CHEST) != null && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() instanceof ItemPackSacrifice) + if (!player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).isEmpty() && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() instanceof ItemPackSacrifice) { ItemPackSacrifice pack = (ItemPackSacrifice) player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem(); @@ -240,7 +241,7 @@ public class GenericHandler @SubscribeEvent public void onLivingUpdate(LivingUpdateEvent event) { - if (!event.getEntityLiving().worldObj.isRemote) + if (!event.getEntityLiving().getEntityWorld().isRemote) { EntityLivingBase entity = event.getEntityLiving(); if (entity instanceof EntityPlayer && entity.ticksExisted % 50 == 0) //TODO: Change to an incremental counter @@ -265,7 +266,7 @@ public class GenericHandler if (animal.getAttackTarget() != null && animal.getDistanceSqToEntity(animal.getAttackTarget()) < 4) { - animal.worldObj.createExplosion(null, animal.posX, animal.posY + (double) (animal.height / 16.0F), animal.posZ, 2 + animal.getActivePotionEffect(ModPotions.sacrificialLamb).getAmplifier() * 1.5f, false); + animal.getEntityWorld().createExplosion(null, animal.posX, animal.posY + (double) (animal.height / 16.0F), animal.posZ, 2 + animal.getActivePotionEffect(ModPotions.sacrificialLamb).getAmplifier() * 1.5f, false); targetTaskMap.remove(animal); attackTaskMap.remove(animal); } @@ -284,7 +285,7 @@ public class GenericHandler EntityPlayer player = (EntityPlayer) entity; if (player.isSneaking() && player.isPotionActive(ModPotions.cling) && Utils.isPlayerBesideSolidBlockFace(player) && !player.onGround) { - if (player.worldObj.isRemote) + if (player.getEntityWorld().isRemote) { player.motionY = 0; player.motionX *= 0.8; @@ -307,14 +308,15 @@ public class GenericHandler if (entity.isPotionActive(ModPotions.fireFuse)) { - entity.worldObj.spawnParticle(EnumParticleTypes.FLAME, entity.posX + entity.worldObj.rand.nextDouble() * 0.3, entity.posY + entity.worldObj.rand.nextDouble() * 0.3, entity.posZ + entity.worldObj.rand.nextDouble() * 0.3, 0, 0.06d, 0); + 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(ModPotions.fireFuse).getAmplifier(); int radius = 1 * r + 1; if (entity.getActivePotionEffect(ModPotions.fireFuse).getDuration() <= 3) { - entity.worldObj.createExplosion(null, entity.posX, entity.posY, entity.posZ, radius, false); + entity.getEntityWorld().createExplosion(null, entity.posX, entity.posY, entity.posZ, radius, false); } } @@ -335,7 +337,7 @@ public class GenericHandler if (player instanceof EntityPlayerMP) { BlockPos pos = player.getPosition(); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(player.worldObj.provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); + DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(player.getEntityWorld().provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); if (holder != null) { BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(holder), (EntityPlayerMP) player); @@ -352,7 +354,7 @@ public class GenericHandler { IBlockState state = event.getTargetBlock(); Block block = state.getBlock(); - if (block != null && block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && event.getEntityPlayer().getHeldItemMainhand() != null && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) + if (block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && !event.getEntityPlayer().getHeldItemMainhand().isEmpty() && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) { ItemAltarMaker altarMaker = (ItemAltarMaker) event.getEntityPlayer().getHeldItemMainhand().getItem(); ChatUtil.sendNoSpam(event.getEntityPlayer(), TextHelper.localizeEffect("chat.BloodMagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer()))); @@ -398,7 +400,7 @@ public class GenericHandler return; ItemStack held = event.getItemStack(); - if (held != null && held.getItem() instanceof IBindable) + if (!held.isEmpty() && held.getItem() instanceof IBindable) { held = NBTHelper.checkNBT(held); IBindable bindable = (IBindable) held.getItem(); @@ -418,7 +420,7 @@ public class GenericHandler BindableHelper.setItemOwnerName(held, player.getDisplayNameString()); } - if (held != null && held.getItem() instanceof IBloodOrb) + if (!held.isEmpty() && held.getItem() instanceof IBloodOrb) { held = NBTHelper.checkNBT(held); IBloodOrb bloodOrb = (IBloodOrb) held.getItem(); @@ -466,10 +468,10 @@ public class GenericHandler EntityPlayer player = (EntityPlayer) entity; ItemStack heldStack = player.getHeldItemMainhand(); - if (heldStack != null && heldStack.getItem() == ModItems.BOUND_SWORD && !(attackedEntity instanceof EntityAnimal)) + if (!heldStack.isEmpty() && heldStack.getItem() == ModItems.BOUND_SWORD && !(attackedEntity instanceof EntityAnimal)) for (int i = 0; i <= EnchantmentHelper.getLootingModifier(player); i++) if (attackedEntity.getEntityWorld().rand.nextDouble() < 0.2) - event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(ModItems.BLOOD_SHARD, 1, 0))); + event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(ModItems.BLOOD_SHARD, 1, 0))); } } @@ -480,14 +482,14 @@ public class GenericHandler EntityPlayer player = event.getEntityPlayer(); ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); - if (itemstack != null && itemstack.isItemDamaged()) + 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.worldObj.isRemote) + if (!player.getEntityWorld().isRemote) { for (ItemStack stack : player.inventory.mainInventory) { diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 727e3f75..a4ef11d1 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -308,7 +308,7 @@ public class LivingArmourHandler @SubscribeEvent public void onArrowFire(ArrowLooseEvent event) { - World world = event.getEntityPlayer().worldObj; + World world = event.getEntityPlayer().getEntityWorld(); ItemStack stack = event.getBow(); EntityPlayer player = event.getEntityPlayer(); @@ -368,7 +368,7 @@ public class LivingArmourHandler entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; - world.spawnEntityInWorld(entityarrow); + world.spawnEntity(entityarrow); } } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java index 7089d682..4cf9e5cb 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -87,7 +87,7 @@ public class StatTrackerHandler if (armour != null) { StatTrackerHealthboost.incrementCounter(armour, event.getAmount()); - if (player.worldObj.canSeeSky(player.getPosition()) && player.worldObj.provider.isDaytime()) + if (player.getEntityWorld().canSeeSky(player.getPosition()) && player.getEntityWorld().provider.isDaytime()) { StatTrackerSolarPowered.incrementCounter(armour, event.getAmount()); } @@ -124,7 +124,7 @@ public class StatTrackerHandler if (sourceEntity != null && !source.isMagicDamage() && !source.isProjectile()) StatTrackerPhysicalProtect.incrementCounter(armour, amount); - if (source.equals(DamageSource.fall)) + if (source.equals(DamageSource.FALL)) StatTrackerFallProtect.incrementCounter(armour, amount); if (source.isProjectile()) @@ -162,7 +162,7 @@ public class StatTrackerHandler { StatTrackerMeleeDamage.incrementCounter(armour, amount); - if (player.worldObj.getLight(player.getPosition()) <= 9) + if (player.getEntityWorld().getLight(player.getPosition()) <= 9) StatTrackerNightSight.incrementCounter(armour, amount); if (mainWeapon != null && mainWeapon.getItem() instanceof ItemSpade) 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 0192e3a6..5bd47c12 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -56,7 +56,7 @@ public class WillHandler if (remainder == null || ((IDemonWill) stack.getItem()).getWill(pickupType, stack) < 0.0001 || PlayerDemonWillHandler.isDemonWillFull(pickupType, player)) { - stack.stackSize = 0; + stack.setCount(0); event.setResult(Event.Result.ALLOW); } } @@ -67,7 +67,7 @@ public class WillHandler { if (event.getSource() instanceof EntityDamageSourceIndirect) { - Entity sourceEntity = ((EntityDamageSourceIndirect) event.getSource()).getSourceOfDamage(); + Entity sourceEntity = event.getSource().getSourceOfDamage(); if (sourceEntity instanceof EntitySentientArrow) { @@ -84,21 +84,21 @@ public class WillHandler DamageSource source = event.getSource(); Entity entity = source.getEntity(); - if (attackedEntity.isPotionActive(ModPotions.soulSnare) && (attackedEntity instanceof EntityMob || attackedEntity.worldObj.getDifficulty() == EnumDifficulty.PEACEFUL)) + if (attackedEntity.isPotionActive(ModPotions.soulSnare) && (attackedEntity instanceof EntityMob || attackedEntity.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL)) { PotionEffect eff = attackedEntity.getActivePotionEffect(ModPotions.soulSnare); int lvl = eff.getAmplifier(); double amountOfSouls = attackedEntity.getEntityWorld().rand.nextDouble() * (lvl + 1) * (lvl + 1) * 5; ItemStack soulStack = ((IDemonWill) ModItems.MONSTER_SOUL).createWill(0, amountOfSouls); - event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); + event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); } if (entity != null && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; ItemStack heldStack = player.getHeldItemMainhand(); - if (heldStack != null && heldStack.getItem() instanceof IDemonWillWeapon && !player.worldObj.isRemote) + if (heldStack != null && heldStack.getItem() instanceof IDemonWillWeapon && !player.getEntityWorld().isRemote) { IDemonWillWeapon demonWillWeapon = (IDemonWillWeapon) heldStack.getItem(); List droppedSouls = demonWillWeapon.getRandomDemonWillDrop(attackedEntity, player, heldStack, event.getLootingLevel()); @@ -114,7 +114,7 @@ public class WillHandler EnumDemonWillType pickupType = ((IDemonWill) remainder.getItem()).getType(remainder); if (((IDemonWill) remainder.getItem()).getWill(pickupType, remainder) >= 0.0001) { - event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder)); + event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java index 6f8d121c..98f29fa0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java @@ -16,7 +16,7 @@ public class RecipeHelper if (recipe != null) { ItemStack resultStack = recipe.getRecipeOutput(); - if (resultStack != null && resultStack.getItem() != null) + if (!resultStack.isEmpty()) { if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { @@ -36,7 +36,7 @@ public class RecipeHelper if (recipe != null) { ItemStack resultStack = recipe.getOutput(); - if (resultStack != null && resultStack.getItem() != null) + if (!resultStack.isEmpty()) { if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { @@ -56,7 +56,7 @@ public class RecipeHelper if (recipe != null) { ItemStack resultStack = recipe.getRecipeOutput(); - if (resultStack != null && resultStack.getItem() != null) + if (!resultStack.isEmpty()) { if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { From d80afb18f0021a010040a445e4582090b899dfa5 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 1 Jan 2017 21:43:34 -0800 Subject: [PATCH 002/595] More progress --- .../java/WayofTime/bloodmagic/BloodMagic.java | 1 - .../AlchemyArrayEffectAttractor.java | 26 +-- .../AlchemyArrayEffectBinding.java | 4 +- .../AlchemyArrayEffectSkeletonTurret.java | 2 +- .../bloodmagic/altar/BloodAltar.java | 24 +- .../bloodmagic/api/ItemStackWrapper.java | 6 +- .../AlchemyArrayEffectCrafting.java | 2 +- .../api/compress/CompressionRegistry.java | 10 +- .../api/impl/ItemSigilToggleable.java | 17 +- .../bloodmagic/api/network/SoulNetwork.java | 206 ------------------ .../bloodmagic/api/network/package-info.java | 7 - .../api/recipe/AlchemyTableCustomRecipe.java | 10 +- .../api/recipe/AlchemyTableRecipe.java | 22 +- .../recipe/LivingArmourDowngradeRecipe.java | 30 ++- .../api/recipe/ShapedBloodOrbRecipe.java | 7 +- .../api/recipe/ShapelessBloodOrbRecipe.java | 18 +- .../bloodmagic/api/saving/SoulNetwork.java | 2 +- .../api/util/helper/RitualHelper.java | 9 +- .../bloodmagic/block/BlockAlchemyArray.java | 32 ++- .../bloodmagic/block/BlockAlchemyTable.java | 29 ++- .../bloodmagic/block/BlockAltar.java | 41 ++-- .../bloodmagic/block/BlockBloodLight.java | 6 +- .../bloodmagic/block/BlockBloodTank.java | 7 +- .../bloodmagic/block/BlockDemonCrucible.java | 34 +-- .../bloodmagic/block/BlockDemonCrystal.java | 38 ++-- .../block/BlockDemonCrystallizer.java | 2 +- .../bloodmagic/block/BlockDemonPylon.java | 2 +- .../block/BlockDimensionalPortal.java | 1 - .../bloodmagic/block/BlockIncenseAltar.java | 24 +- .../block/BlockInputRoutingNode.java | 2 +- .../block/BlockInversionPillar.java | 7 +- .../block/BlockInversionPillarEnd.java | 2 +- .../bloodmagic/block/BlockLifeEssence.java | 8 - .../bloodmagic/block/BlockMimic.java | 30 ++- .../block/BlockOutputRoutingNode.java | 21 +- .../bloodmagic/block/BlockPhantom.java | 16 +- .../block/BlockRitualController.java | 1 - .../bloodmagic/block/BlockRoutingNode.java | 4 +- .../bloodmagic/block/BlockSoulForge.java | 18 +- .../bloodmagic/block/BlockSpectral.java | 16 +- .../bloodmagic/block/BlockTeleposer.java | 6 +- .../bloodmagic/block/base/BlockEnum.java | 3 +- .../block/base/BlockEnumContainer.java | 42 ---- .../block/base/BlockEnumPillar.java | 9 +- .../block/base/BlockEnumPillarCap.java | 11 +- .../block/base/BlockEnumStairs.java | 11 +- .../bloodmagic/block/base/BlockEnumWall.java | 5 +- .../bloodmagic/block/base/BlockInteger.java | 5 +- .../block/base/BlockIntegerContainer.java | 38 ---- .../bloodmagic/block/base/BlockString.java | 5 +- .../block/base/BlockStringContainer.java | 38 ---- .../property/UnlistedPropertyInteger.java | 39 ---- .../property/UnlistedPropertyString.java | 42 ---- .../bloodmagic/command/CommandBloodMagic.java | 61 ++---- .../bloodmagic/command/ISubCommand.java | 19 -- .../bloodmagic/command/SubCommandBase.java | 70 ------ .../bloodmagic/command/package-info.java | 7 - .../command/sub/SubCommandBind.java | 34 +-- .../command/sub/SubCommandHelp.java | 43 ---- .../command/sub/SubCommandNetwork.java | 71 +++--- .../bloodmagic/command/sub/SubCommandOrb.java | 46 ++-- .../compat/waila/CompatibilityWaila.java | 2 +- .../bloodmagic/item/sigil/ItemSigilLava.java | 27 ++- .../java/WayofTime/bloodmagic/util/Utils.java | 8 +- 64 files changed, 410 insertions(+), 976 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/api/network/SoulNetwork.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/network/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockEnumContainer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockIntegerContainer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockStringContainer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/property/UnlistedPropertyInteger.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/property/UnlistedPropertyString.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/ISubCommand.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/SubCommandBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/SubCommandHelp.java diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 22651882..a27e81dd 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -21,7 +21,6 @@ import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.LogHelper; import WayofTime.bloodmagic.client.gui.GuiHandler; -import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.compat.ICompatibility; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.proxy.CommonProxy; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java index 2196231a..fc933397 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -189,7 +189,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { if (ent instanceof EntitySlime) { - ent.faceEntity(getTarget(ent.worldObj, pos), 10.0F, 20.0F); + ent.faceEntity(getTarget(ent.getEntityWorld(), pos), 10.0F, 20.0F); } else if (ent instanceof EntitySilverfish) { if (counter < 10) @@ -197,7 +197,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect return; } EntitySilverfish sf = (EntitySilverfish) ent; - Path pathentity = getPathEntityToEntity(ent, getTarget(ent.worldObj, pos), getRange()); + Path pathentity = getPathEntityToEntity(ent, getTarget(ent.getEntityWorld(), pos), getRange()); sf.getNavigator().setPath(pathentity, sf.getAIMoveSpeed()); } else if (ent instanceof EntityBlaze) { @@ -221,7 +221,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect // ent.setAttackTarget(target); } else if (ent instanceof EntityEnderman) { - ((EntityEnderman) ent).setAttackTarget(getTarget(ent.worldObj, pos)); + ent.setAttackTarget(getTarget(ent.getEntityWorld(), pos)); } } @@ -234,7 +234,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect if (distance > 2) { EntityMob mod = (EntityMob) ent; - mod.faceEntity(getTarget(ent.worldObj, pos), 180, 0); + mod.faceEntity(getTarget(ent.getEntityWorld(), pos), 180, 0); mod.moveEntityWithHeading(0, 0.3f); if (mod.posY < pos.getY()) { @@ -248,12 +248,12 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect public Path getPathEntityToEntity(Entity entity, Entity targetEntity, float range) { - int targX = MathHelper.floor_double(targetEntity.posX); - int targY = MathHelper.floor_double(targetEntity.posY + 1.0D); - int targZ = MathHelper.floor_double(targetEntity.posZ); + 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.worldObj, (EntityLiving) entity, new BlockPos(targX, targY, targZ), range); + return pf.findPath(targetEntity.getEntityWorld(), (EntityLiving) entity, new BlockPos(targX, targY, targZ), range); } private boolean trackMob(BlockPos pos, EntityLiving ent) @@ -261,7 +261,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect //TODO: Figure out if this crud is needed if (useSetTarget(ent)) { - ((EntityMob) ent).setAttackTarget(getTarget(ent.worldObj, pos)); + ent.setAttackTarget(getTarget(ent.getEntityWorld(), pos)); return true; } else if (useSpecialCase(ent)) { @@ -328,7 +328,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect } cancelCurrentTasks(ent); - ent.tasks.addTask(0, new AttractTask(ent, getTarget(ent.worldObj, pos), pos)); + ent.tasks.addTask(0, new AttractTask(ent, getTarget(ent.getEntityWorld(), pos), pos)); return true; } @@ -364,13 +364,13 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { if (ent instanceof EntitySlime) { - ent.faceEntity(getTarget(ent.worldObj, pos), 10.0F, 20.0F); + ent.faceEntity(getTarget(ent.getEntityWorld(), pos), 10.0F, 20.0F); // ent.setAttackTarget(getTarget(ent.worldObj, pos)); return true; } else if (ent instanceof EntitySilverfish) { EntitySilverfish es = (EntitySilverfish) ent; - Path pathentity = getPathEntityToEntity(ent, getTarget(ent.worldObj, pos), getRange()); + Path pathentity = getPathEntityToEntity(ent, getTarget(ent.getEntityWorld(), pos), getRange()); es.getNavigator().setPath(pathentity, es.getAIMoveSpeed()); return true; } else if (ent instanceof EntityBlaze) @@ -439,7 +439,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { boolean res = false; //TODO: - TileEntity te = mob.worldObj.getTileEntity(coord); + TileEntity te = mob.getEntityWorld().getTileEntity(coord); if (te instanceof TileAlchemyArray) { res = true; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java index 8ba2057a..0f25ede0 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java @@ -40,7 +40,7 @@ public class AlchemyArrayEffectBinding extends AlchemyArrayEffectCrafting ItemStack output = outputStack.copy(); EntityItem outputEntity = new EntityItem(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); - tile.getWorld().spawnEntityInWorld(outputEntity); + tile.getWorld().spawnEntity(outputEntity); return true; } @@ -60,7 +60,7 @@ public class AlchemyArrayEffectBinding extends AlchemyArrayEffectCrafting double dispZ = -distance * Math.cos(angle); EntityLightningBolt lightning = new EntityLightningBolt(world, pos.getX() + dispX, pos.getY(), pos.getZ() + dispZ, true); - world.spawnEntityInWorld(lightning); + world.spawnEntity(lightning); } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java index 00b695df..3577178b 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java @@ -170,7 +170,7 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { boolean res = false; //TODO: - TileEntity te = mob.worldObj.getTileEntity(coord); + TileEntity te = mob.getEntityWorld().getTileEntity(coord); if (te instanceof TileAlchemyArray) { res = true; diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index bd4e8efa..b045d664 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -354,7 +354,7 @@ public class BloodAltar implements IFluidHandler ItemStack input = tileAltar.getStackInSlot(0); - if (input != null) + if (!input.isEmpty()) { // Do recipes AltarRecipe recipe = AltarRecipeRegistry.getRecipeForInput(input); @@ -364,7 +364,7 @@ public class BloodAltar implements IFluidHandler { this.isActive = true; this.recipe = recipe; - this.result = recipe.getOutput() == null ? null : new ItemStack(recipe.getOutput().getItem(), 1, recipe.getOutput().getMetadata()); + this.result = recipe.getOutput().isEmpty() ? ItemStack.EMPTY : new ItemStack(recipe.getOutput().getItem(), 1, recipe.getOutput().getMetadata()); this.liquidRequired = recipe.getSyphon(); this.canBeFilled = recipe.isFillable(); this.consumptionRate = recipe.getConsumeRate(); @@ -442,7 +442,7 @@ public class BloodAltar implements IFluidHandler ItemStack input = tileAltar.getStackInSlot(0); - if (input == null) + if (input.isEmpty()) return; World world = tileAltar.getWorld(); @@ -454,7 +454,7 @@ public class BloodAltar implements IFluidHandler if (!canBeFilled) { boolean hasOperated = false; - int stackSize = input.stackSize; + int stackSize = input.getCount(); if (totalCharge > 0) { @@ -480,7 +480,7 @@ public class BloodAltar implements IFluidHandler if (internalCounter % 4 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; - server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0.2, 0, 0.2, 0, new int[0]); + 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) @@ -490,7 +490,7 @@ public class BloodAltar implements IFluidHandler if (internalCounter % 2 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; - server.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0.1, 0, 0.1, 0, new int[0]); + server.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0.1, 0, 0.1, 0); } } @@ -500,8 +500,8 @@ public class BloodAltar implements IFluidHandler { ItemStack result = this.result; - if (result != null) - result.stackSize *= stackSize; + if (!result.isEmpty()) + result.setCount(result.getCount() * stackSize); MinecraftForge.EVENT_BUS.post(new AltarCraftedEvent(recipe, result)); tileAltar.setInventorySlotContents(0, result); @@ -510,7 +510,7 @@ public class BloodAltar implements IFluidHandler if (world instanceof WorldServer) { WorldServer server = (WorldServer) world; - server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 40, 0.3, 0, 0.3, 0, new int[0]); + server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 40, 0.3, 0, 0.3, 0); } this.cooldownAfterCrafting = 30; @@ -521,7 +521,7 @@ public class BloodAltar implements IFluidHandler { ItemStack returnedItem = tileAltar.getStackInSlot(0); - if (returnedItem == null || !(returnedItem.getItem() instanceof IBloodOrb)) + if (returnedItem.isEmpty() || !(returnedItem.getItem() instanceof IBloodOrb)) return; IBloodOrb item = (IBloodOrb) (returnedItem.getItem()); @@ -546,7 +546,7 @@ public class BloodAltar implements IFluidHandler if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; - server.spawnParticle(EnumParticleTypes.SPELL_WITCH, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0, 0, 0, 0.001, new int[] {}); + server.spawnParticle(EnumParticleTypes.SPELL_WITCH, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0, 0, 0, 0.001); } } } @@ -758,7 +758,7 @@ public class BloodAltar implements IFluidHandler public void setActive() { - if (tileAltar.getStackInSlot(0) == null) + if (tileAltar.getStackInSlot(0).isEmpty()) { isActive = false; } diff --git a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java index b19b4eb2..687930ee 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java @@ -8,6 +8,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -51,14 +52,15 @@ public class ItemStackWrapper this(blockStack.getBlock(), 1, blockStack.getMeta()); } + @Nullable public static ItemStackWrapper getHolder(ItemStack stack) { - if (stack == null) + if (stack.isEmpty()) { return null; } - return new ItemStackWrapper(stack.getItem(), stack.stackSize, stack.getItemDamage()); + return new ItemStackWrapper(stack.getItem(), stack.getCount(), stack.getItemDamage()); } public ItemStack toStack() diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java index 41935408..56badd4f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java @@ -47,7 +47,7 @@ public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect EntityItem outputEntity = new EntityItem(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); - tile.getWorld().spawnEntityInWorld(outputEntity); + tile.getWorld().spawnEntity(outputEntity); return true; } diff --git a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java b/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java index 5c68f522..c7c708fb 100644 --- a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java @@ -67,19 +67,19 @@ public class CompressionRegistry for (int slot = 0; slot < itemHandler.getSlots(); slot++) { inventory[slot] = itemHandler.extractItem(slot, 64, true); - copyInventory[slot] = ItemStack.copyItemStack(inventory[slot]); + copyInventory[slot] = inventory[slot].copy(); } for (CompressionHandler handler : compressionRegistry) { ItemStack stack = handler.compressInventory(copyInventory, world); - if (stack != null) + 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].stackSize, false); + itemHandler.extractItem(slot, inventory[slot].getCount(), false); if (copyInventory[slot] != null) { itemHandler.insertItem(slot, copyInventory[slot], false); @@ -92,7 +92,7 @@ public class CompressionRegistry } } - return Pair.of(null, false); + return Pair.of(ItemStack.EMPTY, false); } public static int getItemThreshold(ItemStack stack) @@ -110,6 +110,6 @@ public class CompressionRegistry public static boolean areItemStacksEqual(ItemStack stack, ItemStack compressedStack) { - return stack.isItemEqual(compressedStack) && (stack.getTagCompound() == null ? compressedStack.getTagCompound() == null : stack.getTagCompound().equals(compressedStack.getTagCompound())); + return stack.isItemEqual(compressedStack) && (stack.getTagCompound() == null ? !compressedStack.hasTagCompound() : stack.getTagCompound().equals(compressedStack.getTagCompound())); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java index a577b9f4..7cf2393a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java @@ -29,24 +29,25 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable @Override public boolean getActivated(ItemStack stack) { - return stack != null && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); + return !stack.isEmpty() && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); } @Override public ItemStack setActivatedState(ItemStack stack, boolean activated) { - if (stack != null) + if (!stack.isEmpty()) { NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); return stack; } - return null; + return stack; } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -55,16 +56,16 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); if (getActivated(stack) && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - return (NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed()) && onSigilUse(stack, player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + return (NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; } public boolean onSigilUse(ItemStack itemStack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) diff --git a/src/main/java/WayofTime/bloodmagic/api/network/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/api/network/SoulNetwork.java deleted file mode 100644 index a1a97ebf..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/network/SoulNetwork.java +++ /dev/null @@ -1,206 +0,0 @@ -package WayofTime.bloodmagic.api.network; - -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.AddToNetworkEvent; -import WayofTime.bloodmagic.api.event.SoulNetworkEvent; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; - -import com.google.common.base.Strings; - -import lombok.Getter; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.World; -import net.minecraft.world.WorldSavedData; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.eventhandler.Event; - -import javax.annotation.Nullable; - -@Getter -@Deprecated -/** - * Deprecated in favor of new system in {@link WayofTime.bloodmagic.api.saving.BMWorldSavedData} and - * {@link WayofTime.bloodmagic.api.saving.SoulNetwork} - */ -public class SoulNetwork extends WorldSavedData -{ - @Nullable - private final EntityPlayer player; - private int currentEssence; - private int orbTier; - - public SoulNetwork(String name) - { - super(name); - - currentEssence = 0; - orbTier = 0; - player = PlayerHelper.getPlayerFromUUID(name); - } - - @Override - public void readFromNBT(NBTTagCompound nbttagcompound) - { - currentEssence = nbttagcompound.getInteger(Constants.NBT.CURRENT_ESSENCE); - orbTier = nbttagcompound.getInteger(Constants.NBT.ORB_TIER); - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound nbttagcompound) - { - nbttagcompound.setInteger(Constants.NBT.CURRENT_ESSENCE, currentEssence); - nbttagcompound.setInteger(Constants.NBT.ORB_TIER, orbTier); - return nbttagcompound; - } - - public int addLifeEssence(int toAdd, int maximum) - { - AddToNetworkEvent event = new AddToNetworkEvent(mapName, toAdd, maximum); - - if (MinecraftForge.EVENT_BUS.post(event)) - return 0; - - if (FMLCommonHandler.instance().getMinecraftServerInstance() == null) - return 0; - - World world = FMLCommonHandler.instance().getMinecraftServerInstance().worldServers[0]; - SoulNetwork data = (SoulNetwork) world.loadItemData(SoulNetwork.class, event.ownerNetwork); - - if (data == null) - { - data = new SoulNetwork(event.ownerNetwork); - world.setItemData(event.ownerNetwork, data); - } - - int currEss = data.getCurrentEssence(); - - if (currEss >= event.maximum) - return 0; - - int newEss = Math.min(event.maximum, currEss + event.addedAmount); - if (event.getResult() != Event.Result.DENY) - data.setCurrentEssence(newEss); - - markDirty(); - - return newEss - currEss; - } - - /** - * Used to syphon LP from the network - * - * @param syphon - * - The amount of LP to syphon - * - * @return The amount of LP syphoned - */ - public int syphon(int syphon) - { - if (getCurrentEssence() >= syphon) - { - setCurrentEssence(getCurrentEssence() - syphon); - return syphon; - } - - return 0; - } - - /** - * Syphons from the network of the owner. If not enough LP is found, it will - * instead take away from the user's health. - * - * Always returns false on the client side. - * - * @param user - * - The Player to syphon from - * @param toSyphon - * - The amount of LP to syphon - * - * @return - Whether the action should be performed. - */ - public boolean syphonAndDamage(EntityPlayer user, int toSyphon) - { - if (user != null) - { - if (user.worldObj.isRemote) - return false; - - if (!Strings.isNullOrEmpty(mapName)) - { - SoulNetworkEvent.ItemDrainNetworkEvent event = new SoulNetworkEvent.ItemDrainNetworkEvent(user, mapName, null, toSyphon); - - if (MinecraftForge.EVENT_BUS.post(event)) - return false; - - int drainAmount = syphon(event.syphon); - - if (drainAmount <= 0 || event.shouldDamage) - hurtPlayer(user, event.syphon); - - return event.getResult() != Event.Result.DENY; - } - - int amount = syphon(toSyphon); - hurtPlayer(user, toSyphon - amount); - - return true; - } - - return false; - } - - public void hurtPlayer(EntityPlayer user, float syphon) - { - if (user != null) - { - if (syphon < 100 && syphon > 0) - { - if (!user.capabilities.isCreativeMode) - { - user.hurtResistantTime = 0; - user.attackEntityFrom(BloodMagicAPI.getDamageSource(), 1.0F); - } - - } else if (syphon >= 100) - { - if (!user.capabilities.isCreativeMode) - { - for (int i = 0; i < ((syphon + 99) / 100); i++) - { - user.hurtResistantTime = 0; - user.attackEntityFrom(BloodMagicAPI.getDamageSource(), 1.0F); - } - } - } - } - } - - public void causeNauseaToPlayer() - { - if (getPlayer() != null) - { - getPlayer().addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 99)); - } - } - - public SoulNetwork setCurrentEssence(int currentEssence) - { - this.currentEssence = currentEssence; - markDirty(); - return this; - } - - public SoulNetwork setOrbTier(int orbTier) - { - this.orbTier = orbTier; - markDirty(); - return this; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/api/network/package-info.java b/src/main/java/WayofTime/bloodmagic/api/network/package-info.java deleted file mode 100644 index 6661a13d..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/network/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.network; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java index 59945067..a136525b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java @@ -25,9 +25,9 @@ public class AlchemyTableCustomRecipe extends AlchemyTableRecipe @Override protected ItemStack getContainerItem(ItemStack stack) { - if (stack == null) + if (stack.isEmpty()) { - return null; + return ItemStack.EMPTY; } ItemStack copyStack = stack.copy(); @@ -42,10 +42,10 @@ public class AlchemyTableCustomRecipe extends AlchemyTableRecipe return copyStack.getItem().getContainerItem(copyStack); } - copyStack.stackSize--; - if (copyStack.stackSize <= 0) + copyStack.shrink(1); + if (copyStack.isEmpty()) { - return null; + return ItemStack.EMPTY; } return copyStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java index ba317b86..c5d4dc03 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import com.google.common.collect.ImmutableList; import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -15,7 +16,7 @@ import net.minecraftforge.oredict.OreDictionary; public class AlchemyTableRecipe { protected ItemStack output = null; - protected ArrayList input = new ArrayList(); + protected ArrayList input = new ArrayList(); @Getter protected int lpDrained; @Getter @@ -103,13 +104,12 @@ public class AlchemyTableRecipe if (slot != null) { boolean inRecipe = false; - Iterator req = required.iterator(); - while (req.hasNext()) + for (Object aRequired : required) { boolean match = false; - Object next = req.next(); + Object next = aRequired; if (next instanceof ItemStack) { @@ -148,9 +148,9 @@ public class AlchemyTableRecipe * * @return The recipes input vales. */ - public ArrayList getInput() + public List getInput() { - return this.input; + return ImmutableList.copyOf(input); } public ItemStack[] getRemainingItems(ItemStack[] inventory) @@ -166,9 +166,9 @@ public class AlchemyTableRecipe protected ItemStack getContainerItem(ItemStack stack) { - if (stack == null) + if (stack.isEmpty()) { - return null; + return ItemStack.EMPTY; } ItemStack copyStack = stack.copy(); @@ -178,10 +178,10 @@ public class AlchemyTableRecipe return copyStack.getItem().getContainerItem(copyStack); } - copyStack.stackSize--; - if (copyStack.stackSize <= 0) + copyStack.shrink(1); + if (copyStack.isEmpty()) { - return null; + return ItemStack.EMPTY; } return copyStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java index 053c0baa..727f1e45 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -17,7 +18,7 @@ public class LivingArmourDowngradeRecipe { protected LivingArmourUpgrade upgrade = null; protected ItemStack keyStack = null; - protected ArrayList input = new ArrayList(); + protected List input = new ArrayList(); public LivingArmourDowngradeRecipe(LivingArmourUpgrade upgrade, ItemStack keyStack, Object... recipe) { @@ -77,20 +78,17 @@ public class LivingArmourDowngradeRecipe ArrayList required = new ArrayList(input); - for (int x = 0; x < checkedList.size(); x++) + for (ItemStack slot : checkedList) { - ItemStack slot = checkedList.get(x); - if (slot != null) { boolean inRecipe = false; - Iterator req = required.iterator(); - while (req.hasNext()) + for (Object aRequired : required) { boolean match = false; - Object next = req.next(); + Object next = aRequired; if (next instanceof ItemStack) { @@ -129,9 +127,9 @@ public class LivingArmourDowngradeRecipe * * @return The recipes input vales. */ - public ArrayList getInput() + public List getInput() { - return this.input; + return ImmutableList.copyOf(input); } public ItemStack getKey() @@ -144,14 +142,14 @@ public class LivingArmourDowngradeRecipe for (int i = 0; i < inv.getSlots(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack == null) + if (stack.isEmpty()) { continue; } if (stack.getItem().hasContainerItem(stack)) { - inv.extractItem(i, stack.stackSize, false); + inv.extractItem(i, stack.getCount(), false); inv.insertItem(i, stack.getItem().getContainerItem(stack), false); } else { @@ -162,9 +160,9 @@ public class LivingArmourDowngradeRecipe protected ItemStack getContainerItem(ItemStack stack) { - if (stack == null) + if (stack.isEmpty()) { - return null; + return ItemStack.EMPTY; } ItemStack copyStack = stack.copy(); @@ -174,10 +172,10 @@ public class LivingArmourDowngradeRecipe return copyStack.getItem().getContainerItem(copyStack); } - copyStack.stackSize--; - if (copyStack.stackSize <= 0) + copyStack.shrink(1); + if (copyStack.isEmpty()) { - return null; + return ItemStack.EMPTY; } return copyStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/ShapedBloodOrbRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/ShapedBloodOrbRecipe.java index 36eb1f27..798965e4 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/ShapedBloodOrbRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/ShapedBloodOrbRecipe.java @@ -7,6 +7,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.oredict.OreDictionary; @@ -242,7 +243,7 @@ public class ShapedBloodOrbRecipe implements IRecipe // value of the item instead if (target instanceof Integer) { - if (slot != null && slot.getItem() instanceof IBloodOrb) + if (!slot.isEmpty() && slot.getItem() instanceof IBloodOrb) { IBloodOrb orb = (IBloodOrb) slot.getItem(); if (orb.getOrbLevel(slot.getItemDamage()) < (Integer) target) @@ -271,7 +272,7 @@ public class ShapedBloodOrbRecipe implements IRecipe { return false; } - } else if (target == null && slot != null) + } else if (target == null && !slot.isEmpty()) { return false; } @@ -292,7 +293,7 @@ public class ShapedBloodOrbRecipe implements IRecipe return this.input; } - public ItemStack[] getRemainingItems(InventoryCrafting inv) + public NonNullList getRemainingItems(InventoryCrafting inv) { return ForgeHooks.defaultRecipeGetRemainingItems(inv); } diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/ShapelessBloodOrbRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/ShapelessBloodOrbRecipe.java index c5626e3b..abbc1643 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/ShapelessBloodOrbRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/ShapelessBloodOrbRecipe.java @@ -7,7 +7,9 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.util.NonNullList; import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.oredict.OreDictionary; import java.util.ArrayList; @@ -83,7 +85,7 @@ public class ShapelessBloodOrbRecipe implements IRecipe { output = recipe.getRecipeOutput(); - for (ItemStack ingred : ((List) recipe.recipeItems)) + for (ItemStack ingred : recipe.recipeItems) { Object finalObj = ingred; for (Entry replace : replacements.entrySet()) @@ -126,7 +128,7 @@ public class ShapelessBloodOrbRecipe implements IRecipe { ItemStack slot = var1.getStackInSlot(x); - if (slot != null) + if (!slot.isEmpty()) { boolean inRecipe = false; Iterator req = required.iterator(); @@ -187,17 +189,9 @@ public class ShapelessBloodOrbRecipe implements IRecipe } @Override - public ItemStack[] getRemainingItems(InventoryCrafting inv) + public NonNullList getRemainingItems(InventoryCrafting inv) { - ItemStack[] aitemstack = new ItemStack[inv.getSizeInventory()]; - - for (int i = 0; i < aitemstack.length; ++i) - { - ItemStack itemstack = inv.getStackInSlot(i); - aitemstack[i] = net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack); - } - - return aitemstack; + return ForgeHooks.defaultRecipeGetRemainingItems(inv); } public int getTier() diff --git a/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java index 20433b88..53324cf0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java @@ -78,7 +78,7 @@ public class SoulNetwork implements INBTSerializable { if (user != null) { - if (user.worldObj.isRemote) + if (user.getEntityWorld().isRemote) return false; if (!Strings.isNullOrEmpty(playerId.toString())) diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java index 2d98b0a6..ac74a042 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java @@ -6,6 +6,7 @@ import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; @@ -149,17 +150,17 @@ public class RitualHelper { if (world == null) return; - Block block = world.getBlockState(pos).getBlock(); + IBlockState state = world.getBlockState(pos); TileEntity tile = world.getTileEntity(pos); - if (block instanceof IRitualStone) - ((IRitualStone) block).setRuneType(world, pos, type); + 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.notifyBlockOfStateChange(pos, block); + world.notifyBlockUpdate(pos, state, state, 3); } } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java index 29a03a07..3f486341 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.List; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -27,7 +28,9 @@ import WayofTime.bloodmagic.registry.ModItems; import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.Utils; -public class BlockAlchemyArray extends BlockContainer +import javax.annotation.Nullable; + +public class BlockAlchemyArray extends Block { protected static final AxisAlignedBB ARRAY_AABB = new AxisAlignedBB(0, 0, 0, 1, 0.1, 1); @@ -81,7 +84,7 @@ public class BlockAlchemyArray extends BlockContainer } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -99,7 +102,7 @@ public class BlockAlchemyArray extends BlockContainer } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { //TODO: Right click should rotate it TileAlchemyArray array = (TileAlchemyArray) world.getTileEntity(pos); @@ -109,12 +112,12 @@ public class BlockAlchemyArray extends BlockContainer ItemStack playerItem = player.getHeldItem(hand); - if (playerItem != null) + if (!playerItem.isEmpty()) { - if (array.getStackInSlot(0) == null) + if (array.getStackInSlot(0).isEmpty()) { Utils.insertItemToTile(array, player, 0); - } else if (array.getStackInSlot(0) != null) + } else if (!array.getStackInSlot(0).isEmpty()) { Utils.insertItemToTile(array, player, 1); array.attemptCraft(); @@ -140,12 +143,6 @@ public class BlockAlchemyArray extends BlockContainer return 0; } - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) - { - return new TileAlchemyArray(); - } - @Override public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { @@ -155,4 +152,15 @@ public class BlockAlchemyArray extends BlockContainer super.breakBlock(world, blockPos, blockState); } + + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileAlchemyArray(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java index 2674b21b..f8040fed 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -22,7 +22,9 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.TileAlchemyTable; -public class BlockAlchemyTable extends BlockContainer +import javax.annotation.Nullable; + +public class BlockAlchemyTable extends Block { public static final PropertyBool INVISIBLE = PropertyBool.create("invisible"); public static final PropertyEnum DIRECTION = PropertyEnum.create("direction", EnumFacing.class); @@ -60,7 +62,7 @@ public class BlockAlchemyTable extends BlockContainer } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -107,17 +109,11 @@ public class BlockAlchemyTable extends BlockContainer @Override protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, new IProperty[] { DIRECTION, INVISIBLE }); + return new BlockStateContainer(this, DIRECTION, INVISIBLE); } @Override - public TileEntity createNewTileEntity(World world, int meta) - { - return new TileAlchemyTable(); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { BlockPos position = pos; TileEntity tile = world.getTileEntity(pos); @@ -152,7 +148,18 @@ public class BlockAlchemyTable extends BlockContainer } @Override - public void neighborChanged(IBlockState state, World world, BlockPos pos, Block neighborBlock) + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileAlchemyTable(); + } + + @Override + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { TileAlchemyTable tile = (TileAlchemyTable) world.getTileEntity(pos); if (tile != null) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 2e01b83c..41c8d138 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -7,8 +7,7 @@ import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.altar.IBloodAltar; import WayofTime.bloodmagic.api.iface.IDocumentedBlock; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import net.minecraft.block.BlockContainer; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -40,7 +39,9 @@ import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Strings; -public class BlockAltar extends BlockContainer implements IVariantProvider, IDocumentedBlock +import javax.annotation.Nullable; + +public class BlockAltar extends Block implements IVariantProvider, IDocumentedBlock { public BlockAltar() { @@ -74,7 +75,7 @@ public class BlockAltar extends BlockContainer implements IVariantProvider, IDoc if (world.getBlockState(pos.down()).getBlock() instanceof BlockBloodStoneBrick) { - if (orbStack != null && orbStack.getItem() instanceof IBloodOrb && orbStack.getItem() instanceof IBindable) + if (orbStack.getItem() instanceof IBloodOrb && orbStack.getItem() instanceof IBindable) { IBloodOrb bloodOrb = (IBloodOrb) orbStack.getItem(); IBindable bindable = (IBindable) orbStack.getItem(); @@ -119,9 +120,9 @@ public class BlockAltar extends BlockContainer implements IVariantProvider, IDoc } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { - return false; + return true; } @Override @@ -131,13 +132,7 @@ public class BlockAltar extends BlockContainer implements IVariantProvider, IDoc } @Override - public TileEntity createNewTileEntity(World world, int meta) - { - return new TileAltar(); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { TileAltar altar = (TileAltar) world.getTileEntity(pos); @@ -146,13 +141,10 @@ public class BlockAltar extends BlockContainer implements IVariantProvider, IDoc ItemStack playerItem = player.inventory.getCurrentItem(); - if (playerItem != null) + if (playerItem.getItem() instanceof IAltarReader || playerItem.getItem() instanceof IAltarManipulator) { - if (playerItem.getItem() instanceof IAltarReader || playerItem.getItem() instanceof IAltarManipulator) - { - playerItem.getItem().onItemRightClick(playerItem, world, player, hand); - return true; - } + playerItem.getItem().onItemRightClick(world, player, hand); + return true; } if (Utils.insertItemToTile(altar, player)) @@ -178,6 +170,17 @@ public class BlockAltar extends BlockContainer implements IVariantProvider, IDoc super.breakBlock(world, blockPos, blockState); } + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileAltar(); + } + // IVariantProvider @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java index cbca3d2e..4b9fe9b1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -70,7 +70,7 @@ public class BlockBloodLight extends Block } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -97,12 +97,12 @@ public class BlockBloodLight extends Block @SideOnly(Side.CLIENT) public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) { - EntityPlayerSP playerSP = Minecraft.getMinecraft().thePlayer; + EntityPlayerSP playerSP = Minecraft.getMinecraft().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); - if (playerSP.getActiveItemStack() != null && playerSP.getActiveItemStack().getItem() == ModItems.SIGIL_BLOOD_LIGHT) + if (!playerSP.getActiveItemStack().isEmpty() && playerSP.getActiveItemStack().getItem() == ModItems.SIGIL_BLOOD_LIGHT) { 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); 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); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 4b6ab6f4..664a3ddf 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -52,7 +52,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider @Nullable @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos) + public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { return BOX; } @@ -89,10 +89,11 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider } @Override - public boolean onBlockActivated(World world, BlockPos blockPos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos blockPos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + ItemStack held = player.getHeldItem(hand); TileBloodTank fluidHandler = (TileBloodTank) world.getTileEntity(blockPos); - if (FluidUtil.interactWithFluidHandler(heldItem, fluidHandler.getTank(), player)) + if (FluidUtil.interactWithFluidHandler(held, fluidHandler.getTank(), player).isSuccess()) { world.checkLight(blockPos); world.updateComparatorOutputLevel(blockPos, this); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index ef3faa04..4836416a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.List; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -27,7 +28,9 @@ import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileDemonCrucible; import WayofTime.bloodmagic.util.Utils; -public class BlockDemonCrucible extends BlockContainer implements IVariantProvider +import javax.annotation.Nullable; + +public class BlockDemonCrucible extends Block implements IVariantProvider { public BlockDemonCrucible() { @@ -55,7 +58,7 @@ public class BlockDemonCrucible extends BlockContainer implements IVariantProvid } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -67,25 +70,17 @@ public class BlockDemonCrucible extends BlockContainer implements IVariantProvid } @Override - public TileEntity createNewTileEntity(World world, int meta) - { - return new TileDemonCrucible(); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing 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 != null) + if (!(heldItem.getItem() instanceof IDiscreteDemonWill) && !(heldItem.getItem() instanceof IDemonWillGem)) { - if (!(heldItem.getItem() instanceof IDiscreteDemonWill) && !(heldItem.getItem() instanceof IDemonWillGem)) - { - return true; - } + return true; } Utils.insertItemToTile(crucible, player); @@ -104,6 +99,17 @@ public class BlockDemonCrucible extends BlockContainer implements IVariantProvid super.breakBlock(world, blockPos, blockState); } + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileDemonCrucible(); + } + @Override public List> getVariants() { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 44e5b325..819df5e3 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -19,6 +19,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -31,7 +32,9 @@ import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.item.ItemDemonCrystal; import WayofTime.bloodmagic.tile.TileDemonCrystal; -public class BlockDemonCrystal extends BlockContainer +import javax.annotation.Nullable; + +public class BlockDemonCrystal extends Block { public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 6); public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumDemonWillType.class); @@ -60,7 +63,7 @@ public class BlockDemonCrystal extends BlockContainer } @Override - public void neighborChanged(IBlockState state, World world, BlockPos pos, Block neighborBlock) + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); EnumFacing placement = tile.getPlacement(); @@ -87,7 +90,7 @@ public class BlockDemonCrystal extends BlockContainer @Override @SideOnly(Side.CLIENT) - public void getSubBlocks(Item item, CreativeTabs creativeTabs, List list) + public void getSubBlocks(Item item, CreativeTabs creativeTabs, NonNullList list) { for (int i = 0; i < EnumDemonWillType.values().length; i++) list.add(new ItemStack(this, 1, i)); @@ -112,7 +115,7 @@ public class BlockDemonCrystal extends BlockContainer } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -143,19 +146,13 @@ public class BlockDemonCrystal extends BlockContainer @Override public int getMetaFromState(IBlockState state) { - return ((EnumDemonWillType) state.getValue(TYPE)).ordinal(); + return state.getValue(TYPE).ordinal(); } @Override protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, new IProperty[] { TYPE, AGE, ATTACHED }); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) - { - return new TileDemonCrystal(); + return new BlockStateContainer(this, TYPE, AGE, ATTACHED); } @Override @@ -191,7 +188,7 @@ public class BlockDemonCrystal extends BlockContainer break; } - stack.stackSize = crystalNumber; + stack.setCount(crystalNumber); return stack; } @@ -202,7 +199,7 @@ public class BlockDemonCrystal extends BlockContainer } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (world.isRemote) { @@ -221,7 +218,18 @@ public class BlockDemonCrystal extends BlockContainer return true; } -// @Override + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileDemonCrystal(); + } + + // @Override // public java.util.List getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune) // { // java.util.List ret = super.getDrops(world, pos, state, fortune); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java index f10a2fde..aef22bcd 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java @@ -61,7 +61,7 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java index c0ff3c2e..26b8f331 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -54,7 +54,7 @@ public class BlockDemonPylon extends BlockContainer implements IVariantProvider } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index ccf6dcbb..8ba40b12 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -19,7 +19,6 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.teleport.PortalLocation; import WayofTime.bloodmagic.api.teleport.TeleportQueue; -import WayofTime.bloodmagic.block.base.BlockIntegerContainer; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.ritual.portal.Teleports; import WayofTime.bloodmagic.tile.TileDimensionalPortal; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java index 9e9b5772..92ace672 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.List; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -21,7 +22,9 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileIncenseAltar; -public class BlockIncenseAltar extends BlockContainer implements IVariantProvider +import javax.annotation.Nullable; + +public class BlockIncenseAltar extends Block implements IVariantProvider { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); @@ -61,7 +64,7 @@ public class BlockIncenseAltar extends BlockContainer implements IVariantProvide } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -72,12 +75,6 @@ public class BlockIncenseAltar extends BlockContainer implements IVariantProvide return EnumBlockRenderType.MODEL; } - @Override - public TileEntity createNewTileEntity(World world, int meta) - { - return new TileIncenseAltar(); - } - @Override public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { @@ -88,6 +85,17 @@ public class BlockIncenseAltar extends BlockContainer implements IVariantProvide super.breakBlock(world, blockPos, blockState); } + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileIncenseAltar(); + } + @Override public List> getVariants() { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java index 376975be..6a279f6f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -41,7 +41,7 @@ public class BlockInputRoutingNode extends BlockRoutingNode } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (world.getTileEntity(pos) instanceof TileInputRoutingNode) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java index 0e430ba3..b05b122d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.block.base.BlockEnum; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.BlockStateContainer; @@ -19,13 +20,11 @@ import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.block.base.BlockEnumContainer; import WayofTime.bloodmagic.block.enums.EnumSubWillType; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileInversionPillar; -public class BlockInversionPillar extends BlockEnumContainer implements IVariantProvider +public class BlockInversionPillar extends BlockEnum implements IVariantProvider { public BlockInversionPillar() { @@ -77,7 +76,7 @@ public class BlockInversionPillar extends BlockEnumContainer im } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java index 5df6bfc9..0840c48b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java @@ -52,7 +52,7 @@ public class BlockInversionPillarEnd extends BlockEnum impleme } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java index 4897b454..bf43c742 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java @@ -31,14 +31,6 @@ public class BlockLifeEssence extends BlockFluidClassic BloodMagicAPI.setLifeEssence(getLifeEssence()); } - // TODO - Remove after Forge fixes - // Fix for BlockFluidBase not overriding this - @Override - public IBlockState getStateFromMeta(int meta) - { - return getBlockState().getBaseState().withProperty(LEVEL, meta); - } - @Override public boolean canDisplace(IBlockAccess world, BlockPos blockPos) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 18121f5c..599b5a18 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -5,11 +5,13 @@ import java.util.List; import javax.annotation.Nullable; +import WayofTime.bloodmagic.block.base.BlockEnum; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -31,14 +33,13 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.altar.IAltarComponent; -import WayofTime.bloodmagic.block.base.BlockEnumContainer; import WayofTime.bloodmagic.block.enums.EnumMimic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.tile.TileMimic; import WayofTime.bloodmagic.util.Utils; -public class BlockMimic extends BlockEnumContainer implements IVariantProvider, IAltarComponent +public class BlockMimic extends BlockEnum implements IVariantProvider, IAltarComponent { public static final int sentientMimicMeta = 4; @@ -56,7 +57,8 @@ public class BlockMimic extends BlockEnumContainer implements IVarian } @Nullable - public AxisAlignedBB getCollisionBoundingBox(IBlockState state, World world, BlockPos pos) + @Override + public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { switch (this.getMetaFromState(state)) { @@ -65,10 +67,10 @@ public class BlockMimic extends BlockEnumContainer implements IVarian case 3: case 4: TileMimic tileMimic = (TileMimic) world.getTileEntity(pos); - if (tileMimic != null && tileMimic.getStackInSlot(0) != null) + if (tileMimic != null && !tileMimic.getStackInSlot(0).isEmpty()) { Block mimicBlock = Block.getBlockFromItem(tileMimic.getStackInSlot(0).getItem()); - if (mimicBlock == null) + if (mimicBlock == Blocks.AIR) { return FULL_BLOCK_AABB; } @@ -93,10 +95,10 @@ public class BlockMimic extends BlockEnumContainer implements IVarian public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World world, BlockPos pos) { TileMimic tileMimic = (TileMimic) world.getTileEntity(pos); - if (tileMimic != null && tileMimic.getStackInSlot(0) != null) + if (tileMimic != null && !tileMimic.getStackInSlot(0).isEmpty()) { Block mimicBlock = Block.getBlockFromItem(tileMimic.getStackInSlot(0).getItem()); - if (mimicBlock == null) + if (mimicBlock == Blocks.AIR) { return FULL_BLOCK_AABB; } @@ -147,14 +149,10 @@ public class BlockMimic extends BlockEnumContainer implements IVarian } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { TileMimic mimic = (TileMimic) world.getTileEntity(pos); - if (mimic == null) - return false; - - return mimic.onBlockActivated(world, pos, state, player, hand, heldItem, side); + return mimic != null && mimic.onBlockActivated(world, pos, state, player, hand, player.getHeldItem(hand), side); } @Override @@ -165,7 +163,7 @@ public class BlockMimic extends BlockEnumContainer implements IVarian { TileMimic mimic = (TileMimic) tile; ItemStack stack = mimic.getStackInSlot(0); - if (stack != null && stack.getItem() instanceof ItemBlock) + if (stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); IBlockState mimicState = block.getStateFromMeta(stack.getItemDamage()); @@ -196,7 +194,7 @@ public class BlockMimic extends BlockEnumContainer implements IVarian } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -257,7 +255,7 @@ public class BlockMimic extends BlockEnumContainer implements IVarian { TileMimic mimic = (TileMimic) tile; ItemStack stack = mimic.getStackInSlot(0); - if (stack != null && stack.getItem() instanceof ItemBlock) + if (stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); if (block instanceof IAltarComponent) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java index e9122df9..194490f0 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -12,6 +12,8 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; +import javax.annotation.Nullable; + public class BlockOutputRoutingNode extends BlockRoutingNode { public BlockOutputRoutingNode() @@ -21,12 +23,6 @@ public class BlockOutputRoutingNode extends BlockRoutingNode setUnlocalizedName(Constants.Mod.MODID + ".outputRouting"); } - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) - { - return new TileOutputRoutingNode(); - } - @Override //TODO: Combine BlockOutputRoutingNode and BlockInputRoutingNode so they have the same superclass public void breakBlock(World world, BlockPos pos, IBlockState state) @@ -41,7 +37,7 @@ public class BlockOutputRoutingNode extends BlockRoutingNode } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (world.getTileEntity(pos) instanceof TileOutputRoutingNode) { @@ -50,4 +46,15 @@ public class BlockOutputRoutingNode extends BlockRoutingNode return true; } + + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileOutputRoutingNode(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java index 3dde1786..8b35601e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -25,7 +26,9 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TilePhantomBlock; -public class BlockPhantom extends BlockContainer implements IVariantProvider +import javax.annotation.Nullable; + +public class BlockPhantom extends Block implements IVariantProvider { public BlockPhantom() { @@ -54,7 +57,7 @@ public class BlockPhantom extends BlockContainer implements IVariantProvider } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -86,8 +89,13 @@ public class BlockPhantom extends BlockContainer implements IVariantProvider } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { return new TilePhantomBlock(100); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 86509cd7..d551614f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -30,7 +30,6 @@ import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.api.util.helper.RitualHelper; -import WayofTime.bloodmagic.block.base.BlockEnumContainer; import WayofTime.bloodmagic.block.enums.EnumRitualController; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.registry.ModItems; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java index ef4ac201..bf068a92 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java @@ -18,7 +18,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -public abstract class BlockRoutingNode extends BlockContainer +public class BlockRoutingNode extends Block { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.378F, 0.378F, 0.378F, 0.625F, 0.625F, 0.625F); @@ -72,7 +72,7 @@ public abstract class BlockRoutingNode extends BlockContainer } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index 0750c130..2203c7d5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.List; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -26,7 +27,9 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileSoulForge; -public class BlockSoulForge extends BlockContainer implements IVariantProvider +import javax.annotation.Nullable; + +public class BlockSoulForge extends Block implements IVariantProvider { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.06F, 0.0F, 0.06F, 0.94F, 0.75F, 0.94F); @@ -67,7 +70,7 @@ public class BlockSoulForge extends BlockContainer implements IVariantProvider } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -79,7 +82,7 @@ public class BlockSoulForge extends BlockContainer implements IVariantProvider } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing 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()); @@ -98,8 +101,13 @@ public class BlockSoulForge extends BlockContainer implements IVariantProvider } @Override - public TileEntity createNewTileEntity(World worldIn, int meta) - { + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { return new TileSoulForge(); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java index 357c1a99..e72b9abb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Random; import WayofTime.bloodmagic.ConfigHandler; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -27,7 +28,9 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileSpectralBlock; -public class BlockSpectral extends BlockContainer implements IVariantProvider +import javax.annotation.Nullable; + +public class BlockSpectral extends Block implements IVariantProvider { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0, 0, 0, 0, 0, 0); @@ -63,7 +66,7 @@ public class BlockSpectral extends BlockContainer implements IVariantProvider } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @@ -112,8 +115,13 @@ public class BlockSpectral extends BlockContainer implements IVariantProvider } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { return new TileSpectralBlock(); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index f3472a56..da254a0d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -43,11 +43,11 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - ItemStack playerItem = heldItem; + ItemStack playerItem = player.getHeldItem(hand); - if (playerItem != null && playerItem.getItem() instanceof ItemTelepositionFocus) + 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()); diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java index ce7f0e65..36c41e6d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java @@ -10,6 +10,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -69,7 +70,7 @@ public class BlockEnum & IStringSerializable> extends Block @SideOnly(Side.CLIENT) @Override - public void getSubBlocks(Item item, CreativeTabs tab, List subBlocks) + public void getSubBlocks(Item item, CreativeTabs tab, NonNullList subBlocks) { for (E type : types) subBlocks.add(new ItemStack(item, 1, type.ordinal())); diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumContainer.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumContainer.java deleted file mode 100644 index c7144317..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumContainer.java +++ /dev/null @@ -1,42 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public abstract class BlockEnumContainer & IStringSerializable> extends BlockEnum -{ - public BlockEnumContainer(Material material, Class enumClass, String propName) - { - super(material, enumClass, propName); - } - - public BlockEnumContainer(Material material, Class enumClass) - { - this(material, enumClass, "type"); - } - - @Override - public abstract boolean hasTileEntity(IBlockState state); - - @Override - public abstract TileEntity createTileEntity(World world, IBlockState state); - - @Override - public void breakBlock(World worldIn, BlockPos pos, IBlockState state) - { - super.breakBlock(worldIn, pos, state); - worldIn.removeTileEntity(pos); - } - - @Override - public boolean eventReceived(IBlockState state, World worldIn, BlockPos pos, int eventID, int eventParam) - { - super.eventReceived(state, worldIn, pos, eventID, eventParam); - TileEntity tileentity = worldIn.getTileEntity(pos); - return tileentity != null && tileentity.receiveClientEvent(eventID, eventParam); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java index 70772f8a..3b8cc9a6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java @@ -9,6 +9,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; import net.minecraft.util.IStringSerializable; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; @@ -122,15 +123,17 @@ public class BlockEnumPillar & IStringSerializable> extends Bl } @Override - protected ItemStack createStackedBlock(IBlockState state) + protected ItemStack getSilkTouchDrop(IBlockState state) { return new ItemStack(this, 1, damageDropped(state)); } + + @Override - public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { - return super.onBlockPlaced(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer).withProperty(BlockRotatedPillar.AXIS, facing.getAxis()); + return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(BlockRotatedPillar.AXIS, facing.getAxis()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java index e4f3df8d..e9b1b736 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java @@ -7,10 +7,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.Mirror; -import net.minecraft.util.Rotation; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -70,15 +67,15 @@ public class BlockEnumPillarCap & IStringSerializable> extends } @Override - protected ItemStack createStackedBlock(IBlockState state) + protected ItemStack getSilkTouchDrop(IBlockState state) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { - return super.onBlockPlaced(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer).withProperty(FACING, facing); + return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(FACING, facing); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java index 77a857e2..1cfa5837 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java @@ -16,10 +16,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.Mirror; -import net.minecraft.util.Rotation; +import net.minecraft.util.*; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; @@ -172,9 +169,9 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } @Override - public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { - IBlockState state = super.onBlockPlaced(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer); + IBlockState state = super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand); state = state.withProperty(FACING, placer.getHorizontalFacing()).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.STRAIGHT); return facing != EnumFacing.DOWN && (facing == EnumFacing.UP || (double) hitY <= 0.5D) ? state.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.BOTTOM) : state.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.TOP); } @@ -349,7 +346,7 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } @Override - protected ItemStack createStackedBlock(IBlockState state) + protected ItemStack getSilkTouchDrop(IBlockState state) { return new ItemStack(this, 1, damageDropped(state)); } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java index a4a06261..321d75c5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java @@ -13,7 +13,6 @@ import net.minecraft.util.IStringSerializable; 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; @@ -54,7 +53,7 @@ public class BlockEnumWall & IStringSerializable> extends Bloc } @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos) + public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { blockState = blockState.getActualState(worldIn, pos); return CLIP_AABB_BY_INDEX[getAABBIndex(blockState)]; @@ -129,7 +128,7 @@ public class BlockEnumWall & IStringSerializable> extends Bloc } @Override - protected ItemStack createStackedBlock(IBlockState state) + protected ItemStack getSilkTouchDrop(IBlockState state) { return new ItemStack(this, 1, damageDropped(state)); } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java index bac679b4..5d24ed53 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java @@ -9,11 +9,10 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.List; - /** * Creates a block that has multiple meta-based states. * @@ -68,7 +67,7 @@ public class BlockInteger extends Block @SideOnly(Side.CLIENT) @Override - public void getSubBlocks(Item item, CreativeTabs tab, List subBlocks) { + public void getSubBlocks(Item item, CreativeTabs tab, NonNullList subBlocks) { for (int i = 0; i < maxMeta; i++) subBlocks.add(new ItemStack(item, 1, i)); } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockIntegerContainer.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockIntegerContainer.java deleted file mode 100644 index 4873a082..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockIntegerContainer.java +++ /dev/null @@ -1,38 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import net.minecraft.block.ITileEntityProvider; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public abstract class BlockIntegerContainer extends BlockInteger implements ITileEntityProvider -{ - public BlockIntegerContainer(Material material, int maxMeta, String propName) - { - super(material, maxMeta, propName); - - this.isBlockContainer = true; - } - - public BlockIntegerContainer(Material material, int maxMeta) - { - this(material, maxMeta, "meta"); - } - - @Override - public void breakBlock(World worldIn, BlockPos pos, IBlockState state) - { - super.breakBlock(worldIn, pos, state); - worldIn.removeTileEntity(pos); - } - - @Override - public boolean eventReceived(IBlockState state, World worldIn, BlockPos pos, int eventID, int eventParam) - { - super.eventReceived(state, worldIn, pos, eventID, eventParam); - TileEntity tileentity = worldIn.getTileEntity(pos); - return tileentity != null && tileentity.receiveClientEvent(eventID, eventParam); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java index ff41d2b1..d6381cdf 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.block.base; -import java.util.List; - import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -11,6 +9,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.block.property.PropertyString; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.ArrayUtils; @@ -79,7 +78,7 @@ public class BlockString extends Block @SideOnly(Side.CLIENT) @Override - public void getSubBlocks(Item item, CreativeTabs tab, List subBlocks) + public void getSubBlocks(Item item, CreativeTabs tab, NonNullList subBlocks) { for (int i = 0; i < maxMeta; i++) subBlocks.add(new ItemStack(item, 1, i)); diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockStringContainer.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockStringContainer.java deleted file mode 100644 index a397e96b..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockStringContainer.java +++ /dev/null @@ -1,38 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import net.minecraft.block.ITileEntityProvider; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public abstract class BlockStringContainer extends BlockString implements ITileEntityProvider -{ - public BlockStringContainer(Material material, String[] values, String propName) - { - super(material, values, propName); - - this.isBlockContainer = true; - } - - public BlockStringContainer(Material material, String[] values) - { - this(material, values, "type"); - } - - @Override - public void breakBlock(World worldIn, BlockPos pos, IBlockState state) - { - super.breakBlock(worldIn, pos, state); - worldIn.removeTileEntity(pos); - } - - @Override - public boolean eventReceived(IBlockState state, World worldIn, BlockPos pos, int eventID, int eventParam) - { - super.eventReceived(state, worldIn, pos, eventID, eventParam); - TileEntity tileentity = worldIn.getTileEntity(pos); - return tileentity != null && tileentity.receiveClientEvent(eventID, eventParam); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/property/UnlistedPropertyInteger.java b/src/main/java/WayofTime/bloodmagic/block/property/UnlistedPropertyInteger.java deleted file mode 100644 index 177f0067..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/property/UnlistedPropertyInteger.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.block.property; - -import net.minecraftforge.common.property.IUnlistedProperty; - -public class UnlistedPropertyInteger implements IUnlistedProperty -{ - private int maxMeta; - private String propName; - - public UnlistedPropertyInteger(int maxMeta, String propName) - { - this.maxMeta = maxMeta; - this.propName = propName; - } - - @Override - public String getName() - { - return propName; - } - - @Override - public boolean isValid(Integer value) - { - return value <= maxMeta; - } - - @Override - public Class getType() - { - return Integer.class; - } - - @Override - public String valueToString(Integer value) - { - return value.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/property/UnlistedPropertyString.java b/src/main/java/WayofTime/bloodmagic/block/property/UnlistedPropertyString.java deleted file mode 100644 index 01f20774..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/property/UnlistedPropertyString.java +++ /dev/null @@ -1,42 +0,0 @@ -package WayofTime.bloodmagic.block.property; - -import net.minecraftforge.common.property.IUnlistedProperty; - -import java.util.Arrays; -import java.util.List; - -public class UnlistedPropertyString implements IUnlistedProperty -{ - private List values; - private String propName; - - public UnlistedPropertyString(String[] values, String propName) - { - this.values = Arrays.asList(values); - this.propName = propName; - } - - @Override - public String getName() - { - return propName; - } - - @Override - public boolean isValid(String value) - { - return values.contains(value); - } - - @Override - public Class getType() - { - return String.class; - } - - @Override - public String valueToString(String value) - { - return value; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java index a8e5b6a5..625166fa 100644 --- a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java @@ -1,77 +1,46 @@ package WayofTime.bloodmagic.command; import WayofTime.bloodmagic.command.sub.SubCommandBind; -import WayofTime.bloodmagic.command.sub.SubCommandHelp; import WayofTime.bloodmagic.command.sub.SubCommandNetwork; import WayofTime.bloodmagic.command.sub.SubCommandOrb; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; -import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentString; +import net.minecraftforge.server.command.CommandTreeBase; -import java.util.*; - -public class CommandBloodMagic extends CommandBase +public class CommandBloodMagic extends CommandTreeBase { - // TODO - Move this and sub commands to CommandTreeBase in 1.11. Much cleaner impl - private final List aliases = new ArrayList(); - private final Map subCommands = new HashMap(); - public CommandBloodMagic() { - aliases.add("BloodMagic"); - aliases.add("bloodmagic"); - aliases.add("bloodMagic"); - aliases.add("bm"); - - subCommands.put("help", new SubCommandHelp(this)); - subCommands.put("network", new SubCommandNetwork(this)); - subCommands.put("bind", new SubCommandBind(this)); - subCommands.put("orb", new SubCommandOrb(this)); + addSubcommand(new SubCommandBind()); + addSubcommand(new SubCommandNetwork()); + addSubcommand(new SubCommandOrb()); } @Override - public String getCommandName() + public String getName() { - return "/bloodmagic"; + return "bloodmagic"; } @Override - public int getRequiredPermissionLevel() + public String getUsage(ICommandSender sender) { - return 2; + return "/bloodmagic help"; } - @Override - public String getCommandUsage(ICommandSender commandSender) + public static void displayHelpString(ICommandSender commandSender, String display, Object... info) { - return getCommandName() + " help"; + commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); } - @Override - public List getCommandAliases() + public static void displayErrorString(ICommandSender commandSender, String display, Object... info) { - return aliases; + commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); } - @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) + public static void displaySuccessString(ICommandSender commandSender, String display, Object... info) { - if (args.length > 0 && subCommands.containsKey(args[0])) - { - - ISubCommand subCommand = subCommands.get(args[0]); - String[] subArgs = Arrays.copyOfRange(args, 1, args.length); - subCommand.processSubCommand(server, commandSender, subArgs); - } else - { - commandSender.addChatMessage(new TextComponentString(TextHelper.localizeEffect("commands.error.unknown"))); - } - } - - public Map getSubCommands() - { - return subCommands; + commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); } } diff --git a/src/main/java/WayofTime/bloodmagic/command/ISubCommand.java b/src/main/java/WayofTime/bloodmagic/command/ISubCommand.java deleted file mode 100644 index e8d95798..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/ISubCommand.java +++ /dev/null @@ -1,19 +0,0 @@ -package WayofTime.bloodmagic.command; - -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.server.MinecraftServer; - -public interface ISubCommand -{ - - String getSubCommandName(); - - ICommand getParentCommand(); - - String getArgUsage(ICommandSender commandSender); - - String getHelpText(); - - void processSubCommand(MinecraftServer server, ICommandSender commandSender, String[] args); -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/command/SubCommandBase.java b/src/main/java/WayofTime/bloodmagic/command/SubCommandBase.java deleted file mode 100644 index 0130f955..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/SubCommandBase.java +++ /dev/null @@ -1,70 +0,0 @@ -package WayofTime.bloodmagic.command; - -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.TextComponentString; - -import java.util.Locale; - -public abstract class SubCommandBase implements ISubCommand -{ - - private ICommand parent; - private String name; - - public SubCommandBase(ICommand parent, String name) - { - this.parent = parent; - this.name = name; - } - - @Override - public String getSubCommandName() - { - return name; - } - - @Override - public ICommand getParentCommand() - { - return parent; - } - - @Override - public void processSubCommand(MinecraftServer server, ICommandSender commandSender, String[] args) - { - - if (args.length == 0 && !getSubCommandName().equals("help")) - displayErrorString(commandSender, String.format(TextHelper.localizeEffect("commands.format.error"), capitalizeFirstLetter(getSubCommandName()), getArgUsage(commandSender))); - - if (isBounded(0, 2, args.length) && args[0].equals("help")) - displayHelpString(commandSender, String.format(TextHelper.localizeEffect("commands.format.help"), capitalizeFirstLetter(getSubCommandName()), getHelpText())); - } - - protected String capitalizeFirstLetter(String toCapital) - { - return String.valueOf(toCapital.charAt(0)).toUpperCase(Locale.ENGLISH) + toCapital.substring(1); - } - - protected boolean isBounded(int low, int high, int given) - { - return given > low && given < high; - } - - public static void displayHelpString(ICommandSender commandSender, String display, Object... info) - { - commandSender.addChatMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } - - public static void displayErrorString(ICommandSender commandSender, String display, Object... info) - { - commandSender.addChatMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } - - public static void displaySuccessString(ICommandSender commandSender, String display, Object... info) - { - commandSender.addChatMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/command/package-info.java b/src/main/java/WayofTime/bloodmagic/command/package-info.java deleted file mode 100644 index bdfb59bd..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.command; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index 755bea76..ae6489d9 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -4,43 +4,31 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.util.helper.BindableHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.command.SubCommandBase; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.command.PlayerNotFoundException; +import net.minecraft.command.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentTranslation; -public class SubCommandBind extends SubCommandBase +public class SubCommandBind extends CommandBase { - - public SubCommandBind(ICommand parent) + @Override + public String getName() { - super(parent, "bind"); + return "bind"; } @Override - public String getArgUsage(ICommandSender commandSender) + public String getUsage(ICommandSender commandSender) { return TextHelper.localizeEffect("commands.bind.usage"); } @Override - public String getHelpText() + public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { - return TextHelper.localizeEffect("commands.bind.help"); - } - - @Override - public void processSubCommand(MinecraftServer server, ICommandSender commandSender, String[] args) - { - super.processSubCommand(server, commandSender, args); - if (commandSender.getEntityWorld().isRemote) return; @@ -52,7 +40,7 @@ public class SubCommandBind extends SubCommandBase ItemStack held = player.getHeldItemMainhand(); boolean bind = true; - if (held != null && held.getItem() instanceof IBindable) + if (held.getItem() instanceof IBindable) { if (args.length > 0) { @@ -77,20 +65,20 @@ public class SubCommandBind extends SubCommandBase { BindableHelper.setItemOwnerName(held, playerName); BindableHelper.setItemOwnerUUID(held, uuid); - commandSender.addChatMessage(new TextComponentTranslation("commands.bind.success")); + commandSender.sendMessage(new TextComponentTranslation("commands.bind.success")); } else { if (!Strings.isNullOrEmpty(((IBindable) held.getItem()).getOwnerUUID(held))) { held.getTagCompound().removeTag(Constants.NBT.OWNER_UUID); held.getTagCompound().removeTag(Constants.NBT.OWNER_NAME); - commandSender.addChatMessage(new TextComponentTranslation("commands.bind.remove.success")); + commandSender.sendMessage(new TextComponentTranslation("commands.bind.remove.success")); } } } } catch (PlayerNotFoundException e) { - commandSender.addChatMessage(new TextComponentTranslation(TextHelper.localizeEffect("commands.error.404"))); + commandSender.sendMessage(new TextComponentTranslation(TextHelper.localizeEffect("commands.error.404"))); } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandHelp.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandHelp.java deleted file mode 100644 index 22dfd1d6..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandHelp.java +++ /dev/null @@ -1,43 +0,0 @@ -package WayofTime.bloodmagic.command.sub; - -import WayofTime.bloodmagic.command.CommandBloodMagic; -import WayofTime.bloodmagic.command.ISubCommand; -import WayofTime.bloodmagic.command.SubCommandBase; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.TextComponentString; - -public class SubCommandHelp extends SubCommandBase -{ - - public SubCommandHelp(ICommand parent) - { - super(parent, "help"); - } - - @Override - public String getArgUsage(ICommandSender commandSender) - { - return TextHelper.localize("commands.help.usage"); - } - - @Override - public String getHelpText() - { - return TextHelper.localizeEffect("commands.help.help"); - } - - @Override - public void processSubCommand(MinecraftServer server, ICommandSender commandSender, String[] args) - { - super.processSubCommand(server, commandSender, args); - - if (args.length > 0) - return; - - for (ISubCommand subCommand : ((CommandBloodMagic) getParentCommand()).getSubCommands().values()) - commandSender.addChatMessage(new TextComponentString(TextHelper.localizeEffect("commands.format.help", capitalizeFirstLetter(subCommand.getSubCommandName()), subCommand.getArgUsage(commandSender)))); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 0cee7b82..b0603dd3 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -2,45 +2,32 @@ package WayofTime.bloodmagic.command.sub; import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.command.SubCommandBase; +import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.command.PlayerNotFoundException; +import net.minecraft.command.*; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentString; import java.util.Locale; -public class SubCommandNetwork extends SubCommandBase +public class SubCommandNetwork extends CommandBase { - - public SubCommandNetwork(ICommand parent) - { - super(parent, "network"); + @Override + public String getName() { + return "network"; } @Override - public String getArgUsage(ICommandSender commandSender) + public String getUsage(ICommandSender commandSender) { return TextHelper.localizeEffect("commands.network.usage"); } @Override - public String getHelpText() + public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { - return TextHelper.localizeEffect("commands.network.help"); - } - - @Override - public void processSubCommand(MinecraftServer server, ICommandSender commandSender, String[] args) - { - super.processSubCommand(server, commandSender, args); - if (args.length > 1) { if (args[0].equalsIgnoreCase("help")) @@ -53,18 +40,18 @@ public class SubCommandNetwork extends SubCommandBase try { ValidCommands command = ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH)); - command.run(player, commandSender, isBounded(0, 2, args.length), args); + command.run(player, commandSender, args.length > 0 && args.length < 2, args); } catch (IllegalArgumentException e) { } } catch (PlayerNotFoundException e) { - displayErrorString(commandSender, e.getLocalizedMessage()); + CommandBloodMagic.displayErrorString(commandSender, e.getLocalizedMessage()); } } else { - displayErrorString(commandSender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.missing"); } } @@ -77,7 +64,7 @@ public class SubCommandNetwork extends SubCommandBase { if (displayHelp) { - displayHelpString(sender, this.help); + CommandBloodMagic.displayHelpString(sender, this.help); return; } @@ -87,14 +74,14 @@ public class SubCommandNetwork extends SubCommandBase { int amount = Integer.parseInt(args[2]); NetworkHelper.syphonAndDamage(NetworkHelper.getSoulNetwork(player), player, amount); - displaySuccessString(sender, "commands.network.syphon.success", amount, player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.network.syphon.success", amount, player.getDisplayName().getFormattedText()); } else { - displayErrorString(sender, "commands.error.arg.invalid"); + CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); } } else { - displayErrorString(sender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); } } }, @@ -105,7 +92,7 @@ public class SubCommandNetwork extends SubCommandBase { if (displayHelp) { - displayHelpString(sender, this.help); + CommandBloodMagic.displayHelpString(sender, this.help); return; } @@ -117,14 +104,14 @@ public class SubCommandNetwork extends SubCommandBase { int amount = Integer.parseInt(args[2]); int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); - displaySuccessString(sender, "commands.network.add.success", network.add(amount, maxOrb), player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.network.add.success", network.add(amount, maxOrb), player.getDisplayName().getFormattedText()); } else { - displayErrorString(sender, "commands.error.arg.invalid"); + CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); } } else { - displayErrorString(sender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); } } }, @@ -135,7 +122,7 @@ public class SubCommandNetwork extends SubCommandBase { if (displayHelp) { - displayHelpString(sender, this.help); + CommandBloodMagic.displayHelpString(sender, this.help); return; } @@ -147,14 +134,14 @@ public class SubCommandNetwork extends SubCommandBase { int amount = Integer.parseInt(args[2]); network.setCurrentEssence(amount); - displaySuccessString(sender, "commands.network.set.success", player.getDisplayName().getFormattedText(), amount); + CommandBloodMagic.displaySuccessString(sender, "commands.network.set.success", player.getDisplayName().getFormattedText(), amount); } else { - displayErrorString(sender, "commands.error.arg.invalid"); + CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); } } else { - displayErrorString(sender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); } } }, @@ -165,14 +152,14 @@ public class SubCommandNetwork extends SubCommandBase { if (displayHelp) { - displayHelpString(sender, this.help); + CommandBloodMagic.displayHelpString(sender, this.help); return; } SoulNetwork network = NetworkHelper.getSoulNetwork(player); if (args.length > 1) - sender.addChatMessage(new TextComponentString(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.divination.currentEssence", network.getCurrentEssence()))); + sender.sendMessage(new TextComponentString(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.divination.currentEssence", network.getCurrentEssence()))); } }, @@ -183,7 +170,7 @@ public class SubCommandNetwork extends SubCommandBase { if (displayHelp) { - displayHelpString(sender, this.help, Integer.MAX_VALUE); + CommandBloodMagic.displayHelpString(sender, this.help, Integer.MAX_VALUE); return; } @@ -192,7 +179,7 @@ public class SubCommandNetwork extends SubCommandBase if (args.length > 1) { network.setCurrentEssence(Integer.MAX_VALUE); - displaySuccessString(sender, "commands.network.fill.success", player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.network.fill.success", player.getDisplayName().getFormattedText()); } } }, @@ -203,7 +190,7 @@ public class SubCommandNetwork extends SubCommandBase { if (displayHelp) { - displayHelpString(sender, this.help); + CommandBloodMagic.displayHelpString(sender, this.help); return; } @@ -213,7 +200,7 @@ public class SubCommandNetwork extends SubCommandBase { int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); network.setCurrentEssence(maxOrb); - displaySuccessString(sender, "commands.network.cap.success", player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.network.cap.success", player.getDisplayName().getFormattedText()); } } }, diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java index e66fbdb7..d982059b 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -3,44 +3,32 @@ package WayofTime.bloodmagic.command.sub; import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.command.SubCommandBase; +import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.command.PlayerNotFoundException; +import net.minecraft.command.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentString; import java.util.Locale; -public class SubCommandOrb extends SubCommandBase +public class SubCommandOrb extends CommandBase { - - public SubCommandOrb(ICommand parent) - { - super(parent, "orb"); + @Override + public String getName() { + return "orb"; } @Override - public String getArgUsage(ICommandSender commandSender) + public String getUsage(ICommandSender commandSender) { return TextHelper.localizeEffect("commands.orb.usage"); } @Override - public String getHelpText() + public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { - return TextHelper.localizeEffect("commands.orb.help"); - } - - @Override - public void processSubCommand(MinecraftServer server, ICommandSender commandSender, String[] args) - { - super.processSubCommand(server, commandSender, args); - if (args.length > 0) { @@ -58,7 +46,7 @@ public class SubCommandOrb extends SubCommandBase String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); SoulNetwork network = NetworkHelper.getSoulNetwork(uuid); - boolean displayHelp = isBounded(0, 2, args.length); + boolean displayHelp = args.length > 0 && args.length < 2; try { @@ -68,7 +56,7 @@ public class SubCommandOrb extends SubCommandBase { if (displayHelp) { - displayHelpString(commandSender, ValidCommands.SET.help); + CommandBloodMagic.displayHelpString(commandSender, ValidCommands.SET.help); break; } @@ -78,14 +66,14 @@ public class SubCommandOrb extends SubCommandBase { int amount = Integer.parseInt(args[2]); network.setOrbTier(amount); - displaySuccessString(commandSender, "commands.success"); + CommandBloodMagic.displaySuccessString(commandSender, "commands.success"); } else { - displayErrorString(commandSender, "commands.error.arg.invalid"); + CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.invalid"); } } else { - displayErrorString(commandSender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.missing"); } break; @@ -94,23 +82,23 @@ public class SubCommandOrb extends SubCommandBase { if (displayHelp) { - displayHelpString(commandSender, ValidCommands.GET.help); + CommandBloodMagic.displayHelpString(commandSender, ValidCommands.GET.help); break; } if (args.length > 1) - commandSender.addChatMessage(new TextComponentString(TextHelper.localizeEffect("message.orb.currenttier", network.getOrbTier()))); + commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect("message.orb.currenttier", network.getOrbTier()))); break; } } } catch (IllegalArgumentException e) { - displayErrorString(commandSender, "commands.error.404"); + CommandBloodMagic.displayErrorString(commandSender, "commands.error.404"); } } catch (PlayerNotFoundException e) { - displayErrorString(commandSender, "commands.error.404"); + CommandBloodMagic.displayErrorString(commandSender, "commands.error.404"); } } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/CompatibilityWaila.java b/src/main/java/WayofTime/bloodmagic/compat/waila/CompatibilityWaila.java index 22a5cbdd..8ef1264e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/CompatibilityWaila.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/CompatibilityWaila.java @@ -15,7 +15,7 @@ public class CompatibilityWaila implements ICompatibility @Override public String getModId() { - return "Waila"; + return "waila"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index 51846c0f..c362e1cc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -17,8 +17,8 @@ import net.minecraft.world.World; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidHandler; -import WayofTime.bloodmagic.api.Constants; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; public class ItemSigilLava extends ItemSigilBase { @@ -28,8 +28,9 @@ public class ItemSigilLava extends ItemSigilBase } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -49,35 +50,36 @@ public class ItemSigilLava extends ItemSigilBase if (!world.isBlockModifiable(player, blockpos)) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } BlockPos blockpos1 = blockpos.offset(rayTrace.sideHit); if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } } } } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); if (world.isRemote || player.isSneaking() || isUnusable(stack)) { return EnumActionResult.FAIL; @@ -88,14 +90,15 @@ public class ItemSigilLava extends ItemSigilBase } TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof IFluidHandler) + if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { + IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000); - int amount = ((IFluidHandler) tile).fill(side, fluid, false); + int amount = handler.fill(fluid, false); if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { - ((IFluidHandler) tile).fill(side, fluid, true); + handler.fill(fluid, true); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 1c3c383d..00ece993 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -649,7 +649,7 @@ public class Utils for (int i = 0; i < handler.getSlots(); i++) { - if (handler.getStackInSlot(i) == null) + if (handler.getStackInSlot(i).isEmpty()) { slots++; } @@ -658,7 +658,7 @@ public class Utils { for (int i = 0; i < ((IInventory) tile).getSizeInventory(); i++) { - if (((IInventory) tile).getStackInSlot(i) == null) + if (((IInventory) tile).getStackInSlot(i).isEmpty()) { slots++; } @@ -677,9 +677,9 @@ public class Utils for (int slot = 0; slot < numberOfSlots; slot++) { copyStack = handler.insertItem(slot, copyStack, false); - if (copyStack == null) + if (copyStack.isEmpty()) { - return null; + return ItemStack.EMPTY; } } From f5a68adc2ecb10edc545a08cd754149dc6cb5e16 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 1 Jan 2017 21:49:52 -0800 Subject: [PATCH 003/595] Remove all the package-info.java's Except the API one --- .../bloodmagic/alchemyArray/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/altar/package-info.java | 7 ------- .../bloodmagic/api/alchemyCrafting/package-info.java | 7 ------- .../WayofTime/bloodmagic/api/altar/package-info.java | 7 ------- .../bloodmagic/api/compress/package-info.java | 7 ------- .../WayofTime/bloodmagic/api/event/package-info.java | 7 ------- .../WayofTime/bloodmagic/api/iface/package-info.java | 7 ------- .../WayofTime/bloodmagic/api/impl/package-info.java | 7 ------- .../WayofTime/bloodmagic/api/incense/package-info.java | 7 ------- .../bloodmagic/api/livingArmour/package-info.java | 7 ------- .../WayofTime/bloodmagic/api/orb/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/api/package-info.java | 10 ++-------- .../WayofTime/bloodmagic/api/recipe/package-info.java | 7 ------- .../bloodmagic/api/registry/package-info.java | 7 ------- .../WayofTime/bloodmagic/api/ritual/package-info.java | 7 ------- .../WayofTime/bloodmagic/api/soul/package-info.java | 7 ------- .../bloodmagic/api/teleport/package-info.java | 7 ------- .../bloodmagic/api/util/helper/package-info.java | 7 ------- .../WayofTime/bloodmagic/block/base/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/block/package-info.java | 7 ------- .../bloodmagic/block/property/package-info.java | 7 ------- .../bloodmagic/client/gui/config/package-info.java | 7 ------- .../WayofTime/bloodmagic/client/gui/package-info.java | 7 ------- .../bloodmagic/client/helper/package-info.java | 7 ------- .../WayofTime/bloodmagic/client/mesh/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/client/package-info.java | 7 ------- .../client/render/alchemyArray/package-info.java | 7 ------- .../bloodmagic/client/render/block/package-info.java | 7 ------- .../bloodmagic/client/render/entity/package-info.java | 7 ------- .../bloodmagic/client/render/package-info.java | 7 ------- .../WayofTime/bloodmagic/command/sub/package-info.java | 7 ------- .../bloodmagic/compat/guideapi/book/package-info.java | 7 ------- .../bloodmagic/compat/guideapi/entry/package-info.java | 7 ------- .../bloodmagic/compat/guideapi/package-info.java | 8 -------- .../bloodmagic/compat/guideapi/page/package-info.java | 7 ------- .../guideapi/page/recipeRenderer/package-info.java | 7 ------- .../compat/jei/alchemyArray/package-info.java | 7 ------- .../compat/jei/alchemyTable/package-info.java | 7 ------- .../bloodmagic/compat/jei/altar/package-info.java | 7 ------- .../compat/jei/armourDowngrade/package-info.java | 7 ------- .../bloodmagic/compat/jei/binding/package-info.java | 7 ------- .../bloodmagic/compat/jei/forge/package-info.java | 7 ------- .../bloodmagic/compat/jei/orb/package-info.java | 7 ------- .../WayofTime/bloodmagic/compat/jei/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/compat/package-info.java | 7 ------- .../bloodmagic/compat/waila/package-info.java | 7 ------- .../bloodmagic/compat/waila/provider/package-info.java | 7 ------- .../WayofTime/bloodmagic/compress/package-info.java | 7 ------- .../WayofTime/bloodmagic/demonAura/package-info.java | 7 ------- .../bloodmagic/entity/projectile/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/fuel/package-info.java | 7 ------- .../WayofTime/bloodmagic/incense/package-info.java | 7 ------- .../bloodmagic/item/alchemy/package-info.java | 7 ------- .../WayofTime/bloodmagic/item/armour/package-info.java | 7 ------- .../WayofTime/bloodmagic/item/block/package-info.java | 7 ------- .../WayofTime/bloodmagic/item/gear/package-info.java | 7 ------- .../bloodmagic/item/inventory/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/item/package-info.java | 7 ------- .../bloodmagic/item/routing/package-info.java | 7 ------- .../WayofTime/bloodmagic/item/sigil/package-info.java | 7 ------- .../WayofTime/bloodmagic/item/soul/package-info.java | 7 ------- .../bloodmagic/livingArmour/package-info.java | 7 ------- .../bloodmagic/livingArmour/tracker/package-info.java | 7 ------- .../bloodmagic/livingArmour/upgrade/package-info.java | 7 ------- .../WayofTime/bloodmagic/network/package-info.java | 7 ------- src/main/java/WayofTime/bloodmagic/package-info.java | 6 ------ .../java/WayofTime/bloodmagic/potion/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/proxy/package-info.java | 7 ------- .../WayofTime/bloodmagic/registry/package-info.java | 7 ------- .../bloodmagic/ritual/harvest/package-info.java | 7 ------- .../bloodmagic/ritual/imperfect/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/ritual/package-info.java | 7 ------- .../bloodmagic/ritual/portal/package-info.java | 7 ------- .../WayofTime/bloodmagic/routing/package-info.java | 7 ------- .../bloodmagic/tile/container/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/tile/package-info.java | 7 ------- .../bloodmagic/tile/routing/package-info.java | 7 ------- .../bloodmagic/util/handler/package-info.java | 7 ------- .../WayofTime/bloodmagic/util/helper/package-info.java | 7 ------- .../java/WayofTime/bloodmagic/util/package-info.java | 7 ------- 80 files changed, 2 insertions(+), 561 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/altar/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/altar/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/compress/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/event/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/iface/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/incense/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/livingArmour/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/orb/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/recipe/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/registry/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/ritual/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/soul/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/teleport/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/util/helper/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/property/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/config/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/helper/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/mesh/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/block/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/book/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/page/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/altar/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/binding/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/forge/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/orb/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/provider/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compress/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/demonAura/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/projectile/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/fuel/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/alchemy/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/armour/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/block/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/gear/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/inventory/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/network/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/potion/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/proxy/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/harvest/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/imperfect/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/portal/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/container/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/routing/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/handler/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/package-info.java diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/package-info.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/package-info.java deleted file mode 100644 index 26146be9..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.alchemyArray; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/altar/package-info.java b/src/main/java/WayofTime/bloodmagic/altar/package-info.java deleted file mode 100644 index 09fb9ffc..00000000 --- a/src/main/java/WayofTime/bloodmagic/altar/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.altar; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/package-info.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/package-info.java deleted file mode 100644 index 4d8e0bce..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.alchemyCrafting; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/package-info.java b/src/main/java/WayofTime/bloodmagic/api/altar/package-info.java deleted file mode 100644 index 2da60236..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/altar/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.altar; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/compress/package-info.java b/src/main/java/WayofTime/bloodmagic/api/compress/package-info.java deleted file mode 100644 index d630cf23..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/compress/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.compress; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/event/package-info.java b/src/main/java/WayofTime/bloodmagic/api/event/package-info.java deleted file mode 100644 index 311179bc..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/event/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.event; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/package-info.java b/src/main/java/WayofTime/bloodmagic/api/iface/package-info.java deleted file mode 100644 index d1022e5d..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/iface/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.iface; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/package-info.java b/src/main/java/WayofTime/bloodmagic/api/impl/package-info.java deleted file mode 100644 index 79e9503c..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/impl/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.impl; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/package-info.java b/src/main/java/WayofTime/bloodmagic/api/incense/package-info.java deleted file mode 100644 index a1f33e28..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/incense/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.incense; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/package-info.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/package-info.java deleted file mode 100644 index 0c4b0d82..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.livingArmour; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/orb/package-info.java b/src/main/java/WayofTime/bloodmagic/api/orb/package-info.java deleted file mode 100644 index 12df1f09..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/orb/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.orb; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/package-info.java b/src/main/java/WayofTime/bloodmagic/api/package-info.java index f516a3de..8700523a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/package-info.java +++ b/src/main/java/WayofTime/bloodmagic/api/package-info.java @@ -1,10 +1,4 @@ -@API(owner = "BloodMagic", provides = "BloodMagic|API", apiVersion = "@VERSION@") -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault +@API(owner = Constants.Mod.MODID, provides = Constants.Mod.MODID + "|API", apiVersion = Constants.Mod.VERSION) package WayofTime.bloodmagic.api; -import mcp.MethodsReturnNonnullByDefault; -import net.minecraftforge.fml.common.API; - -import javax.annotation.ParametersAreNonnullByDefault; - +import net.minecraftforge.fml.common.API; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/package-info.java b/src/main/java/WayofTime/bloodmagic/api/recipe/package-info.java deleted file mode 100644 index 0df6d474..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.recipe; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/package-info.java b/src/main/java/WayofTime/bloodmagic/api/registry/package-info.java deleted file mode 100644 index 3f16ccd3..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/registry/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.registry; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/package-info.java b/src/main/java/WayofTime/bloodmagic/api/ritual/package-info.java deleted file mode 100644 index b0c44863..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.ritual; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/package-info.java b/src/main/java/WayofTime/bloodmagic/api/soul/package-info.java deleted file mode 100644 index d248248c..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/soul/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.soul; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/package-info.java b/src/main/java/WayofTime/bloodmagic/api/teleport/package-info.java deleted file mode 100644 index 64276d1a..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.teleport; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/package-info.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/package-info.java deleted file mode 100644 index 6e2b5bcb..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.util.helper; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/base/package-info.java b/src/main/java/WayofTime/bloodmagic/block/base/package-info.java deleted file mode 100644 index 21c18a65..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.block.base; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/package-info.java b/src/main/java/WayofTime/bloodmagic/block/package-info.java deleted file mode 100644 index 1043d727..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.block; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/property/package-info.java b/src/main/java/WayofTime/bloodmagic/block/property/package-info.java deleted file mode 100644 index ace8db97..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/property/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.block.property; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/config/package-info.java b/src/main/java/WayofTime/bloodmagic/client/gui/config/package-info.java deleted file mode 100644 index 31a6c581..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/config/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client.gui.config; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/package-info.java b/src/main/java/WayofTime/bloodmagic/client/gui/package-info.java deleted file mode 100644 index 7ba8bbd0..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client.gui; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/helper/package-info.java b/src/main/java/WayofTime/bloodmagic/client/helper/package-info.java deleted file mode 100644 index 798e55d3..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/helper/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client.helper; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/package-info.java b/src/main/java/WayofTime/bloodmagic/client/mesh/package-info.java deleted file mode 100644 index 8e65a180..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client.mesh; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/package-info.java b/src/main/java/WayofTime/bloodmagic/client/package-info.java deleted file mode 100644 index eb0fbfaa..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/package-info.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/package-info.java deleted file mode 100644 index 39585689..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client.render.alchemyArray; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/package-info.java b/src/main/java/WayofTime/bloodmagic/client/render/block/package-info.java deleted file mode 100644 index 75b9947e..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client.render.block; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/package-info.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/package-info.java deleted file mode 100644 index fdf48817..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client.render.entity; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/package-info.java b/src/main/java/WayofTime/bloodmagic/client/render/package-info.java deleted file mode 100644 index e465b881..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.client.render; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/package-info.java b/src/main/java/WayofTime/bloodmagic/command/sub/package-info.java deleted file mode 100644 index 04788ab8..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/sub/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.command.sub; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/package-info.java deleted file mode 100644 index 45901a67..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.guideapi.book; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/package-info.java deleted file mode 100644 index 6e1727c4..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.guideapi.entry; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/package-info.java deleted file mode 100644 index 2469a557..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -//@ParametersAreNonnullByDefault -//@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.guideapi; - -// -//import mcp.MethodsReturnNonnullByDefault; -// -//import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/package-info.java deleted file mode 100644 index 01727b53..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.guideapi.page; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/package-info.java deleted file mode 100644 index e108a88f..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.guideapi.page.recipeRenderer; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/package-info.java deleted file mode 100644 index b9a88570..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.jei.alchemyArray; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/package-info.java deleted file mode 100644 index c7a5c86b..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.jei.alchemyTable; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/package-info.java deleted file mode 100644 index 4fb6eef6..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.jei.altar; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/package-info.java deleted file mode 100644 index cd9bdf10..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.jei.armourDowngrade; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/package-info.java deleted file mode 100644 index b63096ff..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.jei.binding; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/package-info.java deleted file mode 100644 index cc0c044a..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.jei.forge; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/package-info.java deleted file mode 100644 index a9b8d95a..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.jei.orb; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/jei/package-info.java deleted file mode 100644 index 7ce52522..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.jei; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/package-info.java deleted file mode 100644 index 302c3ae6..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/waila/package-info.java deleted file mode 100644 index f2879261..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.waila; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/package-info.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/package-info.java deleted file mode 100644 index 6e1d3506..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compat.waila.provider; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compress/package-info.java b/src/main/java/WayofTime/bloodmagic/compress/package-info.java deleted file mode 100644 index d8b253d4..00000000 --- a/src/main/java/WayofTime/bloodmagic/compress/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.compress; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/package-info.java b/src/main/java/WayofTime/bloodmagic/demonAura/package-info.java deleted file mode 100644 index 807bd734..00000000 --- a/src/main/java/WayofTime/bloodmagic/demonAura/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.demonAura; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/package-info.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/package-info.java deleted file mode 100644 index 7f6a0496..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.entity.projectile; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/fuel/package-info.java b/src/main/java/WayofTime/bloodmagic/fuel/package-info.java deleted file mode 100644 index 54f2718e..00000000 --- a/src/main/java/WayofTime/bloodmagic/fuel/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.fuel; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/incense/package-info.java b/src/main/java/WayofTime/bloodmagic/incense/package-info.java deleted file mode 100644 index ebb51c99..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.incense; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/package-info.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/package-info.java deleted file mode 100644 index a96a3d45..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item.alchemy; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/package-info.java b/src/main/java/WayofTime/bloodmagic/item/armour/package-info.java deleted file mode 100644 index d6803eed..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/armour/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item.armour; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/block/package-info.java b/src/main/java/WayofTime/bloodmagic/item/block/package-info.java deleted file mode 100644 index 67b9b28e..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/block/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item.block; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/package-info.java b/src/main/java/WayofTime/bloodmagic/item/gear/package-info.java deleted file mode 100644 index 8cfd7cd2..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/gear/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item.gear; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/package-info.java b/src/main/java/WayofTime/bloodmagic/item/inventory/package-info.java deleted file mode 100644 index 3b114989..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item.inventory; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/package-info.java b/src/main/java/WayofTime/bloodmagic/item/package-info.java deleted file mode 100644 index 71e26b95..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/package-info.java b/src/main/java/WayofTime/bloodmagic/item/routing/package-info.java deleted file mode 100644 index 02b38ed2..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/routing/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item.routing; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/package-info.java b/src/main/java/WayofTime/bloodmagic/item/sigil/package-info.java deleted file mode 100644 index 8ec040b9..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item.sigil; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/package-info.java b/src/main/java/WayofTime/bloodmagic/item/soul/package-info.java deleted file mode 100644 index 1be2245d..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.item.soul; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/package-info.java b/src/main/java/WayofTime/bloodmagic/livingArmour/package-info.java deleted file mode 100644 index 4b5564f8..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.livingArmour; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/package-info.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/package-info.java deleted file mode 100644 index 317f24d4..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.livingArmour.tracker; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/package-info.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/package-info.java deleted file mode 100644 index 7d4f11a7..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.livingArmour.upgrade; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/network/package-info.java b/src/main/java/WayofTime/bloodmagic/network/package-info.java deleted file mode 100644 index c62e2432..00000000 --- a/src/main/java/WayofTime/bloodmagic/network/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.network; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/package-info.java b/src/main/java/WayofTime/bloodmagic/package-info.java deleted file mode 100644 index 96b3c820..00000000 --- a/src/main/java/WayofTime/bloodmagic/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic; - -import mcp.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/potion/package-info.java b/src/main/java/WayofTime/bloodmagic/potion/package-info.java deleted file mode 100644 index 683d1cac..00000000 --- a/src/main/java/WayofTime/bloodmagic/potion/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.potion; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/proxy/package-info.java b/src/main/java/WayofTime/bloodmagic/proxy/package-info.java deleted file mode 100644 index f4ee72c8..00000000 --- a/src/main/java/WayofTime/bloodmagic/proxy/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.proxy; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/registry/package-info.java b/src/main/java/WayofTime/bloodmagic/registry/package-info.java deleted file mode 100644 index 3a0366cc..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.registry; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/package-info.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/package-info.java deleted file mode 100644 index f6c9453d..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.ritual.harvest; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file 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/package-info.java b/src/main/java/WayofTime/bloodmagic/ritual/package-info.java deleted file mode 100644 index 9305015f..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.ritual; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/package-info.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/package-info.java deleted file mode 100644 index f64d991e..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.ritual.portal; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/routing/package-info.java b/src/main/java/WayofTime/bloodmagic/routing/package-info.java deleted file mode 100644 index 0271d921..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.routing; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/package-info.java b/src/main/java/WayofTime/bloodmagic/tile/container/package-info.java deleted file mode 100644 index a249a1d0..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/container/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.tile.container; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/package-info.java b/src/main/java/WayofTime/bloodmagic/tile/package-info.java deleted file mode 100644 index 25a795be..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.tile; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/package-info.java b/src/main/java/WayofTime/bloodmagic/tile/routing/package-info.java deleted file mode 100644 index 6156b264..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.tile.routing; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/package-info.java b/src/main/java/WayofTime/bloodmagic/util/handler/package-info.java deleted file mode 100644 index f5a9d369..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/handler/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.util.handler; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/package-info.java b/src/main/java/WayofTime/bloodmagic/util/helper/package-info.java deleted file mode 100644 index 338a7367..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.util.helper; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/package-info.java b/src/main/java/WayofTime/bloodmagic/util/package-info.java deleted file mode 100644 index f2d1940d..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.util; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file From 128b3d29b069066fa9ada274349a95a1612510de Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 1 Jan 2017 21:50:35 -0800 Subject: [PATCH 004/595] Lowercase modid --- src/main/java/WayofTime/bloodmagic/api/Constants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index c9abbbfd..626e228b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -132,11 +132,11 @@ public class Constants public static class Mod { - public static final String MODID = "BloodMagic"; + public static final String MODID = "bloodmagic"; public static final String DOMAIN = MODID.toLowerCase(Locale.ENGLISH) + ":"; public static final String NAME = "Blood Magic: Alchemical Wizardry"; public static final String VERSION = "@VERSION@"; - public static final String DEPEND = "required-after:Forge@[12.16.0.1840,);after:JEI@[2.23.0,);required-after:guideapi;"; + public static final String DEPEND = "required-after:guideapi;"; } public static final class Gui From 51e10eaad2c5c26d72fce405fbf3067666c0c155 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 1 Jan 2017 22:26:42 -0800 Subject: [PATCH 005/595] Everything else except sigils --- .../item/ItemActivationCrystal.java | 3 +- .../bloodmagic/item/ItemAltarMaker.java | 15 ++-- .../bloodmagic/item/ItemArcaneAshes.java | 3 +- .../bloodmagic/item/ItemBloodOrb.java | 18 ++-- .../bloodmagic/item/ItemBloodShard.java | 3 +- .../bloodmagic/item/ItemBoundAxe.java | 9 +- .../bloodmagic/item/ItemBoundPickaxe.java | 10 +-- .../bloodmagic/item/ItemBoundShovel.java | 10 +-- .../bloodmagic/item/ItemBoundSword.java | 12 +-- .../bloodmagic/item/ItemBoundTool.java | 12 +-- .../bloodmagic/item/ItemComponent.java | 5 +- .../item/ItemDaggerOfSacrifice.java | 6 +- .../bloodmagic/item/ItemDemonCrystal.java | 11 +-- .../bloodmagic/item/ItemExperienceBook.java | 5 +- .../bloodmagic/item/ItemInscriptionTool.java | 6 +- .../bloodmagic/item/ItemLavaCrystal.java | 2 +- .../bloodmagic/item/ItemRitualDiviner.java | 32 +++---- .../bloodmagic/item/ItemRitualReader.java | 19 ++-- .../item/ItemSacrificialDagger.java | 17 ++-- .../bloodmagic/item/ItemSanguineBook.java | 17 ++-- .../WayofTime/bloodmagic/item/ItemSlate.java | 3 +- .../item/ItemTelepositionFocus.java | 9 +- .../bloodmagic/item/ItemUpgradeTome.java | 18 ++-- .../bloodmagic/item/ItemUpgradeTrainer.java | 3 +- .../item/alchemy/ItemCuttingFluid.java | 3 +- .../ItemLivingArmourPointsUpgrade.java | 11 +-- .../item/armour/ItemSentientArmour.java | 23 +++-- .../item/block/ItemBlockBloodTank.java | 86 +------------------ .../item/block/base/ItemBlockEnum.java | 2 +- .../item/block/base/ItemBlockString.java | 2 +- .../item/gear/ItemPackSacrifice.java | 7 +- .../item/gear/ItemPackSelfSacrifice.java | 7 +- .../item/inventory/ContainerHolding.java | 26 +++--- .../item/inventory/InventoryHolding.java | 2 +- .../item/inventory/ItemInventory.java | 25 +++--- .../item/routing/ItemNodeRouter.java | 3 +- .../item/routing/ItemRouterFilter.java | 9 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 3 +- .../item/soul/ItemSentientArmourGem.java | 9 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 32 +++---- .../bloodmagic/item/soul/ItemSentientBow.java | 21 ++--- .../item/soul/ItemSentientPickaxe.java | 31 ++++--- .../item/soul/ItemSentientShovel.java | 32 +++---- .../item/soul/ItemSentientSword.java | 33 ++++--- .../bloodmagic/item/soul/ItemSoulGem.java | 10 +-- .../bloodmagic/item/soul/ItemSoulSnare.java | 18 ++-- 46 files changed, 289 insertions(+), 354 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index a723262b..13a0a7b1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -7,6 +7,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -35,7 +36,7 @@ public class ItemActivationCrystal extends ItemBindableBase implements IVariantP @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 74ad1c20..ae9b2aa6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -57,15 +57,16 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (world.isRemote) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (!player.capabilities.isCreativeMode) { ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.BloodMagic.altarMaker.creativeOnly")); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } stack = NBTHelper.checkNBT(stack); @@ -79,12 +80,12 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP setTierToBuild(EnumAltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]); ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.BloodMagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } RayTraceResult rayTrace = rayTrace(world, player, false); if (rayTrace == null || rayTrace.typeOfHit == RayTraceResult.Type.MISS || rayTrace.typeOfHit == RayTraceResult.Type.ENTITY) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK && world.getBlockState(rayTrace.getBlockPos()).getBlock() instanceof BlockAltar) { @@ -95,7 +96,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP world.notifyBlockUpdate(rayTrace.getBlockPos(), state, state, 3); } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override @@ -132,7 +133,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP public String destroyAltar(EntityPlayer player) { - World world = player.worldObj; + World world = player.getEntityWorld(); if (world.isRemote) return ""; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index d2d2d91c..2081305a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -43,8 +43,9 @@ public class ItemArcaneAshes extends Item implements IVariantProvider } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); BlockPos newPos = blockPos.offset(side); if (world.isAirBlock(newPos)) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 1c2aa67a..39393177 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -9,6 +9,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.SoundCategory; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -41,42 +42,43 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < OrbRegistry.getSize(); i++) list.add(new ItemStack(id, 1, i)); } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (world == null) - return super.onItemRightClick(stack, null, player, hand); + 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); // SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, // 20, world.provider.getDimensionId(), 4, posX, posY, posZ); if (PlayerHelper.isFakePlayer(player)) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (!stack.hasTagCompound()) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } if (Strings.isNullOrEmpty(getOwnerUUID(stack))) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (world.isRemote) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (getOwnerUUID(stack).equals(PlayerHelper.getUsernameFromPlayer(player))) NetworkHelper.setMaxOrb(NetworkHelper.getSoulNetwork(getOwnerUUID(stack)), getOrbLevel(stack.getItemDamage())); NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).add(200, getMaxEssence(stack.getItemDamage())); NetworkHelper.getSoulNetwork(player).hurtPlayer(player, 200); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java index 7a5665f5..ed72887e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java @@ -6,6 +6,7 @@ import WayofTime.bloodmagic.client.IVariantProvider; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -29,7 +30,7 @@ public class ItemBloodShard extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 0521def7..cafe5944 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -104,9 +104,8 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); - if (itemDrops != null) - for (ItemStack stacks : itemDrops) - drops.add(ItemStackWrapper.getHolder(stacks)); + for (ItemStack stacks : itemDrops) + drops.add(ItemStackWrapper.getHolder(stacks)); } world.setBlockToAir(blockPos); @@ -127,8 +126,8 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getActivated(stack) ? 11 : 2, 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Tool modifier", -3.0, 0)); + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index 429e905b..c5587491 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -119,10 +119,8 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider else { List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); - - if (itemDrops != null) - for (ItemStack stacks : itemDrops) - drops.add(ItemStackWrapper.getHolder(stacks)); + for (ItemStack stacks : itemDrops) + drops.add(ItemStackWrapper.getHolder(stacks)); } world.setBlockToAir(blockPos); @@ -143,8 +141,8 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getActivated(stack) ? 5 : 2, 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Tool modifier", -2.5, 0)); + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index f95b163b..c7f5b9eb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -103,10 +103,8 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider else { List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); - - if (itemDrops != null) - for (ItemStack stacks : itemDrops) - drops.add(ItemStackWrapper.getHolder(stacks)); + for (ItemStack stacks : itemDrops) + drops.add(ItemStackWrapper.getHolder(stacks)); } world.setBlockToAir(blockPos); @@ -127,8 +125,8 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", 5, 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Tool modifier", -2.5, 0)); + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index db1f9223..b8afe2d0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -19,6 +19,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -50,8 +51,9 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); @@ -65,7 +67,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable // return new ActionResult(EnumActionResult.SUCCESS, stack); // } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override @@ -88,7 +90,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item itemIn, CreativeTabs tab, List subItems) + public void getSubItems(Item itemIn, CreativeTabs tab, NonNullList subItems) { subItems.add(Utils.setUnbreakable(new ItemStack(itemIn))); } @@ -115,8 +117,8 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable Multimap multimap = HashMultimap.create(); if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getActivated(stack) ? 8 : 2, 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -2.4, 0)); + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 480543a8..b25a0b63 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -28,6 +28,7 @@ import net.minecraft.item.ItemTool; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -80,7 +81,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item itemIn, CreativeTabs tab, List subItems) + public void getSubItems(Item itemIn, CreativeTabs tab, NonNullList subItems) { subItems.add(Utils.setUnbreakable(new ItemStack(itemIn))); } @@ -125,8 +126,9 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); @@ -140,7 +142,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable return new ActionResult(EnumActionResult.SUCCESS, stack); } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override @@ -244,12 +246,12 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable while (count >= maxStackSize) { - world.spawnEntityInWorld(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(maxStackSize))); + world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(maxStackSize))); count -= maxStackSize; } if (count > 0) - world.spawnEntityInWorld(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(count))); + world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(count))); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java index 95c6dd63..0d4bcaa8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java @@ -7,6 +7,7 @@ import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -113,7 +114,7 @@ public class ItemComponent extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.size(); i++) list.add(new ItemStack(id, 1, i)); @@ -136,7 +137,7 @@ public class ItemComponent extends Item implements IVariantProvider public static ItemStack getStack(String key, int stackSize) { ItemStack stack = getStack(key); - stack.stackSize = stackSize; + stack.setCount(stackSize); return stack; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index abdbb755..06ad4c91 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -37,7 +37,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider @Override public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { - if (target == null || attacker == null || attacker.worldObj.isRemote || (attacker instanceof EntityPlayer && !(attacker instanceof EntityPlayerMP))) + if (target == null || attacker == null || attacker.getEntityWorld().isRemote || (attacker instanceof EntityPlayer && !(attacker instanceof EntityPlayerMP))) return false; if (!target.isNonBoss()) @@ -67,9 +67,9 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider lifeEssence = (int) (lifeEssence * (1 + PurificationHelper.getCurrentPurity((EntityAnimal) target))); } - if (PlayerSacrificeHelper.findAndFillAltar(attacker.worldObj, target, lifeEssence, true)) + if (PlayerSacrificeHelper.findAndFillAltar(attacker.getEntityWorld(), target, lifeEssence, true)) { - target.worldObj.playSound(null, target.posX, target.posY, target.posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (target.worldObj.rand.nextFloat() - target.worldObj.rand.nextFloat()) * 0.8F); + 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(BloodMagicAPI.getDamageSource()); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java index 649bf361..1eb88a7b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java @@ -7,6 +7,7 @@ import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; 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; @@ -60,7 +61,7 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.size(); i++) list.add(new ItemStack(id, 1, i)); @@ -74,18 +75,18 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria @Override public double getWill(ItemStack willStack) { - return getDiscretization(willStack) * willStack.stackSize; + 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.stackSize * discretization, drainAmount) / discretization); + int drainedNumber = (int) Math.floor(Math.min(willStack.getCount() * discretization, drainAmount) / discretization); if (drainedNumber > 0) { - willStack.stackSize -= drainedNumber; + willStack.shrink(drainedNumber); return drainedNumber * discretization; } @@ -101,7 +102,7 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria @Override public EnumDemonWillType getType(ItemStack willStack) { - return EnumDemonWillType.values()[MathHelper.clamp_int(willStack.getMetadata(), 0, EnumDemonWillType.values().length - 1)]; + return EnumDemonWillType.values()[MathHelper.clamp(willStack.getMetadata(), 0, EnumDemonWillType.values().length - 1)]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 8d0063f9..7b29b518 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -56,8 +56,9 @@ public class ItemExperienceBook extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (!world.isRemote) { if (player.isSneaking()) @@ -95,7 +96,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider if (player.experienceLevel % 5 == 0) { float f = player.experienceLevel > 30 ? 1.0F : (float) player.experienceLevel / 30.0F; - player.worldObj.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_LEVELUP, player.getSoundCategory(), f * 0.75F, 1.0F); + player.getEntityWorld().playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_LEVELUP, player.getSoundCategory(), f * 0.75F, 1.0F); } } else { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 2483ab51..e92cf79c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -12,6 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -45,7 +46,7 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 1; i < EnumRuneType.values().length; i++) { @@ -56,8 +57,9 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); IBlockState state = world.getBlockState(pos); if (state.getBlock() instanceof BlockRitualStone && !((BlockRitualStone) state.getBlock()).isRuneType(world, pos, getType(stack))) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index 3cd4b88f..d7efd026 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -34,7 +34,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IFuelHandler, I NetworkHelper.getSoulNetwork(this.getOwnerUUID(itemStack)).syphon(25); ItemStack copiedStack = itemStack.copy(); copiedStack.setItemDamage(copiedStack.getItemDamage()); - copiedStack.stackSize = 1; + copiedStack.setCount(1); return copiedStack; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index 3a4154a6..e3170e25 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -15,11 +15,7 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -81,15 +77,16 @@ public class ItemRitualDiviner extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); if (player.isSneaking()) { if (world.isRemote) @@ -214,12 +211,11 @@ public class ItemRitualDiviner extends Item implements IVariantProvider return true; } - ItemStack[] inventory = player.inventory.mainInventory; - for (int i = 0; i < inventory.length; i++) + NonNullList inventory = player.inventory.mainInventory; + for (ItemStack newStack : inventory) { - ItemStack newStack = inventory[i]; - if (newStack == null) - { + if (newStack.isEmpty()) { + continue; } Item item = newStack.getItem(); @@ -228,12 +224,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider Block block = ((ItemBlock) item).getBlock(); if (block == ModBlocks.RITUAL_STONE) { - newStack.stackSize--; - if (newStack.stackSize <= 0) - { - inventory[i] = null; - } - + newStack.shrink(1); return true; } } @@ -344,8 +335,9 @@ public class ItemRitualDiviner extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); RayTraceResult ray = this.rayTrace(world, player, false); if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { @@ -372,7 +364,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { EntityPlayer player = (EntityPlayer) entityLiving; - RayTraceResult ray = this.rayTrace(player.worldObj, player, false); + RayTraceResult ray = this.rayTrace(player.getEntityWorld(), player, false); if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { return false; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 12ef782b..9aaaed23 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -9,10 +9,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.TextComponentTranslation; @@ -71,8 +68,9 @@ public class ItemRitualReader extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); RayTraceResult ray = this.rayTrace(world, player, false); if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { @@ -93,8 +91,9 @@ public class ItemRitualReader extends Item implements IVariantProvider } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); if (!world.isRemote) { EnumRitualReaderState state = this.getState(stack); @@ -123,11 +122,11 @@ public class ItemRitualReader extends Item implements IVariantProvider break; case SET_WILL_TYPES: List typeList = new ArrayList(); - ItemStack[] inv = player.inventory.mainInventory; + NonNullList inv = player.inventory.mainInventory; for (int i = 0; i < 9; i++) { - ItemStack testStack = inv[i]; - if (testStack == null) + ItemStack testStack = inv.get(i); + if (testStack.isEmpty()) { continue; } @@ -177,7 +176,7 @@ public class ItemRitualReader extends Item implements IVariantProvider } } - return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ); + return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); } public BlockPos getBlockPos(ItemStack stack) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 29ebda58..effde62c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -63,7 +63,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); @@ -81,7 +81,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider @Override public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft) { - if (entityLiving instanceof EntityPlayer && !entityLiving.worldObj.isRemote) + if (entityLiving instanceof EntityPlayer && !entityLiving.getEntityWorld().isRemote) PlayerSacrificeHelper.sacrificePlayerHealth((EntityPlayer) entityLiving); } @@ -98,10 +98,11 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (this.canUseForSacrifice(stack)) { @@ -124,7 +125,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider { SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, ConfigHandler.sacrificialDaggerDamage, lpAdded); if (MinecraftForge.EVENT_BUS.post(evt)) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (evt.shouldDrainHealth) { @@ -140,7 +141,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider } if (!evt.shouldFillAltar) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); lpAdded = evt.lpAdded; } @@ -154,12 +155,12 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider 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)) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); // TODO - Check if SoulFray is active PlayerSacrificeHelper.findAndFillAltar(world, player, lpAdded, false); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index 4fb5aa1d..d654b58f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -44,10 +44,10 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (world.isRemote) - return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ); + return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); IBlockState hitState = world.getBlockState(pos); if (player.isSneaking()) @@ -60,19 +60,20 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa if (!docs.isEmpty()) { ChatUtil.sendNoSpam(player, docs.toArray(new ITextComponent[docs.size()])); - return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ); + return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); } } } - return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ); + return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (world.isRemote) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); stack = NBTHelper.checkNBT(stack); @@ -87,10 +88,10 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa currentDisplayedTier = EnumAltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]; ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.BloodMagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } public boolean trySetDisplayedTier(World world, BlockPos pos) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java index f8552ec5..de787725 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java @@ -8,6 +8,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -32,7 +33,7 @@ public class ItemSlate extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index e717c234..2323bb42 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -12,6 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -47,14 +48,14 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { if (player.isSneaking()) { @@ -62,11 +63,11 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { - setBlockPos(stack, world, mop.getBlockPos()); + setBlockPos(player.getHeldItem(hand), world, mop.getBlockPos()); } } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index 63c83d4c..6a983175 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -11,6 +11,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -41,41 +42,42 @@ public class ItemUpgradeTome extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (world.isRemote) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); if (upgrade == null) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (chestStack != null && chestStack.getItem() instanceof ItemLivingArmour) + if (chestStack.getItem() instanceof ItemLivingArmour) { LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); if (armour == null) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } if (armour.upgradeArmour(player, upgrade)) { ItemLivingArmour.setLivingArmour(chestStack, armour); // ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(stack, armour, false); - stack.stackSize--; + stack.shrink(1); } } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index df338564..ba43e781 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -12,6 +12,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -35,7 +36,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { list.add(new ItemStack(this)); for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index acb4e8ce..086cfcfe 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -9,6 +9,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -67,7 +68,7 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.size(); i++) list.add(new ItemStack(id, 1, i)); diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java index 1d6c05d2..7e71c112 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java @@ -16,6 +16,7 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -68,7 +69,7 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi if (player == null || !player.capabilities.isCreativeMode) { - --stack.stackSize; + stack.shrink(1); } if (!worldIn.isRemote) @@ -109,10 +110,10 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi } @Override - public ActionResult onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand) + public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { playerIn.setActiveHand(hand); - return new ActionResult(EnumActionResult.SUCCESS, itemStackIn); + return new ActionResult(EnumActionResult.SUCCESS, playerIn.getHeldItem(hand)); } private void buildItemList() @@ -128,7 +129,7 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.size(); i++) list.add(new ItemStack(id, 1, i)); @@ -151,7 +152,7 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi public static ItemStack getStack(String key, int stackSize) { ItemStack stack = getStack(key); - stack.stackSize = stackSize; + stack.setCount(stackSize); return stack; } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index f5dc8800..d45d9f65 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -18,6 +18,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; 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; @@ -173,12 +174,12 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes int maxAbsorption = 100000; - if (source.equals(DamageSource.drown)) + if (source.equals(DamageSource.DROWN)) { return new ArmorProperties(-1, 0, 0); } - if (source.equals(DamageSource.outOfWorld)) + if (source.equals(DamageSource.OUT_OF_WORLD)) { return new ArmorProperties(-1, 0, 0); } @@ -191,7 +192,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes ItemStack leggings = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); ItemStack boots = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); - if (helmet == null || leggings == null || boots == null) + if (helmet.isEmpty() || leggings.isEmpty() || boots.isEmpty()) { damageAmount *= (armourReduction); @@ -371,18 +372,18 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.CHEST) { - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 318145), "Armor modifier", this.getHealthBonus(stack), 0)); - multimap.put(SharedMonsterAttributes.KNOCKBACK_RESISTANCE.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 8145), "Armor modifier", this.getKnockbackResistance(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 94021), "Armor modifier", this.getSpeedBoost(stack), 2)); - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 96721), "Armor modifier", this.getDamageBoost(stack), 2)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 73245), "Armor modifier", this.getAttackSpeedBoost(stack), 2)); + 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 static void revertAllArmour(EntityPlayer player) { - ItemStack[] armourInventory = player.inventory.armorInventory; + NonNullList armourInventory = player.inventory.armorInventory; for (ItemStack stack : armourInventory) { if (stack != null && stack.getItem() instanceof ItemSentientArmour) @@ -423,9 +424,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } NBTTagCompound tag = omegaTag.getCompoundTag("armour"); - ItemStack armourStack = ItemStack.loadItemStackFromNBT(tag); - - return armourStack; + return new ItemStack(tag); } public static boolean convertPlayerArmour(EnumDemonWillType type, double will, EntityPlayer player) diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index d9baff09..48b35ea4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -12,6 +12,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.fluids.*; import net.minecraftforge.fluids.capability.templates.FluidHandlerItemStack; @@ -20,7 +21,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; -public class ItemBlockBloodTank extends ItemBlock implements IFluidContainerItem +public class ItemBlockBloodTank extends ItemBlock { public ItemBlockBloodTank(Block block) { @@ -68,98 +69,17 @@ public class ItemBlockBloodTank extends ItemBlock implements IFluidContainerItem @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) list.add(new ItemStack(id, 1, i)); } - @Override - public FluidStack getFluid(ItemStack stack) - { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.TANK) && !stack.getTagCompound().getCompoundTag(Constants.NBT.TANK).getString("FluidName").equals("")) - { - NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); - return FluidStack.loadFluidStackFromNBT(tag); - } - - return null; - } - - @Override public int getCapacity(ItemStack container) { return container != null && Block.getBlockFromItem(container.getItem()) instanceof BlockBloodTank ? TileBloodTank.CAPACITIES[container.getMetadata()] * Fluid.BUCKET_VOLUME : 0; } - @Override - public int fill(ItemStack stack, FluidStack resource, boolean doFill) - { - if (resource == null || stack.stackSize != 1) - return 0; - - int fillAmount = 0, capacity = getCapacity(stack); - NBTTagCompound tag = stack.getTagCompound(), fluidTag = null; - FluidStack fluid = null; - - if (tag == null || !tag.hasKey(Constants.NBT.TANK) || (fluidTag = tag.getCompoundTag(Constants.NBT.TANK)) == null || (fluid = FluidStack.loadFluidStackFromNBT(fluidTag)) == null) - fillAmount = Math.min(capacity, resource.amount); - - if (fluid == null) - { - if (doFill) - { - fluid = resource.copy(); - fluid.amount = 0; - } - } - else if (!fluid.isFluidEqual(resource)) - return 0; - else - fillAmount = Math.min(capacity - fluid.amount, resource.amount); - - fillAmount = Math.max(fillAmount, 0); - - if (doFill) - { - if (tag == null) - stack.setTagCompound(new NBTTagCompound()); - - tag = stack.getTagCompound(); - fluid.amount += fillAmount; - tag.setTag(Constants.NBT.TANK, fluid.writeToNBT(fluidTag == null ? new NBTTagCompound() : fluidTag)); - } - - return fillAmount; - } - - @Override - public FluidStack drain(ItemStack stack, int maxDrain, boolean doDrain) - { - NBTTagCompound tag = stack.getTagCompound(), fluidTag = null; - FluidStack fluid; - - if (tag == null || !tag.hasKey(Constants.NBT.TANK) || (fluidTag = tag.getCompoundTag(Constants.NBT.TANK)) == null || (fluid = FluidStack.loadFluidStackFromNBT(fluidTag)) == null) - { - if (fluidTag != null) - tag.removeTag(Constants.NBT.TANK); - return null; - } - - int drainAmount = Math.min(maxDrain, fluid.amount); - - if (doDrain) - { - tag.removeTag(Constants.NBT.TANK); - fluid.amount -= drainAmount; - if (fluid.amount > 0) - fill(stack, fluid, true); - } - - fluid.amount = drainAmount; - return fluid; - } - @Override public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) { diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java index 9b9f825e..9efd5ff4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java @@ -27,7 +27,7 @@ public class ItemBlockEnum & IStringSerializable> extends Item @Override public String getUnlocalizedName(ItemStack stack) { - return getBlock().getUnlocalizedName() + getBlock().getTypes()[MathHelper.clamp_int(stack.getItemDamage(), 0, 15)].getName(); + return getBlock().getUnlocalizedName() + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, 15)].getName(); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java index 3fdea986..37e51279 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java @@ -22,7 +22,7 @@ public class ItemBlockString extends ItemBlock { @Override public String getUnlocalizedName(ItemStack stack) { - return getBlock().getUnlocalizedName() + "." + getBlock().getTypes()[MathHelper.clamp_int(stack.getItemDamage(), 0, 15)]; + return getBlock().getUnlocalizedName() + "." + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, 15)]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index 0ea4f2e8..57bceebb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -38,8 +38,9 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (world.isRemote) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -47,7 +48,7 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I if (rayTrace == null) { - return super.onItemRightClick(stack, world, player, EnumHand.MAIN_HAND); + return super.onItemRightClick(world, player, EnumHand.MAIN_HAND); } else { if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) @@ -55,7 +56,7 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I TileEntity tile = world.getTileEntity(rayTrace.getBlockPos()); if (!(tile instanceof IBloodAltar)) - return super.onItemRightClick(stack, world, player, EnumHand.MAIN_HAND); + return super.onItemRightClick(world, player, EnumHand.MAIN_HAND); LPContainer.tryAndFillAltar((IBloodAltar) tile, stack, world, rayTrace.getBlockPos()); } diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index d5c74e74..c71772d4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -54,8 +54,9 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (world.isRemote) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -63,7 +64,7 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato if (position == null) { - return super.onItemRightClick(stack, world, player, EnumHand.MAIN_HAND); + return super.onItemRightClick(world, player, EnumHand.MAIN_HAND); } else { if (position.typeOfHit == RayTraceResult.Type.BLOCK) @@ -71,7 +72,7 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato TileEntity tile = world.getTileEntity(position.getBlockPos()); if (!(tile instanceof IBloodAltar)) - return super.onItemRightClick(stack, world, player, EnumHand.MAIN_HAND); + return super.onItemRightClick(world, player, EnumHand.MAIN_HAND); LPContainer.tryAndFillAltar((IBloodAltar) tile, stack, world, position.getBlockPos()); } diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java index c95f2497..16d205d6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java @@ -59,7 +59,7 @@ public class ContainerHolding extends Container { super.onContainerClosed(entityPlayer); - if (!entityPlayer.worldObj.isRemote) + if (!entityPlayer.getEntityWorld().isRemote) { saveInventory(entityPlayer); } @@ -70,7 +70,7 @@ public class ContainerHolding extends Container { super.detectAndSendChanges(); - if (!player.worldObj.isRemote) + if (!player.getEntityWorld().isRemote) { saveInventory(player); } @@ -79,8 +79,8 @@ public class ContainerHolding extends Container @Override public ItemStack transferStackInSlot(EntityPlayer entityPlayer, int slotIndex) { - ItemStack stack = null; - Slot slotObject = (Slot) inventorySlots.get(slotIndex); + ItemStack stack = ItemStack.EMPTY; + Slot slotObject = inventorySlots.get(slotIndex); int slots = inventorySlots.size(); if (slotObject != null && slotObject.getHasStack()) @@ -94,11 +94,11 @@ public class ContainerHolding extends Container { if (!this.mergeItemStack(stackInSlot, ItemSigilHolding.inventorySize, slots, false)) { - return null; + return ItemStack.EMPTY; } } else if (!this.mergeItemStack(stackInSlot, 0, ItemSigilHolding.inventorySize, false)) { - return null; + return ItemStack.EMPTY; } } else if (stack.getItem() instanceof ItemSigilHolding) { @@ -106,28 +106,28 @@ public class ContainerHolding extends Container { if (!this.mergeItemStack(stackInSlot, ItemSigilHolding.inventorySize + (PLAYER_INVENTORY_ROWS * PLAYER_INVENTORY_COLUMNS), inventorySlots.size(), false)) { - return null; + return ItemStack.EMPTY; } } else if (!this.mergeItemStack(stackInSlot, ItemSigilHolding.inventorySize, ItemSigilHolding.inventorySize + (PLAYER_INVENTORY_ROWS * PLAYER_INVENTORY_COLUMNS), false)) { - return null; + return ItemStack.EMPTY; } } - if (stackInSlot.stackSize == 0) + if (stackInSlot.isEmpty()) { - slotObject.putStack(null); + slotObject.putStack(ItemStack.EMPTY); } else { slotObject.onSlotChanged(); } - if (stackInSlot.stackSize == stack.stackSize) + if (stackInSlot.getCount() == stack.getCount()) { - return null; + return ItemStack.EMPTY; } - slotObject.onPickupFromSlot(player, stackInSlot); + slotObject.onTake(player, stackInSlot); } return stack; diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java index e14c2b2f..60a8447a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java @@ -40,7 +40,7 @@ public class InventoryHolding extends ItemInventory { ItemStack itemStack = entityPlayer.inventory.getStackInSlot(i); - if (itemStack != null && Utils.hasUUID(itemStack)) + 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()) { diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java index dcea591a..d27d816e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java @@ -62,7 +62,7 @@ public class ItemInventory implements IInventory if (j >= 0 && j < inventory.length) { - inventory[j] = ItemStack.loadItemStackFromNBT(data); + inventory[j] = new ItemStack(data); } } } @@ -123,22 +123,22 @@ public class ItemInventory implements IInventory @Override public ItemStack decrStackSize(int index, int count) { - if (inventory[index] != null) + if (!inventory[index].isEmpty()) { // if (!worldObj.isRemote) // worldObj.markBlockForUpdate(this.pos); - if (inventory[index].stackSize <= count) + if (inventory[index].getCount() <= count) { ItemStack itemStack = inventory[index]; - inventory[index] = null; + inventory[index] = ItemStack.EMPTY; markDirty(); return itemStack; } ItemStack itemStack = inventory[index].splitStack(count); - if (inventory[index].stackSize == 0) - inventory[index] = null; + if (inventory[index].isEmpty()) + inventory[index] = ItemStack.EMPTY; markDirty(); return itemStack; @@ -153,7 +153,7 @@ public class ItemInventory implements IInventory if (inventory[slot] != null) { ItemStack itemStack = inventory[slot]; - setInventorySlotContents(slot, null); + setInventorySlotContents(slot, ItemStack.EMPTY); return itemStack; } return null; @@ -163,8 +163,8 @@ public class ItemInventory implements IInventory public void setInventorySlotContents(int slot, ItemStack stack) { inventory[slot] = stack; - if (stack != null && stack.stackSize > getInventoryStackLimit()) - stack.stackSize = getInventoryStackLimit(); + if (stack.getCount() > getInventoryStackLimit()) + stack.setCount(getInventoryStackLimit()); markDirty(); // if (!worldObj.isRemote) // worldObj.markBlockForUpdate(this.pos); @@ -177,7 +177,7 @@ public class ItemInventory implements IInventory } @Override - public boolean isUseableByPlayer(EntityPlayer player) + public boolean isUsableByPlayer(EntityPlayer player) { return true; } @@ -251,6 +251,11 @@ public class ItemInventory implements IInventory } } + @Override + public boolean isEmpty() { + return false; + } + public boolean canInventoryBeManipulated() { return masterStack != null; diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index d3e96eac..98f0d385 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -53,8 +53,9 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } @Override - public EnumActionResult onItemUseFirst(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand) + public EnumActionResult onItemUseFirst(EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (world.isRemote) { return EnumActionResult.PASS; diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 3ff83caa..2888a9b7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -8,6 +8,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandler; @@ -49,7 +50,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); @@ -110,7 +111,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) { - IItemFilter testFilter = new TestItemFilter(); + IItemFilter testFilter; switch (filterStack.getMetadata()) { @@ -142,9 +143,9 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.stackSize == 0) + if (ghostStack.isEmpty()) { - ghostStack.stackSize = Integer.MAX_VALUE; + ghostStack.setCount(Integer.MAX_VALUE); } filteredList.add(ghostStack); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index 5e615643..515f6440 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -12,6 +12,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -43,7 +44,7 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index 34830ea0..6b13d6b3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -7,6 +7,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -33,10 +34,10 @@ public class ItemSentientArmourGem extends Item } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { boolean hasSentientArmour = false; - ItemStack[] armourInventory = player.inventory.armorInventory; + NonNullList armourInventory = player.inventory.armorInventory; for (ItemStack armourStack : armourInventory) { if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) @@ -57,14 +58,14 @@ public class ItemSentientArmourGem extends Item ItemSentientArmour.convertPlayerArmour(type, will, player); } - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult(EnumActionResult.PASS, player.getHeldItem(hand)); } @SideOnly(Side.CLIENT) public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) { boolean hasSentientArmour = false; - ItemStack[] armourInventory = player.inventory.armorInventory; + NonNullList armourInventory = player.inventory.armorInventory; for (ItemStack armourStack : armourInventory) { if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 255ac5d9..eca6badd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -100,7 +100,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); + return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) @@ -224,7 +224,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP if (attacker instanceof EntityPlayer) { EntityPlayer attackerPlayer = (EntityPlayer) attacker; - this.recalculatePowers(stack, attackerPlayer.worldObj, attackerPlayer); + this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); EnumDemonWillType type = this.getCurrentType(stack); double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); int willBracket = this.getLevel(stack, will); @@ -232,7 +232,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP applyEffectToEntity(type, willBracket, target, attackerPlayer); ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - if (offStack != null && offStack.getItem() instanceof ISentientSwordEffectProvider) + if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); if (provider.providesEffectForWill(type)) @@ -273,11 +273,11 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { - recalculatePowers(stack, world, player); + recalculatePowers(player.getHeldItem(hand), world, player); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override @@ -314,7 +314,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { - recalculatePowers(stack, player.worldObj, player); + recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); if (drain > 0) @@ -365,7 +365,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP { List soulList = new ArrayList(); - if (killedEntity.worldObj.getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) + if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } @@ -378,9 +378,9 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP for (int i = 0; i <= looting; i++) { - if (i == 0 || attackingEntity.worldObj.rand.nextDouble() < 0.4) + if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) { - ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.worldObj.rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); + ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); soulList.add(soulStack); } } @@ -395,10 +395,10 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), 2)); + 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; @@ -543,7 +543,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { - World world = player.worldObj; + World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -559,7 +559,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntityInWorld(specterEntity); + world.spawnEntity(specterEntity); specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 29505a45..366c29ba 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -60,7 +60,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } else { ItemStack itemstack = entityIn.getActiveItemStack(); - return itemstack != null && itemstack.getItem() == ModItems.SENTIENT_BOW ? (float) (stack.getMaxItemUseDuration() - entityIn.getItemInUseCount()) / 20.0F : 0.0F; + return !itemstack.isEmpty() && itemstack.getItem() == ModItems.SENTIENT_BOW ? (float) (stack.getMaxItemUseDuration() - entityIn.getItemInUseCount()) / 20.0F : 0.0F; } } }); @@ -85,7 +85,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); + return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) @@ -275,10 +275,11 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); this.recalculatePowers(stack, world, player); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) @@ -294,7 +295,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien 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_double(d0 * d0 + d2 * d2); + double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); entityArrow.setThrowableHeading(d0, d1 + d3 * 0.05, d2, newArrowVelocity, 0); if (newArrowVelocity == 0) @@ -405,16 +406,16 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien entityArrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; } - world.spawnEntityInWorld(entityArrow); + 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.stackSize; + itemstack.shrink(1); - if (itemstack.stackSize == 0) + if (itemstack.isEmpty()) { player.inventory.deleteStack(itemstack); } @@ -453,7 +454,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien @Override public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { - World world = player.worldObj; + World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -469,7 +470,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntityInWorld(specterEntity); + world.spawnEntity(specterEntity); specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 9ccef5ad..96bd90db 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -224,7 +224,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon if (attacker instanceof EntityPlayer) { EntityPlayer attackerPlayer = (EntityPlayer) attacker; - this.recalculatePowers(stack, attackerPlayer.worldObj, attackerPlayer); + this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); EnumDemonWillType type = this.getCurrentType(stack); double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); int willBracket = this.getLevel(stack, will); @@ -232,7 +232,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon applyEffectToEntity(type, willBracket, target, attackerPlayer); ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - if (offStack != null && offStack.getItem() instanceof ISentientSwordEffectProvider) + if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); if (provider.providesEffectForWill(type)) @@ -273,11 +273,10 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { - recalculatePowers(stack, world, player); - - return super.onItemRightClick(stack, world, player, hand); + recalculatePowers(player.getHeldItem(hand), world, player); + return super.onItemRightClick(world, player, hand); } @Override @@ -314,7 +313,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { - recalculatePowers(stack, player.worldObj, player); + recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); if (drain > 0) @@ -365,7 +364,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon { List soulList = new ArrayList(); - if (killedEntity.worldObj.getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) + if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } @@ -378,9 +377,9 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon for (int i = 0; i <= looting; i++) { - if (i == 0 || attackingEntity.worldObj.rand.nextDouble() < 0.4) + if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) { - ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.worldObj.rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); + ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); soulList.add(soulStack); } } @@ -395,10 +394,10 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), 2)); + 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; @@ -543,7 +542,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { - World world = player.worldObj; + World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -559,7 +558,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntityInWorld(specterEntity); + world.spawnEntity(specterEntity); specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index 664afb3e..ed3a1c3e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -100,7 +100,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); + return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) @@ -224,7 +224,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I if (attacker instanceof EntityPlayer) { EntityPlayer attackerPlayer = (EntityPlayer) attacker; - this.recalculatePowers(stack, attackerPlayer.worldObj, attackerPlayer); + this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); EnumDemonWillType type = this.getCurrentType(stack); double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); int willBracket = this.getLevel(stack, will); @@ -232,7 +232,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I applyEffectToEntity(type, willBracket, target, attackerPlayer); ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - if (offStack != null && offStack.getItem() instanceof ISentientSwordEffectProvider) + if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); if (provider.providesEffectForWill(type)) @@ -273,11 +273,11 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { - recalculatePowers(stack, world, player); + recalculatePowers(player.getHeldItem(hand), world, player); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override @@ -314,7 +314,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { - recalculatePowers(stack, player.worldObj, player); + recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); if (drain > 0) @@ -365,7 +365,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I { List soulList = new ArrayList(); - if (killedEntity.worldObj.getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) + if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } @@ -378,9 +378,9 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I for (int i = 0; i <= looting; i++) { - if (i == 0 || attackingEntity.worldObj.rand.nextDouble() < 0.4) + if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) { - ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.worldObj.rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); + ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); soulList.add(soulStack); } } @@ -395,10 +395,10 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), 2)); + 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; @@ -543,7 +543,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { - World world = player.worldObj; + World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -559,7 +559,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntityInWorld(specterEntity); + world.spawnEntity(specterEntity); specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index bbc5cc5d..cb39ba52 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -79,7 +79,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); + return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) @@ -196,7 +196,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM if (attacker instanceof EntityPlayer) { EntityPlayer attackerPlayer = (EntityPlayer) attacker; - this.recalculatePowers(stack, attackerPlayer.worldObj, attackerPlayer); + this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); EnumDemonWillType type = this.getCurrentType(stack); double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); int willBracket = this.getLevel(stack, will); @@ -204,7 +204,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM applyEffectToEntity(type, willBracket, target, attackerPlayer); ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - if (offStack != null && offStack.getItem() instanceof ISentientSwordEffectProvider) + if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); if (provider.providesEffectForWill(type)) @@ -245,11 +245,10 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { - recalculatePowers(stack, world, player); - - return super.onItemRightClick(stack, world, player, hand); + recalculatePowers(player.getHeldItem(hand), world, player); + return super.onItemRightClick(world, player, hand); } @Override @@ -286,7 +285,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { - recalculatePowers(stack, player.worldObj, player); + recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); if (drain > 0) @@ -337,7 +336,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM { List soulList = new ArrayList(); - if (killedEntity.worldObj.getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) + if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } @@ -350,9 +349,9 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM for (int i = 0; i <= looting; i++) { - if (i == 0 || attackingEntity.worldObj.rand.nextDouble() < 0.4) + if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) { - ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.worldObj.rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); + ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); soulList.add(soulStack); } } @@ -367,10 +366,10 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), 2)); + 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; @@ -498,7 +497,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { - World world = player.worldObj; + World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -514,7 +513,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntityInWorld(specterEntity); + world.spawnEntity(specterEntity); specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index 4e6adfa5..dd31e472 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -12,10 +12,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -52,8 +49,9 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); EnumDemonWillType type = this.getCurrentType(stack); double drain = Math.min(this.getWill(type, stack), this.getMaxWill(type, stack) / 10); @@ -95,7 +93,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) { diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index b1107f31..e1dfb842 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -10,10 +10,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -40,23 +37,24 @@ public class ItemSoulSnare extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand) + public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { + ItemStack stack = playerIn.getHeldItem(hand); if (!playerIn.capabilities.isCreativeMode) { - --itemStackIn.stackSize; + stack.shrink(1); } - worldIn.playSound((EntityPlayer) null, playerIn.posX, playerIn.posY, playerIn.posZ, SoundEvents.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + 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.setHeadingFromThrower(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); - worldIn.spawnEntityInWorld(snare); + worldIn.spawnEntity(snare); } - return new ActionResult(EnumActionResult.SUCCESS, itemStackIn); + return new ActionResult(EnumActionResult.SUCCESS, stack); } @Override @@ -67,7 +65,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); From ed27873fbe7081bd542feae8ea09a84d5fd25faf Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 2 Jan 2017 00:10:28 -0800 Subject: [PATCH 006/595] It runs! --- .../java/WayofTime/bloodmagic/BloodMagic.java | 3 + .../api/soul/PlayerDemonWillHandler.java | 34 +- .../api/util/helper/PlayerHelper.java | 2 +- .../block/BlockDimensionalPortal.java | 26 +- .../block/BlockInputRoutingNode.java | 19 +- .../block/BlockItemRoutingNode.java | 19 +- .../block/BlockMasterRoutingNode.java | 14 +- .../block/BlockRitualController.java | 8 +- .../client/gui/GuiAlchemyTable.java | 2 +- .../client/hud/HUDElementDemonWillAura.java | 2 +- .../client/hud/HUDElementHolding.java | 13 +- .../bloodmagic/client/key/KeyBindings.java | 12 +- .../client/render/block/RenderAltar.java | 6 +- .../render/block/RenderDemonCrucible.java | 2 +- .../render/block/RenderItemRoutingNode.java | 6 +- .../render/entity/RenderCorruptedZombie.java | 13 +- .../bloodmagic/item/sigil/ItemSigilAir.java | 5 +- .../item/sigil/ItemSigilBloodLight.java | 11 +- .../item/sigil/ItemSigilCompression.java | 5 +- .../item/sigil/ItemSigilDivination.java | 7 +- .../item/sigil/ItemSigilHolding.java | 18 +- .../item/sigil/ItemSigilMagnetism.java | 4 +- .../bloodmagic/item/sigil/ItemSigilSeer.java | 11 +- .../item/sigil/ItemSigilSuppression.java | 5 +- .../item/sigil/ItemSigilTeleposition.java | 8 +- .../item/sigil/ItemSigilTransposition.java | 5 +- .../bloodmagic/item/sigil/ItemSigilVoid.java | 29 +- .../bloodmagic/item/sigil/ItemSigilWater.java | 27 +- .../item/sigil/ItemSigilWhirlwind.java | 3 - .../bloodmagic/registry/ModCompatibility.java | 2 - .../ritual/RitualLivingArmourDowngrade.java | 2 +- .../event/MigrateNetworkDataHandler.java | 66 - .../assets/bloodmagic/lang/bg_BG.lang | 132 +- .../assets/bloodmagic/lang/de_DE.lang | 514 +++--- .../assets/bloodmagic/lang/en_US.lang | 1394 ++++++++--------- .../assets/bloodmagic/lang/fr_FR.lang | 976 ++++++------ .../assets/bloodmagic/lang/ja_JP.lang | 1308 ++++++++-------- .../assets/bloodmagic/lang/ko_KR.lang | 2 +- .../assets/bloodmagic/lang/ru_RU.lang | 664 ++++---- .../assets/bloodmagic/lang/zh_CN.lang | 1208 +++++++------- .../assets/bloodmagic/lang/zh_TW.lang | 662 ++++---- .../bloodmagic/schematics/Schematics.json | 5 - 42 files changed, 3606 insertions(+), 3648 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/util/handler/event/MigrateNetworkDataHandler.java delete mode 100644 src/main/resources/assets/bloodmagic/schematics/Schematics.json diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index a27e81dd..cf953fb3 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic; import java.io.File; +import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.meteor.MeteorConfigHandler; import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; @@ -104,6 +105,8 @@ public class BloodMagic proxy.preInit(); } + + @Mod.EventHandler public void init(FMLInitializationEvent event) { diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java index 000a1e26..fb9944e9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.api.soul; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; /** * This class provides several helper methods in order to handle soul @@ -23,7 +24,7 @@ public class PlayerDemonWillHandler */ public static double getTotalDemonWill(EnumDemonWillType type, EntityPlayer player) { - ItemStack[] inventory = player.inventory.mainInventory; + NonNullList inventory = player.inventory.mainInventory; double souls = 0; for (ItemStack stack : inventory) @@ -72,7 +73,7 @@ public class PlayerDemonWillHandler */ public static boolean isDemonWillFull(EnumDemonWillType type, EntityPlayer player) { - ItemStack[] inventory = player.inventory.mainInventory; + NonNullList inventory = player.inventory.mainInventory; boolean hasGem = false; for (ItemStack stack : inventory) @@ -102,25 +103,22 @@ public class PlayerDemonWillHandler { double consumed = 0; - ItemStack[] inventory = player.inventory.mainInventory; + NonNullList inventory = player.inventory.mainInventory; - for (int i = 0; i < inventory.length; i++) + for (int i = 0; i < inventory.size(); i++) { if (consumed >= amount) return consumed; - ItemStack stack = inventory[i]; - if (stack != null) + ItemStack stack = inventory.get(i); + if (stack.getItem() instanceof IDemonWill && ((IDemonWill) stack.getItem()).getType(stack) == type) { - 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[i] = null; - } else if (stack.getItem() instanceof IDemonWillGem) - { - consumed += ((IDemonWillGem) stack.getItem()).drainWill(type, stack, amount - consumed, true); - } + 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); } } @@ -143,7 +141,7 @@ public class PlayerDemonWillHandler if (willStack == null) return null; - ItemStack[] inventory = player.inventory.mainInventory; + NonNullList inventory = player.inventory.mainInventory; for (ItemStack stack : inventory) { @@ -173,7 +171,7 @@ public class PlayerDemonWillHandler */ public static double addDemonWill(EnumDemonWillType type, EntityPlayer player, double amount) { - ItemStack[] inventory = player.inventory.mainInventory; + NonNullList inventory = player.inventory.mainInventory; double remaining = amount; for (ItemStack stack : inventory) @@ -206,7 +204,7 @@ public class PlayerDemonWillHandler */ public static double addDemonWill(EnumDemonWillType type, EntityPlayer player, double amount, ItemStack ignored) { - ItemStack[] inventory = player.inventory.mainInventory; + NonNullList inventory = player.inventory.mainInventory; double remaining = amount; for (ItemStack stack : inventory) diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java index 0b4a1163..634f33f0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java @@ -26,7 +26,7 @@ public class PlayerHelper public static String getUsernameFromPlayer(EntityPlayer player) { - return player.worldObj.isRemote ? "" : UsernameCache.getLastKnownUsername(getUUIDFromPlayer(player)); + return player.getEntityWorld().isRemote ? "" : UsernameCache.getLastKnownUsername(getUUIDFromPlayer(player)); } public static EntityPlayer getPlayerFromUsername(String username) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 8ba40b12..a5ce9e94 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.Random; +import WayofTime.bloodmagic.block.base.BlockInteger; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; @@ -23,7 +24,9 @@ import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.ritual.portal.Teleports; import WayofTime.bloodmagic.tile.TileDimensionalPortal; -public class BlockDimensionalPortal extends BlockIntegerContainer +import javax.annotation.Nullable; + +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); @@ -38,12 +41,6 @@ public class BlockDimensionalPortal extends BlockIntegerContainer setLightOpacity(0); } - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) - { - return new TileDimensionalPortal(); - } - @Override public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { @@ -57,13 +54,13 @@ public class BlockDimensionalPortal extends BlockIntegerContainer } @Override - public boolean isVisuallyOpaque() + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState state, World world, BlockPos pos) + public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { return null; } @@ -170,6 +167,17 @@ public class BlockDimensionalPortal extends BlockIntegerContainer this.spawnParticles(world, pos.getX(), pos.getY(), pos.getZ()); } + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileDimensionalPortal(); + } + private void spawnParticles(World world, int x, int y, int z) { Random random = world.rand; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java index 6a279f6f..f7217004 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -12,6 +12,8 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; +import javax.annotation.Nullable; + public class BlockInputRoutingNode extends BlockRoutingNode { public BlockInputRoutingNode() @@ -21,12 +23,6 @@ public class BlockInputRoutingNode extends BlockRoutingNode setUnlocalizedName(Constants.Mod.MODID + ".inputRouting"); } - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) - { - return new TileInputRoutingNode(); - } - @Override //TODO: Combine BlockInputRoutingNode and BlockInputRoutingNode so they have the same superclass public void breakBlock(World world, BlockPos pos, IBlockState state) @@ -50,4 +46,15 @@ public class BlockInputRoutingNode extends BlockRoutingNode return true; } + + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileInputRoutingNode(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java index 6f15f7b6..8bc69487 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java @@ -8,6 +8,8 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.routing.TileItemRoutingNode; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; +import javax.annotation.Nullable; + public class BlockItemRoutingNode extends BlockRoutingNode { public BlockItemRoutingNode() @@ -17,12 +19,6 @@ public class BlockItemRoutingNode extends BlockRoutingNode setUnlocalizedName(Constants.Mod.MODID + ".itemRouting"); } - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) - { - return new TileItemRoutingNode(); - } - @Override public void breakBlock(World world, BlockPos pos, IBlockState state) { @@ -33,4 +29,15 @@ public class BlockItemRoutingNode extends BlockRoutingNode } super.breakBlock(world, pos, state); } + + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileItemRoutingNode(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java index a2f34189..1ae1b8a6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java @@ -1,11 +1,14 @@ package WayofTime.bloodmagic.block; +import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; +import javax.annotation.Nullable; + public class BlockMasterRoutingNode extends BlockRoutingNode { public BlockMasterRoutingNode() @@ -20,12 +23,17 @@ public class BlockMasterRoutingNode extends BlockRoutingNode } @Override - public TileEntity createNewTileEntity(World worldIn, int meta) - { + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(World world, IBlockState state) { return new TileMasterRoutingNode(); } -// @Override + // @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) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index d551614f..17c7c7ba 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -5,6 +5,7 @@ import java.util.List; import javax.annotation.Nullable; +import WayofTime.bloodmagic.block.base.BlockEnum; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -39,7 +40,7 @@ import WayofTime.bloodmagic.util.ChatUtil; import amerifrance.guideapi.api.IGuideLinked; @Optional.Interface(modid = "guideapi", iface = "amerifrance.guideapi.api.IGuideLinked") -public class BlockRitualController extends BlockEnumContainer implements IVariantProvider, IGuideLinked +public class BlockRitualController extends BlockEnum implements IVariantProvider, IGuideLinked { public BlockRitualController() { @@ -54,13 +55,14 @@ public class BlockRitualController extends BlockEnumContainer 0.0F) { diff --git a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java index 3b4d12d2..eb894c9b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java @@ -27,8 +27,8 @@ public enum KeyBindings @Override public void handleKeybind() { - ItemStack itemStack = ClientHandler.minecraft.thePlayer.getHeldItemMainhand(); - if (itemStack != null && itemStack.getItem() instanceof IKeybindable) + ItemStack itemStack = ClientHandler.minecraft.player.getHeldItemMainhand(); + if (itemStack.getItem() instanceof IKeybindable) BloodMagicPacketHandler.INSTANCE.sendToServer(new KeyProcessor(this, false)); } }, @@ -38,8 +38,8 @@ public enum KeyBindings @Override public void handleKeybind() { - EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; - if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) + EntityPlayerSP player = Minecraft.getMinecraft().player; + if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, -1); } }, @@ -49,8 +49,8 @@ public enum KeyBindings @Override public void handleKeybind() { - EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; - if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) + EntityPlayerSP player = Minecraft.getMinecraft().player; + if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, 1); } }, 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 4fdf0161..5192a0a2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -102,7 +102,7 @@ public class RenderAltar extends TileEntitySpecialRenderer { GlStateManager.translate(0.5, 1, 0.5); EntityItem entityitem = new EntityItem(world, 0.0D, 0.0D, 0.0D, stack); - entityitem.getEntityItem().stackSize = 1; + entityitem.getEntityItem().setCount(1); entityitem.hoverStart = 0.0F; GlStateManager.pushMatrix(); GlStateManager.disableLighting(); @@ -124,8 +124,8 @@ public class RenderAltar extends TileEntitySpecialRenderer private void renderHologram(TileAltar altar, EnumAltarTier tier, float partialTicks) { - EntityPlayerSP player = mc.thePlayer; - World world = player.worldObj; + EntityPlayerSP player = mc.player; + World world = player.world; if (tier == EnumAltarTier.ONE) return; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java index 719b0ce5..875e5254 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java @@ -37,7 +37,7 @@ public class RenderDemonCrucible extends TileEntitySpecialRenderer connectionList = tileNode.getConnected(); for (BlockPos wantedPos : connectionList) @@ -41,7 +41,7 @@ public class RenderItemRoutingNode extends TileEntitySpecialRenderer public RenderCorruptedZombie(RenderManager renderManagerIn) { - super(renderManagerIn, new ModelZombie(), 0.5F, 1.0F); - LayerRenderer layerrenderer = (LayerRenderer) this.layerRenderers.get(0); + super(renderManagerIn, new ModelZombie(), 0.5F); + LayerRenderer layerrenderer = this.layerRenderers.get(0); this.zombieVillagerModel = new ModelZombieVillager(); this.addLayer(new LayerHeldItem(this)); LayerBipedArmor layerbipedarmor = new LayerBipedArmor(this) @@ -38,11 +38,11 @@ public class RenderCorruptedZombie extends RenderBiped if (layerrenderer instanceof LayerCustomHead) { - this.removeLayer(layerrenderer); + layerRenderers.remove(layerrenderer); this.addLayer(new LayerCustomHead(this.zombieVillagerModel.bipedHead)); } - this.removeLayer(layerbipedarmor); + this.layerRenderers.remove(layerbipedarmor); this.addLayer(new LayerWill(this, new ModelZombie(1.2f, false))); } @@ -71,9 +71,4 @@ public class RenderCorruptedZombie extends RenderBiped { return ZOMBIE_TEXTURES; } - - protected void rotateCorpse(EntityCorruptedZombie entityLiving, float p_77043_2_, float p_77043_3_, float partialTicks) - { - super.rotateCorpse(entityLiving, p_77043_2_, p_77043_3_, partialTicks); - } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index 7908a6b8..bf95f42a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -26,8 +26,9 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -59,7 +60,7 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP player.fallDistance = 0; } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index fcfe44dd..42ddb560 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -31,15 +31,16 @@ public class ItemSigilBloodLight extends ItemSigilBase } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); RayTraceResult mop = this.rayTrace(world, player, false); if (getCooldownRemainder(stack) > 0) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { @@ -52,19 +53,19 @@ public class ItemSigilBloodLight extends ItemSigilBase NetworkHelper.syphonAndDamage(NetworkHelper.getSoulNetwork(player), player, getLpUsed()); resetCooldown(stack); player.swingArm(hand); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } } else { if (!world.isRemote) { - world.spawnEntityInWorld(new EntityBloodLight(world, player)); + world.spawnEntity(new EntityBloodLight(world, player)); NetworkHelper.syphonAndDamage(NetworkHelper.getSoulNetwork(player), player, getLpUsed()); } resetCooldown(stack); } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java index 6cc0eeb8..640a450c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.compress.CompressionRegistry; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.item.EntityItem; @@ -24,12 +23,12 @@ public class ItemSigilCompression extends ItemSigilToggleableBase if (PlayerHelper.isFakePlayer(player)) return; - ItemStack compressedStack = CompressionRegistry.compressInventory(player.inventory.mainInventory, world); + ItemStack compressedStack = CompressionRegistry.compressInventory(player.inventory.mainInventory.toArray(new ItemStack[player.inventory.mainInventory.size()]), world); if (compressedStack != null) { EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, compressedStack); - world.spawnEntityInWorld(entityItem); + 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 index 5a4af378..2282a9de 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -30,7 +30,7 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { // if (world instanceof WorldServer) // { @@ -46,13 +46,14 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader // fred.setPosition(player.posX, player.posY, player.posZ); // world.spawnEntityInWorld(fred); // } + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); if (!world.isRemote) { - super.onItemRightClick(stack, world, player, hand); + super.onItemRightClick(world, player, hand); RayTraceResult position = rayTrace(world, player, false); @@ -99,6 +100,6 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader } } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index 5214d64a..e85558f2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -48,7 +48,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl 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.worldObj, (int) player.posX, (int) player.posY, (int) player.posZ); + player.openGui(BloodMagic.instance, Constants.Gui.SIGIL_HOLDING_GUI, player.getEntityWorld(), (int) player.posX, (int) player.posY, (int) player.posZ); } } @@ -98,9 +98,10 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { - if (PlayerHelper.isFakePlayer(playerIn)) + ItemStack stack = player.getHeldItem(hand); + if (PlayerHelper.isFakePlayer(player)) return EnumActionResult.FAIL; int currentSlot = getCurrentItemOrdinal(stack); @@ -114,15 +115,16 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl if (itemUsing == null || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing))) return EnumActionResult.PASS; - EnumActionResult result = itemUsing.getItem().onItemUse(itemUsing, playerIn, worldIn, pos, hand, facing, hitX, hitY, hitZ); + EnumActionResult result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); saveInventory(stack, inv); return result; } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -137,7 +139,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl if (itemUsing == null || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing))) return ActionResult.newResult(EnumActionResult.PASS, stack); - itemUsing.getItem().onItemRightClick(itemUsing, world, player, hand); + itemUsing.getItem().onItemRightClick(world, player, hand); saveInventory(stack, inv); @@ -251,7 +253,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl { initModeTag(itemStack); int currentSigil = itemStack.getTagCompound().getInteger(Constants.NBT.CURRENT_SIGIL); - currentSigil = MathHelper.clamp_int(currentSigil, 0, inventorySize - 1); + currentSigil = MathHelper.clamp(currentSigil, 0, inventorySize - 1); return currentSigil; } @@ -284,7 +286,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl if (j >= 0 && j < inv.length) { - inv[j] = ItemStack.loadItemStackFromNBT(data); + inv[j] = new ItemStack(data); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java index 5ab19bc1..3c5aec7a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java @@ -28,8 +28,8 @@ public class ItemSigilMagnetism extends ItemSigilToggleableBase float posX = Math.round(player.posX); float posY = (float) (player.posY - player.getEyeHeight()); float posZ = Math.round(player.posZ); - List entities = player.worldObj.getEntitiesWithinAABB(EntityItem.class, 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.worldObj.getEntitiesWithinAABB(EntityXPOrb.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 entities = player.getEntityWorld().getEntitiesWithinAABB(EntityItem.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(EntityXPOrb.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 (EntityItem entity : entities) { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java index 818a440b..e5d97e22 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java @@ -31,14 +31,15 @@ public class ItemSigilSeer extends ItemSigilBase implements IAltarReader } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); if (!world.isRemote) { - super.onItemRightClick(stack, world, player, hand); + super.onItemRightClick(world, player, hand); RayTraceResult rayTrace = rayTrace(world, player, false); if (rayTrace == null) @@ -67,10 +68,10 @@ public class ItemSigilSeer extends ItemSigilBase implements IAltarReader altar.checkTier(); if (tile instanceof IInventory) { - if (((IInventory) tile).getStackInSlot(0) != null) + if (!((IInventory) tile).getStackInSlot(0).isEmpty()) { int progress = altar.getProgress(); - int totalLiquidRequired = altar.getLiquidRequired() * ((IInventory) tile).getStackInSlot(0).stackSize; + int totalLiquidRequired = altar.getLiquidRequired() * ((IInventory) tile).getStackInSlot(0).getCount(); int consumptionRate = (int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1)); ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarProgress", progress, totalLiquidRequired), new TextComponentTranslation(tooltipBase + "currentAltarConsumptionRate", consumptionRate), new TextComponentTranslation(tooltipBase + "currentAltarTier", tier), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity), new TextComponentTranslation(tooltipBase + "currentCharge", charge)); } else @@ -93,6 +94,6 @@ public class ItemSigilSeer extends ItemSigilBase implements IAltarReader } } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java index af684fe6..237d0cb9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java @@ -48,10 +48,7 @@ public class ItemSigilSuppression extends ItemSigilToggleableBase BlockPos blockPos = new BlockPos(x + i, y + j, z + k); IBlockState state = world.getBlockState(blockPos); - // TODO - Change back when BlockFluidBase overrides getStateFromMeta() - // Temporary fix to avoid liquid duplication - if (state.getBlock() instanceof BlockFluidBase) {/*No-op*/} - else if (Utils.isBlockLiquid(state) && world.getTileEntity(blockPos) == null) + if (Utils.isBlockLiquid(state) && world.getTileEntity(blockPos) == null) TileSpectralBlock.createSpectralBlock(world, blockPos, refresh); else { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index a01999e3..fa5b03ae 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -47,8 +47,9 @@ public class ItemSigilTeleposition extends ItemSigilBase } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -63,12 +64,13 @@ public class ItemSigilTeleposition extends ItemSigilBase TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, getOwnerUUID(stack), world, getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID), true)); } } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return EnumActionResult.FAIL; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index 04ae9a4b..c9a65ccf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -66,8 +66,9 @@ public class ItemSigilTransposition extends ItemSigilBase } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return EnumActionResult.FAIL; @@ -123,7 +124,7 @@ public class ItemSigilTransposition extends ItemSigilBase blockPos = blockPos.offset(side); } - if (stack.stackSize != 0 && player.canPlayerEdit(blockPos, side, stack) && world.canBlockBePlaced(blockToPlace.getBlock(), blockPos, false, side, player, stack)) + if (!stack.isEmpty() && player.canPlayerEdit(blockPos, side, stack) && world.mayPlace(blockToPlace.getBlock(), blockPos, false, side, player)) { if (world.setBlockState(blockPos, blockToPlace.getState(), 3)) { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 80d18508..749bcff2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -15,8 +15,8 @@ import net.minecraft.world.World; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidBlock; -import net.minecraftforge.fluids.IFluidHandler; -import WayofTime.bloodmagic.api.Constants; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; public class ItemSigilVoid extends ItemSigilBase { @@ -26,8 +26,9 @@ public class ItemSigilVoid extends ItemSigilBase } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -47,40 +48,41 @@ public class ItemSigilVoid extends ItemSigilBase if (!world.isBlockModifiable(player, blockpos)) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } if (!player.canPlayerEdit(blockpos, rayTrace.sideHit, stack)) { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } if (world.getBlockState(blockpos).getBlock().getMaterial(world.getBlockState(blockpos)).isLiquid() && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { world.setBlockToAir(blockpos); - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } } } else { - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } if (!player.capabilities.isCreativeMode) this.setUnusable(stack, !NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())); } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return EnumActionResult.FAIL; @@ -95,13 +97,14 @@ public class ItemSigilVoid extends ItemSigilBase } TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof IFluidHandler) + if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { - FluidStack amount = ((IFluidHandler) tile).drain(side, 1000, false); + IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); + FluidStack amount = handler.drain(1000, false); if (amount != null && amount.amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { - ((IFluidHandler) tile).drain(side, 1000, true); + handler.drain(1000, true); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index 9a0bb270..9e93f578 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -20,8 +20,8 @@ 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.IFluidHandler; -import WayofTime.bloodmagic.api.Constants; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; public class ItemSigilWater extends ItemSigilBase { @@ -31,8 +31,9 @@ public class ItemSigilWater extends ItemSigilBase } @Override - public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -51,28 +52,29 @@ public class ItemSigilWater extends ItemSigilBase BlockPos blockpos = rayTrace.getBlockPos(); if (!world.isBlockModifiable(player, blockpos)) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); BlockPos blockpos1 = blockpos.offset(rayTrace.sideHit); if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); if (this.canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed()) && this.tryPlaceWater(world, blockpos1)) - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } } } - return super.onItemRightClick(stack, world, player, hand); + return super.onItemRightClick(world, player, hand); } @Override - public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); if (world.isRemote || player.isSneaking() || isUnusable(stack)) return EnumActionResult.FAIL; @@ -80,14 +82,15 @@ public class ItemSigilWater extends ItemSigilBase return EnumActionResult.FAIL; TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof IFluidHandler) + if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { + IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack fluid = new FluidStack(FluidRegistry.WATER, 1000); - int amount = ((IFluidHandler) tile).fill(side, fluid, false); + int amount = handler.fill(fluid, false); if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { - ((IFluidHandler) tile).fill(side, fluid, true); + handler.fill(fluid, true); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java index ea2b230b..9b051e70 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java @@ -1,13 +1,10 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.registry.ModPotions; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; import net.minecraft.world.World; public class ItemSigilWhirlwind extends ItemSigilToggleableBase diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java b/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java index 5496ba23..17ec3bf8 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.compat.ICompatibility; -import WayofTime.bloodmagic.compat.jei.CompatibilityJustEnoughItems; import WayofTime.bloodmagic.compat.waila.CompatibilityWaila; import net.minecraftforge.fml.common.Loader; @@ -13,7 +12,6 @@ public class ModCompatibility public static void registerModCompat() { - compatibilities.add(new CompatibilityJustEnoughItems()); compatibilities.add(new CompatibilityWaila()); // compatibilities.add(new CompatibilityThaumcraft()); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java index f4d3244d..1895d037 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java @@ -126,7 +126,7 @@ public class RitualLivingArmourDowngrade extends Ritual recipe.consumeInventory(inv); EntityLightningBolt lightning = new EntityLightningBolt(world, chestPos.getX(), chestPos.getY(), chestPos.getZ(), true); - world.spawnEntityInWorld(lightning); + world.spawnEntity(lightning); masterRitualStone.setActive(false); } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/MigrateNetworkDataHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/MigrateNetworkDataHandler.java deleted file mode 100644 index b06b7bf8..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/MigrateNetworkDataHandler.java +++ /dev/null @@ -1,66 +0,0 @@ -package WayofTime.bloodmagic.util.handler.event; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.saving.BMWorldSavedData; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import com.google.common.base.Stopwatch; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.event.entity.EntityJoinWorldEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.apache.commons.io.FileUtils; - -import java.io.File; -import java.io.IOException; -import java.util.UUID; - -// Migrates from the old data storage system to the cleaner new one -@Handler -public class MigrateNetworkDataHandler -{ - - @SubscribeEvent - public void playerJoin(EntityJoinWorldEvent event) - { - if (!event.getWorld().isRemote && event.getEntity() instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) event.getEntity(); - UUID playerId = PlayerHelper.getUUIDFromPlayer(player); - Stopwatch stopwatch = Stopwatch.createStarted(); - - if (event.getWorld().getMapStorage() == null) - return; - - BMWorldSavedData saveData = (BMWorldSavedData) event.getWorld().getMapStorage().getOrLoadData(BMWorldSavedData.class, BMWorldSavedData.ID); - WayofTime.bloodmagic.api.network.SoulNetwork oldData = (WayofTime.bloodmagic.api.network.SoulNetwork) event.getWorld().getMapStorage().getOrLoadData(WayofTime.bloodmagic.api.network.SoulNetwork.class, playerId.toString()); - - if (saveData == null) - { - saveData = new BMWorldSavedData(); - event.getWorld().getMapStorage().setData(BMWorldSavedData.ID, saveData); - } - - if (oldData == null) - return; - - SoulNetwork network = saveData.getNetwork(playerId); - if (oldData.getOrbTier() > network.getOrbTier()) - network.setOrbTier(oldData.getOrbTier()); - if (oldData.getCurrentEssence() > network.getCurrentEssence()) - network.setCurrentEssence(oldData.getCurrentEssence()); - - File oldDataFile = event.getWorld().getSaveHandler().getMapFileFromName(playerId.toString()); - try - { - FileUtils.forceDelete(oldDataFile); - } catch (IOException e) - { - BloodMagic.instance.getLogger().error("Error deleting data file {}.", oldDataFile); - BloodMagic.instance.getLogger().error(e.getLocalizedMessage()); - } - stopwatch.stop(); - BloodMagic.instance.getLogger().info("Migration completed for {} ({}) in {}.", player.getDisplayNameString(), playerId, stopwatch); - } - } -} diff --git a/src/main/resources/assets/bloodmagic/lang/bg_BG.lang b/src/main/resources/assets/bloodmagic/lang/bg_BG.lang index 792f06d2..7e518dd4 100644 --- a/src/main/resources/assets/bloodmagic/lang/bg_BG.lang +++ b/src/main/resources/assets/bloodmagic/lang/bg_BG.lang @@ -1,85 +1,85 @@ #Creative Tab -itemGroup.BloodMagic.creativeTab=МагиÑта на Кръвта -itemGroup.BloodMagic.creativeTabTome=МагиÑта на Кръвта Ъпгрейд Томове +itemGroup.bloodmagic.creativeTab=МагиÑта на Кръвта +itemGroup.bloodmagic.creativeTabTome=МагиÑта на Кръвта Ъпгрейд Томове #Items -item.BloodMagic.activationCrystal.weak.name=Слаб КриÑтален Ðктиватор -item.BloodMagic.activationCrystal.awakened.name=Буднат КриÑтален Ðктиватор -item.BloodMagic.activationCrystal.creative.name=Креативен КриÑтален Ðктиватор +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.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.lavaCrystal.name=Лава КриÑтал -item.BloodMagic.bound.sword.name=Обвързано ОÑтрие -item.BloodMagic.bound.pickaxe.name=Обвързана Кирка -item.BloodMagic.bound.axe.name=Обвързана Брадва -item.BloodMagic.bound.shovel.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.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.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.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.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.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.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.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.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.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.altarMaker.name=Създател на алтари -item.BloodMagic.sentientSword.name=ЧувÑтвителен Меч -item.BloodMagic.sentientBow.name=ЧувÑтвителен Лък -item.BloodMagic.sentientArmourGem.name=Ñкъпоценен камък на ЧувÑтвителната Ð‘Ñ€Ð¾Ð½Ñ +item.bloodmagic.sentientSword.name=ЧувÑтвителен Меч +item.bloodmagic.sentientBow.name=ЧувÑтвителен Лък +item.bloodmagic.sentientArmourGem.name=Ñкъпоценен камък на ЧувÑтвителната Ð‘Ñ€Ð¾Ð½Ñ # JustEnoughItems -jei.BloodMagic.recipe.altar=Ðлтар на Кръвта -jei.BloodMagic.recipe.ticksRequired=Време: %,d Ticks +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 index 643e3236..926a5efa 100644 --- a/src/main/resources/assets/bloodmagic/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagic/lang/de_DE.lang @@ -1,310 +1,310 @@ #Creative Tab -itemGroup.BloodMagic.creativeTab=Blood Magic -itemGroup.BloodMagic.creativeTabTome=Blood Magic - Upgrades +itemGroup.bloodmagic.creativeTab=Blood Magic +itemGroup.bloodmagic.creativeTabTome=Blood Magic - Upgrades #Items -item.BloodMagic.activationCrystal.weak.name=Schwacher Aktivierungskristall -item.BloodMagic.activationCrystal.awakened.name=Erweckter Aktivierungskristall -item.BloodMagic.activationCrystal.creative.name=Kreativer Aktivierungskristall +item.bloodmagic.activationCrystal.weak.name=Schwacher Aktivierungskristall +item.bloodmagic.activationCrystal.awakened.name=Erweckter Aktivierungskristall +item.bloodmagic.activationCrystal.creative.name=Kreativer Aktivierungskristall -item.BloodMagic.sacrificialDagger.normal.name=Opferdolch -item.BloodMagic.sacrificialDagger.creative.name=Kreativer Opferdolch -item.BloodMagic.pack.selfSacrifice.name=Blutweste -item.BloodMagic.pack.sacrifice.name=Vampirische Weste -item.BloodMagic.daggerOfSacrifice.name=Opfermesser +item.bloodmagic.sacrificialDagger.normal.name=Opferdolch +item.bloodmagic.sacrificialDagger.creative.name=Kreativer Opferdolch +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.lavaCrystal.name=Lavakristall -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.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.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: Morgendämmerung -item.BloodMagic.scribe.dawn.name=Elementar-Gravurwerkzeug: Abenddämmerung +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: Morgendämmerung +item.bloodmagic.scribe.dawn.name=Elementar-Gravurwerkzeug: Abenddä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.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 Tafel -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.slate.blank.name=Leere Tafel +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=Schwacher Blutorb -item.BloodMagic.orb.apprentice.name=Blutorb des Lehrlings -item.BloodMagic.orb.magician.name=Blutorb des Magiers -item.BloodMagic.orb.master.name=Blutorb des Meisters -item.BloodMagic.orb.archmage.name=Blutorb des Erzmagiers -item.BloodMagic.orb.transcendent.name=Transzendenter Blutorb +item.bloodmagic.orb.weak.name=Schwacher Blutorb +item.bloodmagic.orb.apprentice.name=Blutorb des Lehrlings +item.bloodmagic.orb.magician.name=Blutorb des Magiers +item.bloodmagic.orb.master.name=Blutorb des Meisters +item.bloodmagic.orb.archmage.name=Blutorb des Erzmagiers +item.bloodmagic.orb.transcendent.name=Transzendenter Blutorb -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.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=Schwache Blutscherbe -item.BloodMagic.bloodShard.demon.name=Dämonische Blutscherbe +item.bloodmagic.bloodShard.weak.name=Schwache Blutscherbe +item.bloodmagic.bloodShard.demon.name=Dämonische Blutscherbe -item.BloodMagic.baseComponent.reagentWater.name=Wasserreagenz -item.BloodMagic.baseComponent.reagentLava.name=Lavareagenz -item.BloodMagic.baseComponent.reagentAir.name=Luftreagenz -item.BloodMagic.baseComponent.reagentFastMiner.name=Reagenz der Eile -item.BloodMagic.baseComponent.reagentVoid.name=reagenz der Leere -item.BloodMagic.baseComponent.reagentGrowth.name=Wachstumsreagenz -item.BloodMagic.baseComponent.reagentAffinity.name=Reagenz der elementaren Verbundenheit -item.BloodMagic.baseComponent.reagentSight.name=Sichtreagenz -item.BloodMagic.baseComponent.reagentBinding.name=Bindendes Reagenz -item.BloodMagic.baseComponent.reagentSuppression.name=Unterdrückendes Reagenz +item.bloodmagic.baseComponent.reagentWater.name=Wasserreagenz +item.bloodmagic.baseComponent.reagentLava.name=Lavareagenz +item.bloodmagic.baseComponent.reagentAir.name=Luftreagenz +item.bloodmagic.baseComponent.reagentFastMiner.name=Reagenz der Eile +item.bloodmagic.baseComponent.reagentVoid.name=reagenz der Leere +item.bloodmagic.baseComponent.reagentGrowth.name=Wachstumsreagenz +item.bloodmagic.baseComponent.reagentAffinity.name=Reagenz der elementaren Verbundenheit +item.bloodmagic.baseComponent.reagentSight.name=Sichtreagenz +item.bloodmagic.baseComponent.reagentBinding.name=Bindendes Reagenz +item.bloodmagic.baseComponent.reagentSuppression.name=Unterdrückendes Reagenz -item.BloodMagic.monsterSoul.base.name=Dämonischer Wille +item.bloodmagic.monsterSoul.base.name=Dämonischer Wille -item.BloodMagic.sigil.air.name=Luftsiegel -item.BloodMagic.sigil.bloodLight.name=Siegel der Blutlampe -item.BloodMagic.sigil.compression.name=Siegel der Kompression -item.BloodMagic.sigil.divination.name=Wahrheitssiegel -item.BloodMagic.sigil.water.name=Wassersiegel -item.BloodMagic.sigil.lava.name=Lavasiegel -item.BloodMagic.sigil.void.name=Siegel der Leere -item.BloodMagic.sigil.greenGrove.name=Siegel des Grünen Hains -item.BloodMagic.sigil.elementalAffinity.name=Siegel der elementaren Verbundenheit -item.BloodMagic.sigil.haste.name=Siegel der Hast -item.BloodMagic.sigil.suppression.name=Siegel der Unterdrückung -item.BloodMagic.sigil.magnetism.name=Siegel des Magnetismus -item.BloodMagic.sigil.fastMiner.name=Siegel des Eile -item.BloodMagic.sigil.seer.name=Siegel der Sicht -item.BloodMagic.sigil.phantomBridge.name=Siegel der Phantombrücke -item.BloodMagic.sigil.whirlwind.name=Siegel des Wirbelwindes -item.BloodMagic.sigil.enderSeverance.name=Siegel des Endertrennens +item.bloodmagic.sigil.air.name=Luftsiegel +item.bloodmagic.sigil.bloodLight.name=Siegel der Blutlampe +item.bloodmagic.sigil.compression.name=Siegel der Kompression +item.bloodmagic.sigil.divination.name=Wahrheitssiegel +item.bloodmagic.sigil.water.name=Wassersiegel +item.bloodmagic.sigil.lava.name=Lavasiegel +item.bloodmagic.sigil.void.name=Siegel der Leere +item.bloodmagic.sigil.greenGrove.name=Siegel des Grünen Hains +item.bloodmagic.sigil.elementalAffinity.name=Siegel der elementaren Verbundenheit +item.bloodmagic.sigil.haste.name=Siegel der Hast +item.bloodmagic.sigil.suppression.name=Siegel der Unterdrückung +item.bloodmagic.sigil.magnetism.name=Siegel des Magnetismus +item.bloodmagic.sigil.fastMiner.name=Siegel des Eile +item.bloodmagic.sigil.seer.name=Siegel der Sicht +item.bloodmagic.sigil.phantomBridge.name=Siegel der Phantombrücke +item.bloodmagic.sigil.whirlwind.name=Siegel des Wirbelwindes +item.bloodmagic.sigil.enderSeverance.name=Siegel des Endertrennens -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.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.altarMaker.name=Altarersteller +item.bloodmagic.altarMaker.name=Altarersteller -item.BloodMagic.ritualDivinernormal.name=Ritualrute -item.BloodMagic.ritualDivinerdusk.name=Ritualrute [Morgendämmerung] -item.BloodMagic.ritualDivinerdawn.name=Ritualrute [Abenddämmerung] +item.bloodmagic.ritualDivinernormal.name=Ritualrute +item.bloodmagic.ritualDivinerdusk.name=Ritualrute [Morgendämmerung] +item.bloodmagic.ritualDivinerdawn.name=Ritualrute [Abenddämmerung] -item.BloodMagic.arcaneAshes.name=Arkane Asche -item.BloodMagic.upgradeTome.name=Thesis zur Verbesserung lebender Rüstung +item.bloodmagic.arcaneAshes.name=Arkane Asche +item.bloodmagic.upgradeTome.name=Thesis zur Verbesserung lebender Rüstung -item.BloodMagic.sentientSword.name=Intelligentes 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 Falle -item.BloodMagic.sentientBow.name=Intelligenter Bogen +item.bloodmagic.sentientSword.name=Intelligentes 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 Falle +item.bloodmagic.sentientBow.name=Intelligenter Bogen # Blocks -tile.BloodMagic.fluid.lifeEssence.name=Lebensessenz +tile.bloodmagic.fluid.lifeEssence.name=Lebensessenz -tile.BloodMagic.stone.ritual.master.name=Haupt-Ritualstein -tile.BloodMagic.stone.ritual.imperfect.name=Imperfekter Ritualstein +tile.bloodmagic.stone.ritual.master.name=Haupt-Ritualstein +tile.bloodmagic.stone.ritual.imperfect.name=Imperfekter Ritualstein -tile.BloodMagic.altar.name=Blutaltar -tile.BloodMagic.rune.blank.name=Blutrune -tile.BloodMagic.rune.speed.name=Geschwindigkeitsrune -tile.BloodMagic.rune.efficiency.name=Effizienzrune -tile.BloodMagic.rune.sacrifice.name=Rune der Opferung -tile.BloodMagic.rune.selfSacrifice.name=Rune der Selbstopferung -tile.BloodMagic.rune.displacement.name=Rune der Deplazierung -tile.BloodMagic.rune.capacity.name=Kapazitätsrune -tile.BloodMagic.rune.augCapacity.name=Rune der erweiterten Kapazität -tile.BloodMagic.rune.orb.name=Orbrune -tile.BloodMagic.rune.acceleration.name=Beschleunigungsrune -tile.BloodMagic.rune.charging.name=Laderune +tile.bloodmagic.altar.name=Blutaltar +tile.bloodmagic.rune.blank.name=Blutrune +tile.bloodmagic.rune.speed.name=Geschwindigkeitsrune +tile.bloodmagic.rune.efficiency.name=Effizienzrune +tile.bloodmagic.rune.sacrifice.name=Rune der Opferung +tile.bloodmagic.rune.selfSacrifice.name=Rune der Selbstopferung +tile.bloodmagic.rune.displacement.name=Rune der Deplazierung +tile.bloodmagic.rune.capacity.name=Kapazitätsrune +tile.bloodmagic.rune.augCapacity.name=Rune der erweiterten Kapazität +tile.bloodmagic.rune.orb.name=Orbrune +tile.bloodmagic.rune.acceleration.name=Beschleunigungsrune +tile.bloodmagic.rune.charging.name=Laderune -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=Morgendämmerungsritualstein -tile.BloodMagic.ritualStone.dawn.name=Abenddämmerungsritualstein +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=Morgendämmerungsritualstein +tile.bloodmagic.ritualStone.dawn.name=Abenddämmerungsritualstein -tile.BloodMagic.bloodstonebrick.large.name=Großer Blutsteinziegel -tile.BloodMagic.bloodstonebrick.brick.name=Blutsteinziegel -tile.BloodMagic.crystal.large.name=Kristallklumpen -tile.BloodMagic.crystal.brick.name=Kristallklumpenziegel -tile.BloodMagic.bloodLight.name=Blutlampe -tile.BloodMagic.spectralBlock.name=Spektralblock -tile.BloodMagic.phantomBlock.name=Phantomblock +tile.bloodmagic.bloodstonebrick.large.name=Großer Blutsteinziegel +tile.bloodmagic.bloodstonebrick.brick.name=Blutsteinziegel +tile.bloodmagic.crystal.large.name=Kristallklumpen +tile.bloodmagic.crystal.brick.name=Kristallklumpenziegel +tile.bloodmagic.bloodLight.name=Blutlampe +tile.bloodmagic.spectralBlock.name=Spektralblock +tile.bloodmagic.phantomBlock.name=Phantomblock -tile.BloodMagic.teleposer.name=Teleposer -tile.BloodMagic.soulForge.name=Höllenfeuerschmiede +tile.bloodmagic.teleposer.name=Teleposer +tile.bloodmagic.soulForge.name=Höllenfeuerschmiede # Tooltips -tooltip.BloodMagic.orb.desc=Speichert Lebensessenz -tooltip.BloodMagic.orb.owner=Hinzugefügt durch: %s -tooltip.BloodMagic.currentOwner=Eigentümer: %s -tooltip.BloodMagic.currentTier=Ausbaustufe: %d +tooltip.bloodmagic.orb.desc=Speichert Lebensessenz +tooltip.bloodmagic.orb.owner=Hinzugefügt durch: %s +tooltip.bloodmagic.currentOwner=Eigentümer: %s +tooltip.bloodmagic.currentTier=Ausbaustufe: %d -tooltip.BloodMagic.activated=Aktiviert -tooltip.BloodMagic.deactivated=Deaktiviert +tooltip.bloodmagic.activated=Aktiviert +tooltip.bloodmagic.deactivated=Deaktiviert -tooltip.BloodMagic.sigil.air.desc=&oIch fühl mich schon leichter... -tooltip.BloodMagic.sigil.bloodLight.desc=&oIch sehe ein Licht! -tooltip.BloodMagic.sigil.compression.desc=&oDiamanthände -tooltip.BloodMagic.sigil.divination.desc=&oSpähe in die Seele -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.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.greenGrove.desc=&oUmweltverträglich -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.fastMiner.desc=&oHacke wie ein Weltmeister -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.phantomBridge.desc=&oLaufen auf dünner Luft... -tooltip.BloodMagic.sigil.whirlwind.desc=&oBesser keinen Rock tragen -tooltip.BloodMagic.sigil.enderSeverance.desc=&oBringt Enderman in Notlage +tooltip.bloodmagic.sigil.air.desc=&oIch fühl mich schon leichter... +tooltip.bloodmagic.sigil.bloodLight.desc=&oIch sehe ein Licht! +tooltip.bloodmagic.sigil.compression.desc=&oDiamanthände +tooltip.bloodmagic.sigil.divination.desc=&oSpähe in die Seele +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.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.greenGrove.desc=&oUmweltverträglich +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.fastMiner.desc=&oHacke wie ein Weltmeister +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.phantomBridge.desc=&oLaufen auf dünner Luft... +tooltip.bloodmagic.sigil.whirlwind.desc=&oBesser keinen Rock tragen +tooltip.bloodmagic.sigil.enderSeverance.desc=&oBringt Enderman in Notlage -tooltip.BloodMagic.bound.sword.desc=&oErlegen der Schwachen -tooltip.BloodMagic.bound.pickaxe.desc=&oZerstören von Stein ohne Erbarmen -tooltip.BloodMagic.bound.axe.desc=&oDämonischer Kahlschlag -tooltip.BloodMagic.bound.shovel.desc=&oSchrubbt den Dreck vom Boden +tooltip.bloodmagic.bound.sword.desc=&oErlegen der Schwachen +tooltip.bloodmagic.bound.pickaxe.desc=&oZerstören von Stein 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.slate.desc=Stein getränkt im Blutaltar -tooltip.BloodMagic.inscriber.desc=Die Zeichen an der Wand. +tooltip.bloodmagic.sacrificialDagger.desc=Schon ein Stich in den Finger genügt +tooltip.bloodmagic.slate.desc=Stein getränkt im Blutaltar +tooltip.bloodmagic.inscriber.desc=Die Zeichen 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.pack.selfSacrifice.desc=Es scheuert richtig... +tooltip.bloodmagic.pack.sacrifice.desc=Beschreibung +tooltip.bloodmagic.pack.stored=Enthält: %d LP -tooltip.BloodMagic.activationCrystal.weak=Aktiviert niedrig-levelige Rituale -tooltip.BloodMagic.activationCrystal.awakened=Aktiviert mächtigere Rituale -tooltip.BloodMagic.activationCrystal.creative=Kreativmodus: Aktiviert jedes Ritual +tooltip.bloodmagic.activationCrystal.weak=Aktiviert niedrig-levelige Rituale +tooltip.bloodmagic.activationCrystal.awakened=Aktiviert mächtigere Rituale +tooltip.bloodmagic.activationCrystal.creative=Kreativmodus: Aktiviert jedes Ritual -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 Morgendämmerung: %d -tooltip.BloodMagic.diviner.dawnRune=Runen der Abenddämmerung: %d -tooltip.BloodMagic.diviner.totalRune=Runen insgesamt: %d -tooltip.BloodMagic.diviner.extraInfo=Halte Shift für extra Info -tooltip.BloodMagic.diviner.currentDirection=Richtung: %s +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 Morgendämmerung: %d +tooltip.bloodmagic.diviner.dawnRune=Runen der Abenddämmerung: %d +tooltip.bloodmagic.diviner.totalRune=Runen insgesamt: %d +tooltip.bloodmagic.diviner.extraInfo=Halte Shift für extra Info +tooltip.bloodmagic.diviner.currentDirection=Richtung: %s -tooltip.BloodMagic.arcaneAshes=Asche gebraucht für einen alchemischen Kreis +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.weak=Benutzt, um Blöcke zu verschieben -tooltip.BloodMagic.telepositionFocus.enhanced=Benutzt, um Blöcke zu verschieben -tooltip.BloodMagic.telepositionFocus.reinforced=Benutzt, um Blöcke zu verschieben -tooltip.BloodMagic.telepositionFocus.demonic=Benutzt, um Blöcke zu teleportieren +tooltip.bloodmagic.telepositionFocus.coords=Koordinaten: (%d, %d, %d) +tooltip.bloodmagic.telepositionFocus.dimension=Dimensions-ID: %d +tooltip.bloodmagic.telepositionFocus.weak=Benutzt, um Blöcke zu verschieben +tooltip.bloodmagic.telepositionFocus.enhanced=Benutzt, um Blöcke zu verschieben +tooltip.bloodmagic.telepositionFocus.reinforced=Benutzt, um Blöcke zu verschieben +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=Giftungsresistenz -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.level=%s (Level %d) +tooltip.bloodmagic.livingArmour.upgrade.speed=Schnelle Füße +tooltip.bloodmagic.livingArmour.upgrade.digging=Zwergenhafte Stärke +tooltip.bloodmagic.livingArmour.upgrade.poisonResist=Giftungsresistenz +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.level=%s (Level %d) -tooltip.BloodMagic.will=Willensqualität: %1$,.2f -tooltip.BloodMagic.sentientSword.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.will=Willensqualität: %1$,.2f +tooltip.bloodmagic.sentientSword.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 # Ritual -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 gefederten 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 Bauches -ritual.BloodMagic.interdictionRitual=Ritual der Verbietung -ritual.BloodMagic.containmentRitual=Ritual des Einschlusses -ritual.BloodMagic.speedRitual=Ritual der Geschwindigkeit -ritual.BloodMagic.suppressionRitual=Ritual der Unterdrückung -ritual.BloodMagic.expulsionRitual=Aura der Vertreibung -ritual.BloodMagic.zephyrRitual=Ruf des Zephir +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 gefederten 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 Bauches +ritual.bloodmagic.interdictionRitual=Ritual der Verbietung +ritual.bloodmagic.containmentRitual=Ritual des Einschlusses +ritual.bloodmagic.speedRitual=Ritual der Geschwindigkeit +ritual.bloodmagic.suppressionRitual=Ritual der Unterdrückung +ritual.bloodmagic.expulsionRitual=Aura der Vertreibung +ritual.bloodmagic.zephyrRitual=Ruf des Zephir # 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.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.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.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.newUpgrade=Upgrade erworben! +chat.bloodmagic.livingArmour.upgrade.poisonRemove=Du fühlst dich schon wieder besser. +chat.bloodmagic.livingArmour.newUpgrade=Upgrade erworben! # JustEnoughItems -jei.BloodMagic.recipe.altar=Blutaltar -jei.BloodMagic.recipe.binding=Bindungsritual -jei.BloodMagic.recipe.alchemyArrayCrafting=Alchemische Anordnung -jei.BloodMagic.recipe.soulForge=Höllenfeuerschmiede -jei.BloodMagic.recipe.requiredLP=LP: %d -jei.BloodMagic.recipe.requiredTier=Ausbaustufe: %d -jei.BloodMagic.recipe.minimumSouls=Minimum: %d Wille -jei.BloodMagic.recipe.soulsDrained=Verbraucht: %d Wille +jei.bloodmagic.recipe.altar=Blutaltar +jei.bloodmagic.recipe.binding=Bindungsritual +jei.bloodmagic.recipe.alchemyArrayCrafting=Alchemische Anordnung +jei.bloodmagic.recipe.soulForge=Höllenfeuerschmiede +jei.bloodmagic.recipe.requiredLP=LP: %d +jei.bloodmagic.recipe.requiredTier=Ausbaustufe: %d +jei.bloodmagic.recipe.minimumSouls=Minimum: %d Wille +jei.bloodmagic.recipe.soulsDrained=Verbraucht: %d Wille -jei.BloodMagic.desc.altarBuilder=Ein Item 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. +jei.bloodmagic.desc.altarBuilder=Ein Item 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 -option.BloodMagic.bypassSneak=Umgehe Schleichen -option.BloodMagic.bloodAltar=Blutaltar -option.BloodMagic.ritualController=Ritualsteine -option.BloodMagic.teleposer=Teleposer +waila.bloodmagic.sneak=&oSchleiche für Info +option.bloodmagic.bypassSneak=Umgehe Schleichen +option.bloodmagic.bloodAltar=Blutaltar +option.bloodmagic.ritualController=Ritualsteine +option.bloodmagic.teleposer=Teleposer diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index b44a5716..dab626b3 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -1,786 +1,786 @@ #Creative Tab -itemGroup.BloodMagic.creativeTab=Blood Magic -itemGroup.BloodMagic.creativeTabTome=Blood Magic Upgrade Tomes +itemGroup.bloodmagic.creativeTab=Blood Magic +itemGroup.bloodmagic.creativeTabTome=Blood Magic Upgrade Tomes #Items -item.BloodMagic.activationCrystal.weak.name=Weak Activation Crystal -item.BloodMagic.activationCrystal.awakened.name=Awakened Activation Crystal -item.BloodMagic.activationCrystal.creative.name=Creative Activation Crystal +item.bloodmagic.activationCrystal.weak.name=Weak Activation Crystal +item.bloodmagic.activationCrystal.awakened.name=Awakened Activation Crystal +item.bloodmagic.activationCrystal.creative.name=Creative Activation Crystal -item.BloodMagic.sacrificialDagger.normal.name=Sacrificial Dagger -item.BloodMagic.sacrificialDagger.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.sacrificialDagger.normal.name=Sacrificial Dagger +item.bloodmagic.sacrificialDagger.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.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.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.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.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.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.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.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.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=Weak Blood Shard -item.BloodMagic.bloodShard.demon.name=Demon Blood Shard +item.bloodmagic.bloodShard.weak.name=Weak Blood Shard +item.bloodmagic.bloodShard.demon.name=Demon Blood Shard -item.BloodMagic.baseComponent.reagentWater.name=Water Reagent -item.BloodMagic.baseComponent.reagentLava.name=Lava Reagent -item.BloodMagic.baseComponent.reagentAir.name=Air Reagent -item.BloodMagic.baseComponent.reagentFastMiner.name=Mining Reagent -item.BloodMagic.baseComponent.reagentVoid.name=Void Reagent -item.BloodMagic.baseComponent.reagentGrowth.name=Growth Reagent -item.BloodMagic.baseComponent.reagentAffinity.name=Elemental Affinity Reagent -item.BloodMagic.baseComponent.reagentSight.name=Sight Reagent -item.BloodMagic.baseComponent.reagentBinding.name=Binding Reagent -item.BloodMagic.baseComponent.reagentSuppression.name=Suppression Reagent -item.BloodMagic.baseComponent.frameParts.name=Frame Parts -item.BloodMagic.baseComponent.reagentBloodLight.name=Blood Lamp Reagent -item.BloodMagic.baseComponent.reagentMagnetism.name=Magnetism Reagent -item.BloodMagic.baseComponent.reagentHaste.name=Haste Reagent -item.BloodMagic.baseComponent.reagentBridge.name=Phantom Bridge Reagent -item.BloodMagic.baseComponent.reagentCompression.name=Compression Reagent -item.BloodMagic.baseComponent.reagentSeverance.name=Severance Reagent -item.BloodMagic.baseComponent.reagentHolding.name=Holding Reagent -item.BloodMagic.baseComponent.reagentClaw.name=Claw Reagent -item.BloodMagic.baseComponent.reagentBounce.name=Elasticity Reagent -item.BloodMagic.baseComponent.reagentFrost.name=Frost Reagent +item.bloodmagic.baseComponent.reagentWater.name=Water Reagent +item.bloodmagic.baseComponent.reagentLava.name=Lava Reagent +item.bloodmagic.baseComponent.reagentAir.name=Air Reagent +item.bloodmagic.baseComponent.reagentFastMiner.name=Mining Reagent +item.bloodmagic.baseComponent.reagentVoid.name=Void Reagent +item.bloodmagic.baseComponent.reagentGrowth.name=Growth Reagent +item.bloodmagic.baseComponent.reagentAffinity.name=Elemental Affinity Reagent +item.bloodmagic.baseComponent.reagentSight.name=Sight Reagent +item.bloodmagic.baseComponent.reagentBinding.name=Binding Reagent +item.bloodmagic.baseComponent.reagentSuppression.name=Suppression Reagent +item.bloodmagic.baseComponent.frameParts.name=Frame Parts +item.bloodmagic.baseComponent.reagentBloodLight.name=Blood Lamp Reagent +item.bloodmagic.baseComponent.reagentMagnetism.name=Magnetism Reagent +item.bloodmagic.baseComponent.reagentHaste.name=Haste Reagent +item.bloodmagic.baseComponent.reagentBridge.name=Phantom Bridge Reagent +item.bloodmagic.baseComponent.reagentCompression.name=Compression Reagent +item.bloodmagic.baseComponent.reagentSeverance.name=Severance Reagent +item.bloodmagic.baseComponent.reagentHolding.name=Holding Reagent +item.bloodmagic.baseComponent.reagentClaw.name=Claw Reagent +item.bloodmagic.baseComponent.reagentBounce.name=Elasticity Reagent +item.bloodmagic.baseComponent.reagentFrost.name=Frost Reagent -item.BloodMagic.baseComponent.reagentTeleposition.name=Teleposition Reagent -item.BloodMagic.baseComponent.reagentTransposition.name=Transposition Reagent +item.bloodmagic.baseComponent.reagentTeleposition.name=Teleposition Reagent +item.bloodmagic.baseComponent.reagentTransposition.name=Transposition Reagent -item.BloodMagic.baseComponent.ironSand.name=Iron Sand -item.BloodMagic.baseComponent.goldSand.name=Gold Sand -item.BloodMagic.baseComponent.coalSand.name=Coal Sand -item.BloodMagic.baseComponent.plantOil.name=Plant Oil -item.BloodMagic.baseComponent.sulfur.name=Sulfur -item.BloodMagic.baseComponent.saltpeter.name=Saltpeter -item.BloodMagic.baseComponent.neurotoxin.name=Neuro Toxin -item.BloodMagic.baseComponent.antiseptic.name=Antiseptic +item.bloodmagic.baseComponent.ironSand.name=Iron Sand +item.bloodmagic.baseComponent.goldSand.name=Gold Sand +item.bloodmagic.baseComponent.coalSand.name=Coal Sand +item.bloodmagic.baseComponent.plantOil.name=Plant Oil +item.bloodmagic.baseComponent.sulfur.name=Sulfur +item.bloodmagic.baseComponent.saltpeter.name=Saltpeter +item.bloodmagic.baseComponent.neurotoxin.name=Neuro Toxin +item.bloodmagic.baseComponent.antiseptic.name=Antiseptic -item.BloodMagic.cuttingFluid.basicCuttingFluid.name=Basic Cutting Fluid -item.BloodMagic.cuttingFluid.explosive.name=Explosive Powder +item.bloodmagic.cuttingFluid.basicCuttingFluid.name=Basic Cutting Fluid +item.bloodmagic.cuttingFluid.explosive.name=Explosive Powder -item.BloodMagic.baseComponent.mundaneLength.name=Simple Lengthening Catalyst -item.BloodMagic.baseComponent.mundanePower.name=Simple Power Catalyst +item.bloodmagic.baseComponent.mundaneLength.name=Simple Lengthening Catalyst +item.bloodmagic.baseComponent.mundanePower.name=Simple Power Catalyst -item.BloodMagic.demonCrystal.crystalDefault.name=Demon Will Crystal -item.BloodMagic.demonCrystal.crystalCorrosive.name=Corrosive Will Crystal -item.BloodMagic.demonCrystal.crystalDestructive.name=Destructive Will Crystal -item.BloodMagic.demonCrystal.crystalVengeful.name=Vengeful Will Crystal -item.BloodMagic.demonCrystal.crystalSteadfast.name=Steadfast Will Crystal +item.bloodmagic.demonCrystal.crystalDefault.name=Demon Will Crystal +item.bloodmagic.demonCrystal.crystalCorrosive.name=Corrosive Will Crystal +item.bloodmagic.demonCrystal.crystalDestructive.name=Destructive Will Crystal +item.bloodmagic.demonCrystal.crystalVengeful.name=Vengeful Will Crystal +item.bloodmagic.demonCrystal.crystalSteadfast.name=Steadfast Will Crystal -item.BloodMagic.monsterSoul.base.name=Demonic Will -item.BloodMagic.monsterSoul.corrosive.name=Corrosive Demonic Will -item.BloodMagic.monsterSoul.destructive.name=Destructive Demonic Will -item.BloodMagic.monsterSoul.vengeful.name=Vengeful Demonic Will -item.BloodMagic.monsterSoul.steadfast.name=Steadfast Demonic Will +item.bloodmagic.monsterSoul.base.name=Demonic Will +item.bloodmagic.monsterSoul.corrosive.name=Corrosive Demonic Will +item.bloodmagic.monsterSoul.destructive.name=Destructive Demonic Will +item.bloodmagic.monsterSoul.vengeful.name=Vengeful Demonic Will +item.bloodmagic.monsterSoul.steadfast.name=Steadfast Demonic Will -item.BloodMagic.sigil.air.name=Air Sigil -item.BloodMagic.sigil.bloodLight.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.greenGrove.name=Sigil of the Green Grove -item.BloodMagic.sigil.elementalAffinity.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.fastMiner.name=Sigil of the Fast Miner -item.BloodMagic.sigil.seer.name=Seer's Sigil -item.BloodMagic.sigil.phantomBridge.name=Sigil of the Phantom Bridge -item.BloodMagic.sigil.whirlwind.name=Sigil of the Whirlwind -item.BloodMagic.sigil.enderSeverance.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.sigil.air.name=Air Sigil +item.bloodmagic.sigil.bloodLight.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.greenGrove.name=Sigil of the Green Grove +item.bloodmagic.sigil.elementalAffinity.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.fastMiner.name=Sigil of the Fast Miner +item.bloodmagic.sigil.seer.name=Seer's Sigil +item.bloodmagic.sigil.phantomBridge.name=Sigil of the Phantom Bridge +item.bloodmagic.sigil.whirlwind.name=Sigil of the Whirlwind +item.bloodmagic.sigil.enderSeverance.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.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.altarMaker.name=Altar Maker -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.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.upgradeTrainer.name=Living Armour Training Bracelet +item.bloodmagic.arcaneAshes.name=Arcane Ashes +item.bloodmagic.upgradeTome.name=Living Armour Upgrade 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.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.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.experienceTome.name=Tome of Peritia -item.BloodMagic.sanguineBook.name=Inspectoris Scandalum +item.bloodmagic.experienceTome.name=Tome of Peritia +item.bloodmagic.sanguineBook.name=Inspectoris Scandalum -item.BloodMagic.livingPointUpgrade.draftAngelus.name=Draft of Angelus +item.bloodmagic.livingPointUpgrade.draftAngelus.name=Draft of Angelus -item.BloodMagic.willGauge.name=Demon Will Aura Gauge -item.BloodMagic.potionFlask.name=Potion Flask +item.bloodmagic.willGauge.name=Demon Will Aura Gauge +item.bloodmagic.potionFlask.name=Potion Flask # Blocks -tile.BloodMagic.fluid.lifeEssence.name=Life Essence +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.master.name=Master Ritual Stone +tile.bloodmagic.stone.ritual.imperfect.name=Imperfect Ritual Stone -tile.BloodMagic.altar.name=Blood Altar -tile.BloodMagic.alchemyArray.name=&r&fAlchemy Array +tile.bloodmagic.altar.name=Blood Altar +tile.bloodmagic.alchemyArray.name=&r&fAlchemy 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.selfsacrifice.name=Rune of Self Sacrifice -tile.BloodMagic.rune.displacement.name=Displacement Rune -tile.BloodMagic.rune.capacity.name=Rune of Capacity -tile.BloodMagic.rune.augcapacity.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.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.selfsacrifice.name=Rune of Self Sacrifice +tile.bloodmagic.rune.displacement.name=Displacement Rune +tile.bloodmagic.rune.capacity.name=Rune of Capacity +tile.bloodmagic.rune.augcapacity.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.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.bloodstonebrick.large.name=Large Bloodstone Brick -tile.BloodMagic.bloodstonebrick.brick.name=Bloodstone Brick -tile.BloodMagic.crystal.large.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.bloodstonebrick.large.name=Large Bloodstone Brick +tile.bloodmagic.bloodstonebrick.brick.name=Bloodstone Brick +tile.bloodmagic.crystal.large.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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 +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 # Tooltips -tooltip.BloodMagic.extraInfo=&9-Hold shift for more info- +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.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.activated=Activated +tooltip.bloodmagic.deactivated=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.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.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.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.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.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.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.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.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.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.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.pack.selfSacrifice.desc=This pack really chafes... +tooltip.bloodmagic.pack.sacrifice.desc=Description +tooltip.bloodmagic.pack.stored=Stored: %d LP -tooltip.BloodMagic.activationCrystal.weak=Activates low-level rituals -tooltip.BloodMagic.activationCrystal.awakened=Activates more powerful rituals -tooltip.BloodMagic.activationCrystal.creative=Creative Only - Activates any ritual +tooltip.bloodmagic.activationCrystal.weak=Activates low-level rituals +tooltip.bloodmagic.activationCrystal.awakened=Activates more powerful rituals +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=&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.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=&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.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.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.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.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.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.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.level=%s (Level %d) -tooltip.BloodMagic.livingArmour.upgrade.progress=%s (%d/100) -tooltip.BloodMagic.livingArmour.upgrade.points=&6Upgrade points: %s / %s +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.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.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.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.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 +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.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.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.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.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.decoration.safe=Safe for decoration +tooltip.bloodmagic.decoration.notSafe=Dangerous for decoration -tooltip.BloodMagic.cuttingFluidRatio=%d/%d uses remaining +tooltip.bloodmagic.cuttingFluidRatio=%d/%d uses remaining -tooltip.BloodMagic.potion.uses=%d uses remaining +tooltip.bloodmagic.potion.uses=%d uses remaining -tooltip.BloodMagic.book.shifting=These symbols seem to be... &oshifting... +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. +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.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.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.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.downgradeRitual=Penance of the Leadened Soul +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.downgradeRitual=Penance of the Leadened Soul -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.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 opperation. 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.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 opperation. 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.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.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.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.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.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) Mobs 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) -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.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.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) Mobs 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) +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.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.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. Wether 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 truely 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.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. Wether 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 truely 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... # 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.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.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.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.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.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.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.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. +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. # entity -entity.BloodMagic.SentientSpecter.name=Sentient Specter -entity.BloodMagic.Mimic.name=Mimic +entity.bloodmagic.SentientSpecter.name=Sentient Specter +entity.bloodmagic.Mimic.name=Mimic # sekrit -secret.BloodMagic.bread.bloody=&r&cBloody Bread -secret.BloodMagic.bread.bloody.desc=Only for &odire &r&7emergencies. +secret.bloodmagic.bread.bloody=&r&cBloody Bread +secret.bloodmagic.bread.bloody.desc=Only for &odire &r&7emergencies. # Commands commands.error.arg.invalid=Invalid arguments @@ -841,42 +841,42 @@ commands.soulnetwork.fillMax.success=Successfully filled %s's Soul Network to th commands.soulnetwork.create.success=Successfully created %s's Soul Network (Orb tier: %d) # GUI -tile.BloodMagic.inputNode.name=Input Node -tile.BloodMagic.outputNode.name=Output Node +tile.bloodmagic.inputNode.name=Input Node +tile.bloodmagic.outputNode.name=Output Node # Keybinds -BloodMagic.keybind.open_holding=Open Sigil of Holding -BloodMagic.keybind.cycle_holding_pos=Cycle Sigil (+) -BloodMagic.keybind.cycle_holding_neg=Cycle Sigil (-) +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.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. +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 +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 diff --git a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang index 22fa2570..6f2638be 100644 --- a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang +++ b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang @@ -1,555 +1,555 @@ #Creative Tab -itemGroup.BloodMagic.creativeTab=Blood Magic -itemGroup.BloodMagic.creativeTabTome=Blood Magic Tômes d'Améliorations +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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.experienceTome.name=Tôme de Peritia +item.bloodmagic.sanguineBook.name=Livre Sanguin -item.BloodMagic.livingPointUpgrade.draftAngelus.name=Draft d'Angelus +item.bloodmagic.livingPointUpgrade.draftAngelus.name=Draft d'Angelus # Blocks -tile.BloodMagic.fluid.lifeEssence.name=Essence de Vie +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.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=&r&fÉtalage d'Alchimie +tile.bloodmagic.altar.name=Autel de Sang +tile.bloodmagic.alchemyArray.name=&r&fÉ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.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.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.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.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.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.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.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 +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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.decoration.safe=Safe for decoration +tooltip.bloodmagic.decoration.notSafe=Dangerous for decoration -tooltip.BloodMagic.cuttingFluidRatio=%d/%d uses remaining +tooltip.bloodmagic.cuttingFluidRatio=%d/%d uses remaining -tooltip.BloodMagic.book.shifting=These symbols seem to be... &oshifting... +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.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.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.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.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.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.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. +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.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.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.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.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.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.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.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. +secret.bloodmagic.bread.bloody=&r&cBloody Bread +secret.bloodmagic.bread.bloody.desc=Only for &odire &r&7emergencies. # Commands commands.error.arg.invalid=Invalid arguments @@ -610,35 +610,35 @@ commands.soulnetwork.fillMax.success=Successfully filled %s's Soul Network to th commands.soulnetwork.create.success=Successfully created %s's Soul Network (Orb tier: %d) # Keybinds -BloodMagic.keybind.openSigilHolding=Open Sigil of Holding +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.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. +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 +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 diff --git a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang index a09ef5ed..dbc0a372 100644 --- a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang +++ b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang @@ -1,743 +1,743 @@ #Creative Tab -itemGroup.BloodMagic.creativeTab=Blood Magic -itemGroup.BloodMagic.creativeTabTome=Blood Magic å¼·åŒ–ã®æ›¸ +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.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.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.lavaCrystal.name=溶岩ã®ã‚¯ãƒªã‚¹ã‚¿ãƒ« -item.BloodMagic.bound.sword.name=çµåˆã—ãŸå‰£ -item.BloodMagic.bound.pickaxe.name=çµåˆã—ãŸãƒ„ルãƒã‚· -item.BloodMagic.bound.axe.name=çµåˆã—ãŸæ–§ -item.BloodMagic.bound.shovel.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.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.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.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.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.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.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.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.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.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.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.cuttingFluid.basicCuttingFluid.name=基礎切削液 +item.bloodmagic.cuttingFluid.explosive.name=爆薬 -item.BloodMagic.baseComponent.mundaneLength.name=ç°¡ç´ ãªå»¶é•·è§¦åª’ -item.BloodMagic.baseComponent.mundanePower.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.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.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.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.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.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.altarMaker.name=祭壇メーカー -item.BloodMagic.ritualDivinernormal.name=å„€å¼ã®å ã„棒 -item.BloodMagic.ritualDivinerdusk.name=å„€å¼ã®å ã„棒 [黄æ˜] -item.BloodMagic.ritualDivinerdawn.name=å„€å¼ã®å ã„棒 [æš] -item.BloodMagic.ritualReader.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.upgradeTrainer.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.sentientAxe.name=ç†åŠ›ã®æ–§ -item.BloodMagic.sentientPickaxe.name=ç†åŠ›ã®ãƒ„ルãƒã‚· -item.BloodMagic.sentientShovel.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.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.experienceTome.name=ãƒšãƒªãƒ†ã‚£ã‚¢ã®æ›¸ -item.BloodMagic.sanguineBook.name=インスペクトリス・スカンダルム +item.bloodmagic.experienceTome.name=ãƒšãƒªãƒ†ã‚£ã‚¢ã®æ›¸ +item.bloodmagic.sanguineBook.name=インスペクトリス・スカンダルム -item.BloodMagic.livingPointUpgrade.draftAngelus.name=アンジェラスã®ä¸€é£²ã¿ +item.bloodmagic.livingPointUpgrade.draftAngelus.name=アンジェラスã®ä¸€é£²ã¿ -item.BloodMagic.willGauge.name=デーモンウィルオーラ計測器 -item.BloodMagic.potionFlask.name=フラスコ入りãƒãƒ¼ã‚·ãƒ§ãƒ³ +item.bloodmagic.willGauge.name=デーモンウィルオーラ計測器 +item.bloodmagic.potionFlask.name=フラスコ入りãƒãƒ¼ã‚·ãƒ§ãƒ³ # Blocks -tile.BloodMagic.fluid.lifeEssence.name=ライフエッセンス +tile.bloodmagic.fluid.lifeEssence.name=ライフエッセンス -tile.BloodMagic.stone.ritual.master.name=マスター儀å¼çŸ³ -tile.BloodMagic.stone.ritual.imperfect.name=簡易儀å¼çŸ³ +tile.bloodmagic.stone.ritual.master.name=マスター儀å¼çŸ³ +tile.bloodmagic.stone.ritual.imperfect.name=簡易儀å¼çŸ³ -tile.BloodMagic.altar.name=è¡€ã®ç¥­å£‡ -tile.BloodMagic.alchemyArray.name=&r&f錬金術魔法陣 +tile.bloodmagic.altar.name=è¡€ã®ç¥­å£‡ +tile.bloodmagic.alchemyArray.name=&r&f錬金術魔法陣 -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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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=䏿´»æ€§ã®çŸ³ã®éšŽæ®µ +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.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.orb.desc=加工å‰ã®ãƒ©ã‚¤ãƒ•ã‚¨ãƒƒã‚»ãƒ³ã‚¹ã§æº€ã¡ã¦ã„ã‚‹ +tooltip.bloodmagic.orb.owner=以下ã«ã‚ˆã‚‹è¿½åŠ è¦ç´ ï¼š %s +tooltip.bloodmagic.currentOwner=ç¾åœ¨ã®æ‰€æœ‰è€…: %s +tooltip.bloodmagic.currentTier=祭壇ã®ã‚°ãƒ¬ãƒ¼ãƒ‰ï¼š %d +tooltip.bloodmagic.config.disabled=ç¾åœ¨configã«ã‚ˆã‚Šç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ -tooltip.BloodMagic.activated=アクティブ -tooltip.BloodMagic.deactivated=éžã‚¢ã‚¯ãƒ†ã‚£ãƒ– +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.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.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.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.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.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.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.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.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.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.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.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.level=%s (Lv %d) -tooltip.BloodMagic.livingArmour.upgrade.progress=%s (%d/100) -tooltip.BloodMagic.livingArmour.upgrade.points=&6強化ãƒã‚¤ãƒ³ãƒˆï¼š %s / %s +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.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.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.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.itemFilter.ignoreNBT=NBTã‚¿ã‚°ã§ãƒ•ィルタã—ã¾ã™ +tooltip.bloodmagic.itemFilter.modItems=特定MODã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’フィルタã—ã¾ã™ +tooltip.bloodmagic.itemFilter.oreDict=鉱石辞書を用ã„ã¦ãƒ•ィルタã—ã¾ã™ -tooltip.BloodMagic.fluid.type=液体を格ç´ã™ã‚‹ -tooltip.BloodMagic.fluid.amount=é‡ -tooltip.BloodMagic.fluid.capacity=æœ€å¤§å®¹é‡ +tooltip.bloodmagic.fluid.type=液体を格ç´ã™ã‚‹ +tooltip.bloodmagic.fluid.amount=é‡ +tooltip.bloodmagic.fluid.capacity=æœ€å¤§å®¹é‡ -tooltip.BloodMagic.ghost.everything=全㦠-tooltip.BloodMagic.ghost.amount=幻影アイテムã®å€‹æ•°ï¼š %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.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.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.experienceTome=経験値を貯蔵ã™ã‚‹ã®ã«ç”¨ã„る本 +tooltip.bloodmagic.experienceTome.exp=Exp: %0.3f +tooltip.bloodmagic.experienceTome.expLevel=レベル: %d -tooltip.BloodMagic.decoration.safe=安全ãªè£…飾 -tooltip.BloodMagic.decoration.notSafe=å±é™ºãªè£…飾 +tooltip.bloodmagic.decoration.safe=安全ãªè£…飾 +tooltip.bloodmagic.decoration.notSafe=å±é™ºãªè£…飾 -tooltip.BloodMagic.cuttingFluidRatio=%d/%d 回使用å¯èƒ½ +tooltip.bloodmagic.cuttingFluidRatio=%d/%d 回使用å¯èƒ½ -tooltip.BloodMagic.potion.uses=%d 回使用å¯èƒ½ +tooltip.bloodmagic.potion.uses=%d 回使用å¯èƒ½ -tooltip.BloodMagic.book.shifting=紋様ãŒ... &oShiftã—ã¦... +tooltip.bloodmagic.book.shifting=紋様ãŒ... &oShiftã—ã¦... -tooltip.BloodMagic.willGauge=大気中ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«ã‚’測定ã§ãる奇妙ãªè£…置。 +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.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.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.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.greenGroveRitual.info=エリア内ã®ä½œç‰©ã‚’育æˆã•ã›ã¾ã™ã€‚ -ritual.BloodMagic.jumpRitual.info=空中ã«ã¯ã­é£›ã¶åŠ¹æžœã‚’ä»˜ä¸Žã—ã¾ã™ã€‚ -ritual.BloodMagic.wellOfSufferingRitual.info=生物ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã‚¨ãƒªã‚¢ã‚’生æˆã—ã€ä»˜è¿‘ã®è¡€ã®ç¥­å£‡ã«LPを供給ã—ã¾ã™ã€‚ -ritual.BloodMagic.featheredKnifeRitual.info=プレイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã‚¨ãƒªã‚¢ã‚’生æˆã—ã€ä»˜è¿‘後ã®ç¥­å£‡ã«LPを供給ã—ã¾ã™ã€‚ -ritual.BloodMagic.regenerationRitual.info=エリア内ã«HPãŒæ¸›å°‘ã—ã¦ã„る生物ãŒã„ãŸå ´åˆã€å†ç”Ÿèƒ½åŠ›ã‚’ä»˜ä¸Žã—ã¾ã™ã€‚ -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.greenGroveRitual.corrosive.info=(è…食性) 作物ã®å‘¨å›²ã«ã„ã‚‹ç”Ÿç‰©ã¯æ”»æ’ƒã‚’å—ã‘ã€ç”Ÿå‘½åŠ›ãŒä½œç‰©ã«å¸åŽã•れる。 -ritual.BloodMagic.greenGroveRitual.default.info=(原生) オーラ中ã®ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦å…¨ã¦ã®å„€å¼ã®ä½œå‹•速度ãŒå‘上ã—ã¾ã™ã€‚ -ritual.BloodMagic.greenGroveRitual.steadfast.info=(䏿´»æ€§) 種をæ¤ãˆç›´ã—ã€æ½…水範囲ã«ã‚るブロックを湿らã›ã‚‹ã€‚ +ritual.bloodmagic.waterRitual.info=マスター儀å¼çŸ³ã‹ã‚‰æ°´æºã‚’生æˆã—ã¾ã™ã€‚ +ritual.bloodmagic.lavaRitual.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.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.greenGroveRitual.corrosive.info=(è…食性) 作物ã®å‘¨å›²ã«ã„ã‚‹ç”Ÿç‰©ã¯æ”»æ’ƒã‚’å—ã‘ã€ç”Ÿå‘½åŠ›ãŒä½œç‰©ã«å¸åŽã•れる。 +ritual.bloodmagic.greenGroveRitual.default.info=(原生) オーラ中ã®ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦å…¨ã¦ã®å„€å¼ã®ä½œå‹•速度ãŒå‘上ã—ã¾ã™ã€‚ +ritual.bloodmagic.greenGroveRitual.steadfast.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=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.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.fireFuse.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.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.forsakenSoulRitual.crystal.info=(çµæ™¶) å„€å¼ã«ã‚ˆã£ã¦ç”Ÿç‰©ãŒæ­»äº¡ã—ãŸéš›ã«ã€ã“ã®ç¯„囲内ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«çµæ™¶ã®æˆé•·ãŒä¿ƒé€²ã—ã¾ã™ã€‚ -ritual.BloodMagic.forsakenSoulRitual.damage.info=(ダメージ) ã“ã®ç¯„囲内ã®ç”Ÿç‰©ã¯å¾ã€…ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘ã€æ­»äº¡ã—ãŸéš›ã®ã‚¦ã‚£ãƒ«ãŒã‚¯ãƒªã‚¹ã‚¿ãƒ«ã®æˆé•·ã«åˆ©ç”¨ã•れã¾ã™ã€‚ -ritual.BloodMagic.crystalHarvestRitual.crystal.info=(çµæ™¶) æžå‡ºã—ãŸå…¨ã¦ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«çµæ™¶æ ªã‚’破壊ã—ã¦å˜çµæ™¶ã®çµæ™¶ã«ã—ã¾ã™ã€‚çµæ™¶æ ªãŒ1ã¤ã ã‘ã«ãªã£ãŸå ´åˆã¯ç ´å£Šã—ãªã„。 +ritual.bloodmagic.waterRitual.waterRange.info=(æ°´) 設定ã—ãŸã‚¨ãƒªã‚¢ã«æ°´æºã‚’生æˆã•ã›ã¾ã™ã€‚ +ritual.bloodmagic.lavaRitual.lavaRange.info=(溶岩) 設定ã—ãŸã‚¨ãƒªã‚¢ã«æº¶å²©æºã‚’生æˆã•ã›ã¾ã™ã€‚ +ritual.bloodmagic.lavaRitual.fireFuse.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.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.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.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.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=ã•ã‚ã€ãŠå‰ã®é¸æŠžæ¬¡ç¬¬ã ï¼šç¥­å£‡ã«è·ªãã‹ã€å·±ã®å‰£ã‚’執り続ã‘ã‚‹ã®ã‹ï¼Ÿ # Chat -chat.BloodMagic.altarMaker.setTier=グレードを設定: %d -chat.BloodMagic.altarMaker.building=グレード %dã®ç¥­å£‡ã‚’ä½œæˆ -chat.BloodMagic.altarMaker.destroy=グレード %dã®ç¥­å£‡ã‚’破壊 -chat.BloodMagic.altarMaker.creativeOnly=ã“れã¯ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–モード専用アイテムã§ã™ã€‚ +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.damageSource=%sã®é­‚ã¯éžå¸¸ã«å¼±ããªã£ã¦ã„ã¾ã™ -chat.BloodMagic.ritual.weak=エãƒãƒ«ã‚®ãƒ¼ã®æµã‚ŒãŒæ„Ÿã˜ã‚‰ã‚Œã‚‹ãŒã€å„€å¼ã®èµ·å‹•ã«ã¯ä½•ã‹ãŒè¶³ã‚Šãªã„よã†ã ã€‚ -chat.BloodMagic.ritual.prevent=å„€å¼ãŒã‚ãªãŸã«æ¿€ã—ãæŠµæŠ—ã—ã¦ã„ã‚‹ï¼ -chat.BloodMagic.ritual.activate=エãƒãƒ«ã‚®ãƒ¼ã®å¥”æµãŒå„€å¼ã«æµã‚Œè¾¼ã‚€ï¼ -chat.BloodMagic.ritual.notValid=ã‚ãªãŸã¯ãƒ«ãƒ¼ãƒ³ã®é…ç½®ãŒæ­£ã—ããªã„よã†ã«æ„Ÿã˜ãŸ... +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.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.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.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.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 ブロック +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=ミミック +entity.bloodmagic.SentientSpecter.name=ç†åŠ›ã®éœŠé­‚ +entity.bloodmagic.Mimic.name=ミミック # sekrit -secret.BloodMagic.bread.bloody=&r&cè¡€ã®ãƒ‘ン -secret.BloodMagic.bread.bloody.desc=&o切迫ã—ãŸ&r&7緊急時専用 +secret.bloodmagic.bread.bloody=&r&cè¡€ã®ãƒ‘ン +secret.bloodmagic.bread.bloody.desc=&o切迫ã—ãŸ&r&7緊急時専用 # Commands commands.error.arg.invalid=無効ãªå¼•æ•°ã§ã™ @@ -798,41 +798,41 @@ commands.soulnetwork.fillMax.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ commands.soulnetwork.create.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’構築ã—ã¾ã—ãŸ(オーブã®ã‚°ãƒ¬ãƒ¼ãƒ‰ï¼š %d) # GUI -tile.BloodMagic.inputNode.name=入力ノード -tile.BloodMagic.outputNode.name=出力ノード +tile.bloodmagic.inputNode.name=入力ノード +tile.bloodmagic.outputNode.name=出力ノード # Keybinds -BloodMagic.keybind.open_holding=貯蔵ã®å°ç« ã‚’é–‹ã -BloodMagic.keybind.cycle_holding_pos=å°ç« ã‚’é †ã«å›žã™ (+) -BloodMagic.keybind.cycle_holding_neg=å°ç« ã‚’逆ã«å›žã™ (-) +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.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.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.recipe.lpDrained=消費: %,d LP +jei.bloodmagic.recipe.ticksRequired=時間: %,d Ticks -jei.BloodMagic.desc.altarBuilder=デãƒãƒƒã‚°ã‚„テストã«åˆ©ç”¨ã™ã‚‹ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–モード専用アイテム。\n\nShift+å³ã‚¯ãƒªãƒƒã‚¯ã§ä½œæˆã™ã‚‹ã‚°ãƒ¬ãƒ¼ãƒ‰ã®å¤‰æ›´ã‚’行ã„ã€å³ã‚¯ãƒªãƒƒã‚¯ã§ç¥­å£‡ã‚’構築。\n\nè¡€ã®ç¥­å£‡ã‚’左クリックã§å„€å¼çŸ³ã”ã¨ç ´å£Šã•れã¾ã™ã€‚ -jei.BloodMagic.desc.demonicWill=生物ãŒå†…包ã™ã‚‹æ‚ªé­”ã®å› å­ã€‚\n\nMobã‚’ç†åŠ›ã®å‰£ã«ã‚ˆã£ã¦æ®ºå®³ã™ã‚‹ã€ã¾ãŸã¯ç°¡ç´ ãªæŠ•ã’罠を投ã’ã€ç™½ã„パーティクルãŒç™ºç”Ÿã—ã¦ã„ã‚‹é–“ã«æ®ºå®³ã™ã‚‹ã“ã¨ã§å…¥æ‰‹ãŒã§ãる。 +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=錬金術魔法陣 +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=血紅ã®ç§˜å„€ diff --git a/src/main/resources/assets/bloodmagic/lang/ko_KR.lang b/src/main/resources/assets/bloodmagic/lang/ko_KR.lang index 7daaacae..5787e851 100644 --- a/src/main/resources/assets/bloodmagic/lang/ko_KR.lang +++ b/src/main/resources/assets/bloodmagic/lang/ko_KR.lang @@ -184,7 +184,7 @@ item.itemTankSegmenter.name=Alchemic Segmenter item.destinationClearer.name=Alchemic Cleanser #Creative Tab -itemGroup.tabBloodMagic=선혈ì˜ë§ˆìˆ [Blood Magic] +itemGroup.tabbloodmagic=선혈ì˜ë§ˆìˆ [Blood Magic] #Extra Strings bm.string.consume=사용량 diff --git a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang index 9348eb90..47c36889 100644 --- a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang +++ b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang @@ -1,399 +1,399 @@ -#Creative Tab -itemGroup.BloodMagic.creativeTab=Blood Magic -itemGroup.BloodMagic.creativeTabTome=Blood Magic Upgrade Tomes +#Creative Tab +itemGroup.bloodmagic.creativeTab=Blood Magic +itemGroup.bloodmagic.creativeTabTome=Blood Magic Upgrade Tomes #Items -item.BloodMagic.activationCrystal.weak.name=Слабый криÑтал активации -item.BloodMagic.activationCrystal.awakened.name=Пробуждённый криÑтал активации -item.BloodMagic.activationCrystal.creative.name=ТворчеÑкий криÑтал активации +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=Blood Letter's Pack -item.BloodMagic.pack.sacrifice.name=Coat of Arms -item.BloodMagic.daggerOfSacrifice.name=Кинжал Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð¿Ñ€Ð¸Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ +item.bloodmagic.sacrificialDagger.normal.name=Жертвенный кинжал +item.bloodmagic.sacrificialDagger.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.lavaCrystal.name=Лавовый криÑтал -item.BloodMagic.bound.sword.name=СвÑзанный клинок -item.BloodMagic.bound.pickaxe.name=СвÑÐ·Ð°Ð½Ð½Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° -item.BloodMagic.bound.axe.name=СвÑзанный топор -item.BloodMagic.bound.shovel.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.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.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.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.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.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.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=Слабый кровавый оÑколок -item.BloodMagic.bloodShard.demon.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.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.baseComponent.reagentTeleposition.name=Реагент телепозиции +item.bloodmagic.baseComponent.reagentTransposition.name=Реагент транÑпозиции -item.BloodMagic.monsterSoul.base.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.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.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.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=Altar Maker +item.bloodmagic.altarMaker.name=Altar Maker -item.BloodMagic.ritualDivinernormal.name=ПредÑказатель ритуала -item.BloodMagic.ritualDivinerdusk.name=ПредÑказатель ритуала [Сумерки] -item.BloodMagic.ritualDivinerdawn.name=ПредÑказатель ритуала [РаÑÑвет] +item.bloodmagic.ritualDivinernormal.name=ПредÑказатель ритуала +item.bloodmagic.ritualDivinerdusk.name=ПредÑказатель ритуала [Сумерки] +item.bloodmagic.ritualDivinerdawn.name=ПредÑказатель ритуала [РаÑÑвет] -item.BloodMagic.arcaneAshes.name=Волшебный пепел -item.BloodMagic.upgradeTome.name=Living Armour Upgrade Tome -item.BloodMagic.upgradeTrainer.name=Living Armour Training Bracelet +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.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=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.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 фильтр предметов # Blocks -tile.BloodMagic.fluid.lifeEssence.name=Ð–Ð¸Ð·Ð½ÐµÐ½Ð½Ð°Ñ ÑÑÑÐµÐ½Ñ†Ð¸Ñ +tile.bloodmagic.fluid.lifeEssence.name=Ð–Ð¸Ð·Ð½ÐµÐ½Ð½Ð°Ñ ÑÑÑÐµÐ½Ñ†Ð¸Ñ -tile.BloodMagic.stone.ritual.master.name=Главный ритуальный камень -tile.BloodMagic.stone.ritual.imperfect.name=Ðеполноценный ритуальный камень +tile.bloodmagic.stone.ritual.master.name=Главный ритуальный камень +tile.bloodmagic.stone.ritual.imperfect.name=Ðеполноценный ритуальный камень -tile.BloodMagic.altar.name=Кровавый алтарь -tile.BloodMagic.alchemyArray.name=&r&fÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° +tile.bloodmagic.altar.name=Кровавый алтарь +tile.bloodmagic.alchemyArray.name=&r&fÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° -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.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.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.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.teleposer.name=Телепозер +tile.bloodmagic.soulForge.name=ÐдÑÐºÐ°Ñ ÐºÑƒÐ·Ð½Ð¸Ñ†Ð° +tile.bloodmagic.demonCrucible.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.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.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.dimensionalPortal.name=ПроÑтранÑтвенный портал +tile.bloodmagic.bloodTank.name=Резервуар крови # Tooltips -tooltip.BloodMagic.orb.desc=Хранит жизненную ÑÑÑенцию -tooltip.BloodMagic.orb.owner=Создан: %s -tooltip.BloodMagic.currentOwner=Владелец: %s -tooltip.BloodMagic.currentTier=Уровень: %d -tooltip.BloodMagic.config.disabled=Запрещено наÑтройками +tooltip.bloodmagic.orb.desc=Хранит жизненную ÑÑÑенцию +tooltip.bloodmagic.orb.owner=Создан: %s +tooltip.bloodmagic.currentOwner=Владелец: %s +tooltip.bloodmagic.currentTier=Уровень: %d +tooltip.bloodmagic.config.disabled=Запрещено наÑтройками -tooltip.BloodMagic.activated=Ðктивирован -tooltip.BloodMagic.deactivated=Деактивирован +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.currentBonus=БонуÑ: +%,d%% -tooltip.BloodMagic.sigil.water.desc=&oÐужна вода? -tooltip.BloodMagic.sigil.lava.desc=&oГОРЯЧЕЕ! ÐЕ ЕСТЬ! -tooltip.BloodMagic.sigil.void.desc=&oЛучше чем Swiffer! -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.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.currentBonus=БонуÑ: +%,d%% +tooltip.bloodmagic.sigil.water.desc=&oÐужна вода? +tooltip.bloodmagic.sigil.lava.desc=&oГОРЯЧЕЕ! ÐЕ ЕСТЬ! +tooltip.bloodmagic.sigil.void.desc=&oЛучше чем Swiffer! +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.teleposition.desc=Я очень близок к возможноÑти перемещениÑ. +tooltip.bloodmagic.sigil.transposition.desc=Ощути Силу, мой юный ученик. -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.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.sacrificialDagger.desc=Ðебольшой надрез на пальце... +tooltip.bloodmagic.slate.desc=Камень, наполненный в кровавом алтаре +tooltip.bloodmagic.inscriber.desc=ÐадпиÑи на Ñтене... -tooltip.BloodMagic.pack.selfSacrifice.desc=This pack really chafes... -tooltip.BloodMagic.pack.sacrifice.desc=Description -tooltip.BloodMagic.pack.stored=Ðакоплено: %,d LP +tooltip.bloodmagic.pack.selfSacrifice.desc=This pack really chafes... +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.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=Shift Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации -tooltip.BloodMagic.diviner.currentDirection=Ðаправление: %s +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=Shift Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации +tooltip.bloodmagic.diviner.currentDirection=Ðаправление: %s -tooltip.BloodMagic.arcaneAshes=Пепел Ð´Ð»Ñ Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ð°Ð»Ñ…Ð¸Ð¼Ð¸Ñ‡ÐµÑких знаков +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.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.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.level=%s (Уровень %d) -tooltip.BloodMagic.livingArmour.upgrade.points=&6Очки улучшениÑ: %s / %s +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.level=%s (Уровень %d) +tooltip.bloodmagic.livingArmour.upgrade.points=&6Очки улучшениÑ: %s / %s -tooltip.BloodMagic.will=Энергии: %1$,.2f -tooltip.BloodMagic.sentientSword.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.will=Энергии: %1$,.2f +tooltip.bloodmagic.sentientSword.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.itemFilter.exact=Требует точного ÑоответÑÑ‚Ð²Ð¸Ñ +tooltip.bloodmagic.itemFilter.ignoreNBT=ПозволÑет игнорировать NBT +tooltip.bloodmagic.itemFilter.modItems=ПозволÑет отобрать предметы из одного мода +tooltip.bloodmagic.itemFilter.oreDict=Фильтр иÑпользующий Ore Dictionary -tooltip.BloodMagic.fluid.type=Содержит -tooltip.BloodMagic.fluid.amount=Кол-во -tooltip.BloodMagic.fluid.capacity=ÐмкоÑть +tooltip.bloodmagic.fluid.type=Содержит +tooltip.bloodmagic.fluid.amount=Кол-во +tooltip.bloodmagic.fluid.capacity=ÐмкоÑть # 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.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.cobblestoneRitual=Le Vulcanos Frigius -ritual.BloodMagic.placerRitual=Ðаполнитель -ritual.BloodMagic.fellingRitual=ДровоÑек -ritual.BloodMagic.pumpRitual=Гимн откачки -ritual.BloodMagic.altarBuilderRitual=Строитель Ð°Ð»Ñ‚Ð°Ñ€Ñ -ritual.BloodMagic.portalRitual=Ритуал врат +ritual.bloodmagic.cobblestoneRitual=Le Vulcanos Frigius +ritual.bloodmagic.placerRitual=Ðаполнитель +ritual.bloodmagic.fellingRitual=ДровоÑек +ritual.bloodmagic.pumpRitual=Гимн откачки +ritual.bloodmagic.altarBuilderRitual=Строитель Ð°Ð»Ñ‚Ð°Ñ€Ñ +ritual.bloodmagic.portalRitual=Ритуал врат # Chat -chat.BloodMagic.altarMaker.setTier=УÑтановить уровень: %d -chat.BloodMagic.altarMaker.building=СтроитÑÑ Ð°Ð»Ñ‚Ð°Ñ€ÑŒ %d ÑƒÑ€Ð¾Ð²Ð½Ñ -chat.BloodMagic.altarMaker.destroy=Разобран алтарь %d ÑƒÑ€Ð¾Ð²Ð½Ñ -chat.BloodMagic.altarMaker.creativeOnly=Предмет только Ð´Ð»Ñ ÐºÑ€ÐµÐ°Ñ‚Ð¸Ð²Ð°. +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.damageSource=душа %s Ñлишком оÑлабла -chat.BloodMagic.ritual.weak=Ð’Ñ‹ чувÑтвуете толчок, но Ñлишком Ñлабый, чтобы выполнить ритуал. -chat.BloodMagic.ritual.prevent=Ритуал ÑопротивлÑетÑÑ Ð²Ð°ÑˆÐµÐ¼Ñƒ воздейÑтвию! -chat.BloodMagic.ritual.activate=Потоки Ñнергии текут через ритуал! -chat.BloodMagic.ritual.notValid=Ð’Ñ‹ чувÑтвуете, что руны ÑтоÑÑ‚ неправильно... +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Получено улучшение! +chat.bloodmagic.livingArmour.upgrade.poisonRemove=You are starting to feel better already! +chat.bloodmagic.livingArmour.upgrade.grimReaper=&6Темные Ñилы ÑпаÑли Ð²Ð°Ñ Ð·Ð° Ñекунду до Ñмерти! +chat.bloodmagic.livingArmour.newUpgrade=&4Получено улучшение! # JustEnoughItems -jei.BloodMagic.recipe.altar=Кровавый алтарь -jei.BloodMagic.recipe.binding=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° (СвÑзывание) -jei.BloodMagic.recipe.alchemyArrayCrafting=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° -jei.BloodMagic.recipe.soulForge=ÐдÑÐºÐ°Ñ ÐºÑƒÐ·Ð½Ð¸Ñ†Ð° -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.altar=Кровавый алтарь +jei.bloodmagic.recipe.binding=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° (СвÑзывание) +jei.bloodmagic.recipe.alchemyArrayCrafting=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° +jei.bloodmagic.recipe.soulForge=ÐдÑÐºÐ°Ñ ÐºÑƒÐ·Ð½Ð¸Ñ†Ð° +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=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. +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=Реагент: %s -waila.BloodMagic.array.catalyst=Катализатор: %s -option.BloodMagic.bypassSneak=Bypass Sneak -option.BloodMagic.bloodAltar=Кровавый алтарь -option.BloodMagic.ritualController=Ритуальные камни -option.BloodMagic.teleposer=Телепозер -option.BloodMagic.array=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° +waila.bloodmagic.sneak=&oSneak for Information +waila.bloodmagic.array.reagent=Реагент: %s +waila.bloodmagic.array.catalyst=Катализатор: %s +option.bloodmagic.bypassSneak=Bypass Sneak +option.bloodmagic.bloodAltar=Кровавый алтарь +option.bloodmagic.ritualController=Ритуальные камни +option.bloodmagic.teleposer=Телепозер +option.bloodmagic.array=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° # Thaumcraft tc.research_category.BLOODMAGIC=Sanguine Arcana diff --git a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang index 5de0fea6..22aef30e 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang @@ -1,693 +1,693 @@ #Creative Tab -itemGroup.BloodMagic.creativeTab=血魔法 -itemGroup.BloodMagic.creativeTabTome=血魔法强化手册 +itemGroup.bloodmagic.creativeTab=血魔法 +itemGroup.bloodmagic.creativeTabTome=血魔法强化手册 #Items -item.BloodMagic.activationCrystal.weak.name=[虚弱]激活水晶 -item.BloodMagic.activationCrystal.awakened.name=[觉醒]激活水晶 -item.BloodMagic.activationCrystal.creative.name=[创造]激活水晶 +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.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.lavaCrystal.name=熔岩晶体 -item.BloodMagic.bound.sword.name=æŸç¼šä¹‹å‰‘ -item.BloodMagic.bound.pickaxe.name=æŸç¼šä¹‹é• -item.BloodMagic.bound.axe.name=æŸç¼šä¹‹æ–§ -item.BloodMagic.bound.shovel.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.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.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.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.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.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.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.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.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.reagentTeleposition.name=ä¼ é€è¯•剂 -item.BloodMagic.baseComponent.reagentTransposition.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.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.cuttingFluid.basicCuttingFluid.name=基础切削油 +item.bloodmagic.cuttingFluid.explosive.name=爆炸ç«è¯ -item.BloodMagic.baseComponent.mundaneLength.name=简å•的延时催化剂 -item.BloodMagic.baseComponent.mundanePower.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.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.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.holding.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.teleposition.name=ä¼ é€å°è®° -item.BloodMagic.sigil.transposition.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.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.altarMaker.name=ç¥­å›æ­å»ºå·¥å…· -item.BloodMagic.ritualDivinernormal.name=ä»ªå¼æŽ¨æµ‹ä»— -item.BloodMagic.ritualDivinerdusk.name=ä»ªå¼æŽ¨æµ‹ä»— [è–„æš®] -item.BloodMagic.ritualDivinerdawn.name=ä»ªå¼æŽ¨æµ‹ä»— [破晓] -item.BloodMagic.ritualReader.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.upgradeTrainer.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.sentientAxe.name=感知之斧 -item.BloodMagic.sentientPickaxe.name=æ„ŸçŸ¥ä¹‹é• -item.BloodMagic.sentientShovel.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.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.experienceTome.name=ç»éªŒæ‰‹å†Œ -item.BloodMagic.sanguineBook.name=指示之书 +item.bloodmagic.experienceTome.name=ç»éªŒæ‰‹å†Œ +item.bloodmagic.sanguineBook.name=指示之书 -item.BloodMagic.livingPointUpgrade.draftAngelus.name=祷告之始 +item.bloodmagic.livingPointUpgrade.draftAngelus.name=祷告之始 -item.BloodMagic.willGauge.name=æ¶é­”æ„å¿—çµåŸŸæµ‹é‡å™¨ -item.BloodMagic.potionFlask.name=è¯å‰‚ç“¶ +item.bloodmagic.willGauge.name=æ¶é­”æ„å¿—çµåŸŸæµ‹é‡å™¨ +item.bloodmagic.potionFlask.name=è¯å‰‚ç“¶ # Blocks -tile.BloodMagic.fluid.lifeEssence.name=生命æºè´¨ +tile.bloodmagic.fluid.lifeEssence.name=生命æºè´¨ -tile.BloodMagic.stone.ritual.master.name=主仪å¼çŸ³ -tile.BloodMagic.stone.ritual.imperfect.name=ä¸å®Œå–„的仪å¼çŸ³ +tile.bloodmagic.stone.ritual.master.name=主仪å¼çŸ³ +tile.bloodmagic.stone.ritual.imperfect.name=ä¸å®Œå–„的仪å¼çŸ³ -tile.BloodMagic.altar.name=è¡€ä¹‹ç¥­å› -tile.BloodMagic.alchemyArray.name=&r&f炼金矩阵 +tile.bloodmagic.altar.name=è¡€ä¹‹ç¥­å› +tile.bloodmagic.alchemyArray.name=&r&f炼金矩阵 -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.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.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.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.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.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.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.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.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.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.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=Accented 原生石瓦 -tile.BloodMagic.bricks2.tilespecial_corrosive.name=Accented è…蚀性石瓦 -tile.BloodMagic.bricks2.tilespecial_destructive.name=Accented ç ´åæ€§çŸ³ç“¦ -tile.BloodMagic.bricks2.tilespecial_vengeful.name=Accented å¤ä»‡æ€§çŸ³ç“¦ -tile.BloodMagic.bricks2.tilespecial_steadfast.name=Accented åšå®šæ€§çŸ³ç“¦ +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=Accented 原生石瓦 +tile.bloodmagic.bricks2.tilespecial_corrosive.name=Accented è…蚀性石瓦 +tile.bloodmagic.bricks2.tilespecial_destructive.name=Accented ç ´åæ€§çŸ³ç“¦ +tile.bloodmagic.bricks2.tilespecial_vengeful.name=Accented å¤ä»‡æ€§çŸ³ç“¦ +tile.bloodmagic.bricks2.tilespecial_steadfast.name=Accented åšå®šæ€§çŸ³ç“¦ -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.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.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.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.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.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=Accented 原生石柱 -tile.BloodMagic.pillar2.corrosive.name=Accented è…蚀性石柱 -tile.BloodMagic.pillar2.destructive.name=Accented ç ´åæ€§çŸ³æŸ± -tile.BloodMagic.pillar2.vengeful.name=Accented å¤ä»‡æ€§çŸ³æŸ± -tile.BloodMagic.pillar2.steadfast.name=Accented åšå®šæ€§çŸ³æŸ± +tile.bloodmagic.pillar2.raw.name=Accented 原生石柱 +tile.bloodmagic.pillar2.corrosive.name=Accented è…蚀性石柱 +tile.bloodmagic.pillar2.destructive.name=Accented ç ´åæ€§çŸ³æŸ± +tile.bloodmagic.pillar2.vengeful.name=Accented å¤ä»‡æ€§çŸ³æŸ± +tile.bloodmagic.pillar2.steadfast.name=Accented åšå®šæ€§çŸ³æŸ± -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.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.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=åšå®šæ€§çŸ³æ¥¼æ¢¯ +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.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.orb.desc=储存原生的生命æºè´¨ +tooltip.bloodmagic.orb.owner=æ¥æº: %s +tooltip.bloodmagic.currentOwner=当剿‰€æœ‰è€…: %s +tooltip.bloodmagic.currentTier=当å‰å±‚级: %d +tooltip.bloodmagic.config.disabled=于é…置信æ¯ä¸­ç¦ç”¨ -tooltip.BloodMagic.activated=激活 -tooltip.BloodMagic.deactivated=åœç”¨ +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.currentBonus=当剿•ˆç›Š: +%d%% -tooltip.BloodMagic.sigil.water.desc=&oæ— é™æ°´æº? -tooltip.BloodMagic.sigil.lava.desc=&o噢好烫! ä¸è¦åƒ -tooltip.BloodMagic.sigil.void.desc=&o胜过速易æ´Â®! -tooltip.BloodMagic.sigil.greenGrove.desc=&oç»¿è‰²çŽ¯ä¿æ— æ±¡æŸ“ -tooltip.BloodMagic.sigil.magnetism.desc=&o我现在éžå¸¸å…·æœ‰å¸å¼•力 -tooltip.BloodMagic.sigil.suppression.desc=&o比念力移动更好... -tooltip.BloodMagic.sigil.haste.desc=&o42剂咖啡因åŽ... -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.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.currentBonus=当剿•ˆç›Š: +%d%% +tooltip.bloodmagic.sigil.water.desc=&oæ— é™æ°´æº? +tooltip.bloodmagic.sigil.lava.desc=&o噢好烫! ä¸è¦åƒ +tooltip.bloodmagic.sigil.void.desc=&o胜过速易æ´Â®! +tooltip.bloodmagic.sigil.greenGrove.desc=&oç»¿è‰²çŽ¯ä¿æ— æ±¡æŸ“ +tooltip.bloodmagic.sigil.magnetism.desc=&o我现在éžå¸¸å…·æœ‰å¸å¼•力 +tooltip.bloodmagic.sigil.suppression.desc=&o比念力移动更好... +tooltip.bloodmagic.sigil.haste.desc=&o42剂咖啡因åŽ... +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.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.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.sacrificialDagger.desc=åªè¦è½»è½»åˆ’过手指... +tooltip.bloodmagic.sacrificialDagger.creative=对ç€ç¥­å›æ½œè¡Œå³å‡»å¡«æ»¡ +tooltip.bloodmagic.slate.desc=在祭å›ä¸­å°†çŸ³å¤´è½¬åŒ– +tooltip.bloodmagic.inscriber.desc=在墙é¢ä¸Šçš„æ–‡å­—... -tooltip.BloodMagic.pack.selfSacrifice.desc=相当ä¸èˆ’适的背包... +tooltip.bloodmagic.pack.selfSacrifice.desc=相当ä¸èˆ’适的背包... -tooltip.BloodMagic.pack.stored=储存: %d LP +tooltip.bloodmagic.pack.stored=储存: %d LP -tooltip.BloodMagic.activationCrystal.weak=æ¿€æ´»ä½Žç­‰ä»ªå¼ -tooltip.BloodMagic.activationCrystal.awakened=æ¿€æ´»æ›´å¼ºå¤§çš„ä»ªå¼ -tooltip.BloodMagic.activationCrystal.creative=åˆ›é€ æ¨¡å¼ - æ¿€æ´»ä»»ä½•ä»ªå¼ +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.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.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.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.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.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.slowness=疲瘸之腿 -tooltip.BloodMagic.livingArmour.upgrade.crippledArm=残废手臂 -tooltip.BloodMagic.livingArmour.upgrade.level=%s (等级 %d) +tooltip.bloodmagic.livingArmour.upgrade.slowness=疲瘸之腿 +tooltip.bloodmagic.livingArmour.upgrade.crippledArm=残废手臂 +tooltip.bloodmagic.livingArmour.upgrade.level=%s (等级 %d) -tooltip.BloodMagic.livingArmour.upgrade.points=&6强化点数: %s / %s +tooltip.bloodmagic.livingArmour.upgrade.points=&6强化点数: %s / %s -tooltip.BloodMagic.livingArmour.extraExtraInfo=&9-æŒ‰ä½ shift + M 查看进展信æ¯- +tooltip.bloodmagic.livingArmour.extraExtraInfo=&9-æŒ‰ä½ shift + M 查看进展信æ¯- -tooltip.BloodMagic.will=æ„å¿—è´¨é‡: %1$,.2f -tooltip.BloodMagic.sentientSword.desc=以æ¶é­”æ„志唤起其最大潜能. -tooltip.BloodMagic.soulGem.petty=ç”¨äºŽå­˜å‚¨å¾®é‡æ„志的晶石 -tooltip.BloodMagic.sentientAxe.desc=以æ¶é­”æ„志唤起其最大潜能. -tooltip.BloodMagic.sentientPickaxe.desc=以æ¶é­”æ„志唤起其最大潜能. -tooltip.BloodMagic.sentientShovel.desc=以æ¶é­”æ„志唤起其最大潜能. -tooltip.BloodMagic.soulGem.lesser=ç”¨äºŽå­˜å‚¨å°‘é‡æ„志的晶石 -tooltip.BloodMagic.soulGem.common=用于存储更多æ„志的晶石 -tooltip.BloodMagic.soulGem.greater=ç”¨äºŽå­˜å‚¨å¤§é‡æ„志的晶石 -tooltip.BloodMagic.soulGem.grand=用于存储æžå¤§æ•°é¢æ„志的晶石 -tooltip.BloodMagic.soulSnare.desc=æŠ•æŽ·å‘æ€ªç‰©å¹¶æ¶ˆç­å®ƒä»¬æ¥èŽ·å–附于其身的æ¶é­”æ„å¿— +tooltip.bloodmagic.will=æ„å¿—è´¨é‡: %1$,.2f +tooltip.bloodmagic.sentientSword.desc=以æ¶é­”æ„志唤起其最大潜能. +tooltip.bloodmagic.soulGem.petty=ç”¨äºŽå­˜å‚¨å¾®é‡æ„志的晶石 +tooltip.bloodmagic.sentientAxe.desc=以æ¶é­”æ„志唤起其最大潜能. +tooltip.bloodmagic.sentientPickaxe.desc=以æ¶é­”æ„志唤起其最大潜能. +tooltip.bloodmagic.sentientShovel.desc=以æ¶é­”æ„志唤起其最大潜能. +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.itemFilter.ignoreNBT=忽视筛选的NBT +tooltip.bloodmagic.itemFilter.modItems=åŒMod的物å“å…¨éƒ¨åŒ¹é… +tooltip.bloodmagic.itemFilter.oreDict=凭借矿物辞典筛选 -tooltip.BloodMagic.fluid.type=æ‰€å«æ¶²ä½“ -tooltip.BloodMagic.fluid.amount=æ•°é‡ -tooltip.BloodMagic.fluid.capacity=å®¹é‡ +tooltip.bloodmagic.fluid.type=æ‰€å«æ¶²ä½“ +tooltip.bloodmagic.fluid.amount=æ•°é‡ +tooltip.bloodmagic.fluid.capacity=å®¹é‡ -tooltip.BloodMagic.ghost.everything=ä»»ä½•ç‰©å“ -tooltip.BloodMagic.ghost.amount=å¹½çµç‰©å“æ•°é‡: %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.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.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.experienceTome=用于储存ç»éªŒçš„书 +tooltip.bloodmagic.experienceTome.exp=ç»éªŒå€¼: %0.3f +tooltip.bloodmagic.experienceTome.expLevel=等级: %d -tooltip.BloodMagic.decoration.safe=安全装潢 -tooltip.BloodMagic.decoration.notSafe=å±é™©è£…æ½¢ +tooltip.bloodmagic.decoration.safe=安全装潢 +tooltip.bloodmagic.decoration.notSafe=å±é™©è£…æ½¢ -tooltip.BloodMagic.cuttingFluidRatio=%d/%d 所剩å¯ç”¨ +tooltip.bloodmagic.cuttingFluidRatio=%d/%d 所剩å¯ç”¨ -tooltip.BloodMagic.potion.uses=%d 使用剩余 +tooltip.bloodmagic.potion.uses=%d 使用剩余 -tooltip.BloodMagic.book.shifting=这些符å·ä¼¼ä¹Ž... &oåœ¨å˜æ¢ç€... +tooltip.bloodmagic.book.shifting=这些符å·ä¼¼ä¹Ž... &oåœ¨å˜æ¢ç€... -tooltip.BloodMagic.willGauge=一个奇怪的装置, å¯ä»¥æµ‹é‡æ¶é­”çµåŸŸä¸­çš„æ¶é­”æ„å¿—. +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.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.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.cobblestoneRitual=æžå¯’ç«å±± +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.greenGroveRitual.info=åœ¨å…¶èŒƒå›´å†…ç§æ¤å†œä½œç‰©. -ritual.BloodMagic.jumpRitual.info=使实体跃å‘高空. -ritual.BloodMagic.wellOfSufferingRitual.info=攻击其伤害范围内的生物, 并将所获LP储入邻近的血之祭å›. -ritual.BloodMagic.featheredKnifeRitual.info=扣除其范围内的玩家生命值, 并将所获LP储入邻近的血之祭å›. -ritual.BloodMagic.regenerationRitual.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.greenGroveRitual.corrosive.info=(è…蚀性) 范围内的实体将被附近的æ¤ç‰©æ”»å‡», å¸é£Ÿä»–们的生命. -ritual.BloodMagic.greenGroveRitual.default.info=(原生) 加快所有的仪å¼è¿ä½œé€Ÿåº¦, å–决于çµåŸŸä¸­å…¨éƒ¨æ„å¿—. -ritual.BloodMagic.greenGroveRitual.steadfast.info=(åšå®šæ€§) 在水åˆèŒƒå›´å†…, ç§å­ä¼šè¢«å†æ¬¡ç§æ¤ä¸”æ–¹å—会被润湿. +ritual.bloodmagic.waterRitual.info=通过主仪å¼çŸ³ç”Ÿæˆä¸€ä¸ªæ°´æºæ–¹å—. +ritual.bloodmagic.lavaRitual.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.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.greenGroveRitual.corrosive.info=(è…蚀性) 范围内的实体将被附近的æ¤ç‰©æ”»å‡», å¸é£Ÿä»–们的生命. +ritual.bloodmagic.greenGroveRitual.default.info=(原生) 加快所有的仪å¼è¿ä½œé€Ÿåº¦, å–决于çµåŸŸä¸­å…¨éƒ¨æ„å¿—. +ritual.bloodmagic.greenGroveRitual.steadfast.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.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.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.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.fireFuse.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.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.forsakenSoulRitual.crystal.info=(晶体) å½“æœ‰ç”Ÿç‰©å› ä»ªå¼æ­»äº¡æ—¶, 该区域内的晶簇生长速度将加快. -ritual.BloodMagic.forsakenSoulRitual.damage.info=(伤害) 该区域内的生物将缓慢的收到伤害, 当死亡时晶簇将生长. -ritual.BloodMagic.crystalHarvestRitual.crystal.info=(晶体) æ™¶ç°‡å°†è¢«ç ´åæˆä»…ç•™å•æ™¶çš„æ™¶ç°‡, 被破å的晶体将掉è½äºŽä¸–界. +ritual.bloodmagic.waterRitual.waterRange.info=(æ°´æº) ä»ªå¼æ”¾ç½®æ°´æºæ–¹å—的区域. +ritual.bloodmagic.lavaRitual.lavaRange.info=(熔岩) ä»ªå¼æ”¾ç½®ç†”岩方å—的区域. +ritual.bloodmagic.lavaRitual.fireFuse.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.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.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.placerRitual.placerRange.info=(放置) 仪å¼å°†æ”¾ç½®æ–¹å—的区域. +ritual.bloodmagic.placerRitual.chest.info=(ç®±å­) ç®±å­ä½ç½®, 仪å¼å°†æå–å…¶ä¸­çš„æ–¹å—æ”¾ç½®äºŽä¸–界中. +ritual.bloodmagic.fellingRitual.fellingRange.info=(ç ä¼) 仪å¼å°†æœå¯»åŽŸæœ¨å’Œæ ‘å¶å¹¶è¿›è¡Œç ä¼çš„区域. +ritual.bloodmagic.fellingRitual.chest.info=(ç®±å­) ç®±å­ä½ç½®, 仪å¼å°†æŠŠæŽ‰è½ç‰©æ”¾å…¥å…¶ä¸­. +ritual.bloodmagic.pumpRitual.pumpRange.info=(引水) 仪å¼äºŽä¸–ç•Œä¸­èŽ·å–æ¶²ä½“的区域. # Chat -chat.BloodMagic.altarMaker.setTier=层级设置: %d -chat.BloodMagic.altarMaker.building=铺设一个 %d å±‚ç¥­å› -chat.BloodMagic.altarMaker.destroy=消除一个 %d å±‚ç¥­å› -chat.BloodMagic.altarMaker.creativeOnly=该物å“ä»…é™åˆ›é€ æ¨¡å¼. +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.damageSource=%s çš„çµé­‚开始å˜å¾—虚弱 -chat.BloodMagic.ritual.weak=你感到有股拉力, ä½†æ²¡æœ‰è¶³å¤Ÿçš„åŠ›é‡æ¥å®Œæˆè¿™ä¸ªä»ªå¼. -chat.BloodMagic.ritual.prevent=仪å¼åœ¨ç§¯æžçš„æŠµæŠ—ä½ ! -chat.BloodMagic.ritual.activate=ä¸€è‚¡èƒ½é‡æµç»è¿™ä¸ªä»ªå¼! -chat.BloodMagic.ritual.notValid=这些仪å¼çŸ³ä¼¼ä¹Žæœ‰äº›æ‘†æ”¾ä¸å¾—当... +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.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.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.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.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=è¯å‰‚生æˆåŠå¾„已增加至: % 格方å—. -chat.BloodMagic.mimic.potionSpawnRadius.down=è¯å‰‚生æˆåŠå¾„å·²å‡å°‘至: % 格方å—. +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=è¯å‰‚生æˆåŠå¾„已增加至: % 格方å—. +chat.bloodmagic.mimic.potionSpawnRadius.down=è¯å‰‚生æˆåŠå¾„å·²å‡å°‘至: % 格方å—. # entity -entity.BloodMagic.SentientSpecter.name=æ„ŸçŸ¥ä¹‹çµ -entity.BloodMagic.Mimic.name=æ‹Ÿæ€ +entity.bloodmagic.SentientSpecter.name=æ„ŸçŸ¥ä¹‹çµ +entity.bloodmagic.Mimic.name=æ‹Ÿæ€ # sekrit @@ -753,41 +753,41 @@ commands.soulnetwork.fillMax.success=æˆåŠŸå°† %s çš„çµé­‚ç½‘ç»œå¡«æ»¡è‡³å…¶å® commands.soulnetwork.create.success=创建 %s çš„çµé­‚网络æˆåŠŸ (å®ç ç­‰çº§: %d) # GUI -tile.BloodMagic.inputNode.name=输入节点 -tile.BloodMagic.outputNode.name=输出节点 +tile.bloodmagic.inputNode.name=输入节点 +tile.bloodmagic.outputNode.name=输出节点 # Keybinds -BloodMagic.keybind.open_holding=打开集æŒå°è®° -BloodMagic.keybind.cycle_holding_pos=循环选择å°è®° (+) -BloodMagic.keybind.cycle_holding_neg=循环选择å°è®° (-) +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.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.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 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å¯ä»¥é€šè¿‡ç”¨æ„ŸçŸ¥æ­¦å™¨æ€æ­»ç”Ÿç‰©æŽ‰è½, 或是对ç€ç”Ÿç‰©æŠ›æŽ·åŽŸå§‹æŠ•ç½‘, 当它出现白色颗粒时æ€äº†å®ƒ. +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=炼金矩阵 +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=血红奥术 diff --git a/src/main/resources/assets/bloodmagic/lang/zh_TW.lang b/src/main/resources/assets/bloodmagic/lang/zh_TW.lang index 39490692..3632a10a 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_TW.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_TW.lang @@ -1,399 +1,399 @@ #Creative Tab -itemGroup.BloodMagic.creativeTab=血魔法 -itemGroup.BloodMagic.creativeTabTome=血魔法強化經文 +itemGroup.bloodmagic.creativeTab=血魔法 +itemGroup.bloodmagic.creativeTabTome=血魔法強化經文 #Items -item.BloodMagic.activationCrystal.weak.name=[虛弱]激活水晶 -item.BloodMagic.activationCrystal.awakened.name=[覺醒]激活水晶 -item.BloodMagic.activationCrystal.creative.name=[創造模å¼]激活水晶 +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.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.lavaCrystal.name=熔岩晶體 -item.BloodMagic.bound.sword.name=ç´„æŸä¹‹åŠ -item.BloodMagic.bound.pickaxe.name=ç´„æŸä¹‹éެ -item.BloodMagic.bound.axe.name=ç´„æŸä¹‹æ–§ -item.BloodMagic.bound.shovel.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.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.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.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.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.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.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.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.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.baseComponent.reagentTeleposition.name=轉é€è©¦åŠ‘ +item.bloodmagic.baseComponent.reagentTransposition.name=ç§»ä½è©¦åŠ‘ -item.BloodMagic.monsterSoul.base.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.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.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.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.altarMaker.name=祭壇產生器 -item.BloodMagic.ritualDivinernormal.name=å„€å¼å æ– -item.BloodMagic.ritualDivinerdusk.name=å„€å¼å æ–[黃æ˜] -item.BloodMagic.ritualDivinerdawn.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.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.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=礦物辭典物å“篩é¸å™¨ +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.fluid.lifeEssence.name=ç”Ÿå‘½ç²¾è¯ -tile.BloodMagic.stone.ritual.master.name=魔導師儀å¼çŸ³ -tile.BloodMagic.stone.ritual.imperfect.name=次級儀å¼çŸ³ +tile.bloodmagic.stone.ritual.master.name=魔導師儀å¼çŸ³ +tile.bloodmagic.stone.ritual.imperfect.name=次級儀å¼çŸ³ -tile.BloodMagic.altar.name=血祭壇 -tile.BloodMagic.alchemyArray.name=&r&f煉金矩陣 +tile.bloodmagic.altar.name=血祭壇 +tile.bloodmagic.alchemyArray.name=&r&f煉金矩陣 -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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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 +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.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 +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.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.damageSource=%sçš„éˆé­‚è®Šå¾—éŽæ–¼è™›å¼± -chat.BloodMagic.ritual.weak=你感到一股力é‡ï¼Œä½†æ˜¯éŽæ–¼å¾®å¼±ï¼Œä¸è¶³ä»¥é©…å‹•å„€å¼ã€‚ -chat.BloodMagic.ritual.prevent=ä½ å—到儀å¼åŠ‡çƒˆçš„æŠ—æ‹’ï¼ -chat.BloodMagic.ritual.activate=能é‡å¿«é€Ÿçš„在儀å¼ä¸­æµç«„ï¼ -chat.BloodMagic.ritual.notValid=你感覺這些符文的é…置似乎ä¸å¤§æ­£ç¢º… +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å–å¾—å‡ç´šï¼ +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.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é€éŽæŒæ„ŸçŸ¥æ­¦å™¨æ®ºæ­»æ•µäººç²å¾—ã€‚æˆ–ä»¥ç°¡æ˜“å¥—ç´¢æ“²å‘æ•µäººï¼Œä½¿å…¶é¡¯ç¾å‡ºç™½å…‰å¾Œæ®ºæ­»ä»¥å–得。 +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=煉金矩陣 +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=血儀術 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 7590e9f6..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 From c34ee90b4e473bd80ef811c21284a8fa825bfc0f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 2 Jan 2017 00:18:38 -0800 Subject: [PATCH 007/595] Okay let's fix these the hard way. --- .../armatures/block/pillar_mid.json | 42 - .../asms/block/inversion_pillar.json | 13 - .../blockstates/BlockAlchemyArray.json | 10 - .../blockstates/BlockAlchemyTable.json | 50 - .../bloodmagic/blockstates/BlockAltar.json | 14 - .../blockstates/BlockBloodLight.json | 10 - .../blockstates/BlockBloodRune.json | 67 - .../blockstates/BlockBloodStoneBrick.json | 22 - .../blockstates/BlockBloodTank.json | 29 - .../bloodmagic/blockstates/BlockCrystal.json | 22 - .../blockstates/BlockDemonBricks1.json | 35 - .../blockstates/BlockDemonBricks2.json | 88 -- .../blockstates/BlockDemonCrucible.json | 14 - .../blockstates/BlockDemonCrystal.json | 146 -- .../blockstates/BlockDemonCrystallizer.json | 14 - .../blockstates/BlockDemonExtra.json | 88 -- .../blockstates/BlockDemonLight.json | 38 - .../blockstates/BlockDemonPylon.json | 14 - .../blockstates/BlockDimensionalPortal.json | 13 - .../blockstates/BlockIncenseAltar.json | 14 - .../blockstates/BlockInputRoutingNode.json | 66 - .../blockstates/BlockInversionPillar.json | 51 - .../blockstates/BlockInversionPillarEnd.json | 72 - .../blockstates/BlockItemRoutingNode.json | 66 - .../blockstates/BlockLifeEssence.json | 9 - .../blockstates/BlockMasterRoutingNode.json | 65 - .../bloodmagic/blockstates/BlockMimic.json | 38 - .../blockstates/BlockOutputRoutingNode.json | 66 - .../bloodmagic/blockstates/BlockPath.json | 53 - .../bloodmagic/blockstates/BlockPhantom.json | 5 - .../bloodmagic/blockstates/BlockPillar1.json | 58 - .../bloodmagic/blockstates/BlockPillar2.json | 58 - .../blockstates/BlockPillarCap1.json | 57 - .../blockstates/BlockPillarCap2.json | 57 - .../blockstates/BlockPillarCap3.json | 50 - .../blockstates/BlockRitualController.json | 22 - .../blockstates/BlockRitualStone.json | 47 - .../blockstates/BlockSoulForge.json | 14 - .../bloodmagic/blockstates/BlockSpectral.json | 10 - .../bloodmagic/blockstates/BlockStairs1.json | 100 -- .../bloodmagic/blockstates/BlockStairs2.json | 100 -- .../bloodmagic/blockstates/BlockStairs3.json | 59 - .../blockstates/BlockTeleposer.json | 17 - .../blockstates/BlockTestSpellBlock.json | 29 - .../bloodmagic/blockstates/BlockWall1.json | 109 -- .../item/ItemActivationCrystal.json | 26 - .../blockstates/item/ItemAltarMaker.json | 16 - .../blockstates/item/ItemArcaneAshes.json | 16 - .../item/ItemBlockDemonCrystal.json | 39 - .../blockstates/item/ItemBloodShard.json | 21 - .../blockstates/item/ItemBoundAxe.json | 21 - .../blockstates/item/ItemBoundPickaxe.json | 21 - .../blockstates/item/ItemBoundShovel.json | 21 - .../blockstates/item/ItemBoundSword.json | 21 - .../blockstates/item/ItemComponent.json | 176 --- .../blockstates/item/ItemCuttingFluid.json | 21 - .../item/ItemDaggerOfSacrifice.json | 16 - .../blockstates/item/ItemDemonCrystal.json | 36 - .../blockstates/item/ItemDemonWillGauge.json | 16 - .../blockstates/item/ItemExperienceBook.json | 16 - .../blockstates/item/ItemInscriptionTool.json | 41 - .../blockstates/item/ItemLavaCrystal.json | 16 - .../blockstates/item/ItemLivingArmour.json | 31 - .../item/ItemLivingArmourPointsUpgrade.json | 16 - .../blockstates/item/ItemMonsterSoul.json | 36 - .../blockstates/item/ItemNodeRouter.json | 16 - .../blockstates/item/ItemPackSacrifice.json | 16 - .../item/ItemPackSelfSacrifice.json | 16 - .../blockstates/item/ItemPotionFlask.json | 18 - .../blockstates/item/ItemRitualDiviner.json | 26 - .../blockstates/item/ItemRitualReader.json | 16 - .../blockstates/item/ItemRouterFilter.json | 31 - .../item/ItemSacrificialDagger.json | 26 - .../blockstates/item/ItemSanguineBook.json | 16 - .../blockstates/item/ItemSentientArmour.json | 111 -- .../item/ItemSentientArmourGem.json | 21 - .../blockstates/item/ItemSentientAxe.json | 36 - .../blockstates/item/ItemSentientBow.json | 34 - .../blockstates/item/ItemSentientPickaxe.json | 36 - .../blockstates/item/ItemSentientShovel.json | 36 - .../blockstates/item/ItemSentientSword.json | 36 - .../blockstates/item/ItemSigilAir.json | 16 - .../blockstates/item/ItemSigilBloodLight.json | 16 - .../blockstates/item/ItemSigilBounce.json | 22 - .../blockstates/item/ItemSigilClaw.json | 21 - .../item/ItemSigilCompression.json | 21 - .../blockstates/item/ItemSigilDivination.json | 16 - .../item/ItemSigilElementalAffinity.json | 21 - .../item/ItemSigilEnderSeverance.json | 21 - .../blockstates/item/ItemSigilFastMiner.json | 21 - .../blockstates/item/ItemSigilFrost.json | 22 - .../blockstates/item/ItemSigilGreenGrove.json | 21 - .../blockstates/item/ItemSigilHaste.json | 21 - .../blockstates/item/ItemSigilHolding.json | 22 - .../blockstates/item/ItemSigilLava.json | 16 - .../blockstates/item/ItemSigilMagnetism.json | 21 - .../item/ItemSigilPhantomBridge.json | 21 - .../blockstates/item/ItemSigilSeer.json | 16 - .../item/ItemSigilSuppression.json | 21 - .../item/ItemSigilTeleposition.json | 16 - .../item/ItemSigilTransposition.json | 16 - .../blockstates/item/ItemSigilVoid.json | 16 - .../blockstates/item/ItemSigilWater.json | 16 - .../blockstates/item/ItemSigilWhirlwind.json | 21 - .../blockstates/item/ItemSlate.json | 36 - .../blockstates/item/ItemSoulGem.json | 136 -- .../blockstates/item/ItemSoulSnare.json | 16 - .../item/ItemTelepositionFocus.json | 31 - .../blockstates/item/ItemUpgradeTome.json | 16 - .../blockstates/item/ItemUpgradeTrainer.json | 16 - .../assets/bloodmagic/books/architect.xml | 106 -- .../assets/bloodmagic/gui/SigilHolding.png | Bin 1227 -> 0 bytes .../assets/bloodmagic/gui/Teleposer.png | Bin 1276 -> 0 bytes .../assets/bloodmagic/gui/WritingTable.png | Bin 2567 -> 0 bytes .../assets/bloodmagic/gui/bookleft.png | Bin 11940 -> 0 bytes .../assets/bloodmagic/gui/jei/alchemy.png | Bin 15723 -> 0 bytes .../bloodmagic/gui/jei/alchemyTable.png | Bin 950 -> 0 bytes .../assets/bloodmagic/gui/jei/altar.png | Bin 2368 -> 0 bytes .../assets/bloodmagic/gui/jei/binding.png | Bin 868 -> 0 bytes .../assets/bloodmagic/gui/jei/soulForge.png | Bin 16429 -> 0 bytes .../bloodmagic/loot_tables/bm_loot_table.json | 25 - .../models/armor/livingArmour_layer_1.png | Bin 2308 -> 0 bytes .../models/armor/livingArmour_layer_2.png | Bin 1137 -> 0 bytes .../models/armor/sacrificeArmour_layer_1.png | Bin 728 -> 0 bytes .../armor/selfSacrificeArmour_layer_1.png | Bin 1324 -> 0 bytes .../sentientArmour_corrosive_layer_1.png | Bin 2499 -> 0 bytes .../sentientArmour_corrosive_layer_2.png | Bin 2063 -> 0 bytes .../sentientArmour_destructive_layer_1.png | Bin 2446 -> 0 bytes .../sentientArmour_destructive_layer_2.png | Bin 2071 -> 0 bytes .../models/armor/sentientArmour_layer_1.png | Bin 2392 -> 0 bytes .../models/armor/sentientArmour_layer_2.png | Bin 1824 -> 0 bytes .../sentientArmour_steadfast_layer_1.png | Bin 2441 -> 0 bytes .../sentientArmour_steadfast_layer_2.png | Bin 2069 -> 0 bytes .../armor/sentientArmour_vengeful_layer_1.png | Bin 2456 -> 0 bytes .../armor/sentientArmour_vengeful_layer_2.png | Bin 2069 -> 0 bytes .../models/block/BlockAlchemyArray.json | 6 - .../bloodmagic/models/block/BlockAltar.mtl | 11 - .../bloodmagic/models/block/BlockAltar.obj | 391 ----- .../bloodmagic/models/block/BlockBlank.json | 17 - .../models/block/BlockBloodLight.json | 15 - .../models/block/BlockBloodTank.json | 357 ----- .../models/block/BlockDemonCrucible.mtl | 11 - .../models/block/BlockDemonCrucible.obj | 937 ------------ .../models/block/BlockDemonCrystallizer.mtl | 11 - .../models/block/BlockDemonCrystallizer.obj | 1359 ----------------- .../models/block/BlockDemonPylon.mtl | 11 - .../models/block/BlockDemonPylon.obj | 1171 -------------- .../models/block/BlockDimensionalPortal.json | 15 - .../block/BlockDimensionalPortalEW.json | 15 - .../block/BlockDimensionalPortalNS.json | 15 - .../models/block/BlockHellfireForge.mtl | 11 - .../models/block/BlockHellfireForge.obj | 899 ----------- .../models/block/BlockIncenseAltar.json | 7 - .../models/block/BlockIncenseAltar.mtl | 11 - .../models/block/BlockIncenseAltar.obj | 650 -------- .../models/block/BlockInputRoutingNode.json | 7 - .../models/block/BlockMasterRoutingNode.json | 8 - .../models/block/BlockOutputRoutingNode.json | 7 - .../bloodmagic/models/block/BlockPhantom.json | 6 - .../models/block/BlockPillarCapEast.json | 17 - .../models/block/BlockPillarCapNorth.json | 17 - .../models/block/BlockPillarCapSouth.json | 17 - .../models/block/BlockPillarCapWest.json | 17 - .../bloodmagic/models/block/BlockPillarX.json | 17 - .../bloodmagic/models/block/BlockPillarZ.json | 17 - .../models/block/BlockSoulForge.json | 9 - .../models/block/BlockSpectral.json | 6 - .../models/block/ModelAlchemyTable.mtl | 11 - .../models/block/ModelAlchemyTable.obj | 1257 --------------- .../models/block/crystal/Crystal1.mtl | 11 - .../models/block/crystal/Crystal1.obj | 30 - .../models/block/crystal/Crystal2.mtl | 11 - .../models/block/crystal/Crystal2.obj | 30 - .../models/block/crystal/Crystal3.mtl | 11 - .../models/block/crystal/Crystal3.obj | 30 - .../models/block/crystal/Crystal4.mtl | 11 - .../models/block/crystal/Crystal4.obj | 30 - .../models/block/crystal/Crystal5.mtl | 11 - .../models/block/crystal/Crystal5.obj | 30 - .../models/block/crystal/Crystal6.mtl | 11 - .../models/block/crystal/Crystal6.obj | 30 - .../models/block/crystal/Crystal7.mtl | 11 - .../models/block/crystal/Crystal7.obj | 30 - .../models/block/pillar_bottom.json | 184 --- .../bloodmagic/models/block/pillar_mid.json | 294 ---- .../bloodmagic/models/block/pillar_top.json | 184 --- .../routing/ModelMasterRoutingNodeBase.mtl | 11 - .../routing/ModelMasterRoutingNodeBase.obj | 360 ----- .../routing/ModelMasterRoutingNodeCore.mtl | 11 - .../routing/ModelMasterRoutingNodeCore.obj | 66 - .../block/routing/ModelRoutingNodeBase.mtl | 11 - .../block/routing/ModelRoutingNodeBase.obj | 444 ------ .../block/routing/ModelRoutingNodeCore.mtl | 11 - .../block/routing/ModelRoutingNodeCore.obj | 66 - .../block/routing/OutputRoutingNodeCore.json | 20 - .../models/block/routing/RoutingNodeBase.json | 33 - .../models/block/sub/BlockAltar.mtl | 12 - .../models/block/sub/BlockAltar.obj | 238 --- .../models/block/sub/BlockSoulForge.json | 160 -- .../block/sub/BlockSpellModifierCore.json | 19 - .../block/sub/BlockSpellModifierInput.json | 176 --- .../block/sub/BlockSpellModifierOutput.json | 67 - .../bloodmagic/models/bloodaltar-fixeUV.obj | 262 ---- .../assets/bloodmagic/models/bloodaltar.obj | 262 ---- .../models/item/BlockAlchemyArray.json | 10 - .../models/item/BlockBloodLight.json | 10 - .../models/item/BlockDimensionalPortal.json | 22 - .../models/item/BlockPedestal0.json | 10 - .../models/item/BlockPedestal1.json | 10 - .../bloodmagic/models/item/BlockPhantom.json | 10 - .../bloodmagic/models/item/BlockSpectral.json | 10 - .../bloodmagic/models/item/ItemBloodOrb.json | 6 - .../models/item/ItemBloodOrbApprentice.json | 6 - .../models/item/ItemBloodOrbArchmage.json | 6 - .../models/item/ItemBloodOrbMagician.json | 6 - .../models/item/ItemBloodOrbMaster.json | 6 - .../models/item/ItemBloodOrbTranscendent.json | 6 - .../models/item/ItemBloodOrbWeak.json | 6 - .../bloodmagic/models/item/ItemModelBase.json | 3 - .../models/item/ItemSentientArmourGem0.json | 11 - .../models/item/ItemSentientArmourGem1.json | 12 - .../models/item/ItemSentientBow.json | 169 -- .../bloodmagic/models/item/ItemToolBase.json | 15 - .../item/bow/ItemSentientBow_corrosive.json | 28 - .../ItemSentientBow_corrosive_pulling_0.json | 28 - .../ItemSentientBow_corrosive_pulling_1.json | 28 - .../ItemSentientBow_corrosive_pulling_2.json | 29 - .../item/bow/ItemSentientBow_destructive.json | 28 - ...ItemSentientBow_destructive_pulling_0.json | 28 - ...ItemSentientBow_destructive_pulling_1.json | 28 - ...ItemSentientBow_destructive_pulling_2.json | 29 - .../item/bow/ItemSentientBow_pulling_0.json | 28 - .../item/bow/ItemSentientBow_pulling_1.json | 28 - .../item/bow/ItemSentientBow_pulling_2.json | 28 - .../item/bow/ItemSentientBow_steadfast.json | 28 - .../ItemSentientBow_steadfast_pulling_0.json | 28 - .../ItemSentientBow_steadfast_pulling_1.json | 28 - .../ItemSentientBow_steadfast_pulling_2.json | 29 - .../item/bow/ItemSentientBow_vengeful.json | 28 - .../ItemSentientBow_vengeful_pulling_0.json | 28 - .../ItemSentientBow_vengeful_pulling_1.json | 28 - .../ItemSentientBow_vengeful_pulling_2.json | 29 - .../bloodmagic/schematics/Corridor1.json | 49 - .../bloodmagic/schematics/HallChest1.json | 41 - .../bloodmagic/schematics/RawBuilding1.json | 47 - .../bloodmagic/shaders/beam-broken.frag | 10 - .../assets/bloodmagic/shaders/beam.frag | 12 - .../bloodmagic/structures/Building1.nbt | Bin 8120 -> 0 bytes .../bloodmagic/structures/Corridor1.nbt | Bin 631 -> 0 bytes .../bloodmagic/structures/HallChest1.nbt | Bin 1973 -> 0 bytes .../textures/blocks/AccelerationRune.png | Bin 3579 -> 0 bytes .../textures/blocks/AirRitualStone.png | Bin 1621 -> 0 bytes .../textures/blocks/AltarCapacityRune.png | Bin 1670 -> 0 bytes .../textures/blocks/BetterCapacityRune.png | Bin 3510 -> 0 bytes .../bloodmagic/textures/blocks/BlankRune.png | Bin 1524 -> 0 bytes .../textures/blocks/BloodSocket.png | Bin 1609 -> 0 bytes .../textures/blocks/BloodStoneBrick.png | Bin 1488 -> 0 bytes .../bloodmagic/textures/blocks/BloodTank.png | Bin 911 -> 0 bytes .../textures/blocks/ChargingRune.png | Bin 886 -> 0 bytes .../textures/blocks/DislocationRune.png | Bin 1640 -> 0 bytes .../textures/blocks/DuskRitualStone.png | Bin 1623 -> 0 bytes .../textures/blocks/EarthRitualStone.png | Bin 1626 -> 0 bytes .../textures/blocks/EfficiencyRune.png | Bin 1621 -> 0 bytes .../textures/blocks/EmptySocket.png | Bin 1560 -> 0 bytes .../textures/blocks/EtherealOpaqueMimic.png | Bin 972 -> 0 bytes .../textures/blocks/FireRitualStone.png | Bin 1627 -> 0 bytes .../textures/blocks/ImperfectRitualStone.png | Bin 1598 -> 0 bytes .../textures/blocks/LargeBloodStoneBrick.png | Bin 598 -> 0 bytes .../textures/blocks/LightRitualStone.png | Bin 878 -> 0 bytes .../textures/blocks/MasterRitualStone.png | Bin 1529 -> 0 bytes .../textures/blocks/ObsidianBrickPath.png | Bin 16086 -> 0 bytes .../textures/blocks/ObsidianTilePath.png | Bin 15805 -> 0 bytes .../textures/blocks/OrbCapacityRune.png | Bin 1621 -> 0 bytes .../textures/blocks/PhantomBlock.png | Bin 1700 -> 0 bytes .../textures/blocks/RitualStone.png | Bin 1502 -> 0 bytes .../textures/blocks/RuneOfSacrifice.png | Bin 1614 -> 0 bytes .../textures/blocks/RuneOfSelfSacrifice.png | Bin 1682 -> 0 bytes .../textures/blocks/SentientMimic.png | Bin 901 -> 0 bytes .../textures/blocks/ShardCluster.png | Bin 891 -> 0 bytes .../textures/blocks/ShardClusterBrick.png | Bin 809 -> 0 bytes .../textures/blocks/SimpleTransCircle.png | Bin 4254 -> 0 bytes .../textures/blocks/SolidClearMimic.png | Bin 969 -> 0 bytes .../textures/blocks/SolidLightMimic.png | Bin 964 -> 0 bytes .../textures/blocks/SolidOpaqueMimic.png | Bin 961 -> 0 bytes .../bloodmagic/textures/blocks/SoulForge.png | Bin 1686 -> 0 bytes .../textures/blocks/SpectralBlock.png | Bin 15123 -> 0 bytes .../bloodmagic/textures/blocks/SpeedRune.png | Bin 1693 -> 0 bytes .../textures/blocks/StoneBrickPath.png | Bin 16221 -> 0 bytes .../textures/blocks/StoneTilePath.png | Bin 15846 -> 0 bytes .../textures/blocks/Teleposer_Side.png | Bin 1711 -> 0 bytes .../textures/blocks/Teleposer_Top.png | Bin 1703 -> 0 bytes .../textures/blocks/WaterRitualStone.png | Bin 1629 -> 0 bytes .../textures/blocks/WoodBrickPath.png | Bin 17848 -> 0 bytes .../textures/blocks/WoodTilePath.png | Bin 17780 -> 0 bytes .../textures/blocks/WornStoneBrickPath.png | Bin 16299 -> 0 bytes .../textures/blocks/WornStoneTilePath.png | Bin 15950 -> 0 bytes .../blocks/dungeon/dungeon_brick1.png | Bin 928 -> 0 bytes .../blocks/dungeon/dungeon_brick1_c.png | Bin 902 -> 0 bytes .../blocks/dungeon/dungeon_brick1_d.png | Bin 899 -> 0 bytes .../blocks/dungeon/dungeon_brick1_s.png | Bin 876 -> 0 bytes .../blocks/dungeon/dungeon_brick1_v.png | Bin 902 -> 0 bytes .../blocks/dungeon/dungeon_brick2.png | Bin 798 -> 0 bytes .../blocks/dungeon/dungeon_brick2_c.png | Bin 762 -> 0 bytes .../blocks/dungeon/dungeon_brick2_d.png | Bin 760 -> 0 bytes .../blocks/dungeon/dungeon_brick2_s.png | Bin 734 -> 0 bytes .../blocks/dungeon/dungeon_brick2_v.png | Bin 761 -> 0 bytes .../blocks/dungeon/dungeon_brick3.png | Bin 808 -> 0 bytes .../blocks/dungeon/dungeon_brick3_c.png | Bin 765 -> 0 bytes .../blocks/dungeon/dungeon_brick3_d.png | Bin 758 -> 0 bytes .../blocks/dungeon/dungeon_brick3_s.png | Bin 743 -> 0 bytes .../blocks/dungeon/dungeon_brick3_v.png | Bin 759 -> 0 bytes .../textures/blocks/dungeon/dungeon_eye.png | Bin 1002 -> 0 bytes .../textures/blocks/dungeon/dungeon_eye_c.png | Bin 981 -> 0 bytes .../textures/blocks/dungeon/dungeon_eye_d.png | Bin 972 -> 0 bytes .../textures/blocks/dungeon/dungeon_eye_s.png | Bin 978 -> 0 bytes .../textures/blocks/dungeon/dungeon_eye_v.png | Bin 972 -> 0 bytes .../textures/blocks/dungeon/dungeon_metal.png | Bin 684 -> 0 bytes .../blocks/dungeon/dungeon_metal_c.png | Bin 699 -> 0 bytes .../blocks/dungeon/dungeon_metal_d.png | Bin 692 -> 0 bytes .../blocks/dungeon/dungeon_metal_s.png | Bin 738 -> 0 bytes .../blocks/dungeon/dungeon_metal_v.png | Bin 698 -> 0 bytes .../blocks/dungeon/dungeon_pillar.png | Bin 936 -> 0 bytes .../blocks/dungeon/dungeon_pillar_c.png | Bin 902 -> 0 bytes .../blocks/dungeon/dungeon_pillar_d.png | Bin 890 -> 0 bytes .../blocks/dungeon/dungeon_pillar_s.png | Bin 880 -> 0 bytes .../blocks/dungeon/dungeon_pillar_v.png | Bin 895 -> 0 bytes .../blocks/dungeon/dungeon_pillarbottom.png | Bin 960 -> 0 bytes .../blocks/dungeon/dungeon_pillarbottom_c.png | Bin 931 -> 0 bytes .../blocks/dungeon/dungeon_pillarbottom_d.png | Bin 927 -> 0 bytes .../blocks/dungeon/dungeon_pillarbottom_s.png | Bin 916 -> 0 bytes .../blocks/dungeon/dungeon_pillarbottom_v.png | Bin 932 -> 0 bytes .../blocks/dungeon/dungeon_pillarheart.png | Bin 961 -> 0 bytes .../blocks/dungeon/dungeon_pillarheart_c.png | Bin 919 -> 0 bytes .../blocks/dungeon/dungeon_pillarheart_d.png | Bin 906 -> 0 bytes .../blocks/dungeon/dungeon_pillarheart_s.png | Bin 900 -> 0 bytes .../blocks/dungeon/dungeon_pillarheart_v.png | Bin 924 -> 0 bytes .../blocks/dungeon/dungeon_pillarspecial.png | Bin 1007 -> 0 bytes .../dungeon/dungeon_pillarspecial_c.png | Bin 977 -> 0 bytes .../dungeon/dungeon_pillarspecial_d.png | Bin 980 -> 0 bytes .../dungeon/dungeon_pillarspecial_s.png | Bin 971 -> 0 bytes .../dungeon/dungeon_pillarspecial_v.png | Bin 957 -> 0 bytes .../blocks/dungeon/dungeon_pillartop.png | Bin 980 -> 0 bytes .../blocks/dungeon/dungeon_pillartop_c.png | Bin 948 -> 0 bytes .../blocks/dungeon/dungeon_pillartop_d.png | Bin 940 -> 0 bytes .../blocks/dungeon/dungeon_pillartop_s.png | Bin 932 -> 0 bytes .../blocks/dungeon/dungeon_pillartop_v.png | Bin 938 -> 0 bytes .../blocks/dungeon/dungeon_polished.png | Bin 789 -> 0 bytes .../blocks/dungeon/dungeon_polished_c.png | Bin 745 -> 0 bytes .../blocks/dungeon/dungeon_polished_d.png | Bin 734 -> 0 bytes .../blocks/dungeon/dungeon_polished_s.png | Bin 723 -> 0 bytes .../blocks/dungeon/dungeon_polished_v.png | Bin 737 -> 0 bytes .../blocks/dungeon/dungeon_smallbrick.png | Bin 995 -> 0 bytes .../blocks/dungeon/dungeon_smallbrick_c.png | Bin 958 -> 0 bytes .../blocks/dungeon/dungeon_smallbrick_d.png | Bin 962 -> 0 bytes .../blocks/dungeon/dungeon_smallbrick_s.png | Bin 951 -> 0 bytes .../blocks/dungeon/dungeon_smallbrick_v.png | Bin 958 -> 0 bytes .../textures/blocks/dungeon/dungeon_stone.png | Bin 772 -> 0 bytes .../blocks/dungeon/dungeon_stone_c.png | Bin 727 -> 0 bytes .../blocks/dungeon/dungeon_stone_d.png | Bin 719 -> 0 bytes .../blocks/dungeon/dungeon_stone_s.png | Bin 696 -> 0 bytes .../blocks/dungeon/dungeon_stone_v.png | Bin 726 -> 0 bytes .../textures/blocks/dungeon/dungeon_tile.png | Bin 956 -> 0 bytes .../blocks/dungeon/dungeon_tile_c.png | Bin 930 -> 0 bytes .../blocks/dungeon/dungeon_tile_d.png | Bin 929 -> 0 bytes .../blocks/dungeon/dungeon_tile_s.png | Bin 913 -> 0 bytes .../blocks/dungeon/dungeon_tile_v.png | Bin 926 -> 0 bytes .../blocks/dungeon/dungeon_tilespecial.png | Bin 1005 -> 0 bytes .../blocks/dungeon/dungeon_tilespecial_c.png | Bin 973 -> 0 bytes .../blocks/dungeon/dungeon_tilespecial_d.png | Bin 990 -> 0 bytes .../blocks/dungeon/dungeon_tilespecial_s.png | Bin 970 -> 0 bytes .../blocks/dungeon/dungeon_tilespecial_v.png | Bin 973 -> 0 bytes .../bloodmagic/textures/blocks/empty.png | Bin 143 -> 0 bytes .../textures/blocks/lifeEssenceFlowing.png | Bin 7107 -> 0 bytes .../blocks/lifeEssenceFlowing.png.mcmeta | 5 - .../textures/blocks/lifeEssenceStill.png | Bin 7568 -> 0 bytes .../blocks/lifeEssenceStill.png.mcmeta | 45 - .../textures/entities/bloodElytra.png | Bin 3225 -> 0 bytes .../textures/entities/defaultCrystalLayer.png | Bin 7231 -> 0 bytes .../entities/energyBlastProjectile.png | Bin 623 -> 0 bytes .../textures/entities/explosionProjectile.png | Bin 1463 -> 0 bytes .../textures/entities/fireProjectile.png | Bin 1395 -> 0 bytes .../textures/entities/holyProjectile.png | Bin 1349 -> 0 bytes .../textures/entities/iceProjectile.png | Bin 1189 -> 0 bytes .../textures/entities/lightningProjectile.png | Bin 1210 -> 0 bytes .../textures/entities/mudProjectile.png | Bin 1454 -> 0 bytes .../bloodmagic/textures/entities/nodeBeam.png | Bin 260 -> 0 bytes .../textures/entities/overlay/overlay_raw.png | Bin 5132 -> 0 bytes .../textures/entities/soulArrow.png | Bin 772 -> 0 bytes .../textures/entities/soulArrow_corrosive.png | Bin 783 -> 0 bytes .../entities/soulArrow_destructive.png | Bin 771 -> 0 bytes .../textures/entities/soulArrow_steadfast.png | Bin 783 -> 0 bytes .../textures/entities/soulArrow_vengeful.png | Bin 782 -> 0 bytes .../bloodmagic/textures/entities/specter.png | Bin 213 -> 0 bytes .../textures/entities/waterProjectile.png | Bin 1423 -> 0 bytes .../textures/entities/windGustProjectile.png | Bin 1486 -> 0 bytes .../textures/entities/zombie_raw.png | Bin 7587 -> 0 bytes .../bloodmagic/textures/gui/GuiTrap.png | Bin 3677 -> 0 bytes .../bloodmagic/textures/gui/alchemyTable.png | Bin 3428 -> 0 bytes .../bloodmagic/textures/gui/bookcrafting.png | Bin 3756 -> 0 bytes .../bloodmagic/textures/gui/bookfurnace.png | Bin 1664 -> 0 bytes .../bloodmagic/textures/gui/bookleft.png | Bin 11940 -> 0 bytes .../bloodmagic/textures/gui/bookright.png | Bin 8536 -> 0 bytes .../textures/gui/buttons_compat.png | Bin 18994 -> 0 bytes .../bloodmagic/textures/gui/crucible.png | Bin 1235 -> 0 bytes .../textures/gui/masterRoutingNode.png | Bin 94211 -> 0 bytes .../bloodmagic/textures/gui/routingNode.png | Bin 1818 -> 0 bytes .../bloodmagic/textures/gui/soulForge.png | Bin 25888 -> 0 bytes .../bloodmagic/textures/gui/teleposer.png | Bin 1464 -> 0 bytes .../gui/thaumcraft/gui_research_back.jpg | Bin 73272 -> 0 bytes .../gui/thaumcraft/gui_research_back_over.png | Bin 307187 -> 0 bytes .../bloodmagic/textures/gui/widgets.png | Bin 22017 -> 0 bytes .../assets/bloodmagic/textures/hud/bars.png | Bin 6558 -> 0 bytes .../textures/items/AirScribeTool.png | Bin 15377 -> 0 bytes .../bloodmagic/textures/items/AirSigil.png | Bin 1575 -> 0 bytes .../bloodmagic/textures/items/AltarMaker.png | Bin 666 -> 0 bytes .../textures/items/AmpouleEmpty.png | Bin 288 -> 0 bytes .../bloodmagic/textures/items/AmpouleFull.png | Bin 316 -> 0 bytes .../bloodmagic/textures/items/Antiseptic.png | Bin 362 -> 0 bytes .../textures/items/ApprenticeBloodOrb.png | Bin 1237 -> 0 bytes .../bloodmagic/textures/items/ArcaneAshes.png | Bin 550 -> 0 bytes .../textures/items/ArchmageBloodOrb.png | Bin 1095 -> 0 bytes .../textures/items/BaseMonsterSoul.png | Bin 939 -> 0 bytes .../items/BaseMonsterSoul_corrosive.png | Bin 932 -> 0 bytes .../items/BaseMonsterSoul_destructive.png | Bin 938 -> 0 bytes .../items/BaseMonsterSoul_steadfast.png | Bin 931 -> 0 bytes .../items/BaseMonsterSoul_vengeful.png | Bin 938 -> 0 bytes .../textures/items/BasicCuttingFluid.png | Bin 359 -> 0 bytes .../textures/items/BlackPudding.png | Bin 669 -> 0 bytes .../bloodmagic/textures/items/BlankSigil.png | Bin 661 -> 0 bytes .../bloodmagic/textures/items/BlankSlate.png | Bin 671 -> 0 bytes .../textures/items/BloodLightSigil.png | Bin 1592 -> 0 bytes .../bloodmagic/textures/items/BloodPack.png | Bin 446 -> 0 bytes .../textures/items/BounceSigil_activated.png | Bin 717 -> 0 bytes .../items/BounceSigil_deactivated.png | Bin 695 -> 0 bytes .../textures/items/BoundAxe_activated.png | Bin 522 -> 0 bytes .../textures/items/BoundPickaxe_activated.png | Bin 1484 -> 0 bytes .../textures/items/BoundShovel_activated.png | Bin 1478 -> 0 bytes .../textures/items/BoundSword_activated.png | Bin 1541 -> 0 bytes .../bloodmagic/textures/items/BoundTool.png | Bin 1434 -> 0 bytes .../textures/items/BridgeSigil_activated.png | Bin 1585 -> 0 bytes .../items/BridgeSigil_deactivated.png | Bin 1593 -> 0 bytes .../textures/items/CeremonialDagger.png | Bin 531 -> 0 bytes .../textures/items/ClawSigil_activated.png | Bin 676 -> 0 bytes .../textures/items/ClawSigil_deactivated.png | Bin 685 -> 0 bytes .../bloodmagic/textures/items/Coagulant.png | Bin 362 -> 0 bytes .../bloodmagic/textures/items/CoalSand.png | Bin 454 -> 0 bytes .../textures/items/ComponentFrameParts.png | Bin 667 -> 0 bytes .../items/CompressionSigil_activated.png | Bin 747 -> 0 bytes .../items/CompressionSigil_deactivated.png | Bin 724 -> 0 bytes .../textures/items/CorrosiveCrystal.png | Bin 921 -> 0 bytes .../textures/items/DaggerOfSacrifice.png | Bin 523 -> 0 bytes .../textures/items/DawnScribeTool.png | Bin 15022 -> 0 bytes .../textures/items/DefaultCrystal.png | Bin 917 -> 0 bytes .../textures/items/DemonBloodShard.png | Bin 698 -> 0 bytes .../bloodmagic/textures/items/DemonSlate.png | Bin 671 -> 0 bytes .../textures/items/DemonWillGauge.png | Bin 811 -> 0 bytes .../textures/items/DemonicTeleposerFocus.png | Bin 976 -> 0 bytes .../textures/items/DestructiveCrystal.png | Bin 933 -> 0 bytes .../textures/items/DivinationSigil.png | Bin 1583 -> 0 bytes .../textures/items/DuskScribeTool.png | Bin 15430 -> 0 bytes .../textures/items/EarthScribeTool.png | Bin 15411 -> 0 bytes .../items/ElementalSigil_activated.png | Bin 710 -> 0 bytes .../items/ElementalSigil_deactivated.png | Bin 697 -> 0 bytes .../textures/items/EnhancedTeleposerFocus.png | Bin 765 -> 0 bytes .../textures/items/EtherealSlate.png | Bin 725 -> 0 bytes .../textures/items/ExperienceBook.png | Bin 676 -> 0 bytes .../textures/items/ExplosivePowder.png | Bin 469 -> 0 bytes .../textures/items/FireScribeTool.png | Bin 15837 -> 0 bytes .../bloodmagic/textures/items/GoldSand.png | Bin 499 -> 0 bytes .../textures/items/GrowthSigil_activated.png | Bin 1581 -> 0 bytes .../items/GrowthSigil_deactivated.png | Bin 1566 -> 0 bytes .../items/HarvestGoddessSigil_activated.png | Bin 755 -> 0 bytes .../items/HarvestGoddessSigil_deactivated.png | Bin 740 -> 0 bytes .../textures/items/HasteSigil_activated.png | Bin 1581 -> 0 bytes .../textures/items/HasteSigil_deactivated.png | Bin 1578 -> 0 bytes .../textures/items/IceSigil_activated.png | Bin 1584 -> 0 bytes .../textures/items/IceSigil_deactivated.png | Bin 1587 -> 0 bytes .../textures/items/InfusedSlate.png | Bin 674 -> 0 bytes .../textures/items/InputRoutingFocus.png | Bin 700 -> 0 bytes .../bloodmagic/textures/items/IronSand.png | Bin 509 -> 0 bytes .../textures/items/ItemRouterFilterExact.png | Bin 678 -> 0 bytes .../items/ItemRouterFilterIgnoreNBT.png | Bin 682 -> 0 bytes .../items/ItemRouterFilterModItems.png | Bin 681 -> 0 bytes .../items/ItemRouterFilterOreDict.png | Bin 681 -> 0 bytes .../textures/items/Item_deactivated.png | Bin 1373 -> 0 bytes .../bloodmagic/textures/items/LavaCrystal.png | Bin 1350 -> 0 bytes .../bloodmagic/textures/items/LavaSigil.png | Bin 1589 -> 0 bytes .../bloodmagic/textures/items/LifeBucket.png | Bin 1369 -> 0 bytes .../bloodmagic/textures/items/LivingBoots.png | Bin 584 -> 0 bytes .../textures/items/LivingHelmet.png | Bin 436 -> 0 bytes .../textures/items/LivingLeggings.png | Bin 419 -> 0 bytes .../bloodmagic/textures/items/LivingPlate.png | Bin 473 -> 0 bytes .../textures/items/MagicianBloodOrb.png | Bin 1234 -> 0 bytes .../bloodmagic/textures/items/MailOrder.png | Bin 853 -> 0 bytes .../textures/items/MasterBloodOrb.png | Bin 1008 -> 0 bytes .../textures/items/MiningSigil_activated.png | Bin 1574 -> 0 bytes .../items/MiningSigil_deactivated.png | Bin 1565 -> 0 bytes .../items/MundaneLengtheningCatalyst.png | Bin 336 -> 0 bytes .../textures/items/MundanePowerCatalyst.png | Bin 342 -> 0 bytes .../bloodmagic/textures/items/NeuroToxin.png | Bin 360 -> 0 bytes .../bloodmagic/textures/items/NodeRouter.png | Bin 492 -> 0 bytes .../bloodmagic/textures/items/PlantFibres.png | Bin 781 -> 0 bytes .../bloodmagic/textures/items/PlantOil.png | Bin 364 -> 0 bytes .../textures/items/PotionFlask_outline.png | Bin 457 -> 0 bytes .../textures/items/PotionFlask_overlay.png | Bin 179 -> 0 bytes .../textures/items/PotionFlask_underlay.png | Bin 460 -> 0 bytes .../textures/items/ReagentAffinity.png | Bin 574 -> 0 bytes .../bloodmagic/textures/items/ReagentAir.png | Bin 3622 -> 0 bytes .../textures/items/ReagentBinding.png | Bin 837 -> 0 bytes .../textures/items/ReagentBloodLight.png | Bin 506 -> 0 bytes .../textures/items/ReagentBounce.png | Bin 497 -> 0 bytes .../textures/items/ReagentBridge.png | Bin 483 -> 0 bytes .../bloodmagic/textures/items/ReagentClaw.png | Bin 628 -> 0 bytes .../textures/items/ReagentCompression.png | Bin 528 -> 0 bytes .../textures/items/ReagentFastMiner.png | Bin 595 -> 0 bytes .../textures/items/ReagentFrost.png | Bin 3622 -> 0 bytes .../textures/items/ReagentGrowth.png | Bin 579 -> 0 bytes .../textures/items/ReagentHaste.png | Bin 520 -> 0 bytes .../textures/items/ReagentHolding.png | Bin 520 -> 0 bytes .../bloodmagic/textures/items/ReagentLava.png | Bin 562 -> 0 bytes .../textures/items/ReagentMagnetism.png | Bin 497 -> 0 bytes .../textures/items/ReagentSeverance.png | Bin 526 -> 0 bytes .../textures/items/ReagentSight.png | Bin 602 -> 0 bytes .../textures/items/ReagentSuppression.png | Bin 543 -> 0 bytes .../textures/items/ReagentTeleposition.png | Bin 468 -> 0 bytes .../textures/items/ReagentTransposition.png | Bin 397 -> 0 bytes .../bloodmagic/textures/items/ReagentVoid.png | Bin 607 -> 0 bytes .../textures/items/ReagentWater.png | Bin 628 -> 0 bytes .../bloodmagic/textures/items/ReagentWind.png | Bin 504 -> 0 bytes .../textures/items/ReinforcedSlate.png | Bin 673 -> 0 bytes .../items/ReinforcedTeleposerFocus.png | Bin 868 -> 0 bytes .../textures/items/RitualDiviner.png | Bin 1366 -> 0 bytes .../textures/items/RitualTinkerer.png | Bin 505 -> 0 bytes .../textures/items/SacrificialDagger.png | Bin 1442 -> 0 bytes .../bloodmagic/textures/items/Saltpeter.png | Bin 414 -> 0 bytes .../textures/items/SanguineBook.png | Bin 695 -> 0 bytes .../bloodmagic/textures/items/SeerSigil.png | Bin 693 -> 0 bytes .../items/SentientArmourGem_activated.png | Bin 921 -> 0 bytes .../SentientArmourGem_corrosive_activated.png | Bin 951 -> 0 bytes ...entientArmourGem_corrosive_deactivated.png | Bin 857 -> 0 bytes .../items/SentientArmourGem_deactivated.png | Bin 851 -> 0 bytes ...entientArmourGem_destructive_activated.png | Bin 968 -> 0 bytes ...tientArmourGem_destructive_deactivated.png | Bin 864 -> 0 bytes .../SentientArmourGem_steadfast_activated.png | Bin 957 -> 0 bytes ...entientArmourGem_steadfast_deactivated.png | Bin 859 -> 0 bytes .../SentientArmourGem_vengeful_activated.png | Bin 971 -> 0 bytes ...SentientArmourGem_vengeful_deactivated.png | Bin 860 -> 0 bytes .../textures/items/SentientArrow.png | Bin 437 -> 0 bytes .../textures/items/SentientBoots.png | Bin 699 -> 0 bytes .../items/SentientBoots_corrosive.png | Bin 700 -> 0 bytes .../items/SentientBoots_destructive.png | Bin 691 -> 0 bytes .../items/SentientBoots_steadfast.png | Bin 697 -> 0 bytes .../textures/items/SentientBoots_vengeful.png | Bin 696 -> 0 bytes .../bloodmagic/textures/items/SentientBow.png | Bin 769 -> 0 bytes .../textures/items/SentientBow_corrosive.png | Bin 779 -> 0 bytes .../items/SentientBow_corrosive_pulling_0.png | Bin 611 -> 0 bytes .../items/SentientBow_corrosive_pulling_1.png | Bin 871 -> 0 bytes .../items/SentientBow_corrosive_pulling_2.png | Bin 838 -> 0 bytes .../items/SentientBow_destructive.png | Bin 785 -> 0 bytes .../SentientBow_destructive_pulling_0.png | Bin 596 -> 0 bytes .../SentientBow_destructive_pulling_1.png | Bin 864 -> 0 bytes .../SentientBow_destructive_pulling_2.png | Bin 825 -> 0 bytes .../textures/items/SentientBow_pulling_0.png | Bin 606 -> 0 bytes .../textures/items/SentientBow_pulling_1.png | Bin 846 -> 0 bytes .../textures/items/SentientBow_pulling_2.png | Bin 821 -> 0 bytes .../textures/items/SentientBow_steadfast.png | Bin 780 -> 0 bytes .../items/SentientBow_steadfast_pulling_0.png | Bin 620 -> 0 bytes .../items/SentientBow_steadfast_pulling_1.png | Bin 872 -> 0 bytes .../items/SentientBow_steadfast_pulling_2.png | Bin 822 -> 0 bytes .../textures/items/SentientBow_vengeful.png | Bin 778 -> 0 bytes .../items/SentientBow_vengeful_pulling_0.png | Bin 620 -> 0 bytes .../items/SentientBow_vengeful_pulling_1.png | Bin 876 -> 0 bytes .../items/SentientBow_vengeful_pulling_2.png | Bin 834 -> 0 bytes .../textures/items/SentientHelmet.png | Bin 474 -> 0 bytes .../items/SentientHelmet_corrosive.png | Bin 464 -> 0 bytes .../items/SentientHelmet_destructive.png | Bin 464 -> 0 bytes .../items/SentientHelmet_steadfast.png | Bin 562 -> 0 bytes .../items/SentientHelmet_vengeful.png | Bin 466 -> 0 bytes .../textures/items/SentientLeggings.png | Bin 522 -> 0 bytes .../items/SentientLeggings_corrosive.png | Bin 536 -> 0 bytes .../items/SentientLeggings_destructive.png | Bin 533 -> 0 bytes .../items/SentientLeggings_steadfast.png | Bin 533 -> 0 bytes .../items/SentientLeggings_vengeful.png | Bin 523 -> 0 bytes .../textures/items/SentientPlate.png | Bin 735 -> 0 bytes .../items/SentientPlate_corrosive.png | Bin 735 -> 0 bytes .../items/SentientPlate_destructive.png | Bin 732 -> 0 bytes .../items/SentientPlate_steadfast.png | Bin 737 -> 0 bytes .../textures/items/SentientPlate_vengeful.png | Bin 735 -> 0 bytes .../bloodmagic/textures/items/Set_area.png | Bin 505 -> 0 bytes .../textures/items/SheathedItem.png | Bin 1373 -> 0 bytes .../textures/items/SigilOfHolding.png | Bin 1605 -> 0 bytes .../items/SigilOfMagnetism_activated.png | Bin 692 -> 0 bytes .../items/SigilOfMagnetism_deactivated.png | Bin 691 -> 0 bytes .../items/SigilOfSeverance_activated.png | Bin 1599 -> 0 bytes .../items/SigilOfSeverance_deactivated.png | Bin 1590 -> 0 bytes .../items/SigilOfSuppression_activated.png | Bin 1605 -> 0 bytes .../items/SigilOfSuppression_deactivated.png | Bin 1573 -> 0 bytes .../textures/items/SigilOverlay.png | Bin 18111 -> 0 bytes .../bloodmagic/textures/items/SoulAxe.png | Bin 935 -> 0 bytes .../textures/items/SoulAxe_corrosive.png | Bin 937 -> 0 bytes .../textures/items/SoulAxe_destructive.png | Bin 945 -> 0 bytes .../textures/items/SoulAxe_steadfast.png | Bin 928 -> 0 bytes .../textures/items/SoulAxe_vengeful.png | Bin 929 -> 0 bytes .../textures/items/SoulGemCommon.png | Bin 717 -> 0 bytes .../items/SoulGemCommon_corrosive.png | Bin 725 -> 0 bytes .../items/SoulGemCommon_destructive.png | Bin 728 -> 0 bytes .../items/SoulGemCommon_steadfast.png | Bin 722 -> 0 bytes .../textures/items/SoulGemCommon_vengeful.png | Bin 726 -> 0 bytes .../textures/items/SoulGemGrand.png | Bin 757 -> 0 bytes .../textures/items/SoulGemGrand_corrosive.png | Bin 757 -> 0 bytes .../items/SoulGemGrand_destructive.png | Bin 761 -> 0 bytes .../textures/items/SoulGemGrand_steadfast.png | Bin 754 -> 0 bytes .../textures/items/SoulGemGrand_vengeful.png | Bin 767 -> 0 bytes .../textures/items/SoulGemGreater.png | Bin 721 -> 0 bytes .../items/SoulGemGreater_corrosive.png | Bin 725 -> 0 bytes .../items/SoulGemGreater_destructive.png | Bin 730 -> 0 bytes .../items/SoulGemGreater_steadfast.png | Bin 723 -> 0 bytes .../items/SoulGemGreater_vengeful.png | Bin 727 -> 0 bytes .../textures/items/SoulGemLesser.png | Bin 719 -> 0 bytes .../items/SoulGemLesser_corrosive.png | Bin 726 -> 0 bytes .../items/SoulGemLesser_destructive.png | Bin 727 -> 0 bytes .../items/SoulGemLesser_steadfast.png | Bin 725 -> 0 bytes .../textures/items/SoulGemLesser_vengeful.png | Bin 723 -> 0 bytes .../textures/items/SoulGemPetty.png | Bin 706 -> 0 bytes .../textures/items/SoulGemPetty_corrosive.png | Bin 710 -> 0 bytes .../items/SoulGemPetty_destructive.png | Bin 708 -> 0 bytes .../textures/items/SoulGemPetty_steadfast.png | Bin 708 -> 0 bytes .../textures/items/SoulGemPetty_vengeful.png | Bin 707 -> 0 bytes .../bloodmagic/textures/items/SoulPickaxe.png | Bin 923 -> 0 bytes .../textures/items/SoulPickaxe_corrosive.png | Bin 940 -> 0 bytes .../items/SoulPickaxe_destructive.png | Bin 941 -> 0 bytes .../textures/items/SoulPickaxe_steadfast.png | Bin 933 -> 0 bytes .../textures/items/SoulPickaxe_vengeful.png | Bin 939 -> 0 bytes .../bloodmagic/textures/items/SoulShovel.png | Bin 936 -> 0 bytes .../textures/items/SoulShovel_corrosive.png | Bin 945 -> 0 bytes .../textures/items/SoulShovel_destructive.png | Bin 938 -> 0 bytes .../textures/items/SoulShovel_steadfast.png | Bin 929 -> 0 bytes .../textures/items/SoulShovel_vengeful.png | Bin 940 -> 0 bytes .../bloodmagic/textures/items/SoulSnare.png | Bin 498 -> 0 bytes .../textures/items/SoulSnare_corrosive.png | Bin 499 -> 0 bytes .../textures/items/SoulSnare_destructive.png | Bin 499 -> 0 bytes .../textures/items/SoulSnare_steadfast.png | Bin 497 -> 0 bytes .../textures/items/SoulSnare_vengeful.png | Bin 496 -> 0 bytes .../textures/items/SoulSword_activated.png | Bin 15261 -> 0 bytes .../items/SoulSword_corrosive_activated.png | Bin 873 -> 0 bytes .../items/SoulSword_corrosive_deactivated.png | Bin 862 -> 0 bytes .../textures/items/SoulSword_deactivated.png | Bin 15220 -> 0 bytes .../items/SoulSword_destructive_activated.png | Bin 866 -> 0 bytes .../SoulSword_destructive_deactivated.png | Bin 847 -> 0 bytes .../items/SoulSword_steadfast_activated.png | Bin 873 -> 0 bytes .../items/SoulSword_steadfast_deactivated.png | Bin 867 -> 0 bytes .../items/SoulSword_vengeful_activated.png | Bin 876 -> 0 bytes .../items/SoulSword_vengeful_deactivated.png | Bin 866 -> 0 bytes .../textures/items/SteadfastCrystal.png | Bin 557 -> 0 bytes .../bloodmagic/textures/items/Sulfur.png | Bin 459 -> 0 bytes .../textures/items/TeleposerFocus.png | Bin 688 -> 0 bytes .../textures/items/TelepositionSigil.png | Bin 747 -> 0 bytes .../textures/items/TranscendentBloodOrb.png | Bin 1239 -> 0 bytes .../textures/items/TranspositionSigil.png | Bin 738 -> 0 bytes .../bloodmagic/textures/items/UpgradeTome.png | Bin 853 -> 0 bytes .../textures/items/UpgradeTrainer.png | Bin 690 -> 0 bytes .../textures/items/VengefulCrystal.png | Bin 571 -> 0 bytes .../bloodmagic/textures/items/VoidSigil.png | Bin 698 -> 0 bytes .../textures/items/WarriorSigil_activated.png | Bin 1583 -> 0 bytes .../items/WarriorSigil_deactivated.png | Bin 1580 -> 0 bytes .../textures/items/WaterScribeTool.png | Bin 15388 -> 0 bytes .../bloodmagic/textures/items/WaterSigil.png | Bin 1585 -> 0 bytes .../textures/items/WeakBloodOrb.png | Bin 1220 -> 0 bytes .../textures/items/WeakBloodShard.png | Bin 541 -> 0 bytes .../textures/items/WindSigil_activated.png | Bin 1599 -> 0 bytes .../textures/items/WindSigil_deactivated.png | Bin 1574 -> 0 bytes .../items/activationCrystalAwakened.png | Bin 15410 -> 0 bytes .../items/activationCrystalCreative.png | Bin 15021 -> 0 bytes .../textures/items/activationCrystalWeak.png | Bin 15408 -> 0 bytes .../textures/items/crucibleupgrade.png | Bin 649 -> 0 bytes .../bloodmagic/textures/items/information.png | Bin 648 -> 0 bytes .../textures/items/ritual_dismantler.png | Bin 693 -> 0 bytes .../textures/items/sacrificePlate.png | Bin 537 -> 0 bytes .../textures/items/selfSacrificePlate.png | Bin 512 -> 0 bytes .../textures/items/set_will_types.png | Bin 593 -> 0 bytes .../assets/bloodmagic/textures/misc/beam2.png | Bin 487 -> 0 bytes .../bloodmagic/textures/misc/potions.png | Bin 1577 -> 0 bytes .../textures/misc/screenshots/altars/T1.png | Bin 21644 -> 0 bytes .../textures/misc/screenshots/altars/T2.png | Bin 37659 -> 0 bytes .../textures/misc/screenshots/altars/T3.png | Bin 48658 -> 0 bytes .../textures/misc/screenshots/altars/T4.png | Bin 49884 -> 0 bytes .../textures/misc/screenshots/altars/T5.png | Bin 63113 -> 0 bytes .../textures/misc/screenshots/altars/T6.png | Bin 72385 -> 0 bytes .../misc/screenshots/demons/Ring1.png | Bin 21567 -> 0 bytes .../misc/screenshots/demons/Ring2.png | Bin 41249 -> 0 bytes .../misc/screenshots/rituals/Alchemy.png | Bin 48584 -> 0 bytes .../misc/screenshots/rituals/AnimalGrowth.png | Bin 38609 -> 0 bytes .../misc/screenshots/rituals/BeatingAnvil.png | Bin 57210 -> 0 bytes .../misc/screenshots/rituals/Binding.png | Bin 91100 -> 0 bytes .../misc/screenshots/rituals/Containment.png | Bin 38720 -> 0 bytes .../misc/screenshots/rituals/Convocation.png | Bin 99654 -> 0 bytes .../misc/screenshots/rituals/Crusher.png | Bin 78450 -> 0 bytes .../misc/screenshots/rituals/Dome.png | Bin 44876 -> 0 bytes .../misc/screenshots/rituals/Ellipsoid.png | Bin 89596 -> 0 bytes .../misc/screenshots/rituals/EternalSoul.png | Bin 82170 -> 0 bytes .../misc/screenshots/rituals/Evaporation.png | Bin 70654 -> 0 bytes .../misc/screenshots/rituals/Expulsion.png | Bin 41196 -> 0 bytes .../screenshots/rituals/FeatheredEarth.png | Bin 85440 -> 0 bytes .../screenshots/rituals/FeatheredKnife.png | Bin 57026 -> 0 bytes .../misc/screenshots/rituals/Flight.png | Bin 74223 -> 0 bytes .../misc/screenshots/rituals/Gaia.png | Bin 73058 -> 0 bytes .../misc/screenshots/rituals/GreenGrove.png | Bin 38966 -> 0 bytes .../misc/screenshots/rituals/Harvest.png | Bin 73476 -> 0 bytes .../misc/screenshots/rituals/Interdiction.png | Bin 37754 -> 0 bytes .../misc/screenshots/rituals/Jump.png | Bin 60507 -> 0 bytes .../misc/screenshots/rituals/Lava.png | Bin 33923 -> 0 bytes .../misc/screenshots/rituals/Magnetism.png | Bin 74168 -> 0 bytes .../misc/screenshots/rituals/Meteor.png | Bin 72137 -> 0 bytes .../misc/screenshots/rituals/PhantomHands.png | Bin 90184 -> 0 bytes .../misc/screenshots/rituals/Regeneration.png | Bin 68184 -> 0 bytes .../screenshots/rituals/Sacrosanctity.png | Bin 85523 -> 0 bytes .../misc/screenshots/rituals/Speed.png | Bin 46938 -> 0 bytes .../screenshots/rituals/StallingOmega.png | Bin 96404 -> 0 bytes .../misc/screenshots/rituals/Stomach.png | Bin 76910 -> 0 bytes .../screenshots/rituals/SymmetryOmega.png | Bin 22586 -> 0 bytes .../misc/screenshots/rituals/Unbinding.png | Bin 85056 -> 0 bytes .../misc/screenshots/rituals/VeilOfEvil.png | Bin 79972 -> 0 bytes .../misc/screenshots/rituals/Water.png | Bin 32267 -> 0 bytes .../screenshots/rituals/WellOfSuffering.png | Bin 93294 -> 0 bytes .../misc/screenshots/rituals/Zephyr.png | Bin 60404 -> 0 bytes .../misc/screenshots/spells/Conduit.png | Bin 41574 -> 0 bytes .../misc/screenshots/spells/Effect.png | Bin 24790 -> 0 bytes .../misc/screenshots/spells/Enhancement.png | Bin 30271 -> 0 bytes .../misc/screenshots/spells/Modifier.png | Bin 24647 -> 0 bytes .../misc/screenshots/spells/Paradigm.png | Bin 23796 -> 0 bytes .../screenshots/spells/SimpleSpellTable.png | Bin 33963 -> 0 bytes .../models/AlchemyArrays/AirSigil.png | Bin 36077 -> 0 bytes .../models/AlchemyArrays/BaseArray.png | Bin 20705 -> 0 bytes .../models/AlchemyArrays/BindingArray.png | Bin 43181 -> 0 bytes .../AlchemyArrays/BindingLightningArray.png | Bin 43258 -> 0 bytes .../models/AlchemyArrays/BounceArray.png | Bin 35950 -> 0 bytes .../models/AlchemyArrays/DivinationSigil.png | Bin 33324 -> 0 bytes .../AlchemyArrays/ElementalAffinitySigil.png | Bin 36992 -> 0 bytes .../models/AlchemyArrays/FastMinerSigil.png | Bin 30009 -> 0 bytes .../models/AlchemyArrays/GrowthSigil.png | Bin 33209 -> 0 bytes .../models/AlchemyArrays/HasteSigil.png | Bin 38571 -> 0 bytes .../models/AlchemyArrays/LavaSigil.png | Bin 28707 -> 0 bytes .../models/AlchemyArrays/LightSigil.png | Bin 41435 -> 0 bytes .../models/AlchemyArrays/MagnetismSigil.png | Bin 36653 -> 0 bytes .../models/AlchemyArrays/MovementArray.png | Bin 46869 -> 0 bytes .../models/AlchemyArrays/SightSigil.png | Bin 43552 -> 0 bytes .../models/AlchemyArrays/SkeletonTurret1.png | Bin 33675 -> 0 bytes .../models/AlchemyArrays/SkeletonTurret2.png | Bin 30611 -> 0 bytes .../models/AlchemyArrays/StupidArray.png | Bin 905 -> 0 bytes .../models/AlchemyArrays/SuppressionSigil.png | Bin 42298 -> 0 bytes .../AlchemyArrays/TeleportationArray.png | Bin 50896 -> 0 bytes .../models/AlchemyArrays/UpdraftArray.png | Bin 43778 -> 0 bytes .../models/AlchemyArrays/VoidSigil.png | Bin 24185 -> 0 bytes .../models/AlchemyArrays/WIPArray.png | Bin 16402 -> 0 bytes .../models/AlchemyArrays/WaterSigil.png | Bin 29093 -> 0 bytes .../models/AlchemyArrays/ZombieBeacon.png | Bin 40967 -> 0 bytes .../textures/models/CorrosiveCrystal.png | Bin 748 -> 0 bytes .../textures/models/DefaultCrystal.png | Bin 740 -> 0 bytes .../textures/models/DestructiveCrystal.png | Bin 748 -> 0 bytes .../models/EnergyBazookaMainProjectile.png | Bin 2154 -> 0 bytes .../bloodmagic/textures/models/Meteor.png | Bin 1969 -> 0 bytes .../textures/models/ModelInputRoutingNode.png | Bin 1948 -> 0 bytes .../models/ModelMasterRoutingNode.png | Bin 2898 -> 0 bytes .../models/ModelOutputRoutingNode.png | Bin 1916 -> 0 bytes .../bloodmagic/textures/models/Pedestal.png | Bin 1469 -> 0 bytes .../bloodmagic/textures/models/Plinth.png | Bin 2700 -> 0 bytes .../bloodmagic/textures/models/Reagent.png | Bin 396 -> 0 bytes .../textures/models/SimpleTransCircle.png | Bin 22424 -> 0 bytes .../textures/models/SteadfastCrystal.png | Bin 734 -> 0 bytes .../textures/models/VengefulCrystal.png | Bin 737 -> 0 bytes .../textures/models/WritingTable.png | Bin 2260 -> 0 bytes .../textures/models/alchemytable.png | Bin 10109 -> 0 bytes .../bloodmagic/textures/models/altar.png | Bin 5709 -> 0 bytes .../textures/models/demoncrucible.png | Bin 5682 -> 0 bytes .../textures/models/demoncrystallizer.png | Bin 3406 -> 0 bytes .../bloodmagic/textures/models/demonpylon.png | Bin 5671 -> 0 bytes .../textures/models/hellfireforge.png | Bin 3581 -> 0 bytes .../textures/models/incensealtar.png | Bin 6835 -> 0 bytes .../textures/models/modelroutingnode.png | Bin 1798 -> 0 bytes .../textures/models/pillar_base.png | Bin 1573 -> 0 bytes .../textures/models/pillar_base_c.png | Bin 1515 -> 0 bytes .../textures/models/pillar_base_d.png | Bin 1489 -> 0 bytes .../textures/models/pillar_base_s.png | Bin 1517 -> 0 bytes .../textures/models/pillar_base_v.png | Bin 1590 -> 0 bytes .../bloodmagic/textures/models/pillar_mid.png | Bin 1901 -> 0 bytes .../textures/models/pillar_mid_c.png | Bin 1853 -> 0 bytes .../textures/models/pillar_mid_d.png | Bin 1805 -> 0 bytes .../textures/models/pillar_mid_s.png | Bin 1794 -> 0 bytes .../textures/models/pillar_mid_v.png | Bin 2446 -> 0 bytes .../bloodmagic/textures/potions/boost.png | Bin 748 -> 0 bytes .../assets/bloodmagicguide/lang/en_US.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 .../creative_inventory/tab_upgrade_tomes.png | Bin 1107 -> 0 bytes 796 files changed, 15806 deletions(-) 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/BlockAlchemyArray.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockAlchemyTable.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockAltar.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockBloodLight.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockBloodRune.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockBloodStoneBrick.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockBloodTank.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockCrystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDemonBricks1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDemonBricks2.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrucible.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrystallizer.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDemonExtra.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDemonLight.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDemonPylon.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockDimensionalPortal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockIncenseAltar.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockInputRoutingNode.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockInversionPillar.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockInversionPillarEnd.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockItemRoutingNode.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockLifeEssence.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockMasterRoutingNode.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockMimic.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockOutputRoutingNode.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockPath.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockPhantom.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockPillar1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockPillar2.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap2.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap3.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockRitualController.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockRitualStone.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockSoulForge.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockSpectral.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockStairs1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockStairs2.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockStairs3.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockTeleposer.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockTestSpellBlock.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockWall1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemActivationCrystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemAltarMaker.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemArcaneAshes.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemBlockDemonCrystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemBloodShard.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundAxe.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundPickaxe.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundShovel.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundSword.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemComponent.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemCuttingFluid.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemDaggerOfSacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemDemonCrystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemDemonWillGauge.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemExperienceBook.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemInscriptionTool.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemLavaCrystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemLivingArmour.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemLivingArmourPointsUpgrade.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemMonsterSoul.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemNodeRouter.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemPackSacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemPackSelfSacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemPotionFlask.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemRitualDiviner.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemRitualReader.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemRouterFilter.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSacrificialDagger.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSanguineBook.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientArmour.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientArmourGem.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientAxe.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientBow.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientPickaxe.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientShovel.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientSword.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilAir.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilBloodLight.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilBounce.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilClaw.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilCompression.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilDivination.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilElementalAffinity.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilEnderSeverance.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilFastMiner.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilFrost.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilGreenGrove.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilHaste.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilHolding.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilLava.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilMagnetism.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilPhantomBridge.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilSeer.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilSuppression.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilTeleposition.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilTransposition.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilVoid.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilWater.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilWhirlwind.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSlate.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSoulGem.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSoulSnare.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemTelepositionFocus.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemUpgradeTome.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemUpgradeTrainer.json delete mode 100644 src/main/resources/assets/bloodmagic/books/architect.xml delete mode 100644 src/main/resources/assets/bloodmagic/gui/SigilHolding.png delete mode 100644 src/main/resources/assets/bloodmagic/gui/Teleposer.png delete mode 100644 src/main/resources/assets/bloodmagic/gui/WritingTable.png delete mode 100644 src/main/resources/assets/bloodmagic/gui/bookleft.png delete mode 100644 src/main/resources/assets/bloodmagic/gui/jei/alchemy.png delete mode 100644 src/main/resources/assets/bloodmagic/gui/jei/alchemyTable.png delete mode 100644 src/main/resources/assets/bloodmagic/gui/jei/altar.png delete mode 100644 src/main/resources/assets/bloodmagic/gui/jei/binding.png delete mode 100644 src/main/resources/assets/bloodmagic/gui/jei/soulForge.png delete mode 100644 src/main/resources/assets/bloodmagic/loot_tables/bm_loot_table.json delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/livingArmour_layer_1.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/livingArmour_layer_2.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sacrificeArmour_layer_1.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/selfSacrificeArmour_layer_1.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_corrosive_layer_1.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_corrosive_layer_2.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_destructive_layer_1.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_destructive_layer_2.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_layer_1.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_layer_2.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_steadfast_layer_1.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_steadfast_layer_2.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_vengeful_layer_1.png delete mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientArmour_vengeful_layer_2.png delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockAlchemyArray.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockAltar.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockAltar.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockBlank.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockBloodLight.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockBloodTank.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDemonCrucible.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDemonCrucible.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDemonCrystallizer.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDemonCrystallizer.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDemonPylon.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDemonPylon.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDimensionalPortal.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDimensionalPortalEW.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockDimensionalPortalNS.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockHellfireForge.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockHellfireForge.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockIncenseAltar.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockIncenseAltar.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockIncenseAltar.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockInputRoutingNode.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockMasterRoutingNode.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockOutputRoutingNode.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockPhantom.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockPillarCapEast.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockPillarCapNorth.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockPillarCapSouth.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockPillarCapWest.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockPillarX.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockPillarZ.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockSoulForge.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockSpectral.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/ModelAlchemyTable.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/ModelAlchemyTable.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal1.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal1.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal2.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal2.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal3.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal3.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal4.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal4.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal5.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal5.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal6.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal6.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal7.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/Crystal7.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/pillar_bottom.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/pillar_mid.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/pillar_top.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/ModelMasterRoutingNodeBase.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/ModelMasterRoutingNodeBase.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/ModelMasterRoutingNodeCore.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/ModelMasterRoutingNodeCore.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/ModelRoutingNodeBase.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/ModelRoutingNodeBase.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/ModelRoutingNodeCore.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/ModelRoutingNodeCore.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/OutputRoutingNodeCore.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/RoutingNodeBase.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/BlockAltar.mtl delete mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/BlockAltar.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/BlockSoulForge.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/BlockSpellModifierCore.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/BlockSpellModifierInput.json delete mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/BlockSpellModifierOutput.json delete mode 100644 src/main/resources/assets/bloodmagic/models/bloodaltar-fixeUV.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/bloodaltar.obj delete mode 100644 src/main/resources/assets/bloodmagic/models/item/BlockAlchemyArray.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/BlockBloodLight.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/BlockDimensionalPortal.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/BlockPedestal0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/BlockPedestal1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/BlockPhantom.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/BlockSpectral.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemBloodOrb.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemBloodOrbApprentice.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemBloodOrbArchmage.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemBloodOrbMagician.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemBloodOrbMaster.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemBloodOrbTranscendent.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemBloodOrbWeak.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemModelBase.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemSentientArmourGem0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemSentientArmourGem1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemSentientBow.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/ItemToolBase.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_corrosive_pulling_0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_corrosive_pulling_1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_corrosive_pulling_2.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_destructive_pulling_0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_destructive_pulling_1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_destructive_pulling_2.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_pulling_0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_pulling_1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_pulling_2.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_steadfast_pulling_0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_steadfast_pulling_1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_steadfast_pulling_2.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_vengeful_pulling_0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_vengeful_pulling_1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/ItemSentientBow_vengeful_pulling_2.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/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 delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/AccelerationRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/AirRitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/AltarCapacityRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/BetterCapacityRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/BlankRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/BloodSocket.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/BloodStoneBrick.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/BloodTank.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/ChargingRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/DislocationRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/DuskRitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/EarthRitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/EfficiencyRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/EmptySocket.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/EtherealOpaqueMimic.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/FireRitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/ImperfectRitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/LargeBloodStoneBrick.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/LightRitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/MasterRitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/ObsidianBrickPath.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/ObsidianTilePath.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/OrbCapacityRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/PhantomBlock.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/RitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/RuneOfSacrifice.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/RuneOfSelfSacrifice.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/SentientMimic.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/ShardCluster.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/ShardClusterBrick.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/SimpleTransCircle.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/SolidClearMimic.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/SolidLightMimic.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/SolidOpaqueMimic.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/SoulForge.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/SpectralBlock.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/SpeedRune.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/StoneBrickPath.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/StoneTilePath.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/Teleposer_Side.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/Teleposer_Top.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/WaterRitualStone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/WoodBrickPath.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/WoodTilePath.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/WornStoneBrickPath.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/WornStoneTilePath.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/empty.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceFlowing.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceFlowing.png.mcmeta delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceStill.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceStill.png.mcmeta delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/bloodElytra.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/defaultCrystalLayer.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/energyBlastProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/explosionProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/fireProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/holyProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/iceProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/lightningProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/mudProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/nodeBeam.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/overlay/overlay_raw.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soulArrow.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soulArrow_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soulArrow_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soulArrow_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soulArrow_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/specter.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/waterProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/windGustProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/entities/zombie_raw.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/GuiTrap.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/alchemyTable.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/bookcrafting.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/bookfurnace.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/bookleft.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/bookright.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/buttons_compat.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/crucible.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/masterRoutingNode.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/routingNode.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/soulForge.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/teleposer.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back.jpg delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back_over.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/gui/widgets.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/hud/bars.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/AirScribeTool.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/AirSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/AltarMaker.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/AmpouleEmpty.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/AmpouleFull.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/Antiseptic.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ApprenticeBloodOrb.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ArcaneAshes.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ArchmageBloodOrb.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BasicCuttingFluid.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BlackPudding.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BlankSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BlankSlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BloodLightSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BloodPack.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BounceSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BounceSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BoundAxe_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BoundPickaxe_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BoundShovel_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BoundSword_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BoundTool.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BridgeSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/BridgeSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/CeremonialDagger.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ClawSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ClawSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/Coagulant.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/CoalSand.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ComponentFrameParts.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/CompressionSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/CompressionSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/CorrosiveCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DaggerOfSacrifice.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DawnScribeTool.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DefaultCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DemonBloodShard.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DemonSlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DemonWillGauge.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DemonicTeleposerFocus.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DestructiveCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DivinationSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/DuskScribeTool.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/EarthScribeTool.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ElementalSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ElementalSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/EnhancedTeleposerFocus.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/EtherealSlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ExperienceBook.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ExplosivePowder.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/FireScribeTool.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/GoldSand.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/GrowthSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/GrowthSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/HarvestGoddessSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/HarvestGoddessSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/HasteSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/HasteSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/IceSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/IceSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/InfusedSlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/InputRoutingFocus.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/IronSand.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ItemRouterFilterExact.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ItemRouterFilterIgnoreNBT.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ItemRouterFilterModItems.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ItemRouterFilterOreDict.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/Item_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/LavaCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/LavaSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/LifeBucket.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/LivingBoots.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/LivingHelmet.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/LivingLeggings.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/LivingPlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/MagicianBloodOrb.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/MailOrder.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/MasterBloodOrb.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/MiningSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/MiningSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/MundaneLengtheningCatalyst.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/MundanePowerCatalyst.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/NeuroToxin.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/NodeRouter.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/PlantFibres.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/PlantOil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/PotionFlask_outline.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/PotionFlask_overlay.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/PotionFlask_underlay.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentAffinity.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentAir.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentBinding.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentBloodLight.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentBounce.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentBridge.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentClaw.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentCompression.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentFastMiner.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentFrost.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentGrowth.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentHaste.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentHolding.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentLava.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentMagnetism.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentSeverance.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentSight.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentSuppression.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentTeleposition.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentTransposition.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentVoid.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentWater.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReagentWind.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReinforcedSlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ReinforcedTeleposerFocus.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/RitualDiviner.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/RitualTinkerer.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SacrificialDagger.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/Saltpeter.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SanguineBook.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SeerSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_corrosive_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_corrosive_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_destructive_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_destructive_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_steadfast_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_steadfast_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_vengeful_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_vengeful_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientArrow.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBoots.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBoots_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBoots_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBoots_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBoots_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_corrosive_pulling_0.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_corrosive_pulling_1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_corrosive_pulling_2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_destructive_pulling_0.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_destructive_pulling_1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_destructive_pulling_2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_pulling_0.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_pulling_1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_pulling_2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_steadfast_pulling_0.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_steadfast_pulling_1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_steadfast_pulling_2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_vengeful_pulling_0.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_vengeful_pulling_1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientBow_vengeful_pulling_2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientHelmet.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientHelmet_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientHelmet_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientHelmet_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientHelmet_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientLeggings.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientLeggings_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientLeggings_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientLeggings_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientLeggings_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientPlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientPlate_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientPlate_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientPlate_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SentientPlate_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/Set_area.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SheathedItem.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SigilOfHolding.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SigilOfMagnetism_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SigilOfMagnetism_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SigilOfSeverance_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SigilOfSeverance_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SigilOfSuppression_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SigilOfSuppression_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SigilOverlay.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulAxe.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulAxe_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulAxe_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulAxe_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulAxe_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulShovel.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulShovel_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulShovel_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulShovel_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulShovel_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSnare.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSnare_corrosive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSnare_destructive.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSnare_steadfast.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSnare_vengeful.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_corrosive_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_corrosive_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_destructive_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_destructive_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_steadfast_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_steadfast_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_vengeful_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SoulSword_vengeful_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/SteadfastCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/Sulfur.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/TeleposerFocus.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/TelepositionSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/TranscendentBloodOrb.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/TranspositionSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/UpgradeTome.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/UpgradeTrainer.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/VengefulCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/VoidSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/WarriorSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/WarriorSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/WaterScribeTool.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/WaterSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/WeakBloodOrb.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/WeakBloodShard.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/WindSigil_activated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/WindSigil_deactivated.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/activationCrystalAwakened.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/activationCrystalCreative.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/activationCrystalWeak.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/crucibleupgrade.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/information.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/ritual_dismantler.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/sacrificePlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/selfSacrificePlate.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/items/set_will_types.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/beam2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/potions.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T3.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T4.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T5.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T6.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/demons/Ring1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/demons/Ring2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Alchemy.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/AnimalGrowth.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/BeatingAnvil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Binding.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Containment.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Convocation.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Crusher.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Dome.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Ellipsoid.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/EternalSoul.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Evaporation.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Expulsion.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/FeatheredEarth.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/FeatheredKnife.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Flight.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Gaia.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/GreenGrove.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Harvest.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Interdiction.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Jump.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Lava.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Magnetism.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Meteor.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/PhantomHands.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Regeneration.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Sacrosanctity.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Speed.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/StallingOmega.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Stomach.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/SymmetryOmega.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Unbinding.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/VeilOfEvil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Water.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/WellOfSuffering.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Zephyr.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/Conduit.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/Effect.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/Enhancement.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/Modifier.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/Paradigm.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/SimpleSpellTable.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/AirSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BaseArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BindingArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BindingLightningArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BounceArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/DivinationSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/ElementalAffinitySigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/FastMinerSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/GrowthSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/HasteSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/LavaSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/LightSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/MagnetismSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/MovementArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/SightSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/SkeletonTurret1.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/SkeletonTurret2.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/StupidArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/SuppressionSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/TeleportationArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/UpdraftArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/VoidSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/WIPArray.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/WaterSigil.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/ZombieBeacon.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/CorrosiveCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/DefaultCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/DestructiveCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/EnergyBazookaMainProjectile.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/Meteor.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/ModelInputRoutingNode.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/ModelMasterRoutingNode.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/ModelOutputRoutingNode.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/Pedestal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/Plinth.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/Reagent.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/SimpleTransCircle.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/SteadfastCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/VengefulCrystal.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/WritingTable.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemytable.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/altar.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/demoncrucible.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/demoncrystallizer.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/demonpylon.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/hellfireforge.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/incensealtar.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/modelroutingnode.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid_c.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid_d.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid_s.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid_v.png delete mode 100644 src/main/resources/assets/bloodmagic/textures/potions/boost.png delete mode 100644 src/main/resources/assets/bloodmagicguide/lang/en_US.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/assets/minecraft/textures/gui/container/creative_inventory/tab_upgrade_tomes.png 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/BlockAlchemyArray.json b/src/main/resources/assets/bloodmagic/blockstates/BlockAlchemyArray.json deleted file mode 100644 index 03ba5c90..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockAlchemyArray.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "normal": { - "model": "bloodmagic:BlockAlchemyArray", - "textures": { - "all": "bloodmagic:models/AlchemyArrays/StupidArray" - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockAlchemyTable.json b/src/main/resources/assets/bloodmagic/blockstates/BlockAlchemyTable.json deleted file mode 100644 index d1d44534..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockAlchemyTable.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/BlockAltar.json b/src/main/resources/assets/bloodmagic/blockstates/BlockAltar.json deleted file mode 100644 index 24191a55..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockAltar.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "bloodmagic:BlockAltar.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/BlockBloodLight.json b/src/main/resources/assets/bloodmagic/blockstates/BlockBloodLight.json deleted file mode 100644 index c67139da..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockBloodLight.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/BlockBloodRune.json b/src/main/resources/assets/bloodmagic/blockstates/BlockBloodRune.json deleted file mode 100644 index f267e034..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockBloodRune.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" - } - }, - "selfsacrifice": { - "textures": { - "all": "bloodmagic:blocks/RuneOfSelfSacrifice" - } - }, - "displacement": { - "textures": { - "all": "bloodmagic:blocks/DislocationRune" - } - }, - "capacity": { - "textures": { - "all": "bloodmagic:blocks/AltarCapacityRune" - } - }, - "augcapacity": { - "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/BlockBloodStoneBrick.json b/src/main/resources/assets/bloodmagic/blockstates/BlockBloodStoneBrick.json deleted file mode 100644 index 9cce5ef3..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockBloodStoneBrick.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "large": { - "textures": { - "all": "bloodmagic:blocks/LargeBloodStoneBrick" - } - }, - "brick": { - "textures": { - "all": "bloodmagic:blocks/BloodStoneBrick" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockBloodTank.json b/src/main/resources/assets/bloodmagic/blockstates/BlockBloodTank.json deleted file mode 100644 index d71d03f6..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockBloodTank.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/BlockCrystal.json b/src/main/resources/assets/bloodmagic/blockstates/BlockCrystal.json deleted file mode 100644 index c997259c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockCrystal.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "large": { - "textures": { - "all": "bloodmagic:blocks/ShardCluster" - } - }, - "brick": { - "textures": { - "all": "bloodmagic:blocks/ShardClusterBrick" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonBricks1.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDemonBricks1.json deleted file mode 100644 index bff693ef..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonBricks1.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/BlockDemonBricks2.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDemonBricks2.json deleted file mode 100644 index deef552c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonBricks2.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/BlockDemonCrucible.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrucible.json deleted file mode 100644 index 6a1615be..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrucible.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/BlockDemonCrystal.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrystal.json deleted file mode 100644 index 792e272f..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrystal.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/BlockDemonCrystallizer.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrystallizer.json deleted file mode 100644 index ef8d9802..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonCrystallizer.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/BlockDemonExtra.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDemonExtra.json deleted file mode 100644 index 4854590c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonExtra.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/BlockDemonLight.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDemonLight.json deleted file mode 100644 index 171bdd39..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonLight.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/BlockDemonPylon.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDemonPylon.json deleted file mode 100644 index 4a2b009e..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDemonPylon.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/BlockDimensionalPortal.json b/src/main/resources/assets/bloodmagic/blockstates/BlockDimensionalPortal.json deleted file mode 100644 index 3ed3ae07..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockDimensionalPortal.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": {}, - "uvlock": true - }, - "variants": { - "meta": { - "0": {"model": "bloodmagic:BlockDimensionalPortalNS"}, - "1": {"model": "bloodmagic:BlockDimensionalPortalEW"} - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockIncenseAltar.json b/src/main/resources/assets/bloodmagic/blockstates/BlockIncenseAltar.json deleted file mode 100644 index f5c0414e..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockIncenseAltar.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/BlockInputRoutingNode.json b/src/main/resources/assets/bloodmagic/blockstates/BlockInputRoutingNode.json deleted file mode 100644 index 01f96406..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockInputRoutingNode.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/BlockInversionPillar.json b/src/main/resources/assets/bloodmagic/blockstates/BlockInversionPillar.json deleted file mode 100644 index fdf9e93d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockInversionPillar.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/BlockInversionPillarEnd.json b/src/main/resources/assets/bloodmagic/blockstates/BlockInversionPillarEnd.json deleted file mode 100644 index 295c172a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockInversionPillarEnd.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/BlockItemRoutingNode.json b/src/main/resources/assets/bloodmagic/blockstates/BlockItemRoutingNode.json deleted file mode 100644 index 9342eeea..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockItemRoutingNode.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/BlockLifeEssence.json b/src/main/resources/assets/bloodmagic/blockstates/BlockLifeEssence.json deleted file mode 100644 index 8d673ba3..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockLifeEssence.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/BlockMasterRoutingNode.json b/src/main/resources/assets/bloodmagic/blockstates/BlockMasterRoutingNode.json deleted file mode 100644 index a10dc2f5..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockMasterRoutingNode.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/BlockMimic.json b/src/main/resources/assets/bloodmagic/blockstates/BlockMimic.json deleted file mode 100644 index ae9c2042..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockMimic.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/BlockOutputRoutingNode.json b/src/main/resources/assets/bloodmagic/blockstates/BlockOutputRoutingNode.json deleted file mode 100644 index 11d0d9cf..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockOutputRoutingNode.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/BlockPath.json b/src/main/resources/assets/bloodmagic/blockstates/BlockPath.json deleted file mode 100644 index 4ebe7070..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockPath.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/BlockPhantom.json b/src/main/resources/assets/bloodmagic/blockstates/BlockPhantom.json deleted file mode 100644 index 7f83de76..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockPhantom.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "normal": { "model": "bloodmagic:BlockPhantom" } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockPillar1.json b/src/main/resources/assets/bloodmagic/blockstates/BlockPillar1.json deleted file mode 100644 index c32dd8ac..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockPillar1.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/BlockPillar2.json b/src/main/resources/assets/bloodmagic/blockstates/BlockPillar2.json deleted file mode 100644 index 9285da20..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockPillar2.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/BlockPillarCap1.json b/src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap1.json deleted file mode 100644 index 01b3ebae..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap1.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/BlockPillarCap2.json b/src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap2.json deleted file mode 100644 index 68d4de9a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap2.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/BlockPillarCap3.json b/src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap3.json deleted file mode 100644 index e373b095..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockPillarCap3.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/BlockRitualController.json b/src/main/resources/assets/bloodmagic/blockstates/BlockRitualController.json deleted file mode 100644 index 784afa96..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockRitualController.json +++ /dev/null @@ -1,22 +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" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockRitualStone.json b/src/main/resources/assets/bloodmagic/blockstates/BlockRitualStone.json deleted file mode 100644 index 9eead647..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockRitualStone.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/BlockSoulForge.json b/src/main/resources/assets/bloodmagic/blockstates/BlockSoulForge.json deleted file mode 100644 index 5abbb4e2..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockSoulForge.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/BlockSpectral.json b/src/main/resources/assets/bloodmagic/blockstates/BlockSpectral.json deleted file mode 100644 index 1d43fa6a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockSpectral.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/BlockStairs1.json b/src/main/resources/assets/bloodmagic/blockstates/BlockStairs1.json deleted file mode 100644 index 8bb70c0c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockStairs1.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/BlockStairs2.json b/src/main/resources/assets/bloodmagic/blockstates/BlockStairs2.json deleted file mode 100644 index e3376cc8..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockStairs2.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/BlockStairs3.json b/src/main/resources/assets/bloodmagic/blockstates/BlockStairs3.json deleted file mode 100644 index 51640cbd..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockStairs3.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/BlockTeleposer.json b/src/main/resources/assets/bloodmagic/blockstates/BlockTeleposer.json deleted file mode 100644 index 2a92da6c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockTeleposer.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/BlockTestSpellBlock.json b/src/main/resources/assets/bloodmagic/blockstates/BlockTestSpellBlock.json deleted file mode 100644 index 8bdc9a94..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockTestSpellBlock.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/BlockWall1.json b/src/main/resources/assets/bloodmagic/blockstates/BlockWall1.json deleted file mode 100644 index b7782a56..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/BlockWall1.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/item/ItemActivationCrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemActivationCrystal.json deleted file mode 100644 index 913aa3f8..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemActivationCrystal.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" - } - }, - "demonic": { - "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/item/ItemAltarMaker.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemAltarMaker.json deleted file mode 100644 index d9853286..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemAltarMaker.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/item/ItemArcaneAshes.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemArcaneAshes.json deleted file mode 100644 index df9edd3c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemArcaneAshes.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/item/ItemBlockDemonCrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemBlockDemonCrystal.json deleted file mode 100644 index 492f59ee..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemBlockDemonCrystal.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "bloodmagic:crystal/Crystal1.obj", - "custom": { "flip-v": true }, - "transform": { - "translation": [ 0, 0, 1] - } - }, - "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" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemBloodShard.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemBloodShard.json deleted file mode 100644 index 4cf72004..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemBloodShard.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/item/ItemBoundAxe.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundAxe.json deleted file mode 100644 index dc27b28a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundAxe.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/item/ItemBoundPickaxe.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundPickaxe.json deleted file mode 100644 index 6acaacca..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundPickaxe.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/item/ItemBoundShovel.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundShovel.json deleted file mode 100644 index adba2311..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundShovel.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/item/ItemBoundSword.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundSword.json deleted file mode 100644 index ae592f33..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemBoundSword.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/item/ItemComponent.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemComponent.json deleted file mode 100644 index eb690f3b..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemComponent.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "reagentwater": { - "textures": { - "layer0": "bloodmagic:items/ReagentWater" - } - }, - "reagentlava": { - "textures": { - "layer0": "bloodmagic:items/ReagentLava" - } - }, - "reagentair": { - "textures": { - "layer0": "bloodmagic:items/ReagentAir" - } - }, - "reagentfastminer": { - "textures": { - "layer0": "bloodmagic:items/ReagentFastMiner" - } - }, - "reagentvoid": { - "textures": { - "layer0": "bloodmagic:items/ReagentVoid" - } - }, - "reagentgrowth": { - "textures": { - "layer0": "bloodmagic:items/ReagentGrowth" - } - }, - "reagentaffinity": { - "textures": { - "layer0": "bloodmagic:items/ReagentAffinity" - } - }, - "reagentsight": { - "textures": { - "layer0": "bloodmagic:items/ReagentSight" - } - }, - "reagentbinding": { - "textures": { - "layer0": "bloodmagic:items/ReagentBinding" - } - }, - "reagentsuppression": { - "textures": { - "layer0": "bloodmagic:items/ReagentSuppression" - } - }, - "frameparts": { - "textures": { - "layer0": "bloodmagic:items/ComponentFrameParts" - } - }, - "reagentbloodlight": { - "textures": { - "layer0": "bloodmagic:items/ReagentBloodLight" - } - }, - "reagentmagnetism": { - "textures": { - "layer0": "bloodmagic:items/ReagentMagnetism" - } - }, - "reagenthaste": { - "textures": { - "layer0": "bloodmagic:items/ReagentHaste" - } - }, - "reagentcompression": { - "textures": { - "layer0": "bloodmagic:items/ReagentCompression" - } - }, - "reagentbridge": { - "textures": { - "layer0": "bloodmagic:items/ReagentBridge" - } - }, - "reagentseverance": { - "textures": { - "layer0": "bloodmagic:items/ReagentSeverance" - } - }, - "reagentteleposition": { - "textures": { - "layer0": "bloodmagic:items/ReagentTeleposition" - } - }, - "reagenttransposition": { - "textures": { - "layer0": "bloodmagic:items/ReagentTransposition" - } - }, - "ironsand": { - "textures": { - "layer0": "bloodmagic:items/IronSand" - } - }, - "goldsand": { - "textures": { - "layer0": "bloodmagic:items/GoldSand" - } - }, - "coalsand": { - "textures": { - "layer0": "bloodmagic:items/CoalSand" - } - }, - "plantoil": { - "textures": { - "layer0": "bloodmagic:items/PlantOil" - } - }, - "sulfur": { - "textures": { - "layer0": "bloodmagic:items/Sulfur" - } - }, - "saltpeter": { - "textures": { - "layer0": "bloodmagic:items/Saltpeter" - } - }, - "neurotoxin": { - "textures": { - "layer0": "bloodmagic:items/NeuroToxin" - } - }, - "antiseptic": { - "textures": { - "layer0": "bloodmagic:items/Antiseptic" - } - }, - "reagentholding": { - "textures": { - "layer0": "bloodmagic:items/ReagentHolding" - } - }, - "mundanelength": { - "textures": { - "layer0": "bloodmagic:items/MundaneLengtheningCatalyst" - } - }, - "mundanepower": { - "textures": { - "layer0": "bloodmagic:items/MundanePowerCatalyst" - } - }, - "reagentclaw": { - "textures": { - "layer0": "bloodmagic:items/ReagentClaw" - } - }, - "reagentbounce": { - "textures": { - "layer0": "bloodmagic:items/ReagentBounce" - } - }, - "reagentfrost": { - "textures": { - "layer0": "bloodmagic:items/ReagentFrost" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemCuttingFluid.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemCuttingFluid.json deleted file mode 100644 index fbd1ac61..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemCuttingFluid.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "basiccuttingfluid": { - "textures": { - "layer0": "bloodmagic:items/BasicCuttingFluid" - } - }, - "explosive": { - "textures": { - "layer0": "bloodmagic:items/ExplosivePowder" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemDaggerOfSacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemDaggerOfSacrifice.json deleted file mode 100644 index 5cae9434..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemDaggerOfSacrifice.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/item/ItemDemonCrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemDemonCrystal.json deleted file mode 100644 index 0d65d0c3..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemDemonCrystal.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "crystaldefault": { - "textures": { - "layer0": "bloodmagic:items/DefaultCrystal" - } - }, - "crystalcorrosive": { - "textures": { - "layer0": "bloodmagic:items/CorrosiveCrystal" - } - }, - "crystalvengeful": { - "textures": { - "layer0": "bloodmagic:items/VengefulCrystal" - } - }, - "crystaldestructive": { - "textures": { - "layer0": "bloodmagic:items/DestructiveCrystal" - } - }, - "crystalsteadfast": { - "textures": { - "layer0": "bloodmagic:items/SteadfastCrystal" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemDemonWillGauge.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemDemonWillGauge.json deleted file mode 100644 index 33dc70e5..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemDemonWillGauge.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/item/ItemExperienceBook.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemExperienceBook.json deleted file mode 100644 index 0441a8e1..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemExperienceBook.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/item/ItemInscriptionTool.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemInscriptionTool.json deleted file mode 100644 index 941bdac9..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemInscriptionTool.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "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/item/ItemLavaCrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemLavaCrystal.json deleted file mode 100644 index 12890a4d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemLavaCrystal.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/item/ItemLivingArmour.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemLivingArmour.json deleted file mode 100644 index a20acc7a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemLivingArmour.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/item/ItemLivingArmourPointsUpgrade.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemLivingArmourPointsUpgrade.json deleted file mode 100644 index 67ac1582..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemLivingArmourPointsUpgrade.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "draftangelus": { - "textures": { - "layer0": "bloodmagic:items/Coagulant" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemMonsterSoul.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemMonsterSoul.json deleted file mode 100644 index bbdebb50..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemMonsterSoul.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "base": { - "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/item/ItemNodeRouter.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemNodeRouter.json deleted file mode 100644 index c9a0de99..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemNodeRouter.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/item/ItemPackSacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemPackSacrifice.json deleted file mode 100644 index 024dc061..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemPackSacrifice.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/item/ItemPackSelfSacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemPackSelfSacrifice.json deleted file mode 100644 index 024dc061..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemPackSelfSacrifice.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/item/ItemPotionFlask.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemPotionFlask.json deleted file mode 100644 index 4af6432c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemPotionFlask.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/PotionFlask_underlay", - "layer1": "bloodmagic:items/PotionFlask_outline", - "layer2": "bloodmagic:items/PotionFlask_overlay" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemRitualDiviner.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemRitualDiviner.json deleted file mode 100644 index e60702e6..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemRitualDiviner.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/item/ItemRitualReader.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemRitualReader.json deleted file mode 100644 index 6178c0a9..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemRitualReader.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/item/ItemRouterFilter.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemRouterFilter.json deleted file mode 100644 index afe3e19d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemRouterFilter.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/item/ItemSacrificialDagger.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSacrificialDagger.json deleted file mode 100644 index da29bad3..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSacrificialDagger.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/item/ItemSanguineBook.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSanguineBook.json deleted file mode 100644 index 3d241ffb..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSanguineBook.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/item/ItemSentientArmour.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientArmour.json deleted file mode 100644 index 92324fbe..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientArmour.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/item/ItemSentientArmourGem.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientArmourGem.json deleted file mode 100644 index 4a0cabfb..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientArmourGem.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/item/ItemSentientAxe.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientAxe.json deleted file mode 100644 index f93f679a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientAxe.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/item/ItemSentientBow.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientBow.json deleted file mode 100644 index 4ae06da9..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientBow.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/item/ItemSentientPickaxe.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientPickaxe.json deleted file mode 100644 index fdf1b224..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientPickaxe.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/item/ItemSentientShovel.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientShovel.json deleted file mode 100644 index fe56d96d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientShovel.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/item/ItemSentientSword.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientSword.json deleted file mode 100644 index 31620620..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSentientSword.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/item/ItemSigilAir.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilAir.json deleted file mode 100644 index 32f44849..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilAir.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/item/ItemSigilBloodLight.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilBloodLight.json deleted file mode 100644 index dc5b4f19..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilBloodLight.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/item/ItemSigilBounce.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilBounce.json deleted file mode 100644 index d4fdbefe..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilBounce.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/item/ItemSigilClaw.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilClaw.json deleted file mode 100644 index 54f6aa1b..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilClaw.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/item/ItemSigilCompression.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilCompression.json deleted file mode 100644 index ad29944e..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilCompression.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/item/ItemSigilDivination.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilDivination.json deleted file mode 100644 index 184354d6..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilDivination.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/item/ItemSigilElementalAffinity.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilElementalAffinity.json deleted file mode 100644 index 313bbfe2..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilElementalAffinity.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/item/ItemSigilEnderSeverance.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilEnderSeverance.json deleted file mode 100644 index 9c73f810..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilEnderSeverance.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/item/ItemSigilFastMiner.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilFastMiner.json deleted file mode 100644 index 2c22c801..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilFastMiner.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/item/ItemSigilFrost.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilFrost.json deleted file mode 100644 index b7dcb443..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilFrost.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/item/ItemSigilGreenGrove.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilGreenGrove.json deleted file mode 100644 index b1bfb321..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilGreenGrove.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/item/ItemSigilHaste.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilHaste.json deleted file mode 100644 index 39b9302a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilHaste.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/item/ItemSigilHolding.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilHolding.json deleted file mode 100644 index cfe4b8ec..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilHolding.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/item/ItemSigilLava.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilLava.json deleted file mode 100644 index fde7dbbc..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilLava.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/item/ItemSigilMagnetism.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilMagnetism.json deleted file mode 100644 index 8a3a3967..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilMagnetism.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/item/ItemSigilPhantomBridge.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilPhantomBridge.json deleted file mode 100644 index e37bf040..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilPhantomBridge.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/item/ItemSigilSeer.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilSeer.json deleted file mode 100644 index 26097e59..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilSeer.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/item/ItemSigilSuppression.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilSuppression.json deleted file mode 100644 index b48d90eb..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilSuppression.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/item/ItemSigilTeleposition.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilTeleposition.json deleted file mode 100644 index 84d1fe93..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilTeleposition.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/item/ItemSigilTransposition.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilTransposition.json deleted file mode 100644 index bb09cc7d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilTransposition.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/item/ItemSigilVoid.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilVoid.json deleted file mode 100644 index 4bc0194f..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilVoid.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/item/ItemSigilWater.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilWater.json deleted file mode 100644 index 9f76d28b..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilWater.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/item/ItemSigilWhirlwind.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilWhirlwind.json deleted file mode 100644 index 6c9faba0..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSigilWhirlwind.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/item/ItemSlate.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSlate.json deleted file mode 100644 index 7f6f59af..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSlate.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/item/ItemSoulGem.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSoulGem.json deleted file mode 100644 index 33d9b6e0..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSoulGem.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/item/ItemSoulSnare.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSoulSnare.json deleted file mode 100644 index e643b138..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSoulSnare.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/item/ItemTelepositionFocus.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemTelepositionFocus.json deleted file mode 100644 index 34f21365..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemTelepositionFocus.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/item/ItemUpgradeTome.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemUpgradeTome.json deleted file mode 100644 index 1562c045..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemUpgradeTome.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/item/ItemUpgradeTrainer.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemUpgradeTrainer.json deleted file mode 100644 index 37735a28..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemUpgradeTrainer.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/gui/SigilHolding.png b/src/main/resources/assets/bloodmagic/gui/SigilHolding.png deleted file mode 100644 index d3468096c56575abdabc6f626e33b5eecdb69185..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6EHJT!L| zG(WT^_MGS=x5C$)&y*VPI2~-Z*e=oWAjLBJyh2CE1Etv1U-enOe|%;=Z(L_pQ+qPK z{;bbeZ?XF(jE^VmWceF+Vp-;&zv(LRTO!q%Y=1t|w@(fZooane?mfdc#vOb2mbyyp zdHwozN5_txI}6n>9F}EJU;sLfiGc%y(R2LXy8Aj^i$2S5h|qcT=FOVviD#4LgxD6` zZO}Wl>CM;WJYepF>eAT%Urj6LsY~Cpd8Qc1@M>4z%^b1MKmYWv-?@K(|E_hDa~4&e zaW0R)x2sZIT-@4RUn$9M{_z~M>fo2V>kMZew^8A8a5-}M^5xla-?#g|>jo-5#9(7* z$Cp*`c}9B+BZHbu!`CWVeSQ6A$va>xKH2miK79BfPp;hO51#pqZDEB#g)WQ{>#yJT zl{w@#>$pwHXaD=06-7mx?jGsr`26{EeB9=!wUh3?gV;9jdEoU@8Clt*|Nhm<$jBVY z+WPCQTE5wAmG{~pKiy;8GW*A`UsC7KpBEIg&w26jV_}Zj?3DYbGUYx`FkpDAw(Zv0 z9P=*^A1eNQ1~QQ6zyc;kAX}i^=am&N|d-e(mM1KH*F1HycIVCsHzst<;dr78NmK7PeRg(O&J>-_@%m4VmO&@eg**pwzr9=iu9wzW zyoD;lmI65#I2ycxLE$qYxN)uVkJ29&eynLFbGY6>^cd{CUH@yNxM1Y8RNv50Jw2Z< zdg?UNMiV9 zCALR{D_rcDSi>TXIZv2_xer{uI@S13LX!+PA29pV4G0K+6lK}^++}{?lSq)Ip00i_ I>zopr0PEYb!~g&Q diff --git a/src/main/resources/assets/bloodmagic/gui/Teleposer.png b/src/main/resources/assets/bloodmagic/gui/Teleposer.png deleted file mode 100644 index 2efcbe9af374b8cd9d5fd027f2e1bf32fa1b86e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1276 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 diff --git a/src/main/resources/assets/bloodmagic/gui/jei/alchemy.png b/src/main/resources/assets/bloodmagic/gui/jei/alchemy.png deleted file mode 100644 index a84a5220c0e23e5dda16abbd80f3004772ffb745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15723 zcmeI3UyKt)9LJ}3AaDlMKp-K;G$jU6x4YYR+wR)-fGc!PtT-&YP zJ=!~iRQwZ-(TI@*HGE`rgA zX>!;3&2PTH-^^#`H{F+gt*86(#ceCw004`-I-|V+I8f687T$%vwq*||(AT0&=YWCy zQ`Vnj7aX_&fcTph?>GBnn*a*(=Ml` zhFx2Q7#GWQz!9x;A`AN_y5q{ks3NMa_DEYOFQEV_Xv)rfDw#HI1ld(h;CjG0s+sXP7lZXSdM3TFT;zH&nI!5v;1*I z+E6Q$RTENgbYnRkvcj$r)67ULo6F_gIj>vK4zs){iY(`0Jst*)V2ts!Dd(BAv8oiL z5+@1`C97pjO;0<~pZFK1ZZ&9RL{s#4Wt#rLTQIWXsuF57Rsicjq7?c zQaWWl6@<=?j^e3uKD1R!t9s5@6Jl{mZNF>LU{p3?1f55L;W@@5#yyFyaldjk;~B;z^Ub(uOIg71$MxpbodDsgl6S0mujZ zi~v=L>fEO=K~5DJSrvQeLK$TE}gt7@g(f&DIB>o!wh;B(>rVm65XswCXSH zsuW=LN~_*jmZn(8lB`&FTST$S10o8udTZ0FD$6phemm!epcLOGZ=NGJ0@I}ODupVJ zY97SU6J}1%!ga&wgv_P#OHpUb@bDql`YlLm|H4KX^3L1ahPhSMKih_eH`IT(4YgCO zjL7L>s7Bbz0j_k+ZRbk+IlHnd)mmSPA?wFULRE}Tlw7PHKE&4b)iRgH_gmGN94n3w ziX8f|y!F25$BYr{f3LzHn#uYtU z9wz&v8oGxK>pt-a{;~-7G*k{WRoXmdWoff)4`#(GEcK$tKJ>)NRv$U*3bcBU-N{C6 zNp~_T7Kek@;X=iVFimHYqMLAIwW}VL-?x#YN_Wc_}Uo2-&2#$b2v_#f1SOn-mwB59Xz~ zFd$@;;v)0Gyc8D(gltk=WImXe;=+KCO^S=m2lG-~7!a~aagq68UWy9?LN+NbG9S!K zabZBnCJ|R#?Ili_MsIHB&?}nzFPu7qUhi}&oxL#tCLRQ!@FD=$Z=vs>0T|-|xHJfW zv>$*K`rA9sYy_a?&#vgYc>cRzet6=|)6QjUzaH8aU-8YMsogjCZaK(|_n)7fzj@=a zT+80Tk#|0Ej862o+zZxPub<8Xc;l5TC%$Ko%{=$}uOD0pemZGfxpsQcarmCh>yt-w z%aabfrcPd1H2L|G(3jhHc^8~t4=yd3KJ(e}8#4FM6Jbn4sfe~lbHvE<^)!oU|hW)6U}Ed@}T zePQ3Z^aF*Z6Bk$S>;15$9D$p@+;Q^an(2dE?(@%o_eg6``}@rE*LUyP+rIniAC9Lh zi>_aGsi*McOJB9Vdf>`qHek>#Q#Lwi~w{pngXG k>yVdE-3`F4TdiQzGn=k$dTRY4R4$-vLwEF}^@Dr<2H$|P@&Et; diff --git a/src/main/resources/assets/bloodmagic/gui/jei/alchemyTable.png b/src/main/resources/assets/bloodmagic/gui/jei/alchemyTable.png deleted file mode 100644 index b4e27d580be4eb4edd33e14d400faeb733a754d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5m^k>u>ph`Yf~eC0R`DhJbhi+AFwhB3hHT15_Du>V0QL&aSW-r_4bZqUXz1J!$bGO z6Fv5HaPu9~eW0MTuD3;&+im> zUN6qPeQh5LOM-vy?R|g#S@h-0Zx;P6RKUr=!JxpSU&#=yC*(5ySd^p2*&duLgE847?81FHIENr-bNz;MB zFGGS&uwha-gAzk)JW~gQ$UnITjsy3*b}C;m;MuJ9zUQp9q}kmB)&LW2MwSH$VGKK1 zEGF-q&s*_B$6?l=2*x?}pMIa_S7kf!q}_=*;gj=1MuVS;ZTsFAbGu8c8z-N<_`O!= z@6GnYqV$IaHB})q|1IU!V}$#dIt)IV03amIInp4oC$hr8>sjc{?}nYSL6^ O00K`}KbLh*2~7Y?w7}K? diff --git a/src/main/resources/assets/bloodmagic/gui/jei/altar.png b/src/main/resources/assets/bloodmagic/gui/jei/altar.png deleted file mode 100644 index 50607365f417edb968949fcba0cb06a7738bc008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368 zcmdT_`#;nF9{+5_I7#cGoQXgv~de^-oQZ*Uxeq9JYHbSNe z>fZD|dq#H#0tNP3#Z{+W1pru&H~Lg?+Qjk{2WvWP46O9sh}v@dwE4bs&-x9{)W0fX zL*eoJ_J-H?{E@JMXz^C*t4-js1BXz-e>qOGNh?hD@g9brso!V&XRgQsC%k#1x7opN z{oDL(6QdWjj0h7q*`lmSI64(Buk>S4csA31<5JsiE=l2qp?bS~dc%#Kkp! zyQuQwq#cIA3f@f_%C*5(vA-$2_Wk>9aQNWh;K5Zv0*mr~Y)N9mrH^>N;CFXVkz-y~ zSF>(#(m68MjCC}+v&=5;vZXfZ0Y2-fD|6|?52?d6GZBxD5IQ_8TfgD?beA^i(26{c z;=QxI2u1eG6pYp8&Fh{fK3Ws$i@1)H<$z`cz}V6laPv(7 zEw;QWF@xS2-e{&x>Tz&(zCdMU(1zx2$Ws+?W&dLr-|oB$WmWi&cdGVHEN+xU*@+Sw^3A0c&pKXeJgmrZAY zAFnwW9d>XCqu*nNrp4nRi!I3tG!roZ(k@^^LV`nfDhX3R4=z36$_GHHF6Y)%L5t9E z#E^G^Ur|pO+Gs>!GGpGLNW;Td5U$0=d&-!t1c_v{*^uanM4Ay@V%PfInLFTcOr}U$ z-aRN{C{__C9#cD_x-aPmxZ{r@k;&7oWpte?x(vnm4$Z>LqDWnLv6agu0Z+Ntz0d|dDb%_tN%D#7R zW3n*-uktMkVqv2E@zSa){M97$KEweVOmi_RdrhU34-#|@d%uaPx6ccqe%7{BNqTy@ zj#daXFA|97;b`oX#Ej9%yR++eI&_>}2y&$fPYNn4=CzVSb#`g*{u{8e&c%*u`lwo> zYQCIap+F*$FU1EG!m6qv^Na<8nt_+6&byV$R}P911VyxPiFzN;UzC(D45|hPb$#9r zIQH^6C1TOwhK|@EWz*JX=+EUiqW@iU3@8Vg?nW50k@naKBs!7>hMV=Sprq>826k%M zW?ng>zh>)1(U~&K{u-cqM3S#XuDFH(bPVc0s0`EV8BPS30*K%&US9T_W=adeZG}4Y zcTJ_JEWQVZk++KYBHrX9f66ZUw3v{N5!;gXsC&Omnz5juT!)h@tQ}TUY7y}JlPE-Pc9xmDiclW+H#h(+R?o;SCeM?|CLS7 z!!RrYr^AlQCngeV%#FnB-K`%-$A}m=e`Avaqg0Uv;8J*mlNdim6}~04u45)z_JGl85=3df3HOT#BGF5N2`ZU(xT4V z$?{E|CtksPJlwBGThW+sIQ)TOC0!@+b>rN6P;^29(E@F4eGH4LnP0NvaI)L#61lid z(F!ZlZPxMxw!Z{i92~_JH9rt84J7|+T1 zDUghsRDAC+bPv970Zb;&)0`;XVYl*yyk_X`Eqn4`IXVf|I5H&If?^7TwnfG})EAZC zW&Y&Tf_Tn-D_q_lr7f+%wfLxfSdfJn=5*gBVBrzv&Z3vuZ(efSc~GYiEA9E>_x($S(B{pX$)sQ-KB!%& zELlzGY;eS|iBbAvtu}!mNwaa->N`62%eg1BEtTJrxP&?X47@aey~@vZiC#!(aF!AGitLo1w<+oYH*??W=D^un^u)fo;&t|E+ zU_fLgv2Now7TlxNBxk6f#tF$6-D5UK4}H&m`h!u&eNAKhPIZ&9?{lTXDPFh@Ui2v4 zmmlb{po?E^iO?(D|2t#*;S=NKr!N-!W?aMC;&j;}c6xEKk#I4Upb$~5fM6if_&w_U vbmD!pqI9~a99(uHuWM`-fkJMQRnT+uWB^$_nf{^*+1(OLfmRMA-8 diff --git a/src/main/resources/assets/bloodmagic/gui/jei/binding.png b/src/main/resources/assets/bloodmagic/gui/jei/binding.png deleted file mode 100644 index 390049dab957c30005694935c91a5f0d4d4375f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5m^k>u>ph`Yf~eC0R`DhJbhi+A23VuTS_dO+GxhW!1U46#WAGf*4w)WI}aNOI0S0$ zP?3-6;Ma3W^*Mj)s3J=dhuIC6&vBewpCvPIF8OwkJO8sye3`=SZBwsBmA<-@TEudn z{WI5E)AqA#<@y*{7z7v;u1X)+q_bRp@3qpeGg$viG+bwx|Im;-hEY#c(9ZV6A2tQ1 z2^I`W3@4d^3>zThxQ{Y#zRQnpmXtdTIZO%+W(+^JYaf`nu(u=5Yh|1Kr#yzcADrK5 zJDC5O@PjvDKOci6P-npzlS>EOT)yX@oKV2Lf%8BkZ^D10{)b8l!VU6F1=kly1Qf7> zo%7(9IfMI$%>O&}*d4j9<}){GGbk`L0DaEDK_v$DOoF>;)JW=u0E$TlbJR^mJT_lm TvC|ir9~eAc{an^LB{Ts5mDHpS diff --git a/src/main/resources/assets/bloodmagic/gui/jei/soulForge.png b/src/main/resources/assets/bloodmagic/gui/jei/soulForge.png deleted file mode 100644 index d19cf8e7b445394ed0600ac60fcb8d74409a906a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16429 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 eeK!>|!2bXtv*RgMk*n(V9kbo z1wR3W1wusvqJoG}7HOKMnZ$OS`SATn3glmL_flmL_flmL_flmL_flmL_flmNVmCN?%U#vI>$`_0%3f@??5#r@AW zE*)^|%Lf1~=wQr$=thI@_rJJ&yv@zc*)yQxIPePZNzNyKk?(adImy{e`^;B;Vx?X> z;PUO82uBblil8F->!{6pZ?%w)Am}RsPjd9b_k_KeR=o;9*o$cdK9BYe`Q+2j{@)s4 zt;Lh>3zOga>cNF$K}8}R2O*&9xg>p!GKO}X(uq=xwJ2k#`yR$xjI}gtKH+JMi$X*Y8lD_6jknR4w@6$~ZdQrmYoT`)SgYUTqEfbFLt zYuB$3rHY#Gk)#^wX1FJPO|xF1mnc%D`TMwwe|SO-2rb+)0T1ojbQ!SNY)}t;q|DT? z(z-%7&JsTCbTgeuNj>mcY&HOBM+wzR1%RKNkX<*TSZ1mX${1p$iIpZ%hQ2WfAu!hB zNrzNvQl+W-E@3Z0jBNaE-I`c9r&a@=o^%E`zUT7fxWk-ZA<>$mR_+ zk2rHf!Wq1-6SFDXN!Ah@fte^M>wv-_Wm<^QG%2b-*X3&2v1L0e|v@BpBw-g zRg2x)JLv)7IfA~)^uE{bVFBp~lo@6v9f8j8Euf5n_Hfs4nPB!cAWju`Ru=j5;Q5&L zN39!?rdzDy@gs*st|8D4AF;qL88dd=a3Gi1LQ7*v3_I877S2I4U#Jo9Nqnl;=`gSrKB1j3m8hE1_at6at#YQV@9B}q8GVlEcx?R z#26iWtnKU=@L%lX6Hfq)o&;;UMTdw60jqfYN{0pkJ8n2=iW+3}?hx^Z6Ac(p#F^D8 zAXcwmwZ7*940gG&ZZa-`qE3w3-1FnHdzE)ra)K`&88i7u=FQ0YhNKw(#oDPh2eR4D zC|nb;H`kcRhNaVv063e>6?+fZ2F~(?6mSoC47{6PPjY#feC)Rz5P-Yq0&W*FnMEV? zzL#q^$9W<3hUajlKQ?(10INECYG|0s&^Mu@+r_eqU^jor=s4-67Whz4mjVBJ8hlyX z`uf3CtJGF+$`W|h0AYM_1+Ttf>BYRN7&cO)*IC&=p*h+HwGGB{00000NkvXXu0mjf Dh7<^_ diff --git a/src/main/resources/assets/bloodmagic/models/armor/sacrificeArmour_layer_1.png b/src/main/resources/assets/bloodmagic/models/armor/sacrificeArmour_layer_1.png deleted file mode 100644 index db260f2fde1a3707587c42f675de9e11910c57a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmV;}0w?{6P)@^zd?Z6SAB7#n_KktRi>Uu>Q_SKsKK?gd00Sw{6HDXU0 z05HE|6KvG~%fFPm6Ym9_4YI4bQh%4%fL^a6pcwY^D>f7A21|JGvq8`SLwL%@Itw0x zjXD#nIRHkT-`9wmH()&0F6L%!LSdbMX=9H+R@Z=DMH5@UN7wTWf3qH7;9eJjR-N2} zUDjSb_lR4Gwu;VoGCoyZ1K!?0EA}5$$t~D4ceD`i9wSTPCnI_lO&F+LA3nv_^&eg? z@?zS*xvo)DS;-dwIC^Y}BbT34HA*Wkg4XaP5z`=JWg$JYDe%krhr%l5pXpV^z)%;> z9W9LXSpbB>I?vKGT(}W|X?QiYj9*h($}i&q+KwL}(5hEG#VR%+6xNI4frx2f4Nn4a zXQ-S0E6)YM-3O-`OJ*QFvuW1ctWCr;$Sv4_AD^c3HD6#I@M$VQX|7Igf^M;LjmTJ8 zq6w4iyU*oOQkr*jb3E2APF!pwIk;Sw0)4ledH-~J+Z?XBtMHFi+l>-;>`dx)*`BGM zCJ_qjq~9FE&{V#yIjl7ZE*<{#M^(IL-vX{MU|S)no+c4Zm|Tl50x)<}XDpeiy7;Q! z15!Or0@zlF8#U2{3BX97^~-44)vv*=HDss6*W|5lJk~CDa?kIyf)uIk&&Qhp0000< KMNUMnLSTYwpFCOs diff --git a/src/main/resources/assets/bloodmagic/models/armor/selfSacrificeArmour_layer_1.png b/src/main/resources/assets/bloodmagic/models/armor/selfSacrificeArmour_layer_1.png deleted file mode 100644 index 98048cbf1b7b8290cd5faad4e21ba8267f4cd432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1324 zcmV+{1=IS8P)B$e1V;b>1i48> zK~!ko<(Xe>Q*{)_KfmqvQuc>#b2mdaRx#Bv#fg$MqAVtK382#v!@?eX;6Y=3ATfqS z7PA<#7!2tXCNPsd?7@dEA%+Ibc%X`D2uULf(*Vl~+JOTt`*WG2qwVLk(J^n;_v? zK3|_G<=>Q0FFHyDXCO>_pOt7BGK42lfvO6jZ|-_p|`^W zfYoLp;MemXfPQB^0lyBA0z~8PIzIdG8~|UQ+>YDjo8@D7X!#Go!+>b(bP&8cil^to ztiWGxzX11pp2o zX?(!IC*lm;H<$n`;McJ`G{&y$Kp915mC5NaQJ~1I0>tm-eu?E|;C^R48+X>>I(R3g z1UkN`=GvKogx_Niz(N_=AgaDAtI^CVe}^K3gk<;nTMs3!#}vZr@`;Ay@ zyWfJ_2V;j5M66Zq~%Mc$V{M(wvrk(-Jt7@pDziW!bYvIC$XA4_L= zN~gBilK&;Jpx{kFWQO3~vG{(OPl05G_o(VET@^k|5h9`zz)1V^>I@SUQpOCm5zu5| z%C$}5LTZaGoWDC3d!~6xWHA7cX_8oE;;*3+B+R&oigFoC$Z-*+Tq;sS5~Agw3MPXx@9~dJaP0LCPkJ@1r3#h-j)>q;MGw| zDpmG2pOW3)R)SYYY2Wi52aay0dP5D@&J1As8J@D1@a#*a0GZkIG-6q2Kv&ZmnJjkN zIvt4s_cotO%;b!K(?HdH3WuHAU!*iY<5uZF)AT`v$SvELd$ZEnwUO2;RPz z5=^FcPBS1$0m@`0Xm5E2pL-}4V0@pr7t0u7cWC?>2ovz@gjN*F^=nH6z))aPs*(F* zDca&iYlQlp^;B6^e4bzejMZB{;M^e>>s~E2f)~b{HMD+L(;7y{!t%APRb06+E�c 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 M07*qoM6N<$f~-fc00000 diff --git a/src/main/resources/assets/bloodmagic/models/armor/sentientArmour_destructive_layer_2.png b/src/main/resources/assets/bloodmagic/models/armor/sentientArmour_destructive_layer_2.png deleted file mode 100644 index 4228a2ef00971a3823a13c8150562dcf6619e77d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2A9M5G z%jhA=-42&4W=Jj_}{DR+FyS^wuen3_NF!d$I{!vTWb(7AJ&KcJ5O#C>T z|EB{}A45@-h$Rwe42Ka*B=GPfkAN2>$ZsCQGm|m==DXhm%kwz!``^N{EC4`bI80t7 zcYb$ACuu(wdAqs_a04*9sM8nO;w3cE-BF^qWuBHMd=t2h2@>=y`tn$Usq9KK_{3 zb55LmlQ0z>zd~4YGg!`9F6IHn<_DzaR%ogMOV?l-23Xf*T}^^!7|<*SZeAUlsz9G# zh-Mf(eZ+eNc5L2M6tKqb9?$^>mTCLTiq7VuwCyO%u{rm1EV@F+{v2Dv%EbnOY zE*2K@*7qoY6@xIfG+MrJD`I0Z*=TNYK+@GD&Rw`v5kq&a`#LPc04GW?^)w=<&s-P7 zovuy&?TvTP)!hvM7>h=6&)Tn+RIo<@0MLAMFJ>;E2Sw9h#bBNaG*y9-PN8GvDokA* zsW?s}lL5^zF!gjhTUx?0Z^u|k_VdQ5F5J$R;Yz(=vch;7EE0_ z4_!^dG7RWy608`67+!?&v+si81>2?j7MNSpx7ucCt^NGP-lZPpSf&9k7=o#%!HE(c ze{7FOX{;DTfaQ_RSg=f^?2UZVlBa;W#cjAYIRTnsFn%rqh8OY_kh+$D)VLVwJGO80 zG(7v_5pq5?Rl%|e8Ebyz4PB?6+)LU@#pzrHGH7}=r8(^JnCZ(G@}i7o7{p^76--?m zDHw&^Ogp!}g^;(J+y+ar?+*ZAOSHh|OO+Wqg(hpkt=$T6Of)toFMv|wo>8p$ZE$%< z6ObGKD+R#0qO z^X1$OKNA2B9vv+BazFXO4}Ir6)Bge@!$au1?JI~34;8&g-RNvH4}j6}nUcv#v9$Bh z;eN7_+Q*9quu_5P)T7VHg%3 z+Vv~S{qj4vKMF-nA~HOL$nX#VATm6JZCkdId;7L6TXE=cKk0MAn3MavlNh(6+P+s{n0otR0RLa1rRUH@^nflZLxZ%mr z)yaiW#BnqX-9o6|W?zyx0)k;$NUA!5B8zZ?09lUV^H6G9TOE_+!vtsqMHa0sb{xOJuV zSWZ_2b-JRg9- zGq5sQ=(-Mpw>@LWgItzjyb5v8x9=hD{$*8-GM*@q8}ps>?|49NF-!}`Uw)Oa3;_49 zzY~9b{#i)%JdV90!#uMOn}7Z%@H~qLH+~H#PM!8uhciF7?e4A1s;dBpVE}|>B2C4c zooSktx4?#PZ^T`RIAXK2Xl!UeY<3n(QbVwgM|R{n%uJjI%ho{PDb$DRv7)ydD|)-p z*wBCt^IqYezhZV4tv4^j1^`APUj2JOCX+!bl>q>xQkCc5ZUx8_Z=t8X1>t%DH+9!z z=f3?2Ni^yt9u!6Au>Y11>vr47g{VsbcT^RC{{cI^st$dJT(bZG002ovPDHLkV1g(n B)x`h+ diff --git a/src/main/resources/assets/bloodmagic/models/armor/sentientArmour_layer_1.png b/src/main/resources/assets/bloodmagic/models/armor/sentientArmour_layer_1.png deleted file mode 100644 index 79a2b1db59f118b331dfedc06793fb1972817333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2392 zcmV-e38(gnP) z0B=qzN%jB$010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~k#HDJjHFNp%1K2<1sc zK~!ko)meLNQ`Z^)-8gpa_&VU2U>-@Z6B6-k>#(#82rFe1)qv1Ost{dUt>Uq1Qt4Wu zNn>MWRimyHsTA5W2x&D?%R_6TIE%CuF~U-^@ru<@N8%C1ahwE)7-zZHvEv)(?2qen zxV|`X0^^T-|J-xF@7#0G_dDO~oXa5vWzWtf01%TT==dxEKvW!rMymw?-0Ssmn8K7c znZa7U0b0EwfoIOO6LYSesK<`QpK<`iBndG|0su&nFr-NM0lvRQ2bAy6S?~nOu@xn}uWtY7^*0mxsTO$5`8TGpQhBB9kz7DOEgSsIIS_?G zX!QoxR`QKAtS}cWM1H}1@L5@Cqk&Ku#EhaP5c_%{3WM_acw5O=wj*NV+^J~$ri~ox z>dCh94RE{Nq_#iEfZ4uj<0D&Hx)cc`=xt|tK3RMEQ#Keac?b`M002gN9!ORgz3n&H zn2EO4bF0l706320)I0!a92msyfdK%(w(?~VKx|mf=l(Vq06?E@fq1VM znX_`BGn+7Np&iD#bHR<8(09HW05EgS3S<^cN2t3S#7Gbg3J~x0B2A}7i~5Pkx)zY`j}GN z$~PqJUMLj0?*;&hTW=6$zpAdD&@q&s49IZ-pm{#&;xGs9Z)?!_)(4!mXfcV!t?|s# zCGg*Jb2+vmV$Lsw*w+Io5@z**vQALe5)<)tC{w}L=~Xb9su}nxw)}`qRJVd5NH5m5v7F!bMk{{stFDqI!c{bcV_*;oKg2!K=r)Bq)0 za57+wW=o-l<`S0N8FKwC>2oo-a=@ED$ zWHejgas4M@AvVWyLP6ltwct1onlz0JN^Ari$6+)DICO5y{KXLb-7+B7S@>z$)A-^} zKdg_d6xL)Ipvf>ySoxtO1x{ELm{p{4X-xTK{Zu6QyJ51Kq@L;{XB`r7n5LGT3te4 zZQe$+1v=AoM1=t~IGr#Vc`S1*#b_)BS8E%Dkcjo=GrWEf!1FNDcD zmmR%zrs)ZCb?|;D3mA`-Ri7rqz!anDkzSA(cuT_K2JiR~>*_$W>pGe){~JD^7X`%& zAVi}$dZHS+x%p^tIuk%pR;=`U$<{NT{E;q2$GbPA)Zla?Dhy!u(o$&k2IQBn2E8Aw z{qpz&?=-hug3sqgiK7%Yn+-WOJ4zg-@cF!GZn=bmhYq0f{rA{=)b}3tC7W|RP@eg^0ViutqxQ?= zkRoA-eLYP1Gha8bpgMTR2Y;Ij7T$p4hd;$k({#M?`YTxVQU!WA9rk^E06KjJg5GxQ zd*|H*z-!N*LnIP`b&-Sd_r3Ejg5LHqDdu6}D7thS6+c!SVCMRgfZK z1{8GxAsj|Pl5k@v%+guk&=5kBgh*rvvEi_M^%g%qQy<^|yWg{FHRx?;rMOz25`gBG zOX&1?FwbUV&n*?30RTr&R0BYQ3;=e#x)lKMkEU}BWts`DwR{I5B;wh!l`!WQ!ZLp` zo-JF6#-@vMq%V1r1xor}YvXxnbQu7EPB8@E)hqBef1BW1G^zu@KmTT&(*Vb+K zWm+vX8S+h)T0SlS>&n&wW$^-|L}Y=f)8oO8SGPh4i7**?HijzR>G5Do#b)^16Eqv9X~neOh9 zj}GEDfBXYGhm0pr2>?|_xy!}&Vyq~62FYYp@nU;1np-a6`ppgqA(1Hv040u6ISw2- z#4L#hItma4ObCf6d%6Ug359-wFV@ z>^vp^a?3B2uh#s%sQz;`8{hcVv2o?&R)VyWqb5iFGw5xHIlmA=Z#%2usoyH=@L#_2 z0#ju7n{PAzFW%b8Vn(OOgCiduWU?d2Pq0)+fuVCyfGAHLgC_e-bwuWr=XzRJ()^w5 z;&QCZlVm5xH}=Sp__IHKFlO;Yf3T>Zl)k8`d!#z0V)gQI0r($ePG*E|{ku>A0000< KMNUMnLSTaKt!#e) diff --git a/src/main/resources/assets/bloodmagic/models/armor/sentientArmour_layer_2.png b/src/main/resources/assets/bloodmagic/models/armor/sentientArmour_layer_2.png deleted file mode 100644 index 184ad5c66d58c5da43d74711454f217a9c7cdf0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1824 zcmV+*2jBRKP) z0B=qzN%jB$010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~k#C3>Dx%IYDh(UVTAI;*qaWXH zdK-+*r+zNDIh(0Hz*hQV+#csxIdl(mBA!WD{>D)gNu`yNO^p1YaP4 zGOHE7KmaeVUJV0hhP(3!_TKQ}gO^?bYcOEv#~(rv1OPyp)k-#^obRw#llEh-V zDF8hat2L3W^cIMkeVQ_?ok z0@48_)u=cwAAoh2ZIeN>dH{gQXqE{V4F>@L=O;M<00JM)dL-N)H{RdAO;ZcUT*vc1 zVp1RQ)32%8?Qv(-wm4P_rq+C_#8x#fA28H^P4>RKr8T2jZrLpNIqe;tL{pyLD@03D z4d!x|Gx>l_^L1uhC8FUV1U?EO76U7p%!fmu83r_~hknF5qTwL;k%ef6!R{9M5m>u) zNk+iR98S@DO}nHxX1>M3DG!2&d0o$V)@d%y}9@EC#*Nj5r^G>%_@%X}DS<)OSaJM~%Y) z0PuP|SXBQ+RtuI{007wTn~H&pXF<_4Sffd01<`O2vB)s&Gaf_V`7?RPX(SS$83u7a zl2e?QYFJBydk(jeF`~fIwyXdI`>&H1n$^SSy#SUgMm)x&V#+l1T{sIq9D)#wfe(kk z8ci@-C!+V%A7Bhz%1hUcYHoJjtdxf8Q}5HKPLWxT5RXA`vLMb!pf{SaWpk6v(paMj zI@W+>LVysD8@DylGe<0@!|LGNi77z3xWfZ@Ra%w-jbgod(eP`SRPvYM

AaB4_K0x53G7U+co|cAOCr)OJvro-@L^d}Ok84_( zbPUTCBOLI9F>o08`!CIncbsy=?Qs))+$m!&UO5jsxNy})Ogcdr0-7vL7P?PWBMmCIq3(v?@v;?fRmjlZ9pDzF+ zNf~RAf*_4DB6pB|OQC&bU!estgImwiE9yruY1X0%OR;>X5 z?Argis!zH>LZ&1XxKQ^EI!nc*q>|$+OC}z$e)C33y7_gh)*u)T!PVUbS9ccxz}4M_ z#)g%Iw>LJd#DPQ2q)!ZEV(u?ZVx$)3_M|iy4GzJ;nb7JF;EdmoA{_%t&*6ukzt5OB ziSuO_B9o@iOp0DwJgd@dO+1^@I4$r|7)#3$2@RpWqm$A~PNbHk6e^c~v0MoZ7xd1N zDzR0mEI`QvvM@CYx3OgMF}c)RU*8~if+`D0B!Hr#w08o^Z18piaLbb+Wj3hH)bnMgu@L}ZpI%3N0v`?$R>xVa2>SX|*;!BTfXvDLABxHcl-g@Zww8+zXz%Exe1QPT z0GBUbhH~pfO)nhbqcE`gv>yMC0HBNlW4IHfq+uq)N0YA8CpA6r^2N(wVD(f!VXE3% z*rTSq1=*U6N`Bq;4R&tdp-ELoNKn4qyP#1}|>aT7{0!S29&>)!-zvcO=rfTkeRey+c+YVC!!fd2rl$)Q*OkmjBM O00002cA``cbgH7YuIF9Z3we#)| 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 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 611688cfa69715032ff4ac3bafa0b82b29df0289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmV--0*L(|iwFP!000000Ik^HZ__Xk2k?u}Y15)HUJ&p73;3}Iv`54%6Vj0OIC-rp z7HM21W*`v%I|;;Xmo>gG3`XD2Bj0Q{`d|=eb znKE#uDZ_x#pveHE1QUk_uIH3dfMLLBz))Y4RI_9hU^HN;&n49(83h;(m^gCaOjAYy zh5@6&wK5=&WMU7cJd%lH0`xFt6kzy>;gKFnYh{AbfQdbn^4vFb;_4<8lz*__!WljK zu?X!Si}S_eXFvJs*yKxkvYWi{b@$~rwjuo?n_!rG7OsG zZ>X_6DHHe338MhRfQkJ{nG7%rFbtaE_x4zxl!@0^4)i%?7%;Ji(pr*Xz{Gt`fPJM* ztXaw<89r(Xnwa*E=W9B7Q+mI8XVz}{*51x&x;3Q@!FG=diaE{S*M4j3?omQP(_2$J zQ-v;*uWXw|Uzm-h(~Ya_vNj*X`JWF4arx4h?NYjQn|;vZeb86$%ia9b{d{S*uDSmG z=wc)#*LF3UaS&3}zTLm`6=kn?G0zT5H`U5j>+7by{U?IY9uoXq4vyet4~%QK+P2@; RO_!xR`Cnl_2B-fK003V^G`Ro( 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 2962206b74ba204604c89ee07357d2de296807ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1973 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 B%*+4) diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/AirRitualStone.png b/src/main/resources/assets/bloodmagic/textures/blocks/AirRitualStone.png deleted file mode 100644 index 7dfa22963dd9a26c6a440287f8b52ac90e58de99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1621 zcmbVMX;2eq7>)=XAgHLRgE-_erwj-MRPcb$zB&h76Jw`g95u##eeui3m>vuRQw#7 zUZi(vfX$v>MuY6K3?o@qNTL>gauSs2#aIFdUV43R^_51&<|Emq8c zYlpSim5Og;7#9Y^9*;-pkq9Ze07g(0g+*dmEEcd90(YsCA-n>oJ2t?812;+AU5uS_ zLViZVOqDPyKI`f0D>z(w{TpJZdpJ;R$Y3wwf)Swzb~ya^8nSjX2Jo*NZ?$$COI-jq z05?@alWab$u>mj}yLSuu4Owrnk7+xb6ru>H$Px!|GCEwvXHSF{y9E;?gc6WeiGY-# z3V{VkfdG|=WCE+1B&-spOsSBV13YiTBT^AA)u0NIQYJ@`G-)a#6QgQ{M6N}(YOO{Q z!0McChH#P~plxThhq3Z^VlfR32!^7K6jcmo4^)ZjQ;7HE?^gL`Up7L=AqdxX*PY|&*21>>2S5tdo9k;;p|G`JtNzT z?-l1&cct1V?U@0^bL9!~4Zzemw&lW@-VdKgo>)3%K~_lHCPSFb*t|Zvu3fjiwypa9 zmB$ril)cG%4;|dG_}tCGfdOT8f2mMsNHWc@>)U3THab5TSEt-~JQfaH)M%VBft$rE z-7#%-YV*S0h^4+`>Tg0@r*f(epSEB-&sR$I3dJRTS6kZUj-HL_fEA>m;`*sxPF07d+qdpj5b0S-scSAc|0DAGqw>u=?Fp$%4@lP!+SV)UzJwF`{_wyetNBPbH_6Nk%b9VUGk>~e~-UA zukgobw;w#}Ey)`HIHi{U&aw9ZXL3~6awui_+85UzT~ggIkJz)dqGC|&YjSKd9h{sV z*YR!Ks$Ibw4Vix=Zs0|aDSY|Tgib&rrejGRnKj$OxR!DUl3GSH?Q%| zi7DlO(c%*A>iUfK_4r3;Z$0gJnin}x!@ZSKrK}#&yK9iamWhw;u8&iys6&U2-`!@~ zo?mh9>Zy{P-DA3EjjY8bu>}$nFAPtd>09FP{Pv`)f8fhCJG-NAdGby)7bLwna~m+D zBUX`ZQQ_&eM&XA24F_kgDNjBelU(+*JGJHW&x)^BUT^YEy*gXcZ=CyTUCb6wj%vK& z!39koRQDd*N*6r z^EeSnCo{S~5pG_waz&(`yz{=dZR5tpHK7l)mi?`$H%DPlk8u-rQu9_Ok+`x e8t-cfir_$-t+qo)60Z1v^t!YRyeW0T@_ztJpJOrr diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/AltarCapacityRune.png b/src/main/resources/assets/bloodmagic/textures/blocks/AltarCapacityRune.png deleted file mode 100644 index 03d2effbe4af4e85895d6961a29e572762b45fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1670 zcmbVNYfuwc7>%(4qF8khDL8fsXc0+vHxH5xL>jVyu>>##Nwo-@%?(7{Y}{-h0d0MC zL`92qM9_+YmRjwo6=f<~tyN+00izVDTG5Wh#}KPjTL!J#je_kD#~3N0G`@Rn*gMxh&-SN zgxS5Q6~ys)!xvc%M%JiHQIa$zBD^*t7iH(rJYHP9%TAC5fQ3vT&uUW%?jJcWfUIVf zAWNo0baoBMx6UkPKt^$@fh;Z{F|#0k1{CK~as(7$3CKk)v^kV6mEZ-hlAC+CVFC2Q zge_1BUOHver9&E;0gy~26OxD+h2)qBl}RxajfTVsDuGc17GpvbRZ8VbGzJ=c1e_XU zwkY*@(x4W%QVH@|)~tNvu~^7i2pw)4OSptKNB9r}4jd$7 zwX;^*26-6?6YXSG0?yNySD@@V-78|7V=z!$$Y2*?hfxs%QqZmJ_P1s_huolA?J-Ujj?h`Ar|5^>7;;-)#54vcOo)d%}Oy!C;(}Z z2uTSh7n*?-2r&sF6Ix6pVUZ|g3c18I#Pd45S|-&^XxdH<*gd7nJ z;?4gzbTH=>?5&gk)XmTqSB&22t1jRculfksxaMKFE-^=r4&d?ld$hRP;JOl_*Ubzh zf@`i{+X@OTEnA&v{U@q;_*!RY;_N_OM(6IduArVL zrF#yQ{y1{QR$_mL;*@Sojx=N=Xmw_vJz%Vy-Kj7IR@L8C#Dq-I;{+7LDQv#X8g5l?rwjU>OojJ=_u6@k??&(<|pr_>vw zE;oj2FP=FQWvaQI>?2(Yt>jq(#;;H5sEcetqPwo;eOOtauMazsyA)vSZyr8ZL9i=N z5(u$76P^?_ciz0>lGytC%7ohVFZI{8o6O?cqndh6Vg&!G?T;dl7xwISh`wG%#@Dt5I)f2>bUvAN>}8 z%a%{J)ok-E+2wIh_K(CXf$dnzME_5JZ61id-yTpgpr-m-x0u`aVUM0Yz7l?FnD2VB zp!~0XSzMh5DR=(DEA!wThsp-h>i^DK)#leD&Iy>XHc{=jEO>a#*r;vo{XJ=_?zz(g z*X)?ryLoSI-#u0tRB%W8+N7!sKehMl)Iar zdOR(yHV7)f>p2?X$Die{S&QSk4q`-mU)7YQ7Nbw&rKgs}*?h!jWZ8RF zKjfZEL4sF)H|H`_N>=%#oU=6S(nf5C#-$9mHqF=>9o9rt?fRxG*4LVQW8nQI&ChDX d#y=ks%!^u9G<^ZZGkO0E+Qd|RZ$j?!e*pi~c>n+a diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/BetterCapacityRune.png b/src/main/resources/assets/bloodmagic/textures/blocks/BetterCapacityRune.png deleted file mode 100644 index 29a2335e3c6c0ea9442e99b196a1eca9c9e730df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3510 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/BlankRune.png b/src/main/resources/assets/bloodmagic/textures/blocks/BlankRune.png deleted file mode 100644 index df6232a24c5da4ee64c4f0b6fdea718373b18df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1524 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/BloodTank.png b/src/main/resources/assets/bloodmagic/textures/blocks/BloodTank.png deleted file mode 100644 index 7c0348df62e99a88804c7510cee39157e10b3901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 911 zcmV;A191F_P)|75QV>p%aN5kd%*Qn(sdoGimFz^ z8}_gIp?a3s}@3-Iruc$$ap+vGMS*N^&k&oW?Wre zp{ke}rIadrO6duiN6s@6D5cPK9k;i)a(sMjr4(6PTLWM)7_hjwXh6+2##l+@oKe;4 zA1~c3P?z@PJe9>_qP{AbIwdA6V}()0Vt*PPqBW@ zz3sdVu0YLZ4iCf-0wDx)&XiJ2Rb?8`%uI65bx@5)Bf735rBq3I2~tXQT{k-ce>goo zHP2pE?J=fQm;Zc!&r(Xf34yz>Us+J)qG|Z!^0F${FUL#q#Dty^AZ{oh$4e;@M7YnH zfe5V`KRlCs9uLUM%8HFfBUH6IyX(68tg77J-tx=m&wOcHK79Pha5(gmAtG#UZn|}~TgKB010DF6THFMwz2@zpuXNM%h-Lz%5x3}v7{fRh_2coKyQsVdb?-_-_f-2dJ z#*E9h<+uI)$3Vb>DqCAy|LXdAMsf6gzMK--j6bK+FAoO9sS-f_?s=B~S%I$W2qB;% zoKGekTwPJj_;qQCp9TYBjKmn(zqt6v>Cz)OHv!)TZ7C!XiWw?`iqM$RG|iJG<5#u* zePJHyD*?aD0W7D)ySH!Y%=j)w!Z$MVEc>qa3&~u|$lLHs*HM5UQ{wv=5#VMzkeT010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~<*EBsiVuTd)8C0|QA! zK~y-)Et5-&98~~?zk6?0S9f)Hb=CA_nvBtrjwnhrK?F6M9v6Z?z>OOP1$7%YK2QV~ zCgLujTX7@)0C5qc5rrTaQL<2HCJ;$?7)JY1U61anTUEDQO#Z;(J0ItW(P&fy2m!{_ z2q6#x>KcqO2qAzPAtX>Er33`V7yv8)-}mYDJj$|UwOXN+WOMTbWmzJGAWc*9JVWaO zDJ7jwhs7c!NfKmT*X%rSKZl2hBuPTQAMoDA5x(!Ux!GsEUNamHdHvFeEX$BmF`fR$ z*47E6lt?Kh2e)qFd0l)z;LW$s@%bk=dH%IiWLb{qd7OP^i!VO7&PyMSh~pUF@1eCu z2oSrwyS3+a(OP3!3dd>k^2HHfzH^NiFO66l#g%t|;Gqjo^Y^FMsj3nH*L9grXGmiz zT(`yhmtVkf9BkWS1{6iXS8sjCk01UF!2VRSu@TVk_gS6aCW<1AF-RdKolcjpFYoil z$IsF0^_c03sxq|OZSq{>I1T3G1&(dwc|ErOT;n(vLV$#tIF1R!CEt9uht`@a7rrHU z^%=4(Ln+DrW2fj}`-{BLT-8(B?KZC41q2cV-R`l#G+j}a6|U=YFs=buE+eAJj7Fou z?c4t_5xMrPY6jp&{StMz~>AMw2aZIPv zVK5jFMG-LB2#MAj+ip;nC6mcrl#&4a4?2TlFp-Oa1ONa4 M07*qoM6N<$g382)Y5)KL diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/DislocationRune.png b/src/main/resources/assets/bloodmagic/textures/blocks/DislocationRune.png deleted file mode 100644 index 4f3378e1fdda9dbbe5c4aa83c610a5627bfa38d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1640 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/EfficiencyRune.png b/src/main/resources/assets/bloodmagic/textures/blocks/EfficiencyRune.png deleted file mode 100644 index 52e9f6c766386611ec42f64a41d91412353d2a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1621 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/ImperfectRitualStone.png b/src/main/resources/assets/bloodmagic/textures/blocks/ImperfectRitualStone.png deleted file mode 100644 index 528cc3758329d63d035141f276a4ee853c5c0793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1598 zcmbVMX;2eq7>*pHQbD9tMXlWiN8^-acXN>JLI9Hu5+q200RE`sX7>xMkZh7&On~Tk zR=}tTR;$*L>L8-XRIK*UqUemMRrn!}#cI`|Q|eKys8q3HHypM<9Dj6YcE9U=p6C7E zV=FS!=ZA(&3lWJ#p~e&ST6s6=0-|{|YXOkaM&^S| zK++}73m{%33Uo5rd3>HJ4X0R}jP%>cJT`}b7K!2$Jr0s81UzH``HWpFet6=P7-DFx zI9FvtOb$ILU{Xq5AgeSzn<_1&Fj}0L0L6Q7fxrfM67txJ>>TdViidb{Vea3C#n6xm zU#JxiJC$e3fb^^jKq{F^N+EI-Qe!eyrNmG)29hJF0!9&7j!97zSE_L|78-fPf|`rA z;+aJ9h?cO@iVJw&fy1!d?UuO}GS-z3qZo$4h#Z#7rGkZ&E3xyWM{4JyM;QpfQ7*>8 zGprr*Gm;jznAeI0PlvBybC^u8iS67-poEaY9?}7$G6c5S{P!BN=J-tTuN!Z)=CVs1 z0L}y)TkN8Qd|0DL!9wibF61{9yulZ`7$GTS5y4W$HelzCgjOt^$Y_SfUlZ?K`8aH3b`^F zOCH4qW zL&Fy)fQwlM=wugbgN8zkGjEWWE67+{Nl{XoR4b%ptWqh}!~#UB1Qrd6k_f3$W8x7! z{eMFT3r@lQI{8oCjBW|V=%2ps0%7sGkAPih9+%K17i&u|ibMgFk(ih5xgJ^FweSWK zes1|}XGDL(%I1?$$nu8D&MD7c9Xhx<#cXJ}t_wb~Xc?(?KX~^0tcmUC`!9J1FRy2t z*v4byum|N_SirbRx|{p;Q}qudbvM5|>S%8~GN-=2`_7V@#wB)Qf6S%+Denpk z+gnv4_KlxY*SNjoLdOU0OHpxqI$Cc1QkfLQ3_R*-FUp}4DQ@btZn_XA!Y)tBvv{b`J zs(fjk%Jo%5T1C;cuHzHXXY~eEK)}9)@bPDAt0O*)*_9JC=Kd4?bYgK%;U85?f2EP~ zGUv|vDlBUAI@qU}R@gAz#{Vp_O+c>?w6tj_TDM#)Hg8`M4*8JQoZ~??65qFN@wYy@ z7-A(>?#Z&Ax~WT~-#^mHOsNddyByXtv%5I!YO(Funr2_?T4Z(K)SCSb=0o03&4(-Z zo{mh6f4R#v=ckA}^E+4LW7mvLJucbs^8ThWZ!WzvDPi}77pAP|U-U48&0S&1Ycf-H zu@g_W>`)$SN2X;fhxS-1EURQGxd0oN`fgn`C!-8?&wLhsDZ! zW140elM-77y`k-^uJQeM6Y|hH;_l?x!8;B_`{F3Y!JYl5M1dlYE&pi6jlXLBe{`cE KooLc6S^W=*N?cC> diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/LargeBloodStoneBrick.png b/src/main/resources/assets/bloodmagic/textures/blocks/LargeBloodStoneBrick.png deleted file mode 100644 index 4935a71f7a3de42d611fa81e58785ed83dae8781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/LightRitualStone.png b/src/main/resources/assets/bloodmagic/textures/blocks/LightRitualStone.png deleted file mode 100644 index b8415523a172a4fb6d96fe7b5ee1eeb6b360a8c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878 zcmV-!1CjiRP)DCLyW!lzRXG03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00PoUL_t(I%SDsTZW~n; z$A9^QdD5R)bagdjmkNU$JM9so9F!4~mEyaXE_fCW4OAc4e^sBIu^oV0E- z^?cp=xN|RysbF;$M>^;KDbCK$EPxPTj71265MV7BV-P~n@B1mG00hPu09=6ac+B?p zHd<@SvOr47Y&J)0jSzyOD5xq$+qOt4iK3V!NyzgYX|3g8x#aqKMV@C&rxQ+2J|YZ5 zc6KJ@dCt+%5wqEhs;ZFEVZDCId_G4?i7TaKeS1qB$3#)g)zvkt)eTiu;dvg$81g(r zsRCml%QB|ZF-_AT#2X4ql`IxBo2?+2u5iZKQ$gdmQ$ zsGADuNTPYnp1b1PNAL3FF&sZQ;4rB8@}bAGs~3P^Fc{!@4nhbd^t^6w6Rfoi+=w5Z z`XqOkysZL;=Zd$o3BC(^6H8s!)OE#hIO=T$h~t>)bQj%r%=beM#se;XPdWbdh|j{NiuQ+A!Ha;g8Ed`Ate5ef1vq_Z?)JB1Er&@B4jH zPft&66pa`ThoouB&UhP7XmVxv-wmwB*{v&)+`qHsOy>_2>$Ovp67I(!Sh^pcX!cRqm)AH4k-nm z=P??EL{UstDe77wrR;4KLSQX`#c>=Q$Hf>!+qSr_gX_A)afG!NrAn-|EEaooU55~& zM^Kg}j^ofY8F^j+7HdK4j;`z8eCzA(IFdBYa2yH1zjo)l&=LVL&cN?Rt& zChGj2__1uFWJhyde&Z5X^uTPUmB$4K9W1cuhhu*1^#P9A(M~XPi5wh}y<*Z%sl01-P(yR?Y zW+zz)@&HNuOWHu1L=sWLSo4K^%MyZOoeDB!qwqO75iOCVrTaLNDgpvz1BHxB58rP( z2SW_4hgWJWsD(2C2a{dKgXLv8R;sLs!f7~t0hHz=L~a%6Jv`=@5a*$7 z1ct^;gd#mW9#p<%DP&-I0BIB&IfW`QNQ)~ljT*-=8Kgup6@sCN5|?8bq1F;u3N-P+ zA{$TJi9Dlef=gWKVTT}a1cG?IUWHesVEIA>!*Luzm55R)7cJy&ze^x}a+fr9x^gr#7Z8bh@v zR1?OUU2cJNQ6S9Cgt*7C+81I80}n`n<*h7R9Ik?;4pv~@4wi!q1}JeQaJvqW&YmAkGHq}{5?3MRIo&leK z@>5#+a82rA?cu^WCVN1*JjAY=JsJ3$U#Wf=)G3HE&xJQ*TToMHG$&0TIh(s$#(#co zw|CjW!R1j`N}J+qjvvpS^M1_zY5UYWztfjPj>VPxJ5Sfig1VdcpT5)@@!k|OQzkuf z+8^{QZrm|Uop-OcYvk>>HoG3|=_t^S#5V4N{fAR`?GJRPnRj(p*2iq#YQ4Dm($M_G z^M+sxw_*BK&KT9y{)V)?t1S@sh3tx~*S_xV;P9D}*8&aj?9tI_WnLNnA@>z))CJvRQBzZ=7?86IrX^gOmBIoI{CM&xAg~0b}aH7Fv++> n?ejh`Cp~!=y|HfXr0J4t*`<|zFK70Je#Yjk9AnMGf(`!wbp=8z diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/ObsidianBrickPath.png b/src/main/resources/assets/bloodmagic/textures/blocks/ObsidianBrickPath.png deleted file mode 100644 index f06a218edbf5da9d94efd51a1529caf696323803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16086 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 S{e%62b!Xeg;EzAox9z|4gMFz0 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/OrbCapacityRune.png b/src/main/resources/assets/bloodmagic/textures/blocks/OrbCapacityRune.png deleted file mode 100644 index ec6f34ca7cd903de6444475bd1b19f1704b275fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1621 zcmbVMeM}Q)94@HnPzYf}5Otmhn?-5wqb=>7?X_tu`!Ub!Bn5D*1a zhKkDk912m97>#9$E}$Y?oI|31k(K}iO^Nf<+X?*xD0yM2c(P8g=}30eFi*2?Eo91v+~)(oH|JGB~^ z07Vz%b^x_VG$xnH$l|k%DWrw9ODP{l>ajZown(I&=W$Y&Y`{Ziu$pmb;DK{(FvQRr zI8$LnjZPh~F@{18EGkURuoPxn2pXRECZzU|f&n|=Dad2bakxm21|GIc3Ul8!0z<

3Atx{_7Q#_XhF~ay6A}y~ns?lc--7eORML$%1zO?Z^idq9GS@jBqJbj-IvT*@1&k(raMhL`pL>iDQ%sSgbOM zMMfwkG>`)cAwv}stJy+XWh#YADKn4Sc^N-Wu8dPEv^Yu#>SGCV6^bea31x}#TAemg zrx@iXIb1yDuz*qDjNp5Oi~T2;)Nz2~SuTTRb4IHm&BpSq%f>n(oemObG7g%}cg6T_ z=y}3=z%gz>CvvPE8kU%3Ug91{6{uOMv`BD5NZm@wtrAK_VG`VGCWKs+N~@fJNBH#r zl@1YtLVR`dueurC5{l6`ebEKN;zb_;htNEn&?UM}ZJi>Ke_@hdo8jq-HZ910H9f5M zsraHW@8DlfI**(V>uw1hS~oG=yS%cw^GN^Vn~vM!#r3C;YQy1* z8}Sp3hEiSu4XIycFBYuld|_kM6<$!02IH>i#VO&9B9eu{32@TiK2;FXh8 z^?}XrH|$EjB(5yF(_7#*VXLA(9#qH2C(km7!vY(a7VniKOrhEP&4VXDAAWG}(xumX zGG`ZtjNO`e5#54LBC2Kt4=p(!fRDS~-P&qSzt+1rte+?6F0Au2Uj1y_)T!6P8xzu} zZEHX4O;7fdm5trg`&)U)(pu)uxng(mR**#=EQQt<4|087l z?7la!t-r41R~p|JlH73pYS)2tcO2a}^WLeZ+jBpvDGT0ETIrs*Qq%V6F19>(f6rh+ z{L$D2f36+4e=EP{%gi0f6@LgE^E(8-W_sYDfXGsDkAFQhp`*MSvF}U^QQ0fo@+@-XVdlZN}Q%dmP$3K}rE(=43QRp9XU%RV zl}VcDDO=o11!l3VO$kBy`T3%JiHNqZf?yOyAu$3Wh>$}F8K;%S96~FzU|K;#Fu2`f zV=c55a4BLYI*(O>oTtx1plo{mb73npl_)M{kOQ+put*G1lq;@DG{Ytl|GM!)G?U`A z5l|Ar(0O*8yAN`~G?~lY%MH1JoHxn@yM?%54MO0-d-T391S5d?;{QWTY{HCnYys)&pV zm8%ugT%DC+F)L0?+qQ7Fr?~2ua+PX3fw8nbg{E_+tH78=vow=M+W@s1SdwP3n(2Jz zUDpjg3s^(gEo%sKw4J7a$rLLsFEEdYWnzj4}m{J$ZdGJx}+y{Z$;;NR|85-F@BsQ&*SU=1}b7H&#?TvO6nSl2T#OU$d#Ek8As`ugOLL#H)p8lpa4_YY)V Bhcf^G diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/RitualStone.png b/src/main/resources/assets/bloodmagic/textures/blocks/RitualStone.png deleted file mode 100644 index 1001bb27463956baead83f2e067d2348b998d009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/RuneOfSacrifice.png b/src/main/resources/assets/bloodmagic/textures/blocks/RuneOfSacrifice.png deleted file mode 100644 index d762f0e377ba20ba0263090ff669bbc81634cf1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 zcmbVMeNfYO7>?+scH*jsH~eBDFs9zxH2ow!5NHchXAx=@WOXA=Qi#x`q(Mqm+=)A- za>AH8<(v#WcY;G@Fz4hzHWmEb6t^J-MF)x>C&<|J{Fp37>h_1{AIl~AedK+f_kEw= z`=&54VS&G3h5!Hne|@~p$d5wrGr^C4mwcL`O9C+jV^J3@R6I?{o& zl%1m(8uT(^7AA*_g!o9Gr(m-i3@?aj$EZ-eWUv#n!-!Y{+ic#vMyws2k^DD|ms&ea zd3F*uk`5+^#rgBFhWNm|cCU8iHRPjFFJ>wJP_Qf=gXh>tn$zndA^wY)pa``T!NN)0 zDih%{R3#!vIVnPA5{1ZW!7-~WToJC4S$sS%!=oCFmcL^pD6c*eE7!gs~m+! z@x=d?4(5Y`y>;@Ry76uC#ps>B=mLK6qK`N2%r2ydP(CcDMPEV+@llDXl zzin@50$Kt!65~wqyu}k2mc?y*tP5IyYJC0Q<@wRW8>@|bcYlHOXT{+$garj_#_TXUgW~ldWc#mBpoEX!ay=kF)UD#(A>p9`L zEj<(bIxe3I8Q*-^_OoN{y4RxTZIhm_BA17{E8Bh>x^CZ8Y)_``nVnX9|LDDNLA*iE8^I=_XdT(iTbo@ssdw!Snq z3NA}d{^-GjmLKliE}Pl3?%~nSwK+K=ciWoz8|e!3fq=~??|L?Wm)`eo&CP@6pN5|P zajU;&&Y5qB&g~72_uB8e8XD(B6^sG4>XOVg%Z^`BAGz8cwQuFhw7?rocVnu5Q&QZ5 zJ*#hD1Ddp0)}iX^okf$U#{jOv;r#B$&wklenSAhJr=;jMC;0rhq$oC|U}}9#P+h>d zaBam_p?R9%ll)=0sBnz`Bsrgt1h&eEYz9U~rZ5{Uh;2QJ?d| zjzwXvWyO0A;K#lk5w_KZ9T^M~~wS2~0_l8HBaE7JhnoeBwRt6zBi1y(@$^!upy}AhX0ZHz(5w@R2X17FwX18=hRebI b<-l0r7DsjNYilg`{^9kp3AzKCwDtc0MPYE0 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/RuneOfSelfSacrifice.png b/src/main/resources/assets/bloodmagic/textures/blocks/RuneOfSelfSacrifice.png deleted file mode 100644 index e9152f33ff824d7c8de1d16b5fe9153e2e1e833e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1682 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+mc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc$WX!DQqR!T z#M01EN5ROz&{*HlK;Otx*U-?)#N5izOaTg%fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlviP6Vr?>OfAfflVIjx)9++vWMpP!XkcIo41Gga z6GtN#Q)g#06EjyMa}!5LQMLR zn|KwMRo6;(v^o3DL^Qn8wHCL|8B#3|E}&+ zmF>e1j8A^o+)LUh!PWYwuKxbdp9k-?rhLkGZIz$N^X~jqQP+u`wKiPq*RD0>IsAFg zB8~3u_|%({vbheEGwy#sC@7zBYeK{{*(pXrzvaTM$LF0byJy!{nAsH&D$2$x zr{dY?rq0xO;Og?_awX^QNaZ4dN_e^w}6uWpPVtorEiA;FMgC9h-FGL+{{ox7CG4y)24}e zGC8S-v`DR56&f0*8tmyP5XjWhls7&s*s%5? zf5-YjwY_Jo&+GYH&HYwk^S^a-fc0$C{`Tj!a#=OYJVky!+Z!xD-ET!!nPs`ird=;N z9W$C5+h!nvIGM>v6Dx0FYBL8ZwaP%Yu<>gTe~DWM4fdyIKD diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/SentientMimic.png b/src/main/resources/assets/bloodmagic/textures/blocks/SentientMimic.png deleted file mode 100644 index b2393417672214f81a5c19aa6e78388532ea6120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 901 zcmV;01A6?4P)N2bZe?^J zG%heMHD!e|WdHyJ14%?dR5(u+liP0FMifQ$4~?xjLHp7lX>7@oco)UXaCn=cL^VL( zZ3m8HTeg(+2Z9!@3#UNSe<;u*27>-ouzLJJfEeJoLm_Ggx&MTfZs?bWc`zdij?r;MfI2T12$3mZG{~{$eT$ynUJ?$7qc&)ZYuh?aehe=Q$sLyOT!uT%9erxqZ#8zzpIA zm91DdMp*1I(7|(g8B+R>EYr*|NFZQHP=AB&Mrd>RuQGk2d;4dWolzxMpIb z7taaYlsI?s)tp3o;*Nvw&G4LvI1n36i&@v?j|!4la?n_&;;mj+G)*PTHKCQgcqt(& z+Lh#ACb}Mr#VJ-|?~TT+MOo@TXHd$f{SbxptAZ$#dmBsTN;6%fmB5l8OW{zta_?m( zg)5BhI2=t-k4el%$E49WB(k1L)-;_CNrPvy-uuL|rRCv>M22MYJ(D{t_kcvUPzn6( b#f1L>y44PyWMxgZ00000NkvXXu0mjfo7Je$ diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/ShardCluster.png b/src/main/resources/assets/bloodmagic/textures/blocks/ShardCluster.png deleted file mode 100644 index 6a1cfa3e79015228c3fce6d4651e3a6006f3a44e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmV->1BCpEP)rWIBoy{010qNS#tmY3ljhU3ljkVnw%H_000McNliru-wF-^4LbL;rT_o{03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Q4hL_t(I%LT!URvSeC zfZ=~tPEQtqY`5EV4%?!4XZTsoff<9rCdIfRIJYRy}ZC%y6Vl(pK!YPfYDsEb=wB5op)K zG=^NKTo-o?lwxh}Y0!vXzt5gHtN*4m76pP^am4_SVgHat`I&vr=(P~n8${y? z&Vn;s8Q@wjSA1Zn7PO+~cyx?SMr#_j#fB_N(MC|IEpFdo;Ej-%T=4VaCw%2oW&%I- zSyeG-!IWkC#OdIIus&j~KBAk34ga*U(#3w zIGRIwz*5IF6bM}w41;~{(i<#S5{f>#(g+hV%jazD9ibSbYMb-uD<R-*MtiSeA2^IwrD1HtI9l2#yC6y1eBvf8^Zzjz5zt{s;4Hc?yn% RJ9Pj6002ovPDHLkV1mB7i*^72 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/ShardClusterBrick.png b/src/main/resources/assets/bloodmagic/textures/blocks/ShardClusterBrick.png deleted file mode 100644 index a2510fe0c89b794194c2bf835ce541c6f99d6d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmV+^1J?YBP)rWIBoy{010qNS#tmY3ljhU3ljkVnw%H_000McNliru-wF-^4KNpGPaXgO03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00NCkL_t(2&jrEjZqrr( z0N`^!wv#w^>!b}!n_BlQ`@B83yzy3aB zZvw)fBZ%z`x0R(t-Y;^`ApP2*MxNAAZ6wlN)8Su$Pa29$)hvA*N&G=?3 zx503TVs?B%UM61T0MI}%02*7AAiqMdue0|JXjm5kuiwe^RrtDAH9;6xWM9`Ma9%u^ z-iiAW4Duq+$)^DE&Y2;I3#B+F_lE}xInkZ1RS}P8vTYihMrcs!1~GO*jykC(e3HuD z!oQHM>v$%>fC$=6-7;{DjR*($L8W8sVZ@aZgwlQU-!zz+UTLnGjkK#t{$smqce28> zFcwPhs{6<#1+9+BNc$K{o#AX}e-LFM1&qaHIbB^PZxMum_Co2*EO3vmKfYhRc>avO zVwB#t*YC#fI@fl+9(!Yw-V|`q0BwY6Ch{4l!;SvjOVj^x+ZNB^u$f|nqOMYC400000NkvXXu0mjf3UFdo diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/SimpleTransCircle.png b/src/main/resources/assets/bloodmagic/textures/blocks/SimpleTransCircle.png deleted file mode 100644 index d178e55befcf6815c66bf5d4b529f9d9e2517f91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4254 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/SolidClearMimic.png b/src/main/resources/assets/bloodmagic/textures/blocks/SolidClearMimic.png deleted file mode 100644 index 8c571249a2eda18245fa42b9399dad3c53c973d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 969 zcmV;)12+7LP)N2bZe?^J zG%heMHD!e|WdHyJM@d9MR5(u^l1pzJRTzf7;UX%ET9u}vA`4ozaS~r<>=;+5QX{3Y z9eZNW*b`r7=FHWxlLAr}K(3QG32oIqLa0rsF|gtvAQcc*)xXpQdN{E7bac+*J@5Cv zPr`qzhLSH(Or}r@X_A=&YEmVazKQux74w2lF1J7`m*Q42Pdc5WFq|k@!r>;`lDr+LAm4 z(a>Ue*~S)|1Z{!uLRc6Uc?P6xzaeS`0La(|ocqnOXH z+Z@M_XiH~b$UOQNEizeEIw&aEGCTcqOGzqaOjG4&L_X|*ULZn{q>(bJsaa$Ax`9= z=~bdABoZ#|cXblt?G|BZ;j|qZm5Qv*!;qvKQR4IOW)iGNKno6pD= zGPmgkJ-N3_vs7g`<8gR&#KY4OLD!Sk9Y*oj|GV0na#(c@Y}c36x)S?25_#z$kW~#r z!J4j7uW4xY7Di2H&Ct>HGFnH+XjQ40D`<_T{LIG7e|EjWcM2% z3x>fOPA{at?#Pf`9$aZ6tQPG+5?fwE$VT#W66IW0VR3PhPFHd-B=-{O{#6UVXXE+- zT{)hlF}h@8c`id&V($j5ELF(=$ANjFhB}ktMz%;YHHVV=l3;-KE~}(<00000NkvXXu0mjf?C;4E diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/SolidLightMimic.png b/src/main/resources/assets/bloodmagic/textures/blocks/SolidLightMimic.png deleted file mode 100644 index 9d020eddb71782bb5bbb905d040145e820f89e96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 964 zcmV;#13UbQP)N2bZe?^J zG%heMHD!e|WdHyJLP z?Cj3Y%+Bx0Zfb%QBFUPx`y*>C^g*a^LbN2*AU^0zpVXj4|0+Q~p7!Cuy@z|xx##=+ zT*bcoHn+_w(oG39;>-! zLa#;8@_1Cfjvf01Zb9e zCr*lk(TMVTi7gSjQynLzPNJl&Y2vVfBRW)!0=>PybR6*Q@56sjem>>p@%Mc5>k+%d zF5PE6ij{(h>f=TU>G}sK`pOtV65va>qFxiFZ4$rD>5DV|`um)Ve=ayZ{)yNQal#O@ zT#}c0;#PpObQ#53eHU*d!b==V57aj*C$_`s>35u;U+~)>e{%NYF;38;6$X?`6~e?O za5jX4w@@k#mQ^pwGQRiB4^bZLvSA&7sVT z3*l>D0|PCuvLB}C4i4$}c1fCT?7-*i{Vt2JSZWG9)qF*ACJjv&mkjE4jiljWyLB=(;ouYP8jj4fo?oL8$1-2ccKs@0 zC&u4w61QD!Th@YiTblTBi$X!ea++kTAEMlPt;Q5>vq>}fOgi~& zx{1IxEyZ7t8p=NA)BE?xR;Go6JD17Gugc0dy;+*%w#1@2OQwDkeR+(^>KF^g6e&5A mHfBV53Bf;Izk;#y9{&U2;R;5ZjHbi@0000N2bZe?^J zG%heMHD!e|WdHyJKS@MER5(u^lWR{LWf+F%7x)3OSWHZei4=Bsc4kiyDq3pE9@rxc zdzka=3=1|PF_6Go=pNWAN&kTf7MHZd_`x4wBpUQj^@F*5+7I*LeKPNJzt4SNkK%m% z5$T*paydydv4*ZLvZ$}HoLQjx$qdHa3>h`SY9dEGonTqbqU$QDTnc;U9?F82X1!3w z?skYwldiqX!D1G}ve*wCEZ3mh^?91q@B<6)TaTXMQ7AkiDK#atu!I@8JSwaaxHi7+ z(qGJAh915X5IS9{`5Y%d!}omo$Dy=Q!1O{?Erp_HV{)(v0+(95PQKA%vsR{AC{Sx` zlke22Z&lc?ZBlPkX*LZ!&%xjG-jA*1Vh`xHrL$vFH1eFTt?}~Y8Ry3*c%mLT9foH^ zUVMMS+3F*zrQ&~<*QMqAENB@NJ*9J~#W+eOC^pIr&c~dsuQ56u;DVu=q`qr~83D2gMdzhAzc{&vml%b&TtnsPku(|z}y2z2lER|KjG&C6;ev2R@Z@l^`8uGYQ=0MjtlK6FX1tlRV1n+Y7 z4I0HdFV-K@ADuHC922#Bn7+r4&-zRT1IAxHq+BS|5kh-Htd^1naa9*n9Bd)bs8=Wm zMB7`N6eQA?z*8$$rPiX^*pieCc6J&>O&8PILDPkUB{hvD^W=-`G{aEl3pq;13HCy~ z{Wf9G!8Aj{rHrV$l9o-W)SzRv(c@pBq|&Nf{uM?pxlVAz|c()aMl-_(fXHa88Pysv3e;dLaFdkv$bOau;yNiS zU7&=O<~S@HPbwg>MFpxWew{}n7Ml!Vu8aD z${=OEaw0t#Y%R=1K%tm}2>4Y_BH;@qNCY_Yuo!Ek zPA^f*5=Lw>D=90RqRbKqqG_5#^Ed>#0z$-MF$8lVE|<+9*p_?~g<9Dr%k)tN8D`Ov zxS7HU6X;e%HAF5YWig(<3c+YrDqjnmEF+0xQU+O3GlXzp$Y^xOHH@}UYV2P(-iWrO z=9@7{jai6XQp?Y z5fLyVi8t-f+8&0gc*#B181e< zCLKXrX1j0bRlqWg#Pcv+0!bLb;S@{oH<;(b0$3vyYS~;d6S^Md>)EIXMc7=uMhqi} zP^jmNStESi|4kjlI0d=uHy7F6j_p@yHc^*ykLzMFld7caIwC=w-`9|}VAGyJ_eTTozqo=(=MLW@|#fq0F zGH&(W+*(2YW%BqZT`xzJ-@=XkmXbAZru;M_%bjH05kE9l9-^+-G2&syh>Ido3-vAClZe| diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/SpectralBlock.png b/src/main/resources/assets/bloodmagic/textures/blocks/SpectralBlock.png deleted file mode 100644 index 996fc22a8a78d6722e0fb990e9486e5e41a3448e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15123 zcmeI3e^4Cd8OL8R#)wt9Q75G1m~-<>raAWZesJEpTufOAj2s{#4KNeK-rg>3xVt@W zm+V0l(b#&K#?U%;G|`EzE$UFksXtR_l8$3zVzJhy%^$_^N8=C+=?e=&a>#YtuyoW^Hk!l>y5xiXSZcF7 zZ4Rc9aj-52%Xn;d59~@LNJ^O#!>);VVT! zwMd+x$jWLgEa*NZEVM~EXn8O=!J$6uVkmO)e%h>BBE5y z``|!{q6ArcsT34MhhXzKowALwyWF;bhhZQE!F#*laSM{*O+xhhQTKVFc~$H(cS|~S z@N0%f+~aNgu|Sx4sj3tW_GdTJx3GJYXW3?{bMENuL`X@VNl_uD zN#>3#qh_~U<`B!AQKnCF=dyxmo@PGL+z?WbqvwofmzD8MyD9%~0aNi2_r-Gy{gyqs`Mlq|7ZuYIJUWW;=F%JvsAGV_`4A zbqUEDFdRK^ESou{Z!&8d>PqT84mK} z8d#g)!XiQi1Q$vJYZF{pM5ut^LTO-af(wfX6%bq~4XjOYVG*GMf(xaAwFxdPB2++d zp){~I!G%SH3J5Ng2G%CHu!v9r!G+Sm+5{IC5h@_KP#Rd9;KCw81q2sL18WmpSVX9R z;6iC&ZGsDn2o(@qC=IMlaA6Ul0)h*rfwc)PEFx4uaG^A?Ho=8OgbD~Qlm^x&xUh&& z0l|gRz}f^C77;2SxKJ8co8ZDCLIngDN&{%M$RVK&x2Q z;0K^*4FG++0r+eNUe5#2We4CwD*)^h04!G@-Tu2u0P>Y;eq&?&udYX{V;@$2tAbhM zI6>X@zK#A5H9lQ?mOsUAO1_r(a{&4Xg+*8(mypd)jvMc+uJ+7f5j5;5%=B?61yh87;hPyx^L$EC+x9y z`Fj?oXW~25aAGfW?A7qt_DOC-`@wTpfuQ_O(a#@YE^>A6*5vo;#=A8)iy!Pe)AaBA zwkM9C-uAfET|aTSVo96qc;(3zzuwhpbQ*h><@FW*_zLjH(H-*N2E5zy^FZa28!U%L z4m7W!);%L0Jh#rda&UOlLy6<(Ke-b8Xvlvh;G7TaFW>S;V)~Y%(WeF;+nxA3S0~AB zXY)XHA_0Coc!6>hT3R};H=cIB5|lfQ1J5d}o{1V2{BKT2X2N5yH^>3L(6YiJ$#U_) z$Vfhr*UD>e4LrYt9=P}LJujUYy)gONe~Y)CdE+_Vkk7WBt>u@3J&6Yr7Rzna!}}H9 z4t`N{^5PxTG*|cKA1LZh{yO=VbKRvz8y_^5%cYiojo$&lpN5CtoA~LzGlw?uCu$Bp zdww&2ov{w|F_oH;2ZlqPFJ7uh6fM7c=TwjI{n3XKcgnT=YG=pto66s6J^QQmzu(Qj zbyx8^D&NvAQ_ia_dDL3x_0-EPA7At3jZ}c5_A!GO$1lD4HYgmunF@eH%g^{52iapq zH(AP@#Z-Ln`-$Vzy+>#K{6>C-<%5>79WTB;JXGgAIl8xN+tZ1UUORPg|DSgqy)`gA z^6AU#XI?#Z59s4Roa826J9T8}reV-sE5w)2nu^PFq=NbK|b!M)GF^T-bi TT)#A5Tdl6B<%ho8`r!Wn@CC!D diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/SpeedRune.png b/src/main/resources/assets/bloodmagic/textures/blocks/SpeedRune.png deleted file mode 100644 index e60fa0b0a867311adc70c511a37d457b78946ad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1693 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 E9|ukAWdHyG diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/StoneTilePath.png b/src/main/resources/assets/bloodmagic/textures/blocks/StoneTilePath.png deleted file mode 100644 index 1432c7cad74786fb7ad39aa52770c30b62afa587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15846 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 Qw7P#GiU^ggMw*!Q53#_FivR!s diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/Teleposer_Top.png b/src/main/resources/assets/bloodmagic/textures/blocks/Teleposer_Top.png deleted file mode 100644 index 6e4196975b601032b7393719af0724b465ebe35a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1703 zcmbVNeNfY87>|57L^$!rrsJ4q(Va4zrfCapBh{lVUydRl1u6qIqyZwdscE1E&y%yL zh@g`xbBe$L^9#lK$*!C-h906!Wu9`NIGKWqA{*id2gp(cw?91pSnl#Z@B8NWd%mB` z)`;+6cULc0007)WLsU_m^sv7!4&3_f&Qw26e8vW9*=RbMHRB8k1nB4_5)9SjDP$Ch z>$281ll}nUxR%mrS*>e2 znjCuTlvW)9DrtrUefhpHArPXVM8-#b#WED-fkFW)LQnxBl))&9i6t272TnW?XN}P% zV^ON030vGr4yCfJ5knBO*~~YK_%xG(pfZ^Z5eN~X5atlDDa*j(7T92#H>p8Inh1t6 zvJ`Cq?HchUI)jx%oTqO?&>Pk2cZvd?ft)wka)#oHf~Tu!B12Ca*ie-m;=b^8lnxW3xRfN4 zMKB?fNnjl*CSjRK;0q@w5qPpl>MNCqk|y=Mk1rDhsH9Rql|Z3Tp=h8uKq-?1N>oCn zP$5x?rHV;zsKLbI27;WlO>wp-xXKT5F(pIdEX`A}Ukd45iLz_co!3v}6a=ax(SU*%CWtvo5B$2r#l z-|eyI;ELj&0+d%Z@FtjkHN0rux-@Iq2J&=+)8QjU&zUaQmnp6ORq*YEzv8V8tFFym z+6XlC^&PWXhfCXxiP7}W8OqKq2D@|jac)<-wB*Uu9||fLmu;x<$cveOeynRj^;Vnw zw%8URc*l-cBkc_y&$-@qWBB=w%8HzXl8e*IhEDxm?WuTV z+rF!Op|I&}qb%k{H?$+NxcE2?*Bm$hnYZ`Ai;kYlas4xWoFkhhlB1b*=PVaZiFLfk zT{Lo}2-)gKU!IgDio9BeNHMVT)eRgBy)K&3sT5plh7Ydg&+sV7%9CDnM z@?GvUhH+y*RSfALIX_k!1v7nr|)4$?c#i7`k(MMj+ zW24ZUXGX84!v_vOd|27p>0W@BT%dNXUPi44U6Ph9YN9$j7S2udT$P|uBwRancVJ-d zncd>Tn8GQS;!C$UMXU+S-xv=^$261=)SMADohX`Lf5KC~HqyBpyEi_rq$U>G%Ulv^s7Aa zKKH~0t{bV?lF|YM39e4d^vKHC&sQli& z2Z6t6+xuVjcJG-Us~jD?RkwL-O}%M!aO8SfbG!IshsgMvmmOo?=kENmYV>u_zIwNy zO!d>k>azxHwpE(1`Q#?<6RCIl{>;raaCmXIZR!-Kf`BluvFQS!{(Mf8Xc_R#{_6-0 L3|G}CR&V?V6bP9` diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/WaterRitualStone.png b/src/main/resources/assets/bloodmagic/textures/blocks/WaterRitualStone.png deleted file mode 100644 index a0b3a91f4648eba658890427a25a6a6696629925..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1629 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/WoodTilePath.png b/src/main/resources/assets/bloodmagic/textures/blocks/WoodTilePath.png deleted file mode 100644 index 18aa04777a93b2378600b99005ffe3ba82d52c41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17780 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/WornStoneBrickPath.png b/src/main/resources/assets/bloodmagic/textures/blocks/WornStoneBrickPath.png deleted file mode 100644 index d2774c79d31775bf784e072b4dde24fb9d38e01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16299 zcmeI3eQ*@z8NioN3q=^BH8w-1?XgM?t(*P0+q>J%lVLU zuY^nSzOFsEMUhJJ2Us8Fi&zK zMdmV+#6g=#Q#6=Znk15PP!7pqT?2M>PP<5hs;gRqIzq@n^@xE%PJF(>*g4l53grx~ z>E5LPK?-S3ORcUsB9pbUrZz=I*}D{M<*r=2*OfpfIYT@dni1D7$CVMx3{BE3Q3}Zn zxxile@~AB6YP3#OgYION)ua(x%F7c~Whr_<2}^2Bo9ZHAlT5xd-eixU%WhDQc2J3g zm9C>1o_2teBq%3OQCUusGa(;7RZ;@YSw0woa?~-v2g_4jwvVitun%y4BtaK$$V>Lz zEI*RS2h?at(A`Q%sF%q|xZXu(2D4@kRux~a2GuB7mh85=$XvrYtvssOWR&%^uqbOF z8Cq77K&lc4ce+qNbTq99D(+<4kW^8T_)JiH!0KQ))=7vm?IdVgW(f|+glLs1hn2S4 z0~F^Xjl&CEWY(3cjnp{Ecd-QAQeLmsYjZM`hvjJ6Yn$%zveP}R$K$CeXKl1Cx1;3f z(4}W{L2cZqC!de63TwImxKw%E##$7x7TIsJIUEd2FjT-!1Q?r4_#K=?NPZjT42X77 zw$X_q8)}}}V#;+oI&htvAZPVk9S$1>2r}G=1e5E`ayBf`eNhEm7ldHeoHSR?@06Sz zClG!rU?mv4%|SSAA~-dolcFTfFVcdT-b)TQ!$MUmMgcVs&1a&3X3Gx^9nBO_qJu|- zs3sfzsT5B)sKJ(>tcg@*B>EgLh(_;si$?p9B^NnlG_$NhOILD&GCZ9(hG3Za$T4CK zav0TqlCBc7Ms}j90X-%}Rb(1rK^AaluMIJ6N4)Rc+h-7BM=fz51fNxW0{&s&Yx#A(O^?z zzJsB_2i%#1Ps%h~4V%tKn`WzF(~RYuu%f$}R5WNf%gVShOy0H32G20E+s?99)>3b43nwKdfG@_!;+)mSq3~tk%P}s!!B=w z7oVH?BeSEM=@s&227!Q}MH3gA52Q75K|s)=i3`mK(wev+AZXFVh2{fkOTo4enXyQWifwU$r2nbpGHE}^e(4vV8%?Hw& zxF8^C(Zq%318GfM5D>J8#5FGSX0jXxuOr96d&k|6R&d~*Ws6u@>%*{RQ!s4#qZl@D z9en>C!CpT=mf0FA5UDlG4D~I1|`Tpg994Y$? zSKc12*mqJr`{0X5n`Vqz)p~qI%jo52-oA46+`qei_tCmF-JRuq;qN_Ca?3QSap3X? zMelxc^5hF09qP8cFD9Spcxl}`JDdxMPkZMa-oNuu=h==8_=meoIBqTOD;eF}?fkgC zkzF|UvoCtQ$H5EUMa-JEcetMCR{s%OP%{2K%T{g2>d_x>J9ezThlR`~Wwx zR#)HLc`7(_%gO7H9Nc(i;Mqm*@l{ox^VcT!k9~9Q?txv``aZc8$F=7lTm9ks=bE?8 zKU>Nl#>=1IbyPTGdqV5Z-@Wag)`Hts<*&3=ZfTe`Yt4qv74&a6SNo3rY1@H4qc&;P zOA6NJ=Pl@ccl9eBQ>WnDPn>(mllQ~km&@F*)b#9XtJr$=;>AndVCNl6jyl$|@Ic|fN5@z7 z_5F2!=M?q#g?%jqyMN=ax(57<{LxvP@2qb*+uu3XRr>R`*{^-`;Hgb3fAiyxrkM}6 zz2?R7+Btm-_nf+I@^yXbT4JT zJkoq2w!pLG*C!6u|Dvwo&YkL^{&iDduJZik8C+U?``%aECRcpA;crW~RK(7N9^Z>y zJ~iu!Nz~!3>UX8L=fAPzj`+1JPrH7(@7|{||1Agcl?{LHk(ASO8|lYBA9$Y{AN=R_ c(OB2d9)95uM_*cIyiQ-`t@gY=eesI_0H1Unr2qf` diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/WornStoneTilePath.png b/src/main/resources/assets/bloodmagic/textures/blocks/WornStoneTilePath.png deleted file mode 100644 index 0df77da0b5c97a4ece61e8cec3be21caab1e333b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15950 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_d.png deleted file mode 100644 index 72216cbb3c874fcd32eafae00aa24c7d1645b9b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899 zcmV-}1AP36P)b1NfWB5 zus}#Gfi+UMUGR1+Sn>iO@d`*tttv>G3yEVVjx)}9F6YdgIV|{|;1l0{dt%<4ye5fz zXx(yf@DkT`xxZUd*9`_kFOE4rKH}5q8AVl+4u<^p`yXiCA>O_H!APap8Kr35akqM4 zI!;OY32oD2J1*H%PF+hp&n5IdM#GfH?1?}BdXF=kO~|q*9@ZIA7%&+R!Lq2zigb{$ zT5nKN5(O?wHQeP}x~?NHDvGkkiUN*e!(41%-sOB~lF3Vb%3ob@JWe!Ha8Em#hnfpnPCPhy%zvs^vmc{bMj zkAJhtw|KTiRh9@Lh~o$)6=4`K8m1^&Ga08iw!?I1$Y2m-0ZKJkNzzAPh~plvW6>zd z?cxq&I=0(_vrm_VVMI|Yl&o1U@433VLA5Q8Z6m&Ub6{#I>Bl|d$VWCUc~Q}iBb4rV zc-Sx*4=Bo-PHV6%BF{w|aBP9|)4R7wDao>oS4YQ`WyS4c$+Krue*WcGjt*b2I~{TS z>T@j1A?o=ksThu@C|Tp2U;GO~kftdgKK?`7G<3RUTa=8_gctiWZstpxwnGR&2twb( zy}ZHmJe(}c*xj9RJD;NsRFx#~J+|c|vZ}F!!1Fw8$3bgN;0G9^sjHIv)f&eSLayfv zI%BXb8{hY->YB*+xX*IFI6lM}L(>|RYREPldQpJUn!G5nimGNhnb1!X;?QUF^n~L$ zB!iUKhtE;6rl@M-q(?vLVLFXeEwyaen@zEd)?8d&lO{d3MaguWGM$WAKW3~R)-xT`2@8Y>OyR!+~qGrBW Z@gEGwgoNv+7Y+ab002ovPDHLkV1kKVnHT^7 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_s.png deleted file mode 100644 index c77595ab92980dd13b2c289d205c73847186ad4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 876 zcmV-y1C#uTP)k7R5;5e(z|ZuL;!%{-}a0>wvW$oocnHoaErD; zbS!LvXz1yXsChab04h2pdK#oGQlKCtITznfY>$0BGZgy_-{*b#)pzdZ)#q5}kb&a( zq(BB9B1)KN&1SP9@O)NB1+j|Q?Y77;=J(%z!<(l zuRs2jPzLl}jqf`yF0M$D7?|0&6-`~U%$Ah94N`=3U5k_fZL`7QBldMg)0Rk~P%0&g zLOjpWbLmfGlss!IxxmkHzobhA@1(}!dag{NRq{Zzz?{;|Cec+kkV0B z|Bz)Xp1VC+RuDxIT6Z`LN~L%oTz}zI5)*iWC|NT04SF0`W*_ilZZpnQ8Yezx@0Y^P%I-n{PQjJ;PZ`5JWiVz%xvG zM7+KI6KgHgG!g_J>-9axILtf{%81vmzoFe%Ja;X_Fkt41ahy>~;qVYilCa&bndbx9 za>dZ?=?6`5w89TU#_^qd6h(C1GoCNFxOks9Nzr|WD9aMxb0l#>U2V8Le@U7S_(8}t zb`-@WP1~YWNVd$;TC?A`7&8M0gf%1CGROCQB9+kV5oZnidQG-0SY(TLfrgemFOWjg zG*3+9fRGaZa4_`Up5v1Xk|f6389j~&KVTXMs%nc60jt#sqaMKXDT;Iaz%uF{KTZ^m zfWPlHRN2YFtQrYWaqS7<$P7&TF-I6Hrd_sPxIZqyB{{F1tQ zWRd0geu%XbqwWz>5Jd@|7a&5#d@%G~jWrWy9{C?bvyQfx#(I$e0000JH;_vHg9-p2No|L>Smn=SiX0=+e-S4pt1Ix1L zwA*N{+3t2sXEU-aV>lSF&vROx4u4)>BVKj8OkZ9|)0Bo%RAq_VY*Lja%J=y`nV_U3 z3IgId=5abj`aYBAXAB`Q55kbZbvbUeXf_%crU^iv=iH4(2-_xItr$-x^p1{bHX2N4 zGfui)sB6rq*<_n##OpQjYDE|Xlv-0;7W<;WbzO8_6NMp-AV4?{{nxMA6$O@QVkXNa zC2(?lj4K4C)(Fd@(weBzK)Ehqv&m_{PgU21N>SG}+sy{kFc1iVa$TybLis+@^B7O3 z%;T7Jy(ZmkXez~Wv%#z?zK_Q|FBX`liDy|DKfQfhPm=^;nzVudDJ2zP)-_pKvRtq6 z9S0>Pz7V{mDMno*rR3G&A>x;hA1RB1`C`Gv#RX4~kIdtk<6e(HK7C?181Tbz$WgnE z@B4&dh_G$G+}={=ImYiFKGY}uKEkrlb_p{t5sw~HeL zagtzJ7D7r%r8T$r_mowI2Ergo)+2=XyEMvdllVur()*M6;JFPLZqM+C9a@z0Hi6RQE zX$AqN5S(^8Xss!$imI-Of&ing+2%RPYK8B*m0*Inn#4)MI?Fig^)P;Z_pTnzW;8sHKuVPBGLK^lz_u)G+a}F2+RY}F)&!o1=emq% cGd6k7|ItTk?ffW5I{*Lx07*qoM6N<$f+3QWCIA2c diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2.png deleted file mode 100644 index 639abe9f0b71621f755066f2ae822e71b5189a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 798 zcmV+(1L6FMP)LWM(BziMOqyeIN-p^s?ceC{Xxdx<+&(Hrzgi%UDvhn5Cj>e|NQ-zzxTuW#f9(t^47s&@49VS zcAO;rZda5f3&L)%R~E&1JdUHN*XdA7-@bo;e>Vyy6DcCZK`0C!qbad$Ckz4yq2}i1 z{lmkQ5TI!rn;y$(MybH7EKQXq%^Zw@Zk3F!$`SxD8V<#})-_-l#@%Qni2~4ch)@`Y zVHio+bwyDe^#?3xCFh*47Rj73HVdQi@b;HCZ(2J(qtr2B63yJTXY$3ncgrkW+t_%q zz5O&#c6N8ClOQjc3E}Ch^PCkV2x?hwV5}KhkuyaQMFYZk7CX3MI`-{gP>TXk)qI&< z{`ap6RKr1{qC(Rg-`%aMT732E2LQl|^O9G~MIzLKg>gcN`+Qy1^q3G;)AB6S3^R>q zXl+gT^yTxO|5B0VD31I6enbegYzH~pTU$-fdrE2N`_1{!XWec$B*cJF{QBGPw&Ub^ z4pc=08VN%kfHYguMdIK_MyagG^I2>obZ~rZTb9B(S5(k2;m!3`T~{Ww5=tS)^eLfF zsiH{fJTVQ!gmCg0ENv-IVw##k*%CRGSw1gDc^psZe~-zBcYhfagTO0K z^?Y%rb$fSr>wEsq`@ieD_Cv2Ms;lLabR=D^sa84&J;s<2q9Dbx*op)N(kAa5Nrk*;+Q&T1_USt5-`vI2;bt zG|<4oI4q7wJG7owtE#GW+tTDyvb?_BK5wh0Mg|Wb9;H;#ATUj{P(_-qDK|Xdp_G{> zo6aWi&39i}Htz`;#o>0nQ=+BJcusQw;)ZUkH38D;&Wqf9b94s|{o%*&sYzSiW!voZ z*=e`U=jUfgvG2%oxgZ3J;xvtCN&2K^Yg&vZ={ikQ&N)R&fD~o%{@u=U%&zPI`2A1Y zF%b;{5YI+I6m2&dP1DqNY$cVbrIO0#7Ix@(HU%060i{ed5|H#gY3eGBLS&3-p*`0F zLLA3YQge%oTJH1Q_UuN~$KvR^&Tu%`X1k9!_w=|gOwJl1wNlkCzkKsug12zmeU zfphNp?rN2=wdqH$f8pb3JVZ1m(;;PaI*$=S2$Am(q84Eg#%GhR?c-UzSe}y(3`FDg zmoEq7FiSJhG(}l7Wdi_6P}FjH{i1C(G5{q1+&z?Kd3k*S-~RM<_VkPl{lJq-y1rc% sf^)Xd4whp965F!?iD4jVVfF9kf3TWa>h)N?7ytkO07*qoM6N<$f@kt%`2YX_ diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_d.png deleted file mode 100644 index 9d3910af3955711ef11c7798b5e015cdbf5a920a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmV^fFr{ZRj+NU`4s zfBog>#}`+}^uDSq&*O~I)59qY0t;-MBuSF&celU&{>O`FPkfKOe*Fr*d;4ZoY84A( z=KE8&Nkk9^deRPd%c>rRkr4O#`u{gS{aBQhHX1qDiNYYuOQqC0SpwwrUGH<&G>sZZ z&fHl~Mb#n%%c`#G26bJ}2>$-nx67qa+5i9uA$2>rl!h2RLVM+_2Dj^jRpwM7Ko+rIcwS>Jr#@+bjk}^H^f1G*Fgvu3$8}xc`RNE zH4f`U4E>mhg|Tzs^I;f}5CQ@V02qfp%d(r>&j46G>9Ukz7(V1uN-3-6?(-d?gt!j; z;k)O-0*mr;abzs2ea7VO&kF*v0fKdRS6~nMtPe4`peJzm-ks(5L&HL##e{Kv2E&e{Ry~`?WKxhmaMXQo~&_g)4nKoN+~WRMg$=o{1SXH zX7<6uqNn}K*FuPM{n%X2oC`|XvW!CVaU7E*S85!F?)L7OtdenP$npLmj_5SDgoOS6 zPD+80?XOMOwpp58&Q%1lUPeOPwW|UmBnIfN7v~V?3Fk3m!rBF6B4uu^d-&>W3M5Ik z)pI?orSE%sv-=VwFxEyfx6YqF{qJ1hTqr#oV@{|4v@*`w;}@^I_ff>~{i|=d6chuK znVveOXU@~Edn~s{XYH~~06h4G%c8xUoI~*byYJ^o8>5_aQt)x?5hlSC=hfS{?;wK9 zxu%pg&6&`^V*wvO{Nue}7ELJzh@1<~&c;~IWnDjofQF%uC~+Q3nGgyfrL5~`YfYNv z^Vm00i<&003YRKLiMZ zA|+dtV^it*bam4X+4Bk=vgLA@cj%MkRr&^RCibYAJL5d&&g6Q{o zzrTNX%IjN!yvfdY?`J? zglOA#dpsh9{$8y-jIlOm5=Ei!BSJc@0RUR-<$BG6ppvqxs%L3hmZdXhKAV+w4W~)c zC{@&TA!RH?Z>>Y9Glo)XolD|45&{!)k!7th7(z%0=>eEuTu_XAYcWEDwMi6(l*Xgc z^DL89l?1^q&mjO1LQEJ7DV0(>YbhbSvOG0SZw#dr0Pv9KZPRS``{~1j2O)#d`}O6^ z$Fjr_o(aJ@9{_;PslI=z>%jLz&I641RpmLyIlr7t@Vhr}IAf2y-R0HQYPI_B`}doh zo3?4<@t7fmF;;CG$FZ!c<#HJ^=Kc2i^*qZkLe{zc;b625g_tDCpI^TY01U=-#$3M|8x;~#y1J0@McTF=pKQE=k0b|Sc+V_17 zA@V!`;Vh2V+wJ9anx382N_AbQl=7?{CrN89RK`4;&7No3G)auLBOxHhKU`f|Yx`js zoJ)l8oNKf$r3@&A9stDmBhJ5Vw}}vpkkjeZD)sMXbGKf{VHidc=lrL|0{MP#3@)CY z(#d3B6w}Eh;(U33-)c=M&9aO$Cd;xo9tY?CDGKY{&)3)9+gGpFc^)w)I1ed36omnR rAVdhMlsX@c25SXljM8s;e$x7X9jRpuS1Z7?00000NkvXXu0mjfMN(f@ diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3.png deleted file mode 100644 index 97d4d69c2fbd3d146cb18765ca4fa90d04874ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmV+@1K0eCP)v<{0fBx~i^RV~v)2EK(h@HX3 z-PN_OH5-G!}VOc=cDIq1L0D#$a%Gb5300`lHHWPRb zD5_?fK@bGNMzCy~=lR)aOmadQW31f85g}w7Y!=hWr_Y{sPaT4>fwXwDwf9FL0LozTfHh1ApB)Ip#S|;&`6bb+`?+h5-<~U#%1b zB~i$;^q;@~5=Bu^Auq`qLW}vltZM$lufG8Rl#EeUWxJTGIo+~i-?tC;Wkn5rUsjYn zO%;feaBJ@ENiV0$I?QI-KvMj4AeDCscn(W%`_JeMB{O>!QBw}O#K#=8|H*aWJB27=C z$g*2W6pEs#>-uCgI_#c?Q8;}4+O(PnM{WMIZ(rU|CkoOk#;pB)NrmzKsvt$fG*nGf m5u%iC*XwS-KfW5OK>Z(6KYv2`qfO`l0000RO~!y;#m&r)P{p9cG*f?)>rQjpxbLYB8CN;r3&4{?|VgND#>4 zshY25$7BBX?YS@g-F8=1l^@C?FVEI%)S@)rfHgJvbH5m2@C7-{1;Sap*aDWbX zPkDhcp3bKGEK^xMKbZ%i53m=Ub0&<@o$XNDsY(x{K8Z#ns~g7^)|&A+I(xCk1Ro9u z;FM4@7=@1yk8bGP#c^4dwrL=_NygJrt?Ile8r&ptYK#d2A0d?0+0Cch23zU(02t@& zWID#*{qT+BiVmS@5gzAB-oL**|2ODM0J!-3 zQu;k1#O+Nyh(hW6X_7*krf$zQ+Ehh_5psn?S^^vZ!(b2sFjZ@ypp-^95Bniuj9F!+ zCow|H<OX!ZzIRd;Y0UqS25LN*SVzE*1+yuu>}9A5^8nAe_v`ZPQJrlht~GT1*L{ zr!VIqX#6SGMz>uSXmv6UskAx9FklJX^ vcgtJ}!S>sO({nIEu5>U#loHh7ZL<3xP{CA*z}@G|00000NkvXXu0mjf7kX`| diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_d.png deleted file mode 100644 index 35e7b73a0ecab32acb3269f77bbc1ee683f7e808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 758 zcmV}!^B@-1 zPRG1huSB>A$6<7^Th@(Inh^KXr~lsm^y7V5k9I^3c9x5)TyQT(>x%%d(Ed5<&nV z^eD-Tk`RK*vh*0;r>T_fFbrLbvZ?b3tnl^N{C z=9^w=PDz^OakN}Nh#cftJC#*s#&H;J({`xs)jCNQVaO>yp9_p}xD?k{uZF?2y$V8q z5&H9FwHcKjwwpDYt^IPdn+DVMX1iIhlNbPS%(8Kunx;J*GHnL#@$F_kPE+42=W?5H zMwA|0i~`P&r(zriWd_O^c98EeV~n--W|sm0ViCe$e*SKsmkc}0Ww=W-kGXb+u~+~I oMmwF0icy!i&c!B?tvco9|G3O~S-8^pJOBUy07*qoM6N<$g4c>+-2eap diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_s.png deleted file mode 100644 index 730391312448c0078f09efdd6a8be89002af18fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmV?P)gww1 z>eb^JPfxIM6cPskhg@<4{sJV<`~ebw!ksH{g>OM}BE_ZQ7tu7&sDFTeh_ z-8S#u-;TqW5KLlR)aRSc`sr!!tql-VMe*04zc39SV=JsJOGgA#ogV9ufBf6yCZ}U)0FY{5R)X!ODSi&INtH|^;RiGQw9M700wV@ z56dEb@Yv|NdG;br)6?;>YfqG>QIr@XQbvUkSym|}rm6qz@+!+SF?Hzb`i8{OEI2}; zX)YN{0kGrH^_-VQ*`5wDCfW#u+|VBaK!{-653O^6(u`7)B&oFqLc~~Qt-Ja18|Q77 zZ4UdRRAwAU{OQxZQktfaqI3~*=v#y$N|~645W>U5N9O@!c}xgnc?bYrKYvSE8bO?} zQqR58lG38@AJ>~JXRR?a#x!_CS<=_>$|&Kgd!=Wv*x3=l+pkoW{e$= zdux{n$2h{ApH^p;5BPN21K^V+5n_S}H_hiM%hW7z+qMV>mNFr_SFc`AQ->nLyB6al zCWKN_l(kZ790%tt01Ng`7iEnQDvQlDD{I}z_ZOR;S?o0RQVw;!igDccPew}|$7osH zEJlP#LR04!rS*EXky1=!hjCO@Ypo=JXtmm+$ZIuYhyw42`}+?@>tP%&E_OX{_xt~{ zyj<5?qnDJ`hr@$g6iw-Rvx6^hzSF9&>K*SM^P)zGcyF|tag39MK^S2|?c!#^y)(}0 Z{{hLJeO3Usl(zr?002ovPDHLkV1ls7TL%CD diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_v.png deleted file mode 100644 index 4f95705008de3a5cf276b755a0a01dd9961f94d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcmVr^^~TawSCvoAV3I(LGYBOP1B5oP)co% zM~v~8@82OIL>n`XqR{uT=e1e`0JPR$lY|Aqsj5z=)8%Yd6ooTpIiDBjGkP`}HB#p1 zb6!KVBA|filUIx;b3sR zSnQ9-Q4s913;}=;A|7L|>#C~ijPWs+#z-jIVKEGZprctE3ZXg6Asrr(le7=~dKan5g7EA0E7F=V~nUeD*p zqIhw6nHNQQIu&Kv1F%>uIAc{&vZb+;0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#AU`a$lR5;58!QW3C1pvVD?_KZOUQ2i7XrYCa(h3w2 ze?SPEV5WPSS$uIuW_(yomgpZaBgPlA828}RJ^HqnWhO#=+=Ce#phJ^|jb#cOX(KDF ztm_Ys*8aZh_56HdT}~85;o1H^q5z7b&}cSk3j+U@N=SiV z5J3>w|92NH5TJvNWwoi4OC+D{(5lyojgByT@@-yZv!s(rg5iD+^96i*>MiR(SMsfbrf0 z5kcXpE#RRW0CV;X8@JcExbP*bD=SC>Se*`zi{D)zEL?)R;I?|8mkH?6`;}mtBd^U?;)2P>LJlWc&-l!vBBRNFW?j8#H z97lx$xqJ?fsv=HLP13AZ@pX420$M19;Bc^;N>MJCkYyRSTVd?g*Qr-4gu`J%kqF!W zY|*UOaU`Z^E}3nU!Dy6Fe?NoqmvA{{65|u>?(E=jICyhz4g@$pJ4ct_k6tR#8|>xa z`2kX~kmterUA8ti=~x#2U=YczP=1l+y$|OJ_GtWk{W@-s2h%js^LZj8BkVrj#_e?T YKNkaTRmU&jO#lD@07*qoM6N<$f~3I7lmGw# diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_c.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_c.png deleted file mode 100644 index fd95417e536baf742097ea9661550331f0fa64ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 981 zcmV;`11kK9P)rAzJ?dr*831vzf`9iT7sF7-OP|#0z5d#&M%}PNSJOni!+gWOLb#fVwfp*nqaQ zrHtCI^PW#HeExt(`RI#x!s)4Lc8WV7KqxAmPMb_7&C-Q0@m-fQubn0qj}bAVv^p&s z%?5_9v;5~O%7sgd;b)7VqiPEAWQ=ahCO?wJj7LdXX%bd~%Rl{&v?Z~miK?rFLBP=P z5arS?n&-M$DU&B=9z#lrloFw;C<DZ`-itR{h)jfPKL{Stf)hea!GLGY-s34^zo#{bURg$SBsdR$ozb!k=`v)nN%4~1#U>YWd9zh5};DzX#hTU~YWfF*7Umo8Hh?)^R&n27f<NjvDUw!X$*X`eUF zzsReF_W>xf$#)-q&*bztW20mEUVvd3WCt=R&zzhIk3Dsi5ZEr=W%l?076Y6t%(Ki_ z>{8_=7Wm-uyJ&@gD`&1TIWqQ8Gy12CP-q#nuA=jTJo$O)#2L)Mo30%i5kq#&GE_Nr)Z^0kw`3x@B7HEL)3_J=jL4|mc|*c=jqmM-kv$njkPtT z?Vza|QaZHS4H7*GG(*?%rH>W2XgCdGu^5d;gWI?6@cNN??2P30#s;?R(rmUF9L$sG zv8dFlY~3uQ9o#=a+LC(xKA!8+**{=({6T`yr&irVN{6k@Z6c8fRw7QRR7S5D%oUy_ zJCs4o_2m#kknPV1AKX}8XYHR25=jfk zb%-ZSI!(#hv!|)lYJ9w~h$6tWq9_7XRe-N>Z@tKWgKKsre3J}800000NkvXXu0mjf DmMP0c diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_d.png deleted file mode 100644 index 3d2b425d70cec44774ed6c4a09f76c0e186bddbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmV;-12g=IP)%5FZ3Z`p}nI6l=RG6LhWZ z+AK+%wAbW%x&MAX();IM$%cnU@H`Lqz-4f75LH##X*Rg|{m*1%yz$zLRI63)ZEg^S z5w`8%?(MSE?jVHF`Si1|u&q34nz47##j)}f3OSy7d097-hci=gK-K0d~Y&MI@q9Vm}LvJO@Tz})eO`Nc(E zcsrdYC3E?#)+;{3ub9yvKpoMv4A_mH;kFv~4CeF-$dkDtHFcYl?shy5(C z{*9q)OixYl&GnmzcB_e@sobyCNHP#Yu=v{w+x05ul`1W_hdy?O?fYvaNrGV*WLbiL z*rBnzk8I>E>O1>%{T@LWq3b$+FJR-pEn3!ThM#zyR%;JMR!EYReb*(7W5OuL4+7+l z=TUZw6fFxgr{f+RAcVjw*=Tx>rR7yTzlUiRC|U)wG$9CMd_SPiE+MCJOs&zvwhDB; zLk21~1N~(HnvDi=oYLud)awm`Fe0DJGgKWQOj3GbhzNp^sfh=9Z1xm0QHV^&y{&Cz zMd6RzchC)kndwOe2M6$bJ`yr}`+LM`Mj@vmkYqNun_Rwpg;L34tJWZAs3e)h`FGv~ u3BLULTiPubLs!vMg(KB|x?Yd^j?4d_`d+^w$1HRJ0000M0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#ANJ&INR5;5m&r56+bpXKO-^~2yxih=drP8G=mJ*Sz ztu|FKk{S{d14KE1#)Ai9V$^u?q7rY47ZXj?sNCeB(FC<55-)^)msv;qDiytnWquXtA{P;mgmCa{(}fvaBFRqlgFOH88UeG`KMW4xI@s6Ir_pB zXFr@{mov$G=iX)ac!gT^AIA4gA*-5(?*{}?h-K;wyaM~iW*8c_=+=DXGy|ZVdw}_0 zt}y%fQQGYmwo{-ugm&07ktEtvpWNC5j@t-4300 znpF diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_v.png deleted file mode 100644 index 4178eeaa476c44ccf3691044fe8814d811276277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmV;-12g=IP); zq`Tc@UuIvjv%51M`Wb#d<(Hc`!*n{0Gz{uTM+jZ#->oey!{Dd8cZnJX%S%f%Jdeur z=OmIzEXyJmkF$}>A*!_+w^vqB6@^BtMaTCMih`zTES^7)Wm)`q=MJT6l@s6R)zML; z5X5bp^{p+0P*rNJ7L()SjAyf)oSYDk#|ip+KX>jWqoz?T7WwL}MHox5u>1+E{0fya+_=W? z-(F=wsC@e1H^x#aBC!~Y7cQXof`C(*3`yJOo%wlQ+x(A(;Ur{TDDHq50I;BhJb3t! z%NH-=I1c42y#A15_dC1_7ee z>+wo5$++v%X}2jIA2X6jpbA0V^C*?e1V9jm*wHA}dY!iKQ>)c5q(mryl#*B^LVjn5 zwBuk%iPvhOOUbi?1NuS0?CH}OmPNPMBb&*f>H5nvN0kbb*(|ejb4*N3kg#o@6$%_z zD&+EcT-W98`FVnVAHUOK(sk*FAufxELNpS=(shoiReHb|SFRwX uUOT1_PpofuZZ{zj#5*_xT?wgi&T?rV^6?0000WFU8GbZ8()Nlj2>E@cM*00Iz6L_t(I%axP6lGIoX zhCj*2)6FbZ3#2^##w65I3$H_MK)_DZp6<4Ne2y*zZXntKB`THfzkbQ*ZOH-U|0GBN z6agSf1R+U2e)>omPy%6&O1z_(>)sw)=8rB$xJ(KB{{Gbx$LOI1$h zydFlbQMr1>J@~hs>Ah1Bn%}RXN()Cs5QGBYI4^aerZL6Fb6-hM%pFNVBgk|B4x*^S zEg>^^5Wm`tU&Usq_@Dz?ZvSv_QWf<-ZGGZ^1ftk_FcvD6cm|Eq< zFfz)(+ZT^a*4W%Qj3e%b2FcVaM)2HMF0JyaJg~IRX`LBFkwH0@!f9K%MFXH`qN)@{ z2y-SX>Bfk#b>qu&;~>JTha;KEx3)67@u(x7&g_ne?ki+EVNQ3acju|zXki@72=_JC z42)~$J2{S~6f(To0%)QZCgVq_P za4ZAUvU2u{cu-2gGZ7KOY-b}-KK%26zuv#Q6N8@&`(Z~UkjQ<4y!$c&GWiZzGorG@ S(e_&a0000WFU8GbZ8()Nlj2>E@cM*00JLLL_t(I%axN$ZyQMr zgg>%-JdPY-;~ewzbII8VlKh+v5FkJvvaEUZJi1BlL4tf<-UAboP9CT+V_`HJpa{xfM?4IPMA>G_HuCfMFQ1;CF0}u5 z*u2rD9zoFnvh+8SJr;;S$Sgjf(vkI^c^lbmX19fPFErn2*2pSK^GcSU#a~b|S?@Ww zzgSdMI>vpV)HAq32!SIa;p?3v8Wi1 zMUW$cPTw-wkwbc<*hsMv$N9DVz-mRK!@UBKQlhq>?a4DB}- zhSO-i^CmqaD5ak1^MNEC@9sWO?8M$yy42ImP{%2DrqWn^pll-#`kvJmhUJK=q6%H= znd^zQ&bMolCbFWK8HF=$fkb9&g>(5ylAee3NZ?HM#M&nMe86dxWk!UHks<;!qqd!9 zmGg3>*2x`Kp zDr5xKy0L9Dd)@FVs3iJ)U?|VbZ9pQ(dPj{)62aYHW&Ql+GoPM5q9V5td-x5T+r>bt h1c3*rKzI-V{{gFxrY%u;D}Mk0002ovPDHLkV1kO-D!Tvx diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_d.png deleted file mode 100644 index 774c0e21baf690114678df7d518d25982632dccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 692 zcmV;l0!#ggP)WFU8GbZ8()Nlj2>E@cM*00J0EL_t(I%axNmj~qt~ zgg>%-Zq6$KwjBEBJFw$}VEN}*fB^xPw70wS=-!!bk`Cr{iX4~;!GKl8N6Gg5F-VF3 z4EH0e9ytO;Ac8+Xd?1q&Bq!R63~z|G5@yglpdgA(XTpt;#8y_eGIRd)7f-)Ep}_xc zcI%{J1W}X#$>VpBy%GeZjMoX#0nLwW>x^wHwpaFh!TXN&P8L!@vE@Q+6&+7(^M$Qk=)JR-iB@OA8iW%b zx!t)PMe_StE47y#bI?qPHE<1OoZEjG@C@yxsBjimww!(A@|G z3n3zaV_#X6t;|FOia?(}6Jglx3t@(<(t8KZSP0v4dHIQs4v$2u^!-lKbexga4-hl( zj`y8(dIzGkawCr?Bn>?L^b1xlNAoaZW+?7hxk2lAo!H8ZzWEuuSL$>|RZ)dBjI{Ma zyRYBXq(nv)GlO!&JP673tx%pnArIrB1g9+*`h6jfC-6=!D(It zLmwUi=Pp);nhQcAk0;9YnO-MC0?iLZYe*8@{gpKT@%}wezyFG;00&FBzt(PcNKOh7uWoh^ a0{9nYOrbP4(<{mV0000WFU8GbZ8()Nlj2>E@cM*00KryL_t(I%Y~D>k`zY} zMNd{$KZYHo)nefA_XHtB9t8V0l0k$J5X?+>b$9ivvQkFxf;^>{#=Q}FPhR=_=f#}& zhzQSPWnYKEA_&uulIK=l>O#QfS(Mh~UhOs;O9~o%XI`P8(JVz7ob^!dF7o22xy@)55xJ zq-kc`GFg@2yreM}B!Ylj6eAPvkB0&!=ysG2w$F z>p=tO&|C=KBR~My_nr1!lTsq~1F;(^rl=~2;k-NW7HHal4~}U}7~lY|Uyc)Q-y$U! zaGo*U? zYhqnjnx-P>9aoAHZv$DCp`RFH;%AdUDPbU>qj)E%WmJ3_yRI z*rpv-Wg9lyQ-c#ZauN|t4fTptMt_~~mFIl_g1Yg)uyGF+Dz~#fi-;1Z1Vx<5OKD__H+qb_X@Uy~ZKX!etvpoI6&(Z_%FMFh> UcP-b?v;Y7A07*qoM6N<$g4JeENdN!< diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_v.png deleted file mode 100644 index 6ca45881b3eaa45704ee69d0f9ec08122e979eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmV;r0!96aP)WFU8GbZ8()Nlj2>E@cM*00JIKL_t(I%axPMuGByb zM33E_WbOdsu|eYVVa?(S0iOdB2q9o5uSqgVx7#c-TvjaTjnxa6%T;ArKYw*X;GeIQ zy{hij9YnyLj~_k|2?2`Z(-nDiz^4_r3^{`esA8uRZjOh*I*qL3%<0o7?(g5Cz<)QF zoCwVURCWMq>KjOdFIU_P#6THFq^i(E%{mU)v|!7^HqVr8!*V8y3MD0^sVUt6QPIPJ z{OgRTgj9iT7)kv|QNaZ$jtGPhQ5@{l;we!sGt$&p+u_R<3D##7pL z^MblN`uK>QTEg>Zl*@#TGj56H%NMrGgjW@%WB@`C+zbf{2ob=|(8ov0b)j@4W#}LI$m)1UBvw3jGJLU&$uOu3OQ$p5ff)^`#l5M(8DftzOIB2b^vm^ zfh5RI*%IOTGf*M*1Mzr=R2B8BmsmUO%}tG2MkxjBd&r40%&g;pzIci)3(KiPRZ*1C z)TFi}P19dCArMi;tU$l-?J<()EAzMSNK@}jijmr$e3^*HJIKZ|O$fIjxr13DZwX6@ z<#Z;cgdXnpVcoC?%#1Wnx6@F}?B;?S5b!E;?Rvb5R8OBEO(YKkYuh0r5BHU(88bsg zhytW_W1S|_x{(AV1mf|)eD27@xZ71%c*=+frIZI-01L3IG5A diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar.png deleted file mode 100644 index d61143c4399b80c08a8673a48dbdbaf09a0934f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 936 zcmV;Z16TZsP)7dVeI6~jnxgQMJ z&SWT6Ds+22dZQ7Fs*))daBZ9B?JY!We8)j_>;+;>B%VsKS_TBZhoUHSZ*Lj)dc;+Q zY&wnE>EKuvnx?VvJR(70KAR!t@_7V7VA$yp_yIu}5=9}4xkV5JOzy`tTTQ-y`jld= zj%(Xw(;2MsgspTMace7y?|I~FHTI4Ukwl68;|DDLB{R!H)ii#7_7e-wCyFBWPfmah zJM}8Smqaa@WVKu&$qMy)6?;BM)ihGcB);czad|=C?2t-l5G5Hy*Rf_6(Po1bMG=Z5 zAuBTNcANEP!*DP_NodS1i(~;8Po6y+% z9CAPGlhAdf#S%uTgjlYW`S1Dz z%jFVhJ}1V8@@|7L@DU{$RZ&0?D3(h2j)iSm{P6fOt93}=EchR>UwGA#HN8&&0000< KMNUMnLSTZf#Gx7h diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_c.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_c.png deleted file mode 100644 index cb3f212730aaad96e0734e71583c4b552c2a57c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 902 zcmV;119|+3P)C0X%Zw(B$vY4Xwz z(++fbY=C9324;9*0}RYCFw8(5l0uq`9mkF>Te75cbmM_<4WIGtci+@SUhu>BKl1LY zFM0p|9Y6o{3pcl)dHd!qMXveq;cKq0ulYFp$ocsNr)RI2{dLLjzx{#ebq37-ye3N& zQkW!%gcrvz=m%ZWET!qVY_?nexw>I~yCjZc>Z*nc>as=@dCpP0h2LqB=LHodi}@p; zukINJeHIT34AbD`>?JD8QJH4FUJ>mMR7H(YIz!qLr8TRkHDys_7zUel$oy`B);Wd= zN-5esAJa7Hc6#_-k7yqwE2AQg4wQMxcrvD_a-uL|Fzgcq0a9-9Y!BONUFahJREU$@dbu3*zI;m+eDax?x0Ow)p%`(EYC=igt9CV_jk9P zoF3D38VG6Pcn*(?N5XZ8Qi?3e*vEUWXP+=_f$#gcj)!eq3@1HAe=tNT1sI&1Ov!bQ z@B2(%jVOzXs;p>vK8;3$?4VdJSGcZAUBNDl5k;;^vlJl=?jPoCwj1UTkA$l|TIXbG zPP1v_wp^%cMw1aj7z~3xLI^|8LKukk^D{@C7KdGeWtr$gp_N9O63hI5-1+MZdc7`# zX_t1_XZiF<6i4*O9mMo_%6hpWO%+blMGA@4kmS0+^&Bu@xm>b-dZsKYwAPHq0WVLc c%zpjEe`mXZUdpDF4FCWD07*qoM6N<$g0PQ|1ONa4 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_d.png deleted file mode 100644 index 40a5cf1d7bceb06c8d4386a0afd8526e7d8f1ea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 890 zcmV-=1BLvFP)v7Ol2nq*p_st`qj zQgJb8B!qYnUV?jG46YCegn%2aSVTrJlun#xbG$FHx!`+(Py6EY&-&dy<;S0Y;rgvh zKK<+3i#Z6LvaE5H zO`4{ZWsb59y7QUMc25*V98U>ZULw*Y#Wp4H+*}cc0aeogU>G_{R$^E-<57UC6dD?a zVNll%ku=2EIpCw?x|mrl}*= zn+Q~KC5~g(QAA!;><=f3JR?nWEZatxk{%7qvg!JcvdD?HM})0>9v;^eRYO%bIF6zy zD=b6u7;PDaL!K=z(1p&q>p8|TRnyS4XNsyqBw5C6I>l8so@24!?~qdBdMOUf+3=7TmE|Wz`(Uhvz+C8#%wwQU=u~OZO8F&WWA1Pnls8# zym56&+jW$6ji{=c`E-OXO)j4;nT*Hmc6*9ECo3u}+h#cMSzJso41ud`9{zdt|I#rL zAKc$j)Gcv*LYI=&YK18UXd27KobfnhHeV8LcC^hIjh^@K?zw*RiuF^>fAO_*0H<>H QivR!s07*qoM6N<$f}RQ~-eC-^c6mGD~L3f~qW)N>G6U zLhxQlya`XkE!=QbBm{^wq(RUL)0y!)-j022F8ChdGrsxuyK%SM^5YNR^ZfZsUVZi@ z_jkW=_vQ~i|Kcm+c+W?-ueks7cOD<^xw^jLlTW|q=hr{+>u;|S`~8l?;a|p4V;CdR zBw(>RXBbENUgOvfMUhkFDRo^S{RrE!>ADui0TF~DX}qKB8f?d+EKAblKy}O*27{() z2*MCwh5!s&@wC~{bv0dIA)4yQ*~JZum zsHz&nu<$&evdXEdhR3&eDAf@~(f=oYi01_eMuGGtrXdi*BF}RSA&4d`%Cg|uvrA6b zE21z&2tnU9L}5f#=G0}0kfBdmR3Yp-d4grT z)K!6Lx&+}I=}(x?Pnk|;r^3 z(5V^`Mv@Ve&E}pYj=8+PX1zW~DaCgC4n1g=%N0QoFq>b{GzwK$xQ@qkc829Rl1^1b z;R$7V0000&r_Tp2yAA6~Eu!^4sk#KVM(-)6ETkzr66rmoLb-<&s&F@b7HKbg|&^ z;Q`08kW$i$WA>U&q-nCcALB`=}#s|Q%aVr75(XyqAaO)JCy4pg}`@R z{uvBdXBly$!EU!>I36>bO!({h8DW~pZJyImii02^3<88<0I1k!R{e5I(W3g30v zZ?}-8X=^_F$`ofoidzE=#9tZ+bwxn;<+v-?KWW; zGMmpy77Ow`M+m{LCAk+PE()fL1&;4yD@9$F z%+r)O3~6;bOePcle0oCaG{yIQ-tFzNOjGirAoM&8A^7p)f^4;7^uO{g%h1~`Tdh%+ zg=5>8eh@HE5+3?}EXP3rWnHsKQ<5aXGz`{RhH@O5VTdpcvNWaLY$5>Zx-L(>9)@Y+ zcpl9#1SvU)B6`Ciopzh=KYYMZifvJ_OcFL)f7@AAm^#ln>~zRhEB51i>PZdty!*C-^vTXvTZ`wr9T|fj3OM%;;YtdwB}_n;NkwB$oKJm zAJ6l+`1ldSwkgUIIiJn&l|tt^-@Sj&@#!f^nzGC?UMCZ}-7Y^|ULu4bT`sYuv$mH_4o=3OeM~lZ4#!WJMvJTW0Dwl&e(;7kJ|_;@FuWz9XV05(G0J-*b^= znMSorr`beRWU{77y;fsv+i04`#B~V;fzfb?xMW!ffuWfp5sIdf&~-d_%F*!=H}x6`GmR+4$QTCp z&?bx`q%aJTC5f0EE3q(<1eRY+5p}=T7;q3f^Uaw0olV-`XXf+y0imY%m z9#cL&rS<6!^-6_quZJqj%;q8Gi*pP!jpuo&n#!{$PbjReP~6yH8U#r5Fhq*Uq%v8m zS2fE2ToTt4*pmsmX)^3BnL> zGG)EA$)MXMrYJar0iHWW6hx$$MCttxaJ?B9f4oAv|KUe`^Y}4g5YX=TY1ZplmPMhE z$Ma^4-6`Qbz@1FUWGx!4Ch267lxg6PM+iSW|22B{^eI+8&vm)XJc@|IkkN2JB4rTQ zb%ZD)zgDDt_BScRAYm9By?jaS>I(7r?Fq7?P`$haK_IRt@LiXzmBV!$eAh))RqE9W z8>KCfB+gDxS<2+m;}xXvOBF)a&8)v#|`%={TiBZaE#sPQ;K5YX>* iC~j_2IXyv@RsI8SWtFVinQu4%0000%C$T*j&zURVr~UBb_jwX0 z{POY@&%XSe&CO@*{{Dv3^D~})_LL-!*xGtduixkRiind^~kdvGRV^$k;E~Ts*O{#iQ|Nf zl;PEgv)%{VohHM}A)2nSy!IFs#;7o2G8yB}e6l1*s3=4hB`S&--%Lo898J@>n@qX7 z7!pM>nhr`SstpHS*QwVUIQ25_+(TwshUfaEaY}coOOnO7Q#wwc7n9XL$qK?o7^;VTU%PCh)!Z;)d z0@5@^e7HDg`N<9m8=tQ6=k7kiG(>K1KgTc(&;)TD;dve#>z|P2DH;%}kino&sbo^ARG81_7 zHaB_w`d4J9)nR96mu9EV`1%&pG6@$4_<>Itga}O#28v3<;k18&U9qw4GH0h3jBm!s z$?YwbnvFN}C=_(!L=h=TK`)T%DS^LWb$x}LoU&~prDSw@O}J1ryEWuLhld>eb%ZDg zoQh2pN0c3tz*QJVf&1}{UT=UVz_d$f0(4zKs&Ur4itfGjXW7D=MF!ugetkdn4#5rz?AoHCyH)Kv+pPTfGKYtikr z$?_6^wm{c4RBt*ZjAEp!uuc*bMWNlcD9e&o%cS3P$krEq9U5Acsk>>@f z>kd$8uq+cPRPuDq%}s=1NK{2(xeOVOwpr&TRaLN9Eb+%4x}hU94G~8XP18`8HCC&| z%U4Idy`125Y@B`%Z{qRelc$`XT~JpQNt!X*8Zx%4PMj>*>}?Ro3A(PM z2|-m==u%QQHR(FRpDj_oe!SP5UrcD4hT(9NAPC9x0x4ADbw;miBZWp;HKch#RaLxq zXN2!vvy2nO!@UQ5`^{Ix$qK5Hu{WjD>EgOBeYeNi$s15L27@8#I>GbC=%z(oG9DB5Fi!>{^noKFOHLE0Lon{z@j%8U?WyxURa`yI;^NR^0%W_78 zKAJSR{mwQj4P*ZrRaGg<3d1zfG?h)aN1A0Qx?tk@2qCarI>Pg3ygoX{6dD^F9WKW{ zEmKl83Vo*w3Y1mN;a|s?hD4VdTcZK-D#g1F`5$`!gtic*CW`<7002ovPDHLkV1l+L Bs8av{ diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_s.png deleted file mode 100644 index 5e0b35ab0a73752fab428d0ff6d37819c0e35a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmV;F18e+=P)6DA`@R{C z-tzR2%Eg-Xl)l{LR_mgstrz-h2OmKVSUD(W@7T z@p!~!a!u3J7)C?bZn4^5LpKdoRbyK=i$%;Lj!4r5o*!b_7G;@3qYgYSDl#Uh?Dk0N^AF4M^f zX<8^1<2WYqd_;pl*p_4-Pti5FZVSI<<2W8#ml%e?_dAqT&4ayn@mnFi-a1tUX;zS= z3UN9Z&}e~>5!XsGB*{2CJ*Fs1!Z7^*#1C-Y7LrEb`5vYr5JK|f zlOGrkPYK(7lv=QHZ<|*~e{g<2KuVXY%m{;!M8%{^A-%vysf4`9xVwIj{oQ?3qKM;| zH^31IsE+>WS-YNKYYsO_AY8U zXEvLV=NX-_!_D=OG)<6}h3~hy7{0;t1GLsC6>)uah73ZF29wjlYb{p_3OVt7oayGAs-CJ4I-VWV|Ho+U_2 q;y6BrVIpmps;o&=gsuzfD(64eAe66C4KL9E0000-l$H{&s*>6G(M2g@)JLQt<%s8y>7DY=azG$Gh-G^n{QahlQ{4iQoag87{8Xhf2x zs3^kB=MkEQozL@cug7}1q*5#rMG<|^V>}#kc6o^=CE_-YDViot$D!mnXu1wS6vtd# zUn32Jh40ht^=MWqlpKftmoMDi+JY=YH0yQNVMq{$`13iHa+xGeLD#vBV@%T|%`z(G zGESj@%;ng9@PJJmqYHsBayb&9<+_+sk|YUI*HLLo#c{ArlXA7nZmWgLGRn41rW67Y znuaj)d2G`}DTSTS({Npc5JXABYQ1K?* ze7(2FFRxy4<9Y15E~Qe5@nph}FJH1)F3C$tlq5KX0+wZQ@6H`$tQ7ZlcDNY~`0nXb zx>r}+^!se@>@f5^9zA^c|0E^hX2TzE-%{V&;?2fcE{9C)vBxQw&{atJ!2U9;4|xwL*bG5OAkjCCf6Fn+=gt zWJ;n}myGz{!wk#Mr(H0yPyzRzN{!ZZx7dOZ@Qc(k{NW!p@rQ|i?!e|I|c`hDbN zJjOOnHgU{X_wQ3FmALG731%}C&}y|PSQaWtSWKtnguo91mSIS%UPpG$&-wGyCmhS7 zSSVndCKKN$1`J(iG#ar8L)=mcm8KLe3(GX=jz+Aai2ne+yMhf7`*c?T0000<*{-po_03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00SjSL_t(I%O%I#QsM>x zfZ;zO34{bm0tmRv3Q-rjGg{l(x^BmteS-EG`WEf8wA1HkFM8R|)NQ-#tae0E@hl(^ zb07gideQIh6TbWYhvd9_0rQx>ckj5py5g+UK@dgW?C!Ei7M!17Fdh!cEiEyR=LDY5 zvllODG#W?`4-dTF*=1vW9W|@606yE=qGVYNMkA`F61Kg@Bn;`Col#g`rfJ*!{L_yd ze)xbi8Vs;Zliz;*1y$3DgHy)`FtL4?4T@Xkcy=eX-Ps+WV+oho--y%5)8{?aDPv^T0u!?==XX= z-7dc8p=vtb(-Ye}JBU#@!Llrxtrlx*Hil^;0^|MwS(Zu53YBV=)rL*r`D}ghB?Zf5 z$+B217D%Jv2-ovyA0MO068T(?X%vxB6sGf-$KfOM#ey&lDV0n7z5gfKY?hTqgS=%S z#c_-zE0|V+_R%3pvLLJJIKGc&82GM77(_^t$ivMIN;-`s%iNxvqNyt4a;3t_=_&1_ zL#9!LVOq?hDR#3-N)&lsucPW&rt>+frjg02$(UeNGTD+Di8z{M*Tjc-W@s9L@ZV+c%Juv0IO0#NToPCIl*zp$g)f( zqte>^oWOIbR;yHMHSW$Y=yo~?d*6JUlxsEGpFSa^QYdN`r{6=>bNHhns;-kW41CvR zdDX^w?9scvM$2l{TTP@_+uQv0$M57#lR~jbv0UbH>@dE&Wwl<%Gz}crCA+qURVdI~ j(s;GG$;r_nc|FH}FhOMwd42`000000NkvXXu0mjf6sWF( diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_c.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_c.png deleted file mode 100644 index 011a3f378771e37280fa7502e7fe32663eda6351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 919 zcmV;I18Dq-P)WFU8GbZ8()Nlj2>E@cM*00R3-L_t(I%LT#9ZsSw{ zfZ^ZA$M-nSrMdJrX@O}smC#5do`M}>$qTUL0g(_3W)>`vs)4H0%XFHyNt(ooW5>tG zcKANym*0NcwYnkWhZlwi1B796e|t~V3F&rvl)7L(U*ZQYqtS>>nsR-8gJnqugFeR3 zzy7#;|HC^>Y0_>sNj4crN5^=M%gw_rQ6pkDo04WJtyY9(SyXk+AHV;}^V18m)FrJb z;@?kK+^AcWQe0ks!Z4sW*yFG354fJoUcbxr)eV+qu}L=EUVXvwY-Fd?!m=&$Lh(9% zB?uar(qJ;3pbJe=XuO7tQi^t`#Wu@nMoogY$Kn1Va%b#VCkdr48SW2R#xW|+IT#$! zj6$Sb;@CE}<)C#zUGA_QNwF>HbXy2rmgu6y^&HAl)9ZEl=ItqlFj%ctNZUl1g7#j- zuC56pk3tu0GsSrPjF^0#aymN2^E`w!@dB5Z=ND$P8A>VgEN8RX@cF+ROxq+3LtM|p zwk7>x7jb@ZhAMKv;LV#ubfF2ukkQF8RasM4HGUA_I1X8wGn>rte3xAfp64S=t;zBf zAq*bJPvlw7YMBrOK1HF~)v!0P0Gl*P8SD>GDyP$r5JDiTT}7@GS(af5i!cl^ZNYk# z;Q0>CR>0$zXW~VS5Q6d7C#tH#3q9^`?-7%iDS_`(RTXKP5ieGFj*II$NLwOJNxL24 zxjtG|NK>Lz!6r#*wnD_w@gZ7i8bJdC@O>X$lsK+~+7>M17_Z@xt1atfO%V8WI&GG- zHJim2xn3r0^DXoFl2U83Ma;>!BkEm+0Vq{)_xT>jacG1APfyQS6C2mHIe0Tf=u#tu zq&MgwEy>`Zj}Qh*DdOb{wN*sTi2i<$y4ukn_BlR1gxX*>ogw4-nvWkp@NoA?S(RYy za9tk&l_~O6as1srak@aM0vVf3ALpp8rrU2Lzkh$hKYw2mMorGo-lDW(lP07|&dIxD tUS|u|>jXo<*~K}AfZpB|Dud~G&i}=KdeKlE`SJh&002ovPDHLkV1l`}pPK*x diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_d.png deleted file mode 100644 index 27ae650a7b808417a3bea2bd1627cd4f476c12e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop.png deleted file mode 100644 index fbc0dfdf8b5839eb3d3d96729bd2c6972cbbc96f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 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 M07*qoM6N<$f@_4Y0RR91 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished.png deleted file mode 100644 index 92e883c25558d8c66dfa4ab9cb580cee182c49cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 789 zcmV+w1M2*VP)sXd;+dp{T`;L>QDWx>4P&iUx#LJ->LM~8wSNP;M0Ldvp|WHfLOlQ_mY0ir;Q{O;{F(RJtG zpk$?Kn#<*qx2?oEN0KCpqVM}@6t-<^+4gq1d^YGKMcu5|%=fc2#Y7LEo{*xz*I#`J z0C10vjE=!5EsLT^GblmJwE71JSR?D@@}tWaV%tCfR*QwCAZ3}R+wB&~l4%$vV=6*r z&3F4<-87U^=b7{8Z@+4qc6NTASCv$AF3G5?5%2b0007rNklQfzZ{@bTNSU#Ek@coYggEUp=rn|bn zY}@YP;ZZAn+#S2F)0twNdGA9We){!yHdvcxigS*LBk`N{Go@s{m_6J-MsalW=6bVw z=FT^#CW)mVMuw(mA?p$MpZ8L#fYI&etu@vd8>atR{hoDD$O)wr3k~23u}!Z#!xWqOqOdXX3N32C>FzD=ktpem zZ1i4cv9YFYTjyNx&9`4CGNF_X&Z$&xH`}r-g8&9QSZj~_GSRV=Y8c$;J!K@EV{cf%5DlRxJ<$+yKH#9FqJ$(#V$C2Tft@LiVCoPUu+ zF)ILq`66eWEv^axiilNNV~1Iq6_<1G#$s7q-@PK90#LR;9MXwu>W1^c4rq|^fV;r8 z=kD&^?MOzc62{o`YTI{sv7E5|;qdcMzW@iFDr1e*aeG1`c)6?Z@BgMiVii#!K>)0007gNkl)+xu}G zyK8rIb3-Y8K39~m0Kz6o4u`{kpFUb+mCC#3@?7_X5dPE8zm!|${rcPQANGYx(!^PZ z32mh5og=HZQAR*Ki?BVNtPxrbt@yWD{_F)Jk2UgE_G+LmVz2%&;78jYd_B8 zw4k9M1S4I}xln1mkrF~kDK*xrL}G-|S6_Y+0DSo8BcW6Z-gSN5 z^~a}b^$sAi2B314Cb6}?x-^VobUL5Aeqb2Q(*z-mV`;RBBC*Yt(aWw-1e1N4XIY$V zq%js1#SVfH#~VtJHTrt(r4$Ilw(ZKYoQ?C&Hck6-sTpSkV>0x82*Em^#u6bMAj-2u zyY=*RqLlXi;Jt+imqqSYAR~?-1S(DRGAC(D8DF%uKJ?ci&-1!&(nJ!%Vi`H-%3>RD zBue6#aejAy|I&0?>p~>}fL*zD&W_XE4>N>dF_tklPvg3-q<%R^fE z0RZQ!a&GPW@pP)Ru`-gkhrL_Z#TcTsIqbHW^1D~J2!vzxj1aQUb0IKBWsxshLq?uX z6(M93F#;g^_1$|xaF!*H$0`!k2e?%!fWZ0nkH7vFoHB|(JM4yWIX!p(0~T{;c*pz= QAOHXW07*qoM6N<$f^*+XSO5S3 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_s.png deleted file mode 100644 index efcb46750b104f2c714f278330cb82a796999cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmV;^0xbQBP)>po#qnFG1>(}3d_c5a7YN^zsX&T0;vwG;;gpg9D zEUJ`H+gu(WKSQBZdpkR4SVpZiZF6m#Ta4H_$Ay$aA%tU?u9xFH+u0lP;ls}?E7t3+ z(L-~)dOs7wfFzbtH##oVG&y7Ld6vI^_~CXr!n^lBW{eo!0;JvUK}vy;ANr5`_BF{67lh$_tDn#jhc=!G%YxNv~98v^A znN*4ZX_^**aW1s!^PGQseyrTM)%XO&~ z0r0bvvNXE4T7ythYh#@4yC%pKRz z+kG!&A)XKPc)S2kQpmPB@3*gu!UDVdz8fAzB)|D^vvlIhV$b zDTbjvefMfV&HjGxtnC+z6{D={j?-wJ8(|!S(ZhPPlTyU!-8gPmudLPgp`n!2^=5Py zVOXuUK;k@Es!EX%c|QEbXtsZNYwms5-cF~NLRFi^ma)99mzT>4C!c4$UhL@M>F+O} zf2|k$w)yYr=}&+x#%Xk>ZLgQ}5o1C#?&n~18^aX*_&+uhf%p%h?Na~%002ovPDHLk FV1jp{R&M|R diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_v.png deleted file mode 100644 index 0cc3043f21e553b1c18d7c7abede06f705b2c618..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 737 zcmV<70v`Q|P)Dn_2Z81`4QVk*=9^sB~h29ow<&*plWw`1#YP>2ykkIG;|0 z^T+Ssl@Nq;tu^Dks_Wk`FL9bGrNSus=gSvTl;yX_M+9M2Rc+r>2r3tTrM|h3IQNN5Nx(v#uz~eLkJL>#qoB(UrZ*`ENhJE``#D> ztxc1pcMh3hn9pXfSF1^q4Aw?kBSO~8rL}f+&Uv3`4ZUx#*RrYvr3eB*84IO+-tQBw z1*MnEr8DN=-R^0-jg?YiD5ZRRe~%d(t;HWde83Qn-p5+cCX<&uFUqpITo&{BVm1Tb zo4O_lwO!Y=E%Tn#P4m~oLnwrnQgMDNiU9zMah~V3F*i}? diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick.png deleted file mode 100644 index b7bef50005fc21e7a39004da0ae3d11fe1906349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 995 zcmV<9104K`P)WFU8GbZ8()Nlj2>E@cM*00T!!L_t(I%RSFaZ`%X_ z!12F3+i~I~wv#w@Qu?5*6)TT+2*!39Y=?~t>rU`#KwP+Tu8^37gwQzc0z!=I%Agz7 zR;_ehmsh){Nu6gC$B7-s9FX{ZgP-ut-JinVXh=8?`1{dgLT^OYvd}XbF1>e=Nf_d~ zL+n9CuGHKpkU1N1^jhS2y@!8G}cKww3#YJ3qfMuFY!VrRh-|qiT)->t&`!pI2 z++L5%SFe&vr}^`bO=L-Cs%hIKHH}8SM(5OKc7B0Iy-rfou=06I2?$Z5QJM{#Zo7>dk7MTZcq5N!G|JK8A!lbjgo`(BhO+$M%MT{F zy)J|h*LAwKO)6_5MHJe$jTDJ691Ms=WAxiCv`hx^_UE7R#=`5Qbe)YmckmpClwpua zY8dGhb2Bqoxg2MGhp)f%FrYuCf!z$KiF@kbt7Cd1GfFt@z)|GU?2Gjs<`2~&uY zh;C*{=qX-oKSsRq=`G$`xj^9i)LShog#x;+W92OF{_rEJspWg;<^Nf4l$CZZChTRXuUc_g$XimIZ-V)(vK>-3b_r6r30?4rmD{{mF5k@wYK RaU=i$002ovPDHLkV1g_d!~6gM diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_c.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_c.png deleted file mode 100644 index d902c59829f859a718618328ddd4022786b09ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmV;v13~WFU8GbZ8()Nlj2>E@cM*00SaPL_t(I%O%ChZX0C) z!14b#^NnZscuAc&b(#c4f+`IZq26f4E#d$NP!HvRco1HIJ5mvxP{mTQygw)@U5SIsM)J^O`fwaR*Rjkk8TaGgAH9Fo&?EZgGO z=g)B*mrA9=>S~2T(L-Kcv^e~yfhrYLMP+@hidW1tpD(D_8@P_kpf}*A*QeX-^6;Y_ zeBUPuA}-F~Ad@&D?>T6iMiM6!N-o#eZG?bZt1G;!pP;A;#frz}Ws^aF$kd-=nKq_r zARg@B%Ph|#3S-9IF@|NL87hOD5&68sd>Y^sEKJ9Q6oPq3mSq^W&agX1KKbe~ick?k zVCp8VZku2_r&KEQ;>BOA*9`97eVf}GHC)$XH1aWYjU-KJ95s-wW|wZOhg+~oq6EV< zuq=y%gG2nW&)%bZEP@5o#e~z7V=@6Ve?}NaWPsATY;k9+hH088QbpAiPL5A`bACw_ z#`JrArqd}WjZ@T|itD;4s!9|^*p7jC^!bC#Fm*DZT=BT+42Z)eQd8--M+gD7XR}Na z5RfJ*PQhl>onRL&)m z+HFdO60YYUTkQ_*b{k#Sk&5KK`|omcddkbgSL6#0Qc8~geF-8%C<;c-WHOnMW*LV^ zb!5BU#ZjJY3ht6Ih_T3o&EFdqfTPd@z^UDrV<#Bs!MFl2Lc zi!@vE$M1hqES8Xp%If_JcQ!YeOeW~6fw!OM=bwHtD2Y=Ub@(zw;Q$K8=C;~a`k62kNF&$6QG?m%hCkz6@MTAr(gPS4S zJDX%=*p5Y-rktO>X3!f_UMnE>zkHbWntc>a!Oc5FafI!f%>58u*BJK37?y!hz;ym! gRTWqYE{>c02ifCjB1u^<2d03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00SmTL_t(I%LTzXZzE*@ zfZ=yekH<$GACYqqayf|z%Z(^$s1Q(6AWD9~(oygWprxSNhJpel8j3AoQG~RjK-&-& zlHHIv@tMT-*q+04eBa0OXkUK*sajuqfglKY@ZFEJc3A|5tki2L6opcWX0ypx zUw^}Lt-@>fUc%5MM@L7PXU{wQ_4GgL)e3nhhiRJJ42G1-B`&Wz7^a0cJ7+ZZh_j5t z);3B?ZoL`5{PsJ#VHzxzON_=IX_|4++5+7m3L^@x!+1PlGVxF%MGC=1yUX2Zj5nJz zoBL?3t){A#3p5&4Ceu07d5CQpIJSwDAOTHEbVFzEN2Eex+a``>5=05+7xzCSh$7~G z$ZE66-R&*C{(!ve^21LLIo#i-wYNjHQl?(75(FW>?-K+8!<#YYug8zcgv8C+wA&q| zl*CEG&DjMx+v2S^Ugh$#O~J8v`p+}+j?H8`Bk)6}vpIUDQb9veEEcd#oxu0$4{lIO zqG=l4ZjXAsPLyPbEM+qB==X;tSw@;9Xm1{Et3@1BE*2=dIpQ>99z>LjE{TwgMpGKK zC4z8)6asV|*R~J}Ohd!`uB7!f5LAPHT_(Y{qq`hizGm#$!BhhHY7B!20?sX(~87 zJ;SzbbkFn1J30Ej9=;#YzUmT2F~gf%qA*}GnUZFLC{9plWSK%K#Ucvn_6BHg-`i1( zI7KOirt6r7L6W3crj8%QESC#dra>kYizGz|K|W`pq{Q<>%#S{JkM-3x{4fBK(Z25C zIC-kI8jl_wBcxz^Ym>dbU0f%}V9>*MTx6Q?^TT7zlao{ad~(A6&L*ASfMUT#NX2z` zz};xfD=!~17~V1QX1K14$TAv@8h`)$j75@QCTT{qQN^%wY^<-5B{A)*4q+4%#Tl7| zVj)kxw#*`qNl`pMzaWki3V9pt{dZqi{W}lGG+0_H(diAzI~GD|R4ZlBAQO`DXo{1w kuq}htW&=N1aC&~t|A6SI7+j#oivR!s07*qoM6N<$fWFU8GbZ8()Nlj2>E@cM*00SFIL_t(I%Pr7JYa~?w z!14d9dbM<=_iWwCOvbE21_uv=h#+{@qab+p8wh>|4<5XD8t~*r6c7>%y5 zg@tq-9{%(#E7gGggS&Wcgr2!~$pA4a1AiHcavr^IoD zQVZ_C_6Eyk#MNkk5CY4u1Wa$nBuR`dZ5+pA8eTIEZ!ku%Sj;h{p)3JlF%P+(jL0%Y zqL+xRTgPR+-of=MEM`|IwZL&)gz)fu4@8Mh6rNutOBJTbkkX~u?vlhI;^R-gD)Tf& zsR*Saq^z)9hNwjI>o4EYYHx7w-hE<~vAcUffAE5x+qaOm z6(*A*iPl^^KPO2tYPA}+l>eUyPw{{vL4aXptGfB2F+xA*CEJ6N`ZZMhUC;qdSn=}10*@F^Re+wAP@ zvA+HmwQ3W2e)bGw3~8##GtKJy8aLsTB3FP#z24;M(?3y4fn~G3wZ&vSV!4=6B9K84 zFqvGD=NYzixSouNRYJSfz?729%N|*#DT<6Zy5VX(qSM)-60DHK5#pu2*GtH;EeE9+ zv>O|wd4gp*M9UeL?INXv>pIxBg-$i50MDxc8S?FS-lf%E#j-4nfhby#CK2I$&XdQF zXtvg9x7VoEYV7SFVF|%t*vE4N9{&6_^4ZA~eBb5H?#o2W8DV&h)(O(GNwuQgYLjIN zN#gR?<4072D#jSb;~rV6kd?s47{T+u&v2y6>PDAYIN@^eFSFU0Wi)4Va|_4uXf#?3 zhduH%CeI2Q%?{$==*?0mGaAh<)9{jNt%+s17?Yxt80knnFF*(z>H6eZK^#pnMM{xt Z{sY%5lPcaS_VoY&002ovPDHLkV1i2*y%qof diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_v.png deleted file mode 100644 index 2ec343f2ba8e793289bafdf687b85b4b39219e7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmV;v13~03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00SaPL_t(I%Pr8)PTO_> z!11r`pX0yzW1OT={uL;s?7*e!q3Rp#v_rc|dw{;c9;26Tr%AoEN2DDl-e89brmCWX zY86`-Ay^VZi0#BqY>fZxvd<%Yq+edWD%({KTu9BA}%dHmed-t$yn~J6} z4MTo>^Mf zo;`U&nx=Hm&*={a2t}3&rc=T&Br6K)rpXj2vJA^G_`BOh6#@aIY08&w7t=8K_xhTu zZ6iI~-Yy-}q%2DmRpn+f!8Qz%BtcRX^h$*^O_{|pZoQ6HsW2FiX*U{7;u!J6%a??c z32~O8C<+xtVU{GMS;qds0iCTa+(v^%*X7~%HiaaSXBklx@!{h~#GhwpT>Cyt%_d{t z2S8R7hNBU6(`0XVm*HrHB+DG1oKUY;83zGz95at&gsSUUnnqC+ScZX+Wrn_w7X-|c zgwc46R;duiF+!5K8V(tH9=fKHr76!7@z@ zA-D-cq_V^`P3|u&AijU`0#nzC=W~vZj)?Od%eHyc>5!!<~_;EL5wAKi54sD?q^wiyQj#{V}rzK;+Br&eR0B;3yDG#!UvIz{^C@#Avf`>2Wn zl7uWtNQ%OOX>t_=EIAHkSrR1)X;DxX1>`wP%_aliM|}JIIhv|s**0+$anbA1a2zVC z%C83pH0pIWHaF2VjkV=ve9t4A&1kh+yxreNoP7F(Wm&kj8XrziX}c~_6fwBICb_*u z5rWgtpXqFD@FmOeJP+4#I66Ki%X4IZGQrX`lDj(|K6t=lt3~hXipzeVK@i}$E?@2J zAW0IT=RuZn+3RsN8nNQKNZ&nuT3(DsRCOKOG_f>|vF~#SsEUHBs)TV&vsR2jM!007`UU|~4~ zLY9S;2+OJuInyI<(&?nr_F?)K?IX4`{gW$lmuH8ns&$=g*H7mc7u2#Ai^bt^a9b^6kVBG`MS%bi zoNHxXw0xhKP9;QLRfLdP97Cl{gHTH6vl)VbQd)9u+4g3$MSc)K2xp(Bf{RK@DeEjv zgb=&Ub`gL1`OTZ**{H}e-}BS$E;#8R+p&3B4#(%`mlqh}@zpgiM3SZkr9b`hYhH3G z<#;jyKs}3|LjdsYZ@+80UR8B)a$-=EWm%(?L5SexZoNM8vfb@A3YbLSZnkx!G%2M) z2!t?>W0odLDL)7{%Vn=062n|SJ&8EZ8Kbt7?DySX4^Ljb>h%Z1C~{k_;QUyYCCjmf zea{aE18Uh%%jNgCKSI@Dgp^X6P7KD_X0su>=DF@s2$PUwEw{UE-87u@Zm;|AKYv@6 zb#Zk?Db=Kunoio5efRFIQjKLhX`b7@pJ$90LetRd;ei;2rt9;EufFRb06;vQ-o1N! z6vA%@l{k*CuQ5W;MeBZ-fbshA(RLhSkfu?2 zo`XgXmw-7viW@E;d~ z9S#Vn{@LirOQh)rAppW&7?$jirRnYK*Hu$W_0000kvQv$GNY7gts@Bg-2p-{oliFZzNS1~tsnN=1NGtBUImw&r^pyh64D!edjIe) zLI{uV@4L6XF&1K=wH}TJ7~`TW@}aDohC~>z?F~Y>xLZ_pt?Pa{UlwIfNX3#Qq0Cwn zTud0zof(Y>XgrxX<5SL@v(xE#{rMRp*fb4EFv4g!DPst-c@1{jsVljFGd>T6_MeM9!tmobxe+<^2K;Cqu0@0C2Usx5nmq{`mCZT?jr1DH&tx z)}M|iF47o4(_DzNwu4a!@pZfFRo_&tl)@Mr1DMPy0LiVr&F|(~_tV+fdWWX-sn%L4 zMG?*O94F|~v|O-aAiuuu>vN3|+P>|)_dF9yDg5KFYc9BRPWMJ#6(s}$$OI#Zq$y)b zYP7=`0SH3yTnI!db=qYzg8&F2tZ^)5x-(T>^NjbpyR;W6#b`AAIGtbq-jGYxCXDvl zIBV6pe)|3~L=OSb+H79_V~l0F-0k-CnB)VQuW~e=j1a=p`G`<5U(OJMTI;%Mbf?Rr zoZU@>kF&+>;rSi}h!G;yw|cS|U7IVV*g9=Ap_qE?)vbH}^cX>unIME5w#UBHKde5H z#dq_=_J}AN6s5MBGIDD>A-PiB`{4s3ATkkxnJ&h_!@vIg@;}R!XaZ?1Ccgjx002ov JPDHLkV1m*hRiOX? diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_d.png deleted file mode 100644 index a82386bc508e98a82b9a9aa0ae0051fba432b9fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0x!{(7ywW#9{~^| zC{iRP%XR8F&SabE33`M6?fE;kvq+*WaTPZJB=R2q_n*JFSvCygt?QCa3?3BM5&#@> zQp#~HK&jw- z)RutfGvJ(0lXeIbf|V4;F68lH?-2g)|5xxlDR^DCMcp2b`7&EXU~wplqfiCL%=x7h zoYCj^`(d1f2hKT!5T#@sCeGRZZre7^ewP|EM`7TQ!w6}uNfbpGxgc11K#ZQ6rj=3< zjH{|n({#{wwx%qr>!o0vF^@vu_0BnC=P;0jP=`spR+C*$$CKxIZF`$%g9%NO*e)mt z0)jD$LN$$p3PX?aaWZChZF7s`xG2g{NdOi|-&&g{8>JMiq>nJ(?snI*w#FopLI`E) z=2{e8KQP8HMx!=9XG7mH#^|S~eH=$`=eJ>;n&##lDyy0SDXSI$eBWQ36G9-j7(HEz z3b^op9!`sMgiy};FpiS5Lw?z&8|HzrPHR)u^-2mi&u!P!&mZ6IvWyVIfD~0NIA2H6 z`#&GbvNU#HM{A&@?>mQxF*Z$N;^z6~`_D+NZe71kqHVT82%YoX+NEu~()r} z_{D%AjPLh%NfIY%nxC&m8;snyFQ1+s-@SZ4{syy;S`tdAV6adif+qYNA zvSVp%r^X>OFDWL#D^>6d6yL$0Q^Ah4x73n);T-zc-~SxT)BXP8x1f|@Kv8HZMO}Xa z1%{Ys`8f8-)#98F0lThFB&O&oB_=a@erTG;`yjX&`Zf`gVlY{e5*fFSQi@8Ow!U*A zv%Hw+$#0=;+Oj%3=ae>-03kGnwXT~O*O(%^zPz0--^%hl*`cW)-fxU?V2KNKi&HvZ zS2s@*TWoBEC@ zwbl$7qTpNtNuZ5J006XOPXWs6V(swq@_KwKcX`eL{N{|=O|~EUp1uF}$2_~3qTe>H z4W(%uJMVql-1hrYnQXEhq3E2`S_>f%0HuU=T~Z1$`VbN!QEOck&mpd93lx~&=4J6p zsYECmV?IA`-fz2NKigrN-SKH36Fwd{LZXz?+K~cYE->hr^L0@4Eli zWk$|n+rngrvbq?fWAtuWs^gb=w&Tzsvi-hV+)OAOk7rc)7;l(eZIa5 zF037Hw||j~syZp9ce|&)@1tK4@$htFKi>az^H5gLP4gfr#smz2bCG2R1t%#1W5}gj e7Qbyn|M(w2X<*wt`X}iC0000FfP)eJw z`zOnQU|d#}F-A-2riq84nitKzAL2!I~(@McGj!Ug2V}#Ov7!X3k zFg)$|eh`?dGREAk*PQdev+Vt5Q`R+3;<#zsqOOaoij3lAX3AOeyCf^<(v$r>6j87?{6ewLNMJUaS!dXiID1d1i4iHG0 zZnrQx_c2Y|u6uZRcs(3Wm&-ay{>yW%HN$we_EMH{7y`iS@%Zog3|-SC%ViXXr7@$m zp%BFLzJB@g=wEzGB07*qo IM6N<$f>;Gs8UO$Q diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile.png deleted file mode 100644 index 9a3c34c55c3e21c8d4b23aed2914f8b65033408e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 956 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 D8PTE} diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_s.png deleted file mode 100644 index 579f4ed6072aece9c5ede1614d198b808d347552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 913 zcmV;C18)3@P)WFU8GbZ8()Nlj2>E@cM*00Q+%L_t(I%O%pgZX8tr zfZ>16Idi|QHx6Dy1cJh{M5IU*^iUx|M*}6VfW({dM06oVh;i(Aon7Ntwqx&QW_CUI zIWrV~g1`8F^|K`8UkgR#8F6=WtgT*S(Lmz zd5u~w7rcA-2Hkb^J?xBk2!atwk}y3x=Et9Y=GDu;7=R!M@%)HkfHYY$ogSn7AmIIU zfoa+JK}1;=bgd>$Qij2x$O|0T!$1HAy>3{q6Z*cP?Fv*?JTUq6D_qxQwfso3Ug0<{ zQrfg_K@fVhU5oF>R8>xy=GeB)CwpIVe|Lj8IQ$yRloWZ25CfCRGd#})I;wKRVzD9$ zBi5@0rn1QM4W=pCWD5oa$}$z%W{s&F9LLADEevBI&mRDTC>*o6zvkfZIc2e-A3*D# zrfn$79Cb0DGxP$fOuQgK3Q3Zr2w`GcF4;Dvs%!qcm=ecN2*VJqTl#*$aeUPD?1am! z_eeuwdl7Y!QPm}m6H?bXO}*vj`iiD0xK-B-eS_nTNY}S$4eG@=-*RyH0?W3rEt@Fx z$%~xLX2Y9*{zgj4FTehVG8OC95-DwlVZgK`Z~uLblEUQj@|dQnkfuo~W2q7uU65Tb_b%*0PoSqz^g3zO?3c9W(jAF`sOHo#gcVdLJxV^n)wY7cl?y5E=iIlN=f2)m%1v!5RAur2-(v%B`OGA1|%2rGfZW%|LhBjhYeY} zCd(Fdx_c~}HgUYea(Rz2bl8?dJer{9vvW?4UlNb@Nt2JvW~T^Y(f18Ou*35HirMTO n!;mP;p=&iop3>_E-PQaL&v=c-oKH%y00000NkvXXu0mjfVP2o8 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_v.png deleted file mode 100644 index a505e4776e0b0bd3a1d1363307d73f296159ad6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_d.png deleted file mode 100644 index f39da4ec9e55e3974aaefe19e63d9f984e502322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 990 zcmV<410np0P)WFU8GbZ8()Nlj2>E@cM*00TlvL_t(I%LTzpY};f2 z!12GG&vs%bjnh2WZ9K*vY|{>i1BbC4fFj@ocQ%kXA-I4zO~8Q*LenIqNeB?29oPkN zM5qT2z$65NYF(i%?X<0FOO{uYIF4icvmNvMDeu4YYI<vq_@ z)8zEYqgaIkjYfmrohFftunJgSN=da`0yTp_^)a(L`mTkM;+JW-U;=?~HM z3~IaE#c?O-85MszMLGU3uPtpNLy4hlR4P?u81TWTtFV(&tCT1f^As!-DI?T!xr#zc zK5wB3mDk@}Vmx-ayS;;=C=3RDDwPVpjCuRUF2mu7{r&*m&=Hvo;`cw6`DgtOb9sxr zX%I#+uIFPHEPnp(4brV9=f3|7ZyGR55>Qo4U1RsZ4rb0koH>1*C!aV)7z7+Uagx!< z;r{kEje4DQs|h=D?eZd~q0<|=)M`~~l@eb+ zcZ77S$;fe#aZD5^_+f}}J&#(o%GCE^mhj4zWh`?8+qOAz^h1!{kpKVy M07*qoM6N<$g60yt!vFvP diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_s.png deleted file mode 100644 index 35ffd3534c2f1a6ec4cae86bc81133773c813287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 970 zcmV;*12z1KP)>nnY8wCm03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00S;bL_t(I%O%abiyU%A2sQDQ_ekis+vR)P=}!A4P$fCwpKp$HZSVj-eL5Q&wKDwsk$ zyMTqU3W`D9++8la7tdpJ-tB8RC(jBT$3hw!qUNyI z+h%cT4MWorrli^M2!a49ZQ>~A_SP-La5!LR=MT!FpsHY@y@2bsm`o<@-sy1uxtI9$ z<_#3!x*krwfl}a4hV1Tk(Ce;?KOXSG)88UZK^#Z;lM()8j8Ym=7-88Cj_m>(RhjYp z(kJA3OkPBYB$~6jev&V@HmS;r$#{fi*%(HRJdbcahrGzC*PA3sNbHAP3*X|z!;f)% zbRYfH=_fFyK@|Gvy5i#5ANc5*t3W{#PZ!0)LBVQ4QQ=~MQ1_Km2x+w+0 zbWB--Wz{)SaQU~lDT)lxXn1XkqGTukm`5MfXt&oXONf((Yrn zB#L5s-5sQ96U=;)H0AGmyIdZ>i|2WiWlmKoEUS*#y|cysK^H?4)SL!s6p*AbUSo-` zU%O7XulTh8ELj$DDEg=>!*W{q<3q|4#F?{Caq9FL%$iBftkLl5gi*+JI;GoJ94UDD zl?w|Y+Mh&GD(logJ*DZvhOZN9WWLb(~Xb2%GOGR14{J3+DH!fU)Qqk%BP8`RS zMMjzySeC{1)}QFE=a3{3S(YHA$@}N7;QJ$_l<0=Z;o%{_{Cu5hFk)l<3+CaR2NsuE zTwcSrUG$@)A-bk;YzKcbpxalx_~bRDX_KWPQdn4alg*89Ska)_Y%!Znna={sDn^t= zLfvhk>pC^d;roM2s48bRpW!vyxSmUrglzuwI;~b4DI`H~M3%-RNs6APB~duzh2_t1 z9Gj{tNYa$W_7YhdGnot#!l2n)Bu!$_bk0Bi9lBAGXEDO{Y!n7pyKf?e$=X9Fh~`rQ ze@qYzD9YmhS=MMa7Z?tYx$)0MYNkcAwTjs5-DRtDlV)oTfATNA-Zr{!QdJqQyTI`H sfL`w|nr0wOiy|+HLZ7P4D2tT;09_KBJuGtTrvLx|07*qoM6N<$g7?(E8~^|S diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_v.png deleted file mode 100644 index 94ff2d3bf862d24dc12be2d81ff3963a880c93b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmV;;12X)HP)H#;g9QKp03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00S{eL_t(I%LTzpXdGn# z!14cl^UZwo*x608+w6w4-9S>3OGFThAb9fByLj;CK@Wl_3q90R5v9FUP=w;qn>~3E z3X!5E*k~neEyt^ zW|KIMnXgtce4ps(h+kJ$5K;*IAmHweD&r&}9gk7AjSzyIQk<)hlMEr^$OBpZ>GTwQ?D< z3^83S62&o{ZkJ9F@cr`Jd{bN^({+a9F-j?tEaTDp@A1{#64EreIy*~$G(r~wVVEXk z;98}Ek`nE$MeekBNt1+v z5d5{Vfn^v(QG_y0!Z_xB77=!Obi$Cl=V9qO^7p4tdGhQTQV5E<9FF6V0@q6=e!lYs z*^51XSY5?+9Be6Rg&|s&;W!S}nHjX7?%m5A%OZ{<<`);Kot{!}G^otZ@`2xnAmj0@ ziIkGK-=|P0APs}l<758a*+Ir(NWIZO>N@pilUBRUXgH+h`>fRKys^AY+Jw!W9g;L< zrd-C9l8*1QcYKU+J&!a=*gH62cYmL+i%TR~M%(xC!w^GC*4Ecimc@^se2k{+bbCEY zlapwGux*>8vooY=VmS`vH6DKSA?2wlYONNPN`)KMD&Nk&N%mq7|MHT4zmJfTL7F1t z(TJIH8P{=$qlnKo|E5$w#xxABU%5h(B#hIP+s$oqT^lXSh=xP_Aiy#Vga#O<$?b^> zwMK)9Tn@`H==FN^2Lp}{4>>+Nqu{!@o`>T&Jeq$8-82~|39{X4;VQ+$UYmuvIVSRX zPHHv$%S#%*Pjz8|A&`#8gs)#?3c+3ffNmUfwOB-k-7deZtl(J|Imf|Oigu^N2q<|T vTie_Gv9?AjpC?Tca+Zaq6t!lP-f+nOs%UgoFEF@G00000NkvXXu0mjfo!Z8C diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/empty.png b/src/main/resources/assets/bloodmagic/textures/blocks/empty.png deleted file mode 100644 index 5ac033976cede1000103e6cca70f4a6618f477e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 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 Zs6qXh1?e*)hHJp#>1!Kn)oMCJ{|C}6`_%vd diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceFlowing.png.mcmeta b/src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceFlowing.png.mcmeta deleted file mode 100644 index 8e55e43b..00000000 --- a/src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceFlowing.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "animation": { - "frametime": 3 - } -} diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceStill.png b/src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceStill.png deleted file mode 100644 index add7bf54b2b57331cade594d3217db037e3a563c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7568 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceStill.png.mcmeta b/src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceStill.png.mcmeta deleted file mode 100644 index 7ceb3639..00000000 --- a/src/main/resources/assets/bloodmagic/textures/blocks/lifeEssenceStill.png.mcmeta +++ /dev/null @@ -1,45 +0,0 @@ -{ - "animation": { - "frametime": 2, - "frames": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 18, - 17, - 16, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/textures/entities/bloodElytra.png b/src/main/resources/assets/bloodmagic/textures/entities/bloodElytra.png deleted file mode 100644 index 681994c42ae9838ef3d969827707346440e663c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3225 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 LNkvXXu0mjfx4s^A diff --git a/src/main/resources/assets/bloodmagic/textures/entities/defaultCrystalLayer.png b/src/main/resources/assets/bloodmagic/textures/entities/defaultCrystalLayer.png deleted file mode 100644 index 5f2cc19c4a9dfbbd91cc51489e778f463e2121dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7231 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 N002ovPDHLkV1jpX2W0sKis zK~y-)y^~Ey({UKbKfnK8{QtLPn{Ej?4JV~RvMF z23bpI$gk&FURvhE*k@I!Pi?etcehu*B{S%)E!gXhG8>OE9*z(mA0wB`5gZ&=n=Tk~ zD5<{{;Pul<4mrwsV5*>RVglV_MK^TJlhgR#hqdJqvrgdRi5%Om?_aiCA`RF;c8ZV(x5mYZ(3bnPmW&ayJe z_XecD^`P_^N`B7$I^wuqiuu4{EUS5f9yiHz5!x1nc5F5q9#1Lp zc$_yQp9)jZG>zC|8rGoWyPGM04MnxpSj;ATRh4AZSy0;6LAvVPDNT~V-_^{$^MiC- z4ODdnGjsFUZ3e-iErRsBh8#)~IYkI3k-c6Xz8m?sDF63w`~ly@+&}LxgG~Sc002ov JPDHLkV1g9j4iW$W diff --git a/src/main/resources/assets/bloodmagic/textures/entities/explosionProjectile.png b/src/main/resources/assets/bloodmagic/textures/entities/explosionProjectile.png deleted file mode 100644 index 94323bc45b60666f2ac217d2d6efb559514e712a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1463 zcmbVMeNYs27(PEjf^?L`FDloQ95MEG_r7=GVBq!+E;zsghZ{v@Z})fH3b%XgE#AQ& zG|8v~Qfda+3{9C?CL=0iW*teUK&4m$OO(s$|TBT5<;izd66&pSmQB>-6(!#e2f-95;&zAbHD>J>e)^GL*a_as^gO3ROn(bcGvmqJ=cbr4t3iGK3PN^niA%U|NOi zU~zqSQ>EAFbt*@gXDYl-L*goZj_qW~z87Yca3EL;V7E?(rlF5UwfjnK+MmScFIHzAav@e7kc zU^fHCEbwk|TjvK>MQ&N-S$)$yv*}9RrCV*gJ~=el=0fkp zX7#2YU2-gUU3TK)A+5HvKRW&NjMVez-+UwK(Mvxsnn$H}cc<(usX4oEbM5v-))#ct zk37?-&OaH4wYAN;a3JlS2SfIi7e-bzJ^y!AgD(&zs?-3Oi67X6#Kgpnj#Y-P8}Am za)Z}$t~rW>z_y$Bu600#o(Xj7?A6c(1E(fe)*Bq1FaW}iAc*ad-ZF}77RmojeSvZ{qg4- ze!HL5gCFd?$JFoKdLW|4Tr;qOY;3GOlBhhn!Rea6X}FjnD=rStTXXJ6aGi11-I)8Q z3TG@#sObJYP_(^&*mm$n%!yZ;GsT`*V8&1-CY2w-{QccMQxO&20(( exbY`sT7=AVX{d6qY+HBeS86fkkge&(TmAuXxFz@i diff --git a/src/main/resources/assets/bloodmagic/textures/entities/fireProjectile.png b/src/main/resources/assets/bloodmagic/textures/entities/fireProjectile.png deleted file mode 100644 index ca9d61e0b116e830e3ed12fa4d59e1b4880be3a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmbVMeM}p57(V1f1V&J%k!iByh(V^;yXyz-opf8LCKALwMX$dU!+)3&@gcuO;`x3Xb39V5)LwKJy2jTsN(}>WbV=+ z0`r_1*=ca%&Y%tW`LY%XRJFLO*_L{imPCd3+l~ z;3X5K-i$0e<#ATRHcHazTQD1~M!0 zL4_9saGa6xicN|cQ9WJ0f)I2%SBV4iN}$w`VPPhS5gHs5g!sLdtYyUw{&izbYq`2P z2rxI0#U_bW^WiHGMJ1yZ-Qqnyvbfn+G)~+n@l)C*!3ntk6WxpTPaSGw5eE| zz&Zl5!UR~5(B@U`6|C`rSjr{=MiHfIQEW(5L8V_*MAdr(;kZ$>~v?)ay}(WppTKG!P_Uf$A5Itl+u-8#+vN z3X9jtf9fW&r50m+y4nTmVzrMzKy4mL?GnEKuWJyL)ajrt)#35eRWEE$w&dKuH;>Ou zWkz!>`PS%1#YIBO;f3-7&)C`5JTwwHFl6m>$4bwoS~A;4Y9e10rBu<@_9N@bxf2tO z!?pS|A8k~&6f=qrWddMsrm6hBs*9>e#4%2v~cUT!Lo7GRNngC z*=J5x%)a{5ans??AFpYQ8r%D?e739S+it7t;&t8RosRn%8OM7?I=aKvQ&aflhqJ$L zJdrV07c<}&FW)PHxg<9h(e}3QfTyP4NFJ))^X}cY_4_08^hCb*vC=nNFFbN=w=2Bq z%Z}SMwu1xdr<;ZW-9G)q2T$#J<)kBfaT3IS&FTAU{KkCN!mWx;vC7)fg_mwSj`sEt z*)veZ%dK-+{yR^PbWZwmPCfknCrbXYKXNxjhfz9K{;6#+ZT7uKyQi)e9cmePeQ5gp zq0s0zyNJ*^-`2OD+dKTusk@zdqbc=Yj}-O|rcSut&h!Pf>Du{-{(R~{C~YFW+fj3= zr>(C`$;yqT{j$5iV?vm?b^Rgu=9!<7=*=G%w;xP`-p})2os29*;=e(M-9>+F-52=> D*oFF@ diff --git a/src/main/resources/assets/bloodmagic/textures/entities/holyProjectile.png b/src/main/resources/assets/bloodmagic/textures/entities/holyProjectile.png deleted file mode 100644 index 52fb9ad375e27326ac2ec4fafcb3a230f44225d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 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 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/nodeBeam.png b/src/main/resources/assets/bloodmagic/textures/entities/nodeBeam.png deleted file mode 100644 index 67545b45f2da1d7479e754c875c9e481b6d6eb92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 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 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/soulArrow.png b/src/main/resources/assets/bloodmagic/textures/entities/soulArrow.png deleted file mode 100644 index 10830442e6c1bda900dd0e46bca2bd443eb105d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 772 zcmV+f1N;1mP)`VUGSsA9+A<>=9sChSUJ7y>BzYW(=-R<8e}Mi29TNNj z^N@`qLOhx5kV%cutPVDpIX#z$*Ne}O@8`oR zYz=hLSb+;Ux#;!0U{DYzOAWNCQX}U~K3jr-kkf@&gCEuE*yNxa)AOHERc<6DKLy_S zm?7&Jj(nF$x4J?qhcRXWX0g?yXFvr2IG6jDGBPqC%Q7TMf<~jk_SP1nkuW0RFyx&b zaLysiGUohKn2{scAcAM=6Xg68Y}whjX8}R2)#IjlmP)ReP;jaNkDs~~mEnnBq`_%F zqC^nP#~JVJizx$wv>;OHbqjRa*^1$5`FZqgDTp*v7As(x$V^wk8*2$_@7_Zyga7)F z7DP&!fV3b|&wz@hLV^Q;TB~Ok;}246^(ZqZi&24CWm6}%4(Y8dblXQiiaPxQ@r7O>VZVS_b;OVLf|I=^c3#JRMV6I0000 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/soulArrow_corrosive.png b/src/main/resources/assets/bloodmagic/textures/entities/soulArrow_corrosive.png deleted file mode 100644 index b636b2a3bd9f7494d6d43ae6e43765ac02cf27a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 783 zcmV+q1MvKbP)#& zgA&V&KnZEI8~e~G91D{65!n)*S++sMbooIxUVZm^x(c$ZcXJ^ScC2-G62AVoEM}}C?E&|c%Fw+sYH0;7nUO;L~$9y zq5zKLAP52`K8|CKMiHiY^m<=mKF`R$TddIw7|b0IraV-3t`ORSJ!tJ5mz0J}x(s^s z{w0VAOXUW}wS9=`1=9JTi%wnBpm6(6$#6x%Fj*&gES@p2y-WqwIvJd?rodqCKq`a# zbKrw6N|^v3bWyi;6HA2z2LSSH4XeC3P4a9FOIZq10be1I@*-Rlh*xaB<)aJLa!R^@ zu2w1ODb524DsJc0(2|rOihTk2wW@ z!vWx3q#yll#VjeE@L%|8lZT$Q9Ey38N*2(TM5yk%dIcN+1}sIZ8snT)__6)@aCk>B z>klP=7@4cu;qZ>YT-A=_`r5cIE|Rz6!LAmHH$18uNCbRsBl<4{egnDr8qYOJe+~cu N002ovPDHLkV1hmrS9SmZ diff --git a/src/main/resources/assets/bloodmagic/textures/entities/soulArrow_destructive.png b/src/main/resources/assets/bloodmagic/textures/entities/soulArrow_destructive.png deleted file mode 100644 index 42a19c2aa7414229b5d258f448b22d452223f407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 771 zcmV+e1N{7nP)zvrUNjfwT*DiSlY+9I?+MyWv(#vVi{P>C$9)EiQ1iO`!p#V9Bf zLGGZ3p>LKIEJB1H0*4j`GxIjI=2odwnv{P~@72>oMXaZ7dAA-sPe1ta}u4?1(mmSyLgkcYnml2M=zQ?c{I{ zHIHs1Q+gJzj6L9{p=Q=yEs9zIoxN0#cBc*ike~jXjYcCBMZx0YB9fDnF*m;eRb7R; zvV!F$1%e5N=JwXF@tseUfC?t|H~2aO#gVU^)# zUJ|?AJz!>Z)m$dw-e6Q2NH7FkTvK`wsato44KLf!&!0W>cvM|aW=g@~L>*p5TY_p^ z8{!$l?}Z`Y;+|bK@t}K+E{{sgAQOWzKF)l;`mpyLy{4=p1MwPX# zkUefx*0!Rcs)1rIprEROw17usLM`CyKcfFazz_2u6Tfh37{vep002ovPDHLkV1ii= BPdoqs diff --git a/src/main/resources/assets/bloodmagic/textures/entities/soulArrow_steadfast.png b/src/main/resources/assets/bloodmagic/textures/entities/soulArrow_steadfast.png deleted file mode 100644 index 9e234d8782f15731e8b7aaa42c80781195012e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 783 zcmV+q1MvKbP)3AJHU%CF4UJGL?&nb*n;7bVb=Zu;>~kdNB?~{y z;*Z2)cbl6IKAoe8su!8byc+wdG064a-j|4%0BuQ|)-H3{cg45-Mcf|*v&x>D@ z2OP&ik|Y?%zQ8oMg5@78c-tXjsanNm8e07}z(?*$M)fI?_GjiGCAA98FJ8)OLreDr zeS7u^j0k4^cE;7WDyjf4h(7jO5hnSlC(+4){6)VGrSkfj}vDwuH{a6_8(l zK_HZ`DyHSvE__zK2gZTqsY_&5KV~7RK)$VvMl2sOt}-FBC=D~c?T9|Xg{A@*6H4iW zYY^IuWB|axgK+?WV}u7{f}DYDYbm+9e3rUfy2a16N$RrDlqotfkekwyZH`XUC@t39_rR*|sixuFlQj_dDeDAFKRX?&BPv|!SzwS*#VcPa!tKWMYxQgaGPqjX5omEg)H&?I=vz#U&Edv*1xb0S zlZ$1^xhW_%-J{D-J4jx6B47b_MpK2JemMXjGhu*uo`)a^@Or(7ii(2Uhwlbcg;zPVcyV9 z=B{B75gutv8Q0t!&shh%u3{SD1_deN^fWqVjO4sMoXEYJu_8?*># zalapUtAWBMz*`N}Jdnh~A;AHFTbaQw<$ff$GJ}OJf^fjs2!y=}Hw6AwXp}%vn~pmfZj1d<`D~~lai5EnUB7qVaN*NrR{=s!w<*M*t0mO z^Y;P(=C0pe{j$M%AT}|$C!qUaCSUhs^bHN8;;L>{$Y?}EeF@5A6IoCrX#H*>F((b* zoE|JjZ-L$6#OFIE007;#1@{){4@DCbMO>H`S>4Yi*d0zhX{v(WXhi+~Y-m*RlBcTQ zJ)ra0sO*J;Aw~tC=^@!2PVCGpV$1if)KGU8Wv>Mm)H$Hps$c-tz}t@|(55BkH$317 z{)7X7@75$LcE_=hOv1n6EtW4-u1pAclS&pir&^|_V&xh*09@P^x2`qLNrk6oreJ(z z3hx(Pp)o%9K<~=+x)x*) zacsblg-s?d4jp^N8K(=2W=u!O#ugWc7$1uwVzL=Yw!s_=5p~onQ1lP7KfL7b_xgT5 zpYQMcxRzqu+QfvE1er{hXepvfrSYlA`*^(cePJq0OT)8bL4{bxJH;R^09hW(I{;+y z(k@U6Xtu8Q3y>p|#nyW46=H>TJ<0H16&=u`N@z8p5rB@d1M=f zp*a(=+62!#RbefL%)9^~ol1u=m>P!+gbLSb2^`OY)EKToaST-x2#%9l1BvUQg$I_@ z1lCEGQiTgz(#iz8MbSs1XfPO51vM&OaG^Ls5GbZb)oMhtK>T%_NQV&4pB`nPfS(aO zKGDN-P=t|o@Bz^TOPDQa+sNQLq%dM+-#^C2z}3y$MQk{OOXuC zUzh@dXB%J(1>OtIg_!g#A+I5{MhAft2yhxO#E5HIgwW$g#GuFYl1ok} z4waljBX#nhx`}Q{#Tc0`c7e25>?6QQ%_B%%GMl#Lp-dKY&O+tcLqA?FTc_MzBA=be z(zboZxUL^iG(ETclh)4rhYnnAWKT5TY5rZgXESbeq95WsH?ej4}?e1?**eM@eHadM{Y`@~8dnMU%s|dn9f*ow&a*anb zr(XOnb$YzI# zZ5z!Q?%6-G?zPtVtK*e1#MgrZ={NcUu}5mNCp+B5p`J6ZmmT))`_?bonzmnhH#5|K zdFY({`#!p{^Jd!v@y_PafkAt7a~mZ#q&0NAu#(2`v~4Eobm2+m>g;E(RHtUV5%1_q z*-*ZE*%q{`bs!Mlb?bPXy!_2$?;UNrm^6GSskiCp7;5kev@tQR+Z3ub{vwZiC&hZN zZ}j5|?&(uc?9JT#;g_+mn01vCljdDFt)t5In)=+n$IiC2VB@FG>T_3In#fJt_Np76 z*}Ao=_X70i_O9EUYvh}Q*!7{R6QAz2IH2*jC|uide`d$sO6Ro?y!H&6&7yc%bo{5o i^@FSeglAL7;*w?Mj?M=~e@{(Cevy^}8+9hXs_`F<)doHQ diff --git a/src/main/resources/assets/bloodmagic/textures/entities/windGustProjectile.png b/src/main/resources/assets/bloodmagic/textures/entities/windGustProjectile.png deleted file mode 100644 index fab71f51ee2bcfe17933e7019dadc0afc6a167db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1486 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 Bq@e%+ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/GuiTrap.png b/src/main/resources/assets/bloodmagic/textures/gui/GuiTrap.png deleted file mode 100644 index 2fdb824efcb80fa10626b46874f548ffd7e92fcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3677 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 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/alchemyTable.png b/src/main/resources/assets/bloodmagic/textures/gui/alchemyTable.png deleted file mode 100644 index b30ff88a8a74f9904befac2b90c0b1f4408f7f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3428 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 LoNP)ezW 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 DUAT>Y diff --git a/src/main/resources/assets/bloodmagic/textures/gui/bookleft.png b/src/main/resources/assets/bloodmagic/textures/gui/bookleft.png deleted file mode 100644 index 08b462df1c3a95725497df9fb6e36574e26fa4e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11940 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 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/bookright.png b/src/main/resources/assets/bloodmagic/textures/gui/bookright.png deleted file mode 100644 index 8c255a77cb6dfab982d0040a1480c6574eddc29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8536 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 E7Yh?KnE(I) diff --git a/src/main/resources/assets/bloodmagic/textures/gui/buttons_compat.png b/src/main/resources/assets/bloodmagic/textures/gui/buttons_compat.png deleted file mode 100644 index 811f7ac1a6c9090b13a5173817448c508848a166..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18994 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 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/crucible.png b/src/main/resources/assets/bloodmagic/textures/gui/crucible.png deleted file mode 100644 index c321fcefdd70ee5d192c8828a0a24836a419a5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1235 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;_6Q8AUa`8i0cAC7!;n>0-)z&-}Z! z43902*_>Y|G{=zPutCH#M#8%G+4TEU3YP8c>V{oDK{P!ka{{ z%z5^_V9wp83(S~iUOqJEc(22>rhPB?5~>-!Zd4@uy_At|v|%R3B*7CPlYq+4WY+cd zI>eW-Z`jMAnzP4nc?pm^j}cF(H!$pAQD8X0d6Of>?{l%mxp!^~854UQprLM)`dx9s z+5^wF7(6f3Hqhq+1?Yya*XCTZl=HJ@BF0#*9FVbnYY&th4@+y~BDgN`z+u_^O)$QxQe=pC!8cJLWsR_S>~!w-Wy;^t*!nZV+CKq2U$?)+&iRuI;qd{Y9GUu$Hll)Iy4iU-2{!g z|582gZg4z-q|XDvW%5k7fFZ|SEVrHM^CE^EeFx6y{Ii;KA3xlpjL%Sx25(@b%$Wd; zG86mu$2Yiq%5zxDAgR%>{I|dC^bTOKuX+9I(V@uq4C}71UhQaZ159BA0pADVS|!c9 To{uiefz*1s`njxgN@xNAYtffw diff --git a/src/main/resources/assets/bloodmagic/textures/gui/masterRoutingNode.png b/src/main/resources/assets/bloodmagic/textures/gui/masterRoutingNode.png deleted file mode 100644 index 4039c1c44ab1bf471794885080eaa303dfbe01ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94211 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≦KDCLpblu%?g3j5BU6?x)r~TVYMOy31 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

Wn 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 E0RBDF^#A|> diff --git a/src/main/resources/assets/bloodmagic/textures/gui/soulForge.png b/src/main/resources/assets/bloodmagic/textures/gui/soulForge.png deleted file mode 100644 index 641d2cf6df2c50ae578ab3ddeb2ff5be7ac2e0f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25888 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 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/teleposer.png b/src/main/resources/assets/bloodmagic/textures/gui/teleposer.png deleted file mode 100644 index 7be6c0e372f4eef1f003341a5af2b88760c91bb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1464 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6`sf14d?EIR?!;vp+B}u)2D>IEGZ*dVAM4@3x0T z!^3{=`v=7n6+O0UZ@uEk@j}k3;+hm8YQ^5%F$ zuKPTisUb)H2OY2xnU-*;)kkyZznLfHZ!HpNocQPQqx8I4%Qhy<7P1!zHavfxzS`*; zU%Ru5i%h?}b)#SzgI=8gg9FGjEDT7Dgmv$99P3MC`R4_OhUS<_cXu+J0kWF^{r_9{ zUirojR*>?BO6&RO3+?9D|2D2*D>y9vzifAJN5}Ew$2&T@=bzrR#e?I3Zv3COt@q>J z#5*f6aUAFc@>uWX{odc^!1947K@qH@y}i9#V2j`f9|p!9f~k?mUcY|5egD<__wPUc z{P}Z#oj%8bo^poo-@o7g7xw?hkB;rzx7+{PtH5At1t3=ZN`^R6F7#*K; zuXxYZS7OLvh8~J62ZS0J7`RKm+B9rDx7Yl*%%>0+7cWg$mm2GegPjh~o)|2zR=V)8 zprfPX@y8qgB-6TN9ey+MJUk*@+;*-|X+k;!P&*R?2ZI6@h62MhU=&0ss58x+{8wh# zV;68tGx zeynEd?Ur|g8-Ffj*rI9@5`s-oMH$MPV6G1TJ Z!2WD0(FL=o#T9_mdb;|#taD0e0sv;02c7@` diff --git a/src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back.jpg b/src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back.jpg deleted file mode 100644 index ec52a850ff9b4bef0aa67138c4a66be6b3fc57c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73272 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 Qq_~JNC$&Aj;{R^{KbAE$=l}o! diff --git a/src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back_over.png b/src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back_over.png deleted file mode 100644 index b03af3feb73110436270edbafdd4a8d87f8eac2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307187 zcmV(=K-s^EP)2m z#cL#f0dGkBhVTyJ5d;DW0usatAR@=Xc5KQY<*K@M>)w0z+2`!F=Iot^-uoDR%(eEp z&Xso6Is5Fr)?9Or(MRvCx7IrUwO{(~t(l?zCx9rRcnwfg7S z{n;;rvJhAepc#bo&s=<7LM1+r#@{#dYudlIsR062E1w6@4OGJX8cC&@;Lq}(-vhtj z25lsa237wzRp8#9C_p@ydlCBO6BNQ=@xBzlUTR-Enx7kh>y}v>F&3M}tDGWBcYZz+8}2BGmRAghz64WUiSDCH_|WJ44_~8W<;Yw0J%93 zcPD7`Ya4qSQ@l|C(i#Oi)q~A0%dbD-w|;-Mk3Tu#_0t7Q#1JgzuXQvm?;Uab$%^~DCfxvO zpn53N)#CFiL0#|M|IFU6vXz%-{ES-{9_}Bc47L$eC2C<>#C3kph}~p?&i! zUtTCs0caymTEtLK4LpFcYEmw~iLi1-f_@Xnw80Uo&%J_Hnf5S$9K<2RmHV!*~ zKY&6Y|1CB}UQw>&W7*LwIC!2DaWt_U*&&HR)zvTu~!8svPAzSN*1`u`m8S`b-2=QuE^x^MU6F&F%n-`yt){d3j5O(=Ztu;fpC zX*``)vywZqt|xyUaW4Rxucf?67Re)XP3}LN`F#=+Z14w6^fi^GlbT#t}>v#dN{W~|D!zh$Bs!8q4+ z24>rR+!D_B6lJyQ6(W@NF2oS96jjzHR8PFZnLpQ z%`%+m^qKlSH+aRyazUfOUhZKsP`e z(Zu8FW`J%Hzts;VizR^RHO$Y*zV3XV+Gf5N&Y=Ee#p^|3pDJFxRC|3JrHJ|K!XoMW z_mAz{cZ=PBy5ihQ7G(SF7RMAK_@h?l83@#G^!5LC2md~}Y(_ECD>H*w^EkcvBlhaS zAnUfP6dhH7UeEOYssHmuMY;H*SM19&SHu9Y>Rf&6Ts2<2{+bLM z_b*=8E`S7?gQxXiY?dq7U`DU#@_h*1%(Udyy=qYacY3RU;VJIrDek2wP@Le7o;B0# zv5b6V$or~$uH4Y8=8(G`MtEs?TTc~KEuJQub8HCJ?jf~;Ppc(&rD zRH7hKDrlV#K-1g05^zw)s6l;GQ|%OI&$}oh8N#H^21m^ zQq~K&nJmqp!>_zKe(P%@&oyFne3+|Y=GgAvly|x4D2Vc$Msgb+;f6II`bPxL<$ULwv0$Fa_YxtDZ|L1^U`hAqk1M`ss zLbD}6GohJ?IGjyhL?Uk!7$gs$MnACnL8x)B4fyEz=J=xB%e_6(DG{j)$FlPEK(vQo zG2btlJ_E~w+3+af{no^)LD3>W&bZ$UFY8D+`Z|n_BC6o(aIFjBKk6VE}K@bbL^qPzy>?-Rs`nl(_D*nZg(@Wa=#Z6tZ%n^Ah=71u8W zEY^8VJUHr8fk9{%$wijx@fy(vYeFT)=VVPh3NB)#Cgi^Ycp+FmSa95Sz|bOPJw=kZ zdyaiSz3qUNxn+QiDfwBaLsxN`XmLs)<~C1e>JA6n1nXUiLvQ^ad+c5Ev%S;okV$#A z8?v?8*Fmli^Fy9$(*I0KIfU~%6-VIDKU==}^UL9zr$aAXL^jCM;&3jJQV~hUXftWt zSOVaZ2eXG%=?N8k!f*+(Z@`jOS{n$-t}yBc{=)v5iOu89ryCxAvf8Vo% _mC3jPrikY=8@%RD{yha^#(+4z-GWvAkPk5Uar_0 z>)nOLX66+p1QKGE0wqdWlcj}}fRIH4!2JGp*fLK+^*D!sv=h~XM7CfCgX(BOSPgJO zZ=1Y@zL8Z={C;-DsL>kH0ijNt%M2nMDIx>D{dC3ZEp1;f$o7}*)*gvVV9MeD!CzoL za}5kWKPPM3A#$HUcLRo|x1vs&V91Fe?yotPjc0h0>EFz%`y{1a>O{*|Npe z+oAc{cI}4z*+tMkI`F-_4JRx7k}MeGyrKYXe*6eHW1P(rn1E463-pEJ_ITLrf5Q5Y zZXW_b2zXq)aZJ*o^5$(9$wNL{5_wOS(Mo~%&r;y`(lRz|VDs;FXqMs$p!j>_4P)R# zwrBNFz1FtiLpB2h%h$ipx4H0_CB4Kae9K zYW_OnuO%u}iEHg&aoDH<)_fVqeK0Hhi5l$GDzm~9q<-t-khbhO6Fn^<; zqepoP?8j%kIUDSZ8$0sMJAI}{o*CQ?Mk3|8t_MwjPe!6B(Gm|7*ozCGd7v<}PI~N# z0<-&yU6wS~Kv{Jj95yTGCShlToiN+U1bAKar#nyTql}%QoF-kl=xk z&y)|Jt~lKau3%b_o)R$V0-U)dLQf)B%{AbOJPQZF2)k`wT*RKs1D`ZVUU%s;Yry%E zjrF!rXh8E~WVC?>xsV+xn0Zt-@h}F}Aqy1~8P{9LWculfH#NyC2W{W-OI%mP2}m6F zw9@TKWEqWb3EB(QQK(nWzJw1Ok=!zQf!xg6w7A%VlNM(YW z12$2CMn6qTk5CDUnGNMYGJH8hX+qP4XW#nY7xhygQ9H!V(=E#}<$Mj-)DrRcfJx*F z-wVOly#nP}Q3KGTM76>Jh%_p&Cq-2I7Ht3&f)W7S>r;I$ujJ02@7d&)*Te#PJPqIsqE3 zkUePDui$M;3-76$r~*w!BH-*-!;NrJvs1JM9$8+ylKU;nfL$+J^B1Sql*QU-s19I= zwwQzpLA|W-mPLc1`Pzvp)`lV=K6kbYyu7gf_zb3vkS*6+FJgO)klxktNm^rLD$#TZ6>fc{LF?q&bwT^f+~`H{aK_H#-ywgXUJAWvgRN=PJ>-?$0|~y+a*_`JY3N$J8?DWw-&s=f%eCn zeZI`8zw~ycD-(R(G)Fp$%3x;9Zvb1wFm&j@GqUzAP7Pk0&U~=S*q5r#x!@i6K3Vg6 zH!?{)qD9SCl~MciMOvsGwz-Wz?X&oM`}wbZcr4JsVDMiSOIFn)CR8O&;(%kLHJ3SY zSFI;o6$apJuv-ED!}sJnf2{WD%Z+Or)of2YoEqxw02>HoURxqgPA{&on{dL)6QZ{$ z|MTi-*NXkiKpPOI2}?CHk|U}?JDeR=@&xUQSHTs@@C=RFFE+Cw3dkD2Fn)V>ADP@h zNCH+45W>9ZBMMVF*`^SIC39Q|+jQ5nkH6mV%sYMF3*JNk9QEm}_8rl3mSGjN#5&|3 zZ3h;1{`9HeMr4x-Y0?6Z4s7b?qZ9``se%NcU*CtaiVW1IMM)ahZi~aRO#yvrPxOXslcCn>#cbRI z9tHMWuW|Qk#dgzrF{vFa7>h|Gi}1FRuQir-A#IegeZ6z+AxEA_Wr!y7Db~H>KhqT( zy}cELNy#-W5-mpUZ6+)NJ`o%q6zdK?2SK)iyh%LoZM1Ycnv|iPfuoSK#5J~1_NUF@ zh*T&zGMBDMp_+L`r(+p)7Cj?wX#80R6F$*cDX3<|m}ptV<`)8OY%O2o0l72x=V;j_ z;zu!83l!RWXTxXcTm-GL_x4e%_^!y1sAd(?f-AH5holS|-at2EuZeasORv6DFhqfw zbea--APHnI&WsvHr~uypr+f3;oz@VVe{Ht3OC_&0?2K$jm{CXFH}my7`Pd`6he$29S*whubb89R46y z0zPVh=jg|F4onGZQ;&m#nCU;ejsC37Dh@S+oww-A?vyl3X$?tYRfG3a#0Z{b=NTD* z2BSdAW!9e~i{#Y+T|>s4UAYZdSC1VX0^gGV60fzzzL6mVODUxaARjB%VIV=# zK~MXjMK0~%F4c8zmhANlT|4;?-r%z%`{qibRNi!`_R5UCDk%qj zL)W~Ho^VKZNS0@D7{FvEGkQ7Ng2F?vS)f#2%CENwfFADM)Ral##$>Ro#??@ z5R?Uz*@mDbCDyC_Uinw$VnE_`uTd^NKs0sWQD{1;ISK=HXwMN?c5aV%K~0v3o@Ph=qsn zT}l-}68xE)&fAsqDn@l=Sv}p%}(#yuypM z;29lSCtX^J;Vg&0w-*-RtM~0ouT1ZM@C2W6P2N=ZMN!RUZ6O@l_Mb2g8WZw>M)st= z*`$N3VcrF^*u4ojn$p>P$BbgnndOsn0IN9dVw@FvBf0gUrU~0P)WG}Cg27LM8PEvZ= z_q--oa0vx5+?8zZr>zP+ti*rvLHkR;^aStz=k_t|Ep5MknaXnM@~|qqe1vz= zB~)!%v+_ujLNX`Gex3!~(vfF(U&r5CpBhm}K(CEj$TFtBea?iTP+Ze~|kc@Sn$}MsD=!kc| z((wH0f&(kY#1h{Y;8!0GzxL{qX z`PU>v-s$5@weLPEgdCj^D3~4R@>i|zz(5IvkWI~d@R>=GQsi*yozRJo`wr=u+^|eLaYFETh0GXuf#?fCR?G1 za5gL`Vi1j+w-EAFaCnb+@}l8M_%0=SqDh=D6`FL(a@_NyU^#N^t%@>IctzeeV%_2r zPRTv7$Z*+hzwnXE0C(ANccHSm^6!pC>lQK^!qBLrjK8QMtyY#=teVtDbtVD%T5%36 zN&rW%Wc0);9HkblQh|L&`|J--crAn;*!?&d+=R})4o&QJWk8Yfao=kxag6L4=N=oV z6+|{p<;v^tWnZ=POc44;2Rs-XHOmD9y#rxgz`@k|*`L)%sgYedlMi8`>rOeiRkXs!bEawU(GN^tb_axAp+a`vSd-qh60aJMa>^*hj^DXq=krDLv5vXzPmPFC)^SfNoB>+M5 z?(LIuZ?EnsuT-NOrd@JXA$87f5d&orXNq%khqbx=S5mzP#kPb5mDx&3;-7DpwyPek zNb#V+mVC%^=v#i3-j`VP%uClIyGO=>`X#D>;A6^@hUG=W6AI+jhSQr!!}2rr3U34d zx5N57pV3|)*-@ntW=Gz@NK7adajY(wjom$u(ly@JAsu&~Yt0X_;Y=s4a%ds$Gw-_@uEY1- zAM}rL4fb09!VR!S$hU9t{)6H4+PEzemZ&b%$~II-eGFzv9ICMLoj%tiPrP#Y%YoLG z07$obY~GxryqJ;i*_gE-_$PR=0`@E0jazk~kgBu({0FPC_OhF5_t=&#Wk z8N#kZ8a$6ee8V7(S!0K7Cwtxt^rmXfs~14AlkL6;eh#M4!mRhe*=10f=q5wpz%!3L z@m9{g=nm5W)j>#{pgo)KcZd11B_VVJEbsMsP5Jo>{hROc&n*XTzw-vKZiR8o!|pcX z-+Uk6AhG@7iEo~WyX9K3r>zM{65k|}PIrN}&S$gHR&?(Pn|vI!v<(!M6EO0>PD1Wn zuVSQ=fnNLejr*L92Z7!a@}&j0uU+yL7ZTnG=z8@*v>i6Fn(I%Z&6owBiecIwC z0o37i9kRIMM-%y{#}X+!SfuyPyBtqAk#TLWFz%$kD5i9C2tEk!{YRy%Vn&Hj3Y^UP zGVmr5j+?=rD9Fw4S)dEsgJC-vRtn6V1SyMvUm|Yr4V%pf42zG!1@W**a-kaSS9YRi zJ@mAbEe&=y;Mbnurx$S&;L*n7RuIw+H!7h%0<0Oh5&BNU;c3J1(-jYy1zYyxhMc5t znjMVJa$v|rR>>YnYITVggqp3e@pZ@U?i`2lrrx%cR=>as6w zWvt8nF42HK-(c|1W`v}TgKf*8mX1VE8_M`v+AOJ~3K~zCe{1h_qu=L!Z zy8{*Fx%B>ARW#Umtw&n`HW0dm%+q}!4rl?$2H=N^yC0tMdXV|3xlo=p@RJp%bMS5a zcgI5AT;ncQeCe~N9lkASac?#oMA?8D-P0VgXlD6q-@kO|yfO~VY-$$~SuwJ&neIQI zz6_t7vHr^@U;DR?%dh?qXZ<~bT_Gd@HthvYZ4z^j1ToqTl4Pvm+wV!iP~+I(D*9_} z^E?3!)Syq%%Jq6y*b3;Y4X4#$O-6T3+`uN|Vt16@eRb7HCT3O;M=izz-It)~hd5d! zOm&5b`{HM!4(U8E2A_v%@DoV@7or^-xCG655wxag@Qlk+g=4;VliM*8rJ))^5YM;O zx`|CihEl#O2)C*9?-!0{TH$A)B;Pif`lM4>Otsq7&#KmvtP}kR|9?-4F3Hjz+3X2G zbODXscffn>%}IV|gFYCxAU9_G;45JL&LUs_>-SIp%0E1ue{Ti0PO^;qrRh0fol|95 zXvdHo(+~rPIfLz(<*a;}MPR>s!cYG6jC+>>4he>GWU4(=ugv${bPtB@-sMBCS5EVk zg(?HL=XCJLAP6g*z?6;Y&a*cc=!16q-%$zhl6Y4K*2u{E&2~MW^Ba;kU8>=Y!1;R0cagb*^iG~+}7MZ1UN92j1W2QsGWW(6S0=n## zPX?5%>Z;11u8U-vb8=pMR`<$y$aGRBX@w1*l~?vR zL+Weh)&M>s4kob8xD~RXr7E{N=S}{2#gwdWa7rj>Y&g1E8QJwj zuzYf`H@_|VN2fEiEg?BH2s)*5A_ms_zNa9congQ5oX`HoJMt_4E72Ll)VBX#{Nx!=yn*bLZQfi?#UOU=)jM8OqjN6K~s?>Sfr5 z#yuhWt?-JNF#I4tUi4Gb94wNwJotMhtga5Q=Fi502hqvB&CPd=o+C8rXX(UuOXPR! z(}`Hr4V@IodcOzjPMqwB;%TuML` zI6W0C*+#dySX1}B3)4OV?b~1f@K{}p`lKp$c}m}-F^w)AmRxS&t_N%q9{)Sf%i>?> zNkR>@?Acld60I56Zv5+H2YM|Dupvk5IAM|L^hMYYgU-Aq3raA1?&0kk^}Q@`;;rw0 zKh+b(wLc${WnvTLq=bPFUAL63Qi03U<=E-*BRf0EQRRo76)ze7<_v#*u*DwiXh)uz zu7c6%8?YPu;34jfnOW2vDQ(gmY@yQ}f$GcWtluqyhji5i@;;O{rVk&;-uS4dI$ON- zXD`|>ByfO_7yW|jpGChv5|(+b1$@m;zOW)Ovo5`Z-RU#EZ7WeKdKn(URn1|OZE~gE ze?bx&8Egi>aNF|(Sq(S{MaVsm#Q@-Tfh^LQ{YJc9eULX-JXmVb8$J0<7rlss5hM*& zDG=mQb`AxMHtm}WzC#ucHn=}FCqU!CdZXArK4HCC-0C;ei6~pU5QaVRA8Mf_i7Wy; zDfGv%Pk*%H!A9Smt6@8bAy-b&9G?%#|3r(vxuk-?r{5_GGK3(}WhHkbXj|Ey2SPSq z*IOtjWbUX9zX1;N9(ViOasrfj+m>`@e=2vfbs$S{Bc^GM+R5OA6Q4x{-9o6fvG$vQ zCb56h>bmt=1IfGU7PVuO^+|bKO!-SP!${jA;ec}xDoMn);<%VZzOJh;@4Xr})vne^ z6h)IuuwhL4lHHtwydN7zJ2^FX8>ap1z4(~&k_jDbv_pb{Zeh7)gpZ1TsW>m8%*ePF zV1=}i#KDGOqZZ6|HrV?I9DntOAAWzuecxX)ao7@F7IoywEASm-`+|+Hdv>bJGTf5) zi^lfVfiswxlsdh)O>AORS>QCzbT)*Upxgc6o=GimMU7CaerHr!XI2W{!Wgft+9F;p zbC#j&ga&AShR%E~phq2=Bie^&C@x*nU|T8}-0817Ztc_>&*iQ&vG47f=8C?vXL_g4 z^-iDZodzQvg#W+KIVbzXIGGw}I%r7pNv62M?zq)@cHUaam|P8^npPa zYL+Y4m+R)5I_82I4amVILO#t8kQPF$Y%FTdF;5lA=F(-!oP>i7?nK4w2vVp_q=R;` z#yK1SC(?c#{+*yPc_duXdwfAinb^{GV%tLCX*j%PeCX<*YP)7rfEOuMju_;Ah5nzf z`1xvm${s#n@#gatYdYwa!ldtQaXwQYl5=E+oR=hfu`953U2UcRzl{K*1 zBkQ>!-@7tKWVn>}*Y#wI0`>I}Qv`{ah^b{QE^WNxx&kL1^2b%6-IlY>>Y^B^6XVCn z`dK%3|I_FzbzMhc`CnP{M47ix{(ZC@Lk}Pxiz<6AXZ;lD;kpp54j#+vY70dKvg{`5 zYBKn=+*bmJ=J$1pp-hr1Kb&rljO){(UWp%4nR#v<{a8jbRPHzER~9_^_0!>(x&x~` zavsOovZ^})-sAyq=tdsh$GEfvOcn+}m=m{$xA|(zB$We3=5`cuLeq!Tu~^T zHhTFLkPr@aLiZ*pnOMTYgQ&yqP}c|5bT4gTo_tm{vlHK-%%v`brEcC(^u|I#or5Yn z4Zf8C&pHpGagdNK^`{yv-{JMY^P}h0N-@3s!_5x{;ABU8F0Z5-{p9}#8O_K*{)b@H z32$a1)j7?QeO?%;79B*-J}0c8XTCb4B59ysdb^cPVO`2R`jZviF>pqe5_u8kgg(-h zDwNX4b{4M;SiW!wq+YiTmmjmC{t3blmF~lngF&z=@Y#m--+o7a>iGiw{S!||Nsk)$ zF}{W?`J_hlc>speKG=~recXMw3$|_@;A47IAtE46Li)Fd^RKmwKG$dZphp9E!5xwL zT6(3DbY=C{jdI*CVZp-~o?+QrR&tAHUyT9#zDhLZf?}(v699UJ%j`Q#H;Qtfk~IAR z`$Rhqj-4__TUNKAC((;9@kBZ|WJhM=@VA#V|H={DrBwyP?0rGsL(;Y7ZubfzS%JM5 zd@&(1pMwrVvWl3&a?lY#k8QaT`m{a3ymD`fmWM^OurjIX!)_KCkn|$G|D3U|n;hvj z9HcBPeOXAf;qcm5$cC6~&8YIV->a^AvVsWd-VCTXq{QA9Dd=lnbfN?dev}BsZ18i` zjgPBFzAF+?I8NCPqz-g?t6*HbZ<7d`gL~2M$uuA-&?E))#&CGL;CKo}K%$LW(CI+S ztACCez^8)t;}sA8Gq&G*D&Q7~eHn7s8*MQ}%V-dpvSBMzYi(Ek8)RLtSHwNJE@OJt zpy}s~5mcvn@KH(VjXOUaicFv=e_wTpYcVC$$9^;X9KT09w(>n&VgZ|7BG#!?zpH<(1Ug z+%@g>gT>;&Pjaq9x258pt~slxS{--KaGR@jsef+qB}LC&M=VzrIA;%lsiM$PSxw`s z_oH^Vc?4`DCH={(SHZQWk4TwYP|&0t?Q6yTZw2t;0Qv5__}~|B4?pu$;5%mS69Sac zxsT}k32IjF-Sd0r*8xH^8QZU^FaZ+t=oTZ0J?*}DovPIjOxZmO_KD>4t7E+jf+hmU z?Q-dxu^-FZJp$s|vVspCb(#_ZwyVkHYTVf)2h#P=xu!}5P7mLDAr80VwXs`^YP)z? z*PCI+ies#Hu4&=LJ{#T*B~Fyey-R)tV@&r&>={Zci}*D3Ry8x750MOVuW$HmByTe zjubpyaCk1bVJjJ;Ts>>2I3*nD;HR`R`ug_r8DP=LfM&KK6qm^jaHX8qQH+8r#9o)r&p` z0BN*gJhQxxn@$iq2W+~BxiyhDbzib^Ko~>wRrmHdw#Y()2F<{VTN;MOl}R|7eX1sd7>s&3vV|g zRZCO2xbSEW7`g}yywn?xr17pFRt=OGX^e#ZH!~GNnoxAJ-U`ShDehAbj!yigHt}I( zo3T?ya%~6SME1~jnXP{PJk!xas>8}s8ye<0BerCqz06U2g%`8s<)q!LTq8IO#_Ne> z`%fV`q!lg(hP|b$)+=@GK`qzZ*4qG=hu;RAg6N$Id`z@sCK;)K zT+Lr6=k^GJMMDX&85RI5p@)T{TR?i3_ZN^D+-8P1E6zRf)OhLq^t*ewjD4QhCZ`g^ z;O(VspUS5jUL%Kfjf_YZfu6R3dQ1thK~{slIAB=~`so>`B@z^osl_P!yblEAHXMdJ zAE5R?qhA3y6NPHh)N(UTJ?urwA~5J%kb;<65aSrVH+a!k6)6YbTzToqfRAo)`>m(A zJ!#<)$nKDT>}xk6Y3lzL6r)zV8i#sTG`azQxzE*!QSGsHtgb2TzkQ zFV@72=Jflra3CL9appd0B<@$>H(&DecNZ@2h{+a*cCPaYL19i!@}AFgx$`!Qx#vmi z7DlW+a53|PI1jpb1xF+T5xU}_Ho?g43T$+z&oueV*(ANwXL@JPH0NUwR1r^(4JIvm zaj(v{Hdo(?k(!^Q_sG$cJ~W>q>5~X)ayIH}Q3TWfJ&>fqmAJ;`(2H8}0zLEgrYVPJ zatiSGEA)QDn(;Nqgd^SJv&sDL^G5*TXe?8naEc#`;;JP1ZO29-)&_G-P6= zk+dqz`3E}{RoBgA)mIV`@Bdq`^hB1cj*EK^O~+?+>(%(Gv-@5m25U`JWE)Av(pw{} zu6K|Ys)MPP^Ml_vgfE_csyCMh3xU%S=hFe3Y~fQ-h8QLPMFeO$J<}7Sg_}t$=xX6x z^zSt@S%~Eoxt=(1XptQ+BiCReKMGl;OME*Ls1sAZwEX+LVM`?4$65z z-U<#+1qZDQ(z<6uPaX^Ui(7%TU-`yYo;QFGhEp8m3<*ZeM^SNd)|$VR`+0{p7a~Z~pNg+~d>LaJD*lBsdZ>_yARJoYV0x z=4N-Jmtf6zV~aX2sJGk64iyHoxH`5)&l%mp&Qj3cCpeJ7naJL4=_7WNpIRSw4YveG zBzyBiTIplPq|0%n%8{;m=~v|ihfa2 zx$ki@d+7sh)}StT-KKT+E^ph=%`^26)`#<2wfP!zGE#g2Yd)ZdosyCU3d}zJESKfBDVv=iYgRCm%nxyXKP)dsfmo%*m?qOv~I5 z3fVHo1ph)u@|BV(D`Tq|q{hhxxi~ec5d3Q6vwP!t4f3N(a2Ha&BT%t2?azmlNpiuW ziqDO$mCFE*`tz>cJ7R#fNp`WmX8sxl|>a9ZZ0{zlr%RjuwC;#gw_Jc1SY?&&!8DiI~ zzUtR|@v4ve#8!#&1ah>PmE_G@EW;hPospyBw@4Q|Wa_k=gK zv`m5_L~Lp(2lTb;RpHRbTA5i9JcR!Ix%aEJ(FzMoaseRO>Zm^#pHuXU_Uf)8dSq@! z=Qg+#&~RxE7VhKxYPr+^$X*$th4&#}aFOkiYv)v|Yj5=k^oJ|fzx+gg=GSiJ8{a>3 z&BI#D2;gX5ZF%0Q9>v!z@Gp}!c>Mw5Z{<3@p zxD_l%S2sc1%xURy$~spE5HH6M!Um0Lr}4?+8A~~ztU&IvEW`gk?}|7{?szmD_OlM8 zWC;w5$I?*7LI@X1&eqszE%lmYE@QA7@brM=Uw?T2uY9=KGh0Sxm*|?>{C?Ano7q6E zLibu{B&-TO64C||JpFu`RZwG~SJwaDuYBi&lVLpujQ{Zi-pJSlqmKxOWY0!D&_vwq z)B{Yy<=Uki(_Pm6J?gW;9d=m(z1yJgH7p`C(W>`LiZG;l#!pEI9}zGUUufy0*Q8_> za?6KQA6x_jDMPz=u+Bb+X-N)rXID8knMH@GUCv?dgFvvq%RvkpmEYK0V@&H~_ebkN z+>;y~Q2z8jGe<-A(7jiZ(68U{b|IEOdV{+|K*7qlyg&X7|2Cj{#C;lT;>v4;jBDl@ za0K_Ozr#n{6Wx$X140vnyi~5Nqcqv!wna5s4{>;Q?!g?yv;^~cQ^)u=AXPye->-zK6rJ*SU?D9|!Lpw)fEFG-kBeN3%8Rk^I7s+zKFLD32 zOWaiE0X>zIB-1n5r%)wH==&D4{wGJf5fQA$HXn((jP#O!Dgz z+omQp*5n>q#Gw?mT@c!FGXhpm9*0OR9EQA%fnGwK!QWd~NFv%^4kyl~6GG^)0?W@y zwpI=crER^f(-ux7I>83Cg>rE1j65|Qjs#8yoD7=^6dRz;jjPs}IkKtg8tvn%>7VFs z3R9T~rnS|<(-G&zAh#zRxKJ2G*!-NUVLkah)=uuevd<;j$-UiM&Mig1UX&JxTqVW( z*(tXRivBk1Y^tnPzbhSLa&218|U`hTCC-sw4eRT zhX;nU-|G$ABE#II*Z{+VAMnuuPu?ij&9O8yjyc6KuG5FT)QMFrPFB^xJ`RL;7PPf14X?J)eAJ;8Wz-0A(y4i*=}v+LM%RGwyXB=BrcuV%S_Hge;hW2^z|IzgGAR_2f4I%Oo?I6i|^77?Q>}7tEF@k5*DKvv$?yH#?cBlthsu~mD%!L zqRj%U(kou;Bbo=C&#*~NC{*L#Orv5~g}vUe(hq3naF#32fNyQrTqXlu9V!BH*Bq&m z&GdNRKi%%KbtU2Gzf`1Dg~_xX_ic2{qhD zF?^T$4q!?&#qVKv&+H#2Y^#U0U2VIcEZ}Q8fYz^mky{(%bsrCTsdU7xya&SMBMBxV@A8; zMj_3wua$wI83S}19H+jHH-p{1z?<6>j@@N8-FBpS@CWg*?Aer^^8yab;h-__>Rxd! zQqa+6kPerb3Tzv$w-$+W?qBARJd_dImSCYlOuOqS1>ojxnUvH7ee275A86lROh}(u*UnTLyJYaGM>Q>wigC;8tcN0 z^J{(4{og;Q%NEb5yzDxodI!M{!zdff=`T`<^mS+#qo0*9XHw7YtxlNS%*}!59%-&} zA#*-`v|sYfGqH-;M7z=F{FugVagw>jtXo^em(|0(9(~MVxW}wrzHkrIkEw@|2 z^1*^5Lh{)Tem;f0cZcEA+$V3h>=2ph<6Ds?UXk#XxX{Uiiww0%w(o)!KdB5Z)+c~B zn-?}qtdUir3m`YbCCB)}fTNS&5(?ha^jty_gL5h#EV+)8AZC!IjZv{q4Rl1U#*K_K zX>zpi!j#BOZu0M&OYjuXlVMXp)lI=>lN?+?^3@0Da+2TtGyD3R`7)MR6>p-dH5!C%WNDlSIMBw_JztY9 z`_u3O2LK#k@{`B8^c&(=4j&Ko`_5TE%(KiJ8##c;C2e z&S=K5y7J{DDa%1WqZ%_qF}fJzVSSWm`kA9w_nlN%sTXt-Svw6FjFp+s-9oNk?Dob{ zX@ur9%~Mz^t|0%oSw$ZdKNy?A&M_h6UE}d|!1CFO_VvcLqD;+u1XaOIf;O40Zuv!I zO&Ol=*QWPz_ujSow=3W4WK$6T6u|fu`e+h$^BLNVAXyn2+5} zTXNP1$xDA^L&UW)_F0qko5Rq`2=fe9*2Y+JwuN9gra{P%Y%ClVZ6AZ47Rm*6Ly)j( zPC}H`U?&?6>(+Z2{T{k<*8@Mvj@nTK*2*w1K^KsT9cT-1{7bp}Wa(1T;&e|Jb6v9hF;n70Z@F?%~jv(7Hs&0nj|_4N?xt>^x9z&L5MM-E$6~B;c^>eI>mqu8EJ}h*#=r9HAz^B8TG?M zznG;+LSH9!f>1DKMe9l*4tAH2?v6_@&7u5&vmEY^jVG;)(3P09mZ{)i|56S3lK@#j zroR>TcfR_~zxB7j{!{<%e{=fL-~FTe_Hf(mDugfA-N7aoG}|-%_ey~H1RtMq2EpTC z3U@J_?AX}XMm1l&2PRhe+vy;0NoJ;5($f6^03ZNKL_t)bl5Se;a~lTRzB)Gc&p5YY zD!Z93nG1ihT_>r|TtJ8K%%3p<<-OwUDFuRKHk5( zTxOxSZKG@yLY780AJXGF;9O_&F$HB0+c2;Wo)|UCbVTOIBB8-W+a_c}7WcbGxlT zI(9}|^8%3&I@B*06q|_*0c%tU^aw1^1-Q3B(6do~<3s+1fBq?7{OBb8byE1KSBz>VVpdTa z2xcAs7n0yAG|KDV>ZyQ$jQ8m-h`a)SB=bH7;aHJ+XQ7aWHwpK5-c4rFMm2N){e7E- z;rxdy-Ln2U%D+CBdojm+dK(~rZh4EL6h{Un=9+!gy}GBjMmT%e?~pbrKf7QhTN%F}HcR98JSn@<7b& z#0+vG){}K<$vjwPZ0MRqX!1vP<||rcEvWkR+Ag5w0GjGb zSQ+e{Wn5%+C&T)!13vg<#r*?$LK&_CEB*3oK~1}RVGqi=B0}==C{{a(N>P*qd|c|* zla%saQtruKBBhsI&vdA&OlW+oLH^bce(+!62S3oCTe!SftZs7M_t2xfn+_|rS*M=W zTL#EQ+?)E7m7l#)tk0S{!Kry*Q3LjtzgO6|^WPs+5xnL1)gF-nzD0qCV$3mFHt$>} zn+#^MvqNo?h!%u74+4!!EqyblHM?*cN)&xn3xcu7n7tJ6^VJXj=j~2X?7W#_bL0X- zn+Io^n+ql0xxp)LwcK|mV<3`AJv^rs5`R-hAGpnlK&(+o*&{cLb;ObXHYhifE!e=u z@|-ao`D!6z!TetUe7fQE$%@mFCR~W^JWP`cVYvo+*~O>9bFvYf`<@#HV4ZW2*4`_y zMpCpy0(76Z)cXK1t1WLgKKE!Eu~Ls6-pZg}VkRdrh8#2@Ik(!rfmNLP_)#T+k+ znp{BYzn7*>4%L{h0|8x>SRYYB?NxQ1pVq$f^$%~Y_ENn>F)7UIfN(Wn2A{~P9j-D9 zTf;sJ9R>Q#Zpe;BOYa>;e>a>ZnXSJv5ZrrsHpyR;M?mCAR&1rUqTN||458T5K*$;H zWsDplV3g65Rf8=8zE-Sn$SrK!Cf0HyZ~dN)vA6znWne|J#6<#69QLACvESmf()&qL zM${tt73l<*y})GS22|JL=9-m3I~+a6tMGXh9fV=Z+OXXadK8*2*wjaKn%N9gk1UzI zmecHb0KKs(WnKIqukh)eLZ1u71WF^Ve&%F(|Jl3titD_IDhp&C8-00xPyKyfe1K>= zBy*T!Y;fhgjM2e4M}2>>vywuCmK+_!FafM`iRj_=dLva^A-`xtn$uJ z37Fam<-#itwS!;)XJYpQOl{&W^~5dt2e}0o>1)W6+Z2O(G`R-$P}+#<$p z40On%jnUxHf3zxHsnOWM8>>p5gv(O3RQWSnT1Hpa471N43IL&@F-^z}TpHR!EWK?p z+5{BqFHFYhVwU!I^q?s=hU;YXWRB)4{0$P|7BR3vjldc$kO1ph?StmtASa65dILvbkC!*WHFOu&4$C@fj{wTT(^o(c3=ThMXQS4kJ4E zLs)K7JE=6F{0br#SGJ2&f zrwLPL&Cwd=Ap2$V!a)$~{p?^QXp(t$(!ZQmm(sRmPMBq-W8r|`A=*v`603?m8;EI_ zAxc3Qq8Zo#e7s?Mtytd?x2ewG*(~@FqmMr-?aOqg$I9;6jp1HalZo6z@N>v|cg2g9ca7s>DIE-QUj)RF(6SU!Wg=V< ztT+y1uc~ZDf1)>95-RKKtOrf&_rE6?NoSrET^ zw%F&~_XJ8$Jtn1O5~X~Impvp`pvQp1LkfaG(_ zBqT`UNot{OFq6@s4mU_G+HRAa3}{X?4DLpk7FuvrlAtbQk}5U$Yf9*$Q8x9&kN_4n zXi5f7HXP#;Mw6j%SanEux|`O5Zf211kM0aCMBo#Os`ooZsSD-qg~+ zyw?U=dgOXpt_7Gs3|sF|L!DHkaacQQY?Goh)FaX61m@;KSe zW|tgX;nTMAerl8wdQC!=Q2!G56q~=c339m41?2859EY?|7&8|zOkw&Uk+=5o_of%S zpI;2ib1}KI;Z^)^^^T4Att(y1%(bm8^&xfyT zq0hLNnlMm8M6Geaje%Ze4c5jn(I>_AUaZI$4;MRcRww&mHHT#T2m-UN6EA#|K2Ycj z*K!!xo31WT6=Tg0S9LLw#uw~{2>Wxrbdd5VP8_rl>|#^ zH81;inm?&Xu0 zZ35x}2Rry#A8LnC?gZ)+SdRu4XANjC8g7367GHWtaQjm6@Y)SdteVrA@QOsXRW{{ROeZx=46K8-1>#56&oBLid3z)&Y-xt=1U zgs|P92Ax?ytz-4E7e+@r)AY(2`7#cymdd7W$owLvWsL4Hc`ORsB>)0Ub2PA=(Z2U= z`_T`d*-vg>;aD)YvbbS7#pR0@q%(E9U zY@?-WKB$nUqrsU-xozlbtFG?XVdm56O=Aua@<1}p25~6kfEa!x-Ea(Lh6`wp{Em=R zjOGYy5?$S>pW8q8Qy<=@xVS)@)FI#G)CY{83m8r@x7lqMbo;;O2u=;z$`B^{iJpDZ z+)y`!ynn#W6Tz|p_R6^aEAQGj&W80zXPge4y7}G{Ax#QfRt)&@hV%UfywifA)Pm?7 zy~s15UpjDE0C|X>VnAdg%I+f3lzp-c>@bv^Yfy+;zASgP0M7~ezs~mZx6b(ND@PpF zCaFj|H#uKIz#C$@C6*?@+4`dL!@smPtUM4I42aqQr?_Jl)PN5TxIF;v0XSRZfNbFs ztfnSW1*L4$QYL8zvQfMFTRe>BE@Rl@eey8%e1d@lP)23z@M$oFH6yF{9gCoT3@z%g z?H6zYO2^X4M0W=~eD8_=$=w<2K?=khWoAkITJ;VT%(NwC|&kU*PPS~i!Cxg|s zk}}$AHDOMPsQc)%x5f6dy>3T4f~5fDtr&mrHD3Send|!puOJc=os1Zy_Yx%^-U;3w z0Ep*uCr6&URzG3)&7e)tXR&n25#06fdBfpF!|f(mKV9+g#)s_mNoHN&KNtYrNsm{! zBZv1@|BpF zhVHuO2a&LWZH34gVX0W!nojEWc34^5og3;p_-s*PX^|pf_zsB65Ya+&zbEANXW?$U z_DyRa9F@zQ@yuyv-X>`WHr1Z6b6QL6v@iy2Z<%12OGI6~AUnBl?>UcRVj}vp zw5E$GT#+uC?@+&I&H?!7!`mdKVb<8@g=fMdR#2My@8N33a!n(!1F4d?&#Mf*!%CHb2V_UR2T zjHmR|73+We;WSNMkIe&Y4^uyI8S{l$N z4SW)Wm8dlHA+Uo1$$|`j?^PX=Gv{4MCM{x7VMNtDiq9RZZws@FoEqkEr75vV_E)Uy zh*`*KDJbsMX_LP236RUk-Yv|J?83MwLU2^Blw`LFEfJ7tTR2yvM|aaJLJ6Jq_B)c^ zfSi#wqpy|rz1KWHU*?J(!``@O>roMQzl0=M=Cm8#g486b$a8;%!kHP2z93?jNo9zNahaKGUceNj<^9ou}6*$x3nXe4TB9j0UdKV|RMYg?9_ z34IY`uC@2s=aMJ0GOIGHvbub!c2|{evfFm!rW@SdAOUK?fUyLEw-y&6@x~KRyzv8g zMMCfo`lUevSx5~Su+#?Za@pl}8M`v;lDCtY`?}T~5j@0Y#F%THtRkhY%sglBz1Es@ z%rPRq_%4}3hI*g7X{coKgBVUK6s}^8aHH>6pNpc`ZWiFXT zT!`<(JjXYAqxATJ6W30PP*q3B3yuoxDI-9r5vZ}x@Bk4ZZ=eSS@pox8MPRw zZXuj{Gm{hZEC6)ynJe=!5P)q5qLs;+L|jccgsMqPBj9RB%Uwsuuy@Rh5(FaWz$DeH z1M;9)@0pHWNIyPe4f4|wDd!j(c|?AXx>xOq^T2ssaqiMWkXP(Fj#@>mXf zp%?8yBZq>ttLoOY#0oXSB^?`s)L8#oassjlQzl^NIRIr5`d&m7859w$5sjLk`y3nD zy#=pGhPv1{^1_w7GLHZ_8VmbHO5y<8*a)?aLS!(%?OurE{}BctuxG&#@`VI4V1L!= zxtUb{DpS_Qycf_!9!?ij-ux~ifEzJ6;VzJ?5c6b%P?3zWCg?$cuUz2iPhQ~p_g37n zlazU=5MpmpHF+2{zsBjG?>p8KNP}}L$Y=GAvQeXvTHH7@MH0Q0AQkd>%gw@qs#69> zXX}_<%67Y2mVFO1rQtkk&q$-F1=HCw<;h(UfWT~||zG9s$(TJHEbyzwbb76j!G zjY6ksX(6aA?2=&I2O!tE8Mz%86OSsS`3Q(S>>@V9u@im+?2V!RXI}~VNd-ILUDP)DRD@=RaVD0K)R_44i zWh{OmR4cP&l@oBYq8I2+bj(6DxU*C$?G+?P#d<4PkAhAhT}*AvM7pIP43|5A9y;W$ z3q1Pu3w-In`$WI}ovyd9?-0IqG--DL`gBD#=SM&j4jR( zb5@&R^NCTv3iP!d_FvfH@rOqo8r4{W%{0NRaMN|o-jqfsH3rkCQp3zspJXb&c*_jm zA0$H;pqAR%iF5&|e}=K2(uTe72nuF23m1IGg3tB7#fmVVZVmIF=pr#!$FT|102?ue zGCBxUg~eOse_pVw!``N(OKxZ!`~lHBZ;w8a$Nj-)_Xq6N82-mm3=MHj7U?1rTBB(* zw?SDf#7T+IOjfEIhiCa*NMqsLH+2X#9Lu)yz;p#g2w&(#xl8A?oI0k7pg;{cy@Io$ z2v~>Nl|pnv@JzJ=PgI{VYHGfTi%xGwc{KfY7%vnS+~N2c>mo-8@t)mNTf;~pX3du{ z``{OX2OYlVq%(QhE5Avll5F$FXr!6n&W=hD!PEX^Dn@L)SK|#MTh&p#A_)T+TaAfWc*hdB4G;GvnroQq0uo2^x-2V#Y2Y(5-3p* zJNi<@cBE1uwEm-MkB}-unJr9iG0sf;SwjF`>Z49Y0w}}lKGg8KnfssEKZ%}EgnJs8 zmg;GCMlaaEF5rM zRB{V}Ut4f-r*7Usg>5MQ(nFhX*qQI?A9Y-R+_6Td;uk6Q`&u^-O(lxlZul0EZ)l`c z2$lY{6c*^P{w-|zmuT40bPC2enU${qUfKvZ9*vsa8JXppF&FG*P} zsM2V$#)B>)JuO(QJy6XK{^f|)+enu@w~@0Io(SI&p3kiDeN5cNty*b2`e4-z5RrcyeJ9HJZi< z!N&wMu}idu_JBY;wiLM!Ry8bsa8CpFIQnLWSH==`thm>zlIAlgJPF8SKKm6`T63H+5H{yK1gVb-vJo|c zI+7Lk=*8MNgkd6aruwh+bV@Cubd-_N8v^i(%4x7`7JnD}W_iyh%~UUL8WU#@c5#@> z%xW#EZ^cgVWs;ai^s=Ni;VoBOhQ+OGLOl|j3=t+WNu*nyk~>wH62V&^s-jK*KL5CT zp5Dqtxu2@8iS02whMNQ)S?gI{M5Cmr@L^)}oW>QzCqj4L* zGbo~It-En+HzvPTAaU&{S;Jt<@q!;=prhbR0>Ar!+uys!4=&qj?0QO!FiAb};)wOO z+d2sgV%Ev#64eH{TJF}hvG(yjqTq^_{@`BMzq8Pn|I^+6@BQ##^z_Z|$hURdA>Vk6 zCqH$Gt2M@k_WB|wOB7Ma!>TKWJ*r(#(DE{A z1v7Ld3ru>2=+Re*-rxqN#a{52_m@BYCD5zFP;Pe8$q-LsRbcJ2Rd8JEl_9S+e)JnR zSHHFhmV*q#V9|6R9I1Un4j4|D?5TjWd|8ZxS>@rmcbD|Z@@M(QWNDKkBLR#wyUL)|?7BUes5(9+!`7>)8)q-)yeNVsWK`amlatih zu$!j-%O2^Bya)Rb)qUzkI?0Bxt*i_gDxSmr$OQQmBDb#^JVp7&0k-%3T zfHov?x-~`#X;I`}Un}XaJi+tlJ1p0N{+w}jV>#GboH%m&SM2U&GWRK)WAG<9cqjyY z#NbaC+`V_zfB60Zhh?*k)!OLePW^8^!CMQV{m~uYT(W9*Dx55M6cQIUVKu1kfNdrj zRg@(vdsaZMS76shTT2y%-gVvYp#=Pc`SQ6QY8Id z%auIg8@`q&a@h{^dsK)303ZNKL_t)MM*>ef3&@>mSomeW`a+-=hG1crKsMM_2{aUI zlmx5_fyZMP`+Ph*djkL9h~uqbeQm)`F#?cctrDMck92vHj~Ig(TMupu{~n(q>yHe4 zqAhmjkab8>EkH~s-V2Nm6r7T7*n&2H%o+zlKSv@VQJUu4VVpyzl8OHb$!?Gw!rY6v zG#HKsDwkwJE)uM6q`{>*$1pMkiZa1w_r;Y}3nGg$)DF8}Dz>(4L1a_%YpV&F~lObb_6(+YLAMW+zt|LiMN~o2HE8GaQY7%T>h7U15Oph^7 zr@?q08$#B#-S?0yeS4Thcf-GrlOs?v#}0aLI}ku){F@olMzodvr8=rGsChF-ovIDW2+0bCPp)W1lTYs*@$g$$`=5Qb z>gDg;=?^Y>qyHTai_{o62;@PaJ39H@M%W@FYA+1xE_b>xKXrL=ME|2(zI}aO`_<@XtKL(|bif zbT5?bc#%%y!7ByeNXyKmPKWNCSjA&@Y-0cz#J_WUUn>Z#I0%(MZ~*pnpq$~c!)O|c zH7ll*^B^0 zoJ62vogvcy0v%)HGc_GV+)Pb%y}zhJsky!Ih?`A=iXb5}ftK(k@wq?G#Q+FsF0GAR zH+D$`wKDII4Sh#eFp#BfG5~5GX-?f5P&NcsyOZsj69bun1F*j6`mk?KASLj%=)>C3 zxu;=I?py9es7lZtoP|E3=arzh9mjVb>xZ62=KMY@ARY)oYbEX&Q-pCYM;(_pykO#%IwZivz3a=8@ghWG zc6>YMmR1S`3JBz!gBoT?K3=D}Oh5kVApDg}TwO8PZq&vhOMhe|JHHkZ>gNrK=A|xN z@%{d}1_aps>x|=HVuGze(}JxSBof$o8T%iLe8%-E@5?>MWe@NbVKJZOISq_WHzX6p zzJ>3r^Vb;;$MmlClmiwfiEr<*|F3V3|JOf!kUxEUkNqlG!6)HEU;^$tq&UfI+$PjfI+o@2 zi7!=}ff-3`7xJ(i8T(k=SLs;@fK5Wkvf9rt1m1Icu&7J=XjSy3%?XvH<|bL+ z6O%DS4`M1EcMz0d)JMFq)KR3pMsqWu*!%dB=k(gegYBew^X@l(RiLk%v0evYX{r#I zie(|tRdp)!R`kSUJvw^#&yIWm3HSc2irJxkbrgpt@AOmh7!4OV zl&U4z-oN?;U${{mK00Dus?L$T%g1TvyI)7n>Xsq+>I>^a|RpS-H<7XjH!;Nd z0#ry+aETpHSAs@SJBy#wYP2SlW20yw0dzM=U0U_(b%S;1D}CN@dBJEOthjH!xp$Dy zcV^WB1AMJGe6-@w!f?f%%_8qW^d*dLeL3gijHduvxgX=cP`YU)hh+F{!=<3&Hlp%- z*Ld$v(JvNfz=w%L;e5WrSXLUT&_vJ*|JQq5KbpDpUFZcL$lUrA!S)ZGe{>UPlmN`( zcu3jN8Y)x5n64W5_iy-<_m6sb(xSJ{36RH?qdK-xASa0+I=mVrGA7`a2L9a#eDwRG zKYVk+g?V;(pXVDGV?bRr=ROS3jLz>P<=G=H#xvVQ6dCBiNibGHTSCPV0X?CgMwpHH zSVF?pF8(TSZ$1p_Ki1ReT^y75?mD9*2A-62vp38Q)yxA(rIK&Q07wkm2FFo0!f`XR;5#+ zfsYO75reOq+2AtGGJKk{5T|=keNF=A4w<@Gxp#N*_)qk$3%3rqr!4k-Xd#7YU0LW3HE3#lqhe&0>#|-m$)DQlyvuZ*O z9KkC7dp2k4u2JjapqLp9sSNLe$(uMEc{8Fz`}!B(xH##CO5kjnZ^w(1Qog|CMmA0_ z3Q61`e!aX08x=gI$8^q*nFq;b^r@Iy|C0mFZB+fwC%C^vKGNJ2&xgR~Ak5eob*Sm1 z701VIEcT<4HY%CjrwwLWjndSN%m`#*Mn_i`b2v>{(9jPeRYD_CHfMf_IRT=WGnKopVGbV3FsT+;43^yi=A+4CKC-+#cv!js(q=dn=p-$thTkk}ayfEIQy?qUk- zW7%*%oJSXw8!|8|^GT}OxY#%&L+Yhk@W!U>w#sx=tYRcCs%QX@c2Ora2{NH=+gz%Q z!!M+!bJ5{8t$!i?y?0l=uMPV90dAcP&uh}>JeWa2R<`{nxYYBVk&v3mb(3r_1yvM9dN8t%CZ=Z#A%-N zaSf(|s~40iin=(2il;tWn@yBpsdVJ)2=4u02#mT0e01;DEb$1fRQL05VmyTI=Lf{E z^XTNY>tw+zU5nnn2&c3(Wjs7?phG7I>GJTN_K(-Dz49hkMRzVlAbW-q614a6%(^N< zkDBjKx+6Pj_T}Cj-5d>BTY>bQG|C+D#$=UStQQ+&xkT5^&U~B{dpkJ>%pv(Xqt)h^ zbrrAlItP_A>1eb3NoU#DkA=a~$=sOFiImxAh*i2+kJ@1PZ^?R_X`XEVgc-Q+z`g7L zhmI?ZG6=6NSbpm{fB9ak{82+{W7p2-PCnnuv5OPC>cP+3IdqW~p3KL~>xsu|aTDdH zibiI@lQT!3XL?t`%##*g&T$Q5_MBfORqVP0Z!UP{^@hjS9h>m5a=$3=xnQ`0*MM_* z8GobB3S<7cO5vB}W@&SIm(1|l&roD~6X(M}*S(ly9TRwAoXA&YFrgs|T++-w7d=Uc z<4Im6C$n&lL-wK>aHPU* z_&dzNLsxvf>Z< zPcf-<%=HoT8p22)JY9put0O*F@(x^M3ljle z9MOOE3BC2VAJLaTaY;=vD&la$HZ_!6nyV>yTeI8diK%dM`dI1_Wz3RI5ib%(hJbWSBlLd@?0`nB z55JtN4A6xtS+ZV(?Rx%$*;JB4EE^XGuf?h%&iJgR&~kGkw?hPc~na+H2wRV5aWAYzDV0@YO3^ z{?#jba*)*J8~39@9=hT+VE;>p-OmcZ2RTEupm7YGK?CGmL9{*mr{albBG6P+m21d4 zWWf1a@+a$3CK^dElRC zu%Pl;s*gd4!WJ)Ftb4YCm1-^kozYukDgsW4t^NSU!EsjiO+!D+1l;Q!;Tv%1bbs1- z|J>3G;-naTzEfUoz2);0z7!Gj8#>|Gw8q$XY|aZMvwO(E%b?t2mN`i6LgrYR$~RSf zawPoK$F%=XUT;75tYNvIPl6=QrluJ`MnQkBu*7E*T(^2)5h$kE-gD3Cbg*M+-9?R*x7`=x&2IxOR+~%5xKvmFit;K7 z0UH5A7FB zjx=&kcyrMf%JC#hAtM`Kf^-B%Gq{0+1UQQA418tGanKXrN;VCw!}~JsLB5Aofy1~j z8qgR3zFM)*`)+t+v;xYja;HWL0IQ9Q9)+O0%1wKqE}`8~_|20_(``l})LRveD^ zf8x<0loH-z-P7MIxDaqSAJpIW>*-MRZ?@+My8M?(T-gUd}$Wc$}+ z&tU-f3jEY1UU~Zhk8f6*4sT}2xtEg7p(JDGo5djG#88M6!5gMn(L`v@@9E5EaV3W+ zy*#4E5nv71fsBz!Jc1N zgYdUMe6mTE3gh0o-8Ja_2Qk<@uWbXQ8Czc(1nrD?s{UC!sSlaOisFg)KHj5j*6fL% z%!`3EGFmmy@x+6t0!RiL643r8a!y=9!37Ovf1Nc7&lQFQ#2HtcX>vxC44KR-5o5kF zo8qdR(aBip1X*Wt4nUm06J>CoMZmqoGr|xNC@?b9Yid%R2@N7niT-pcM$Apago2bI zAFd?7{Ty$?u!7s*xfD3bG#vz)wG>r$^QGUZD3Kx^KyZohy7F||R#V)if} zzZnyMf+pwKiJ{3HDNlt8c|o9+_3++`TLF3-rZyZ*@Jf8qDV)`ytVa#)H=nd$c%l07 zx9@TPxPghCkVQE!r{34ye8#Eq^K6tl*-Hwl7W#}iHS+c)h4QR z&Z(G~W|CkjNVVA1B7*3t=E=J%VZ{rmzMtDnsMMrF)vBb}Ac&He}B)UG$r!DJ@_9G;Y@B{w20 zoE25`1M*`1-2?7FIO5?EXXs#!@}`L=Qc~0kS7{2lB9Fh-VZW`Ej^>#@h{%UPG0LHF z@GA`$Jr+VIfIiQ7d^9Lo!GjyHH=9cCuF1?CgkZc6(r+5-q*eI%JrrbP9eV+W8rHd3 z<*3v`hy**COb3CEh6jMuK*6vw*P*~j@_2W`q+20tA>>g&VBxV(PW<4W2i@d3P?+4= zwWE4=5Rr2ex)s@G?c8kMG%han4zWo z&!rQrg9w6f>LAd@CB>FZ6eZaR)P9rBe&xFi5~&eE?w{xlA7s4*$A5O~*;&=eldv7L;_ z*m*A!qOEH#PJ9Z>LpL2#0rxJRty_(1iXlA*fk|i5VjTX0LMqxb=-mh0z35n-ZBI4I zH^`7Wg*V$K7Y|4Wg{vBc1$;a(S2k zXVhE?zlRF}R}0v8>FJ&^o!E*}NbP8xF;@5Tv^Y(YHyjtKUgyu?10{hD=Zd%Z9P@oS zedbERLd6wrvnf|sz;HvW!d|L|EDpSpR{wtt7dV~OGcM^!uj5=>tf21`4#x(0P7hRkvUV?-4(1&3K5vWTx!ZA`HFM3EfMsN226r|W-)ds;(%n8tDMD>B=jQe%> zFA?wDD0PQv>FPJlQpF^#M(g1pP?&lM!5HE3#+{ph#|`ZteWKs_qXS*Pws;Uu(e1zA zar_7T=;wYK?dkt6{ljMqTCg`G=kzb{ajSq{3(Mbqs&6x+fBT;99&uK}B1m^CGh}Ek z-7+tOsNBOkR>+*YxNGX4nd$5yLwf@62+d59?9vC}A_y96)NW?$#K0peSYBe-Lt(MZ zgjUAXgd)KyWIWw7_@eniSvRH%1^HNlcxZIXOPfR7Mt|+B(zK6`Vrn}RjD*^11bPhfO%J18TATa?q3i)`&@rgO0r5$OiPRxE?qb+5ME$u80 zEhKJL!Dq%wn}h3_5+KOIVVMgIZz)RQ!1=U#SP`X(0?D663jg4#jEg#t-mNs12 z;*jDW5Dx!f+5h#g9`Ne_toqIszzeYa_A~yuR~PU%KgEl8TL0k-!66*ppr9Ul^wQZX zrB`^$5;;~`1Pu*c9 z7BSh}@Y|qmI9(pnV6u^g%l%T4*NZO$3YxBju4QoM87U}!395uXPJ2)Nn>lzfW|3N8 z#o^B*DHbLW8FNns8zu2Po{0l~1DiJ;+WnM*Re2UsH4d1d>oAP6 z4UgT@w)E098q{S!aGi5_y`vUFIjV35?5hhdzp%%X507}z0?)U!CMIS>@AbtI@~aCy z|98-S<$q=Ut|~>`sitQ;GW|?9sk2iT;KWm^P$O_gmgnEPBhb5o!|!$d;ZtB~&HUrz z@JgS7LO8F;j%M zbe^piqjC_`5fD+#{8p8PyGS(ExDkO;qsh>R#^D#TP>mEy9jSvO0F^SSb&LvwzuE^mFuXQA2QG8NQ(h~! zpRR@F-j@5KL{K;ANEnSYEXT&@=t#t4XsvZD zkj*Bq6F*|uK&w}>ExMkfT}26i3Yafl)rzz+e0I5XP8kaX7_SvE1J*J2hF0VAVn4zGoDf?Ei@&hy~v z4=@))oX%<#d!y3a4buosgRj#xn0W-k|I+*Szq8X9uY>l_8u)v(zV~~F{@o8AaJX75 z$cIWHrYLc?w#TF^CJoPl>0YvvE}BJ)6AzA!nE}P`vMAkE$55*P3001BWNkl)vxJg9|mqa#N!;pptRn2~?)^Chv>Sfo_eaxdk&B$H)TU?6~mA@{?!w-}>uce}27U z{iVnBxz~4i`agWAe{r>pa?W8Off_qk$SxY_Q~}V_bwgz%{Q*MCv|<0sMuxW0YY*;a zX?f*bwD2e|YN>HnvJ=&FS3-j_(=0*%v9(QpFcLgVfrIo&Z1LzW&nq#$l^x93Sk!MM zf0b10i*Ko&m|N&EpTUo-M1x%pv=Fdsw2&yTiq-EWHqtghiFB=T#_XEX`fs1BosEBv z`C)h;FgB5x8wE(w@DDi{jkwKve+~k1r@A~$%pK8*HZZ3@0JsO_!vhX)F4*fr94;M9 zKfa7@n+0%MB8nbkrne_g=-FM)!jpzHveRk^KCsTT? zvlCDMdd6)ejN#FbRmM0k$7u>)+N7b!x!2;7r4awV7gI+0Tv`^BH8vTChb)OiniMSf z8q981q$5nGN<}Y$1g zSQL3D_iWCC`yrX7iJ9L$$`>PxAYJ%06$4V_l*2=}O-y+Svo@wwwS|+R6ua;I6;*}{ z$(#xS%=%jd8kxvF6iTihtG*BMS~A|tDl{ofhUA7It0xl5EGZ3C#C`=6x~LElnku_@ ziPSaSn7GTx^9acy)JFiTLZ0ntX+ZnlicfboD~%XngDr-hbFK^vNyiW++X$z>i)5vE zRNc_m5r7;#d&_eQUzP`O5Ti!-Ebhr&nAmi}w5POZ%~E#ZjL1x~lOr4_Tb9rGbOZNN zCh|>WnM7qZh*A#MOdDE2zJ=zmXS&Y};|hE~I`77XnLRf0>0J;fsSlTg{ZH-j{3|ca654ch@*}8edQM`X<%hyvw!n1LV26^}7f6!^ z%paX;4IGSH;3K&)`>PSINxsvnp(nUOyp(~4+o-04VL+7C^s9c>7>sM3`#aXcm=h$Y zI(&xs69LaVeDYvGl;SaRG=x^moM<-(~d*%Qi>xeNsLuSRQ2$kA22Gr z+KFD~OHn%BuCr?J-VVx z)UMVciwttO-G7_MCt~8`7>ZGDS5WT*xr|~b@N%M|Ob~|j?)essB~z74j<-9#!8H33%lzz~>kMgA^Fi0Zu#0uL2m z0Pp%OW7xK+{5`%IP0wEKtTVr&mG1ORcfQUt6}GS+V#-K~;Sx~auQr;}%5aMKNbQQl zj49Ag+N3%9TtnjeuFU3&NWI2n&JH2PK>f(Tf$W4pE)eEkJhb*4@v~UHZFx^C;hA1}|$d&ykei z4y41`g1%kT)`(p7V!&b;vv;qg2yNDc}@ zx;JS==T(@Q1q>|J+kpW*h^}tn#nT34On!9Hb!$fueh6&x_+ic!=iQpf1ABIZtbu|8 z+YEN`b8mP|$Z�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 Tb{Ifx00000NkvXXu0mjf(~fN_ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/widgets.png b/src/main/resources/assets/bloodmagic/textures/gui/widgets.png deleted file mode 100644 index 456166c9145b8337c66386ce688b5ec30a2eb1dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22017 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 WD@FAW;_m_Sp`og+lCE^&>i+?*!SN9Q diff --git a/src/main/resources/assets/bloodmagic/textures/hud/bars.png b/src/main/resources/assets/bloodmagic/textures/hud/bars.png deleted file mode 100644 index e4e0e7840c873f8a2b351a5e55ea258a922a9f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6558 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 K$#U^8{{I6G>cqML diff --git a/src/main/resources/assets/bloodmagic/textures/items/AirScribeTool.png b/src/main/resources/assets/bloodmagic/textures/items/AirScribeTool.png deleted file mode 100644 index 7bf1b9fedd285ef9226b98570f46cedb04335476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15377 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 diff --git a/src/main/resources/assets/bloodmagic/textures/items/AltarMaker.png b/src/main/resources/assets/bloodmagic/textures/items/AltarMaker.png deleted file mode 100644 index 5e3835229d62abb617d892393abc947afd6f96ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 666 zcmV;L0%iS)P)^6eTjgGLQfO03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00I61fxc|cofEX#E`A8F(&*Djg^IoB>E5REodl=1u-VxSwSL4pg@$y z7y|04K#t{hW|kcb;)Mkz_$E`nPu}nSzJXIT>JQ&(5~rDuYE}FP;JEqGvuO`-_x?k{ zSvBf`d3f>UvENw#g#!*KB#u$t-OjN7vEH#*a^^!t&HzVb7gbZlB zp5t7xmtR|(9ZwDrhM`wVu{=AA{q_|h1taBgcA7sxK%h1E9^{McbPz=m#u(x_=4!P{ z-_Q`3C+-jg0ZJ>1{rxE2MHEGUFHvhvnx-U4LSv~xvsmQK`a0dc7Z3=(tgVqciBQ@yN%YGX7fAN zI;^#rcAJ%Y4SdFdb4V#k(=-pzTKh}28t=wFS5P8iD3`1Dl2&>s~9#gB(Ht@)o)*HCC7s2FB7gEuYDY{ZrMuh znaea8x{KZB#FouRQ2E5re<9D*ng3xK3bzXmL*rdZaL)<*=WvW2JJ<&%N%c?E1 f*Zw?vy`J%`m-nRCvoh>~4rlOm^>bP0l+XkKWa4L% diff --git a/src/main/resources/assets/bloodmagic/textures/items/AmpouleFull.png b/src/main/resources/assets/bloodmagic/textures/items/AmpouleFull.png deleted file mode 100644 index 049b2d75e3b2e307514c0dc037e1bae398364eab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)35ZUNPLhcKF{cpa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-iR!6PeUy7_(=Q0Szmi(`nz>9>=t`4|I5+V*P; z1>QL1QYzefzc*6Up#(ehCV}2rv3Au_9u8z|B(W=ti%{SjzPPPckoYwoUOw7;p4A1>P zXITH8?P32`zP+Teg{ZC~U)u9ov-x&Qfxj<<`J z-28aMV>9AYSFSRvyJpR-(4{mt#QHj$yZ`>G1SJQT6YR=wvV3PPyAp3Dy`YijzU=dGevjDm zX3W{TVJwr+Jhl?uCSZ1EO8b=?KW-f|Fsc76zK_vmW=?)J#|(d95HNVU`njxgN@xNA Dz=4m9 diff --git a/src/main/resources/assets/bloodmagic/textures/items/ApprenticeBloodOrb.png b/src/main/resources/assets/bloodmagic/textures/items/ApprenticeBloodOrb.png deleted file mode 100644 index d82001888b8b169dccbc2261a3200e20c99c1008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1237 zcmV;`1SH!Z3_5jYKm{Ep^7f@42D4w?H(HFX zk8jaZ$v>H}j=a6KM-cPHSFe8^lyvkO5kWF}5)r{yYd&ohs|;N^lPK)nyzSpJP)A;0 z9K}e9G>8aH11k_=iJ6;cWLyT8tXhUbd)rI_R;_z2LwbIch~W6{{TOoX>If<=lUvbX z@$yFrwuAD5k9*Au0tVB{#GnBO4K zA~myqj0fPlozMc1L{e-!fJ)Tz0@9|JeDdzP>?NZkAar!L0Wx@T6p)dDDgYy0(?FQ^ za4#z7P7LJdSXN-A6wyr*6v>x1lCAJYh(xY+<7Le$*YJZl#w(?HPLPBPmp%bXN5?Et z=0CRxmEnOZhMYff29fjqN3udIm27(sk7j2=r3Hlc8J&nc^y2fV?Ay2%faz3{X4ZtNYl(Zk?tunhe zybsKM>;VwEXU|h*`oeBhE>{OZxpwvvDtGm?A~N^cXF&LU(+&_OceVm>`N(jteP1GS z>d?`fyb%?E$KLmBVnoJa#&WVYd*YVwgmWJ3MWE;2UIije0qB_5fkN*KPb1Rz_0OOT z9vRGDTB(3?_IQ7Sa_aEWe|IOebVSpXdgXfq*Ju0$dfzew^)`FK{Y~1;oZBnoMC;jO zeTl%S(mua!-vz}t!B{4mP~Yb7g8x5G|BLoFX|P*1W{#`p00000NkvXXu0mjfYs){< diff --git a/src/main/resources/assets/bloodmagic/textures/items/ArcaneAshes.png b/src/main/resources/assets/bloodmagic/textures/items/ArcaneAshes.png deleted file mode 100644 index 43025e282ba9b41a6479b1ccd3b6025865d1ac91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmV+>0@?kEP)`HXO-~DAoV~0kcU& zK~y-)y_3IdQ&AMhKleS-AsHS7O11M6%qP{%Nfq+emI=VRU*Rw#P}C@ zQK^9nfQayDsGfI*nUM_<;r?1d=AS;6VdhVEWMh7PMP9yrEju4}C0BSTqb5>bOI%o8 zkvlVU)IT-=2m}Iby?D;n#-{q~67$arvbwm8oVvK}VLd_J1Z zCOg~P_zV-%Ft99(R4OHB1buOFzPC9%Y-5Vz*3D@`p%9Tsgnqw|X__RHNqW5=uIrwi z;6(r6ePfR?40^|1KG`;YzaQJS2?m2C5($dMBAHAEt@Urgz$?ry?!z_bUH0s oYqZvg2<38Fd2#AOf1_7^0zHq)$07*qoM6N<$f_7%>$e|u)sO8m&0GQ%`5Dzu9(Y=SNXqr#vF$tf%FBDxIvAIiU=u7WsilQ z8?LYacop-xXB#ulBxAm>7?GO(m&jfk$CZm zojG7bl+VBKE9MkHRbCN6m@-O(2(V;@1_NS5$yCM2RLM{x%s1H%1CiP1?8pES!Sk5{2_gb1S(*z2TQ~L!u;b~sP&xkFKEmLu1A$3)?c0q6r%nw3W~z~*4Ekg` zg~;gmC?XTLUP5H!`ra%?LxBT7?klbuK&99!_l+DUG1bwOh{+646piCfV<)s^qB=ec z1Eq~IesP2_7`uECm3KdW2bJC@cOdfKhi^j2=-3znMcEHlbSy_@?b6#37#tfxrDO7B z?d8s*fin6OrSj`Jtj;OfUs@YcCdC${br$lAy}}n-0tf?usjk2XrmC_kQ}OBk4+w+t zl9^6Au&5}8GZRCgte9Ag%7*TBDEu;fu9luzs~|_7eLfm>-9(aV$fj$da?aZM>AJW| zEwlu%x9nb1=0e-J;TbfzyL$~rFmnD(epqLL7A&+Akg>^2P(W8vpm2Kp94ZelT#3k` z!NY(YIdQOP%Lg*zl47F;S+4sI>TOz!D-bt2WIINL*$XdE=H_zmEq9^PH}q>&&w#91 zwi1A!M+TsP8y79kzR*!nSaA6FV~z4EX0W2JnI@j9#-}5jw2yM@V zk3FzOkyWc6MCIbd*}P4E=4zSBP3Ng~n-DoT@B;uhELeid@Nho>NBR%VZyspouUQEV z4YV-TRJhY7BmQ9?n9~%ydHv&pBy+vr)_or$Th=~;$Y%pb5g8i#36P@9_|aLAw>1+s z^G?kHuk`+AMO@?Wf=%~7+LT$%-@oWT*!J@}=Jj3Busm9Fe|`Ng*WU(c0oJ>sYwQ33 N002ovPDHLkV1f^<`a%Ez diff --git a/src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul.png b/src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul.png deleted file mode 100644 index 63ebca42c3a001dfa6d829e45da1e979f3254e1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 939 zcmV;c162HpP)WFU8GbZ8()Nlj2>E@cM*00R$6L_t(I%XO1oXp?ss z#ee_z&D*?9Ta%ivMVs1M-J-2FwpLcPRJ%H5N}V#1S#h9)4M7C)LZ%FQGsfKLC?Y80 zb}=uUURY$%6(_D;+c~u;igB)`Y1LVi^dnzy8x!;2#i*!r=juFgp2LCXIq(WT9!tp2 zQ&R5ey)FS7YCX)IW1)V#6M#*d-8k*~bG>PXG*-QV<+sPO{evbn&4glt4Y%*h$IV;B z)=S-TVnG@8xWwq72b3%@{jx#nv5WH3?wzcvtE0d^8%;<$TMn}O+8ud%#}-u8%*L}p z`FnMpNTpK$P4INVn@lAW*xfD`Ew7<&VHpek%Q*SbhqN4RB{C7EwW*nRZ*<6@-6sIn zu5_WSskF20?x5`2w~Oi;KO$GB{rq{xvaoD%1#PEJ(@<2z5}yx{Xo)zEf)wTDv^kkBBCPuz3hkJK!v9|F&Zru$KHVpjpOX&t`T}~85kTVelARG=OghbJDG;9tB zAeo9!ux@=Lx^5;OjS}eV#cH+UcRKjx!6Wt^In2cahiMA_CCz4yTwO(R*&Wf zIYWPcKjFV0kDPh!T$*T~k0jBSadf-AbM%iK+9~QC6>9L2;1{ zRaGhQy13ENK~>{=;)w(ni-qCfFlNofw_kk8o*#eUyE#jRk(wql9!CLi^>oOy&F}Np zA|ILP7@ANq;t_PSh9y6bYkyqDX|-V_3`V96rVN9~_#^;g=8SvguwC_JeCXzn-mhy zv`UsNYUpQ~j>fQA@`-5~PKXuae-q5WTWIC&{C{iP7oXzcWbC!Ne*m9-9HJipK|cTh N002ovPDHLkV1nVztb_mn diff --git a/src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_corrosive.png deleted file mode 100644 index 7fa94bb5c3d700340c184979fd146d14c61c094b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 932 zcmV;V16%xwP)WFU8GbZ8()Nlj2>E@cM*00Rg~L_t(I%YBn?Xw-E8 z#y{WhZ@=yC=We@k|GMUl8)lnsUEDEEx5TEGF)=M+9LdlKR|H127rl`JUnG)b3Q-M7 zBgjc&p)Yc#kqteOO?_d`8SGET+RoiM?$36+KihqK5fe1)dG)+_czED>9(V*@GrQGi z3;R^(zzzklVXd3$Ck@tz8~|+D=E7k!JQk6Qy)9V1VC%E z6ZyikHr^O+SC`-HV@;q5%>+N3IzwFDXM@j2&+#J!t2ffRawQVbW=gPIax^qF5Kq}C ziRJA$X4B{k1zc52_~Z8>*1y!sh1<8dpNaGQQ;kg0N3*>d4T((Z0K{T3giuJmRHw>r zMFRO$mbOisFv`rNlW7LSgE%UzG}-)|`|B6p-TMy5y3X?9$R1Tzreii~NT)T^Fk8$RhQZ*-I1}j@2lgMPtEZDsmYx%l$OO0Vq>%u@D;{;C<0SPf z>QKoAG)cI}=B6(eYF18(fhLPb>UOT#$KZi$|92z4Z zoyJyf5b*n{YqWz94^3Y@`h`y?Usbk^cSPd+Ds}pU%a{!lfz?e^xE-AM{w({y4YE~! zCH~W3d$o%#W((gXlkB>;OU+LeIsX2Sbn)&L;nagjse&T14X zviV-S%BAvH%vBWhWFU8GbZ8()Nlj2>E@cM*00Rz5L_t(I%YBnwY*Tdr z#ees6;e>z?O|Z%F8S~*60Rc$4)P9r+G1NTrl;u_i?6ky?EwO4~kJi)@82uZWqrt zPe=n_G>8?B6kGUCnvD8D)`2_#(gI-URFi1?^emxJ2&dhKE{f>?wx6#$n`mr0j=^N0 z>z$_wAB;$2V`FHVwzNTIS%GYJ29L|dy6`G0!*$dIA7syK9khMiOkz@FS92>v?`;?E z7sn-l&2=8+$3sq{eGOvYo9C$whA|tVySoQb_=`|okP}^PlvUMJy|xMjWb#H_wmVc; zSCi137^ey@ve`8A=~)~~F~iqJdGe{v3=a*H%Ot1_J_N}DoXa0MnF4Bw10|pO{{{>4JC?D*`tNNorf0Z4t=%*C4@?#yuvHb^QUCw| M07*qoM6N<$f}bm^UH||9 diff --git a/src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_steadfast.png deleted file mode 100644 index 729f4fb83fb8a58e722bec472a3c8bc77d7f23f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmV;U16=%xP)WFU8GbZ8()Nlj2>E@cM*00Rd}L_t(I%XO1oXxn8N z#eeVn&p&C>W@&6bnudgot+Qp_NB6<3vuu-XrEV$~Aw`N#ab7sRQ08{g3l&7Pg`v`+ z(#}t#Lbz5;Px?TXfyJ8*+BTn7?|sun>-JWpy#~x>zWAz}*AM=z`uf9|HH|~} zC)8`dZxQ)?{=W%U71l7gFpqS3sA$~Ew)<8i>zg_8ZWj-|(uh=jPq&Y%BQduC z*mbuD)6NYwbgubcojCgx8@Fr%DoCCBgllV$(zLmWhT|t`Y_V`*WQj9C)|AC%&*Ss0 zWhPz5lq$Gb$jp;jDq*g4lAQR3+Ffl-j7KTXZk#zCcR9{KgR)A)T} zDuW(0O+(lN%#KA^v3@tgYR6);k+^h;Ybk@Xy{~fM;D_`?{30H|%CFH365xPuM7{k{ z7Y%ndqDlrPU4z^lSaq;fp+-k=d8(PuWl6^hEaY;`%+3KImd|+nnX)<+d6Zxd52NFci;u4)um6EuCWrc@*t4#eKQB(w*3!=(7bl6uCSZ0N zY*hrCn-Q)i5aOoSmp2Ya27ID@<1t+4o5j9+dWc4&41PDnV&XD5os122vu)p$x^YL` zTBZ)am;F{d9~cImk0sPxImwp;&rvECu~Ni}Wc#X002ovPDHLk FV1iugt5^U4 diff --git a/src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/BaseMonsterSoul_vengeful.png deleted file mode 100644 index d4f1683b8cab0ce49cc1c07073e30f292dfc57d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 938 zcmV;b16BNqP)WFU8GbZ8()Nlj2>E@cM*00Rz5L_t(I%XO1oOq+EW z#ee_z?Mrz(p=@obZBtei>K0rWWgECoadX5AnID*l^JB8i7%xb?Fka||F-DDMw-~p9 zb1uDUBjB2gq5ah9O91%WJU87=*Qx0L?9AT--D&((R7^PJ~goCj_};pnrn z@Xp(E>Zw)7+GhFu$S*t)4C1hCqF^eabKo-LFTWt4K6M6F zl?)y_DtG;LQ5c3%Oi(naSz9Huyo}pgL9=fwo&zoHbGv!&)6Y2h+N&fI*J|%P`&*=xOyJ_U<*ivl)4@|7K@w?r8*z*aQ%fnREY(vw_P%y!@MI1IOn=BcW3&U6O zxSUx04XCP0b%~X}KPP#j`fjXdGZu@5f97W~=I3~`r<*TddIjJ2r^L+6JXb;~6o4OH z_407zXfxX;C=kH(h z)uZpr8+XL5&(!8|(yEv7c{0hsi*Lx)g%lk_=g8-CWC|U^GS=sFyXr-^=Gx!!Z!A1)~g0R~A3~HgK5H1Pg zhE10Hw_}wic-8GJJk>CB_&6{#@GrI8*x6i{)owx?yyCBEEd56+mlEb9qhw_>fNBBUEKOfO8IfKx>WMD?)!91+2sdjkWlv zQ>14Q7uqE-#^B#H;jX0Fp3_wG-yhOK%WKQ?T>Z^o_yk{=a42!4j3xj8002ovPDHLk FV1mMck~07R diff --git a/src/main/resources/assets/bloodmagic/textures/items/BlackPudding.png b/src/main/resources/assets/bloodmagic/textures/items/BlackPudding.png deleted file mode 100644 index eab4ccdd9e41c7db83810d817f5fa04d88045839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmV;O0%HA%P)ZN7+D;c zP)sm{#cqv=1~p2EsE|u+K%q&&)^@30xW-VR+?_+Uy&@R>Z7=VAzTfk7q|MBlo*GeJ_gBU6DWISPx~FzHbVjz173$^}Y0+m-6Su z#;)L1d~^;uEQb(y%C=Hb?j!i(35Mhp!#DObH8xC3pI$6rckO(%YI)pcC>}47#5}QN zlKO*(2+z%8$S!fSZjyM^CJ^gy-O%;<#2WzGnwoh(t&-9-^dD(V$tl|Xler-Rcq{#M z4H`wRQ!`=Onwlwfy9quEQKcvV7>0?7QJBGa*FMtPH||W$i_=D=Y>Z+BTWD`}33Wsa9vtYlUh3_YgY$q8 zE#$yksi0@)IJSEy^@@)`=@vdGKk&6=8xvtQ50CYn6w&ZF@da462kFAy1OZtlySB!= zM3SZLRbW|UjkP>H&@RO5&=3HThz^oX0AN><8T zaJGX0Ed#xU7Sw6AXfsj`k?6<#dOf`9TlklBIg$q}@(fIRRn3!NRLSi&V6Jw+l zAqu4pP&Gi?=}hPQbpbXEvLNy7?oIBw_ndpg7{mX-I$GSGoi!IHCunbVMm^iMnYvJ+ z*B?+BFY{vlwH%$1zZcBaYG(Xgnfv$dvb_3(EKLB=mWAVtkt7NAdIQI?c=>8Uas+qg z=FFw3^E`d>kY~^5@qC|Ru}GRGq-jDJMA(kQ&FfcKSbRsf=h9eNk&y%eqA=pa$IrxZ z%;QH7*!kIEr_;gr1NOTvy}n1Y*`hLjj&9G*dtd-B2mpxUn7zGymcB02bzLm2iK2)& zicumcrE(@JfG`X(#^4VF!Z4)W-eNcm5fq|qly-3YE}6+V{xt9SaJj&$~>#c3%q$CP(?doOLH`;ifPi745b_=a-Lo6H=!gaj+N`mhq9X(1G7W83@crM>q!skK-JChpNWC)w+KS$m68ivOv=@a6XUIt%l0szh?<@Xqw6{=E6Z5LU0O3!Xqph8 z4%29w?3JsCh~)D5i(?cKG!a^D6U(xx9F+OtSR`Um5{WpGNQhRujR3>TH&`T11OaZ| zSY-d8ie=gON>Qy=7#j;>TJ}JoHsoRe5a8NUN)F10YGPa`5}88z9>=u?^czBx6F40g ze<*v;;m_dI&OkERLX@FZ=+=1MpuPRAu*D2xICGU+tK&3Z7XJkJ9W zLZNYK8#dodrOOliU72(m&+`yXLleRCeRBPu{|WFf^$W!V49}U@4@Lk0002ovPDHLk FV1kB~Bi{f3 diff --git a/src/main/resources/assets/bloodmagic/textures/items/BloodLightSigil.png b/src/main/resources/assets/bloodmagic/textures/items/BloodLightSigil.png deleted file mode 100644 index 2c62fc0a44405c4211412d91954ef8da2782770f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1592 zcmbVMeM}Q)96p#hhN6uS2cq*lokPO)?s_fl9W5Wy0-Y91MIiIfEOHWzbBflP!o}OaV=BZcN>npg5UIl%ZRKi`x~b+aJb1cFEoQ^?RP@ z_x?Vv#+Z{888IsYf}lu!w$>z$lE522S^Ul&`I`}kSV31HEa$C4IpYRUx`j6bSnp)k z025#=6{Q_O4MES9+Vcv80>e_8<(*O{U?cT9T_PHS)Tv$Z#xa#*1>E`9TIP@UU*X zOR)1C9AIS3e3_s@L{G=B;B*-bPl!3sM4-fwVP3|C5mFp;Is^9_v-Suk@UI(Bwf5vy zxBzAX9=^=Yiuth44}!(mJzFSXD0)LLbKAwFFeO@^Epq}+&}%h_cp|mfEwqeaRDiXT zC`(dG)B@xHrASxb5qJCDYA2;js|Y_NU0>6k!Ec1%m=JNuUaa97k0+MWRZ;nv)odjFrhrWCCyb zzoElKr?5bs{HJb$TVgQ=rcb&+Ts-L`z=_S{7P}-%6Y?emg%;_x>3QC(AJ=v{qH?3Z zZAb^|l`geTXcI22*k|*i?x;ynmW4LL{%)X)3H=0C{0tHVyFr4fJbb5ZN3E$NtR>x@MGm+mll zxJ^E5Tl@7dd)V8(OQ)P_@E<&RKsGpdwl!IK|F;ojf68oKi%FMTdw<|$ys05t78m#a zzDGWD?&h;YD`_a9X=NkR&qhD2oU{Al-k7+ZC+?(79S-jkt_~0OOlo?&5Q*K;`_iYX z2GhkEicm{4^>bTQR#i8bGF79_5sw@b*=P-?M(ab z>eqAzyKK{~l~{ zRYY-BWbL&(E2gzfyMC)PVUIP+&^euUE~t5N y^*t{$ej_8>6w}gFxgZKZS~YSUdQ_7dIu-h2`)I!-Vp(+HU#{2XXqy%nZ~h0obWUIZ diff --git a/src/main/resources/assets/bloodmagic/textures/items/BloodPack.png b/src/main/resources/assets/bloodmagic/textures/items/BloodPack.png deleted file mode 100644 index a3c2b1148c5056ed08da804f650ada6308113aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmV;v0YUzWP)>BO65~nD2T0~ zkT(!D@q@S?i=7Q$KDJPF;Bqf>XYQOiXKqX4Uu-mV%vv*R&7b<)62bEFh`39 z-=SL~PhyG*nUJUCL7kIGVnSZlnvgMBtK1R%Adhep4|jKsF(1J03i2InZTJ||58{`Ff zwX>6TG9@#zPWH&-dSI=`&xs1>TFWJz$5(7|O0##>^EG^4sL)Q$L6@|j*eJrj57r^B z43gnYzedmaR2}S07*qoM6N<$g2ht3y8r+H diff --git a/src/main/resources/assets/bloodmagic/textures/items/BounceSigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/BounceSigil_activated.png deleted file mode 100644 index 649f337b783ed14dd1c95c74aeadc914e98d2d7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 717 zcmV;;0y6!HP)WFU8GbZ8()Nlj2>E@cM*00J>dL_t(I%dOMRYZE~j z$MNrMHk&tNY?9hk38G>_lfHod6P`r8>ZPa$4|)`=C-LITp@K;9A_xkCXF*Y_Ab1iA zX`41^D@19vR`asiolSOUJXC|R^`y^j=J1)B=lKo%V~O7v!^NT=9LQ4rwA$SZhr{G{ zW~eu8GU*ggp1u%U0;3}%I^CDz#Id8yExtzuJ^&%p#6LNM_3$vWv-4P%$+PD#MGr7G zI;wZ)`Z;_06jQNFgoHt1@Bq~tX)+f+;`tqFvJOCXqK{g=NqJ#G02sfNw%6vtqsPR; z7V&#yM9mn5iGa^H`>9Rtf~kWDA;{-*Jv}f0G|-Zg{d@P3@5{00asyv0-d#7@5sh>& zn~WroZf7&#c^+D899Ob*B}L2iSihApmEz0t@UOgH;|=PZ&I2qlg(u4 zk7vl9U&nSN{+%I0XUYI{l)q_=2Eg>I*8-q(u1w2m@n-ogm8;>OQ?O`E=8;~2QVJ<0 zhGFyq073|q(5$X}!EO6E<1^T{L$hfEV1^8uQWA|sdY)l+B_Xg(lgPynIM;?)v2BXQ zG_GusNG4f1K27TW5mp;(J?S%l4@CU#FiXo-wEBwD8dtXX{;ff+*2KJh2)4u8dab7i zU7$2SF9NM~G-8oTCDAINRH}dw2(fXd)|z-MiYvXX{{p~Bp`Za&5a26?VF=>UFiLO4 zy3ur4tW?Bbfj_Yz2oQ#WAq0U^%$3W6|5-l(-`DDx7}+i#00000NkvXXu0mjfkOVh3 diff --git a/src/main/resources/assets/bloodmagic/textures/items/BounceSigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/BounceSigil_deactivated.png deleted file mode 100644 index 8b3ceb944ab8454bcb18a5e0b561b2fd54363017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 695 zcmV;o0!aOdP)WFU8GbZ8()Nlj2>E@cM*00J9HL_t(I%dL}5PZLoT zhM#+9rc=sCVW!v;(Fn33)FRQuty|r=aP7|cCtUhlT$s2v!Dz&Ug^_5Qv{0ykBtQgF zoOY(|Oxruxh1gJqm7d)>i|2g2?}2{|aXPt{&+Cb7hTZ*xUd^&Bau-}`^#IpN^J4L} zI1?~mC}?La&Ha0KSl!qnR$TxL(_}?0a?83)xx7XqVe<0TlIR0mpP$zkbK^XE_<$#i zk8#~m94Cz^PVi~y9RSjhSeA);@8Z>bD(mY4!2C^VM{S-ydybv8NN-JXq^fkXhfM7) z^v2zBid?yr!>jqdngq~5BMiAZHH~Q*Y>s@u^8%)i7Z^?2y>AQH0i- zW-DZ5a|UThZpOC}!eAp)WN>ikqz!1T{|4l;8N8ZLsazrBx|oJZ(OxEKhGh3<*&bUt zS4Ii&=Iycoi1NEMnhiRg4wsJ#Cn_Y!?#&WL3Lykx7$T+Y2LK2m=(M{WeEEuL85~Yl z2!bZQ9{^w)60J2!+wNPV2arP0?I_y$eeCii!BUEG*C92KU~qVt9p@u6^&8ac^*;BR zrwuW2Fvs@iU3C17SZi8ggCECrJkKX5XJG`6zI%N)=mAP=YeH$QlXil1dKeumN~J0Y zfe@mnKx!aKD~!(m1%SfboCb)Mq8rCZDM%$PV*Sh3b-&3*wJOd9{0UP^A*4hKfr?{R dD;2^2jGqv)-2&v_2(ADC002ovPDHLkV1jxcC~yD( diff --git a/src/main/resources/assets/bloodmagic/textures/items/BoundAxe_activated.png b/src/main/resources/assets/bloodmagic/textures/items/BoundAxe_activated.png deleted file mode 100644 index b51a565bacf874cf55bf532db16dcb12e4e13d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcmV+l0`>igP)8I}-Ug)!+aC0hdWc zK~y-)jgn7DRACgwf1kvRja!EbgfONNe7z}>QEcVLh!Hfwg>G6XwrCO5A|!An2({CV z;Le>$E|r3CVG)6#Gd##qWL9S6WQ+3Ydx4!6HA7G5jdS2`zI)I4&i!K~aW4F6`Nks} zd1lV!Bvp)Z-kVZ}xH7~gZ%U_mRRwg^tzoX{;Nh@d(yR<|dHxIiFK{8uwT`;g6U(xc z>|%L#jeY*QkDj~@)YVlYd%woj8_Ti~EAnQ0l@)#x;WvZ#+IaHZ3ba^JK>7i|VgC?c ziP8j|U|4>=ftAn0@!hh53Ejf+WA()50qAe|#%K2`d%!L(0E_-p>LX*OE_8Jlr_JK` zJ}$T4CO-8c?!$ZLw(nEKrHIQbZ-Dy9gsFN5cakZM zjXY9k(pKqhukb*-Uj`LecV)7znej=bueU1fgHoIsVme{zhHa5^9M*R>&3RWI5NJ!Z z%C;=BjzhMPH`IXg5ZjZMZlzMJJGq+40S7m)wFn?r*s7Ua{g7(JA5caZdNo?OZvX%Q M07*qoM6N<$f(9w+=Kufz diff --git a/src/main/resources/assets/bloodmagic/textures/items/BoundPickaxe_activated.png b/src/main/resources/assets/bloodmagic/textures/items/BoundPickaxe_activated.png deleted file mode 100644 index 54c2a6eacb004380b4d6aef981f81bc05faf2f6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1484 zcmbVMeN5D57(ch07zqm-I`kx4R~?Z+ukH1|S~=JqhjMNQH;yR`zk2O^T*tLNdxb0b z5d&M)AZ|JhX3Gp9GU7Hfhcipm5HNGP3Cy_<13}poHL!Ua6Sm2M>jCHXhw+a!Y2WvK z-skuHp3m;|6s|~`tDCFQXp&q7&SG^Oh`gST>F5|7;8GnGJwe4v68Y;g2s z7YuQ%4PI?>WA0EM2yg|p67bd*mN2!I49UW|IZ(DjsRno;(~!akg)pVq;3>P5x{rxb z7@AU%D{b(!Q>AVXlqX66GU-hSgBfthLh5mok;L&V$bjJliespOL~xukS}5EM%{;Km zCb531*tvX$OFh}(fGme76pch8`Us&Hr3w@$NfN~jsKJ1!8c4WCkZA=G!i(b;oFL3d zTuA0b0g73qePWetgH=zbL*PSh_d~-%cqUP5%20(4p|~DHc|I1`ly+Dy2LHP8NbPV* zO$eaHAS_l%j9L%>;y75%-Q$U3imEqMk;JJ*p@UA5sp5ekyPP&yz0tEAOBrz53K&0u zFa&8qSYQMQNnj?#?_+2`VKrGTgfDLAQFs%M5d>zoU{*7RP+lIibTuciVkDdqtI%}7 zP9SmBfL$($JT#SJihBgTpY)l5k+2{%WAGzJlaWSfQmwg z-+_)NzZ*ECOR?Cr_ZRmLc+2hRsNHrPnoO*_lIXCHoo`S^TReAe*|n8?aOu2(1LJ$o z<|Wp(Zh!rP?%0jSd+QoKmkOFYPi=|*j$O6f>&?Q6-M&?s3Dn@~y^TWo# zaqXJVU%9cMCw<(L+73T=1cUY*J;@em4^AR>V%^~tJBAmu&SA8ttu%ja`=8Grv2B)X zvC$gk!+vkenm1>Ew<@WfOuMc9aovH5`6ufV@Zn2^skeVg%t<`AvS#jEgY5T#ilk-w zu7>fuzM|aq%Xj@Xv0yB^YT3$nmfSD<$hPproo{{-NJE>}cYk~1R$uSh?2(MEjs|#iQ|PABU>=?I zVnhEXGHax1B(2r*_7n3mOS=;`=cj$0-vf1+DmT<-4qpFatml;WsrD@|JGRfSi%wjA zc1MTtjf}2^!%fA%ElE+ba}(-cLVMRd=sZ!a|8>z;Uv)$?w5N>nIMNTYmi;|v2lw{X z?K}L;^^2*9uI!G~zf{TTKK5Q>dS_R?ak%ZW?WXV3FL%oZ*M8|MZJ>PUN^t1N+2*z) p@{`r=(I68V&|%bQ^zZU*vowS4Pyf{F)p4=^t1G|IdDO9??jMSXAdLV3 diff --git a/src/main/resources/assets/bloodmagic/textures/items/BoundShovel_activated.png b/src/main/resources/assets/bloodmagic/textures/items/BoundShovel_activated.png deleted file mode 100644 index 05be9eff996c179c6559d800022339267d8c6bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcmbVMdrT8|94`sd59iDxzEHtAz)fUIoMR@_>>=9#VT$ZwbXTBme-QuJC3nBq_w)ID zf8WQ|r{wQ*cOOymFk7+~N_o6T@>2p(WH7uNKz5EQ z22MaR!SW7}u24jkv#vs^(6OALc}`7*Y}5hHC!-aL^u+-mMVA5za)V;lOTu?forNKm zA>oynL*ww7K?!TC6hK~Owu`PTrEvycya-AU5HbM=Bnk>}WnPg8knkukAyy zNTnn^=2W302Qu>lfG{?bXc4VeC0nS(pjV;-DzBInX0QN}7FeIe z@?I#!NV)k6iG*cO$F9Kn9FE7tUU587a>$SXNHl#g<&3q!3FbjZ^c)`W6SXH-$N)}zv6dP+s%a?ag4)PMt%mUaUGkK>vD8#+XG z3JKN8f9fW@B^P68`nU_^#p6B#Ub%S$xl6i-b_EoQh~Mm%3|FA%-MnSCxw%Txzi+l} zur4||Be`Y0vaijyU~*Kwv*KVxAQVM0=|Q3 z%O=Ids+DVwyzxTgRg?I)$I|Ft)HQj}txGq=pZAS)CV8?J)!WWc5G4Jg<=%LsV$p${h+R_9jTwvd!QjAzioeCE8o9-HoIYfyvamu zZ?1m5;Y6@AH|1n@``MOF+Rn?l#h2ROQr`P>;8sFk?}n4LpO(b#uZlg2d;7O161u3}nw_6fMM?Mj zSAUo|GZJgMu1@KVtAMpSPMBWvRk9F~Jt^b;H#^S_KiKf&!oN0d94cq0IjYYt%x`Fq zGhf@WCU(kI`{`Npt@Jwy#M~TZ{)6>J);ZUX8O7)nEv n_Pq9c^R87RH#h(Ki6TmY^$cIWu%!G-=+A1mW?K$t7QONhksKU! diff --git a/src/main/resources/assets/bloodmagic/textures/items/BoundSword_activated.png b/src/main/resources/assets/bloodmagic/textures/items/BoundSword_activated.png deleted file mode 100644 index e47e75d719f482fb776e5935f629da15cefdd2fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1541 zcmbVMdrT8|9PdEgU_OYt;e+Yr5C??oJ^H+pg3xPi)gnR#%$Rb${z`AqUb#DHQQRir zJDaPDZ--^Z$6QD>#>X^bHs>ZXx9J38oNq-x?x+C-yyOAkyP%9Eop5FblpdgD0uPWFDBvmgid4V=_w!QnJiLv5;5_51xwze>pqr6^94B#IFzK_IdPB364PCV+Uw#0UcoL{{K@632U? zFeBsODO6`JYOEEf?PK*@uHjeK}I8#T*!HyykATSXXwR+X&`V_ zz-bnE57ZxGihG5;i*#s#TBSo6mT)0zjhaCiQqH+Ug=%Q?>R_6MG zj8IBz{uKg4{wK3h(^6SaW3Vw1=@LtFG zpT0nLwJWEGI&-q?di#{ymY&)-qxSl0%aXcYMRLg}PlKIvs1F{-%}Ome(Ux$wRNYG@ z#7uZpRjcLe9k=&AX`c{l&p2`a;3QXJYcPLrp#Jk?O;ctBmK4oW zw|91}To&aU_4CBUGyAv39RDbzsBuJo{H$joPQ9}|H*<5x0r6aidtJrKJKs!Q_|=9% ze+!OJp`A2Fu{XV${)0Mo-9kUc0cXv-wG1fiPL*0jhoOI~IgYJ3T&$`~ry8L(B zxq>mSB)BL$`Ep%w+xKZh>t?hyH@2@>PZ9BnlPq60H4ORiq5A6A4PaN3u{b;W@io(^ zgEye6sefHIduHYO}>{Jx#RrZmXRk1J$;tAacj-$ zyGN?4c6TkEd2CU0^w{X@Tiz)gzv{=(%8q*W{l2voQEhFDf-(N=?SDQl=1$X5`m23w zGBne*!Lc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc$WX!DQqR!T z#M01EN5ROz&{*HlK;Otx*U-?)#N5izOaTg%fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlviP6Vr?>OfAfflVIjx)9-9#Wa?^R;bdT8W?*RO zYT{(zX5#2%W?^Dt=4fGLYzfornO9trn3tRivpW-LH&m}9UcFY%MX8A;`9&f5`8lvu z5Rj2yl3$#WU!dUZte_E|nU|7ZUaSd&s_e0o=3{} zNPt+F5cf%^iEF1`xiUpmQ!tWS_2ji~-Fg;8o!S!_dyLENqt_qX&nY-H({ z&)>0e>cZqJ?w4A-6@x4HaJ@QdeMlnY-9JA2t^m26hvN)pn4~ia9K4$&5XWz^DlDvMu44-gYb#DG%uBchF zQ*T;7w6iFBWO3l_blbxsEiG$9Uz9`^Y}~}C-4l_P&GD&go2G)tG!>)0wi#Qm2k&0* zo3^gUCZqY8AX>$tRz3Y#&bnp^3 zX;<6qba?OID;Z@M{AbV0^7s;U%_CHF&YZc;LPx&r*jX>}{I=y%)r-l2Czh_V;B7t9 zwQ=(4?h@~n8&5shA({p2sVLb3{W7s^;Q2N!P0Ssb|goRiD_7;bK{2_8qb x$n40@QMr=5Zt{1r+1&Ln<28Q2FaIZ!z_6a_JLf>9rKhW(%Q~loCIHm25WD~Y diff --git a/src/main/resources/assets/bloodmagic/textures/items/BridgeSigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/BridgeSigil_activated.png deleted file mode 100644 index 057c64bdda38f105e9aecb078158ae18357165e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1585 zcmbVMeM}Q)9Il|KAc}%g49?4SQ&g^Z*K29-Mj_A^sH32zK%*{ty}pGG+AHlrt7eOc zF;-zim$?`=b;_a}h;Hf_$|4ZIn&?1L!tj%bf-T%Fa3E&_TD6-m>u>a&K7_yp` zaG^|x=^QFhY|UEd1bORn49vO`hBU*eDNwS9;t6bkqaly2)b64@N_do);^%>F6oy7k zxDq8i=9E#l3{tU90LjEMgux^@BqznVOiJQ-A|%0Z0>v>@LLxX$N#zut1dTs1ujVvc zD7`vkT#H{R;bM++P$=qlyTxuo%sPuuoFqvUlb{j_!doD&wRVp7Aa<81$e;!;#%XnM zR@M#$7-U_Sl}`#?s%DvT8?bX)wG!q}#Ad6RlHjxgFctz~ z2vUxiffOJlfyoeyiJ>ioLZ*-trXbIo@G?T8R*`9HOd*%zxJF76GE9@MA<{J(X@-;_ zf>^EH#nE;K1huWa_BdAcRxG7*0-9r;29_-iR>87jmSbJTtOHW1poBuJ-ORdOivk%M zyRaHKtrftW;bd*lXoxB68{{z(w*ZTbMu3UH5t&SiAqtEn5IJB>NwitQNTj^`V|erb z4IRomg$C;6KXnt_;)^jbecc88;&mSZJKsD`zDtHu+ouTxAq84>n!(do|9Nh1beiz& zp5IbOep*p*;!MHPkE&*=B985Dtrd#AJA~xzt96e-Yut>RPeX;-)j|WDfG?jRtGqmC z-(ExYY_0Xa-F@xGydwG1RYR4h<-2?X7ca0k2Y0!rd>ivBdSG?i`A3*?cFo?_Kbh2p zTVd0}*;gJ!CeU%jQCGbPs`GU@nyY=@vc|?w&fckrkG@{`Xro|H=ZtRY_RiSe6>U$x zd~!NevFGAtPvhjgX1nR7FVUb=K~Zf-`|#>X6>El&Eh+QEetj1|^=Qt?`hFO!SVqrK2I0l(L}zl2<^Rxhu8aeU(L*h^j9Q1;x;h@Y<<#zZTRBzA{JeRcn82ds^p zuFt>PYk6nKz`3f=RyKx&n;wRo1HFsS7!P|Zu01{9yLx7Nub`(V<(nlj9mma4v7(7P zFP#Q0H4Rgz_Sa7H`JbPUdZzvTSa)LkhD{f1(BAJJ?&Iw7tM+XqQv`kQZ@5-5eYoyc z8YR1&Md_js+%eutsOn29-RU15DfR9DY{!xg%8oVc(@ae2mlZ1ls;V^|RyLxlrC$81xsGHK)Z2SiekyA_n diff --git a/src/main/resources/assets/bloodmagic/textures/items/BridgeSigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/BridgeSigil_deactivated.png deleted file mode 100644 index 15f46a2c01ad7d49e5e04271da1e6050f962fdb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1593 zcmbVMZBP_-96mr%2}pU%m(* zvg^Q7C5ez;1LJfpt@AM@b%j>Cu8PL&V9rZ`Hh_x+9!8*mfXB`9ct8h^^Wx$>vJHd4 zxQS4u10On7Mw$Tw=VJh+R0+|D3<-*QMU>S0m^^(bI=l@OVk`5i!e81WF7U9H6`~Dn($ACvvZGYhJK0|GM#5Yu;Mx zWnc@#b2UC%%!gw^6fDN>$wCoB(Hp$T=Ms}bxe1Q0@i44lB6Og5BDK5hxD2H<4DFCZ zv>a1Ic1FQKm>f|;4jWB5Lgg9wAT-rdAS| zEQ&R;yg;!u6V-N!+7npg6S26#$4~<2vvQm}S_Nh&Cvd!z^8y9~kX7np?VO)~F_NK& z7bX~=YYk)1^Kl+vJjA%`G4cq8Iv9tNf*6||g_KGK0%;IT4yhU1rlRaJTBeYL6L|ao z4IL~x1xM=SKXnt`5{of1ebfcw;!z(ltk^t0u}f|o>DVff#I80GdTZdqZp*TwR4Pq( zIeY=M)NV9pRum_$Kiic%GD~TDFE3P`nOAyZ{n|I`N1i!UeWkTspPHK38I$5hHVv5b zm(7_RH)BR-_`y`rgY^Y`|2zQT7V@HrWc zSaI5w5BD7#UKzhFef6KC-IZ-s=TA(!V($AWYwXuG=av`j`D)h-EqVTi`C%Zp<<)*g z(nw(4&Di)$N%ASV;LxZ!ZPo9=^TVxV&yrK{y}Q9sAf=|}(~73JGjI02b(>WKTT)94<4t{9 zVbxE`h(dNMmLwgjMJ3M_8KvQ?b31Q_PdAUm3d)A6%C_PxXY%ahx{9WOn6uYDcDl8V z?%mI3;HrVf-*S%#CNO;I zOXOtN@yp+2sM|U`==~~kdx^DRVTyZBefq9 z@3ey(Chtj|zTgLFlMvhV;Cgsb{m;iXP)`U2+13C60ia1l zK~y-)WBmXBKLaIziBt{WwgvtFxYh-3D+{Tb7q7m=@c-u@28U-F|21-NFfx&%xoYBR z23xmKhA*FgBP9O+|4$Hq-5U76HALnA)68B83U7$ikjGE~fY#gLH^&9HyTA_iYKZU*(7>x_(yj3{Blh@K8wUF`oe zaxya9d;WpJ*_w~x{_T4VL7qGe8o4(Zv4$?TK+Cc=`oAeB?!TY93RY($V~l7Fw$%O4 z$ic`k|IkSWCN?I9C96d6Mlak8Zf>E{KVDvZqAJMEaQEeVh6C3hFxtw={%2rdVBlqE zXV`Z84kON_>|v(&pW)N(CwcJ^43{3iVmNU90V4wg1H<7*j~PGx{KfG2(`N=JB_*tx zhS9>M|oqndvVZ%fG+>85!Qbddu+d_aBmTBO|5R835kk VDxLd03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Ia}L_t(I%dL~mYEw}V z$A5E@dy^)ntxdF%Qbh&Pv`zW|;@*{rwIJwDid&z+r%><#1Wkhr7owuHf<8ggq)lmE z6hTq*b@Op=de1#BjKOGJ>8$1q!|$9q|Np>0hWvV1T3j?IW>Xw|{4}gtmPPt_l4h$- za%PI>FW<;mKrWj#Ge@VmcI7f#J9`A$2OtyM^6d>xV+96>Q??YJ&yPoE($3i!(1JNJPaYd0SNeO6c20dRYVBcG@MJkP@z zL$~MRc^=@<>mLFMh{k~U;2JQ-{0T_Urf4)BilqvvWD-z>LKYx28g-yczOXV@Mg_3( z_MHH9I$b*54$$UH{o6nVd-!|+*L6`!jRF8f1QE!uUmX-eKo`ep4?1k}h3iBkk&!Wm z03|}R)dqx17ay{>yAKGl37dE#!Hw0&fT7uHjks@^FJ&_3WFU8GbZ8()Nlj2>E@cM*00I$7L_t(I%dL}5YZFlv zhM#jYxk*!MKa$!MDcA~v_RFP+h$uzsM#P=qPW)#s1aaX)R4lD%^#>$v`a#_kp;X#V zGRb6SI`>`|siD!j(zCngz;k%d`(F6RlGBgbnHe`eR$}-2UbmOcW+|U9Qg1XVjtuhV z-IAOMn4g<-Bg2C{da%ga<_^}R0AxH5t#hPlO0~L<)*kOatVj>w+Wfq`P#)#k(Pk!a9YB@c7{*&L!NxUBZ}z8`p;ch}y?JM^pfD9OIlL zY)8a#jMg6Qssm#;oibO@3`>wbcu*_|&f z?~%{tdSr9~N`!i&Ns@%jP7kuP{f$;@k3yfOe_()xJL6azQExPQ(&wEH#MI;ju*?3w z#X860y%~-U8~A>Jr!p+uy-20H-E)I3pt8O$#yOYMS%!wr;jE!j*#eOh7dj3U`tr1+ z`0T#`FgHEz0IV^j)}oY9$Y-&x6YEA0vbnV-e+B#wGsYlFp+qp&vR11J|FeDqL1^w} T(7VC)00000NkvXXu0mjfS353x diff --git a/src/main/resources/assets/bloodmagic/textures/items/Coagulant.png b/src/main/resources/assets/bloodmagic/textures/items/Coagulant.png deleted file mode 100644 index 23bda1b1477b68383d3f983986ad383c88d8b3ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)35ZUNPLhcKF{cpa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-iR!K1>zzf<@fQ0Tj-i(`nz>9>=2dmRZ7XxqP7 zEl}`?tNg*+Q7@Gvp76e@F`s?(n4gGZLat(jtE04jw5l|B^UXJwlP$tBr}e%o6Z11Y z!*l=78P{-2c zJNn*BmR(cmn;GReNkwF7YUa_$1?x}e?!Uh(LCL}81iSK^EZ4 z-y`0n^M zM1;mbVFI&yk-q)E%S+x?*v0RwuZo6WU(Pvk&dF!}(pO=nlmO&;4nP=&r5{fY!%*7o zw#?^q@jOo|mCBbUuav9Rs&qOX>2|vk1cAhHEQ`fLeBXZud3w9+U@%}hof1V6*XxyL zvq_d^>~=e%D5BMBVT^e|p6nBMf&bbf6rMHmfa>;77q9}^T w`(1avUVr}&?k3h+(OQ45{2k<?_4*|K%4G*SC`9s-g`ctBa~8HZkqu3X~j<0rg&`QXMa2mze*OHRD)Uubx5+?=*hB-^dG~?AX`fcRP2=w|LTH!H+&QvAKp2McTdX|V z+Z7+beWulNNvBeHsi~N-gLYqKb9uVmHvL`~x*aiQ05Ivf;>-81tSl~3D9rHtq^GQw zr?R;`oz@AXfsZ*oB`zfqz^dD1N@aHU_h}ygVY*--goa}`$mu##%6Q!83?dQ%nkvDB zfPSYdN-+$EjD|y`l$h0p82!CkZJfm3VO@kWRCqnnAB|L3O7a?_?KYJ$nGqND zBHG4??T9ddwbfOmln6~j69O5Ag#Y!CPF!`J{{g90_uf*<_l^Jn002ovPDHLkV1m}0 BCfWc1 diff --git a/src/main/resources/assets/bloodmagic/textures/items/CompressionSigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/CompressionSigil_activated.png deleted file mode 100644 index cef30337046869fb64f3a0f1dca6b33811b6d977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 747 zcmVWFU8GbZ8()Nlj2>E@cM*00K`*L_t(I%dL`4PZLoT zhMzk#oz^N;+6u*33B<&x#v0WJ?Djg3~?|y*U=%Ho1(0ITd&r9J|D5h z2)l(Mk#LBoqc6mvfOKc43^#=6zj}q)g+)Bq0YKF>bls2RILyqKGwzjueUS6i_;Uju`E@Bua$wWfdD7cVL%VCWR>#OYLmRR)msE7&+rps{jB$@enQB@!T)3TVlevP5F1WvxpgZOFg zC=Nr-O?c8{xT_oL!@TS6ty!W1VB0oQN=ju5+qS`4qfl`WLdEh2xp%3L+vAfwKAS>H zSp(1jVog!je{3>6lcA+0&e~cARrOIcOa`+bIks)^^>`iqxg1lbNlp#cDj0wHN&uK< ziPq5(${Uid(GdXdCX*EF>$#swLD}MMycI=JY5@R32!w#KGYLLaOrCW2P%M@(j3U{c z9W+%TuL}Zxf6X_l07VFP3q{&jGelG$i=RGoA`<4t+%yxH`|#^3q0KV8g+h({w1f9- zYmGCp1XB0#%rcE5&lyU0AXdJkDJqk;&BoTw->sZVCZ%8Z5en5IJ(r&wc@P32_Mb^9 z2_6Yhwru7y8Sw`IptHSQ0(h>A<9R5GAQWFU8GbZ8()Nlj2>E@cM*00KBkL_t(I%dL}3PZMDj zhM(`7=}aj#4J}tAK@7xlYtaA+Mt5#pu`vDvmoEHcF5H-a5;f|=7{j8_QVg}RfHYj& z=}c$ZnfY9hG*oe=XLn9=p7Wj?{G*A>&fM&*8X4-RvVYi#MIsS~2UFDQ4N}PjuU6N^ zm4Iv}qmq3I9dUCd-JZ7CjsWOS#@J%kmt{y@?|5( z$fplDu7_pYoSdFeE|;-iyyV{U0+wYnl}@WJ1$VMp)!&z3y!?aSxJe?OAc{|18Z=ri zjq^IkehXju{B+usQUesWw?#*R0&LeM^<;(0?KDy|sLp5jIx$KqJpn4@bm1-{+KaZd z*fm56;CUWODV(N@=Xp5wBbu!?LTC_;v44M=sm~kK=B80fbpdpM;h}yGtH?LQtzW5Tzn< zO=tI8iGfs->-hpae1K_a^f+y5^?KL!>6iC;YkZW_cc_LTq21(QbsgrW5tRdUsd3nB za&&V3=MVvM`Md~}Qc=?&k+_Bm1NNkZgDOH?)Kmil#CoDMUGM5&0LaYDD1a~s@WT)( z1+i#^P+gpL-Et`I?1;Yteuo7?fRGX?1VI?GRVWDlr~LxdefMbc{BR=x0000D+r9>D>_X;f1H000McNliru-~${EF&egB@D~68113pC zK~y-)1;NXU97O=Y;a^o(RrgH#G1Ie~%|kSb6>^`((fmDfgVVYD$dJBqqiQM>jb{RTTKPOBnaqbK691 zhzepwywpd8hMF->Yqa+0h6(kgVIm5Q=c5Zls~U7iBP@hz$hfXibbR8a2$lAj>{yI8 zm>`6XBfE9r7N6~lz8EmpV^Y6QQDT(STl7$pG*K@Kwqs&T-=@KOgK^X98m~uM4h;)L&PBGHp8ECa5 zO8Tf+V!a9}lqAn{8m~cXjkT7f8K4@ES^a>(DvG9JT1?ovzU^W^BF`bzsl(o$5=>vXshsrhwRh_B`qqH;*)D1GpjS+IR7Gd z{=3KeaL9g^0T4$W76u7F{k}$dw{mSYA)k(sqE*zRf^^h(-74X$@4jcawZVH=uCTtl z&0kwvEDx6Wb#;R;zW$b{o;bxzD`&9d(Al!aJ9p_MhZj$|3oB;`wZUQd@!FsG9myc= zu(7$z^}lbjdH)`7zx66BkDcJ>fA28Lhoa0as;(tFo43X1_t)IJFJGqfh|lpjX6@z% zqE_r@8Mjw&^3jLyuo(CF^6FJi9!$WIpTjG_#9|(?3L-Vv_(hPEKblkI%Tf;-DnThyc6}mDbC`o`E7Z_-4)B{B?_x}HdX7L-{ybswX11SGf41dmi)Qhn=SfO zB2OeAj{YdeV6b@}!}W_x^O}lQWv>o4v0t}1%|Dv++PnNG7u4(+D%bojkzeV~3W^g? LS3j3^P61;%q`|hKHjXK^4W+0&w%JX)G}+zmZb@1J zp_GUCMjd(S;2SHbj1MRbfX_tK@|o{fRBx^g5o+(NDH` zj2rOzL$JiCUeb z&(#v@%00!pd{O3fmQ1U`M^Th6+nz~TY-W??Hl4{xSxBRuq>Kh5MN>xFWYonjy)zwH z4w?1SC9Z;4I`ChPzDiXknj}M^P-e)SDaw^3Ww+Z&qlq+`3_xK}>I9Vu8wBO1Xpqi0 zE>7{uyrlA?pwr?q6=JQLqt|PR;#cgxf>Jz@pv2e#ie#9PNGj7vrgCC^aUZEx4n&s5 z`baLo1vx=gfFG68PpT4CQK=GpNEx5*F)^r##}m(;a=pP|%G8QFVHQ9TLz>c4@zzNk zS;8q|t?c6_%mTM^Q>wdHd4HlfT_R~SJ+7S#^F6p}Gf}rlD?}^g0QXAg%N(PMvR4!X z&S;kvcOul~=SR9qmob?aSTUrGagfO_iFzlZaV|#XoS+}ApcBE5m$J}VCfaN^7;UuC z2nC5MlVW&8miO0njgjp&nQ2QFOPB4(k^DLe1&oWs|oZn!x zQ>=ltWn~*G%r?7$&1NiqtJ%gdMqdP?#{;`}3+)npwc2ipg=YU{Xvn===!r59PC6z4 zX|&b<+Y~9nbW2spE1*B?puPp&8#&8Lxtgw{of82*awbWPtZ>?n%h7jkx%eR#Kch6C z$j+r1pLUu#ecFcLSO?iXUvWNuLX?8hunM45vt;Z3vH-qsEDfPAd2W$LyXMj zR)U_mn7tm2+SM&Nyo1zE{{Y{$5Yf@D_37-`?)7wNhZ+rf0j!IO)PQo3-Nq7`qxy2K zrh(dsKHFpj7x?M}SIiZjPIjGgVOMxM*)`!gN#IqdDV8m181m9i-srJV3LX+Tr`2LH zTO4HaaI!}+ALat(E*|V(Me9n+8uLk>Na;AGCr4-^<`^v%^mQJoWONifEP&?}GX9{_ zwaD>}@IM=gJNlmk!{KlemK-w4=5)mxGxL_Jc8{8Trdr!jd39n!2*m6rh&9EE+isYfN{YzkT%AJL<9>kE|><= z#<-A(U;)Mj(?Hr77ZMRHz_?%XVQ5y1kC3#NgzF)kz`Sb%ZCG>|sNg+v4kFfNz|(#E)uh+qN61=B#<7#9)|EWo&6 z8b}-CLL!0%7#B zA-9lYaz7Y&(z-T#;}d`EXgxeUD|c|3^YSn6{r$wK{iOr)GG5AaPHk*S?>~D9wY>DL zTX%0-vwqww&rO@TZguO7-g{a@&OM<$e^UAnYd({`YhK9MIV}IpeLMEnUG?6v<6mr> zJ3MXB$OA{E6gY^sG>vbKN&c#upwjVGNLQJHPtJ(|=#KT3MQ5YCJr+;PWFp&U}7i$)0Js^s@!8f8Eg3 zRQPg9KjNIQ-Tvw)bFQuY*!6Iq{#Dhabmyi;KRi8n(Te#k8)>=uy7LcpES{$nJ<&Yo zzIV1=LS()FSHqk;w#$1P2R*;Ad0*P8vyRq%y;m#u^f`aj5$e0Pm-^wN4adtKpZ4+3 zi)#n{ZIp(0=vvlIur*ZS$8V?)4%NkSeE|dIg7q6QgIPdxGj}A7? eI%w;-p73li4frMFe(eQR!abqL^+w)|hJOIZ(V$`g diff --git a/src/main/resources/assets/bloodmagic/textures/items/DefaultCrystal.png b/src/main/resources/assets/bloodmagic/textures/items/DefaultCrystal.png deleted file mode 100644 index a1e5c7734592f79dc249f8adf9dd2bbd4a867e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmV;G18V$D+r9>D>_X;f1H000McNliru-~${EF9voVlZOBR10qR8 zK~y-)1;I^E9AyB&@&7#Y%rkF0v&$~aVr$Y`HXvvM2BQ~a<3T*=MQ@(!-NeLr({JF# zZy+cA1YFdM#xymyH7+294XtI@P@xF>HZwafJCDDgap&u=kV2qb8>wuht3X<4>Ec>8 zO1WedjD{o1Bqhybq+wtr3DYP>x)qy33xYM_9YiPs3vK@2~V&?@>9PxZM!^&fXbZnZf z>s0(EhF!t+t5|LYnU`#=wi%Biq@j=~Ov?ku#j_n6twlUPKq}iOm}}rx8Vn{WLI|pr zDmtC==c8k-9Az}>b0kTEDGah?%vChOFid0+B80L*+h{E@Es63&4BO^xn(K|#Hl+~S z^E~_@;Mx9Pl-eXWC8`oIH{U{(!eki5%w{u^vrCjIx!Uc}axC7i)e&V$F)Qisc359s zX7A|JE^7yIVT3co~iZwu#XGGB$famd4udgmMsm<$1&j^)+hep_@AW0Hx zNPTuQ?w{mu^kexFa?|A3Py zqB|IH%W*h3JY;+OTV7dNWqqZMnpiqZBFtCcdyDqMnqGgojb{j?VRG;H`$${iS3}O8 z{ma9HLwda)AAk4}OE+F*_vi`#jQ=*GafB?>l1}%oasTX8-+BEFyoDz7j?H1Wi_CHc zSC{Pl@qo`i{fxRF@ZAqTQLkZ4CPPM}3C0)O-w-7UmMNK84c&kEfbnp^IEt9%8A>St r-I{L_Hs-m$@sb#gN5qo}Vy5{YfV_0quEgbb00000NkvXXu0mjfYci&< diff --git a/src/main/resources/assets/bloodmagic/textures/items/DemonBloodShard.png b/src/main/resources/assets/bloodmagic/textures/items/DemonBloodShard.png deleted file mode 100644 index 58fd68af9d95a32a95cf56e4e1307816d499b09f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmV;r0!96aP)F{Boe z6X-I^qRkA_suHXuA`)DLW$I|AIcVi=RMfmQb6SX_173RJY`*iJhjYGj5E0gj=(2mV zUT$?DBE;Qt1eoJ)I7CFmm{qnZM2ojM#cj>OXekwdow-G*t$F|wPo8CWcDb;DG=Qf5 zG5^Ch1X-L1AR*Qi05RlUBHrc{)8+eqsOGljsG|C}SZ`Khw3N#E>=JylQvjUW6TajM z(}=iGPWr_w01VZZ`8(DC+}0drtEwhA)}&hd#_^600^nKjqU&fO@yKa{#^xm>I+U1{ zBo%LSGVHKpw3Ldr+=?$$QyIt4(AC~3$8rnEYw82QQdr2}k1tW-dhE^ZOg1_JsB0ft z`2zsPrfKW!L8ccO=~d zDlLtl4UbqC@M>fXJqpbb!qeIZ0Ce5eFCjbBd diff --git a/src/main/resources/assets/bloodmagic/textures/items/DemonSlate.png b/src/main/resources/assets/bloodmagic/textures/items/DemonSlate.png deleted file mode 100644 index 9c0c1d5bc1e23442822e6e13f37337dbd7bd9558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 zcmV;Q0$}}#P)0J(U1}|sfy6Vt@0*n7Z#YAPO!6A z?Y#wqL6TE(8oEh57UjjuSH}R_pTlA{OCmnO{y|;MrjiO!fNHnfs#-f#@mN&ZO_w{% zw~qltDaEzLMN-L0cK2&4HWB6iy}N9d%J^OffT2KuLZL(`6u>YnIcgXbip9SM0_;_P zsPi*ZJbm(*wNE)}^*Wa0qMH`y(mFS;FJTxKM-4*_WT3i`mfK?W{YTpEHjf@Y;MVd@ zK9^R=t#9M9M?5ycQNtJv(REz_%w`k2>0p>98yk5tOJSZr%Tv?85gwXBL{6SUaykJ( z^`K5JUnHHL#R-1p^{UP>CPG6uu`HYIN`-RKVloj!w;iHmVH&!Q0R79?TO>^c0WMvf z<@?qSmSy8B#qQ2F<0C27)=RwrwLXI$K!6MBlx$UY)yQy&X!I<~_t>u{6%JV!B zAsikS-LUymDxGZbZ)GzXJkLWk4NU~k_sMsEJ{90J^&9FT4-qpI$QA$q002ovPDHLk FV1j()BPIX< diff --git a/src/main/resources/assets/bloodmagic/textures/items/DemonWillGauge.png b/src/main/resources/assets/bloodmagic/textures/items/DemonWillGauge.png deleted file mode 100644 index 9b2fcb9bbac792ac20cb33d553b44667a09592de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 811 zcmV+`1JwM9P)WFU8GbZ8()Nlj2>E@cM*00NImL_t(I%cYY`NYrr< z$3MSq-CbQ@8QIe;$|xbsjLM9XGRQOy+$hl~C^|$CL|uZ6I`p{IrBhk-z{=7NQ3r29 zP%cDfWt-(|b=5RqoBR0h^52F_M^?vR z^_#(sntXC?mDua*AkKpB^U~O{Py~f7t6zl!LHq%ol{<@g*U-fIx=*nTJmVUvGc!>L zIb|h0buN*6j~`KZ@iL8_3uSTPCIVWB@wR4+>JI~Bv@pZ6jB5_zc+wJ;9tt7O0a=idNq?V{8731U zO{1;(wTcedwf~?Lt}h_jY6akK<3l`YiK=4F1{vyi@xs}uaD9`cc~alf zDob;6#Q;#-(Zk5_5ZCV50nkGs-rMciySl0E=%MH97lJ+?059M45{X2xcXgxr{l6p> zRqT-sx$7_(;{bU4p`j#ywb`A-~Ah+xeNuN89 z{`a3nDKMGMjE{~{nH^DDIE=2Vsa7@_P3V4|4{zO+W^}3Vg9BW+eVei~XK{~DP?Zx@ zLlb^XMgy+lA5)E_g*7JKW-P`Cz0NVVrAO51g9k*{bxIa%$~!4c`a;Z3HIra5{;{Hn pM6;$UI|lzN%kt7=u$t~W{{(6AT?-1jW{>~?002ovPDHLkV1nBAX%qke diff --git a/src/main/resources/assets/bloodmagic/textures/items/DemonicTeleposerFocus.png b/src/main/resources/assets/bloodmagic/textures/items/DemonicTeleposerFocus.png deleted file mode 100644 index a9814d3d0816a288400454dd1e556187b6b5cb80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976 zcmV;>126oEP)6HxRf7FRlOp03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00T5hL_t(I%T<$IXq$Bu z#()33N!~UgN!O%nwRHV1TZf&krDY6MwCal8V0vL4!gR%t3UfDp%x+pX+^CZwIAxY? zuvNVfRBDlll2tD{1ji6RE_9{c65G^n{aTWydGmf8FCxJnIGl5M&c(y?@E{_*dANsx zw|WqfLZ3OZqp+XsZ(oNUc<~`#>3;+fK@A??LoQ>Aa)F(-)zHaH3?F>}v23|vlqlPD zC^v44S9jFG_pfoVzY7r&<Fh%j)dTbjGNX)1O2b@X#GX^X!lOsH#s;phZU8b4C2&5+KxX=vFVO*xI)*#$eh1X?~%|YtBQO=D_ zC;&IW>DN2)7Wvs+|1`$4ImSQwkeq38Wo-+#X;SITVCEKyRF+a4sUp30g9AN{oc?AK z_1?>^=zfnB`#f~+eThq_PVrf?L1`Y3L^e0keD5~KFMNuTN~zvRTta>ivvaGMwno~_ zxW2qJWRe3LQY)9=E1) znH=+fe9!!?RRC<$WY=RmX$+S!K0QftW|mwg1Ar2xyjWxnH^nXu_kUIu>cswLh11Aa zqoa6=i%2Hs&~z_KDf+sq@w#2>{*{O@^n8mH1$^99?`P`T9EPo_i#J2Ep?VXJWwAIl z&F<1AWtg^9l>3M!R?#)Z`DiR}RaUM$FI_HbBqS}GIv%@zW6DjVz<|DEGP?l@>vlPj_%tg yNA@<$|0Datqcw$l-^2Cmu-$DD>256-5#e8&cbl$m?|?@D0000D+r9>D>_X;f1H000McNliru-~${EFEz=|@{s@l12RcO zK~y-)1;I&dRAm6b@&C8HZ{C|X^JeKR77T5%3kN_Hj7G!|jnQx+F>yJX5YC>xs7DXp zyn69KjN-wVcr!}e5DP`pY9z)s6d5SP?9(^%w)y=1#7A#lL`uzEv4p1to^oJ1!POZB zlS4TI9i}{r#|)yF$T}FUX$!%A6rvBf6(XBZGdUXN0M90*D#Fd@QCWy^9NfH5VXBy9 zmP{G?;TUc5bb119%05kHSkwl|1S3-9TnQUZ$Qgs{%_FR(;z`13hs>){4nlT%J+gcr zT@i|dMUSFZFznzs79(AXg(|~Y4AV9;S7Pe8IGID@)6T?g3cQ_=+!7!YqZlg z#wp?!>IkFRT4>qRJIlh>moN`^(X}O#{Rzo%3#BAAW=Li;U<`2|*9169Vd60xD|`0I zXV%zQduWAUKtFZ}k;H`Q2rVTAsc4pbWGU^~WhU0{r^RAixgV zh@6MbIXD)o!68aQqoNq8r6mkQR5n4IJYq6Nln#&yMH>G{ibm`YuMsu#%!IK+M~~&;#zs#R!Tne2j)qWF)zIK9N)=5Y^6~osGp@fDqw{m8tgJ0w~^`8 zGDVXPhj_tBPCWl2cei`o{QWkw*^JSC4}ifq;oq&xEFW!9FD{cQAE7+t)b&w`q`4l8 zpD(>n67@K9?lk}0zQ>*I9r~R<072kVohx(ohfQuC>)J3JGaOHlGcD-GDGy$1+DMeR z^y#fdKcLea;^!20 zEwnc_?=l#S*dLEb;tXR9fUP&1RI34J#F~86?-9otv4;Nv7d~rX^3)y800000NkvXX Hu0mjfYr3n2 diff --git a/src/main/resources/assets/bloodmagic/textures/items/DivinationSigil.png b/src/main/resources/assets/bloodmagic/textures/items/DivinationSigil.png deleted file mode 100644 index b8a7fa349f7f94da58a485174cf0bf8de3ee7862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1583 zcmbVMdrT8|9IwE(4rGJO#VLsA(fLTcS07yOv`T4r3(`=IFeJ~Zrz+sFVO!!#1G)vlPa;St6oNwvm=CxRj35XEl_PRFBqE?-EhkW6hzsT>6!dJ64tV^6 zhv$H}BIV#03K~%K^!XKhev|2iFc%ySlo&E3O!*NEMiHMcey<^PP_VH7y75wU&|2$f z5epmS7Y1lCAI{taS&ZGQ4aI??H)Kh`BPNBa*7Nj2AIk|wy#^FdV8+9ca*R^5v{M1m z3Ic~1R>?wy0#!jy2TeH@YLyySI1)N9;~TU}oKPwVR0Lv}L0OTv8WcDS;1IdA>SP1!gxd@Ig242Xs1Ma)pOu_)u_4JVVbf ztY-tB8kQ*x@IGKD#H8mX=1~H3vQ8BRu?__WsZ>f7Qlo?d!dcppM=^3*u2g`-eCGd# z4iTL~;&t+$x=Cz_#TcKy=mK%^qK{ZkY@UGFCC}2nS}BnvS&e$FHQd{>X1@2VeNGCn+1Kmi z<`r-Ey82YbeS3{nB}*ee4LGjWH{#1T-O&7eKf8~ zxq5x4ZI*sl)#z=di@9?vJC}7o*>j}6CpO}?Dcx&K5AjFxC$5bx-rcmb0@jvV8(Y8l z6HANCE%s6akH+@?k(Z-cls~VUx_&L?_Q1rhu2FkFTVsw?kK9`KWwy(Ha>tLYo87DP z56soh*k~v(MVDODEM8~2yFT5&Irr~@hsLH2t)G|FY`x;{z47#X^w=boxoylYxJ2lYa9{bvkf%O_r&=^K^LRw2Nu> z!+F1auqB#mcj2x|>{ethTpW?1^|1*}wkv5p(w#RCG=F%yvEb76Pp>}sE@n#Zv~)gn z_O*AL20tE`=RUb+$Eax&>;_r(zIR%weB6}Obp|Oumnm&YR&8H#|CaL3#n@4*d5r9M o)4|RYKeOb0{EE?H!etlv) zTr~C1$CBe;p6C1f{+|0hFL(dk%gt+^oMWgp5Ck!&snOR0f2+0c?3wWIx5g%T_*0c= z>`(~eq50bP0pj4$0)k-QmD<|X_TbZ;AjizSD2ISK9ZNtpLAaktCwO5CP>mtbCB^H> z&)z>p8YQuweAXVMg9$H)NR9nT(AvMIP3Yeuup;?{$KXzL&>#j>-k6R>;|iCqCo{er zjJ0NpG-f2~mU?ovR?yfUY&Lr3Brw{|4wJwzjM2%O8N17Bv9B~*XvR*_EXB|!n&B9l zv(U!ehx8a=t#O)+F!a1B#H85~?J}jhZhXl6%y8lGF+nKDq0PC4#|1skoA(2RTw{K0z^Nnu^7! zN|}n<0*ZsIn5ne&B>>d|6uBoU04QHl*~s4uN0+Kq4ZmvJ#P}C|T&vK&(_)mBLd1)Ow~&18HfBG_5C_mRVET zsdhss!65fcQi98$kNRYxN4u^jp9glBMM>l=4DSL$*lH52tkWa{8!)j}+HMMm1U_ta z*#P4k<>EVrnsW= zaRKB;F2Rw9TuwMbAed;oQ#A36&0=C%+F^3p!mPv2hU^UM$Xg@nW!65BlzM>}NXoIy zhDq>A1!#-6p3JY_!Vb$(%`AUTDj!pr4LN|#>NN3!C2X?UZM=zR;bsk483zko79j+H zn<`5$jtLfUXS>D!cdp9Pi|%Y7rk%;KFh;#;YDF z#&-cK5$|$S#YRL~xG!*CIVvaNuz<(vrYbcfS=t>zJHz2Z;xk)@aZ_b&rTTX5@QU_i z^iFu%(lmSkfuCF|+FhF3asO1byEL_!`MtQLdMvqWCCx~dcH7FrXoZhzz~ivnt#&t6 z+FY8^ETuuT-6z4jnW7yc3_R*HIi(#H6Fa6#L^^Vb*^PocRAu&2wiQ0I!KX#4@VGd6 zixp0;uQ(`P(N}DY+TkK74c!>y(nW*{FfNpaZj5p1B0>ci7fM4n#<+A5p#qExrJ);R zT)K!*0mg;W(2X%JT|}q=<3efZ#u%3_B2<8Jp)_=3j7t|0D!{l<8oDvYrHcp^U|c8- z-5BH2MT814E|i9DjB)8ALIoHXN<%lsxO5Sr0*ni#p&Mgdx`fq8{Zd~q4)wOh{LxoQ}Ff5W7mUM;H#NNp|K@M5dC!ov3(~& z+?{~Gw+W($CWucq69jjFARd)>fB$TNAih@9JB_QN!r69XnTl)3Bpq*1+p?{fVvBwToX|)jW8) zd(MK#e$-Ig-D!XMV6|^|YVIF?IDB>0!*TZ0AAk1gxTlVc)(!o_vFkLy_9_0lhJx4!oGx5jp#7tb7B`Np9``;H%H zt7h&bNta`1Y{9Pd$<8B}m&Sjy=!)%&w0k8*IVV;rkvskk(UGCIs!!dxc>9ArC)Rb6 zug#t@V}@v1=zFpMXHb{Fx98BtiS+!pE#D?eGZ z@8$>dqyOr?^rt^wcz=W3_sMhq!_7Z6-MV>q|Nd`(z3SNEx#ppTd%k<_+`q4FI_&BA z*`3};-`()nA22JVvDo4!r{HNKIC%{%@FmSzi& diff --git a/src/main/resources/assets/bloodmagic/textures/items/EarthScribeTool.png b/src/main/resources/assets/bloodmagic/textures/items/EarthScribeTool.png deleted file mode 100644 index 619db4c9fc601b6875fb4e401b112d9d0cd56612..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15411 zcmeI3eQ*@z9mf|$Cj=rwbqvwb;{fHw%kJLY-ra652gzO1#NqNrlmIg|dwb6%Ywm6@ zx0~dW(pp|(1;SLQbV`cQW*D4GDQ%G|1&z~sV~43@sanC%(twJJLPn-CYG>%P_xj}S z!jtLv=d+o+`{jAQ-{14>=Xu+Ic57q(cS?%OiYbaJsjKxg!{0mfPtk4g`~GV;MEEl^ zQoB~As9E3AKhvn8y`>bzKQFhmYOUT?f~17XMZe+$<*`r%swv93A{G&)PM{flpj{4E z7_XifF&bolg>en%WxNqL=#XpsqhNJ^eT&rJDe->e3Rkf+Ccp$CpoxZ9C>U0SScNf> zSAelzOdAaeiPl+RtkfGcw0av2ZY2r~T)E98u`Fw_^W`k(u$Z}r3}%MqXoja*#>B7! z%Lr!1kh+YnVi-B2{(#WzsYx{l|En-|Xj(*|>E7Pn@?J~15^bkhp66-COqXgBaC|elb8&f|g=<$l>Om|4*Qq=3aFS$Mn253In%TNut1 z@JV98;@}*1i_b|w6+wB5 ze&^Iwh{%Gkr5M^!-c%J)3O`K8|REy;COF}@2 zhD6OJhs1V3N5bt+I$MY+Gv|WfR)R_tb_=*HPP$Mr;?hq9eGi8dNlYvm)=B4;cO z7fJ&g6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL2`(%mR6uZ{G_Wzjg++u4 z2riTcHYT{Rh)@B+h0?&rH^o()eE}1M;aiuz@byYZ!{MXw)l7p_+w7&N{>2pa!_5@+ z!YWgj8p30Wkdk22veX6;E!?zZ@1_G6 z?y4N?Jow}JL*u5svT^;H#szObu;q1!YoB}jx)*l6cVPA^^W4y|A-W*+xTSb_=k|GW z)2v%&?eh!>Ki$p!^6A+h${(z}e~7vJ%9V2}ef{;hi+(q>?yVz#yLx?f(Z-$=J3blM z|J2KM!{2}Yp_QMH9KI}c9xGFi-@83-thjGZ+`GJP_{doF_+K};-hBMnsoF(<>aafi z;;45Q^B-aTyWO`xJHL`C-4gdzn)hsZBjEm3%evDVS2R#{@BXd}AN{-Z$>%;TnlZh@ z_Vd47x@Oq==%IK1x$-UR6`r3_T^8?rB|i7;#%I6!?rRsj-oD)JH_v~~$4;XzGz<e*V>0<4vXS-ZysfY{{9PcLo=a4u5p&j~CyM9$#{3-rbJ4s1NJzs<3}bmWzL&VR72wa9s8&(0BM*|w^q nX9t6}`1RBkr*^&SN0#ivu zK~y-)rII^LQ*ji=fB$=X+k%=(AG{%fI6<*sL?cEcF2+HPadyBcqsG<6!Og@)7ek_P zaL~a=P$H-S6hWef#nK8vAZ;)TDt*)2`}jMcgx5ggH=T2m^PTTI`Gk~`|AAw5v%9HD zR+RaP&wXE+X_`iPsgGnTgU{=sr}wp3y(9i9Xby#>x5UGlQ^y&f_=;_r0H_WJPNxgg zGzo_zIGqmqUJZyf1TD?YvZ_2l=lQcd?(XG!{|}0U1!!Do+m4b(~i9i3=We> zrinzO0zd%}KtV4s`eBS)1K;p=U8U>dQBW*))z@-&%%*_k@SPES-jX#xPyi&5&F29) zw|^(bi#K%M?B`N@fcg0aE+5%O%*=7Gy#hs1Ha=0;b&A|ha!Yx1UB`Mh$WPOSK%wJ# zjNi7wCo|81ms12(C)Y~XDJU=VlSrod9FF4m`FNCG;Ks=+4s}PleXNFzZSwJ8HH*^V zeyew*h5o@I0g%n+P*oKv6{;V;CuQpxhCv>ihIdmWYy-nE*VtI8gb)Y;lao^npAO+b z(AQQ=I-TK3TO~FMi4!fjT`pFKZ-qb+f@CT~Hk%_hGs}ZIjeyTfAmFF`1Q)X}r7r*g0!B$h zK~y-)rIO7{RACgxfA4$eODTqC938O+)F`siF%ZewR0K&-xM&@;2v_|rtz1{zHW7tk ze-1KyJtJan# z(!aJ3W^T8eaC4A+p+qp?XLM{_9NrOs74*hpDsaZny`kGIrGDVp766*dg~#K?vMdsb zBp#28x9_Gz9l@2}Uey*3G5qj8FJ6t&KbgX>`6xRk6Y;YcRg>6moJiB zUKRinKmev;GXL=l*QYlaem27Pqd^85nmOMQVeoSn3mfz4IKjY~x*tdY1?bf(0HgiQ zSYtCpMkaY2KSd^!W&TEl9jnIAYn@0bk3P{b3>thM%9SdHVes|kEa{q#KoTBZpk&!> zSO$&bi?m6NZy~K-LAa%fT)xO+Vwt93kSDn%*6wyAUw>lrRu3i$Gky`>Hrecp9JMex zJtF{gy^N-5fF$#Lf{L=K)oK{3hMG(4_g0;agGva25U{%X9W@lkg<$vU1&YNI+4v=t z613hKz~}XHID7{LQV8;e61rYyYkh;&c0ZwDfKaFj_v|7PsJ&SrUnn4sOQHZe+Rw4J zo<`TpI7*RDZ=q>!L|-SB_bcpl1<3u*acmL+E_Zb)ug8twe;Vc3WU{*;1VZfHR7%m< z;G6Hw>%>bKw9003B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Lo2L_t(I%cYY`NYrr< z$3H(^cem2qO*f0st$bj@T0XEuGK?N%v>r6dq9UY(hzJAeBq#(O(t~;k!b6c!kfA|P z7#idu!N5!tGc^-j(tK<__W9rGAZm+22M6Xb@a4nId}ox1u$~BEoe>0Rs66!FcJ5x? z7o<_kBRr_cmb9W`IvX1y%!szQz>S(N1yFk{OZ*-$E|12Z{3CQfe?wK{7X_eOCe6>d zF`2C>gjD-UW=1=yEz1HC0At#+^i&>0{hwt&SFCvEk$%)91k z@}#5re4P389gq7RQ8AIY=R=rqde`p2>k82K?J=)w?s2oWOEr1YiB3);@4`8r&c;#o zs8>yl&*ECp2vb@xpsqYy4qUoIYkfWC_j^=o@o6#bjN{kWK`y6d5owJj>BKR)^JGAc z3^|Clgme8=!qW0Ygq@L4nHx&HX{k;rERgDsc6r&~E7cwCVmn(T*4!Ks5o{K?y+4E< z;Y(T_Kv_wq#AYT^`hJi^vr_szJ1?4>3EN=g_qc;lgC3<6$dIQpCOJ;Mphy{C)~7GiY1lCBhiW)U=CDM#EYg^*TM8OXKsPlbCJcO#aj;jGDyb z^$=85ndp*8<#rH*-z{MqPj(qtkfZ0qR~2DS*=ByCf_`m|OH=F&Wrs v)U95Uh^%DA`4suP{#V*Fwgzd`df)jE7c?s&aH_M-00000NkvXXu0mjfdofQd diff --git a/src/main/resources/assets/bloodmagic/textures/items/EtherealSlate.png b/src/main/resources/assets/bloodmagic/textures/items/EtherealSlate.png deleted file mode 100644 index 1986a7ef46b5db048cf88bb6838b8945b4a65b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 725 zcmV;`0xJE9P)WFU8GbZ8()Nlj2>E@cM*00KElL_t(I%dL~mP7`4i zhM#YKp+HMZ1*%1*BrZ%tqVWgf6}V#I!j&ssy6^(L6>q?W3vR$If&vZyi7mCXfQ4e) zX{Xc9eDk?L5dyCC-JRr|Cr{qwz&}QuA0A~UNyp<9sz;c*MlT4kO^X}xVU8V#R3gFq zPm5Or9#2h?ibl!%zDkWH*{d9$Et#fC`uZsP;gK*6gAZSpF9K$#GK|Nf6oODC;xV4h zJ!NAjPbdQbbi-hCa|g>ZkO$vIwb5j)Tme7>P{6KKDxDhT&Ffbzt*lW!KBnz;X|~$j ziDa3bc|g-?voDo0gmz|N{MHaauiIl`aT(wDdHLcw5AV&fvvfdi`!n{5U?j0gqv3Gw z{uI#ecJWP%R;Pp8@o-u#a=CS;dBVH-w^S>V$gqbHr3~yX_JxMR~7;uA8)aE)CZKz|!?A41^#%I3RMxvg)%fVzD7qC^VGd000McNliru-~t`>!iu)&)ar%I~m)K*id{m00IzQEp>D# zwE*I<(zrXI)90kCP1!WATQb;8<*aFX3I*^qm;prl!NyX6>UC}!^*?k;@srb%)u7?_9p| znvo}8$>jv;Opf-B0|?;QiGJE!Td-QKJRf@qfT0M;7X+%R^5E$>S1z0-uN6q9`$UcxsT85DKiI0N>DZ3oqWPaSQD40oy{MliGR-Q`kw^dl0000< KMNUMnLSTZ;FE+0L diff --git a/src/main/resources/assets/bloodmagic/textures/items/ExplosivePowder.png b/src/main/resources/assets/bloodmagic/textures/items/ExplosivePowder.png deleted file mode 100644 index 635b2a364cbe2f988b1601debd83b9ff25192bd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmV;`0V@89P)_1uTNLffP0tR%xO|Y7GQ#u`i&750PfJ@By~8@EHWL*+#Io zzgP$&HsKO&{d0>m)d-GhW*2sU)#1SJ0|yTLi^%UE@>gZK{*rGaQ4~oOMPiJRR;wk( zm`dQSY8l6|)a!M!EF(=*uGcF7Rmcm_>-D7H?^CPQST2_oML`&bq-k1-JOE>ibh};g zJdeZSfaiHMn@z$nq}^^41ObD=fW>0*guEGJ#26!GSz@i_a=B0x1)WZZAPDe%pX2e! z>2w0XT1#1$XsrdHw%hIA<2VMu_kA{-4c1z2w;TKY9&0V<^O^ho&S*3uNfPorXSG_f z-EMz607@yDOeO%V*K208832ys05BX5ab1@z%NUQx%;$6G^MuFn6>(h`Yb^jtlF(>0 zUdm6vCo-K*0VvDzvCs1y;H6v{rIcu`MQbfeDN#y&|Be5+_+Rn?%$2uUQ@PMI00000 LNkvXXu0mjf6hy^@ diff --git a/src/main/resources/assets/bloodmagic/textures/items/FireScribeTool.png b/src/main/resources/assets/bloodmagic/textures/items/FireScribeTool.png deleted file mode 100644 index 4ac43b4d4bc0e72ed24ff2c53b92a3917633b8e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15837 zcmeI3eQ*?K9mh8v4H6q^6=|eZZVqBa*xR?;ds!}rA(u449_Eb_aGZ8;_qk-r-R<>u zle;jP!4^ho;u|TJmR2cMTiXtlG$i#6k!oOoYRA%sY3bPM3qwJXDo&{_iqGDAp1VAg zar%ejJUhAE{hsgh`##Tpo|k?8*?U^o+)`b&u!^Fn>Xzm}JN&-R`h2Vs{$F(Istmv8 z#+%n06!q~>S)U4O*F!ZFwL;Z8yUecOt&*Zg9kQy2fFl)+!`c+(TbYW>N-r>NA<(VG z>g*SPdB|?l)H?e*F~|nv4WLJB-jo0xo7QwHn|c+mYG3KE@}(qb5Cx`eOGP6wLrT@z z)4me?Z51r5SzGq9`>WtDUqTH_?SZCjb1`1;-3;RIYth z$>+rT5|K1$RbfB`L}5DyWWbdL5bx1V-RRM0XfiLSA(m^{)WS0Ww3HdsKuVh-%~CRH z={c1dY9E9W3`$=~XmI+=k$|rBS@+cv@I%3&YO2I@vIi((fmQ^sn^u7n&|ZNR>2OGq z!-7ZjxP_39nbD>&tFld%X`;dDN#%%b5(Tp-hD`&_gbP1#HMkdz~ytyE&&ohe9$-iy=;BJuXEM zWKYh&D1GKOl06{ihr6~5?$QXo`fj-3{F%o@ zYi`%DH8i9j3$`z;(_*TgG?wOEr>D(quk^^VZlL;^Tw<;OP4O|-&_%TW#gUuc5-u5d z^cD-VWBSN>I$2g?;mE;J{J$Bw%y>>;in(=Nx^%5wS!zfC87}EgU60IWBBCh;+yyrf zkWElnBU~pZN={x9;P#s#oj1wUL_C7Js)Yxpdz6lrDQuiH(=tiZXZ)9EUKA*qDu{WL{GqO0Y7|ll`AgFvYzGE(-&?5a(c7ld`w9h zTEEMB>_qy~_1!!RFL-o>S2nd+MpM`0Q;TIZwUD_srkQ>|+Zs|_lw}<_GB7&eAshHz zq9}+y1}#Q2TD262bOkhc4l%6lpL1n%P@!z%`k4}ogluAFp%fj5(>q|M6dtzWIiJZN z^h-9!{A1_C{86~057QO#B8?zG@FBs4=YyyO7Xkzy5?pvbh)QrFK=2{Kh3A8)1Q!AX z9}--6K8Q+iAwcjU!G-68s00@R1RoMycs__qa3MhOA;E>`gQx@-0t6otTzEc+N^l`S z@FBs4=YyyO7Xkzy5?pvbh)QrFK=2{Kh3A8)1Q!AX9}--6K8Q+iAwcjU!G-68s00@R z1RoMycs__qa3MhOA;E>`gQx@-0t6otTzEc+N^l`S@FBs4=YyyO7Xkzy5?pvbh)QrF zK=2{Kh3A8)1Q!AXA7XJ;6<(bMG5Ef0622I_asFq14PUCYDb4LcirQ35QD5IeQUAOO zzt2%rA4^f^@1Q8@eu}z5AGv+9iJ~elwFK%rQ?LB^-b1||Z8hK6eRA7@q39#@=(^Db zn?EwNWmw#@4Q#^}40syzz=_PM` zHqhAf%8{*a4UO#heDL>Y)jw{G>{;~Cg*xW!ii?-Nc)iSw>CZgdyu`kG>4v=vo}Y85 zePHLF%V$Pb1^RuDYC~^&MoyervitcH7vfzn99=WCZU2)emMvQrIz6#tb?pPYc8#Qb zjy|{POZS=c|7>n7seN2Rjb^V{=W<-r9w~m^^oh`O?Gc zslUa{r)ysO?qd^20tb&@x$>*`Z=SQEcVO^>bY%Ua!3ybvclN#eo3qy(oLu|YiG^MF z{bb^)(-o}W@3`!^_T=9A`%bm3KDv9=6Ssz?-#+%h<*n{1_S%N=+R@vdte?E=FJG;C zZHoKTt2d7w_}%Lpza77Q-Z^u__?LVCJg=##>8-Xs&$W&nyXENN(^u->dv0!JWo4&* zd(XTR7hnA7H5CIdy+psf<#Tf@x9~34#Nx*{PriNmgUK_A(f#`$?(g8oPf1sAqU1k_ Wsb@P@Xx0nZEsbje`&Qj?_kRHYEQV14 diff --git a/src/main/resources/assets/bloodmagic/textures/items/GoldSand.png b/src/main/resources/assets/bloodmagic/textures/items/GoldSand.png deleted file mode 100644 index 83d376774b921b0478b90ba2912a32ad481315c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVd9WIe}c-HYa*c1wFC|&f7|Iaz+`!5&%dwK8Wz1LCu zR4;Qe3aEfk6?ns*lD-LlJYb|@rfA3$7xGTAj1hn=-ND-dWO6fw zzzP`0@{$gaCX*hmgep(`M1CfFJ?qZLR_G{sBURs(5wow=w zHxY}p@I$Ba%oZq<7XYMEs1Oz-a7axla1}}6cnU;dxDv%Nl%NnCr%5%9r$Q4CEU5_& zCvDYdO=w9gE$k9SFO8yQWo3#orGggA1iQP zk>fp3fRVBDrJ@#=Jbictx7TcbMC|cR1WF1S>Sw$tuE0>YJ8-XYYoBNZ|GM#5YoBeo z7ob+)<4Xlr%7=4K5G=*+$wC1`$s76=fs>NL6zh4m)D1kMNw0;a6NQ6w&;-tC0P9pD ztddeA4nP8gQerB^X=fRyQlrwSmG&Ud5$tgqjF_~<#)ud0i`Fr-%b{0kFMx8y$ z*AVpYz`xX#Y|AwB)6A4fd%(h>064JNec*ujjwC)&Chqm-J zZ7__xUa#%Z-q`|eulvw-l&x$N2JCu$yOp(f<$9$Z z5l07XVsMO^$@mZ?f=*%_Ojtk`*(Ro&V2lpsLx?yQlrIP36oMIE$BO*Ee_8L))JwRa|LxQ6iMs@<@jBDe0JvGVJqbc7PawFHJ`LTVMJK`|AoCJ+oGwK@`;4UImq zsK&e8WC4{mswJ+BaD^cFNfZr*LduXv$?@eVMi2z5Qln}$B3dAUDpsJw2pdR?Gf*JF z@E*V5;aDifNISWpV1z|aA6&ubx7i*Nvw_h-i6KM7v>(NkD%9tT-D|`;AQXUq-FT#R zz)|G~XaNXtL7oxw;ZBQ##n?SwC}t>nL(bdhIVW8xL&7m#(5rvH(M2+ERvuaI*71!eyEoRnf z^=iTz$L6vDfo2&H*Y=3oqgdTzv806uw7~HWj`PN=z+S-#T%dyULlz4(tJuT3xKQAQ zScV>4m;$_KC2(c&oDUiaG3j}Pyo$iwz>U)gaB46F$F(X%uOc*v4lvHyv`fvXwHkO7 z@A|)?Lq(_1Se^W*ZsJ>FF~+73yFgq#>?6R6&BKdbav)0mC6Odpaw(G|d~Q!;FFVO3 zuf2cP@OGrPXJt_xUh2&FQ_(e}Lz{cDWuc*G+c*6a~m0s-E?Tc6Mf@ICx za-6L`c&q)u!M`^Wck1qLF)i)urb@pYsw`fRSuDRZeJEhqRFb#um#SHlUmiGlskbk6 zwQQ;{_4eJHr~XJ}FLXrOhU9O#C$(Sd-k+)HAA4#!?j5{-@vDBIs9m2&PD_!%rKfN7 z-?*B6@Xd1n;IOaai1u>dr_IERX-(VGH#3Qj3~+qYa{14h(cSfIYhBSjZ1(l+3f!AG zR~lU!xf0&#d{m)teJ7_eR@M%OL1k(Ym1{{b>xG^>%ujb;60;b;Y{vaS*^`Eu)|nA<=Vn` z%?T5&r?1%$k1s1p>gcA23b!uDg^6j~zj2wdnGHF~-JQ|=OCiTpWK;Y0j;8E%p{L>L zS7uz6L24fzArpS8OHHIyNp0y38;9$IKkmPEsMKBS_Md^9=g)g`f$_VZjLz=Y2N-ER bQ=O=g$nVJpnr6!SVt?#hYd-afxvb_NhR#E~ diff --git a/src/main/resources/assets/bloodmagic/textures/items/HarvestGoddessSigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/HarvestGoddessSigil_activated.png deleted file mode 100644 index 50b02bcf94bf4044eb2e0fd8b39945e7c7c4275e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmVWFU8GbZ8()Nlj2>E@cM*00LJ@L_t(I%dL|=OjA)5 z$A9x@Fs4*;p z2x5R18jwZ=3a!@mwXc2n-n$M!V*{I>>7J8&e&^)={}=u-#NSD%zhAbuHnF;vs?^+W zH*GDAfRdL<~HLW zrx|(L1@E3iT7g^xObA{?SKzzATAC#4cNm)RQU#Dev0MgV=+Xig&fnzI)HJ_zokz9H z437pWm4BlMfnk_HvKnBTCbcyhMyZTxnnX{&B-)*UO#vB`k)CmWrX2Kw#`U7VN(B|5 zt+k2NW`^0hINjZy4BpPt*&ZgH&GMvYhFht#Y;2_Pcogj2$K9tw!0(q0^@j+Bg5-6b zXJ=+G6`O3_q9EP;Tr+rRg((>p>!~#Jv6!fA03d`w2uLKB=9OAtt7co9;3O@M^<&=Yd*{!WGo-N*R4vWj#Z94YBI+KkKPMkoSRadFw2=Kgvs0P%$dvCqoEKtOslH(qZ&(y`e} zXF&*r*tsU9q^`DxQrRRHkM9Qng!}p=fMeTOj)S5I>T29La>v$r-C!}15C?vygJ8C8 lBNPQi2yDk;es}VJi$6oZ`nn&5rVIc8002ovPDHLkV1iHpOH}{> diff --git a/src/main/resources/assets/bloodmagic/textures/items/HarvestGoddessSigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/HarvestGoddessSigil_deactivated.png deleted file mode 100644 index 7601b9982f5bfa3c23d7432fed7f0877362024f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 740 zcmVWFU8GbZ8()Nlj2>E@cM*00Kx!L_t(I%dL~WPg7AC z#((GD+fN|X@=+QfL_ov<#lb}vHxm<#F)U6_#zhBZck>VMKX5Q1Zf+(TjgV+!6ww4I z(127Lprtg@k9&K+j{|~Kang5tPjY_ed7tyV@Q)>qHlrgWGMQ*2x0ydY3j_jmcC=Ei z)M$;zc>dzGI2JILO3C=i7!%j7u(+~@@3{b|nno}f!gXC17SaTR8ZTc>AKp^{&W(-9 z?qmn|?%v|#=Xr{|yBMZLRoA(5sh?~%OJQe+ixVimC?ba8SU|QBU|ANCa1f(zVp$d=a+85x565tD^a|rGCPgd^+hs;}HvEDH(3xl> zU)W`SVTs<}9v(dVLQgV5@w?<|+-AnZc8U}HT?*It_T);Ol)6K_AkX={~OEK0djX-J=TG*Nx0dic7YL)Q(m zQqpa2u%#vuxh)Dx7frL%6l=|Yng}qTP76;;84d-B#afWQ$9BF1LLkKcn^HCtjfAP2 z*73UlkQyGA0KVtp`aX&xh=v3BazECUs=-PoBmN5b9p-r+LQznJ!1H|;mzD(ovwi^a WdISz)&LEEf00002DRWI_@k4WSUjfTA;OHeU`PyJ5350nbT2 zxW;N3ueR2z%qX_?mcc>sKxd?ts$)GWjuvZMuTiIB>9jg_gT(fS{oi^D|0P%6yk9D<+bfkbQPYydKPXeY1$ z+Fo1T12QF&h-$aBR46s)Qw-;k(IFdIz~dFs5=mxOz)LfgK!9w(>1H+X!_K2H$@Z7^ct?m;zHNNfogOpjwFU)g$kv9j zM%E|LECa&YZc%#}D}ODP((!;6INr)}RpBZqba4Xbb8%isr-P=KxLG^r_oan0^y0#L zz`H*L_8gw`Ktmy>+^>+w)VKpU6f^>CB#tN)atu*nY7$Wb#x{et6AU3I;bFY}|Ar0~ zokBx(@}Ig1Z;8bin!fA;aq+T`04p{RFLueY1(PBqk`Wf8UTY0pZMB$O(xL*|J#@9K9qe!2Bh+~}2$T=yq_wq)hAd(g%_RsX8EQBi-`(g)+)LCn10>-rz3VP@$a zVFi!AleOshypd%sM(6y@6)n27f#gq9JAzExhz$4;c`fpZDRLh?HSR|Jl)l`;UDh={ zjyYu`&d%)}fBo>LV@Lirw7!{q@|(WS>i(yR&*pr*f5MVA%ZQ|VGkb2wjg-Z9M4K;1 zo+HMd>0Rsn^#|3r#pz#HoU2H0UiU^U^C*xhlb&k(u_|b4QwnR6)&1QUP4Dd>W7AWm zzZFF7ac+<4+q>6W5rhi9f82h3`~LbIIPrG!^5PjqU)?)B;r)(XjAkT zM;E4!J%4~oF$Qn!F26-<6B3TPRkQLsO2)TfV=ts`I}+7AaDL^&uB8tim{%{NDh^WY zb+EcLqO-lNepG5^V#z$>s`VPwm2tRf_l3>Xzs!x#9VAcMijuB4%i$@b{ZQ=PE6xzLrG)OX_k*|#oF zyVX!V+k^d-tK)3xEp$_KAf;|WWO>>6{Jv@3iNVDislWDLsyMhR_E1vUzK@n4@5z8| ox2VC>@QHyN>(?9heEuhLOd>lKAJK57SqS~WjfMjKuI%#QKZoQ+`~Uy| diff --git a/src/main/resources/assets/bloodmagic/textures/items/HasteSigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/HasteSigil_deactivated.png deleted file mode 100644 index e87d23d1340b5c7877144409c73c0eea7b200e1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1578 zcmbVMdrT8|953Le0;2f9#~2>Rq99!Ft`GW4RM zR76pH3^#lwEQ4WmLZ)npafImwj3y(_X0>QS0farz#)xJj;mEV98ZB17_LNd3{~h59M`KfdOQ^xd0@$! zmv-sxgk{8*BpG10D0=iL>ht;JKBb)Z=A*byr$aFXs!$-31|pPjBI!psAtA^>0D-Z9%kyf8BVcw%{o7 z0MrfyzQ{{S^>8Hw!BXyCZz!NBd85zvGEz~q2CCq=rHTD4ZAbOw1|g(pmEHGyf(m{z00akEN`8B?`NC83pMZK}l- z#9BE)BsmHMZ8MVX5v&A%4OXA-1*FJ(9Xwwc?1CIOFYr*Vmb=z--JYkEmzh z8Cx$cX@6MPb=cbHPP`sD6t$dO6E*v*bz2MLG=$IGq~p3T2I)d@{H)Td1YtOHGRLIn*2vhT(l+o(CAoG z<3jTn+_a8?2Q9^eG2weQK52B^tb;3CLn`photNK%ikp{=i>+IFaPweY@~M_ma?_k$ z+q)w79k@@@7uVnE?(R{?_a)rWb)9vGuKoyhb@pzk-H2n zY)neq*obuTWaQ%A{lzDmCU4sk*3&biEM!A#?dGg$8?UVY_46=G>7)4Scd63S%AsYJ zitdD&bGFxPjBg96`oOG0G^A=&i?KAXRsUOe$6<C-% zc`tDw)}XCKYi#SBmy-K^i%s_0f#jTq+ttlT|AHRtbv$~E_DIx}xNJ>q&kvo;N`9Gj zk2rBFrLoEWb$m?K(U_39_H))9O-MvNyNitc@H97f?U~kw>ibDGG@IQ0*3$EEyk$VB nN|{*s_v(^mq0cIMLnCF^A|hAkPYszF_#%#=86HebjJ$%f4;2`!`6 zwuZ}t)}b1p<5AS{fU$xV#g0`*9hIus@u+wet9DvD4r)<4+6@xhAC5n|GrQmQKF{-h z@3G~X8MDPBCX5h?L}Jq%(jttpp*K28_$Kr|r-WfVZ_MTAvktz5;($nJXKes7xu^nQ z0hHZed=jLHL_><1>|8$AoUW!>mxK!0NPI4jfEI~Tv_20-7Xlu#fda;@f&V=CJq$5+ z4ZKip#>^fAa58gBIWWI8BbzQQq*ZoUI}1wjsRaTT;3>%GDsp?(J`Fs;s}|;=Z4`zE zO!z_#{KBbRb0%b9IRMEea)ibR98#zxxLl^f@fi?-;ZhXGP(p>^xLT%A}ee9f(AmYW?mtWsc;8y$SDNaq&Om%%P>TVsicSk(6(gCPSAu*3J>D# z|2K4~;1n9FlmFCBcuOe8(DY>&2#c3}1l&UNa6*^lC@8+_fmO3GLp|QHH`QTRO?aCXLI7QAe<6G+kf!4&|;9DPD9S+aY8Mg;_@i#lG0~I!L zcVMLTtF*2))qXO#ucx;GJ#(k5ZhWEhie$v1Nk{8v_IB2J?@w!FZY}$vZK+g=MQr1z6?i&Z}*!`?u6Wv5~siE26$Vi<(yYv#dKFIspEvjITz;91>|ZnLD7An8NvC+UG$5|@28Ue!EN0gANwX8<$aRmeeM`^$c%_c_ z)jeDtv-k4Uy|(KO-F=6l;-siDW6j<#4@bkXJzoFR>BL`)yG-_T2{9X&2BY`?{6^Q= ztla6iD{m63Xg?Ld=j`NQ#y2OTL}PDe2FAr$S2^M@V3FGlTdSU}ZrPRn0I7dBNaQBO tq;E_8w5>Dcd{RF5=r$5jH0@b5CaT>vjBB}6V-5YoO~wpzk3RpCe*hGyOfCQb diff --git a/src/main/resources/assets/bloodmagic/textures/items/IceSigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/IceSigil_deactivated.png deleted file mode 100644 index 3855383fc5072a25f4002e0326ce935050344dfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmbVMX;2eq7*6pRYC&m5pjdQW8SBAjcXN_8(I(lXL=D7%5~tR(+5M92K(b-8n1Hq( zbaZH~qoNKTj3Y%x>7n(QB95uxQIAovpv5bLwT{zKaS#s*?br>1?GMKv-I?9*dY|Wc zzxUV*TlROsjeol$QyMoCf<{Nbx|TXE-N-EMCeD z?0{lQi_ZY9L^7n9&2tD2>l}jSyizJ^BMo`|B3dHR&J6h}x)2DE6S!HQ4t{v#Cm3QG z9h|SUVphKqc-X8m9^{r~=h0<_w1$Ca&VaNbLL~44fr3KbB42EM1|LYzmpQ5fns z5ejwi3#S}b8)W2o04b$PgvMkzq}E7rr9y+_8ITOa&7ds19_!> zfZ9QTE8%G|AFhdmU@>;D7m6B+-VixFD<*|1B00Lm3w(lw)WPD3lwlb{hEthg~6=R z4`MC8fI#_ZFsRLn+5=eZwOGQ)14`idJdP_GtOA>d6S#nf^Fu}>G&!I3F;iG|vX6jIY#v_hlI8^ButXB$u#oz^(6w6o?84D=Q*^-% zmS0*@Dj!cNrrzGgUekU%R=u(j?-;VMp=;O|(~?&{*W22@k}jO*pHS1#QlGNasjjh^ zTH8-tsY|n8uRS>FcKQ}(Tx7|2J9Cdr?!n`peRg9>r{?bT6AJ5JIal+2!+ZPAcV19s z{dw4xlV}o3hT5h+HynF-veJ#7K0Ez)wA_>K?EQ4ndzype=`EI&##4Q&BWWX7kKS50 zVbiSELuqI3?%f8(^qs7kD{sHKqWkWJf{uIPYwnyjg#W-^QPAZU)?)dvsB^rqS#x167@_R$U%6|YVJ5?_L diff --git a/src/main/resources/assets/bloodmagic/textures/items/InfusedSlate.png b/src/main/resources/assets/bloodmagic/textures/items/InfusedSlate.png deleted file mode 100644 index 8c01d913bda6ad901c4ca4d925d175ea2a027d32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674 zcmV;T0$u%yP)^tREx>cP?FF;=-L9UApj>_y=6N^Iy1< z_>Gj-N+?ZB5Gai;owhTbzH?oOAeNP$)xCFda`K$3M1=p5_2-hETVOgCW24bHzC|Jt zE;$Z$zemcB@@nPHDFfs8aAP4$Di)*Eab;q1T*N@cKzcfmt!`W5<4I|T!u_S&rwo*c zaP!)A(oURWrzxY!1P_+)v0mIH)O`R<%OamI5{+8;`wdm|Jl2balLV$1eCr;{L~4v@ zPoMDa(;Bsd13I2htKFuSn&HmUBCS@N{hlWS473VSK+o^7^7bP^5b*fXLuT(T^YTlP zO71fodvJa7%T$k0=9R95tN-v)CVW&wZVWE^dyM?KE49~II z-8*0{S72&tlJ`2s_Uj6HH^g%f={qs>5t9Lk0CSnEU@D1^I7FjS(&-uUZa~tlV;G7H zaff=tWwTtx5T(`%>!<%fDTPvs=Ap~*kWIB*ruU=4#ratb%Oq|qN|hZH@aOYcCxb~y z$mQutN?TRh?GB*`)oKOPjNrCA#{eT@4jP!DB0ZK=`SP~d=b|JMBS@(EzFUVQc*8?B zUC*bF9%KM8e`OZOF!79E$53nfVTfTU9A}8bR)=K7R;_+O?rVO~0AMkb1waCgZ)i;0 z6s_YP)C2PeryGAIB503B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00JOML_t(I%cYY|NK{c2 z$A9O|IBy)y&m6-rDM}E;MQSi)NJN2)D59XC?1MfaGG`mrriDbbcpD?KHsw0n71Xxu zLnFcj%`*CU6*Z>y9LM*ZIW5Lf$7T_A;BNl+{Lj7TckUHc<$uD+C5p&jX*ml-MYwXV zMMZ?JqYZlTc)f}U7Y^5JG)EEtQgiK@W^LNFn{Ibn*KTaVOU!WD@agjELQ;nsG%6z2 zqPC62W(&v*$GlLD-*+m^gsTH7(#i8$@oN^uRoKl zdh|&eBhcQLW@ls|4)lQqOgc$oub%Pdb&M4iA;RH8-hXxo2K;!gVv#=R4~Uj3Q4xwv zLGcm$F++a9M=+>Ndr1;ric~5+#>Ec_Rn1zRz}da)6yU&?8r|1gtpGckDz!65zU2Ci iBEnKVmzFh!e~sU>b__Q2Z|l~{DY`m1W^jo25R2&%&BwR@> zm&>HTekK-=^Xo^6vr>_!NR)xW5u){V9PO-AES!Se5(EKSYq2aV6iz0SxULJp&x=c% z3MZ5r!}L$j(`I#1_regBRim&=6!ab1_*p>e$Y8gg?@bMz&f zJNvY>wv#_RVeI`U06fp*ujgMWr9^8jj^oH+Pv_mdiizF(MjXcxV~i-J7mI(Op8u!00000NkvXXu0mjf6fDvs diff --git a/src/main/resources/assets/bloodmagic/textures/items/ItemRouterFilterExact.png b/src/main/resources/assets/bloodmagic/textures/items/ItemRouterFilterExact.png deleted file mode 100644 index c39fe0221be262ba9f461752692a685a91fa4860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 678 zcmV;X0$KfuP)WFU8GbZ8()Nlj2>E@cM*00Ih0L_t(I%cYauOH@%5 z#eaLc!(1^xn!&^(42FWrQc|1-BT5MsGarIT(xIS#r;mp)N_rXSp&%$Ci0Dmd^sU5F zB9Sz2gQ?BneBSBa-9vbDWTL1I2M&w9HfybYj;JdCQ@%=|i2M}>U{q>6KYCR~L{1G3 zsUl1~dm<+X23164yJBNIxqo<6M;e0I!y_7LZKr4#G5m)1xZk0|5Z_jEJPKyOWM=ms zO2q<=4Goy4iQ_oD4K-0H6o^O5?HF6hu>|xt=NRhkr|nP+H}2iWMF{N*(ijZ!{@oj5 zlXyc^_2&RpMMUVmbXi^C)8Z0$9>keQtxLwT=nfxHV}~Cj5a4j+gvJt+o(=CZIC@1- zN4lu3uIAzMr@TroOY#1=&fOiOer#OM9dFmY`TP2^(Fq3#KWg+HsS-z!Gq%&DW zd}J((54W!Kb#9iNZ3B?BmhqbbT-W^-yeCD3GZ!xEk?=tlJ}1p|Gi18@g z%x9UIpJ#RD3-!SeB0iGKOVrfW;W&=BtxW~qJ5W_(3GfF3L^JDT(WFU8GbZ8()Nlj2>E@cM*00It4L_t(I%cYagOVe=} z$6wF-j(ttH$wZb!R17+(Wss=Lh{~iwtwR(^I_c1Z;DU+@Ri5OGzLqhT;T zCVSflDdsJL&CQsmiEZ0_D70W%7SXWNj;op+iGgM9(6TScow3_Yym-d+%p3e(Kfyo~ zx$HKP7!DBwKvfYDF5I}OC15$e!sDk=X2+*wIU!uT*RRGNH-^VUYj=-EV(%(8Dj5up zjOm%~UVQcSJd8f!_1#Iy`#x!U<`F}!4`lNFN!@?oAnWTX+IqqYh(jQ^lVvlVCbOMI z#Km$#Sf3u}`b7sff_v^O4!ypqR5*nxB_)h^p!g zF&c*Zxhx+S7fG#sqcPBgh>PUv3SPe-+qNs)Do;?k163sw1GmRRxM72ACe2QEn_|JD zkS}m9Sj4t%2f0G5egK_){R$B3IIf4WFU8GbZ8()Nlj2>E@cM*00Iq3L_t(I%cYY+NRx3G z#((en#y%T5QDlvXf`Nq^F0ynOQA${-bqJzpPC9hz+OccrPSGK{3=)!xpbk+KS;F$D z6ec91rVVqt;pV<=etSD@`PrbT7yg%r_j!1q=Y9X8s{Bv6s(~W%R~Ud%t?~TOH5Cy# zIe0-8;luN1a-x4wMMQQ^Z0sbTyE3Gaz6J_g5$$Y0O1_ZCa2whi+5&zTacw8Z!eDw# zb~g@C%v<=InlMch+qRjU4`5jqv9QyQYdbj_2g}+du*c7h;p>b%eZ;G=xAUG4xA%j8K0_a--wAci(=J$yHjr!U~8(Ah(%iJ(VJz$s*!{ z$r(N;U-Ba{4aqhD63a`tO%J6~=~wXOQAC8(7cXgRu$j4U3v6tpdEawTNTz6cJ*Bn2 zdR7w4m^C#_PfR#1R6=|*D%RP4?d~|v*Tn@6jl5G4!CU7ey}m{WFU8GbZ8()Nlj2>E@cM*00Iq3L_t(I%cYawOH*+e z#y{^mV@FLVir9!S7!>_NNztYeMMZ_pf*|aNt1i0grrZ9CE{eM9W>DZoQHT%`K^RS; zyDY^L(Wwn{b%s0cY;}D|5Lt7poshx24GYo_6=N9 z5s^dDGpYz9Lr>*kZ&XD@Hco786rZ{5im)VIBj^hxIcSxX%9JE| z-Z`VS!FrZbizfa|7l8oaaGkD zVmt!3b2j7C(=0E2p}wKryWEyaQDwmH>Ysz^>MB*cppeJIh+Zp^z`I zzk3bWbv@#eu>1gY96hc8;np_YzIUGjgu-F1#Ft9HQAF5?SHe77_}BUYrQ{K$aQf|E P00000NkvXXu0mjfhGr@~ diff --git a/src/main/resources/assets/bloodmagic/textures/items/Item_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/Item_deactivated.png deleted file mode 100644 index d085eddde5e4a7c8c429d0f69fd8c249b45c47c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1373 zcmbVMX-pht7#@N^rAq{@c4?zb2b)miTswQsWLLmFWD^!~*;t}B?(EFBFfMa2Gq4Lb zfkLEhto_l%v?Q8Zjap6Xl^D@tNJMK$Q>(!ribh+lw2cSSY9QelzXcZkLHff=e9`G|f3Z9PLKe9t^7KVv36e z!)sb_<;U7hQ{zZ7lgSVnhEVl3l4e3! zP%b=`6!;Y5b$LBZGS9OSJ{(wU915z4^CTk#lx00_Th5L1YL1QvwPdKmA}by z<=$gk`bU4XowfNIn(j?JePnpS`f1+z&gME|79>h0sh;rOui6W~zAUy~&@TSDV@U9j z`wE}CbY{B`sq|(p9WF|DEm?=VyA$WNvhwI5?_@!ZQvc0kduIANvbT)?5Gc9me*BGJ z>AF4rcSTR0IG=d=)Zeu`(7(n`ymz)QncVbQQR==MRyv)gUl_|CEU?E8jf~D+Gb$+H ze&w~GaOY|3qp2y|R^rLxo@29%A8)Uj7@l1q4ouf_w#LQ*oA3Mg4^ULgz`|X zTn`oBjhBVpsnns%w$je>>7RcW=I3VoPuZ{TdUL6S7eJJ%vR?_l+B|Tr-;R_gkP*rL UOT1zK_1q6H5^4&*^tPF1 z5jKqkj9H>4drM;^F;hbDi-ZkBg$yAw@Fiwb<4n~slP#{ki;SL6fubMCK6uI9^E`L| z-|zQ-y@7h)lLh(3`3Qm(c#gRPaNV1|ci#t}rN0^iT=whL&3c0>>oGwCNR^}p0qO|} ztsnpdsk?I?R3J!Rr_$K0H+$=NQ4Lvytc@ieia<1iR8+ty`(qd0&U8%9t||~_!`BYc9D~?%EM?yoQDJ20Z&)Rv)hHhRMRMRAx z54dYKwcyE#wds0()^{0RDAjTkB|JcLWdt z5LLT05!OR4%Yk9;?k$uxgx>IeO@T!bI^3$*6#`-1<91^3i$zi-o~8r`5M>4z8P1MN zfCV_mkXBp{ih|5ItPVR9%<*i8XRE7RG|SjYhaJ|SnsrblTjj2yI4j9m9d0g%^@O9k z5EemBTY=h}Sld0Zyh{Uuu4;{{+L7ym`ZiTpqit#gb-B=kO-fi&W6{U671{{c4K(E$ zAk}DU2whJxuWTb9vImo*k?oWJ z^iA#+Y{u+%YYO0DYmPt|4vz+>E{w=4soT=ArTtqcZW0fAaq2;X}qAA~BPE_lLP;y6|Ay zD4kh5vtqn=Y3GA4&&7SOeP{UXf2z zMHwSApKf~N#WB;+@uH$5rlp1Hg5{HD;ro5^UrW;q>84X>cIQ33Chq-vW+~Zzdk)E8 zF?tPhOsl0Lhf2t?io0INLq$_GIeC5j^^~!?$6Q(Z?T*2<$rI;N#*%7Y@EZ^8du3?h z)zLL$_QToa#o>?Bw^p7TTlOEhcD-pydi04$elGr!dA?#|us(JUhL{2K0k119s|S$~d_{4$+WXLA{hiF1)G4I~;F0}X0yWInB@ zNn_Efi?jj&{8m{qv$c`4+np8vf=S1X_$r zXqiNdXdNorY*|#y(iz3NOscqmk{h7~^Ff6h=M~s!js)E{tKEsamC%@8oR_`FFa(Z4 zxB?~g(y451I;dh;8k7hn0t&%UP%0Oq60sab<3S8TMKFrMm|TFOxLAs#3E=nx@zz+Q z3D*LntBsMrgDcaSSD8G-VPA zD3M$$Fw$aLAQvGLfyqFTCXq}clZp&JJ+I>@sMHcdB~C(QQVEKx#WI9QN|q+7MQS90 zkR=m7uEy@pUaJ%Q|D+r#K}!dqtDbQt*B_y6F*-so6^(Z-&R)9^tN>M>@#sI zmlSN?zr&DNR$Dpm$IjA<+K!qI#W1y}*=$aY_7B^2d3XC2>EP(q@RWHk=GK0@>Dq;W z2P2O_&-1>c7rzQ-_RTo|1KhMirzm<>Vx6ygu{u1k{77AIWklE9#yz=Zmb*=BO`#dx z5sg1Z-aWI$t!QHduiiN*sA&D{IW!f&cB_1GG@N%&6?{5$e$uHvV5ukWuQ+h8ZlGpx zLT6X#{^bo||44TN&?T9njc-{KrtMzW-7_`x>H5Ee9uLhdy*jwQ`1WK!y1ME&U6`yv zfBd7eHHVg@-cpt9Lu*e#QR1YDn(!}|#OHkc`=UA9YeQONrUj&* zk3HdeFW3N{YiT=`^GE%v6K5X_-;q4Nurs1k2W)-#urUh>@x$*Ed8d1`b{9@E)t2g; zH>Mqly!UxymZQ3DVQKSsN^BbPV(^Y_!q*Y!{HFmPmERXLca=Wz{>U|I9np}KSMm>k C1yeZy diff --git a/src/main/resources/assets/bloodmagic/textures/items/LifeBucket.png b/src/main/resources/assets/bloodmagic/textures/items/LifeBucket.png deleted file mode 100644 index 97a2999eb42f5ea5cefc1beec8f70e22548c8dea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1369 zcmbVMZA=?w9KTV;2AMND7a^G(w`qLgdT+g6d!uxvEv#lm0x10;q1U^oZd zhRTu?Yi0vvAnpNe^0pogH1^ari9PM2L&98DXl0Uz0x@6+XfoEJ=zP+NE$Z@cojWEl zbP-~-JFz9Ff`NL}qiO(UEi5jQG=*{w3&mO;6jg!JB*hRENze|QqIfIEQ#N#YV9=T- zMfe79&9W`Hb7F0V5$6dakw{n)j78O=1m$oz2$Cjf8ixp6?^X;Ui7Wc1yn+|#q9(@; zSyj-Sq7YWQ3?~LXT?!!<4+K_(6@58TFl9tih!d2BBx12#T#IPkXaN7Zu_{_`>W%}V z0qAO%Cc^uOY|4{i?(S|V2ZY}6&uKEe6rsbbid`|F7=Eu4gI_F?Eb%lY*nt>faFKCv zxCE>KcQ7Q2N5Y~IVeG7(W5Riz)%evmua$AQ?Ih>nD9UHGdpwlS#xfM;WotauzC72j z=!T$(Aa7fSwwJlwUAeqR1A?JyO{&_FuY&qE)ll^|HI8~b=#$N|BB=@esoV`M1?&Zy zyaPxzni@kFQ_Rb&nCEB_4j47Xurw~(tPCz#Z8T0vjEw~pDUv|Mmif~EO&tN9B64-| zpSsB(!D7rUSGoXhR{97iuz57tCCUfL-w3j%*Y9;VB`=5P7ZzNm$6pypRgV|I`lmm= zHxLM9Cg0k(FZJd~Yx=R{=2>lnbTL#qYVN1V`CDhk&wn|Y{qgtOzMZa}-xl9@zo&LX(r93*U2$gVjwd!JX1V!wMq}R z4;7+E=WhQso}Inn=zE4!=&{~~{q8R=4P`D)amAxEr$CVTa5(kw^?+VgbtUz2@|Q5# za%A(_?9Fr0zUM!RQdjQzrnPrLI`H1%ulJ5@zL5Rl%(@#Xv#E71%wX z;#>Xp22VJQ9hhi-VPFRN{@v=r{nJyADnEaBy8fk1L2x(6nk;DyKbXp7h3%$8<+su= zKkIspA3Qu7xey8^|J;+A9NMz=)axa6!&MXgT>11^_uKB4mZ8(*@FHC UPVZSy=6-g5U!C`Ob?DW909(`SHUIzs diff --git a/src/main/resources/assets/bloodmagic/textures/items/LivingBoots.png b/src/main/resources/assets/bloodmagic/textures/items/LivingBoots.png deleted file mode 100644 index dc16c03ca1c61b02fd93c14c11057b62bf130c45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 584 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 diff --git a/src/main/resources/assets/bloodmagic/textures/items/MailOrder.png b/src/main/resources/assets/bloodmagic/textures/items/MailOrder.png deleted file mode 100644 index 2d224d821bfef35e1b68c241cdd6f1e8ff6f42dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 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 diff --git a/src/main/resources/assets/bloodmagic/textures/items/MiningSigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/MiningSigil_deactivated.png deleted file mode 100644 index a116ac92c3e45e11f73b6ca60e8f93129207e2be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1565 zcmbVMdrT8|96twhh!at9;QMmI;v(%mdbPc?RZFi(6N*r9pwsE~`YWy2yK;Bff|_YF z>TCGIF^xgz)QLp#8AXQ=26N8G!iJLt5{78hZIa=fMrSs6Me6p4@sC|{_xt{Szt89U z{@$AGteHb%N5?`CG{l<0*p)Rt{KgDaz7rliW0hr;Y$=d)1()n+MF5$cf&;)-FIx!g zfOVD@e*+8<6jkiWE07CpnKUPO)od7}4tRYE8-fhe13s230y69Xg&y9B{Px8;1ok+M zNWRvF*?eZ;_GFZaAh#?lk1H$UC?_&~8f*yAiUKc?SvcTb%u95@i1g{D6*+v2B5)r> zE;1s|ohqAaTtNaI!cXeNeahPVFJT7D2|~7rNVKV)Y149xc@;EYogOd z+nMx!TguLexMkT#qp08SSNk<;K`caZilR`AKnX&nAXHK*FS7v^FHMYSV1UGl9-r(H zcsQ()bqFQ05m7vS9)j0rv%OHvOZ|ybQicXtABw9n)awn$)rXd3JNVa)m!hS-QXfF= zKoUwsPN|1$VuY;Z?$w6EK*bw+mgrH6!Y*b6uEYy?*~%CZGJufp42tBJKaFq+wJ5&TgYE^pN!6_2vIYLr5VHGiz!exFXjmF%J7KFl+gIwBm}*dW@Suyf%ZL{FBj#S5-yxOwV?qH zkvX}Rnu9%vEi<9Hd~jRcy!yLo^6tm`R!==y*IZtd7>v(p|8#YCTFd9w5gp{vxkYwc z<C+D6@Pm}HHK4klHkPx|#2pg|AX~2FM+#tE5|4Nc{G&1+X9-Yt_3monizMeal~7%U)ea@FlT4; zmtEuNYBgB`br4;rlq`Z0L})`D@oD#n}w^vTmGsJT92Dg2?VFQ^zf- zh_YWRefPS!Kj=hO9=bZ7$qCht2`rj-zNBYNdB(Mj!QbvUHSN6PzEQ`t%4Io>X{%Y1 z)=gNrW7$Uw8V}fSRv+%!H0wfOX3Va^H9uVUA)_tH!$Y;dWG9U5m`=M>j@8$;4T~MP zoY;e}>2x&>AGE5a-QAThByP(b9ZWvzYHA_n+jYCnHH7}EBnKY8^~V#bMmT;d;ghr9 z^C#;Q8F*v#u!`GNhssx_mrkpG6dW+>NI}AQ@0@)dTzkEtlP{~9ttT@NY`J_ZeuYI{ zd1FvpF(%Gmlw?XyZe9EL`iC>VJ2Lm+=82Q_NpIfHj^9{rw^2+E|FEr=ET%4PVelXKDn#1= diff --git a/src/main/resources/assets/bloodmagic/textures/items/MundaneLengtheningCatalyst.png b/src/main/resources/assets/bloodmagic/textures/items/MundaneLengtheningCatalyst.png deleted file mode 100644 index 6162e225c9f0b220c7808e815d1a0193116ba458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)3Hc4lul!Q9bo2P=vF< zBeIx*fm;}a85w5HkpK#^mw5WRvft+tsWZRl)t zGT`A!P+a10=6a)}kLTO{Gg@SrxtWa*uRG=C_9*7Vd->*qGVA7TYfsm2weWAd(&Et; zZJsCezUk=t_l7&FSN)&< zJLBAk-w%V?^4j8Ccm=w-k_4tt`FB2B>v)3J;$s3;35v|0o2T>qU$;MD$EE~B7 zIhujHEneF%pDA_N{@8z>|L^xFRMb8-JUsd6X^GChR{8buh8*|AlPl^Tb28gMuAeij fa92W$YAS=uIrr#Ghp&nQJ<8ze>gTe~DWM4fFFS`B diff --git a/src/main/resources/assets/bloodmagic/textures/items/MundanePowerCatalyst.png b/src/main/resources/assets/bloodmagic/textures/items/MundanePowerCatalyst.png deleted file mode 100644 index 80590eac7e6a4123b07fa933de4a32c7ca0931c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4$}E;1y^Tu^QRif|Tq zL>4nJa0`PlBg3pY5H=O_WNA?f=bG&ai4Yog&uplIEGl9PX6=%zdf^RLuaFt z0S`}tqFdnX-kbG&d~$4TVq$DSaBPw6?hbcQ7Px|x!WkO6mMccmd98YeRd{_7Hbiv#I_H1qS|0UDs?eAGMO)%Q)%_gJY z>rZ~`Z+r-J!S49~#xa$DXEg#r;km`?M|M8=HhViy`M*MgoZ5dAAF>H6Gk5Qh2s>*L eYj9|i5kv2PFT;{n;cr0iGI+ZBxvXJb^JA{>7I@`}E__syddA4jK7(!tR3CEFWnk-7~Sc z{^`S)rXa7sQQj^orPD84Gi=hC98h+Fy>kD~rE9a*o-d#Bvg9vs81JRi)pjw5-xah6 znk=;Ysp2WLHLTg@eBs=ukAC$WI=6CK{$AcDhUYS&=^9;48{Z53xzE5b_x+66rBfDt zxWs>hZ{{(HJ^3rIiX~5ru;*a^?Z&fL*W^Lk3+|1qc?G?B3A2F#z~JfX=d#Wzp$Pyu Chmx8A diff --git a/src/main/resources/assets/bloodmagic/textures/items/NodeRouter.png b/src/main/resources/assets/bloodmagic/textures/items/NodeRouter.png deleted file mode 100644 index 776c5fc9b711df3b798d900c5016bfa0c425c298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmVVGd000McNliru-~}7WN?HL|xjq(`#Ggl~!Y0mxyJQklAc(A*ftJtXJRD|C8`Q%+lpu%AhM*)tZ!n;s zrkIKIATEimm#BM|X_Vt|bb5vk^AsznDb{7~Cu3QmW#yWhF0p%Hklbz_2Yb6P4$ZP^ zqgzR201)Fw8joP%1yr&pG{?_E3WZS0rWpX#*RI#6fSH9wdda=Q!Py~SMo~6$HNO#z zuW(R~k<~dt!*&NX`gKj=!{Z2T?(EUZ`UY8@6VxtSyMmf}z>}JR==b9$8e#1QFaWT* iCh5IW0f1k@f1(en0H}!4E&qN10000WdP)m{e`GRsVK^aoU^hlD58fzn3{}P_K)bH^#_WQAPXn> z)LT%{TCVNa-$gw{IVdA%mNsieNw`wBX+{rGxi)uu7)oIeQTOR`;T#UQBcf z_s@;&E7tG$dxDncdzdX2(6WFmI-a(0H`pL)F(Ro!jye1))X~baeDm)Fv1o+IyDrQ{ zMO@LZkxoN0l_c`%rgV0^MKc%>fh9{9aonN*Mq-RbBe+~{>~NifIl=3PYAgz4H{^-Q9%4 zVJ1u(!}r8jDs9!HJ#g05@}}py>I2ll*O!Ru( zlvPwx?>tRQ=#q>br|_O{SMhj110Oq;H;}97L8;)&{PI|Rrlb(cS^n_gQEL% zl$MQU{Y;rZcOJV+kEzzSr}V|+1e%(#+imp4NKzQ-;HOq6YYISiQj+#;#PC^@Y^R_pl+MaZ>=ipj7tJg|vTZnUK{3>w2oi|aR z7&W2NR!vH>NhF3wcUnXc5iBJpDJYpPB14D>Ue5)VnkP&3KC|pUS|SC-CixX-90q$m znL<4d^ef+GH@eS5dPqp8p)>edO*8e%U?N59gZ|MEc)9W7Kfm)&-pw(;zw5I>00000 LNkvXXu0mjf_rzWz diff --git a/src/main/resources/assets/bloodmagic/textures/items/PlantOil.png b/src/main/resources/assets/bloodmagic/textures/items/PlantOil.png deleted file mode 100644 index 967c60648ea8cc59e0715c6b560fe2146602b8d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)35ZUNPLhcKF{cpa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-iR!6PoG7!;-h6#D7u;uvCa`t4*#ufqWXZTrJ# zExEB)T7N-Cc-I5oBIfcqhYx;AEavN0Pgu(yAR;cPxJ}wq$}u~u=5ySyn9^XW+;Y7? z;fK$BILmL${6FY(=iRry+plqQ{9(|Yb%4KOzK?)mhM?U1_E+u=#pm9>&3RZYm&CL0 zd0?36v4}|}4MARivrbz+Pb(CRWe_;NG5X5wtfn5n^BW%SucK>=awPs?BO`JBytIN=Z!|8-@4-#KO+PAF*3l z*={9D`b9!Gn_&MebdSw_#KMJv*}ZvhX5Kp?iT|9X_#z^C{(7>9$z%cm_?&%VG@fyE zy^r0)I{|>uIH_Z9oIm9GXgp(MWf{ZMCw#mc)=m(P_Z~_qydB*F05(@2@$zhut~Ic= zeSrIm9Rm0nmt-C>0ZDl8>Ah#a+veHun7vMu8|#X_PLnw%B+fYoK#1_o7=wPd&6}%B z_Bu_*jdO6(jW9(B@BLgsP7uI>;J5o6co9KT=*l!rr6{VkmP#ox#*_q4vMj4~AOQdR zkrJ)7gu*mUWjdYK7Hh3hnj%t~&bhgJO^%WaRfUV*jWN|CwpuMI?rp85)>`V;lGuL{ zfpZR7mND8}A~FELU@*vSFA)Ghm0bZCYX<<|MEO&bUZ_v400000NkvXXu0mjf%{9DU diff --git a/src/main/resources/assets/bloodmagic/textures/items/PotionFlask_overlay.png b/src/main/resources/assets/bloodmagic/textures/items/PotionFlask_overlay.png deleted file mode 100644 index 2d969bfb294f2202ca8dd7e5d53c060a24467743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)35ZUNPLhcKF{cpa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-gf%_+jVZ|~BdKp_WD7sn8b)5!@Ek_#3rcwm3D zjfIUZD9@v!!s2P0in@Amo=0%7@ErlQA|3%Tv9tsrm|<0_^>f`qkIxzlj2IYx=L)Q{ TZPQo+G>gI0)z4*}Q$iB}zYH@F diff --git a/src/main/resources/assets/bloodmagic/textures/items/PotionFlask_underlay.png b/src/main/resources/assets/bloodmagic/textures/items/PotionFlask_underlay.png deleted file mode 100644 index 27f2919841299d506b0aea59b9854b882f2c7e73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 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 diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentBounce.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentBounce.png deleted file mode 100644 index 9bb11b7267f74b63ac51ef752a0b446727a1378d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmV`03>LW0X+Z!0e(qD zK~y-)-ILEt+Hn}iUmso5k~Z=OIZK8sHX3dOg&@{o(nS=rL#Lv4=s)nfgSY($t-}r; z#@MMHH=-a96@*2!;XzhGwziROD$ZQrxu=5=jzl}g-lykzc;2t)`F!Ak|630i0@A8S z_pf0_e9@59;*dNY9jABBC0Cp_B`>suJYRe%9*;)=9MgjW5Q#)291cs<4bHx$c()Pb z!`nDIvmSus*E7n0la9~+GP$)3TBbs2KhMvVJ=GKd;Pd%JM6eAx$x@`0FOd2El^;t7tv|6| nZns;MQmF2m>@IJq>vb>Z+LMLL5B_Vo00000NkvXXu0mjfwyoCI diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentBridge.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentBridge.png deleted file mode 100644 index 17df28c6d5c5d3d2ccbc4e6b5a7702281ad2078d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmV<90UZ8`P)`CIFXCX2<{l0dPq~ zK~y-)-ILubgK-qcKR=#F_xOSgP0tI!!0e(lH&oI#GMN>k zGPia2wGod*@UJWp2n1BCb5ufGUgdVX#WYPk9*_FbK_dCUe&ihg_6B*yB>;rByb2(# z7gAf_h|A@Y9~}U+4vq>yXx01K?;D;JTTM0AiZXOD@CEnquP>`_0h#KVSdi!YYfK|e zXMZnMRaS1p2b|m++?|Fw39hOyA%19VYDTODLQ_{iwz@{H&QFQOV;sd281hDbX(@Fb z4gt`<1DMHY8k(AU(G1>f<%FZT_|`U1noj!FM9dUux!F%}I2>ZJSg5F}CnXve37zY+ zLnM{rB^KrCIH_EHq8m5WoNc03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00G!ZL_t(I%f*w=OOpW@ z$3Ks@wKiHKS&< zGFt{kEYU{ITJv=+W4=$PjcgtQiN42&=lSqF&-ZymRoRLf*rNU|AaW(H0U7ywK;&Xv zPn{o9fXJn|9`6t1IGxad+^OY+LZOWWRYg_lzkE$cGaq#L_Lv%mp}ov;@YoqW#B*Y? zm`0;ft>zkrQLC$U@V&guWa0sn_r|ficVMFh`}D9tg^JBZr*A)lgM(_CCdp*7)`0wO zW6#N`0yw6wi-n2BPdo#+bobs4cD1!&$KvU1hQ!2OvDs|(fPjqPrVooEO=rgxK&^Gc z11E4dJNZ1HCht7JtEma*?vD$=wm-M3l<}Rrsj}UTE7*sp$%(7Im3`fQUVizCRVd@> z@X>WRtnZ&alsdpFGgv=X@OO2yR$9W2gG|=sUG^hRagtliVis~}gVc{u9RpzJkx}(} zy|j1wu^Jt$w)L<$pQg0@iEp_D7BWv{!yQ!pbrIyP4v~L+K?;QeZ)Ve!Op}$@(?~H# zF~7u~W|d7{2!%qd&D`LH9<9ZC`DF6`GdItai03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00DGKL_t(I%iWXBE5mUd z$6w$5WHL7VJp4R_a`4b3rLpEjDXrFA`~e(xba8T3ZWJlGImlryN(m|2Q63Kz2a)7q z)7TpGuzlP#S>q`0+vn5g{rWuA2mZJGm4^IOWBOufH)O=wCIJ2#LpuAr7%Hrj-*vMa zA~U11GBzv@heH5-B{l)@dcETDcqHQlmk$~zQwz-dHz*MWz-;hQ0hC4})KyjDcDuhp zRBGVUi-e?!*>LDH?`v(AieiJD>S|sr7R~|z<_->2T0pACYsv&5AwsvSi<~?QtMB01 z3NZZ~V)7=e0J74V2YP!X_!ejI;u=$ffz_laZm&g6ED{xsCQCM6-6~7>5tSBjr)ASv zTF$oFMpn6%mi0Zt`-hlSKF5g=XSwfa=0xTdoKC0cx=y`KC;v4@-_9`9UzdBsW<=t0pLkQ zK~y-)#gk1)695#)e{Y|nt*wT(IV$UrQy3nCA!C<5C@5INK48(MQ=@JbojL?UWE5t@ zIv7M?2?-r6DlZa(2Zw{AMrNpe2s(+i<{Az*U#GQ334uX>c!vj%AH4tnJyBKGA_HsG zzXkN(5MtNmXFnKmYfqQ_J)q%}OH<=J^;Wkqc-*bQle_uw-k}41!a(0DAXP<_lGpE|^IyC{|a9Bg3kUqFwnJ<^A44RV_rl#-Ee|H1*1~Y|}fx~CB z@@NP)={IVdyxf0sP(dUTtt2PE#u$w_lr$VYla+WvF&SVw?$bu6i<*sFC|K*5NsO|m zkVS{*m?dLLWLLfzWPe@p{zvDm8wm=c~$VW3X`w* z>7va`sA)Y%_U~Y;$4Kk3?Ht%OLe8>6OQV(Hd+QXacu-b82aC%VS~j~GFWN9K*=b9T zkzRO%)l^4vKEq70h_SX*y+Ze8q0J|ZjwzR}D1ksgolYms^>%EQ0v${+GMnRLzQnsP z1s*5UVlY@MfSxX4DF+ujE1m>{K~+`Sw>dC=Pm#&wSeTz4%zXEP)uJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$Or zQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv z1)yUy0P^?0*fb9UASvow`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q z{wNRKos+;6rV8ldy0Owz(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E`vOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G4 z1dM~{UdP6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4E zs0sQWIt5*Tu0n&*J!lk~f_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+ zAA{TB3-ERLHar49hi4Ih5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=nat zP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVbnL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0 zWMyP6Wy582WNT#4$d1qunl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8d zZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iu ztvy=3T65Yu+7a4Yv^%sXb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i z^lS773}6Fm1Fpe-gF!>Ip{*g$u-szvGhed;vo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*Z zvFf(^Xl-N7w{EeXveC4Ov)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx z)P8cQ&Qi|OhNWW;>JChYI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_W zICNY@+|jrX%s^&6b2i>5eqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!q zl}XcFH*PieWwLj2ZSq`7V9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I- z?$tAVKYn8-l({mqQ$Q8{O!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;c zwT88(J6|n-WB%w`m$h~4pmp)YIh_ z3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dl zbFb#!9eY1iCsp6Bajj|Hr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syT zu9enWavU5N9)I?I-1m1*_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$m zU2Q)a|9JSc+Uc4zvS-T963!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;; zJuhGEb?H5K#o@~7t9DmUU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX z=)z6+o0o6-+`4{y+3mqQ%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@ z>;2q1Vm)$Z)P1z?N$8UYW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHs zy69KwU-!MxeeuI@&cF4|M9z%AfP?@5 z`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??VU0O|nS*2Dgq00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-#k0v0C-flRfG0009qNkl!=(^AXD zBl?~|Q%aFf=ka-b9RJ`YtWJaPKK+5I;cF~T^h(Z~B3ZwJ?(@^s9AI-TOX`mVeQ!l~ z1?5tiPIfKnenD1W_^k=b7saEC4YelK&wt32ST zL3224OiZ_7q!WBIHpcg(pX2bl89hD3%U?FCTb~7~xNFT|I861FQ#{-INt{VCcQKAp zFtIyb4)W;)js2Z!{)?{#1&7Zzs=%E!e!aX3H(SNk)Bv7+boBOc?W0*KC(8;zM6hq0 z73$+Rm|tE3P<34!+&q=U@*Wicsj~d23(7X?T}{lNYoT%L zHqC9V7|U^LT~1~T8n;s$==wu!EUr*Yt|COVrr9gph;PSG4<#8Ph=)0siZSR^`g3ecJG<` z2OlL@E)XdCDcek1iL>)?m4)9;wDuMyA_QMpg^~Z=+7$q3nxa~@Fe?=_G$o~csA~WK0nkZA zK~y-)#gkoYk^vZouSauEZFBR*Ww{DvX`$dj(LtnuDf>SS#a9d{7yNAw2@TnBX$ z45C5?Wi5gcEh-3X6(JHa7pW|F13GPCFJa#pi)IqcMl*JYU- z9#hjaNu^TKwL#x%gYu)BJeW;0;IZJ|5hRhTN!)&ZtM21f?k^jd^UTe%IbtBG*aBZjuZ@&vvS@uO# zRoS!GOPw{oeJSzoL!PI13i4YEom>z>emHIdGtsDu2!mUMh53wh)%ahY={r;b#TwK@ Rb>08~002ovPDHLkV1iEz`U3y} diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentHaste.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentHaste.png deleted file mode 100644 index f6530434c534ec73c0b59b591c283b493645eef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520 zcmV+j0{8uiP)`9x$c|>Yo4r01RnV zSad^gZEa<4bN~PV006wMvY7w?0ewkCK~y-)-ILF2(s3BaUmtP)_--anf)dPqDG#EI zE(vDeh7h~hoF2xC9d}u$?h$zMujn%96i5q-E?xFRq((_}XweSCm4022C~i3B_I*0$ zNVH@0zCG}~U(fS?;DP^Jg-3>r>am?OgF0sVUT;D!KLmPINxgQiWe{h>+ZYK`KHFFbp` zqX6uK%uDy@-hLl_#D2wMF;Pn4_l>c>SyBJizx)DQVTR?#tWe(o0000< KMNUMnLSTYPuIG6G diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentHolding.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentHolding.png deleted file mode 100644 index f6530434c534ec73c0b59b591c283b493645eef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520 zcmV+j0{8uiP)`9x$c|>Yo4r01RnV zSad^gZEa<4bN~PV006wMvY7w?0ewkCK~y-)-ILF2(s3BaUmtP)_--anf)dPqDG#EI zE(vDeh7h~hoF2xC9d}u$?h$zMujn%96i5q-E?xFRq((_}XweSCm4022C~i3B_I*0$ zNVH@0zCG}~U(fS?;DP^Jg-3>r>am?OgF0sVUT;D!KLmPINxgQiWe{h>+ZYK`KHFFbp` zqX6uK%uDy@-hLl_#D2wMF;Pn4_l>c>SyBJizx)DQVTR?#tWe(o0000< KMNUMnLSTYPuIG6G diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentLava.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentLava.png deleted file mode 100644 index 9dbc6600d993bf8f3b2e679b623d418061cd5910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562 zcmV-20?qx2P)_F9kOwLpcBd0l!H^ zK~y-)#gku1Q*ji>KW7cS)Kb@AxZzCt2ZGT>?Sj~-D2QTR_7s@!(Oc+)gb&hlMK4Vs zEP5&m>ZO+`5DNNZ5y1?DNhzYHven3T*|4dnm%C7A5s3JO^YlCC%kO+Y98py^A`ctX z<{Bg}n0iU%{|yqorgn86Re;1rQ=_rt0S&i|$ zS+4+BKF&y1l_GH4wlo~9#a9z%$!m}rdCUDL!%}9@ErJdB-G_%AjS8^5qMR_J7}Zt0 z8gsC!Qrvwv$(?7DvL-|?unQ32# zr8xi=-C72+c@GB~>PY2tRAzS)nN57UH1Gd(>U!LwmcbD$VK8%WfQrCiQ`03>LW0X+Z!0e(qD zK~y-)-ILEt+Hn}iUmso5k~Z=OIZK8sHX3dOg&@{o(nS=rL#Lv4=s)nfgSY($t-}r; z#@MMHH=-a96@*2!;XzhGwziROD$ZQrxu=5=jzl}g-lykzc;2t)`F!Ak|630i0@A8S z_pf0_e9@59;*dNY9jABBC0Cp_B`>suJYRe%9*;)=9MgjW5Q#)291cs<4bHx$c()Pb z!`nDIvmSus*E7n0la9~+GP$)3TBbs2KhMvVJ=GKd;Pd%JM6eAx$x@`0FOd2El^;t7tv|6| nZns;MQmF2m>@IJq>vb>Z+LMLL5B_Vo00000NkvXXu0mjfwyoCI diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentSeverance.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentSeverance.png deleted file mode 100644 index ccf83f681d926005d211e2ed133a2d6f97f5099c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526 zcmV+p0`dKcP)`DIV(CM`Qp103B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00DAIL_t(I%iWXDE5mUZ z$6ueZhRKhuk@-=y{P^09rr9KJn$|9Eii7{a)xk~t0ouXAVM!@hC6t4yg(6YXYNjDG zgv|_(gVM?xM|t1gPtWsue$)g1TbkyVpK^5BrdRWe+cho#cFixoz8>n@$K+St+?rqJ zr!q1O5O=B4VTRBZnLzph)!<;AQ}rOfMm)AdxyjJ)a@(y8J6RolY^E&6q4UGHD~H;eKx7TfC*CJUxbq z->$2?005WEB_e{Qs)P77JSOjmMy^OCR)0QXw(NGhD5X%kY7X|-)ZhA-5BZ6Mp!yvI Q`2YX_07*qoM6N<$f`Bn{iic=rGR0q03X zK~y-)&5_?rQ*ju^Ki_j!=eRYC4b7ZUP9qS!3c9g5Y%M0cC?V=*T^%o??)nG1@TNb( zi!Qnrq;e=Npu*MQUu?|{_8!(Auk>WQIwjV{6n82M zT)#JlVHoOAeoZ3RE~)YHadBOjbULkmZSJX=B_}|3^dq+=OF;KCkUEdw?^llF5Lnk~ z>L42WRoCcVF_KI82C)ADx0Pj1# zDa*20Diqkb`A7iTM2K~FW14$-xc-jI+Ht&XU*yK(q}m3EL?T$0g|6$oeKIM5!+y@K zhuPJ%$v(rSy+vnpw1J9LIO5w&qPbJL3C*o;KfyFjY}=+&GI_~^@PJS}Bew9Dix zD?Io-uXa3QG#bS)40?KcD3{CRaybzZjy1Kz@+vE9U-__DV4^gm>i$Aay}i9CwKdW- ojbgDVN-6d$FZW;P6#tce0OLisWFwXV`2YX_07*qoM6N<$f}^+!l>h($ diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentSuppression.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentSuppression.png deleted file mode 100644 index 5cf01d099b13189cd5118d1da5e54d66e072028a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 543 zcmV+)0^t3LP)`6B5S8)iwYC03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00DzZL_t(I%iWXDYtnHT z$6ufCcg5O|FQSMtJ!mutkwGpD(;b9$Sb~#X8>>Tq!Oo+$lh8TB!@?b0bci}_5bZZK z#tt2Xu*r8Dl!(E!h)hxD(=CKVcZ}Y*_rvqNo*(eQ|E;IKl=RBc+D*!rl=;ZK06g=h zBpSWJjQgQns9VbSM4HK>yk1z5U@#~Evm^HeAdyH&JRX;>6XcpzGH*=MZ`T;stN>(+ zs|vvK%gR-^msl+J7euw2yCbs#uwKmki9fhGCl05Z0oNd{D@~5}^SnHKp*jNE^?3A= z0G!J?fr&|mjehoOyM(h5UKP?T7oIBsy;Jf1sX5UM#huI3jCnm+EiP`khdA9akX8*{ z>h$TC7R{=;)Yl16)+>y;^W`kh=lUnKR-^k0p-@O{HX9!6 zHH_vUw~wP7l;2Zo6ga7xY*n^ZR{%gb92OBFU>}DwsQmoS*FuTS^1I$gY?t5f7o`+- hymr%BjLTA<-Ba)LdoT6E|JJNEAV1Y;ZZmHU$#ke&0OqVg=`(8? zGh5_W-R7+!x$Rw$&G3|T8I=MsYBmYLc%V(b0%az+upc88G0D{V( z+8fCL-BNBd;%^kCR3->85$KQ#y^sRU#1@C0^c735J1Q%{t(j0<033vVe=WIM4r{4X zYV-(;iR}zT%NCvtc8Y`02ual6dzY2q}Z(k2`McCp=2~eucOZm53)qOfSN#JT&`C*+`vpZ9j4He#d(HOnnOg z=*fwRBSO2coHu#r-brw2KeC!S`T2-$wff2gAgl#hNgk=c^)H_khIq`}nADX30000< KMNUMnLSTX~s=@>S diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentTransposition.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentTransposition.png deleted file mode 100644 index 556a63b668a22f8cc1c4eefe6819e15e9dad7be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPNlc1?EtQc+(Q?L$!fd1Y*VPP8<0jSSVR*d}~$A6U$t|XAa?0UH!N57!;?Qv#4oK4F6}Q zY9tsJ{OI!Dd3%al<2d%I9@?hG^``Yeapb3oLizV&PxLc1Gz-`;{#FF)d3J8M^<%9) oVjC{>tzzEdQjyj2zil6bsZF+l6@w`sFyI(GUHx3vIVCg!01MlnXaE2J diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentVoid.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentVoid.png deleted file mode 100644 index 4f090836e3df219dc5c70506c580d6374aac7b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmV-l0-*hgP)`6C;-x)eHat03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00F~EL_t(I%f*vDYg2I) zho2L3O)nPhO|&sZOrs*cMe7UqQiviBW{8BKi$ewx1ktZxK7ilBMR4vE!BKDspDGs>;*5FLe6NoW6SbT5a1_fY`-^rqgLssgx#@N$vI8 zw%wnTo`pp0nMO|9eEBg&S2qZa`Nc2{+U+*l_UTwSz});S*=%;;CfTm>`lWjcaN(*Y zuItk6c4=17U?_w?cm%JZ6sC*3dp{+6X7I82R?bh1NVD0bvpAw#%SZL#rp4LFB&SAi z(Ahk|wG%1sTzSyn>fM=YtJT8e`gG`+%lP3Kqn3#|?8gpA_&oCy*WDmwg_$^gQ$Njq zkX-=NG^y2Uj7QGU?v$x}hgg_tQ2M@%Wtx_EHq8m5WoNc03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00G!ZL_t(I%f*w=OOpW@ z$3Ks@wKiHKS&< zGFt{kEYU{ITJv=+W4=$PjcgtQiN42&=lSqF&-ZymRoRLf*rNU|AaW(H0U7ywK;&Xv zPn{o9fXJn|9`6t1IGxad+^OY+LZOWWRYg_lzkE$cGaq#L_Lv%mp}ov;@YoqW#B*Y? zm`0;ft>zkrQLC$U@V&guWa0sn_r|ficVMFh`}D9tg^JBZr*A)lgM(_CCdp*7)`0wO zW6#N`0yw6wi-n2BPdo#+bobs4cD1!&$KvU1hQ!2OvDs|(fPjqPrVooEO=rgxK&^Gc z11E4dJNZ1HCht7JtEma*?vD$=wm-M3l<}Rrsj}UTE7*sp$%(7Im3`fQUVizCRVd@> z@X>WRtnZ&alsdpFGgv=X@OO2yR$9W2gG|=sUG^hRagtliVis~}gVc{u9RpzJkx}(} zy|j1wu^Jt$w)L<$pQg0@iEp_D7BWv{!yQ!pbrIyP4v~L+K?;QeZ)Ve!Op}$@(?~H# zF~7u~W|d7{2!%qd&D`LH9<9ZC`F*ho3M^OL(0fk9K zK~y-)-IGmd(s3BaKR-2HX#OWomRcFqSgn7D#t_7y!`LAN@i3x7F$Kzp*q!A!-10yL6ecBE#H`XIs{=P+Hv%~JrB?K^SrMTY3WvD z_`{G)%W&eZ0Jvt-GI}nEmbfkd*6l%B?q@~rJbWsCzh40C(YOFaA`uCP!_sjAvE`XD zy=D2;JmPWyP<}M607|ZYyr<6)3WffHsMf$9zbOFa>4o2UJrgXUgz?B zSeRFB0j=u0H~FhubDzuCuArH1sLUcS#;#LJO;MUlDF9F|zml8=t@I uPwXNQBh8jUaee(XfdG5e znz}qQ#hcf!SoyI=tzO6KIvAY}we&dm?%u&LIy75`8gZZokYneV<*(oA^?JN~@tn+q zN4zV2ru=h-4IC2j7|oV3D$#Kq08HD)vbz|j$?9qz=k`2XZ{M?l%}mEbM9%+()N~Sn z>Oq~g{5t9M9N+vkc9*|kT3xONLzw*|+<}u3i2#{}1w=$mj7QLQo%#9e6zm4EW)Dph zk`oacO_R-?3L+x;LgDNlhzObpt+q)x6r{Yp!|_p*$!rGA?_(k;Y?Xf_!0_^&05lN< zxOR1pt?de(j)kWbl}Z_(FM!#xP6TR0E>05wSJJbxy|b%=V>;33ILdR`uQp&X5Do>g zyAIw^0vV2TBa>lF58(D)1>m_Zea}PFgh(Vr+pxG435(rzC=`pM0DxRJ%kZ!s2q@Qe zL4eF0ZXyWfk&?2r00000NkvXX Hu0mjfu=X)$ diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReinforcedTeleposerFocus.png b/src/main/resources/assets/bloodmagic/textures/items/ReinforcedTeleposerFocus.png deleted file mode 100644 index 80c548df3ad8bc989c12da8dc81cc2e0649eb938..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 zcmV-q1DpJbP)6HwQb^s%ZcK03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00PKKL_t(I%cYWkNYr;2 z$6ufC_j~7$Q}4{vwYEI_b=X0Ml{X`zV#_AA=pPdsvhtq@jEEwrh@hbVHk>WjFBUW! z+c?6120=7}h={9=S%ziZ>8Y975ov53I;v!z#E>27w_kX5)nQov=0@2 z*t2Y!d~#ov{4c=IM^+2K=|k00{#B5c#tLcqu0m!9N;q|3l>i)XS~3HsrbcKx6qKsE zZwdeYD`_#9>@%qjG;rh0SqQq&yc!No$2&KVp2sFfFZ`!wIB+;~a21r0G;O}9Zy>Pc zQ^H*#sLH{=eh#yJ1z47V;UqQjdfI_8C6cdF1Qs-4?Y6ku+REhkI3c}~OtwW`xC;%N z;?MHQ`ou@VjLqD^sRPRevH7>_A~(*pu)pn&3P~m2azE=DxACXx=kPC`s^`%duVPWM zb&XxM3j{zreXv@5E9S9mYdzOmTWS9OA63y%C!VrWUOeh%M`aMVZ!Z4Y8aeUD19dOl z$LD3UnB_KT-aKE7<0o&coy+e4?Og20u)hs5mc=(4zGhKTF@Hz88S5V)l}rL~{dQEj zhI;{M@3b-YHde~Q)qV_Rl7DNEMTJT^*KOuT1r)U2E*Ny9;| zLt~>S_4bTEHZPI*XoiwG9!BHioDX#Smdq5V~tReC6KHU%FICSAse-U;%O>N!~N>dbhvUr(DGBlRq^38rVvm$L((k^qD@!5hXlT4lnDljwuxV`* zB~ciTn8bP$OjsFSTQ;`+9>B3nU1}gQ!inGRE7MHlE_D&QdY0$&bv&i{q=3-Pr)qF` ug1_z#scC|Uyf>THm&ufF{L&{M>U#scI!ZvChQ`4F0000 diff --git a/src/main/resources/assets/bloodmagic/textures/items/RitualDiviner.png b/src/main/resources/assets/bloodmagic/textures/items/RitualDiviner.png deleted file mode 100644 index e06871c720ab17407d9d310079e525f575d7e691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1366 zcmbVMZA=?w96um1HjCR_7P}>8mm@5iaJ{#_-AOs2$4kvx8>kt{jP!cL6Ky^0E8hs}WsI7z@R+D16+G(l9tBu-Emfny|%5(Hy+F@zIdc@Wc@ zDn^+mu71UqdGa7JT~9C=mP{sXNy?_EZ5Tn*G=`HHNunkK)w*S!Poc6_p4Y$uO;DwT zE-5mc)5u4ZF5QEeo-T(FPx$?-ie+sjQD(}p6raEd8;-@}xww|ln%)Hdbz@Dm7V1s_ ztO;mJmnxX`h?eKcX7289Cr||fYKE1K%)_Xk5X=j+eJn4de-9GsXDH%rk2CqZk!~1gV^xExS%IP9%O+lXP zlQo@}1(3HbnYLHB-urSHuL^iwQA3K-k?(?FOwkoBrX*mm7k+fNB#TN?dn{L><$yV$ zN_&A=uPSkPDaDMmhIxlT;7*a^QHmDrC{Ek$C@=67D!Lp54FurA-8izs7yobSFw-e4 z*C+q!o4m+u#@u#w3e3am90A!J9@U(ZvhMcH5LED-kE;o#eu~^P47RA^h2kOcbmp@0 zTV`M1JA>Z`swY0~Uq4jv%+X5AT7nBV>n^ci zzTv(ep3gD4u+uHD(N-FmKQY)BZ`Q zQc5N-^#+_fOC|^9M(b=Tk!8PrC4GHy&;C!34-b|#yz5(32CmF2nRD5p6MO&a73u!& zQs>nt&OH6=qOmZ;_AkthkySyhO}yy{hcABg;?#MAD?AOKof;2^Po2eY&6ZED+v6hf zqlG(%r&()g{7`nw)`JaV+VGd000McNliru-wF>CG6EoRB-sD}0ftFL zK~y-)t&+VI%5wSyQ5s4B}BC)uHhJcXclnkl)!v5e)hv$LwdtZ29RJEn1TX-Ee z5;{J|KR=7{<%dc}BlQV1-NI!*m6n!f?0YHt+U+c#9Vtz>D3{y|15CZ16iv4%PWc|d zR!!2;{)kn}D_e6rno^D28`2om3l(XI`?|0wzqdwy@Jv!y#M%_d_Lb0{9keh10aWH{?MRD00000NkvXXu0mjfH+I|; diff --git a/src/main/resources/assets/bloodmagic/textures/items/SacrificialDagger.png b/src/main/resources/assets/bloodmagic/textures/items/SacrificialDagger.png deleted file mode 100644 index e727f17374914161417bb88df0e0f8475e55360b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1442 zcmbVMZA=?w96v&aY%5_ZVa4gV9lA*LdcEuGopih%9Zf8fuCgvF^Ll*>4Yb$Y9cw|M z%n6$l0*D5e&44VM8Hr$w`ei5>rhwBAei(~$8#)+l2FH-sNW*yrihdyb;3ap@+yD3b z{h$BKy;E4QKVjPw+aL%^u;kM=dE60sa4`bLyDN^5D#!}F~INu%64&109(9F z39tdiRe59>WI#~t5s%#=I;<~JEaz1*5gS#|>zC0Gl#vzA({K&j36Zwc!9{kL2tQFpn@i3m6wv|k!=it zS53q+6SC%%!&(UEay)=_DjmwI2^=<%DqN=}ar}9hP~#d5S7QW;;y9%>P`Dmme-K%X zceyDWZC=-sS0pcxL7=h)DpdMJCW!ikv?v1&1eW*s zMGxnLBaDobs}N0y?CIJSynd^7gV-mm2TBeZ7G(Swu2N%OZ{%L9)`DmQ|GKfMwP3IG z1Iz{lu7YRfe7Mu1U^#XV7m66l-cT>`9yuvYInA*ZUf>fgvy276C);4Aby}T{ zprcrePY@X&3!>T{S$hquH$N0h z7OTw1;r^3n7+d#^WHvj zKg2$sR)66uUtD(mVuSHqOUt8s+U~x$n0h(1u(I`dtLBA)Q`Se6F0#;jE4cC;GWFS( z&h|s&QbF5!3DrIM?ay_)_YTDa^dR5+SXH@0S5ikJHov55oAO+8s%$|U;bl%n13 zKP@dUawl6q?yfteF!a;cPEY?n_(|#qAJ(N5e_h@0ADbb~36|=PE=h5As#h`kO$hY< zHLk6X`7P`HBK3+ieyy#kCjE|LvG}GlI5+l`<7(sN&Xm5D@DC6E9@`#QlsqC)#06zB z^SO4WgbgnoKlah#2Ikir7ZvyOybYmHb;;7~WTJ93RMFaUrm<~iv3=CR9=nI_y3*Iz vAf?potGwJlH@|BnsdD~a%Jnvep6dxjkc?01-MP}z@%~;ySL2z=^LFnXGq=I8j>oacMl?cU}3CXqbfm(Zt(F-FFdk*wEmWoWZ8vRK?zkl}DxK`si_ zTFcYp1FO|biPr0Ne7^%gn!W;%Wf|65wAKPp3&W5kNdWM?HnZ6+0KVU0xxA;T((P$in zD?ot^1_J=BwdH%U@?rR7DWybfEm~_)N{LcRe*ArZ9sHB}0KP2DBBt^31ONa407*qo IM6N<$f<3CSI{*Lx diff --git a/src/main/resources/assets/bloodmagic/textures/items/SanguineBook.png b/src/main/resources/assets/bloodmagic/textures/items/SanguineBook.png deleted file mode 100644 index b2f07bf0edc78634d4abd76a1b0a97818acb6c7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 695 zcmV;o0!aOdP)WFU8GbZ8()Nlj2>E@cM*00J9HL_t(I%cYXNYg2I) zhM#lOdwY`@8&pyv#!};8;v#hlsGFc2#1CA=K{^QiBiw}QB$h5kT3T9Z(Ltd?l@2-t zad55OiYOFp1#c6Z-ml+14#i?>{la%T!+Brc!+Ati`5$%sX`wqO>ZG>jkDkh32Nd>* zs=|2Gjfjw_Qp$_&43V8D9L$S`F-*rr1VKcYHXB?`*$Bd5=W1J%?FOa1s7YX?wI8*V zX5u3jJSD~!!A-eDNyNkWXj>EMJz#4TMNCCUXlR41mBo)Y2~0#TmBrV9wC(aN4hYq7 z+0NpJK7*O9CKkYL`xw6XtOo(c#CXXjkwB0HSYk05u490UlE%TobzH9a1xk6*?Grww z_tHy-(1dhJnuvsE5|dY#YpD#XO00%QaRV=DQM-4C<8yOZ0D%cO`SLOEvo;^HE&!G) zp@x8BjA1fvF`Kj)cs)=5#3+4zePl8jI@Z=B{LYBQ#YIjm%u+vd0mpJcA=i;(#x!UV za_+$}wOWm(r6tPcGGnLDv%r_FH|8ACA@>lasSzrb3a@JYyxV93aO2GjmY0_)6bh`Y ztT2E5CS6u1W65ee2U$n-mR+ECe3)vrO1)mEQmNp19>rpj;ZtYXmvWg%*0ve?38aiI zdOuetKRQHDPY<5w@%+*NUroSF^102}40U%BbB^fU^kLrm9$ d{x;xW^bN4X1!?}x#N+?~002ovPDHLkV1i2UD6aqj diff --git a/src/main/resources/assets/bloodmagic/textures/items/SeerSigil.png b/src/main/resources/assets/bloodmagic/textures/items/SeerSigil.png deleted file mode 100644 index ff99c09a509a856b509c41b7a18c182f99900dae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 693 zcmV;m0!safP)`BO#_xg3|y10zyed zK~y-)rIJf)6Hyq3pEHx0OhS{`q}qy&cwf}iw1Nu}qzgB$Du}o$ZlwMLxBdm)`3D5u zxD&6KLIsOpK~2*(trAU(vDP+|WRjW8<+$jD)^t(u-F+XN=l#yhE2NbCk3u_#bAyBO zaBmOg<;wO>(=_@Hr7&v^Qpp6*Uc3=I--xXXhO$|i>`rif^eQv+UkQ8<05uds*TZ<8 zM?POb*F(H~ofEqN!$U*zNZ&!mZ;vtZFb5cb4S*eJlv{N|io%nN{Y<>eQ8nunW@p9r z7X;9D+Dv_z=5eyc*o|xCiv{lFiaf|BSg(U=)sdwVsbn`*v%Wh630U@qW7}&pQdr{B zWD(O9j89jo*bT~#Nr1wmex)-+$8m@lI?a}i<2c+8*16^B+)LZ2n!t56DixntEP`xX zoq)dH9xA_9`I4U{oj%6z5F6%lBfytXQ(GkBalS7X5qmXJ04I*8`BqxO zvMd4uo_8&xY9WMx{;I~@=MrYE%AQRGI6E*P!@5Qy5km$(E5Fx42!z=1lu{Cn7_@AM znLc)*zv;X$ bz<%@>fr1HUy})9F00000NkvXXu0mjfeU&eI diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_activated.png b/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_activated.png deleted file mode 100644 index 1728e89eeb71a434c0ee8ee7ddb2406c8fd343ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)KX;hRqAf#|B=adj1Z^}3im*T#q4dy8iD+dI1a9`wlk^bLOCUts zB;QI5Mr1FBVSnhshk{rSJrsyg7P-KjvRTUJw%fz+Uc2}1UN>zv==bv5{q5f0J>Snc zzjMx&WLc(|!?u;1dy_G|$yo6W&>CVjO7eLyQ0mmJ`x2P?&2LB2UI$8@x|f^nXWOWP zhORr7_xTdpYk^W{mH_R3Qm!D>TCFPo-g6FsrMUR7tgH-xeGi7zd!>A-<|LphXu2?1 z5T6@~NU|(j`dYK03=r?T20%;qWdPoc1OeFIdEBuohy&-umv8vx8LrvRv~tPn~*hIeYa<~{+Co)rZ6xd6cY zt49EMrbAgI{z)xZkA!J0nEg5fz}Vm|;mb$_fM_%-GT_n@0DTiL0l0beFaW7kN;jv| zY27s$hax*pQ3s{yEKKMz1MCaO$zg;;+dS=1@7?H>l9vr+tif9$y+ z5EbNpya?%)YYZq30gVev4244SCS%l$gk*rXT^#_dHnj>u%fhGf?2OL0C-w_P_eP%p zuzQ!t6H|(EHTs_&=#bRkmO-eL-7OiO>5wi9t{I@d&~N|K+4vHyk$Bg79DqG7XT`ko z3xF>Qfu|F~=ar5f0DK%4r^hojt|)KIQf?XpTIH%S1yMdVo>c>M1pIdMc1k7TnjDY; zUb{urbGn*!=R7n2O(-85H~73wQYqx@2mE$()qg|6GaVvmt0QQu%iRy;>RgmHS&3!< z78gZ6C@(L!jP@XI-F}w+Kt6SRqtR}Brk8Mj{eTq(BMD<}H!9C(KWQ`HhP{Mki{c_} vgw&=}u~N?^Y;iGX9Ae(YkpAnh<9x<%r#5RqPbhTC00000NkvXXu0mjf2q~B> diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_corrosive_activated.png b/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_corrosive_activated.png deleted file mode 100644 index acfb68fa3250bcbc3c13c7c2c4c6d0f7580ec585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 zcmV;o14#UdP)l6p7sC#TK`%{ z8HT}lF2`tI?umx+M8o43fHjb0D{U|@`kiiV|GZIbt6Q1!DeG^))2;ov-F=RsA}HMN zOM1>5N!;^0-3b7!_o;!B&>FRg{KKIi0Ca^r0m#V60ATf<832^HbS6@q^$POnHYWf}v*!Tt;?i>fBF7{L(tD(+I?7uCINPuUfUU}}lCj`O zrcL1i|A_g36>%lYH3@91ARc+=HaSzgVv7VfaUK9W*B=MKeQUO$k>m7zl6nkQ2E-p4 zS0yl!)CcD8yD@5xXl25df%rNA4dO<2CYl1^K5J0FX67x?=NnDYMd+A^PVIyy; zOXvZb1Qjm(ajH!Dls5ur8$1TU`IRpuo7ZM(b>7!5+1~uPDN*y5x|H)k+CYdaTu^5W zNAm((Cp3ddOJ$Yjp{>fVPS8YIqg3$8f_kkALXU$fv)y`Md_!^!rH>Ca+vDFckq-)z(vR&O^Q&WhabJ-dDNFW-iBhQ~I5C+eUY3RC|afF_UGSo-aC%mVl?zK#d8 Z{s1& zusS>vfSUU^0r1S;pYTioFg7Chqu)mWSf3LkpX+KCI$bjkheKJEz?-YbgVuKEBQY-l z=fGD0Oy{jWZg;!gKFTL2CjscH?2y$kJ?(S#dc8jTNHrcvEUOM0flqCf>Ii6KWW8sU zBm=N^FcyF)%}N<)KoYrAC6yPP+y_8$ZZ-f7ZIayh@E8CNYrpzF@czn)pb?1Me@bN^ z@UBn*ZZ|y?0Gf<-0E~=905Ifo`o(ySK?0(3_SYaxAK5LN&$2_od6gf9tJ?8k>h$QK2Q04x5=+qVFCI} jS*qrw{Qo!n=M(r1hCK)lo2fze00000NkvXXu0mjfB$j-o diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_deactivated.png deleted file mode 100644 index 0418084169fd108398792788cb09e551349a875e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 851 zcmV-Z1FZasP)ATTfxfLe2v z;x__urZVD8Wt=h{op(=^>9YR_#F@(2wxUk}q@BnCptY(3fbg9M0C?R{<1vW^3B=}> z6PsI(HfpCe66-5CBt+H6p?InC@3E71acyGmD7MEaKvsOrI5-h-2qHBM?K6sJYg|>AZXZ z>=Tm!1P28HP|@}b0Ea_*VQNCo6ZUbre{>XpwXu?zqqAD*bk$fa7G*&K?<&vwt?bT4 zVom}dhX(VY1NREl5zwv+ zmtHt{1c24HF#tk-xqV=82!JPLmjFmPnFqlB9Wq-g>zV+Vw99jr_9pdpp#RP}zY*Aw zman=FC;+XMw*-J@OFRJMVG{s+8L_&(ZCqr8RBpa6vn3=HfS&p$xBFD5VXe6efb@*x zK2h${r}Lrys#m>00eIj3NB~6cPL_w9Kimj3Hn&Nygh-!vR^MDuxvFkhYp%jdw%5vM zbSYRYmU-2y?uNgWylJiz0PD9J-ST{LT-JxTEe}*HR~^7}b1IMuK!Q+d=V2js4>chs2hXCU|qTJ6~z~d3rTF*7-Gcd!std# zX$iV8kqwQBx)MTkftt85VdEo!un~hKs3o*DDwT3w+}<+NPN!9i=-o6knV$Lo|D5xm zGeSzqY#zr<2KUAzc;k`T17HM_?G)wn$AHsqx-a`1Eb}H-`-Sm3;B=c_ZWYh*s|?m2 z@@IX{H<5WS;B;pYFvb(PiqME!Ge2@=1b}EH20(FfF#zo+mZ+eWts-Alb1I-2lpk#= zNY2w05mL&mxlZN$X}tvS-TMkaW9=pYuH1eNz_A@u09IIJpcr$u&x0s! zEO_;6AgL}$uU2EVzib3wi(*V_rbGL0-`P; zG;`z2O$wyvX6@lX!F<5@(jXP46j=Iz>~D~7&Va8)G22tEa=W2?9{{eBbpV9JPXJh{ zQqFkn2LQ+SDln+Sp9f0?r7XUCiuCA-Mx&SD<+6BOXg%W>d7Ub-L^fNT{0e~idx2f90 z;joE$&z)KTR_#&+J2^R${G9|Kkw}=XnLjl<(=g*qm1I$1G!DSBrHhr3>{B`Y_FZ+u ziqd%ijE%iAF~5InApoVzYXErg_#Obm9~I-!-A^ih%<+#X;D}l)ASzphHy)vV@p%bQ zbEy{q&lWXj6Y?7Xz3=8GbF19bT~eiHz$3+cZqm>~cL!AUpWd#!L3jp3_6teC>1L+3 zM9*Nz$O>Z{73248d=6_YaYMYv!swTd~wF2)|&YwI}%;ziu;Og~0#r*O% z#k?t#xupWWiD?kcE()fE=WPc;%CZA!c3H1eT8Zw1UTO69%FS+5pAUaf)&8)v&z$q7 zF5!9GVY?5c6wu7m&z~rva$aWXgc?MVomJ|GL|s6fq=y$tEZW<(!#(UAv#oYxy!3%o zl*_X#o@ qKTcDO^k7Na>t6%#Uwj?sbAAGUvv=6DPB!=e00004!k`8 diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_destructive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_destructive_deactivated.png deleted file mode 100644 index b8c33e0299e81be7dd51d86fad7dc6580ff01618..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 zcmV-m1E2hfP)v)fsE{yx@DFB) z)I*fb7B(!EOiN;-Boal?zeQ!`405SkTGOr5!zFQ`c()ur*hx&?r3%nm?6KmY)Gy;1TR z0gbK}jjonsx`T7BiPM$&j(|p2OIlE$063bL1;8bJ4*)s4BLKK=eBm*Pc?l#I*O6FU zM^xN)#i};xDiA`TM4Z2p4buaA1%tip(1ZXmW*-5-VzB`5_4_0Md(t8S7&0`8jLasw z9(7Az6Hph`pf0K*G&aR+hpY0={u_bJ(0;*SKPj7Km!~K11t2OS8UU-+06=7zJpVBv zzn8Nw4gf<_i%3mvp|9_$q?kZ_K_&48m7G6buwY>mbLfm`1XBEa#NFy1%1Vv^Fg`H` zKww}X09}200PJ=-2S)9(2duWA0DQB`>r=O_2B5v8QK(dnn9XKsUIMQgN_-Z(vyqsU zz`(#D02k_8-P~@qTHTa891Z}^UF-zF>2$h1T`rf~JXnbbVhbyLM&QHkQe_0zu89KR zaP~$3hHY~HM}!0c@NV!60Hx&}0Gv80cgL>8odDeGXa-%>V{YFzE;=57Yb~&<7=XO2g0Xf()e zmY<)yAj(|{xx8;K_dE&zl4!gCMgU}G#sVT9Vv@TcICvERSFW1oRj%kXG#d0+ z(0Z+WO0^%e**vFu#i!wvYqEH0bFW?W1?G0Xy6!z)>00002N14>Cm zK~z}7)t6sLQ*ji>KX>Yu4?0AtG>RY?nPHJ)L_~$u3h^Z)%CJy^z?v1P1-&Ko2ZYis z&3Z_JTKLdIC7Kl!B!StB_F}$R*ecR=&Ob~xZx27O?ry)iW&WYx%jI5vJ3HrdzUTbT zPf=Bs%O<0ljm)JjiLm;+l^-3pUdnS{x*V) zqMES#%Dkc9>_&4)0D<*F*F6BBu*RfBOEn?^ErKn@ zw-+Sm!9)~QRm0|5TaV6pRe<-y7Xa9Cs1$&AFX{l;l$;Mh`=`b^Nt~q<00-G}4ahvt zEV;Ab>en36X+TCn%lWh6GXQKf=8DqEOaq|h^$h?HD#ZXy#rgnfa@7Kmx9tr8<@VX? z2&P~Nmz#_e_66$$fe|~%)}=sN1;LT0`}P5_{$!STZcPE;bb%Fsk_}Y=O!y~+fw6A@ zH1;(BaAapk2#K(LApQ8wMeB%xB%}m_>-<>7RRBi%M* b|nA<_xb?1(s2ra%H(d#?n?lEdWBY;znTS+&>~nS0)`Pefx;S-Vw-eRT=7^1xc^oV*rn_hs*V#m zjPdsCa%;#<0N_Xc69D2;l11d*%{uirv|1EvuXFB!#BMax#^TJ0)?TNs3(h#84HC7c z*~zBN3&oX!#I?>n02Hh`48VB8ppJmMNz}P9EeU{IU80$lT6+MflSD4nK;T59IkO;< z_cVu`0XhP;Ciys}k;p55qXIl=&jDb!IY(FL{Zrooc;4mI<-D%dqF8&Hqnih6P4cM! zg@m=&iNj#QVX#D=2O>=_XX#|UElZtNGXO(FLjWWtC52VHgKV9>VB4{gdbYOFK{nM< zR)6~{**_|>$md$hd@rXnLedVF>Gry0 f4*VCl<7n0&mtJ=k@1o~p00000NkvXXu0mjfg37fM diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_steadfast_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_steadfast_deactivated.png deleted file mode 100644 index b29a3b7c9dc2e255d40a9db851486c0e49dd4415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 859 zcmV-h1El~5=#<@$}S}; zyA=Phc-5+Q>hlmnphldhnhg)wdjzH)b_B!#FlMm=V6j*L2v>#yh~Jt3z))wENZN1Y z#p{=f%LH^;#ptq%@eSSUvct6}a{i4#l425=OoVKRmP#{H00`Q)34r?sNkT;W$`|av z0Z0u`2B7+Vt%!?l zFz{^<0AtBb2e(_TRtM#ilal}x*U5D=GcyiPyWQ?E_fg}4(2P8{5$LbJu8u&Ue;@$6 z;?iVMgWqMfetz<-`v;`*+S>q}KYSU0fTJ=8dW*^du#JxZP;YKlp97!EFS(7t_9Iu+ z5tvx(p#ZcP%LG7-MhCz;jlcB3&{v1E^@x`2j zDGWB1EKdRR$Bc(m_WVb3fh1ZI~M=|002ovPDHLkV1hiMb3p(A diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_vengeful_activated.png b/src/main/resources/assets/bloodmagic/textures/items/SentientArmourGem_vengeful_activated.png deleted file mode 100644 index e1e8f4a7013f225e1c43feb54e98ffb86415c0ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 971 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 Z_#0cM2e2=gWQPC%002ovPDHLkV1gdRDiZ(z diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientBoots_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/SentientBoots_steadfast.png deleted file mode 100644 index cd5720af122ac44af5cd0c0cb50acb64b34531a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 697 zcmV;q0!ICbP)Q?i@mSVMg{>sFT?XQA*7aXst2E(9(Wa z#B*@Jj&lEI8h1cO03Tko)`aUYcpdr7WZ zP9PA#T1#m%$@ZhQY-p_I&5P#*0)aoo&Tj&MikjU#yWS4tLSNrU)(tu6BF*bJZ+UR~ zDuKK(<&~BEoS1;nbO<7XF$QZb%?&5y<>x_p_dO$r4m3(E7DGfhT;C+Aj3@nLo*b;I zlRMvr5fMaWiokIkthE%Cm(bOA4?IiX`%gHIgNV@6-OKF@H?Tv)l<(Tgv9%>s_xGc< zp31=YeG-WTuby_YxuJ%#+A5ZnEX5du@B6G=wVWMIb!)5m^~sCYO)2N-SI;+R-8+GfRxljnL8k2&FWm z-WWwo63TU59LFIvFI)K{EXt45@#GfOWjp^YQHcn}3l>XyWN^9_7&or^*KBh_*?&DR f3aYG0!2wg zK~y-)#na78RACqe@bli@#*Z0CwC>DYg|J$bQ4}qL%2ia96r?FZn3Ihddd|G-1oE?N`!VUI)A|7_rQ4sNvtFW zR+tqRNC41U!!Qb6H?May5-CQ`(U@#)5f|iI^z~e2k>8JCxkRG*gt$~3fe>OzU>F9J zQWzY#!Bwup+{6Oz^*=&BpNC->cs%$5?sOWHaT}pq57?EPg4Vh~APLX&KoZRd4{(0= zJ#%v(c`kOEUAZZEo`=p@l-bM>GpScR)!4vp#|BA|ES&I%fBfWO-06J@I$4Z<8O82t z38Tuu@TXz)Ubzo{upIUEbx1f4;KPzYDFv-HF2>F<{qqgg;s`sUEewT1Ac@ZQHhS)N z=AALN9zDW=RC>8UN(rqsw(i=3hqvECyDq*ZzCua~l8ApELEp8zNYBjRP{Tf)-%*RE z@$rJ3B=Y$@EXzW)v4IP-ANXV9DbL2*XqqOJQs``NqccCmU#ZvZXl|luny@SjBq2y5 z91df9q=I%jgAE%uVvd>%0 ex-VP8EM1(*fKp+snl3ye@2ZzPs?G;_ujd}I9A6?h6i%WD} zN7r=`k&uAj??*(i$eJ zhku&w)B}VB0NTA?01EbOBfauCHM{a?i{BuX+O%4?zm$%Olg#$H=^yfi{;sKo0m!^>QpciPvdRY?kU8SkVbTx8PCtJ4W*y)IU>z zEY7sZm-|&}c6|o1GvA4vo`k_6lC!dyX=`P3OtP^|1Mv9zjOSb3-E>?(rxJ6EnRw&k zMZ-hPiEHQ|>mzDr3N1X0M|*9!JzeuD43CY4qI7r5vRbDyA3D!O>vLvfOlX5Wj7BUX zA=S*_%O(a&%1OCYf%D?|d4ZIbD*$NNn5L}mZkFD55*-XM8T`rOa1)~+KBD?RF|le zK~y-)m6BUXlu;CgzcWpaQI?~jWZCu4d@wA^N{B8L&2*6p3sfp}#D^j*!ZHwIQVSz0 zs@FmqF9a1dh?O9OW@?~auo^KdvCNFrZlgKP{JRJ7H;KRw?6>o+wOM;95n(*f?noN* zv9I$pgI~Rv{{=X&xoE7pVL*k>OzJ&v`P4taqUbR4)6di1-mVM*UDq+0Ok>;%^D}9D z*}?3{X{2sAI>w;%#(lMC_j(W!M1(*fKp+snma$FTy;r5+b*^ZdW=!LYE;LP}QqLAm z)6g_cL}XaN@Ao4j*fO?BkKQB&uXAPok_84d0#xeRa>iB8L1{7=H4>uTktAm>Wl`~| zp5o-2BqnT94Gs0oJ#m}}OE3xcYI*Y{O{tX@qD$I1wl@`EIK<>$FTh{$m8NC@o~T1o zSG7?^*u`^508rcV0)Rc+*AjQmN$KWY6q$46nD4C0OSACIxgQlYi7sChR`Ya} zNdXLR05BtLs&S%l>vW3DIWq7xL*?lfJXK}HY){7;v5+YXsrUo?_}=`0 zUm;dZ-R<-TO(0@^Jlzj#`H*#-IYmxfr%#Rw#70{IxE^yy*;_6$t<1#~J%CsL$>fPv z`a9pDy593KZH`fUqxuOOR{dF38L9Sohq&d7MMTgvjsJy3gx@Lpe9RV`onQa}002ov JPDHLkV1m)3U@QOt diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientBow_corrosive_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/items/SentientBow_corrosive_pulling_0.png deleted file mode 100644 index 7227a2c4e42219ca38ff03812d928e60d548e459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 611 zcmV-p0-XJcP)_|cY+C{pNd+L{TZi8u8inrAl0Ia{vDzi{( zL}}JK7jFn0clH8s&Hg|=E#HuKkx_d@b+y0#`B@{D=E%a8fP^an8So5B-dvTXR75&D zSlik@upr?|K!T2_3Ob@{cc(-;w}HFgMZ1U%;Hz1txhg==5mn8i3;Lq)aDoMW@n8#& xGcnOLP3q)sXx~WcadqndpKwGo+xN^&eYo%0zGkV<{XHz ztsxs?wYFJ_mY(7dq(3CaQk3ag=EA0J>3-n+aYg0)cAJWK+p+WMkE3fwKJfhU!1I3d zen0O=RFzYa{rde=KU0Q)qPI7HD4FA4!g(j92Y}r-4&#~hDgezt{=~L@ZoD~Lk^p~AqrBj9 zQRy$DzPC_Ia<(fVs4BgW0=l5wtydnL&;s9LT~O}UlGs`;i(6XW(}ytzV~iSOs0$pX z`O!x85C4U#;sof{Rsg=~zd$%-lSVotgAra&oli%`Zq3`ZQ^+(jHhQ1QGmmMDtWF-= z0kD6dK{i#*BKXA*96Gs?aLDHR)(G!UZ<4sgS?7uB@a^j`Ef)ZdW$~#q6#!9H78ZN7 zVOJR=sW<2wy2klm{nEO=NYgUXvEyHg%YB47zTb74L}`)LqOmMGoaYESmL(Jb1Us*? zB&U{G%02u!SM*HFSqX=1(o>3cAn4^!#|jC@6^&)#I&=bY$iEf<#;1(|;7)Uqw2yqt zqR;AhZD&)GBrEonwmH`bK-ZAXqJz=AjU zowoTKl6JDE?q$Y{nE;f(>rE(V>%Ij*S!o4;j9<5sim7L%@aawZmIidz=|%~MY>s^L zi@urvoHj4@(%IDwkcjb*a0Gy^n+c+d(m|!PkkN4s+_njJUd26S5?pRnYe$tN334a8 z0Ju9iNPTbNV>u5seaHQgVP=%PC$(0+vaf_%s~%s^dK?Z1q!APaMzz8=c zf;_PziHcWG;PH550l>N7e!b~_6dQ?@*q!QFxPk8WCR`Oxx_=!d<&j0axUn?O(aJT? z3xKF9z0LY}I_0)) zg)^~l`d+8UJdj~$tJdq)nZq*Ingt+Gx>xO!FH=&UNynKk8m|}O_xkXZ1$lq}E(uGR zlAI}(gb@HFVT8Vj_dWoi!`)AD`j?zKn#)k=Ct9z4Cw{Mwhpl;fHUDjCk~CQwX;ObU z+Ok+A9l+fl8~>_Xw0jah1p z(an4JVT@5@3)BEr8sm&>u} zIb@|0+r zhNfvEBJ%=sb90CYPG_3vzIGXH%$N1+Vh!jwpjV!f%T=|Uly-x$0GQ2YTrP)H79Yj; zqJllek4V^(rgE|~SXFkBaBCp7K@TXhWh=GCN_2G(<|D}f^8#64rU(IiAD$X;TU#p? z?HvH5wiHU%_jDDxeJ!Ck>%bCd?92oZQk*4MJ?GeZ;xRYwG^@6@RuW6y^ndOmwg0s2 z9Y|1-X*=-N-eW8*m~V4GNu_Qf0f4vrH2}GpDI{L=P?LTTTc2AdR$ozTVywLO6rh$Y zWoRZ6yJb1bqyXj<0N8CI#)-o0%dz#j<;=8GmFQNyjkk%{>w`*YszVT52dg?Red~32w zD$HZDqnX)YJEq}Y#+H}~k4<9u*;76pKS#_Z4^?Fs76ewVhz1~je}i&#UMJ*s6*k?^ zl>URD06SxYA5cRd8Oez;YHw73_pVKUR#kpi`(KBR$%!H&Xqv|V!Xm;ik_dH#>3D_0 P00000NkvXXu0mjf3A|TI diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientBow_destructive_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/items/SentientBow_destructive_pulling_0.png deleted file mode 100644 index a73cdcd8a50343f5e339cee006b454ac91a04fca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~OrP)Ao0pUqR zK~y-)m6A=N0Qf5}DSJNj?PTriceaF%voyOEqd%_N|qNi->Ke)F=1VEQk zvMJfJVp8$uMNga($vqZ;Hjxd;Mm;E&^6b0)8hP^+falo-RrdUKE4$a&RA5K@Q5fwUHf7m1_Tlm@SFsHO+y2=8*qFf#VmN=y-4{yk=1%Ku zY>0SbtgRN}T%Aako-qxQ=np{@g-!n$q@%6e*Bf5*zEViJ+or*OFz@k?qjN<*@WAti z&-=~${d_(jQB~BAD(RcZD~E+Alx5ZGQtTvC%*@Op>2Efx{ahXZzLj^N;BDl^?GiZ| z!x`w$lJpddKXJU%kGCS6CA56pCo4Q2A}w1O z@2FGnC;Jo-RF(AQn6|xFsp+wP_4{iw^YB(p|7vMlJb^I=V~iSO=#KT1J|5DR`AJk2 zHvprT0Z82$#7U;0U^$C_{K?b4db%DQQs?u}ghC^^v-kPv#&;UBnuLXnGZ(^LhF*B=u!O@HaE&L?ld8*2d2g(7<0IRJ>NVp+A?6KTg2Pe5Xr z_NuU44{Xwx3YIha@RWEePjjK-cjf9FA*)Grp@>oU0E4b~G7bRj_z2!$7cBlw_tek& z!}%-XBvX_;wN0l68wq(Egk_89LJ^*Ce?(mJI0ArY+4BG#&2JXHevS>%Zr1f2&5HD1 zI;NopO91S-du%v0n~C7}*JxxSKE0DipH2{B2Pcz<8 zr%Q=*UtHz>;yk6h-k0WJpPu+~C(Xe=;_+5oE*Df+m8&sEYc~0_uWhGZLskE`jWN0u qQ&#$_sw(A`RTyLbIrKz<|MnyM?Sg2To0}E@0000(*1 zK~y-)jgo&z)OQ%iUyn)6vL7NMBwDQxSLa%;rSwOnP>jj?Il_o#9=l*N!)s%W6$?~Y zas8rYe_Vw2!+u#z+SnYa+`>6?FgCErZ=UDeeFr0|J9BGXn%%QMZeAVrM-P19;rV>t zFW#T$c|=utnQ*&HlOEck2qPm=QYQ*(`IOjg%4E_$bNI{K6FiAgYSC z`E*xHGy4x6qp#yM0M7hT9P8Q>f^*+=3S%(<8r#0(TEk%l;tseI1R(sg4`+Tc09M~G z1iHS!v0{$^l&>#QKmY=}-%$t1z`#Jf2jV&`-n_HA>tX}mkBixM@C;e0QM|9-Bk*;x zzBjm5m}?|6`Zuy{3Y=`Bbf6i46o8H4f8oXt07U-$5jzy&-gp}0f89mWmU3Z^Uq?eh zShA4%lTBJ(ULzA`;Wt7NM}NOwbrDZ$?!n4*?*P zhv<#jPXPc{e=m*$-{UQ-fWGTox!NUmD8k}NTeav&t$1=AQXjaiq>slTDUuAxNS_IS zqsl9cKVY`%mcRK%NkLg`^(*9tu3WBf^wvc-)P0%vYheE?Ei4w(}vfsw=tqXf`*k z+W_$~Mn>)@ZCOE89rfLnO2Jh8bSeHWTs8Z}uKP?c-?^bye=p1T)ky-7la&j=sc%~e z9ABw)SK?Xqf#}%01at<_V-I8X_u^boKzGMcUH;Y%Vb#haHOA=Mo8QM6qsADvkA~Sk z8b(#0JH{COsr^ee#;B@7;nGF={{_aF7m8j4naKYGVhUf-D1ojo00000NkvXXu0mjf Dwt9A- diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientBow_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/items/SentientBow_pulling_0.png deleted file mode 100644 index ff44e3831b04f659c81bededb505d9d01a96373b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmV-k0-^nhP)KOH{6%At4E*%Uc@YLPYni~y5AvRIE^bZK_vRqId z>R_i;bO`Dq*bme)Jj51X_ARG1A(l>ybV~MgC`G@zQE&Lb=ktO0`*}al`%%|kCIsNq z(GxiL4>C2_ujm1n+avAoVm?dtdl^gY(F2x3Ay(o^)`81ak(&cbnMn)2AZxh|w#p?A z9XLoRcnQNWlm#GSeB|8mV*n)HCb?f1xi>Y#!u(a%G8sl~HoVgpIvg2>@yF?1`5+E| zK%RUpip%X0hd&_G-|8~+qam86wN5+PC#lw-CCV27Vufvr`79$qWv9gXeZ$yN@3=lZ zpa3*Y6T>i+Pf~J2o#~uYp!!-I{(wXpS($V=rP=$H@{UC6zq+dT8Zx(KUFNF^IXr%< zLj)jLX~>>rm)j%p)lHeLy^TqaZEH#6K}21 sJEp%dZzRpQdiDR$7@s)(|D-nj1{O*Tkg&pRe*gdg07*qoM6N<$f=Yr1^8f$< diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientBow_pulling_1.png b/src/main/resources/assets/bloodmagic/textures/items/SentientBow_pulling_1.png deleted file mode 100644 index 89e04f1e62b7cb2d493f247a17def946409d618e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmV-U1F`&xP)m8ZG4^t-yA5lTcRvn)Q1AYcy3?N^H|JG#h3jm(j7Lhk?Dy8uj*?Yl5OVf>5 zldHnb{l|}ZKG07}ViI-kuSv_y7R!pbiFkhhjbn9n{Q74r9l&z!C!Br-xnSE}RcQ%U`Wzd(PopY>PEG_aB#8Rx5j*n*lqgz4|-5MTIx33dp48|BW#!&0|nF?)F=Ws8o ziUr^r{{Yb3+ea|qCjodh)X$nvX5dRq*39n@3Mocr4u*K*m>iw_MsWZyd(*|Se7Rb;qW!;?i3HfY;}v*0z>V+z89(Pt>bdE=w@r=hH~F z_T4PuRlHYp#EM2zvHo}oiIaB$3Dc(oU~e3jrq@p?JXy=i!v|v!jijnf=o5hUp&kk^ z4gw(g#bxTMtiidtkhIKf>1_K$0m;2vuTxkl5`UZ4T(>49&!uNlt)!) U)0C#Cg z)Iodqqv*F))&R(yZC}!yUM3QMTLE=6*GVwo=Xmvhx@z9%+PJ=id+iSZqGx>G-_Ll^ zQdf~KbrmuGTz!GZczr%H7A$}(*LB;s-$-l+bLS*61}f-i7~8Y}44t^ezelcO-&HP$ z+~s(EJ`TCd866#slCyI1)EJ}r#bvQ?tI#%7^@CxI(eXJ;GVH3VWaZ>xj2SEXDB%70 YA6Vi| zK~y-)jgoyx6lNU9Kfm+sG88N$GsxVYODBaKZrB)`&_7*`kg*MPGb+ zFe?@cy{w$GHfS)Ez2cVn0vjr9SxBdLN7u=AV>8cF(K~PIZ+~2#JLVsI;DLwV^ZS1I zKF{wfs>=Uaj?#lMjeeh(;PfQ%ONCEoX7sjL`6xL~0N!r7LSK7#R8&<_gLCvgW0L_k zug{>q=2hHox5NXyGV9dLThpWf2W*e&j+A8j+PkSbdJLz>!@9II%J=VyarEfpPYZyk zDor7mUa7l8V|_he_VxqtprDZJ+iX$6XJ7RQ;Y9$Ne)yKI%V!jbI2ewf0^oD^J&JO- z0MPeqKkqnQoXE2Yz~15_1q8t1x~5!4TrO9{0YD4)^polf)E+-hL&ci}H>UH*Tkm6u zi(|IqYhkltZEy-HOaf3q8Y#d6@cj4;o%{(v&-es>pO;m?KVUW#U^@$JEOO|a*A4bu z0M&4|EIrKvFjG;fWzH-L-+Ph1k1uefs~Nw~%jDr&E|vvkUW6AM#VUy&03^}F?Zwe$ z0KmY=2yNS5;^ot?@k{s*ZghMvexH~0aIOASIVHUbHzhe}S6xVpKr9jqSd*Fxz=yV7 zGG$rd$ArK1sk5h|kluZpm|Zm>ELzcpG@iX0i~t;^2es7lN zGGHtah)G%gp_8b^uhzIc@}AqR8qU_-ck9IO^Rm|+(vprYz52n)WkA-33;>$H`Hr1; z`c*A{l|+v`42}Sjx;>u>-zWnkBiM6tIN#P43D6VI>`-Hj?kqWgF-DCsl+TS*J~xi4 z{%0Fw^jvGF8e>#dVXM7BA6{ULSy8kSWa<15J%VR1kO*Yo00000NkvXXu0mjf0ql50 diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientBow_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/SentientBow_steadfast.png deleted file mode 100644 index cb5bcd4835d8522ddf88b733ebb6e15fb806943e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 780 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 IM6N<$f-~e~KL7v# diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientBow_vengeful_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/items/SentientBow_vengeful_pulling_0.png deleted file mode 100644 index 082aa7fee2b54b08d9ddeb467347f6918f9a7324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmV-y0+aoTP)JRIi+^}-MT|HJ!z@B4nA%Jg*$ zz`=!YY&&}r=c$W|DhT+zVt*SsljYT4sLocm+)9ixH4+El*wP}7JNH#3>E>{dnbcRz zd6Rt&ySZ@n9=fh8C&1j`1V_#v2jFe|J>}F>2@b{>7;a-WWw2-OcHC!fY*3`@`d_8x z*N>&M)h(+Z6B6)wrL)y7YnS~}3I#>eH0#*O<@O%y&ndCb0Q`88!N{4gYbQU=0`=!k zGqanSYwQ_Q7iFK>qCJztNX(orRVdPA@)|T1oyQEa9MET8x zY>-?F#bCe4hqwS#7O6#ctY4;+Sq{H? z#P8@V058+;l#w&7QI@2xw)}w4E1xpsRAu5YF0T$;?>|Fs|(TK7a^>>WP z!`oNzcZ_YeF!g*?G)o2j0q6uSZqAOY(=ce0eEx%3a(9R!Vr`O!mAIC0>_Q3PU1E2Sc z_rv@1h^i9#`kX#85G0}L1K}Z6Ra&4cXFC*TZXtp!RC{z}?IHj_91&3o|Hq&0Ch0HUf?l@_S~ z%rTNK+bs4?(s;-zmn(Mbn$#46PjpMN<1^0NlPa^1;_?@ZMl%T}_A_9W#vA|y2S>@S zZ6aY#@J6m`Z~u2H9_rj>vaFAx(M*y*`2w-zpA`U}N>2jdY|&P^*Kv)a zQ(iW9d=!WHYJ2oZ>ka`JTb!n-I}!s_l@_R{)O8oT<@|`Hf8}gq z-OwqqLtze2{KWA7HB7agX3MH);_+GlqnB&|jvhGPdvJFz(X$3-c0;_?^AZ)1FFhTz~Rxi758bHT4$J#L8u zGS;U7Ff}{NtwN`+6fSlQGJkK0XX_41MSZ(|++0gVeLFW_eI3iPVEgl%)fl5YcUQ)L zTdn?xs{U^qV|3+AUhW1}RW>_b!Wi@5(L(|M?Y{w(1c+pbi#|Z#DcGnrp8YWEnAC?ZT)3QjpC8YC&Jk7R zd)AtiN zG&eU(2*5}CZ`v@v3x0Q$+}i!7 z8Ky;3;;7cm2ewGx*K7bI?Wx*X5Jzt8d`{HWakKDOtX3~OdfJJXf6$#cK5u(~+TdD}Th1yHr#^qyBJyDfa~cYf_RmugK1#bZ4Md zpg%=^kk3b-@hN&56KjtJA%&ThnjT>jdIvKg1J8Zy%NY^EhO)I}j~v*tU!R|U5rnL7 zdCZv2>uBiufrb|^`!jgg;vFz$Q#a;PxIJ45gX=XOrN)EZnJ-q>4s~@r(t5XtguGk{ z0wN}j1)!|@D$kRaD%-Q!b|h7_XF?D<0;qfYo_e>3nAwxKS5>SDOB}-d_!(-9(WK?8 zF~+DdhE3gVZ0c@9RlnNC7;D%RW4 zK~y-))ssC-TTvLte<$XRyfw+aI@wf0Xd)yiIQRt|qeBt;1%wtlh%Ti|JG6A|((Pu; zQo7yTd;kT%LKaa$aS`7_J&>jFcQPbb?vyTl;2F+==XZY3InObYm?dJ&82=W~vwr~u zC|`D!D>>tQ+W&oHqXDDQh)%B$z{A}QuUc!o`}qrde+xjT*C!SWNlO}MuH@+L=O6O? zK$0{V4D{{rNRs6FfmSv)6;C8JSrZGxuFp@|*=hrDF#N;Ga0tN8R-1St`TP?~<7QK4|KleE zP#D Q0RR9107*qoM6N<$g1jNg#Q*>R diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientHelmet_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SentientHelmet_corrosive.png deleted file mode 100644 index a52612ffc3da06bdefbd22c76cbafd719878a93a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmV;>0WbcEP)zN^cOhQ95~b%C`33{OO1ik`5&B7W7|n% zjr{>ZMT>}eL#1TH!M8yay|~Gi9(acLf#>sl-d}iCW1qHTkt92vdtTg~ zlO%1&;^t0?awN>z9?1{uKfj?;t^xpVI}dnye*yqh%2mjb@b5#IrNy0%UrW(; zEP9^HP&gE9F#jqE#ZUl0WbcEP)yRY7oeu9> zMS{+J4{yl{0G(EFCxou1lJx2*< zB7^&9w3`haU!3FN@g1$7{^rgBDwR9{;Pd4zo*1evQebCRR2q0KjhjM96YRC<#OCAD#*T$dzqqT3W;p zQP<(Q4%gPQv~3%uQVGRk5te14kT>bM4h_SY@reKbnZ5ym@8&RD*da6k0000_Ls8pJurCV!;~AT9ochc&X-O}f;eO}4hjZ_DKP1r##&fx* z=R0U2p1gg>!u)(wt|fu;>Iwieb4%Qwc<3ja*pehg!+R77^?2BbS1T@KS!?qare{k4 zI6uB%?(gTu$PDG5Up;Q=@xQy7OvWz|>x!r{x9EwCK7T-^BkC0|jOVy?ty}iuQ_|@) ziDc5>LL}6q%SX?9cBk&X)Y!RaUOsG|Qd=OXe6dKrSVU5zfFxN3TUNpL3hVQ>Kv4BH zf%+Dfzd20LmbgEfW%=_*;1K{LXHSyqGXePY+ui&Xc6aVlxmuM~u$73#)!h+RS9@6T zXs@h-t#Y-h;La@^NWwqVXv0nz#ukf|*w<(D$9e(y&M)J`+NuYD!M$-R>wkO_o&z&E zKq_^FgU5%NymFCahleaGj>FZddyS4HVI~L2UN3R$W}4UU-vDqY|AN}O zORzJ9YBe$!hMMpB#xMpC9HP~qSr6m?!EHDG0{BUHNvp(F`2YX_07*qoM6N<$g4o9Z AjsO4v diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientHelmet_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/SentientHelmet_vengeful.png deleted file mode 100644 index 6ecbf405ed1e75aba27aac00e8e9f058e2a29475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmV;@0WJQCP)u&*9t#1Gz04Aal zs*2p}?%Zs&yaDZY8&$Ic0I=UbvA#Tui=zS>A01KEtU!`nrb+f%Rb-Y6JG2a)Bw4p_ zcw0IrNm_=^?Ts}C1Ag{vBsc8g)kZE~1OPl;-=SHn0RVFOB7#Bxa0vahcx1e{Ti1nq z?RGGLtT!J~H7htiE#vaKI3IJg5@J#rX2@#B`V*jKh0AN0;L5aqM zcZl&gEJNqg^d!^iG_u(&GMNlCO~Ya;LCesos_KA7{QuAN149MmcXoRN%K!iX07*qo IM6N<$g44Ufj{pDw diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientLeggings.png b/src/main/resources/assets/bloodmagic/textures/items/SentientLeggings.png deleted file mode 100644 index 1d8fbcc516dfd853367e610872feb8963233258b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcmV+l0`>igP)xS*kdKfo^n zfk+gI6fwrc5HrliyPla#Va3Ea!8~p^(#+A^?>kCF_@4<6AFQ?9dGuIpno_CNSh~1K zzn`>toE;D*5xq}4oH=z;RV%aVTf5Ea`U>J?IzV?j^tB$<+G@1`=ygAm z_tWWsv30!1d;eRJ3e!vrg5d7~$!vA>1Lqt7weyRA2ADs$fV26qW2I1P*jQ!^NqKHM zpuO>S6qfg%FdW+6`LKa=g9*TxNO9?ei2MxgK$s{gkM(z~iT^S`00C^oRi)?#SO5S3 M07*qoM6N<$g3_@~ diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientLeggings_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SentientLeggings_corrosive.png deleted file mode 100644 index ab2b93931cdccfa4288fb828a7a83dd4bf49c411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmV+z0_XjSP)KJq zKRL$S+$^0F!?&+rC|63DIN{or>+1f^8>b=>$e+k}1RUSTH25WI}nV+Ab)(Y5Z?qds z@M~ACu|$E!ExPDXqeG43Kon@K(F0Q$03@-&Eh^fzLoQ5BtMRI@j++6~S7#6@3~Ed; aFYz4`J>-*7^SsRf0000(tFE&~v=CQGA?ODXt9*_$A{JI5LWqiJA*S5M*3wT9NMU0u zf~c(^Qv{;yDC?iNJNw3+nfLCsSRH30?y9-)iVN@jxbL3x1T*7*%8WNkDXgu0VXvXk zXXWv6qzGU6u}{00000NkvXXu0mjfhFF#A7JO6-2hQCm95 zB(q2^%tN&t+!jlSMJ-6>W8(cg_GNXYS42d?TVLCt^9HBFjZMct&gi6|=(&ea((x2U zjY!bhx2=8P?hXe>`5;Gl0xh@wG~mPBGJgHJhT}PC`}Y6~B(t5}$r2ay^LxaCcV zdmhMIsZ;;}Rl5PlYmWx>ht?We>t~G=8s#*@F#a8ovc`iBlbm;AEe4;{U`0 Xk$K~X+rq+$00000NkvXXu0mjf)HvY( diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientLeggings_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/SentientLeggings_vengeful.png deleted file mode 100644 index 4f0c4022f1a2786ca0e06aff5df46c6b3bc5a6f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 523 zcmV+m0`&cfP)>}({g{0=)IVMB<8uSi%Dzd&N^hgjJl=?W1W zUnQl|>9o_CJ9o~pC}T>rK2CBMC%NyFbIET8xg{}EHwv|F>B7uRSUf5-Y ztMeC6W*Ae z;jl)8pU}}3=bhCRkWYZFV|XNm+_jB|+dLvf;A9fZn_I9PSG;R#0PU?U9M!a7vhB5X z6wCs4_x6H2B`Hy^)B%hQ_Twh^0$WN{Tn_*ci#DOfFrYxV&zm)X$mgvpB3P~q!_ZNZ z5+y022@RI(LP`4K!WV$2d>9cO_jwatsczAlXcv#gA_jZXV8M+6PX!Al#|doBX0rf* zhbI%ZBO3$4MMNN?x5fOB~`du#XasfD8H9<i<+m#MU{wGB N002ovPDHLkV1gkT;oblM diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientPlate.png b/src/main/resources/assets/bloodmagic/textures/items/SentientPlate.png deleted file mode 100644 index d61fdaa5052e1202049a186936093d94edaab59c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmV<50wDc~P)0&Gb{ zK~y-)t&>YgRB;r>fB*lz(~L8AXC|y5Xps;-7g0hWfl>R~rCOUB(2LRi)J$vir4qVsuau5+jgrF6XpcRqjB^5HiaES!1h_qk3;rWWT z)=1IT8p*}AUhY6dFabj0sPqrL2B5UG1Z5ar=NzVO8^h-#7q@2RQfa8&rj&@#cBM-O zUOWTfVEqBA>h=II`m7ItCF{yjT9JsyXo<%FSiiQI>dMW^1nB9x&Hb)!>`WSfkFN$$ z+F)_<27G=$V=tZ~BDBO~B;s*Qe*in3rn+)-_K0O=8D+S|{N`k7+erY$t? zty8Y+l1wJEEC4u;LvQaxwv<;eF!~NxKxu`zLe!egf`toNy{M2oeUC5<1EtiT2^_~k zM2Hm3lS55S)NZfgdn(QKo1HjHQBhjKg1K`@bam2l_%L}sLnV{R>?#1JX_Cog065)z z65H^R`8CO|9kpnsNOa%8Z)##knzHiM+MB>zL2J#awhQXe{@v1g>}Xa<0^z(oV#iN- z*AMx9N^9*2%mkR8oPKoy0M0iz|MNIjFrXaA;qL R46y(J002ovPDHLkV1kVfNf`hD diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientPlate_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SentientPlate_corrosive.png deleted file mode 100644 index f94aa59f65fb3f53879a92ba7d56c1024cbbc18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmV<50wDc~P)eiRACf`pYPr~(>Pbh5re=&Xc1CDt6B_HP(xrSE}|c@s3ZtNh&Cb=gOx=@ zk(r7~Rs005D4mWg__sfOQ+HQ99n_JY3sF_vz&8R+ev)`h7c<5)p1Z zZj-lfMgVATJW6!`VF1PxqX1NFTZ>XK(0z^Ag-!r!q7kaL)F}gCFrHvA{tP>ln>hP^ z3Z-kTimt}D#7A;y5)mPGp_87DI~V~2J7ZI|r7kC8bn8Clq#ek@(AY5PRE9vPfG;Dn z%zT)_2pFX178!W@8~`Wn5Wn?EdB2d!WB}NGXcwc2PfSd`WMO(9!>!Tso!uGwD)I=ln zUw^1v*Zu7S0LO6{j3=n6-i+V$krhFyT&_5{l;tbRsM}G^gC_}eT}RjT-#)Ny8_Ti? zhD|xu+9Y$Sk1{_0LQY;eA&spKGCUKPuc>#^)ESdt*p$-JQqN2VfMFO|mIc7&^H;EZ zHg3w|_>tXcN~gWIj{@x@EvK*M*48xCuk{Si)0)P`j@zoC{-Cs<=>Wh|Hlc!ITFYKix(lqboIRe*p(KHPaArvT5Khlc=&~>i+ufquiij?Cx{7Inx%QgNBegX~z95_Bh RaAE)e002ovPDHLkV1nWeMYsR} diff --git a/src/main/resources/assets/bloodmagic/textures/items/SentientPlate_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/SentientPlate_destructive.png deleted file mode 100644 index dde01e168832b2627e5456d9f7c17ae1fc2335ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 732 zcmV<20wev2P)YgRB;r>fB$>$=xu~~5Gp0Li4cOI#6=q^D$^hdF)B49f+Ul6MS(#`3_TEp za>NocVuV6V%@Q-TQizH~K|v~Xky?u}j5513b7xMAVQ#gyZ+V{IIo~--L|6$lfK(9? z!SBxyzdu8Q?VZ@R4L~dwbL>r_4ibrklY@vLBKUl6@%h|RT(n7YbF;G5~s>jPR&$fQXgsI5swq zt}Ax!+(>%5i+7`+5D@~+tpsniW10q$NQ}bLs^k*$_Eaj%vPlShoEc^5r-jF3GBNpu z@$os#bc2P3CHe>Z0kABawotEfRER_(03542$neMq=Et5hJGV%h%fRC?nVnl?VQPr! z>95pQSE7`{Fbn`xN{*I$U93-=mB&xtlDXQ;`Re23!%arcj&yka7 zR3ece91bT{0I+SFo@XQMD=ud0{RF543WXqeyO5eVK@b+t#O{z@=Oj~H&ZhfCL*ob9_@ z8A{VM=fDhrcs!1#X^04>=~0&TT>t_Nt^YiZX?m1x+x%TX{g-cC34Q}ckr7#M$P8Hk O0000YgRZ$d%zrD{t9>d5-K?V_(rDOx88cCxbL_%St14$!O zDnu&KGz@xZam#`p6cI&|W>EAnlLogpKJM`x&uVbFryAQo+8Z9fwOzvVJOEtR4c;4DJMn!#$U#I95$u$Z*eM}dyEtF6GZ%`T5|T3)uLOVF zmT!`6%Qs0puCcWf5y1pVPqpRlhd}^}bCzK!Gw2+LJL!>Nn8f397tEK6(juiqgj46Q z%J9P{0Bot=&!PNc0Peqg48WS~RVbx77(Pd5Wi0>;H?F3fC&1&daal#s~NkG+Tpot3pTwKZXxNo;o=D9nqAxU{HHMLh=}pEu727>SOMW=*H> z^8me{USgRRUq-$W4tE0(^&HN2ol}7ej^hAOwzZu5uOD&e-5^8Xhehzz2s(P0dV>GE4r$WF*Y{JiXFuq zC@WFE?-PkcVlDu9o=0EzZI+d6;Kzf0L^@20E@|7zRqIKMXw2 zLqwQuXUM^QM_9MJoS#3(dDzkpu3|~)dgjcT$<4+K)YKioNH$d@5{ZohV45Zq6EO$s zk5{8S6We3%oCeiRACf`pYPr~<2W`A(`OJy?5rcn7r27-sL&xd(Zja^ByH4Yz7*@ zI*Evoo#B)044-uLJixYX04&RL;_cmiB$G+!4I+Yw5b%2?;P*;-;SMRt-zovWS2}wK zoLqHDkyMuy$$DLTcON2x0g#>Hlli$30QT%Wg07U)c^#IWz-8#H*X8Ezm%89Fr9^}$ zyv zbPiop9N4v;G`EYlU#Affn(HHU^z`6y8N@A%;?mlbh=mnF6|-!Tz?aE)tj1zwdOduY zUf_Ln7LUtdX=Rn+7sCL=EStN7kCd~8csvfksme-5CqFYgH^R))GH$~l)9YboX_)s>l;3>EDO^# z3HZGdZfcaZUlX$O{kgP+8YFz_qAW)HW$ou1x!rhK0)DULLUOE002ovPDHLkV1l+&Q!fAj diff --git a/src/main/resources/assets/bloodmagic/textures/items/Set_area.png b/src/main/resources/assets/bloodmagic/textures/items/Set_area.png deleted file mode 100644 index f43368b6f8d3b77bdfe3e94bda0d8c21d58cba24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 505 zcmVVGd000McNliru-~I%5wSyQ5s4B}BC)uHhJcXclnkl)!v5e)hv$LwdtZ29RJEn1TX-Ee z5;{J|KR=7{<%dc}BlQV1-NI!*m6n!f?0YHt+U+c#9Vtz>D3{y|15CZ16iv4%PWc|d zR!!2;{)kn}D_e6rno^D28`2om3l(XI`?|0wzqdwy@Jv!y#M%_d_Lb0{9keh10aWH{?MRD00000NkvXXu0mjfjm_La diff --git a/src/main/resources/assets/bloodmagic/textures/items/SheathedItem.png b/src/main/resources/assets/bloodmagic/textures/items/SheathedItem.png deleted file mode 100644 index b12e6d87eb776dfb9e7d442ebaebd22f496ee405..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1373 zcmbVMTTC2P7#@N^rAq{@c4?zb2b)mi-1aiNGuahzmz7Oe#ARcN+PJebXJK6C!py)f z*aQj@+K7En$;&tsxPuA*NP?4~j-xt+b67glZt+GM)t%eIR{sl9_Y+ zzVH9ff0;u~jSrO+?n!1F8;CH{r$w%0Z(ZmZ04(mZtAV9Te>(X^M2PI8Add4@WcT`h!7hx|rmm z!O*%bxbkCdrm1lxnNFvPw3ATvR+45}mZTh{!+}EtZgeXqpTQNQGN%v(hM-HDDX9vY zRpb+Dr|HL_r)yV`wMb+`STWWE1w%$=c#Wh9ij?K-y;jkN83q5ku_@Y!b!&i(0z>W8 z1(=UyWsVGEcXLBoAoPZNSeIZ@`1YVGbjm<6!$Cg=PY6*GIS0*qfsl0Kf|K>&B5(nm zby99TnGpD-)9dznoQa&yW_+g3#XwAu@-j3{*STt46vMhHr#HaXh8(p_jvH1ClUD?g zvn@f}>)gOixm-X8ys7FjRc+5zK~tM*sz#ftp@9HewO3L^HErz4W@zogL7+=rKn&@s zjIM^5lQuD*WD^W9 z&ZKQcw^a<*9|*_or5{@>Y3u#iu-SfSP#FkGBlK0)PQmGXE!dT`|o;^A|dT#!@QAPpg zmDhs8ooB2Mr>1P%i6;xYkIgQ9w6khrWOk7_I9<)z8XEd-zVF{VNKws`E9y(Hf2RF0 zS66s9UJ_!G$>A%u;*QekpMMt?=4bp**{|(+W4VYIK!mEWUk$$6)PKFtj+DlcQOW*G TtbS-N`@;*@H3r{&Fy8+U4&>{g diff --git a/src/main/resources/assets/bloodmagic/textures/items/SigilOfHolding.png b/src/main/resources/assets/bloodmagic/textures/items/SigilOfHolding.png deleted file mode 100644 index 55056c4b0b3148fdd129bb2457086e8aca4eb05b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1605 zcmbVMdr%a09KZ2FK{6ns`9jwd^>Db`+k0@2xQKfR+8rkxdMKiMyT5}KZuhudxPvSQ zOFbkXWhx|u5T-(+AY+BrO&TJBAlW1#6&0CjLgjmgq&?)UKOFyPXLf(D@8|RR{=Sbb zHW`-$2h9xPa5%w<3EE_K4E4Rw2C(0`w?G36cSd z7v#2qSPo}=E@8GX7Q@R*jIs+*pN+t6cd%#^iXm2MSxlvl~lecLb>8Z}|E zRoq8TSqvsfLpcE?6-fD*P=r7-g#eLC6bKRxiG+w4Muf0P!AB6KM5aVyps|O`syT6+ zGFhu1(_&XDZWhBhlrZdaxdbk;fO2NSh(e)&g(6ra;u?l2f06O;5ZB`7miRDtcOluNMw8z6^Z#`DeI9?jsVOGxMO(y z|Ar1`oq~OJ@}Ii#Z?VPbn?CLWcJa860LeCwlkJk31*vm6oN?=?W@X!Ool+IJheeIMxe?HW8u*Fs54eC|TtE=u?LjCZXv2xq;^S_oqsHmUO z8FzTmzV@nGGK~UmZHvaXr1aPTllQopan-&*Yp7j=v9@ z%Zm($GEa2&uV|fcZ|II=UQg2Hvq8pl8`AsA2YO$MXp9UDODW$rbxP?6ZM9(``i1S? zi@@*elXl61t2(;&?B!jGD)}yB>c%qlR~6WVgQW-bk(K4cpJ(QIwrnZP@Q%E3vP&&) zOn=zpSu$K)To#$JX5s#Zvj$VRm0Ih?mR=4{7d)T&df=Sk&WmXgxgy2v>3CN&@8*}G z7qq)T0TB}UV^Z{%t=?{f$EqfMAi7(Gbj;QwB59!*o3LK>xIFr*GJ_Ix!(7QJ4S#0zpYc zK~y-)rIJreR8bhlf9Kq}GvmN`b7su3(9CLMV`HnL0yjZKixzEbmqid11wo5GK@b!{ zU!bob7=;Q_n2{|SXHupd)FB-~=Z|-sJ9F+mEi!S`h0wD)=fL}WpZC0v&|339^6k8w z>F?K_9WfU3%iC|JX%asirBvP^8nGB2`5<=Ih<^?Sl1UwDv$%2nDl@Y`@mvLf;q&45 z2T)3pN~Q7peY|@=CYk_e2L|-fcsqA)-{Qf=e3Qj<52yI_yo2+PS2%T|hq3XG6iXG- znT!CC00O8xbtb2#x$tP3H(z?V|F(fdaI&`>!#u|47jbgA1)`C*rUnu~19q(jK)umm zZEc;`H%$~ag~BR>Prjm-DtMlYlyWb?aU8VPR5xolj>EGnWk7NHX%-<(q~WKLDd1_3 z-CL6Y@s1e9QiboS46$gG#N7#ClaV3G@I5dLAJhd()p55zw+S#hJ|O^XyNY2L1cLz* zL(^P(S;bwkF$@FkdMKr6G*r_V+b1CeLcrWymez2XP^g8`!3|Wl$nx(3T5BR44wFvchQ3rLejVLXhjKf#=ba4-sk!vRQMO zNvFjg06;R4&;Xw6qC5{N1)-pcr~k&fT&eP7c2?}`V7HQqgmzsQAth1>T+bu5)%iex agXj-xIROE7`Ey?Y0000_Iyo=?*{T2l0zgSb zK~y-)rIOE16Hye#fA>yjS{h2FEl>zZAesmk3yCqo#Em=Mu;3M3y6_o%0iVEykHEr2 zqX82!A%tj@Qf&i5ia;4`>AxwRc4n>%v7x|%#BX))N$&4{=bTR{rT8ED&R*_JO{u|w z7`uDA*0nV);aMrI4obpX(OJ`BT;<2a;J zX$-^1+jmQChy<9Ko>s$y{XBd6gjajsB!B{}MgxFmt3|PR z%)-ne#ndlM^N3puC7Q(=p64Q^ya=#u8>JNWlLoeJ^Kx{ZS~gE|*+WPjsTtJsRXpW! zerpmSJ`kf+uCku`PAnRw`$Z0+OFj)1Sswn4rup#o7&uN7_jI@&fW;3V1%PGM(KL-f zz|YV^mE>j+0vej8;Z&M9jzg>EbhObv2_X;yve`{~LLq{|F4jg$H1;dx4@{KZA`%J{ z@cTR3Xal4Wlq)qXt4?lvhb8kH56n0cL8R{*_ypl_kaDGhxGaeR7#|zq=k_j^Ri{^J z?2=<_UuRG5qed00Uow=+RW3~;!0pLNq+zp> zPKyfwfMg<}06f>l@jRpy1Oqyr`Wx#?wa$-BMqKLPypoB8a$Of8B~l1n&m(pE^OXQs Z(H~GA0zBeOfZPB8002ovPDHLkV1o5yE(QPq diff --git a/src/main/resources/assets/bloodmagic/textures/items/SigilOfSeverance_activated.png b/src/main/resources/assets/bloodmagic/textures/items/SigilOfSeverance_activated.png deleted file mode 100644 index 828bda85217bdaca710d63310d04b63c2d07a420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1599 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 aMZoLsm7QMeU2)K)0Vlgf^nB{7P5%MBxa4~P diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulAxe.png b/src/main/resources/assets/bloodmagic/textures/items/SoulAxe.png deleted file mode 100644 index 9de970d90e50dbc97f4a32f6bfb30c035bc53584..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 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 DupzQN diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon.png deleted file mode 100644 index 01b03fee95fd0bb339272736d36d55bdb4131dfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 717 zcmV;;0y6!HP)1co6|6oJ;^ZXQ)ATsqfT z(5L_aaO1&aXluoy8>p&^KJ!(kWtxyGgk1}7f+zsGuA?Xly+b1uds~S`qAbLsD1m@% zYN(~{Kr^Z|%XK5OQK;*B9-yk~->5Vw`Tj#jRPaROvb?l}Lyig(OHnNGFmswFb!l+Z z_h_R=0XXw}jo$k{Dy!Y{aIJ^t@Upb+D5cWntp4n`q z{)bOk$z*u*`lU>-uTtN4ODv5&#pAAH-Cjv{Y69)zW!%?$81CyS{Ds^UR+EX2qbG%K z=&X&u$6_iY8VDk^Uxd2c8_jao7hC;Cg)Qn2pm7caQK&1700000NkvXXu0mjfjpR+; diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_corrosive.png deleted file mode 100644 index 406bba2ad0809736066e8effdae095c84f44ce18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 725 zcmV;`0xJE9P)$n)InN#miKbbJ(qi~kW#V{B>b<@ z)YguQz%(U_BG8UGxtm=DfN7d2iUNR$Iaph~(%waCRRz&dh+sI(jIQJOHjXM3&ezw* z4T=*0xYqFqD$7VVOjK1RVf=|SB2j**`-MZBStp_Z7>0qOC^WZqkyufN?(;LD`$_%% zOjZ`}=G2i=Y)ZdeGM86~hGDD2NM#`f$iCg+Cn1p*x2yOXoWs~P<0mTOm5 z0HoClfF4>RGo_dl2g=#wEFcsKVH%QY-y9i^RBqjNvoPsrAsVKFp4BrxwOhEVs?6rp zh#Rk4WnD=X*2E-CT{7nN@M3U~>Fz%S^A8F~b~aKv%v)!$slB+<_MGkQ51`SQ6+v zSRfxOlx+FP39e<9|= zZn02a-6#yxVDbF`$(D5dKfMU;7gKe4E5l;Z7aRRXg$?2_@6`_q(A7w?00000NkvXX Hu0mjf++s%! diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_destructive.png deleted file mode 100644 index 1f9cc2667ee83ade02fe2795f20c4fabe391f163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmV;}0w?{6P)9Q(J^BqFiL)CbCVNXc4v27G;G{ z5J5Z9F)PflD56M%3N7tH8JVIb<*4Z7B#!fRzOP02LRxv2_j1oU_j0b#TC)~}{jX8m z*n~u&l*TXwj(v&TOezCFDTQGe0Eh(#%ZnGATCkQCGw<`^_4{$o%wQWFMhb&7Rh27* zRuBMOZoUJ13yBITq?GJ<)1rgEAP+htDcr{WT;a|McRnYE@6Bw$dt!Q#MdV} zq!m}}w-;v&fWyD%INxCBfOSf5&dR5H;JLPjTS!Ta!!y*w%(RQ_v<%7%OL4rg>*XsO z0NQK@An2VXYEv%Tw-ynXoP|H&C!h>mvopl4w{Wegh4E1r?s-4OJXpHHeT#`YDS5W5 zLIhiCb#C5%V$2e!$6#!1gx8vl2Od5?_LEIhUZ=HI==QGJ%wOSLpzs9pIB z3oa}s6PbrjijWF1*ZqnpQ!K8ZzYva5CXS{qiY-K6to0iW)`-8EQx98|$}vR%0000< KMNUMnLSTY@&O?|0 diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_steadfast.png deleted file mode 100644 index 47803fec48a42a1e7bec9fd30a370282c6dd253b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 722 zcmV;@0xkWCP)VPFzS6t%Jtf~Y^hMYOVUkw!$D zBDyR>EhCbkiwP12hDeqbWtc%?>ZF$AIO8}s=X>84FtIheuC%nAUclxUg;fJi7o*@s{y8IqG=lSO|2xCm*JoB z@x$*!cK%fPWrdU;E5+GqQ6agoSZJE&5TRy+sZJ;aN!a zk<{T)2^EPN4dA$Up8C5jq_Iuysw|+WFQ`(}?PR%}d>HXF;|<^{Eg<{kA;wyJRbt#l zfU;Nsi2jaHlx1W8;hp3aIf;a0D9vPU(#z(Jo9McFjZxnO!FZH%o-6?#TMaC_PVk6R z+^Fj$Fc%?NOGfH(hKEL(e%3?Bg$BmT?ZP;{M<}Hbn)t^SEbGAMq3`KOhQ}w#$h5Lv zx#%5wOW0j4?CE)I$SYB^U;|paeEXI~=B{&tKyX`sGYfm9-D+Lpi zWS5i>d*9D)Yxc@DCJYqc=MV#rZsYs#3Ex0B?RV~>*VTw(XD*)E5mI7dG$V=jqt$#K z{JPqSSMEP#Zef8hx7t-O79y>wQT*y^V|&gHLJk-4cW>~VIZw_dH_aE_D{mp8!fF`g zpRE$6G@0*xO{!tXH#&y!j5B#6XR%qr`eLousIkWQ16Otp>z;pLg8%>k07*qoM6N<$ Eg2psOqyPW_ diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemCommon_vengeful.png deleted file mode 100644 index 43789d7505403cae4723fb4b94f50b414f81091e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 726 zcmV;{0xA88P)4OO5-I=y0%J); zK~y-)rITGqlVKFcf6x1FOP%wR{1}2+igaN^fzkW!*)8USKtgSEwL?pET9oh&ad5)6g#&drfL{2g6rT&gTz zXS5CgP}}kViuPhPB)YDX_u`QXEf~CX>=MZy?*@noz%UGSU8lOSh4=&en4Iz9MRI(w zSLK%EVzI_yy4|U|b9V}xzJ;|j8i20r|8PoD(9@x2bU60utxC+Y5trp;KH$R_9Y<7G zmok*(Msr(aMgurHy}*^mW)7NsDz9`mCkJ{|Qd$h@+tOK>>}Pgr7KhW$;S>Auv^A@> zCu;!8VgVp99>SWOPkvb;>5d(QgFz&cY0o@KDGA)FZD)MOkAFFYlc%eICpI${U8lFK zRJ^LHBOLHy(V_?|#m_IJyy@t}b-sZSr$floWkM;1(8MZWMbZ+D$LFR0;UMEtE60&1i{Nv|Y>pLn=-6VLS zQZPP2MnM5f10UIA%ZQk2KqNr^!Xi=M-pN4!6t4%oxEtCCS6vj2)GR!+KZsfiqM1!R zKT^);p|2Z*RCm9f`EZ!wyLVJz$-vfhPfT_{COb2iKyn((ANuf|xlCq_3-?vm`d?Vt z!e%y;bM~Atq`|`bUaaOsd}F^5p5IJVWJb(ZqAxc4jT)QOU%3$ukwIll(f|Me07*qo IM6N<$g3HTD+yDRo diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand.png deleted file mode 100644 index fbb41c8dda5bf2fea1129c27412eae5664e7207a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 zcmVE@eFxA$}*Zb)|31Lx*B{QjKtKj$bB;eVd( zUx~9fZ=q3S>*{4nO%h*hs?No&09clVVHf}yvw&q;Ik@B29m;&IDDMVoT(yjy_4TC2 zYUHB7dj>LcSYBXOq$BuF)V5~EV^JwDu;FtRF&&Ok9vR~CL_&PmuFmOMi3r(j7OgcM z!FRHKNi|PHBQ$!JGVOGd%uJK&A7tT*T2j#%Y172t-NUo<7nIg|rUI=s0CBRca~HG6 zQ^S|&4@875b{DN{>ao6l#a*_DuIrs7M}~8Z4Pf6-leK*TD%-ZJ6QAD7k!lZ4yOTQQ zU?BE`LYs|mp%8cP1=zLTtK7DNoRJ2AI2-^Jxe5VDX0oJ9ikZ@o(u&WcAyTG^T`3Z! zZYDBmw$ht7G2pi2(3;4%5zNsDnM?-f_bAHzMb=eFZPgOQ?qK|Tn9;~EB7!p1-&5%S zJS592s`xn`r$}G|A@0z8D6rvi7X$F-;Zy1V9b>nDGVg(9S!ktbh^N%cLFjG=I!T6V9Qt4@Wo;;vzWtHmcxlK#^8P(+7q#pJ5 z(6V}?@^_q@D_|G~`y1A)?)$xD7MAil_>s1)JCw&>LQ`|InhL%me5i(+n-7&`S^3o$ nk-wtp*GK^}7iWx$pz(N#@kXp0}3US$@2n-4$ zkg$bhY9B^qODhtAtGHjw`8oPC4v1SBegKqG7={6Wu?Q%o5^#O%eY^obo}ELwEN?57#Q_Yv zSzm2?umBkeY)N2Iq@lZBi~T;-#2vk9RT@R^0O83f8@{jSZS=N2+89{Yv(Q@OI1W-u z8oKLsd9IHqU*6!~T#PamVJFP+$1qvBX^ceBKnA|bH27|((?^oi3Iq(t2G_6}j%Zk~5_ zQsJ-STHSR_%VJO2egJydu4U#-Y?rI6=4Bj&oh7^%*})ACg)rIuD- nYyDUF>UQXV<^L68rRV$y`h_$!66~1500000NkvXXu0mjfwO?4j diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemGrand_destructive.png deleted file mode 100644 index aad55d4bb39e99d1fb3f3542195c68281f5e7e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 761 zcmVE)j=_M6m6j{(?)1p>l3u&WBg+UaQ zVL_Q%LRd0IL=S?ZS`-Fiq=x8N`Ak12ozWSmnR{9cP6@T@z#lI6p8GrZ{JBSo2>%m~ ze;riRH(;VDncpUni7*!ncdOdWLIAYZ7={r`6cI#(XfzsMpQ*pYm4N{U9-R{1(ImR( znT*^klIn)0c+RYhKdWl3@p{TdZ7g8N`^%D$v!mVv(-)0 z#Oo;+_lgbleSV2MHxFegWZFl!*GJBB7q&e?AQ0xd$3xY%*UB`_*b7Y4jL||ixC?Nv z*@gYB8$?6)CUWwN_%ay9u^gI_kqHKdy@&|PP`?4Q zk^lI#WG&9dH|9gEWQYV%Q9o9wgY<<+PPuacAvUR0m z+?R}!9QObK0)I(F zK~y-)rISlYRACgyf8V_`*U@Q8%Q7v>2C}FOdP-4YsL+F26hawM5N%2#$ZA<2xlr0< zWD)e3#9cydYSp5GD25Q9f#?|dN=LJCUO9KZ(?WcqtvYZP=YKe_|2apA2>&CFe>rYH z_hF()3*?KQu<0rvQx9{B0nl1w7zO}ps)N~Jm9K#%#f2oFgd}(OY8Gc&wBG$r^pIcO zID2|dA!D|owWg-3S=7OOM4tu4mE)qQ#7!hQLM-bC_{OBVq;Ag4N<>H|lbEJSO;xk( zIqBuo%Wm@bd$Ge7(O)*h6P>K^cnL*=#OxS>$MsZys8ptDPIh3L=47@}*p}y}=v*G% ztwV?iyN|gjIlh^wdyvIxnKa$6qbJlm9peBvITB&(>qZt;6sZRnTVzLhE-5Z28w(t? zw~vy#$jL}&7aa}tWS4JOc@Eb!X9j>+769(lGyuj&6Qss6NF)@|QRr;%LywK4oQhw| zJcR8(6!L0@#72)3%QP7r=tV{Pux*=&XBb;eAkh@oZ(4geUgrNkfSeRGaP8GF_pqT5>k#=9g;Bj@@Gv5 ze;|o=^`jEmWW~0Tf8JnAIL@2uTA{L3O(&Q-prQLsvbOXBdg(avZ*7noq3yMw&8Lca zRCApa%cAh$VE|e>zRkbHYXvuDb=e7YydUWa^Zwmi;+HoltF}!tpI%b7|1&@DeUVjX zwkqG9+jBWE41??|+f{EvBg$UNz}Hs16$jKhX9k`tyVOLppZ>D7*e#7pYmL@=GEhY3 k>D8STvJk$Is{eiGzp150p?kJ|2mk;807*qoM6N<$fJr-l_Ux&OXz?gox`B0h)zU_WJ(Z4P-I<%;Ej;5DArYE zWfvWE%b-9(>7tvuD1r_`rj}t@l5X0;!|JYw-G9I7V%b%}t{Qk@m~ZBt`Cev}i10t= z_}4>Ots4`?fu1h0$KX~`j=H&MCjeS&48sT~iU=Y?C=`nN<+XKO^LXfRxn#VhUV`7B zO6Rcxx#WHj&56L6-c@T&Yel7~?Ky0%aZ5tx0%Edu;q%8KYVY4>e$i>Q#1R`6(f|<40w6wa4gkU7Q4+^OC>?~6F?!y0 zF)|oHIUNioC*rdw*+wHkn4lriiDjDf_x0lOk6;IF2ICBD9l#2~lI#qe65^-Vho}D= zB7!p16hXw+UM!ciW$6s{3}MWVMJD~2y ziMxAU+0Cz+xOz_#3iFh^ylkchhGCFebV1eEJ!F9$q`jq?)Z#O0sWS=V{Bad%ZRSTo xIsP#Xhl)xQw6N*85BxeF?> z&?&VRK}HW;w1^0$T@NCVv>bIbb;h|q?u>JPzZNk*uvVVkIS0Pyd%ov;gi?yFgyVmW zmacAe1X3zAO)y@c$=$s^0Hl;?ng)PKFj!x_-rd6vUk!1~A{q#)7#8~Iq|k-NrRJs$ zgS7RDl#;gY9z^X?>{tvr7gFV=1^B#P0>#D3R+5|k-pv5EZKG)#tzA7N73Zt@xeziK zRJ)U1RHyAE8k{9CKI>d$o_a8mLFkI9%occ@I>EPw*CbHYEZg%3W z$4_`M_(4@yR$y3B`d;;uRa+?vb4qyI*{Kd4^NI0`m&v)&Lie?njlYm!(RjE@^bYi^ zmBj_>Pc(|5fNR);05FSh!P8e5D%tv(D0(JGd;00000NkvXXu0mjf D52Zsh diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_corrosive.png deleted file mode 100644 index 9213631a7f84ccf539c262da0378115878150234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 725 zcmV;`0xJE9P)fB$>OOM`C`Ei*^SaZ)2&hzk)J%P@){un41|LN_gm#Q4Bkd3NU<_|A8}^Bp0jWHVv< zU!%F(fr`K|B#I)KJ-D5F*);$dhJm6e0Ejq)wZ&FPFR3+lV&O2-`AUjdgy3YpP=&(f zGxh5RDQgqMFlcl1BC0FVBN5D=*Rr;xgcIdexQjkWT^h9aJlhDM>pF^}(9+#YhHXK5 zm)w{a`ej~nI=fTsc-?-|U1^LizFZMZ*Y#BmR8<8ar+85wEiPy9+pw%IE=H=75#JEg zvu?_4R*H65xbJu<0TEwC0jT@6OiNb}KHW=J(mv|;+8LjpB1_Aq&|FGJVj>w^Q|ah@ zOkmElvhE6i)HDDROD>5U@2}&Jcqq%>!*~BU?%*8GB_G$?I-sIKl%BdO0F#6PZ}nQ_niiN<2YLQ%ZJ zk0pB>UYCd9=&(%Bw31{kWi0%YBR!#25e>sY6#~!4R++zZ7olJnEoBRe5G;!T4QEf| zUj9w@-8-@%bWW6K=B;;P+(6+#1aq1Rm&b=II>OAC09{WWplKSFwFmxEPB8K2SUtII zO>f`{@hbe(IF=vMSWDM&HnL(yC920*j5$kD8=y|9LUncm>O?W*j%0*Z)GCMQ!;7 zG4QTk#+IX09KI+*u?X(zA6O4Hin-%CE5qW}7n}V?g-ymE8Ql$yuswIm00000NkvXX Hu0mjf)m=Yq diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_destructive.png deleted file mode 100644 index 2ade6647c2de0037e065f4470e7fc665eecb151b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmV<00ww*4P)qg({lrWTbI6j_ZkYU0PJGtT&&_x>$pCdFELclTbn_ndpq6;eu; z6PEuqYMY&?2uxF=C<4#!WNxJt17MmailP7@!Uz@?FFD(YFD@Vy3{vpES%!Q%&t$ex zg~HjRRf`rW3lq~csdu&^3U^}YIwgIra`XCZw&xa67TqHaY0}WrzI1?L7$}NDU2_}z zR`$!u@d=9FwMwgXH5SJneoxKf_S(=scSH_m7{+1>0DYYoq$4w*Z(m=L<;X@=CC1Do zpFDmNV=VXrI=8#KNGhlnVJZs1fiXXIO)Z!~FWQDYw&d($(CvbR4AkUYtkJR95@NXS zY-iBzjnIv#ATzwYsVc)mZUFQ-A5kkL0Yk;*>Zj|)W8T;@#oW)2c!qx#=A1Y{8etBmJ zg+ffvNHlYtq~sJvM!dxL_R0jCgBZtFz63`pZ3+CPV45bX5ae{%NqcGD@fDbn`qG*C8dS)kfSU- z-Csp|ea%uQUcL8#f#;2K$F_U|MDwJp1Alp?$gpq3eWgamRU8+d>T}pH*W$cbyZ9Hv zDAI~giJton(mykY{qSiK2;ea4FCWD diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemGreater_steadfast.png deleted file mode 100644 index 1415d67fe644f3fe5604010ffd5ab8ff1c3813f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmV;^0xbQBP)^hBGxrX_M&~W@=dyh)yM@XcR;cqzj3lMQN)jf@Vjx(cW~_2nIBFI#G>NJJvU`+ZWz5+rh_g-$5k zINz|Qkh1!qX&P}5EOYSOm;5kQRaXRbIvoI(V7@FrT}0-)h%BxsB+F{$)oVXf zV?MUq3)p(D7I)W2+3xB~<|qJX=R>q~xlrd-N^EAT>klw7K1+693dMF4Y1`6BH>ES& z(aDbmPqN*lfHWEbFkRax9$tS>AQ0tX*$%#sF5>$cWXUtn+uQeWH`+zEqfP`9QL1>k zBJjd&z^K#V^SS{D24axVBMouJzquLj9^jLGQN$-lnej~^r9>#=A5$=Hf+a8Ugi2h5 z33?zaCllYo9QuB@OwY*2lwZQv$S+R0!Yd$YnubmY%&j9*>!R9BV7>(4_ocL?mpl9$*137KY z>q)%d^Nh*I!*X|JDHtQXc{+sFbV%&66)<+QM_Mmeh?z^bu-$dwY;~;Ng=H7HjYq`D zgCQA=hbX*yQiKyR{8Q6pUO6T_b-R+qmeCg*-A08C#vd633)*J4@T&j-002ovPDHLk FV1gfB$>O3zm;08=6Wj(#ninWHE%Iq7h+>C?OPFB$ycyJ?ODZDN`&Y zkV=pcXJ{%iGs;%A)D{tiE?h~EnNgXvahj(ybML=Jj1R1pXLrtl?|kPw-w{$uRuiWG zHJbZus0a*0q9_9QAq(A`DgiJI14U5)5D5lLi??kK(ksh|MEfp$dho zbv4TdDN7T>Fle(m5aq?_(I_Qv2j$+QyRg<iP*oLxs*p$SsV;*4_p;zfKB|-iKE1*1 znq_xsHrYiR>Fw%~9Uu~`C;%sBgS7P8iT@0dY~DvcBe z$HC-WaADmA0I6vJj9xq^hA-bF7V@(BU;)92al$?~Gp+!)E#=A6L+lnexvOkH(qT z=fM-el54>;_nY+o5t(7mBPFkp@yHBS_VA*JhGC!zL4Iqyv~1r-I20z;l#CPt;SEvW zbQ1q;jQjVxWwfzI958QP?!<(F0?`QTG!tI8pNR7dpPfPM-F7rBiNh7ee<>%K7&=x% zcH51WPQ3g08P1*uvZ$n-h-TvL(|&@D$38EkYJJ3 za8|tQ?3BS+oSX|yA{>w6{oy3#e4UuA-m)+(VSTaMZ&X-i`~gu!4LhIFwJQJs002ov JPDHLkV1f#eM92UD diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser.png deleted file mode 100644 index 060fca6704386ba0e713641bd68222f67fdec5f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0xBB+cgMQdS;idF_e8)@$%YL%NZsy`qq zl4jBf!fqHXLPCQwGJ?E2W~GB)HWwvF=lZ@aV!U9jJiBua=bY!9=Q%U&=0q6K6y3n|AwrSlU zZLK4vq|M!ls5?Y57Q;L0VbB-cF;H?ELOCed}B%k2-ysXxqIFoYjT zRd8NaR+VE8O7%6K5Ox{I(9>93qXFo;{A9yALW< zS+;^ARbv4-9SF1gc^BD@4K&6RWRHxhT@__0UFT_UFO@q=D9(4`x#w1n1N((xNng2{ z2B2&<05a_v6c{-K;t@=LfaPcmyOBkX)5)E?w+Wdugq#M8i72%^TSd@iSZULB%-IGG~cyH-v7>!)H$6u;d~%@edYkb^@~|pC`T87Q>{uT#OF% z6FzoOl$|(-Bd?UK(rQK`evW&VR~twv(S^X?_nv5YiQM!wCWeN%biSE-cZW!ehGEvE zu%?FCrvdgEh3j>Y5)eY*9U8_vK2CdwhdpgK#M@UdsNPzPZ~hzUv1K%?h3=D0d>I+t zsKlEckN6#r)6@M#mA15qnBicq=P@NkfB*lTnP${GGB}to8U!C0q>HF96^tyXhytOgh}uN^h-hhxG9n0C zL@g>DOAAD>Qd(353KeJ+hA))NW|+y>IM#KX$G!g+F+QkPe!FuH=Q|&K-w{eFHUiuK z22Cw~Gz6BVkWvubm(SgT1^_I}LP`mMNGn*|yykBsyP=-c@-ne_oY`oUoUsWsA-Qz= z#JWRrZDCm!&HgsTo?6UA0-N1Ve(<##o%q6Bp%+tG+-Pn8o4_an7LfStnTs_9Bug3MO8tnr#&*2}2{3WVxLfMw~kjI;h;$D0G{X zi>HnwrTn8nIUE3Fx-uxxvza!2GBxvqrNk1t+lklf=GN^;EQTUPa&&&B;?&c%YGbEv zr&-eohXNR*UFz_T?JOjtgah-m_q=5$G=s6FL~p-xD+96uR9E^anV9<_dNG z9o4oZCGEal{p>i%oA6(4TK@}a z6}sI{&B61+92&>4mdUhxh)jJ)1OtRm`c{smqc1l4jgk%GH}rxFM5xEIPyhe`07*qo IM6N<$f-f9CdH?_b diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser_destructive.png deleted file mode 100644 index 02b5f0a530c008af3a326ecd71f9e1f3a333f7a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmV;|0x127P)rc3Z)dgf#rXL zidq*M0@GATDR7@T$itK(08G1rUpsF1MV&w3!hyw69{w=py!xpld0 z+adXPVVWjYt_H-Z0*qh~i`B}B{AViEkk-o7h%5PSZ z*VHDW0;}MeAuT_j;O9P$>uK9D#9-qirQfL*LEXV@XA>FDY}S$v5bo{4ef2iZ>Iz)7lbz60%A!- zK~y-)rISlYlyMZrfB*kCFLS1G@>Oby;G?2+Bg%w?ku9P{MT@WqL}<~jMMO(mlpzJR z2!e3oh(=I?g%S}hGDyQBdTHgOY^HBe$7$42=kb027BZSxE6?uU%RTqNIaes9*a$5D z8#J}~&=8oWLP|m4&^GSm)d66dCQ?cOL`uQm&8xmn+;z1imzG$J#h8vn$ox8rCL|Zn z)UP=t|1M0^q}kVrI8cKTk7Kb~arOt)m(h=e^0P3MNlW{^^#q1tAf@DTTPOC~8X_}c zeni5^z6rI{Th9J(d1^9|WWh|VEEVlT~U$R5lSgegrbx`>cV;WAR>{(@nTHvuHFMmGB)xRd%Bx=be>nYTgg39EnF4{ z7fzoI7=!RTAJoa`{F8rX_{z4kk;3aibZj4ck^rTH8;;SP}%Df z_E;43AO&78@wacNauuw#F%=+$U})qsp||hozU!l?wOPD;@|cR;A_Bj^Gu6xAL@{7jc(|$>$F!E-Ygqb1TWg0Rm?)QFyHh-<77dzmQVl zvRc{OcvKjlM~IqBq+30NCw?LVeuAe8SB|BkFE;v(k`3YyeN_rt>N_1%00000NkvXX Hu0mjfYf4C_ diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemLesser_vengeful.png deleted file mode 100644 index 703888adb39f71a9630f3609a88b42687cf2024d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmV;^0xbQBP)Kh!f=)u^1Msm7~LN)%es`0y!BN%A~2iYb$|a7)U9(-P(!0qMW70ATvur z4u9~dL*<2BpPW^5@dPVod~MM%jCBG{(^k96q_@A1MGekR3@BHw&W=6DS+=K=-|P$hIr3O8yl zA*EbZplmh((j2K|>rR$u!Ys`CiLI>Q)a|(4P98Kq$G5ml(5>?)5v2mpx{cksl}1g& z@0%s-WsfSYIY?}N8LvNpr*#0|+&nX-dxfw$kpAzuEExzX{^5enfiDo?bKfKpt0YrT zV`%gn;n{1rb`_9bP{L?rfivylbpq2g(S*R!|B+BMj4LmV!9gE2SMO2M+av7J z5cvG$mX#43{zR#syV=HMfDnR_sY!+g7kJX#MNUhzc>kt{lFWR(zotovg^^YZug_KU zWpr$767P3B<99sHNXuiTH#LZu?qcrU3-;yhXT`mn#Lyt#x?AMkt*7ly{pMdts?e=g zifZeGF)~TWjF4t^5&ZEJ;hn{QIdAP)GWue>-zeE8{sNhe2}Wd8NSpuw002ovPDHLk FV1gnGNRj{m diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty.png deleted file mode 100644 index 06c8e124e30be16ae6dd8504dcb7f4ae0c8c0286..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmV;z0zLhSP)WcQgL?x{b`t2ij-n{^^$$|o(T*02^IePc zOVfD$;wfELrwr%vB#m6LQP=fN0##N2W~IT~sc~W|gw~=2;xT&ao8*y02WUxVWxT~* zR8iNXO6CRe#s0b80;y9TgUi?Q^j_^O^P4FiAaIT(?Ld&1L{B zW#!abZIIlc`pcX=+~TIDu9lI>N%WjfAQmI;u(FZQ(80@1f?=x(v#JtW3GiTi44WP& zo=LH~7A2L*Ff{TCpNxu}f0khA8&XPyBK~m&a~aL{avb(b{EI#kn#R}ZX?$}txVw6= zS2a=5)XIE1!kK~8rjZQ8Kox?rsSk)oC%*TiR4hbrS}hC@Kd0vUCBaIF`nEPA6Yn@) z)v*1H1p^@jd7(n71>5$NMQwR%6n-+uOFQz)hq-kj@Zc79=}6YoDBVm+55 z+}uD0LDp&~Jn@W1S2Ib6ll-TT1h3x2b+;Gqt={dwP*7ntnUD*9bVDa$q_LRn#DDxm o1OtRFx{AXJ))%||MulDC4{g#5@}Ki3W&i*H07*qoM6N<$f&fWA(*OVf diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulGemPetty_corrosive.png deleted file mode 100644 index e792af92ec22a9b107edebbaf5ec1f7dfd1e577f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710 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 diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe_corrosive.png deleted file mode 100644 index a70bbe96680b77e5220e5da927478c438dba7ff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmV;d15^BoP)Ofj~4tBF02x42DJafnD6#HN`Di0)u2KUYe$5ZP)eY`~Lk<+w<|{JSWe2 zp7V%Oib5%+5E1sPcZhIn^WO?_qNHiKHo6XYaJgofJ8yKpZD$*|d<~~YP3Cpnrp3VnI z=ox+(d&o}f zu}!o+-OA#>fbkDn;e=Or?P2B>5diynucSM}?1&wb=(k(tSmOX5kB9emeu7;u<(b`0 z-26;qWA2>N91aIgrxVLEIeze9UV7cY@qIup|9FuvKR=+h_4V7 zE^VlXtc!8uWm&5$v=ZToqYgUclo*<(QR#6jZ@@=W>sBTwC)l#7O(v$NQMoMsm)=1{ zxU`|3Q@1+QcYEXPJhFxk>CFeE%2Q8eO{KaR{z5%e=Ta}e_7*kXCUjj#L|9*4i`(rc z5{VFrL^z+@rOM08F-BK17;4*Rz^AzW1Z7U@akA`xS)~CaV5 O0000Xf9H7~t{@I{=v`a146X?Q(N*x?OHtfL)-)|?t8lBeT5hdC=7&}b z4b7Qu8KJqF`Nig9we_L3u?Aa8czFxBy*QQuTMKNl%k6r(@^T-1p3?_}^YLuw?0?Sx z{}WYZrBoFWLH{_o+H}Sh(rFbLew29@{<%R}*}a(AcVk(Z*r~ty z;_Ep+zi^4cBWUxvNx9Yd99ANcz_x9?i4!`ZehMXuGqWtay~9PBB6%~#{yq8B*KVMH zWE;WbKk)OLPig~*;kquSX)?Y3T`80(jhoxV^a<^Ko2U=Pcwy5G4s4m_i5FXmSy_D4 zSiv*9!rZQqZIpNiYL+m~&0&r?DAoZabBX@lut;vTa)Y652o1cAkA7ZWXaPUBg zkNXW;J1?q{mzRgv>&0~)P9HnA{0q~f?OIqmzx$qVT3a+2+Cg;WSB6{maJGF6#bkOW z2_{%84j6_>Dw$%exf#x%0U#3cX($w;r@M#B@IHYhots}E6^oIR?OApYz;#{DU;K(A zCk}J;(A)6oX`+vpYUPdqmoIlyUbRcQx;g<6!zA%vjJf$VICmC^2qJ(z2OfjSrO$M0 zaS8o>{cNv(TCQ|oVf=Vl-|t`GXfTUEC+AsAF9Kk#WFUX7Fg33{TV1Tdsz>O(`V;p* zR3nkdRrdbYLsQ0te8QIs5cws6C&R*;yraM{45p{2se80o1Hnq7BLkF&o|56=Av~Gc zbQD#9T|iUa%VH*!3{yB2&O=^1E0$px_{$45Toa(Cri#IVL5jB5%D~VNx@7a%OK%|} zbQD!E@!oEI=h`eMOLLIAGs}Q%^;b|*T&OeS7qq|wy`_Zh}JKc1(iWJ4(cmpNVM<`i%jkdP^ES3Mofxubn z!_Tsj6|l^p6;F7j@fcsG-V=bEJ37Q0Z=kFtEt$|S@?E4Fzu(X2?>C^Y(Rs4=ZRWMJ zR5kjPR#sMq!{NX*4bGfAS+HKWFkX9Ex-WO}^JibE>YY1@jSTbhp%@dl&STh2;;C75 zz*0;=({$3QG`CNjfD7#a^lhzDyLMG`?b>yMhxQ2ymC0tvPG?zf+fYakz%)%R{BVg+ zPJK+vvEy+546#6s3WkDQ?d`$0e~&~W-35Uzq~iC;EN3u^3q%AFAeRA~M&GwTs!C5K z0|Nu>c;;#8>FuF;Z%oZ)KgGVTh5Y?nEH7mN5dK&H+*cgl9#FwhkpAEL*t|O+Lqkyx z4)>z0cW^aTDS)Ya#}Pw#_@TA}fu?E9&d&1O_Mi#{gTw}J;@h`dhK8cp)|PO^9e|vZ z$@XDcQ94$!@<>@LAABWZ(KHQzg-?Y;b=1}D;l_e!N3DuzMIwHd6En9K9TqF_+5{U%o z8uO~Wyd1+Y3eQ)u#lyzDO{KC6ls;I>JUO{LKDO%18?6_~<#L>U{RKn>(=-W(!;FoM z70h>e{b1zLY-?Fcr`Y6h5c|D{W4#{u{km26v=1~4vk00000NkvXX Hu0mjf{`tH~ diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/SoulPickaxe_vengeful.png deleted file mode 100644 index 6be3b218064e5daa191e898de1e5c123d6f42340..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 939 zcmV;c162HpP)VuHpGK&KLn zjYvhM+JI>jOGOQo7+tuKm5{K2#1?7`g|>rK>w7(=hF2>foyt(J* z+;i>`tu;%fwMInH@4WSYGqVPYA^@~?_KKE&Ko%gk8VaV7TrLNIQVOj#wC~g7UN1%W z6qC#($)L!lQ_R~7?2JYsvxZ|Wm2z|YW&{`JG7zABpPu&BA(<2fzx;~Vvf%!;u(B9# zPjf1j<%=_?7-z3OF!Qyf+MdIV$K%+xjk~)`Py6by!V~||&T#tA8FVDVTqeV7rK@$9ZgEcjL zT9}}3&l#=C%F1xN-8fE;p2LUpS{Nq1{-B)y;Vj>GeW(M0jfAiN%=M>2d=iP`D3j>l z31AU($pNJdl8GcYJ38RRF#v{ZE#1`I#L%T78n^5e7SZYXc`~yR?k#ZT-2-qOhZEm? z$DywG`DlMTeBMLYzd<(!{0t0Ur1ps|a^b>x0K_ne&&`saUjWSf0uez3u+!jD44?c` zS5{YZ%5e{Ed%IFE<>AtepkGT>63XBH>O(^Gt(R2Oi$U$j~L$ zHMPj_@K0>NF+^y^E$Mp$4KR>M<1$PzJ$VL7DWcIR&o+9s-``01+9qLKZ(W5BHu-7U)Xde+n9;*G#7>0p}@ZkClSe8XB z79$pm;q2|v<>lq%a=Co?D%MxC%CU7KJx^"dur{+OCv4&&~lC$VjtBd@n2A~=pi zFc@TVaxyQz^^gy8cTuiFvdILi-EP8{N0x_|H1c>nh{!Utsi`Rd{skojQo!o=D24z4 N002ovPDHLkV1mw$!A1Z8 diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulShovel.png b/src/main/resources/assets/bloodmagic/textures/items/SoulShovel.png deleted file mode 100644 index e3fd8d62c5a57bfa5984ca51761fe2ecca858a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 936 zcmV;Z16TZsP)Pl{H8{N%PXueFAJ$%!k$Hc$A<5Yg^-wjHPxtuC4E0$EpZCoqiNmd+}+B!N@JdmK3>Nt0}?s^(#Lss3bcS(iLosh=#bqug7MVHk)ArJn7$-ERDTKYqWT z54zSVDk{P>O|;h7?!}{IWan~XM?DWX9L(Jf@#od+8!l{lshdP1fn`~U2%X0Q^bF)6 zk|Yp!MHRU*As7qc%y$yWfNMWpK}4`DYs0B7mkSZuAe)|^2H;=)24MW2>rhw#0000< KMNUMnLSTX{MW}uN diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulShovel_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulShovel_corrosive.png deleted file mode 100644 index f5b51e2639056d9eb6aff1a11adc68d98cd5b04e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmV;i15W&jP)mStI9c;Bao?b39Plg!L- zX8wQCT9XW|H6p^5ga74{akI5i17t5~Qk6}>Y7^2PB9>(Vpp-&u&DBPDT-`^;Gb?dj zC}ns}J2Qv-b>8{4L?UsrbJIb=+|EZlmQO{r*8iJ4x#t0Mp&8cR+RVM8A5rh!&_<`1 zx;OSR78@ZNkI_B)2T$)zQCJ_v5e|njO_QOMZYK9Uz|~QL3mEdW6M4U1XMX=YO>ggG zB-TSv&+zl*KJs_DneT}u$ZgxkFbv9$OyKG$0pR||OGKLcb>??#XxdlH?eKNR;~_3y z>LLG?XE8%ID>HJ)GX#~~y|$qVfT8EwnX2p3>pFexe{%_Myq& z2TqA2`2nR2a_hz^JG&QvK=W=nH~6Bitn|~>b%isX$LJ1>B6m|Ls-I=7p;cChMgiEi z%~#*H({l1CIs5VqiLhuY-P>=7(TG!PL) z0CNsf71u6&qc^=!!SKj1IdhqkX9%HNQPwxiGuCigv^vj1d>#NtQi+}w!jqV0+ty<3 zf5}g8UoUB4heWd!mzPe+u0t(4aIjTS@K?B-R7V=qI1&U(DJCW+sHra1m6cog?M`2! zI75+|o=Im(1-~pFmxrGXvZM`CB!ztECp5PSqLjj0R;bOm$;;cfGBh+u)>MW}XDJpU z)4W#Olu+rHA5p*icP1l;ab%g25ocV35-di+DU9EXzV`jbmwHp7h)d4pg4N>0ZUSImcN4-DMZnywiwjn%K6D zi160YFlVpjAd(;uUs*Z1aUl|)#l6~1EFA`Vdk_(9+g^66*Xu<@mdQp(M*;W;r=nrw TwnG|l00000NkvXXu0mjfdGWSR diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulShovel_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulShovel_destructive.png deleted file mode 100644 index 42c62019ed8dc8e9f0aa4bc512adcf205b4fd244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 938 zcmV;b16BNqP)- zJff6hSxPBHg!8Zd8(Y?{7wZ*3#G}xnCJozLgq7EjSS$vBrfDdpxKIz1J1>*6b`92! zLWVNic=(QX!e11%J_*3_t5tI9%6-b|bkcdDlXLBjjE{^nJYk_WKgh9j&9X`q8h~k< zeD-A`^b^jD+?mR-EKT;6~*vbMkZlr9|?I-Ex9w@7w&HnCU?r4&gwBMW4tC9|#aZEV(brUD@*`i2v}R6bWvG#bS;O+^5lN7Zj*bHG51}+=l*g+YsQ>@~ M07*qoM6N<$f^}K9egFUf diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulShovel_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/SoulShovel_steadfast.png deleted file mode 100644 index da2e7f16b9fb001143be5615c8dc8b7eb0639030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmV;S177@zP)n_xb<;11?EK zK~y-)Rg+&#TLl!xf9Kx90H;N|c8eBu31y$EuG`#5(p6hs)i@gyR|4K7`sR!T2Mi!kp zq%fb9m>8?Ozu49RK=_Uj_l-WOllS+qb8jY}~Me_`)1h?z7z}dqbQiKYjcq2t{sA-dIv!TUwd#Ojm=wPB z2Z0mK08BZyy#H;3*4Ni@?%Y=#eETdnhJS{fD-+9KXDz8EB_)W+8rk^xH~@bGXh&aDnY%4W00000NkvXXu0mjf DtP!nm diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulShovel_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/SoulShovel_vengeful.png deleted file mode 100644 index 11c5263abca95089c85cbdfdff771409c55ced87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmV;d15^BoP)wn zyc1oF6S*M9EJkC}CB|%K8zZskFm7%u$_6N)!LXT4+(;=DTV4u%|6Wuup3CRroag+` zc|$G*fBchc0-{k3?<0NP1C_Y!mFJ)g68W~ilD+<}M zdk<=00K-TzJ~6>LBSp)M3q2l>lTN1@>hLnXa~#jf03Kk-7v{jVs5(~UVQ=%(sI%X| z>@25-F7u?rNyIb(7n*6BSS%K*+Hc}H8315x(`gReimLG1b?kZmMHYK|$lSWgiNOIL z&&egGDV%vO(AT4_?EYNqegKB<2-EgkpXx0xVednYuxN1qdxwckPSRv|5KGPTSH>i1 zEM(ca-EO>IFQ%D=Dd=<-HOgbdlW_bCY9856Fc_r0rw60N&zx?h-)86F!rgqzKG9b$ zplKEgUig!$qq_mMJ$QD)KP)}c^kN(#W^6S_r(OefTGkJ7dn#Cy!4Zt)_KK?As zTOEhUfA$8a?mR;H`^~B(P{G;$?-+UXC8n=lR}ul<*WZ-M`F1jpZ6G3u0O=&y zGzLHaL~Y($%g@8ZSj;>@Ur(&{sau=M=7|6uY*Rt9u%PT)KFH zCBrJoT#dFPyQFJB>O*U@08GWtW7F3#i_R*8si`S;)ZV4)8|wKndXXi=Dt|jPZ1x<^ z1Zq%Y1A^@e#jRVhij~{lZxiYgbWPK!D)Xytb+t4;a35EG8iZw+qzg4vVwP=BwICv# z3Dod%)9*|t-oWE}mr$2vLsC&)LwV5#wfs@1sxB{4_ik)pV_gu7#e#@XR=J7N(o$lv z7_nH44_cS-`FvzD8I)4!%Zm%Ropve@cj7H9p)7YswpspgfWkIotKmyE?@Wo5y3Rg)uj6Uene!|+34sf0RI5LGEVqz2@-Mu O0000Y diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSnare.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSnare.png deleted file mode 100644 index 37de2c13ae0853e26032a858163c04539e323c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmVLRA0&0e?wE zK~y-)ol-qWLSYm=Ul{%DP8F0S6-1HnK%t?j93p559EB(Zp(Q91$_k`GjDE%-aS#N9 zf{JGik|60&RJ1jQi-eSgyM2upIZGo=%_>@L0OhH zXSx<-G8q6sIGLtD9AVY)j}my9f8qS*c3F-AI;*Lr2Xf&RHw};Fp3CK;AXyW%7r$Ws z`33o>M=Z}c;qiD->4n{HugxGDzvA5F1d7EX6h%QUmlFUWNfJw*I2;b4sW*CdOOwe& zJ>L9k>>Q`d;OW&3&TfXdw7XAT3qo@08|)3RwY`Jw<}P;kTeuWF&|FgG!Mpg1#guoQ zN4pz%Qwq4xW(5HBNmi=r2UncqqGk>{`vw>|OtP)RM5EDI^<%GOqc3v$i$(d2=6(yU zRvS{ObGUumhy}Nxswy6`StyDE*Ww!7V?*NSwG1WjLhJ;-kzw3jUkU&qK($yvePc6J os&J1E3e9_0($^bnO$q<4PffwF)2PD7lK=n!07*qoM6N<$g5TfJkpKVy diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSnare_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSnare_corrosive.png deleted file mode 100644 index a279a8f03396201a14ebebf4f9c546e70b9def2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVt6r>0f0$F zK~y-)l~Tbg!*LvaUnYeAfMS^@Ma^X#+$1^3U*IrVldQ#Iv>CZ<*^l{0VRcqFc3JOu%R*7)Rk2^V>-I+`#3X&yBf$$DvuWyJ( z1+_#`REWmMHvAT7%< pb{CTKs@$y8P-(4m=g%f8!51c#nx6r-xQ74$002ovPDHLkV1hWs)UN;l diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSnare_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSnare_destructive.png deleted file mode 100644 index ba6bff2f3f806799f2d699b8b5b65200ede47255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVz|V9d2+ZxX8TbA1zRSjxnH28g^{3h{k#wnAnAg-xxKo*GoaNDCzzr#5XO2 zm)8vXhv(t*`S3Ffx7%HOf`^MRdpxtqX0y;V4e4}R06>S+$?r`1JRV`{_wg!3Ns?$K zn}Wh^%x{p@)lr6npGM6K}dly8}JCK{|czra_TB(Y5yFKs6_BJPDk(q)ij5W42*VEPJ z!s*E=Hq{|4tsNt$6RBhhnx;XW8$fHo9bxwtW7Qa7hkjBv4=u6#S7|Q43;NWZH$b`-OEmCqs&0!=_ zRt~l#CQfP&oHmV%ebf5B$3goT-|FL6Z*Tp6J!0I=7$5SqpjcdwB5A2d}raAob3RplbBR%_0SZFQ|&oDcrmLQkQ&rjd4g zE5hLj2FCn23#>w=hD0I`MN!Z<>Vf3!5Pqg*$%19~F{URwae03w001>o%_t}=Dh5>* nlCxbf%=`QLX1}$eg#XqDPl2}3p;S#900000NkvXXu0mjfr`FVK diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSnare_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSnare_vengeful.png deleted file mode 100644 index 251d1850a36b6cee87833a61da9133a3d2fa8533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 496 zcmVIIsv?)m31vgeo_M{oV5;}|dYh6Y(TX=! zjhpzo0akqD+*zFAVRW9B2yQQ81~}pyr_@kSr_@AOo0CV8Ia89#6pA_kAnF^VvVV-v z!WS|xuL1zLyE<6X$-(Ibq2?X994)-u4YRqifp)vS;>VuOcE)4NRa+P-bURz=_PCL_ zOkiVv0?J+-C7pPCe}k&32>D0RJ3J-)PD?C<&!e;Gn_5Bg?m+;6$r70_=&;#Dl!}DM m1Y9A(~`b?P)7EfIn6jx5s)=S$-%gyK0wR*_kAUM*yeY z(?4g<3Aw!Yz4yNP-1}bUpV^eQ^cPbiXGTI0G$l2~kj{NS%6}&Ql>7V4z!1)TO>(7V zGY~ZSasD#_s@fI}LGdy&)5MyLOE5F#P~a9Sk5G6VE=~$^_{`KB2^9Op_#0G$Bzd;^bx&MI{=o0#(PWlIf7y+ zf+-P6@RI5yIZH=dtXR5XaWEbCUxGBBWnCByyWMVuTcx0A8;okTS{PBnN~N4r$eCg% zi+kiwCMFQ%ejEeAm}%0*l9W@z$HnugLN-Av{-s&WFkvSggp*}BKXgn#S3bp3Og=SE%Fy(jiKCQuGirhGd05| z7jX!JNXPVKGK*aVoK7%QA#Em-i?~~f8SCy@(mGt65s~wa*Z<9EYFKYHS&0Zu*9h>c~&jXMIYrpDzt$z7xKF$7~1j! zLj&%kLccta%3R_qa*8czhg(&Q^y}_7}pEj zx^RCDP#rvKY&dg3Z{lleFZAm*N`$+(pFZvix`NZ;uGtTE1*gMZhdq}&Nmj26W(ykz zy!ewha4ckS4+(@mPOVm{b#VA_xJMf4A?zjt$?ac;?@BZ-=o3CMrepSaj=)6FF;FVt z=iFb(z$o{yz&)qHp$CE|7+xE#eYH1PVl4APqrV#3hIb6o|M$8iKZnOArw#5OIMt1Z@$Q zAR`C{t-^@eLpw% zVxO_&^iQ~#0wv~@bRz_LpM{{c>mca6A?~{yf(j7`>dA#5tO9~&P+M|7UkpJH4Wt?t zW_mg@x2(uNTNwRCVr%~zUu@Eew`MeUw)nId{TGeq>4)EQrvJ5M^J68C9-KzcPwul` zPJZWM)#T(SdmW$r{>`!$#m{9W6RXm`Md}-towqxlv~}5IzVT`2!$Z`J3)+^St)9`m z;bMPr6ZPDtywqbSUvgi(gVw+9t^34cO(`kVOuE|?wU)VFJ!fdhVx4`;D(yblI3?=R zr)38+uD$ZO%eTyMX>c{!mZ5mF_O`4prtsDIiWNIQtbJlF1;4hST)Kb%{snPcKOfM^ z3if`KRrX(7cdxzvKX3G!`ZsHG5>SxlCifOm)3GYj$qk08+ji$=ca=GyTBtT+enN z>6+R$cy43k)Tp|yuYP%I)^*#7J6}CA)it-VwED^hWQ+JnE%^i5+xlN~M9sg%-PQ%1pZ|ZCvy(IBoZ0-41sovhtwl$^rdK>O; z^ZJ@UFx_jkrssK6`>xKJ=}>K%IQ@;dh>u@RyIOG&U23#eo>{jwC2Cbl&A_~bO5@d- zj%Usviyw$yseS(Jl9vp(&ycRmhh|=wpLw=zuc_$Qb$y>o-`)7f_IWD~)hyrfGF#w# ztn`cBHPo5*&biZTcb~JJyVrK}bbn3Fj_gY=(~1_R=hX7`i{`9fv?KlK-u%vehmLeK zH&?!pwYZ`xy54m*=EN0R*WUhi<;|}Lk67xnPo9*aDpkaST$^KEPzN;=T zkBHOWR=wA3tmq$Hb*EtaAHGH~>^D$DLqo;ie$^Lqc+bDu6DM7(xv(b}`Lb%)3tgX8 zPN-hJ2_4h5-r=_`hMedb>xQQ6;D-n;nvNi dr4ctSLc3&dtwzgEZ{=U0O-){E*taORJVE5YgVtKi{pO3tMef&BmG$;jZ9E&J^QANZCr8e)+*l&Bv$F(2fa5r*D*O6+ zwXMH}!JeH`UHS-1jBvcqYU9}$9a~m&-Q>xU2Ot%7h*)cJ9EWPP%3DX?*0%l@E*@~? z(#X#|-BRS(pF6bSbc|=8i&0p5muu!WGs6L^4iy=z42h{x*#G`Pwbo*>Xu~Z%zIO|w z6EEnp(<|A!D@AEZK(3l+dU&3Wo_p-542r5^nwpwuZf-`ykdaS6;+J=C(?0MxnG@*U zZ(O$SO!3!(&xM&^@lVbZ>-vWc<aG$S<_E=E z*!JjhE@%;85y2uHkWz>kxN`L>xw$7PHB=~^DAU|kVtZv!EXr#QEsQgR@W3ba$j>Q> zHc!v|_LXM#Z`Nc-S_gux4g^_EBogX*9-}s^s!A>EE}Wd4B$Y|&?(RM6wYTbzw@&H7 zV_8jhq%|IoYk#FzM{QPJ*Hzbb>jsnB8j~B7`pl+HoIn2)H?RC5@pTDZSXiL*y;l$s ze(3v_AP5iJ#hZ`eyfG0363bL}-0#je4G^zVGAvKCbKH zx-MZDE>cLO6Z)P1wXVq|H5!dRbW9>b_mN=^eDVc_LV@Y&X{M&8NT<^eD0uCyN}w2H z$X(7!G#aH^ts){=YwH@t<8ef!j%<8<9DsiT{0Vd7VsSBt00000NkvXXu0mjf*O8U0 diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSword_corrosive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSword_corrosive_deactivated.png deleted file mode 100644 index e0bd985f61ed278c36c652e2ec8c0aded535e033..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmV-k1EKthP)sf40_#ac zK~y-)m6K0sTy+q~Kl6LLv;}J*X%}MOTHJl3L|Zf^6$+))3SvM!cn}Lxgeq1OSQTttBb&`jtnOyJFYo=vLz|7_$$`1d zFvHAuJ|n8i|FPHg7zTsIl2b*ZC<4G3!*VkbK}4EGBElYB&o=uMYtL=am@xpJ6F}IVC8W*`8Q&l?c0a`C6b@yXA0M1T)!8&7!Ei5b$1OblYpsGAKG^ky}?J_#B zpK#48RvY2ekfrrvQhRo8?MFy#3YFKX9tyL@xR;oFI?xWB#1 z$=~+Taz3dKK9r=g<_15R8Ro|W?tY;vkH{D?V+>&!a`@GwN@5iji?+<@sY5%Zd|J8l z{080Co248rPz+1Vf6$<3;7{pX9D^8`wzf7Bi3A!&OdNlMD=*Jz_sCt6KLa;DbamJM zEWa=LT%P|P|LjeYeSgW;`a4aL&GH4rai}i-(G;}xLQ?njZsA%m$JhQe^-05y!J71j zW2h>}*QQn)SZjH2{1X{`?QO>1e2MCa)ra?PrXDr;k?Yhy6*l(OWb4gQtc5*ytmCp) z0f?>K9i$c^2Chy|Q(W9at))TbOr1nuP4+fMu_#Zrv@^v#g8Y}V(xQ^?^7O(F?`!_> z4$buBbR;M+5)??M)9QI1leU1WHoZwP8f!W o2-e!BMyXT^5ot~~H8lmm-!YwH!#phE7XSbN07*qoM6N<$f{R&`wg3PC diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSword_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSword_deactivated.png deleted file mode 100644 index 0bcaf3d9994f275fd3087d2ec6f7c8ae81780617..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15220 zcmeI3e^eCL700L6sKHu^v1&9YZWbY_>F(?gcVWk6fv`&<%_2no{^W*CNHlTwn+>EJtD{7e`J{?6{{C&AbK?&NG9 z!zMl`etv|#Sv~{9V&*UzSwfceX@X*%O47#W&`Ph<4b&KBjPtrlY6UIGa_C&f6)XRD z{b9L`vBk9wK?dTOX`bR3x4^J2nHZPMVe^Gpxm-*XyaM;-bO#f;_y9XV5%-dAT&+~$ zBRScqppQGBbNH5Kqj1_mJ874|13&eMe(pS0VEH_Dl$62gQ4@ojSgpa_Bd*u!95FR7 zSXKc90i+{(@)-qg8c(NrHlL$t%PMdy5hLBbz}N?iGbEBYGwRxDFEfgpIOBKowSvDw zMsTl0B1e+~%Vn^v!{qO>v;l;(|L$sW&STsGFj|J;a&x(wEPFdA(p1=vs$xx{Xt&W(dgJVF-&=_F<*hqo=PElYj z6vsvpc9wIJf{AgGxis!}}s86Na!0o1pkdwplwLVD%U(SZpE<2#ew zB*)X@j*FEKY`Nee7CfUwAK%U;NJ>1-Oq94GXqyoqGCH`dpl861`F{)Oj}N(zp2L$z zyY982{GoiR(Sz`;UGR_`osbK9;=Am1f7GFFq2Z0Vc=|h-p@r~|4z15X#}2QjQ9RTL z&X~ zFBSB2?yIDK6g(_|=M+5npfa?`!Hw_(8-sWB0|$n~p(HR3NgLskL<9>EE|`X-jc`dK zf&~Z{OheK}xFiw50)z{uA!#FAl89gd!UfZiv=J^zM6dwif@w(F2$v)xSb%WBG$d_= zOA-+*K)7HUk~YF6i3k=TTrdqu8{v{f1Pc%@n1-Z{a7iM91qc^RL()dLBoV;^gbSu2 zX(L>ch+qN21=EnU5iUtYumItLX-L`#mn0%sfN;SyByEIC5)mvwxL_KRHo_%|2o@k* zFbzo?;gUoI3lJ`thNO*fNg{#;2p3F4(nh!>5y1k43#K7y-xF8Z;H!VM3%u{=0WbDl zZk!YaUJ8^^$>~-MD~!ajwZF%(Z~MXbbqvc_Vc3mlF^nj~u<7i!XPS~QY|M!ib3%sq z)3;t;w*HkxGn&`57I?Z6-zsUkuP)r46nXGwqGw6f#r5&iFMrh#-Vna*QBJ=p{KMy! zbJB#!xf3fQCmvK*D7)&{O;{Sy^s~5kv%8*rE;o-qbpF)kc27s|?fNqN;y)E#Z7=^v zd5^KRzc(&wL;r);jv}m_Z=0>vo~&MZ{Nz8+=A=%&*?sKb-##BR{>aXnCDqq&ZtN&3 z-xs-ypG@|DnbO&FczI{d>1#K-o|$}PazsSkPv5Sry#HvaY(nXWHyg)~y*R)AzZ<@K zZ)5$Ace>79d-z+f>P+K;uZzx(;V$lo7@H73)zY>4T4_V?7v-OQaC+DE<=o4A<7%#U zZ+K+y&VrZDG;X|g_P&ggN!q{gr?Beus&LB#msWi_ZQ_yxpLT!Uap^+e$7(^p=g)Vo zuRM@x%!qsFQEjO@#n^Dl-O|!hTU&dz_~h0*egElrVhi=-8N~L}duH`LeyeQbwST=Z zd-h}6(s%xP0NbB>aJF%ySwzz6R&+^sj9fJ|JAzQmOUq0U%Fj=yk-44WAf{Yq$$>(_TRb3 zO^bh&}{qMK6O>HdR-gfR>%NyEC!>zyPu8t#4e6%30qOdWo@@RW| zIkvsLygGlmr}M;?x*ONCo2wR5x78~@*|zVIU)TMHzO&_ZwKnO>{P-C!mc5Z8-_?3y zQ*A}@=FXV6>-$z7JC=IpQeW+|#?@Q*Wk#JWYAtEL^4bSWHkFjjiZ3dfZ`ZSZZ8sJd zs}{9^*iX%w;#nP~{cK(0(VsNjRW{{pO|LTVPWxkBUES_=doK}|rA>xr_VCho&GLk) wmd$hXH*foBjy)-SY}rGfIHs*#Gaegre)%`4OP{ic@5QEAQqB9HeD?YO0g?41Pyhe` diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSword_destructive_activated.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSword_destructive_activated.png deleted file mode 100644 index f522b9057f3f6f4c4eea571f665d788d94017fe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 866 zcmV-o1D*VdP)GH!T9Vx+Xe1_iJu;LLa@?r$Xjyxl3QFF!`p2K7L#7hhAmZ#nm;@#C^2e z4kS@g^4Sd5){IK>%v_#fWA#C*?{*ALRPy?sWwMD8!-?l=!eqFHvCT<2vg=|`b5ws# zq;%wPyAsI;xwGAJXS)@RMiq<2aHD;aL@CP@&d<-&-qxs|?w8cs64PSlq()Lll}I)y z2m-k?U2>y+ibNucL?UIttYl+bYl9NWM;ZTloQuEBTGOsTTU%T7zx6cc86OP%NG_Md z%uEv5Y!N1FZ)=n*h($07*qoM6N<$f(2oovj6}9 diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSword_destructive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSword_destructive_deactivated.png deleted file mode 100644 index d1f84dc5e93b0cc78748c25d5482e3ce7b9cd94a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 847 zcmV-V1F-ywP)S-P+1mGcWPQWLQ4cyPoFjR(Ge+ zIfv(Y0POc7*gt2II5+bGXD^2J;_gQP7(I6p)}XFfEK(|!@O>Xi93Sr0$-bziQ~N02 zeHRU$vF)(q>~vVq?A!+W4b}?PujL!67JT2QTrM*_a#Sb#qPBm;=hf3wJQlu9_`Byh zGxdC@_${;NGI$#nhK7!)nujB3`dMQy?;-r*Ud~KDpq?jVG&Zcl z?dxQ|tuWBEWQC_jH}WwgaqwWbJ{dc~vA5qMJzHj`ov{DQ7%c-z>cDGVlo8#tej?XUNM{3K8%|4w$67Sv>lB3*absER;C{MnE0U<&>>ZYuje5$=T$^Ea z>0ui0b)3r9^V+VW6%u3M#DS(TIc{Rue<>@hh+S<_{gO@V$l)#}k}Yx<`f(TfiAJM} z#bUVeK_u07jl#LPIl4MqHPC-Z9qlnK5Li-I7KJKu*JA0!fqC=!X(0JDu6 zJ3CsGNIuTQ_Y+*cnztR>1Ff&GGj!}(%rj05e?zHM!puw(g+di3>*{QktCUG36J#f{ zv_G-WKFXx=eIMr>kH%yAYgJ57Pa8m6TU!;ve7=f(e0x;uKYXCBj%I~Ip??jNnK3Xj z&MU`9Sy)(LadDCP`FY~;_@;%9_LxegY7UpKT(eLpM7dnX%(!z>gCM}n@O>XMBbUno Z@HY`hWy1|i?wSAq002ovPDHLkV1iQjjiLYm diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSword_steadfast_activated.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSword_steadfast_activated.png deleted file mode 100644 index 465921dc84be418c81d8149a4c8cb7801ca81e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 873 zcmV-v1D5=WP)KwH3%JZf<2xF9feF))`|UhM1TLm;r9YKbI!+ z#zZ%8L6->V60*gp3^YcG2{&FCrdBQpWo-pbOuH_VZlRN{6uy3Yj~DeTaFTOzPI6A3 z^E}THRmBfgMMUbgwH6V%r+2PTRUA+Y8C3$-S^yl!xo64ULn1<4AL7kJ|LEkpFHtc7 zY{Fb@=$>!5+>FfsJ()VNBv<`t%sf6pg7-LXXK6ve2 zjfYP#eDHbkmfy!RM@UzO^m6kVnp>Wxk_jMFHFR?(SUbTOgXeh+?(5fh_ynIUyd$rl z{FSY17Ma}jr>54QV#CJm$kYnVv?1$`(6G3l^brxqKjG~?htyh&T6pBzf*yZ$8)tX^ zp_d*$MYJserR7womdM^3fg1-&3>Z;WoW{mRnwpweQf2?>5I_F4j~$WEc^{094sRZS`$9%d($vKOZ-{6HK z0Z~;xYzQ&D3`9gwRi?^H|4XlE&#^&%9{QRsFYm=&gz|5e!tJkES?(b*5D-;(c10ui zi{XMT67Y2vfwH)$8m?s1tj<QT6FVDuqI!X7kwQ4z=DAU0qKwG4Ts+@$E8tY#3t<)>EC>D!EqtW`0NPDDBT|6Ae zA$2t+!C(;2^AHj4{?t$?got2_K}5)8G64Jsshw{P?O>9u00000NkvXXu0mjf_uiTn diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSword_steadfast_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSword_steadfast_deactivated.png deleted file mode 100644 index ade2c703399956000b07f4ce375aa695d240424e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867 zcmV-p1DyPcP)i6Q_10`N&h zK~y-)m6Kg;(`6LKf9HMM_(A5>#StO_)>a@ZxVe=%y%4;zSZ55;7-B-ghuOf5_;G16 zZ%mXS3yKlYC1i_H8E6a|6K=RLOs!rR%GL!XG3~m{bqgJArS9MV-s45>z6$`++>~j*h zz0o;`F$RDRvl{v5PgUvZo@BJ)jBal00N~QOA#OTDpin5_c^=kURF!vjzp3%?NjY}l z8T`BM;7%iqmHN5da8?@{pP-ZuAQP4CW^J%?g0&Xk_vzc$tMTwj`C$GHUOx3BTUISF z`oiy|)}GdN>$f2jE3lK6ac_W{g)Zs(PzV@f@O_`x_Z-xE?m-el1%ZTO$>8y0SZi_4u_@B1C0!($ObS3#QxgE0Or~P{ zXgI3Fr)D&^zD0w<;J?BoBJA%QVDH->F*7s6?CdQ0e4c1Dx||Vdi8QN+k1>YSZz%}| tgZRFWh;VySL!l5Ng0&VAA)QVG@HZX5V&O>|T>bz6002ovPDHLkV1jf_mcal3 diff --git a/src/main/resources/assets/bloodmagic/textures/items/SoulSword_vengeful_activated.png b/src/main/resources/assets/bloodmagic/textures/items/SoulSword_vengeful_activated.png deleted file mode 100644 index 0bd8bf57c126dbe81143038a60121e40ee9aab52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 876 zcmV-y1C#uTP)hkkv~y321vAVLr|xpgv4>^#CB#7$F?(X-uteLaR%`w-{QMB z=jP;`dqh=fl&T^k&A+u45xJ$Odv+2>p6Hr(S+cCsuUg znEGt%)jW~^0rywzf9f+uI34Wpw;4cIU2e$n`kA9R1?1 z2oLsmQTx3};cSMZl?p>QmT+x!pEQIv4F?=Ys8mZ$K|k+|v-N>Aezw5uHUFw>x~+p&Mz=jcE}%mMX<`F%kCgU3E}3QG%Gi++}D-V zpU;lz;D%mZw<@Ln@Lu(Y_i8ekRL}FU!*8mp(stW_I@s$zrYVyf0G_Bp|x6#7q)Fe zL^v?<6~6ByBBH9~a=AL~-ky7Ob;{EnPd%>pdUxxS+jjxrI1VDhs?y<$ZG0000Yt&*4+(*#S5Vj5Hu68VU-F+hTi8-h9&B_xiIPHbleacn#D=Dq)QF?P_n@+Nn4 zZ_drhIroUF@_$PA?gnGPTC~!EL{S8QF@}X>B7%rCKq5k)-o~jHA7y-HhdQRd+jcE4 zv3~-swHRXn*lJwl@0qId#S0H}Jdx0cwsZk7cH}(9HX)@_i697Y90yh9;GU=SosN{` z<^#g!MKl?q-CB+(61r)LJ&Y(<|WfJ7fAlUnjL+ zixkdgIa;YOcyozdAKBj!*(^BVI6|dbY6$vSM?$yVpCQNfe{Xj?&VO$YX9amcD{oB*5?euV7W!6hF`&2=v%s+3H=j**e%~- zwkC)QlRr-~_d_==H*0({H_u?%k^EaPfmI$^b~{;02=d=A^XHU%J5&1O*-;(X*rV%L zr!^SbM=-RHR4S#O=V6ClM^zgw3mW9}dHOeQ(B9s)OnfuJsbjBl;^T9C^wl|jo2@aq zWxK?si91dlRzPyOT%GyCC$8;E>$-LKapC+0zPt8|bbCpy)oMJqeKR7$!SOE%f&dW_ zRmJ!HI_;kByLC<4)16N~ruTSv=@UD41K>CgBEstQD)l^1i^U?vViDJMab1@vit3JK zyp-NJb69)2IyD}T|0_%)!j9n&c>2Km%*@PCC={5Uo+gvYG%_M<(w+vkuEXUkKS?|u sCk#VG1Z!<0smWv#5os{XX0rhN1qx$eP0-^W_W%F@07*qoM6N<$f)25fXaE2J diff --git a/src/main/resources/assets/bloodmagic/textures/items/SteadfastCrystal.png b/src/main/resources/assets/bloodmagic/textures/items/SteadfastCrystal.png deleted file mode 100644 index 84733588f93bea8eb99ed41a4f488e33b9b4dcb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmV+|0@D47P)D+r9>D>_X;f1H000McNliru-~${EF*oyptYQEF0lG;< zK~y-)?U7GNlW`cwKkpnb6J^s^n}S$FJY;VworU(Ztv#)xb^c8Nh4G6-1qeG{Q2Dpc<^rh-v%A%N0RPv6Z3q#AKC2Nv5;_RJF2+VV*+IQvGN37FO*0ziBID|@bR zMA1kCpoJo$>vlJRv1*9*&*NKzR|(2*MV-?@TWbs1Tp72|%_IxL;d0=)-o#eDe!7E7 zszT3YJ9m6N=sRDDzuQ7sDrE8o0Oh>F%f*i!;WHaK!3G?7Fs@uA^k42(6T6gDTcbigk;GivWIvIlcjy5fT~~;O;|%+~ zQk8>%e_nJy>L*jklHJ!yt#5<1#NmO#MmUOZe3Uj}ZDNSwh&!T6$9M12acX`0Sm*Y6(I1WwoW7CXWHc8_k zMNy=0ZLOBm)V#`*@4r(no1|PeNnbUIg#AIETFoLA@*DK{a7zB5KNT`FTCrMA)7Iu1 zJgMWT3M-F?CyH}ULI@H<5a*mY=k(+6`|IGJ=mRIdw86Ft=NSM1002ovPDHLkV1gji Bx3K^K diff --git a/src/main/resources/assets/bloodmagic/textures/items/TeleposerFocus.png b/src/main/resources/assets/bloodmagic/textures/items/TeleposerFocus.png deleted file mode 100644 index d66e2d67559268fb0023c23552ded9babc79eb22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)6HXw(^E<*qS03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Ixs56iN&&Au7odGohj$gd*s&f+UIxx`0m^mNcOtA}B;CtW2{Y zU!+3P7t<_p7D%O=L=oC_+v#Btq*)I_=j|MRJ`Vr+kEklMDFd^tSp$rJ8rB?JtrAh1 z?{`V7PpLkTrAjQ7-d8eJD^oqFJF`|-m6j41>Y)4aTbP_+X>Jk*o0HzAXPmm(BQpYO zkLT&Sy@zSNe2MTxkosUY;mJwL&Am*hfdz>sMn=Y{y3;4qJh*-~UkmqnXuIa6@@kjV z2eYxeoD}ZaMZ>s@3%9yu)E^|pk;swa4E+t@Jzb!#O=Uds*5bMNTvqNZSF0n1z`K4b za&obxF2Px}K|5abN?*?ia}!J)-R6u!R27E>&K1OvVU6}H%1X4ly-gpyd9Bs$ZJM=X zyQUVnRaMDa2q*FkB+rX#jQ}S-ZnY-GaWHe3Wi}CW;a2W7He!m8XA4FEi%gP;t8Em*q3~ zvYUZHKM{=BEV0C!!+iZR&XwjN`D>5>JSFL>5ux^Bbj|%mX&N6R)HM12oy7nCOg{nq WE8<9cY1;(=0000c*jgAf=Fp*x-2S!D1w5ZplH)dw1{xgu4UU6EevYc z#y=q?yBHl zN^Ag*Mhe9e?72w*HOAL=q;@B1d zn#+aT?ZL7vVzD@Gw~O@RvKWX)0gwQZa9Hhatm9r+C;idyoS1E=WR$s_zD+ul=KR!6 z=2I!|1|O2o7bzKr+L%BB2w=6m%9n40n5N0~?l4`o_Zf;j=X9=bWo{5%9HKf{ z1;8%99{?AC0*ZzKz|m|6FM4|zFbBChdW)RTreda@H^E0pAqb2|fL|0!r9Xgjxs1>2 zM#L`Ct39UU?E_Z)pXt%Narxbtrb&J_PyNCv(oF+2O`hBu;<>YD)ZF|cjSY3Qv^0~> zEOD%Shnd_s9?gd)CCN+-d2j+_#UlB0n)t|w*v#PlhmQiFSS+Dw8eXr5e*Gy+&3&X+ zGn5W}#o3?4vMfx~LQ2V&5CMb`2m#~c6YQ?6#P9cEB_b5+`bd1Lz@xjS4;!c7 z0+2$G%@rsXOXP<`O#VoaHB!{p)?h1z$E}fw2Fd1fh@C__(%P!_wKS1PPN5u!CjA1c zCW@x%2q`e84q)yXVmX^%Q-3{!O@LC0w$@hVaq9#El_o2=mg69$!0**@)SA}0e2LMqF|lohzwO$PB-GZXY}-aii4+3cafq$I dyd&U$>NhLdD7cU++*SYp002ovPDHLkV1ks4Rzm;) diff --git a/src/main/resources/assets/bloodmagic/textures/items/TranscendentBloodOrb.png b/src/main/resources/assets/bloodmagic/textures/items/TranscendentBloodOrb.png deleted file mode 100644 index eebdd050e9cdaf112e9717f8095fb45527d1d3e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1239 zcmV;|1StE7P)WFU8GbZ8()Nlj2>E@cM*00cWpL_t(o!|j*PYaLY- z$3JIYQY*1dv6dqKz*MW!2vS-@P!tL(SQK$15?%TaxR78Gb>T`^1zq@)E~>cD;!hA2 zt?9~YQqxfF3r#K5l%`EuV;Y;hH|Km^+<7lAZK6p?(M9iO<}x$)ob&y0?j5*1{^Maw z`KYV2LjaO!yne9%r$w*Vw3GyD0q08Mk|fa8*&!lB=1AhbZ7(8&X|Li6R!|}$aDQ0< zQQ)wrx6hUbfrj7!f$-dM0$1Px5kb@$6`^H7;K{oZ*SoguAR-uTI!{FK`N@9VoJu8- zM02x27`q>T2gx~e;xO(NB6cbx`1t38wqyjPRGlkQl~E-pMf4kKIhY}j!sG9?fag?Eo0yKAtK;`XSx7ma(oPOr@Q+lB=P9xr;wbMvqQLvQ7YsF zTUu`*BG~ccTPVaA0|T}o1ZrHnWkg;f0s@BsDIj+w$CY$ZuiS(@Coe%x;O+!Mp?M8I zX98(K7(6qCJlOui(`o+AcgUJ}_x+D>Ib#zO1n_3h8%Sd7hAo&wQ=B13tes57+?o6~=M5W>mxDsGTv8ItHdegHRPWmZKJrM5N5L}$}ANMdkPy8`&? zmqRvZ0s&aTX&TtK{oo=C=tP* zQ|BPWE4z0g!K=^igi4kEBR!a)Jn}0N5IJD1tV|IEZC9^H62lWCDVgf2dILkV)tJrl zq(l_z%?Su4&#Ul!rAlO0%o};NLJPu_C8tnBC+g^O!QDj&I49-(^ujKcdkm@|2{cZPZeupH{-f|m~7@hh9x8Sr-5r}nbZb1Q$ ztlxlJ@L72u5VV$B061Dbmbfnu&KoCN$l0&f2i#I`h=N}Qkj1QyID?i!#?sCM7mf$p zH%X|zOSWBcGm`VzwVN@)hbIpJFm(R6#H*#i-% diff --git a/src/main/resources/assets/bloodmagic/textures/items/TranspositionSigil.png b/src/main/resources/assets/bloodmagic/textures/items/TranspositionSigil.png deleted file mode 100644 index e637b0c4d7f7d61b991ce48308930852186754a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 738 zcmV<80v-K{P)L3b>%;Fn=RD65N+|#$cT524ZfxUU zN~{BpG&PZP993Oe#?0(OzQO17QB_e&BAKQ%6y#~|3$Z1jv7teQN`jm{eS)EpaXi;q z1K+&GP{%zS$6;_Vg5R$bTaJql0|UPSO^uCeS5-OfZC7~G)r)Ca1OfqE*THoivY8w{ zzn?<~_R-h>hIk@HWO!Hr=l}x9WpliH{}J1^x!!t#`RD?lYQo%o{tRb%iObmxQ&ZEF zhDwMhQWO~mY0E+aD8S5Q0La-kJw_SrW3!|lc5*E?$5q>8s6LGU%sHf#0HiGoU=5JX zW>HFEt!C&xdW@ZK`)T_TMIh;jnMln~^{YOt$B*bTiZ-~Q15{O(u@GJ6%iu7VQfY2m zStv4Su`;x7H_$YloCsaG)WFU8GbZ8()Nlj2>E@cM*00Oy5L_t(I%XO1&OwC~! z#(&TGcM_c(r0CG9BPvv;dCOa5YsVKGv-!Zx3~OwCiqIBo%w|oN?TqAYW@BE~Qmtrg z#K=p-C>#9?MaQX5oK)xK_93w&?oapg?A~wJ?(4pki14q0?1o<~$h^!D1<|oI|_rp!ftQZoL zWBJ(OAbR{1s!DQYuYNW_MbL1gp-3tWR~Ov1G9xOC_b(hQUz@?l51;V)eK?&xL|dj& zQFd7J^fPLNf?U0f8G1G-NKQ>*(W+E#+^#2e?i@7DfTQ;lE$vNob-t(M;7)06Z5?t! z*L47znwn^+JSCgg+PHc39<@(jBASLZE}R&11PN&gc>CR?FI`Bn{XAQDA5#EYb8|EC z@$mq(yncKj+%yhLOe9MdB+~Y^n;n~Mn8%y2S}lwX3qkyT8lJzR>{7+S%F0TD(yHq@ z4&>zI;Oceb@%ngB*FaRGKGW5drI-C(_B7R#h?tJx4xt9N(}`&*HLV7PR6gurt`AcW_jLr6iFK)OU-BdA;F zDDskY?dYWp6p9##DP(H8rE|``d$;#}I#dItn}@!a2cC!L`+Rx$ennL|4lIrd`)DH? z32Pk+AOLo~`8!g8^{t=sPX)22h&D$f+T9rDj99gWbVrZaWJKa z2wG!NRfP*iX)PRZB^Ib%=+EVA)%2X=<)w2>o=$LnpjT@Ip64@S9D<$)z}U$G0JABF z=UZCBzKo=9c>qG#(kN{ z6m_OwX|35vsE(hn0g655Ed0ibY(v zinW#95!bDf6PwAP&%5miiIU45%jl=F%3dKX;~Aq9{NfZ8{YW8Vq}?WPj$x2FUK@B^n89MTFi+ zn1n6Nms}F{HoF+W$2JBZSauvD0@++%0OV+xTAHJ(zF)JlTdmfttiDn#Iftw)|2>Vr Y06IqhsH`LeLI3~&07*qoM6N<$f|xZixBvhE diff --git a/src/main/resources/assets/bloodmagic/textures/items/VengefulCrystal.png b/src/main/resources/assets/bloodmagic/textures/items/VengefulCrystal.png deleted file mode 100644 index f7e615b6f84fd8e210625a73bace04bca6d6c8a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 571 zcmV-B0>u4^P)D+r9>D>_X;f1H000McNliru-~${EFfaM`1$6)b0mw;2 zK~y-)?U7GNlW`cwKkr`Kt1r&TS}S7>D=2HTK!T+>tPVxsG3X+B2=Wji>d8y2C1v_X zx4K4jDk!>E2M;k@$xFRyytVMnvW4Nh_RqQL_UjM{(lYSe_w?{Q4O5Yt8l zz;bqh^kU)HJw`@^e{X>Cix)&ifH4#ids;(GTpt!2Yd7I_yD2U#(sm@oSmcUOw|HB=CPQ0$ z2OmGrVp$d`I|YENM#b%N5z`H#nzj-{`dvgdO_aVTnat-n7HnmQ&&$haPXVZDY~;N) zO?=AaM9U%k`#@HRDjLk*XYwz1C4Bnfhv#8G9c6t-;KfS-Ltq z+2z~Kl=+5WZ=bZv!TqkYqW#Qi?0kVA=``=AKT+5qlbla75q-fx&pCVz+j#QmG2ORs zNqVK?j(@^4Yu`$EQDBN~lTHOhPxC}jIV<_;@ZT3!|a zjfM@0Cxn6_iuywWgRimO3bE0*M2B;Do=5koEu@r(2>^r;fFhIqM5OyTZt*(sud}(iDUMX|Hzp^N%J==Bd5{vX g?eAayCxU;$58aar{pQl@D*ylh07*qoM6N<$f{eg7A^-pY diff --git a/src/main/resources/assets/bloodmagic/textures/items/WarriorSigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/WarriorSigil_activated.png deleted file mode 100644 index 2c031b41725aa9bbe546a62017f20151212f5ff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1583 zcmbVMeNfYO7_NAzuqjp14gAWgbHXi6(hu6i7J;UfibbpyaUzf=DGku1Hi5RBIL4TQ zhnrtF-I#bD$T+96c}^6!6YKYwPQAG~Hx;MMsRJkCPebwaw3S4`&@33Es^ME_}m0pNDF|S&SzM??DqZxGJv7< zvIS}jY;hZCCzD$0q34yR+sM*F5~XA_5&@kL69rtfKma~h5zAvfy{ums6W76GNCxyn zghIXSiBnmY48Xv7Xh1DjgCwj#01YZf)G8D~-UJjdqJ$6_QlKD$U@8rUBme`COtj{q z9GDe14cHQQdYMxY+!zFTy60tC+!o7IVU`~Vlo&F|N4OzG4nrtx$#UiZ}Yop z$V&5Ev4<4%;g}pEi?MsYp&(H72Akty#H0{KI7b${XjU-edYSk|PB9dwKnN{OI+P%( zL^U8qt7s5a!fMcACkcmAtJZ3i_K?oA_$Zp7Q5dvFSgT1u5ThyuP0<(-lh&A^O))0m zc!+Ced4XU_I%Jy>Z4Yqq=W;QFhb9EhW8=7@P!(i2If3JyoEtD0fN2XDmg2m8TrfjV zE{xM2ri7+U9?k{yhZtj?VP37G)DA?2fJy>}L6u#l1ql?Tf`bZHqX{ZnLCOaB)Qg4= z5}ksAb@IQu2_1>W7+gN>0&(-Sk7!nG9*@{1T{}huB$6bgl zqKX>5XiCH$|MjW+`Y`YJt5u7mbui3te6Z_$VlVwIc@Df zCZ8Rwz1mk;e~QT7Upn%7W8*uvunl9oleS39POO@Wn*-HXk4dvjS9IB9);QNEYfW1| zi_?73b7k_M@l{8tSLcMa!2WN-TW(D=na1zlRViQw`sI7RHc4w$LH)r|uhb<5emeMQ z@12gs--b>&-r3WXIm@XYmoYzl{IPq3sfEksTQj-O9|d|MyZ7n#_Aq0jj(yePi|Dk* zY-_Y%Z$`@3Va>N5j#?RTeEI96oB7$fxrY|78?L;g*6pdWR+Xcx^6PpBU6O-J!?ts= zzPc4>oNaxpEZ>e@mRC2fEqiPE!ano0o5j1|>Y5m{2?Z)ohabLr8BXkWoU+BMf7yNx zsgF5*ZP}Ig{F7>IDJ?Z4R@OJ)BhKtU-f%W`sl|T2;9%FgCF2{THh(lM?32{n>yt`q zas7?h=@nFbI}pEP?Ma8U!zg_}sl%5oX9GFsO*z;8eq-(jC#oY(0@ZMBR8oEJhwa>r z3mbKRUF_Y-v{jWFOxjVel}YqVCq|_;t*qFy&3b6qY}1;O-u&%pov}ZV$gaYn(+w-) sqVc9%turITm;aM_X>=ZRXHoeeNvvgvLG$p`$H8B?*_e*+Ov$VG7q3iBiU0rr diff --git a/src/main/resources/assets/bloodmagic/textures/items/WarriorSigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/WarriorSigil_deactivated.png deleted file mode 100644 index adcc645ffa63fdce3ac66fe804a69807fa210bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1580 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 diff --git a/src/main/resources/assets/bloodmagic/textures/items/WeakBloodOrb.png b/src/main/resources/assets/bloodmagic/textures/items/WeakBloodOrb.png deleted file mode 100644 index c5e494d6cd9588a48741d80170fd0a4cdc19b2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1220 zcmV;#1UvhQP)dh?u-bEV1=fl7OkODiXX+clr(MAX;PXrI?ZI}-T!fM-kNn$BSfh8VG4xp62I5qrM?n4K@J<)PKIddtuZtK@(8)6XCI#S}17PI2y$KqSfd@>ydi0PGy!-iA0IXiQ!AWBHg-8D# zfOaY%fhk-i|0}t9dy14gGM^31KYeCz*vQvG;>3IvFHx%rNfb+lNqq9qE=;0lRWHbR z<=ChI-uwC|Cy94n+=yS{vugSTv)7tNq8AvgtDZ(qU5=p;nJqszjG%7$_ewQ zUj~U^YcrU{)}c2;?_RqM9^OB207-1^TZw>2Hm=7I(^qPkjK{l*7-H!7(XiR_UMIoG z@2Bz=xXI-)f*f%%`5>s>KQ2X64fyCh(S1^hG?b|UgMvnc0yf{5|5dl#lNKagf z?ykUm&59BN?p@uBfQRdW`N7FEAxF+mx)uc*$doRYg_=s37sAJLN~yU1F0QR5Gm0Z3 zC}6bjf>Mk5VqDSuG+tt^9wCW?qeqa$>rd@Lcs@Klg@EZBHH1Slz|ps|hy-`_uSJ4# zc^*lejiQ#EdhG6g1ROg*kx?L1do#rjkC}KMFQjHHG}5u@a*Mxc_#x9>N`009d?9X+ z_?f7*I<#K(8j{20FvMpken5h``2{2;f?*b{c4@AT5IvOzKi-8}%jv1>B|K0Y!A!1<`l0URG6&(8r%l>y>DP7*FjH8ne+nQSTj zl)MH~9fR`UFFx%JLNO%i z*w_R@&2yh?G+MhTZbg{*pcs2Z={fO3OOB*-qIsX}Cha_soC)`R@ja4QYkv!1_qt7( z#FeOqfQzme%o;@i?0Iq<5}f?*Pmt&>hWlqK(*TS|%N!D0y6Q<1c0LbeU2AE^0=W$9 zRCfd~Wtev8f?NRW?5}Y8WrdT(&(|&}EF4_EW7QoP@ca|^A>f;%r;$XtIs?E|yj_<0 zZJ!CVN~oborvB|1-olwM*8|B&PPZ3qd5g6D#f98;$D?HqU`wgiannUT(Do#p)5o10 iek;TM|KoJ20sI5UH@Yauebj;g0000rMvH zyd`|!i2aISvmfr&NXlT7Q(5&Odo8iPe&+ACh5C%>yn6W(1WG{EyVU#m_7LXN?(*jNG_Jjp-f=-;n3Dd z)FC&hG{d&&or2?}D4(3qFD)(Qm5O)-S;U8680HIve4!Ae5um>er;q@M`=>?}RG8mR zx_p$2z=5zLVk3$v1&8+Z^%cB6z5b0b?jH^m9Ws6Z@$n&^fbaE&?=^(>QwHo`H{Oc& zo639`-+=jvV$x3M!!b2NrepVRLt!B8jeH*IqLYGnRD`|Qi{X?`rQpzCc&H1N3n4^? z*&QO#E`p^Xiit5076~Mv!)8YuBAG-c71<&>Z{sV~QVFb5O9e7%CIqR)Ff7VZ&XKCb zDv?^F%z-0Z9qy+P+>S+TyJ*|P+{|}!2Jd-_cBP}IcTAtKpx`vM$k9Eb4zJ$~m=dg&6B?SI)VEag8h~c)!L+*d4;=9t ztZJ1FDNq%T@E*RjzeAt;>fnuzo}Mmqe_8GM{fn83Cn>iEp0u`w24C%6(_K7ykd+Ic z?Y+?`^?ao+e|%s^P&V#)G0rU_eJ#5K&&#)16Z%4bQ09%Sbot8a_S(y)Rd>Ps8J^6U z6Vy3r+p>gz5&a>c>917HdAq8rSko{aDu7n%?%K>BsX^U4@ diff --git a/src/main/resources/assets/bloodmagic/textures/items/WindSigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/WindSigil_deactivated.png deleted file mode 100644 index 7ebc64768fd3fd9d93d7a04b4e5c84ea23a1be27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1574 zcmbVMdr;GM9FK4}2U_Jo2UD0?WSpXHn)I0*ozSMxZWgiDQRg#FQmE11~*@u3a6r0Zl0*)n7VnQP7%D@;e$@*&~whENZtPM{A0Px@0HKz^Zow5 zk5uI4=15}4#R32zF`EdhILC$G*IyII3H{GVae7lQ+J#xHQ}B^I17y*xg8|KMvVgHN zBwf0+jmZFj=%p^3U9elG;}q+bkztI?@8(1{0Ax(_b0oEd5kLo1;PU98zN04~&_(N@ ze3eCR;S5Zn%T&fQv&wR9RM`>=qoHZHXP$g4IDLIOO8cc?$lo*0c1yMPofDt*2Vp0Ubl^PsTgF_D_TH|Ra zZY8pZY>7J^R451>4#Pg5Pv%p|SiS&8Fbsp`D2$>~5h3-KdIZuh^>`;n6bQyk@h(nq zu^uq2NIKYJK?jMRKEHySvshjTd%Qz|5<>?2Ne)J2a@g$--)j)<6|Bs^ZoCxjwUu%V zY-PM`F;9v4a88Vn#n`>tP#7qBgU{eyVp7N=f~AVxj7KmNI!OE?qg^zPBBYj~oC+zW zz%){tQ8H3YAy-MA4vKUtv?{Ge;fUzGj8AA03{|PKTEL#+*g1kajV7-Mb2O13Eq$ zFv0My5{Ay^SvNQsV%+r-^C~5+aw1AZsvzZZsnVg;N=Xc(!-G<;!qiFzrJx}`{eMFT zi%!AeI{8oCM2^H_3@=}Ffw+0mM~p{o9$xGcoGi@&fT;J)M3&9pxpRYMM#9W7fg77j zIxmN&XV3H~>!CJA|zWVm} z7sdqjpDvr{#20S=C>YQurf#RxeC^ksY#lf@U^?vXUVf_dFRGC1xZis>^Z5QNXC|*+ zY0|EG%8w1M7~P%Fx2wBg=knNF2WnG7PeP#uQT6oUbpiR=3EW7(<$+~m5Lr0p|%+-88v*A+Qy}qU` zKyv=&-df8iKiu0Bwcwq)tQK!d)zPP>hYv|va_}3di*Z(ThU)%Y(Y?4aJ-&E;4vMY4 zbPa8vJ@8ep`u^EBM)l&^x?H(aJ*+&+a`9x#qT!A96K7a(2Wm~D&R-4uK0nYlZ&;1H zt7lJ4X8G0|SNGk_DI1m&1lyNC4rmz3?A`iZzudq0Y<=E}%5PgU(59GB*TqWi&<7N! zO@1`}y}+C~MI8;hVy+mQcC6acQ5^l3iy&Ip@FkH|l8yr%W+g>-!oI4vuewWXMa>&M^+ViRFh`rvb=~26@ h((7WlnnzPk0v{iXm&|XNpbG!F&Bk0}uYS?We*lF6Sl<8u diff --git a/src/main/resources/assets/bloodmagic/textures/items/activationCrystalAwakened.png b/src/main/resources/assets/bloodmagic/textures/items/activationCrystalAwakened.png deleted file mode 100644 index ef212c7f2c6a320ecb3d10746b9987b86c9a1733..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15410 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 diff --git a/src/main/resources/assets/bloodmagic/textures/items/activationCrystalWeak.png b/src/main/resources/assets/bloodmagic/textures/items/activationCrystalWeak.png deleted file mode 100644 index 895ad35fdb293ee8d187e8e884cd704569cb3c32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15408 zcmeI3X^h)M6vvHJLAw-a;X?~TVA6s(>h+O0PFyD_8)wrKqD%@c)jW z?%lqeqGa35On4LN^JU#G_G^Yc1^O$+66{S;%DI)2rf&cqJq2>66$||E+)Dx4G-82u zVwy{rk|1vm%{X9uW+bD}Y|x`d;M{nhQjuYRBJec2QY=`mT!{s$ab<{DP8K-2eg)!v@J?}z ztURU;*3&^N7RY;ENoLt{x!hk4_S;U5<)hIk%L%L?Ft7*XZn8YB!dUK#T98H@6}Y-% zmORt8Xg{ttWlwvtK)_Gbyz0+YETz-URF+$(2RX78t;F*E99t~1-8@}y473K>)zi&v zDgky3xc0Q81K52<_duzQaCG&jokyV5MqqheL%})22kMsJ(3?J`X{S&HZRjj0fFjJ} zLI!+S0HwU`*>2wMk+LaQA$Cjbnb{ryeWj-xsF*$6e5K}At*P2nD-cRLEnnc6u>7@x zYU|Vfa}BF;DD)eqAq%_~0eUvb=)tJO7$5|gXpj?`?3Au$gAp+z1*a6YXP8!1)l+pz zAw@Vo$%`TvkvN`Dg`!+45{>d=QWaAPUJ5tDx4CwN9kyIgvvg1&xd}%ejOe^5h*M02 z695yAhIB^L!(qmdw6GvZQq~ZpM(8&8j?gM_%#FYpbnIev!IU(|1%C0y0*&fzuCO}Q zYWd4%moaf!1L&H>L^L>@a3~}&Q-Yy05+BNHMmQ7+hc$)maBqzXCQxd!@n7ev!@U)~ zfurq_JBww=bUoYI)F$|Y^0$(4aQWQUhEOo)Nv_Ecu6kM1{Y@(FYLLDUrLC1L2xPb5a#Hq7j% zxiLCt%a7646O94Sb3^mAc|~dO+ZM;r<*e-#H7{-!wH#neR!(7Cjcq-f=YpKH3$_D? z1>!-4?bh7YtFc8U;8y6bQWu$3f2s$x+}zgIDsArip+rLBqH01MNDTU0awH`2iKMEE z5-$xz2I0QhyJ+UdZy!8vbc%nh`3DhP4O(^G^9tM1*7ndS z?%FP+u9JAzb{TbTd0uFlUR&X{Ij<6U4)!7!(y2ZALvt%?c<~oY{<1qaFmZGMi_T75;Y3kh+wangn z>ApdVI%4&(n#fc>K6uC5YX-C>TXwvop1B~k;+FlJuPWUB_3;Z9nI|krU7Okc(~(c6 z?|L`z;~6V&+q-m6-^H1?4s724hH};fz5S}h_@k+Xk8DZo&VTXQ;#c2N*x(xV_w+r# zgTL>4W$@}}@*`JVanw?C?8@gaP}PgJ%)Iu)u07iyf5N;j_VzhPKdyW^s-}%547g%AtGTA9?w*+b2I?_{sIFKX_;@b>PPI-UBE8cInwW zmp;5m6GIPvx$LgW^QU~E^Y`C+?1xVs{O084EAxAXK3Qye_w9Rj?X)v9^3!{CdE3{Q zy!1LaG_bR{BY4V-0FYRJDeI( JpB`Ah`CrPD+x!3k diff --git a/src/main/resources/assets/bloodmagic/textures/items/crucibleupgrade.png b/src/main/resources/assets/bloodmagic/textures/items/crucibleupgrade.png deleted file mode 100644 index a9e20b5e85b98205b2b0d3b54032e75988d58edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649 zcmV;40(Sk0P)l z^-ebcUZ;yKMW%!juRdQ?(xkE(Y^iK!mv}E;TD?vem9SNk>f*ijl^TG$O7e61x9N5{ z$?H0^^Ye6E4G94KPX_OD%;5<(a{kBz$4nN7r0$cT27s&Xc(M1(Zs~eFLOnb z=m=dyFbsCG8Nxl?RtFx@UM8}tQY`AsTx{o<=ozZ2)@~t@ zOpz}Z3G6$_*+)G{AHI={MDdD#>ag4Pz;RI`)apsUP@SThaE5`0IlfZ7Q3wIv98{WL`Sg z#-H{Ob+HAezkEdx9%g#-Bk}83xYOB1_q{%|q~G-l8!OA?3kBlJ8U;7_UJW2Q9Bkjb zMO;qf+sTnwU9%1`mCaCkiN)DDa;n0~$S@9BMA%YfB5$MSTr9@M`YKvMvp5h2KflK#+RI_8My-65!&Lc^stfl* jbrx*33jQZp9?{M}buspHy77bG00000NkvXXu0mjfIZY%; diff --git a/src/main/resources/assets/bloodmagic/textures/items/information.png b/src/main/resources/assets/bloodmagic/textures/items/information.png deleted file mode 100644 index 934511d225e0b6b7fe0ff630d0b70dba85ce6b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 648 zcmV;30(bq1P)VGd000McNliru-~-D5h%}_)u^I$C&H(vfN+LLp=@ZrH5XM zy%ZG)>1<;%DC`G|bhgb5Q9&XyP)AKR=5p2?-kA02Attn6^wN3#ob&md&-Z&i!2iZ& zyMP(x0g%fDt;tbT-&IL$vzoEBC1P}aFP>ewgT9ke^0u9#q{l;fj-*n9>S`H+D^g6b zUm+Q|NbSctJRgc6>Abze*S!h_cWCn_I zAP5$!{W3*OTr=*EJi_|^PDal0kaIkif)D=+RS^WiLhonCNf0b_;?NN)oM^L}Ve2>J z8jfO2a=2JLJN1H|_y*~o>lXF)_E6z~0sEzrEA0G2Y&C&+d=37wmk0#LnL=W%q6VXn zA0Y5LjPIEYJYGKlfXO?^WU>%Nv7|T;oWFU8GbZ8()Nlj2>E@cM*00J3FL_t(I%cYZFOH@%5 z#ee(WQ5i#_VX8?hr6$T!NX;zCCNP}9iII%Lf*zyyzC!Q41bv8JtVS>-MSGCKn#h`h z%Bu~7R%#P8{+oNx?!gqziHbJthjZ3GYp=7{IijlkPgv_0Mg${*NDP1*=l1I5=1Tn) zFGyfSu-<}o3p{!eiBanJ;e46fgs&%&)hiegEWHCP7;9x+)*_)i!12K1Nc@M2}SI;PVVQlb8Bx8^7OX^xZPgKDdQvFgEG()gRaS zoJ(>%%1|5Bo`K+xHC zMQxu276iPz;(5yA_n=N?vq)ux!9hz7@9LwdtVIEmsbSfqpmCp%qx*|lSnzNcgIaf> zoQES0TWjO=^yCDfc26H;lfSVsSP|EZZysl=So5C2adHg3KO+@8cW}IEQ2}0kJPSZW zO=P9Bs-mj2pFFQCYC5>k7}A^9PU|Wbk6zMab#2w^xJjqtX26%FDB2I;B#vUI zgoaLq(oI1`9V}`Q6D5d>H=)#MGsM^Dbnsriw@D`d+jIUe=Wq^>s47o^^?$*(ENrW+ zT(vIV1TN`~BLI#uelEa!oaHw^SLIbW>=*i>eX2z68>$!TMe7???tl+NL%j5fyzp^V zdVpJa-~&6@1@b^kcQ*wf{3y~kRZ^}lCxTOD2db)!0Ih?Ad`={Y0rkKSpdVNP)v}4klBv245Wb&&J6R64;{ddG&7$z|KHbUEbdd{85D55NQpu-}G@m{KVBamx6ixR&m=azS^Y0mLVTb_0cO7+OErx= b^*jFqMtHYOdpp2O00000NkvXXu0mjf_+jKq diff --git a/src/main/resources/assets/bloodmagic/textures/items/selfSacrificePlate.png b/src/main/resources/assets/bloodmagic/textures/items/selfSacrificePlate.png deleted file mode 100644 index 098aca58bba630f92802ba9469539dee0d1ed10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmV+b0{{JqP)FdzGvIP=uN)i-E+>p_dEA{CW(Iu@6W`%=P~b1 zq-W;MO%Q`_90LfWD2-)shk0pnQDU`FNE6ecmlBWf8_E@RrS(+e7x1c5p_C%I;@c7{ zz)wi?1gPhvcat7PmT$a-%9t^L>gi*we8M$~fU*GL=HogTQ zCvjs&7)1=P#!U6V9e3AuwVZVC1iq$m?Z5wxe;aq3`0gRCl%*d40000 CkKUO8 diff --git a/src/main/resources/assets/bloodmagic/textures/items/set_will_types.png b/src/main/resources/assets/bloodmagic/textures/items/set_will_types.png deleted file mode 100644 index b50ff47d5d4552afa94854843975923b59593eb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 593 zcmV-X0VGd000McNliru-~966G0rsf76eklEnJe;z6r!l1glY(Q0EbB|WI1msUv9vItU&AO(@$ym%5k zD4v9ZM0?4t;7LIjtZM>|2TQ5FwWLM-h?*5zw$e@1j;DmsWJNE&%M8Q(-v2Rg1b?A{ z=vgiV{BkC5i1Eo3|D;6xqP*K5m(^#MgG|EvRZt-Wa>e?R(?QPQPWXJtCBSrz;n$ zAGXFoRbz5&beP=IJ0d+NC=|XirzLGaSlt94K7J;jFYx%uGc;{VY>sM|K$H`h=65X1 fLer)M|5LvKJj=Di-X(BZ00000NkvXXu0mjfx@ipn diff --git a/src/main/resources/assets/bloodmagic/textures/misc/beam2.png b/src/main/resources/assets/bloodmagic/textures/misc/beam2.png deleted file mode 100644 index aa338d92659bf9f77ef2208fa8d8d55b80445326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487 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 b?7GUookLqb^un4;00000NkvXXu0mjfUmeC4 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T2.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T2.png deleted file mode 100644 index 896d122dd03cae1575517661f466bf0cb5458f09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37659 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%0D4{0Ba_Nk){u0l)a#1vlo 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T5.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T5.png deleted file mode 100644 index ee7da23f0f16828095a62a4c3f95505b1a72fbd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63113 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 z 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

GaoMAJ-$L-JVQ3!%nA#PR^O<B~~^;uOWRi&!6 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%0Ac{tsfN~(qVbD?z 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 KMNUMnLSTX(WuHX= diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T6.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/T6.png deleted file mode 100644 index 09382a54e1531f31a13d092ac9ae869a548997fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72385 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/demons/Ring1.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/demons/Ring1.png deleted file mode 100644 index 8c4f9c8744ff60beb66262f67b60923f85b82569..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21567 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/AnimalGrowth.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/AnimalGrowth.png deleted file mode 100644 index 4923dcc77cc8ca7ba13e0cb28d295df214728f2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38609 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 K=Q_uu7yb`-P4a>O diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/BeatingAnvil.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/BeatingAnvil.png deleted file mode 100644 index 4f33c6517a0bd772fa08e06745e5fc7c6c2446c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57210 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 Xb0@y7NXqTn2LIqa2WP6xJY)V3#+H|6 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Binding.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Binding.png deleted file mode 100644 index f9491698ef0565ec7e81ab57067ce346a29584b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91100 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%0A^D-h(#PkA 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Containment.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Containment.png deleted file mode 100644 index ead4ad6b166a4352b34506f2121584ceb283978f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38720 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Convocation.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Convocation.png deleted file mode 100644 index c2283d2e8f026f7a42dd1016ccafe84489c90e5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99654 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

uQYECg*sb)nDi_XF_ znkTs;nJq(h!5umH{w`9PCgSpBQWrH?Cf*6Yf7bPV3!?iJEOVES?8#UNYQ(j2sI^%T zXl8{JC&M?a94DGg)LI!;GO9LH&tKhcmBFQTaE=Nr{7j0(w#%UMgTCW*ds&j|m0mbm zNKsI&N5mJ=&VI}xIXp@opJpJ%F-MWI11hTe;6EIed-sUW-MQoYlOC{U$Z58jvL&^Q zuT!_#+1Htu6Gr3$e)9z5)oeVmWHpk2qltB>kQFqt?MXk6cyPNM3xOCcN{ zjmJ6jVaj7t?Z`r8q8l5Lk;s@|e1U;q^a=+zlgba5K5WsRf4@Z=ZFsi$1ZUY4qC2P^ z2|$z00L{?*z%}a`*EA@v$#Vo%&UK?;%Jhe>I*Il;-#Ww3!BijJ1hU7Y1D|4l$ zXH%wUPi>XCgJX&uI*fTD^E{60x?tD+0N%#+a1`iWPs@UoOi2i3q%~42mF{!B}7P zxGvJ%(GpYCgR)LjUIzgJ4e+}q1@e7L&+=*ALE2L{<=o6dFwyNW`P*sow6=`u4OGDa zLjSB$;r$dg5~63F3U1d8AdFs*1nyyCknjj$NaP#AHLdqt^Aw22AvGL`rZTnG<)xVp z5tWHLf@DfXGF!Qmrk@z4&dZ``aaJ@7MG;*(rZF+i$wHo+aKH32$jEiuhWUw0bDoO2 z4Wb2>$tguEb0KmuD16{nnUsd`RNa6|+Tj7LTf2Ious7c2Jel$w<#ddaoiR{-6ga)4 z@F}}F8AWyA`ZBf={_f6%oG4g?7{iyYkk3)NDOLq9o7-HCHi@;Q>5V@57HnAv&=79 zzwdZ)Z;3IzU%QQ7Dhkdn$x(3TEI0yTXm)EUJSn_wnDDmwK8xiSJE35M3 zoZW4kI%a3n0t@o9ot;D7U67Iuggw);HpL)mfSf{Xe*DD zu|;)sQRLPSXhDTq<#gMId^M{wnRBT^mZshHLnBU-Sh*$8EQ~o@qo~}Hu1wX5w|yRq z5Ft5og4j>P#Pm7S7i_z7D&6ho%&9>p8y1G;crKOe0$# zV;apfJ}E7V$x_ASHmIX-Gw6R^FuQILASQ!50w75bEYr4~p;(Za?=$GP#4_{Cp{ZD= zJ7__Qt-)h1nQi9-E0=k@%~@c#aeRbmsBYlDb9MlAr~~a_C=AVxABS?m@TC;7?}~=8 z(4Xjl749@x(8rL(T_c(8)FYK($M=&ciuy4$8Je-o;#hSdtJAVUr{#T>$=p-!)STC0 zV8@b5n1C({fHQZWTMiKhmO? zNd)qXNsBrqS*wLE4_*_4G(2;FfuR4tpoVj;$%kbn+B51{Awda-2;(6nTO|z)sVS1u z;D;cfY0o2bL3XG0tky&XpYXCAwyk#Ak~j)N+bpHOdpFZwV z|Ins>cDVTKuLm&Y>iHS`I*6y!5FI6X(WC_x%^I1g7&~>*tZQV0$Vduh%Y&68HBb@) zx1Mp9^^$>3Ea0{anPwWi&+r~Ub#=~rN#YNjsEQ5IcYu}1mbfwd^tgVnAGzqoCBy?$ zhB3}Z5GR=c{7K5dukB03ntUimxTi$pXzuQQWl*j^2=)W!KqD|9q#x7n%P%@q0EWFe zYj|MFS%nYb9#pO1A&{lE%xn?HQd%_9MDJUl46iF%Cf!=Cw5)6Rl(ZHIs+b;eO%7DU z1x!V#W_*Kckjx-W&%L3JHBm>EpagZ)BqbCQ7^xYF=FnakmoY0w}cEHm~=Ylzdh{|a z<53)U8Nxi*&3?ofEt=^iG_68n@(XAOp0|C;4(PeNdKBuF#s+zhP@k00sRF;jsj?W; zS`N-b*KwRRs^%R8# zUX;iJH)^|W@|=}J60oR4_%>sQXV#{EM$_t1DT!z7AYd}Mnxv@^QIz;yD>9@6&=0LJ zzt*cl1{Q#&564_N55u_Y2Zj-wP;%VKBvhy6qXh44sKFP%K7AT4FyBnG)Qx(yOQ09k zJs6KBHucDcyzlqoxSx#TkZP^g6F#MlzEpZ9jMgZLrY*~spXjDnYidI#dQZwuNc48q3MJ0a%#=tZ

iv`bDw`OfEyba10- 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 KMNUMnLSTY(zDvIV diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Crusher.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Crusher.png deleted file mode 100644 index 67d0e505d21f85cfd961a339a22ae7e9dc32810d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78450 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
  • aoX)7NNJkF1%@9d(%USMyxvPwTTT_ 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

    w#!QhC_bmB>$ZYFt*z4_?;EUb~5eirimoQt66e& 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 ohF~ulbZ0B}Ff#-T(jq07*qoM6N<$f=yM8x&QzG diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Evaporation.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Evaporation.png deleted file mode 100644 index 041ace21dad4a8495a4eb6c64fdf350c9a9c0356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70654 zcmV(>K-j;DP)Hn>13U#fatS3$?W4LZjcJ6*paVK!(PmKLa2$t04Rzr1aKkx;a_Z*TOy_n6 z=Tltfvsw)@P#XABo;<{yGoR1l1n-BIbJ}I#Jnu&s00*_hWWaz7r0BVsR1T-fFe07L zEk{+F3^JR}F~#5%hrwOXYMyCMm>*+C=ph)Iiiz*JBfniUn3PeIpHpSzM>9AGS8ayA%`qOn(4exn|x%#V!|m#dEVC}{_ibpe%N;fvFe2V zct^ohhBW=ui%1iqG^!Lsln#X{X0#gjAx%H$X~LZ(&HLEU)r6sjt}+CZ4wWAUp6#$Z zDAxnEXoRrgFQinMZ`1SnYyxmJHK>Ra4MMkDNbrSOzvm;F_ZhzE?zdP zRNl&|I^cC>&BouzGqd>US{*^hF%wL6p^Fk(N=$Vj*(gu=TDlX^1XEc^P4ctGGXJ9t zqBG&6Gx(a5ZwZwW&LeIa;*X*ZlTypC=8Z&e2`Dw$x$t6>Qf|?RkHS>qqpl4ohEP=tfhN2qU{!QB z<$DOj+#H{Gh49g*g`n1(1GqXQk?KPK?*h|P)}QFq&@yUjG^Gl%HKS{>pBQ1`Ia^S~ z6gQLp9m4uf{cr1}xe}G-Z z&^Hj3%W76gd3ovTRAop?qp9?BQrL8vdMK3JUv}M*L(`^8$d?+^o{{e@dC_2qE^v#% z59f(LPbQ(Ukh&_T9HNU<@?<+H0Io6xz-eqUb`5f0F*e;~C?+GTgdv(ldPw^6=wzrC z#x7wP+C#&2$9R}Rr~rU);Tdd#TU-1VW3RhU`89^*pLLL6Qz<#`CX%hzc{a}09MZzO zOKYNZ8Bd1FXD|QkmDV5~WP6Nf>$*%*@lATRL`&q1+MlOJk{6ToX3JZHIsdpu5wFW zum0;4N15=tsY`04zIm;vvZQ*3K3TK+r3s0;BtBy?#m(wr%-jp9mG;g%@UZBdbRL)6)AQK`PPj`y3nf+I8GS1{mWdzAM(0qh~^0YXT_q%-i>sH0O z3D0np{QTicGRCo~Mw*OqV~w<`{6lwISAKofyI75-vEHNs^6oo3OdHjgrE5ppb6A(_ zS?-`|f$@UJ0&}-PI&<2SbmQ)`tioKBx%*PQ@4_5|ZC6$6?MsZ+2-><$1kEAtwutrD z41i>u7BF@xVw_9pvsiOS@p|~a^3kO7wQWTgEShj1W9DTHE{dxz%+1NTQ`MRj!;a+@ z3*&!$InuryvyZsGF-D5%)JpS;o0=`v%~(P&X0MxXQKS2!%=X2}7;MVZHKpoTHX5b5 zHpkdJVr@hLF1m`jHnWDhS*4BXE<16orQ}*uoSl0qn}jdADl^;PNB-^)STB*7n@!o7 zi48Bs+?wzXY_uf_;4cGGfqvKh>bFEsv>+pxgxpzOTl$_JJ8bpEe zrC+ts`lZ#pX<};-)Y`}!MoYJh9##7-Te%ckBzP1n zRPi6Hc97#bu0sKo!whOK6y>5LrL_NbHR%h2lAP3g59k^+paUj$K7R9>bU&ie>U8$v zKR4b(=yPZN+s=z_h4bs5yW79@TAY7-TK@BOxBLA3_<3)edAc8#0(OU88t@Uc0_g;(h_7dl>d+QFlA9(jUGT8>PZ%tJLDWwoQQlqe(---beGSN;n&+7^wuP`cnQxso3qH1Dbk=OW`}*PYQ!kp>zxUpceKTHV<=2r; zo8^za{^K3emKO0F6WGpH(5`b~R%O-+=xUoM`l<*D{M?!qtS}c)AuDKpc6dHf01&3< zRgh;oSK#YhYHRy5ul)KDoUL~&`0x~5%7@3`{W&-{6oCCfc3rb}x9rFa3(g=qy|`)n4BK~4Ru)Cww-#2KI@odyb`(K4$}1?aqcCzb%_ zEU5Ij_ioPZ!`zBV06zw~u2@@b6uezX$PPF!oe%JHYrc7o9d%X$V(mPC_rKmvKGsLr z%pe8_k-;N?9jc$vXZa4t!Aykn1~|U}&u744AXMyJ{OrIEXwCQp&I^da(ux84rZ@k( zpV*(H>)M>}yWnhf39|G)16qL{(B}8oclhSzb>ET$0sGDE(3(T}_?Ul(W>AZ)Pz+eE z#=FDwg~n@tfbUlsO+0)pBdzc<9|AADbP{fPBs-*`Q?a&5g&l z8?FH6fNaJe+G94*ZDU;u?>lOIO+sFIfy{}zgWSNcAel9-7^p!dqEX5SAcro)>;?pA z7xWIWvjHDR0C8(f$H8lb16nbFqyx~3D`m6J-aG?GvyKPvxj7Tyw!v5+x^u$3Oisvc zGvL-S1D4Ipy1}mds)bfy;&*o@fS(1nhkTbQi;(q?cc2&04EcD_ELCZcw08Da5n5PI6+LMUhMbkVctb@hX zCoX6UutNjz1uQ1203u2-NhnGQhjee}fM#@qF2mv0;1kA}p*ply3a^jrDl&sKPGF)L zz5(%w??4W+?pmlU%a$s+kHRGZ>x8h}0|dbLAp$=nb7z|(rl|q35|Cp<%Q+$j3oXR~ zp9yeD&|*i2S{r?#M4gEfSjm6@CIRHF7r^++0*GgCfD2%4`F2QXE&-B|kK;%MK#}V+ z2_zCA=!#0BxgrWpda5HL*@5;=rWVTlqEK+PcH zEty;ZX9G`gso?a5bE&zsX9X_}86(xHr0CGD7 z3AjJPd&w)F&`Xp6s!Kr0bv~Ns%Ykr<`1WmmwXLgM0P7vCQ$~$kYADGVYLI|;!Gx&+ zC73G^W>iSj!Ag3g2Dk*!h=hv6&rd1MOAJWW!Aiz3qYF%~X~aPx7*8Zi=$o=cRZzmw z;$0|u{;_s$xlJg0f&;@?T6zC?=^i62lFXcWdV*moEv0=)M()3sl zF<5s@C1(SOfr&E0lruXSc^iR|15@6y0R#|tJT16FbbcG5!t5m`8A~Pw@Fu8Sn3WV6 z{q^ObC}FN495Tk&*9jq?JzTt`n+QsD5K2tE#Nd+Qa0zKMIEM>zK}{Z3f|l+j*d`g| zzNtX~xq(_XPLO(EIYrwi`8W%>aLgp{hXI%0U2F-Q@ioJA<4ba7FINNW&Mx&$RA_|U6&m*GOo1S3TxBwp>!Bg~QmdsJY- zB)NjhAtvNBfH){a45~=JQV3zzkgJD696}05vM&3xb%7=>X9|lz%DO`1r~d#ifgoT^ z8mVCW_2HX&*yj0=b- zAcSbVooOK3Py>mq$T26R_YkF!F-l0SkbSO^(I6Dkn!4oJ(oBRhR}pNnP@`c|T(D8g z0ZVhhf-HC2^KP39c4&}&tES9;(PK%nHeB@3kna&<0O^`iU7jZ8P?PFHCdbM3rK%y% z=Xr9ughEtHIUu!C3^|(e6+(B3$az3AEFcbRd`ONpb(i}pD@CTkCWKQOgty?0U<+BI zZWm^Tv^Gnw&=6a1q(Js)gNzhK{B@H#+aLnbP9ddm$a#sn946}0-%5l2yJq>h)LN*LS7*Rv4I6bo3s#Sliosd5^4|$DUdBd5HgVOPtroHVZ;I~H(((= zZOy2a5TU{nF`T=@OPX_;vEz+>u(=cBtHQc8{n7<)8wPCO;vv~SJ6ha{iG4k{~ zOL>{p5R1QBP0kZSkgDp^TJsKhI{81zi@fIBMU~D1`GPR=k83xvFVf;-#C1%2K7v^5 zpCb|Ru!jmcxhN5&JtB)B3>hKuJ_ivPd$UU0CXFHUDve5gKleFFj(Kez{MPJqf_y;) zqWE=rn{2X$A4m8ZxfrPniVEG+k4z3#BxH9HW|uw%B19nt^1{cONq5l{Bw|q{VoDT= zP=koLAS7KPXCO6YUJn+?3sNEUHjLtxPYGd&6qERvlS_l3h(r*Ev7USzhVw0fOg^OH zcHd>ldfz5}3dkelP)NzdshJo-jL4+Oo`)zRQV_uV+BbNt?ny?pXq;JP}Q_;xC zK}IZuA`>GMA|VKhT7xK~$ftyYScwf{Bu#mrJ+!S11#!d?Vj6KoUKF9|;w04xLQl*g zQaDl@VK|M3Mk6P|3~9pUKjb6fhfK2||6ufMF$^woND+SXG>8~;@uJRCLW=e)OCk>+ zgwW|7>1Sl}J|bTzI`K`cFE6Tbxx>WhFfmdWBbQ@T7v-ynUq+)=Bs(9SJxDz>P{h3x zLUKgZ7(p^O$52p?Uad{(Q%sE11Z%|H8d7n|7fy}#ITn-cx&}RZ?m^$=_!wgu4)?_; zBGU=8U<73EKIpv+s|(_geHt{0Y0$}o?KmSLJ@%{!=|{*zOUv5M(-30xe74r+A}1F? z(SaOQ8?bK7>2N6u$P z0^&v&Y0x76~6nn7aDDP9VaFUCWA`wkMa?t@o zY?>%yQyNG_f&@vrcjWB}S0;fgoLD z6QrQ>Hc3GQvd=AZSG~aNK8_s+j zAOih>nh~3T2sD`I6z#ov9D?NWxZ)6W8j(B*)IkNLAXRz>ooD9}WPcYi=;keAIStu+0! zyBc{z)9a~lGvayceOanDJx1Y3zA~pWkorhD`hJ9ij`S~7AWpXa-Do9EK{UR{JW0}# zbW}R>KDxI%BGR*OtsP0%Z6yd6BtiC2la5U}XQ%H*ms4svJ4zi1NsapMIyT&~rLC(` zoC}Tkn&kC}XpWKda1NKC7%_ult)%qBT2oNYg{?0)QqcGJn|#XXw2@#=_)OAjq@-`s z+2*dY@Rx~HN+PMuZ>prCRoLoC;>3zsL6Z?0slt{w)s&(G=V;0?+08~m(x7XW>i6`wcBbWB$NS+SjOhce#_o%&ze*lm%*PvUi1 zbOq&CrubqQ(G>=Iih^Jul+8KUl~hQub}xsRqA+0}WztZT8I>=VkrYHDeUU0Dkt%KW z-paCKr1R{QKGtJMpahlZ_6knQfG_kGgYp^HD z?^7kF3w|z-SvCw5m%IIZ8-_ApfW$c4%VM2T28yuYks?m;?dv@p&R+!6W|c_~1Oq9E z=2Wxy>8*;Kvc zZj!n#b}9Quv(us3P49#7G)9aZhxcJgUN){gj_;S1qwMdA!k(WWkLx5M#cs~Qh%B>2 zXfY$x&Spk`b{Ibu6qaEmB~=oPr@S!h%B5JVh~`Z@X=A5OAhU@kx!SpyX`P-yaWIBW z;%8+T=+zOwhjDU@p}DHDX{p`IrZ@=Gr0Z=KeY)fP*$*H|EL)x^yNk~AE!|-( zt0>!d(dB_p1;IctQLXp1!&G3_mR0Yx6}HsMGIsAvt8TyaeYuq67AIrcN~$1PRs6IJ zD7BT@9NM2sf=N86WTxF+ZLuC04bQ(F5t;lrPb;+DOlawIjS_1#f>l~63(IQ1J3O1To`oi~*$l5p8OMR<(f&<@$a(IxgLcq_Cf1hgw#{>< z>AKQp*r~LYR?I4meOXkaqpQxKv3;kM+2x~Gt0vmhPRp>lvqbyzd8k%eeOsc%aGLF{ zn@*d>4BG=!j3{FMPg5F~2-~_-f8}3ox7Xcr7;aMRWc~Y2o@|5ZBX)dRqE(v0YV9o1 z3M|h4dvA$WY1&!gM~T)xnmXHP6HRFw?KI0U|IvRB4q(a6%V-*H-dlQ{vpds|!F*>z z+hS7S7CrA@){Qax%<-eGw2wu@#*GMUwKx%@fFJFQB=VyPPrExU)7IXwjUqHr&7Gyu z(w1o}Ez|a&O<*E03nOOdXge*_R+`Wg~dtxM;p%7wDcO+C)(sD zv}B!7EG+r+Y2#$$2TNJ{(Z<${+Zb%6jr(B27}s2`w!`|sVkiIN5u;Wh-jn`n+vfJ9 z2`$m8+eDjbg*Nwg7TQdkXv;E~4-PsT8@RHmlO}O%i&>T*Y?vMFNFA?pb)2=g=hdDx zjl1w&%4o95HBt>GW-8sVL;P~VZQ+tL%wqseXf1~%&n7T#H(l~deZqFw@}RA5m%y?- zQ@X?S2D`5?;9%$Zvd5#@?eRFzlQz>H&F=RwOcC7LkJ`B`Of`q>(aR%!pvD}Dx{Y5T}+Tb3cP z@S`%%5o|JXr-|G2wvD!hwei9tLK{a8v@JS4ZR^bQ35|!mf3^PzEi}0VnM}LR9fURv z9%vJ+KdZ}lld(nWx`dUuvQb*Zu0mTcTevRwFA+v)LbK)4m_ukou1U-_X@Uujg$b5v ztGq)@N{N>EE-Em-gqC3}%#LnC6I!NiIV-Kw{&b^>%N*i5bZ`^crT;%wyZ-NmZ;KlO zpF0pYp5Idp9%vfFi17e#IqW@xi2#!$)QDSzGmV9D`_}|B&Qff({V)agbA*{-L~H`~ zbB38=Ryeb;0AWCwQYk#fXPF_$0!0O=+MAovj`UYwL$7`7hcy3dkiSLlfL9W z)A&%xAFB}ABGj}1bIE2q3-4_Ms$AEYYSup0jPn&B zHMcI;_}BIZ1LEZ-Fk+$2#EpgZb~|XtqnVs6tdE0*2hxt2eSHtzHlPn378qjDK|5fV zfdvZ9JQbYh<70~9g$T(}X#bFv{W#_mKxHt>wLW1$v$%#xtq``rk}#|6o?qgcXB@#q zsOe`gLW?0xEbF>{AFsH{d0HXAB6=JR709@9M1*1C4rC$Y3J^t%Cf8iES*`&V)$fcy z7`PLcr4?!>qL5+dw}lvfc6(RbiL+xSDlq}aWV5hPTVW)CeYdCpgbfpmODyOjfEQL2 z`tyO26{ zmWVK~Tx0Kdj?*RA~s#ZVdwP$td8jgj9X^-~#Q1f9T-0LM1^-jM)f2t!;0WkgRf zl44xbVus40X+g` zk2@p6E*S`gLxKn#(?Z&|JpYOHRl+9@QN!VH5`JDhnhcEj8J!~ zW7~QLTB=DgtqGLN2&a7HpW}@OyTa2^iSrA;z9b*S;FkwmWi0^g4Q1X~ z9r0gVIuSXjTYAK|9#bF!Opi*`dpU_v;G;zyeLOn6-GIjpA*T3fW;KKm`Ez!(tP{BP zsH(qyeLK!X4W!9tXbC7#x>$5W-w!+t9}Q2-MURHZaSvoJVpwV@#Km#zQ9ML!+iNtU zecI6R;wEref&GIQFSMMqtF}j6mbD8%yjUX6fj+Bx0B27>jCnwYnuvM*b{uD71@<>i zr(-Q8aPJY@VeZ_3za1HCj!i@x>e8d?c5k?RTL8+AcgH&5Z{p#&U1E_&EV|*I<=+i5;B^vI)OUV28W{98BuN21| zn@Pl!^GVFqd&5lRbyRH#HB64#F#%QcwmI&nVRn>;_@N~7^BuEeYIvTfAzux%qc|4g z7?v`ypBD-78jK=GI7Tuu)DJ9<0<=*OG3G-m-KCtxTfQ7+?X|5{4P!4NG5U(&cijur zQO?*4@s$y)V@50>vJ?pY`XaK_u{!34?e|+N{i2rkYQN_ZI0HqF-EcN!EMin@S*i9} zDFW2&_;ggDg(YAgmULNWn;}iWm>0ER)KCn^bm2EMKrfv<8Kroh<(i>lE@+GDsae3j=wxr$xOY)2q_X2^dKHF zLlQ#uFDbhGv^3<_JhKk!I^*K@mlpjNsk7A^KH}`mUN&UMYcY#OUxH_sTP<+W7Ff-i( zeIwYNZ-k{E8<~IDh{r~4rOUDaU5o176Xt6p%2HeiD@%(hu~4;@?)WoU+L9eh|I@VW zdl#S%ltS&@0IGKMqzbctJB1rIw(eOi)xNC|CUqTZyH~B9!SJ zY7r{;gQ-2a5~*?H7T0i8mbzLR8OKo68aHtq+jvHaYd7)yyA>Omd1RzAl0ZEGkJGh; z(ou6$UodeO-$p(|v14Cw-ZmLiBXx7#W5lMagBH)CQp(~g73%_YimqmtL1qHlvRb0X8n6_LO4`v)fxfa(ouI7}=IN~8i zTuT>HsDH^LRHEzDR9YtX#JEO|gl<NsK(RmvEebTi`5{syWm)q5U)Lu}c9gU|vkUCvp)w8aIDPm^ zr7WpaQyR^Y8JhrMsIb#q>4FMV2p3etjJ{GSv2>a$bt+qxGB2fjRWhbitCV-I3hmdP z{%%`J*PZ%CyI3iG)~!97TFg#ur+pu884`7zM7nKT98?-rU)uhvDV>^5&4c{@>B-yJ zZoMhBBDW`Mjqq-l{f(tGGPmZ8%h1bC?O#pupv>H;{6!@PT~|UhT#VAwk;ZLQDOD;y zo+_nA3z<$$rEaIC(^Ax{I(35@rPev6!@&+pJ2iv4ot8mGq?AG=gFd8K_pQC1@}S%9 zDc3>OQx19^_JW<}++v<$9xb_Vz>cJ`Q8nt=^GE8md*q#K}0DL5Y@L#MQyHH5DQ1#X`#GZ7?!BvUl*?a^u;6R8#|?4Asac44Y##|4T!|pmca>rGNKOeWN4j)UL)A_(Mcf z#jevF7uK#C9VVJfJp43OI+qwbjZT|2VS`v{;b`+jMe`i}6{`i5N=?j(iWArKQVUV$ za`I7asd(pbc^j2-2Q7bE8s5a`tF9X1CB%tXk+W=|=6a?sd30x#vK1mvI^N z!9(ex)8131IrpB(S9~*FL<{HM6Nw0s^-Zj1=InLxc9`hp@KayFIMUVD%K0KJioI#u zxRHfymh+j5#8Si<@F`_x9UspXOO7mJ0F1_1!d7jT7l~3af@vlxcB(q-mn92Fm0a0Y zicLlp=R7h+5XzA;<=_yqVYuDC_rQ;CTBq)k=Dk8hL0y9D^(vIR5k9{!!Lzmo4sThAO zHX0u;F;BE^EyJgr^WR)<_-s5*wfTyM_#Ls}A+#ex9Q(D3ca<4?yN9$qZ#$Q&ZN@l)Qq;u+V4&-%;*7XvT@0vt8U-iCD6nRq*9elq zqZhQ=QOl&&b|7a^>CB3|wo2lP3D6s~lvkSteU`8;zG9Uqyb-Oo+bsC#Nf%4=2b){c z2;lwDS)$uiadSCO+Z~(RludJAFSJJNGN;&kGA53&v0{8OzkO#m?|4OZyn*|M?Q_s} z8Mw=g84+pI&AYMUmSkSUrpTiFW&LaY3h!@Hx$u$M72|!jqE{bs#v5+tF>8V zHBhnddfHP}YStQ~@fa$OaG5h4co8G$V@#}lg12NV=0#A@R2(V>@I*J-Ru)m)j$2Th z1@yE{w06uA0pN12*wE^m^;^{5cTRy=dz9gB-j`=OvWsFWC|+pS^gxWI+EEOxTlRV<33 zV_VQpH*))G1Pd&4vBuam(Y_ihj!^?w#es@=r@ecyr!KiCyCy2$xL7K-ig)$fsGwmk z@`N>QY*^i|5~0KW%t&2b$HQ}t_j2H2v;&V#-$PCR78DP>yXiANl$ChItbRy)$3?t< z#2cYMx;)*lNlLBDsH+uwsxI3wfVynN=CXdZr=r%{u=7i^)@ZhulNx#^15`1?qBy3P z6ImyUtJsm=O|r&Y0I3J4UM`ugIyVs}vt2wig3eT$0gTrog%-}YtW zO2=4A1w@5#E;d^*I(&LKFUvU2f zb)0j@M)5FN#d8_m+?({;4HLHBrQw-7ZdXbu*@nwprtIf}&QYv5Siy^wN4zYmxN=c^ zDJ6Sk6sLMh*2eQJTrTmBbBVHJuUL?Sgq&F_?lvn81NabzKvU>ggw}?k;au@9x$Be^uWh zT>m7$Eb6nV;G^c6$U}2GM%?vpIy`siui|I@9Y*_<+zxC+7+EqX?y+TU92(Rt2_gKs#mN$qs&E-RdT4|a(*fRGYRiY1Bc zIAutRCki2MAcB%@#R)c_NN!X@oPr<h{3DonforqeH zi?aEy#42|-)1KMN>LZZizsT><-1Rnzx*dodc-U{{QM~$J$C+-=T6oxE-&LoM*QMhj zx)|jyy2m+)$0=sp+8Be_bLNhx1C!Y?s`gHqy2+A3+TXL>V`<|vLdB1{^lkWkTkd;@ z)=r2X4S3@zR9yK?tFco?zhPL=3y^>=?}`hup;z zE|!WBkL`EGF)HRbbn)=qroRK{d{23Q_uq9F-J;ld+HdV~4k8;fWql9NhbAs)ZnR^a zQ}vBt<=EqA4PWnBHMHeMmmgvE(0fnoy>a$#3$1bRoNh=u3ko2+xB zc~yJ`yu<*Y=Ieb}WL{NIuK*YsfNxoxNiJT(8UkE5z$=4evR0g0YiP?8fbQcmPu6yA z4eGur!R5lGEYqY);O3aR{32e8Em7sS+~s$*OHX+1p76R@aX9SPd%I;SvD>c+_MY+D zwMV~8N*xa|WK>^F@|g1Kax{nkj-d1*&^6CDe2g$TXTHxc>G9A6@nY_=HY(P%d(EZ9 z;<)`5i=tU|Y|CqTkFYlzQQv~mM73Lg?|We>Z5RlF^zyMJMzEHn2EJ%-pv%oHE`f*J zOBA%Wb~s@sh=yG%9_)*Y$o2%M36VlD%&rt~?MsYk|2e%(6A}eu*tz1_zRVGmJ@IK` zBoj<_&V#q7y4=_oK3RrrV0YrC%5i&nIaJw@^Y?_e2fs`PkBIkl>Jjff`K5AXyef=M zf61sB4lAbY=4OnQ?~y2vl=pYPq^BMGsd7v7JnlSw4Epg38L4*5uPZP2Slf5OO%+31 zZem}qZMWqBR7z{RJW9U-3inwcZuzBLEHBAGCIFB6fpO8MJYTO`2gu+80-IA&^PJ~v zyNZxAhJ-9wE@E?@tExI72NRtVI7U~**=*)B&XOHO!qbAYpu4EuYVg)1H>&*3EUsK! zR>eZsotSKlhZBqEfG!Xp39l5HRiRBm@92=?OHY1P&A_*ew|nleVgQp8MOACXNA~M0 z-`0MV!SBi#e=|u@9&=ox$YaiHN;j$_y>~pKZeRJ$?^*XT95rJl`xth6hoPKJFpXMu$>7FkrhVxrYM&c2^km`qn_ z!QslH*N&M}T4f}^ooD6S)^g%p;-SA8m@%Xxre(j;%L9kR;vbzc6TpH9%-uYPVm9-H zD0%8(skz7E<1-+DBkJ~gD45#DKtNEQrNpUscZA&_rt-oq);2;pvv4w-#MT`j-A%3Q zbrn^Y>_quJ?@r_d>@gx_k!fulXjVQ2=Os#BWZLY??I5C9O8_oL4dbV2TUYi17cX{Q zA-PDLiEosMJI{6{NGVdtWG4zMlM$J_{JOBlK+BD`5P20iTp1o+c@xEVu5Xz%KaO8~Do~TjikqMt0&LH(0?N$P`c-Pn}P& z1#fch!i_}9+6h1qlYiuSQ!augc{CXacZXgZ_uZih1c4dn?$#*VrpIYTAV!FA*zzQL z7((^{SvohB(@M+T8s%<{hfQMRh=Wt*v5%j)^I{%u^zQ@EZ8CowjI32Y#s=)YDM#74 z07dYNP6BP7=)Iu`h_s&P*26O|<=|G5jshs!1h~|CmOF=trt|A11dXGJ)>5?R5F*ib zyBE`kZ+5-I8Wpxn~0J73qJt{gBD0CibT%Q7p6Cd&^J%_`9V z)SSB{jFhcttI=(pVi zRljvIhot-%DA-!-ymum@{^Yy@T$vBfPOx(da%Ma8&7QI|JbTpNgPCUKE?8@_o7v5# z@o9B(W&8E(*Prisp5r|GlmK9IPM9q~ljS*@+3ylvL~U8+IzPy@Jryyma&3VK#IQK# z9;zE_RVX2}1er^Wo%_zi!9{j{`ip1&-9JUS5m!#p+q_oji;H8J=zLS|8aH5Vlrc>_ z>>*gL+}g@R4eyXB{u{`(STE%qdyO=ujc#pB&WAppH2cT3r>QuzC>eSGOs4-0x zj#GY_bq^sYgbWT4mdaziRo=#l1kf78evZrL-1%BLL5Rp=_IYBt&Ms1^9Mb}P9~|Nt z-7!!wxXQ0yxrj~_pu4I`}+Cp;Kme7KhggOb`^8CwJ$JS9z;HKVM%z^hf2I zRjy4NK>(5n$=*(f*Qkiok)P0&-r zs11id8)gU~kj9t+%m11umJDE2mV;_PVkD|O@RDsZrig@6(zaoYgm_MA$vG7)YfQeR zb;CK5!Ly`=DmT1J7Ug!1Xiy{wdFg(tVg09hJ#iPD^VshZtx#7MxQ+>yZ<$0{4rYT+Z-DXeablcBAWCCN59+O$Bb=N z4zsj*!nwFCnOTExV(;N{(Xgu4V`Ru|Zz&Oz2f0WaH0HEqPy?exCHp8>pKT&Y+m-=kwREZ?FG;`ttfp;YK!40;V7W9_^~{gI6CYS}K93 zRZwu(?jG1rEwG=U`}L%Sk=RqN+*GcTSeb9$#~w2Mmf2^7)q5a%3hnVRyEccN=G{&W znpoPo?lfi$0^xA%O|07nA#6mAOY&a)eS+F2E(Xa-Py{n+yO4a!ds`cfb}4RtB1u$W znSzWlgV|40450wrj=ABMwBY?MM$kFK2E`*R}*wX_3A0lr3$?c@>GN9a#A-%SW%C+){h*^-8ZtYVRU+ z4u)t_MKx%St%+%BpMc}8qw<;P*qeaGd!gsSN~c~kHZ6*FHFho7qhx%VGTOF9;dXb& zW%y&vpbf7Vy>65v=?gqY3=(NxukMn}m@@*RPcdYo>*bQ#-|)5F;yn_sSIHaIL1WwW z1uLz&ctDgbQYO5fRpJRZ`tN^#Ro(gc{8_!{-?!KI&p*C?|MvR&^*xK=w#Cb3rG(cj zfVLBY`nWMEJ_hy?+RS3bONvLppK4(Ud2oxQR?ul@;ev6>wv-maAIDqpQVPd7P5szQ zE5Hg1&i!2WerAQ^ab8;mb@4Wvt#8TvcGJCU9|oNe4rZ3wvm^dZD~_U#~xNy@E-+zQSy`bx&Z7oa`mkNYw19_O1B z;JCH>34JGS-?1QI6kQZ;=*OC7Edbb1h*uVY5mLc0o!&L8&0W}QE_TA2Op+18OEfc-ytv5VY{ zKIHT4S6@#5%wNC0zP^jK%S{XI1sn5eo*BabneRW|K0e;Re*N<0{o_Ob^X12n*Viv! zzQ5Kv^Zn=3$l@)uz@8-=NEuy%z<6pwaGuXv=rc=7ZDu)=f813aAmD?lvkomefn>0N zGkZPYa?5_^HnlJcL7Pr|nU|7}12G{=CcB@AnTr-mF&O(DU&m1=Ab0HRxVUY4$Cl*`zwoseLe4ID&|cfP^^X=}HW0K|42-Q1^1ST5P7|j6B6z=F1d$xVG?{G!F39ZN zsqbg>0{OK-5#Xz7U&>m@Q;L>OR7w$@{qBY7l43iPRHPQ(^*Q_a`3vW1y2MEKREieP zXIE}1fB#yhc@3NGPbY%su!w*I3Fv zvrN-abv7{;FCa;J^#APe3wV$vX@RW{C%{XNC=z`w#4WF5YFV;6bumE%K91^`dO40jY2onEoYO)ZGcZSIq=b~B7EmH-Au;5*p_I6#f@yOQBN3d>+X9&g+rDctAtfyU zoY(dB{q5(^_xixS|NI$3vJinFp0{nGoZ}|;`;Y&8`SJFn3hbv(^=Yi%w4dw$>6H2N z=hynO_n-e_A59jrsW7kY@BG!;**wiGe#;jLVZGgEXUrnPLfd_431evaUE+Je$1HK0 z)|A+^sYS-rLNU``5GT17k^_;)vBm7SJ4Unqe!EEv96dpVZJoU91*nBv@tkUbA<<-< z*M~tsDBD_Sqi!I&8Mk+;_quQ`sO7Dzh1tZtkhHLZ7OWOM`a~wQRtsAZvCJ^f;A~1-sB%EGZB7dX%?y(k))h4< zq%_sShkmzydHeG1TmAb|AGKE?JGoUXQAQCe;}*u@%P9vY$QzdDi%Q0kIcK z8V8VQGrZtFws6qG7+cyr<4t1!FuG3b{vp7We2W(MnQhX|o(M9vg30u>JH*hWT?=L} z%)QYd4~^nzv|j<@fb2$Mi9TA+z3c+Vyk z)WSq~b<^r=;a9yipWnXpaq+d9O}&+`ACaaPqRcVfa$aBP`;Q;>Uwtya)O%RhzV$Kl z>oI12=$lxWShu%cYAlv6E)fFgL( zG{Sq(r~68@A!^|)#;iH#lMhHD=Rj+PIU!2)RJ1UIZhHWQV07@u|7YV&m(y0dF5Ch% z;0OnyNG=(dWC#_L@BGlvlF)Sj*Y&NnyD|28k5Vb)EH`m$_pqP6TD<)O$cTz0&k({$ zLV}lh7AINnwe5Pf>N~$wZhqV$j!0W2mWUxRGm0!`M$sWoa<&O8n>RRTb*;h9c-|HSP_lI) zP{Ds6LNG2x9OB>1eV1mIOWHKI%J;~Hqo>AXH zXF)70C7xPkPo}kZhskp5{IH%@RBCfLjihTlrd!px&TZ|tYEs60DjRd0jr7-pBk3{$ z3qy{xNB_}H+yBY--;w@5bsO~ms?>;I697_NE>2jZ|4+afI8Gp8J#}GO>A7**uyp|L z-J3`6Z_ywv-LSIWhDC8n3SL=?5*)uEOU0I#o=>N&I3(M)(@#(9A3v~F?yy-hlsg11 zD~^Jh zsFC6ad;-E+GsKz6=J?ascd z`A(0cY`W@wERPkvr+Ev(!XMbON6@VKG;f6pyPB?4*sz!59B@fz_obKo8umTAzcG{- z29p}lBvgJVhLy(s1f;{9^09c2bsPGw7oe9q*tBo3t2;F5$8yAU02<)Nto3H|*0luv z1BejBkNKG33%9+L(3mnf(c$Bxo}PX*Yv<>Yp*)^bY?r5Wmu1X`>)!v(&+K3o{B6~os*3@M3z^*#D(BIc6)#FBa(al5I$ znpGCjC^RXFXOOgH*?+XvW@xEyKQWpQPz(sQN zKH3pf3ln>~|F?q(|c!Pbv&+KKp_le=zXJJ}yQv zy?3dw$@kt9@-!ETsl*Uvop7uNBpjrJOOb)?O9xz40~j004BfdNXI9jwP>L&1F#h#C9$NE2vp+$qOMT5$P0znZn=vWM% z@+}gU5?>qnX>f%Jhid%JgjB?_GgjVh5-1G6L!oN1B47$zT%7(zg*BD!mhk7Ji~jls zdIrPsHrq}rGgSzHYkM+cul@NnO0Gm zg0iQ=GiA!v41 z5*LLEwNRn7>6OR6mmztv7G6|vg1@1CV$i;rKv(1P_6CD2nBbX&OT{IwYDjSI0tGFx zm&FHMceqao_m@LV#t;$C^4W+mm?<7#PMn1%l-M^B${oUpW%eW%30q1|iwiB$u!sq$ zN#X;hl-CfAFs4?9nU=NBGaOXf(9qPX6=hgou@UM43f-}i{?DzeTq<&^nZ+KftgSQD zuYDTJjVL8>%V2|h#|BZ53GqpK3GTPBvkKj|L_&M=&@1n-7t~ z*_lunS|}W#5DGhXaIqbnA6?%<@!b(r*!$BqD7Toj-dGCR3);u$?`Xevo-n97-*s31 zBm1~A!gonR3m<4y>UjnlRV~uu?hZ{O2B@ya8K7=)ia6PU zz^>OaL@qS9P?Y0LE9(qRbcRAO;tW7&ODM`J0hLc~DD6WqB#OWg1)zm)snX5EC?pbA z_CR8*1POUkaS&LfRcMYRmQWTdB@{BDp=C>p<3x^JmKjRe)-|EfW&acu;^H_rR2(XA zZeK#tt`DU#WS=GG&g}*5)A(%A{vW0Fs`A6|&GVG&APMt%1A+j#@js?zB5co_E^N=g zC*FAh|KcuY5AhVI2qk9Y3+CpYfjp8k5nEOc&aj_9iUKXOoTI8>%Q(lxN3`R!=Ls|g z^l8IQ_XVdsInSr(4V8)t68)tIW4Kh@X(k@f*@1%5&4*ZxHDtk|hN7r&)1%UVDnJU= zwFW7CJ~cx{G3Hu-jrnY1-U0J?n|dfqOQ$esRp^LPQwjSknUD&+LMq}FBBc~sv=|-I zMeJ2qQn79!c7Qi39h7=O9zZ3eq90_R8M4m^5OF4GPqE@>OiW5ks%V}X(VMrow#|x| zEwjS1JzWkghxm^BAYyd>Pch{x`V)&QH%Ek0a-ZY=ghmMMZkM5~kbqB<3=0I`-?WS} zto>*?3`|F8nvEkIBbop~dnHeeLlqi3ty`eDa&py&GV-KfSZSI`13{B#VMn^h3qdpF zb0C%}#2or02P!R<4^V++TLX0-Tb za1U=c9uAxa?w8B-aMZxrJxTLnsgWHt4JF-(r$#yzt4Uc8HKe&ZSp#tfkxpK@*imv5 zzNA7}#8@alokENfqB2l6Xy>x_w|(!9>|Mp)b?gHlxh-qDh%O~Ga%T`GPu5Ri%i0$G zMI=Z=0gN+XUu5FxXNCmw+>m`t5$cmJ`J56-lI2Y&P!w}qN%nEc_!6t^Ay4oE(cd3U zC<%+qL!oB56{CYd$n*2-D{*8OG35Mdv*I2KB(G)`U$Tf1Q^ls5vL9ITCa)&LaPHpkIu}ZpA@@x*&L%XG>iu<2+UF*t$9dMoz$tMb(qz zvJoq7?(7nx19q+>EjE+_c8;guk$XDMz+a!nV}-5lUJ*zxd)_Q8t28Qj$BlR?MBT4l zq{vM@I<;n@w#xVMF9?j-JZ08>xFw^9%WXf8s!LEemcJXTD`u$VtM6t z!gNGbUyjDLE-vvUVO0QeWX%AjpoBGpJ@jKW^Me>1|KYRE;LKszf-|krwr-oT{K8tK zFmDmiyy<4dTxA%M@e@I}-b9}C9WA73A6%O3fx>~L=?HO9>4%>9K-6R-WgSO55X%1< z2+n^G1WhN&Uv6EaG<)E)2mO|S=~vRXwyDaNJ?OYnZ#R(8ZI@ERZZ8WTNrGPhWu8q% zpeO+LoO&Go1bb9NNdqFrMIKX0Ftwh-^@zP!mpAPm@-sNG;51A)u@Z#y{W@C>U!juR;&l*}hZIvlF*kI2Lc8y>|-F~e&jDa~>I(C{P1g`4>iRV;D zfJ_5PZ#qr7-wg8M(e!qqs6hinHyW4PP%0tWUJvXwC8bP7AdVju0ejnaF)paQr{C%Y zD_47KjyYm~E;a8Rus;Ki+M2+Q)9<*CcDsFq85J>*;(?@h^>iY7;Cg<3et-S_`_HdG zTwOUQ5lT#PGr!4}tS8uaMnuyXk;aUUrp3L2gs`i4+V_EgTUb%s0oSOMwy>o&z{&Tw zOR(KGAyzrXibgkZ!&&C z(ojKCuJ$+G8zde0PJ6vV+HRL>K`1YY2|;`~n~H$kHP~Bm21lQ2ZmFNDd{Y#@^K;uN z@%!VuD&L68nn2154g&d-@ADk1At&H&M>|VYi1|K3ETh%a>izlm@4wIQfBqnr+$taS zgd{a(0laa>!tLQ8O`{y|>6Gi$9Q0Z}J(XZIB#7k9*5jQP4x1IE&ZVR%d6Z^K*gwU$ z^9W*t7Do>ZT3O>x7}OjBbxTTf3#o3MX(C$?H3#D9I9do*jtW~-ZumY32Jj`ATdF8) zktP`gVaV~}KpN^RB$tv}1k_8foGHx%cKB`u2|XK2^eikjr4W*Oa{t|FbPWRYoK-;7 z-1dl%Q>{Y!y&c)!l?ugTDin_~fLKGKSqZjpFwq@KZvgdDBn_!)DQzg#l)}8$sRetePgrhni4DVKqf7 zh^Pq^xZy8*+5DnNLirM5RucRX^MV;IM5=lI{)~C~ig}4}Vsif7vs8DlHqf{{+zSez zP1s*MdD}eif^c2&dD);3^sE&5oP$FTz>Gn2s6C`$d4jM=ex?KE&#PeQC zDdK`vm>2+Zkeh}ZU&wV=5pk29epfSjDw30$Dhj2L&zz0>7nwi^C5FL{{2)i`@NQ6L zZAB<|(ev}KUuL)bg9PaB-~T(FV!SP`^uG!U`yIB)2*b`N06sY@Rzq~{Zc0LxQ+vx? zgTw-`M&+{(M5z}k3@MS{8uA-cNNiMwPO)fFa*c$k+)*0rY0uV31EdMkR*6)FOA9_F zxoU-Qzy@cOo8>V8Sf6knW8-1?Zit=}k9`L~mok9lI37RUtAC@UDb18hP%R{n5`lHB z9G_B6$rXu^##-3F?^&M7R>tcjDi${>w8UT3z0_px>P6JlOyBf`>wJ8Pn6>hzzi?xF z;j2An=6RQ92;~uzE0=ue>HWv^>n}{o-@l(<|GfYHV-6BrP*BLSN3}u94M&U-?y(X6 zI?ihK1N7yGj=P8zMb^~=*sxR1=%~>fMXEI<$AvWTX?OU)N_!(&43efqI<=Tq*A~<4 zG0;zft0>jRJ?s`st~3b^pQ@HMh^;~UszUtR_Ir7P0N-$E==M5`q!+NgPe~bxj<0yZ zt{z877>JvCvSzS$XEh?;Bc#xsA3aVoB&Mc9!&S9-6k*5-2$ZeST)wEWsD~8mn}iZ7 z;1e>o&|Q941^bB$h~#d^Fyb$xhVKCX^gBo>kwg-2wSN8e{QK8$Y?ufmrskg`W0|J+ zY6C95O7jCL6iwNZzP015pH`FBWa(i7R#&vng!n){spLmQiV z35h$iyEDI?MOsltM=n`_vuGYNsGlgpOkx(SP^ikFhbm7dP=!q6VV=ZTI+?(1v@B`P zcJr0?fI%Q&kXSYcd1?Nkit>oolA~LPbo1`L)*5J-FY6Rx|BN{ zIwpR5N?ax+L4(8_)>3lb&G?n99W&|Y@;JK>C29lFAh&>oQGvOAKz9nGrbin4GDi1< zruaIZ?v9ipuuFeC0gUWeA`lp-~1iG}#>OrN&~Uf&hb<1-m(fvpn

    X4}gAu}}_;d!KYNa9YoVxRe8R7PTeK)8;_vT)6HLWk6q(uE&-2-{De`rq;S6dxdTT!8bo{@!NpWj_PN zF1j@AvpZoOhtq{=e}j+~WO0W}NA3^=BY5t($@q3bZ=U%30jw?4%v%LqQuR(vbPQd) zkI$WX?>g(bgsIxmGv?Ija%&T_+HP+xS9w=r+VO=$wiNa5SvYLmEyL@MlKf%CqGj@z z8A#;{#9j^W)9}pfHR*>_Ftf)+)$m@#)ZS@of6e-L}3hKPx{gjmwzlqB)3txG@7%GMc62GbtG(J16PERJ&q7iNxcZ8k!LA6`Z+G-A%0 z%Zg*I+>M#Wg`F$GR5PR#;xp3@$@5EHT$c0+F|dw{XM=MPF_{P?gzDd zM!WO1mrKxU(l73kS!mv>hGv-Bw-#CdQL_F{v;Gyn0yBoY9IeZaaeE2hN1=s=BZP)7 zZ}^UwdkegI`ao|cPXcJr2{hd4&B^8lb=yoq+rB8FAxnjV=b^Ia@yV^q?7(vFlyjgY zlrSgS{g)g+Y0N2Kz1(n!q_w9>0!KEWu;^hqM%X-mSx2QY=xLvl7n;12IS!Kuq+skj|GYZ7$;G7@{ ztS1w4PO+nMZ*~G0Ofrcn7xz(Iqdk&`v?oNEatf6I=jjS?7&1Z7kcWY*nDO`TUvIw% z@1)ja3q{gQ46G!~_$Or)yT+Kgo-Jw0sf@C7*?b9-!JmW^aPW6p=j+^qwKtEk>q*QT-{~RYNy4(k{cepRZCPvhoI3}|E&(ud~gUlOIbPxEetOg zF5Kfd8Px*S3^azY)B@F7_)Pg88PS?}^W)n++aaG3w!_-R&)d(;1R3&Zz(Z?EN(l38 zFwTBK#y@2J&}d2=N^q70ILZW;a_XE9?7Nc*E&22fwa7o;7H`Z{81_7ih6ys6UAjCE z5bzX8M{?vOYnV|@IhA^!`4(X{9F1A%vyRssuTPnXzNxr=Rq?@H1yP6cn$;z+}89>=}v}P6LQ-Z zYvB2o+@9Lz#>2h~+W}Qkdc)#2m}SnXl1(VqlH~^pJfA@mM4HY8#8H@t_#n_6V>Kjs zfp$nSHXh#Ie*SzT%fmLTA3xt-mK#YrMJtSt05oBKn3z0G7c(Z9iw9w|OiAfln+;gT zGf@VdYD#0Sam<1OmQ1VZS; z3z`FXLJ5tm9olFlT3K4VBQ>Cg!J3~f*NGNFGbXa49Xzi5y3&Km!tlDDKY${l0%M?g zqFpMn2Ut|oXwq-usD!pR&8eyns@2q7%U`+l#(X=}YSmas=Gx6xa2WPW4LnSeeg-T; zHyM1+C2OP^bwJZl6|2zfj%rB>c`(xH5c^D2Kw0|bgrW|Hc-2UM*m z3fHCI2173mUY%j^o-UmQA?2ygszq=VZW^pk(3&Q$p&{>$RC~AFbObFE z4P$a^ppDNV0%B->vzcz6{)NLB#*(+r5sWB~dytV-BTSfU&c$O{o0@88L#L!Thlb%! zat{VZqQaCM1E+KGfL}jxpz{MqNCnroAJ1vB#!tgV7PDC~OJI}2n)sX+GvD8Lc&?gB zcb=n*v&TO_$=Te2g41!{+Z$o+3;}Fs{1_A#lV#}dx>eP3+oW;6hbbs5@dVL;8NvM@ zAE5yZ7-(IGm}L(IngLIMhL9hcwc%(Ft*R~x6h^0Z)gGZm#s=Ydj|A}q4T*UZj4sf2 z>qJ_8xpe{iL<(C*Dc@1kOMW<2W=w5>8Y%^oSL;vK)<0`k^&D(Y&UMpskw9 ziPne~!~tx%fe8n;^Q>%#`!txuO*z@!@_KwtAk&nrpV~sDDfu;*=O-dgbp)oW$DG#2 zMHW9_ej;f3I{E(X#~0?UD1)86n8ge~6!YUOcZ*q@05c{%Vcy;2Xv?JU@S?e=t z#<$7SgwDrFo|Y_dW5a`Iw@Of zlr8P(Ch7_qMp(MS)lFJ)lQUeX%iu;0wbBp>z`bZ>6Z-)dT}Pd}TxjjnY9$~6S1`*B zjwe)ATxpmNV|bpAL;kM-fQFLPUc=TU+jtmvDL&uC=`&P_J>p>w!&&kdXG!3fx6Y?)_+Cx`k0*o^Wrg-}LZ9T)3niM$q z_};{}ZG9gJcH0&O2G((FjORHQi~-f6C~gb`*w&@cf@5tgwL=&YD4YNknse#W(0dF* zaCp#E1K30Dav^LGYCzb~69s^vJ!!)`X@k}DF{E}1JU2eY#7CF#BU%EYQ7<{Dmz<$- zOm!(es5$grLLdO|GD!##TJ0mX1XpidiQl({Tf*)kQld60x{D1ev8A9LsoUA8`IbD` ze6$C?G)U#~>z6J>J#!Y-4o77UY4Y>s4dMhU^*IgA{-noGEIuj@B#dC?4>tGVhr$@h zAM?na;|f?HC#>72m?uw7+F4+qbv~O;g}w81T9O4@eB|N`&tLfdEU(g_@b{??_<~HK zU5$MgRUz+DR|R%N_-1z*T{t|h#$&n1?_-@28jQ%)2^0VgLJ}M&pU!p8T5888u#Lio z6NrL43Q@@JiNcZCKxhLK!TPNGggsAe9kzQwrwhmuppzqY3Xh~tjWMK79rIn5@>u88 zfof~vK=1ES#41o-46rT?A0GkW1IxtqfVa}c6j#mIkAk=vHRmI%Qpv&uw6SiShE!wH z5cuNbRAZY5Vj6N94Px*VsexuG93wHS20oTfLF#G(lf9nl%Xd;%iR z{d9(aXCD;>x{gg|wrm+D6u@03NfwgTVtQqL&nNyte1_A%bA6SiDt?mYEEr9gXrujG z=h`fL&s^-9_}C(wJC(>VI;7YU%DP*VUEVV^Vw|;=*u;E1f~^UY35_|Q)08^avLGOG zNbRe_SOcf@je)nPMUY^OHMw0RFAopDnSQ|Ma1Q%6%1v-OXe=H8B+!p%?E&W^CTRI- zyVjtrQIav*#@ca+j>wN1gh{Psj_qnwQe>+Gp$brFPc?x8#Z`G=>WH`&AtQ+bl5@}o zXw5xsIOA|FX+tF+zADw?tWoetXig+Fje0@0@4cW>FK92_J&($=*r@xM%UIp#=m?}t z+@0Z+O_K#xx3{OU1C4)Q9V6bM+h9o>-fmo(n5nE7eihE9ct*>?Y0Bq*nv!vp*pzns z33K8pmgQ)YE`jSB)p4*R78iZ=O2}MGqzd_s;-5ci3fhjQP%A#k?99B@2Rdz<)R?A0 zGnXLAbv2uT-Zg#-T3~Sccbw0n*)KRB11+tH)3tQyx1S^!X)Gv9&}0@9nHil8H+5B2 zW4uo8*JtB4x=4~8jEPJj_DS~MS6w6ac zkskooNZlay?T69n<#1auGskq#2I#8E2NHE15I={<^7jENm$Ej)^1bubXiGQ{%` zGrSRs2M@h7G)+;U)fwYFZG`RMOHrE)snR9!2!jB$;h-TAzP!CjF*ssh4zYM-Mb$b@ zUt~#R{j6(MlA_?@jcbmxEy>a|$kGI4=^K}-IN@DOf4(~30-+Z!wHA?O(VPlf?*gw% zn+5y&^6U0iImGinmJacm!nchJa_E|uYlg^N3Q*_Qz zW-QnE2_LM1d#35^gZi1ZJN zWATrus!i`aA^hW#QN;T&7#GT*R8@`ge#MN6!S=CPG~gKDi6 z*2R+4Sp!hxUpkJj{$*!^!ue^GTLQcdP~wwZ0Hv643f!7S- zaf6DrifCpLy+8ns!MH2#Vg7ITsP5gv^B@K{Qk4Z~iYtf*i1eN4+~R`Ze|v~-AJpRj z>>(*+jc_V-X1>&pDf1g+9c4VzzNOG1(IxR`)>E2^usZaaL{>4<6h#~_4k71^j-cWq zFYx4g#>J^`GQ58I4ohgj+^=3Uj0WH-isRvUF#9&z6$O*8%J*^A0$lC|RU-isGY_OIV^GWi{HT^2}rFtSgzGJ3Mnxk-Z|QAu61KSVII)ZzKnIE{d3g zHxNM-G(jH)v5H*;+(2;;QTA4$ckE&=^@mO8!gAlQ=X*9708LEs^{6k)nUuYooAJO!+K=F0p9w!~B4#CGGzugM4@V~~ayk`H%)*(WN0D

    x`4;gT@u0A61>uWKY;?kPl4Sfi!XvAY14NZCyJ9 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

    s8GwHqB790i`^?>~6> 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/GreenGrove.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/GreenGrove.png deleted file mode 100644 index 7a0e8adf3652f98f1227496d07ad218dbf0a79d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38966 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

    !CC_BNH4qq1jF{3BZk_zMYz8K4;^)))JX8YDM;{ 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Harvest.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Harvest.png deleted file mode 100644 index 81b3415b36ae0321452e1eb65bc6d3dda03ae0b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73476 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 D=RJ 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%0D?NbCChn$?q9vEy}mMwIY4j>{`e=n&)d6xY`>= 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

    ZR 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%0AxO~Ayw0!)69o9>xlqI){dI52SopdT8T^s(M; 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

    Mu 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

      -yuzt|?KsEc@Yy4eh+Xw%D4` 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

      w1liCZlf`qA#|?M&@QFz#Z0xw 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/StallingOmega.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/StallingOmega.png deleted file mode 100644 index 76ead6fab330007f6943b175e972b0df022b7fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96404 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
      {+|gKP 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Å?x;Ad1qJXx>x=@@mz?hlAR&( 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Stomach.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Stomach.png deleted file mode 100644 index 5a30fc8a65e01b40ecb8e68d891cf50150fe731d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76910 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/SymmetryOmega.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/SymmetryOmega.png deleted file mode 100644 index 700df856f023942fd7f7be649badd7a7397fe02b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22586 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/VeilOfEvil.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/VeilOfEvil.png deleted file mode 100644 index 7b1b51b5943b95fad4f355b4ba2417816d67b25f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79972 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
      X+x`v1K7iU9;wdNv0kgO@X-s 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%0A5%#KmTh*4MAcK`M9MoId!y^E7r?Kmeacx_Q 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Zephyr.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Zephyr.png deleted file mode 100644 index 5a3b097d7e11ebdeb80b744bc56a4b88fd175b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60404 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
      s=@tEjp*pWk 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
      `B2ozcI`V5-JC|iYZIaw2w(Zbn#A0;SZ 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 FV1l1kLaG1& diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/Conduit.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/Conduit.png deleted file mode 100644 index bfc678c1dbbd1eb6123c2aa9709ccbc58d1b343f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41574 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

      #*v^2j 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 WLXO2zI;cSa0000utoq8JpcjA1gl#}s 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/SimpleSpellTable.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/SimpleSpellTable.png deleted file mode 100644 index 1113ee1dab8b4976971ad1ce467029bf1ecae7d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33963 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�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 N@9FC2vd$@?2>{9{pB4ZB diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BindingArray.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BindingArray.png deleted file mode 100644 index 7309f9f8d53a65bb502330d5291dca57ac384bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43181 zcmb4qg;!Kh*#F(7OS-$eB&9p0LmH%0kZu+PMM97kN$Kvc73nSksRbmYyJO$|zQ6PS z0l(**J+t?oId`6U@-xrOeAd=f#=)e(1ONa>RYgG;0Kka9U;rHz(Omk^-6I-QYjtG> zM2nz1`HnC|gW;iK>;(W=g#Z0OKxP&h;w755s)iyO44aaOnSau7vk~!%+DYHYTi)Hx z&F-By;t>GkJ?-9l+u73jIe9zMDXVH|+w$0<0RSDKsvxWHzjT=Gw`guq2VV$P5BwxU z5O~t{AA7~frQIr8Vg;G#|#g7qc@cnJpz-ok1Yb7A$kSSjbvkBFo?sG2f`y0 z&(j*Dd!*N1iNyA=Jsf&X96Rg;oI``I_w9B%?8h_tl~n(~sElfB508yKH68G@qsu9g zP*7C`L6VYmi6h%1P?(uf05vr=j&))>HgB|D-uNO*v9?&Lw2F2fL}vq;lK;wcm%W z4+9w&as0bMId5k9^>uZDyuw0oPh>BK(QmQ~Y0rDVJ@yUIchumZDKf9d-GG|?3{G|g z8ECFM$iBKhv06WZu-rk3q3Cxvu=DTg?jW>-M+BGb>}6BD;Si7#_{}H5T@9-qh{VHi z3tc+}S(#T+;eP~{mN6odEd{;qbU%~(8Tx=Ep?5OedF@fq5`xMDJ>6pU5702Mq#d;~3KBvgYSeU>7p^Y7K9wK| z0^Q$SR;xt!O+2Tc62)jihP<2r+eM%rLRY#!Ewfntoh6TB!6tiOBU>g*Y~hO+&Bf6(^CTGT*|bFgs~x(heZg26)eys3{0igPM&_ zr3;TNgZ+657cG%Eccuo}p_24&fiD(+I0Jd*2L}Jm@|z>-lXE>4t|+k)g|xN-VWIO%g0y^gXT#cHy}U+KN4D4~Vs3}jHo z@#}%5;6r2=ijx;>oJL`T6gJ&1aj%5eFC=Wn>T-6USjOLDvAGoT?+gxPaK`gvQ8I-s zUv!dsSN*5*)W=3%)}CsHYe|MDzV&5#!)q*vR+?3JLQ-?PJ`xW&utD?*$pv(SWFzK- z`=8={uxAPLdw4vmMXQZ7SkWDe!=Ovhzx2j5Nb_9ND>W#OQiZ$;NG>H90E97|7QBl2 zF%=<4%!#d~(i*Hqpp}mfZvsV;8jE$6AKF1*vg59por%@?BG67VLV~y(i)wYmNT{^I zG)FC`@&VzNs$~(_8j;TfQ06ZvfwUgqjQnp>tjq>LA|HbvSZjk&=KE=&D~VETK%9ok ztrj>(b0ni?Sn7-ORk>_9!lRQgpZ!ZZ#vz8 z`$+3Ow!}Ioy%dg#39s&sG4!>Se~jA+*bq&M)dV%&;wya3sJZJu&(k;BVR{{!qqp_v z{IF8(@AVt2h8ITC-;pL+=pL1U8&G;NN(N-ZbHtCDT9VhwUh?zEKjWpWrqT9=|Lo7x zP6^r%Wd^amjlK|}aFJweDI(p;d&6WNP%|+MEbAna zW>H|K*krK!6}NO( z+vpTa=H#B%7?cvi%Yg_er;{mvqSc7kN64I%L4#sCdx2P@A9Jp1)W7-s@)4p}xsApD z=kp^pcS>n>6{=z^ZO%Va!*!H7%huKDSo)c<@GZ{FJEY)tVz=-JfSI{y1UEOOtj8xfYCbN@F*TvgLe1o)dd^u{4Bz5jJsO2~aW z;bsnqX7_%}X@dge%c|U&#uQ2=8|xe;cy7WSM5Azw(E^hZ>GMwlcY|YC)wmcEl~uL+aRqED_q0N9pm> zt-v~{hMfF`R8(!|A{%0X2z)3QEf)5@%S@X^pJgq8U<{*I`E_kl_BrjpegqxJ(c5=R zhMV?QPL59Gc@aHVi1&sSL^m$%@~3$U8TOR_d&dAX!Xisx7_9(Xq z&4A2%LQ7fMXd=%UI)LwVGwdR%J{gC6R|# zPf75yNvQa*;aMAgD6s%VLJ0*%*xiHnf?{Rd@F=wDt=*82V)g`9gAUvMs+;bS%Woz5 z0Z(L)1m;JP_?aOEQ3R zBny%v!5TBq60gkMcSU+--ah95*fV}&rp}xW;OTnMC zZ}(0<=fl2N1^#NlR(65z;6%bvs(3yk4;=n$<*CjNCROhy9G&3(FC~ZW`|X#TuDLUU z0{6?0))FtT9D-=S_OKe4w1{a;$jd}cy`$guTd))wBJKybp_cZTN^{wZE1TMg0*5)? zx#vXpIGRtA^H~cr$w$|H$>!PB*d0p4 zYLFuHgj<(V7d87P=S3D91El7-uh+azT!}2Z0m_3m8&$HXb%r_W%&XG|vowgXMoiQe z+tPHO{d{%a>8$ZUWG&g&K6CHpJQu>uCoo2t%QuuG_&_7Xf}dN1;aK8^E;_CjWKQYT z+O)l}UQ|lRfKr0`lx0nRxH=st6dX6FqK zMn&gWYkhGp+?*c>pCV{{L1o*v$P69*^T+xhYVGIb8yPSE!JNoPmHKQAo5nYWjJ zP>;Uhto)9-mWy0G|Iyn$A21@!6xX?g<+2bw{)GT-4D z>FWvfStjGl)CEV3WHFpQ4Y%B_ub^&j*=xv};}k?iT!$~3>$7zdL+YI@4#vwIeAb0I z57g6aDq3ahK8{jI{W|Y;njHnBvJib;K%_uos?^xCW&QQyXlKh>%>aj2cYcLY{~Xw1 zenHUmaAusCKz@7EPy9qbkCmn|B}ULf`j;D3sF0``S$n_IZ-=&GILJrg-GA}u1%G7a zCz7mV-3~do{!q<@&$qMPhFT?743=)JKVFdWYUGiB*Zcu`M+G`IW!jKXX#ycIE7xPT z@Z8CH3kjN35Yhq)`gHM{#4gl>6{!dN)DBPSrjN}_k986_Z6piMX6-#0x~KLhWL1Fp z)X(QMwrMKOWy^y)(5K$-f!1fCrI8E&BsIJ*URd4zsMMJLakROZ>5ttnBWgGh2k{BQ zkk=s`H2elz^zObQLJjYsq!gPD38hn7FS1^ZmS6QZ0HrGK$WWs%MpAhE(+nr;-l zKEzP%&R?AE;>4|~xtyo_pM@~5z2=Iwv@F3|5}lUJX0~zl;u;i9`z_o>va80#EaMqT zRHrd^`LOsAvN^Z?zU0-f?d7#J(54nSrb#0vcc8I1VAXPUgRx1Z{Z|3Kog_D6VTZ2ftiHVRAOW@bpsKFNXVZCDg zH85N9tCkg3BJ)%AY*Q36t>1fZpqLm<@I#WN=J+j12K)Qeg8|Pk#J7G2`&P=!UZ&C6 zze22iq`SjCzM;EfQ?Zn6Nt-M&YR$yk4i%j+faOjxZ+}eBYE>LkbBFuNBxk1h3fXdk z{XP+0Nbs-V>>?v8oj%hkYqeXTRP_ErAdA};3*XfY=QzHl;u^F&*<}ob>R^SlIHhnJcGM|^P6`1h+w;qE5fjiEx5gkc{1a@ zC>^vnG-uxCj{wznih*DC9NWuHxr#5{N-qK{gGreynJ*w=SjHkD=i{T+xh()PODwly zw&uJ16B}goD#ionpa44$Kz?j_%Y72-C66tSx#kG&Fla zl}CxR+P%KB!NZJQ99HuArWsU{^Ses01>|KtFS62ZYAM7tZln&ZaXatCZ{L(YJpW~$ zY+{fJ-AA7k_>fcadA)4*02;&p;29EQ6`-Dm;^(<{-0C)lf$qv?l4JheaZn|#KR;UD zk2I==oqexNIwuov9i&XwIXhw?GZV-CGw|k1>u8r0M(iHhYFo+px$@@%I#WOr=Ww*1 zPQyig>7M#wnt$Y|zES2uM5W^+`q9JpIlQV}QQbfj&95a!bUT_-WYU}LI_85R`0uq) zgY4s0;AqnlRwwl*q-c>>#=KY)B)FfIN86Vbt7nC4u{G0q2@>>l_f_`BA?x;RN{%H@~D%=VzLuGP@Ja0GO7 zgyn9EEn%>?ED&VUCj3bgD&kHc6o|;$T9)1a!?~Uk&}^4}N>uxm8M4{_DwJRSErXS7 z=+ME}*ze@u8IVBh&Xi_Kg%1jxzA~8LloZ`XydUR5jj}o?$ozK0VFnd7V9eguc{{e^ z;KiV0Agg~H=l@1wRTgM^ze2gEJHUb{LSrHx?tII$I`r_8n59xib zlpsx7Lk4{p8jafx0T_7G(UC`W#*G_4+Snd27FA+8T4mecCmnBh`se%?`*73#aI+4@ z_nE+h*Xaidg5`$xPRB+6^_bhI_KMQ%k|qA3S)G{Nbn}jTXPN8~LaN?&y@wf1FvHtle^BZT+bIjHKI9K8 zu7{|prQ$!U@@ue8qRagl8@_30zT05NfBcJ{pdwmAj#L^)c4g@}Ga0O4ZfdmM{o7H} zNGY;lxztOQu>-_;^c(sMbyrUN#+i6x>KGTzsuewr3#$r(LQUerhHj|w}N~^EC zudor;h2Hv=z0vLU%orQ+JO5Eiq=`tgSz21P?Fo&_> zCRo10dgfWj&Xdk-XNHnqTt>|I-AbSw&e}`*q~5k>?A4@Ra<jSB1ZO!KNY zU&M%jiG6z%E*x>#6#K%y=x+{Fy8GpN61e%W&U}X1ilr&xua0#p6MIF?b4O_|QpvIB z`>rnMV3Y+9qG3$(hkxi`v+?DT>c>sYDfB{mk z6*UCL$Am|p?}y$>bCx%?H$AA?z2(uEmzH~^K<+vUqZBRVIFKRR9(J3b?bn9p%J*+f z%0PuMpaR?}lFSpaA4oxDlAqnc^PB@QSqR^VUb$R2;KiDTOpTu?Pk zfgz)S)Hoi0jb`x}-=y@^G-(F@y0Btn{{lmW=E{|aB%+>et7C%k4$d10%V!CHh5#NP z{=!1#lI?!u;QDEmx;ZEt&7^1UjS3CP)0^KB*2=COaP2JZ`8;0<{;gFVF&+fBE*Qh5 zjb$Oa%9wEBkt($N#VN6~@%qPP2Z}+2K>2x zSB0O`s3*R;^D*1tTo10WMk_N=9Mf9VXlfdxqF>F%In=jvgNSN^MStJBag0Xzn$s2;>*D3<-zE1% zMdM=MN%e9}VBLm7f+-!9j7T7_ypdqod`1-&YFhi3O@y+O!wo(1m{XtR3%MtomcG5n z*qsE&BDG5a!HnY-Rax-?tg2^|;ynqCW|(mP5&UlvK+y*UM+`P34{pHA+mE5Ev+_#dxlrr4_w%{g2?PerRrev4G@=#Q^#+3dj;`Z&l&17WRN zzWqvhG*PFijdztvx*L%_zw{4SBMh?LDTi9bDN^dJr%`$uH|PQ!s4mU+dng0w_4x3< zTi`ngE;OFE%T!*~e0^!5TCPJa)xxM?N^seE#l4=#P+1kZFE-8YyPW7vi}YeN3C6)r ztaNK?XTkJ`bP-h!dVKzHXJ>$7;@ne#u(ae1kb`%8YO=QyOr+%j364o#UZFz2rkoZG zv6HQEhVGriNr}FmaIo7oqxW;%_a=4(C)nv6+b_UwOjYg|1w}$eY?@UgM{b`RsVLaV zwDT?3Uzw}Uhc2d03HRoRpK9gLA-WMFXnmK5Imo0S9;S;$lq_Ov^bWFHIsADY!tJY|Dy1dI&KvnQWAutBDe=zn)(yVg{cuRvs!rRwgM zLAOCed@xk5H>h}4uO8a^??M&|S5*&|^f^*b{g5ANnGd$kutpGl?qc66Xo3q?0N0?6o|;6v2A6 zjq6}cHjO2BuI0P3`GT|kloV$$fc~8}DR}T8raUL_jaA}53Q>?huhk-|o%mv*=%DqdyZHmNh|K?T6~H;qW*yE!4z!sQNVDs% zlYUbi&(Vyz5T*YhR+~_r{TNvSG=xPmk>d@j!*J^4l+S4l3#EM4O_o@pG^Ls_G^ID> z$bji91B+QqbnVZ@DN(1=8cC9{u`<#Ox(ScWz?0mDQ&@xt{Nx7E^X}SWL=GRv@N2?8 zHGRl#yLGyCQ@H;IwYQ^+jj60*hj!8bI_0VjFp!0GvdA6gze|Sqa5=4270y+kBGhZ~ z^DJn!PtKCg?lsT;0MWxoJxCGA;F_NZXF@MOx61=5&0#2c#j5XORG#6Smf(!aO?$+m zn&YoQ{ngI!+CJ{TXWey9r=yN6TnckTp#m;CZ$xpm=rw7eLiY#mrkhsb{oJv{7U*#V zCY%`3Ay*!Zzi1K_dL5x|VHu3!FJ72=)0Y&e5Ld7Ck|_V3j*79ny1AqQ%`CX)r<-jJ z%5=7qL<=W?UP`I1mC|H!6Ypu56l{h_Z=AhhBBOi`x;o3>WV(XDUh?HnI*js)#P@q+ zxbk%jy(?S~&~fMpcS=Xht?Q}$NGQc(*X%$CqQqKhM}0D5W|hEkM!Wu!J(Te-DB~*b zULTQC0x;lil@DdaRpV{O6yNzu#urAl^M07fq+&q|^#ARGhvtD$8l5ZJa9n2X$q9U| znf=Lz`F~q&L+`U`a5^ccepATvD+k8*@h+Fv(BN*=kShLlHyh?;x8xA3CdE4;3pxAQGK73Lam^_bv5dk zT{5=d#uFr1ahCdgrCO(q<|wy=5`tI(q!gd#5}kQF(|B}UJ$>|*k@<4-)Rx6F!ged* zT!I#yAgZLFE9+}oim-+C^6ney)stjMgTWvndcGGTKQ^ek178JECT{q<`n zJ-jZ)P{u%?V}S#&oo+D#Z|kNnsoO4gJ5OrNM5ye)UlI7Ll`r;K^-7EI+Kk*HEq95W zE<`(oh=6A?Mb|i0mwR(?o{1OL7Zi%0#^+2O2>zmHaj8mM5FqI*LaD0oK-(JJk7VgI zmcDqvAzeQ#<)f>1d17MpkY6m*s}jfc!v5q%Zu|*TDKopDmU+Hf_^di_C+{tQ>#9?W z$5xc`4>>p%pIYbUebNG9QUn|N`-7^^Ii3K3Kn<2$N-ce=Kq}q*uHw_|8;5J_Rbt?O#jZ56v*|u zs`MboaF!-YDA}3o>8o{{_7?(s3#8~@xcPx#Np_?;>>4r4uhu0*Rc>niB+rC)jB}8( zD)dz*GF5Ph<>!1rQTCG5>MsW-JfbOR6+OX~k7zd7bhX5FPPAX1GYdR?pvJ)L^g^^p;I0pIB*#c3JCokA%ao~Vky z(p2j2FeFA#RFKFZ)p40>vxc9ePZV5L<8WhldoGNjme8ZQf1P!k=}`pvnM(KawN+|4 z#(zQz>b0pydL%GX_H#HqGgBVmiVMvx3^!q|S&e?K1WVw}M3p!S+}l#vFl83fSm7QR zX!s?$&8`|tZor67xemBL%5COwP1+fzcQ8*5i)Y$_Oq<6&>rCy!4CC%2u>HHIM^LqQ z$U9bNZL=fE>m{**_5JKe|2|BkTV6}a)4wa(H_@!(U4@FsV}B+Eu@WPYrky2Mzgb!; zmktL#kQlrilV|xYLuV9Obgs)eJL!sn6e+`0J|>&`1|#m}SlW^VmFS04bpMO+Fvb#e zf8yoYE~pdzJJ$m(HmwriD?Vo>&Mn?3LuUJ>fR**M4CHjT-EAJbEoYg+C`XvFe!sdh z@zlMbJGQdr(jx5$?Ax5v-YSTckryG|MTOp^~BQ>Kg**vRgpKoj;vr0c;TftCYs0O-ba#buWl~|Z~6?fFy_FA6% zsMr7gF5xrBn3@AUmRx*(H z8y>2y|J`I_i|$?+;x{pQ)XQoDnI)H0>Ts|C|C~X9D`$Wl5;8N_qX95z-Trcu_bFL)iWAgJ;mvVX}8L#7by*iSP6Z#(bacI`Cfe`)W_uHypHKZpjEbz>OlVpe3p08^ z%c&uunEw0Hi`FEvY2$B@Mh~hvsS`4|IR2URg^H=%yxx3T)Ep3w4xJveaF+jN+H#g@ zpzx@ zjjdJf%O57DKi0rUQ&;}i(5-fct+gXK7BCO#EdEydz&71YMY_q|z{2YoxI~@sa+I!! z3eAFKXAae=Ic-z9c$&ouXMGxdblYb{iWi08an<@4zI|OMnP`h~gnEc({>FHcn3Xz8;T3dwkHET*mD&eEpHcW4Q6&5;{quOpdrkh=QDN3@ zE6ly`F*Y~7eOBL6|57$2rM-T8X`7OZyK1U&V?*YlI&_eE2gO&!Z}rq(Y-BsqQFDU! z$DhRD%((Iz#Hp1_Zgy^=(HrlAg5JE3)<9T$h_ILKW0qj7}WD+l!z0Ca&J+o zb#Tzh+}F39w$ioJkR`WFp)`Yb%1H8C|w@#JEpeW#w!80>R#B3_ib54qCIT4;91t zmGE>o<@W%oQXns~B#iwcAwH*&j|i1;AwUJI4o%`?@2_hV+r4CW3*wyupyXK|1J_&( z-3)`Pq(g1kSY&i~i7YOf<_2Tc@AKs^8@4_#JZUq`tfiQSrs(^%I3#c%txER1qo1bt z8)E%i^)_4~0%T7=?AmvfyuPJMZ zPvulZLWxOStG;!sKaxPIY#MiEDoSy;xeHQeP=K5E@+XL3$5Lzw%0|zdzU&2Diq(L! z)0%-{jk1*BlG@C|m~aR`6j#3ejH339xTowb5)^}f>AccltQ!;H;CL)L6sPEVK=DoA z_jUK2#vxRHrmI*$fqpgk_NkL3ko@>vs@h~2ri;2RGalX3UE%3K-Wwg5uce~U&)5Um za2_{pxL`@fuNa03BA}2j4~lIi_dzg7E%lRd-TFKzC))p}-JW=d&SAsS|G=$C?JQre zo285n-H6bitB_L*a1r73?jNRrX5;KXSL^j*sE&U+&Wp%?E_$SdoZ-wIavOy5Oei6J zL0Q8&3-*x}m@nmcL|WF1xmi|A-ByjdVAYYuo5Bj_>=W4UfY!ag=XM%c_9E2Ty@fCc zb7qd|0*Qw~lP(l@3uxD=&Xb=z{(%4GLf;vHtzMx&&-i=jl}lK16erdrK5R`^ z%k=gL>a3)QWm*z*l-r`nLePSZ{hbfHK?`EJHCXHqXAr=3)oDEZIAaq4w6LWI6bfIp z(qxnj$2U9u9+0Z&S0CPNTqYtx#km^K1p9A>9cc&Umc-sC6N;kNZa3=Bw(g4A4*Gs`{|D-fT z5yESW)5BfzC#U>mm+OHj@tEb#JI-z}YJ4~RN-l=-+x6{%COh;;s`wAeg0*PyClQZJ zJ>t>j&M0^eRDk~XLw)|68R{SUNl%USmB!Mx8q!FI`E+!~;T+wv^9|S^I=HnUb8b

      3rb`B%H(=_ExEXv}92e1*D2&A(sRA;XB9(yKNV~ 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BindingLightningArray.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BindingLightningArray.png deleted file mode 100644 index 529d6cf09e66b27159d155c6a7343ddb5ae417ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43258 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%0D(|4)%P> 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 N)KzrQrAk(z{{x2%t=j+q diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BounceArray.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/BounceArray.png deleted file mode 100644 index 96bd00875cd7281b55611ceb563730d2e77c6607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35950 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/DivinationSigil.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/DivinationSigil.png deleted file mode 100644 index 598c297b34300228b49243c28a6c123e2cea10d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33324 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/FastMinerSigil.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/FastMinerSigil.png deleted file mode 100644 index 76d20b23cd4a4c35b6ea5b485cb9c24d1cdc191f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30009 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�%q;`J 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 Sp#(251#~p^HEPss!~YL3BXd#! diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/GrowthSigil.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/GrowthSigil.png deleted file mode 100644 index dfcf86c0a72abf9983d0a1f72a6e7f014d4f9699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33209 zcmZVmWmsF!^FI!sB)A8PYk@*>ZHr4Av`B$srC5u*yQBuep}12h?p{1CS{#Z~q`12T z%|GwY_x?S)b6vT1bI#e>+1cHh*UXts*eeYsVgfn>004+plwsNc0LE0o03HseIP;mf z#uPa3UMj&bCFXPWq9qtp;JYXrx&r_q#eZKAkd{G%xrpnbqOO3uM1)Jt!$9<@TL^QB z(e|~0#|vjiM@uIU%ufJ#;bv*>VQInQZR=sfqNJk!%7Wh#7XVlQ6`1^MpSis@-yf9S zW3ncJ2fw}ywBxaY-JtTXKhpo;vH3ea{YY`lM(uB&V&q1ltEp*}(YrJ1JRzE>xF7BO zu3=+2u52qIggNrBEuaqs-u@U!9l4A#QVMY`7#S3=JsX_Z^!0&@{8^ZsoYb9^UeFE4 z0?TiJ0Qp6IRjz+&aJ1N z!5_o`@CO#fPSbLEjS}Mzax5fpIhLNKSe^j4#8)h2xN6Y<;UPRAQT_|9`i?kE7Dex;{2v)I2)71?+J6)UJ6#HfY^=&<|F1*2 z$b2!-|Eqq-ROKbK$f)qJLi{#q1*6|BV}ob^8wW_Q*H9$Gcc=9Kh~PO8)jE)^yTj$o zsMaXpa%A6rx3^{V!EA-U7J%OG)o*I8RQ3H)IX zz)=2`JXvz|mL--E_`u>>dYh6K_?#&2P)0V+T%7Fxx|t8xVE||;KFBd(9>K-wae}ql z{BHSn+({kZqs7ukZubQnEOh;jJ<=rq$I;Va*M`PNtGxfCx2Y(Lco;hwe0D2jjPrj? zXxp6Ce%}I#LdSl>JXoNCF~LFc2&RX*p$Xc|zxhAx5&f@EvOMQLf@kcV!PL-wgN;e* zuq`E539##t5`*IZ*r2(eNo=6M6QW1I2($4+z6<5bzfW4D>6PYK!TaAz>DsdH0Tqp+ zdJnMJ2iaV4uvRc*HGFpK%Co}Wi1wWiHc6a}j9hhxbKyR!

      6UAR)(pW%hY2Mwl+W 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

      u`=;-o&&hAdaT5jeQ7dxjU?8O7S8Ol8rruQA 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/LightSigil.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/LightSigil.png deleted file mode 100644 index 61efcd2e198a752f087a9bf74b5b7db4f4539e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41435 zcmafabzDch5P`bDn&k=OmaI=}=SLq5uGZT2J>L900(CTQERILbx1; zO`a1j$F>@ZSdnM{a(> zgs%W_H_+{2u$wD)s8_Hjw~n5niK~PgDFAQ-diOLRgw5^Pdt|eJ`5Jw($7p1&mB390 z4NN8D&CRFEcJh@{WPK*>1ceBYKEr0ax=2MjH6^s__LC&VOIv4)1vUUY5OB=5KYOi9 z`vZqtPcPgMi1I-CU@V@052{iEC~Q$J7~kRQ~>f2+?) zeSPdBxG=e}$|vE7|G3p{!PGOuwO=?Y{@mwoXU4YZJyGf@5ZbrOrywT$9v3}C48qbu zdqOz>cyFJmEA&L^2gW6VOi2i`Dq6W2-S2sT7+Z}p3>4lzDc;C^z3mqHQigj_&b3EB z)w_&y{+{lSMM&& z3G6CsO$vAc$|hPihE?V#6&xmW{11~-dk`7F)tVV^@}m_%JEtcTR72qu!go6S5Q>Zd zMUHnIGb10vDrw4pasm#rA)9|0k>Vf~GAEXxM@mTQ40s~1N*=g@9*Gw&RdO>R|BnH& zXJe=zZ(RLDQwm%uv7ye*@E(IeNA$Mxo8L1hQA7KNfr==~8Xqpy4$HqBom{oFHF;>> z6(a=I<K-et_S7@)bDEG__?x(m}yvSki{Xyj-d zR8yC6E(dVX5CuF7YBv|2+OQ(MCXv+rnvw}W8NSI#P+03-!KdqP7Ws7o($_AC(V}MF6dxRx8uh|Rp&OzjY;*0-~UIsea-?U&1wu*d9d~))A%g3 zc8QDohfaSPLBR+NDZ9uDZ1F$`(o|B{LZIreXV;Zqk@d=Q1YOkjqiD;}b=X3vB=uvw ze?i1%y4~32GqP#I=)xAZW6y4r$Z(FH|L+ zW|-42NwHXH8+SVu_AfMON>9yWNz8kKfUfx-?Xe@!Y8Q1xkMJ zqy72MI*#V$H{NMD=;iKk3PaC`wlApN=9b1FB2D5vqcX_^T`h_sMr2;drmjI&6ZWrL zqtYb0jQ;VWKBn8{xH_UEZ1u*PEJmV;4oef(+Kp^=POYi)FXZ?ue_rrT{L(F_F$`qb zJ}HEvLt;q{xz92}#B~A%&7ujSk_OFj`7)NOEJ78V`%dN`JQBQX3L)^sO+50IEUpnM zsN}w@lbE48ds*wz3eE*Le>M0=tk0cH@nc}LK=sVy%3#le%MqtYJ;5F$Hwtxpy!CX^ zLc<_O=T&Euv7UrWrs~M~qj}o>%{%JxyuUt1zgXi%ZOc}nLz1$R zf{FeT_Qi{?dc{Hc3Hqs<*4md-J=-(VPm^x;dGVafklSk%b5O9rGiOoMw8* zG6SdAK00*GaekaZ&cDZRZoYh2QG)7!8(18IA26+EeS0#D9-Jq{E9=A5&B@8OaNWhb)b7{;7KNoPUP&dvV} zLJGr!2bE}ol4T@B4|EBUqzcpE?E5iu&AQHv0~->_ixcM#_ndW7VmkDB!z76SV_7X6 zH{$XqjxhZAU98mQW&7fhmoLbWzzKbSk^zw0G;oxpvG_xA3C+S-eoA~%8DRdje5(JJnp?l}#q@X%MB@wO z{Ub$%-ovw73=eUuywDk_Jk8gA$5a)OduN7`u~Zz^Z!b60qS#rA3e=$TeBtH^zY`Ow zR9o*b$81n6tvJ1?i@+{0kU@A))0t}hU8*bhiG}Kua8cg|c%^vC)C%0DE>>lRh7FTx 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/MagnetismSigil.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/MagnetismSigil.png deleted file mode 100644 index 63fa80c224c88a0bbb86e911c017339b1b13e0ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36653 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 bWf605xKezvxz5HS6ab$~X4aT;Q#|#*a{F3% diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/MovementArray.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/MovementArray.png deleted file mode 100644 index 8149c3835434193f2d1bad7826299b01fecb29e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46869 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/SightSigil.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/SightSigil.png deleted file mode 100644 index ea384ead446b50b02865a89f21da55f6ea73afc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43552 zcmagFXH-*N&^CNR=)FpBA)pi`bd@flg9u3P0)q4^AT5F*2nvK=1e9I`q)3qx1cZQq zNbkK%3(e5-=6>Gy`S-2$t*o=o?D;V#XV2_w&s=*>?32gpROD>r002;FYQPNufB-KN z0HnnD+ezTq1^!0-Oj{ie;QssNx0NL0HDq2IX1)MG!SLS&05{|yLWot~0*l6L<+*%<(N{+QqD+3K++Ms)rL9?cOpjUY#m zos>Z2C*?N{WG)4w1)`Cx0I>>~bo~`=A5;}?x?-kB_ab3Sb`T&2w#INRs@-BU685P7 zEF_XGXRCH<*Agiy0$m_Cz*Ypo3DO~iv7ip%Yf};8mp~u~N))iX2cf8N>k@d!F`_y^BA^;2_y)Ut7VrO^9$t$O4q^}s$X3M&BMY7?c(XFNIt&!Y z^es~Cu#qk$053=L_Q76NF(FUvW`_t44TtqS!COxv3!M-`7cqT82{OwffIDzQwsaTB zTgzkr$VT}bV9`06{0QTpCbo44z^ZHh!w2dFO(pQJ=fD*eDh^lxV0tFg!UN6AnjWAf zX+U;c@0{SiI$WVVe=ixBs}3Im4vFZt1q6XCP(8sGQGUWJ5#k^7(x&$yqw=RGBsGf}eP)2d+NAQvgAgtx?%d*EtNv!gdF`PrgjN3x<15Yyrx=v$3#Ya^+Sv_!pTg9hn zbJ_uUts$*Cmg^0*IU5USMlUmsNxXJ=yqi&8fz_JvO)0sXfNbsP`xht{w??DsVSD0+ zkIdqeOk_J1Pcs90RP!cnZH0bt&!8ws3@y6VKW#CrWaRhM-Zq5NeLi>1O)q;N`ar~i zlO1Wfr@x@f^le@G%j$Y7@3L5qz*gXbGR9sn*i)#~o*VfVX{l$=A3sEe4}Zq+wNN_b z7orY#v(K>-n%24)TO@n(Uxq_=U1&9C%-8zUCt7_)fyA6u?2tS3ZFH%9p;J$oC%-#% zx^fkcY)lJkRHZ5`jtFC9vk*;`Qs zWL78sW$z4VN zher8xl&_~poxV(TJ7(d%%_QggXYZZLxOUPxy`0C@GrSk6pnXq4A9#br(c46M!`m(x zC8Wy9^%uF}MzVkJV{@;M&NZuS>?~wX0vTVye;+*R34i?5f&w~;aWm5)GkaO;@p0{P z#<=rb=Iqz|=YgqrMAvo>9kJX#-(kzs`yhkPtVG8Nx_`p9j9%EL9V-o+A9(k*N zKGWmJ-j%1Gtcza>`Qy7F|92r!G(mi>Fyd^H$wBJN-e0p7vrj9E6$U-k7W@T%MT>e= zIU5jlR`sB{zn2$dlZH%TVdG&M@P&_M=9?pQBO}u0i$y=}|0mY8qL4xeDybb=?!*KIPs@Yb#Vx4BLh%w?`QnQbudG`$TNI0yi63`1(k9$uW-&zltVhao%o*rrzs9%U3hiY-J&YTBCL5+ zK7t+oZzlDg9&Wu0cCRZ_9Cv<0Vu^=Wo?TPWVrbku(AtGY)JjK** z__rZZvZjZ&&mJRDt<-LsQaG~fgk|CWd<2W-;l8RuVeOl>`4*$E6>0~Ksn|1OqTIw| zVO>4T!u=zxC4p)#XXS7)t0EqL46no}*o<;5wuHvwHpf|<*~ z8AH|ZyXbVSI{`;yU&+v`C)BU?H3{>_5$&(GHRIci>=d7Fa3T1iG9u4_n|vPd(qYUj zmf_3g9Ap^7N_j4JBZ)_&f2&qU3Bq0v!b?G+k&vsOlk(~#uZ*AEtN>lBZ8WxdcV=x! zPA1D|K@5H#o}>0DCj!QQ{=Qzwc+*>;FrJSEV{&u+$#bbNA>Rl8joZQ`TQLdEp(eLN z_8%dyA(i10dh_fir7%b{4eH6uN|MwV#f--o%2WE&m>4dFdzim(uCB?LSnkWSy$`@c zjNpySY-Rv%(drNzd>T;pc|SK-=Vghp{_q|DWtvjeAuMr$#YkWzSdz$FEYkJ^7j{mp z^6Qq^{b3=@U(V2PMyQt_#qPh#NJ<-$f~Nm-Ty^nYsAkwWLuL9ReTLp%|W1(^uzvGA$D)=PH1WikRgs z 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/SkeletonTurret2.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/SkeletonTurret2.png deleted file mode 100644 index 115aad7315837a72e8f00701a7b63c36b5af8b3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30611 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 jD+nIo|JR>=A%hHV{8& diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/StupidArray.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/StupidArray.png deleted file mode 100644 index 9a962b8a745641877add8b307c701e9dc506b3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 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¬+}k@r}QvGM}4+Nm|$IospwNS$62>p$TP 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

      126#V~Flo@M-s+D$Ug;bu=zVIrM8zwLNl3 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/UpdraftArray.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/UpdraftArray.png deleted file mode 100644 index 7f5b6184d6b6f4f7220fc96074c8ff095dae5e17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43778 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 S?=c4f$W2{Y2U4kM8S#JYh7;`o diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/VoidSigil.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/VoidSigil.png deleted file mode 100644 index 3e05776d9c705334496cbb3c9175908e41258054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24185 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 Z$fSwJ5#pYU+*ty=k-izKN*5jVe*mE$O@;sf diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/WIPArray.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/WIPArray.png deleted file mode 100644 index 11297382699333125223b24da139234f956ee01a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16402 zcmZ|0cRUr|A3uKXb#bk_$cl1>WMx#yyh-*-WoKrOP*&DWW=7J@$ZEJDu06AEB{B*n zdu1jhgzVqB@6Y%5`~C5I{O+SV-E+?#uk(66U$1AZp}qza{c(B#0F#!cnh^j<_+KPI z)4=3!K;I5bXzX+})L;rf+n4LZU_$4mX?6zy23E>n1bCLo2{UQ$YUy2}okY^J$V+}x z$ykP2CtR+Z-o1R=!^6SzF8m6>WgiFIyAHRo{w{Z&u^L)>hPTc-&;o!3T56ZB2MjM~ z1raPYLgov9FJ~_VzS&68ND+5`cBrszCF23z}Cx620`QG)PO*g8-dVC_p z^tSE}G}ioX%;~;(N78R=+2TfXTTSSVnqtg<=72x6TKZKNi^r}#bvM6iC zHBnQ3OVd=1r-Dn4SG(+E+eN8vri&Fg(s~Sbk+g=oWM|WbfSJMu02S(v%z*vjXpoBU zP6WNPqLjFg)dy`UrGl`jTLPx6`DGGI46ryCx&w8Kya}62dOWE!Nxj4j3!}`y(lHFU zi^vsz&Z3JLf&Jsu!-ej%mO8;^F#?FvJCqcIC=G(CfHYv)1J+~?N=*e2Of>;BbH!_! z2SM07Yf7dx*rPo}z#6sSkI)_+>}wErB?(Dxqx>ic$n!9DVN^r$fxV*`fSW{sJ!Y6b zhbb#eZD7gQZyj9QBrEy7)+1QAj1JTI0~~@5%>VO zkmMl*zLt`{L*V5QXrP&RZMp}vFxt@|f#Ev9?O{W)08k$VEi86)Fl!m$EcuFI7V!vZ z;k08!0xw;F?Z>!b0REgRi#w_wX?GN6;ywk~X`BI4Xau11Q_M_6J;H%0W-Krq{cm&2 z;AHdNu|xdycsXh`$fVcYj6q_p_yBN1vM7gx7z;S0``C9{6DbL|>XvalmjTfKFqky@ z^BgvtQp#3W)A+9hW&i^)_n%B+7j(7FcujV4ydA_aK#nHy@lNgsIcep1etSG1^LfP( zgxFdWR;lbx!l6Yl!qf54o7#>S2_!?4sU*j7VrszV4`;AB3&Q@v2^-oLH59PJIHg)R4B)9;GHy%_NmEbA~Ic?kvnSlfjmZCJ7I9!w&VX3Q*~ zG^JI2zMu4i9?SJbc)_3BJ_sZpAtVPtsJ=c92)LI@1+%CCWdpG; zBkKT0>HGMZqe)-6tXP$GN4xZ`HEGW7$0p7k#hv1(N#d901DvKjydZ{p=HYDn-;01# zww)Ir;3ONBM3oPo|71zo)7k^qsbZcE{i1EhO^phK0W~0XE@(fgT@Wy)!=`k?5XpO52LPAJ*PWY-Oqwlc)u#j3 zk)O2E*?^f|C>#wAm2|nNN`j=7G-CkkO&tvs5@f>{rKD-XYOu+tE{LR$D9!&hDfkVE zuQ+f~02q7A+d;_@kD|5m>^CX(2Gqa`lUJ}<`u>wW1cWZ#I%0@P zLjXR1#+n_`Jg?7yFZz7ojR7{{Pfq@rz86#gZs7u{048oS(7tU+C9s1tnhMx)28w)R z18~x~wJGoZ6r|-xI5}dK*MG|pvyKMuV#6vqVEYShC2^{pQ5iYAC^`{8%>HSg;JuLuIecxr|Zz4W*6s5t&4XK}Jr9;sr|GzEe zSgr2WdFw5i27rL3j~NmL+8@JGKuYpp^r!8yRmM|MM?q2o5tvLXl~6&Q;M2>0J|2Eu zOS}LZbc-+aZ3UxiU38Hgt(x2Z=~M+Fba?de$Vg89Ky}=O z@0{ze1vtr5Q&Tl>-@eVR3K=shsC<)`H}5p%{A6W!YjPM2Y5#Gj(M-6)Q!q|Sl1X8jHY$Z^TuBJE-%TcUEoj8caLt&*slGt<=L&RBP|au zslQtN&7vwMzAoz)e^ERlO|n(@4Dqzc(~cG)<<-~v%t`Wy9_I&^9CT=a z!ZB2@R}y^A1(LNDx8vsno1aDCn8dfdu@Pw)RYl>5fKkr%2&p-5Vjt^v@Il$VVm&q+ zhZ)I>NC5B*n!{xOaxkjSqy(d19u*Z8ZmfNYre9Do8&Wv?t_g1Y$_MQScbCUcTD|j! zJ>#Vug%Ng+{haGJ?Yrg)M*OyW>Q&}S9`W1iefzfY+phs$mjT(mt~~Mm`$kd!&WLuw z)@dz9wPEY4-2{p2@;W*?`*7r2M1l(M9ivQU)nH@cjmTi-L)^Iz9c^I^b@gG1=Djtg z?D@tk=v8%LhYTt@YdXFrhxl!63~FMu-haiOW5k7eeQfe_L+|6`s9d)ZrF^8HvOw5fBh`?BXH9!2Qp|aB(mMC%% znWd6dzkN@PRWj_VTcfib&TT&rF5IGfjaz7FXhr|dNmf?#MKjVy+x-0e?o@Tcj~_o| zNE<8BJ*}+YT{mX6=+$?(R<`Em=Oqe_3niGsCpX|KxsgO_jan@}^FB$g2DOA;ec-bu^ldxEn^~H^JSZaCpwklBbT2HX#M~4qwc`EkQXeH4VM=)w;eQGO8 z9AELlU)SDGp`KT=5_$U2OiLs#E>6NwyYaHy{sofn$9FdO)ZO+Mu;@@fJG+;0FV`Q5 zpIFL|z3-%1uTOuUnzS)itef`o82CD;H?UtuGaymfpF=QeQkc;{5b9nJ6?x;w#K`#R zXxP6Gw7CQoX2<%<{=<)3`;Eo4S4bNJ@X(Eg$NbxdH*{9)G+|+3;rrOw*zKoA2T_D_ zl{uS@o3I0wy&p%LzfMe8^NmSZbJhNOQ#gK_7~D+ov52=fW>MvVe`H(ZV|cS#Wd$S7 z4D@#tR*gv?B{*Ix zPBq5hb5~bzuBlkc)G<))<8n%eV|se}g!y9L`|BZ>FiWv-d00{J3RR8ECp3GCe!g}T zRWe^pfBg8d8g;7VU~^b=9$^RW$^xgO-sMY}Jp!KXoSfWGQDW#dH>DG+X(1QT;YwGR z>Nq($lkVKP!~N#_ueb-;+MB`~CrKMQ&ZOqzDrH+YF3H@`d+_qHry%UaEZ`Yop8^Kw z%TIH);+#pmj0Jl4TwGj&l94a^cX*$Z8Qhkxfo6E|&rGu!}QN3h5CcT+v5P zblebmn&JBWv4ktBTMmn4uj;3|eED+V8_+A%xfOXnKaA5P<4fknZ=|ZT(WR>^H|a9# zJl$WD;H@L(CeB|Y8Cx^^NCxjL4OJ+vd#1Oyx5E{&=kugLz_IK)*x2BVMV@j96P0tT z4y-aeY0MXQIXF0KPJvTmCVkqsoR~>{e%iJjZo+{AWUe%vx{4+*}kdwOH zT@nGc6n-V1X8}QGrqk7>rCx!@ck%oofZxJ&y?gOW={e8{-w6=3xTA&PiAHzkN)1%jgZTLbmQKR!f)$5d>wliOC!1)|}vn^;f5m$-nJrYRly6 z>gwnOsp!kKf9L&|huL~Q{CGjwS>dzX+;v$hRDB^i6*wNYpV7RX!EuJ@8Rx1hMkHj< z?`QY#WS5ndseawN%Ob0@pty9T(sS(XMZOjlvm<+2Sy?2_+6cm^5qxqa zJgh6sNe6;T+-ISf54G<~aQ)$PE@#iHg)&meBf8Lf37ydv)r<`$M-fUTVQg> zNkjw~sOloMf87PV zf0T$>uSADxoc$>qQ^SGCB;WQaR}FoAXA9pmGVa8=IR4V+GgpD$>->J~gjzMnJW9V`;K?3+ARefH@#dY>wO%jwW~ zrpf{ynZNzA)D*I-zR;_A(XRK1^u|mp(eAF=smZF6fRCce%nwRr$MV&#gZ?73bM`@- zCSvR*u{u4O{Agqba`J7Z35b_+2kuE9KVGq@Z;y7ZFp5Ewsy++doD@ELbJwb}~ zuUfwMKxI`G6BIyU_VHXtFQGjoS~s zj0`CooSZ*%Sd#gKeQ8}_jFaIy;?#4)Gnwe{$qOkdoo8oc-5Yboi|Fs#rGU+)p;r-@ zqh<{=n^4kk$|+c*`CjMc@s@5xJRnHNvf-mpfE#4IoSkp?P=0bm)b8QgnA5h^a7a)| z=;ypv7JM{&WjE~inoeayM8YCp+=C}04T0+k-p$6|%fnR_sxd-hH_ukFK_&BAd;RR? zCzbs?4G}=IFieqScYS*gVc(^28FNZ@EO`BMbMkQnX8m5>cPcH#?)vt}-T^&deT^&- zP`sn@Prv!B9SH{r%u&I&So7eC!+5E=Z+tQM`;K3-Vo%8i@tv2c^a;eEj+!?OaI_9( zuhaZaB5wW_JA2kDJq>LlLP|E8gAl;uCGJtK0^fx<8IS%NN8q25lYTws&vZI*2@5spIBBDu3KL>nGr#sGy)AEBo)N z73j+>&GcB^eN$3$`+jzOB>hc{61R-|8Tc&r`VlR(x3eY3*^-12h6<0DY~xacBN>+E zLw5dNu1;Jc7>%b9R{tuNTt(ovn=ihR3gi75G;n2Yoh3v$=P(;HbuNXP{B~n;;E)CR z-1lU;+?md7rW04T;SRZ06un9rCZy5h32SRKS;r6<0~WfU?*~~}k!1aN7m=v$&!0oc zoY%^OC06b%R~p}rRCjs*bBS&I!vo=}8y543B~8N&?l-`h#0*vin3FLOSok_J5(E`& zTG;7#-n~g$YqriVz-w4QsA zhs4-xK4&-;*T}KF2xY5E`M=^6UO~(5JHH;2Tj=ockSeCM`diXovLPa|#ICKaEuq=Z z_yol=FS`#>Ob!UWg<1CIk_FXIB2~5Pc_|XR3{RdsQ9|QS7i6J1cZ&by_aAm&4SN5s z!<*2wvZDLR%W8z|bmou>Csr058hT*h(IjuGZFYt|PUQh`W-9CiQoJ;0A_9KXMbnCL zrLQAx0s?ADkLlq_Mqtmrt*;k~z-*bb3)BedgW6KWpN62o!6}>CTeqt>5poisxOVDc zA(0SDWgikDi2{7{1f4lq(#E{l;b`*-s7_?;mw!&c#}>imyR1hqefq}ps_G2^{5q1n zwXfcBcnXaa0RUs6+q}}W+hiMm(SFs+xN*rrBIxQ%5pY)O!Uf;He(t}Pc5vhfZXrW0 z;ax{3r-6&VlSYmk&Ys)dT;}ErM&K;_HnaA#zPBs}24R4n(MZ(@U|H*ZI9*M6h`;d>1FpB@~MtPfKgyz zV3;W13&qcfA!;irlP*6EzNoO6wl;|NaM~{_;#1%L(xsRPYE&g>9jUOuG=5$0cJ|`J zLi#aPo|*uO5UAEIPCM(sXH$k6uLIu>B|5LTLXU>!>XG7PBR`oQj_UxB*_zze?IKnA zHfwrM8v`+MapIchB)>)?k5p^r9=);f?Ch*h;FCCyzah=Pxfv3q9PizGHUOybqEGY- z*|dabtGsK3%aG3t3m47oy9z3~hKg_2BW)KFqT$o0f0pX}zt;Dxi~Xbw{v~LAI+IBH znz;lC9H>+`mqnTn(M|?hB~ydNLomq*&Av8qYw2wyc24h(aVp|u@SjUU<1d}!16#im zEyrkkKCw^=+61lj{++A){rmT~*0jL5nmboU>tuV`z=#2IX|!(LTqFLkx=!lw1xd-t zKC?D{e*R_Em{5qd3nVeeL2D(Lnq2$mb*2smb^p5{h=%RYD(4akf4^NUcDs4JqN%BA zF_%zB)0!d(fEQE7?iW=ykTCOG%>?{z+!_~3km{FtSoep$aaiY6agA@I<=Oc@Y5dBr z!f{Evl~mLMEUk#IuQFvXeYfOTT_S z+zn7KMB=oEs^No_VfiN$!Wr7yfmf*PA4032!>pVq=Z<)2Gm$6rA3YhW949ZdqKG_}{v!o27=i9dm{#*w( zAr#Pnr;5KUe@M>FSLFuLi0%gH>-^yoKu_K*ynj2tu|zqM%g1zT`dO{4Y`+aW@B&JnEf)DD?-4}+Oe0u=@s;DM_bj@4#wF_eMJs03e`pJr**aO|F`d0_ct8tM%ghjRF2dC^S#gcWm~>y}pgzs|D7HK`R_;>NS^2f?;7nTNg>n=g?win1t@reI8PSQ> zG*&dwL0z(0&jRH&HU1ieE#62F z`95E&b-1{LQwFKN8dQeHk9gKEy9zrvop9>OGsp=gl%hZ)eUwLv5a|&=Sn_F^ve7sV zT-|i`nfLnQXlQBo^J$^!tloc^^K)_00=kbp>G3z&oesZIC9av;6n@N2m-}Ci(1j+xyp| zR(2mtP@O*opP{;W2;`j{!4?6(N-zK|;o&m{L#a*IA$U-Ozr`grj#Z%=Q zb)WFnx;b>8iI3Z+QRKsq^?0FJZp5N7AQ({|jf)U2AQ^QOLPhp)+`H`r)C5@|(3Zuf zY8uq8iqb$1jDdi06%`w;yOw4UZHiK2CmI!;A&wg5g?#Vr?X{0M4u$K)R@k?>4T4eF zve9k>Au*#W*(Z$~;nuchHIWa_q;^KT@B0M>1^v8%htdb0FjWn+U~TIZ2Na)M;}-I~C{nr}i#ZDErM-+`O9&Ed7hz|_(bc7%K8boiY}BpTEX8cTefPK!vu zccy%*>hE^@u<$L9SGpA?6RMcn8ClH;CD()y(ehfGl)kUOzX3d>(aFuTLx+dn8~N+! z89?46lycCfdkJB!V^$erL+dD`J>EEUYl1EXlZf?_1bZhd+JZYA4wDtC0}m33v&n-dK2W9S&+MD%J&%Si7?_L7w;BqNAfn ziu{82siG3a?DHvW(BoJCg%!YMo1r`nr?)M#_a7PP>4kL7`sEpe(V&$^15W!nalwkc zrzTc)N>f~Gf=^x^iCl@bdub)Sm%q|g$; zjaD3Dk`HB}=@Gu@v1O!Ot*=aH7<6#ZDqk_JGrmjFQY<_e?D;4Edoc**;}*xFDdrU# zI$=1VT}sEdZ6F~ozVFI1oa2g^{H0D-SZTOZNGSJD-}RiKz6h01(+Tv?U1iG4vDkj- zVbpPWLUnvw&xCiklK^_m6}I*9mS;_FhwPa)a?F^HqH9UlMM&kY*R$K0$zalF?a)_v zc0QNTG&^$`II*RYLkQKZ0&>vY;IBTpoMhzrEGz4#(}KCEGUAVFIJR`d)n;gHY@em` z<|6=r$&*7`rS4rqrRA<{E04;Zxh{n#eH;bspz89SB6!1W9omAG5Ivv1ejINMf~d~7 zl;3Te%J{cBVAf|lANsgrR##V#kTxKQzArm6Ak(S~!Kx8i_*Scf++%Uv2n%)qy$|YW z?@vbcMaxv2+}xsQzT$#!O?k#7^9zwz5V&JdS@amGbomCc_1lbm+qCA33Kai|rg?LK zp3LB_-WYc@9`=%WkIu)_v$*$jT>m(ubKxTy&(Ye(`@R<_YAzjgia@J6nn;k1_6~v8 zCA7a~r`_!-+-84 z<=YNW5NZH7QUSb%XZreg!X$FKRYZt;3mB&{-t~~fttX=<1souIUMtQ3dCU)r7}7^K zQ&s>KdIN5IeY0Oe7Q29Q_fI)NORI#iv!RzEqr^wtOCppj6-_`Gv}e8H=xJpYI~h^_ z)Xu86jHMNcwxmi$&&AL9>TFbPS)yz92y|D_iO~UfNonb?#e|)w%Of=^SA!Z>)-X={ z=5G5Z;n_%uYFbZ8FVNO4EZ_>(IXCmP>0{5-eVjyb){lwvP_ho<*H4g?-T}~a9@-75 z&`sd?k@r)1v+{VenFGE7Iz7U|5b@i^Y{r)lP)sP+V(eQ6qFkz@4y z-e@4~u(ez>5!#5E>UAvX{r>$U4Gy3auI1_b7Q>Bzr}Z|w>RvoSI+@2YK2RDRJ~A>q z9QCy?2TD9@9F*0KE5!jG!M3(P4E_CUou z&9%3oBWfgQmAIV#c*3f@k~T*hw3-;F|_Gzs^{66nZXel zT8!D!9r;#hnR}c$Mn9k6532G%rWL=7A#ZPz#PXGHCpuwxBq&A{H#dl^|R+iCdO`8 zdfyD5T&4c5eP`0qd)ZE}Zq`A(qFEEYI`%ZwpW>Dx`1oc$Dnnqf!={3fm<-pj`NLhE z&^*I4G1=KCSEFPbE;*B^_|&eTnKQTYA~3Hv{m(v{aSQWMjj7I^janCN(b91v@q9L* zetywd4EX&X4fM!*Ae^|dwPo_GE*<((q9I)P%7gIPl@>`drRdVD^fvgvbTO9C*42_( zo0%HoIm;TnN-b`+k;&wTMa28()-tkB4EW`ptm!kUIlrw0^;iMH)v&ESpTo#@718g@ zU70B7JBmcYP5&|9f$ySw`kf`9_yLLP{xde<%Zn(wE+U42p*vcKMN)H*pxTlEy@q>s zu{reMy!2YNj1W(Mv2R7!^P&b+{k)98tWJjnkc|C7z3`xt5 zy#xf7#qf88kmhe^3n4E0mSVDb+NgW%qbGH|dXj-@?*+x~!d(=uBAN$*n@bMHMsRXa zT+N&^t&H6E*$}E6gjjJXc|V z-KDVgxzC}>IjNDV@49DwvWtEMj@J!E9aH5b60FS4={si2OX-^eh)Dapr zLOAPP?;E2vRFM4H>JVSn_wYe>cWU$A>~u-k{vs5ZW9-9zahR!+#Sl+-_abaW?dvaX zriZke*eZeIpRsq}Uj(G9CSWvhK1(9WXjAPmkDEh9wAjt!7YTT7SckrcHGgY zs68HymwJ*i+#dt-O%OKwFw`RfBFSVTH5rP*Xw%T>y|ROY18sDT@29W6DQtj(U=Rrz zivd_t_)($WY}p8P0zg_#e}PK=n-)c%H!xW?3-M_E}}&^`h5)MMs@-1Q=PfVKC@yF-T>DnAnnd`V$^qh@!nfQw$Io z36S@J9lSiCA#2Ee;|ADwY#={F0G9F>do`&JudHy(NO=|WAEG!Kz_$)YQ2u6~Qzuj0 z=(&W&l7e{cedc8YVtE%F6i?C}s8Tmp9b=44#Mol-um7# zr2)A2qQKDPl9k-F^>6f~5d=75C#&7Xsg{PD!ww^>jc(K7H^P8dXlpzGg~-XC7nh-P zZ?pEvtB(ozMyNFG`pzF5PEJ0Th^Q_8a=YT-D8K_RXoTA zm{7Uyv|sdqujRjE8$mw^O_n|QihCCCTT`$;98i?_Ay7PHcZYux>L#ubEA0$E{k6(F zgBzjLUGESa+;AD~?VELQ3*LpP#KovhQ+D7Ynr`a(1%C8}WI(q4ty?oOQm^d_O03?7 z?(ZxT37x|UMh{_FHLkMG{bPIAt8YufP%Fz>*)8$W0(~jm?kC!Vbf~z2=!Xv<+PpNt zC+#HzktIZFw?)eCBY0T732h$BRJBmQ>X7GE_)p47QGpl+zr(gOpnP=OsN=w4$AO|u z+j&JjV3*j6l0VFX`-(@+^u0#mhP8#RUAxxE?2=-d42`sBAj!z@yVP}fp2-`r&vKQ- z5NN&#(|W&UcQqBZI3VXWNtUwj3Rcs83dfx5S)Hk_NW&*z*>?um>X%a5&t~OTQ}{j*YqF7c3dB%tHam<1QfZg{8X_;Xu4dT7UnI`{3?wzt+;Ei>wEX^`OWoJk0!1^r+7#=xS+gE z93vbSz+QAzjDv&?icpul&a`x1gNWZJBWkSPE=WA7w38;~C`D>7GdvR?Rn_~L6(I0K zVRr|epUiiFIx@u+@ckIwAmKxLC7`PXzI3$3+(o(8}q%^LIf*@&v%o*jxd* z1r03fZIx1QGwBS2AusUoVolxiZFm~z-!71%D0A? zp=AWr@SiQYU8u2_qLF49y~9>UrRR?rQ{#w6FW^{bk|V0(1o25um6tHJXTTBjhJH0C zr}=ZHOd!|yb*8bRyrLq)CSI70K9YH0xTdt!rUFTZA!TX%LWX?-jN|L@`K@+b)<4|_ zu`(_DuA|~N6X9vJ*~}r2eqteCfjEkyOZ>$rYcm0#l6z0VQ$%+QS#}m2ziLIt)xysn zzft-j@zxc1>rLTk91r;zG9-tuP-9z$f?{rSRN8vcid)*RlJ8SJvK0Yj7}7QgHj zH&FsTizn|?g`7Kg?x?v}zQz_b{Y%-w;><$0d)L7=A@H@7(Z+T&w5YkcdCGN{;^pR# z;PhOTCLAK(^J#G0vft#LkBzzx&c5q?rNMiyRjk@8R=_<`q3`97a;QLOY8^wuO_mk~ zF8Ro%;VMy#Dr1#bthFwF&0P!B26XU2f#-PGbx;5XvEKzfNgFSW8DTKP=9$w-4E=J- zX*-Xu0|cVSGTF_S|M|BLUsu;(eD?94Yl|vH%l!DiUrvR*m6W+BCfK?u;Ez-|WEBI+ zO^na0l)vWoJ`_NIW#X10L}DJvZu@o|{{Hq$e@*5s20>m@QTAr_8_5S^AC{Juei&10 zBabb;I6d-_75t`cHKqoSUJ6%W>r}&d z4xtg*ix&f1IA0kLrWC+&Ul)oS);dlpaWQ0Avaoa=d`n+E#SFAU)$F1B zQJ5R##7Sq!e1_7zRLT-u$q{YsUe!#ux{Cdshikjv}AcOTQ-I z-GOeGm|a4oTT!0SE5X#x4U2}+jjqHef?hA(dD-x-ax6rIT0;NMyQjfc!XH_1(zTe-X-^muVftf9-Z{mZJWlu9)5;^RQJGS$>cMT3cJ`RngoT?VitNU)g(k^>C;*eDb+sd$c0V=NT&! z8~Z>`US7U$a_PX!DB(Tly3K=}%Rm4Rv3So^qv3$`?&{nkzP$SsK%Pd}A#b*`Y4kf) zmg&|bSy}md)MT=4pZ55p3(t6-obfq6hK>Q6G)*fL&cbH`3r$Lz(oZJ1j}~?J6A5Dj zRzb^dT8T5#LMWUn?fQ?W0&VIeKOcH$%KQFu=I2Iq&Pp2q0e+jN9`mF>4HgT%pIVnE zB3XVat&p_z;>`l)RElNf8|iw=SOUjdWMyUjod3Cp&Y7TQC--@dJTI<{6yNwI;{V}0-6t2Pep|1hQ*i1d^3 zI)z<4q+w*Sod`(e z`ux~2+1@BZzcB&cqf*r5e=%+mnErt!BB8zzhUP8U?lK-ZvXea@a_VJHeW6i-T$nVr z;*inyI5~2+&pd3&Xsf2Sw)VTa!ijt&Pu-xB3n`D5h9-b2b=sMv;;E|Ywl989Zn&1^ ztDLf&qT=YBU8aG~RF}5GIR_Y*ENl7x#cTKKb6=`mNh(3HGNH6Oz8TP@-7sGql6(?v z^ef?S<@dBTV^%8j#h{nR{%Xa9pidn8Rt^Ecn?ZC=$93cQVQgSXtjqzO@vlAIwK!&h z#B^=q`&F`E@Un_CN%Zt-7=szFin=AdeQwvF%oS>s&3RR4ty>=d*4MFs6a1~ywHL}J z>MNhVrymh(Uujg(5My;a@&0{80b!@q8;~|8AQWHhpss7N(9r5=Hqor<6C7lIY?Trn zRn`CN{VpY{u+(sif>T20x?EICSw3N>+q+0mC>^5fZk7ELGDluiDHjm#ovR2-Rykp6 z4feJpwh9XYJn$qhHJD`?JDNwPAFqMrHqc z>($EsE$T~ut_g&pKvuwl(PI5suV>m7@49c$_L?8gQhNj+>%99QGBQ$>VC3JL^-m&M zQQwWUQhZ&cLGGs_jOg8UjcvZg65hWPWArQ4;-Y*Sq%jycXc)t2LF-Ae=x_a2#J<}% zds>^{OHbQEqtOtCB)+IR*<-HqysDp06AJ@sb8cvlNvWtbUv#sVfj%f0%lx2!$IX0^ zEO3mp@v?tMN4uaVrE^wKpyh9s$=l&{rmC$QHy>D%Y;;hGnVQw&tjDhB=GE#= zI43EIo!I^YpGRL`-+7-ptM2uOMjbB+K3N#MEP~G~%*&EZ|47V~HiUkSck&$9?Nwv0 z^0jEeKlWYURAZc=UD}!^Oza!_`0-nO%^yTi>=BCwb;P?&b&dMdg zh;9jX)zLG=E~n3}36wD0wnz+&KM{(T63Qjyyv14(<+tmz3ys9V)Gt%gMrtmhW*~XG z5W?0r*OwFCe4dZXgf6}pP-vWY3AwT_dz#pgnO(}lpbW9t5<$V!?;dRoUAclwNp9|3 z_T9V*5}U8A)SX+MpPM_PF*J@I+4EYiY1KMdU>W!;D8N_!Wbd39;K>;~QNTr}_^F8A zGIsHS|5VGU09bejea^0IIN=S=W!|H0z2h;c)*q6?XwY?#zRwR>I-w#=@w~j(Oe_|o zzFzqK6$d1x;k$$muP4yC7G8wM*p0L`>r*GuHZ&(WLaNGsV_c}xJ3f9OS6n{Tv0_-wMd~&!e)Je{ZZ>JZFKGHTemo&29 z2yJQqG`Sid#qJS3iCjYE#BH-0DjMfYyz!+|cueRK(Sm-blJ z?>Y$vWKjChYczCaS~rLrfmM=<8Vc(Qyg+JA{aAkO_y}a(@%b3EiUKozcTo>np%esY z&*6FchMugQAmyPR!-@pn(ZNsJ>2ZTmIxuzvKa=y6^O+_j7p03swNdk6MnH5ci<(OB zmF-j}zy<$^f+0iU1eFo9NY>qj)TT{vdYE$h28Gt-q+tvz0CnOG08ys z1_C`oE`WeS+2ffUV=1oT~I5MxhDca$2Fnt zytCG~0?smuvp~;*C z;Gb+AK#<8!!iHER_~YUOkbugj8saci_9;LN3PG?=Vu35ImE z$5l4r7(h0O-9Q7z2WHe@GN&Z~=D%m80)MpZ>f=i3B$4wvxzg_Mga;}0g^aHuG_%TX zT@_~u27i>MAVT%(T^U*p{NwTFK_ux-x4-#OX>R`E$Nva)fXdDh3I4H{aU<}2QaT9i z@Bi`bXs%2m$zgwZ?Jgj}2W@}MtD}gVcTO?AXnc$O8Jbpi8lb|b4C#8(JMn-Pe;bnu z>2lor>ZMe{2y5&~_=EgT!X)jW%BBI2IPyuoTuK=5fzr6eOgR&TZScN}C za{{@kJMlFd4dRoZYaJqGbPxag@&v2ROC_TdOyq^dgfBe}rEw?J(!)|0MlPis&@4R; zpnORo>*P>vYVc5_@Z1P0szhbXw-r1jJ0jq0STh%b$kj3FkRSQH;&{>j%a8o*^y zm2$a9amE6`s5pHoOX}VKO{}~duJr#hF8`S6gLu|yrWRF5zuXg`{l7_?UJ*q?jQ}5`{r3M?ACO@PGKEM^Lf)aJ-KHklv8-E60jOYyQJEAW=Y{ItH1ngvkSlq~A05 zAMinPD$X6|i*RG81%j|AVaFet&?pu~%mZk`QXyr+Zz9TQ5dbpOKp728PeYbnj1(l( z#yyzIg{V8E_-aGT)ifM{>yUw`62prIxOb4r_8{#(0DX!8BNPJzS126Z|G2o2llvbx zcNGB+X(5qV0gXX}KY=&^E+H}y|6}yR;{P#xA=CFi#xG?4`a_1V@DTwN>wmOhoXxvp z@W%jFx=#cCXi!pG@J9s)a5CYT`)H6u1&POmQb>nnW`R<4UH9U6!1#VsV2Wipuv@jFFJVL$110dB{3oLQLG@UUM zWkB|W5K_{rjW&*YiNeQ5nT3nlJc4xNPd<}^|B%(RcnEk(U*g(*-vob6+Q8|Rw*HTc zjUm%b4Ki#Zp&SZVK%C4VpN0i+lR^l|x&P?jRCM7|)Ue+qIZbRl7rfv28P%7zJQVu3 zzzar!(>v^x@?W*JR9}TrGSNuv4=OB-aHPhSQ^t#>$KN^%d&eCE?I&STyc~`vX@)`+ sPhz`|3#SypX}2J?PJsWP57zxa#m0JhUbXLc4W)?I6@9g0Rh#ht3m+9Jo&W#< diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/WaterSigil.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/WaterSigil.png deleted file mode 100644 index 2a8e511dec8db605f7bcaea5dccbcf026e4bfc7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29093 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 T67V_^2>9q~8);Q**vI}KZK5e= diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/ZombieBeacon.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/ZombieBeacon.png deleted file mode 100644 index 52f57df6a593653e452ad45a0ccad43050209e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40967 zcmafabySpJ)b2ZgfJ#fJz|h@-LpRdhjewNW%_stbfP>0Mgxc$KQ9q z|L$6sHLP=(*t6gL?s)co4&mym^4QPFp8)`Xt*9WQ2>>X_Eee2%j$F>Xr*Du8y5$>r z8RUxmxt4AXLM~6=D;T%|!1EXXenCLmH&W!2819NHvKVXV6ojmFZhHj&$fv06we{Vl zU7Vb3oZXRs0)VuujfK07^-C{%ce|JJiYn^XoHiH$@Dfmzk<|A7wP)fruibkdxP>ZK za>mK}EN32&?Wvf5&YUzakTma*BQ8MB(2!!s-(aUbZO1-gPD|>rH;;VaQxrj=?klS_ zuS-uyybceR{I(8OTK!hGep_@d``M0uOBLQ4P8GHVK1#gA!$d>*|1Z~20%AnDo3 zI#6Z?UYVD8sK}2_f6^qelKh|jmro?9|GR~etRr9j_l_?$B)R{0Yr}>2|Ja6Pd4(|D z;bZmyc$hN3zfKaYJVUbtFwt^SWS%ODWB$+HPNrEQ>*;^{^CAhE4+>fT^Cp3cmohvG zSaIDopzEDBKFbk^ebDj_ubrZovjn#x+-u?4bgIddB|M%eSG zX;5~Yao6ks6JRMXA&t&TDiZXO6hM(wd49!?=>>BF+EC3mo@vi1vDEjJJfZ^_yW&CW zN*=Idx<2U3M>`gFyf1i_WdPFxX7+1nB2b2EZUrpvB;Kg!Ph-roEwkm_S+E5~J@jow zgA+9)p8AYacL@NSpjVPC^;HD-sTcaZLnKxbFVUeAu^)P~EdP9K0DJ*bOmkAG3dr$E zwsiO$4*HSN*A9Dd&{K0fsLT1>b6|KPYiqmndnX&~F%6*pm|ogxRFLI_cBBTR3-jmy z$my5w+`}*ry1!lp4sf~gJW;q`bfp6YZ23vod%H?xsFs-jS(-QJEZ~`SyU;4Ngc(qZ zqL14}Y`7qwVO9w=K|XJG`sFo0fu?h81o`MMGk;@)T6kY|DXgE~L04TcxPRr``Z(1= zu-8!Yr*VCbaK7mMcMa;Yy;-4a49!ANq}{`>cAguCw_~k|0#m>+&WFz1g68%Lzm((i z38msvDp7zB5?51wd_4tS?Zo6Emm_yF0M@917Xn=3YBh=KPYtzMtg3 zkpI25cnK=~tNHAf0(g9K1c5$+uF$#~m5OOf2M&pVHk|CzRSPLmzLlb5>|3{?|uiKU``_i(PZM$?{+bc_GsEV-0$0#F4#|G5M6C5wcA?5W9lI{j}GX*Hf%*LK@YqFesMx4a}++^ZmSDdKa&$?IvXKrc^znfL&Qxl+cS3E{r z>7Ii&N)2^h=CS#c=DW0YzpY$*SYDt~F&E_63H=!v3CR4j=1xA;Ho}Yj4v&EhHt;Mf}ka*IWcIT#%n)Eel z7X?FKA3HFXFI@2CJow#i7y34eWD;SJa!3Fk^ebqXvDqx)-ok+wr+@7DpcYV8nrF<3 z{o|Q*eBP;vM~4mO!r)%Hx(V|25S_{1dJACu6<-9JSVF(0q{q(65l-TvcJby<-(lVv zKQn)`UMdNwUUvN~j~u(iAPexlEl6qc4sHq!BSrbdE{O$5auNnT&3~X-cY6ao0!KJ- z5I#{nig{=g)du}#o1l6`7^XPN`*z!nRqC#FAi6d(@_Y{=lD7H?R8>B>slhlE0}O9? zfumD_Uf{?u^7usfncfSM519^P!33{@V5H z#P#2`ny5+N3KZss_O{9hsGs>6CHRagyVrS2wRrIi{t}lIHsN?MC8+%t70GLg?NgB3 zyVYly?uIhq^Ak&w^%JvHK!#!_HEd*GC3(*S{5r0U9xQv9B$tz7QijIII2z>_-Nh{@ z#y^<8)@-I)_cue{_5E;-C;hd3@r7aE#K_IJUSjavWay}C1>1X=EvXH*+CW$}F->SM z^Sa^s{k>G?wJdomTCLzCTF&WbvQO`r9}*Q;$Tf#EzbH59=3-rZx$D zd~%!ZeO1zL!C^-3Vrs6(@lO>qDU*W4rThrtqV7Hx zDFxD)b5(>wilgBzCDSA`DWry<8aCXiZ>j3H)@j?*xX5wJQC4104-an9V~u`S@hePN ztC&D_+Q-U_LkQrnP?<*u$J(|S8c-R5^BO}&6}*!>TFoVhw+bcPGr6S+gUBN~HP{l! zK(flT%_d8zCJZ}!B(aGu{BTatSVbXGQ2ekDrxA+pbF1&iD>NQ{esRWThl^%JKlmn? zdft=f;{v*_k#%zi4+8bKK`tZ74re8Say`F!#j~U9>+$(bv(!lOl3M0`U0#&#(MCJ* zHfpM3`Sd9p`P-vNy9>aQpE$ax5XC_MLM%eD2A5ca`h8pex|e>HUb+j`bX<3qGpQXa zPdhI;(fHcO^v3C_9qnTdh9~FjGmn^W(S^D<6r*HrTb#FlB`He0ux#I)j}G)n9s19UHSQ`RI^6~y z#Ofu-E2Q@8mml}(JH!=eIQhDt$)iKOlogB$W7`Z{ALr(j@)IL_V4-??`?KOxEnk>f zbvZT0NY|U6OJ@o%d2dGYx>x3y+`Z{;fVlf9yL7$q`L_5!U-7W9pk#SE*yB|W_}9r)7)O1Wwch?t*7hsoRW5v$WA)}G z^jYE`5unb-DO*}G4#{pArz?TjJ?Hxd)y%D?|LZjR8CyL?Z%bmp5Oi#8U9_%&&l^!Q z6>CN?#M6Nv-uB6;2#^DHEuo|7PB+XB@Fi_?%v7fe>dgT;8KDs!DJeT8JETa<` zER|Rbi!^T;1)s4TqOGS|ouz)vRr01G-sO9GFFojBLj_$fnBD69r)sVoQK#-f&~#x- zE@O**zVx~r48pK>cITAoZO$0ptdQXA5i8k2Z5!LDIKa26k0IE7R3|86m{iQC363B| z`7aL)t9Z6g{^~az+1vcMNyN?zV+6g+3e}TL@PCLx%@{JT9(_-WcrdHRT3FpK597pd zdodMxiCZD$lKoEu`p43T8C0B06|0}xb#m96rU&*eT!Si5`qqNKrwlf)Wm5QawU@A;-uru!sXk7Bh^A!j{g?fQfp8BbR#?4p+`nC9m z9UZqAv6A^N_4`@!^(*6z(QMXI%ycc4Q>^^SkY(>oN6D!q!I!pApSLk(SP&U+^V^Akg~B? zwtWY5-6$0=7$AZSQC4!QnV_Ah^DEU~Fx($i$Bc|b&$nHHXf$r3u69MjhG;47>vUd_O8B)d@^QaV-Zzv=dFc|>?Yf>k_E2h}??}4Q+1qTllAj-mo zG`$~!(NEOf@5OTye(`fbMn5fT%R`oM%mdV9J21`7@~7p0UMlP_Jny2q86!#1q#uF= zVL;o@vMNE$Vyom56u>^n9c`Q}r2NwX;0yYTYVHHDZ3mg4My#5#csK~yL?S)L8z`xB zWz{-Z1H2y7m5)O^c+cwUc&|9J<`M&myc@;gG?WTPlqbSiwTcINY}6^N-Zi1Gqi=De zy!sf5I-kIueVr>4hz#g?jjtGn2crMrx?YZ1(Qf(Hw@b^D@lz#Z^lI7!a>$LOw%Wux8Gfyiw{HFndRBsno+^#M*LbDjAA3C2 z%lu8VqY-A|MoSv=lf@SBUbsY@YGl@^_ww*kcCi6C?5BVAfQG4iXDi}o8YpIoEb9_L zrS7St9J#-m0Kj_9$YI5F1S%`Q~ZKlBBMeZl`%y5giaDlfvI2ZA@oreL{$6_pk-1FXFZ)BC#`#S2Vckogvgj=u`Ur82blmrm`$5r& zL59KRp6`+3$=*Rku(8(($HCFO#p%~6n^$xTv%DQR^?@|+;wI=V0!+$JI#>iMdhq_` z`+?{a@p<1nZd~^jW9JY%(a!H4lm4dl-icd0`Bt|sA0qcVv$Y3J+hKRp-^?abUP?$AR`tIs0+&&Xuj47--f6Olhf?R-*tU2Hj7;vtcK_{S(h(Hgbbw({zgqc*_qIfk?dZW z^@-B`^;)|J3&tTjBOsEe*qFq_-;4QA?IRB5!GyVt5v^n?Z)Z)P zHZY`}vcSa>6F&TpcLWbDe*WFOba>K6(8RrVsR6b{|Hep@#PmBYu6klo^`3+;=tEDVg;A-8T}PpiNIjT|)aI=;OWhbm|B4$fRMy*T$AcoX^^~t9`>uYi zUT=Bb-7yINwO{r%@oSC9hd`fzzrz==D0{yc4D~o+#xAY!G(4J!EFC&0ih|Mo=EC*+ zxih@7DLWXOP1?tH!RvYy%YrTW;}vmo*IMU->xsJUddVle5%|bi3U_zsiHr1!#+zg3 z@}S$%s}2XLwEg?X3X!&>7!YDbx~7)-VF2O`_NlgVeDsFxTTOpZ#S(lJlM~$+h~gAR zgw9Cm(MS)%A~UolXxY1F!4~com1mJ4Rv;k?VV0_K;RuW zjT^(LlGJvG7I6)@&l{gimISrGJ7p-eveF^uZEWtjI84mWY_zJn-A6m$FSq9mOIE00 zbrZXppS5V1i-QP_)DnTY_y(3%Pk^-I2$FPasnkq4&#Qe( z+%p%g&?T!}YFT$|Qu9F(8Rb4rP z+k{Zt^e**PnyRLWv%T+nfTHJby*;lR$Niix0y}FmUoT$;6om;IQ%mj0$hDCwBs{43 z|5Z4liLSoiV#3~~yKY58?@E2T>s);Lq6vZ3#4sj|`p)CdVZq87)g8-wQ{n3!iNPP@ zF%j{bf4Ym--(Y==822xioJ=9eMBy{~-KJ?2eEtsY3rKx^_^9k|&W1M8x%U16 zYD*Edm3cZ%%-22tRAcEr=PLau=Of}V&KS`Z5#HOaOT9xifFNB9Pof4t?yIlTWnf6o zr0)&=xf{p$Nb~+F$84CyzEc*D(J_;z)afk*DliHj+ zq+p?RTY0RX{;>XQZGW)ZxjAr`WozTwW;F^8L(W9#vs+F-Bk+mIHgIkP{+5^0WmZgo zQv3(?h!cWx6QT6)JH^-9rKL+!%Q>#x6c1!wU%@-rt#35X8OK>6jGpFGukn8#;S3qK zlh;0wh>`+ac@lH#R3f@KtFcQR)Enl+o7iwk-I-)LZ!asDP~4uLVrB8aTt+LA`{39n?;I`)?kN z9fVP9#A4hl@cEXmbmWwe7+htrplP7ouI`zlqPedJz+5hI9cnRf5Gsg(2%0^e#S@sb6MWubIPy z!MG*1*ZSeYawqRgufAsvI!T_WIH_Zm$CJVZGGZ+0n_ zi@$;Bdnndi4yxae^<%MtXKb}2QWH-`+u#N~z-O{l$^^Lz==F@V7gf|UI@Q}Pg2kY$ z%K1R~U({+p0PnI-XI^uI{S3BU#r8C+L%Db11{dDDSem)Ezl7eynbe2mprnBC+t5Pp zPIMSab*xQgEk;@kxsGbAPLOP$Bn>R)Ro?}T5j;;2><2T3eF9Z|wvKt$Aidp&c}ivH z_t~0;2L(2w_~1V=rPJS7%^94SzL{-$elohS+vIH%E?j6P1dUR8LGmbqe2?h+Fm|Bv@qgr-=Z$ zccw`{X93f>0Ikz6ysLDBva*v zi6^&M=iezM6)V?GZ>+l6aCJryb0a|qPS^YV>Bka@odaQx*N*<}AoC_&<^1s%UEqwM z?;fI&aArB^kiV`{KwiR4qUKIUf`TA6wAa2)CldONWwxx<1yXR)PQP|cB|3hYuVEUd zRNpw-xBX58KLQy5)H->!rR%AmoAi6WG)nk7uV$w8ZyYJLBd`Xh+8CNMBnJ~`VEs9# zJ*evN#7>m=e9(3j(`!cBfG8lsFY9@NrW@PDim$=BLnbBGnhnrB2oWLcLeBL&OB4<` z0mFR#K(?V^oo%8+6Cf1DyJ0wY7sWdS!L@7it)Pw}wgAKYZQ4Ge8uFeRXgsWg_FS0n zVj|_=GJtCfkFQr1%Qce)XXA!CU%(eZOF(vltqlwG6ma~Wa8ovDeP~MWkw6}t1)4WL zZJQQz#Q=n0ZRMt}=uM+ztQ8OyRCCW?ebJ;KVf7jVj|Fen+w@Djv6l;}DlVZ$JhV|p zq&8IF-oD;-G>!&eSECwA^9Q8h$djahZT56cuTLq+BY&D5cni78`J7kb;vdKoHJxu*6X zO8?k+w3ZuKC6i#l>8zjiu(9a9MT61;j7dK3M1Wd6(?$>go{yf3M zl_=1CXo(yuzuORvS``xr+)awrJvF!RGdO4ZV`J7&L9`VQDS%bqN1v^Z3|dI_{i<-! zLRKB`x=dGeZP$+7K)cFA&v~V-E>g9Vedx}`0BpFz_8%B3z2j)s+buI%9ss6&YeC ztFxp}Y85X^g#KlmNZ#)Flg@E(M_M@1;PjLj?Z{BvQvW&oN9KpOcXlc#TK!?mUunGm$VZOV_$ASGr{>&e=w16{TX5=@!@=J=u+ngRyhTiJ0hwwwun#Z1 z{5+}4)$pMne4Tghcvv=Y?8^se*JD`nePZ=r8`f%CT>$#F#gjp#WeI5nN5*XYqE~Z8 z35MT71ZNE#A87$j4E0geQ!MCxf~FSVQc?p@kn3J#NuGk5U8wm^GSsJ*0BQtsG~S%> z0iyMkmetkdptz~o?J2i_H$|5%(4nKm!FsCt9KZ$5D+LLVgxuknf$V~%I>O~d3l?{R zs6g(MZVmL%pq5KVMS zWzGMr`4?@?1ygm<+7cNDpl_uKhOlG7{by^LtU8^gnmZklr-cmATHua&<4~aqwJQ$U z{(JBc?Pn*m5wrw|4xkb@C9L z6$D?0BQf7w;dgT!Wz^22_*sH;0Y*49@stLKu1y3rQZ7%GmAM~6^B5K#bhg4VUWO); z)|{BV=rZclqfgZ2N+{O)j`v7DXX01%HC?PmDpa3r5U&3lZNxASx!wacW>JMGz;8(_8*#5WFc zSR(;eG?hjawEDhcWXqM)sxdv_@=z~wN8nASZtexqE8qw|h&sl(Mwi{uU%HvW9zD$A zG2oa{i(60Y^J;0FYtK3)D0zhKv1LNftTEuLq`fX_vIb^D)X)|_z#kiPzk_^(FS3`} z594dXbD3-T&EIwzfz6aFbj`Y|i?75`(YwxtH*XHBAkd|o<~yncAL+jyoUX@7eE4N!T@>>UQYZCn(&}t#f}5g#ZIHq#TJ3u z;Bwc|p=ByJ^fozH4<3{|I1y}>Ot#^Rft+4$B-5u!_pc!JEp!Q-gh%eLkwdcA@_$w> zbkjDtA-$g)x!>ls>)8$fR}R=mZn7}7*L5D8aOqx51x~ZGWsvN!vic}1=T?4AHYySV zqwu+A-_3!Wr(dqW6EPN~AEYt=9kCH4;=WG+TmMtR%R9SC4DK9_1sxGNtR;z#%zf}J zOXwC)J>rb<6+$^9R>sE#Gus9OH4Vc#oX89MIXv+3#7w6Uhx3o2#=~ga;s8%W&^vOb z$kO?PkyKGfUFo}J<(O30E3gt;EGcMYaLfzG&2uS9`R*8I#0TH-xU z{(RQwnNqX@PR&?f??DjRlSsoOC^(LVhbYwtqs!>&!1I>8QU)l=C!8mUMQHmE0i?gTmK+ zG3(6$BZbc#9X?@+_A1%!^ReO9XE{TBy&X!9O_i*EYgzdLVu=v+BCa{z zXLTMJ+`aFOmP391D^3H2S6XSE6&%{e{Jne^k@EUA{3RwjaVu&~yRm z({u^gQ19cciDiW4sFaV&$1H+s&mP6IeOgwTxwT5wrnb`?0rj@xlfi61)SQ9g7SrOb z5!Be8lBwU`w|Uith0BebzjOSIcZ#9%GOt4Ur=p$_ZK>38TfBvD?fwo~a zjw|S>s7Q!^aCyM0nPghgtZv+D3<*6m6fc^3F`11zeVF>b09@U^m zxfDE=>Cm6mak%UQi+lX-8&h!Bv^}+nU}6xR;g>l7jwDwT?*lW=;RU|zN!^8DAp-hr zM`3z}(TVU0Q+glN=fV$Ow8Anp+0IVwR-DA>PZAdTel;v~H$EWa18IYzJ1;@%>oi&t zr7tIH0kY?>*;q75A7pFZWQ-(wKq@9HF_|BgVm2yGYy+ke5oj14?2JBd%YDoI2RIz+ z4+!@8G7&<3UKa2mbi>1o%1~slFY#8%#$zu=9~ z*LWauIpuV3oxKRECto}qC~SnVY;8-jsqcSGJt&SA+HK03oo1VIy-Grm@}QusiqH9O zyoD83zxOz`hVe;9nCc%m62Xni5h~R#IE1J#QPCx&<{sg*imr)sit*hYF1gF2LzFFt zC5F+Zo@+BZ)OuTU$wjtp{l2=T>kseVoK)gK3=6g-(#a8$jy?q>Z`H_SIvps=Z&E$M zxA9A#5Q5;>uf}I!h<>>R+v{1j|1$GalgHr5tgTioYK@1LU#+306Rl-1PuYy%5aZL1 zDywi`&lCMIm;BYHQe>47QmCMnli;HtL@WzXZ}0RLG*)^Z7aR2e11TW9BU3iPc2$pD zh$`&c#r1FG5I`+<4+Esov7^WmWVQn>#R+Z$0JE;hG?@}h; zA}ECOR+n8emK4ZLi5ou;ia#D;Fvxf*Fgs^*wjGchKiOHDJRgYBfqm4(`WPl1(CAy{ zLbUw@$q0PgApPyCS1#KGhTvAkoDV)jYDQjgH^qz60~~cley(_Qip(m!(&PuX*2Xf{ zLl57?D|o&qLk7W;J3gSr2l7UeD2{hr45&OgS+j@s*%w!Q1%R%Evyy;XCTd=t|cO4iVI6XWonS&j;sn@oQ47y|xz=+E(?)GF-1B5sdYAz$;SFYw{TC zOoo=+zkED^CNF?RpUp#O5*(Ft$lc*$K2=vXmv8g?t$&DXL++=RcxzkytvH`MwwQxU zD}wP4W%438@tIM>kE0^up;<<>UTH2_p|gKb zQes?*P6o>(k%HI;=^_`3xL6j=nKw}Bg(8x4>5X>`+Fp=B|Bi%MOs8pHv|np9X!d>pAkd87alKTwi?7j-iNZ=ivv_N_88e!$%*i}?j>`-Pm$ zx`ywo4Ic(WT9$*>KW4^@PP%2Ez0c{elRkOY{|ywx;Wf*mhAtt1C`bx;6XnM46i<#E zw0QFaD1#2;$8`?A+53ND-({61$BM%o;{1ocv%QU_ZYe2mFgvtekEp};k-Q2aih zzC+D-eu$JTcgt9~Ew%9*i0ll7(kk}71!cD^7W50c#3xi@dBYF)%LLTSG&`l~rfOHoy|- zF*p8P)j9WRDf@#e(&0F=%bXlcu6McnTdAa5M_(?y{4-B+czOQUS-hLx#MU>@fo9v@ z<$h9XOfvZ!$SZ!2RZfE4&=V`-*&D6oa1h=Ypr5Sb63P0<0Y* zvXTQfgN`aE-(vNc8dH03*7Da%kM1=^u$19?l8}Si54T`q1qIvXMP> z-CZ(sN!n z{a~##Eud^%WkKKU{7Q}cFhv+D(rm#7Pj@s#An#Qrs=ca*ZN%ye?mYZ=1){%OC&xK* zSPINMApHwNZScICaQklHMU=Qg$Crr6;vp*OSCw!i>j36WLWuRPU&1KiX!gMiXPygG zrNwhQE5JDC4ZR5l7aYmu<1+gedu9k|zcbg3+j4k~978fS*M6CdID?bMl0cXV(&10(s^DTH7K_ys#jH zw0eaTtHXMIojIKEWVV=niAQ|(^6acO4A`2}=8z73kTf1A_a6uvb#So#bM-+bVfmOaDu);>Tt`@4+rYl^X~ zb*;{DkopQRFS1sRN-#MILx9+guNPCiP$e3-D3R!Nk)fgU-MxFed`OGUlfP6OaVxvl zXxcWz9&|ooNS#-ig!z*NP+vlEnUXNmzm<=raFAFkDD!0Q(;=}Qx&-FBIJWm$bsKgU zp*`|&1|QNEVP6!=O5y~&<9Rbo!x5Y!_S5b${EZ25>h;H7Uy?u@NA5|k=vPTUe&x22 z!IR&FRKSc!d|ir;Z$~=ZzcD{fqIaS9jjb|>Vyt~Vz&iH8MJlPc58^2DHgnqeAP^An zWSjah?m&Z=phN^+&-RFlRnk__a|~~}c)%iqZ_RQ&uQN(b@xbtmAl`ra%1QPZC9mmb z?y%hg!aLw=GxBcY8z``W{#pnrwo}0|h;g&aOq6w!icR5Cm3q5FNlt2}-@<|8g|RF8 zT@;zZ#)L1-7UX-3-)?plQ0q-R7NOiX z`sM|_Aj3~3OAg>@^d#MMSja6=aFDg(eSSIgO@}ezB%n_jpM9|NY^SsH_%x&MGNWAY zb?Ee>l00r3srvF$VeN-yg_W(YL0Pa`ypHbX<_|Ln>-chs#Nz?=cBi(S%x0Tbp~Hd( z&LwP5mrD-%{Y~FzN;xKYdC&8;pmUeE2Sy7w`}f(>vc4gZF9;n59FHpF*;XvpM-Kg_ z;UY>gy5^5x>V`)^`SBN5T}$uw;5&RwZld)T?*#NyN?sUcEPIAPyMLt1gjQmlqOY%_>#0#2By(P0B6O z#m6r_7hBGpZCi>4oE2}c5+^d9-CHeZpBxTi!e{gka&2OVbZ4p)znl#OYnHdhcBKq< z*3;?}Gmf~+xk5cSU%HhBW!PEfAa7tX!D3dcPgPR?%t;X6bVWa;!9j(LrI~yR+mN^! zNoQ83bgBG90SSCSpv9ek2?qJ_E>}>T z3h<5j6^Sh>mN0we>t8#D$0*a~Cv%6(WkIG&HPTY#Ed~cgNgCTKapD|`nR<*G8u*P$ zjzJY$KhrZ45Sp-dq#heo{guxjnCKZA*IVhAHD$PFcq?rp>hf6oJp{X=?Z@@Ca)>sPH#I9T!Aa7H!Ob^1Bx@_}9B1AZN-*49H7MvikYIUECELx25 zds*^a&<~l8C~!_>Yg_kG7yLsL=2TO4GiOA}DOA$Vj#AC|`Hzbz>%gjYRREKpwL#3s7$+VSld1l$?Yd7L-0}r%z|f$r>wjm&)q)QMpE=M^Oc{ zM-Rf%Z)0Dc2Jx;<@_DyD#B2G^a#(2R4$Qg!M`TqPRg)iRV8@4v8Y744{HlkQV|*pM z+BO^F35Zr??q2+gSxhF`6wyC(%tq$CRZ1Q8Ezt%sJ$$wL(fP8bP1;pqHVPo-OlG5F z#-DWpFV5A2V&i5WNpo8qO6qUss_*+>7pMfhdV|r1W_q()=yw;1)p$B=xUz`{CZ}k> zKD80va7CxwVzWi|e$dpUb|SbbIIFfqU%^!`*>gG%KlbBHC*5_vhRNZpI^XPE40sR{ z5oAd<6W0@mth!MXt*>Dfaiim}lbZf;7V!XMp+$+#!vM}gIv41}v3zKj0NTV)B9 z#w~@55;oMAKj4oV?8Yn$a8&F~$*89@`uDpR{=bp4&5kc$(g=Ooyq73~m@xJOm?UqL z46<(Fm?dyw9;u-=*Q-y6B6c6p{Ml$~JW8O8!{@5>SIydg8q#=CEEyj(`o>&tzu?bs z!e77H@6Y@3KHy>vrGNgfk$x}5GFtIi$O}kC#Mp?W-`MH=%DN5O%wF4n^t~|Zs9FxL z|DZRlu-UrY`Zs4XSNYBg(}Err^gS*#Rr4(A-DFyJTOyT7hj=VRT}E=`c}pRLwdZ%H z{p+dAR20~*pW|UX@27Wxft3Hs{sMS{iy9j^6s7056g~slg?|JROp&%DaV-RamxK9mhy6H4= zr~&x0B&m#Pfkl;q1u$P_(z^vKUi-G#aMRs@De3)|*?N6JzXRv(~7dc_nO zp>|bAIz;JZs;yhMaWTeI$~Cf?b{2%y^?fpaS}!lk`cnnM@>r@g{UJZ5Sd1v;&!A@3LU$)U>(p-tv za||Q`w=wchnmkZM4CC6^;%{8zUZ{;QaRafOx!5`mn@^a=!`r`{&62p$)Ld zSE+FbZ=YTOb4`+6`nK*3^|a&WvHSRfi97X(nbLnU>0idf*>Qd zkPo68#9OlyXiAlB<0uU2CrDQ8od#Kz%WuUlO@G`x=zFbITKuN;9ROzci_}>%h)iV? zk?TLq#g20IjzdVK7NE4dUW8;=O|O1LtW(>2M_PxGx<_6pbhq=?pn)-VAgss~dU3J$ zgjB*c^n9>9zYU3jF|~UX4aN(b4epIRmTXvzHsWXTXnk{$v62ODFf(sr+w#-&t<7yB z_qa#0l?6c%=^85;!(Xo|=8d_9l#e&8|RVpnY9I_jooX>sIhkmoc76%guNv&*MVw5f~zIb?f7*qB3e${y47T4Bo zb?*nqd_ijE@EX~$AI4E`4q=WT9+18tEesdxdPZeT$>Uz-i3P-*mst_Dci@UdtrEfG z{~^QJ`9MiBH66`8{O>E&U^Ckr?-2on(o}t6f6HM4K4Vp%9#?-Y=W~TjJKt#0&m~+W zv6beGaDlVK&GUI7YmLgAfg7D9y!?bQ%FTYDN%OH8kZ{SL-UHXM<`cp*0cW%-t5i#3 z&=m*tO@d}wHJqQa>p4I!Q>RUJ3OZ9)8gcvECd(n|_q07f`ZtH#(>(pgI@i@;$+q z*Rr{IcXo*kXc>J9cuoa%;Fyc%PuHLg22lV(7~_S?Gc>?_;VffpZy^Oh$zD^l)1=2D zF#Ekz7dSEl5<86FMF^r42#dSytU2D zhsN%C6SA&&9rXu*8?#F*|7UqloouW~An;y}Lr9(FoELgtSH>BFG|6Pms@`%f;0Sv8 z7nU8C%lb&@VQV7_*z-#n8EpZtMz4Hd(5)1uA%qyyUP z)SvF=O8RcBRu0w$R)~UV60+-`LtTJ6SVcLxs*ciqakTaP1Mu+drKeOwQ_GuG*;97t z#jRj@PuFrqP_~ua5HmQ98MagVrI+cVlr;-4ROc;IdXCxb$D|I1^&`GOs@b zN#*X7VN)nDuK8^mHI7710l8H!hUUGOMa$99l9Y zmTvOT$9)pPZ6BC*j{!Sk)*kRbRBYy$z-N&>FFUNx+iR}n z8ugKRbvm`7ZDuorIUZ2xY6Vm>2ly=@(5yPXTejVlY`+`AwZVwMxy}7;MIf7As9x0lEG*CA7 zZ9cdV-KU0cyIesk!Sk?E@kA-q>}(2*+jKbHNld(hCZSZI$oF7Ev=$JDrl8{EUM}D3 zX)JMVwBw%Z^Mev*gjToi9piDQB4_$ybPO_**M>T;gx5_Q`Bs< z)5}K9n_u41h)ocSPNQP5YSg0jyU!<;e$d71n`bit%Cop!_P9xvqSrRy+b7;6fz}U4 z^zi+%hB7=`E&6Mm?kIcQHNw$;!#~mcSC_$rU6Z zwleJeu6Wk1v@rXwnCROcOX%tGXQ(u6S2ufw!Pk*8&0;0;q=-MOc942KB}t@IU&6I+ zreI4nsnaI3U$!;pvJAzeoTMtiw@sl!Jy2GpHl6_6Y2l1In2bH3)Z7yb+N3=7vrW;C z3?9e+LGhDEi*H~L1W{A?*X3uM)$wj|U88cD;teA_if}y?b8#SXV(wAkUbV%pFheq-WSECJjAsf%?vlkOYdlYft$nSZ7y0kPpfz*xP5vj z|LEetg&;|-AJ8{@Bfw0$hTIN9C$_pCkHm^PFk6nZ>$sPcDV{Xwj)e!Lzn5?L0r!mM zGLFxDR+IDjpB+5-Qt23cS`53k7gqE2&6=B*x51YcbmE-nMFXRgVbsahp4E|v3Gmp3 z{w9OY9+F1jVwYZp5$=k!y-c%@RVaZ$7TbDsb&~l#(k}2)U(x@$oe=^`nn@&UI`g5v za`{@17wQ9J$#6oJMU0>ZZ^1dS=7Va^xnL14?LX={vgyzC0~mfp2~^yv(67nGYy=o$ ztHqjf1nTulTeG2kD{j#TYa4W!P*1AhCQVV;v^~35ijppGRUTW((CBw!90h5o128sw zdUJGXsh+`!zN5N4EtY0r@VJvNJ*@pccMx3yUnqXhkX9@*`z4!x=cn}`G`Jr9cmtS0 z#JPUwI@FpePTeNzVodsGTd(4VK6{A|8+Z5>ETDWf*=lP1Qs@u$WSJkT#MF36WWCNP z@K@(g>$40*y}~524Y5e{*tqBT^J=q@Af!gRKAeEC6yMfkp9 z&aq8nQ>9U@bKXd8q&Q zfq-z=UQerd$l1gTjq|W`f1`jVm&|U-`3Hl^PJ?IPw`ERV6(qzmt*s!Q(#9MxYUQ(Y zC8NB8-}nXq7~T~nFQ83w8_xhnnEyBY7Yf3WGZp~)fWiP4I*c;ylk%?&L^3c6!t-(% z_hKAEJvZk2kdqnzX%aJj|Ha_n2-lPM9hy7502T5d+}FxuF8}I%<(Y1;?#N~L-^b7hoy3r6EZb- zjuVABSI11RKdNyus%;d8mgxm%#-f@z9Xj)nmCi4fiU-{(_M@enA!@mn#D6lK+?5xB z@v+c+hWmD9GA7f?;e!7|(^a@d@qgV}y1ScYX`~yJP6_EQ=@O)ymF`%Ok`e)t77(OY zkd%~eknZmK?e~42_YauonVI{UJNKS@&biH%DraG;iA@wYsT<$vb^;78T(?e=qC*aq z&jMB={B!X`Yvb|@CQD3}>h^L|j{Ld5(Xs2ep_B2;jbP3Z{mdfdF{q$KhDPoOhr8<{ zI6<`y#cl)X@3*dRL9&jdnzp0LDn@OZ9u--FRqQRo^@dEp3?*WdM1Cv$Cerk@A{Fi= z|0kI$J@ODJQ5>qFG6C=oIx{pI!RNk#dt14KJl%jD_k{S$8Fk-*gP-VwV7g_tj~QM< z*}@}aN91J3EPfn;R)bj9L<1kef4wqx=7#?H^7YPML8LU&*fc%Y-c`&xb~HBZNh?;F z7X_l-j4>1L8X@GEpdKj;N94lKSb3j;1a$Yh)5}xUZ*l-hP4*#%Wh;fPl2e=Zo*dv7 z@xT=gTJjSmhwlm>?`)Sg-m<545<@kA@a+ZMc=_&L4!ym`sC&yW5Dk(9EH_CURf9y6 zH`oB{sv1oL)!{U5U)e0KP&4*RtsHR{c{@ZgL5pem^K!!3sIiF1gmxa+Bl&XgbMNtE zC9Xj4_p-$U-aA*s3?&{Hv~i;aRMOJ8$}9yC#adEirMVUHd;HzQhX9b_PthG> zpwA#BzXx+g%5=1(AP2OH@^Twx^KxVmm`-H7pD6uC2(K{i1Hrw3?vL8>^+Wx$Wa!vU zw{ruWKA8SKLhISe-~5UFSeCIJr)zAn6sVY*3?Dve)OmLC8GL)V@l9QHJN?&VraE?B z$5ktkoT+-TlEY>5{ec0W4j`-RpF_8DBU2%cjqb$U&G4O=WG^A>%4qV!8=#vy={G2r zg&iVwl{T{L%y{jrKN*URM*B(P1Qj#v&pCs5RNgFKVD)bgKt|15yc{d|8!qgF zO{dd*xj21m(`@j`w8ad%2n=&A9~PR_M;M#ilyj6Nb7}taY#Yo2V@$v{8s9_zFtL@ON$6!d`^K^TWON~NxrNTXi&b?I8hPB_N~X^bsb@V zYWATh5sa70PTG7Ng?iA5m`f#yRvg(ztzCfzUK(Pws{GAhl`q)BOJ?0UMuR1CL1F@U zEL}>rK$eWm-`ib_I(?ZI2`f>nXYuOHB zo}zc~TEt)waIiNTF{53kw5@>~fl0=`fW}~JB4dY~I-Jw9Vq(%NHS0Ik&LnVO$g_fn zA=ZTyI6$z;Pc-thwv*1edI9vB<_|5=s^eXva*APagN3riP>kmecNFNPc#Us<@_Uld zYZswq!qR7L5g^F038I-;o7q{V*ORw-ql#!jMGFM2WX#Ry~AWK~6RJ{oUDGr*@L$#!Ik(d>P@=1aqW zb4L(2j-~*7e_w^F6IYy?L1F0EUrW72#qF~B_1zZL)RUQDW#YQf0PXI^!h+}phWye%oHmE8N=(s z!yHr}?V&TZFd*wfC*MCzsBRVlyu|F-rfBh0|AEDqkrDh92Q%5ze$rp3w|6N$f07MZ zE|`n)Urm0sz1M|q-7AD{(WP31)NlU(c#G**1RQuAIozm$>%MLk+*JJ&it<;Sf)=KwjV9I(5@=zW4ZR1 zLB@4eNwL3n%byDu_clZx{!6CWkBhR#4P*B?w4}s=bFw<$3Vr+B0bqmim?)U-2CUYE zp}{*Chm%NObKJz%yinhiPz}l8T#34PeC02M z7^8`l@9&x@WhT~KFENymfD%BpYN3}VC6nLp?zyapppl>zU-a5$wdUE!P87Jx^b9p< zwvQx5kHyn>_gju!#+{c1KyAE|SGFC+K-UNmq`&fIgqoIm%-H9f3v|pwlE#S^0A(%A zAWTaJXkxl{Xn$GJ9Y}gs4^D)amC%%o^mFv?F1aVT#fd6he8Wy@w`#)en11P znFif0yrXvuH2^$-7l7|4guJ}00nOTf37AO$r4Xy35Nu@Zhi`F9$_OH#$N@h66YOey z^#x47A1zwToK|3_?9y}33hbAuUg}^Mk|LT+2TF6?*?@JdyuRYdZc!srcn@QM5)KrL z10h(JWRC+2<>IeWuOBx8Pr3@AB`RpKWtCY%wFh0Y)GnX-@0kERjK6#b`EOK%4VZJt zP=lJJpqZ~X1sLZB|B9^uZ11cpQz((8*-3pQ#tC5Sh9&!+-8-sK?FB$}%e<)L4g}4+ zJSB&Sd?QjZ`LfzVJjo&snk`rD-7E#J8aiIdu?s1+FcVska%?;y5cV!SFFe!}_JK{g zkmrgYf9Ww-ksq5wBfXY2hZ0H53-Mo(OnmJq@G8h9Z9}bb0c*>jmNk|qKAoyl^vcV(beSfL@j6!*s#r_6_r0ZRP z?(Spnj{Q5lyx-zWV;Cc`ng2vUWPF$u!NSln2p_3wNeJp{b4)es2Z_*3kSGW$_GSjv z-8~Xjg_ER92lYoHpI%Iplzj4TK@>HV_+pkEBA0~|qR)Qm{n7Eh>n4Z^;pn9%;&to^ z!5=^S$^=DE*nTcaZ&3*4Zv2wxR^v&9295ngxjrqN*BY4n;Zzo@td5 z@HMt5uvl{~egX3OxLoG%H4$va-d)E8J+G{J{+6D@WwwUes*pbS@i%MlHo~^bk?rSc z0bd7w&2i{W(|5loG^l@Q56-$Lb^*$rFkp-tbZtpe5xEfs#EFQ!Kz7$c6F;MKjx_%5 z1et+}?VvuRTXvlK@&NXBmduQ01$x$0H+gh_6dqz+B3ifTATx@;CKeA^U({D5I`(ci z27DKwkCgW?py;Hn~r6oRfVozei*R$Ry~SsG-zbK$Q$>AhG~H!bdKVQ8Ov=2ZPQ%5MiW2-qwk ze2Pwiuxhy#i+yThJBZw;I0}FdfAR<3`%qJ}Bk8E+@ZjabU96JHB}yunI^2|3PY&ui z(-=w7mx=123zDlD+yF*J<0*=tv&JOBNgPql)2Sd{My88k+n^(Y+MQ;C$a6*o)350* zLWQ|TGEwpfUM~OE8s}zDWq^nAHJd`3IPE;fGD4J_=_P5O6^!Zr#wGU*y5Mg zltuB)@}5VFP~{(^D(}L#qE$7gtW8sLJ1dG-&62OEI!R&q+WM4!gY% zyBwGlUs|oZ`Wnuf9OMv7`l%q;s&Z zqcLlfH(SPq1#LCm1XlNi^`-Xy{s3@9(D=3EE>wqIsHCeGgBAy>!R+-%uw)XM*(={a zQ)U|xjncrk9~ymzw0!R$@O9z1z;D~9cf%Bg|}MJd!0=7 z!Yx>02D{fy$zVR<+y+QsXbu}vaZ`l92HrJxJiQzc?7BeYr_Ph*>wtu(<-5CM)o+=R zOUr(3;2eweGzDb1*OIU1o1|vfjY~ziA)0jTWcb!o1ZD5ZYhZ=CqB;K3ABv6>zeNbl zKy+!om2T;&wu4r?3kwMHle7u&J5eo5RSu&HJmqePAXxv}zwPVUVC}YrCYRnqwsyXA zokV{(-kQIWX20xA_m)mS<)49By#HR93nDPMzP$oar~uV(sBDX~i1`X&F2hJi#CGuh zAcvTIZmAAd8AHCx36L9F&?|W0CQsq?jiPI!UPeCwZ6)U{%`7?e8{$&Pl)Fy2t=pED zZZ(U6%xrya!b|%;C2q)Y$(`C+qMhR}j*IKO>*sc2;Y} zk5LSSG5oRNug3+c_ml!~upcOm+CeV4#K@K(SdlH?AK?OtQXs$4yCa)J<56sLdB*%1 zMQot8pX726)eu-E+240nNg_j*PATD&_P~LoAkOvWm`C9-GT0Hm%in1^H}KR}wcAm$h%X z(?-HT%SQpAf$$_>d(W?A@?UOJ&j2DMHgeVJ>V2>$dgy*-%_t-r5?n(8gn{3#h?b8& z&SvVHRip>#%PER{3@8#fuzPL$UM?UZY2B$*RdBD%gI}t}Qok za?iDBY3w}4@BJyJ&hU*DLLA3f>%0W`(WvXZBpXLlpPmYU&Z{`34@fB-B| zkzf%SghTiaiwlQYjG^m1u*f~JA=YC1##CpTkVS_TYqZ`PkSuzx$vnxd{Y@;f7l?=Q zln6zCBZ_1FuL$EIW2%#3e0I$GP;+|bnzMwCgzPSQ>pF?h);(j#z=(qtp%m35`CCD! z&1!vaB{*zgA&(9$3{I-!b}CLls5wD5iHLxxBAiM!6es)+6bO3@7{nXpCgQi^vaGqp z>&qW}LA41R%b0)WlrlYSN-*#h6e&JowkR(Xc9njzT`nEGe$5p!%G?~3?W+%NPC%03 z&Dj04rJDFTB%m_;27!U-Zr{CNeDn^S_QoHW>$O(tQtzCw4cgYR7wJDyP2eS;9D$f% z25NVU0d^FjP3Z1c*}gtZ_E z4+vhIh}y`N3W7I1fbhXQNA5UAvP`dKWmc)0J z{pfh5ldK>kP7zs3X&0ZByk-BPj_qr{!bA`=&klBC5rs@?{*x>Y)W!S6lw<@6Mds?$ zM9(F#T&wS%iAtNnI7bdww#qKV5uUVWR>pWnRe!1M22k*Dy(YEdzhFe9<=lof7vOoK zzy!&UugG_Ha>61Ol=3oyxo9@h2HQ&0sdq-3Il=4*h;fJZU4RC z3ibo?0A3O&=7++Ka-HN7saY&#_REM`4n3E+(%sE?!(!Wa`5Tkh4gsm-d;zZqP)nOE zTPT3J{l#pD5ZfxY{J}LF06U@c9!YeGVD;s=q+`4^LDaBvPTY1Aa7Pi!1GvZ4eyfYh z`p|dgcO=U$L;3CopE+ziihcpDZS$I>ztmB5(8w{Q(codFP1^aIgK_B89KSgHqHNqgOdo z?m@HCvuWbo(i6!1u7Iho9Wx_Ax=FBkLaEqJr~LUL@F6q-g&=+A%cOdxzhNa8axH1d zmEn;}ooPc>_NJHJ6fU$9f;>oMruq$`QpUVBIzm$}c=ojV`4}&oyWv2Bw~B$H#T&Pg z1#J#&p>q!NB4iOL&{rMquTRoa9afz9gnP_7w>%Eq{9-lx2RezzL}+VBn*hJ@yCV+4 zm-0*mKMP5roK?r>lh$f)ULqH=R6psdz6>uIMQ#AO+sF0|BM*C)AAtxW{?P$48M6RP zF7o9!&2n2nqv6gHbuEE`W$3#cz&iO$Xj=~*QKjf(-eLam9$!2L+P+8~D|@u2Y|m2` zv~Rs~=-&YxG|%K<$5G5`Z&YoMEc3LTsG#J(vENL+^239>c42<7Uqtw6na{qNntDD* z7+=;Yx|o_3lXKluTBze-SfD{S6Go-%rU8aI=`%1a(_|O>%UcX62+&98<+2YK;gb46 zBVR$Iaqh~Fy+?I^kwv77)~b|V)f|B*6x@GPPWa1&hBk2&n*%|QZ*W5ULXZ}0D%;~~ z?pN!C$QsTmre<3{3S4K7z!O_8fnQgok*WVQSQ&3RptuwlfK>oDB#}1nSsIxg1Es|& z3&?LT-rOuB@pi9HE58}>MKp}*+Vmhlvo=7lZwlj8G9!UJYzn9*6xI#Ce9qC{Tc^@` z>IMZtO9SsaMP5Cp*^sZho%0tnlb!;HW`~grY%y!Uq>C8p;*$EOp21=@gheqJ`*RRc$g)EGi>JoUeaqP%t5|u zvFSfnQqhs+mCiO_iFNG}N3P#+u++m8bbYal|!da#jIZs7~Tv&k|Vf<>VB z&{kl59#pAzJIUh61RekHSSE~oW98?eh+ma!rROX$|MQu~X)J#Bt>7X*u)tBm?L9^t z4;;{(Ow44T0_kv)bybX-dnvAwiO7hT z{n(IlJ@w?+-39Itzq;63XfDpG`TqW{KQHh~=#?+N{}vVS3_1}WaF(q@3walGMBi0h z8SNj5yR5F_lPPAQB?BhtpB>zCYDR~uBLI(xU51iLNfOD_PV`!s_TD)~4}DCjRp`pr zFM#)&{SL+J3IyN@bciFt>mdt9$syK3=0abs@BK-R@SDbo;N1L|?bt+X6%6VJuoKfX zhKL%#7$xXAGUIb|gtik*+sSmyN~-S~!Ms@hr?iO!&Ej+sh+k37fSQBg!=Pgq0KuXU zPdM%nc~z4)0jkAWYcd#c>XK@d#v6^t@CZKwgvo{dl(M+ml-^nV76RyIu>bW1`Lq4K z0EUEK;n(WhYf^V2WU-iiMc$L7@OudUbm%9Q$f(Vq$la!fCaLM|dxIE6AEbK?(PZib zpjw2s_Dj<2KXloJRN1FY+&FbdkO|UOBYO+%s8*04Iev$~tjCqV}bG#m`Y1$|S| zl$TRgyH$Jc%m{hM3EWe69vcgiT)gUY2d*hQ-I7b!A}}Z+{uq{Q%A!39mJl3%Uw={kgf*wVI z+2otRi^!~bpEz=BL{*i`o!O?AUS~vC}9m__>uk0GW-z(9V*6l zSRPJ55ZTGn3-Q*}_^t=E$UhO)0v-9;p61cb4L;yGxL%Zm$WL^qu-H6{znUiAD7y34o0rdABelfd;bf|250N_sSq$LROB*rz#*~q_DUPz zambt2z=0ACA-N-mbo}#n#~u0*3uK@Ktx&@i!C?6t#8uP0!qasly>C&JP$yxh6GV~4 z?yP$?;((~cIhu5HdjyHWygeYQ9GZ{18rO!8R5IxcWGZ;Dak7K6j$`S{czb zNE9r&1U5hoM+t;g`c_N=DYD&-`VYWWlYS>2F39?qJz(u#94d2HK@UP0+%rN)FMXwe zouYJOeH}Ug5TQhryA=4VuVJ4u9A=-Ju9vKQb*Ju*?>czeqc3D-qe*rNU}H!TuUS*U zs;S^r{FEY7!k=(b$3aw{Fa{0}R1%qT27(lhC_5y1V+TeS#3F+B%8G+2 z1JQ^>WhY(uAjZ1u=(fU*Qc$M|)R$}RnGcGq?%ryYfwO~Uc^z=Ur-v#nPlr~^KK&IP z4f+bmXBLax;HCeS1Cm59Y;C?|gBFl^@h^VCl6EN@(EDs%CyFJ#7WSO72twq`@ZqW% zkc(3gTvhZ>%Tvh&mb9so^q0c}z!Kk2#$9!m3{DMUP30oo^_?Dk2ZF|eyTUZ0?g5lb z^-(g;dcB=2t{iEc_&J$w?D)wU;?=|3CZQ%4(Cl(Vc+)8sw0SGw_4=%7y)Af`?o)B@H5|ZqirD=0H=?Z6Udz4OK<>p;GKatr<+Boy>$KGIM!rMmSMxE* zSq9<7NzGP@WXX>7M}ETvcs!lT8sjPYdH*zp_f(TQNznA`jZTGZpIwr)hbO>vUJU$( zy8#JJPp^#SxhrJJs?pqIz4z}U4S>p#P%!u&Y4%Uc?`kgjkbSh3Omfx1+)_|Zb+coDFsYUm{Do< zQ0YxUOFf_?4zq)=!UTks`G$L>odXcFcr-|P(MbM$MEJ)HSk;`S$RRN3Rs0yLo1l&b7SDV&LhWF{K!aMV91+ftGq})0q89+`y1yu%L&_vr zv=w+=C)MNr+Q1-6Lj_yBnsE2uZ;jP}PjyiTnV%9U)Mlx}RKC=Xu@lS*u#3-K*3VB+ z=3B4!LGXp;Irz=dcm+1@Y048KUIGa^8Rh+$z1e&VJ6Qx^>p@hRKN2HN)ivMXGc9ll zRG$>@dntvDFbH`^wlVOQ-|zo2eQ=^rL+%DM*$BY{sjOX$>Hmne5yc$h;@^e*2qI=bw4e6Dl_n8nHZkRqBS@^QPk z(B-#gzQKB5Qf_vCRx|l8&m;hPuCNi8j&7UZ2%7I+pu(I#FJJ&)i(oLZE1^e%c?@w1 zHHnhU#j=}-WlLZy$8!mffP%5hB8KS3WB=?VJG5YkLsA1t? zp?RmbZCIfSpfS`ny!Q(76v+Xz3Tp)*se=5{lNwTWAs>ymZ35VEW;^dDlb7nxVmMe{ z3cCyWL{Xa zAwB!+&;0^h$UDxtLGhAq*WCu|KY(S&m{;IBK^`pVz6a+wAK|H1C~$PuwmT6|L$Yr9aaSy5G}u9+j3Xa zWI80PGwupCbUnly#i481ma3+UW#YGi&?E1Z@XKj21ff|s$X)HR z8`8uiJas3USeMI42n(_jjFn>z<1#W^YD?K!I6E-;Pym^ye12AUS96jyS=5&5qIAX$T;FaSS?saL?^Pu}bvwiY2ks&4m8eT>0!5|Hy!6wAze~8Wp^F zaD_5nxc!mT;`IavkhVX!UD^<9u$CueSb$n9F#SoPoN*6;k;CJEyhMekc7%}jO#0A6 z84}&CVGCrD;aQk^Hru_5Jygsx&ZvdTPZE$OiCQe_@kuD$0pSi;(KtpIJ#D44|u6CYc95hV> zX##~Rz7MhpQ%N5*Uc*hfwXq_IL*y^O#|b+1jO}RC@md81@9oB0b?+WRCykl}7%xBlwSMH^*1U)CV-ERF2d&X{yS!o9pV~$D8jca0TF9 z{JMj7bzb!?X3FBM!)F-^7O>l9Ff8=}_*E(&S>$jdEicRt&!t5hZKI7yRM_a2tbF=% z7E~W8(A8hi%^~@U8omrZ6CP*>Nt)N?#`FiP^pBbv0kYx_fwE6c$4!Yy`Ac-tB81Jt z)tQd@xgdoNWI!jrC5Np(x$F%Ip~C43=K4z=Q{pF;K_qL!EEaGybp`y}Nf6z`Pb~Nw zLjQ$_N1gp9r6R0n!Lf~gbVIDwCzx1|Z-QH{cW^=s4HsDFuNu>VgJmIa+Wc=M0iwvF zGPbU)0*X`vvF1BXAn?{^*TpYm?p(FQ0dfywV-IeM?Z+bDf&D~!lPFAj#uq}wFQ!pf zT~PIP%fLQ@_S@XF3n80;E}PeoJ@Xq8P_4SW`N#XI&Z$sFe@L6|Xf%4|-Qz+X>wSJ~ zWnnR64W#53VY9&2;?r9{^G8pGVhi|F=<8f-;`a-Cg*=F5RE=0SyQYNA;$IVNP@s;} zReBg2(Bd~FxJ>dJiMb;Sp5ybyW?i4a{E|Es&!Up~Ht0YakZ@Ubca3@0$3JJ1N!f9Q z3N;7Il9K@TBZJgwPszgt!NcX#KI#5^j%yYSoYMJCpa%^>jtA1jux^jVt3~wZZy&Cu zHi@6CDxQcGO@a<(J5Op@bM_Qw2@<#U_wPvj0y&u<#+iq|YhWyxP%C&?Y9I=TXVSzt z)1+Wn_-fB#OxKrOlgAn8U)c-mo2xrH_h#>4`&{ADA8))ljPqlLP)}NJ&uM^_rjU?% z8FgOgJ2li3nK8|NDepJD=)k{~x#^D)2++t?Cwxkf>8qwnMa*N_EW;@9)i zVq12rD%GlQb;5qE8WCn66Vc}EsjLzVZ!2v*lQq1ey2|IK7<8KTH&wq`Sai@@-vWNN zAaMC9JJJ$;=-Ysd*{-Mn9M z4e!K?m>S-b`>CWq7-AQ84lrbqW5cCDE;EG*&lUh4uPWRbh!QeT!byK$V=6dFEQBDLX-6sBcm%#dJ3j3-qJ+ICDo6=62!sQjHxcv9q{@)kSBG$UhI zC>fOesi2j!tPh6Cq!{MSyPGAK8t!#l*!-0U89U@!k3=V18N)bunXkQ&#YC)EE@(LD-hyTtV#+l)$gFZ`$_( zm`7QBCV{VbBXAa<-g)|#pLf1D)CJD7hlML1n9zQ1Kiwyz_7ubSu%r$s-}+-sm~Y4PUzE;69N<|8m^Xa^re{{pr04$KH&7BBtUw>H@?oL-~#`)Cb+&E@_z03R4u1Wv=&oBiZ;vCtz;V zx$^bR)yMuO@&_)z=D%tAot@G4Fmprr>Bb}tpCp1_-PT9?$|BZR%GNBjiP83R#k}!+ zSf&kmciU^#H~7RbLG4fbRSa1nL0JD`ltDj~#`qoVef_?Y&67Di4WZO_#bon7P8emkk<-Kig*J~2AE+Kpyp=Ho$P`hGL5IZ|2M8Y#(s78hQ^n(P?_jkZ(G<;^w$#?J{C9&cHIEt?sc0rJTJkQoMfilt<^0g0U6}f= zR$C;wiVbU(;J27hdl<7a4qjD7QH3Fbl4-ydTVJS>5+V`Z;EX%a!9AEjH7NO;W9u_w z=UAF#(ndncULY&;iY}-uOd8U}bgLX`u)>6JRR-xb*dnjAQg5h$cn<@Fi;WDXzpE2_ z4n;^onm<~5Zt+I%Zq8F)RnZt^aahUHI{NAR>lQgP>eDJ zW~QQ1CTne?a%K!$n74we!x#b?f?jB<0t2{zeycni)6P%iZ*5SgU=n zw!|H%qAfLGg@q2RiJB_cnbGe2@Xih*508gDsL$o8Xnf;0=)QzR8=O^WqcT{bGH`rW z_TdYZNULDG)2O$f{jfpU@d9Nan{>4&g~d!ex{)Sbt~5|?0A=T9@%E#fU@JTNg%iu| zADW~-Fb_alV^5~OIT+Ga$;#@!=}_Z z$HVZycY*`diEnBmoK@ZpP<)uw1u4hA!ORYvPg(pGw7RLM+uR1D94Se54x;I*^^ZDq z=zj3C;$iid$J-ti!y7v~p!s_k!?E3geUnScatUr$$ZmAWAzyRTzmt)5NBQf#fC-OG=sw7dK{psNjgtvhjea9RP8V(f=_$tmU@uwE#3E2OcnMO#h0!%?C`3i-^mEkvBgb zLH(*_RL5&{Di^HQElFJKJra=cyH6@1dpG5KsIXux{$#pu$d6CP1oM}C*1v3rhP(Kt z4CT5Xm=rgxHr?7+3N|VMo+r0RF`u-D>dOOb1(>Z9D5go(aL;LIAL}q5jbY~?wD}}o z<*hHkEfKYZZ}rX+I8yHOG%X7DP~{<3vt&F%_RYl3#E#w*#C?5no7 zDH%MI48j2+@ZeTdbM2}b6+B!&*E;W)NtgJam;JD$f4omM^U8O3;VjHw0IIW|!yQ6s zp*8XSbx7>xZlIrh-5jBgdt6wL8NXhm2Ih4SS8lfrPd-?D*RY-iF?1sy5KE#vm#Bbyep6D^ za4q;A^_x|!aD5JE^qZFEP?9I)g>2`2=I-^C|8`y!Paf@?18o>_)i#+)XJX}#;i-P1 zA3$*-d#SDkx@VAk0Zqeg0q_dzcFXY{ast}e%J*?AEbcfFps7Mh+}dY|ie z46imaIHBFp&j=9Uqw@U$lkvUU1 zegr(H#V{(2SQe~sFEJ6DGTvrQ>=U*Xk9a!OknD<8|8i*lMk!ZqsYsRN2nnRjCy3zV z#tuC{I_)qZgDp14T?;eZ24$B^X`vP-VL`vB!k>+&I`kbas`Fii@6G9>bwh)&E)O>d z>VxuaYS8iwu1lmx1F6$9+Bq;{E5BP~1xqp(SBp8`(L#EdRF25b?$kdb>18YYS+gZ6 z+$xUfjK_k~Atxkx);`57%>brmf8d(+pILtP1T#u$s(n^9XnTIfvE(7lo+-4xKnL_$ z43|}P?7Dv?d~OFVt}Cbg&9b&?TYc3nr%n2VNg^Pz@x%^n)vB@R65|}b1KI&KEQEDh zT${KtK=T9X;>sU!24=BpeU+y;m3`EIR$tQ?GMeS}lry7y?hm3k21Nc%Q-?hFeK>u5 z*Y&vP@8Hn?*Xc=-$ZFGP{^GBCUDYWuDYmxbUHY)PMciVYKkw6ZC57VlHqRZbBvKxPZvGQ^JN zU_#Hy-Nd-b_2W~b@3}9R3KTr*IR>3IJqj4?yNowe-hoK^1aHWJ65YHPz?1oiT#LC( zn7j=x6kULqb$a5V69+C&*lez}mAMkk2R$cd+Y8dk==!qHGh|p}&+v_F>o7dZx0vN& z{bZ0|@?E5NMSYA~6uHc}@IF2YZ{CK&W@W^GZ73aiDyjHC+V6m<6RN{0Ep_wfjH|D+ zBgk^)rm}U`vfgcaU#G@c9YqyMZ9;@ngG$imJ1Q60KQ}DJnkPI3tPV%qjqzE2H0=Ui z8s7G8hQCr8ChS;A!WCm|u!0>Xadsn8y&v8kVxmRW|}G4UrBDD73E-qRBJxgL<<_`uPA@jA280 zJ9~8j3@1L`JxM;r`7Bh1w`lHu4( z-e)On1dtt6R#bM-6iNp#c-t26HReH%-7uq(9v&ZbYf4+L>AC#M#!vBImz2WOyRY7K zByX;0029#7x8tt`$bKJfjw5;_dha#=Af-gGM{W3kk~xR}KZ*~tgGeC$73i?Fxl6zRFY z)qi-!o^L;Lmg%k)Y43}(bAQI04=bKBY6AFm0a+wI7o*LJKf~`~0?JAJO3yi*YHWd; zCry{R1R!s34knbViqDI~{KCQJ18B+<*jkBqPd|MKEh0D*E2QPvElU$jK=Ua zJyGd(6YSNw$(Kz3ABMT51|G=6O<&3jFGbR|g(hx+Mh(tSWade89b{3g;&*oXT~b!4 zg*C&;^$vmB{I5x&>7-DK%|^cE$8{BR)w4t@mR&Xd{=$qk$gUz!tQJ9U51X5V8vc3N z2Zu(T@35@wyJK62$J}={5XJpNVyxe~yT!dJ6t38>DLy)QjZu-?(JJS^_K4@$-`n8q zU>|O*Kw5<&rDSC2_iB$#h!WCio?TbIGTXVra~urC{r2yU!ZujS7VTP*2JI``{jiVa zKJRqn52wJAH$@F}+Ux&5Q{@s*$ekzx0KJ5Yyo~M_Gm(h&%UVv(&;p&!=8q&gAwpD^ zfiwDu7ga2u5YUUpI~@kP;MdO6I17Mj!gAfJEEnwg9Lp=$f2aJjSDMOEd16xNy@IHy z|4tprYG;Nncj^rm%kI-b3RK_cOVV323a}Pe5}Oh{l_tD??7-B^t*j$mFn9bRd?Q^4XG7HCGNb7P&n5yTJ340n<`vR=(Wl6L4_-Ox3 z2A^%NOJH+X=aA2oddJMyv;(cJJp4*~5d<^AfuWG(P4OzWBRUrUu6hCPt=Qo03MTNk z@Lm(3;RILcdKC-zzCv~{@!rSs)J(-|HvoyE!EM=3PuRvKySHuxew2=C@Q)>{OayX3 znW`2(fo>u;%2H+y2nK?6w*+HQ8L%hRQ@KEh!kYam9K%*JuZypf*jwL5xMO|{+xlME zIU(v>jQn+)HU`0kZiL=tG^6cn>Ic=MbeNxRcz_GJK?stHp-@eV{fTrNLV%$ zG3wCkg9Bgpsa-pn17sFdMTZsUKAQkZS+;vJe)WA%n9x?xqN#J}zpG!rdqNmDww>N4 zXaZxo1V(nqv+DA6I^!v~LH-CTgRZKL#)0tqOBKnPu=qo4>vXwrKxiXc)Iq_>Df z5b3=`Q0b9QXhJ{)B3&VXbU_d!U3&Y%_uk)k-TcX9t>jrVIcLtyoU`|A_Uq!JXjpk> zG7IlEnLtFl$*d%BhrCMVbe(2?4jxHXm738Z6f8BfuV*e;Hm57SWb@&CI7CrkSNk7q z{h0I-q`G29B|0;ULPy2)8k=jQ1?s2B&V%2MZWVkD-71b>!(^6nxqdzU#WkFVZp&b` zlb3B4y!H>G)ZJC`U430+TgDE0oWNmGPL{9)e|$LFn@w?d?vonJujgO?K%;BCx2K#w zc6CG-xXXmfXqCo_)-2zVpg6e%&0AIWvQ$dWvQDDADGcby|0>LWC7kk|4o3~NIeB2n z#7PS(wY}?y>Ve;y?$lAeQ_h@sKdU8t9)2m2-Fi6>e}4Yry%5B4WeEf9QCA6e6W5fN zoildkuEDl-nNK7%S>*6eNykaS)VN5%mVdHRd*&_3?JZ$2#tyL0YHg!&c0tmnW-0=B z9Z)buL8S~$WOVPf59)u5K1^29gft0+lU?pPKA!`8p@{-7nuQ=H18V|6j4IK=ee5TZ z34#o=Wumzk0DlN>nJ_c}{ZU1g$4DyCol$N$OSmpp2J~ zwyx-5G`+lu`_#3+&7d2eMo#Ua3A@%$lKNm-@Zuzn0$v+*lnj&vt&{(Mv^Lh zOJqXc{mfAHkW=HjC6DV*OH+-~^>F%UI?JV$+`L)<-V=1tqB;}?kP0@TQrFAJoNH?+ zGIn}5s81sZ9jcdrVIJl0*QG2EI0PZlx4na8kv0R?Wvra@?mQ`%(`pwLm;x}@MZ&!0 zUG60Lfy}Aq?*V%wi$1_?{aKp{>2UE8xtLV{A2Gtc{XB&*&L=b zR@00F`ZvfpC&8-1t;9~@c-ot?-VN4+akboT1Iib2 zub8{cylcWT1F@P_MQx~mtE&E&)L#YfXD?8)Wl|RyQF>v>o`pwEqbn@Y8YsWhh$VUl z24}0~kwIV&mCk(2xqNF5u#Im1Q|bH5Gj7hEdR{q#THuHi={lc_*c@+xA`OGj^Qq)^ zRGAtLNL7HEa4R6`8+hPwwBos;Wg3t)j=Fm!h@TRH+{$0NE?)?Z*7hII&fG`O_Q zIE@-)`7~EZir)?K}pO%@87wj&Tw{xnS44^4KiKrK$6KK;qm!{5J?u#OLuD@)*lEU zU;Qj%HW7r#Y*n5C*TbK9RI+-5=x+p!3Gkg@WNoPD>4}7U29JWfuC8iE;PsyC`OM=dhF*ymLb;)`ERtF30jb& zENhBs@0j{+FEvm5E%JkF$e96>T3~|+8!4N3d*>361BV$r;#%rloU0cF7$_i%yrTv6 zhn$ZsIsU!_hoK5HG#(sy(#{(J8&>L>r@tyFt8TUOcJoqB^#cZ{!ywO;0pYun)lI~ZRJQQ8b4rJdwLdZgjg=! zG@~qVet=ZW^N9@HH4q3_Mwg^}XSQ+g+VG?Er3;`4T^DFUXB@UGM#BTP@_=KLD z4IjBo7Ajeh)7*uZ>xcUNbgFf7UunC`OOV0?#eyP-?G^Pgis`n0_iteN@ZGkjj zx2bv6_;^lH{0J#DnVsF8?-SlhxspjQn}oHD-$+&tiagF5EzZ+Mp!Juu4zf?rtb!}s zjKL?W+up=89Q)MF<6ko7u5oOvh6gQzJ1^)8YE~ZQ@q3EXWAEbvLI%tkDI zmp&?wMk+7FDQUWRB$NJI6QIWmOA=#xfJn<2ZB@X`v5rolIIGSO9X_y{W~y0BmJJU? z35$IyxlrM1MUKP#9ENB@D;X}kIXIohL1#z#EKu};UMefYAB2(MAKnud(?8hPEAP#I z@(?eeipgJlV}8l_Iy@mBSwhbkN^#;uOt9k8~z$mkR+xj43>ngiW+m|nG zL=7{+>1+phn7eJhc8yW$#&p+@Ds|qECpM`8f%M`pq0cQX-7~#NsMW~bo+qZj75601 z#{@qG$rAnd0`R1~NYL%8IHk{b(o7ErJK0FfJ#$FuBvwZGS1;z!C%IX;D8Cb^K#fi>G z1n<|C8B#yZFKhVnHA&zVG(*QT$lW6ggu1^aurs`%5`?S{UQ2S&hP0O(t-nfebKsy0 zN^HfA|6K*0k!5b{rUrl>q`0zs=G8af=8}4Jv{1dNea?4cfw+VX^&}f+ReA!<0B-iu zyE+SU$0SJRV~Re#Fs8$<-P9Omw8&Xy$_xvR3lxL(@QbtmQ~AMePTVJbQvgt>b~h** zklNWCxR!PfeQuJGCaYDWh#zY++Yks~#E+AOmP3aco6AV(urV%64;K7)<>;rHO?vm` zD0KU>%*y(W=#&;nXM;IVRY0ds2%GJ}JR>Oh8gYM{0Q$`f%WrA@dhye_vcF8EV2u^q z=y}033HuVdOR;&Ez$Ic0A|(a1@zLsKl-%;8wBigH;X()dr}hyH6b?VQE~6X801`f+ z;qVp<2}!&&&$nUjAuz)|Nr$5(9M5SgA56Wn;-rKM9~iNmaDq;lanBvEAFD)%Tw|CQ z@}G(a#5rxZ3l4=(W?qwUtome#$DH_B(6qhj%J*2MeDZk*-c2@;IoRH@3we#qo|(W! z8v?~`d@E4rP*oCWFEoeLDR!o_s@j6);401dboSvDn8s?rD$-cF703I0;SA7GvF%>(j^xk1;tV_xy+ z{;^j_=Zl-={YH;&-?G^Ol(4VmyZlZ}=MtDR&GpWMJsgRu3P( zgAgpdAe)ri*ZO^OKX{7$c>49ysNmBcpY>&xM_2R**pTGvr|M@<0bqSBmIQaG3$@`ZuUzsMn+iE_VO05d9F(7Tf% zMQB*mST|d1V8@@=XL-FKbN}re9FfO8IlvcMBw5-0rNq_J=iSqA3zvSlA83=2NbrGq zIbHt#lFf{}zrXPk3Fl!;CeC1M9Uex0(BFEC!bXd!b9h~07MxqO_ z@>f|>A^Q^pxIK(CP+4D?=8km@zxaR;gH>9g&;OO54funt4yX?Z-)4BE}=_ujSWkzfRhq+P~iAQzMrslXUcj1-yHB zc`R#7-CT7j#zhz2R2<^en3(ZN8PzuSI*)(7`vBUOy!cbCwW?-6Vo_%4O1hqus)T zk>)navQX^{=QCIh8P11*5#ePeVT0HRbK_=*vv6XdJ|*QMf~0ZomQE3?)oVB`(_EnE z+V=iX6m+Bhqa9H7Ch9L7Cf5Ciggx#9o#2{xiNZbq5X7T&i|t6bf3k8t&loo+VKjuP z+c}AHvYifp6MjqTd0&`@*q!;G3Hg@Yj#EAfm0P9<-QY&#iuS|5l;d+9^uNBaB& zV0b)yV?TRIb3L)HGFoC~YRZny*xxp|no^!vW_L08R3t*6l9txGQ-NO-9}Ay*W4`vs zB|LXn3uW2q8PYCu+zCyus$!zBQMls8`)|xVxd9gNytnO)wQa>JnE$wqwtf+A_vu&C zrrXv1_i-LiN-xYRQ}9Fn=u5>TQM@Lcq(r0=p@eXEj}#`JE%S>TTxpj5`3L)3V=Jg$ zKrU-ZR85ZIv-^GBfVRaTHonm!*8JVSSjRktfxz`E|9Od^f>Guuyi(Yxi#`cUf;<*W z4Ea4`pw+yHvU9mhsi582d56w-!YNHqd?}pK^g}^)#HU?_z>M!gLuSrjUpa}C8D-YU zR_EDi*2tk{LqCtFb?^*v+KwzYroWPom!B?rINd7PiduI0 zJ6r}PH{BfeP{U#XE{5&vJH{H`x0A_5EpaCmzs?!M_Dl?Pzirov*j_Pr{F|tsoxSQv zb7KK7Ikd+&d7tuPe!eagPtIMEaO|&Mt62H#Jn24gll#$~YQD zmtqUn4VU)^G;O;H9VI8`+G3{XRgKX%@Qca5RMNk$|8^x3V*445NpS+gAi1^r#c-c) z4F&IceOGZT@ME!0m^tog#2d#yqQ4aVKN_@oU#ASW7)T~vF4*pAQ$**jk>}W*0Uu8D zXd_KHDz|M5HvaN?Gt$0M|FJNKq=zS+l{(`18&esHM86oM-+4><22G!)hZ*`T8?%D_ z#jhavCsO|G!qA31W$+PFd6@HA%V zY878cjUQi==ZC$r|9ZC+cR%58@BC=#xaw`$i6ZUVjW_zbY;#QA%aXea?g~M5aaH}@ zTWYK`w<>=g=BnhJJ0(mjpxu#9`S1SZ$z!4a1&I{TzB4z@!-_ifJ1{j1Ju2y4>XLl%Ae3mze|dyJk~o6}JXxi2 zh(fYE<&3{hn#KvT4^UnYqqe9crW)i9EDO5oXZ&H*rhnU53_1y=J~iGHxv(%8L(z5U z>%{lh4&`p@V0WZuk(e%2oU51UEU|xF?GrWeYdOP$)(@33{A;pcWu9eI`VJ>Jc|PGU-uQ*%%HoGPRCUv`H51CqZ>o;N&+ zNg05*yY6lj#Po!`ea>vdu0(8t3v?N@-B>{+wKfXwn4l%~-k_tE9>sh?(B?SWws3dQ zxa?(a@W`a>P?zV}{N|IlT&F{fj??J04C;bJ1_eT*HCK>F9uE%cW?hnQq5fg)qP(p| z8(Y-)Hn-(tNmP}%umGj}v~OBeqq52Ya}PdW)&HNl5*3YvPoHUFoPyh5d-?ve5Fi`{ zLz=CI@?1`R3w_%0*n#S_rEZ?xPY)IR-ae1c;i!4SNjXFIM_vK73FvhfY;`x7ydPX_ zWB3HW+ozIJN~h_euPT=tvaz07d|2Ylktwjt-)+YJUhYFKd&L|2nwa*|EpS-R$zf^K zzgP=hDI^p)5oufn8dwrP5Nd5eDUwV#$%e@R&@^aXkT`=;UE00O=bYW zqa0>ZV!PPQ0|i{j`y_C}6|g-EkZrZLPC_7tI5Gg6XrZBaF>Sl$i_{wnP>wlQlsXp^ z|7YPc8(@JTsJ?$r;+Ird>A(y(0AqI`2bgcZd~}z7J`%RAmMM9i>>2WK$CpX2$Y42N z*)flFj$+pzYTVFiGqG-G{~Fla{*_^h$RB{^d@9a;siQ=4_eI^nAnow{>H~vSZOGlA z^JCHOUOqdAJ0Ftj3*#KxF4zAe!}>+dJk_fx9qx3?~u71@jthaM`kvWwwK zXxHMy9SBpCoZ8hDP-ADa4;^wN0^_B5iTrYd@U%K2Pta)G9*`QyAByU|F0&UVi8Oe~ z3J{w@yDbeLpzku`G?)(ID)+=0lvaCJNbPh7Z4wof1l3}(XCOn$yzb6Fo+X0q>!WU% zg_b-UQGS=$2k{vTH>z0nB_6d#t-10aQs-~B>mzh4?0<&R;r=3zS-#SSy<)%+&6t0O znY@XKDVXb`2?c&r&c7>|pceWmL=22@T{JeuZL)zCE_7{t|8w=4BR9b{byr!*7j3bwfZY+?Q#!9>5i~HFNO>xKQPvixLCR z<>No!gzrmiahQId`qp#>nXB>$inIeJn3SxTu2ZozWVu+g=}1LxOWpIK3#l!Mq~SlCfC@% zhebZ04AK%AV_AN3vly?6?#u{)Zcp$3F5V1&AWJ!XAJHZNtBmUX6Vp>ysHA_jM396D z!V1(rTsP8|C{7PpM5gauer;tHoQZN8t3-aax$-#fnjGfpV3PfD1+np!h1K8WL6>hnr{K?rH{ z=P@^FTJ6`RL&l=N-q4oNG2ocT`8bkR_vQL?avoZId9b4>f0HVBv8&;BPRdXJe?6ym zPYrc9^xvXXDBCZ36Qh~+Ua|O!77{*Tw)HDtv9Z6l#e7I%IhxEq)yD;xWYqC@vvy7m zv5Izh=E(wIwN4(@h?dTSlCqFIP|$crvDnDKwD>~@=8=?V7GUZ1Y^8u8>V)H(_bL2I z)Rwn1`b6jqiO70RmJPGc%L*ZTD%RbU)PdqeMsgb%lCq$1S4#^q3nE!)duWI9x|MZt9Bl-%5-4R^6%>>s3A6 zilxVS?P#yoeYS$t==Ve@qrpgJ1M}`mGNtyW|Nj9UexEWT)Ci>v1yIVAk>JaxPGFQU z07ik?pwdU25YoJafT7B&Y}ya3{`(Tj^gcz_H}wm%q4iNpXfnJ1nje(Vowom5^OsU8 zIduEKrxzMPD4?7F)8_sf4)!6Ll;rf_|H~W9{Ui*_sfAoC(+vSgFHKcl#7AZO@c#$D C_Xb!1 diff --git a/src/main/resources/assets/bloodmagic/textures/models/CorrosiveCrystal.png b/src/main/resources/assets/bloodmagic/textures/models/CorrosiveCrystal.png deleted file mode 100644 index 27f6c52b86d51794c857c727b40ad2d344dd317a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/Meteor.png b/src/main/resources/assets/bloodmagic/textures/models/Meteor.png deleted file mode 100644 index e6926d121b4fe68c6cf7d85373783c93207821f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1969 zcmV;i2Tu5jP)VGd000McNliru-wF^5Bo9~@Sh4^B2R=ze zK~#9!?V3w$TxS)>fA=x>&diH?J& z5)u*{3dmg`Rbq(*8(6`D1uCFKnh>CZ3IutSHco7(@gu1p^Nu~wJFh!)*>u6CSoDi~ zJ0fTM&F|{Y(a}BM|NM`HU`&pV+40dhUax`Q?_=SQe_-OwIXugE_;D@IE75&?Ltf+R z(JylE?p-X)!tnXX=krWXPO>n+fCzv2>QzbP{Uy-^96xl(9x}@ij+o8; z&M!S~%0_@JE^<8yMV8U*9)qzsm2#Ozvq{&o5aDm!x+U}M_+~Z7O4LtKvWZM2z^`+u1{X6KhV70p?|1?x*R$x@sH%&mF+e=v zXRWx!>!l0}iNpM$4$-GS!@_$jG?rKR&H6(Q`Q2PTco;J}Cd`Y5BKm;AJtMP{s-ac3 z**DEt2j3!2Ss$AwDgArnbLAt&GMax8lUs_##&Cv?D ze(yd*J};+x6?`Yo@bhn#I24bN$UWdJ@KRJm3H$MmMkpydzn(gP;?h|7*Bm|D7Uo4m zxQ{$DK4QN28f7x6bKfGpw#} zFr>nBA%*QsnuR;_v^)mE;W)P8XQL|%^SjyxlgZ>%GMRL1nwI>q-)ze+ioqeKhr>i8 zQNBHxrdTR*`}z$6s!S~u<9n|(sd@Ya_8mZ5+oX1H0b5aNb$i16BW;5hFJ5%--@iYx zyu7@9{`~oA+qR!H4C6tk)0s>p5~I;*w3E$dEC0#NoPBn--D;!eH_5K9aj6rgX7vaS z4`C!{7`%CnEA^vPav7>!&*mLAKBK&rxBGd*Yr}ezkyyUc=cbZqu zhmG0qD^1?4x9GLn#DjhUSX^;=Sj}$J7zpArt8_bUs#cFZ<`&IXo2KldYjrtj)#ztl z@dZP(*JT%b<1vnA3)EDbB|XSjW{yzoc9?9pId|qb%MUBamc`4S0(UJh#jcI2s+3zD z`k9xV*7HvDs?&PjXFRFAxsu=F*qQVE z`Pxm|*&NM!13Mb#{rDIKV~~^SEd9(YPV0H6dD&?_?=&wtt>>NQWvBJL)4Vb=JTiN% z`4BY};V%Ob9&{w4ip@KjBA-8fg5SOQS6bOT@kjuDAb_`2pcRT@>Mml2hiw%4nO9C3 z>g=lQVObC0uWd6%n*sj-vGH+==}p3PIiXu@v~6xLt>O)b36Afj+GtSf!kD>5Kl8HF zdfsVXaazwi%}XB)LWY0?Kpeal$AwZ?KJsGaA?Q# zgeLJTbsx9q=CCXa&F&OmMCQk zOpFcj-_E^>J?M=ZC1kc`jRWlpb$^JO+ef?I=H~6WkG}#Q1nlJJJMH)HdID|*4Ln{0UolNmu~6I|!ajqajwM)} zpWpF3vsK~J2Ig~{{K5~P2GjYRkUie_-e5W>mVmzZ28Fdizk7qiZLr_HJ>eap ze)k49G8wUtV845V!n?x#?(GTR1pD0^6y6o?cW+O)0xnEHfs?zwk6>3=tP7kn)V}ui zHVXx@dqBT?d&2jCnX}LKwYRrjsqi=+$K!Y$A2t3B)Qc8v9BUjQ00000NkvXXu0mjf D3iH=0 diff --git a/src/main/resources/assets/bloodmagic/textures/models/ModelInputRoutingNode.png b/src/main/resources/assets/bloodmagic/textures/models/ModelInputRoutingNode.png deleted file mode 100644 index 1d756a470382f9b018980e74cb2bae071e71cfdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1948 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/ModelOutputRoutingNode.png b/src/main/resources/assets/bloodmagic/textures/models/ModelOutputRoutingNode.png deleted file mode 100644 index cdb5bd95b1a63b3865f70ff09cc140acdccbf343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1916 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 BzG46X diff --git a/src/main/resources/assets/bloodmagic/textures/models/SteadfastCrystal.png b/src/main/resources/assets/bloodmagic/textures/models/SteadfastCrystal.png deleted file mode 100644 index 7f93d339cfce404b5e4df1463e0cf076fb81dbd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)D+r9>D>_X;f1H000McNliru-~${E9T0E2a;E?Q0&7V` zK~y-)CDKcl+(ZyS(HHrXRI08j+6LnZBlg8M*aLg?)Q8jH?$R$MWkv=A?i#NA`Nv=8 zf+MA#E+l*$fPl4t3=vX7PO$k2n$e>mQ8?Jy_Jxp!5m({z@(TACq`P2q#SH@he(Vv6 z==`9S6|Wg`VX!Bd60Y|b2v_9x3lbt$8u81BE{a6Yc<TR!7lOHjnL%lIiCm;7TE{SSoLNbOr@MH(cqA$L-;8Du)!-7}gwt+OW0IT4NkWlJyMtj%Jk< z6LtvOydxsy%k#!+VdM9uYxQ7;hckdupvX7jVH5N6*{0ck+jF z{nV504oBx{Tc*{9MWeO~u~D+2*@)3&X0+N6XT(bc;MfW!X98Ws44%_W`YGYlK>kq( zNvTB%qoBF4+eT~9T_fHi$3A1nPCyK)g*s)1-#yWUV>vi?p=QOh@_f$32ZRt%HJUR@ zKK_4zW;g`7jx6iW>ubUnW19+9Dz#SV6%$83GI={_=Z0=G9GReR@A%6FTPLRX7fgki zgzAjyPKq3yy0iXs;*%mcTFuzDA?r$LdT=}sE~Svqjs5Y3bnVfzpwo_>J2(f)A;F=0 zf#(AA!Zb~U*!Sp~spm#;&_3Qc)`*zL)&n^!c1<7w{rkkuo${PnwgtTMA2`@{bUKJ0 Q4gdfE07*qoM6N<$f}gia_y7O^ diff --git a/src/main/resources/assets/bloodmagic/textures/models/VengefulCrystal.png b/src/main/resources/assets/bloodmagic/textures/models/VengefulCrystal.png deleted file mode 100644 index 5f70782552f9056a8c51ecc3290a56823d0fb971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 737 zcmV<70v`Q|P)D+r9>D>_X;f1H000McNliru-~${E9U6~so4Ei00&Yn} zK~y-)J&{Y2BSjPhJ%5!|s*xF5a@J>VN{CEa}bV?a0=ZH#ky<(zB4Tg`PL>b&6gstzT2B~bFunh8R$o5BG(k!qJx$nU=K9ay zNXSf=6VGd000McNliru-wF;D6$#N-RO0{u2w_P? zK~#9!?U=i79mf@izuB4D_kHmpN{*$_v|}rA3a4ZGR`+qb5uIrLz830OY@;t|~ER>QoO#=v|v?z)a%d!B& z_Vx~U?%V-D2xuCE5CS2<7-*UXAp~F$Vyc;H#bHdieEIUReZKqdyXJ!rJ`mr&eiRDe zXKpu4@{GWCIEW%#&*i&t{rU~M-43JCh@GALT)6Nep6BB@4rN(V*ELE>%Ch3>)vKI8 zf1aW!*x%nrYny(*Pp{XdswyUv2~t`tEG$x06+#Hc<1u-j&CCnKkm2xvBuRMt?cbQq z%`H67C(BaKo?QZ(+1^H@A#c6)Ym+2nl#)1(%VaX)lTW6`sb8+F7*UoKlawrqafM*K zKjc^E&l`;4^IU?U!~Xsro12>`rEp!BZnw*oEB~U?322&z$z+1KaA(_kxwt*7UlZk(zF?%usiRn$%`N{K*Flm(7sBc(zqjSzw)nc(|A zAec-t9LJgM<--sEBz^+sX#M$L{>pz~mc@?akmtn%146Aau1nu_@GQw_GU05$hcJ*! z`NSVDrQ)^MUgd=s&T;G3Z8kTzc=_cYF_}y-#t;MnMNzW6yv+XoKG&{YV{!2eMUiuG za6r@4_`b(0udHzE)@`&_C?${SmzI{$TGKQQahwoE5lz#ewZ^vXhxQa&791Xu-@FEn z-D}OeF6ZXw>G(dcUcAW4;v%7Kv)Jh{ABImfpss7AR1`(Q($W&X@6$95b=?pI0eL=s zg7@y-#nBqq_3%6oDW@4Cghd#3X8K;QccQ-A?cw`Aj-wD_+I^H#5AA88-+$!wQOTBN z`M`h*kY&k|AFzA(E=iu@*bc*SLR}Q6$N-DcDB|9|9h8z(RmH)<2;cX}vTRlsX_}Fj z)0008L#nDq2mnJI#~d7tP)br1#fkcjjSYez!1p_V!1Fw;Z)NJ=_xHu4t^q75>2|u` zFr=!ej3LW1vZ`b_9wRM_s3-_eQ36#}v9K_Y zkAs5)dc8ge2O~hx>2z@2slKY}6ZID_{+Qu#NSaQl>zX)@56_#^VObXA$@qZ*wGiZa zj_bJ$vkcdgv%f|>Ij|7Zp`<7>c6RQQBxAbWE>cdj!LlU6vKWuYEG;duzP?VcH~s%~ z$bs>AOw-hCZ|?xp0qAl1jg8ybwoMd8C?#23SeV5*4MGSO7Z)BF5-%<=vNd;_8q@2O z4+e~Fn;j_`&&{1GXdEY0RYSMip=oOR{T@j&W^OPy>*sl1kfkX~Du%-$olZzySAbzO zicm_^?M~a^NqSq`42MI!?>MYIRJPWGGef*Q7#Qif)b+G?29C=xNwAfKJm>l-I?>+u z-ur{u-rfcviXw)?eFlR$&YeBS?%pn*=Oe__`LZloU%$%5i?5-SVq;?i%aVj)KoA5Z zNkX^VA&TP1>f8GCxo&x1L4mAQ{SqKDqS#oZEj%1ReEeWIO30UQku{+1lEg4Oix9xGGAz-7cSh{%^uCm>yu3MGyoyj!jj$hXLDm%pK_>_>O2NH*CkF65 zmosP1P!uIvEB5yGn46o!bzQX5lvPQd=h(K5Qj+V}Z*bwl4+z69+uJ)xX-JZU(WpUd z#bD4Uieh}MCv^Kb|3kU{- z0a=zYiXt3mI(WFQgAfn|KCbIy%=FDp2!S!vb||I9vLue}+?c^+{bKjeHICm7T4Ea_a={a*3JrAwF0bexs5v^;tOP19gmf~GM@X<^KC@@pD{ zF@|SLXML}DE&uNv>i|bzh>YXVRMqsP{>J+9*I$e0$pGsSeGPXo;O8$bW18mp`Z?p6 z0gVv!J(mO9MrwU*{oIwn>guWk%&o7lkAZwCO*7*-RHG3}N`%%Nt+kYVys;qwR##Uq z0F$+~wcY<|1CG`F(btv3HX$4blO)I>ps8zA(}0wiJm)lDjh}VY;EgvzAYEHqYYwx) z0o2;s+WzB2hxY|1-P6+2($doMY_Phzx_tUkxTU3~rKP2%rKP2%rKP2%rKP2%rKP2% irKP2%rKP3idE>v2DfR}K8a%B40000Va6sgiX0!nBhASj{~kuFU|LFp2D3y1>J zI|K+tO6UO+T0-C#z4xwrzkj}!m7KFCr|j9~*?T`TQFjb(GM?f%1pr{w)zLBn075y1 z06H4V!NTW@BjrG2d+VkaIR5i_-;kF;8KHlyW9AFM>9c>n5b!SJB4v>FiLU+)+L;sF z=cr}YP)$1k@Bv+|tM~oK*E0j2SPW-kQNmx#AEry7%OuPzBiP*CMIDtgpM=VvSb9O- z!17%vL53fbDZ>30n#Pon^(0$PS|v?acKJ<@uJhyXpXhbpKVlVW;Xgseuk7EF?v75r zY+hE_J$@_SNcX|cVq6gF?evYZ%CZNQjoF9}TmxxiJL@o{lZ=^WY??)TA<&&G8%^rR z`(ywPSIm#mbqlk{XZEW~5X}W&zc$+$HgKit2BbV)9SHy|3^WjcMx#OKV`T;)CME^| z12Z!$+#-+8|(gc^QP7UZw%cerp$j z&Cgfop}MWBg>gHj;)a2yF1Z5Ko@8`X(pBMv( z1efdxH#awG@Z`yp{f@gv=g*%%aGwba3zL~JG_K={oCq;7NhvwB;6|k`Fl%}mi0}|s zX}^(+U~l3xBXc5SXE>*WsYbm_!&OVBL#G?e!|Pjis*mHmuDOe?F#c?~lyqDYhvJja ze0iS?e%Q9q?fB*7yV95WZr_>t`M524kAJ8?oVS5se)uyJLDze$?N`G3OQyCnhClM| zhX{zBS^AvI7C2QO0783u41ngndkM>>b49t`wJ@C3G(7P!!Pv>+Bz(P(l$GwbvW#OU ztt^n`JW}R3xfn>}dGnd8b8N^%$kN)%^(zCVL5AE0iWLH)tlx{=Oa#V9Vi!mJoR7=YugVu>lXV?qdlX{Y%#Lr!`5#buY}rKPp2%L4)t z9BwSVlFf051E$8UuFkNp$r>iKie6J|nI3WjuWy&g3Nw4?j3*MZ>K0r&jRs1sz8^Se zIR%VY7se@W-kxv>;4!Qu-+~_&ns@_bA>{DDL&^VmUukbve z;P}RRnS+U)-mdd};^h+{F*%vIF;}nXVZ0l@?ls-0era9uVR`!~6E3eR18Y)Z1@GB1 zF*YW;yXg(p*QaJTcJoCoaV)@!pPU{5=^*%}MquZpz-Jgh)=P`gDj zJE-Bxn|S~4ojR`tmFnp3Nl^TGmbqy!E6C#-=NejR#Ut(44KMxA^_;JvYFsnA)z9YssrG=u=cQUKxmM#TG&+c9;gX^`YRd#w42!#FdJhrUL z9j&>%6AL(hva^ee42RB9{ikR|?z(||h)mt5~BE zDqa@}<&3_2o1o~9K%n9?;H@HtC+dPLFAK*9p(aAg#u;e_;cpYxk=%j(q8u6}zDMwn zA${V8>A|&g*)DZwW2|+kS*~?GVC2)#;01S#jD908v8QQI$jM&Z;y&A2TsO7e^`8CV zqemYMw>PWn>$#eo8R|IYvJ3s(Tw{qsUsa``=&d@%11++0z_z_ntHz+8C}eZ}Lx(zO_w#d3X@*G2;Ui;h7*fBu9<{UENat|kmfjt)v$ z)sKxr+tjUI@WBqtn=w!K=61rT_Hu5<_59mJ$c(>_cH;oTR$}(`Si*%t#oSN-Nc=<4 z)zU8XuHf)+8exk=ACN5Mw0iR7Y(1KvorLOkKY(rISN_qpypj@W+=<+^FW0|+soC7z zTy&UO&oOW{PxUCRQni2oxjf+iVKEFY-ZO}54sZ-iW4~*B-$v*j>5`!Cu7Uy;P_(RM z1&=@V%)d7`aq(H*S>)i9a~B@$ND_y?eTDKA68Hl{iS^Otz7v^i`l;O1)yt}=y zU`$1XjYqXb7HJV~S?OtOFX>lcT3fZJt6#l36};}-ps~v7br?;X>Z#%AcE~mT{rTxO zE)7AN|L8!>TTEqAeS7kyLf}_+bA$B6&9QgYf@hr2=o;umLZz4-rZ2sF*J-?1l_|D2 zrrOtcwPsI75m8IFQD+N0^t>>;)hhJ~LdUpd>C~QgoM9=2>@)gwyRn zt1LuJbJST;5Zz-^_jVM6k3|i7q`ZxVGE8B6Qhe*{d+?qJNy2^rymq~e2X;s}zghd& z{K8Zz)*&^p-4t}@^g>GZsO7KtIr|QFucWc|zyNb*?B`3fH$8UTvprTe;+2NsE9_CN zN3{jGNgd@%L-Q0QbE0X2NA}xqOwiH($;czjbIegq0Uric5Y^gix0}9RJ6H1cYucbU-2jM4 z?Suk7?GSXpTHsep`kT7VB-5!F3t!~acIRqfgIO$V(&)i+?9(hKdv+3bLv~F&w}yjh z)z=qOW3?6kAjH^6zY;!zEe^CJ6^~*py?XJT$r2U462Dio#iPE)-x(-_yMm3NS#ktN zcKX6t%&o_J)Q{(=CW&JjN44lT0a*o1D$tSDBLly~p+maq7XP^vN-VNmqvMZArH=O3 zG?6r4nfSbCe-D3hE7t1i@PkIbgIn3*oa|V~tTgA4cUJyAhLJ6~YS=tcN@%|;8uib^ z(5Y0BKYkR*E(u*Pt#=!&otqCJisfE8-R$R|t$JFf|MJV#qHNDPE{!%Uk?w7U>ZY~i z!}(ishvZ7dBH2V{O*(H$*&`dgHZuq$#lRY+dv)?B3vV+6CSHvIE7YgN6I~p)q-yK% z3~`o}M8t&czZ50bpOz5&0c(-jiZA}*)Uc7Stk?SaR!Z#Gu$gvXJn{fm;Gg1ZC;p#r@g>LNl}r$ULB=UXx!`At$8Tz zg1A`;=V#QUlQCnQxoudoLzC)tbuaYWx-FaY+=U+6K}Sas4!v{Q3`W;yVikjS*S2&W z^-PtLF_`c;XlQeDY0{+jZy6}RhDPsrm$xffibTd#I66P5>|^u2UiMCHi?f2b1?D0^0s?JNGc7o2$e?TyLGlz3b8i+dO)ic~La z3L#uYUOFpmE-mjmDfsZX`vmmF=&j5o2lu0m4W8_E+;~sUx8=!r(P^iG?JKw($E&!wxXX8{Tdxgq1ZZE+-bo!u+VyX#(+MW_hX z>BkBjPQvagyWwqD#UW#H@&(Ki6$|+(>^Q`&Td#XzvyOe}hM>Jvj?)b*!BdGtp6&=Z zSr=trHri%h*W|~<3sw8-H-^|vN6|8IZ6^7S+6ui6oja{_-e~xb-ss|k8TmxT2St}f zK4zS8GKdsw9xVFwUMTji>^&p&YND9St{M*OO(T5PM8bzBoi!UjX8ir6*lcyS`sjk( z$L^6;w9lF~hv2&ZZCx82^BDR9jR;riPN7u;N7K?&P=+X0IgML+zyZcs*+{Fm`1U)M zn;kQenBqcWV@lszypW~??ZF{K0=Gz4qP3ILU0T`K=}E-&HuvsK43ts8+1fuaEb7hS zW~7GNqVkw^&jq3G5reH`=dUZL|A3l&=vUu>;Zw{&;4c0~ZzXFuYx3JC!yS}?Q`?95 z-wJ-aVP}3{HjGLtZL@|FgFus=TUF|6`8SNzMGq(O0N$??^k7Nt;2$s(i6Ag*Q~4H! zkp%{|bDk@n+boc@hL&N&sEY|UO4 zr`H>Y2HdAl9|uh0>atLkfv91N+hord0zKN%^JhvIzPJ=km7|?ne0OcWCLMA!?u6(n zv6?CGDo^f5+b6i52LCpO44m=3h_2g-v9Oy(KSByuT(gVx>9g!QZxsF@c5GRKP_KvG zp^8V-52MJWw(JvtfpAgkczSpPfZ)|KHvpI?b{k!VNrJ|M`^iO8oqBz3>swACn zoF)io=WdyqOLcmy4ax5>VAp=IWo{=v2twNaZM8Il6a@8x6M3r@AReXEgATz6oE~h)<07H-v%rKU@Wd?p$P^Nyg@D zZ8R&rgEi?mYfJkSU3J2LmB|(qOO&;JaMo#w&Jk zGnhX7Xfm)l_#X4zNmoiSCeK9_QEL+kvDva^1|5YbdMkUyQ;=77{XpbSulKM!oLk1f;PMx@;ey^^SOsf#m=jr1$^Id9BlU^Cw z9#@)2foPAXbs>Z+V8*b>{`f=Ee2FRjapNLm?i7}ZgMP#{mRTLqu9H9V6oeLyEauH4 z_SokHmwbgf3?`Uk!{fse35juJKQ+$)ZNgpILB+*-lv@r~IcWRt@3<=7@bsw2MhFb2 zu`#lm?4<5uP=9jbDXE2MQuJ^^ylptcvo$y8X3Pueu4*RIUfbSrz-qwc@*Evl|uPaxkwqe5Ad2M=e z`&(Y!Y#9sdJ5||=tcq8v`-i+p-689Nv!x|R>Kdv`gBDDU&LgKjEl_+tK7gk##MP0T zbuF^Ut8Umrj2(@F6^eYHdt!cE>@+36W8`BNWoVu~f;p(?ZZ+D%B48az(9%i7%Qw4j*>>g{?u1=N06jDV?- zy_v!*V&+9&%}DE7{|uS6Whni-Qbm42+?V(}0{**dsCFqRzIfViAtf^&MmUAPs*HY- z9hQSN((9b>7@n_7A);h}j12R(Fgy7$H$cc{V z2Vs>{73a0LaT5ozC5I~xj*QnyHftGkk0-d}wT6ZY=RYwEPtL{32XF3_u=Dl}E)tJ1 zyRUF6cy-GidgO)KTEn9=U}ia8|Bzke`NPN|c6K?q)Sb-~ z?D7NH9((GFXY<@Tx*a>av7$QY=S)I|jI?2|@(wn_NmQV8xD}E(5m;88+cLhAI7TY; zdXBsvV?1aR!teURp)zZAgA}@@3;*pnM>2gR|E#3Ac7)IyTlWj<!WFHKJh6q!c448SO*siOG>KtdaK?=Bl14@ z2ao0Tm%_D=^s6jgZMvG4hI##l{L4pR zOWPxOe`VHp!8cc;=Rw%ekaQ91w8K`ZzuELhE;GV8`OI5paw}598&1@fI&%*OyUQcR)EvY6*q6C> z{hM_$^Yg|Fu3B?H`7M@qVYn%{m50xw%1plI0f=DvI!8Uj)}I-fTjalz_)GKNg9j&P z8Uj{t{=@N0gLfAm&;F}z*e)Y`x@NF&_qW>KLW=cBwga`E36?6cCM~=Bs z71wL|Vzk&Y=;{RaP)!)&;INR|8&|2CtugUIU*9^apnsG6jW_rx7%@@hwHM=CuY5w= z(P%Eslk5B6MwO)S&k>v=-hl{Id82j}%WRYswawExpw1ANs46-{Q;e9);$;>Il)vr?f?X&~X>CHd%A8;9Eqs zW+V7(jU34BofnL5#sN+f?*&N%a+MR~?^@_l>#FE&+PD!t!80j62900A3%}c6rIF;i^BICHQ_~S0w+xnpkxeu*p)EvZHfzr8fPv?YxH%&nr=CY6>$@Zqq4A*OH2)t2 z%gupEV=c6`YkLilJ*Smz_bgO|9W});F|qN^)BL zu}od8#)S6D=Z69Of8X&$9`saUyOdZJ)LZsX1YQ^E4KD6h)lhct_@7Hc*KP~Ckk*<0 z!TXdI#dwU8+0rrYhE?h6+XF>P(EpJ~XiekVBjm%9;79b}{pXws9h! z`H5`T{^;)ZP3reC7*5$5;;XfdvZ74Ks+o^ez8Rx#yYam`hPS@{TXGi`|Ko?qQETNZ zH4P-$wUzq&mr5E=JpW6g#4__a&w=fM!&TgAe0Q)aOlX-~S}~wjBITcd>-Z08@RvFG z?@#Jry=d&wSKfxw^T4>siWans|3gEeUf)d@$1;JYMob+5ZX*_ywSr3&O13N8%XV+# z;X}$A&=iImn0l;sR_vT-OM3vf%oIWP9;w&$niUULb`nR5ChR-Uqy6x3@6WMEL6`zTxz7Z5U6PMY%J1i(zu+~@8$cnJ3q zcCV=ohtAb-lQBC-FZP2=q(!|yAh-LlC1Nti-9-iPDcbwZt5^jM>9j811EG)VTua=S zjeOOdxA#VQ3U-EJYw9}^r91j}Bwag)(|ou+xE!6forv{V3`)3DeC-?iO*p2e zO~$_MuG1=K38H1qdVOfc&C4Te=0JZlBeKK2uI&(~|JQGH4?rvOK(wquw9KO*e?(|_ z(W&Oy+W}ql;hOc;kl2#RkXSo%uI~6$ZsX*&Ik)!S-d*(6FlpD|*CH>jhG53~%ngsd zkQ%rsC3exbzQCi-Y@}@#iYgd2X&2@DjZz6G5}TZ!~(}9-+vw->%%sgR9=Tp|9Z<$D`s@Gxi3B z`0HAKjc%$f0GZfDbW(@fY+M7H{blL;klwZa(cyAxAl+wXmqDBLYtY&>L=f!L0=TD}z^Y;X>hY##7xfbt-d;*AOb%&97kO z_8cUtS%Ea-r$lb8|4@0*nwjtM9X7y+eBZ(4WLgq*P%(miw8C7K?)|iiTTzkterrQ2 zUv{qJpK<%wl(FITBkk*=5b$~RxPwv_`7fWnzF0$0JY)rZqr-IIOLa%Ic$PFYG%R^K z4SQBL{>4_i%i#1|&aUcYE2k_(pZ`wXYFD*@`VI))masNawCCpyWw9mN%QxBGOJF2fMWtzE2?^gB&! zq)IkwiM$9o=RpI`H4SMzUJUIQGN?ZV+Rg1(dd&|ZIUnw07=d&CkqmgBLsSK!&p9=) zgO6Y3A29%FHFqIcOR?8Q{h4V+k+e{klHfp^%=HPWqt5NxHrh6OJ z{e>J;#ClqAo_F7R;KU#3`fq&y7>i!L+PFMkpaxztv6sM&bGHUG4wqoO6y+p2@-)uw z^MfW#mFG~t9KWQj{AoT)c-hsTPCN{6k(oZoe;^J4@o#=P4^9t$$rJmFio!XNzC~CZ z^BTrO7(oa6hSAWX7qo_CBrV`(q=kUUX=#+@jwk@Un2};SrN408!xqLlg=$tc|GvkR zI_!sTW)PY?%vyOTBYe=GvVjNh3owbQM+OSueaWExI=SmKB^UfbGi3xv)9Vthu~Xpu zgH;H~TZxIu-t3}q{#mHiWVb4aCPo~w3em*sBC{F_eN@2v*>-Qx^u2?!4C-W{2taaS z{s~Z?DGv>k$PUrv2>Y93ehGx*_oH6^N=-;`6AGAEp3e|f&oiU~vGpFZo1e_Aue!yc z(IVn)^Aj44E%SATy>wJy1%bNfrTaJhKe>VKyl8tKhKVkv=OVP0WjzUYs`^mUOYiNu zrHR&?EGuQ~@F@kiQ!j}6J@vI15y|&?svoL^{$IQNkA?ij#7kLxFW#U!B@=nq*ygXo zK0z{m2K1gfT&dDGo@t>4KmjFFaD2th-FPOagZ^KJ2(a5NqdHFLKIM*wa3MOK0o+ni z{BbzN{C_~CC!1!o3t!@KGPLZo$Z6b>x)&9=kR)+kwg)l$!O)Ylb5Y8y>dZYA$>Yg{ z0lL51*15o5bMP62{x(X;L%HrO0B!tXFF{QO-Zy{jRUn6?>E9oU{a2p;H3TN%5Ffk` z1Qh8r>Z%xyuNXjpL49Mmepu0{0A&-w(Vx8lhFhkTZi2$$sWCQnV>L>|c$A4N2+w@nIx$v1K4=Y#!3%vq0NPVFEpxTrq@y9M& zuFe!U!OT$y!OZD7sKAq_242{#_PMwq&{u<^0e5^$89`sbM{2OyzpIp2!8UWSp%n1@ z#Y98-$-6^|CLiSxJQonS>G(>%SMc*Gv$wB8{EiMC)*Zwor@16>f68ouV!F9sZ|Ck2nu8UTc2B4kEk&hj_cYiec5`Em%-g{bLIr|7S zZG}sK(8dtE7DO&N##gToy|VX`W^*&LUdvE1|1X!EK zivXLuXjw{hvhfh-E5ErPolNiAXiiX!yiFc88kuyW11S^NIw!g~#H?!Up`Tt}Tbh+h63V;(gjp&)Z6- zgEX`w+w__RGR6987#gEwhSl}W+}f_HV5R~e@2UCK+#!p^RIImma(u71(V&qH?BiY2 z-h0OXB#Dq?XG6D6zRR$%@Bv{ZNi={7mRx#9XqIb#UHOP_C>JHq&#NixGD-Si2;YyY_H$mTEJ zP#UVR_-%8~8ty+&*xj)N?^zysFC&2LGs+f#3^l=n3zAk0;H79;f=^a?rYxQ$>c^G0 zAyZ)&sp?hu13$4lcb(JZx8NQoEL;5mSB-DgW61oX`H{>3E%z4QAf`+4k3VGzZ%YyE z51~;iENRMAG8RBSC5+=Ithg@4jc`nc>^*o{Q8}BU8b=&g-5R-i?q}znjH-+3-|j8( zcxqMquz%lL__FTO8oS|mSzOO1z*|N@KeOG9PEd6`^58mV>6@zPX?{jN-TTb$0XFLm z=6CK^@bCl9jp^ujbfvpf6mNQ!zq17T&e7YpkkfBM?|dlRsh-6%+fGNR14U8?wdQ)1 z`q<-Rk0xg8Ve80hf(D3=GSrHm@A=gY0p*GcLJMlkt_t_;Ea`nMlz-Z#oF2x-ABhgc zFP(02^Slwqb`2&F*8H7C;6~BKwdJcHRiEAY$XR41*EbyLY;w+W7W(8yVBgtSD^mKO zgx;NGv6ZBN>IjsZArb=cucDRI%&@=uY0fSyrC!V$`PTV-MQQog4;If=ZPEv(AE#_z zo)_tx7zocY)d;kc5wfKxL`?KeTgCX>ahx)zYG>NvD?pw7W?FJIKxtRltexA9`)sRL{aBMrn5o@P>;ifdt z%D>|>N*B{k?vIb6ki%oUryzy05#g~7&QpB$ItVT9 z@$_^EOtqYM|*WF^~c#Z5uU~Nb3LAp?@dYMT4xoFq0{`!vo~2(v_cS z3D5v%SGSWuEf|-5k`Nf7jG`##rAk*}(Mjdu;0~QbIc;j?v+UBS{?e&ee^WU!7a|lS z5$cAQGIJK78I&snV06OH3ej{4(MwyBVEBjizV`By3y^B`u@MLN?-wam1~kMU(o4~T zQpcA0o;Z_U%PNaHMlcl!qXjdjUpPT&?N@)jwtuyV_O5{NTU0>%_u@PU{j}c|73?oI z4Zm!6|Gz3V(x!HXKBZK;7Zve1i?-}S{J-uxH-Aihaewih+ira#WuqL>y9-d zM!NfrzxV!l`>u1(U3aas&pv1G{n?SItF8KggnC+gnReN*o@#N zB3n&WCBWUkr=+7Y6Zhx7m)c8T0D$z-zkvtHFQmi$B=%E>C=)M{&^@FTf1+D62mnye zt1HPH2F>pjd8C+|1P?`?{mBWAoI}5qYENTECE6v3CsN7%yr-_gCh|t(BZMukr0HW6 zm_;q_Q^dzlNf|UoMu{crJh}tzubg?J^5xV^DagLC>b}nqzhBSH0j}>@$jK|pkqX?! zw%&L-A)J0=PeKAS(fyb^hrRL9NJkNj#6&O*b6xB!3Z@rZ4D$t*xUf2;RJc4rl0O>y zfK&j=DQevBUQL%pl-4=YnJsG?RvYoWe{Ms!B2L!EPshkuIr(w*3NObZ;AIG3Y>6pv zL(6P`lZR+DHg@)}0Qr!R$=~_m(NR#7hp>>)U{4Iv1_jQ{%xpnO`S8V#_x4Jonjohg zQN7s*fW62&=6Z*`tPzK#0rob8L5;D5?*?w+syG?_vp(9+^SEgbQnp+x(-L!jJ?<=^ z;;@0vi{U1ZOr>`p40%?9`E_m2cG1&VQp0NMutima@kqB|sMesZt7}qyz0i;K=LQA_ zfWLE%3F!7fVHp{+5l}w%^y3WYW`I->OcPvSXH%*T*Y6d1@H`JRU|WAjPw$Rm1K!IH z7mgb{0>mjq=~pSWnscVveVXCP(~1`a(K9mQFTryx8J5-PQ$b!-1Gv52QQ$;O@N84x z@v#UDGr1G+lt!}!q0^4m#+Q%dTfrL~8hT2TOhpoRTpuQ*Ll?hgZB#u&kydd(X@C-j zfveQn4TvVB4r&AN1c@Mtz5Atan)@$93a#^~5sDVBjXD%Y`5y&cV7z*pkJ1N`IjQjVNJ zJWcWID`j95CRj-?w!&q$2|a;PZGIhNgvgzY zVS6u&96`_w(31n-xfyldsY9jQf=I@;**~W*<7Q7{=N;+wNBah$J#!p=4+^aXTGQ~N z5R5nOa$IS4AF@odt5m$6(L=K`RLbRRk&3{mRdGK_W>8-V61yxu{=79*t9nKSnJPj< zM-U3b=v5i!9?$QtaQ)3ll&nh-{rjRI(BX>m7zYI6Dd3J?TSB_}Y=9{Bs0H*Gb= zt4xjEL8%?R8yZcMoSeLM!m6xQb|>GqNlw6~Kj=!(oPp=pZsF+U8iM~6eek*YrBG$n-zV4&+ zu3zMV2Ao}<{MSx^5GcmBUafIXtJVTJa1^rULx__v`1*k5lfBn72RvGjsC*SBu6if} z3oLyC?-vBEh*u!7spdo8qo+FtH=_#hC~RCkb)jwpKF*1l-P=j~V{Kv)q#sfy{U_6} zGqC~fF^KA(#kW?Gbu5v6C&+_j46NLgx9;e$=z66UGus|0cJ=s{Ea7!H*G@onmwaZH zt62?L&ksx@%W^kBn=ULW+TnQ1czc7oK5O?3pOd-MM?TtY57@cHseQ98&1TayJ8lYV zLnoOdd&mrnxEkvh+HBLV0Y_mj)aWO-X5|V=#KwoZd;(x|Xp_%*cU`Z$9L9>fR+nEJ z(n=~`0;IQ`{6YO_uft{@>G&YWCE#b@7AD3oBMNe{}oUkP`eeXaeK>0?p6 z2<)T2;33^~iXJgqp0~Q7tX#bDCs%1$1*5Xxo`yY55JAO$O)o( zn`L0vhUQ10?7Y1x)RY*|fqyjqp1##*oO@fp!}<1ehrqKtq}A<&i6%7r@34SL+{k)^ z3p#u&e$@K(+x$gN7{mGR=1$SyC-w;t;5*Mc5F$>EL{zhwW#Ntbhd=YxNyV%i39{Fd z93J=QonM|-1P!IRm^X`M2*1X;zf1nN{a)|G3+Wlx_wK*TEUmO=WL49c)>UOg93n@} zJX<*sGn~1w{1uknNIA$>DmS43KR-;Ytm*S;1BHJx3Y{e&;1G)q$g?ulebTB2U$UHl zBYh=&9l_oiLWL5-1#NneDe-{6rt_t~e`k+|8R=`oj9yL=ROHz-7#lokHO8mQiiT%l zDPL+lZN1niSn2tcq1G`-u3(+dna{Z&o{ny>{RdkLNXUw5gWb^a_q%*f@!-ShPdS-d zoaNHpAt2V`2|Lv3_uI=7qiWRGMD|1kX_=aS^^CK~wpyNAL%i9S`1dk1uA=XQjCj@^ z;0rOPwp({&j=nR@vff=kDzoIVf=~|>r#BNZBt}q6qxxSExVt{*($Y#1l9B1Ty}6PI zKFo1RHl`!;Yk!f(B0Jt0ewDqB#QJL&%P7`jyiaCK8Uy#<+c&=SX=S=PWd=|NH+!H` z(sd|@)T1_L>oF!fiLvC zXarxph}#RL1^szdL)L`en&_p(sU4lgTQcWf#bNyf3mEaJCcF1_y~)VQ(NV013{Y36 ztNKGNb?p_`WF0DfHFs-k(elg zyjvocRYTuiEu5ha>JlXVw~yac&ez*9OppdGMG?>F3w+zfCbT@TM+Kf0divLL2AfbX^3~ikv;`+Fg_SD+-)L-Z z+9Mu!ypy#f!Vf9jR3y``qGU`h+2Yzw7Mbkn$y5H$U(J{#e5fpF-3>J^MujI3+b4ZN zQw0lJGR0h(!?<|$PTw}46M@YbSr-q#6tS~o7G2SNVC}L^6Hj5YBrJt0)vtOxY`=LD z;xgmm^(&#mWprX<^~!QPLx2;0eQ@%++q=-g;0L@`c7MOQYMnI9O`SwC1qa)%Ul}gK zV8+$T;DUi8Y3T_?4fSS}gS-*QL>nKk^VaQk%1O4)%&6|fP*}P2139=p(NeY5&3uyE zCiEe>(dXn1E0AZ$3A1;rxs6Tfc&TE-^n549OX$L3>%@-(F6IK;|Hz|{$t%tIeS5^1 z_GOoeZd}m=2LePhuD|#Zulm7tWaLJ?GW6Y*O&)zaUtF9a45^&?L^yr7FEOf6Cx^Z{ z4+~&aX@@9UGTqqZhfP&;X% z0jF%D_8Cbl^23q_wZ5saITRSsXUc}81PC6g*dV$Q^+J+GG_6{&i$w6MHwBLzcYpV%>ptB< z;VihuIA=92X2z;d7Bxjr3UL>BX?3>K?mFO8 zdM)wT20Nnq_nkkaRK+eTG0_9acJ5HCYQ9H7z{cY19^LJPusR>c_~1+rgxrB6;}l>v zofHJIHvQ=MA#{8~0j<^mF2MZf;WCBj0SuKP`S1)2%ff-{gPgT==nbqok ztWyrydaup?e%1Bx=UMpf8EBB1av~Qn=#QJ*l3a$yyNoyOg z-d*x6k?v4N4<7A+n>Y@niv>aTe0i|@eloWqf?~~rK0tUcgDo^_+Dt?JZ*UN7A_0T> z8LJ{t*@&J}N%QsiDyisnLI64vMkEu5P4XU0UNTVvKRYYm`n0U3oehlatQAQIlMHP& zxFPu)=Kg*kU*K#0Z{>ILoV+36Nx>LpJU@&$fcz%~o7K26prv}UKzxpl0JNvnx~iVi)SHW?UTM9B?sr1@$Hr>{3D0W3CFxhiy5!?h zgi_t^vrLD9vvA3xafzX^8V6!Myp&}Fv2wu=4&92zFeyfVc8FsBE7=w8w%72KUsz8h zy~J08boN5=mC~?Z{HJV{iq>`PkrJQ)Mp1~Jt!;Ej2ac)SR0i`5;>UWu!OCMEC1>lN1ul5fJJTX-{038 zZv4T^D0w+5f4V(#kH2LkvBo|4NWdR1_xj=*&iVWEW-te}Jc&RIp5c+i?l6Z~nBY7`s!AqT zv7{C`LA41%O-$`Ri4&eCi>Wipp6kc8zmN|3`M0jGP&cXL5B8zpNO@(QPA+Hqh#y_y zx1gxKN4e3T-Y@DZzwIUJ2iyf8LA(ov1f%UWMFnjoPn3D!B&}*I1)TBNU#Bkygn~f6U#iQ9jnKGU6k+G}7B8Q$|wD&&S#Je@# zR1=uQ-Vpw*5__cl7IRdu1*N$E_zQ2{XZy^7^io5}@m+ix82oN`@WzJ8&Wx=%)hF!R zD79(qpUx@-76|8GN!=2|(dF$$VgKI$0k2 zxFdS0M=)lwYi`QDve8xfr#;m&G2U4y(L(}GZ*=MYbDn4_a5o^H`b8@%Yaw=@SiWGw z{>V>wU!hCDOEigfC7lX7P-Cu4VA88MRMjl!*vNUK}Dd@X9V zfmIwsG%>>b_$j=9?_}ScW%1$p{x#DV^Vq%G?(fH8+Ru~hE#j-{17@UPgvzBC1Os@oe@CrJW zhD}a2m#f*T50~-(bI+ob_(v**<|=w3qb9R!B3`DGnWTy|DY=m&R0hhrsyZNR(WDZ6 zDsRs0FnBGntr4~H;it*kGxr8!y3U8M1(NpJheOdy6w{PKsjSxLx1AWNbSn+@C!qVx z#V9krUcvrkyMOt5SRCXO(3ivtsLkPyURWod6-sdYD(6VGB$Qzx@^F(Q!HN)+oZirS+B49MD zKdKE;86zQGkYI7;GonIHfJ0g;<=hH&T%#bkBmP~XoQyjYAmJg4u~3g=2o#G5Wp49) zE-c)4eSJ>>xC_1~!zH}c?YY=lR8=)%{H^L3*Li7d^fk>U>@JRDi_95Yxw=id?n`+1 zKNs_AX*B>w+0Y#qJ`Vi)3dr^=qH{(h!Le~}T9cr|@-pJt0X29I5MLlg9CJ1?z+jc1 zD+ipEO^@^+D~)kj3EZx1jdbS?mz`m1i+f<*(&{T{-8@#f6sS|Ijl7xxCyE!r@k|J02T6i`;AcgC=GLE8!WRU^2!f`K0EFc z*AnAuP_M-+KdKh%80+aI;+shu39s zEB~Ysg|1V*2)sTdI7>~p`oiu^enZOEQfsVf(WOt|VS`U+e2i-}kVhv3>@Dx+<@piS z8sj)Df_-iOqc%(`;d94f%VP`Vq{ssc?N^ zF-~X@kzm?#r5IVVf^j8~A?RI)j!aLaMdZz=bCQC8GQ;pJTb2hoQcE-_K9v0bw9n9e ahtFWjo9lBGrip9(0@RhYl@JQn(fL?AO14 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/demoncrystallizer.png b/src/main/resources/assets/bloodmagic/textures/models/demoncrystallizer.png deleted file mode 100644 index 370a1f77e60decf5ad032cf42dd8a254623418bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3406 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/demonpylon.png b/src/main/resources/assets/bloodmagic/textures/models/demonpylon.png deleted file mode 100644 index af5ad2bdc62e3c7c47581f70091ad10c66fceb4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5671 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 Qm>)I3#K1zoN*5jTKM1(KtN;K2 diff --git a/src/main/resources/assets/bloodmagic/textures/models/incensealtar.png b/src/main/resources/assets/bloodmagic/textures/models/incensealtar.png deleted file mode 100644 index 68db926370292aff4dfdfe8e4cbcff961b77c4f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6835 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 diff --git a/src/main/resources/assets/bloodmagic/textures/models/modelroutingnode.png b/src/main/resources/assets/bloodmagic/textures/models/modelroutingnode.png deleted file mode 100644 index e51bb21138a4a350cbb12d373cc46208d4270813..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1798 zcmbtVc~sJg7XE>jOIn)dUTKY5KFc7}P?K>6Qd1}$bDPQywI?c;pe8Biyqrvy%yP{o zduGMBOyx>qg$}t8?n^GHQHqL$g1a&_f4+a;ch9}|obTNGoqO)N=iKxQXlHd*162S3 z)LmT=p7NaX-IaIBBg-+UL!Nd9yE!8O*>@{xD$kNLDlsm8u>i13>$`)1{6~6nQVH*h zLMlywcj_t_oZDa8BX7)dML2mSd=idwaE5Gswpg^_>2^J*)Wy%rdcM8l))2uX_s2{y zY{;Zb8y)MqTfIwG`a2i|R)k5iP5Dx(nz1=dK@rOZ^cwJ*DaBix z=70myADCFM<;^Etc>v=75T0^-twHME6to{fQC+b6Mp92=Nd2E!DLLd?Vo2K>WfOXriK+ zi6qIkrbL!wHbR9DMrn;Ue4@eES~h13|mwGbFXLp5qcrjQHCAh-W>R{0sPFFq^AQ1 z$~@Z;9{>4#8sX8>*-0kw_oUp|MoH^f!{9tG!kmxTXtylXc^Ec@usU^2^?{ECof3^ z&{|=2k+oWmRlw8!2#8G__0n;6Utihy%=r0DKd%aJ+ZyM5P@KO)eWksxt-nT^NyDhJ zn;Z9;H{DmqA>o_G35Vp(T)I!yUiLLBA+7~Z^k&r#l8!GgjFDmmJ=#uPX3D9|)mN?8 zjM~3kuSz=>3wz zi~fE29JA~l{SlPMh}6xQBOcmXY{>8*G>C_lW5NE%y}J_@F`1YiQ{_*q%=1m-Gp)ti zTZeCiNW3lfEv`9OolVH!Xj#oOki<`}bO^w_R`Y%&!)6Q3Gz|cH3YOjfM>M^l7>zZL3d=)f=+oyrl#A2~6 z;&oMcR@?nHwGgriRh=3lpR8zFGp!IMzWviJ;>xz$;|nF;6`HRVZt_O7Nx4#jZ2M=U z0@Q|P0BMV+KxttawAn_Fo-iZ=)Xzq1jvtuuU@ev3`};4xucnBIWEyR9!*O_CS%A;? zvOwy^DYIgXlara9d_I5u4Q^zp_GiZa=(})B!#(|LOShvo*vLP9=Y=~ET&3~MuoNzi zH@=*{vEdWYBq_z)A#40ii#xPl`@bGB5#a9{E7vDXf_G(PJc7erUkxk%k@VNW@u|q* z;76^kaw*2zHx|!ekf6fS7$mGMb~O9i3;9y3_4N$~WoEEJ34qV6fGq6_k5jV(YnbP1 zmd`LnC!zNh0=K&llOdMJ9fP)-IU5wXQTC26*YnWjBO@uZBGF$fNvXy&HF7Bw3guy` zlm0oOq`6@GOp5SDnh(d~;kZqndm09sKG*o#|Jbb5PJYMd%BrIZB5mBtJRf&oz2|NQ zLyHaRa~0B9XdVW>)s+14>}bdA8t3BM$;&IMbRgqw2qm$p`&VQASB~LvjLW4*!U#3g zQ1Q)E#L=k$%u^11VQYD19i~JFqur#&hyFiUZ65S|C;2z6Zf~;uV*##6G@|mSz|_A1 D&y8#< diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_base.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_base.png deleted file mode 100644 index 61b2c87526eca833c3fcf677da9b1fcccdb73737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1573 zcmV+=2HN?FP)G*)50oO z81#Cqw_0e1!D**M7=|n@EwQ}PU^E!gX}6I@k-+l+_~>tc=T+?!0Diyq_~vdq&z}i= z$;grKBT6EwZV`teNgSi9Dkq%|LY|{*Du!WjdUAp&fMFQ;K|skgxgL+d@`b)=M9a1j z1c8%RZNeZVPE*n}!JUi=!;sNn$XVw#@4Wji&9!xAu8U(kOok)MjziHA4bvp>eVQ9B zTH9MlqQu6|F2O8hJei;w25*1&F;hPvO;a}Z_JEu_cUSp3Mn(`YOp_>zkrkCja~1dc z8pARX1ql2ZFP=Zcv@B{XD@0+0ZQFFaUD7-+9+0Lfsw^W20-a6=Z!#v&bDV0GLAT3t zqmHWS^e-<7I~}H;hhbWbudYxvt$08j_&C)n)x|~pAfR)6%w#lT+#jGQ3Ywy_+-OiT zE!sy%y!owfGaB@f1-LjrFCHMN8lLAd7z|Jq8M|C23PW^NB}!6;qajI_5d;CX9iLIR-W^v5(fBvIbK$fP+ipoOCFX`mPLB!=ct;7 ztSFqGe@g%2qWD_?&}p|hJlH1+L!5;waTu|&yNe`>tgf$PSS6w)!7xqql7Vg8+-Wp8 z`;xERSK5H@xwN)6$>Ny7XvF2k1x~ffY&J!bWL(!pAV-!&?1e@8mp!ifec~vjWZT6z zu=VCcW}ZiRVF3}S*6Rq8MEmH7$z+V8DCoMu-h+qCJeNkJLA}|e{og}^*{pcL@xeZ- zrg4091cE@xvk|4tx~_A2+-7}e4`i8_2L~)I*QwU)#UH`K8_Rt7!JpAe zCRv)|)N07O!O@EsL}5hPuArMHda1<8=_#YjOPbr;Jp1_H=&D{gKqz{GqMnd{o;}SU z=4D>bVzk)cY5?WCYpC8a6Fs118XS6k;w&ZRTt5lzaGfV!6eQ#%LR3YhG@}Q@!7C+{^JjCd7^N@XP&6l>vVqcCr@qa`{?n_lycl9ze-96Q&XN&{_i`7V6IDiD-!5@N)4_y2OY>AsC zPMkm-5J+4AA!L~o2xBY+9(uO+Ot015wPj^yWaPqOG-l>71}Wz~#VsDaZ!ACY&VJV3PQHRK zZauet{RgkLw{GwA(|3L$ctNS8AK_UM`?nI3Bx0H7T-)Bl_dOmwI3$i@uEtm7c~0Dm z*xXPwO@m`Q{OyCk1Mrg{|B73?2LOCDd5@>NE#@ir5AX9?r7BaC^dfBAMr%z=!^!a} zLcnlijRyyZc)rKZ-Zm#kr`UBvx=0E9kfv$@c<=Wg@X`7`0N%Lyu7Gy|_{aMPg8xy< zlqJeh6k2m}enA*USW0kqeugOxWohsu53MyTgFbmykn|G#&|@)A|L=`n7ytq3Vu=uf z&8$+si zg7MiHKk#T9m`&5}0V-3G7dcW29v>Yuoy<5sI^}Xap)3tWZg4%DAPS&q+1T1ZO2Ke_ z6)9!+0Bf5AwAN%Pi0isUamexU3HF&o+z%Pv7;xt=_q)CW2~t`NHwGwMv2kr3DFs?u*YuJe z>sv#bx@CQHo$b+eXarJk?H791WN zbq>(Ehh06Pe%Ji49kpNLpV>pSak(>@(A$mKoH{6P%6_oN!{r_7rs7uoMgE1SF?{w-yS5K&}BY4&m-+yzJQSd5v7e|z3z`brK-7pvVXOaoqH}`|H{v@WUZx_f~0M;Cna8(*i;1qbP45<6sGFKB9) zt0F_&hNw{}+Ypp47hK`_K5g4F+#1mNKYi8{rV40V3!Ph3m7;DflnOA7BGWZ_-7=r5 z=RDClz_XtC*JR9PQL=0eC(9Y9>6CH4WSW(v1svxK?icgtJkfasPdx!J+S?&8HuFr< z_Yw+Mpn5irC6QLkT9`2D39jl1Q5;ibdG`*SpN#PXpSrH;U)DsWA_klcdd4QHZ2}3Q zsIiNNjrkK#r0Ek+bPn*WC&F-v@(rWR+Z@%P^Nb~`@0{7g@Hf%igB{0Dh`2gsw8 RaQgrN002ovPDHLkV1jzh$9@0+ diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_base_d.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_base_d.png deleted file mode 100644 index dc8ef737a35b38a134ff8baf40d3ef11bca51635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1489 zcmV;?1upuDP)XIO6~S1zt%+ zK~z}7t=7Gd9akO3@$bx>IrDz++_%lH<9L%babjT-s1OyRh5vyjJp~ni0}{~EP(z)9 z1_{w1AtV%VWMl(|wY}NBcYXK1&D?oAXXa3ZSi3?YNRwYR)yy-`Pdevg-9I@pqcowe z6=hX3Od=fDVY}Jm2pfYT@I0pDl*Q#0s%weEfc?H;I!^h`?;l#1zx|n+ed~Kz!Mz*L z-+b@Hy!GZCe)Zw+EIwz1Z9B|nQ>NpTw(YoFUU4u1G;cB%Z418vj5!g0m zQIZZ5ma8pIT@(5)O{2KXa=NY~+n4N%3V^?!&UyB73&5M-|M{!Gefapf#TSgI>IPp5 zjvw4-wOX^*qdF>Hp`KYO<5FJmPH(gG<8D| z_>4y>OyG)w9M^TpvYfV6ShmA-GD3F{ z244RLEDO>>LS2<4g8{DesA`334cRVdG#as5tr;XCLP+8;Kx@r(GA53~{s97CB0Z1W zZ@j_PdP`l`Owt5^*>sH7ihWU%V9^6N%hJ9HPClP}r!gMWl zqp51eG#&O2K-Y2l{ERe-$oB;Ylazzm7=X*g0OjHv1wOA0RL3xp6vf$SgP?wv#a_|YSL z;V>K~oSiQSe3#Z(jMD*FpxchWeEbC8bCIsY(cz4IUorpB1=MG(zAxzO3DN!HhsM1B zKE;buROGRC*BswU*gTW?+YRCI3HwJ+=(HyJ`q#)`JjXsvd0D^Ut?&HA>gx$%fAG^@ zE%fz-=(~dJp7_!I0pYvvlFdJ%NkZ~q$DP{)R)6b|SwVPwf`0gCKKS*cSDvu@2Dt8t z@SS^@Aiy7tiTr?}nbB?{q!&Xl#%UDpJ72xwiQWx-=84dgz+88C4_}wS9rLCfXWm^VSw9# zPz|<-NT&j=KV~{RAdbTR0Y3A@!E3Kk&Mj=;M{jbJ?x?Yl#!xOBWZMxWaQRf<@I>zb z*FE7Zk7y;xu0z)?R+FJDO(0{O)fP*%3|oUS=9MRU2e|Hu^ww>#Y{(r->7d+}C<)oG zEo3?Y$Hfg}8m(V>qW3v)-4oT*e`18gD$gl(&DPE!sc0RA%GSsGL!G{*TlCE9mQq-VJ>B r+utx3%gq;hVs*9sFHbyq`htH0we=U2>i%d(00000NkvXXu0mjfgPGa@ diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_base_s.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_base_s.png deleted file mode 100644 index 1c6a0cc03c599d79d1040188305142a847385ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1517 zcmVj1Zb=m*`1$s$D zK~z}7t=3DA9Y+~};kT-*Z`J2EGskCU?C}^A;}FRK6hs6PAhG6$uwliL{}APOuwa4M zM+#CT!vdltM0le3ZWGVtobJ6t%xq@A|DzrP3qbxb+h^oiEAKQ-u{5d&-AM0K!o7&*zW$emy3 zqA14mLfY04>j+~ENiwId4OMCg!;sbfO-^4t=Q;4@7k9t$k6(^lu5J?e9;Hc<(s6Kb zgw`?8lW#XhE2Q*^B8@4x)J?;~2Pf2Z z$8#%ywuR!(atjmNJ>n(TN^^2ZZzp!-%$R zaBjfbo?&o+C5~fevqJ{k;<^DLJ^HSqX?mh4qVIyp0jn9k-@Ca0`wc6a7j zr?|K{1uS70VoZUMii3k=Vx15_xIaE1&r_~mJw(TvbaTex{xy=MLV5w|W{pxIeh?5v z0n^!nx~|FdEyK_=*lK)$vn|PFhLn;p(v)?Bvjcg0%IeA?ZP!y28CA7qvDn2|K3VpH zwyCJ=X8a`_hJn)L>@5$_I>y?bx@lPMUZJWCMZQ5PkNJE_Q&%7)ySw{H&(gKyHz0#B z#NqMa{yjG9HHX)3uv#5bH#IL_JY%o}i^VQUl5k~pL|wOZO-&d?%ohiv1H`S{KXXl; zF<%^#ZoXnNT_9zEwJl9uqI^XdYJ~7m!M|^QX;SRaGV~3PAAcf71&lqxSWl?;eq-J8 zr;f8vOQNvD-)uOZ-ryuiY14?Ew>0Zd46?WEzB}dOUcr1JaZk?p)q6L^SWk@Jz*tYH zu>qGo@y_0FnfySLf0+~L7QHPvo*nZKyQVG!mTzk=KI-|v{Q8wAMh9H>g#NiEo;j-B z2qk>l(Bo7M2#?fozy9J7TS|))7U?_<+lv@QO7Z z3tZ9S*&fezINLB#K;NTWfLs@7J>~SpQ!4WsHt^CDzVCBwdPuG`b+{#peY~F?dm*Fk;0*4O>%3&d_O_WCa5?>&lK@O zW5WS|8+bvH`od#X!4 z^{LA37)_`6u8VKmgr0{| zieKNpEe3DAr5aaXM11#~r`O;52IA$b;>sqB;iXpZlDQ)69gpl zIWIRF=(^6z@-n{flVll({XS`$vbC{+X__Qi#;y0>1K_8(|3rQF4gh(QFyFZcKzA@; z5XXF03{BG*O(w)~Oz8W_qQH(KWKrO|E)RP>e9xmE1Pq5m4h|3TT$kR_5yCJ4_{)P1 z{>OU&WP^do9)$qBzr8JZMvOeq32YnRvd~SF`CEQ|K~ zI$55hYZ?GQe)UyeyLt26!h<*7LjB?WX9JjqK>@sQ;R3c{P?RNxt|QBmdKlu{Hnk|? zV!Mr0ikk1EltKeEar)w&PKWMbaBkr|NkDsc1q{=+@ogI^CBEz8IS#|=l=*y)CIq%^ zV_Oz+nqmmSqr*dnaZD73IJyqNA3ylu6ANd90psm|Jrh8D``R_tYPB$Rot32}ydXdV znv|qP!DuwXa~%92z_l!nheL!?cwxv+3Al>uhdrl4Tj){e6<6 zpnr0LPKT;7=JPqe?^BB+MsZADmPDS1E(F)FT;b04 zHWNTdNhu|kWnq;iwrS#6R&@Z^wvlDYhxhMONJ$CQf`GwjglpRvy3TkyWvN!f^*n^G zGo8&?URpxH^8x5|yI7Wmp=szsfTpoptI<6;;BzZ0w3a{9wUKvyN%~K$f6)VIl=Q5 zd=d5G4${hqlMeMS-=I7+(H1Uz^#|~`d;I9Z@1OWYWq>oE$ch5-wJntEAlBBm2(ojUgV%3zV`kQji^{OI(aGoPpo z@WdzX-9wvLs5nRH9-4FzaSo#l%c}t%NCV4ho%0Ffc>tXGgn04l>3p4ru!u2>5n`o< zN_E6a4J;Q?Z;<^nd*Tz7EAX^WsGVJut|5E7$jKvy**@e4$i)!VKSDJl)ZNZGpD>=s zG&}Q&AKv{ft>Y$v?-L)+uuYQ(JAbB-lFOT$IDg;aWPHNqtu2OeeEJVk`50F8iOS>n od#}8ry8ZsA`h;nkpXn3-0d>~-FGE>tWB>pF07*qoM6N<$g4p%+-v9sr diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_mid.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_mid.png deleted file mode 100644 index 2e16a4b22e38076f2ae3e2d9961d024d66feb105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1901 zcmV-z2a@=SP)=6 zPm$RF2*F^G^}w=_O3~zYlSw66Tu9?;Y$EgFyTsfam12=tGzvzYYN-UkLMpYQe&X@R zIeF|T*~}ujXMad%S0^LauC9xK_4Kjh7y?*rHgr|R&~<9MPAZi`5TKMVP%{ifS!OAp z2jKLvHK4co0)YK{tQKVKg zICJbMgQrdj+#$YOxM1GX)WU30#ba?3pRe&^ZHzytS~}2n5?HE-fLsoK%$xg4G7VI~NBDj|?F@T^O3i^=ntTas4^~xuqq% zJ|CJ|W%8Skvf1w^mrk$G1Gg534;^B9;s%)D@_1+vppd)S=eJItKsOAkmJ=HiTj5 zG`F-+&gTh_k2ChK^J@~f+*(Xc&oKGH1T|f!kjqgnmJsUZngptP4ap_b{qpbm{LjBd zsK1|@rvL8>+|FpX!{qoV_wLz4_?aJYN|FhO$JqJlPp$IGe!h+- z=HhXDJ|BUApG+=KI-TY#U;Ucd<$N06B8f^$W9lkqR{MXK~)s6S_zMhvAM;M*YE%2Z^7uuFhheEamY^UhJnZD!zxNl zjF00GMN~~A*xSp{wJV5ran%QQf9^q3`7lp}?%qanCWcZjgT+Fyvx~ZEpeR)e*({o( zP%~;sP8Y2m9Z0gwhUMJ-;6tWA&`L)rL^yJTCRtw26S-WDEj}NmQi*D{%4{sgY&^~* z`}dQG&k!CR!*VzsH6x~J0^It%{l5FnFF*Ozns+e2xVW4r^8b-1{H?7d=H^&Pr?ER6 zw6q3LE9DjW!usY5zh<_(AArk+If{k`z*0U>BobLu0ZmaD9T~ovCo~nUs$jR^ zOcT*zN0KDsGc#BOuscMq3=S^m3+vUBrCa#8hR>e4V=qWfCsjou z80w;{w}%Ex1EIctsuh)dp@2h@*u8fjWu=N?7=#7}0F$<@?W_NUcLYH|ayrp89jnd0 zB2QQZs45l4hlg;wT=-gB(Nqn$+f6c=#4yc`6EF+|yVZ&y2*hGBN`*Y8Y2xvE$t07s z1pL??BI$(%)L4visf6Tok>wtC!wGmSuYS`l#so#tGC71FOx>CfP}3Y!uV1BRgFb%4M7$59MNsYDL9rwUA0A zZpv=65l_sKo}XWt2ksQHXq3p~ItCERW| zZGix@k;ujsP)bD#r6Q)Tlgnl?>vcR{FO^D}h6XFeVi5roYl8*%re-djJ%c1k$W4vN zZuiC&=-IK8zMdZTJ@5bm;Pv|v8XAaBOi(D~vDs{hqQt=Vom5IinzwA>GY>zEQ>F4$-ZwlA_k7`tW->OtYMd96^JuC@qq_;w=|q%e nbX_OAut2c4m+06iqFvMOpJ~07N7u znXE%Dmqp5mgf=tNvux<@WTr4f&x6;CoA*dtCVE;Wx*XB0w{UX~Ns^GZ4Qh*Z0FJ+W0B(Qm!Y#MmU4PYxSO0;#kPz^f-;qqI<_=G9SzLL?t$Kvs#4r*fam9 zTE#$0q!<}{i<#M3(kTN?)3|>1=9)u(``07MwX1KUC<;*$(OmSo_10~!oElmaxLDcL z8V#yt57S7ar8G2ELsi9^0Q{hd>6mo=B+vezK7o-okYW7Z8Mv3w?p5c{U1ZzNEqI6O zyl7lxa(a>{zWNw9ULRc>z~Mh0NDRXOMIdEJy*SGO=xo(n1NL z2vUZDb#}oIQH^0~MrLD3!?M9O_;jU00D&Kp2GRs!rgCWb-b?`69J?jn0j^ z5B@6{92(;0)nSA#a5D~}46$94IBZiXdQ2A!OG1nlCT!$N_U*DVb_4T1@g0Zo226pUV)8<}G zGtKz;1g_&!E|&3qA2;hTG&I7V2X~RuQ@nZY2I9K+QsO7K5`dNWpZdzf$v40EWU>~3 zNXE-~B3h9r#>d`S&J>EOuw~n3TCD)tidN+d?f1Vv#?HPa-~LzS%rYgl#X4gXV{0-X z!;rz@;iWuL^oR!%R83)SehwK*!cby5X@Vdi-?5Y%-Wi`<&KJt=M+cI8cb0QUue`5y z?EUiYCt zI>>e9h{6~*XA^~z4I4VKEQ?CHisyM~DHWj#@?BZx3Uk<5lSZvU5QM~WjJjSCx_Rs1 zBcJ~Gk`Kf&PR3?#W{ygwf~pE486l;lyimb%O>EmCiei#>8%0YH>jjYQatVR}P}s8N zL #x-NZNHxox~+Ho7pwlNHYW}`)Mu83)+N!s95>+1&)$q2vYBZR_KVVY{iW4bU) zsaPQlB`sfKq;)LEf_6erZx2E!Z0PPp2(f+uT^lihB=AFIC^3yRqAivzUD3$rvuK)5 z&|E2uf9+gDS9M}FrrGf6-_b`xg6&uot8*0Ri?sZJ&W*YCuVCLd9!-jc(p`4m rtOXc`PNnFPw$dm9OlRr3(%%0AV&YqoEeI8f00000NkvXXu0mjfC&hES diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_mid_d.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_mid_d.png deleted file mode 100644 index a2962ef426e20dba19bb80545063a461d5d8dfd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1805 zcmV+o2lDudP)F(*Ry1S~nb`Ew%9$A^OJ>i|I z^ws~E>jn;+$g$UGc&gYK-w@U6-^eZO@8*nkMr1<$GKgIvLchu zWofoL_`Xl2Q~*)JbzIVhPQB5h(QMJ__OPA7bpncvu4$xGDge87?c~hV72+u5sc-(3 z(XmmEzB_SS1mu7I>j-h+Q>hf0oo`|F98^U@S7qWD+FhHOxkYqEMiM0e-m9s%x&RCh zmGQj^e)Ig3Bo}9Rdfzyy8|2o*sviCN#l1<_>QJvQlS&(OI~HfpU**7mjtkr+tY7U( zvLAVv{@g6$h{>`y$F?V4SlLg$`D5Geb9U+?p6_GZF0w2U1s(ve{OQG{)3LZVJih|mSyqFC+_8$1Lrw*;tZE&YC`^7`_?4CihwFh1inYN z+b5gN5C$Puw+}$G+2Z7>3F0WEzT84p6y_Fc04&Wf;5ZJ;jV9lIQ=wGIlS%8h=YgAF z{_>B5v|1LvAE3x0sdNh04*~e&%YR?B)^|NLRRO>>bBs?;vHyFIBJ8+_@9cdWKZx&~ zz`x%-{l0RowPsm;Y{!M!ggt*d4nRJm-?<6b>NEc*tWsdDKCgurp4*eWee?uz95Yld z&}ds+yEezEsp)lzi#NZtT1^_wHje92t1sg^Hmahm{}-anP`SYVm%hX=cHfJksdzWM zb4LmsICNx{(I##(+FH0aJIA(dV|@Ml2N@k5D3wYSO9jrIndGawk;H+|@$s{~dgxX^RI4=%P3Ct${{qkc_%HxNmE!H0 zaPJSkk(`=5&yMY5%r92Sqz%%U41N$1crJbrQK^)eo}K5?cpS^%COXTxe<`-+EbcHApD4IED zXJ*+nQlW1Ts4iQ#Z1CXrO-aGb;&}n?z$2ecBPkMA$3~Jx5)x9HM!9HGt2YVah>VfK zwjIhvlMTzc>;A3D{r8PgE}ER4{4c}9Am+{GS zi1ow!lEl530NniiiAT04UwLYGvhF#S#Fab|1mP`tqTlc1dme_a5QhQnuDvQ>$lrbb z&y0QOBmmC*1(x5rzOn0v%q%RetH8kXxp?6+l}eFZE{z{XXsU>+s`Tsuil$>KGLj?_ z1YKlF;^f5CO1=;t**TV^(H4zCJ*em58EA3DVON?dbHXWnyz8@ZH9)* zNRo^|f+&f&u7~5exPt-n3ron88$4E>ZXc`H$Iw(<$3YMTG8qHgc1fjliUpJ9#qvrn*!`Q51T;K2a1Ph!W*efiMOm zrEOdRK>#zC#T&R}b2$`MW8eh@Q9`fVr%))+YPHE_4P;p*W26YfkaDR=CT(n-KuT9p zHI1#KqcqzVp65|Avj9}eMZz$^c3gUW7eRo5AE2r#u45C&@y1)w?Kz}$jitp!q6A#m zL)TRLPMdNePrvV=sw$E!6GaiarjsNQ1J|L}=xm&Tsw&JcR*91YQIya$4R{AyJw8KxjBL` zq*yGXC=zeH^)9k36Gt&+Grw^U5XYEip2t7+D30qhR5DkxK)qHY3}bpdn`*U&=LhJj z%I81(7&{->&cOFKu0RmQE8~1*s7TSwuNvo?t|LhzR diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_mid_s.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_mid_s.png deleted file mode 100644 index 3ebb670cf2feeb990dbf6b85c99fad726569a592..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1794 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 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 Knife 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 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. 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 and 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 my 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 warry 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! - -# 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 health 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. When Will of the same type bump into each other in the Aura it tends to congregate similar to how impurities in an otherwise homogeneous liquid clump together. If a device is able to latch onto these clumps within the Raw Will in the Aura, chunks of pure Will of a particular type can be gathered. One such device 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 pray 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\tWhen it generates a crystal from Raw Will, there is a small chance (~40%%) for the formed crystal to be of one of the aspected types. Essentially, this is how you can initially gather the different types of Will. -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 Crash of the 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 - - - - -# 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! 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 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 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 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 From 4ec321aaac2bca4b107d99761cc363e94395d7a7 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 2 Jan 2017 00:19:44 -0800 Subject: [PATCH 008/595] Annnd they're back --- .../armatures/block/pillar_mid.json | 42 + .../asms/block/inversion_pillar.json | 13 + .../blockstates/blockalchemyarray.json | 10 + .../blockstates/blockalchemytable.json | 50 + .../bloodmagic/blockstates/blockaltar.json | 14 + .../blockstates/blockbloodlight.json | 10 + .../blockstates/blockbloodrune.json | 67 + .../blockstates/blockbloodstonebrick.json | 22 + .../blockstates/blockbloodtank.json | 29 + .../bloodmagic/blockstates/blockcrystal.json | 22 + .../blockstates/blockdemonbricks1.json | 35 + .../blockstates/blockdemonbricks2.json | 88 ++ .../blockstates/blockdemoncrucible.json | 14 + .../blockstates/blockdemoncrystal.json | 146 ++ .../blockstates/blockdemoncrystallizer.json | 14 + .../blockstates/blockdemonextra.json | 88 ++ .../blockstates/blockdemonlight.json | 38 + .../blockstates/blockdemonpylon.json | 14 + .../blockstates/blockdimensionalportal.json | 13 + .../blockstates/blockincensealtar.json | 14 + .../blockstates/blockinputroutingnode.json | 66 + .../blockstates/blockinversionpillar.json | 51 + .../blockstates/blockinversionpillarend.json | 72 + .../blockstates/blockitemroutingnode.json | 66 + .../blockstates/blocklifeessence.json | 9 + .../blockstates/blockmasterroutingnode.json | 65 + .../bloodmagic/blockstates/blockmimic.json | 38 + .../blockstates/blockoutputroutingnode.json | 66 + .../bloodmagic/blockstates/blockpath.json | 53 + .../bloodmagic/blockstates/blockphantom.json | 5 + .../bloodmagic/blockstates/blockpillar1.json | 58 + .../bloodmagic/blockstates/blockpillar2.json | 58 + .../blockstates/blockpillarcap1.json | 57 + .../blockstates/blockpillarcap2.json | 57 + .../blockstates/blockpillarcap3.json | 50 + .../blockstates/blockritualcontroller.json | 22 + .../blockstates/blockritualstone.json | 47 + .../blockstates/blocksoulforge.json | 14 + .../bloodmagic/blockstates/blockspectral.json | 10 + .../bloodmagic/blockstates/blockstairs1.json | 100 ++ .../bloodmagic/blockstates/blockstairs2.json | 100 ++ .../bloodmagic/blockstates/blockstairs3.json | 59 + .../blockstates/blockteleposer.json | 17 + .../blockstates/blocktestspellblock.json | 29 + .../bloodmagic/blockstates/blockwall1.json | 109 ++ .../item/itemactivationcrystal.json | 26 + .../blockstates/item/itemaltarmaker.json | 16 + .../blockstates/item/itemarcaneashes.json | 16 + .../item/itemblockdemoncrystal.json | 39 + .../blockstates/item/itembloodshard.json | 21 + .../blockstates/item/itemboundaxe.json | 21 + .../blockstates/item/itemboundpickaxe.json | 21 + .../blockstates/item/itemboundshovel.json | 21 + .../blockstates/item/itemboundsword.json | 21 + .../blockstates/item/itemcomponent.json | 176 +++ .../blockstates/item/itemcuttingfluid.json | 21 + .../item/itemdaggerofsacrifice.json | 16 + .../blockstates/item/itemdemoncrystal.json | 36 + .../blockstates/item/itemdemonwillgauge.json | 16 + .../blockstates/item/itemexperiencebook.json | 16 + .../blockstates/item/iteminscriptiontool.json | 41 + .../blockstates/item/itemlavacrystal.json | 16 + .../blockstates/item/itemlivingarmour.json | 31 + .../item/itemlivingarmourpointsupgrade.json | 16 + .../blockstates/item/itemmonstersoul.json | 36 + .../blockstates/item/itemnoderouter.json | 16 + .../blockstates/item/itempacksacrifice.json | 16 + .../item/itempackselfsacrifice.json | 16 + .../blockstates/item/itempotionflask.json | 18 + .../blockstates/item/itemritualdiviner.json | 26 + .../blockstates/item/itemritualreader.json | 16 + .../blockstates/item/itemrouterfilter.json | 31 + .../item/itemsacrificialdagger.json | 26 + .../blockstates/item/itemsanguinebook.json | 16 + .../blockstates/item/itemsentientarmour.json | 111 ++ .../item/itemsentientarmourgem.json | 21 + .../blockstates/item/itemsentientaxe.json | 36 + .../blockstates/item/itemsentientbow.json | 34 + .../blockstates/item/itemsentientpickaxe.json | 36 + .../blockstates/item/itemsentientshovel.json | 36 + .../blockstates/item/itemsentientsword.json | 36 + .../blockstates/item/itemsigilair.json | 16 + .../blockstates/item/itemsigilbloodlight.json | 16 + .../blockstates/item/itemsigilbounce.json | 22 + .../blockstates/item/itemsigilclaw.json | 21 + .../item/itemsigilcompression.json | 21 + .../blockstates/item/itemsigildivination.json | 16 + .../item/itemsigilelementalaffinity.json | 21 + .../item/itemsigilenderseverance.json | 21 + .../blockstates/item/itemsigilfastminer.json | 21 + .../blockstates/item/itemsigilfrost.json | 22 + .../blockstates/item/itemsigilgreengrove.json | 21 + .../blockstates/item/itemsigilhaste.json | 21 + .../blockstates/item/itemsigilholding.json | 22 + .../blockstates/item/itemsigillava.json | 16 + .../blockstates/item/itemsigilmagnetism.json | 21 + .../item/itemsigilphantombridge.json | 21 + .../blockstates/item/itemsigilseer.json | 16 + .../item/itemsigilsuppression.json | 21 + .../item/itemsigilteleposition.json | 16 + .../item/itemsigiltransposition.json | 16 + .../blockstates/item/itemsigilvoid.json | 16 + .../blockstates/item/itemsigilwater.json | 16 + .../blockstates/item/itemsigilwhirlwind.json | 21 + .../blockstates/item/itemslate.json | 36 + .../blockstates/item/itemsoulgem.json | 136 ++ .../blockstates/item/itemsoulsnare.json | 16 + .../item/itemtelepositionfocus.json | 31 + .../blockstates/item/itemupgradetome.json | 16 + .../blockstates/item/itemupgradetrainer.json | 16 + .../assets/bloodmagic/books/architect.xml | 106 ++ .../assets/bloodmagic/gui/bookleft.png | Bin 0 -> 11940 bytes .../assets/bloodmagic/gui/jei/alchemy.png | Bin 0 -> 15723 bytes .../bloodmagic/gui/jei/alchemytable.png | Bin 0 -> 950 bytes .../assets/bloodmagic/gui/jei/altar.png | Bin 0 -> 2368 bytes .../assets/bloodmagic/gui/jei/binding.png | Bin 0 -> 868 bytes .../assets/bloodmagic/gui/jei/soulforge.png | Bin 0 -> 16429 bytes .../assets/bloodmagic/gui/sigilholding.png | Bin 0 -> 1227 bytes .../assets/bloodmagic/gui/teleposer.png | Bin 0 -> 1276 bytes .../assets/bloodmagic/gui/writingtable.png | Bin 0 -> 2567 bytes .../bloodmagic/loot_tables/bm_loot_table.json | 25 + .../models/armor/livingarmour_layer_1.png | Bin 0 -> 2308 bytes .../models/armor/livingarmour_layer_2.png | Bin 0 -> 1137 bytes .../models/armor/sacrificearmour_layer_1.png | Bin 0 -> 728 bytes .../armor/selfsacrificearmour_layer_1.png | Bin 0 -> 1324 bytes .../sentientarmour_corrosive_layer_1.png | Bin 0 -> 2499 bytes .../sentientarmour_corrosive_layer_2.png | Bin 0 -> 2063 bytes .../sentientarmour_destructive_layer_1.png | Bin 0 -> 2446 bytes .../sentientarmour_destructive_layer_2.png | Bin 0 -> 2071 bytes .../models/armor/sentientarmour_layer_1.png | Bin 0 -> 2392 bytes .../models/armor/sentientarmour_layer_2.png | Bin 0 -> 1824 bytes .../sentientarmour_steadfast_layer_1.png | Bin 0 -> 2441 bytes .../sentientarmour_steadfast_layer_2.png | Bin 0 -> 2069 bytes .../armor/sentientarmour_vengeful_layer_1.png | Bin 0 -> 2456 bytes .../armor/sentientarmour_vengeful_layer_2.png | Bin 0 -> 2069 bytes .../models/block/blockalchemyarray.json | 6 + .../bloodmagic/models/block/blockaltar.mtl | 11 + .../bloodmagic/models/block/blockaltar.obj | 391 +++++ .../bloodmagic/models/block/blockblank.json | 17 + .../models/block/blockbloodlight.json | 15 + .../models/block/blockbloodtank.json | 357 +++++ .../models/block/blockdemoncrucible.mtl | 11 + .../models/block/blockdemoncrucible.obj | 937 ++++++++++++ .../models/block/blockdemoncrystallizer.mtl | 11 + .../models/block/blockdemoncrystallizer.obj | 1359 +++++++++++++++++ .../models/block/blockdemonpylon.mtl | 11 + .../models/block/blockdemonpylon.obj | 1171 ++++++++++++++ .../models/block/blockdimensionalportal.json | 15 + .../block/blockdimensionalportalew.json | 15 + .../block/blockdimensionalportalns.json | 15 + .../models/block/blockhellfireforge.mtl | 11 + .../models/block/blockhellfireforge.obj | 899 +++++++++++ .../models/block/blockincensealtar.json | 7 + .../models/block/blockincensealtar.mtl | 11 + .../models/block/blockincensealtar.obj | 650 ++++++++ .../models/block/blockinputroutingnode.json | 7 + .../models/block/blockmasterroutingnode.json | 8 + .../models/block/blockoutputroutingnode.json | 7 + .../bloodmagic/models/block/blockphantom.json | 6 + .../models/block/blockpillarcapeast.json | 17 + .../models/block/blockpillarcapnorth.json | 17 + .../models/block/blockpillarcapsouth.json | 17 + .../models/block/blockpillarcapwest.json | 17 + .../bloodmagic/models/block/blockpillarx.json | 17 + .../bloodmagic/models/block/blockpillarz.json | 17 + .../models/block/blocksoulforge.json | 9 + .../models/block/blockspectral.json | 6 + .../models/block/crystal/crystal1.mtl | 11 + .../models/block/crystal/crystal1.obj | 30 + .../models/block/crystal/crystal2.mtl | 11 + .../models/block/crystal/crystal2.obj | 30 + .../models/block/crystal/crystal3.mtl | 11 + .../models/block/crystal/crystal3.obj | 30 + .../models/block/crystal/crystal4.mtl | 11 + .../models/block/crystal/crystal4.obj | 30 + .../models/block/crystal/crystal5.mtl | 11 + .../models/block/crystal/crystal5.obj | 30 + .../models/block/crystal/crystal6.mtl | 11 + .../models/block/crystal/crystal6.obj | 30 + .../models/block/crystal/crystal7.mtl | 11 + .../models/block/crystal/crystal7.obj | 30 + .../models/block/modelalchemytable.mtl | 11 + .../models/block/modelalchemytable.obj | 1257 +++++++++++++++ .../models/block/pillar_bottom.json | 184 +++ .../bloodmagic/models/block/pillar_mid.json | 294 ++++ .../bloodmagic/models/block/pillar_top.json | 184 +++ .../routing/modelmasterroutingnodebase.mtl | 11 + .../routing/modelmasterroutingnodebase.obj | 360 +++++ .../routing/modelmasterroutingnodecore.mtl | 11 + .../routing/modelmasterroutingnodecore.obj | 66 + .../block/routing/modelroutingnodebase.mtl | 11 + .../block/routing/modelroutingnodebase.obj | 444 ++++++ .../block/routing/modelroutingnodecore.mtl | 11 + .../block/routing/modelroutingnodecore.obj | 66 + .../block/routing/outputroutingnodecore.json | 20 + .../models/block/routing/routingnodebase.json | 33 + .../models/block/sub/blockaltar.mtl | 12 + .../models/block/sub/blockaltar.obj | 238 +++ .../models/block/sub/blocksoulforge.json | 160 ++ .../block/sub/blockspellmodifiercore.json | 19 + .../block/sub/blockspellmodifierinput.json | 176 +++ .../block/sub/blockspellmodifieroutput.json | 67 + .../bloodmagic/models/bloodaltar-fixeuv.obj | 262 ++++ .../assets/bloodmagic/models/bloodaltar.obj | 262 ++++ .../models/item/blockalchemyarray.json | 10 + .../models/item/blockbloodlight.json | 10 + .../models/item/blockdimensionalportal.json | 22 + .../models/item/blockpedestal0.json | 10 + .../models/item/blockpedestal1.json | 10 + .../bloodmagic/models/item/blockphantom.json | 10 + .../bloodmagic/models/item/blockspectral.json | 10 + .../item/bow/itemsentientbow_corrosive.json | 28 + .../itemsentientbow_corrosive_pulling_0.json | 28 + .../itemsentientbow_corrosive_pulling_1.json | 28 + .../itemsentientbow_corrosive_pulling_2.json | 29 + .../item/bow/itemsentientbow_destructive.json | 28 + ...itemsentientbow_destructive_pulling_0.json | 28 + ...itemsentientbow_destructive_pulling_1.json | 28 + ...itemsentientbow_destructive_pulling_2.json | 29 + .../item/bow/itemsentientbow_pulling_0.json | 28 + .../item/bow/itemsentientbow_pulling_1.json | 28 + .../item/bow/itemsentientbow_pulling_2.json | 28 + .../item/bow/itemsentientbow_steadfast.json | 28 + .../itemsentientbow_steadfast_pulling_0.json | 28 + .../itemsentientbow_steadfast_pulling_1.json | 28 + .../itemsentientbow_steadfast_pulling_2.json | 29 + .../item/bow/itemsentientbow_vengeful.json | 28 + .../itemsentientbow_vengeful_pulling_0.json | 28 + .../itemsentientbow_vengeful_pulling_1.json | 28 + .../itemsentientbow_vengeful_pulling_2.json | 29 + .../bloodmagic/models/item/itembloodorb.json | 6 + .../models/item/itembloodorbapprentice.json | 6 + .../models/item/itembloodorbarchmage.json | 6 + .../models/item/itembloodorbmagician.json | 6 + .../models/item/itembloodorbmaster.json | 6 + .../models/item/itembloodorbtranscendent.json | 6 + .../models/item/itembloodorbweak.json | 6 + .../bloodmagic/models/item/itemmodelbase.json | 3 + .../models/item/itemsentientarmourgem0.json | 11 + .../models/item/itemsentientarmourgem1.json | 12 + .../models/item/itemsentientbow.json | 169 ++ .../bloodmagic/models/item/itemtoolbase.json | 15 + .../bloodmagic/schematics/corridor1.json | 49 + .../bloodmagic/schematics/hallchest1.json | 41 + .../bloodmagic/schematics/rawbuilding1.json | 47 + .../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 .../textures/blocks/accelerationrune.png | Bin 0 -> 3579 bytes .../textures/blocks/airritualstone.png | Bin 0 -> 1621 bytes .../textures/blocks/altarcapacityrune.png | Bin 0 -> 1670 bytes .../textures/blocks/bettercapacityrune.png | Bin 0 -> 3510 bytes .../bloodmagic/textures/blocks/blankrune.png | Bin 0 -> 1524 bytes .../textures/blocks/bloodsocket.png | Bin 0 -> 1609 bytes .../textures/blocks/bloodstonebrick.png | Bin 0 -> 1488 bytes .../bloodmagic/textures/blocks/bloodtank.png | Bin 0 -> 911 bytes .../textures/blocks/chargingrune.png | Bin 0 -> 886 bytes .../textures/blocks/dislocationrune.png | Bin 0 -> 1640 bytes .../blocks/dungeon/dungeon_brick1.png | Bin 0 -> 928 bytes .../blocks/dungeon/dungeon_brick1_c.png | Bin 0 -> 902 bytes .../blocks/dungeon/dungeon_brick1_d.png | Bin 0 -> 899 bytes .../blocks/dungeon/dungeon_brick1_s.png | Bin 0 -> 876 bytes .../blocks/dungeon/dungeon_brick1_v.png | Bin 0 -> 902 bytes .../blocks/dungeon/dungeon_brick2.png | Bin 0 -> 798 bytes .../blocks/dungeon/dungeon_brick2_c.png | Bin 0 -> 762 bytes .../blocks/dungeon/dungeon_brick2_d.png | Bin 0 -> 760 bytes .../blocks/dungeon/dungeon_brick2_s.png | Bin 0 -> 734 bytes .../blocks/dungeon/dungeon_brick2_v.png | Bin 0 -> 761 bytes .../blocks/dungeon/dungeon_brick3.png | Bin 0 -> 808 bytes .../blocks/dungeon/dungeon_brick3_c.png | Bin 0 -> 765 bytes .../blocks/dungeon/dungeon_brick3_d.png | Bin 0 -> 758 bytes .../blocks/dungeon/dungeon_brick3_s.png | Bin 0 -> 743 bytes .../blocks/dungeon/dungeon_brick3_v.png | Bin 0 -> 759 bytes .../textures/blocks/dungeon/dungeon_eye.png | Bin 0 -> 1002 bytes .../textures/blocks/dungeon/dungeon_eye_c.png | Bin 0 -> 981 bytes .../textures/blocks/dungeon/dungeon_eye_d.png | Bin 0 -> 972 bytes .../textures/blocks/dungeon/dungeon_eye_s.png | Bin 0 -> 978 bytes .../textures/blocks/dungeon/dungeon_eye_v.png | Bin 0 -> 972 bytes .../textures/blocks/dungeon/dungeon_metal.png | Bin 0 -> 684 bytes .../blocks/dungeon/dungeon_metal_c.png | Bin 0 -> 699 bytes .../blocks/dungeon/dungeon_metal_d.png | Bin 0 -> 692 bytes .../blocks/dungeon/dungeon_metal_s.png | Bin 0 -> 738 bytes .../blocks/dungeon/dungeon_metal_v.png | Bin 0 -> 698 bytes .../blocks/dungeon/dungeon_pillar.png | Bin 0 -> 936 bytes .../blocks/dungeon/dungeon_pillar_c.png | Bin 0 -> 902 bytes .../blocks/dungeon/dungeon_pillar_d.png | Bin 0 -> 890 bytes .../blocks/dungeon/dungeon_pillar_s.png | Bin 0 -> 880 bytes .../blocks/dungeon/dungeon_pillar_v.png | Bin 0 -> 895 bytes .../blocks/dungeon/dungeon_pillarbottom.png | Bin 0 -> 960 bytes .../blocks/dungeon/dungeon_pillarbottom_c.png | Bin 0 -> 931 bytes .../blocks/dungeon/dungeon_pillarbottom_d.png | Bin 0 -> 927 bytes .../blocks/dungeon/dungeon_pillarbottom_s.png | Bin 0 -> 916 bytes .../blocks/dungeon/dungeon_pillarbottom_v.png | Bin 0 -> 932 bytes .../blocks/dungeon/dungeon_pillarheart.png | Bin 0 -> 961 bytes .../blocks/dungeon/dungeon_pillarheart_c.png | Bin 0 -> 919 bytes .../blocks/dungeon/dungeon_pillarheart_d.png | Bin 0 -> 906 bytes .../blocks/dungeon/dungeon_pillarheart_s.png | Bin 0 -> 900 bytes .../blocks/dungeon/dungeon_pillarheart_v.png | Bin 0 -> 924 bytes .../blocks/dungeon/dungeon_pillarspecial.png | Bin 0 -> 1007 bytes .../dungeon/dungeon_pillarspecial_c.png | Bin 0 -> 977 bytes .../dungeon/dungeon_pillarspecial_d.png | Bin 0 -> 980 bytes .../dungeon/dungeon_pillarspecial_s.png | Bin 0 -> 971 bytes .../dungeon/dungeon_pillarspecial_v.png | Bin 0 -> 957 bytes .../blocks/dungeon/dungeon_pillartop.png | Bin 0 -> 980 bytes .../blocks/dungeon/dungeon_pillartop_c.png | Bin 0 -> 948 bytes .../blocks/dungeon/dungeon_pillartop_d.png | Bin 0 -> 940 bytes .../blocks/dungeon/dungeon_pillartop_s.png | Bin 0 -> 932 bytes .../blocks/dungeon/dungeon_pillartop_v.png | Bin 0 -> 938 bytes .../blocks/dungeon/dungeon_polished.png | Bin 0 -> 789 bytes .../blocks/dungeon/dungeon_polished_c.png | Bin 0 -> 745 bytes .../blocks/dungeon/dungeon_polished_d.png | Bin 0 -> 734 bytes .../blocks/dungeon/dungeon_polished_s.png | Bin 0 -> 723 bytes .../blocks/dungeon/dungeon_polished_v.png | Bin 0 -> 737 bytes .../blocks/dungeon/dungeon_smallbrick.png | Bin 0 -> 995 bytes .../blocks/dungeon/dungeon_smallbrick_c.png | Bin 0 -> 958 bytes .../blocks/dungeon/dungeon_smallbrick_d.png | Bin 0 -> 962 bytes .../blocks/dungeon/dungeon_smallbrick_s.png | Bin 0 -> 951 bytes .../blocks/dungeon/dungeon_smallbrick_v.png | Bin 0 -> 958 bytes .../textures/blocks/dungeon/dungeon_stone.png | Bin 0 -> 772 bytes .../blocks/dungeon/dungeon_stone_c.png | Bin 0 -> 727 bytes .../blocks/dungeon/dungeon_stone_d.png | Bin 0 -> 719 bytes .../blocks/dungeon/dungeon_stone_s.png | Bin 0 -> 696 bytes .../blocks/dungeon/dungeon_stone_v.png | Bin 0 -> 726 bytes .../textures/blocks/dungeon/dungeon_tile.png | Bin 0 -> 956 bytes .../blocks/dungeon/dungeon_tile_c.png | Bin 0 -> 930 bytes .../blocks/dungeon/dungeon_tile_d.png | Bin 0 -> 929 bytes .../blocks/dungeon/dungeon_tile_s.png | Bin 0 -> 913 bytes .../blocks/dungeon/dungeon_tile_v.png | Bin 0 -> 926 bytes .../blocks/dungeon/dungeon_tilespecial.png | Bin 0 -> 1005 bytes .../blocks/dungeon/dungeon_tilespecial_c.png | Bin 0 -> 973 bytes .../blocks/dungeon/dungeon_tilespecial_d.png | Bin 0 -> 990 bytes .../blocks/dungeon/dungeon_tilespecial_s.png | Bin 0 -> 970 bytes .../blocks/dungeon/dungeon_tilespecial_v.png | Bin 0 -> 973 bytes .../textures/blocks/duskritualstone.png | Bin 0 -> 1623 bytes .../textures/blocks/earthritualstone.png | Bin 0 -> 1626 bytes .../textures/blocks/efficiencyrune.png | Bin 0 -> 1621 bytes .../bloodmagic/textures/blocks/empty.png | Bin 0 -> 143 bytes .../textures/blocks/emptysocket.png | Bin 0 -> 1560 bytes .../textures/blocks/etherealopaquemimic.png | Bin 0 -> 972 bytes .../textures/blocks/fireritualstone.png | Bin 0 -> 1627 bytes .../textures/blocks/imperfectritualstone.png | Bin 0 -> 1598 bytes .../textures/blocks/largebloodstonebrick.png | Bin 0 -> 598 bytes .../textures/blocks/lifeessenceflowing.png | Bin 0 -> 7107 bytes .../blocks/lifeessenceflowing.png.mcmeta | 5 + .../textures/blocks/lifeessencestill.png | Bin 0 -> 7568 bytes .../blocks/lifeessencestill.png.mcmeta | 45 + .../textures/blocks/lightritualstone.png | Bin 0 -> 878 bytes .../textures/blocks/masterritualstone.png | Bin 0 -> 1529 bytes .../textures/blocks/obsidianbrickpath.png | Bin 0 -> 16086 bytes .../textures/blocks/obsidiantilepath.png | Bin 0 -> 15805 bytes .../textures/blocks/orbcapacityrune.png | Bin 0 -> 1621 bytes .../textures/blocks/phantomblock.png | Bin 0 -> 1700 bytes .../textures/blocks/ritualstone.png | Bin 0 -> 1502 bytes .../textures/blocks/runeofsacrifice.png | Bin 0 -> 1614 bytes .../textures/blocks/runeofselfsacrifice.png | Bin 0 -> 1682 bytes .../textures/blocks/sentientmimic.png | Bin 0 -> 901 bytes .../textures/blocks/shardcluster.png | Bin 0 -> 891 bytes .../textures/blocks/shardclusterbrick.png | Bin 0 -> 809 bytes .../textures/blocks/simpletranscircle.png | Bin 0 -> 4254 bytes .../textures/blocks/solidclearmimic.png | Bin 0 -> 969 bytes .../textures/blocks/solidlightmimic.png | Bin 0 -> 964 bytes .../textures/blocks/solidopaquemimic.png | Bin 0 -> 961 bytes .../bloodmagic/textures/blocks/soulforge.png | Bin 0 -> 1686 bytes .../textures/blocks/spectralblock.png | Bin 0 -> 15123 bytes .../bloodmagic/textures/blocks/speedrune.png | Bin 0 -> 1693 bytes .../textures/blocks/stonebrickpath.png | Bin 0 -> 16221 bytes .../textures/blocks/stonetilepath.png | Bin 0 -> 15846 bytes .../textures/blocks/teleposer_side.png | Bin 0 -> 1711 bytes .../textures/blocks/teleposer_top.png | Bin 0 -> 1703 bytes .../textures/blocks/waterritualstone.png | Bin 0 -> 1629 bytes .../textures/blocks/woodbrickpath.png | Bin 0 -> 17848 bytes .../textures/blocks/woodtilepath.png | Bin 0 -> 17780 bytes .../textures/blocks/wornstonebrickpath.png | Bin 0 -> 16299 bytes .../textures/blocks/wornstonetilepath.png | Bin 0 -> 15950 bytes .../textures/entities/bloodelytra.png | Bin 0 -> 3225 bytes .../textures/entities/defaultcrystallayer.png | Bin 0 -> 7231 bytes .../entities/energyblastprojectile.png | Bin 0 -> 623 bytes .../textures/entities/explosionprojectile.png | Bin 0 -> 1463 bytes .../textures/entities/fireprojectile.png | Bin 0 -> 1395 bytes .../textures/entities/holyprojectile.png | Bin 0 -> 1349 bytes .../textures/entities/iceprojectile.png | Bin 0 -> 1189 bytes .../textures/entities/lightningprojectile.png | Bin 0 -> 1210 bytes .../textures/entities/mudprojectile.png | Bin 0 -> 1454 bytes .../bloodmagic/textures/entities/nodebeam.png | Bin 0 -> 260 bytes .../textures/entities/overlay/overlay_raw.png | Bin 0 -> 5132 bytes .../textures/entities/soularrow.png | Bin 0 -> 772 bytes .../textures/entities/soularrow_corrosive.png | Bin 0 -> 783 bytes .../entities/soularrow_destructive.png | Bin 0 -> 771 bytes .../textures/entities/soularrow_steadfast.png | Bin 0 -> 783 bytes .../textures/entities/soularrow_vengeful.png | Bin 0 -> 782 bytes .../bloodmagic/textures/entities/specter.png | Bin 0 -> 213 bytes .../textures/entities/waterprojectile.png | Bin 0 -> 1423 bytes .../textures/entities/windgustprojectile.png | Bin 0 -> 1486 bytes .../textures/entities/zombie_raw.png | Bin 0 -> 7587 bytes .../bloodmagic/textures/gui/alchemytable.png | Bin 0 -> 3428 bytes .../bloodmagic/textures/gui/bookcrafting.png | Bin 0 -> 3756 bytes .../bloodmagic/textures/gui/bookfurnace.png | Bin 0 -> 1664 bytes .../bloodmagic/textures/gui/bookleft.png | Bin 0 -> 11940 bytes .../bloodmagic/textures/gui/bookright.png | Bin 0 -> 8536 bytes .../textures/gui/buttons_compat.png | Bin 0 -> 18994 bytes .../bloodmagic/textures/gui/crucible.png | Bin 0 -> 1235 bytes .../bloodmagic/textures/gui/guitrap.png | Bin 0 -> 3677 bytes .../textures/gui/masterroutingnode.png | Bin 0 -> 94211 bytes .../bloodmagic/textures/gui/routingnode.png | Bin 0 -> 1818 bytes .../bloodmagic/textures/gui/soulforge.png | Bin 0 -> 25888 bytes .../bloodmagic/textures/gui/teleposer.png | Bin 0 -> 1464 bytes .../gui/thaumcraft/gui_research_back.jpg | Bin 0 -> 73272 bytes .../gui/thaumcraft/gui_research_back_over.png | 0 .../bloodmagic/textures/gui/widgets.png | Bin 0 -> 22017 bytes .../assets/bloodmagic/textures/hud/bars.png | Bin 0 -> 6558 bytes .../items/activationcrystalawakened.png | Bin 0 -> 15410 bytes .../items/activationcrystalcreative.png | Bin 0 -> 15021 bytes .../textures/items/activationcrystalweak.png | Bin 0 -> 15408 bytes .../textures/items/airscribetool.png | Bin 0 -> 15377 bytes .../bloodmagic/textures/items/airsigil.png | Bin 0 -> 1575 bytes .../bloodmagic/textures/items/altarmaker.png | Bin 0 -> 666 bytes .../textures/items/ampouleempty.png | Bin 0 -> 288 bytes .../bloodmagic/textures/items/ampoulefull.png | Bin 0 -> 316 bytes .../bloodmagic/textures/items/antiseptic.png | Bin 0 -> 362 bytes .../textures/items/apprenticebloodorb.png | Bin 0 -> 1237 bytes .../bloodmagic/textures/items/arcaneashes.png | Bin 0 -> 550 bytes .../textures/items/archmagebloodorb.png | Bin 0 -> 1095 bytes .../textures/items/basemonstersoul.png | Bin 0 -> 939 bytes .../items/basemonstersoul_corrosive.png | Bin 0 -> 932 bytes .../items/basemonstersoul_destructive.png | Bin 0 -> 938 bytes .../items/basemonstersoul_steadfast.png | Bin 0 -> 931 bytes .../items/basemonstersoul_vengeful.png | Bin 0 -> 938 bytes .../textures/items/basiccuttingfluid.png | Bin 0 -> 359 bytes .../textures/items/blackpudding.png | Bin 0 -> 669 bytes .../bloodmagic/textures/items/blanksigil.png | Bin 0 -> 661 bytes .../bloodmagic/textures/items/blankslate.png | Bin 0 -> 671 bytes .../textures/items/bloodlightsigil.png | Bin 0 -> 1592 bytes .../bloodmagic/textures/items/bloodpack.png | Bin 0 -> 446 bytes .../textures/items/bouncesigil_activated.png | Bin 0 -> 717 bytes .../items/bouncesigil_deactivated.png | Bin 0 -> 695 bytes .../textures/items/boundaxe_activated.png | Bin 0 -> 522 bytes .../textures/items/boundpickaxe_activated.png | Bin 0 -> 1484 bytes .../textures/items/boundshovel_activated.png | Bin 0 -> 1478 bytes .../textures/items/boundsword_activated.png | Bin 0 -> 1541 bytes .../bloodmagic/textures/items/boundtool.png | Bin 0 -> 1434 bytes .../textures/items/bridgesigil_activated.png | Bin 0 -> 1585 bytes .../items/bridgesigil_deactivated.png | Bin 0 -> 1593 bytes .../textures/items/ceremonialdagger.png | Bin 0 -> 531 bytes .../textures/items/clawsigil_activated.png | Bin 0 -> 676 bytes .../textures/items/clawsigil_deactivated.png | Bin 0 -> 685 bytes .../bloodmagic/textures/items/coagulant.png | Bin 0 -> 362 bytes .../bloodmagic/textures/items/coalsand.png | Bin 0 -> 454 bytes .../textures/items/componentframeparts.png | Bin 0 -> 667 bytes .../items/compressionsigil_activated.png | Bin 0 -> 747 bytes .../items/compressionsigil_deactivated.png | Bin 0 -> 724 bytes .../textures/items/corrosivecrystal.png | Bin 0 -> 921 bytes .../textures/items/crucibleupgrade.png | Bin 0 -> 649 bytes .../textures/items/daggerofsacrifice.png | Bin 0 -> 523 bytes .../textures/items/dawnscribetool.png | Bin 0 -> 15022 bytes .../textures/items/defaultcrystal.png | Bin 0 -> 917 bytes .../textures/items/demonbloodshard.png | Bin 0 -> 698 bytes .../textures/items/demonicteleposerfocus.png | Bin 0 -> 976 bytes .../bloodmagic/textures/items/demonslate.png | Bin 0 -> 671 bytes .../textures/items/demonwillgauge.png | Bin 0 -> 811 bytes .../textures/items/destructivecrystal.png | Bin 0 -> 933 bytes .../textures/items/divinationsigil.png | Bin 0 -> 1583 bytes .../textures/items/duskscribetool.png | Bin 0 -> 15430 bytes .../textures/items/earthscribetool.png | Bin 0 -> 15411 bytes .../items/elementalsigil_activated.png | Bin 0 -> 710 bytes .../items/elementalsigil_deactivated.png | Bin 0 -> 697 bytes .../textures/items/enhancedteleposerfocus.png | Bin 0 -> 765 bytes .../textures/items/etherealslate.png | Bin 0 -> 725 bytes .../textures/items/experiencebook.png | Bin 0 -> 676 bytes .../textures/items/explosivepowder.png | Bin 0 -> 469 bytes .../textures/items/firescribetool.png | Bin 0 -> 15837 bytes .../bloodmagic/textures/items/goldsand.png | Bin 0 -> 499 bytes .../textures/items/growthsigil_activated.png | Bin 0 -> 1581 bytes .../items/growthsigil_deactivated.png | Bin 0 -> 1566 bytes .../items/harvestgoddesssigil_activated.png | Bin 0 -> 755 bytes .../items/harvestgoddesssigil_deactivated.png | Bin 0 -> 740 bytes .../textures/items/hastesigil_activated.png | Bin 0 -> 1581 bytes .../textures/items/hastesigil_deactivated.png | Bin 0 -> 1578 bytes .../textures/items/icesigil_activated.png | Bin 0 -> 1584 bytes .../textures/items/icesigil_deactivated.png | Bin 0 -> 1587 bytes .../bloodmagic/textures/items/information.png | Bin 0 -> 648 bytes .../textures/items/infusedslate.png | Bin 0 -> 674 bytes .../textures/items/inputroutingfocus.png | Bin 0 -> 700 bytes .../bloodmagic/textures/items/ironsand.png | Bin 0 -> 509 bytes .../textures/items/item_deactivated.png | Bin 0 -> 1373 bytes .../textures/items/itemrouterfilterexact.png | Bin 0 -> 678 bytes .../items/itemrouterfilterignorenbt.png | Bin 0 -> 682 bytes .../items/itemrouterfiltermoditems.png | Bin 0 -> 681 bytes .../items/itemrouterfilteroredict.png | Bin 0 -> 681 bytes .../bloodmagic/textures/items/lavacrystal.png | Bin 0 -> 1350 bytes .../bloodmagic/textures/items/lavasigil.png | Bin 0 -> 1589 bytes .../bloodmagic/textures/items/lifebucket.png | Bin 0 -> 1369 bytes .../bloodmagic/textures/items/livingboots.png | Bin 0 -> 584 bytes .../textures/items/livinghelmet.png | Bin 0 -> 436 bytes .../textures/items/livingleggings.png | Bin 0 -> 419 bytes .../bloodmagic/textures/items/livingplate.png | Bin 0 -> 473 bytes .../textures/items/magicianbloodorb.png | Bin 0 -> 1234 bytes .../bloodmagic/textures/items/mailorder.png | Bin 0 -> 853 bytes .../textures/items/masterbloodorb.png | Bin 0 -> 1008 bytes .../textures/items/miningsigil_activated.png | Bin 0 -> 1574 bytes .../items/miningsigil_deactivated.png | Bin 0 -> 1565 bytes .../items/mundanelengtheningcatalyst.png | Bin 0 -> 336 bytes .../textures/items/mundanepowercatalyst.png | Bin 0 -> 342 bytes .../bloodmagic/textures/items/neurotoxin.png | Bin 0 -> 360 bytes .../bloodmagic/textures/items/noderouter.png | Bin 0 -> 492 bytes .../bloodmagic/textures/items/plantfibres.png | Bin 0 -> 781 bytes .../bloodmagic/textures/items/plantoil.png | Bin 0 -> 364 bytes .../textures/items/potionflask_outline.png | Bin 0 -> 457 bytes .../textures/items/potionflask_overlay.png | Bin 0 -> 179 bytes .../textures/items/potionflask_underlay.png | Bin 0 -> 460 bytes .../textures/items/reagentaffinity.png | Bin 0 -> 574 bytes .../bloodmagic/textures/items/reagentair.png | Bin 0 -> 3622 bytes .../textures/items/reagentbinding.png | Bin 0 -> 837 bytes .../textures/items/reagentbloodlight.png | Bin 0 -> 506 bytes .../textures/items/reagentbounce.png | Bin 0 -> 497 bytes .../textures/items/reagentbridge.png | Bin 0 -> 483 bytes .../bloodmagic/textures/items/reagentclaw.png | Bin 0 -> 628 bytes .../textures/items/reagentcompression.png | Bin 0 -> 528 bytes .../textures/items/reagentfastminer.png | Bin 0 -> 595 bytes .../textures/items/reagentfrost.png | Bin 0 -> 3622 bytes .../textures/items/reagentgrowth.png | Bin 0 -> 579 bytes .../textures/items/reagenthaste.png | Bin 0 -> 520 bytes .../textures/items/reagentholding.png | Bin 0 -> 520 bytes .../bloodmagic/textures/items/reagentlava.png | Bin 0 -> 562 bytes .../textures/items/reagentmagnetism.png | Bin 0 -> 497 bytes .../textures/items/reagentseverance.png | Bin 0 -> 526 bytes .../textures/items/reagentsight.png | Bin 0 -> 602 bytes .../textures/items/reagentsuppression.png | Bin 0 -> 543 bytes .../textures/items/reagentteleposition.png | Bin 0 -> 468 bytes .../textures/items/reagenttransposition.png | Bin 0 -> 397 bytes .../bloodmagic/textures/items/reagentvoid.png | Bin 0 -> 607 bytes .../textures/items/reagentwater.png | Bin 0 -> 628 bytes .../bloodmagic/textures/items/reagentwind.png | Bin 0 -> 504 bytes .../textures/items/reinforcedslate.png | Bin 0 -> 673 bytes .../items/reinforcedteleposerfocus.png | Bin 0 -> 868 bytes .../textures/items/ritual_dismantler.png | Bin 0 -> 693 bytes .../textures/items/ritualdiviner.png | Bin 0 -> 1366 bytes .../textures/items/ritualtinkerer.png | Bin 0 -> 505 bytes .../textures/items/sacrificeplate.png | Bin 0 -> 537 bytes .../textures/items/sacrificialdagger.png | Bin 0 -> 1442 bytes .../bloodmagic/textures/items/saltpeter.png | Bin 0 -> 414 bytes .../textures/items/sanguinebook.png | Bin 0 -> 695 bytes .../bloodmagic/textures/items/seersigil.png | Bin 0 -> 693 bytes .../textures/items/selfsacrificeplate.png | Bin 0 -> 512 bytes .../items/sentientarmourgem_activated.png | Bin 0 -> 921 bytes .../sentientarmourgem_corrosive_activated.png | Bin 0 -> 951 bytes ...entientarmourgem_corrosive_deactivated.png | Bin 0 -> 857 bytes .../items/sentientarmourgem_deactivated.png | Bin 0 -> 851 bytes ...entientarmourgem_destructive_activated.png | Bin 0 -> 968 bytes ...tientarmourgem_destructive_deactivated.png | Bin 0 -> 864 bytes .../sentientarmourgem_steadfast_activated.png | Bin 0 -> 957 bytes ...entientarmourgem_steadfast_deactivated.png | Bin 0 -> 859 bytes .../sentientarmourgem_vengeful_activated.png | Bin 0 -> 971 bytes ...sentientarmourgem_vengeful_deactivated.png | Bin 0 -> 860 bytes .../textures/items/sentientarrow.png | Bin 0 -> 437 bytes .../textures/items/sentientboots.png | Bin 0 -> 699 bytes .../items/sentientboots_corrosive.png | Bin 0 -> 700 bytes .../items/sentientboots_destructive.png | Bin 0 -> 691 bytes .../items/sentientboots_steadfast.png | Bin 0 -> 697 bytes .../textures/items/sentientboots_vengeful.png | Bin 0 -> 696 bytes .../bloodmagic/textures/items/sentientbow.png | Bin 0 -> 769 bytes .../textures/items/sentientbow_corrosive.png | Bin 0 -> 779 bytes .../items/sentientbow_corrosive_pulling_0.png | Bin 0 -> 611 bytes .../items/sentientbow_corrosive_pulling_1.png | Bin 0 -> 871 bytes .../items/sentientbow_corrosive_pulling_2.png | Bin 0 -> 838 bytes .../items/sentientbow_destructive.png | Bin 0 -> 785 bytes .../sentientbow_destructive_pulling_0.png | Bin 0 -> 596 bytes .../sentientbow_destructive_pulling_1.png | Bin 0 -> 864 bytes .../sentientbow_destructive_pulling_2.png | Bin 0 -> 825 bytes .../textures/items/sentientbow_pulling_0.png | Bin 0 -> 606 bytes .../textures/items/sentientbow_pulling_1.png | Bin 0 -> 846 bytes .../textures/items/sentientbow_pulling_2.png | Bin 0 -> 821 bytes .../textures/items/sentientbow_steadfast.png | Bin 0 -> 780 bytes .../items/sentientbow_steadfast_pulling_0.png | Bin 0 -> 620 bytes .../items/sentientbow_steadfast_pulling_1.png | Bin 0 -> 872 bytes .../items/sentientbow_steadfast_pulling_2.png | Bin 0 -> 822 bytes .../textures/items/sentientbow_vengeful.png | Bin 0 -> 778 bytes .../items/sentientbow_vengeful_pulling_0.png | Bin 0 -> 620 bytes .../items/sentientbow_vengeful_pulling_1.png | Bin 0 -> 876 bytes .../items/sentientbow_vengeful_pulling_2.png | Bin 0 -> 834 bytes .../textures/items/sentienthelmet.png | Bin 0 -> 474 bytes .../items/sentienthelmet_corrosive.png | Bin 0 -> 464 bytes .../items/sentienthelmet_destructive.png | Bin 0 -> 464 bytes .../items/sentienthelmet_steadfast.png | Bin 0 -> 562 bytes .../items/sentienthelmet_vengeful.png | Bin 0 -> 466 bytes .../textures/items/sentientleggings.png | Bin 0 -> 522 bytes .../items/sentientleggings_corrosive.png | Bin 0 -> 536 bytes .../items/sentientleggings_destructive.png | Bin 0 -> 533 bytes .../items/sentientleggings_steadfast.png | Bin 0 -> 533 bytes .../items/sentientleggings_vengeful.png | Bin 0 -> 523 bytes .../textures/items/sentientplate.png | Bin 0 -> 735 bytes .../items/sentientplate_corrosive.png | Bin 0 -> 735 bytes .../items/sentientplate_destructive.png | Bin 0 -> 732 bytes .../items/sentientplate_steadfast.png | Bin 0 -> 737 bytes .../textures/items/sentientplate_vengeful.png | Bin 0 -> 735 bytes .../bloodmagic/textures/items/set_area.png | Bin 0 -> 505 bytes .../textures/items/set_will_types.png | Bin 0 -> 593 bytes .../textures/items/sheatheditem.png | Bin 0 -> 1373 bytes .../textures/items/sigilofholding.png | Bin 0 -> 1605 bytes .../items/sigilofmagnetism_activated.png | Bin 0 -> 692 bytes .../items/sigilofmagnetism_deactivated.png | Bin 0 -> 691 bytes .../items/sigilofseverance_activated.png | Bin 0 -> 1599 bytes .../items/sigilofseverance_deactivated.png | Bin 0 -> 1590 bytes .../items/sigilofsuppression_activated.png | Bin 0 -> 1605 bytes .../items/sigilofsuppression_deactivated.png | Bin 0 -> 1573 bytes .../textures/items/sigiloverlay.png | Bin 0 -> 18111 bytes .../bloodmagic/textures/items/soulaxe.png | Bin 0 -> 935 bytes .../textures/items/soulaxe_corrosive.png | Bin 0 -> 937 bytes .../textures/items/soulaxe_destructive.png | Bin 0 -> 945 bytes .../textures/items/soulaxe_steadfast.png | Bin 0 -> 928 bytes .../textures/items/soulaxe_vengeful.png | Bin 0 -> 929 bytes .../textures/items/soulgemcommon.png | Bin 0 -> 717 bytes .../items/soulgemcommon_corrosive.png | Bin 0 -> 725 bytes .../items/soulgemcommon_destructive.png | Bin 0 -> 728 bytes .../items/soulgemcommon_steadfast.png | Bin 0 -> 722 bytes .../textures/items/soulgemcommon_vengeful.png | Bin 0 -> 726 bytes .../textures/items/soulgemgrand.png | Bin 0 -> 757 bytes .../textures/items/soulgemgrand_corrosive.png | Bin 0 -> 757 bytes .../items/soulgemgrand_destructive.png | Bin 0 -> 761 bytes .../textures/items/soulgemgrand_steadfast.png | Bin 0 -> 754 bytes .../textures/items/soulgemgrand_vengeful.png | Bin 0 -> 767 bytes .../textures/items/soulgemgreater.png | Bin 0 -> 721 bytes .../items/soulgemgreater_corrosive.png | Bin 0 -> 725 bytes .../items/soulgemgreater_destructive.png | Bin 0 -> 730 bytes .../items/soulgemgreater_steadfast.png | Bin 0 -> 723 bytes .../items/soulgemgreater_vengeful.png | Bin 0 -> 727 bytes .../textures/items/soulgemlesser.png | Bin 0 -> 719 bytes .../items/soulgemlesser_corrosive.png | Bin 0 -> 726 bytes .../items/soulgemlesser_destructive.png | Bin 0 -> 727 bytes .../items/soulgemlesser_steadfast.png | Bin 0 -> 725 bytes .../textures/items/soulgemlesser_vengeful.png | Bin 0 -> 723 bytes .../textures/items/soulgempetty.png | Bin 0 -> 706 bytes .../textures/items/soulgempetty_corrosive.png | Bin 0 -> 710 bytes .../items/soulgempetty_destructive.png | Bin 0 -> 708 bytes .../textures/items/soulgempetty_steadfast.png | Bin 0 -> 708 bytes .../textures/items/soulgempetty_vengeful.png | Bin 0 -> 707 bytes .../bloodmagic/textures/items/soulpickaxe.png | Bin 0 -> 923 bytes .../textures/items/soulpickaxe_corrosive.png | Bin 0 -> 940 bytes .../items/soulpickaxe_destructive.png | Bin 0 -> 941 bytes .../textures/items/soulpickaxe_steadfast.png | Bin 0 -> 933 bytes .../textures/items/soulpickaxe_vengeful.png | Bin 0 -> 939 bytes .../bloodmagic/textures/items/soulshovel.png | Bin 0 -> 936 bytes .../textures/items/soulshovel_corrosive.png | Bin 0 -> 945 bytes .../textures/items/soulshovel_destructive.png | Bin 0 -> 938 bytes .../textures/items/soulshovel_steadfast.png | Bin 0 -> 929 bytes .../textures/items/soulshovel_vengeful.png | Bin 0 -> 940 bytes .../bloodmagic/textures/items/soulsnare.png | Bin 0 -> 498 bytes .../textures/items/soulsnare_corrosive.png | Bin 0 -> 499 bytes .../textures/items/soulsnare_destructive.png | Bin 0 -> 499 bytes .../textures/items/soulsnare_steadfast.png | Bin 0 -> 497 bytes .../textures/items/soulsnare_vengeful.png | Bin 0 -> 496 bytes .../textures/items/soulsword_activated.png | Bin 0 -> 15261 bytes .../items/soulsword_corrosive_activated.png | Bin 0 -> 873 bytes .../items/soulsword_corrosive_deactivated.png | Bin 0 -> 862 bytes .../textures/items/soulsword_deactivated.png | Bin 0 -> 15220 bytes .../items/soulsword_destructive_activated.png | Bin 0 -> 866 bytes .../soulsword_destructive_deactivated.png | Bin 0 -> 847 bytes .../items/soulsword_steadfast_activated.png | Bin 0 -> 873 bytes .../items/soulsword_steadfast_deactivated.png | Bin 0 -> 867 bytes .../items/soulsword_vengeful_activated.png | Bin 0 -> 876 bytes .../items/soulsword_vengeful_deactivated.png | Bin 0 -> 866 bytes .../textures/items/steadfastcrystal.png | Bin 0 -> 557 bytes .../bloodmagic/textures/items/sulfur.png | Bin 0 -> 459 bytes .../textures/items/teleposerfocus.png | Bin 0 -> 688 bytes .../textures/items/telepositionsigil.png | Bin 0 -> 747 bytes .../textures/items/transcendentbloodorb.png | Bin 0 -> 1239 bytes .../textures/items/transpositionsigil.png | Bin 0 -> 738 bytes .../bloodmagic/textures/items/upgradetome.png | Bin 0 -> 853 bytes .../textures/items/upgradetrainer.png | Bin 0 -> 690 bytes .../textures/items/vengefulcrystal.png | Bin 0 -> 571 bytes .../bloodmagic/textures/items/voidsigil.png | Bin 0 -> 698 bytes .../textures/items/warriorsigil_activated.png | Bin 0 -> 1583 bytes .../items/warriorsigil_deactivated.png | Bin 0 -> 1580 bytes .../textures/items/waterscribetool.png | Bin 0 -> 15388 bytes .../bloodmagic/textures/items/watersigil.png | Bin 0 -> 1585 bytes .../textures/items/weakbloodorb.png | Bin 0 -> 1220 bytes .../textures/items/weakbloodshard.png | Bin 0 -> 541 bytes .../textures/items/windsigil_activated.png | Bin 0 -> 1599 bytes .../textures/items/windsigil_deactivated.png | Bin 0 -> 1574 bytes .../assets/bloodmagic/textures/misc/beam2.png | Bin 0 -> 487 bytes .../bloodmagic/textures/misc/potions.png | Bin 0 -> 1577 bytes .../textures/misc/screenshots/altars/t1.png | Bin 0 -> 21644 bytes .../textures/misc/screenshots/altars/t2.png | Bin 0 -> 37659 bytes .../textures/misc/screenshots/altars/t3.png | Bin 0 -> 48658 bytes .../textures/misc/screenshots/altars/t4.png | Bin 0 -> 49884 bytes .../textures/misc/screenshots/altars/t5.png | Bin 0 -> 63113 bytes .../textures/misc/screenshots/altars/t6.png | Bin 0 -> 72385 bytes .../misc/screenshots/demons/ring1.png | Bin 0 -> 21567 bytes .../misc/screenshots/demons/ring2.png | Bin 0 -> 41249 bytes .../misc/screenshots/rituals/alchemy.png | Bin 0 -> 48584 bytes .../misc/screenshots/rituals/animalgrowth.png | Bin 0 -> 38609 bytes .../misc/screenshots/rituals/beatinganvil.png | Bin 0 -> 57210 bytes .../misc/screenshots/rituals/binding.png | Bin 0 -> 91100 bytes .../misc/screenshots/rituals/containment.png | Bin 0 -> 38720 bytes .../misc/screenshots/rituals/convocation.png | Bin 0 -> 99654 bytes .../misc/screenshots/rituals/crusher.png | Bin 0 -> 78450 bytes .../misc/screenshots/rituals/dome.png | Bin 0 -> 44876 bytes .../misc/screenshots/rituals/ellipsoid.png | Bin 0 -> 89596 bytes .../misc/screenshots/rituals/eternalsoul.png | Bin 0 -> 82170 bytes .../misc/screenshots/rituals/evaporation.png | Bin 0 -> 70654 bytes .../misc/screenshots/rituals/expulsion.png | Bin 0 -> 41196 bytes .../screenshots/rituals/featheredearth.png | Bin 0 -> 85440 bytes .../screenshots/rituals/featheredknife.png | Bin 0 -> 57026 bytes .../misc/screenshots/rituals/flight.png | Bin 0 -> 74223 bytes .../misc/screenshots/rituals/gaia.png | Bin 0 -> 73058 bytes .../misc/screenshots/rituals/greengrove.png | Bin 0 -> 38966 bytes .../misc/screenshots/rituals/harvest.png | Bin 0 -> 73476 bytes .../misc/screenshots/rituals/interdiction.png | Bin 0 -> 37754 bytes .../misc/screenshots/rituals/jump.png | Bin 0 -> 60507 bytes .../misc/screenshots/rituals/lava.png | Bin 0 -> 33923 bytes .../misc/screenshots/rituals/magnetism.png | Bin 0 -> 74168 bytes .../misc/screenshots/rituals/meteor.png | Bin 0 -> 72137 bytes .../misc/screenshots/rituals/phantomhands.png | Bin 0 -> 90184 bytes .../misc/screenshots/rituals/regeneration.png | Bin 0 -> 68184 bytes .../screenshots/rituals/sacrosanctity.png | Bin 0 -> 85523 bytes .../misc/screenshots/rituals/speed.png | Bin 0 -> 46938 bytes .../screenshots/rituals/stallingomega.png | Bin 0 -> 96404 bytes .../misc/screenshots/rituals/stomach.png | Bin 0 -> 76910 bytes .../screenshots/rituals/symmetryomega.png | Bin 0 -> 22586 bytes .../misc/screenshots/rituals/unbinding.png | Bin 0 -> 85056 bytes .../misc/screenshots/rituals/veilofevil.png | Bin 0 -> 79972 bytes .../misc/screenshots/rituals/water.png | Bin 0 -> 32267 bytes .../screenshots/rituals/wellofsuffering.png | Bin 0 -> 93294 bytes .../misc/screenshots/rituals/zephyr.png | Bin 0 -> 60404 bytes .../misc/screenshots/spells/conduit.png | Bin 0 -> 41574 bytes .../misc/screenshots/spells/effect.png | Bin 0 -> 24790 bytes .../misc/screenshots/spells/enhancement.png | Bin 0 -> 30271 bytes .../misc/screenshots/spells/modifier.png | Bin 0 -> 24647 bytes .../misc/screenshots/spells/paradigm.png | Bin 0 -> 23796 bytes .../screenshots/spells/simplespelltable.png | Bin 0 -> 33963 bytes .../models/alchemyarrays/airsigil.png | Bin 0 -> 36077 bytes .../models/alchemyarrays/basearray.png | Bin 0 -> 20705 bytes .../models/alchemyarrays/bindingarray.png | Bin 0 -> 43181 bytes .../alchemyarrays/bindinglightningarray.png | Bin 0 -> 43258 bytes .../models/alchemyarrays/bouncearray.png | Bin 0 -> 35950 bytes .../models/alchemyarrays/divinationsigil.png | Bin 0 -> 33324 bytes .../alchemyarrays/elementalaffinitysigil.png | Bin 0 -> 36992 bytes .../models/alchemyarrays/fastminersigil.png | Bin 0 -> 30009 bytes .../models/alchemyarrays/growthsigil.png | Bin 0 -> 33209 bytes .../models/alchemyarrays/hastesigil.png | Bin 0 -> 38571 bytes .../models/alchemyarrays/lavasigil.png | Bin 0 -> 28707 bytes .../models/alchemyarrays/lightsigil.png | Bin 0 -> 41435 bytes .../models/alchemyarrays/magnetismsigil.png | Bin 0 -> 36653 bytes .../models/alchemyarrays/movementarray.png | Bin 0 -> 46869 bytes .../models/alchemyarrays/sightsigil.png | Bin 0 -> 43552 bytes .../models/alchemyarrays/skeletonturret1.png | Bin 0 -> 33675 bytes .../models/alchemyarrays/skeletonturret2.png | Bin 0 -> 30611 bytes .../models/alchemyarrays/stupidarray.png | Bin 0 -> 905 bytes .../models/alchemyarrays/suppressionsigil.png | Bin 0 -> 42298 bytes .../alchemyarrays/teleportationarray.png | Bin 0 -> 50896 bytes .../models/alchemyarrays/updraftarray.png | Bin 0 -> 43778 bytes .../models/alchemyarrays/voidsigil.png | Bin 0 -> 24185 bytes .../models/alchemyarrays/watersigil.png | Bin 0 -> 29093 bytes .../models/alchemyarrays/wiparray.png | Bin 0 -> 16402 bytes .../models/alchemyarrays/zombiebeacon.png | Bin 0 -> 40967 bytes .../textures/models/alchemytable.png | Bin 0 -> 10109 bytes .../bloodmagic/textures/models/altar.png | Bin 0 -> 5709 bytes .../textures/models/corrosivecrystal.png | Bin 0 -> 748 bytes .../textures/models/defaultcrystal.png | Bin 0 -> 740 bytes .../textures/models/demoncrucible.png | Bin 0 -> 5682 bytes .../textures/models/demoncrystallizer.png | Bin 0 -> 3406 bytes .../bloodmagic/textures/models/demonpylon.png | Bin 0 -> 5671 bytes .../textures/models/destructivecrystal.png | Bin 0 -> 748 bytes .../models/energybazookamainprojectile.png | Bin 0 -> 2154 bytes .../textures/models/hellfireforge.png | Bin 0 -> 3581 bytes .../textures/models/incensealtar.png | Bin 0 -> 6835 bytes .../bloodmagic/textures/models/meteor.png | Bin 0 -> 1969 bytes .../textures/models/modelinputroutingnode.png | Bin 0 -> 1948 bytes .../models/modelmasterroutingnode.png | Bin 0 -> 2898 bytes .../models/modeloutputroutingnode.png | Bin 0 -> 1916 bytes .../textures/models/modelroutingnode.png | Bin 0 -> 1798 bytes .../bloodmagic/textures/models/pedestal.png | Bin 0 -> 1469 bytes .../textures/models/pillar_base.png | Bin 0 -> 1573 bytes .../textures/models/pillar_base_c.png | Bin 0 -> 1515 bytes .../textures/models/pillar_base_d.png | Bin 0 -> 1489 bytes .../textures/models/pillar_base_s.png | Bin 0 -> 1517 bytes .../textures/models/pillar_base_v.png | Bin 0 -> 1590 bytes .../bloodmagic/textures/models/pillar_mid.png | Bin 0 -> 1901 bytes .../textures/models/pillar_mid_c.png | Bin 0 -> 1853 bytes .../textures/models/pillar_mid_d.png | Bin 0 -> 1805 bytes .../textures/models/pillar_mid_s.png | Bin 0 -> 1794 bytes .../textures/models/pillar_mid_v.png | Bin 0 -> 2446 bytes .../bloodmagic/textures/models/plinth.png | Bin 0 -> 2700 bytes .../bloodmagic/textures/models/reagent.png | Bin 0 -> 396 bytes .../textures/models/simpletranscircle.png | Bin 0 -> 22424 bytes .../textures/models/steadfastcrystal.png | Bin 0 -> 734 bytes .../textures/models/vengefulcrystal.png | Bin 0 -> 737 bytes .../textures/models/writingtable.png | Bin 0 -> 2260 bytes .../bloodmagic/textures/potions/boost.png | Bin 0 -> 748 bytes .../assets/bloodmagicguide/lang/en_US.lang | 258 ++++ .../textures/gui/alchemyarraycrafting.png | Bin 0 -> 2464 bytes .../bloodmagicguide/textures/gui/altar.png | Bin 0 -> 18703 bytes .../textures/gui/bullet_point.png | Bin 0 -> 17840 bytes .../textures/gui/soulforge.png | Bin 0 -> 3452 bytes .../creative_inventory/tab_upgrade_tomes.png | Bin 0 -> 1107 bytes 796 files changed, 15806 insertions(+) create mode 100644 src/main/resources/assets/bloodmagic/armatures/block/pillar_mid.json create mode 100644 src/main/resources/assets/bloodmagic/asms/block/inversion_pillar.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockalchemyarray.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockalchemytable.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockaltar.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockbloodlight.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockbloodrune.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockbloodstonebrick.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockbloodtank.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockcrystal.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks1.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks2.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdemoncrucible.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystal.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystallizer.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdemonextra.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdemonlight.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdemonpylon.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockincensealtar.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockinputroutingnode.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockinversionpillar.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockinversionpillarend.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockitemroutingnode.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blocklifeessence.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockmasterroutingnode.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockmimic.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockoutputroutingnode.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockpath.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockphantom.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockpillar1.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockpillar2.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockpillarcap1.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockpillarcap2.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockpillarcap3.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockritualstone.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blocksoulforge.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockspectral.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockstairs1.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockstairs2.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockstairs3.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockteleposer.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blocktestspellblock.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockwall1.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemactivationcrystal.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemaltarmaker.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemarcaneashes.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemblockdemoncrystal.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itembloodshard.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemboundaxe.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemboundpickaxe.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemboundshovel.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemboundsword.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemcomponent.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemcuttingfluid.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemdaggerofsacrifice.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemdemoncrystal.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemdemonwillgauge.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemexperiencebook.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/iteminscriptiontool.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemlavacrystal.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmour.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmourpointsupgrade.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemmonstersoul.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemnoderouter.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itempacksacrifice.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itempackselfsacrifice.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemritualdiviner.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemritualreader.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemrouterfilter.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsacrificialdagger.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsanguinebook.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmour.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmourgem.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsentientaxe.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsentientbow.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsentientpickaxe.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsentientshovel.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsentientsword.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilair.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbloodlight.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbounce.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilclaw.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilcompression.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigildivination.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilelementalaffinity.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilenderseverance.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfastminer.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfrost.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilgreengrove.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilhaste.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilholding.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigillava.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilmagnetism.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilphantombridge.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilseer.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilsuppression.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilteleposition.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigiltransposition.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilvoid.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwater.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwhirlwind.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemslate.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsoulgem.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemsoulsnare.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemtelepositionfocus.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetome.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetrainer.json create mode 100644 src/main/resources/assets/bloodmagic/books/architect.xml create mode 100644 src/main/resources/assets/bloodmagic/gui/bookleft.png create mode 100644 src/main/resources/assets/bloodmagic/gui/jei/alchemy.png create mode 100644 src/main/resources/assets/bloodmagic/gui/jei/alchemytable.png create mode 100644 src/main/resources/assets/bloodmagic/gui/jei/altar.png create mode 100644 src/main/resources/assets/bloodmagic/gui/jei/binding.png create mode 100644 src/main/resources/assets/bloodmagic/gui/jei/soulforge.png create mode 100644 src/main/resources/assets/bloodmagic/gui/sigilholding.png create mode 100644 src/main/resources/assets/bloodmagic/gui/teleposer.png create mode 100644 src/main/resources/assets/bloodmagic/gui/writingtable.png create mode 100644 src/main/resources/assets/bloodmagic/loot_tables/bm_loot_table.json create mode 100644 src/main/resources/assets/bloodmagic/models/armor/livingarmour_layer_1.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/livingarmour_layer_2.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sacrificearmour_layer_1.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/selfsacrificearmour_layer_1.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_corrosive_layer_1.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_corrosive_layer_2.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_destructive_layer_1.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_destructive_layer_2.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_layer_1.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_layer_2.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_steadfast_layer_1.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_steadfast_layer_2.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_vengeful_layer_1.png create mode 100644 src/main/resources/assets/bloodmagic/models/armor/sentientarmour_vengeful_layer_2.png create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockalchemyarray.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockaltar.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockaltar.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockblank.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockbloodlight.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockbloodtank.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdemoncrucible.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdemoncrucible.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdemoncrystallizer.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdemoncrystallizer.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdemonpylon.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdemonpylon.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdimensionalportal.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdimensionalportalew.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockdimensionalportalns.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockhellfireforge.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockhellfireforge.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockincensealtar.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockincensealtar.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockincensealtar.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockinputroutingnode.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockmasterroutingnode.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockoutputroutingnode.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockphantom.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockpillarcapeast.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockpillarcapnorth.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockpillarcapsouth.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockpillarcapwest.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockpillarx.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockpillarz.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blocksoulforge.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/blockspectral.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal1.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal1.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal2.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal2.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal3.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal3.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal4.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal4.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal5.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal5.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal6.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal6.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal7.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/crystal/crystal7.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/modelalchemytable.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/modelalchemytable.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/pillar_bottom.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/pillar_mid.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/pillar_top.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodebase.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodebase.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecore.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecore.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodebase.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodebase.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecore.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecore.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/outputroutingnodecore.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/routing/routingnodebase.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/blockaltar.mtl create mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/blockaltar.obj create mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/blocksoulforge.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/blockspellmodifiercore.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/blockspellmodifierinput.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/sub/blockspellmodifieroutput.json create mode 100644 src/main/resources/assets/bloodmagic/models/bloodaltar-fixeuv.obj create mode 100644 src/main/resources/assets/bloodmagic/models/bloodaltar.obj create mode 100644 src/main/resources/assets/bloodmagic/models/item/blockalchemyarray.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/blockbloodlight.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/blockdimensionalportal.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/blockpedestal0.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/blockpedestal1.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/blockphantom.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/blockspectral.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_corrosive_pulling_0.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_corrosive_pulling_1.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_corrosive_pulling_2.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_destructive_pulling_0.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_destructive_pulling_1.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_destructive_pulling_2.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_pulling_0.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_pulling_1.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_pulling_2.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_steadfast_pulling_0.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_steadfast_pulling_1.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_steadfast_pulling_2.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_vengeful_pulling_0.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_vengeful_pulling_1.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/bow/itemsentientbow_vengeful_pulling_2.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorb.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbapprentice.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbarchmage.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbmagician.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbmaster.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbtranscendent.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbweak.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itemmodelbase.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem0.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem1.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itemsentientbow.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/itemtoolbase.json create mode 100644 src/main/resources/assets/bloodmagic/schematics/corridor1.json create mode 100644 src/main/resources/assets/bloodmagic/schematics/hallchest1.json create mode 100644 src/main/resources/assets/bloodmagic/schematics/rawbuilding1.json create mode 100644 src/main/resources/assets/bloodmagic/shaders/beam-broken.frag create mode 100644 src/main/resources/assets/bloodmagic/shaders/beam.frag create mode 100644 src/main/resources/assets/bloodmagic/structures/building1.nbt create mode 100644 src/main/resources/assets/bloodmagic/structures/corridor1.nbt create mode 100644 src/main/resources/assets/bloodmagic/structures/hallchest1.nbt create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/accelerationrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/airritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/altarcapacityrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/bettercapacityrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/blankrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/bloodsocket.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/bloodstonebrick.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/bloodtank.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/chargingrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dislocationrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/duskritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/earthritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/efficiencyrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/empty.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/emptysocket.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/etherealopaquemimic.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/fireritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/imperfectritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/largebloodstonebrick.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png.mcmeta create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png.mcmeta create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/lightritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/masterritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/obsidianbrickpath.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/obsidiantilepath.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/orbcapacityrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/phantomblock.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/ritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/runeofsacrifice.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/runeofselfsacrifice.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/sentientmimic.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/shardcluster.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/shardclusterbrick.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/simpletranscircle.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/solidclearmimic.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/solidlightmimic.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/solidopaquemimic.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/soulforge.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/spectralblock.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/speedrune.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/stonebrickpath.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/stonetilepath.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/teleposer_side.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/teleposer_top.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/waterritualstone.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/woodbrickpath.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/woodtilepath.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/wornstonebrickpath.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/wornstonetilepath.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/bloodelytra.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/defaultcrystallayer.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/energyblastprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/explosionprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/fireprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/holyprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/iceprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/lightningprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/mudprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/nodebeam.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/overlay/overlay_raw.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soularrow.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soularrow_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soularrow_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soularrow_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/soularrow_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/specter.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/waterprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/windgustprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/zombie_raw.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/alchemytable.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/bookcrafting.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/bookfurnace.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/bookleft.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/bookright.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/buttons_compat.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/crucible.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/guitrap.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/masterroutingnode.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/routingnode.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/soulforge.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/teleposer.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back.jpg create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back_over.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/widgets.png create mode 100644 src/main/resources/assets/bloodmagic/textures/hud/bars.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/activationcrystalawakened.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/activationcrystalcreative.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/activationcrystalweak.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/airscribetool.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/airsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/altarmaker.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/ampouleempty.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/ampoulefull.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/antiseptic.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/apprenticebloodorb.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/arcaneashes.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/archmagebloodorb.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/basemonstersoul.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/basiccuttingfluid.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/blackpudding.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/blanksigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/blankslate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/bloodlightsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/bloodpack.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/bouncesigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/bouncesigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/boundaxe_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/boundpickaxe_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/boundshovel_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/boundsword_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/boundtool.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/bridgesigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/bridgesigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/ceremonialdagger.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/clawsigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/clawsigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/coagulant.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/coalsand.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/componentframeparts.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/compressionsigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/compressionsigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/corrosivecrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/crucibleupgrade.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/daggerofsacrifice.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/dawnscribetool.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/defaultcrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/demonbloodshard.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/demonicteleposerfocus.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/demonslate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/demonwillgauge.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/destructivecrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/divinationsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/duskscribetool.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/earthscribetool.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/elementalsigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/elementalsigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/enhancedteleposerfocus.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/etherealslate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/experiencebook.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/explosivepowder.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/firescribetool.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/goldsand.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/growthsigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/growthsigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/hastesigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/hastesigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/icesigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/icesigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/information.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/infusedslate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/inputroutingfocus.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/ironsand.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/item_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/itemrouterfilterexact.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/itemrouterfilterignorenbt.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/itemrouterfiltermoditems.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/itemrouterfilteroredict.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/lavacrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/lavasigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/lifebucket.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/livingboots.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/livinghelmet.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/livingleggings.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/livingplate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/magicianbloodorb.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/mailorder.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/masterbloodorb.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/miningsigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/miningsigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/mundanelengtheningcatalyst.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/mundanepowercatalyst.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/neurotoxin.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/noderouter.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/plantfibres.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/plantoil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/potionflask_outline.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/potionflask_overlay.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/potionflask_underlay.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentaffinity.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentair.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentbinding.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentbloodlight.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentbounce.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentbridge.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentclaw.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentcompression.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentfastminer.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentfrost.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentgrowth.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagenthaste.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentholding.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentlava.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentmagnetism.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentseverance.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentsight.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentsuppression.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentteleposition.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagenttransposition.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentvoid.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentwater.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reagentwind.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reinforcedslate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/reinforcedteleposerfocus.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/ritual_dismantler.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/ritualdiviner.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/ritualtinkerer.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sacrificeplate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sacrificialdagger.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/saltpeter.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sanguinebook.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/seersigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/selfsacrificeplate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_corrosive_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_corrosive_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_destructive_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_destructive_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_steadfast_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_steadfast_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_vengeful_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_vengeful_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientarrow.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientboots.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientboots_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientboots_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientboots_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientboots_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_0.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_0.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_0.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_0.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_0.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentienthelmet.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientleggings.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientleggings_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientleggings_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientleggings_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientleggings_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientplate.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientplate_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientplate_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientplate_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sentientplate_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/set_area.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/set_will_types.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sheatheditem.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sigilofholding.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sigilofmagnetism_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sigilofmagnetism_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sigilofseverance_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sigilofseverance_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sigilofsuppression_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sigilofsuppression_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sigiloverlay.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulaxe.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulaxe_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulaxe_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulaxe_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulaxe_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemcommon.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgrand.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgreater.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemlesser.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgempetty.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgempetty_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgempetty_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgempetty_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulgempetty_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulpickaxe.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulshovel.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulshovel_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulshovel_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulshovel_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulshovel_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsnare.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsnare_corrosive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsnare_destructive.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsnare_steadfast.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsnare_vengeful.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_corrosive_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_corrosive_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_vengeful_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/soulsword_vengeful_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/steadfastcrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/sulfur.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/teleposerfocus.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/telepositionsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/transcendentbloodorb.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/transpositionsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/upgradetome.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/upgradetrainer.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/vengefulcrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/voidsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/warriorsigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/warriorsigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/waterscribetool.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/watersigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/weakbloodorb.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/weakbloodshard.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/windsigil_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/windsigil_deactivated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/beam2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/potions.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t3.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t4.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t5.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t6.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/demons/ring1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/demons/ring2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/alchemy.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/animalgrowth.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/beatinganvil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/binding.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/containment.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/convocation.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/crusher.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/dome.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/ellipsoid.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/eternalsoul.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/evaporation.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/expulsion.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/featheredearth.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/featheredknife.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/flight.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/gaia.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/greengrove.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/harvest.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/interdiction.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/jump.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/lava.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/magnetism.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/meteor.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/phantomhands.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/regeneration.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/sacrosanctity.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/speed.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/stallingomega.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/stomach.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/symmetryomega.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/unbinding.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/veilofevil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/water.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/wellofsuffering.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/zephyr.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/conduit.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/effect.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/enhancement.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/modifier.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/paradigm.png create mode 100644 src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/simplespelltable.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/airsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/basearray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bindingarray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bindinglightningarray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bouncearray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/divinationsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/elementalaffinitysigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/fastminersigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/growthsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/hastesigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/lavasigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/lightsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/magnetismsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/movementarray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/sightsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/skeletonturret1.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/skeletonturret2.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/stupidarray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/suppressionsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/teleportationarray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/updraftarray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/voidsigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/watersigil.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/wiparray.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/zombiebeacon.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemytable.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/altar.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/corrosivecrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/defaultcrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/demoncrucible.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/demoncrystallizer.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/demonpylon.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/destructivecrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/energybazookamainprojectile.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/hellfireforge.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/incensealtar.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/meteor.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/modelinputroutingnode.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/modelmasterroutingnode.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/modeloutputroutingnode.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/modelroutingnode.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pedestal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_base_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid_c.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid_d.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid_s.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/pillar_mid_v.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/plinth.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/reagent.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/simpletranscircle.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/steadfastcrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/vengefulcrystal.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/writingtable.png create mode 100644 src/main/resources/assets/bloodmagic/textures/potions/boost.png create mode 100644 src/main/resources/assets/bloodmagicguide/lang/en_US.lang create mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/alchemyarraycrafting.png create mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/altar.png create mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/bullet_point.png create mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/soulforge.png create mode 100644 src/main/resources/assets/minecraft/textures/gui/container/creative_inventory/tab_upgrade_tomes.png diff --git a/src/main/resources/assets/bloodmagic/armatures/block/pillar_mid.json b/src/main/resources/assets/bloodmagic/armatures/block/pillar_mid.json new file mode 100644 index 00000000..16d07d04 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/armatures/block/pillar_mid.json @@ -0,0 +1,42 @@ +{ + "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 new file mode 100644 index 00000000..2ebde5e6 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/asms/block/inversion_pillar.json @@ -0,0 +1,13 @@ +{ + "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/blockalchemyarray.json b/src/main/resources/assets/bloodmagic/blockstates/blockalchemyarray.json new file mode 100644 index 00000000..03ba5c90 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockalchemyarray.json @@ -0,0 +1,10 @@ +{ + "variants": { + "normal": { + "model": "bloodmagic:BlockAlchemyArray", + "textures": { + "all": "bloodmagic:models/AlchemyArrays/StupidArray" + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockalchemytable.json b/src/main/resources/assets/bloodmagic/blockstates/blockalchemytable.json new file mode 100644 index 00000000..d1d44534 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockalchemytable.json @@ -0,0 +1,50 @@ +{ + "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/blockaltar.json b/src/main/resources/assets/bloodmagic/blockstates/blockaltar.json new file mode 100644 index 00000000..24191a55 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockaltar.json @@ -0,0 +1,14 @@ +{ + "forge_marker": 1, + "defaults": { + "textures": { }, + "model": "bloodmagic:BlockAltar.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/blockbloodlight.json b/src/main/resources/assets/bloodmagic/blockstates/blockbloodlight.json new file mode 100644 index 00000000..c67139da --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockbloodlight.json @@ -0,0 +1,10 @@ +{ + "variants": { + "normal": { + "model": "bloodmagic:BlockBloodLight", + "textures": { + "all": "bloodmagic:blocks/BlockBloodLight" + } + } + } +} diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockbloodrune.json b/src/main/resources/assets/bloodmagic/blockstates/blockbloodrune.json new file mode 100644 index 00000000..f267e034 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockbloodrune.json @@ -0,0 +1,67 @@ +{ + "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" + } + }, + "selfsacrifice": { + "textures": { + "all": "bloodmagic:blocks/RuneOfSelfSacrifice" + } + }, + "displacement": { + "textures": { + "all": "bloodmagic:blocks/DislocationRune" + } + }, + "capacity": { + "textures": { + "all": "bloodmagic:blocks/AltarCapacityRune" + } + }, + "augcapacity": { + "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/blockbloodstonebrick.json b/src/main/resources/assets/bloodmagic/blockstates/blockbloodstonebrick.json new file mode 100644 index 00000000..9cce5ef3 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockbloodstonebrick.json @@ -0,0 +1,22 @@ +{ + "forge_marker": 1, + "defaults": { + "textures": { }, + "model": "cube_all", + "uvlock": true + }, + "variants": { + "type": { + "large": { + "textures": { + "all": "bloodmagic:blocks/LargeBloodStoneBrick" + } + }, + "brick": { + "textures": { + "all": "bloodmagic:blocks/BloodStoneBrick" + } + } + } + } +} diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockbloodtank.json b/src/main/resources/assets/bloodmagic/blockstates/blockbloodtank.json new file mode 100644 index 00000000..d71d03f6 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockbloodtank.json @@ -0,0 +1,29 @@ +{ + "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/blockcrystal.json b/src/main/resources/assets/bloodmagic/blockstates/blockcrystal.json new file mode 100644 index 00000000..c997259c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockcrystal.json @@ -0,0 +1,22 @@ +{ + "forge_marker": 1, + "defaults": { + "textures": { }, + "model": "cube_all", + "uvlock": true + }, + "variants": { + "type": { + "large": { + "textures": { + "all": "bloodmagic:blocks/ShardCluster" + } + }, + "brick": { + "textures": { + "all": "bloodmagic:blocks/ShardClusterBrick" + } + } + } + } +} diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks1.json b/src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks1.json new file mode 100644 index 00000000..bff693ef --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks1.json @@ -0,0 +1,35 @@ +{ + "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/blockdemonbricks2.json b/src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks2.json new file mode 100644 index 00000000..deef552c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks2.json @@ -0,0 +1,88 @@ +{ + "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/blockdemoncrucible.json b/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrucible.json new file mode 100644 index 00000000..6a1615be --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrucible.json @@ -0,0 +1,14 @@ +{ + "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/blockdemoncrystal.json b/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystal.json new file mode 100644 index 00000000..792e272f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystal.json @@ -0,0 +1,146 @@ +{ + "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/blockdemoncrystallizer.json b/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystallizer.json new file mode 100644 index 00000000..ef8d9802 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystallizer.json @@ -0,0 +1,14 @@ +{ + "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/blockdemonextra.json b/src/main/resources/assets/bloodmagic/blockstates/blockdemonextra.json new file mode 100644 index 00000000..4854590c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdemonextra.json @@ -0,0 +1,88 @@ +{ + "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/blockdemonlight.json b/src/main/resources/assets/bloodmagic/blockstates/blockdemonlight.json new file mode 100644 index 00000000..171bdd39 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdemonlight.json @@ -0,0 +1,38 @@ +{ + "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/blockdemonpylon.json b/src/main/resources/assets/bloodmagic/blockstates/blockdemonpylon.json new file mode 100644 index 00000000..4a2b009e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdemonpylon.json @@ -0,0 +1,14 @@ +{ + "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/blockdimensionalportal.json b/src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json new file mode 100644 index 00000000..3ed3ae07 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json @@ -0,0 +1,13 @@ +{ + "forge_marker": 1, + "defaults": { + "textures": {}, + "uvlock": true + }, + "variants": { + "meta": { + "0": {"model": "bloodmagic:BlockDimensionalPortalNS"}, + "1": {"model": "bloodmagic:BlockDimensionalPortalEW"} + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockincensealtar.json b/src/main/resources/assets/bloodmagic/blockstates/blockincensealtar.json new file mode 100644 index 00000000..f5c0414e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockincensealtar.json @@ -0,0 +1,14 @@ +{ + "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/blockinputroutingnode.json b/src/main/resources/assets/bloodmagic/blockstates/blockinputroutingnode.json new file mode 100644 index 00000000..01f96406 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockinputroutingnode.json @@ -0,0 +1,66 @@ +{ + "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/blockinversionpillar.json b/src/main/resources/assets/bloodmagic/blockstates/blockinversionpillar.json new file mode 100644 index 00000000..fdf9e93d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockinversionpillar.json @@ -0,0 +1,51 @@ +{ + "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/blockinversionpillarend.json b/src/main/resources/assets/bloodmagic/blockstates/blockinversionpillarend.json new file mode 100644 index 00000000..295c172a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockinversionpillarend.json @@ -0,0 +1,72 @@ +{ + "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/blockitemroutingnode.json b/src/main/resources/assets/bloodmagic/blockstates/blockitemroutingnode.json new file mode 100644 index 00000000..9342eeea --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockitemroutingnode.json @@ -0,0 +1,66 @@ +{ + "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/blocklifeessence.json b/src/main/resources/assets/bloodmagic/blockstates/blocklifeessence.json new file mode 100644 index 00000000..8d673ba3 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blocklifeessence.json @@ -0,0 +1,9 @@ +{ + "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/blockmasterroutingnode.json b/src/main/resources/assets/bloodmagic/blockstates/blockmasterroutingnode.json new file mode 100644 index 00000000..a10dc2f5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockmasterroutingnode.json @@ -0,0 +1,65 @@ +{ + "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/blockmimic.json b/src/main/resources/assets/bloodmagic/blockstates/blockmimic.json new file mode 100644 index 00000000..ae9c2042 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockmimic.json @@ -0,0 +1,38 @@ +{ + "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/blockoutputroutingnode.json b/src/main/resources/assets/bloodmagic/blockstates/blockoutputroutingnode.json new file mode 100644 index 00000000..11d0d9cf --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockoutputroutingnode.json @@ -0,0 +1,66 @@ +{ + "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/blockpath.json b/src/main/resources/assets/bloodmagic/blockstates/blockpath.json new file mode 100644 index 00000000..4ebe7070 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockpath.json @@ -0,0 +1,53 @@ +{ + "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/blockphantom.json b/src/main/resources/assets/bloodmagic/blockstates/blockphantom.json new file mode 100644 index 00000000..7f83de76 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockphantom.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "bloodmagic:BlockPhantom" } + } +} diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockpillar1.json b/src/main/resources/assets/bloodmagic/blockstates/blockpillar1.json new file mode 100644 index 00000000..c32dd8ac --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockpillar1.json @@ -0,0 +1,58 @@ +{ + "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/blockpillar2.json b/src/main/resources/assets/bloodmagic/blockstates/blockpillar2.json new file mode 100644 index 00000000..9285da20 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockpillar2.json @@ -0,0 +1,58 @@ +{ + "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/blockpillarcap1.json b/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap1.json new file mode 100644 index 00000000..01b3ebae --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap1.json @@ -0,0 +1,57 @@ +{ + "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/blockpillarcap2.json b/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap2.json new file mode 100644 index 00000000..68d4de9a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap2.json @@ -0,0 +1,57 @@ +{ + "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/blockpillarcap3.json b/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap3.json new file mode 100644 index 00000000..e373b095 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap3.json @@ -0,0 +1,50 @@ +{ + "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/blockritualcontroller.json b/src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json new file mode 100644 index 00000000..784afa96 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json @@ -0,0 +1,22 @@ +{ + "forge_marker": 1, + "defaults": { + "textures": { }, + "model": "cube_all", + "uvlock": true + }, + "variants": { + "type": { + "master": { + "textures": { + "all": "bloodmagic:blocks/MasterRitualStone" + } + }, + "imperfect": { + "textures": { + "all": "bloodmagic:blocks/ImperfectRitualStone" + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockritualstone.json b/src/main/resources/assets/bloodmagic/blockstates/blockritualstone.json new file mode 100644 index 00000000..9eead647 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockritualstone.json @@ -0,0 +1,47 @@ +{ + "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/blocksoulforge.json b/src/main/resources/assets/bloodmagic/blockstates/blocksoulforge.json new file mode 100644 index 00000000..5abbb4e2 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blocksoulforge.json @@ -0,0 +1,14 @@ +{ + "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/blockspectral.json b/src/main/resources/assets/bloodmagic/blockstates/blockspectral.json new file mode 100644 index 00000000..1d43fa6a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockspectral.json @@ -0,0 +1,10 @@ +{ + "variants": { + "normal": { + "model": "bloodmagic:BlockSpectral", + "textures": { + "all": "bloodmagic:blocks/SpectralBlock" + } + } + } +} diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockstairs1.json b/src/main/resources/assets/bloodmagic/blockstates/blockstairs1.json new file mode 100644 index 00000000..8bb70c0c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockstairs1.json @@ -0,0 +1,100 @@ +{ + "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/blockstairs2.json b/src/main/resources/assets/bloodmagic/blockstates/blockstairs2.json new file mode 100644 index 00000000..e3376cc8 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockstairs2.json @@ -0,0 +1,100 @@ +{ + "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/blockstairs3.json b/src/main/resources/assets/bloodmagic/blockstates/blockstairs3.json new file mode 100644 index 00000000..51640cbd --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockstairs3.json @@ -0,0 +1,59 @@ +{ + "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/blockteleposer.json b/src/main/resources/assets/bloodmagic/blockstates/blockteleposer.json new file mode 100644 index 00000000..2a92da6c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockteleposer.json @@ -0,0 +1,17 @@ +{ + "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/blocktestspellblock.json b/src/main/resources/assets/bloodmagic/blockstates/blocktestspellblock.json new file mode 100644 index 00000000..8bdc9a94 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blocktestspellblock.json @@ -0,0 +1,29 @@ +{ + "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/blockwall1.json b/src/main/resources/assets/bloodmagic/blockstates/blockwall1.json new file mode 100644 index 00000000..b7782a56 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blockwall1.json @@ -0,0 +1,109 @@ +{ + "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/item/itemactivationcrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemactivationcrystal.json new file mode 100644 index 00000000..913aa3f8 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemactivationcrystal.json @@ -0,0 +1,26 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "weak": { + "textures": { + "layer0": "bloodmagic:items/activationCrystalWeak" + } + }, + "demonic": { + "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/item/itemaltarmaker.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemaltarmaker.json new file mode 100644 index 00000000..d9853286 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemaltarmaker.json @@ -0,0 +1,16 @@ +{ + "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/item/itemarcaneashes.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemarcaneashes.json new file mode 100644 index 00000000..df9edd3c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemarcaneashes.json @@ -0,0 +1,16 @@ +{ + "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/item/itemblockdemoncrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemblockdemoncrystal.json new file mode 100644 index 00000000..492f59ee --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemblockdemoncrystal.json @@ -0,0 +1,39 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "bloodmagic:crystal/Crystal1.obj", + "custom": { "flip-v": true }, + "transform": { + "translation": [ 0, 0, 1] + } + }, + "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" + } + } + } + } +} diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itembloodshard.json b/src/main/resources/assets/bloodmagic/blockstates/item/itembloodshard.json new file mode 100644 index 00000000..4cf72004 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itembloodshard.json @@ -0,0 +1,21 @@ +{ + "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/item/itemboundaxe.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemboundaxe.json new file mode 100644 index 00000000..dc27b28a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemboundaxe.json @@ -0,0 +1,21 @@ +{ + "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/item/itemboundpickaxe.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemboundpickaxe.json new file mode 100644 index 00000000..6acaacca --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemboundpickaxe.json @@ -0,0 +1,21 @@ +{ + "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/item/itemboundshovel.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemboundshovel.json new file mode 100644 index 00000000..adba2311 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemboundshovel.json @@ -0,0 +1,21 @@ +{ + "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/item/itemboundsword.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemboundsword.json new file mode 100644 index 00000000..ae592f33 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemboundsword.json @@ -0,0 +1,21 @@ +{ + "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/item/itemcomponent.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemcomponent.json new file mode 100644 index 00000000..eb690f3b --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemcomponent.json @@ -0,0 +1,176 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "reagentwater": { + "textures": { + "layer0": "bloodmagic:items/ReagentWater" + } + }, + "reagentlava": { + "textures": { + "layer0": "bloodmagic:items/ReagentLava" + } + }, + "reagentair": { + "textures": { + "layer0": "bloodmagic:items/ReagentAir" + } + }, + "reagentfastminer": { + "textures": { + "layer0": "bloodmagic:items/ReagentFastMiner" + } + }, + "reagentvoid": { + "textures": { + "layer0": "bloodmagic:items/ReagentVoid" + } + }, + "reagentgrowth": { + "textures": { + "layer0": "bloodmagic:items/ReagentGrowth" + } + }, + "reagentaffinity": { + "textures": { + "layer0": "bloodmagic:items/ReagentAffinity" + } + }, + "reagentsight": { + "textures": { + "layer0": "bloodmagic:items/ReagentSight" + } + }, + "reagentbinding": { + "textures": { + "layer0": "bloodmagic:items/ReagentBinding" + } + }, + "reagentsuppression": { + "textures": { + "layer0": "bloodmagic:items/ReagentSuppression" + } + }, + "frameparts": { + "textures": { + "layer0": "bloodmagic:items/ComponentFrameParts" + } + }, + "reagentbloodlight": { + "textures": { + "layer0": "bloodmagic:items/ReagentBloodLight" + } + }, + "reagentmagnetism": { + "textures": { + "layer0": "bloodmagic:items/ReagentMagnetism" + } + }, + "reagenthaste": { + "textures": { + "layer0": "bloodmagic:items/ReagentHaste" + } + }, + "reagentcompression": { + "textures": { + "layer0": "bloodmagic:items/ReagentCompression" + } + }, + "reagentbridge": { + "textures": { + "layer0": "bloodmagic:items/ReagentBridge" + } + }, + "reagentseverance": { + "textures": { + "layer0": "bloodmagic:items/ReagentSeverance" + } + }, + "reagentteleposition": { + "textures": { + "layer0": "bloodmagic:items/ReagentTeleposition" + } + }, + "reagenttransposition": { + "textures": { + "layer0": "bloodmagic:items/ReagentTransposition" + } + }, + "ironsand": { + "textures": { + "layer0": "bloodmagic:items/IronSand" + } + }, + "goldsand": { + "textures": { + "layer0": "bloodmagic:items/GoldSand" + } + }, + "coalsand": { + "textures": { + "layer0": "bloodmagic:items/CoalSand" + } + }, + "plantoil": { + "textures": { + "layer0": "bloodmagic:items/PlantOil" + } + }, + "sulfur": { + "textures": { + "layer0": "bloodmagic:items/Sulfur" + } + }, + "saltpeter": { + "textures": { + "layer0": "bloodmagic:items/Saltpeter" + } + }, + "neurotoxin": { + "textures": { + "layer0": "bloodmagic:items/NeuroToxin" + } + }, + "antiseptic": { + "textures": { + "layer0": "bloodmagic:items/Antiseptic" + } + }, + "reagentholding": { + "textures": { + "layer0": "bloodmagic:items/ReagentHolding" + } + }, + "mundanelength": { + "textures": { + "layer0": "bloodmagic:items/MundaneLengtheningCatalyst" + } + }, + "mundanepower": { + "textures": { + "layer0": "bloodmagic:items/MundanePowerCatalyst" + } + }, + "reagentclaw": { + "textures": { + "layer0": "bloodmagic:items/ReagentClaw" + } + }, + "reagentbounce": { + "textures": { + "layer0": "bloodmagic:items/ReagentBounce" + } + }, + "reagentfrost": { + "textures": { + "layer0": "bloodmagic:items/ReagentFrost" + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemcuttingfluid.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemcuttingfluid.json new file mode 100644 index 00000000..fbd1ac61 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemcuttingfluid.json @@ -0,0 +1,21 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "basiccuttingfluid": { + "textures": { + "layer0": "bloodmagic:items/BasicCuttingFluid" + } + }, + "explosive": { + "textures": { + "layer0": "bloodmagic:items/ExplosivePowder" + } + } + } + } +} diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemdaggerofsacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemdaggerofsacrifice.json new file mode 100644 index 00000000..5cae9434 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemdaggerofsacrifice.json @@ -0,0 +1,16 @@ +{ + "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/item/itemdemoncrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemdemoncrystal.json new file mode 100644 index 00000000..0d65d0c3 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemdemoncrystal.json @@ -0,0 +1,36 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "crystaldefault": { + "textures": { + "layer0": "bloodmagic:items/DefaultCrystal" + } + }, + "crystalcorrosive": { + "textures": { + "layer0": "bloodmagic:items/CorrosiveCrystal" + } + }, + "crystalvengeful": { + "textures": { + "layer0": "bloodmagic:items/VengefulCrystal" + } + }, + "crystaldestructive": { + "textures": { + "layer0": "bloodmagic:items/DestructiveCrystal" + } + }, + "crystalsteadfast": { + "textures": { + "layer0": "bloodmagic:items/SteadfastCrystal" + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemdemonwillgauge.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemdemonwillgauge.json new file mode 100644 index 00000000..33dc70e5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemdemonwillgauge.json @@ -0,0 +1,16 @@ +{ + "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/item/itemexperiencebook.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemexperiencebook.json new file mode 100644 index 00000000..0441a8e1 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemexperiencebook.json @@ -0,0 +1,16 @@ +{ + "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/item/iteminscriptiontool.json b/src/main/resources/assets/bloodmagic/blockstates/item/iteminscriptiontool.json new file mode 100644 index 00000000..941bdac9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/iteminscriptiontool.json @@ -0,0 +1,41 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "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/item/itemlavacrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemlavacrystal.json new file mode 100644 index 00000000..12890a4d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemlavacrystal.json @@ -0,0 +1,16 @@ +{ + "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/item/itemlivingarmour.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmour.json new file mode 100644 index 00000000..a20acc7a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmour.json @@ -0,0 +1,31 @@ +{ + "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/item/itemlivingarmourpointsupgrade.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmourpointsupgrade.json new file mode 100644 index 00000000..67ac1582 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmourpointsupgrade.json @@ -0,0 +1,16 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "draftangelus": { + "textures": { + "layer0": "bloodmagic:items/Coagulant" + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemmonstersoul.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemmonstersoul.json new file mode 100644 index 00000000..bbdebb50 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemmonstersoul.json @@ -0,0 +1,36 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "base": { + "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/item/itemnoderouter.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemnoderouter.json new file mode 100644 index 00000000..c9a0de99 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemnoderouter.json @@ -0,0 +1,16 @@ +{ + "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/item/itempacksacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/item/itempacksacrifice.json new file mode 100644 index 00000000..024dc061 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itempacksacrifice.json @@ -0,0 +1,16 @@ +{ + "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/item/itempackselfsacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/item/itempackselfsacrifice.json new file mode 100644 index 00000000..024dc061 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itempackselfsacrifice.json @@ -0,0 +1,16 @@ +{ + "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/item/itempotionflask.json b/src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json new file mode 100644 index 00000000..4af6432c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json @@ -0,0 +1,18 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "normal": { + "textures": { + "layer0": "bloodmagic:items/PotionFlask_underlay", + "layer1": "bloodmagic:items/PotionFlask_outline", + "layer2": "bloodmagic:items/PotionFlask_overlay" + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemritualdiviner.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemritualdiviner.json new file mode 100644 index 00000000..e60702e6 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemritualdiviner.json @@ -0,0 +1,26 @@ +{ + "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/item/itemritualreader.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemritualreader.json new file mode 100644 index 00000000..6178c0a9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemritualreader.json @@ -0,0 +1,16 @@ +{ + "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/item/itemrouterfilter.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemrouterfilter.json new file mode 100644 index 00000000..afe3e19d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemrouterfilter.json @@ -0,0 +1,31 @@ +{ + "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/item/itemsacrificialdagger.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsacrificialdagger.json new file mode 100644 index 00000000..da29bad3 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsacrificialdagger.json @@ -0,0 +1,26 @@ +{ + "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/item/itemsanguinebook.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsanguinebook.json new file mode 100644 index 00000000..3d241ffb --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsanguinebook.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsentientarmour.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmour.json new file mode 100644 index 00000000..92324fbe --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmour.json @@ -0,0 +1,111 @@ +{ + "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/item/itemsentientarmourgem.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmourgem.json new file mode 100644 index 00000000..4a0cabfb --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmourgem.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsentientaxe.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientaxe.json new file mode 100644 index 00000000..f93f679a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientaxe.json @@ -0,0 +1,36 @@ +{ + "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/item/itemsentientbow.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientbow.json new file mode 100644 index 00000000..4ae06da9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientbow.json @@ -0,0 +1,34 @@ +{ + "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/item/itemsentientpickaxe.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientpickaxe.json new file mode 100644 index 00000000..fdf1b224 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientpickaxe.json @@ -0,0 +1,36 @@ +{ + "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/item/itemsentientshovel.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientshovel.json new file mode 100644 index 00000000..fe56d96d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientshovel.json @@ -0,0 +1,36 @@ +{ + "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/item/itemsentientsword.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientsword.json new file mode 100644 index 00000000..31620620 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientsword.json @@ -0,0 +1,36 @@ +{ + "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/item/itemsigilair.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilair.json new file mode 100644 index 00000000..32f44849 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilair.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigilbloodlight.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbloodlight.json new file mode 100644 index 00000000..dc5b4f19 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbloodlight.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigilbounce.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbounce.json new file mode 100644 index 00000000..d4fdbefe --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbounce.json @@ -0,0 +1,22 @@ +{ + "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/item/itemsigilclaw.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilclaw.json new file mode 100644 index 00000000..54f6aa1b --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilclaw.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilcompression.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilcompression.json new file mode 100644 index 00000000..ad29944e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilcompression.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigildivination.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigildivination.json new file mode 100644 index 00000000..184354d6 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigildivination.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigilelementalaffinity.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilelementalaffinity.json new file mode 100644 index 00000000..313bbfe2 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilelementalaffinity.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilenderseverance.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilenderseverance.json new file mode 100644 index 00000000..9c73f810 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilenderseverance.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilfastminer.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfastminer.json new file mode 100644 index 00000000..2c22c801 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfastminer.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilfrost.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfrost.json new file mode 100644 index 00000000..b7dcb443 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfrost.json @@ -0,0 +1,22 @@ +{ + "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/item/itemsigilgreengrove.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilgreengrove.json new file mode 100644 index 00000000..b1bfb321 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilgreengrove.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilhaste.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilhaste.json new file mode 100644 index 00000000..39b9302a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilhaste.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilholding.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilholding.json new file mode 100644 index 00000000..cfe4b8ec --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilholding.json @@ -0,0 +1,22 @@ +{ + "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/item/itemsigillava.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigillava.json new file mode 100644 index 00000000..fde7dbbc --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigillava.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigilmagnetism.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilmagnetism.json new file mode 100644 index 00000000..8a3a3967 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilmagnetism.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilphantombridge.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilphantombridge.json new file mode 100644 index 00000000..e37bf040 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilphantombridge.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilseer.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilseer.json new file mode 100644 index 00000000..26097e59 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilseer.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigilsuppression.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilsuppression.json new file mode 100644 index 00000000..b48d90eb --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilsuppression.json @@ -0,0 +1,21 @@ +{ + "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/item/itemsigilteleposition.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilteleposition.json new file mode 100644 index 00000000..84d1fe93 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilteleposition.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigiltransposition.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigiltransposition.json new file mode 100644 index 00000000..bb09cc7d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigiltransposition.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigilvoid.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilvoid.json new file mode 100644 index 00000000..4bc0194f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilvoid.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigilwater.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwater.json new file mode 100644 index 00000000..9f76d28b --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwater.json @@ -0,0 +1,16 @@ +{ + "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/item/itemsigilwhirlwind.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwhirlwind.json new file mode 100644 index 00000000..6c9faba0 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwhirlwind.json @@ -0,0 +1,21 @@ +{ + "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/item/itemslate.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemslate.json new file mode 100644 index 00000000..7f6f59af --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemslate.json @@ -0,0 +1,36 @@ +{ + "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/item/itemsoulgem.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsoulgem.json new file mode 100644 index 00000000..33d9b6e0 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsoulgem.json @@ -0,0 +1,136 @@ +{ + "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/item/itemsoulsnare.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemsoulsnare.json new file mode 100644 index 00000000..e643b138 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemsoulsnare.json @@ -0,0 +1,16 @@ +{ + "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/item/itemtelepositionfocus.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemtelepositionfocus.json new file mode 100644 index 00000000..34f21365 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemtelepositionfocus.json @@ -0,0 +1,31 @@ +{ + "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/item/itemupgradetome.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetome.json new file mode 100644 index 00000000..1562c045 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetome.json @@ -0,0 +1,16 @@ +{ + "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/item/itemupgradetrainer.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetrainer.json new file mode 100644 index 00000000..37735a28 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetrainer.json @@ -0,0 +1,16 @@ +{ + "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 new file mode 100644 index 00000000..d8bfebc9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/books/architect.xml @@ -0,0 +1,106 @@ + + + + + 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/gui/bookleft.png b/src/main/resources/assets/bloodmagic/gui/bookleft.png new file mode 100644 index 0000000000000000000000000000000000000000..08b462df1c3a95725497df9fb6e36574e26fa4e7 GIT binary patch literal 11940 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/gui/jei/alchemy.png b/src/main/resources/assets/bloodmagic/gui/jei/alchemy.png new file mode 100644 index 0000000000000000000000000000000000000000..a84a5220c0e23e5dda16abbd80f3004772ffb745 GIT binary patch literal 15723 zcmeI3UyKt)9LJ}3AaDlMKp-K;G$jU6x4YYR+wR)-fGc!PtT-&YP zJ=!~iRQwZ-(TI@*HGE`rgA zX>!;3&2PTH-^^#`H{F+gt*86(#ceCw004`-I-|V+I8f687T$%vwq*||(AT0&=YWCy zQ`Vnj7aX_&fcTph?>GBnn*a*(=Ml` zhFx2Q7#GWQz!9x;A`AN_y5q{ks3NMa_DEYOFQEV_Xv)rfDw#HI1ld(h;CjG0s+sXP7lZXSdM3TFT;zH&nI!5v;1*I z+E6Q$RTENgbYnRkvcj$r)67ULo6F_gIj>vK4zs){iY(`0Jst*)V2ts!Dd(BAv8oiL z5+@1`C97pjO;0<~pZFK1ZZ&9RL{s#4Wt#rLTQIWXsuF57Rsicjq7?c zQaWWl6@<=?j^e3uKD1R!t9s5@6Jl{mZNF>LU{p3?1f55L;W@@5#yyFyaldjk;~B;z^Ub(uOIg71$MxpbodDsgl6S0mujZ zi~v=L>fEO=K~5DJSrvQeLK$TE}gt7@g(f&DIB>o!wh;B(>rVm65XswCXSH zsuW=LN~_*jmZn(8lB`&FTST$S10o8udTZ0FD$6phemm!epcLOGZ=NGJ0@I}ODupVJ zY97SU6J}1%!ga&wgv_P#OHpUb@bDql`YlLm|H4KX^3L1ahPhSMKih_eH`IT(4YgCO zjL7L>s7Bbz0j_k+ZRbk+IlHnd)mmSPA?wFULRE}Tlw7PHKE&4b)iRgH_gmGN94n3w ziX8f|y!F25$BYr{f3LzHn#uYtU z9wz&v8oGxK>pt-a{;~-7G*k{WRoXmdWoff)4`#(GEcK$tKJ>)NRv$U*3bcBU-N{C6 zNp~_T7Kek@;X=iVFimHYqMLAIwW}VL-?x#YN_Wc_}Uo2-&2#$b2v_#f1SOn-mwB59Xz~ zFd$@;;v)0Gyc8D(gltk=WImXe;=+KCO^S=m2lG-~7!a~aagq68UWy9?LN+NbG9S!K zabZBnCJ|R#?Ili_MsIHB&?}nzFPu7qUhi}&oxL#tCLRQ!@FD=$Z=vs>0T|-|xHJfW zv>$*K`rA9sYy_a?&#vgYc>cRzet6=|)6QjUzaH8aU-8YMsogjCZaK(|_n)7fzj@=a zT+80Tk#|0Ej862o+zZxPub<8Xc;l5TC%$Ko%{=$}uOD0pemZGfxpsQcarmCh>yt-w z%aabfrcPd1H2L|G(3jhHc^8~t4=yd3KJ(e}8#4FM6Jbn4sfe~lbHvE<^)!oU|hW)6U}Ed@}T zePQ3Z^aF*Z6Bk$S>;15$9D$p@+;Q^an(2dE?(@%o_eg6``}@rE*LUyP+rIniAC9Lh zi>_aGsi*McOJB9Vdf>`qHek>#Q#Lwi~w{pngXG k>yVdE-3`F4TdiQzGn=k$dTRY4R4$-vLwEF}^@Dr<2H$|P@&Et; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/gui/jei/alchemytable.png b/src/main/resources/assets/bloodmagic/gui/jei/alchemytable.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e27d580be4eb4edd33e14d400faeb733a754d6 GIT binary patch literal 950 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5m^k>u>ph`Yf~eC0R`DhJbhi+AFwhB3hHT15_Du>V0QL&aSW-r_4bZqUXz1J!$bGO z6Fv5HaPu9~eW0MTuD3;&+im> zUN6qPeQh5LOM-vy?R|g#S@h-0Zx;P6RKUr=!JxpSU&#=yC*(5ySd^p2*&duLgE847?81FHIENr-bNz;MB zFGGS&uwha-gAzk)JW~gQ$UnITjsy3*b}C;m;MuJ9zUQp9q}kmB)&LW2MwSH$VGKK1 zEGF-q&s*_B$6?l=2*x?}pMIa_S7kf!q}_=*;gj=1MuVS;ZTsFAbGu8c8z-N<_`O!= z@6GnYqV$IaHB})q|1IU!V}$#dIt)IV03amIInp4oC$hr8>sjc{?}nYSL6^ O00K`}KbLh*2~7Y?w7}K? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/gui/jei/altar.png b/src/main/resources/assets/bloodmagic/gui/jei/altar.png new file mode 100644 index 0000000000000000000000000000000000000000..50607365f417edb968949fcba0cb06a7738bc008 GIT binary patch literal 2368 zcmdT_`#;nF9{+5_I7#cGoQXgv~de^-oQZ*Uxeq9JYHbSNe z>fZD|dq#H#0tNP3#Z{+W1pru&H~Lg?+Qjk{2WvWP46O9sh}v@dwE4bs&-x9{)W0fX zL*eoJ_J-H?{E@JMXz^C*t4-js1BXz-e>qOGNh?hD@g9brso!V&XRgQsC%k#1x7opN z{oDL(6QdWjj0h7q*`lmSI64(Buk>S4csA31<5JsiE=l2qp?bS~dc%#Kkp! zyQuQwq#cIA3f@f_%C*5(vA-$2_Wk>9aQNWh;K5Zv0*mr~Y)N9mrH^>N;CFXVkz-y~ zSF>(#(m68MjCC}+v&=5;vZXfZ0Y2-fD|6|?52?d6GZBxD5IQ_8TfgD?beA^i(26{c z;=QxI2u1eG6pYp8&Fh{fK3Ws$i@1)H<$z`cz}V6laPv(7 zEw;QWF@xS2-e{&x>Tz&(zCdMU(1zx2$Ws+?W&dLr-|oB$WmWi&cdGVHEN+xU*@+Sw^3A0c&pKXeJgmrZAY zAFnwW9d>XCqu*nNrp4nRi!I3tG!roZ(k@^^LV`nfDhX3R4=z36$_GHHF6Y)%L5t9E z#E^G^Ur|pO+Gs>!GGpGLNW;Td5U$0=d&-!t1c_v{*^uanM4Ay@V%PfInLFTcOr}U$ z-aRN{C{__C9#cD_x-aPmxZ{r@k;&7oWpte?x(vnm4$Z>LqDWnLv6agu0Z+Ntz0d|dDb%_tN%D#7R zW3n*-uktMkVqv2E@zSa){M97$KEweVOmi_RdrhU34-#|@d%uaPx6ccqe%7{BNqTy@ zj#daXFA|97;b`oX#Ej9%yR++eI&_>}2y&$fPYNn4=CzVSb#`g*{u{8e&c%*u`lwo> zYQCIap+F*$FU1EG!m6qv^Na<8nt_+6&byV$R}P911VyxPiFzN;UzC(D45|hPb$#9r zIQH^6C1TOwhK|@EWz*JX=+EUiqW@iU3@8Vg?nW50k@naKBs!7>hMV=Sprq>826k%M zW?ng>zh>)1(U~&K{u-cqM3S#XuDFH(bPVc0s0`EV8BPS30*K%&US9T_W=adeZG}4Y zcTJ_JEWQVZk++KYBHrX9f66ZUw3v{N5!;gXsC&Omnz5juT!)h@tQ}TUY7y}JlPE-Pc9xmDiclW+H#h(+R?o;SCeM?|CLS7 z!!RrYr^AlQCngeV%#FnB-K`%-$A}m=e`Avaqg0Uv;8J*mlNdim6}~04u45)z_JGl85=3df3HOT#BGF5N2`ZU(xT4V z$?{E|CtksPJlwBGThW+sIQ)TOC0!@+b>rN6P;^29(E@F4eGH4LnP0NvaI)L#61lid z(F!ZlZPxMxw!Z{i92~_JH9rt84J7|+T1 zDUghsRDAC+bPv970Zb;&)0`;XVYl*yyk_X`Eqn4`IXVf|I5H&If?^7TwnfG})EAZC zW&Y&Tf_Tn-D_q_lr7f+%wfLxfSdfJn=5*gBVBrzv&Z3vuZ(efSc~GYiEA9E>_x($S(B{pX$)sQ-KB!%& zELlzGY;eS|iBbAvtu}!mNwaa->N`62%eg1BEtTJrxP&?X47@aey~@vZiC#!(aF!AGitLo1w<+oYH*??W=D^un^u)fo;&t|E+ zU_fLgv2Now7TlxNBxk6f#tF$6-D5UK4}H&m`h!u&eNAKhPIZ&9?{lTXDPFh@Ui2v4 zmmlb{po?E^iO?(D|2t#*;S=NKr!N-!W?aMC;&j;}c6xEKk#I4Upb$~5fM6if_&w_U vbmD!pqI9~a99(uHuWM`-fkJMQRnT+uWB^$_nf{^*+1(OLfmRMA-8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/gui/jei/binding.png b/src/main/resources/assets/bloodmagic/gui/jei/binding.png new file mode 100644 index 0000000000000000000000000000000000000000..390049dab957c30005694935c91a5f0d4d4375f9 GIT binary patch literal 868 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5m^k>u>ph`Yf~eC0R`DhJbhi+A23VuTS_dO+GxhW!1U46#WAGf*4w)WI}aNOI0S0$ zP?3-6;Ma3W^*Mj)s3J=dhuIC6&vBewpCvPIF8OwkJO8sye3`=SZBwsBmA<-@TEudn z{WI5E)AqA#<@y*{7z7v;u1X)+q_bRp@3qpeGg$viG+bwx|Im;-hEY#c(9ZV6A2tQ1 z2^I`W3@4d^3>zThxQ{Y#zRQnpmXtdTIZO%+W(+^JYaf`nu(u=5Yh|1Kr#yzcADrK5 zJDC5O@PjvDKOci6P-npzlS>EOT)yX@oKV2Lf%8BkZ^D10{)b8l!VU6F1=kly1Qf7> zo%7(9IfMI$%>O&}*d4j9<}){GGbk`L0DaEDK_v$DOoF>;)JW=u0E$TlbJR^mJT_lm TvC|ir9~eAc{an^LB{Ts5mDHpS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/gui/jei/soulforge.png b/src/main/resources/assets/bloodmagic/gui/jei/soulforge.png new file mode 100644 index 0000000000000000000000000000000000000000..d19cf8e7b445394ed0600ac60fcb8d74409a906a GIT binary patch literal 16429 zcmeI3duSX*7{KS6pfOsBDEPp~dPT6%y?xy7-tG2sZOpYM>ZK)(m=vYm+nr06-0hyX zo8C284Js8uP*m`NqWGXy@PSevXl!vI83GXlC!K|j}*x8~8$X{CWN7wKR0 z|00{<*k1soZm~v2z0vG7n&A{WY*wCfk~(_L6#Exg2eFxC&XDn)g(#dd8U3v)7_|* zDw}z2IJ2@I4oSVy3C}BO99OASVwHHzDUWl4s;V3>a-zth5v;q>_Vg-iyNha08h$d+ zHOf}WvmBf8{pvYq%Il3r{XosDzOG`a8OV0)><~q+s+Tw+#&hkAOrvR2nkpB9shI`` z3$O@n&qa1ZTf5SP<2mkxGf&8-dfvb&C)sQ>cH8+Di)}-@-ii$fK^!;X`40f#s7Uf}+J$P4wGMAEA-B4|IM^-P4cBOL%O^k7;Omr(D#%v{lr{ zAy=};Q(UVvG_tv?w0@`Hl+m$ygtkh3{~R+TMO&hFyp z*}bj22Zgt!mtE+WmELHht~4t(8rr;4L3z@2!!Oxs!$0*9rGHj$Yg)LOH8-8dhM?v@ zWIlh4$^^7YRioxA7&X5W*U5Voy$t)t(Rn(Sf>!f7+YEQ#{*)j_!O1LGCy)qN-*94S zki$(s@@>bk+|l9Xq4MNhDCUNUmLEEqWnZT90!11i|!h>*}^S(DX9;r;j0-~+Ek zHzss@9GYpav9di)w)$)IA}^ z&FO3HncDbKzm68Bg7Ha}M;9mf|Ldk}l>l^HKA7nnsqX#h>%O7e`EzFW<&wi^ zf5$AD?y>vs-gVJ|cgG%FFMSd@xM|(4Jx|@&_l@(=rDuF9ZSy`(ePn(0%4f!-aBTDT z$9gZm`;R@pU;4yB^}H*WynpX2#RD&WSm`)|x*kq!0iB=+Ecd^m?gWRntlaYL%a6EA z4{Wk6x$EuIe_#9kv&i$l*s4zL z>JMLk^rl7kERDQwpZe>CZ$5d;d*i9Ix_&)Bu=;81Hf6`!t~Wb+B3(D1#w_SL5(j6^ z?2Pn84(&Y;RwtkPVE?Pkw`cAg0-ZZMlKbojz>f3xZa@0l=1Xq<8Jw}KbK%UsJ06el zM|vc%`I4L0-|)rf{VzEHJT!L| zG(WT^_MGS=x5C$)&y*VPI2~-Z*e=oWAjLBJyh2CE1Etv1U-enOe|%;=Z(L_pQ+qPK z{;bbeZ?XF(jE^VmWceF+Vp-;&zv(LRTO!q%Y=1t|w@(fZooane?mfdc#vOb2mbyyp zdHwozN5_txI}6n>9F}EJU;sLfiGc%y(R2LXy8Aj^i$2S5h|qcT=FOVviD#4LgxD6` zZO}Wl>CM;WJYepF>eAT%Urj6LsY~Cpd8Qc1@M>4z%^b1MKmYWv-?@K(|E_hDa~4&e zaW0R)x2sZIT-@4RUn$9M{_z~M>fo2V>kMZew^8A8a5-}M^5xla-?#g|>jo-5#9(7* z$Cp*`c}9B+BZHbu!`CWVeSQ6A$va>xKH2miK79BfPp;hO51#pqZDEB#g)WQ{>#yJT zl{w@#>$pwHXaD=06-7mx?jGsr`26{EeB9=!wUh3?gV;9jdEoU@8Clt*|Nhm<$jBVY z+WPCQTE5wAmG{~pKiy;8GW*A`UsC7KpBEIg&w26jV_}Zj?3DYbGUYx`FkpDAw(Zv0 z9P=*^A1eNQ1~QQ6zyc;kAX}i^=am&N|d-e(mM1KH*F1HycIVCsHzst<;dr78NmK7PeRg(O&J>-_@%m4VmO&@eg**pwzr9=iu9wzW zyoD;lmI65#I2ycxLE$qYxN)uVkJ29&eynLFbGY6>^cd{CUH@yNxM1Y8RNv50Jw2Z< zdg?UNMiV9 zCALR{D_rcDSi>TXIZv2_xer{uI@S13LX!+PA29pV4G0K+6lK}^++}{?lSq)Ip00i_ I>zopr0PEYb!~g&Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/gui/teleposer.png b/src/main/resources/assets/bloodmagic/gui/teleposer.png new file mode 100644 index 0000000000000000000000000000000000000000..2efcbe9af374b8cd9d5fd027f2e1bf32fa1b86e9 GIT binary patch literal 1276 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 eeK!>|!2bXtv*RgMk*n(V9kbo z1wR3W1wusvqJoG}7HOKMnZ$OS`SATn3glmL_flmL_flmL_flmL_flmL_flmNVmCN?%U#vI>$`_0%3f@??5#r@AW zE*)^|%Lf1~=wQr$=thI@_rJJ&yv@zc*)yQxIPePZNzNyKk?(adImy{e`^;B;Vx?X> z;PUO82uBblil8F->!{6pZ?%w)Am}RsPjd9b_k_KeR=o;9*o$cdK9BYe`Q+2j{@)s4 zt;Lh>3zOga>cNF$K}8}R2O*&9xg>p!GKO}X(uq=xwJ2k#`yR$xjI}gtKH+JMi$X*Y8lD_6jknR4w@6$~ZdQrmYoT`)SgYUTqEfbFLt zYuB$3rHY#Gk)#^wX1FJPO|xF1mnc%D`TMwwe|SO-2rb+)0T1ojbQ!SNY)}t;q|DT? z(z-%7&JsTCbTgeuNj>mcY&HOBM+wzR1%RKNkX<*TSZ1mX${1p$iIpZ%hQ2WfAu!hB zNrzNvQl+W-E@3Z0jBNaE-I`c9r&a@=o^%E`zUT7fxWk-ZA<>$mR_+ zk2rHf!Wq1-6SFDXN!Ah@fte^M>wv-_Wm<^QG%2b-*X3&2v1L0e|v@BpBw-g zRg2x)JLv)7IfA~)^uE{bVFBp~lo@6v9f8j8Euf5n_Hfs4nPB!cAWju`Ru=j5;Q5&L zN39!?rdzDy@gs*st|8D4AF;qL88dd=a3Gi1LQ7*v3_I877S2I4U#Jo9Nqnl;=`gSrKB1j3m8hE1_at6at#YQV@9B}q8GVlEcx?R z#26iWtnKU=@L%lX6Hfq)o&;;UMTdw60jqfYN{0pkJ8n2=iW+3}?hx^Z6Ac(p#F^D8 zAXcwmwZ7*940gG&ZZa-`qE3w3-1FnHdzE)ra)K`&88i7u=FQ0YhNKw(#oDPh2eR4D zC|nb;H`kcRhNaVv063e>6?+fZ2F~(?6mSoC47{6PPjY#feC)Rz5P-Yq0&W*FnMEV? zzL#q^$9W<3hUajlKQ?(10INECYG|0s&^Mu@+r_eqU^jor=s4-67Whz4mjVBJ8hlyX z`uf3CtJGF+$`W|h0AYM_1+Ttf>BYRN7&cO)*IC&=p*h+HwGGB{00000NkvXXu0mjf Dh7<^_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/models/armor/sacrificearmour_layer_1.png b/src/main/resources/assets/bloodmagic/models/armor/sacrificearmour_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..db260f2fde1a3707587c42f675de9e11910c57a8 GIT binary patch literal 728 zcmV;}0w?{6P)@^zd?Z6SAB7#n_KktRi>Uu>Q_SKsKK?gd00Sw{6HDXU0 z05HE|6KvG~%fFPm6Ym9_4YI4bQh%4%fL^a6pcwY^D>f7A21|JGvq8`SLwL%@Itw0x zjXD#nIRHkT-`9wmH()&0F6L%!LSdbMX=9H+R@Z=DMH5@UN7wTWf3qH7;9eJjR-N2} zUDjSb_lR4Gwu;VoGCoyZ1K!?0EA}5$$t~D4ceD`i9wSTPCnI_lO&F+LA3nv_^&eg? z@?zS*xvo)DS;-dwIC^Y}BbT34HA*Wkg4XaP5z`=JWg$JYDe%krhr%l5pXpV^z)%;> z9W9LXSpbB>I?vKGT(}W|X?QiYj9*h($}i&q+KwL}(5hEG#VR%+6xNI4frx2f4Nn4a zXQ-S0E6)YM-3O-`OJ*QFvuW1ctWCr;$Sv4_AD^c3HD6#I@M$VQX|7Igf^M;LjmTJ8 zq6w4iyU*oOQkr*jb3E2APF!pwIk;Sw0)4ledH-~J+Z?XBtMHFi+l>-;>`dx)*`BGM zCJ_qjq~9FE&{V#yIjl7ZE*<{#M^(IL-vX{MU|S)no+c4Zm|Tl50x)<}XDpeiy7;Q! z15!Or0@zlF8#U2{3BX97^~-44)vv*=HDss6*W|5lJk~CDa?kIyf)uIk&&Qhp0000< KMNUMnLSTYwpFCOs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/models/armor/selfsacrificearmour_layer_1.png b/src/main/resources/assets/bloodmagic/models/armor/selfsacrificearmour_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..98048cbf1b7b8290cd5faad4e21ba8267f4cd432 GIT binary patch literal 1324 zcmV+{1=IS8P)B$e1V;b>1i48> zK~!ko<(Xe>Q*{)_KfmqvQuc>#b2mdaRx#Bv#fg$MqAVtK382#v!@?eX;6Y=3ATfqS z7PA<#7!2tXCNPsd?7@dEA%+Ibc%X`D2uULf(*Vl~+JOTt`*WG2qwVLk(J^n;_v? zK3|_G<=>Q0FFHyDXCO>_pOt7BGK42lfvO6jZ|-_p|`^W zfYoLp;MemXfPQB^0lyBA0z~8PIzIdG8~|UQ+>YDjo8@D7X!#Go!+>b(bP&8cil^to ztiWGxzX11pp2o zX?(!IC*lm;H<$n`;McJ`G{&y$Kp915mC5NaQJ~1I0>tm-eu?E|;C^R48+X>>I(R3g z1UkN`=GvKogx_Niz(N_=AgaDAtI^CVe}^K3gk<;nTMs3!#}vZr@`;Ay@ zyWfJ_2V;j5M66Zq~%Mc$V{M(wvrk(-Jt7@pDziW!bYvIC$XA4_L= zN~gBilK&;Jpx{kFWQO3~vG{(OPl05G_o(VET@^k|5h9`zz)1V^>I@SUQpOCm5zu5| z%C$}5LTZaGoWDC3d!~6xWHA7cX_8oE;;*3+B+R&oigFoC$Z-*+Tq;sS5~Agw3MPXx@9~dJaP0LCPkJ@1r3#h-j)>q;MGw| zDpmG2pOW3)R)SYYY2Wi52aay0dP5D@&J1As8J@D1@a#*a0GZkIG-6q2Kv&ZmnJjkN zIvt4s_cotO%;b!K(?HdH3WuHAU!*iY<5uZF)AT`v$SvELd$ZEnwUO2;RPz z5=^FcPBS1$0m@`0Xm5E2pL-}4V0@pr7t0u7cWC?>2ovz@gjN*F^=nH6z))aPs*(F* zDca&iYlQlp^;B6^e4bzejMZB{;M^e>>s~E2f)~b{HMD+L(;7y{!t%APRb06+E�c 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 M07*qoM6N<$f~-fc00000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/models/armor/sentientarmour_destructive_layer_2.png b/src/main/resources/assets/bloodmagic/models/armor/sentientarmour_destructive_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4228a2ef00971a3823a13c8150562dcf6619e77d GIT binary patch literal 2071 zcmV+y2A9M5G z%jhA=-42&4W=Jj_}{DR+FyS^wuen3_NF!d$I{!vTWb(7AJ&KcJ5O#C>T z|EB{}A45@-h$Rwe42Ka*B=GPfkAN2>$ZsCQGm|m==DXhm%kwz!``^N{EC4`bI80t7 zcYb$ACuu(wdAqs_a04*9sM8nO;w3cE-BF^qWuBHMd=t2h2@>=y`tn$Usq9KK_{3 zb55LmlQ0z>zd~4YGg!`9F6IHn<_DzaR%ogMOV?l-23Xf*T}^^!7|<*SZeAUlsz9G# zh-Mf(eZ+eNc5L2M6tKqb9?$^>mTCLTiq7VuwCyO%u{rm1EV@F+{v2Dv%EbnOY zE*2K@*7qoY6@xIfG+MrJD`I0Z*=TNYK+@GD&Rw`v5kq&a`#LPc04GW?^)w=<&s-P7 zovuy&?TvTP)!hvM7>h=6&)Tn+RIo<@0MLAMFJ>;E2Sw9h#bBNaG*y9-PN8GvDokA* zsW?s}lL5^zF!gjhTUx?0Z^u|k_VdQ5F5J$R;Yz(=vch;7EE0_ z4_!^dG7RWy608`67+!?&v+si81>2?j7MNSpx7ucCt^NGP-lZPpSf&9k7=o#%!HE(c ze{7FOX{;DTfaQ_RSg=f^?2UZVlBa;W#cjAYIRTnsFn%rqh8OY_kh+$D)VLVwJGO80 zG(7v_5pq5?Rl%|e8Ebyz4PB?6+)LU@#pzrHGH7}=r8(^JnCZ(G@}i7o7{p^76--?m zDHw&^Ogp!}g^;(J+y+ar?+*ZAOSHh|OO+Wqg(hpkt=$T6Of)toFMv|wo>8p$ZE$%< z6ObGKD+R#0qO z^X1$OKNA2B9vv+BazFXO4}Ir6)Bge@!$au1?JI~34;8&g-RNvH4}j6}nUcv#v9$Bh z;eN7_+Q*9quu_5P)T7VHg%3 z+Vv~S{qj4vKMF-nA~HOL$nX#VATm6JZCkdId;7L6TXE=cKk0MAn3MavlNh(6+P+s{n0otR0RLa1rRUH@^nflZLxZ%mr z)yaiW#BnqX-9o6|W?zyx0)k;$NUA!5B8zZ?09lUV^H6G9TOE_+!vtsqMHa0sb{xOJuV zSWZ_2b-JRg9- zGq5sQ=(-Mpw>@LWgItzjyb5v8x9=hD{$*8-GM*@q8}ps>?|49NF-!}`Uw)Oa3;_49 zzY~9b{#i)%JdV90!#uMOn}7Z%@H~qLH+~H#PM!8uhciF7?e4A1s;dBpVE}|>B2C4c zooSktx4?#PZ^T`RIAXK2Xl!UeY<3n(QbVwgM|R{n%uJjI%ho{PDb$DRv7)ydD|)-p z*wBCt^IqYezhZV4tv4^j1^`APUj2JOCX+!bl>q>xQkCc5ZUx8_Z=t8X1>t%DH+9!z z=f3?2Ni^yt9u!6Au>Y11>vr47g{VsbcT^RC{{cI^st$dJT(bZG002ovPDHLkV1g(n B)x`h+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/models/armor/sentientarmour_layer_1.png b/src/main/resources/assets/bloodmagic/models/armor/sentientarmour_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..79a2b1db59f118b331dfedc06793fb1972817333 GIT binary patch literal 2392 zcmV-e38(gnP) z0B=qzN%jB$010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~k#HDJjHFNp%1K2<1sc zK~!ko)meLNQ`Z^)-8gpa_&VU2U>-@Z6B6-k>#(#82rFe1)qv1Ost{dUt>Uq1Qt4Wu zNn>MWRimyHsTA5W2x&D?%R_6TIE%CuF~U-^@ru<@N8%C1ahwE)7-zZHvEv)(?2qen zxV|`X0^^T-|J-xF@7#0G_dDO~oXa5vWzWtf01%TT==dxEKvW!rMymw?-0Ssmn8K7c znZa7U0b0EwfoIOO6LYSesK<`QpK<`iBndG|0su&nFr-NM0lvRQ2bAy6S?~nOu@xn}uWtY7^*0mxsTO$5`8TGpQhBB9kz7DOEgSsIIS_?G zX!QoxR`QKAtS}cWM1H}1@L5@Cqk&Ku#EhaP5c_%{3WM_acw5O=wj*NV+^J~$ri~ox z>dCh94RE{Nq_#iEfZ4uj<0D&Hx)cc`=xt|tK3RMEQ#Keac?b`M002gN9!ORgz3n&H zn2EO4bF0l706320)I0!a92msyfdK%(w(?~VKx|mf=l(Vq06?E@fq1VM znX_`BGn+7Np&iD#bHR<8(09HW05EgS3S<^cN2t3S#7Gbg3J~x0B2A}7i~5Pkx)zY`j}GN z$~PqJUMLj0?*;&hTW=6$zpAdD&@q&s49IZ-pm{#&;xGs9Z)?!_)(4!mXfcV!t?|s# zCGg*Jb2+vmV$Lsw*w+Io5@z**vQALe5)<)tC{w}L=~Xb9su}nxw)}`qRJVd5NH5m5v7F!bMk{{stFDqI!c{bcV_*;oKg2!K=r)Bq)0 za57+wW=o-l<`S0N8FKwC>2oo-a=@ED$ zWHejgas4M@AvVWyLP6ltwct1onlz0JN^Ari$6+)DICO5y{KXLb-7+B7S@>z$)A-^} zKdg_d6xL)Ipvf>ySoxtO1x{ELm{p{4X-xTK{Zu6QyJ51Kq@L;{XB`r7n5LGT3te4 zZQe$+1v=AoM1=t~IGr#Vc`S1*#b_)BS8E%Dkcjo=GrWEf!1FNDcD zmmR%zrs)ZCb?|;D3mA`-Ri7rqz!anDkzSA(cuT_K2JiR~>*_$W>pGe){~JD^7X`%& zAVi}$dZHS+x%p^tIuk%pR;=`U$<{NT{E;q2$GbPA)Zla?Dhy!u(o$&k2IQBn2E8Aw z{qpz&?=-hug3sqgiK7%Yn+-WOJ4zg-@cF!GZn=bmhYq0f{rA{=)b}3tC7W|RP@eg^0ViutqxQ?= zkRoA-eLYP1Gha8bpgMTR2Y;Ij7T$p4hd;$k({#M?`YTxVQU!WA9rk^E06KjJg5GxQ zd*|H*z-!N*LnIP`b&-Sd_r3Ejg5LHqDdu6}D7thS6+c!SVCMRgfZK z1{8GxAsj|Pl5k@v%+guk&=5kBgh*rvvEi_M^%g%qQy<^|yWg{FHRx?;rMOz25`gBG zOX&1?FwbUV&n*?30RTr&R0BYQ3;=e#x)lKMkEU}BWts`DwR{I5B;wh!l`!WQ!ZLp` zo-JF6#-@vMq%V1r1xor}YvXxnbQu7EPB8@E)hqBef1BW1G^zu@KmTT&(*Vb+K zWm+vX8S+h)T0SlS>&n&wW$^-|L}Y=f)8oO8SGPh4i7**?HijzR>G5Do#b)^16Eqv9X~neOh9 zj}GEDfBXYGhm0pr2>?|_xy!}&Vyq~62FYYp@nU;1np-a6`ppgqA(1Hv040u6ISw2- z#4L#hItma4ObCf6d%6Ug359-wFV@ z>^vp^a?3B2uh#s%sQz;`8{hcVv2o?&R)VyWqb5iFGw5xHIlmA=Z#%2usoyH=@L#_2 z0#ju7n{PAzFW%b8Vn(OOgCiduWU?d2Pq0)+fuVCyfGAHLgC_e-bwuWr=XzRJ()^w5 z;&QCZlVm5xH}=Sp__IHKFlO;Yf3T>Zl)k8`d!#z0V)gQI0r($ePG*E|{ku>A0000< KMNUMnLSTaKt!#e) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/models/armor/sentientarmour_layer_2.png b/src/main/resources/assets/bloodmagic/models/armor/sentientarmour_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..184ad5c66d58c5da43d74711454f217a9c7cdf0e GIT binary patch literal 1824 zcmV+*2jBRKP) z0B=qzN%jB$010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~k#C3>Dx%IYDh(UVTAI;*qaWXH zdK-+*r+zNDIh(0Hz*hQV+#csxIdl(mBA!WD{>D)gNu`yNO^p1YaP4 zGOHE7KmaeVUJV0hhP(3!_TKQ}gO^?bYcOEv#~(rv1OPyp)k-#^obRw#llEh-V zDF8hat2L3W^cIMkeVQ_?ok z0@48_)u=cwAAoh2ZIeN>dH{gQXqE{V4F>@L=O;M<00JM)dL-N)H{RdAO;ZcUT*vc1 zVp1RQ)32%8?Qv(-wm4P_rq+C_#8x#fA28H^P4>RKr8T2jZrLpNIqe;tL{pyLD@03D z4d!x|Gx>l_^L1uhC8FUV1U?EO76U7p%!fmu83r_~hknF5qTwL;k%ef6!R{9M5m>u) zNk+iR98S@DO}nHxX1>M3DG!2&d0o$V)@d%y}9@EC#*Nj5r^G>%_@%X}DS<)OSaJM~%Y) z0PuP|SXBQ+RtuI{007wTn~H&pXF<_4Sffd01<`O2vB)s&Gaf_V`7?RPX(SS$83u7a zl2e?QYFJBydk(jeF`~fIwyXdI`>&H1n$^SSy#SUgMm)x&V#+l1T{sIq9D)#wfe(kk z8ci@-C!+V%A7Bhz%1hUcYHoJjtdxf8Q}5HKPLWxT5RXA`vLMb!pf{SaWpk6v(paMj zI@W+>LVysD8@DylGe<0@!|LGNi77z3xWfZ@Ra%w-jbgod(eP`SRPvYM

      AaB4_K0x53G7U+co|cAOCr)OJvro-@L^d}Ok84_( zbPUTCBOLI9F>o08`!CIncbsy=?Qs))+$m!&UO5jsxNy})Ogcdr0-7vL7P?PWBMmCIq3(v?@v;?fRmjlZ9pDzF+ zNf~RAf*_4DB6pB|OQC&bU!estgImwiE9yruY1X0%OR;>X5 z?Argis!zH>LZ&1XxKQ^EI!nc*q>|$+OC}z$e)C33y7_gh)*u)T!PVUbS9ccxz}4M_ z#)g%Iw>LJd#DPQ2q)!ZEV(u?ZVx$)3_M|iy4GzJ;nb7JF;EdmoA{_%t&*6ukzt5OB ziSuO_B9o@iOp0DwJgd@dO+1^@I4$r|7)#3$2@RpWqm$A~PNbHk6e^c~v0MoZ7xd1N zDzR0mEI`QvvM@CYx3OgMF}c)RU*8~if+`D0B!Hr#w08o^Z18piaLbb+Wj3hH)bnMgu@L}ZpI%3N0v`?$R>xVa2>SX|*;!BTfXvDLABxHcl-g@Zww8+zXz%Exe1QPT z0GBUbhH~pfO)nhbqcE`gv>yMC0HBNlW4IHfq+uq)N0YA8CpA6r^2N(wVD(f!VXE3% z*rTSq1=*U6N`Bq;4R&tdp-ELoNKn4qyP#1}|>aT7{0!S29&>)!-zvcO=rfTkeRey+c+YVC!!fd2rl$)Q*OkmjBM O00002cA``cbgH7YuIF9Z3we#)| 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 B%*+4) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/airritualstone.png b/src/main/resources/assets/bloodmagic/textures/blocks/airritualstone.png new file mode 100644 index 0000000000000000000000000000000000000000..7dfa22963dd9a26c6a440287f8b52ac90e58de99 GIT binary patch literal 1621 zcmbVMX;2eq7>)=XAgHLRgE-_erwj-MRPcb$zB&h76Jw`g95u##eeui3m>vuRQw#7 zUZi(vfX$v>MuY6K3?o@qNTL>gauSs2#aIFdUV43R^_51&<|Emq8c zYlpSim5Og;7#9Y^9*;-pkq9Ze07g(0g+*dmEEcd90(YsCA-n>oJ2t?812;+AU5uS_ zLViZVOqDPyKI`f0D>z(w{TpJZdpJ;R$Y3wwf)Swzb~ya^8nSjX2Jo*NZ?$$COI-jq z05?@alWab$u>mj}yLSuu4Owrnk7+xb6ru>H$Px!|GCEwvXHSF{y9E;?gc6WeiGY-# z3V{VkfdG|=WCE+1B&-spOsSBV13YiTBT^AA)u0NIQYJ@`G-)a#6QgQ{M6N}(YOO{Q z!0McChH#P~plxThhq3Z^VlfR32!^7K6jcmo4^)ZjQ;7HE?^gL`Up7L=AqdxX*PY|&*21>>2S5tdo9k;;p|G`JtNzT z?-l1&cct1V?U@0^bL9!~4Zzemw&lW@-VdKgo>)3%K~_lHCPSFb*t|Zvu3fjiwypa9 zmB$ril)cG%4;|dG_}tCGfdOT8f2mMsNHWc@>)U3THab5TSEt-~JQfaH)M%VBft$rE z-7#%-YV*S0h^4+`>Tg0@r*f(epSEB-&sR$I3dJRTS6kZUj-HL_fEA>m;`*sxPF07d+qdpj5b0S-scSAc|0DAGqw>u=?Fp$%4@lP!+SV)UzJwF`{_wyetNBPbH_6Nk%b9VUGk>~e~-UA zukgobw;w#}Ey)`HIHi{U&aw9ZXL3~6awui_+85UzT~ggIkJz)dqGC|&YjSKd9h{sV z*YR!Ks$Ibw4Vix=Zs0|aDSY|Tgib&rrejGRnKj$OxR!DUl3GSH?Q%| zi7DlO(c%*A>iUfK_4r3;Z$0gJnin}x!@ZSKrK}#&yK9iamWhw;u8&iys6&U2-`!@~ zo?mh9>Zy{P-DA3EjjY8bu>}$nFAPtd>09FP{Pv`)f8fhCJG-NAdGby)7bLwna~m+D zBUX`ZQQ_&eM&XA24F_kgDNjBelU(+*JGJHW&x)^BUT^YEy*gXcZ=CyTUCb6wj%vK& z!39koRQDd*N*6r z^EeSnCo{S~5pG_waz&(`yz{=dZR5tpHK7l)mi?`$H%DPlk8u-rQu9_Ok+`x e8t-cfir_$-t+qo)60Z1v^t!YRyeW0T@_ztJpJOrr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/altarcapacityrune.png b/src/main/resources/assets/bloodmagic/textures/blocks/altarcapacityrune.png new file mode 100644 index 0000000000000000000000000000000000000000..03d2effbe4af4e85895d6961a29e572762b45fb1 GIT binary patch literal 1670 zcmbVNYfuwc7>%(4qF8khDL8fsXc0+vHxH5xL>jVyu>>##Nwo-@%?(7{Y}{-h0d0MC zL`92qM9_+YmRjwo6=f<~tyN+00izVDTG5Wh#}KPjTL!J#je_kD#~3N0G`@Rn*gMxh&-SN zgxS5Q6~ys)!xvc%M%JiHQIa$zBD^*t7iH(rJYHP9%TAC5fQ3vT&uUW%?jJcWfUIVf zAWNo0baoBMx6UkPKt^$@fh;Z{F|#0k1{CK~as(7$3CKk)v^kV6mEZ-hlAC+CVFC2Q zge_1BUOHver9&E;0gy~26OxD+h2)qBl}RxajfTVsDuGc17GpvbRZ8VbGzJ=c1e_XU zwkY*@(x4W%QVH@|)~tNvu~^7i2pw)4OSptKNB9r}4jd$7 zwX;^*26-6?6YXSG0?yNySD@@V-78|7V=z!$$Y2*?hfxs%QqZmJ_P1s_huolA?J-Ujj?h`Ar|5^>7;;-)#54vcOo)d%}Oy!C;(}Z z2uTSh7n*?-2r&sF6Ix6pVUZ|g3c18I#Pd45S|-&^XxdH<*gd7nJ z;?4gzbTH=>?5&gk)XmTqSB&22t1jRculfksxaMKFE-^=r4&d?ld$hRP;JOl_*Ubzh zf@`i{+X@OTEnA&v{U@q;_*!RY;_N_OM(6IduArVL zrF#yQ{y1{QR$_mL;*@Sojx=N=Xmw_vJz%Vy-Kj7IR@L8C#Dq-I;{+7LDQv#X8g5l?rwjU>OojJ=_u6@k??&(<|pr_>vw zE;oj2FP=FQWvaQI>?2(Yt>jq(#;;H5sEcetqPwo;eOOtauMazsyA)vSZyr8ZL9i=N z5(u$76P^?_ciz0>lGytC%7ohVFZI{8o6O?cqndh6Vg&!G?T;dl7xwISh`wG%#@Dt5I)f2>bUvAN>}8 z%a%{J)ok-E+2wIh_K(CXf$dnzME_5JZ61id-yTpgpr-m-x0u`aVUM0Yz7l?FnD2VB zp!~0XSzMh5DR=(DEA!wThsp-h>i^DK)#leD&Iy>XHc{=jEO>a#*r;vo{XJ=_?zz(g z*X)?ryLoSI-#u0tRB%W8+N7!sKehMl)Iar zdOR(yHV7)f>p2?X$Die{S&QSk4q`-mU)7YQ7Nbw&rKgs}*?h!jWZ8RF zKjfZEL4sF)H|H`_N>=%#oU=6S(nf5C#-$9mHqF=>9o9rt?fRxG*4LVQW8nQI&ChDX d#y=ks%!^u9G<^ZZGkO0E+Qd|RZ$j?!e*pi~c>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/bettercapacityrune.png b/src/main/resources/assets/bloodmagic/textures/blocks/bettercapacityrune.png new file mode 100644 index 0000000000000000000000000000000000000000..29a2335e3c6c0ea9442e99b196a1eca9c9e730df GIT binary patch literal 3510 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/blankrune.png b/src/main/resources/assets/bloodmagic/textures/blocks/blankrune.png new file mode 100644 index 0000000000000000000000000000000000000000..df6232a24c5da4ee64c4f0b6fdea718373b18df2 GIT binary patch literal 1524 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/bloodtank.png b/src/main/resources/assets/bloodmagic/textures/blocks/bloodtank.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0348df62e99a88804c7510cee39157e10b3901 GIT binary patch literal 911 zcmV;A191F_P)|75QV>p%aN5kd%*Qn(sdoGimFz^ z8}_gIp?a3s}@3-Iruc$$ap+vGMS*N^&k&oW?Wre zp{ke}rIadrO6duiN6s@6D5cPK9k;i)a(sMjr4(6PTLWM)7_hjwXh6+2##l+@oKe;4 zA1~c3P?z@PJe9>_qP{AbIwdA6V}()0Vt*PPqBW@ zz3sdVu0YLZ4iCf-0wDx)&XiJ2Rb?8`%uI65bx@5)Bf735rBq3I2~tXQT{k-ce>goo zHP2pE?J=fQm;Zc!&r(Xf34yz>Us+J)qG|Z!^0F${FUL#q#Dty^AZ{oh$4e;@M7YnH zfe5V`KRlCs9uLUM%8HFfBUH6IyX(68tg77J-tx=m&wOcHK79Pha5(gmAtG#UZn|}~TgKB010DF6THFMwz2@zpuXNM%h-Lz%5x3}v7{fRh_2coKyQsVdb?-_-_f-2dJ z#*E9h<+uI)$3Vb>DqCAy|LXdAMsf6gzMK--j6bK+FAoO9sS-f_?s=B~S%I$W2qB;% zoKGekTwPJj_;qQCp9TYBjKmn(zqt6v>Cz)OHv!)TZ7C!XiWw?`iqM$RG|iJG<5#u* zePJHyD*?aD0W7D)ySH!Y%=j)w!Z$MVEc>qa3&~u|$lLHs*HM5UQ{wv=5#VMzkeT010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~<*EBsiVuTd)8C0|QA! zK~y-)Et5-&98~~?zk6?0S9f)Hb=CA_nvBtrjwnhrK?F6M9v6Z?z>OOP1$7%YK2QV~ zCgLujTX7@)0C5qc5rrTaQL<2HCJ;$?7)JY1U61anTUEDQO#Z;(J0ItW(P&fy2m!{_ z2q6#x>KcqO2qAzPAtX>Er33`V7yv8)-}mYDJj$|UwOXN+WOMTbWmzJGAWc*9JVWaO zDJ7jwhs7c!NfKmT*X%rSKZl2hBuPTQAMoDA5x(!Ux!GsEUNamHdHvFeEX$BmF`fR$ z*47E6lt?Kh2e)qFd0l)z;LW$s@%bk=dH%IiWLb{qd7OP^i!VO7&PyMSh~pUF@1eCu z2oSrwyS3+a(OP3!3dd>k^2HHfzH^NiFO66l#g%t|;Gqjo^Y^FMsj3nH*L9grXGmiz zT(`yhmtVkf9BkWS1{6iXS8sjCk01UF!2VRSu@TVk_gS6aCW<1AF-RdKolcjpFYoil z$IsF0^_c03sxq|OZSq{>I1T3G1&(dwc|ErOT;n(vLV$#tIF1R!CEt9uht`@a7rrHU z^%=4(Ln+DrW2fj}`-{BLT-8(B?KZC41q2cV-R`l#G+j}a6|U=YFs=buE+eAJj7Fou z?c4t_5xMrPY6jp&{StMz~>AMw2aZIPv zVK5jFMG-LB2#MAj+ip;nC6mcrl#&4a4?2TlFp-Oa1ONa4 M07*qoM6N<$g382)Y5)KL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dislocationrune.png b/src/main/resources/assets/bloodmagic/textures/blocks/dislocationrune.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3378e1fdda9dbbe5c4aa83c610a5627bfa38d8 GIT binary patch literal 1640 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_d.png new file mode 100644 index 0000000000000000000000000000000000000000..72216cbb3c874fcd32eafae00aa24c7d1645b9b0 GIT binary patch literal 899 zcmV-}1AP36P)b1NfWB5 zus}#Gfi+UMUGR1+Sn>iO@d`*tttv>G3yEVVjx)}9F6YdgIV|{|;1l0{dt%<4ye5fz zXx(yf@DkT`xxZUd*9`_kFOE4rKH}5q8AVl+4u<^p`yXiCA>O_H!APap8Kr35akqM4 zI!;OY32oD2J1*H%PF+hp&n5IdM#GfH?1?}BdXF=kO~|q*9@ZIA7%&+R!Lq2zigb{$ zT5nKN5(O?wHQeP}x~?NHDvGkkiUN*e!(41%-sOB~lF3Vb%3ob@JWe!Ha8Em#hnfpnPCPhy%zvs^vmc{bMj zkAJhtw|KTiRh9@Lh~o$)6=4`K8m1^&Ga08iw!?I1$Y2m-0ZKJkNzzAPh~plvW6>zd z?cxq&I=0(_vrm_VVMI|Yl&o1U@433VLA5Q8Z6m&Ub6{#I>Bl|d$VWCUc~Q}iBb4rV zc-Sx*4=Bo-PHV6%BF{w|aBP9|)4R7wDao>oS4YQ`WyS4c$+Krue*WcGjt*b2I~{TS z>T@j1A?o=ksThu@C|Tp2U;GO~kftdgKK?`7G<3RUTa=8_gctiWZstpxwnGR&2twb( zy}ZHmJe(}c*xj9RJD;NsRFx#~J+|c|vZ}F!!1Fw8$3bgN;0G9^sjHIv)f&eSLayfv zI%BXb8{hY->YB*+xX*IFI6lM}L(>|RYREPldQpJUn!G5nimGNhnb1!X;?QUF^n~L$ zB!iUKhtE;6rl@M-q(?vLVLFXeEwyaen@zEd)?8d&lO{d3MaguWGM$WAKW3~R)-xT`2@8Y>OyR!+~qGrBW Z@gEGwgoNv+7Y+ab002ovPDHLkV1kKVnHT^7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_s.png new file mode 100644 index 0000000000000000000000000000000000000000..c77595ab92980dd13b2c289d205c73847186ad4f GIT binary patch literal 876 zcmV-y1C#uTP)k7R5;5e(z|ZuL;!%{-}a0>wvW$oocnHoaErD; zbS!LvXz1yXsChab04h2pdK#oGQlKCtITznfY>$0BGZgy_-{*b#)pzdZ)#q5}kb&a( zq(BB9B1)KN&1SP9@O)NB1+j|Q?Y77;=J(%z!<(l zuRs2jPzLl}jqf`yF0M$D7?|0&6-`~U%$Ah94N`=3U5k_fZL`7QBldMg)0Rk~P%0&g zLOjpWbLmfGlss!IxxmkHzobhA@1(}!dag{NRq{Zzz?{;|Cec+kkV0B z|Bz)Xp1VC+RuDxIT6Z`LN~L%oTz}zI5)*iWC|NT04SF0`W*_ilZZpnQ8Yezx@0Y^P%I-n{PQjJ;PZ`5JWiVz%xvG zM7+KI6KgHgG!g_J>-9axILtf{%81vmzoFe%Ja;X_Fkt41ahy>~;qVYilCa&bndbx9 za>dZ?=?6`5w89TU#_^qd6h(C1GoCNFxOks9Nzr|WD9aMxb0l#>U2V8Le@U7S_(8}t zb`-@WP1~YWNVd$;TC?A`7&8M0gf%1CGROCQB9+kV5oZnidQG-0SY(TLfrgemFOWjg zG*3+9fRGaZa4_`Up5v1Xk|f6389j~&KVTXMs%nc60jt#sqaMKXDT;Iaz%uF{KTZ^m zfWPlHRN2YFtQrYWaqS7<$P7&TF-I6Hrd_sPxIZqyB{{F1tQ zWRd0geu%XbqwWz>5Jd@|7a&5#d@%G~jWrWy9{C?bvyQfx#(I$e0000JH;_vHg9-p2No|L>Smn=SiX0=+e-S4pt1Ix1L zwA*N{+3t2sXEU-aV>lSF&vROx4u4)>BVKj8OkZ9|)0Bo%RAq_VY*Lja%J=y`nV_U3 z3IgId=5abj`aYBAXAB`Q55kbZbvbUeXf_%crU^iv=iH4(2-_xItr$-x^p1{bHX2N4 zGfui)sB6rq*<_n##OpQjYDE|Xlv-0;7W<;WbzO8_6NMp-AV4?{{nxMA6$O@QVkXNa zC2(?lj4K4C)(Fd@(weBzK)Ehqv&m_{PgU21N>SG}+sy{kFc1iVa$TybLis+@^B7O3 z%;T7Jy(ZmkXez~Wv%#z?zK_Q|FBX`liDy|DKfQfhPm=^;nzVudDJ2zP)-_pKvRtq6 z9S0>Pz7V{mDMno*rR3G&A>x;hA1RB1`C`Gv#RX4~kIdtk<6e(HK7C?181Tbz$WgnE z@B4&dh_G$G+}={=ImYiFKGY}uKEkrlb_p{t5sw~HeL zagtzJ7D7r%r8T$r_mowI2Ergo)+2=XyEMvdllVur()*M6;JFPLZqM+C9a@z0Hi6RQE zX$AqN5S(^8Xss!$imI-Of&ing+2%RPYK8B*m0*Inn#4)MI?Fig^)P;Z_pTnzW;8sHKuVPBGLK^lz_u)G+a}F2+RY}F)&!o1=emq% cGd6k7|ItTk?ffW5I{*Lx07*qoM6N<$f+3QWCIA2c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2.png new file mode 100644 index 0000000000000000000000000000000000000000..639abe9f0b71621f755066f2ae822e71b5189a61 GIT binary patch literal 798 zcmV+(1L6FMP)LWM(BziMOqyeIN-p^s?ceC{Xxdx<+&(Hrzgi%UDvhn5Cj>e|NQ-zzxTuW#f9(t^47s&@49VS zcAO;rZda5f3&L)%R~E&1JdUHN*XdA7-@bo;e>Vyy6DcCZK`0C!qbad$Ckz4yq2}i1 z{lmkQ5TI!rn;y$(MybH7EKQXq%^Zw@Zk3F!$`SxD8V<#})-_-l#@%Qni2~4ch)@`Y zVHio+bwyDe^#?3xCFh*47Rj73HVdQi@b;HCZ(2J(qtr2B63yJTXY$3ncgrkW+t_%q zz5O&#c6N8ClOQjc3E}Ch^PCkV2x?hwV5}KhkuyaQMFYZk7CX3MI`-{gP>TXk)qI&< z{`ap6RKr1{qC(Rg-`%aMT732E2LQl|^O9G~MIzLKg>gcN`+Qy1^q3G;)AB6S3^R>q zXl+gT^yTxO|5B0VD31I6enbegYzH~pTU$-fdrE2N`_1{!XWec$B*cJF{QBGPw&Ub^ z4pc=08VN%kfHYguMdIK_MyagG^I2>obZ~rZTb9B(S5(k2;m!3`T~{Ww5=tS)^eLfF zsiH{fJTVQ!gmCg0ENv-IVw##k*%CRGSw1gDc^psZe~-zBcYhfagTO0K z^?Y%rb$fSr>wEsq`@ieD_Cv2Ms;lLabR=D^sa84&J;s<2q9Dbx*op)N(kAa5Nrk*;+Q&T1_USt5-`vI2;bt zG|<4oI4q7wJG7owtE#GW+tTDyvb?_BK5wh0Mg|Wb9;H;#ATUj{P(_-qDK|Xdp_G{> zo6aWi&39i}Htz`;#o>0nQ=+BJcusQw;)ZUkH38D;&Wqf9b94s|{o%*&sYzSiW!voZ z*=e`U=jUfgvG2%oxgZ3J;xvtCN&2K^Yg&vZ={ikQ&N)R&fD~o%{@u=U%&zPI`2A1Y zF%b;{5YI+I6m2&dP1DqNY$cVbrIO0#7Ix@(HU%060i{ed5|H#gY3eGBLS&3-p*`0F zLLA3YQge%oTJH1Q_UuN~$KvR^&Tu%`X1k9!_w=|gOwJl1wNlkCzkKsug12zmeU zfphNp?rN2=wdqH$f8pb3JVZ1m(;;PaI*$=S2$Am(q84Eg#%GhR?c-UzSe}y(3`FDg zmoEq7FiSJhG(}l7Wdi_6P}FjH{i1C(G5{q1+&z?Kd3k*S-~RM<_VkPl{lJq-y1rc% sf^)Xd4whp965F!?iD4jVVfF9kf3TWa>h)N?7ytkO07*qoM6N<$f@kt%`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_d.png new file mode 100644 index 0000000000000000000000000000000000000000..9d3910af3955711ef11c7798b5e015cdbf5a920a GIT binary patch literal 760 zcmV^fFr{ZRj+NU`4s zfBog>#}`+}^uDSq&*O~I)59qY0t;-MBuSF&celU&{>O`FPkfKOe*Fr*d;4ZoY84A( z=KE8&Nkk9^deRPd%c>rRkr4O#`u{gS{aBQhHX1qDiNYYuOQqC0SpwwrUGH<&G>sZZ z&fHl~Mb#n%%c`#G26bJ}2>$-nx67qa+5i9uA$2>rl!h2RLVM+_2Dj^jRpwM7Ko+rIcwS>Jr#@+bjk}^H^f1G*Fgvu3$8}xc`RNE zH4f`U4E>mhg|Tzs^I;f}5CQ@V02qfp%d(r>&j46G>9Ukz7(V1uN-3-6?(-d?gt!j; z;k)O-0*mr;abzs2ea7VO&kF*v0fKdRS6~nMtPe4`peJzm-ks(5L&HL##e{Kv2E&e{Ry~`?WKxhmaMXQo~&_g)4nKoN+~WRMg$=o{1SXH zX7<6uqNn}K*FuPM{n%X2oC`|XvW!CVaU7E*S85!F?)L7OtdenP$npLmj_5SDgoOS6 zPD+80?XOMOwpp58&Q%1lUPeOPwW|UmBnIfN7v~V?3Fk3m!rBF6B4uu^d-&>W3M5Ik z)pI?orSE%sv-=VwFxEyfx6YqF{qJ1hTqr#oV@{|4v@*`w;}@^I_ff>~{i|=d6chuK znVveOXU@~Edn~s{XYH~~06h4G%c8xUoI~*byYJ^o8>5_aQt)x?5hlSC=hfS{?;wK9 zxu%pg&6&`^V*wvO{Nue}7ELJzh@1<~&c;~IWnDjofQF%uC~+Q3nGgyfrL5~`YfYNv z^Vm00i<&003YRKLiMZ zA|+dtV^it*bam4X+4Bk=vgLA@cj%MkRr&^RCibYAJL5d&&g6Q{o zzrTNX%IjN!yvfdY?`J? zglOA#dpsh9{$8y-jIlOm5=Ei!BSJc@0RUR-<$BG6ppvqxs%L3hmZdXhKAV+w4W~)c zC{@&TA!RH?Z>>Y9Glo)XolD|45&{!)k!7th7(z%0=>eEuTu_XAYcWEDwMi6(l*Xgc z^DL89l?1^q&mjO1LQEJ7DV0(>YbhbSvOG0SZw#dr0Pv9KZPRS``{~1j2O)#d`}O6^ z$Fjr_o(aJ@9{_;PslI=z>%jLz&I641RpmLyIlr7t@Vhr}IAf2y-R0HQYPI_B`}doh zo3?4<@t7fmF;;CG$FZ!c<#HJ^=Kc2i^*qZkLe{zc;b625g_tDCpI^TY01U=-#$3M|8x;~#y1J0@McTF=pKQE=k0b|Sc+V_17 zA@V!`;Vh2V+wJ9anx382N_AbQl=7?{CrN89RK`4;&7No3G)auLBOxHhKU`f|Yx`js zoJ)l8oNKf$r3@&A9stDmBhJ5Vw}}vpkkjeZD)sMXbGKf{VHidc=lrL|0{MP#3@)CY z(#d3B6w}Eh;(U33-)c=M&9aO$Cd;xo9tY?CDGKY{&)3)9+gGpFc^)w)I1ed36omnR rAVdhMlsX@c25SXljM8s;e$x7X9jRpuS1Z7?00000NkvXXu0mjfMN(f@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3.png new file mode 100644 index 0000000000000000000000000000000000000000..97d4d69c2fbd3d146cb18765ca4fa90d04874ffc GIT binary patch literal 808 zcmV+@1K0eCP)v<{0fBx~i^RV~v)2EK(h@HX3 z-PN_OH5-G!}VOc=cDIq1L0D#$a%Gb5300`lHHWPRb zD5_?fK@bGNMzCy~=lR)aOmadQW31f85g}w7Y!=hWr_Y{sPaT4>fwXwDwf9FL0LozTfHh1ApB)Ip#S|;&`6bb+`?+h5-<~U#%1b zB~i$;^q;@~5=Bu^Auq`qLW}vltZM$lufG8Rl#EeUWxJTGIo+~i-?tC;Wkn5rUsjYn zO%;feaBJ@ENiV0$I?QI-KvMj4AeDCscn(W%`_JeMB{O>!QBw}O#K#=8|H*aWJB27=C z$g*2W6pEs#>-uCgI_#c?Q8;}4+O(PnM{WMIZ(rU|CkoOk#;pB)NrmzKsvt$fG*nGf m5u%iC*XwS-KfW5OK>Z(6KYv2`qfO`l0000RO~!y;#m&r)P{p9cG*f?)>rQjpxbLYB8CN;r3&4{?|VgND#>4 zshY25$7BBX?YS@g-F8=1l^@C?FVEI%)S@)rfHgJvbH5m2@C7-{1;Sap*aDWbX zPkDhcp3bKGEK^xMKbZ%i53m=Ub0&<@o$XNDsY(x{K8Z#ns~g7^)|&A+I(xCk1Ro9u z;FM4@7=@1yk8bGP#c^4dwrL=_NygJrt?Ile8r&ptYK#d2A0d?0+0Cch23zU(02t@& zWID#*{qT+BiVmS@5gzAB-oL**|2ODM0J!-3 zQu;k1#O+Nyh(hW6X_7*krf$zQ+Ehh_5psn?S^^vZ!(b2sFjZ@ypp-^95Bniuj9F!+ zCow|H<OX!ZzIRd;Y0UqS25LN*SVzE*1+yuu>}9A5^8nAe_v`ZPQJrlht~GT1*L{ zr!VIqX#6SGMz>uSXmv6UskAx9FklJX^ vcgtJ}!S>sO({nIEu5>U#loHh7ZL<3xP{CA*z}@G|00000NkvXXu0mjf7kX`| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_d.png new file mode 100644 index 0000000000000000000000000000000000000000..35e7b73a0ecab32acb3269f77bbc1ee683f7e808 GIT binary patch literal 758 zcmV}!^B@-1 zPRG1huSB>A$6<7^Th@(Inh^KXr~lsm^y7V5k9I^3c9x5)TyQT(>x%%d(Ed5<&nV z^eD-Tk`RK*vh*0;r>T_fFbrLbvZ?b3tnl^N{C z=9^w=PDz^OakN}Nh#cftJC#*s#&H;J({`xs)jCNQVaO>yp9_p}xD?k{uZF?2y$V8q z5&H9FwHcKjwwpDYt^IPdn+DVMX1iIhlNbPS%(8Kunx;J*GHnL#@$F_kPE+42=W?5H zMwA|0i~`P&r(zriWd_O^c98EeV~n--W|sm0ViCe$e*SKsmkc}0Ww=W-kGXb+u~+~I oMmwF0icy!i&c!B?tvco9|G3O~S-8^pJOBUy07*qoM6N<$g4c>+-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_s.png new file mode 100644 index 0000000000000000000000000000000000000000..730391312448c0078f09efdd6a8be89002af18fa GIT binary patch literal 743 zcmV?P)gww1 z>eb^JPfxIM6cPskhg@<4{sJV<`~ebw!ksH{g>OM}BE_ZQ7tu7&sDFTeh_ z-8S#u-;TqW5KLlR)aRSc`sr!!tql-VMe*04zc39SV=JsJOGgA#ogV9ufBf6yCZ}U)0FY{5R)X!ODSi&INtH|^;RiGQw9M700wV@ z56dEb@Yv|NdG;br)6?;>YfqG>QIr@XQbvUkSym|}rm6qz@+!+SF?Hzb`i8{OEI2}; zX)YN{0kGrH^_-VQ*`5wDCfW#u+|VBaK!{-653O^6(u`7)B&oFqLc~~Qt-Ja18|Q77 zZ4UdRRAwAU{OQxZQktfaqI3~*=v#y$N|~645W>U5N9O@!c}xgnc?bYrKYvSE8bO?} zQqR58lG38@AJ>~JXRR?a#x!_CS<=_>$|&Kgd!=Wv*x3=l+pkoW{e$= zdux{n$2h{ApH^p;5BPN21K^V+5n_S}H_hiM%hW7z+qMV>mNFr_SFc`AQ->nLyB6al zCWKN_l(kZ790%tt01Ng`7iEnQDvQlDD{I}z_ZOR;S?o0RQVw;!igDccPew}|$7osH zEJlP#LR04!rS*EXky1=!hjCO@Ypo=JXtmm+$ZIuYhyw42`}+?@>tP%&E_OX{_xt~{ zyj<5?qnDJ`hr@$g6iw-Rvx6^hzSF9&>K*SM^P)zGcyF|tag39MK^S2|?c!#^y)(}0 Z{{hLJeO3Usl(zr?002ovPDHLkV1ls7TL%CD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_v.png new file mode 100644 index 0000000000000000000000000000000000000000..4f95705008de3a5cf276b755a0a01dd9961f94d5 GIT binary patch literal 759 zcmVr^^~TawSCvoAV3I(LGYBOP1B5oP)co% zM~v~8@82OIL>n`XqR{uT=e1e`0JPR$lY|Aqsj5z=)8%Yd6ooTpIiDBjGkP`}HB#p1 zb6!KVBA|filUIx;b3sR zSnQ9-Q4s913;}=;A|7L|>#C~ijPWs+#z-jIVKEGZprctE3ZXg6Asrr(le7=~dKan5g7EA0E7F=V~nUeD*p zqIhw6nHNQQIu&Kv1F%>uIAc{&vZb+;0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#AU`a$lR5;58!QW3C1pvVD?_KZOUQ2i7XrYCa(h3w2 ze?SPEV5WPSS$uIuW_(yomgpZaBgPlA828}RJ^HqnWhO#=+=Ce#phJ^|jb#cOX(KDF ztm_Ys*8aZh_56HdT}~85;o1H^q5z7b&}cSk3j+U@N=SiV z5J3>w|92NH5TJvNWwoi4OC+D{(5lyojgByT@@-yZv!s(rg5iD+^96i*>MiR(SMsfbrf0 z5kcXpE#RRW0CV;X8@JcExbP*bD=SC>Se*`zi{D)zEL?)R;I?|8mkH?6`;}mtBd^U?;)2P>LJlWc&-l!vBBRNFW?j8#H z97lx$xqJ?fsv=HLP13AZ@pX420$M19;Bc^;N>MJCkYyRSTVd?g*Qr-4gu`J%kqF!W zY|*UOaU`Z^E}3nU!Dy6Fe?NoqmvA{{65|u>?(E=jICyhz4g@$pJ4ct_k6tR#8|>xa z`2kX~kmterUA8ti=~x#2U=YczP=1l+y$|OJ_GtWk{W@-s2h%js^LZj8BkVrj#_e?T YKNkaTRmU&jO#lD@07*qoM6N<$f~3I7lmGw# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_c.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_c.png new file mode 100644 index 0000000000000000000000000000000000000000..fd95417e536baf742097ea9661550331f0fa64ea GIT binary patch literal 981 zcmV;`11kK9P)rAzJ?dr*831vzf`9iT7sF7-OP|#0z5d#&M%}PNSJOni!+gWOLb#fVwfp*nqaQ zrHtCI^PW#HeExt(`RI#x!s)4Lc8WV7KqxAmPMb_7&C-Q0@m-fQubn0qj}bAVv^p&s z%?5_9v;5~O%7sgd;b)7VqiPEAWQ=ahCO?wJj7LdXX%bd~%Rl{&v?Z~miK?rFLBP=P z5arS?n&-M$DU&B=9z#lrloFw;C<DZ`-itR{h)jfPKL{Stf)hea!GLGY-s34^zo#{bURg$SBsdR$ozb!k=`v)nN%4~1#U>YWd9zh5};DzX#hTU~YWfF*7Umo8Hh?)^R&n27f<NjvDUw!X$*X`eUF zzsReF_W>xf$#)-q&*bztW20mEUVvd3WCt=R&zzhIk3Dsi5ZEr=W%l?076Y6t%(Ki_ z>{8_=7Wm-uyJ&@gD`&1TIWqQ8Gy12CP-q#nuA=jTJo$O)#2L)Mo30%i5kq#&GE_Nr)Z^0kw`3x@B7HEL)3_J=jL4|mc|*c=jqmM-kv$njkPtT z?Vza|QaZHS4H7*GG(*?%rH>W2XgCdGu^5d;gWI?6@cNN??2P30#s;?R(rmUF9L$sG zv8dFlY~3uQ9o#=a+LC(xKA!8+**{=({6T`yr&irVN{6k@Z6c8fRw7QRR7S5D%oUy_ zJCs4o_2m#kknPV1AKX}8XYHR25=jfk zb%-ZSI!(#hv!|)lYJ9w~h$6tWq9_7XRe-N>Z@tKWgKKsre3J}800000NkvXXu0mjf DmMP0c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_d.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2b425d70cec44774ed6c4a09f76c0e186bddbd GIT binary patch literal 972 zcmV;-12g=IP)%5FZ3Z`p}nI6l=RG6LhWZ z+AK+%wAbW%x&MAX();IM$%cnU@H`Lqz-4f75LH##X*Rg|{m*1%yz$zLRI63)ZEg^S z5w`8%?(MSE?jVHF`Si1|u&q34nz47##j)}f3OSy7d097-hci=gK-K0d~Y&MI@q9Vm}LvJO@Tz})eO`Nc(E zcsrdYC3E?#)+;{3ub9yvKpoMv4A_mH;kFv~4CeF-$dkDtHFcYl?shy5(C z{*9q)OixYl&GnmzcB_e@sobyCNHP#Yu=v{w+x05ul`1W_hdy?O?fYvaNrGV*WLbiL z*rBnzk8I>E>O1>%{T@LWq3b$+FJR-pEn3!ThM#zyR%;JMR!EYReb*(7W5OuL4+7+l z=TUZw6fFxgr{f+RAcVjw*=Tx>rR7yTzlUiRC|U)wG$9CMd_SPiE+MCJOs&zvwhDB; zLk21~1N~(HnvDi=oYLud)awm`Fe0DJGgKWQOj3GbhzNp^sfh=9Z1xm0QHV^&y{&Cz zMd6RzchC)kndwOe2M6$bJ`yr}`+LM`Mj@vmkYqNun_Rwpg;L34tJWZAs3e)h`FGv~ u3BLULTiPubLs!vMg(KB|x?Yd^j?4d_`d+^w$1HRJ0000M0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#ANJ&INR5;5m&r56+bpXKO-^~2yxih=drP8G=mJ*Sz ztu|FKk{S{d14KE1#)Ai9V$^u?q7rY47ZXj?sNCeB(FC<55-)^)msv;qDiytnWquXtA{P;mgmCa{(}fvaBFRqlgFOH88UeG`KMW4xI@s6Ir_pB zXFr@{mov$G=iX)ac!gT^AIA4gA*-5(?*{}?h-K;wyaM~iW*8c_=+=DXGy|ZVdw}_0 zt}y%fQQGYmwo{-ugm&07ktEtvpWNC5j@t-4300 znpF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_v.png new file mode 100644 index 0000000000000000000000000000000000000000..4178eeaa476c44ccf3691044fe8814d811276277 GIT binary patch literal 972 zcmV;-12g=IP); zq`Tc@UuIvjv%51M`Wb#d<(Hc`!*n{0Gz{uTM+jZ#->oey!{Dd8cZnJX%S%f%Jdeur z=OmIzEXyJmkF$}>A*!_+w^vqB6@^BtMaTCMih`zTES^7)Wm)`q=MJT6l@s6R)zML; z5X5bp^{p+0P*rNJ7L()SjAyf)oSYDk#|ip+KX>jWqoz?T7WwL}MHox5u>1+E{0fya+_=W? z-(F=wsC@e1H^x#aBC!~Y7cQXof`C(*3`yJOo%wlQ+x(A(;Ur{TDDHq50I;BhJb3t! z%NH-=I1c42y#A15_dC1_7ee z>+wo5$++v%X}2jIA2X6jpbA0V^C*?e1V9jm*wHA}dY!iKQ>)c5q(mryl#*B^LVjn5 zwBuk%iPvhOOUbi?1NuS0?CH}OmPNPMBb&*f>H5nvN0kbb*(|ejb4*N3kg#o@6$%_z zD&+EcT-W98`FVnVAHUOK(sk*FAufxELNpS=(shoiReHb|SFRwX uUOT1_PpofuZZ{zj#5*_xT?wgi&T?rV^6?0000WFU8GbZ8()Nlj2>E@cM*00Iz6L_t(I%axP6lGIoX zhCj*2)6FbZ3#2^##w65I3$H_MK)_DZp6<4Ne2y*zZXntKB`THfzkbQ*ZOH-U|0GBN z6agSf1R+U2e)>omPy%6&O1z_(>)sw)=8rB$xJ(KB{{Gbx$LOI1$h zydFlbQMr1>J@~hs>Ah1Bn%}RXN()Cs5QGBYI4^aerZL6Fb6-hM%pFNVBgk|B4x*^S zEg>^^5Wm`tU&Usq_@Dz?ZvSv_QWf<-ZGGZ^1ftk_FcvD6cm|Eq< zFfz)(+ZT^a*4W%Qj3e%b2FcVaM)2HMF0JyaJg~IRX`LBFkwH0@!f9K%MFXH`qN)@{ z2y-SX>Bfk#b>qu&;~>JTha;KEx3)67@u(x7&g_ne?ki+EVNQ3acju|zXki@72=_JC z42)~$J2{S~6f(To0%)QZCgVq_P za4ZAUvU2u{cu-2gGZ7KOY-b}-KK%26zuv#Q6N8@&`(Z~UkjQ<4y!$c&GWiZzGorG@ S(e_&a0000WFU8GbZ8()Nlj2>E@cM*00JLLL_t(I%axN$ZyQMr zgg>%-JdPY-;~ewzbII8VlKh+v5FkJvvaEUZJi1BlL4tf<-UAboP9CT+V_`HJpa{xfM?4IPMA>G_HuCfMFQ1;CF0}u5 z*u2rD9zoFnvh+8SJr;;S$Sgjf(vkI^c^lbmX19fPFErn2*2pSK^GcSU#a~b|S?@Ww zzgSdMI>vpV)HAq32!SIa;p?3v8Wi1 zMUW$cPTw-wkwbc<*hsMv$N9DVz-mRK!@UBKQlhq>?a4DB}- zhSO-i^CmqaD5ak1^MNEC@9sWO?8M$yy42ImP{%2DrqWn^pll-#`kvJmhUJK=q6%H= znd^zQ&bMolCbFWK8HF=$fkb9&g>(5ylAee3NZ?HM#M&nMe86dxWk!UHks<;!qqd!9 zmGg3>*2x`Kp zDr5xKy0L9Dd)@FVs3iJ)U?|VbZ9pQ(dPj{)62aYHW&Ql+GoPM5q9V5td-x5T+r>bt h1c3*rKzI-V{{gFxrY%u;D}Mk0002ovPDHLkV1kO-D!Tvx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_d.png new file mode 100644 index 0000000000000000000000000000000000000000..774c0e21baf690114678df7d518d25982632dccb GIT binary patch literal 692 zcmV;l0!#ggP)WFU8GbZ8()Nlj2>E@cM*00J0EL_t(I%axNmj~qt~ zgg>%-Zq6$KwjBEBJFw$}VEN}*fB^xPw70wS=-!!bk`Cr{iX4~;!GKl8N6Gg5F-VF3 z4EH0e9ytO;Ac8+Xd?1q&Bq!R63~z|G5@yglpdgA(XTpt;#8y_eGIRd)7f-)Ep}_xc zcI%{J1W}X#$>VpBy%GeZjMoX#0nLwW>x^wHwpaFh!TXN&P8L!@vE@Q+6&+7(^M$Qk=)JR-iB@OA8iW%b zx!t)PMe_StE47y#bI?qPHE<1OoZEjG@C@yxsBjimww!(A@|G z3n3zaV_#X6t;|FOia?(}6Jglx3t@(<(t8KZSP0v4dHIQs4v$2u^!-lKbexga4-hl( zj`y8(dIzGkawCr?Bn>?L^b1xlNAoaZW+?7hxk2lAo!H8ZzWEuuSL$>|RZ)dBjI{Ma zyRYBXq(nv)GlO!&JP673tx%pnArIrB1g9+*`h6jfC-6=!D(It zLmwUi=Pp);nhQcAk0;9YnO-MC0?iLZYe*8@{gpKT@%}wezyFG;00&FBzt(PcNKOh7uWoh^ a0{9nYOrbP4(<{mV0000WFU8GbZ8()Nlj2>E@cM*00KryL_t(I%Y~D>k`zY} zMNd{$KZYHo)nefA_XHtB9t8V0l0k$J5X?+>b$9ivvQkFxf;^>{#=Q}FPhR=_=f#}& zhzQSPWnYKEA_&uulIK=l>O#QfS(Mh~UhOs;O9~o%XI`P8(JVz7ob^!dF7o22xy@)55xJ zq-kc`GFg@2yreM}B!Ylj6eAPvkB0&!=ysG2w$F z>p=tO&|C=KBR~My_nr1!lTsq~1F;(^rl=~2;k-NW7HHal4~}U}7~lY|Uyc)Q-y$U! zaGo*U? zYhqnjnx-P>9aoAHZv$DCp`RFH;%AdUDPbU>qj)E%WmJ3_yRI z*rpv-Wg9lyQ-c#ZauN|t4fTptMt_~~mFIl_g1Yg)uyGF+Dz~#fi-;1Z1Vx<5OKD__H+qb_X@Uy~ZKX!etvpoI6&(Z_%FMFh> UcP-b?v;Y7A07*qoM6N<$g4JeENdN!< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_v.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca45881b3eaa45704ee69d0f9ec08122e979eeb GIT binary patch literal 698 zcmV;r0!96aP)WFU8GbZ8()Nlj2>E@cM*00JIKL_t(I%axPMuGByb zM33E_WbOdsu|eYVVa?(S0iOdB2q9o5uSqgVx7#c-TvjaTjnxa6%T;ArKYw*X;GeIQ zy{hij9YnyLj~_k|2?2`Z(-nDiz^4_r3^{`esA8uRZjOh*I*qL3%<0o7?(g5Cz<)QF zoCwVURCWMq>KjOdFIU_P#6THFq^i(E%{mU)v|!7^HqVr8!*V8y3MD0^sVUt6QPIPJ z{OgRTgj9iT7)kv|QNaZ$jtGPhQ5@{l;we!sGt$&p+u_R<3D##7pL z^MblN`uK>QTEg>Zl*@#TGj56H%NMrGgjW@%WB@`C+zbf{2ob=|(8ov0b)j@4W#}LI$m)1UBvw3jGJLU&$uOu3OQ$p5ff)^`#l5M(8DftzOIB2b^vm^ zfh5RI*%IOTGf*M*1Mzr=R2B8BmsmUO%}tG2MkxjBd&r40%&g;pzIci)3(KiPRZ*1C z)TFi}P19dCArMi;tU$l-?J<()EAzMSNK@}jijmr$e3^*HJIKZ|O$fIjxr13DZwX6@ z<#Z;cgdXnpVcoC?%#1Wnx6@F}?B;?S5b!E;?Rvb5R8OBEO(YKkYuh0r5BHU(88bsg zhytW_W1S|_x{(AV1mf|)eD27@xZ71%c*=+frIZI-01L3IG5A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar.png new file mode 100644 index 0000000000000000000000000000000000000000..d61143c4399b80c08a8673a48dbdbaf09a0934f1 GIT binary patch literal 936 zcmV;Z16TZsP)7dVeI6~jnxgQMJ z&SWT6Ds+22dZQ7Fs*))daBZ9B?JY!We8)j_>;+;>B%VsKS_TBZhoUHSZ*Lj)dc;+Q zY&wnE>EKuvnx?VvJR(70KAR!t@_7V7VA$yp_yIu}5=9}4xkV5JOzy`tTTQ-y`jld= zj%(Xw(;2MsgspTMace7y?|I~FHTI4Ukwl68;|DDLB{R!H)ii#7_7e-wCyFBWPfmah zJM}8Smqaa@WVKu&$qMy)6?;BM)ihGcB);czad|=C?2t-l5G5Hy*Rf_6(Po1bMG=Z5 zAuBTNcANEP!*DP_NodS1i(~;8Po6y+% z9CAPGlhAdf#S%uTgjlYW`S1Dz z%jFVhJ}1V8@@|7L@DU{$RZ&0?D3(h2j)iSm{P6fOt93}=EchR>UwGA#HN8&&0000< KMNUMnLSTZf#Gx7h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_c.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_c.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3f212730aaad96e0734e71583c4b552c2a57c7 GIT binary patch literal 902 zcmV;119|+3P)C0X%Zw(B$vY4Xwz z(++fbY=C9324;9*0}RYCFw8(5l0uq`9mkF>Te75cbmM_<4WIGtci+@SUhu>BKl1LY zFM0p|9Y6o{3pcl)dHd!qMXveq;cKq0ulYFp$ocsNr)RI2{dLLjzx{#ebq37-ye3N& zQkW!%gcrvz=m%ZWET!qVY_?nexw>I~yCjZc>Z*nc>as=@dCpP0h2LqB=LHodi}@p; zukINJeHIT34AbD`>?JD8QJH4FUJ>mMR7H(YIz!qLr8TRkHDys_7zUel$oy`B);Wd= zN-5esAJa7Hc6#_-k7yqwE2AQg4wQMxcrvD_a-uL|Fzgcq0a9-9Y!BONUFahJREU$@dbu3*zI;m+eDax?x0Ow)p%`(EYC=igt9CV_jk9P zoF3D38VG6Pcn*(?N5XZ8Qi?3e*vEUWXP+=_f$#gcj)!eq3@1HAe=tNT1sI&1Ov!bQ z@B2(%jVOzXs;p>vK8;3$?4VdJSGcZAUBNDl5k;;^vlJl=?jPoCwj1UTkA$l|TIXbG zPP1v_wp^%cMw1aj7z~3xLI^|8LKukk^D{@C7KdGeWtr$gp_N9O63hI5-1+MZdc7`# zX_t1_XZiF<6i4*O9mMo_%6hpWO%+blMGA@4kmS0+^&Bu@xm>b-dZsKYwAPHq0WVLc c%zpjEe`mXZUdpDF4FCWD07*qoM6N<$g0PQ|1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_d.png new file mode 100644 index 0000000000000000000000000000000000000000..40a5cf1d7bceb06c8d4386a0afd8526e7d8f1ea2 GIT binary patch literal 890 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 Bs8av{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_s.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0b35ab0a73752fab428d0ff6d37819c0e35a49 GIT binary patch literal 916 zcmV;F18e+=P)6DA`@R{C z-tzR2%Eg-Xl)l{LR_mgstrz-h2OmKVSUD(W@7T z@p!~!a!u3J7)C?bZn4^5LpKdoRbyK=i$%;Lj!4r5o*!b_7G;@3qYgYSDl#Uh?Dk0N^AF4M^f zX<8^1<2WYqd_;pl*p_4-Pti5FZVSI<<2W8#ml%e?_dAqT&4ayn@mnFi-a1tUX;zS= z3UN9Z&}e~>5!XsGB*{2CJ*Fs1!Z7^*#1C-Y7LrEb`5vYr5JK|f zlOGrkPYK(7lv=QHZ<|*~e{g<2KuVXY%m{;!M8%{^A-%vysf4`9xVwIj{oQ?3qKM;| zH^31IsE+>WS-YNKYYsO_AY8U zXEvLV=NX-_!_D=OG)<6}h3~hy7{0;t1GLsC6>)uah73ZF29wjlYb{p_3OVt7oayGAs-CJ4I-VWV|Ho+U_2 q;y6BrVIpmps;o&=gsuzfD(64eAe66C4KL9E0000-l$H{&s*>6G(M2g@)JLQt<%s8y>7DY=azG$Gh-G^n{QahlQ{4iQoag87{8Xhf2x zs3^kB=MkEQozL@cug7}1q*5#rMG<|^V>}#kc6o^=CE_-YDViot$D!mnXu1wS6vtd# zUn32Jh40ht^=MWqlpKftmoMDi+JY=YH0yQNVMq{$`13iHa+xGeLD#vBV@%T|%`z(G zGESj@%;ng9@PJJmqYHsBayb&9<+_+sk|YUI*HLLo#c{ArlXA7nZmWgLGRn41rW67Y znuaj)d2G`}DTSTS({Npc5JXABYQ1K?* ze7(2FFRxy4<9Y15E~Qe5@nph}FJH1)F3C$tlq5KX0+wZQ@6H`$tQ7ZlcDNY~`0nXb zx>r}+^!se@>@f5^9zA^c|0E^hX2TzE-%{V&;?2fcE{9C)vBxQw&{atJ!2U9;4|xwL*bG5OAkjCCf6Fn+=gt zWJ;n}myGz{!wk#Mr(H0yPyzRzN{!ZZx7dOZ@Qc(k{NW!p@rQ|i?!e|I|c`hDbN zJjOOnHgU{X_wQ3FmALG731%}C&}y|PSQaWtSWKtnguo91mSIS%UPpG$&-wGyCmhS7 zSSVndCKKN$1`J(iG#ar8L)=mcm8KLe3(GX=jz+Aai2ne+yMhf7`*c?T0000<*{-po_03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00SjSL_t(I%O%I#QsM>x zfZ;zO34{bm0tmRv3Q-rjGg{l(x^BmteS-EG`WEf8wA1HkFM8R|)NQ-#tae0E@hl(^ zb07gideQIh6TbWYhvd9_0rQx>ckj5py5g+UK@dgW?C!Ei7M!17Fdh!cEiEyR=LDY5 zvllODG#W?`4-dTF*=1vW9W|@606yE=qGVYNMkA`F61Kg@Bn;`Col#g`rfJ*!{L_yd ze)xbi8Vs;Zliz;*1y$3DgHy)`FtL4?4T@Xkcy=eX-Ps+WV+oho--y%5)8{?aDPv^T0u!?==XX= z-7dc8p=vtb(-Ye}JBU#@!Llrxtrlx*Hil^;0^|MwS(Zu53YBV=)rL*r`D}ghB?Zf5 z$+B217D%Jv2-ovyA0MO068T(?X%vxB6sGf-$KfOM#ey&lDV0n7z5gfKY?hTqgS=%S z#c_-zE0|V+_R%3pvLLJJIKGc&82GM77(_^t$ivMIN;-`s%iNxvqNyt4a;3t_=_&1_ zL#9!LVOq?hDR#3-N)&lsucPW&rt>+frjg02$(UeNGTD+Di8z{M*Tjc-W@s9L@ZV+c%Juv0IO0#NToPCIl*zp$g)f( zqte>^oWOIbR;yHMHSW$Y=yo~?d*6JUlxsEGpFSa^QYdN`r{6=>bNHhns;-kW41CvR zdDX^w?9scvM$2l{TTP@_+uQv0$M57#lR~jbv0UbH>@dE&Wwl<%Gz}crCA+qURVdI~ j(s;GG$;r_nc|FH}FhOMwd42`000000NkvXXu0mjf6sWF( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_c.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_c.png new file mode 100644 index 0000000000000000000000000000000000000000..011a3f378771e37280fa7502e7fe32663eda6351 GIT binary patch literal 919 zcmV;I18Dq-P)WFU8GbZ8()Nlj2>E@cM*00R3-L_t(I%LT#9ZsSw{ zfZ^ZA$M-nSrMdJrX@O}smC#5do`M}>$qTUL0g(_3W)>`vs)4H0%XFHyNt(ooW5>tG zcKANym*0NcwYnkWhZlwi1B796e|t~V3F&rvl)7L(U*ZQYqtS>>nsR-8gJnqugFeR3 zzy7#;|HC^>Y0_>sNj4crN5^=M%gw_rQ6pkDo04WJtyY9(SyXk+AHV;}^V18m)FrJb z;@?kK+^AcWQe0ks!Z4sW*yFG354fJoUcbxr)eV+qu}L=EUVXvwY-Fd?!m=&$Lh(9% zB?uar(qJ;3pbJe=XuO7tQi^t`#Wu@nMoogY$Kn1Va%b#VCkdr48SW2R#xW|+IT#$! zj6$Sb;@CE}<)C#zUGA_QNwF>HbXy2rmgu6y^&HAl)9ZEl=ItqlFj%ctNZUl1g7#j- zuC56pk3tu0GsSrPjF^0#aymN2^E`w!@dB5Z=ND$P8A>VgEN8RX@cF+ROxq+3LtM|p zwk7>x7jb@ZhAMKv;LV#ubfF2ukkQF8RasM4HGUA_I1X8wGn>rte3xAfp64S=t;zBf zAq*bJPvlw7YMBrOK1HF~)v!0P0Gl*P8SD>GDyP$r5JDiTT}7@GS(af5i!cl^ZNYk# z;Q0>CR>0$zXW~VS5Q6d7C#tH#3q9^`?-7%iDS_`(RTXKP5ieGFj*II$NLwOJNxL24 zxjtG|NK>Lz!6r#*wnD_w@gZ7i8bJdC@O>X$lsK+~+7>M17_Z@xt1atfO%V8WI&GG- zHJim2xn3r0^DXoFl2U83Ma;>!BkEm+0Vq{)_xT>jacG1APfyQS6C2mHIe0Tf=u#tu zq&MgwEy>`Zj}Qh*DdOb{wN*sTi2i<$y4ukn_BlR1gxX*>ogw4-nvWkp@NoA?S(RYy za9tk&l_~O6as1srak@aM0vVf3ALpp8rrU2Lzkh$hKYw2mMorGo-lDW(lP07|&dIxD tUS|u|>jXo<*~K}AfZpB|Dud~G&i}=KdeKlE`SJh&002ovPDHLkV1l`}pPK*x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_d.png new file mode 100644 index 0000000000000000000000000000000000000000..27ae650a7b808417a3bea2bd1627cd4f476c12e2 GIT binary patch literal 906 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc0dfdf8b5839eb3d3d96729bd2c6972cbbc96f GIT binary patch literal 980 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 M07*qoM6N<$f@_4Y0RR91 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished.png new file mode 100644 index 0000000000000000000000000000000000000000..92e883c25558d8c66dfa4ab9cb580cee182c49cb GIT binary patch literal 789 zcmV+w1M2*VP)sXd;+dp{T`;L>QDWx>4P&iUx#LJ->LM~8wSNP;M0Ldvp|WHfLOlQ_mY0ir;Q{O;{F(RJtG zpk$?Kn#<*qx2?oEN0KCpqVM}@6t-<^+4gq1d^YGKMcu5|%=fc2#Y7LEo{*xz*I#`J z0C10vjE=!5EsLT^GblmJwE71JSR?D@@}tWaV%tCfR*QwCAZ3}R+wB&~l4%$vV=6*r z&3F4<-87U^=b7{8Z@+4qc6NTASCv$AF3G5?5%2b0007rNklQfzZ{@bTNSU#Ek@coYggEUp=rn|bn zY}@YP;ZZAn+#S2F)0twNdGA9We){!yHdvcxigS*LBk`N{Go@s{m_6J-MsalW=6bVw z=FT^#CW)mVMuw(mA?p$MpZ8L#fYI&etu@vd8>atR{hoDD$O)wr3k~23u}!Z#!xWqOqOdXX3N32C>FzD=ktpem zZ1i4cv9YFYTjyNx&9`4CGNF_X&Z$&xH`}r-g8&9QSZj~_GSRV=Y8c$;J!K@EV{cf%5DlRxJ<$+yKH#9FqJ$(#V$C2Tft@LiVCoPUu+ zF)ILq`66eWEv^axiilNNV~1Iq6_<1G#$s7q-@PK90#LR;9MXwu>W1^c4rq|^fV;r8 z=kD&^?MOzc62{o`YTI{sv7E5|;qdcMzW@iFDr1e*aeG1`c)6?Z@BgMiVii#!K>)0007gNkl)+xu}G zyK8rIb3-Y8K39~m0Kz6o4u`{kpFUb+mCC#3@?7_X5dPE8zm!|${rcPQANGYx(!^PZ z32mh5og=HZQAR*Ki?BVNtPxrbt@yWD{_F)Jk2UgE_G+LmVz2%&;78jYd_B8 zw4k9M1S4I}xln1mkrF~kDK*xrL}G-|S6_Y+0DSo8BcW6Z-gSN5 z^~a}b^$sAi2B314Cb6}?x-^VobUL5Aeqb2Q(*z-mV`;RBBC*Yt(aWw-1e1N4XIY$V zq%js1#SVfH#~VtJHTrt(r4$Ilw(ZKYoQ?C&Hck6-sTpSkV>0x82*Em^#u6bMAj-2u zyY=*RqLlXi;Jt+imqqSYAR~?-1S(DRGAC(D8DF%uKJ?ci&-1!&(nJ!%Vi`H-%3>RD zBue6#aejAy|I&0?>p~>}fL*zD&W_XE4>N>dF_tklPvg3-q<%R^fE z0RZQ!a&GPW@pP)Ru`-gkhrL_Z#TcTsIqbHW^1D~J2!vzxj1aQUb0IKBWsxshLq?uX z6(M93F#;g^_1$|xaF!*H$0`!k2e?%!fWZ0nkH7vFoHB|(JM4yWIX!p(0~T{;c*pz= QAOHXW07*qoM6N<$f^*+XSO5S3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_s.png new file mode 100644 index 0000000000000000000000000000000000000000..efcb46750b104f2c714f278330cb82a796999cc9 GIT binary patch literal 723 zcmV;^0xbQBP)>po#qnFG1>(}3d_c5a7YN^zsX&T0;vwG;;gpg9D zEUJ`H+gu(WKSQBZdpkR4SVpZiZF6m#Ta4H_$Ay$aA%tU?u9xFH+u0lP;ls}?E7t3+ z(L-~)dOs7wfFzbtH##oVG&y7Ld6vI^_~CXr!n^lBW{eo!0;JvUK}vy;ANr5`_BF{67lh$_tDn#jhc=!G%YxNv~98v^A znN*4ZX_^**aW1s!^PGQseyrTM)%XO&~ z0r0bvvNXE4T7ythYh#@4yC%pKRz z+kG!&A)XKPc)S2kQpmPB@3*gu!UDVdz8fAzB)|D^vvlIhV$b zDTbjvefMfV&HjGxtnC+z6{D={j?-wJ8(|!S(ZhPPlTyU!-8gPmudLPgp`n!2^=5Py zVOXuUK;k@Es!EX%c|QEbXtsZNYwms5-cF~NLRFi^ma)99mzT>4C!c4$UhL@M>F+O} zf2|k$w)yYr=}&+x#%Xk>ZLgQ}5o1C#?&n~18^aX*_&+uhf%p%h?Na~%002ovPDHLk FV1jp{R&M|R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_v.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc3043f21e553b1c18d7c7abede06f705b2c618 GIT binary patch literal 737 zcmV<70v`Q|P)Dn_2Z81`4QVk*=9^sB~h29ow<&*plWw`1#YP>2ykkIG;|0 z^T+Ssl@Nq;tu^Dks_Wk`FL9bGrNSus=gSvTl;yX_M+9M2Rc+r>2r3tTrM|h3IQNN5Nx(v#uz~eLkJL>#qoB(UrZ*`ENhJE``#D> ztxc1pcMh3hn9pXfSF1^q4Aw?kBSO~8rL}f+&Uv3`4ZUx#*RrYvr3eB*84IO+-tQBw z1*MnEr8DN=-R^0-jg?YiD5ZRRe~%d(t;HWde83Qn-p5+cCX<&uFUqpITo&{BVm1Tb zo4O_lwO!Y=E%Tn#P4m~oLnwrnQgMDNiU9zMah~V3F*i}? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick.png new file mode 100644 index 0000000000000000000000000000000000000000..b7bef50005fc21e7a39004da0ae3d11fe1906349 GIT binary patch literal 995 zcmV<9104K`P)WFU8GbZ8()Nlj2>E@cM*00T!!L_t(I%RSFaZ`%X_ z!12F3+i~I~wv#w@Qu?5*6)TT+2*!39Y=?~t>rU`#KwP+Tu8^37gwQzc0z!=I%Agz7 zR;_ehmsh){Nu6gC$B7-s9FX{ZgP-ut-JinVXh=8?`1{dgLT^OYvd}XbF1>e=Nf_d~ zL+n9CuGHKpkU1N1^jhS2y@!8G}cKww3#YJ3qfMuFY!VrRh-|qiT)->t&`!pI2 z++L5%SFe&vr}^`bO=L-Cs%hIKHH}8SM(5OKc7B0Iy-rfou=06I2?$Z5QJM{#Zo7>dk7MTZcq5N!G|JK8A!lbjgo`(BhO+$M%MT{F zy)J|h*LAwKO)6_5MHJe$jTDJ691Ms=WAxiCv`hx^_UE7R#=`5Qbe)YmckmpClwpua zY8dGhb2Bqoxg2MGhp)f%FrYuCf!z$KiF@kbt7Cd1GfFt@z)|GU?2Gjs<`2~&uY zh;C*{=qX-oKSsRq=`G$`xj^9i)LShog#x;+W92OF{_rEJspWg;<^Nf4l$CZZChTRXuUc_g$XimIZ-V)(vK>-3b_r6r30?4rmD{{mF5k@wYK RaU=i$002ovPDHLkV1g_d!~6gM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_c.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_c.png new file mode 100644 index 0000000000000000000000000000000000000000..d902c59829f859a718618328ddd4022786b09ce0 GIT binary patch literal 958 zcmV;v13~WFU8GbZ8()Nlj2>E@cM*00SaPL_t(I%O%ChZX0C) z!14b#^NnZscuAc&b(#c4f+`IZq26f4E#d$NP!HvRco1HIJ5mvxP{mTQygw)@U5SIsM)J^O`fwaR*Rjkk8TaGgAH9Fo&?EZgGO z=g)B*mrA9=>S~2T(L-Kcv^e~yfhrYLMP+@hidW1tpD(D_8@P_kpf}*A*QeX-^6;Y_ zeBUPuA}-F~Ad@&D?>T6iMiM6!N-o#eZG?bZt1G;!pP;A;#frz}Ws^aF$kd-=nKq_r zARg@B%Ph|#3S-9IF@|NL87hOD5&68sd>Y^sEKJ9Q6oPq3mSq^W&agX1KKbe~ick?k zVCp8VZku2_r&KEQ;>BOA*9`97eVf}GHC)$XH1aWYjU-KJ95s-wW|wZOhg+~oq6EV< zuq=y%gG2nW&)%bZEP@5o#e~z7V=@6Ve?}NaWPsATY;k9+hH088QbpAiPL5A`bACw_ z#`JrArqd}WjZ@T|itD;4s!9|^*p7jC^!bC#Fm*DZT=BT+42Z)eQd8--M+gD7XR}Na z5RfJ*PQhl>onRL&)m z+HFdO60YYUTkQ_*b{k#Sk&5KK`|omcddkbgSL6#0Qc8~geF-8%C<;c-WHOnMW*LV^ zb!5BU#ZjJY3ht6Ih_T3o&EFdqfTPd@z^UDrV<#Bs!MFl2Lc zi!@vE$M1hqES8Xp%If_JcQ!YeOeW~6fw!OM=bwHtD2Y=Ub@(zw;Q$K8=C;~a`k62kNF&$6QG?m%hCkz6@MTAr(gPS4S zJDX%=*p5Y-rktO>X3!f_UMnE>zkHbWntc>a!Oc5FafI!f%>58u*BJK37?y!hz;ym! gRTWqYE{>c02ifCjB1u^<2d03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00SmTL_t(I%LTzXZzE*@ zfZ=yekH<$GACYqqayf|z%Z(^$s1Q(6AWD9~(oygWprxSNhJpel8j3AoQG~RjK-&-& zlHHIv@tMT-*q+04eBa0OXkUK*sajuqfglKY@ZFEJc3A|5tki2L6opcWX0ypx zUw^}Lt-@>fUc%5MM@L7PXU{wQ_4GgL)e3nhhiRJJ42G1-B`&Wz7^a0cJ7+ZZh_j5t z);3B?ZoL`5{PsJ#VHzxzON_=IX_|4++5+7m3L^@x!+1PlGVxF%MGC=1yUX2Zj5nJz zoBL?3t){A#3p5&4Ceu07d5CQpIJSwDAOTHEbVFzEN2Eex+a``>5=05+7xzCSh$7~G z$ZE66-R&*C{(!ve^21LLIo#i-wYNjHQl?(75(FW>?-K+8!<#YYug8zcgv8C+wA&q| zl*CEG&DjMx+v2S^Ugh$#O~J8v`p+}+j?H8`Bk)6}vpIUDQb9veEEcd#oxu0$4{lIO zqG=l4ZjXAsPLyPbEM+qB==X;tSw@;9Xm1{Et3@1BE*2=dIpQ>99z>LjE{TwgMpGKK zC4z8)6asV|*R~J}Ohd!`uB7!f5LAPHT_(Y{qq`hizGm#$!BhhHY7B!20?sX(~87 zJ;SzbbkFn1J30Ej9=;#YzUmT2F~gf%qA*}GnUZFLC{9plWSK%K#Ucvn_6BHg-`i1( zI7KOirt6r7L6W3crj8%QESC#dra>kYizGz|K|W`pq{Q<>%#S{JkM-3x{4fBK(Z25C zIC-kI8jl_wBcxz^Ym>dbU0f%}V9>*MTx6Q?^TT7zlao{ad~(A6&L*ASfMUT#NX2z` zz};xfD=!~17~V1QX1K14$TAv@8h`)$j75@QCTT{qQN^%wY^<-5B{A)*4q+4%#Tl7| zVj)kxw#*`qNl`pMzaWki3V9pt{dZqi{W}lGG+0_H(diAzI~GD|R4ZlBAQO`DXo{1w kuq}htW&=N1aC&~t|A6SI7+j#oivR!s07*qoM6N<$fWFU8GbZ8()Nlj2>E@cM*00SFIL_t(I%Pr7JYa~?w z!14d9dbM<=_iWwCOvbE21_uv=h#+{@qab+p8wh>|4<5XD8t~*r6c7>%y5 zg@tq-9{%(#E7gGggS&Wcgr2!~$pA4a1AiHcavr^IoD zQVZ_C_6Eyk#MNkk5CY4u1Wa$nBuR`dZ5+pA8eTIEZ!ku%Sj;h{p)3JlF%P+(jL0%Y zqL+xRTgPR+-of=MEM`|IwZL&)gz)fu4@8Mh6rNutOBJTbkkX~u?vlhI;^R-gD)Tf& zsR*Saq^z)9hNwjI>o4EYYHx7w-hE<~vAcUffAE5x+qaOm z6(*A*iPl^^KPO2tYPA}+l>eUyPw{{vL4aXptGfB2F+xA*CEJ6N`ZZMhUC;qdSn=}10*@F^Re+wAP@ zvA+HmwQ3W2e)bGw3~8##GtKJy8aLsTB3FP#z24;M(?3y4fn~G3wZ&vSV!4=6B9K84 zFqvGD=NYzixSouNRYJSfz?729%N|*#DT<6Zy5VX(qSM)-60DHK5#pu2*GtH;EeE9+ zv>O|wd4gp*M9UeL?INXv>pIxBg-$i50MDxc8S?FS-lf%E#j-4nfhby#CK2I$&XdQF zXtvg9x7VoEYV7SFVF|%t*vE4N9{&6_^4ZA~eBb5H?#o2W8DV&h)(O(GNwuQgYLjIN zN#gR?<4072D#jSb;~rV6kd?s47{T+u&v2y6>PDAYIN@^eFSFU0Wi)4Va|_4uXf#?3 zhduH%CeI2Q%?{$==*?0mGaAh<)9{jNt%+s17?Yxt80knnFF*(z>H6eZK^#pnMM{xt Z{sY%5lPcaS_VoY&002ovPDHLkV1i2*y%qof literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_v.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec343f2ba8e793289bafdf687b85b4b39219e7c GIT binary patch literal 958 zcmV;v13~03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00SaPL_t(I%Pr8)PTO_> z!11r`pX0yzW1OT={uL;s?7*e!q3Rp#v_rc|dw{;c9;26Tr%AoEN2DDl-e89brmCWX zY86`-Ay^VZi0#BqY>fZxvd<%Yq+edWD%({KTu9BA}%dHmed-t$yn~J6} z4MTo>^Mf zo;`U&nx=Hm&*={a2t}3&rc=T&Br6K)rpXj2vJA^G_`BOh6#@aIY08&w7t=8K_xhTu zZ6iI~-Yy-}q%2DmRpn+f!8Qz%BtcRX^h$*^O_{|pZoQ6HsW2FiX*U{7;u!J6%a??c z32~O8C<+xtVU{GMS;qds0iCTa+(v^%*X7~%HiaaSXBklx@!{h~#GhwpT>Cyt%_d{t z2S8R7hNBU6(`0XVm*HrHB+DG1oKUY;83zGz95at&gsSUUnnqC+ScZX+Wrn_w7X-|c zgwc46R;duiF+!5K8V(tH9=fKHr76!7@z@ zA-D-cq_V^`P3|u&AijU`0#nzC=W~vZj)?Od%eHyc>5!!<~_;EL5wAKi54sD?q^wiyQj#{V}rzK;+Br&eR0B;3yDG#!UvIz{^C@#Avf`>2Wn zl7uWtNQ%OOX>t_=EIAHkSrR1)X;DxX1>`wP%_aliM|}JIIhv|s**0+$anbA1a2zVC z%C83pH0pIWHaF2VjkV=ve9t4A&1kh+yxreNoP7F(Wm&kj8XrziX}c~_6fwBICb_*u z5rWgtpXqFD@FmOeJP+4#I66Ki%X4IZGQrX`lDj(|K6t=lt3~hXipzeVK@i}$E?@2J zAW0IT=RuZn+3RsN8nNQKNZ&nuT3(DsRCOKOG_f>|vF~#SsEUHBs)TV&vsR2jM!007`UU|~4~ zLY9S;2+OJuInyI<(&?nr_F?)K?IX4`{gW$lmuH8ns&$=g*H7mc7u2#Ai^bt^a9b^6kVBG`MS%bi zoNHxXw0xhKP9;QLRfLdP97Cl{gHTH6vl)VbQd)9u+4g3$MSc)K2xp(Bf{RK@DeEjv zgb=&Ub`gL1`OTZ**{H}e-}BS$E;#8R+p&3B4#(%`mlqh}@zpgiM3SZkr9b`hYhH3G z<#;jyKs}3|LjdsYZ@+80UR8B)a$-=EWm%(?L5SexZoNM8vfb@A3YbLSZnkx!G%2M) z2!t?>W0odLDL)7{%Vn=062n|SJ&8EZ8Kbt7?DySX4^Ljb>h%Z1C~{k_;QUyYCCjmf zea{aE18Uh%%jNgCKSI@Dgp^X6P7KD_X0su>=DF@s2$PUwEw{UE-87u@Zm;|AKYv@6 zb#Zk?Db=Kunoio5efRFIQjKLhX`b7@pJ$90LetRd;ei;2rt9;EufFRb06;vQ-o1N! z6vA%@l{k*CuQ5W;MeBZ-fbshA(RLhSkfu?2 zo`XgXmw-7viW@E;d~ z9S#Vn{@LirOQh)rAppW&7?$jirRnYK*Hu$W_0000kvQv$GNY7gts@Bg-2p-{oliFZzNS1~tsnN=1NGtBUImw&r^pyh64D!edjIe) zLI{uV@4L6XF&1K=wH}TJ7~`TW@}aDohC~>z?F~Y>xLZ_pt?Pa{UlwIfNX3#Qq0Cwn zTud0zof(Y>XgrxX<5SL@v(xE#{rMRp*fb4EFv4g!DPst-c@1{jsVljFGd>T6_MeM9!tmobxe+<^2K;Cqu0@0C2Usx5nmq{`mCZT?jr1DH&tx z)}M|iF47o4(_DzNwu4a!@pZfFRo_&tl)@Mr1DMPy0LiVr&F|(~_tV+fdWWX-sn%L4 zMG?*O94F|~v|O-aAiuuu>vN3|+P>|)_dF9yDg5KFYc9BRPWMJ#6(s}$$OI#Zq$y)b zYP7=`0SH3yTnI!db=qYzg8&F2tZ^)5x-(T>^NjbpyR;W6#b`AAIGtbq-jGYxCXDvl zIBV6pe)|3~L=OSb+H79_V~l0F-0k-CnB)VQuW~e=j1a=p`G`<5U(OJMTI;%Mbf?Rr zoZU@>kF&+>;rSi}h!G;yw|cS|U7IVV*g9=Ap_qE?)vbH}^cX>unIME5w#UBHKde5H z#dq_=_J}AN6s5MBGIDD>A-PiB`{4s3ATkkxnJ&h_!@vIg@;}R!XaZ?1Ccgjx002ov JPDHLkV1m*hRiOX? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_d.png new file mode 100644 index 0000000000000000000000000000000000000000..a82386bc508e98a82b9a9aa0ae0051fba432b9fb GIT binary patch literal 719 zcmV;=0x!{(7ywW#9{~^| zC{iRP%XR8F&SabE33`M6?fE;kvq+*WaTPZJB=R2q_n*JFSvCygt?QCa3?3BM5&#@> zQp#~HK&jw- z)RutfGvJ(0lXeIbf|V4;F68lH?-2g)|5xxlDR^DCMcp2b`7&EXU~wplqfiCL%=x7h zoYCj^`(d1f2hKT!5T#@sCeGRZZre7^ewP|EM`7TQ!w6}uNfbpGxgc11K#ZQ6rj=3< zjH{|n({#{wwx%qr>!o0vF^@vu_0BnC=P;0jP=`spR+C*$$CKxIZF`$%g9%NO*e)mt z0)jD$LN$$p3PX?aaWZChZF7s`xG2g{NdOi|-&&g{8>JMiq>nJ(?snI*w#FopLI`E) z=2{e8KQP8HMx!=9XG7mH#^|S~eH=$`=eJ>;n&##lDyy0SDXSI$eBWQ36G9-j7(HEz z3b^op9!`sMgiy};FpiS5Lw?z&8|HzrPHR)u^-2mi&u!P!&mZ6IvWyVIfD~0NIA2H6 z`#&GbvNU#HM{A&@?>mQxF*Z$N;^z6~`_D+NZe71kqHVT82%YoX+NEu~()r} z_{D%AjPLh%NfIY%nxC&m8;snyFQ1+s-@SZ4{syy;S`tdAV6adif+qYNA zvSVp%r^X>OFDWL#D^>6d6yL$0Q^Ah4x73n);T-zc-~SxT)BXP8x1f|@Kv8HZMO}Xa z1%{Ys`8f8-)#98F0lThFB&O&oB_=a@erTG;`yjX&`Zf`gVlY{e5*fFSQi@8Ow!U*A zv%Hw+$#0=;+Oj%3=ae>-03kGnwXT~O*O(%^zPz0--^%hl*`cW)-fxU?V2KNKi&HvZ zS2s@*TWoBEC@ zwbl$7qTpNtNuZ5J006XOPXWs6V(swq@_KwKcX`eL{N{|=O|~EUp1uF}$2_~3qTe>H z4W(%uJMVql-1hrYnQXEhq3E2`S_>f%0HuU=T~Z1$`VbN!QEOck&mpd93lx~&=4J6p zsYECmV?IA`-fz2NKigrN-SKH36Fwd{LZXz?+K~cYE->hr^L0@4Eli zWk$|n+rngrvbq?fWAtuWs^gb=w&Tzsvi-hV+)OAOk7rc)7;l(eZIa5 zF037Hw||j~syZp9ce|&)@1tK4@$htFKi>az^H5gLP4gfr#smz2bCG2R1t%#1W5}gj e7Qbyn|M(w2X<*wt`X}iC0000FfP)eJw z`zOnQU|d#}F-A-2riq84nitKzAL2!I~(@McGj!Ug2V}#Ov7!X3k zFg)$|eh`?dGREAk*PQdev+Vt5Q`R+3;<#zsqOOaoij3lAX3AOeyCf^<(v$r>6j87?{6ewLNMJUaS!dXiID1d1i4iHG0 zZnrQx_c2Y|u6uZRcs(3Wm&-ay{>yW%HN$we_EMH{7y`iS@%Zog3|-SC%ViXXr7@$m zp%BFLzJB@g=wEzGB07*qo IM6N<$f>;Gs8UO$Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3c34c55c3e21c8d4b23aed2914f8b65033408e GIT binary patch literal 956 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 D8PTE} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_s.png new file mode 100644 index 0000000000000000000000000000000000000000..579f4ed6072aece9c5ede1614d198b808d347552 GIT binary patch literal 913 zcmV;C18)3@P)WFU8GbZ8()Nlj2>E@cM*00Q+%L_t(I%O%pgZX8tr zfZ>16Idi|QHx6Dy1cJh{M5IU*^iUx|M*}6VfW({dM06oVh;i(Aon7Ntwqx&QW_CUI zIWrV~g1`8F^|K`8UkgR#8F6=WtgT*S(Lmz zd5u~w7rcA-2Hkb^J?xBk2!atwk}y3x=Et9Y=GDu;7=R!M@%)HkfHYY$ogSn7AmIIU zfoa+JK}1;=bgd>$Qij2x$O|0T!$1HAy>3{q6Z*cP?Fv*?JTUq6D_qxQwfso3Ug0<{ zQrfg_K@fVhU5oF>R8>xy=GeB)CwpIVe|Lj8IQ$yRloWZ25CfCRGd#})I;wKRVzD9$ zBi5@0rn1QM4W=pCWD5oa$}$z%W{s&F9LLADEevBI&mRDTC>*o6zvkfZIc2e-A3*D# zrfn$79Cb0DGxP$fOuQgK3Q3Zr2w`GcF4;Dvs%!qcm=ecN2*VJqTl#*$aeUPD?1am! z_eeuwdl7Y!QPm}m6H?bXO}*vj`iiD0xK-B-eS_nTNY}S$4eG@=-*RyH0?W3rEt@Fx z$%~xLX2Y9*{zgj4FTehVG8OC95-DwlVZgK`Z~uLblEUQj@|dQnkfuo~W2q7uU65Tb_b%*0PoSqz^g3zO?3c9W(jAF`sOHo#gcVdLJxV^n)wY7cl?y5E=iIlN=f2)m%1v!5RAur2-(v%B`OGA1|%2rGfZW%|LhBjhYeY} zCd(Fdx_c~}HgUYea(Rz2bl8?dJer{9vvW?4UlNb@Nt2JvW~T^Y(f18Ou*35HirMTO n!;mP;p=&iop3>_E-PQaL&v=c-oKH%y00000NkvXXu0mjfVP2o8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_v.png new file mode 100644 index 0000000000000000000000000000000000000000..a505e4776e0b0bd3a1d1363307d73f296159ad6c GIT binary patch literal 926 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_d.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_d.png new file mode 100644 index 0000000000000000000000000000000000000000..f39da4ec9e55e3974aaefe19e63d9f984e502322 GIT binary patch literal 990 zcmV<410np0P)WFU8GbZ8()Nlj2>E@cM*00TlvL_t(I%LTzpY};f2 z!12GG&vs%bjnh2WZ9K*vY|{>i1BbC4fFj@ocQ%kXA-I4zO~8Q*LenIqNeB?29oPkN zM5qT2z$65NYF(i%?X<0FOO{uYIF4icvmNvMDeu4YYI<vq_@ z)8zEYqgaIkjYfmrohFftunJgSN=da`0yTp_^)a(L`mTkM;+JW-U;=?~HM z3~IaE#c?O-85MszMLGU3uPtpNLy4hlR4P?u81TWTtFV(&tCT1f^As!-DI?T!xr#zc zK5wB3mDk@}Vmx-ayS;;=C=3RDDwPVpjCuRUF2mu7{r&*m&=Hvo;`cw6`DgtOb9sxr zX%I#+uIFPHEPnp(4brV9=f3|7ZyGR55>Qo4U1RsZ4rb0koH>1*C!aV)7z7+Uagx!< z;r{kEje4DQs|h=D?eZd~q0<|=)M`~~l@eb+ zcZ77S$;fe#aZD5^_+f}}J&#(o%GCE^mhj4zWh`?8+qOAz^h1!{kpKVy M07*qoM6N<$g60yt!vFvP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_s.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_s.png new file mode 100644 index 0000000000000000000000000000000000000000..35ffd3534c2f1a6ec4cae86bc81133773c813287 GIT binary patch literal 970 zcmV;*12z1KP)>nnY8wCm03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00S;bL_t(I%O%abiyU%A2sQDQ_ekis+vR)P=}!A4P$fCwpKp$HZSVj-eL5Q&wKDwsk$ zyMTqU3W`D9++8la7tdpJ-tB8RC(jBT$3hw!qUNyI z+h%cT4MWorrli^M2!a49ZQ>~A_SP-La5!LR=MT!FpsHY@y@2bsm`o<@-sy1uxtI9$ z<_#3!x*krwfl}a4hV1Tk(Ce;?KOXSG)88UZK^#Z;lM()8j8Ym=7-88Cj_m>(RhjYp z(kJA3OkPBYB$~6jev&V@HmS;r$#{fi*%(HRJdbcahrGzC*PA3sNbHAP3*X|z!;f)% zbRYfH=_fFyK@|Gvy5i#5ANc5*t3W{#PZ!0)LBVQ4QQ=~MQ1_Km2x+w+0 zbWB--Wz{)SaQU~lDT)lxXn1XkqGTukm`5MfXt&oXONf((Yrn zB#L5s-5sQ96U=;)H0AGmyIdZ>i|2WiWlmKoEUS*#y|cysK^H?4)SL!s6p*AbUSo-` zU%O7XulTh8ELj$DDEg=>!*W{q<3q|4#F?{Caq9FL%$iBftkLl5gi*+JI;GoJ94UDD zl?w|Y+Mh&GD(logJ*DZvhOZN9WWLb(~Xb2%GOGR14{J3+DH!fU)Qqk%BP8`RS zMMjzySeC{1)}QFE=a3{3S(YHA$@}N7;QJ$_l<0=Z;o%{_{Cu5hFk)l<3+CaR2NsuE zTwcSrUG$@)A-bk;YzKcbpxalx_~bRDX_KWPQdn4alg*89Ska)_Y%!Znna={sDn^t= zLfvhk>pC^d;roM2s48bRpW!vyxSmUrglzuwI;~b4DI`H~M3%-RNs6APB~duzh2_t1 z9Gj{tNYa$W_7YhdGnot#!l2n)Bu!$_bk0Bi9lBAGXEDO{Y!n7pyKf?e$=X9Fh~`rQ ze@qYzD9YmhS=MMa7Z?tYx$)0MYNkcAwTjs5-DRtDlV)oTfATNA-Zr{!QdJqQyTI`H sfL`w|nr0wOiy|+HLZ7P4D2tT;09_KBJuGtTrvLx|07*qoM6N<$g7?(E8~^|S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_v.png b/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_v.png new file mode 100644 index 0000000000000000000000000000000000000000..94ff2d3bf862d24dc12be2d81ff3963a880c93b2 GIT binary patch literal 973 zcmV;;12X)HP)H#;g9QKp03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00S{eL_t(I%LTzpXdGn# z!14cl^UZwo*x608+w6w4-9S>3OGFThAb9fByLj;CK@Wl_3q90R5v9FUP=w;qn>~3E z3X!5E*k~neEyt^ zW|KIMnXgtce4ps(h+kJ$5K;*IAmHweD&r&}9gk7AjSzyIQk<)hlMEr^$OBpZ>GTwQ?D< z3^83S62&o{ZkJ9F@cr`Jd{bN^({+a9F-j?tEaTDp@A1{#64EreIy*~$G(r~wVVEXk z;98}Ek`nE$MeekBNt1+v z5d5{Vfn^v(QG_y0!Z_xB77=!Obi$Cl=V9qO^7p4tdGhQTQV5E<9FF6V0@q6=e!lYs z*^51XSY5?+9Be6Rg&|s&;W!S}nHjX7?%m5A%OZ{<<`);Kot{!}G^otZ@`2xnAmj0@ ziIkGK-=|P0APs}l<758a*+Ir(NWIZO>N@pilUBRUXgH+h`>fRKys^AY+Jw!W9g;L< zrd-C9l8*1QcYKU+J&!a=*gH62cYmL+i%TR~M%(xC!w^GC*4Ecimc@^se2k{+bbCEY zlapwGux*>8vooY=VmS`vH6DKSA?2wlYONNPN`)KMD&Nk&N%mq7|MHT4zmJfTL7F1t z(TJIH8P{=$qlnKo|E5$w#xxABU%5h(B#hIP+s$oqT^lXSh=xP_Aiy#Vga#O<$?b^> zwMK)9Tn@`H==FN^2Lp}{4>>+Nqu{!@o`>T&Jeq$8-82~|39{X4;VQ+$UYmuvIVSRX zPHHv$%S#%*Pjz8|A&`#8gs)#?3c+3ffNmUfwOB-k-7deZtl(J|Imf|Oigu^N2q<|T vTie_Gv9?AjpC?Tca+Zaq6t!lP-f+nOs%UgoFEF@G00000NkvXXu0mjfo!Z8C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/duskritualstone.png b/src/main/resources/assets/bloodmagic/textures/blocks/duskritualstone.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc12099d9a6193b02d113c9f91343cd88285430 GIT binary patch literal 1623 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/efficiencyrune.png b/src/main/resources/assets/bloodmagic/textures/blocks/efficiencyrune.png new file mode 100644 index 0000000000000000000000000000000000000000..52e9f6c766386611ec42f64a41d91412353d2a6d GIT binary patch literal 1621 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/imperfectritualstone.png b/src/main/resources/assets/bloodmagic/textures/blocks/imperfectritualstone.png new file mode 100644 index 0000000000000000000000000000000000000000..528cc3758329d63d035141f276a4ee853c5c0793 GIT binary patch literal 1598 zcmbVMX;2eq7>*pHQbD9tMXlWiN8^-acXN>JLI9Hu5+q200RE`sX7>xMkZh7&On~Tk zR=}tTR;$*L>L8-XRIK*UqUemMRrn!}#cI`|Q|eKys8q3HHypM<9Dj6YcE9U=p6C7E zV=FS!=ZA(&3lWJ#p~e&ST6s6=0-|{|YXOkaM&^S| zK++}73m{%33Uo5rd3>HJ4X0R}jP%>cJT`}b7K!2$Jr0s81UzH``HWpFet6=P7-DFx zI9FvtOb$ILU{Xq5AgeSzn<_1&Fj}0L0L6Q7fxrfM67txJ>>TdViidb{Vea3C#n6xm zU#JxiJC$e3fb^^jKq{F^N+EI-Qe!eyrNmG)29hJF0!9&7j!97zSE_L|78-fPf|`rA z;+aJ9h?cO@iVJw&fy1!d?UuO}GS-z3qZo$4h#Z#7rGkZ&E3xyWM{4JyM;QpfQ7*>8 zGprr*Gm;jznAeI0PlvBybC^u8iS67-poEaY9?}7$G6c5S{P!BN=J-tTuN!Z)=CVs1 z0L}y)TkN8Qd|0DL!9wibF61{9yulZ`7$GTS5y4W$HelzCgjOt^$Y_SfUlZ?K`8aH3b`^F zOCH4qW zL&Fy)fQwlM=wugbgN8zkGjEWWE67+{Nl{XoR4b%ptWqh}!~#UB1Qrd6k_f3$W8x7! z{eMFT3r@lQI{8oCjBW|V=%2ps0%7sGkAPih9+%K17i&u|ibMgFk(ih5xgJ^FweSWK zes1|}XGDL(%I1?$$nu8D&MD7c9Xhx<#cXJ}t_wb~Xc?(?KX~^0tcmUC`!9J1FRy2t z*v4byum|N_SirbRx|{p;Q}qudbvM5|>S%8~GN-=2`_7V@#wB)Qf6S%+Denpk z+gnv4_KlxY*SNjoLdOU0OHpxqI$Cc1QkfLQ3_R*-FUp}4DQ@btZn_XA!Y)tBvv{b`J zs(fjk%Jo%5T1C;cuHzHXXY~eEK)}9)@bPDAt0O*)*_9JC=Kd4?bYgK%;U85?f2EP~ zGUv|vDlBUAI@qU}R@gAz#{Vp_O+c>?w6tj_TDM#)Hg8`M4*8JQoZ~??65qFN@wYy@ z7-A(>?#Z&Ax~WT~-#^mHOsNddyByXtv%5I!YO(Funr2_?T4Z(K)SCSb=0o03&4(-Z zo{mh6f4R#v=ckA}^E+4LW7mvLJucbs^8ThWZ!WzvDPi}77pAP|U-U48&0S&1Ycf-H zu@g_W>`)$SN2X;fhxS-1EURQGxd0oN`fgn`C!-8?&wLhsDZ! zW140elM-77y`k-^uJQeM6Y|hH;_l?x!8;B_`{F3Y!JYl5M1dlYE&pi6jlXLBe{`cE KooLc6S^W=*N?cC> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/largebloodstonebrick.png b/src/main/resources/assets/bloodmagic/textures/blocks/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/blocks/lifeessenceflowing.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d61d241b12edcbd3fe4a3719302bed564351ac GIT binary patch literal 7107 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 Zs6qXh1?e*)hHJp#>1!Kn)oMCJ{|C}6`_%vd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png.mcmeta b/src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png b/src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png new file mode 100644 index 0000000000000000000000000000000000000000..add7bf54b2b57331cade594d3217db037e3a563c GIT binary patch literal 7568 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png.mcmeta b/src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lightritualstone.png b/src/main/resources/assets/bloodmagic/textures/blocks/lightritualstone.png new file mode 100644 index 0000000000000000000000000000000000000000..b8415523a172a4fb6d96fe7b5ee1eeb6b360a8c2 GIT binary patch literal 878 zcmV-!1CjiRP)DCLyW!lzRXG03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00PoUL_t(I%SDsTZW~n; z$A9^QdD5R)bagdjmkNU$JM9so9F!4~mEyaXE_fCW4OAc4e^sBIu^oV0E- z^?cp=xN|RysbF;$M>^;KDbCK$EPxPTj71265MV7BV-P~n@B1mG00hPu09=6ac+B?p zHd<@SvOr47Y&J)0jSzyOD5xq$+qOt4iK3V!NyzgYX|3g8x#aqKMV@C&rxQ+2J|YZ5 zc6KJ@dCt+%5wqEhs;ZFEVZDCId_G4?i7TaKeS1qB$3#)g)zvkt)eTiu;dvg$81g(r zsRCml%QB|ZF-_AT#2X4ql`IxBo2?+2u5iZKQ$gdmQ$ zsGADuNTPYnp1b1PNAL3FF&sZQ;4rB8@}bAGs~3P^Fc{!@4nhbd^t^6w6Rfoi+=w5Z z`XqOkysZL;=Zd$o3BC(^6H8s!)OE#hIO=T$h~t>)bQj%r%=beM#se;XPdWbdh|j{NiuQ+A!Ha;g8Ed`Ate5ef1vq_Z?)JB1Er&@B4jH zPft&66pa`ThoouB&UhP7XmVxv-wmwB*{v&)+`qHsOy>_2>$Ovp67I(!Sh^pcX!cRqm)AH4k-nm z=P??EL{UstDe77wrR;4KLSQX`#c>=Q$Hf>!+qSr_gX_A)afG!NrAn-|EEaooU55~& zM^Kg}j^ofY8F^j+7HdK4j;`z8eCzA(IFdBYa2yH1zjo)l&=LVL&cN?Rt& zChGj2__1uFWJhyde&Z5X^uTPUmB$4K9W1cuhhu*1^#P9A(M~XPi5wh}y<*Z%sl01-P(yR?Y zW+zz)@&HNuOWHu1L=sWLSo4K^%MyZOoeDB!qwqO75iOCVrTaLNDgpvz1BHxB58rP( z2SW_4hgWJWsD(2C2a{dKgXLv8R;sLs!f7~t0hHz=L~a%6Jv`=@5a*$7 z1ct^;gd#mW9#p<%DP&-I0BIB&IfW`QNQ)~ljT*-=8Kgup6@sCN5|?8bq1F;u3N-P+ zA{$TJi9Dlef=gWKVTT}a1cG?IUWHesVEIA>!*Luzm55R)7cJy&ze^x}a+fr9x^gr#7Z8bh@v zR1?OUU2cJNQ6S9Cgt*7C+81I80}n`n<*h7R9Ik?;4pv~@4wi!q1}JeQaJvqW&YmAkGHq}{5?3MRIo&leK z@>5#+a82rA?cu^WCVN1*JjAY=JsJ3$U#Wf=)G3HE&xJQ*TToMHG$&0TIh(s$#(#co zw|CjW!R1j`N}J+qjvvpS^M1_zY5UYWztfjPj>VPxJ5Sfig1VdcpT5)@@!k|OQzkuf z+8^{QZrm|Uop-OcYvk>>HoG3|=_t^S#5V4N{fAR`?GJRPnRj(p*2iq#YQ4Dm($M_G z^M+sxw_*BK&KT9y{)V)?t1S@sh3tx~*S_xV;P9D}*8&aj?9tI_WnLNnA@>z))CJvRQBzZ=7?86IrX^gOmBIoI{CM&xAg~0b}aH7Fv++> n?ejh`Cp~!=y|HfXr0J4t*`<|zFK70Je#Yjk9AnMGf(`!wbp=8z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/obsidianbrickpath.png b/src/main/resources/assets/bloodmagic/textures/blocks/obsidianbrickpath.png new file mode 100644 index 0000000000000000000000000000000000000000..f06a218edbf5da9d94efd51a1529caf696323803 GIT binary patch literal 16086 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 S{e%62b!Xeg;EzAox9z|4gMFz0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/orbcapacityrune.png b/src/main/resources/assets/bloodmagic/textures/blocks/orbcapacityrune.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6f34ca7cd903de6444475bd1b19f1704b275fa GIT binary patch literal 1621 zcmbVMeM}Q)94@HnPzYf}5Otmhn?-5wqb=>7?X_tu`!Ub!Bn5D*1a zhKkDk912m97>#9$E}$Y?oI|31k(K}iO^Nf<+X?*xD0yM2c(P8g=}30eFi*2?Eo91v+~)(oH|JGB~^ z07Vz%b^x_VG$xnH$l|k%DWrw9ODP{l>ajZown(I&=W$Y&Y`{Ziu$pmb;DK{(FvQRr zI8$LnjZPh~F@{18EGkURuoPxn2pXRECZzU|f&n|=Dad2bakxm21|GIc3Ul8!0z<

      3Atx{_7Q#_XhF~ay6A}y~ns?lc--7eORML$%1zO?Z^idq9GS@jBqJbj-IvT*@1&k(raMhL`pL>iDQ%sSgbOM zMMfwkG>`)cAwv}stJy+XWh#YADKn4Sc^N-Wu8dPEv^Yu#>SGCV6^bea31x}#TAemg zrx@iXIb1yDuz*qDjNp5Oi~T2;)Nz2~SuTTRb4IHm&BpSq%f>n(oemObG7g%}cg6T_ z=y}3=z%gz>CvvPE8kU%3Ug91{6{uOMv`BD5NZm@wtrAK_VG`VGCWKs+N~@fJNBH#r zl@1YtLVR`dueurC5{l6`ebEKN;zb_;htNEn&?UM}ZJi>Ke_@hdo8jq-HZ910H9f5M zsraHW@8DlfI**(V>uw1hS~oG=yS%cw^GN^Vn~vM!#r3C;YQy1* z8}Sp3hEiSu4XIycFBYuld|_kM6<$!02IH>i#VO&9B9eu{32@TiK2;FXh8 z^?}XrH|$EjB(5yF(_7#*VXLA(9#qH2C(km7!vY(a7VniKOrhEP&4VXDAAWG}(xumX zGG`ZtjNO`e5#54LBC2Kt4=p(!fRDS~-P&qSzt+1rte+?6F0Au2Uj1y_)T!6P8xzu} zZEHX4O;7fdm5trg`&)U)(pu)uxng(mR**#=EQQt<4|087l z?7la!t-r41R~p|JlH73pYS)2tcO2a}^WLeZ+jBpvDGT0ETIrs*Qq%V6F19>(f6rh+ z{L$D2f36+4e=EP{%gi0f6@LgE^E(8-W_sYDfXGsDkAFQhp`*MSvF}U^QQ0fo@+@-XVdlZN}Q%dmP$3K}rE(=43QRp9XU%RV zl}VcDDO=o11!l3VO$kBy`T3%JiHNqZf?yOyAu$3Wh>$}F8K;%S96~FzU|K;#Fu2`f zV=c55a4BLYI*(O>oTtx1plo{mb73npl_)M{kOQ+put*G1lq;@DG{Ytl|GM!)G?U`A z5l|Ar(0O*8yAN`~G?~lY%MH1JoHxn@yM?%54MO0-d-T391S5d?;{QWTY{HCnYys)&pV zm8%ugT%DC+F)L0?+qQ7Fr?~2ua+PX3fw8nbg{E_+tH78=vow=M+W@s1SdwP3n(2Jz zUDpjg3s^(gEo%sKw4J7a$rLLsFEEdYWnzj4}m{J$ZdGJx}+y{Z$;;NR|85-F@BsQ&*SU=1}b7H&#?TvO6nSl2T#OU$d#Ek8As`ugOLL#H)p8lpa4_YY)V Bhcf^G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/ritualstone.png b/src/main/resources/assets/bloodmagic/textures/blocks/ritualstone.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/runeofsacrifice.png b/src/main/resources/assets/bloodmagic/textures/blocks/runeofsacrifice.png new file mode 100644 index 0000000000000000000000000000000000000000..d762f0e377ba20ba0263090ff669bbc81634cf1b GIT binary patch literal 1614 zcmbVMeNfYO7>?+scH*jsH~eBDFs9zxH2ow!5NHchXAx=@WOXA=Qi#x`q(Mqm+=)A- za>AH8<(v#WcY;G@Fz4hzHWmEb6t^J-MF)x>C&<|J{Fp37>h_1{AIl~AedK+f_kEw= z`=&54VS&G3h5!Hne|@~p$d5wrGr^C4mwcL`O9C+jV^J3@R6I?{o& zl%1m(8uT(^7AA*_g!o9Gr(m-i3@?aj$EZ-eWUv#n!-!Y{+ic#vMyws2k^DD|ms&ea zd3F*uk`5+^#rgBFhWNm|cCU8iHRPjFFJ>wJP_Qf=gXh>tn$zndA^wY)pa``T!NN)0 zDih%{R3#!vIVnPA5{1ZW!7-~WToJC4S$sS%!=oCFmcL^pD6c*eE7!gs~m+! z@x=d?4(5Y`y>;@Ry76uC#ps>B=mLK6qK`N2%r2ydP(CcDMPEV+@llDXl zzin@50$Kt!65~wqyu}k2mc?y*tP5IyYJC0Q<@wRW8>@|bcYlHOXT{+$garj_#_TXUgW~ldWc#mBpoEX!ay=kF)UD#(A>p9`L zEj<(bIxe3I8Q*-^_OoN{y4RxTZIhm_BA17{E8Bh>x^CZ8Y)_``nVnX9|LDDNLA*iE8^I=_XdT(iTbo@ssdw!Snq z3NA}d{^-GjmLKliE}Pl3?%~nSwK+K=ciWoz8|e!3fq=~??|L?Wm)`eo&CP@6pN5|P zajU;&&Y5qB&g~72_uB8e8XD(B6^sG4>XOVg%Z^`BAGz8cwQuFhw7?rocVnu5Q&QZ5 zJ*#hD1Ddp0)}iX^okf$U#{jOv;r#B$&wklenSAhJr=;jMC;0rhq$oC|U}}9#P+h>d zaBam_p?R9%ll)=0sBnz`Bsrgt1h&eEYz9U~rZ5{Uh;2QJ?d| zjzwXvWyO0A;K#lk5w_KZ9T^M~~wS2~0_l8HBaE7JhnoeBwRt6zBi1y(@$^!upy}AhX0ZHz(5w@R2X17FwX18=hRebI b<-l0r7DsjNYilg`{^9kp3AzKCwDtc0MPYE0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/runeofselfsacrifice.png b/src/main/resources/assets/bloodmagic/textures/blocks/runeofselfsacrifice.png new file mode 100644 index 0000000000000000000000000000000000000000..e9152f33ff824d7c8de1d16b5fe9153e2e1e833e GIT binary patch literal 1682 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+mc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc$WX!DQqR!T z#M01EN5ROz&{*HlK;Otx*U-?)#N5izOaTg%fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlviP6Vr?>OfAfflVIjx)9++vWMpP!XkcIo41Gga z6GtN#Q)g#06EjyMa}!5LQMLR zn|KwMRo6;(v^o3DL^Qn8wHCL|8B#3|E}&+ zmF>e1j8A^o+)LUh!PWYwuKxbdp9k-?rhLkGZIz$N^X~jqQP+u`wKiPq*RD0>IsAFg zB8~3u_|%({vbheEGwy#sC@7zBYeK{{*(pXrzvaTM$LF0byJy!{nAsH&D$2$x zr{dY?rq0xO;Og?_awX^QNaZ4dN_e^w}6uWpPVtorEiA;FMgC9h-FGL+{{ox7CG4y)24}e zGC8S-v`DR56&f0*8tmyP5XjWhls7&s*s%5? zf5-YjwY_Jo&+GYH&HYwk^S^a-fc0$C{`Tj!a#=OYJVky!+Z!xD-ET!!nPs`ird=;N z9W$C5+h!nvIGM>v6Dx0FYBL8ZwaP%Yu<>gTe~DWM4fdyIKD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/sentientmimic.png b/src/main/resources/assets/bloodmagic/textures/blocks/sentientmimic.png new file mode 100644 index 0000000000000000000000000000000000000000..b2393417672214f81a5c19aa6e78388532ea6120 GIT binary patch literal 901 zcmV;01A6?4P)N2bZe?^J zG%heMHD!e|WdHyJ14%?dR5(u+liP0FMifQ$4~?xjLHp7lX>7@oco)UXaCn=cL^VL( zZ3m8HTeg(+2Z9!@3#UNSe<;u*27>-ouzLJJfEeJoLm_Ggx&MTfZs?bWc`zdij?r;MfI2T12$3mZG{~{$eT$ynUJ?$7qc&)ZYuh?aehe=Q$sLyOT!uT%9erxqZ#8zzpIA zm91DdMp*1I(7|(g8B+R>EYr*|NFZQHP=AB&Mrd>RuQGk2d;4dWolzxMpIb z7taaYlsI?s)tp3o;*Nvw&G4LvI1n36i&@v?j|!4la?n_&;;mj+G)*PTHKCQgcqt(& z+Lh#ACb}Mr#VJ-|?~TT+MOo@TXHd$f{SbxptAZ$#dmBsTN;6%fmB5l8OW{zta_?m( zg)5BhI2=t-k4el%$E49WB(k1L)-;_CNrPvy-uuL|rRCv>M22MYJ(D{t_kcvUPzn6( b#f1L>y44PyWMxgZ00000NkvXXu0mjfo7Je$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/shardcluster.png b/src/main/resources/assets/bloodmagic/textures/blocks/shardcluster.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1cfa3e79015228c3fce6d4651e3a6006f3a44e GIT binary patch literal 891 zcmV->1BCpEP)rWIBoy{010qNS#tmY3ljhU3ljkVnw%H_000McNliru-wF-^4LbL;rT_o{03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Q4hL_t(I%LT!URvSeC zfZ=~tPEQtqY`5EV4%?!4XZTsoff<9rCdIfRIJYRy}ZC%y6Vl(pK!YPfYDsEb=wB5op)K zG=^NKTo-o?lwxh}Y0!vXzt5gHtN*4m76pP^am4_SVgHat`I&vr=(P~n8${y? z&Vn;s8Q@wjSA1Zn7PO+~cyx?SMr#_j#fB_N(MC|IEpFdo;Ej-%T=4VaCw%2oW&%I- zSyeG-!IWkC#OdIIus&j~KBAk34ga*U(#3w zIGRIwz*5IF6bM}w41;~{(i<#S5{f>#(g+hV%jazD9ibSbYMb-uD<R-*MtiSeA2^IwrD1HtI9l2#yC6y1eBvf8^Zzjz5zt{s;4Hc?yn% RJ9Pj6002ovPDHLkV1mB7i*^72 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/shardclusterbrick.png b/src/main/resources/assets/bloodmagic/textures/blocks/shardclusterbrick.png new file mode 100644 index 0000000000000000000000000000000000000000..a2510fe0c89b794194c2bf835ce541c6f99d6d8a GIT binary patch literal 809 zcmV+^1J?YBP)rWIBoy{010qNS#tmY3ljhU3ljkVnw%H_000McNliru-wF-^4KNpGPaXgO03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00NCkL_t(2&jrEjZqrr( z0N`^!wv#w^>!b}!n_BlQ`@B83yzy3aB zZvw)fBZ%z`x0R(t-Y;^`ApP2*MxNAAZ6wlN)8Su$Pa29$)hvA*N&G=?3 zx503TVs?B%UM61T0MI}%02*7AAiqMdue0|JXjm5kuiwe^RrtDAH9;6xWM9`Ma9%u^ z-iiAW4Duq+$)^DE&Y2;I3#B+F_lE}xInkZ1RS}P8vTYihMrcs!1~GO*jykC(e3HuD z!oQHM>v$%>fC$=6-7;{DjR*($L8W8sVZ@aZgwlQU-!zz+UTLnGjkK#t{$smqce28> zFcwPhs{6<#1+9+BNc$K{o#AX}e-LFM1&qaHIbB^PZxMum_Co2*EO3vmKfYhRc>avO zVwB#t*YC#fI@fl+9(!Yw-V|`q0BwY6Ch{4l!;SvjOVj^x+ZNB^u$f|nqOMYC400000NkvXXu0mjf3UFdo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/simpletranscircle.png b/src/main/resources/assets/bloodmagic/textures/blocks/simpletranscircle.png new file mode 100644 index 0000000000000000000000000000000000000000..d178e55befcf6815c66bf5d4b529f9d9e2517f91 GIT binary patch literal 4254 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/solidclearmimic.png b/src/main/resources/assets/bloodmagic/textures/blocks/solidclearmimic.png new file mode 100644 index 0000000000000000000000000000000000000000..8c571249a2eda18245fa42b9399dad3c53c973d3 GIT binary patch literal 969 zcmV;)12+7LP)N2bZe?^J zG%heMHD!e|WdHyJM@d9MR5(u^l1pzJRTzf7;UX%ET9u}vA`4ozaS~r<>=;+5QX{3Y z9eZNW*b`r7=FHWxlLAr}K(3QG32oIqLa0rsF|gtvAQcc*)xXpQdN{E7bac+*J@5Cv zPr`qzhLSH(Or}r@X_A=&YEmVazKQux74w2lF1J7`m*Q42Pdc5WFq|k@!r>;`lDr+LAm4 z(a>Ue*~S)|1Z{!uLRc6Uc?P6xzaeS`0La(|ocqnOXH z+Z@M_XiH~b$UOQNEizeEIw&aEGCTcqOGzqaOjG4&L_X|*ULZn{q>(bJsaa$Ax`9= z=~bdABoZ#|cXblt?G|BZ;j|qZm5Qv*!;qvKQR4IOW)iGNKno6pD= zGPmgkJ-N3_vs7g`<8gR&#KY4OLD!Sk9Y*oj|GV0na#(c@Y}c36x)S?25_#z$kW~#r z!J4j7uW4xY7Di2H&Ct>HGFnH+XjQ40D`<_T{LIG7e|EjWcM2% z3x>fOPA{at?#Pf`9$aZ6tQPG+5?fwE$VT#W66IW0VR3PhPFHd-B=-{O{#6UVXXE+- zT{)hlF}h@8c`id&V($j5ELF(=$ANjFhB}ktMz%;YHHVV=l3;-KE~}(<00000NkvXXu0mjf?C;4E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/solidlightmimic.png b/src/main/resources/assets/bloodmagic/textures/blocks/solidlightmimic.png new file mode 100644 index 0000000000000000000000000000000000000000..9d020eddb71782bb5bbb905d040145e820f89e96 GIT binary patch literal 964 zcmV;#13UbQP)N2bZe?^J zG%heMHD!e|WdHyJLP z?Cj3Y%+Bx0Zfb%QBFUPx`y*>C^g*a^LbN2*AU^0zpVXj4|0+Q~p7!Cuy@z|xx##=+ zT*bcoHn+_w(oG39;>-! zLa#;8@_1Cfjvf01Zb9e zCr*lk(TMVTi7gSjQynLzPNJl&Y2vVfBRW)!0=>PybR6*Q@56sjem>>p@%Mc5>k+%d zF5PE6ij{(h>f=TU>G}sK`pOtV65va>qFxiFZ4$rD>5DV|`um)Ve=ayZ{)yNQal#O@ zT#}c0;#PpObQ#53eHU*d!b==V57aj*C$_`s>35u;U+~)>e{%NYF;38;6$X?`6~e?O za5jX4w@@k#mQ^pwGQRiB4^bZLvSA&7sVT z3*l>D0|PCuvLB}C4i4$}c1fCT?7-*i{Vt2JSZWG9)qF*ACJjv&mkjE4jiljWyLB=(;ouYP8jj4fo?oL8$1-2ccKs@0 zC&u4w61QD!Th@YiTblTBi$X!ea++kTAEMlPt;Q5>vq>}fOgi~& zx{1IxEyZ7t8p=NA)BE?xR;Go6JD17Gugc0dy;+*%w#1@2OQwDkeR+(^>KF^g6e&5A mHfBV53Bf;Izk;#y9{&U2;R;5ZjHbi@0000N2bZe?^J zG%heMHD!e|WdHyJKS@MER5(u^lWR{LWf+F%7x)3OSWHZei4=Bsc4kiyDq3pE9@rxc zdzka=3=1|PF_6Go=pNWAN&kTf7MHZd_`x4wBpUQj^@F*5+7I*LeKPNJzt4SNkK%m% z5$T*paydydv4*ZLvZ$}HoLQjx$qdHa3>h`SY9dEGonTqbqU$QDTnc;U9?F82X1!3w z?skYwldiqX!D1G}ve*wCEZ3mh^?91q@B<6)TaTXMQ7AkiDK#atu!I@8JSwaaxHi7+ z(qGJAh915X5IS9{`5Y%d!}omo$Dy=Q!1O{?Erp_HV{)(v0+(95PQKA%vsR{AC{Sx` zlke22Z&lc?ZBlPkX*LZ!&%xjG-jA*1Vh`xHrL$vFH1eFTt?}~Y8Ry3*c%mLT9foH^ zUVMMS+3F*zrQ&~<*QMqAENB@NJ*9J~#W+eOC^pIr&c~dsuQ56u;DVu=q`qr~83D2gMdzhAzc{&vml%b&TtnsPku(|z}y2z2lER|KjG&C6;ev2R@Z@l^`8uGYQ=0MjtlK6FX1tlRV1n+Y7 z4I0HdFV-K@ADuHC922#Bn7+r4&-zRT1IAxHq+BS|5kh-Htd^1naa9*n9Bd)bs8=Wm zMB7`N6eQA?z*8$$rPiX^*pieCc6J&>O&8PILDPkUB{hvD^W=-`G{aEl3pq;13HCy~ z{Wf9G!8Aj{rHrV$l9o-W)SzRv(c@pBq|&Nf{uM?pxlVAz|c()aMl-_(fXHa88Pysv3e;dLaFdkv$bOau;yNiS zU7&=O<~S@HPbwg>MFpxWew{}n7Ml!Vu8aD z${=OEaw0t#Y%R=1K%tm}2>4Y_BH;@qNCY_Yuo!Ek zPA^f*5=Lw>D=90RqRbKqqG_5#^Ed>#0z$-MF$8lVE|<+9*p_?~g<9Dr%k)tN8D`Ov zxS7HU6X;e%HAF5YWig(<3c+YrDqjnmEF+0xQU+O3GlXzp$Y^xOHH@}UYV2P(-iWrO z=9@7{jai6XQp?Y z5fLyVi8t-f+8&0gc*#B181e< zCLKXrX1j0bRlqWg#Pcv+0!bLb;S@{oH<;(b0$3vyYS~;d6S^Md>)EIXMc7=uMhqi} zP^jmNStESi|4kjlI0d=uHy7F6j_p@yHc^*ykLzMFld7caIwC=w-`9|}VAGyJ_eTTozqo=(=MLW@|#fq0F zGH&(W+*(2YW%BqZT`xzJ-@=XkmXbAZru;M_%bjH05kE9l9-^+-G2&syh>Ido3-vAClZe| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/spectralblock.png b/src/main/resources/assets/bloodmagic/textures/blocks/spectralblock.png new file mode 100644 index 0000000000000000000000000000000000000000..996fc22a8a78d6722e0fb990e9486e5e41a3448e GIT binary patch literal 15123 zcmeI3e^4Cd8OL8R#)wt9Q75G1m~-<>raAWZesJEpTufOAj2s{#4KNeK-rg>3xVt@W zm+V0l(b#&K#?U%;G|`EzE$UFksXtR_l8$3zVzJhy%^$_^N8=C+=?e=&a>#YtuyoW^Hk!l>y5xiXSZcF7 zZ4Rc9aj-52%Xn;d59~@LNJ^O#!>);VVT! zwMd+x$jWLgEa*NZEVM~EXn8O=!J$6uVkmO)e%h>BBE5y z``|!{q6ArcsT34MhhXzKowALwyWF;bhhZQE!F#*laSM{*O+xhhQTKVFc~$H(cS|~S z@N0%f+~aNgu|Sx4sj3tW_GdTJx3GJYXW3?{bMENuL`X@VNl_uD zN#>3#qh_~U<`B!AQKnCF=dyxmo@PGL+z?WbqvwofmzD8MyD9%~0aNi2_r-Gy{gyqs`Mlq|7ZuYIJUWW;=F%JvsAGV_`4A zbqUEDFdRK^ESou{Z!&8d>PqT84mK} z8d#g)!XiQi1Q$vJYZF{pM5ut^LTO-af(wfX6%bq~4XjOYVG*GMf(xaAwFxdPB2++d zp){~I!G%SH3J5Ng2G%CHu!v9r!G+Sm+5{IC5h@_KP#Rd9;KCw81q2sL18WmpSVX9R z;6iC&ZGsDn2o(@qC=IMlaA6Ul0)h*rfwc)PEFx4uaG^A?Ho=8OgbD~Qlm^x&xUh&& z0l|gRz}f^C77;2SxKJ8co8ZDCLIngDN&{%M$RVK&x2Q z;0K^*4FG++0r+eNUe5#2We4CwD*)^h04!G@-Tu2u0P>Y;eq&?&udYX{V;@$2tAbhM zI6>X@zK#A5H9lQ?mOsUAO1_r(a{&4Xg+*8(mypd)jvMc+uJ+7f5j5;5%=B?61yh87;hPyx^L$EC+x9y z`Fj?oXW~25aAGfW?A7qt_DOC-`@wTpfuQ_O(a#@YE^>A6*5vo;#=A8)iy!Pe)AaBA zwkM9C-uAfET|aTSVo96qc;(3zzuwhpbQ*h><@FW*_zLjH(H-*N2E5zy^FZa28!U%L z4m7W!);%L0Jh#rda&UOlLy6<(Ke-b8Xvlvh;G7TaFW>S;V)~Y%(WeF;+nxA3S0~AB zXY)XHA_0Coc!6>hT3R};H=cIB5|lfQ1J5d}o{1V2{BKT2X2N5yH^>3L(6YiJ$#U_) z$Vfhr*UD>e4LrYt9=P}LJujUYy)gONe~Y)CdE+_Vkk7WBt>u@3J&6Yr7Rzna!}}H9 z4t`N{^5PxTG*|cKA1LZh{yO=VbKRvz8y_^5%cYiojo$&lpN5CtoA~LzGlw?uCu$Bp zdww&2ov{w|F_oH;2ZlqPFJ7uh6fM7c=TwjI{n3XKcgnT=YG=pto66s6J^QQmzu(Qj zbyx8^D&NvAQ_ia_dDL3x_0-EPA7At3jZ}c5_A!GO$1lD4HYgmunF@eH%g^{52iapq zH(AP@#Z-Ln`-$Vzy+>#K{6>C-<%5>79WTB;JXGgAIl8xN+tZ1UUORPg|DSgqy)`gA z^6AU#XI?#Z59s4Roa826J9T8}reV-sE5w)2nu^PFq=NbK|b!M)GF^T-bi TT)#A5Tdl6B<%ho8`r!Wn@CC!D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/speedrune.png b/src/main/resources/assets/bloodmagic/textures/blocks/speedrune.png new file mode 100644 index 0000000000000000000000000000000000000000..e60fa0b0a867311adc70c511a37d457b78946ad2 GIT binary patch literal 1693 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 E9|ukAWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/stonetilepath.png b/src/main/resources/assets/bloodmagic/textures/blocks/stonetilepath.png new file mode 100644 index 0000000000000000000000000000000000000000..1432c7cad74786fb7ad39aa52770c30b62afa587 GIT binary patch literal 15846 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 Qw7P#GiU^ggMw*!Q53#_FivR!s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/teleposer_top.png b/src/main/resources/assets/bloodmagic/textures/blocks/teleposer_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4196975b601032b7393719af0724b465ebe35a GIT binary patch literal 1703 zcmbVNeNfY87>|57L^$!rrsJ4q(Va4zrfCapBh{lVUydRl1u6qIqyZwdscE1E&y%yL zh@g`xbBe$L^9#lK$*!C-h906!Wu9`NIGKWqA{*id2gp(cw?91pSnl#Z@B8NWd%mB` z)`;+6cULc0007)WLsU_m^sv7!4&3_f&Qw26e8vW9*=RbMHRB8k1nB4_5)9SjDP$Ch z>$281ll}nUxR%mrS*>e2 znjCuTlvW)9DrtrUefhpHArPXVM8-#b#WED-fkFW)LQnxBl))&9i6t272TnW?XN}P% zV^ON030vGr4yCfJ5knBO*~~YK_%xG(pfZ^Z5eN~X5atlDDa*j(7T92#H>p8Inh1t6 zvJ`Cq?HchUI)jx%oTqO?&>Pk2cZvd?ft)wka)#oHf~Tu!B12Ca*ie-m;=b^8lnxW3xRfN4 zMKB?fNnjl*CSjRK;0q@w5qPpl>MNCqk|y=Mk1rDhsH9Rql|Z3Tp=h8uKq-?1N>oCn zP$5x?rHV;zsKLbI27;WlO>wp-xXKT5F(pIdEX`A}Ukd45iLz_co!3v}6a=ax(SU*%CWtvo5B$2r#l z-|eyI;ELj&0+d%Z@FtjkHN0rux-@Iq2J&=+)8QjU&zUaQmnp6ORq*YEzv8V8tFFym z+6XlC^&PWXhfCXxiP7}W8OqKq2D@|jac)<-wB*Uu9||fLmu;x<$cveOeynRj^;Vnw zw%8URc*l-cBkc_y&$-@qWBB=w%8HzXl8e*IhEDxm?WuTV z+rF!Op|I&}qb%k{H?$+NxcE2?*Bm$hnYZ`Ai;kYlas4xWoFkhhlB1b*=PVaZiFLfk zT{Lo}2-)gKU!IgDio9BeNHMVT)eRgBy)K&3sT5plh7Ydg&+sV7%9CDnM z@?GvUhH+y*RSfALIX_k!1v7nr|)4$?c#i7`k(MMj+ zW24ZUXGX84!v_vOd|27p>0W@BT%dNXUPi44U6Ph9YN9$j7S2udT$P|uBwRancVJ-d zncd>Tn8GQS;!C$UMXU+S-xv=^$261=)SMADohX`Lf5KC~HqyBpyEi_rq$U>G%Ulv^s7Aa zKKH~0t{bV?lF|YM39e4d^vKHC&sQli& z2Z6t6+xuVjcJG-Us~jD?RkwL-O}%M!aO8SfbG!IshsgMvmmOo?=kENmYV>u_zIwNy zO!d>k>azxHwpE(1`Q#?<6RCIl{>;raaCmXIZR!-Kf`BluvFQS!{(Mf8Xc_R#{_6-0 L3|G}CR&V?V6bP9` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/waterritualstone.png b/src/main/resources/assets/bloodmagic/textures/blocks/waterritualstone.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b3a91f4648eba658890427a25a6a6696629925 GIT binary patch literal 1629 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/woodtilepath.png b/src/main/resources/assets/bloodmagic/textures/blocks/woodtilepath.png new file mode 100644 index 0000000000000000000000000000000000000000..18aa04777a93b2378600b99005ffe3ba82d52c41 GIT binary patch literal 17780 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/wornstonebrickpath.png b/src/main/resources/assets/bloodmagic/textures/blocks/wornstonebrickpath.png new file mode 100644 index 0000000000000000000000000000000000000000..d2774c79d31775bf784e072b4dde24fb9d38e01c GIT binary patch literal 16299 zcmeI3eQ*@z8NioN3q=^BH8w-1?XgM?t(*P0+q>J%lVLU zuY^nSzOFsEMUhJJ2Us8Fi&zK zMdmV+#6g=#Q#6=Znk15PP!7pqT?2M>PP<5hs;gRqIzq@n^@xE%PJF(>*g4l53grx~ z>E5LPK?-S3ORcUsB9pbUrZz=I*}D{M<*r=2*OfpfIYT@dni1D7$CVMx3{BE3Q3}Zn zxxile@~AB6YP3#OgYION)ua(x%F7c~Whr_<2}^2Bo9ZHAlT5xd-eixU%WhDQc2J3g zm9C>1o_2teBq%3OQCUusGa(;7RZ;@YSw0woa?~-v2g_4jwvVitun%y4BtaK$$V>Lz zEI*RS2h?at(A`Q%sF%q|xZXu(2D4@kRux~a2GuB7mh85=$XvrYtvssOWR&%^uqbOF z8Cq77K&lc4ce+qNbTq99D(+<4kW^8T_)JiH!0KQ))=7vm?IdVgW(f|+glLs1hn2S4 z0~F^Xjl&CEWY(3cjnp{Ecd-QAQeLmsYjZM`hvjJ6Yn$%zveP}R$K$CeXKl1Cx1;3f z(4}W{L2cZqC!de63TwImxKw%E##$7x7TIsJIUEd2FjT-!1Q?r4_#K=?NPZjT42X77 zw$X_q8)}}}V#;+oI&htvAZPVk9S$1>2r}G=1e5E`ayBf`eNhEm7ldHeoHSR?@06Sz zClG!rU?mv4%|SSAA~-dolcFTfFVcdT-b)TQ!$MUmMgcVs&1a&3X3Gx^9nBO_qJu|- zs3sfzsT5B)sKJ(>tcg@*B>EgLh(_;si$?p9B^NnlG_$NhOILD&GCZ9(hG3Za$T4CK zav0TqlCBc7Ms}j90X-%}Rb(1rK^AaluMIJ6N4)Rc+h-7BM=fz51fNxW0{&s&Yx#A(O^?z zzJsB_2i%#1Ps%h~4V%tKn`WzF(~RYuu%f$}R5WNf%gVShOy0H32G20E+s?99)>3b43nwKdfG@_!;+)mSq3~tk%P}s!!B=w z7oVH?BeSEM=@s&227!Q}MH3gA52Q75K|s)=i3`mK(wev+AZXFVh2{fkOTo4enXyQWifwU$r2nbpGHE}^e(4vV8%?Hw& zxF8^C(Zq%318GfM5D>J8#5FGSX0jXxuOr96d&k|6R&d~*Ws6u@>%*{RQ!s4#qZl@D z9en>C!CpT=mf0FA5UDlG4D~I1|`Tpg994Y$? zSKc12*mqJr`{0X5n`Vqz)p~qI%jo52-oA46+`qei_tCmF-JRuq;qN_Ca?3QSap3X? zMelxc^5hF09qP8cFD9Spcxl}`JDdxMPkZMa-oNuu=h==8_=meoIBqTOD;eF}?fkgC zkzF|UvoCtQ$H5EUMa-JEcetMCR{s%OP%{2K%T{g2>d_x>J9ezThlR`~Wwx zR#)HLc`7(_%gO7H9Nc(i;Mqm*@l{ox^VcT!k9~9Q?txv``aZc8$F=7lTm9ks=bE?8 zKU>Nl#>=1IbyPTGdqV5Z-@Wag)`Hts<*&3=ZfTe`Yt4qv74&a6SNo3rY1@H4qc&;P zOA6NJ=Pl@ccl9eBQ>WnDPn>(mllQ~km&@F*)b#9XtJr$=;>AndVCNl6jyl$|@Ic|fN5@z7 z_5F2!=M?q#g?%jqyMN=ax(57<{LxvP@2qb*+uu3XRr>R`*{^-`;Hgb3fAiyxrkM}6 zz2?R7+Btm-_nf+I@^yXbT4JT zJkoq2w!pLG*C!6u|Dvwo&YkL^{&iDduJZik8C+U?``%aECRcpA;crW~RK(7N9^Z>y zJ~iu!Nz~!3>UX8L=fAPzj`+1JPrH7(@7|{||1Agcl?{LHk(ASO8|lYBA9$Y{AN=R_ c(OB2d9)95uM_*cIyiQ-`t@gY=eesI_0H1Unr2qf` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/wornstonetilepath.png b/src/main/resources/assets/bloodmagic/textures/blocks/wornstonetilepath.png new file mode 100644 index 0000000000000000000000000000000000000000..0df77da0b5c97a4ece61e8cec3be21caab1e333b GIT binary patch literal 15950 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 LNkvXXu0mjfx4s^A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/defaultcrystallayer.png b/src/main/resources/assets/bloodmagic/textures/entities/defaultcrystallayer.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2cc19c4a9dfbbd91cc51489e778f463e2121dc GIT binary patch literal 7231 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 N002ovPDHLkV1jpX2W0sKis zK~y-)y^~Ey({UKbKfnK8{QtLPn{Ej?4JV~RvMF z23bpI$gk&FURvhE*k@I!Pi?etcehu*B{S%)E!gXhG8>OE9*z(mA0wB`5gZ&=n=Tk~ zD5<{{;Pul<4mrwsV5*>RVglV_MK^TJlhgR#hqdJqvrgdRi5%Om?_aiCA`RF;c8ZV(x5mYZ(3bnPmW&ayJe z_XecD^`P_^N`B7$I^wuqiuu4{EUS5f9yiHz5!x1nc5F5q9#1Lp zc$_yQp9)jZG>zC|8rGoWyPGM04MnxpSj;ATRh4AZSy0;6LAvVPDNT~V-_^{$^MiC- z4ODdnGjsFUZ3e-iErRsBh8#)~IYkI3k-c6Xz8m?sDF63w`~ly@+&}LxgG~Sc002ov JPDHLkV1g9j4iW$W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/explosionprojectile.png b/src/main/resources/assets/bloodmagic/textures/entities/explosionprojectile.png new file mode 100644 index 0000000000000000000000000000000000000000..94323bc45b60666f2ac217d2d6efb559514e712a GIT binary patch literal 1463 zcmbVMeNYs27(PEjf^?L`FDloQ95MEG_r7=GVBq!+E;zsghZ{v@Z})fH3b%XgE#AQ& zG|8v~Qfda+3{9C?CL=0iW*teUK&4m$OO(s$|TBT5<;izd66&pSmQB>-6(!#e2f-95;&zAbHD>J>e)^GL*a_as^gO3ROn(bcGvmqJ=cbr4t3iGK3PN^niA%U|NOi zU~zqSQ>EAFbt*@gXDYl-L*goZj_qW~z87Yca3EL;V7E?(rlF5UwfjnK+MmScFIHzAav@e7kc zU^fHCEbwk|TjvK>MQ&N-S$)$yv*}9RrCV*gJ~=el=0fkp zX7#2YU2-gUU3TK)A+5HvKRW&NjMVez-+UwK(Mvxsnn$H}cc<(usX4oEbM5v-))#ct zk37?-&OaH4wYAN;a3JlS2SfIi7e-bzJ^y!AgD(&zs?-3Oi67X6#Kgpnj#Y-P8}Am za)Z}$t~rW>z_y$Bu600#o(Xj7?A6c(1E(fe)*Bq1FaW}iAc*ad-ZF}77RmojeSvZ{qg4- ze!HL5gCFd?$JFoKdLW|4Tr;qOY;3GOlBhhn!Rea6X}FjnD=rStTXXJ6aGi11-I)8Q z3TG@#sObJYP_(^&*mm$n%!yZ;GsT`*V8&1-CY2w-{QccMQxO&20(( exbY`sT7=AVX{d6qY+HBeS86fkkge&(TmAuXxFz@i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/fireprojectile.png b/src/main/resources/assets/bloodmagic/textures/entities/fireprojectile.png new file mode 100644 index 0000000000000000000000000000000000000000..ca9d61e0b116e830e3ed12fa4d59e1b4880be3a3 GIT binary patch literal 1395 zcmbVMeM}p57(V1f1V&J%k!iByh(V^;yXyz-opf8LCKALwMX$dU!+)3&@gcuO;`x3Xb39V5)LwKJy2jTsN(}>WbV=+ z0`r_1*=ca%&Y%tW`LY%XRJFLO*_L{imPCd3+l~ z;3X5K-i$0e<#ATRHcHazTQD1~M!0 zL4_9saGa6xicN|cQ9WJ0f)I2%SBV4iN}$w`VPPhS5gHs5g!sLdtYyUw{&izbYq`2P z2rxI0#U_bW^WiHGMJ1yZ-Qqnyvbfn+G)~+n@l)C*!3ntk6WxpTPaSGw5eE| zz&Zl5!UR~5(B@U`6|C`rSjr{=MiHfIQEW(5L8V_*MAdr(;kZ$>~v?)ay}(WppTKG!P_Uf$A5Itl+u-8#+vN z3X9jtf9fW&r50m+y4nTmVzrMzKy4mL?GnEKuWJyL)ajrt)#35eRWEE$w&dKuH;>Ou zWkz!>`PS%1#YIBO;f3-7&)C`5JTwwHFl6m>$4bwoS~A;4Y9e10rBu<@_9N@bxf2tO z!?pS|A8k~&6f=qrWddMsrm6hBs*9>e#4%2v~cUT!Lo7GRNngC z*=J5x%)a{5ans??AFpYQ8r%D?e739S+it7t;&t8RosRn%8OM7?I=aKvQ&aflhqJ$L zJdrV07c<}&FW)PHxg<9h(e}3QfTyP4NFJ))^X}cY_4_08^hCb*vC=nNFFbN=w=2Bq z%Z}SMwu1xdr<;ZW-9G)q2T$#J<)kBfaT3IS&FTAU{KkCN!mWx;vC7)fg_mwSj`sEt z*)veZ%dK-+{yR^PbWZwmPCfknCrbXYKXNxjhfz9K{;6#+ZT7uKyQi)e9cmePeQ5gp zq0s0zyNJ*^-`2OD+dKTusk@zdqbc=Yj}-O|rcSut&h!Pf>Du{-{(R~{C~YFW+fj3= zr>(C`$;yqT{j$5iV?vm?b^Rgu=9!<7=*=G%w;xP`-p})2os29*;=e(M-9>+F-52=> D*oFF@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/holyprojectile.png b/src/main/resources/assets/bloodmagic/textures/entities/holyprojectile.png new file mode 100644 index 0000000000000000000000000000000000000000..52fb9ad375e27326ac2ec4fafcb3a230f44225d3 GIT binary patch literal 1349 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/nodebeam.png b/src/main/resources/assets/bloodmagic/textures/entities/nodebeam.png new file mode 100644 index 0000000000000000000000000000000000000000..67545b45f2da1d7479e754c875c9e481b6d6eb92 GIT binary patch literal 260 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/soularrow.png b/src/main/resources/assets/bloodmagic/textures/entities/soularrow.png new file mode 100644 index 0000000000000000000000000000000000000000..10830442e6c1bda900dd0e46bca2bd443eb105d9 GIT binary patch literal 772 zcmV+f1N;1mP)`VUGSsA9+A<>=9sChSUJ7y>BzYW(=-R<8e}Mi29TNNj z^N@`qLOhx5kV%cutPVDpIX#z$*Ne}O@8`oR zYz=hLSb+;Ux#;!0U{DYzOAWNCQX}U~K3jr-kkf@&gCEuE*yNxa)AOHERc<6DKLy_S zm?7&Jj(nF$x4J?qhcRXWX0g?yXFvr2IG6jDGBPqC%Q7TMf<~jk_SP1nkuW0RFyx&b zaLysiGUohKn2{scAcAM=6Xg68Y}whjX8}R2)#IjlmP)ReP;jaNkDs~~mEnnBq`_%F zqC^nP#~JVJizx$wv>;OHbqjRa*^1$5`FZqgDTp*v7As(x$V^wk8*2$_@7_Zyga7)F z7DP&!fV3b|&wz@hLV^Q;TB~Ok;}246^(ZqZi&24CWm6}%4(Y8dblXQiiaPxQ@r7O>VZVS_b;OVLf|I=^c3#JRMV6I0000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/soularrow_corrosive.png b/src/main/resources/assets/bloodmagic/textures/entities/soularrow_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..b636b2a3bd9f7494d6d43ae6e43765ac02cf27a4 GIT binary patch literal 783 zcmV+q1MvKbP)#& zgA&V&KnZEI8~e~G91D{65!n)*S++sMbooIxUVZm^x(c$ZcXJ^ScC2-G62AVoEM}}C?E&|c%Fw+sYH0;7nUO;L~$9y zq5zKLAP52`K8|CKMiHiY^m<=mKF`R$TddIw7|b0IraV-3t`ORSJ!tJ5mz0J}x(s^s z{w0VAOXUW}wS9=`1=9JTi%wnBpm6(6$#6x%Fj*&gES@p2y-WqwIvJd?rodqCKq`a# zbKrw6N|^v3bWyi;6HA2z2LSSH4XeC3P4a9FOIZq10be1I@*-Rlh*xaB<)aJLa!R^@ zu2w1ODb524DsJc0(2|rOihTk2wW@ z!vWx3q#yll#VjeE@L%|8lZT$Q9Ey38N*2(TM5yk%dIcN+1}sIZ8snT)__6)@aCk>B z>klP=7@4cu;qZ>YT-A=_`r5cIE|Rz6!LAmHH$18uNCbRsBl<4{egnDr8qYOJe+~cu N002ovPDHLkV1hmrS9SmZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/soularrow_destructive.png b/src/main/resources/assets/bloodmagic/textures/entities/soularrow_destructive.png new file mode 100644 index 0000000000000000000000000000000000000000..42a19c2aa7414229b5d258f448b22d452223f407 GIT binary patch literal 771 zcmV+e1N{7nP)zvrUNjfwT*DiSlY+9I?+MyWv(#vVi{P>C$9)EiQ1iO`!p#V9Bf zLGGZ3p>LKIEJB1H0*4j`GxIjI=2odwnv{P~@72>oMXaZ7dAA-sPe1ta}u4?1(mmSyLgkcYnml2M=zQ?c{I{ zHIHs1Q+gJzj6L9{p=Q=yEs9zIoxN0#cBc*ike~jXjYcCBMZx0YB9fDnF*m;eRb7R; zvV!F$1%e5N=JwXF@tseUfC?t|H~2aO#gVU^)# zUJ|?AJz!>Z)m$dw-e6Q2NH7FkTvK`wsato44KLf!&!0W>cvM|aW=g@~L>*p5TY_p^ z8{!$l?}Z`Y;+|bK@t}K+E{{sgAQOWzKF)l;`mpyLy{4=p1MwPX# zkUefx*0!Rcs)1rIprEROw17usLM`CyKcfFazz_2u6Tfh37{vep002ovPDHLkV1ii= BPdoqs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/soularrow_steadfast.png b/src/main/resources/assets/bloodmagic/textures/entities/soularrow_steadfast.png new file mode 100644 index 0000000000000000000000000000000000000000..9e234d8782f15731e8b7aaa42c80781195012e7d GIT binary patch literal 783 zcmV+q1MvKbP)3AJHU%CF4UJGL?&nb*n;7bVb=Zu;>~kdNB?~{y z;*Z2)cbl6IKAoe8su!8byc+wdG064a-j|4%0BuQ|)-H3{cg45-Mcf|*v&x>D@ z2OP&ik|Y?%zQ8oMg5@78c-tXjsanNm8e07}z(?*$M)fI?_GjiGCAA98FJ8)OLreDr zeS7u^j0k4^cE;7WDyjf4h(7jO5hnSlC(+4){6)VGrSkfj}vDwuH{a6_8(l zK_HZ`DyHSvE__zK2gZTqsY_&5KV~7RK)$VvMl2sOt}-FBC=D~c?T9|Xg{A@*6H4iW zYY^IuWB|axgK+?WV}u7{f}DYDYbm+9e3rUfy2a16N$RrDlqotfkekwyZH`XUC@t39_rR*|sixuFlQj_dDeDAFKRX?&BPv|!SzwS*#VcPa!tKWMYxQgaGPqjX5omEg)H&?I=vz#U&Edv*1xb0S zlZ$1^xhW_%-J{D-J4jx6B47b_MpK2JemMXjGhu*uo`)a^@Or(7ii(2Uhwlbcg;zPVcyV9 z=B{B75gutv8Q0t!&shh%u3{SD1_deN^fWqVjO4sMoXEYJu_8?*># zalapUtAWBMz*`N}Jdnh~A;AHFTbaQw<$ff$GJ}OJf^fjs2!y=}Hw6AwXp}%vn~pmfZj1d<`D~~lai5EnUB7qVaN*NrR{=s!w<*M*t0mO z^Y;P(=C0pe{j$M%AT}|$C!qUaCSUhs^bHN8;;L>{$Y?}EeF@5A6IoCrX#H*>F((b* zoE|JjZ-L$6#OFIE007;#1@{){4@DCbMO>H`S>4Yi*d0zhX{v(WXhi+~Y-m*RlBcTQ zJ)ra0sO*J;Aw~tC=^@!2PVCGpV$1if)KGU8Wv>Mm)H$Hps$c-tz}t@|(55BkH$317 z{)7X7@75$LcE_=hOv1n6EtW4-u1pAclS&pir&^|_V&xh*09@P^x2`qLNrk6oreJ(z z3hx(Pp)o%9K<~=+x)x*) zacsblg-s?d4jp^N8K(=2W=u!O#ugWc7$1uwVzL=Yw!s_=5p~onQ1lP7KfL7b_xgT5 zpYQMcxRzqu+QfvE1er{hXepvfrSYlA`*^(cePJq0OT)8bL4{bxJH;R^09hW(I{;+y z(k@U6Xtu8Q3y>p|#nyW46=H>TJ<0H16&=u`N@z8p5rB@d1M=f zp*a(=+62!#RbefL%)9^~ol1u=m>P!+gbLSb2^`OY)EKToaST-x2#%9l1BvUQg$I_@ z1lCEGQiTgz(#iz8MbSs1XfPO51vM&OaG^Ls5GbZb)oMhtK>T%_NQV&4pB`nPfS(aO zKGDN-P=t|o@Bz^TOPDQa+sNQLq%dM+-#^C2z}3y$MQk{OOXuC zUzh@dXB%J(1>OtIg_!g#A+I5{MhAft2yhxO#E5HIgwW$g#GuFYl1ok} z4waljBX#nhx`}Q{#Tc0`c7e25>?6QQ%_B%%GMl#Lp-dKY&O+tcLqA?FTc_MzBA=be z(zboZxUL^iG(ETclh)4rhYnnAWKT5TY5rZgXESbeq95WsH?ej4}?e1?**eM@eHadM{Y`@~8dnMU%s|dn9f*ow&a*anb zr(XOnb$YzI# zZ5z!Q?%6-G?zPtVtK*e1#MgrZ={NcUu}5mNCp+B5p`J6ZmmT))`_?bonzmnhH#5|K zdFY({`#!p{^Jd!v@y_PafkAt7a~mZ#q&0NAu#(2`v~4Eobm2+m>g;E(RHtUV5%1_q z*-*ZE*%q{`bs!Mlb?bPXy!_2$?;UNrm^6GSskiCp7;5kev@tQR+Z3ub{vwZiC&hZN zZ}j5|?&(uc?9JT#;g_+mn01vCljdDFt)t5In)=+n$IiC2VB@FG>T_3In#fJt_Np76 z*}Ao=_X70i_O9EUYvh}Q*!7{R6QAz2IH2*jC|uide`d$sO6Ro?y!H&6&7yc%bo{5o i^@FSeglAL7;*w?Mj?M=~e@{(Cevy^}8+9hXs_`F<)doHQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/entities/windgustprojectile.png b/src/main/resources/assets/bloodmagic/textures/entities/windgustprojectile.png new file mode 100644 index 0000000000000000000000000000000000000000..fab71f51ee2bcfe17933e7019dadc0afc6a167db GIT binary patch literal 1486 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 Bq@e%+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/alchemytable.png b/src/main/resources/assets/bloodmagic/textures/gui/alchemytable.png new file mode 100644 index 0000000000000000000000000000000000000000..b30ff88a8a74f9904befac2b90c0b1f4408f7f18 GIT binary patch literal 3428 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 LoNP)ezW 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 DUAT>Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/bookleft.png b/src/main/resources/assets/bloodmagic/textures/gui/bookleft.png new file mode 100644 index 0000000000000000000000000000000000000000..08b462df1c3a95725497df9fb6e36574e26fa4e7 GIT binary patch literal 11940 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/bookright.png b/src/main/resources/assets/bloodmagic/textures/gui/bookright.png new file mode 100644 index 0000000000000000000000000000000000000000..8c255a77cb6dfab982d0040a1480c6574eddc29f GIT binary patch literal 8536 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 E7Yh?KnE(I) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/buttons_compat.png b/src/main/resources/assets/bloodmagic/textures/gui/buttons_compat.png new file mode 100644 index 0000000000000000000000000000000000000000..811f7ac1a6c9090b13a5173817448c508848a166 GIT binary patch literal 18994 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/crucible.png b/src/main/resources/assets/bloodmagic/textures/gui/crucible.png new file mode 100644 index 0000000000000000000000000000000000000000..c321fcefdd70ee5d192c8828a0a24836a419a5c7 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;_6Q8AUa`8i0cAC7!;n>0-)z&-}Z! z43902*_>Y|G{=zPutCH#M#8%G+4TEU3YP8c>V{oDK{P!ka{{ z%z5^_V9wp83(S~iUOqJEc(22>rhPB?5~>-!Zd4@uy_At|v|%R3B*7CPlYq+4WY+cd zI>eW-Z`jMAnzP4nc?pm^j}cF(H!$pAQD8X0d6Of>?{l%mxp!^~854UQprLM)`dx9s z+5^wF7(6f3Hqhq+1?Yya*XCTZl=HJ@BF0#*9FVbnYY&th4@+y~BDgN`z+u_^O)$QxQe=pC!8cJLWsR_S>~!w-Wy;^t*!nZV+CKq2U$?)+&iRuI;qd{Y9GUu$Hll)Iy4iU-2{!g z|582gZg4z-q|XDvW%5k7fFZ|SEVrHM^CE^EeFx6y{Ii;KA3xlpjL%Sx25(@b%$Wd; zG86mu$2Yiq%5zxDAgR%>{I|dC^bTOKuX+9I(V@uq4C}71UhQaZ159BA0pADVS|!c9 To{uiefz*1s`njxgN@xNAYtffw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/guitrap.png b/src/main/resources/assets/bloodmagic/textures/gui/guitrap.png new file mode 100644 index 0000000000000000000000000000000000000000..2fdb824efcb80fa10626b46874f548ffd7e92fcf GIT binary patch literal 3677 zcmc(hXHe8lw#NS>X~-D_93%-ilB48dh8!hHmdt>NM2UifWZ@-91_wcfAxn^fAt*_r zWQju%h9DsDN)VK^xV!h=y1Vzo{cx*pcXjotQ`P4@&#$YiI{uD(QaaU)9J)<7tSynwbQGs6La(y#1SPWp%R&mgs7fT zOp~o}zeM7jiM@rbJBl_?CI)W zS`mRoQ1E#Jbl^H?Zoe~L5O5r>sCbK~jqE)D3L2*b18w?wZDQAAFK9R6IW{0v6sXNV z^|me;#RR}YlHkPvOap{MXY-o?1;l{;fRiHuxFZbM3p`mH2Td_mqH+KxjXiV4@3*Sx)}fcAa%vTEd~)g$)?i^DGIMhgPQf8<)>}+64p$ss z>)25Wq$tnxS2uQu-R@BqJUU8nt)+$40|gti=KJ2i*{Bz$;AUo4S5~HVy5QCh{pMlk z$PT+U^Rov(!xc}D4!^u#=8KT9jnE`M{?hU3K(FZ9@N@Dg$GNp+&C>?Ti&MxrPnWhM z&H~CrFkr^Y8@+Fz&A0|o%Kf(U4}D#tkp9G_Y6CV^RVqK~=TwTKxK__+Gwn2dOIQ>C@U zjh~rvnQ1}xlzgwq#oA~zr7H9S5>HQKS~SJeBWjJ5K2y~ra3!+rQ5vr(N1Xk|bCX#L z@Tlk9pRCeqyruemKmp5`=A!&5<3-pyWpw}PlS z{?KW-CXkpRLcNV#hBy$;<-n<`Wua$bFs)U>b&XGoewJL8oG8kuLx3l(ME4zk6aCMw ztBw-lu@+iFyps&cjG}a*afmKiK8ARNga9t(igwK#(=moIjj@NuycQX0LON z=SvDr>7|pc;FX0~fb~^pTTL6HDW$C zu%Y=i>nqVgAQg2Cb7W5(Qjjh0D%n*eTj15V*?Prn;|Xj%red<`7^MTSlWe+CCs)U>p$xNM<}(rn*sz%;q^o=I4hhMA-Zp_Ke{X1Q4z`p%XKhY7M& zp(M5pS>k1?@+RE!ES}V|Q?Jty@y4j2#*Wa^%|+?NRu?41?Ll20^C&{Pi@#=Y=5YYD zIr|LKoS;-zS}2E*)R8o=Gu}^kRUso}`y9XUHy~dZ#ANM z`*=2z-m)Egf zf`7Xsv*W%KJNNRF)XSUsmXdxWoxO-JMysPLlrJ;HJQgd$4H1SB$oh3&Q76$<^UA5} zhN8f-BZpm9i-;$@7tR+U7oz|MbpwPX zijPo@u)cC~9P*g^Lz0R--sMN_%(iM`0Zx@!HTh}f)7AD$ZnxfVDV5wu>)Au8L+&)u zcf!9;j*vO5IV5z3Qwc=JMw`c|BzebKu#bvoNe7P3A^aBAeyL@uE#x7^4dvbn>qtYD z%S7%g&dN4PHK}xqxLSUius~aAKhV7@s?pk`T(8E!u1A9b7on zaS)ARDHUN5lFx+c#TndA|5KF?TEdceV~;WLMiNDE2c!eZBRVQG8aIuwfpQw`X+iZv zo_|Yikq+kjC|M-5ii;8`O=;1i)|=0h&u7UE;PRAEl5Z7{e4d)(125y&Ps1WNk!!92 z0~IdOwdWrnCNzk0W{~xH)TLCASPD~M;l*D~tpul_WVJ{abJq`p@%?g{<@vV;w?EbO z<5Of`?7qC%X6Rs8dX6oM(KQ!_Sgf^H+?T6W^a;jO5SU4B#oQ&WP;7jLg?dgHmT#M9 zRfV_mhv<7m+-vWD+FlRx*rGI}Sd9+bnw#3THM9`5T&#Ea6@%tbW{!VW#e`?gVtz6$ zI2W|a5$o0eA!jcAU1@n2&Ux5%%ynaJK{(%czY7whw=(<3+Ou z1@X<1SOo6%2gSw~7fj#Kpn{6&8`A^RU#2oUWApV6Q^yZScQ`^@en@?rz+1N*ohkRd z$D4u7^e0>=Tu!u4>W);Z;>$LUGfzBiD-Aq-wtI-ih|b7(X|Pkc&l8X_B~#<%$y-~R zG(FefpQCpJg{ftz&Hi}Nz0B*a7QC`?M80^$Ni9DckQiFAL^ggs0D^>w-iPPzb#1GMYD<=f0J<^W5~`R6I``H|%MC(VSa_ zv+=;~gtXR&x*lzCO8emXxae%NZHw(KzPqEF z^L<~Cr1-sqyC>W2fpdY7-Pen>hAWS`o(NvJ{j51O8Nr;Sv8AP55EEtZpE^kj<1c@h zq>j3pYQV+sSu;1B0)O;tdUdzAWGI& zQ#B2m-JTnD-`8P^9?eN9`zG@_PBpBNuABxZwCWBf2L<~&zZtDKd_1EvEqlF|)4*Uc zlXyKPjQG*@&$UA5=W=})pXCzT5|mHB`^oGphQ6u{x^hg9THoI=DRe(NQ7TFwBYgjp z@6QfKlu9@q00U4DA5Wh4G~k6#X=yrBirs6S))y6~wkGU$I6;DTu&&!l?z#L50q3m* z+l-gMrSK~N7~uN1;IAB{q=`(73c=nZewsX6(X3|@i$nU@dr zv(has|AGFRlmJ@*{g3s)|LWo2c6oSkyBfk8@lC3Mz%ycC2&_`Zd4KOV@b6LQ+Wq~p zCkB2y`R~DBIr%RC0{bxp*IXH;e#kk3_98$Vs4yz>^aAZ&v;?_b*T0^t}dt z3J)&3T?%OgzZ++S{k+0s(^A7Y??d0K@E@)JDdxX)p=cVx&KMj7Yx0O5Y;~#TpBPU| zH*XY_w*@3s*99DB g)R%AT|6)`eU(w)BON6+#p8hVUt!|)J1-F0tH=0mC;s5{u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/masterroutingnode.png b/src/main/resources/assets/bloodmagic/textures/gui/masterroutingnode.png new file mode 100644 index 0000000000000000000000000000000000000000..4039c1c44ab1bf471794885080eaa303dfbe01ab GIT binary patch literal 94211 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≦KDCLpblu%?g3j5BU6?x)r~TVYMOy31 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

      Wn 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 E0RBDF^#A|> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/soulforge.png b/src/main/resources/assets/bloodmagic/textures/gui/soulforge.png new file mode 100644 index 0000000000000000000000000000000000000000..641d2cf6df2c50ae578ab3ddeb2ff5be7ac2e0f0 GIT binary patch literal 25888 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/teleposer.png b/src/main/resources/assets/bloodmagic/textures/gui/teleposer.png new file mode 100644 index 0000000000000000000000000000000000000000..7be6c0e372f4eef1f003341a5af2b88760c91bb2 GIT binary patch literal 1464 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6`sf14d?EIR?!;vp+B}u)2D>IEGZ*dVAM4@3x0T z!^3{=`v=7n6+O0UZ@uEk@j}k3;+hm8YQ^5%F$ zuKPTisUb)H2OY2xnU-*;)kkyZznLfHZ!HpNocQPQqx8I4%Qhy<7P1!zHavfxzS`*; zU%Ru5i%h?}b)#SzgI=8gg9FGjEDT7Dgmv$99P3MC`R4_OhUS<_cXu+J0kWF^{r_9{ zUirojR*>?BO6&RO3+?9D|2D2*D>y9vzifAJN5}Ew$2&T@=bzrR#e?I3Zv3COt@q>J z#5*f6aUAFc@>uWX{odc^!1947K@qH@y}i9#V2j`f9|p!9f~k?mUcY|5egD<__wPUc z{P}Z#oj%8bo^poo-@o7g7xw?hkB;rzx7+{PtH5At1t3=ZN`^R6F7#*K; zuXxYZS7OLvh8~J62ZS0J7`RKm+B9rDx7Yl*%%>0+7cWg$mm2GegPjh~o)|2zR=V)8 zprfPX@y8qgB-6TN9ey+MJUk*@+;*-|X+k;!P&*R?2ZI6@h62MhU=&0ss58x+{8wh# zV;68tGx zeynEd?Ur|g8-Ffj*rI9@5`s-oMH$MPV6G1TJ Z!2WD0(FL=o#T9_mdb;|#taD0e0sv;02c7@` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back.jpg b/src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec52a850ff9b4bef0aa67138c4a66be6b3fc57c6 GIT binary patch literal 73272 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 Qq_~JNC$&Aj;{R^{KbAE$=l}o! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back_over.png b/src/main/resources/assets/bloodmagic/textures/gui/thaumcraft/gui_research_back_over.png new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/assets/bloodmagic/textures/gui/widgets.png b/src/main/resources/assets/bloodmagic/textures/gui/widgets.png new file mode 100644 index 0000000000000000000000000000000000000000..456166c9145b8337c66386ce688b5ec30a2eb1dd GIT binary patch literal 22017 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 WD@FAW;_m_Sp`og+lCE^&>i+?*!SN9Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/hud/bars.png b/src/main/resources/assets/bloodmagic/textures/hud/bars.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e0e7840c873f8a2b351a5e55ea258a922a9f19 GIT binary patch literal 6558 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 K$#U^8{{I6G>cqML literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/activationcrystalawakened.png b/src/main/resources/assets/bloodmagic/textures/items/activationcrystalawakened.png new file mode 100644 index 0000000000000000000000000000000000000000..ef212c7f2c6a320ecb3d10746b9987b86c9a1733 GIT binary patch literal 15410 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/activationcrystalweak.png b/src/main/resources/assets/bloodmagic/textures/items/activationcrystalweak.png new file mode 100644 index 0000000000000000000000000000000000000000..895ad35fdb293ee8d187e8e884cd704569cb3c32 GIT binary patch literal 15408 zcmeI3X^h)M6vvHJLAw-a;X?~TVA6s(>h+O0PFyD_8)wrKqD%@c)jW z?%lqeqGa35On4LN^JU#G_G^Yc1^O$+66{S;%DI)2rf&cqJq2>66$||E+)Dx4G-82u zVwy{rk|1vm%{X9uW+bD}Y|x`d;M{nhQjuYRBJec2QY=`mT!{s$ab<{DP8K-2eg)!v@J?}z ztURU;*3&^N7RY;ENoLt{x!hk4_S;U5<)hIk%L%L?Ft7*XZn8YB!dUK#T98H@6}Y-% zmORt8Xg{ttWlwvtK)_Gbyz0+YETz-URF+$(2RX78t;F*E99t~1-8@}y473K>)zi&v zDgky3xc0Q81K52<_duzQaCG&jokyV5MqqheL%})22kMsJ(3?J`X{S&HZRjj0fFjJ} zLI!+S0HwU`*>2wMk+LaQA$Cjbnb{ryeWj-xsF*$6e5K}At*P2nD-cRLEnnc6u>7@x zYU|Vfa}BF;DD)eqAq%_~0eUvb=)tJO7$5|gXpj?`?3Au$gAp+z1*a6YXP8!1)l+pz zAw@Vo$%`TvkvN`Dg`!+45{>d=QWaAPUJ5tDx4CwN9kyIgvvg1&xd}%ejOe^5h*M02 z695yAhIB^L!(qmdw6GvZQq~ZpM(8&8j?gM_%#FYpbnIev!IU(|1%C0y0*&fzuCO}Q zYWd4%moaf!1L&H>L^L>@a3~}&Q-Yy05+BNHMmQ7+hc$)maBqzXCQxd!@n7ev!@U)~ zfurq_JBww=bUoYI)F$|Y^0$(4aQWQUhEOo)Nv_Ecu6kM1{Y@(FYLLDUrLC1L2xPb5a#Hq7j% zxiLCt%a7646O94Sb3^mAc|~dO+ZM;r<*e-#H7{-!wH#neR!(7Cjcq-f=YpKH3$_D? z1>!-4?bh7YtFc8U;8y6bQWu$3f2s$x+}zgIDsArip+rLBqH01MNDTU0awH`2iKMEE z5-$xz2I0QhyJ+UdZy!8vbc%nh`3DhP4O(^G^9tM1*7ndS z?%FP+u9JAzb{TbTd0uFlUR&X{Ij<6U4)!7!(y2ZALvt%?c<~oY{<1qaFmZGMi_T75;Y3kh+wangn z>ApdVI%4&(n#fc>K6uC5YX-C>TXwvop1B~k;+FlJuPWUB_3;Z9nI|krU7Okc(~(c6 z?|L`z;~6V&+q-m6-^H1?4s724hH};fz5S}h_@k+Xk8DZo&VTXQ;#c2N*x(xV_w+r# zgTL>4W$@}}@*`JVanw?C?8@gaP}PgJ%)Iu)u07iyf5N;j_VzhPKdyW^s-}%547g%AtGTA9?w*+b2I?_{sIFKX_;@b>PPI-UBE8cInwW zmp;5m6GIPvx$LgW^QU~E^Y`C+?1xVs{O084EAxAXK3Qye_w9Rj?X)v9^3!{CdE3{Q zy!1LaG_bR{BY4V-0FYRJDeI( JpB`Ah`CrPD+x!3k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/airscribetool.png b/src/main/resources/assets/bloodmagic/textures/items/airscribetool.png new file mode 100644 index 0000000000000000000000000000000000000000..7bf1b9fedd285ef9226b98570f46cedb04335476 GIT binary patch literal 15377 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/altarmaker.png b/src/main/resources/assets/bloodmagic/textures/items/altarmaker.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3835229d62abb617d892393abc947afd6f96ef GIT binary patch literal 666 zcmV;L0%iS)P)^6eTjgGLQfO03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00I61fxc|cofEX#E`A8F(&*Djg^IoB>E5REodl=1u-VxSwSL4pg@$y z7y|04K#t{hW|kcb;)Mkz_$E`nPu}nSzJXIT>JQ&(5~rDuYE}FP;JEqGvuO`-_x?k{ zSvBf`d3f>UvENw#g#!*KB#u$t-OjN7vEH#*a^^!t&HzVb7gbZlB zp5t7xmtR|(9ZwDrhM`wVu{=AA{q_|h1taBgcA7sxK%h1E9^{McbPz=m#u(x_=4!P{ z-_Q`3C+-jg0ZJ>1{rxE2MHEGUFHvhvnx-U4LSv~xvsmQK`a0dc7Z3=(tgVqciBQ@yN%YGX7fAN zI;^#rcAJ%Y4SdFdb4V#k(=-pzTKh}28t=wFS5P8iD3`1Dl2&>s~9#gB(Ht@)o)*HCC7s2FB7gEuYDY{ZrMuh znaea8x{KZB#FouRQ2E5re<9D*ng3xK3bzXmL*rdZaL)<*=WvW2JJ<&%N%c?E1 f*Zw?vy`J%`m-nRCvoh>~4rlOm^>bP0l+XkKWa4L% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/ampoulefull.png b/src/main/resources/assets/bloodmagic/textures/items/ampoulefull.png new file mode 100644 index 0000000000000000000000000000000000000000..049b2d75e3b2e307514c0dc037e1bae398364eab GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)35ZUNPLhcKF{cpa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-iR!6PeUy7_(=Q0Szmi(`nz>9>=t`4|I5+V*P; z1>QL1QYzefzc*6Up#(ehCV}2rv3Au_9u8z|B(W=ti%{SjzPPPckoYwoUOw7;p4A1>P zXITH8?P32`zP+Teg{ZC~U)u9ov-x&Qfxj<<`J z-28aMV>9AYSFSRvyJpR-(4{mt#QHj$yZ`>G1SJQT6YR=wvV3PPyAp3Dy`YijzU=dGevjDm zX3W{TVJwr+Jhl?uCSZ1EO8b=?KW-f|Fsc76zK_vmW=?)J#|(d95HNVU`njxgN@xNA Dz=4m9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/apprenticebloodorb.png b/src/main/resources/assets/bloodmagic/textures/items/apprenticebloodorb.png new file mode 100644 index 0000000000000000000000000000000000000000..d82001888b8b169dccbc2261a3200e20c99c1008 GIT binary patch literal 1237 zcmV;`1SH!Z3_5jYKm{Ep^7f@42D4w?H(HFX zk8jaZ$v>H}j=a6KM-cPHSFe8^lyvkO5kWF}5)r{yYd&ohs|;N^lPK)nyzSpJP)A;0 z9K}e9G>8aH11k_=iJ6;cWLyT8tXhUbd)rI_R;_z2LwbIch~W6{{TOoX>If<=lUvbX z@$yFrwuAD5k9*Au0tVB{#GnBO4K zA~myqj0fPlozMc1L{e-!fJ)Tz0@9|JeDdzP>?NZkAar!L0Wx@T6p)dDDgYy0(?FQ^ za4#z7P7LJdSXN-A6wyr*6v>x1lCAJYh(xY+<7Le$*YJZl#w(?HPLPBPmp%bXN5?Et z=0CRxmEnOZhMYff29fjqN3udIm27(sk7j2=r3Hlc8J&nc^y2fV?Ay2%faz3{X4ZtNYl(Zk?tunhe zybsKM>;VwEXU|h*`oeBhE>{OZxpwvvDtGm?A~N^cXF&LU(+&_OceVm>`N(jteP1GS z>d?`fyb%?E$KLmBVnoJa#&WVYd*YVwgmWJ3MWE;2UIije0qB_5fkN*KPb1Rz_0OOT z9vRGDTB(3?_IQ7Sa_aEWe|IOebVSpXdgXfq*Ju0$dfzew^)`FK{Y~1;oZBnoMC;jO zeTl%S(mua!-vz}t!B{4mP~Yb7g8x5G|BLoFX|P*1W{#`p00000NkvXXu0mjfYs){< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/arcaneashes.png b/src/main/resources/assets/bloodmagic/textures/items/arcaneashes.png new file mode 100644 index 0000000000000000000000000000000000000000..43025e282ba9b41a6479b1ccd3b6025865d1ac91 GIT binary patch literal 550 zcmV+>0@?kEP)`HXO-~DAoV~0kcU& zK~y-)y_3IdQ&AMhKleS-AsHS7O11M6%qP{%Nfq+emI=VRU*Rw#P}C@ zQK^9nfQayDsGfI*nUM_<;r?1d=AS;6VdhVEWMh7PMP9yrEju4}C0BSTqb5>bOI%o8 zkvlVU)IT-=2m}Iby?D;n#-{q~67$arvbwm8oVvK}VLd_J1Z zCOg~P_zV-%Ft99(R4OHB1buOFzPC9%Y-5Vz*3D@`p%9Tsgnqw|X__RHNqW5=uIrwi z;6(r6ePfR?40^|1KG`;YzaQJS2?m2C5($dMBAHAEt@Urgz$?ry?!z_bUH0s oYqZvg2<38Fd2#AOf1_7^0zHq)$07*qoM6N<$f_7%>$e|u)sO8m&0GQ%`5Dzu9(Y=SNXqr#vF$tf%FBDxIvAIiU=u7WsilQ z8?LYacop-xXB#ulBxAm>7?GO(m&jfk$CZm zojG7bl+VBKE9MkHRbCN6m@-O(2(V;@1_NS5$yCM2RLM{x%s1H%1CiP1?8pES!Sk5{2_gb1S(*z2TQ~L!u;b~sP&xkFKEmLu1A$3)?c0q6r%nw3W~z~*4Ekg` zg~;gmC?XTLUP5H!`ra%?LxBT7?klbuK&99!_l+DUG1bwOh{+646piCfV<)s^qB=ec z1Eq~IesP2_7`uECm3KdW2bJC@cOdfKhi^j2=-3znMcEHlbSy_@?b6#37#tfxrDO7B z?d8s*fin6OrSj`Jtj;OfUs@YcCdC${br$lAy}}n-0tf?usjk2XrmC_kQ}OBk4+w+t zl9^6Au&5}8GZRCgte9Ag%7*TBDEu;fu9luzs~|_7eLfm>-9(aV$fj$da?aZM>AJW| zEwlu%x9nb1=0e-J;TbfzyL$~rFmnD(epqLL7A&+Akg>^2P(W8vpm2Kp94ZelT#3k` z!NY(YIdQOP%Lg*zl47F;S+4sI>TOz!D-bt2WIINL*$XdE=H_zmEq9^PH}q>&&w#91 zwi1A!M+TsP8y79kzR*!nSaA6FV~z4EX0W2JnI@j9#-}5jw2yM@V zk3FzOkyWc6MCIbd*}P4E=4zSBP3Ng~n-DoT@B;uhELeid@Nho>NBR%VZyspouUQEV z4YV-TRJhY7BmQ9?n9~%ydHv&pBy+vr)_or$Th=~;$Y%pb5g8i#36P@9_|aLAw>1+s z^G?kHuk`+AMO@?Wf=%~7+LT$%-@oWT*!J@}=Jj3Busm9Fe|`Ng*WU(c0oJ>sYwQ33 N002ovPDHLkV1f^<`a%Ez literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul.png b/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul.png new file mode 100644 index 0000000000000000000000000000000000000000..63ebca42c3a001dfa6d829e45da1e979f3254e1a GIT binary patch literal 939 zcmV;c162HpP)WFU8GbZ8()Nlj2>E@cM*00R$6L_t(I%XO1oXp?ss z#ee_z&D*?9Ta%ivMVs1M-J-2FwpLcPRJ%H5N}V#1S#h9)4M7C)LZ%FQGsfKLC?Y80 zb}=uUURY$%6(_D;+c~u;igB)`Y1LVi^dnzy8x!;2#i*!r=juFgp2LCXIq(WT9!tp2 zQ&R5ey)FS7YCX)IW1)V#6M#*d-8k*~bG>PXG*-QV<+sPO{evbn&4glt4Y%*h$IV;B z)=S-TVnG@8xWwq72b3%@{jx#nv5WH3?wzcvtE0d^8%;<$TMn}O+8ud%#}-u8%*L}p z`FnMpNTpK$P4INVn@lAW*xfD`Ew7<&VHpek%Q*SbhqN4RB{C7EwW*nRZ*<6@-6sIn zu5_WSskF20?x5`2w~Oi;KO$GB{rq{xvaoD%1#PEJ(@<2z5}yx{Xo)zEf)wTDv^kkBBCPuz3hkJK!v9|F&Zru$KHVpjpOX&t`T}~85kTVelARG=OghbJDG;9tB zAeo9!ux@=Lx^5;OjS}eV#cH+UcRKjx!6Wt^In2cahiMA_CCz4yTwO(R*&Wf zIYWPcKjFV0kDPh!T$*T~k0jBSadf-AbM%iK+9~QC6>9L2;1{ zRaGhQy13ENK~>{=;)w(ni-qCfFlNofw_kk8o*#eUyE#jRk(wql9!CLi^>oOy&F}Np zA|ILP7@ANq;t_PSh9y6bYkyqDX|-V_3`V96rVN9~_#^;g=8SvguwC_JeCXzn-mhy zv`UsNYUpQ~j>fQA@`-5~PKXuae-q5WTWIC&{C{iP7oXzcWbC!Ne*m9-9HJipK|cTh N002ovPDHLkV1nVztb_mn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa94bb5c3d700340c184979fd146d14c61c094b GIT binary patch literal 932 zcmV;V16%xwP)WFU8GbZ8()Nlj2>E@cM*00Rg~L_t(I%YBn?Xw-E8 z#y{WhZ@=yC=We@k|GMUl8)lnsUEDEEx5TEGF)=M+9LdlKR|H127rl`JUnG)b3Q-M7 zBgjc&p)Yc#kqteOO?_d`8SGET+RoiM?$36+KihqK5fe1)dG)+_czED>9(V*@GrQGi z3;R^(zzzklVXd3$Ck@tz8~|+D=E7k!JQk6Qy)9V1VC%E z6ZyikHr^O+SC`-HV@;q5%>+N3IzwFDXM@j2&+#J!t2ffRawQVbW=gPIax^qF5Kq}C ziRJA$X4B{k1zc52_~Z8>*1y!sh1<8dpNaGQQ;kg0N3*>d4T((Z0K{T3giuJmRHw>r zMFRO$mbOisFv`rNlW7LSgE%UzG}-)|`|B6p-TMy5y3X?9$R1Tzreii~NT)T^Fk8$RhQZ*-I1}j@2lgMPtEZDsmYx%l$OO0Vq>%u@D;{;C<0SPf z>QKoAG)cI}=B6(eYF18(fhLPb>UOT#$KZi$|92z4Z zoyJyf5b*n{YqWz94^3Y@`h`y?Usbk^cSPd+Ds}pU%a{!lfz?e^xE-AM{w({y4YE~! zCH~W3d$o%#W((gXlkB>;OU+LeIsX2Sbn)&L;nagjse&T14X zviV-S%BAvH%vBWhWFU8GbZ8()Nlj2>E@cM*00Rz5L_t(I%YBnwY*Tdr z#ees6;e>z?O|Z%F8S~*60Rc$4)P9r+G1NTrl;u_i?6ky?EwO4~kJi)@82uZWqrt zPe=n_G>8?B6kGUCnvD8D)`2_#(gI-URFi1?^emxJ2&dhKE{f>?wx6#$n`mr0j=^N0 z>z$_wAB;$2V`FHVwzNTIS%GYJ29L|dy6`G0!*$dIA7syK9khMiOkz@FS92>v?`;?E z7sn-l&2=8+$3sq{eGOvYo9C$whA|tVySoQb_=`|okP}^PlvUMJy|xMjWb#H_wmVc; zSCi137^ey@ve`8A=~)~~F~iqJdGe{v3=a*H%Ot1_J_N}DoXa0MnF4Bw10|pO{{{>4JC?D*`tNNorf0Z4t=%*C4@?#yuvHb^QUCw| M07*qoM6N<$f}bm^UH||9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_steadfast.png new file mode 100644 index 0000000000000000000000000000000000000000..729f4fb83fb8a58e722bec472a3c8bc77d7f23f7 GIT binary patch literal 931 zcmV;U16=%xP)WFU8GbZ8()Nlj2>E@cM*00Rd}L_t(I%XO1oXxn8N z#eeVn&p&C>W@&6bnudgot+Qp_NB6<3vuu-XrEV$~Aw`N#ab7sRQ08{g3l&7Pg`v`+ z(#}t#Lbz5;Px?TXfyJ8*+BTn7?|sun>-JWpy#~x>zWAz}*AM=z`uf9|HH|~} zC)8`dZxQ)?{=W%U71l7gFpqS3sA$~Ew)<8i>zg_8ZWj-|(uh=jPq&Y%BQduC z*mbuD)6NYwbgubcojCgx8@Fr%DoCCBgllV$(zLmWhT|t`Y_V`*WQj9C)|AC%&*Ss0 zWhPz5lq$Gb$jp;jDq*g4lAQR3+Ffl-j7KTXZk#zCcR9{KgR)A)T} zDuW(0O+(lN%#KA^v3@tgYR6);k+^h;Ybk@Xy{~fM;D_`?{30H|%CFH365xPuM7{k{ z7Y%ndqDlrPU4z^lSaq;fp+-k=d8(PuWl6^hEaY;`%+3KImd|+nnX)<+d6Zxd52NFci;u4)um6EuCWrc@*t4#eKQB(w*3!=(7bl6uCSZ0N zY*hrCn-Q)i5aOoSmp2Ya27ID@<1t+4o5j9+dWc4&41PDnV&XD5os122vu)p$x^YL` zTBZ)am;F{d9~cImk0sPxImwp;&rvECu~Ni}Wc#X002ovPDHLk FV1iugt5^U4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_vengeful.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f1683b8cab0ce49cc1c07073e30f292dfc57d9 GIT binary patch literal 938 zcmV;b16BNqP)WFU8GbZ8()Nlj2>E@cM*00Rz5L_t(I%XO1oOq+EW z#ee_z?Mrz(p=@obZBtei>K0rWWgECoadX5AnID*l^JB8i7%xb?Fka||F-DDMw-~p9 zb1uDUBjB2gq5ah9O91%WJU87=*Qx0L?9AT--D&((R7^PJ~goCj_};pnrn z@Xp(E>Zw)7+GhFu$S*t)4C1hCqF^eabKo-LFTWt4K6M6F zl?)y_DtG;LQ5c3%Oi(naSz9Huyo}pgL9=fwo&zoHbGv!&)6Y2h+N&fI*J|%P`&*=xOyJ_U<*ivl)4@|7K@w?r8*z*aQ%fnREY(vw_P%y!@MI1IOn=BcW3&U6O zxSUx04XCP0b%~X}KPP#j`fjXdGZu@5f97W~=I3~`r<*TddIjJ2r^L+6JXb;~6o4OH z_407zXfxX;C=kH(h z)uZpr8+XL5&(!8|(yEv7c{0hsi*Lx)g%lk_=g8-CWC|U^GS=sFyXr-^=Gx!!Z!A1)~g0R~A3~HgK5H1Pg zhE10Hw_}wic-8GJJk>CB_&6{#@GrI8*x6i{)owx?yyCBEEd56+mlEb9qhw_>fNBBUEKOfO8IfKx>WMD?)!91+2sdjkWlv zQ>14Q7uqE-#^B#H;jX0Fp3_wG-yhOK%WKQ?T>Z^o_yk{=a42!4j3xj8002ovPDHLk FV1mMck~07R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/blackpudding.png b/src/main/resources/assets/bloodmagic/textures/items/blackpudding.png new file mode 100644 index 0000000000000000000000000000000000000000..eab4ccdd9e41c7db83810d817f5fa04d88045839 GIT binary patch literal 669 zcmV;O0%HA%P)ZN7+D;c zP)sm{#cqv=1~p2EsE|u+K%q&&)^@30xW-VR+?_+Uy&@R>Z7=VAzTfk7q|MBlo*GeJ_gBU6DWISPx~FzHbVjz173$^}Y0+m-6Su z#;)L1d~^;uEQb(y%C=Hb?j!i(35Mhp!#DObH8xC3pI$6rckO(%YI)pcC>}47#5}QN zlKO*(2+z%8$S!fSZjyM^CJ^gy-O%;<#2WzGnwoh(t&-9-^dD(V$tl|Xler-Rcq{#M z4H`wRQ!`=Onwlwfy9quEQKcvV7>0?7QJBGa*FMtPH||W$i_=D=Y>Z+BTWD`}33Wsa9vtYlUh3_YgY$q8 zE#$yksi0@)IJSEy^@@)`=@vdGKk&6=8xvtQ50CYn6w&ZF@da462kFAy1OZtlySB!= zM3SZLRbW|UjkP>H&@RO5&=3HThz^oX0AN><8T zaJGX0Ed#xU7Sw6AXfsj`k?6<#dOf`9TlklBIg$q}@(fIRRn3!NRLSi&V6Jw+l zAqu4pP&Gi?=}hPQbpbXEvLNy7?oIBw_ndpg7{mX-I$GSGoi!IHCunbVMm^iMnYvJ+ z*B?+BFY{vlwH%$1zZcBaYG(Xgnfv$dvb_3(EKLB=mWAVtkt7NAdIQI?c=>8Uas+qg z=FFw3^E`d>kY~^5@qC|Ru}GRGq-jDJMA(kQ&FfcKSbRsf=h9eNk&y%eqA=pa$IrxZ z%;QH7*!kIEr_;gr1NOTvy}n1Y*`hLjj&9G*dtd-B2mpxUn7zGymcB02bzLm2iK2)& zicumcrE(@JfG`X(#^4VF!Z4)W-eNcm5fq|qly-3YE}6+V{xt9SaJj&$~>#c3%q$CP(?doOLH`;ifPi745b_=a-Lo6H=!gaj+N`mhq9X(1G7W83@crM>q!skK-JChpNWC)w+KS$m68ivOv=@a6XUIt%l0szh?<@Xqw6{=E6Z5LU0O3!Xqph8 z4%29w?3JsCh~)D5i(?cKG!a^D6U(xx9F+OtSR`Um5{WpGNQhRujR3>TH&`T11OaZ| zSY-d8ie=gON>Qy=7#j;>TJ}JoHsoRe5a8NUN)F10YGPa`5}88z9>=u?^czBx6F40g ze<*v;;m_dI&OkERLX@FZ=+=1MpuPRAu*D2xICGU+tK&3Z7XJkJ9W zLZNYK8#dodrOOliU72(m&+`yXLleRCeRBPu{|WFf^$W!V49}U@4@Lk0002ovPDHLk FV1kB~Bi{f3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/bloodlightsigil.png b/src/main/resources/assets/bloodmagic/textures/items/bloodlightsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..2c62fc0a44405c4211412d91954ef8da2782770f GIT binary patch literal 1592 zcmbVMeM}Q)96p#hhN6uS2cq*lokPO)?s_fl9W5Wy0-Y91MIiIfEOHWzbBflP!o}OaV=BZcN>npg5UIl%ZRKi`x~b+aJb1cFEoQ^?RP@ z_x?Vv#+Z{888IsYf}lu!w$>z$lE522S^Ul&`I`}kSV31HEa$C4IpYRUx`j6bSnp)k z025#=6{Q_O4MES9+Vcv80>e_8<(*O{U?cT9T_PHS)Tv$Z#xa#*1>E`9TIP@UU*X zOR)1C9AIS3e3_s@L{G=B;B*-bPl!3sM4-fwVP3|C5mFp;Is^9_v-Suk@UI(Bwf5vy zxBzAX9=^=Yiuth44}!(mJzFSXD0)LLbKAwFFeO@^Epq}+&}%h_cp|mfEwqeaRDiXT zC`(dG)B@xHrASxb5qJCDYA2;js|Y_NU0>6k!Ec1%m=JNuUaa97k0+MWRZ;nv)odjFrhrWCCyb zzoElKr?5bs{HJb$TVgQ=rcb&+Ts-L`z=_S{7P}-%6Y?emg%;_x>3QC(AJ=v{qH?3Z zZAb^|l`geTXcI22*k|*i?x;ynmW4LL{%)X)3H=0C{0tHVyFr4fJbb5ZN3E$NtR>x@MGm+mll zxJ^E5Tl@7dd)V8(OQ)P_@E<&RKsGpdwl!IK|F;ojf68oKi%FMTdw<|$ys05t78m#a zzDGWD?&h;YD`_a9X=NkR&qhD2oU{Al-k7+ZC+?(79S-jkt_~0OOlo?&5Q*K;`_iYX z2GhkEicm{4^>bTQR#i8bGF79_5sw@b*=P-?M(ab z>eqAzyKK{~l~{ zRYY-BWbL&(E2gzfyMC)PVUIP+&^euUE~t5N y^*t{$ej_8>6w}gFxgZKZS~YSUdQ_7dIu-h2`)I!-Vp(+HU#{2XXqy%nZ~h0obWUIZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/bloodpack.png b/src/main/resources/assets/bloodmagic/textures/items/bloodpack.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c2b1148c5056ed08da804f650ada6308113aa3 GIT binary patch literal 446 zcmV;v0YUzWP)>BO65~nD2T0~ zkT(!D@q@S?i=7Q$KDJPF;Bqf>XYQOiXKqX4Uu-mV%vv*R&7b<)62bEFh`39 z-=SL~PhyG*nUJUCL7kIGVnSZlnvgMBtK1R%Adhep4|jKsF(1J03i2InZTJ||58{`Ff zwX>6TG9@#zPWH&-dSI=`&xs1>TFWJz$5(7|O0##>^EG^4sL)Q$L6@|j*eJrj57r^B z43gnYzedmaR2}S07*qoM6N<$g2ht3y8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/bouncesigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/bouncesigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..649f337b783ed14dd1c95c74aeadc914e98d2d7f GIT binary patch literal 717 zcmV;;0y6!HP)WFU8GbZ8()Nlj2>E@cM*00J>dL_t(I%dOMRYZE~j z$MNrMHk&tNY?9hk38G>_lfHod6P`r8>ZPa$4|)`=C-LITp@K;9A_xkCXF*Y_Ab1iA zX`41^D@19vR`asiolSOUJXC|R^`y^j=J1)B=lKo%V~O7v!^NT=9LQ4rwA$SZhr{G{ zW~eu8GU*ggp1u%U0;3}%I^CDz#Id8yExtzuJ^&%p#6LNM_3$vWv-4P%$+PD#MGr7G zI;wZ)`Z;_06jQNFgoHt1@Bq~tX)+f+;`tqFvJOCXqK{g=NqJ#G02sfNw%6vtqsPR; z7V&#yM9mn5iGa^H`>9Rtf~kWDA;{-*Jv}f0G|-Zg{d@P3@5{00asyv0-d#7@5sh>& zn~WroZf7&#c^+D899Ob*B}L2iSihApmEz0t@UOgH;|=PZ&I2qlg(u4 zk7vl9U&nSN{+%I0XUYI{l)q_=2Eg>I*8-q(u1w2m@n-ogm8;>OQ?O`E=8;~2QVJ<0 zhGFyq073|q(5$X}!EO6E<1^T{L$hfEV1^8uQWA|sdY)l+B_Xg(lgPynIM;?)v2BXQ zG_GusNG4f1K27TW5mp;(J?S%l4@CU#FiXo-wEBwD8dtXX{;ff+*2KJh2)4u8dab7i zU7$2SF9NM~G-8oTCDAINRH}dw2(fXd)|z-MiYvXX{{p~Bp`Za&5a26?VF=>UFiLO4 zy3ur4tW?Bbfj_Yz2oQ#WAq0U^%$3W6|5-l(-`DDx7}+i#00000NkvXXu0mjfkOVh3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/bouncesigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/bouncesigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3ceb944ab8454bcb18a5e0b561b2fd54363017 GIT binary patch literal 695 zcmV;o0!aOdP)WFU8GbZ8()Nlj2>E@cM*00J9HL_t(I%dL}5PZLoT zhM#+9rc=sCVW!v;(Fn33)FRQuty|r=aP7|cCtUhlT$s2v!Dz&Ug^_5Qv{0ykBtQgF zoOY(|Oxruxh1gJqm7d)>i|2g2?}2{|aXPt{&+Cb7hTZ*xUd^&Bau-}`^#IpN^J4L} zI1?~mC}?La&Ha0KSl!qnR$TxL(_}?0a?83)xx7XqVe<0TlIR0mpP$zkbK^XE_<$#i zk8#~m94Cz^PVi~y9RSjhSeA);@8Z>bD(mY4!2C^VM{S-ydybv8NN-JXq^fkXhfM7) z^v2zBid?yr!>jqdngq~5BMiAZHH~Q*Y>s@u^8%)i7Z^?2y>AQH0i- zW-DZ5a|UThZpOC}!eAp)WN>ikqz!1T{|4l;8N8ZLsazrBx|oJZ(OxEKhGh3<*&bUt zS4Ii&=Iycoi1NEMnhiRg4wsJ#Cn_Y!?#&WL3Lykx7$T+Y2LK2m=(M{WeEEuL85~Yl z2!bZQ9{^w)60J2!+wNPV2arP0?I_y$eeCii!BUEG*C92KU~qVt9p@u6^&8ac^*;BR zrwuW2Fvs@iU3C17SZi8ggCECrJkKX5XJG`6zI%N)=mAP=YeH$QlXil1dKeumN~J0Y zfe@mnKx!aKD~!(m1%SfboCb)Mq8rCZDM%$PV*Sh3b-&3*wJOd9{0UP^A*4hKfr?{R dD;2^2jGqv)-2&v_2(ADC002ovPDHLkV1jxcC~yD( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundaxe_activated.png b/src/main/resources/assets/bloodmagic/textures/items/boundaxe_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..b51a565bacf874cf55bf532db16dcb12e4e13d46 GIT binary patch literal 522 zcmV+l0`>igP)8I}-Ug)!+aC0hdWc zK~y-)jgn7DRACgwf1kvRja!EbgfONNe7z}>QEcVLh!Hfwg>G6XwrCO5A|!An2({CV z;Le>$E|r3CVG)6#Gd##qWL9S6WQ+3Ydx4!6HA7G5jdS2`zI)I4&i!K~aW4F6`Nks} zd1lV!Bvp)Z-kVZ}xH7~gZ%U_mRRwg^tzoX{;Nh@d(yR<|dHxIiFK{8uwT`;g6U(xc z>|%L#jeY*QkDj~@)YVlYd%woj8_Ti~EAnQ0l@)#x;WvZ#+IaHZ3ba^JK>7i|VgC?c ziP8j|U|4>=ftAn0@!hh53Ejf+WA()50qAe|#%K2`d%!L(0E_-p>LX*OE_8Jlr_JK` zJ}$T4CO-8c?!$ZLw(nEKrHIQbZ-Dy9gsFN5cakZM zjXY9k(pKqhukb*-Uj`LecV)7znej=bueU1fgHoIsVme{zhHa5^9M*R>&3RWI5NJ!Z z%C;=BjzhMPH`IXg5ZjZMZlzMJJGq+40S7m)wFn?r*s7Ua{g7(JA5caZdNo?OZvX%Q M07*qoM6N<$f(9w+=Kufz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundpickaxe_activated.png b/src/main/resources/assets/bloodmagic/textures/items/boundpickaxe_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..54c2a6eacb004380b4d6aef981f81bc05faf2f6d GIT binary patch literal 1484 zcmbVMeN5D57(ch07zqm-I`kx4R~?Z+ukH1|S~=JqhjMNQH;yR`zk2O^T*tLNdxb0b z5d&M)AZ|JhX3Gp9GU7Hfhcipm5HNGP3Cy_<13}poHL!Ua6Sm2M>jCHXhw+a!Y2WvK z-skuHp3m;|6s|~`tDCFQXp&q7&SG^Oh`gST>F5|7;8GnGJwe4v68Y;g2s z7YuQ%4PI?>WA0EM2yg|p67bd*mN2!I49UW|IZ(DjsRno;(~!akg)pVq;3>P5x{rxb z7@AU%D{b(!Q>AVXlqX66GU-hSgBfthLh5mok;L&V$bjJliespOL~xukS}5EM%{;Km zCb531*tvX$OFh}(fGme76pch8`Us&Hr3w@$NfN~jsKJ1!8c4WCkZA=G!i(b;oFL3d zTuA0b0g73qePWetgH=zbL*PSh_d~-%cqUP5%20(4p|~DHc|I1`ly+Dy2LHP8NbPV* zO$eaHAS_l%j9L%>;y75%-Q$U3imEqMk;JJ*p@UA5sp5ekyPP&yz0tEAOBrz53K&0u zFa&8qSYQMQNnj?#?_+2`VKrGTgfDLAQFs%M5d>zoU{*7RP+lIibTuciVkDdqtI%}7 zP9SmBfL$($JT#SJihBgTpY)l5k+2{%WAGzJlaWSfQmwg z-+_)NzZ*ECOR?Cr_ZRmLc+2hRsNHrPnoO*_lIXCHoo`S^TReAe*|n8?aOu2(1LJ$o z<|Wp(Zh!rP?%0jSd+QoKmkOFYPi=|*j$O6f>&?Q6-M&?s3Dn@~y^TWo# zaqXJVU%9cMCw<(L+73T=1cUY*J;@em4^AR>V%^~tJBAmu&SA8ttu%ja`=8Grv2B)X zvC$gk!+vkenm1>Ew<@WfOuMc9aovH5`6ufV@Zn2^skeVg%t<`AvS#jEgY5T#ilk-w zu7>fuzM|aq%Xj@Xv0yB^YT3$nmfSD<$hPproo{{-NJE>}cYk~1R$uSh?2(MEjs|#iQ|PABU>=?I zVnhEXGHax1B(2r*_7n3mOS=;`=cj$0-vf1+DmT<-4qpFatml;WsrD@|JGRfSi%wjA zc1MTtjf}2^!%fA%ElE+ba}(-cLVMRd=sZ!a|8>z;Uv)$?w5N>nIMNTYmi;|v2lw{X z?K}L;^^2*9uI!G~zf{TTKK5Q>dS_R?ak%ZW?WXV3FL%oZ*M8|MZJ>PUN^t1N+2*z) p@{`r=(I68V&|%bQ^zZU*vowS4Pyf{F)p4=^t1G|IdDO9??jMSXAdLV3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundshovel_activated.png b/src/main/resources/assets/bloodmagic/textures/items/boundshovel_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..05be9eff996c179c6559d800022339267d8c6bbd GIT binary patch literal 1478 zcmbVMdrT8|94`sd59iDxzEHtAz)fUIoMR@_>>=9#VT$ZwbXTBme-QuJC3nBq_w)ID zf8WQ|r{wQ*cOOymFk7+~N_o6T@>2p(WH7uNKz5EQ z22MaR!SW7}u24jkv#vs^(6OALc}`7*Y}5hHC!-aL^u+-mMVA5za)V;lOTu?forNKm zA>oynL*ww7K?!TC6hK~Owu`PTrEvycya-AU5HbM=Bnk>}WnPg8knkukAyy zNTnn^=2W302Qu>lfG{?bXc4VeC0nS(pjV;-DzBInX0QN}7FeIe z@?I#!NV)k6iG*cO$F9Kn9FE7tUU587a>$SXNHl#g<&3q!3FbjZ^c)`W6SXH-$N)}zv6dP+s%a?ag4)PMt%mUaUGkK>vD8#+XG z3JKN8f9fW@B^P68`nU_^#p6B#Ub%S$xl6i-b_EoQh~Mm%3|FA%-MnSCxw%Txzi+l} zur4||Be`Y0vaijyU~*Kwv*KVxAQVM0=|Q3 z%O=Ids+DVwyzxTgRg?I)$I|Ft)HQj}txGq=pZAS)CV8?J)!WWc5G4Jg<=%LsV$p${h+R_9jTwvd!QjAzioeCE8o9-HoIYfyvamu zZ?1m5;Y6@AH|1n@``MOF+Rn?l#h2ROQr`P>;8sFk?}n4LpO(b#uZlg2d;7O161u3}nw_6fMM?Mj zSAUo|GZJgMu1@KVtAMpSPMBWvRk9F~Jt^b;H#^S_KiKf&!oN0d94cq0IjYYt%x`Fq zGhf@WCU(kI`{`Npt@Jwy#M~TZ{)6>J);ZUX8O7)nEv n_Pq9c^R87RH#h(Ki6TmY^$cIWu%!G-=+A1mW?K$t7QONhksKU! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundsword_activated.png b/src/main/resources/assets/bloodmagic/textures/items/boundsword_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..e47e75d719f482fb776e5935f629da15cefdd2fd GIT binary patch literal 1541 zcmbVMdrT8|9PdEgU_OYt;e+Yr5C??oJ^H+pg3xPi)gnR#%$Rb${z`AqUb#DHQQRir zJDaPDZ--^Z$6QD>#>X^bHs>ZXx9J38oNq-x?x+C-yyOAkyP%9Eop5FblpdgD0uPWFDBvmgid4V=_w!QnJiLv5;5_51xwze>pqr6^94B#IFzK_IdPB364PCV+Uw#0UcoL{{K@632U? zFeBsODO6`JYOEEf?PK*@uHjeK}I8#T*!HyykATSXXwR+X&`V_ zz-bnE57ZxGihG5;i*#s#TBSo6mT)0zjhaCiQqH+Ug=%Q?>R_6MG zj8IBz{uKg4{wK3h(^6SaW3Vw1=@LtFG zpT0nLwJWEGI&-q?di#{ymY&)-qxSl0%aXcYMRLg}PlKIvs1F{-%}Ome(Ux$wRNYG@ z#7uZpRjcLe9k=&AX`c{l&p2`a;3QXJYcPLrp#Jk?O;ctBmK4oW zw|91}To&aU_4CBUGyAv39RDbzsBuJo{H$joPQ9}|H*<5x0r6aidtJrKJKs!Q_|=9% ze+!OJp`A2Fu{XV${)0Mo-9kUc0cXv-wG1fiPL*0jhoOI~IgYJ3T&$`~ry8L(B zxq>mSB)BL$`Ep%w+xKZh>t?hyH@2@>PZ9BnlPq60H4ORiq5A6A4PaN3u{b;W@io(^ zgEye6sefHIduHYO}>{Jx#RrZmXRk1J$;tAacj-$ zyGN?4c6TkEd2CU0^w{X@Tiz)gzv{=(%8q*W{l2voQEhFDf-(N=?SDQl=1$X5`m23w zGBne*!Lc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc$WX!DQqR!T z#M01EN5ROz&{*HlK;Otx*U-?)#N5izOaTg%fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlviP6Vr?>OfAfflVIjx)9-9#Wa?^R;bdT8W?*RO zYT{(zX5#2%W?^Dt=4fGLYzfornO9trn3tRivpW-LH&m}9UcFY%MX8A;`9&f5`8lvu z5Rj2yl3$#WU!dUZte_E|nU|7ZUaSd&s_e0o=3{} zNPt+F5cf%^iEF1`xiUpmQ!tWS_2ji~-Fg;8o!S!_dyLENqt_qX&nY-H({ z&)>0e>cZqJ?w4A-6@x4HaJ@QdeMlnY-9JA2t^m26hvN)pn4~ia9K4$&5XWz^DlDvMu44-gYb#DG%uBchF zQ*T;7w6iFBWO3l_blbxsEiG$9Uz9`^Y}~}C-4l_P&GD&go2G)tG!>)0wi#Qm2k&0* zo3^gUCZqY8AX>$tRz3Y#&bnp^3 zX;<6qba?OID;Z@M{AbV0^7s;U%_CHF&YZc;LPx&r*jX>}{I=y%)r-l2Czh_V;B7t9 zwQ=(4?h@~n8&5shA({p2sVLb3{W7s^;Q2N!P0Ssb|goRiD_7;bK{2_8qb x$n40@QMr=5Zt{1r+1&Ln<28Q2FaIZ!z_6a_JLf>9rKhW(%Q~loCIHm25WD~Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/bridgesigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/bridgesigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..057c64bdda38f105e9aecb078158ae18357165e4 GIT binary patch literal 1585 zcmbVMeM}Q)9Il|KAc}%g49?4SQ&g^Z*K29-Mj_A^sH32zK%*{ty}pGG+AHlrt7eOc zF;-zim$?`=b;_a}h;Hf_$|4ZIn&?1L!tj%bf-T%Fa3E&_TD6-m>u>a&K7_yp` zaG^|x=^QFhY|UEd1bORn49vO`hBU*eDNwS9;t6bkqaly2)b64@N_do);^%>F6oy7k zxDq8i=9E#l3{tU90LjEMgux^@BqznVOiJQ-A|%0Z0>v>@LLxX$N#zut1dTs1ujVvc zD7`vkT#H{R;bM++P$=qlyTxuo%sPuuoFqvUlb{j_!doD&wRVp7Aa<81$e;!;#%XnM zR@M#$7-U_Sl}`#?s%DvT8?bX)wG!q}#Ad6RlHjxgFctz~ z2vUxiffOJlfyoeyiJ>ioLZ*-trXbIo@G?T8R*`9HOd*%zxJF76GE9@MA<{J(X@-;_ zf>^EH#nE;K1huWa_BdAcRxG7*0-9r;29_-iR>87jmSbJTtOHW1poBuJ-ORdOivk%M zyRaHKtrftW;bd*lXoxB68{{z(w*ZTbMu3UH5t&SiAqtEn5IJB>NwitQNTj^`V|erb z4IRomg$C;6KXnt_;)^jbecc88;&mSZJKsD`zDtHu+ouTxAq84>n!(do|9Nh1beiz& zp5IbOep*p*;!MHPkE&*=B985Dtrd#AJA~xzt96e-Yut>RPeX;-)j|WDfG?jRtGqmC z-(ExYY_0Xa-F@xGydwG1RYR4h<-2?X7ca0k2Y0!rd>ivBdSG?i`A3*?cFo?_Kbh2p zTVd0}*;gJ!CeU%jQCGbPs`GU@nyY=@vc|?w&fckrkG@{`Xro|H=ZtRY_RiSe6>U$x zd~!NevFGAtPvhjgX1nR7FVUb=K~Zf-`|#>X6>El&Eh+QEetj1|^=Qt?`hFO!SVqrK2I0l(L}zl2<^Rxhu8aeU(L*h^j9Q1;x;h@Y<<#zZTRBzA{JeRcn82ds^p zuFt>PYk6nKz`3f=RyKx&n;wRo1HFsS7!P|Zu01{9yLx7Nub`(V<(nlj9mma4v7(7P zFP#Q0H4Rgz_Sa7H`JbPUdZzvTSa)LkhD{f1(BAJJ?&Iw7tM+XqQv`kQZ@5-5eYoyc z8YR1&Md_js+%eutsOn29-RU15DfR9DY{!xg%8oVc(@ae2mlZ1ls;V^|RyLxlrC$81xsGHK)Z2SiekyA_n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/bridgesigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/bridgesigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..15f46a2c01ad7d49e5e04271da1e6050f962fdb1 GIT binary patch literal 1593 zcmbVMZBP_-96mr%2}pU%m(* zvg^Q7C5ez;1LJfpt@AM@b%j>Cu8PL&V9rZ`Hh_x+9!8*mfXB`9ct8h^^Wx$>vJHd4 zxQS4u10On7Mw$Tw=VJh+R0+|D3<-*QMU>S0m^^(bI=l@OVk`5i!e81WF7U9H6`~Dn($ACvvZGYhJK0|GM#5Yu;Mx zWnc@#b2UC%%!gw^6fDN>$wCoB(Hp$T=Ms}bxe1Q0@i44lB6Og5BDK5hxD2H<4DFCZ zv>a1Ic1FQKm>f|;4jWB5Lgg9wAT-rdAS| zEQ&R;yg;!u6V-N!+7npg6S26#$4~<2vvQm}S_Nh&Cvd!z^8y9~kX7np?VO)~F_NK& z7bX~=YYk)1^Kl+vJjA%`G4cq8Iv9tNf*6||g_KGK0%;IT4yhU1rlRaJTBeYL6L|ao z4IL~x1xM=SKXnt`5{of1ebfcw;!z(ltk^t0u}f|o>DVff#I80GdTZdqZp*TwR4Pq( zIeY=M)NV9pRum_$Kiic%GD~TDFE3P`nOAyZ{n|I`N1i!UeWkTspPHK38I$5hHVv5b zm(7_RH)BR-_`y`rgY^Y`|2zQT7V@HrWc zSaI5w5BD7#UKzhFef6KC-IZ-s=TA(!V($AWYwXuG=av`j`D)h-EqVTi`C%Zp<<)*g z(nw(4&Di)$N%ASV;LxZ!ZPo9=^TVxV&yrK{y}Q9sAf=|}(~73JGjI02b(>WKTT)94<4t{9 zVbxE`h(dNMmLwgjMJ3M_8KvQ?b31Q_PdAUm3d)A6%C_PxXY%ahx{9WOn6uYDcDl8V z?%mI3;HrVf-*S%#CNO;I zOXOtN@yp+2sM|U`==~~kdx^DRVTyZBefq9 z@3ey(Chtj|zTgLFlMvhV;Cgsb{m;iXP)`U2+13C60ia1l zK~y-)WBmXBKLaIziBt{WwgvtFxYh-3D+{Tb7q7m=@c-u@28U-F|21-NFfx&%xoYBR z23xmKhA*FgBP9O+|4$Hq-5U76HALnA)68B83U7$ikjGE~fY#gLH^&9HyTA_iYKZU*(7>x_(yj3{Blh@K8wUF`oe zaxya9d;WpJ*_w~x{_T4VL7qGe8o4(Zv4$?TK+Cc=`oAeB?!TY93RY($V~l7Fw$%O4 z$ic`k|IkSWCN?I9C96d6Mlak8Zf>E{KVDvZqAJMEaQEeVh6C3hFxtw={%2rdVBlqE zXV`Z84kON_>|v(&pW)N(CwcJ^43{3iVmNU90V4wg1H<7*j~PGx{KfG2(`N=JB_*tx zhS9>M|oqndvVZ%fG+>85!Qbddu+d_aBmTBO|5R835kk VDxLd03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Ia}L_t(I%dL~mYEw}V z$A5E@dy^)ntxdF%Qbh&Pv`zW|;@*{rwIJwDid&z+r%><#1Wkhr7owuHf<8ggq)lmE z6hTq*b@Op=de1#BjKOGJ>8$1q!|$9q|Np>0hWvV1T3j?IW>Xw|{4}gtmPPt_l4h$- za%PI>FW<;mKrWj#Ge@VmcI7f#J9`A$2OtyM^6d>xV+96>Q??YJ&yPoE($3i!(1JNJPaYd0SNeO6c20dRYVBcG@MJkP@z zL$~MRc^=@<>mLFMh{k~U;2JQ-{0T_Urf4)BilqvvWD-z>LKYx28g-yczOXV@Mg_3( z_MHH9I$b*54$$UH{o6nVd-!|+*L6`!jRF8f1QE!uUmX-eKo`ep4?1k}h3iBkk&!Wm z03|}R)dqx17ay{>yAKGl37dE#!Hw0&fT7uHjks@^FJ&_3WFU8GbZ8()Nlj2>E@cM*00I$7L_t(I%dL}5YZFlv zhM#jYxk*!MKa$!MDcA~v_RFP+h$uzsM#P=qPW)#s1aaX)R4lD%^#>$v`a#_kp;X#V zGRb6SI`>`|siD!j(zCngz;k%d`(F6RlGBgbnHe`eR$}-2UbmOcW+|U9Qg1XVjtuhV z-IAOMn4g<-Bg2C{da%ga<_^}R0AxH5t#hPlO0~L<)*kOatVj>w+Wfq`P#)#k(Pk!a9YB@c7{*&L!NxUBZ}z8`p;ch}y?JM^pfD9OIlL zY)8a#jMg6Qssm#;oibO@3`>wbcu*_|&f z?~%{tdSr9~N`!i&Ns@%jP7kuP{f$;@k3yfOe_()xJL6azQExPQ(&wEH#MI;ju*?3w z#X860y%~-U8~A>Jr!p+uy-20H-E)I3pt8O$#yOYMS%!wr;jE!j*#eOh7dj3U`tr1+ z`0T#`FgHEz0IV^j)}oY9$Y-&x6YEA0vbnV-e+B#wGsYlFp+qp&vR11J|FeDqL1^w} T(7VC)00000NkvXXu0mjfS353x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/coagulant.png b/src/main/resources/assets/bloodmagic/textures/items/coagulant.png new file mode 100644 index 0000000000000000000000000000000000000000..23bda1b1477b68383d3f983986ad383c88d8b3ed GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)35ZUNPLhcKF{cpa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-iR!K1>zzf<@fQ0Tj-i(`nz>9>=2dmRZ7XxqP7 zEl}`?tNg*+Q7@Gvp76e@F`s?(n4gGZLat(jtE04jw5l|B^UXJwlP$tBr}e%o6Z11Y z!*l=78P{-2c zJNn*BmR(cmn;GReNkwF7YUa_$1?x}e?!Uh(LCL}81iSK^EZ4 z-y`0n^M zM1;mbVFI&yk-q)E%S+x?*v0RwuZo6WU(Pvk&dF!}(pO=nlmO&;4nP=&r5{fY!%*7o zw#?^q@jOo|mCBbUuav9Rs&qOX>2|vk1cAhHEQ`fLeBXZud3w9+U@%}hof1V6*XxyL zvq_d^>~=e%D5BMBVT^e|p6nBMf&bbf6rMHmfa>;77q9}^T w`(1avUVr}&?k3h+(OQ45{2k<?_4*|K%4G*SC`9s-g`ctBa~8HZkqu3X~j<0rg&`QXMa2mze*OHRD)Uubx5+?=*hB-^dG~?AX`fcRP2=w|LTH!H+&QvAKp2McTdX|V z+Z7+beWulNNvBeHsi~N-gLYqKb9uVmHvL`~x*aiQ05Ivf;>-81tSl~3D9rHtq^GQw zr?R;`oz@AXfsZ*oB`zfqz^dD1N@aHU_h}ygVY*--goa}`$mu##%6Q!83?dQ%nkvDB zfPSYdN-+$EjD|y`l$h0p82!CkZJfm3VO@kWRCqnnAB|L3O7a?_?KYJ$nGqND zBHG4??T9ddwbfOmln6~j69O5Ag#Y!CPF!`J{{g90_uf*<_l^Jn002ovPDHLkV1m}0 BCfWc1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/compressionsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/compressionsigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..cef30337046869fb64f3a0f1dca6b33811b6d977 GIT binary patch literal 747 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/daggerofsacrifice.png b/src/main/resources/assets/bloodmagic/textures/items/daggerofsacrifice.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc2efe6b8aa0399c57f63ded07d64473ffbfc41 GIT binary patch literal 523 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)1y*G7NI=i&RX3BAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{XQ3;hy;66bM8E#kZfj1M2T~LZf$WIpTjG_#9|(?3L-Vv_(hPEKblkI%Tf;-DnThyc6}mDbC`o`E7Z_-4)B{B?_x}HdX7L-{ybswX11SGf41dmi)Qhn=SfO zB2OeAj{YdeV6b@}!}W_x^O}lQWv>o4v0t}1%|Dv++PnNG7u4(+D%bojkzeV~3W^g? LS3j3^P61;%q`|hKHjXK^4W+0&w%JX)G}+zmZb@1J zp_GUCMjd(S;2SHbj1MRbfX_tK@|o{fRBx^g5o+(NDH` zj2rOzL$JiCUeb z&(#v@%00!pd{O3fmQ1U`M^Th6+nz~TY-W??Hl4{xSxBRuq>Kh5MN>xFWYonjy)zwH z4w?1SC9Z;4I`ChPzDiXknj}M^P-e)SDaw^3Ww+Z&qlq+`3_xK}>I9Vu8wBO1Xpqi0 zE>7{uyrlA?pwr?q6=JQLqt|PR;#cgxf>Jz@pv2e#ie#9PNGj7vrgCC^aUZEx4n&s5 z`baLo1vx=gfFG68PpT4CQK=GpNEx5*F)^r##}m(;a=pP|%G8QFVHQ9TLz>c4@zzNk zS;8q|t?c6_%mTM^Q>wdHd4HlfT_R~SJ+7S#^F6p}Gf}rlD?}^g0QXAg%N(PMvR4!X z&S;kvcOul~=SR9qmob?aSTUrGagfO_iFzlZaV|#XoS+}ApcBE5m$J}VCfaN^7;UuC z2nC5MlVW&8miO0njgjp&nQ2QFOPB4(k^DLe1&oWs|oZn!x zQ>=ltWn~*G%r?7$&1NiqtJ%gdMqdP?#{;`}3+)npwc2ipg=YU{Xvn===!r59PC6z4 zX|&b<+Y~9nbW2spE1*B?puPp&8#&8Lxtgw{of82*awbWPtZ>?n%h7jkx%eR#Kch6C z$j+r1pLUu#ecFcLSO?iXUvWNuLX?8hunM45vt;Z3vH-qsEDfPAd2W$LyXMj zR)U_mn7tm2+SM&Nyo1zE{{Y{$5Yf@D_37-`?)7wNhZ+rf0j!IO)PQo3-Nq7`qxy2K zrh(dsKHFpj7x?M}SIiZjPIjGgVOMxM*)`!gN#IqdDV8m181m9i-srJV3LX+Tr`2LH zTO4HaaI!}+ALat(E*|V(Me9n+8uLk>Na;AGCr4-^<`^v%^mQJoWONifEP&?}GX9{_ zwaD>}@IM=gJNlmk!{KlemK-w4=5)mxGxL_Jc8{8Trdr!jd39n!2*m6rh&9EE+isYfN{YzkT%AJL<9>kE|><= z#<-A(U;)Mj(?Hr77ZMRHz_?%XVQ5y1kC3#NgzF)kz`Sb%ZCG>|sNg+v4kFfNz|(#E)uh+qN61=B#<7#9)|EWo&6 z8b}-CLL!0%7#B zA-9lYaz7Y&(z-T#;}d`EXgxeUD|c|3^YSn6{r$wK{iOr)GG5AaPHk*S?>~D9wY>DL zTX%0-vwqww&rO@TZguO7-g{a@&OM<$e^UAnYd({`YhK9MIV}IpeLMEnUG?6v<6mr> zJ3MXB$OA{E6gY^sG>vbKN&c#upwjVGNLQJHPtJ(|=#KT3MQ5YCJr+;PWFp&U}7i$)0Js^s@!8f8Eg3 zRQPg9KjNIQ-Tvw)bFQuY*!6Iq{#Dhabmyi;KRi8n(Te#k8)>=uy7LcpES{$nJ<&Yo zzIV1=LS()FSHqk;w#$1P2R*;Ad0*P8vyRq%y;m#u^f`aj5$e0Pm-^wN4adtKpZ4+3 zi)#n{ZIp(0=vvlIur*ZS$8V?)4%NkSeE|dIg7q6QgIPdxGj}A7? eI%w;-p73li4frMFe(eQR!abqL^+w)|hJOIZ(V$`g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/defaultcrystal.png b/src/main/resources/assets/bloodmagic/textures/items/defaultcrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e5c7734592f79dc249f8adf9dd2bbd4a867e3a GIT binary patch literal 917 zcmV;G18V$D+r9>D>_X;f1H000McNliru-~${EF9voVlZOBR10qR8 zK~y-)1;I^E9AyB&@&7#Y%rkF0v&$~aVr$Y`HXvvM2BQ~a<3T*=MQ@(!-NeLr({JF# zZy+cA1YFdM#xymyH7+294XtI@P@xF>HZwafJCDDgap&u=kV2qb8>wuht3X<4>Ec>8 zO1WedjD{o1Bqhybq+wtr3DYP>x)qy33xYM_9YiPs3vK@2~V&?@>9PxZM!^&fXbZnZf z>s0(EhF!t+t5|LYnU`#=wi%Biq@j=~Ov?ku#j_n6twlUPKq}iOm}}rx8Vn{WLI|pr zDmtC==c8k-9Az}>b0kTEDGah?%vChOFid0+B80L*+h{E@Es63&4BO^xn(K|#Hl+~S z^E~_@;Mx9Pl-eXWC8`oIH{U{(!eki5%w{u^vrCjIx!Uc}axC7i)e&V$F)Qisc359s zX7A|JE^7yIVT3co~iZwu#XGGB$famd4udgmMsm<$1&j^)+hep_@AW0Hx zNPTuQ?w{mu^kexFa?|A3Py zqB|IH%W*h3JY;+OTV7dNWqqZMnpiqZBFtCcdyDqMnqGgojb{j?VRG;H`$${iS3}O8 z{ma9HLwda)AAk4}OE+F*_vi`#jQ=*GafB?>l1}%oasTX8-+BEFyoDz7j?H1Wi_CHc zSC{Pl@qo`i{fxRF@ZAqTQLkZ4CPPM}3C0)O-w-7UmMNK84c&kEfbnp^IEt9%8A>St r-I{L_Hs-m$@sb#gN5qo}Vy5{YfV_0quEgbb00000NkvXXu0mjfYci&< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/demonbloodshard.png b/src/main/resources/assets/bloodmagic/textures/items/demonbloodshard.png new file mode 100644 index 0000000000000000000000000000000000000000..58fd68af9d95a32a95cf56e4e1307816d499b09f GIT binary patch literal 698 zcmV;r0!96aP)F{Boe z6X-I^qRkA_suHXuA`)DLW$I|AIcVi=RMfmQb6SX_173RJY`*iJhjYGj5E0gj=(2mV zUT$?DBE;Qt1eoJ)I7CFmm{qnZM2ojM#cj>OXekwdow-G*t$F|wPo8CWcDb;DG=Qf5 zG5^Ch1X-L1AR*Qi05RlUBHrc{)8+eqsOGljsG|C}SZ`Khw3N#E>=JylQvjUW6TajM z(}=iGPWr_w01VZZ`8(DC+}0drtEwhA)}&hd#_^600^nKjqU&fO@yKa{#^xm>I+U1{ zBo%LSGVHKpw3Ldr+=?$$QyIt4(AC~3$8rnEYw82QQdr2}k1tW-dhE^ZOg1_JsB0ft z`2zsPrfKW!L8ccO=~d zDlLtl4UbqC@M>fXJqpbb!qeIZ0Ce5eFCjbBd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/demonicteleposerfocus.png b/src/main/resources/assets/bloodmagic/textures/items/demonicteleposerfocus.png new file mode 100644 index 0000000000000000000000000000000000000000..a9814d3d0816a288400454dd1e556187b6b5cb80 GIT binary patch literal 976 zcmV;>126oEP)6HxRf7FRlOp03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00T5hL_t(I%T<$IXq$Bu z#()33N!~UgN!O%nwRHV1TZf&krDY6MwCal8V0vL4!gR%t3UfDp%x+pX+^CZwIAxY? zuvNVfRBDlll2tD{1ji6RE_9{c65G^n{aTWydGmf8FCxJnIGl5M&c(y?@E{_*dANsx zw|WqfLZ3OZqp+XsZ(oNUc<~`#>3;+fK@A??LoQ>Aa)F(-)zHaH3?F>}v23|vlqlPD zC^v44S9jFG_pfoVzY7r&<Fh%j)dTbjGNX)1O2b@X#GX^X!lOsH#s;phZU8b4C2&5+KxX=vFVO*xI)*#$eh1X?~%|YtBQO=D_ zC;&IW>DN2)7Wvs+|1`$4ImSQwkeq38Wo-+#X;SITVCEKyRF+a4sUp30g9AN{oc?AK z_1?>^=zfnB`#f~+eThq_PVrf?L1`Y3L^e0keD5~KFMNuTN~zvRTta>ivvaGMwno~_ zxW2qJWRe3LQY)9=E1) znH=+fe9!!?RRC<$WY=RmX$+S!K0QftW|mwg1Ar2xyjWxnH^nXu_kUIu>cswLh11Aa zqoa6=i%2Hs&~z_KDf+sq@w#2>{*{O@^n8mH1$^99?`P`T9EPo_i#J2Ep?VXJWwAIl z&F<1AWtg^9l>3M!R?#)Z`DiR}RaUM$FI_HbBqS}GIv%@zW6DjVz<|DEGP?l@>vlPj_%tg yNA@<$|0Datqcw$l-^2Cmu-$DD>256-5#e8&cbl$m?|?@D00000J(U1}|sfy6Vt@0*n7Z#YAPO!6A z?Y#wqL6TE(8oEh57UjjuSH}R_pTlA{OCmnO{y|;MrjiO!fNHnfs#-f#@mN&ZO_w{% zw~qltDaEzLMN-L0cK2&4HWB6iy}N9d%J^OffT2KuLZL(`6u>YnIcgXbip9SM0_;_P zsPi*ZJbm(*wNE)}^*Wa0qMH`y(mFS;FJTxKM-4*_WT3i`mfK?W{YTpEHjf@Y;MVd@ zK9^R=t#9M9M?5ycQNtJv(REz_%w`k2>0p>98yk5tOJSZr%Tv?85gwXBL{6SUaykJ( z^`K5JUnHHL#R-1p^{UP>CPG6uu`HYIN`-RKVloj!w;iHmVH&!Q0R79?TO>^c0WMvf z<@?qSmSy8B#qQ2F<0C27)=RwrwLXI$K!6MBlx$UY)yQy&X!I<~_t>u{6%JV!B zAsikS-LUymDxGZbZ)GzXJkLWk4NU~k_sMsEJ{90J^&9FT4-qpI$QA$q002ovPDHLk FV1j()BPIX< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/demonwillgauge.png b/src/main/resources/assets/bloodmagic/textures/items/demonwillgauge.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2fcb9bbac792ac20cb33d553b44667a09592de GIT binary patch literal 811 zcmV+`1JwM9P)WFU8GbZ8()Nlj2>E@cM*00NImL_t(I%cYY`NYrr< z$3MSq-CbQ@8QIe;$|xbsjLM9XGRQOy+$hl~C^|$CL|uZ6I`p{IrBhk-z{=7NQ3r29 zP%cDfWt-(|b=5RqoBR0h^52F_M^?vR z^_#(sntXC?mDua*AkKpB^U~O{Py~f7t6zl!LHq%ol{<@g*U-fIx=*nTJmVUvGc!>L zIb|h0buN*6j~`KZ@iL8_3uSTPCIVWB@wR4+>JI~Bv@pZ6jB5_zc+wJ;9tt7O0a=idNq?V{8731U zO{1;(wTcedwf~?Lt}h_jY6akK<3l`YiK=4F1{vyi@xs}uaD9`cc~alf zDob;6#Q;#-(Zk5_5ZCV50nkGs-rMciySl0E=%MH97lJ+?059M45{X2xcXgxr{l6p> zRqT-sx$7_(;{bU4p`j#ywb`A-~Ah+xeNuN89 z{`a3nDKMGMjE{~{nH^DDIE=2Vsa7@_P3V4|4{zO+W^}3Vg9BW+eVei~XK{~DP?Zx@ zLlb^XMgy+lA5)E_g*7JKW-P`Cz0NVVrAO51g9k*{bxIa%$~!4c`a;Z3HIra5{;{Hn pM6;$UI|lzN%kt7=u$t~W{{(6AT?-1jW{>~?002ovPDHLkV1nBAX%qke literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/destructivecrystal.png b/src/main/resources/assets/bloodmagic/textures/items/destructivecrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9535c18f9330f81e8b089fa6f36cd08acda430 GIT binary patch literal 933 zcmV;W16urvP)D+r9>D>_X;f1H000McNliru-~${EFEz=|@{s@l12RcO zK~y-)1;I&dRAm6b@&C8HZ{C|X^JeKR77T5%3kN_Hj7G!|jnQx+F>yJX5YC>xs7DXp zyn69KjN-wVcr!}e5DP`pY9z)s6d5SP?9(^%w)y=1#7A#lL`uzEv4p1to^oJ1!POZB zlS4TI9i}{r#|)yF$T}FUX$!%A6rvBf6(XBZGdUXN0M90*D#Fd@QCWy^9NfH5VXBy9 zmP{G?;TUc5bb119%05kHSkwl|1S3-9TnQUZ$Qgs{%_FR(;z`13hs>){4nlT%J+gcr zT@i|dMUSFZFznzs79(AXg(|~Y4AV9;S7Pe8IGID@)6T?g3cQ_=+!7!YqZlg z#wp?!>IkFRT4>qRJIlh>moN`^(X}O#{Rzo%3#BAAW=Li;U<`2|*9169Vd60xD|`0I zXV%zQduWAUKtFZ}k;H`Q2rVTAsc4pbWGU^~WhU0{r^RAixgV zh@6MbIXD)o!68aQqoNq8r6mkQR5n4IJYq6Nln#&yMH>G{ibm`YuMsu#%!IK+M~~&;#zs#R!Tne2j)qWF)zIK9N)=5Y^6~osGp@fDqw{m8tgJ0w~^`8 zGDVXPhj_tBPCWl2cei`o{QWkw*^JSC4}ifq;oq&xEFW!9FD{cQAE7+t)b&w`q`4l8 zpD(>n67@K9?lk}0zQ>*I9r~R<072kVohx(ohfQuC>)J3JGaOHlGcD-GDGy$1+DMeR z^y#fdKcLea;^!20 zEwnc_?=l#S*dLEb;tXR9fUP&1RI34J#F~86?-9otv4;Nv7d~rX^3)y800000NkvXX Hu0mjfYr3n2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/divinationsigil.png b/src/main/resources/assets/bloodmagic/textures/items/divinationsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a7fa349f7f94da58a485174cf0bf8de3ee7862 GIT binary patch literal 1583 zcmbVMdrT8|9IwE(4rGJO#VLsA(fLTcS07yOv`T4r3(`=IFeJ~Zrz+sFVO!!#1G)vlPa;St6oNwvm=CxRj35XEl_PRFBqE?-EhkW6hzsT>6!dJ64tV^6 zhv$H}BIV#03K~%K^!XKhev|2iFc%ySlo&E3O!*NEMiHMcey<^PP_VH7y75wU&|2$f z5epmS7Y1lCAI{taS&ZGQ4aI??H)Kh`BPNBa*7Nj2AIk|wy#^FdV8+9ca*R^5v{M1m z3Ic~1R>?wy0#!jy2TeH@YLyySI1)N9;~TU}oKPwVR0Lv}L0OTv8WcDS;1IdA>SP1!gxd@Ig242Xs1Ma)pOu_)u_4JVVbf ztY-tB8kQ*x@IGKD#H8mX=1~H3vQ8BRu?__WsZ>f7Qlo?d!dcppM=^3*u2g`-eCGd# z4iTL~;&t+$x=Cz_#TcKy=mK%^qK{ZkY@UGFCC}2nS}BnvS&e$FHQd{>X1@2VeNGCn+1Kmi z<`r-Ey82YbeS3{nB}*ee4LGjWH{#1T-O&7eKf8~ zxq5x4ZI*sl)#z=di@9?vJC}7o*>j}6CpO}?Dcx&K5AjFxC$5bx-rcmb0@jvV8(Y8l z6HANCE%s6akH+@?k(Z-cls~VUx_&L?_Q1rhu2FkFTVsw?kK9`KWwy(Ha>tLYo87DP z56soh*k~v(MVDODEM8~2yFT5&Irr~@hsLH2t)G|FY`x;{z47#X^w=boxoylYxJ2lYa9{bvkf%O_r&=^K^LRw2Nu> z!+F1auqB#mcj2x|>{ethTpW?1^|1*}wkv5p(w#RCG=F%yvEb76Pp>}sE@n#Zv~)gn z_O*AL20tE`=RUb+$Eax&>;_r(zIR%weB6}Obp|Oumnm&YR&8H#|CaL3#n@4*d5r9M o)4|RYKeOb0{EE?H!etlv) zTr~C1$CBe;p6C1f{+|0hFL(dk%gt+^oMWgp5Ck!&snOR0f2+0c?3wWIx5g%T_*0c= z>`(~eq50bP0pj4$0)k-QmD<|X_TbZ;AjizSD2ISK9ZNtpLAaktCwO5CP>mtbCB^H> z&)z>p8YQuweAXVMg9$H)NR9nT(AvMIP3Yeuup;?{$KXzL&>#j>-k6R>;|iCqCo{er zjJ0NpG-f2~mU?ovR?yfUY&Lr3Brw{|4wJwzjM2%O8N17Bv9B~*XvR*_EXB|!n&B9l zv(U!ehx8a=t#O)+F!a1B#H85~?J}jhZhXl6%y8lGF+nKDq0PC4#|1skoA(2RTw{K0z^Nnu^7! zN|}n<0*ZsIn5ne&B>>d|6uBoU04QHl*~s4uN0+Kq4ZmvJ#P}C|T&vK&(_)mBLd1)Ow~&18HfBG_5C_mRVET zsdhss!65fcQi98$kNRYxN4u^jp9glBMM>l=4DSL$*lH52tkWa{8!)j}+HMMm1U_ta z*#P4k<>EVrnsW= zaRKB;F2Rw9TuwMbAed;oQ#A36&0=C%+F^3p!mPv2hU^UM$Xg@nW!65BlzM>}NXoIy zhDq>A1!#-6p3JY_!Vb$(%`AUTDj!pr4LN|#>NN3!C2X?UZM=zR;bsk483zko79j+H zn<`5$jtLfUXS>D!cdp9Pi|%Y7rk%;KFh;#;YDF z#&-cK5$|$S#YRL~xG!*CIVvaNuz<(vrYbcfS=t>zJHz2Z;xk)@aZ_b&rTTX5@QU_i z^iFu%(lmSkfuCF|+FhF3asO1byEL_!`MtQLdMvqWCCx~dcH7FrXoZhzz~ivnt#&t6 z+FY8^ETuuT-6z4jnW7yc3_R*HIi(#H6Fa6#L^^Vb*^PocRAu&2wiQ0I!KX#4@VGd6 zixp0;uQ(`P(N}DY+TkK74c!>y(nW*{FfNpaZj5p1B0>ci7fM4n#<+A5p#qExrJ);R zT)K!*0mg;W(2X%JT|}q=<3efZ#u%3_B2<8Jp)_=3j7t|0D!{l<8oDvYrHcp^U|c8- z-5BH2MT814E|i9DjB)8ALIoHXN<%lsxO5Sr0*ni#p&Mgdx`fq8{Zd~q4)wOh{LxoQ}Ff5W7mUM;H#NNp|K@M5dC!ov3(~& z+?{~Gw+W($CWucq69jjFARd)>fB$TNAih@9JB_QN!r69XnTl)3Bpq*1+p?{fVvBwToX|)jW8) zd(MK#e$-Ig-D!XMV6|^|YVIF?IDB>0!*TZ0AAk1gxTlVc)(!o_vFkLy_9_0lhJx4!oGx5jp#7tb7B`Np9``;H%H zt7h&bNta`1Y{9Pd$<8B}m&Sjy=!)%&w0k8*IVV;rkvskk(UGCIs!!dxc>9ArC)Rb6 zug#t@V}@v1=zFpMXHb{Fx98BtiS+!pE#D?eGZ z@8$>dqyOr?^rt^wcz=W3_sMhq!_7Z6-MV>q|Nd`(z3SNEx#ppTd%k<_+`q4FI_&BA z*`3};-`()nA22JVvDo4!r{HNKIC%{%@FmSzi& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/earthscribetool.png b/src/main/resources/assets/bloodmagic/textures/items/earthscribetool.png new file mode 100644 index 0000000000000000000000000000000000000000..619db4c9fc601b6875fb4e401b112d9d0cd56612 GIT binary patch literal 15411 zcmeI3eQ*@z9mf|$Cj=rwbqvwb;{fHw%kJLY-ra652gzO1#NqNrlmIg|dwb6%Ywm6@ zx0~dW(pp|(1;SLQbV`cQW*D4GDQ%G|1&z~sV~43@sanC%(twJJLPn-CYG>%P_xj}S z!jtLv=d+o+`{jAQ-{14>=Xu+Ic57q(cS?%OiYbaJsjKxg!{0mfPtk4g`~GV;MEEl^ zQoB~As9E3AKhvn8y`>bzKQFhmYOUT?f~17XMZe+$<*`r%swv93A{G&)PM{flpj{4E z7_XifF&bolg>en%WxNqL=#XpsqhNJ^eT&rJDe->e3Rkf+Ccp$CpoxZ9C>U0SScNf> zSAelzOdAaeiPl+RtkfGcw0av2ZY2r~T)E98u`Fw_^W`k(u$Z}r3}%MqXoja*#>B7! z%Lr!1kh+YnVi-B2{(#WzsYx{l|En-|Xj(*|>E7Pn@?J~15^bkhp66-COqXgBaC|elb8&f|g=<$l>Om|4*Qq=3aFS$Mn253In%TNut1 z@JV98;@}*1i_b|w6+wB5 ze&^Iwh{%Gkr5M^!-c%J)3O`K8|REy;COF}@2 zhD6OJhs1V3N5bt+I$MY+Gv|WfR)R_tb_=*HPP$Mr;?hq9eGi8dNlYvm)=B4;cO z7fJ&g6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL2`(%mR6uZ{G_Wzjg++u4 z2riTcHYT{Rh)@B+h0?&rH^o()eE}1M;aiuz@byYZ!{MXw)l7p_+w7&N{>2pa!_5@+ z!YWgj8p30Wkdk22veX6;E!?zZ@1_G6 z?y4N?Jow}JL*u5svT^;H#szObu;q1!YoB}jx)*l6cVPA^^W4y|A-W*+xTSb_=k|GW z)2v%&?eh!>Ki$p!^6A+h${(z}e~7vJ%9V2}ef{;hi+(q>?yVz#yLx?f(Z-$=J3blM z|J2KM!{2}Yp_QMH9KI}c9xGFi-@83-thjGZ+`GJP_{doF_+K};-hBMnsoF(<>aafi z;;45Q^B-aTyWO`xJHL`C-4gdzn)hsZBjEm3%evDVS2R#{@BXd}AN{-Z$>%;TnlZh@ z_Vd47x@Oq==%IK1x$-UR6`r3_T^8?rB|i7;#%I6!?rRsj-oD)JH_v~~$4;XzGz<e*V>0<4vXS-ZysfY{{9PcLo=a4u5p&j~CyM9$#{3-rbJ4s1NJzs<3}bmWzL&VR72wa9s8&(0BM*|w^q nX9t6}`1RBkr*^&SN0#ivu zK~y-)rII^LQ*ji=fB$=X+k%=(AG{%fI6<*sL?cEcF2+HPadyBcqsG<6!Og@)7ek_P zaL~a=P$H-S6hWef#nK8vAZ;)TDt*)2`}jMcgx5ggH=T2m^PTTI`Gk~`|AAw5v%9HD zR+RaP&wXE+X_`iPsgGnTgU{=sr}wp3y(9i9Xby#>x5UGlQ^y&f_=;_r0H_WJPNxgg zGzo_zIGqmqUJZyf1TD?YvZ_2l=lQcd?(XG!{|}0U1!!Do+m4b(~i9i3=We> zrinzO0zd%}KtV4s`eBS)1K;p=U8U>dQBW*))z@-&%%*_k@SPES-jX#xPyi&5&F29) zw|^(bi#K%M?B`N@fcg0aE+5%O%*=7Gy#hs1Ha=0;b&A|ha!Yx1UB`Mh$WPOSK%wJ# zjNi7wCo|81ms12(C)Y~XDJU=VlSrod9FF4m`FNCG;Ks=+4s}PleXNFzZSwJ8HH*^V zeyew*h5o@I0g%n+P*oKv6{;V;CuQpxhCv>ihIdmWYy-nE*VtI8gb)Y;lao^npAO+b z(AQQ=I-TK3TO~FMi4!fjT`pFKZ-qb+f@CT~Hk%_hGs}ZIjeyTfAmFF`1Q)X}r7r*g0!B$h zK~y-)rIO7{RACgxfA4$eODTqC938O+)F`siF%ZewR0K&-xM&@;2v_|rtz1{zHW7tk ze-1KyJtJan# z(!aJ3W^T8eaC4A+p+qp?XLM{_9NrOs74*hpDsaZny`kGIrGDVp766*dg~#K?vMdsb zBp#28x9_Gz9l@2}Uey*3G5qj8FJ6t&KbgX>`6xRk6Y;YcRg>6moJiB zUKRinKmev;GXL=l*QYlaem27Pqd^85nmOMQVeoSn3mfz4IKjY~x*tdY1?bf(0HgiQ zSYtCpMkaY2KSd^!W&TEl9jnIAYn@0bk3P{b3>thM%9SdHVes|kEa{q#KoTBZpk&!> zSO$&bi?m6NZy~K-LAa%fT)xO+Vwt93kSDn%*6wyAUw>lrRu3i$Gky`>Hrecp9JMex zJtF{gy^N-5fF$#Lf{L=K)oK{3hMG(4_g0;agGva25U{%X9W@lkg<$vU1&YNI+4v=t z613hKz~}XHID7{LQV8;e61rYyYkh;&c0ZwDfKaFj_v|7PsJ&SrUnn4sOQHZe+Rw4J zo<`TpI7*RDZ=q>!L|-SB_bcpl1<3u*acmL+E_Zb)ug8twe;Vc3WU{*;1VZfHR7%m< z;G6Hw>%>bKw9003B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Lo2L_t(I%cYY`NYrr< z$3H(^cem2qO*f0st$bj@T0XEuGK?N%v>r6dq9UY(hzJAeBq#(O(t~;k!b6c!kfA|P z7#idu!N5!tGc^-j(tK<__W9rGAZm+22M6Xb@a4nId}ox1u$~BEoe>0Rs66!FcJ5x? z7o<_kBRr_cmb9W`IvX1y%!szQz>S(N1yFk{OZ*-$E|12Z{3CQfe?wK{7X_eOCe6>d zF`2C>gjD-UW=1=yEz1HC0At#+^i&>0{hwt&SFCvEk$%)91k z@}#5re4P389gq7RQ8AIY=R=rqde`p2>k82K?J=)w?s2oWOEr1YiB3);@4`8r&c;#o zs8>yl&*ECp2vb@xpsqYy4qUoIYkfWC_j^=o@o6#bjN{kWK`y6d5owJj>BKR)^JGAc z3^|Clgme8=!qW0Ygq@L4nHx&HX{k;rERgDsc6r&~E7cwCVmn(T*4!Ks5o{K?y+4E< z;Y(T_Kv_wq#AYT^`hJi^vr_szJ1?4>3EN=g_qc;lgC3<6$dIQpCOJ;Mphy{C)~7GiY1lCBhiW)U=CDM#EYg^*TM8OXKsPlbCJcO#aj;jGDyb z^$=85ndp*8<#rH*-z{MqPj(qtkfZ0qR~2DS*=ByCf_`m|OH=F&Wrs v)U95Uh^%DA`4suP{#V*Fwgzd`df)jE7c?s&aH_M-00000NkvXXu0mjfdofQd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/etherealslate.png b/src/main/resources/assets/bloodmagic/textures/items/etherealslate.png new file mode 100644 index 0000000000000000000000000000000000000000..1986a7ef46b5db048cf88bb6838b8945b4a65b90 GIT binary patch literal 725 zcmV;`0xJE9P)WFU8GbZ8()Nlj2>E@cM*00KElL_t(I%dL~mP7`4i zhM#YKp+HMZ1*%1*BrZ%tqVWgf6}V#I!j&ssy6^(L6>q?W3vR$If&vZyi7mCXfQ4e) zX{Xc9eDk?L5dyCC-JRr|Cr{qwz&}QuA0A~UNyp<9sz;c*MlT4kO^X}xVU8V#R3gFq zPm5Or9#2h?ibl!%zDkWH*{d9$Et#fC`uZsP;gK*6gAZSpF9K$#GK|Nf6oODC;xV4h zJ!NAjPbdQbbi-hCa|g>ZkO$vIwb5j)Tme7>P{6KKDxDhT&Ffbzt*lW!KBnz;X|~$j ziDa3bc|g-?voDo0gmz|N{MHaauiIl`aT(wDdHLcw5AV&fvvfdi`!n{5U?j0gqv3Gw z{uI#ecJWP%R;Pp8@o-u#a=CS;dBVH-w^S>V$gqbHr3~yX_JxMR~7;uA8)aE)CZKz|!?A41^#%I3RMxvg)%fVzD7qC^VGd000McNliru-~t`>!iu)&)ar%I~m)K*id{m00IzQEp>D# zwE*I<(zrXI)90kCP1!WATQb;8<*aFX3I*^qm;prl!NyX6>UC}!^*?k;@srb%)u7?_9p| znvo}8$>jv;Opf-B0|?;QiGJE!Td-QKJRf@qfT0M;7X+%R^5E$>S1z0-uN6q9`$UcxsT85DKiI0N>DZ3oqWPaSQD40oy{MliGR-Q`kw^dl0000< KMNUMnLSTZ;FE+0L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/explosivepowder.png b/src/main/resources/assets/bloodmagic/textures/items/explosivepowder.png new file mode 100644 index 0000000000000000000000000000000000000000..635b2a364cbe2f988b1601debd83b9ff25192bd3 GIT binary patch literal 469 zcmV;`0V@89P)_1uTNLffP0tR%xO|Y7GQ#u`i&750PfJ@By~8@EHWL*+#Io zzgP$&HsKO&{d0>m)d-GhW*2sU)#1SJ0|yTLi^%UE@>gZK{*rGaQ4~oOMPiJRR;wk( zm`dQSY8l6|)a!M!EF(=*uGcF7Rmcm_>-D7H?^CPQST2_oML`&bq-k1-JOE>ibh};g zJdeZSfaiHMn@z$nq}^^41ObD=fW>0*guEGJ#26!GSz@i_a=B0x1)WZZAPDe%pX2e! z>2w0XT1#1$XsrdHw%hIA<2VMu_kA{-4c1z2w;TKY9&0V<^O^ho&S*3uNfPorXSG_f z-EMz607@yDOeO%V*K208832ys05BX5ab1@z%NUQx%;$6G^MuFn6>(h`Yb^jtlF(>0 zUdm6vCo-K*0VvDzvCs1y;H6v{rIcu`MQbfeDN#y&|Be5+_+Rn?%$2uUQ@PMI00000 LNkvXXu0mjf6hy^@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/firescribetool.png b/src/main/resources/assets/bloodmagic/textures/items/firescribetool.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac43b4d4bc0e72ed24ff2c53b92a3917633b8e3 GIT binary patch literal 15837 zcmeI3eQ*?K9mh8v4H6q^6=|eZZVqBa*xR?;ds!}rA(u449_Eb_aGZ8;_qk-r-R<>u zle;jP!4^ho;u|TJmR2cMTiXtlG$i#6k!oOoYRA%sY3bPM3qwJXDo&{_iqGDAp1VAg zar%ejJUhAE{hsgh`##Tpo|k?8*?U^o+)`b&u!^Fn>Xzm}JN&-R`h2Vs{$F(Istmv8 z#+%n06!q~>S)U4O*F!ZFwL;Z8yUecOt&*Zg9kQy2fFl)+!`c+(TbYW>N-r>NA<(VG z>g*SPdB|?l)H?e*F~|nv4WLJB-jo0xo7QwHn|c+mYG3KE@}(qb5Cx`eOGP6wLrT@z z)4me?Z51r5SzGq9`>WtDUqTH_?SZCjb1`1;-3;RIYth z$>+rT5|K1$RbfB`L}5DyWWbdL5bx1V-RRM0XfiLSA(m^{)WS0Ww3HdsKuVh-%~CRH z={c1dY9E9W3`$=~XmI+=k$|rBS@+cv@I%3&YO2I@vIi((fmQ^sn^u7n&|ZNR>2OGq z!-7ZjxP_39nbD>&tFld%X`;dDN#%%b5(Tp-hD`&_gbP1#HMkdz~ytyE&&ohe9$-iy=;BJuXEM zWKYh&D1GKOl06{ihr6~5?$QXo`fj-3{F%o@ zYi`%DH8i9j3$`z;(_*TgG?wOEr>D(quk^^VZlL;^Tw<;OP4O|-&_%TW#gUuc5-u5d z^cD-VWBSN>I$2g?;mE;J{J$Bw%y>>;in(=Nx^%5wS!zfC87}EgU60IWBBCh;+yyrf zkWElnBU~pZN={x9;P#s#oj1wUL_C7Js)Yxpdz6lrDQuiH(=tiZXZ)9EUKA*qDu{WL{GqO0Y7|ll`AgFvYzGE(-&?5a(c7ld`w9h zTEEMB>_qy~_1!!RFL-o>S2nd+MpM`0Q;TIZwUD_srkQ>|+Zs|_lw}<_GB7&eAshHz zq9}+y1}#Q2TD262bOkhc4l%6lpL1n%P@!z%`k4}ogluAFp%fj5(>q|M6dtzWIiJZN z^h-9!{A1_C{86~057QO#B8?zG@FBs4=YyyO7Xkzy5?pvbh)QrFK=2{Kh3A8)1Q!AX z9}--6K8Q+iAwcjU!G-68s00@R1RoMycs__qa3MhOA;E>`gQx@-0t6otTzEc+N^l`S z@FBs4=YyyO7Xkzy5?pvbh)QrFK=2{Kh3A8)1Q!AX9}--6K8Q+iAwcjU!G-68s00@R z1RoMycs__qa3MhOA;E>`gQx@-0t6otTzEc+N^l`S@FBs4=YyyO7Xkzy5?pvbh)QrF zK=2{Kh3A8)1Q!AXA7XJ;6<(bMG5Ef0622I_asFq14PUCYDb4LcirQ35QD5IeQUAOO zzt2%rA4^f^@1Q8@eu}z5AGv+9iJ~elwFK%rQ?LB^-b1||Z8hK6eRA7@q39#@=(^Db zn?EwNWmw#@4Q#^}40syzz=_PM` zHqhAf%8{*a4UO#heDL>Y)jw{G>{;~Cg*xW!ii?-Nc)iSw>CZgdyu`kG>4v=vo}Y85 zePHLF%V$Pb1^RuDYC~^&MoyervitcH7vfzn99=WCZU2)emMvQrIz6#tb?pPYc8#Qb zjy|{POZS=c|7>n7seN2Rjb^V{=W<-r9w~m^^oh`O?Gc zslUa{r)ysO?qd^20tb&@x$>*`Z=SQEcVO^>bY%Ua!3ybvclN#eo3qy(oLu|YiG^MF z{bb^)(-o}W@3`!^_T=9A`%bm3KDv9=6Ssz?-#+%h<*n{1_S%N=+R@vdte?E=FJG;C zZHoKTt2d7w_}%Lpza77Q-Z^u__?LVCJg=##>8-Xs&$W&nyXENN(^u->dv0!JWo4&* zd(XTR7hnA7H5CIdy+psf<#Tf@x9~34#Nx*{PriNmgUK_A(f#`$?(g8oPf1sAqU1k_ Wsb@P@Xx0nZEsbje`&Qj?_kRHYEQV14 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/goldsand.png b/src/main/resources/assets/bloodmagic/textures/items/goldsand.png new file mode 100644 index 0000000000000000000000000000000000000000..83d376774b921b0478b90ba2912a32ad481315c6 GIT binary patch literal 499 zcmVd9WIe}c-HYa*c1wFC|&f7|Iaz+`!5&%dwK8Wz1LCu zR4;Qe3aEfk6?ns*lD-LlJYb|@rfA3$7xGTAj1hn=-ND-dWO6fw zzzP`0@{$gaCX*hmgep(`M1CfFJ?qZLR_G{sBURs(5wow=w zHxY}p@I$Ba%oZq<7XYMEs1Oz-a7axla1}}6cnU;dxDv%Nl%NnCr%5%9r$Q4CEU5_& zCvDYdO=w9gE$k9SFO8yQWo3#orGggA1iQP zk>fp3fRVBDrJ@#=Jbictx7TcbMC|cR1WF1S>Sw$tuE0>YJ8-XYYoBNZ|GM#5YoBeo z7ob+)<4Xlr%7=4K5G=*+$wC1`$s76=fs>NL6zh4m)D1kMNw0;a6NQ6w&;-tC0P9pD ztddeA4nP8gQerB^X=fRyQlrwSmG&Ud5$tgqjF_~<#)ud0i`Fr-%b{0kFMx8y$ z*AVpYz`xX#Y|AwB)6A4fd%(h>064JNec*ujjwC)&Chqm-J zZ7__xUa#%Z-q`|eulvw-l&x$N2JCu$yOp(f<$9$Z z5l07XVsMO^$@mZ?f=*%_Ojtk`*(Ro&V2lpsLx?yQlrIP36oMIE$BO*Ee_8L))JwRa|LxQ6iMs@<@jBDe0JvGVJqbc7PawFHJ`LTVMJK`|AoCJ+oGwK@`;4UImq zsK&e8WC4{mswJ+BaD^cFNfZr*LduXv$?@eVMi2z5Qln}$B3dAUDpsJw2pdR?Gf*JF z@E*V5;aDifNISWpV1z|aA6&ubx7i*Nvw_h-i6KM7v>(NkD%9tT-D|`;AQXUq-FT#R zz)|G~XaNXtL7oxw;ZBQ##n?SwC}t>nL(bdhIVW8xL&7m#(5rvH(M2+ERvuaI*71!eyEoRnf z^=iTz$L6vDfo2&H*Y=3oqgdTzv806uw7~HWj`PN=z+S-#T%dyULlz4(tJuT3xKQAQ zScV>4m;$_KC2(c&oDUiaG3j}Pyo$iwz>U)gaB46F$F(X%uOc*v4lvHyv`fvXwHkO7 z@A|)?Lq(_1Se^W*ZsJ>FF~+73yFgq#>?6R6&BKdbav)0mC6Odpaw(G|d~Q!;FFVO3 zuf2cP@OGrPXJt_xUh2&FQ_(e}Lz{cDWuc*G+c*6a~m0s-E?Tc6Mf@ICx za-6L`c&q)u!M`^Wck1qLF)i)urb@pYsw`fRSuDRZeJEhqRFb#um#SHlUmiGlskbk6 zwQQ;{_4eJHr~XJ}FLXrOhU9O#C$(Sd-k+)HAA4#!?j5{-@vDBIs9m2&PD_!%rKfN7 z-?*B6@Xd1n;IOaai1u>dr_IERX-(VGH#3Qj3~+qYa{14h(cSfIYhBSjZ1(l+3f!AG zR~lU!xf0&#d{m)teJ7_eR@M%OL1k(Ym1{{b>xG^>%ujb;60;b;Y{vaS*^`Eu)|nA<=Vn` z%?T5&r?1%$k1s1p>gcA23b!uDg^6j~zj2wdnGHF~-JQ|=OCiTpWK;Y0j;8E%p{L>L zS7uz6L24fzArpS8OHHIyNp0y38;9$IKkmPEsMKBS_Md^9=g)g`f$_VZjLz=Y2N-ER bQ=O=g$nVJpnr6!SVt?#hYd-afxvb_NhR#E~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..50b02bcf94bf4044eb2e0fd8b39945e7c7c4275e GIT binary patch literal 755 zcmVWFU8GbZ8()Nlj2>E@cM*00LJ@L_t(I%dL|=OjA)5 z$A9x@Fs4*;p z2x5R18jwZ=3a!@mwXc2n-n$M!V*{I>>7J8&e&^)={}=u-#NSD%zhAbuHnF;vs?^+W zH*GDAfRdL<~HLW zrx|(L1@E3iT7g^xObA{?SKzzATAC#4cNm)RQU#Dev0MgV=+Xig&fnzI)HJ_zokz9H z437pWm4BlMfnk_HvKnBTCbcyhMyZTxnnX{&B-)*UO#vB`k)CmWrX2Kw#`U7VN(B|5 zt+k2NW`^0hINjZy4BpPt*&ZgH&GMvYhFht#Y;2_Pcogj2$K9tw!0(q0^@j+Bg5-6b zXJ=+G6`O3_q9EP;Tr+rRg((>p>!~#Jv6!fA03d`w2uLKB=9OAtt7co9;3O@M^<&=Yd*{!WGo-N*R4vWj#Z94YBI+KkKPMkoSRadFw2=Kgvs0P%$dvCqoEKtOslH(qZ&(y`e} zXF&*r*tsU9q^`DxQrRRHkM9Qng!}p=fMeTOj)S5I>T29La>v$r-C!}15C?vygJ8C8 lBNPQi2yDk;es}VJi$6oZ`nn&5rVIc8002ovPDHLkV1iHpOH}{> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..7601b9982f5bfa3c23d7432fed7f0877362024f2 GIT binary patch literal 740 zcmVWFU8GbZ8()Nlj2>E@cM*00Kx!L_t(I%dL~WPg7AC z#((GD+fN|X@=+QfL_ov<#lb}vHxm<#F)U6_#zhBZck>VMKX5Q1Zf+(TjgV+!6ww4I z(127Lprtg@k9&K+j{|~Kang5tPjY_ed7tyV@Q)>qHlrgWGMQ*2x0ydY3j_jmcC=Ei z)M$;zc>dzGI2JILO3C=i7!%j7u(+~@@3{b|nno}f!gXC17SaTR8ZTc>AKp^{&W(-9 z?qmn|?%v|#=Xr{|yBMZLRoA(5sh?~%OJQe+ixVimC?ba8SU|QBU|ANCa1f(zVp$d=a+85x565tD^a|rGCPgd^+hs;}HvEDH(3xl> zU)W`SVTs<}9v(dVLQgV5@w?<|+-AnZc8U}HT?*It_T);Ol)6K_AkX={~OEK0djX-J=TG*Nx0dic7YL)Q(m zQqpa2u%#vuxh)Dx7frL%6l=|Yng}qTP76;;84d-B#afWQ$9BF1LLkKcn^HCtjfAP2 z*73UlkQyGA0KVtp`aX&xh=v3BazECUs=-PoBmN5b9p-r+LQznJ!1H|;mzD(ovwi^a WdISz)&LEEf00002DRWI_@k4WSUjfTA;OHeU`PyJ5350nbT2 zxW;N3ueR2z%qX_?mcc>sKxd?ts$)GWjuvZMuTiIB>9jg_gT(fS{oi^D|0P%6yk9D<+bfkbQPYydKPXeY1$ z+Fo1T12QF&h-$aBR46s)Qw-;k(IFdIz~dFs5=mxOz)LfgK!9w(>1H+X!_K2H$@Z7^ct?m;zHNNfogOpjwFU)g$kv9j zM%E|LECa&YZc%#}D}ODP((!;6INr)}RpBZqba4Xbb8%isr-P=KxLG^r_oan0^y0#L zz`H*L_8gw`Ktmy>+^>+w)VKpU6f^>CB#tN)atu*nY7$Wb#x{et6AU3I;bFY}|Ar0~ zokBx(@}Ig1Z;8bin!fA;aq+T`04p{RFLueY1(PBqk`Wf8UTY0pZMB$O(xL*|J#@9K9qe!2Bh+~}2$T=yq_wq)hAd(g%_RsX8EQBi-`(g)+)LCn10>-rz3VP@$a zVFi!AleOshypd%sM(6y@6)n27f#gq9JAzExhz$4;c`fpZDRLh?HSR|Jl)l`;UDh={ zjyYu`&d%)}fBo>LV@Lirw7!{q@|(WS>i(yR&*pr*f5MVA%ZQ|VGkb2wjg-Z9M4K;1 zo+HMd>0Rsn^#|3r#pz#HoU2H0UiU^U^C*xhlb&k(u_|b4QwnR6)&1QUP4Dd>W7AWm zzZFF7ac+<4+q>6W5rhi9f82h3`~LbIIPrG!^5PjqU)?)B;r)(XjAkT zM;E4!J%4~oF$Qn!F26-<6B3TPRkQLsO2)TfV=ts`I}+7AaDL^&uB8tim{%{NDh^WY zb+EcLqO-lNepG5^V#z$>s`VPwm2tRf_l3>Xzs!x#9VAcMijuB4%i$@b{ZQ=PE6xzLrG)OX_k*|#oF zyVX!V+k^d-tK)3xEp$_KAf;|WWO>>6{Jv@3iNVDislWDLsyMhR_E1vUzK@n4@5z8| ox2VC>@QHyN>(?9heEuhLOd>lKAJK57SqS~WjfMjKuI%#QKZoQ+`~Uy| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/hastesigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/hastesigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..e87d23d1340b5c7877144409c73c0eea7b200e1a GIT binary patch literal 1578 zcmbVMdrT8|953Le0;2f9#~2>Rq99!Ft`GW4RM zR76pH3^#lwEQ4WmLZ)npafImwj3y(_X0>QS0farz#)xJj;mEV98ZB17_LNd3{~h59M`KfdOQ^xd0@$! zmv-sxgk{8*BpG10D0=iL>ht;JKBb)Z=A*byr$aFXs!$-31|pPjBI!psAtA^>0D-Z9%kyf8BVcw%{o7 z0MrfyzQ{{S^>8Hw!BXyCZz!NBd85zvGEz~q2CCq=rHTD4ZAbOw1|g(pmEHGyf(m{z00akEN`8B?`NC83pMZK}l- z#9BE)BsmHMZ8MVX5v&A%4OXA-1*FJ(9Xwwc?1CIOFYr*Vmb=z--JYkEmzh z8Cx$cX@6MPb=cbHPP`sD6t$dO6E*v*bz2MLG=$IGq~p3T2I)d@{H)Td1YtOHGRLIn*2vhT(l+o(CAoG z<3jTn+_a8?2Q9^eG2weQK52B^tb;3CLn`photNK%ikp{=i>+IFaPweY@~M_ma?_k$ z+q)w79k@@@7uVnE?(R{?_a)rWb)9vGuKoyhb@pzk-H2n zY)neq*obuTWaQ%A{lzDmCU4sk*3&biEM!A#?dGg$8?UVY_46=G>7)4Scd63S%AsYJ zitdD&bGFxPjBg96`oOG0G^A=&i?KAXRsUOe$6<C-% zc`tDw)}XCKYi#SBmy-K^i%s_0f#jTq+ttlT|AHRtbv$~E_DIx}xNJ>q&kvo;N`9Gj zk2rBFrLoEWb$m?K(U_39_H))9O-MvNyNitc@H97f?U~kw>ibDGG@IQ0*3$EEyk$VB nN|{*s_v(^mq0cIMLnCF^A|hAkPYszF_#%#=86HebjJ$%f4;2`!`6 zwuZ}t)}b1p<5AS{fU$xV#g0`*9hIus@u+wet9DvD4r)<4+6@xhAC5n|GrQmQKF{-h z@3G~X8MDPBCX5h?L}Jq%(jttpp*K28_$Kr|r-WfVZ_MTAvktz5;($nJXKes7xu^nQ z0hHZed=jLHL_><1>|8$AoUW!>mxK!0NPI4jfEI~Tv_20-7Xlu#fda;@f&V=CJq$5+ z4ZKip#>^fAa58gBIWWI8BbzQQq*ZoUI}1wjsRaTT;3>%GDsp?(J`Fs;s}|;=Z4`zE zO!z_#{KBbRb0%b9IRMEea)ibR98#zxxLl^f@fi?-;ZhXGP(p>^xLT%A}ee9f(AmYW?mtWsc;8y$SDNaq&Om%%P>TVsicSk(6(gCPSAu*3J>D# z|2K4~;1n9FlmFCBcuOe8(DY>&2#c3}1l&UNa6*^lC@8+_fmO3GLp|QHH`QTRO?aCXLI7QAe<6G+kf!4&|;9DPD9S+aY8Mg;_@i#lG0~I!L zcVMLTtF*2))qXO#ucx;GJ#(k5ZhWEhie$v1Nk{8v_IB2J?@w!FZY}$vZK+g=MQr1z6?i&Z}*!`?u6Wv5~siE26$Vi<(yYv#dKFIspEvjITz;91>|ZnLD7An8NvC+UG$5|@28Ue!EN0gANwX8<$aRmeeM`^$c%_c_ z)jeDtv-k4Uy|(KO-F=6l;-siDW6j<#4@bkXJzoFR>BL`)yG-_T2{9X&2BY`?{6^Q= ztla6iD{m63Xg?Ld=j`NQ#y2OTL}PDe2FAr$S2^M@V3FGlTdSU}ZrPRn0I7dBNaQBO tq;E_8w5>Dcd{RF5=r$5jH0@b5CaT>vjBB}6V-5YoO~wpzk3RpCe*hGyOfCQb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/icesigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/icesigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..3855383fc5072a25f4002e0326ce935050344dfa GIT binary patch literal 1587 zcmbVMX;2eq7*6pRYC&m5pjdQW8SBAjcXN_8(I(lXL=D7%5~tR(+5M92K(b-8n1Hq( zbaZH~qoNKTj3Y%x>7n(QB95uxQIAovpv5bLwT{zKaS#s*?br>1?GMKv-I?9*dY|Wc zzxUV*TlROsjeol$QyMoCf<{Nbx|TXE-N-EMCeD z?0{lQi_ZY9L^7n9&2tD2>l}jSyizJ^BMo`|B3dHR&J6h}x)2DE6S!HQ4t{v#Cm3QG z9h|SUVphKqc-X8m9^{r~=h0<_w1$Ca&VaNbLL~44fr3KbB42EM1|LYzmpQ5fns z5ejwi3#S}b8)W2o04b$PgvMkzq}E7rr9y+_8ITOa&7ds19_!> zfZ9QTE8%G|AFhdmU@>;D7m6B+-VixFD<*|1B00Lm3w(lw)WPD3lwlb{hEthg~6=R z4`MC8fI#_ZFsRLn+5=eZwOGQ)14`idJdP_GtOA>d6S#nf^Fu}>G&!I3F;iG|vX6jIY#v_hlI8^ButXB$u#oz^(6w6o?84D=Q*^-% zmS0*@Dj!cNrrzGgUekU%R=u(j?-;VMp=;O|(~?&{*W22@k}jO*pHS1#QlGNasjjh^ zTH8-tsY|n8uRS>FcKQ}(Tx7|2J9Cdr?!n`peRg9>r{?bT6AJ5JIal+2!+ZPAcV19s z{dw4xlV}o3hT5h+HynF-veJ#7K0Ez)wA_>K?EQ4ndzype=`EI&##4Q&BWWX7kKS50 zVbiSELuqI3?%f8(^qs7kD{sHKqWkWJf{uIPYwnyjg#W-^QPAZU)?)dvsB^rqS#x167@_R$U%6|YVJ5?_L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/information.png b/src/main/resources/assets/bloodmagic/textures/items/information.png new file mode 100644 index 0000000000000000000000000000000000000000..934511d225e0b6b7fe0ff630d0b70dba85ce6b0a GIT binary patch literal 648 zcmV;30(bq1P)VGd000McNliru-~-D5h%}_)u^I$C&H(vfN+LLp=@ZrH5XM zy%ZG)>1<;%DC`G|bhgb5Q9&XyP)AKR=5p2?-kA02Attn6^wN3#ob&md&-Z&i!2iZ& zyMP(x0g%fDt;tbT-&IL$vzoEBC1P}aFP>ewgT9ke^0u9#q{l;fj-*n9>S`H+D^g6b zUm+Q|NbSctJRgc6>Abze*S!h_cWCn_I zAP5$!{W3*OTr=*EJi_|^PDal0kaIkif)D=+RS^WiLhonCNf0b_;?NN)oM^L}Ve2>J z8jfO2a=2JLJN1H|_y*~o>lXF)_E6z~0sEzrEA0G2Y&C&+d=37wmk0#LnL=W%q6VXn zA0Y5LjPIEYJYGKlfXO?^WU>%Nv7|T;o^tREx>cP?FF;=-L9UApj>_y=6N^Iy1< z_>Gj-N+?ZB5Gai;owhTbzH?oOAeNP$)xCFda`K$3M1=p5_2-hETVOgCW24bHzC|Jt zE;$Z$zemcB@@nPHDFfs8aAP4$Di)*Eab;q1T*N@cKzcfmt!`W5<4I|T!u_S&rwo*c zaP!)A(oURWrzxY!1P_+)v0mIH)O`R<%OamI5{+8;`wdm|Jl2balLV$1eCr;{L~4v@ zPoMDa(;Bsd13I2htKFuSn&HmUBCS@N{hlWS473VSK+o^7^7bP^5b*fXLuT(T^YTlP zO71fodvJa7%T$k0=9R95tN-v)CVW&wZVWE^dyM?KE49~II z-8*0{S72&tlJ`2s_Uj6HH^g%f={qs>5t9Lk0CSnEU@D1^I7FjS(&-uUZa~tlV;G7H zaff=tWwTtx5T(`%>!<%fDTPvs=Ap~*kWIB*ruU=4#ratb%Oq|qN|hZH@aOYcCxb~y z$mQutN?TRh?GB*`)oKOPjNrCA#{eT@4jP!DB0ZK=`SP~d=b|JMBS@(EzFUVQc*8?B zUC*bF9%KM8e`OZOF!79E$53nfVTfTU9A}8bR)=K7R;_+O?rVO~0AMkb1waCgZ)i;0 z6s_YP)C2PeryGAIB503B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00JOML_t(I%cYY|NK{c2 z$A9O|IBy)y&m6-rDM}E;MQSi)NJN2)D59XC?1MfaGG`mrriDbbcpD?KHsw0n71Xxu zLnFcj%`*CU6*Z>y9LM*ZIW5Lf$7T_A;BNl+{Lj7TckUHc<$uD+C5p&jX*ml-MYwXV zMMZ?JqYZlTc)f}U7Y^5JG)EEtQgiK@W^LNFn{Ibn*KTaVOU!WD@agjELQ;nsG%6z2 zqPC62W(&v*$GlLD-*+m^gsTH7(#i8$@oN^uRoKl zdh|&eBhcQLW@ls|4)lQqOgc$oub%Pdb&M4iA;RH8-hXxo2K;!gVv#=R4~Uj3Q4xwv zLGcm$F++a9M=+>Ndr1;ric~5+#>Ec_Rn1zRz}da)6yU&?8r|1gtpGckDz!65zU2Ci iBEnKVmzFh!e~sU>b__Q2Z|l~{DY`m1W^jo25R2&%&BwR@> zm&>HTekK-=^Xo^6vr>_!NR)xW5u){V9PO-AES!Se5(EKSYq2aV6iz0SxULJp&x=c% z3MZ5r!}L$j(`I#1_regBRim&=6!ab1_*p>e$Y8gg?@bMz&f zJNvY>wv#_RVeI`U06fp*ujgMWr9^8jj^oH+Pv_mdiizF(MjXcxV~i-J7mI(Op8u!00000NkvXXu0mjf6fDvs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/item_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/item_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..d085eddde5e4a7c8c429d0f69fd8c249b45c47c3 GIT binary patch literal 1373 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 P00000NkvXXu0mjfhGr@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/lavacrystal.png b/src/main/resources/assets/bloodmagic/textures/items/lavacrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..a9be5d26e124818ed7fd95a3ab29b9d4d360fa2e GIT binary patch literal 1350 zcmbVMZA=?w9KVjmEm*R}IAM^;dFV17*L&^DUFaBV!8Op96cR}MFs^sc!3ph^>tPF1 z5jKqkj9H>4drM;^F;hbDi-ZkBg$yAw@Fiwb<4n~slP#{ki;SL6fubMCK6uI9^E`L| z-|zQ-y@7h)lLh(3`3Qm(c#gRPaNV1|ci#t}rN0^iT=whL&3c0>>oGwCNR^}p0qO|} ztsnpdsk?I?R3J!Rr_$K0H+$=NQ4Lvytc@ieia<1iR8+ty`(qd0&U8%9t||~_!`BYc9D~?%EM?yoQDJ20Z&)Rv)hHhRMRMRAx z54dYKwcyE#wds0()^{0RDAjTkB|JcLWdt z5LLT05!OR4%Yk9;?k$uxgx>IeO@T!bI^3$*6#`-1<91^3i$zi-o~8r`5M>4z8P1MN zfCV_mkXBp{ih|5ItPVR9%<*i8XRE7RG|SjYhaJ|SnsrblTjj2yI4j9m9d0g%^@O9k z5EemBTY=h}Sld0Zyh{Uuu4;{{+L7ym`ZiTpqit#gb-B=kO-fi&W6{U671{{c4K(E$ zAk}DU2whJxuWTb9vImo*k?oWJ z^iA#+Y{u+%YYO0DYmPt|4vz+>E{w=4soT=ArTtqcZW0fAaq2;X}qAA~BPE_lLP;y6|Ay zD4kh5vtqn=Y3GA4&&7SOeP{UXf2z zMHwSApKf~N#WB;+@uH$5rlp1Hg5{HD;ro5^UrW;q>84X>cIQ33Chq-vW+~Zzdk)E8 zF?tPhOsl0Lhf2t?io0INLq$_GIeC5j^^~!?$6Q(Z?T*2<$rI;N#*%7Y@EZ^8du3?h z)zLL$_QToa#o>?Bw^p7TTlOEhcD-pydi04$elGr!dA?#|us(JUhL{2K0k119s|S$~d_{4$+WXLA{hiF1)G4I~;F0}X0yWInB@ zNn_Efi?jj&{8m{qv$c`4+np8vf=S1X_$r zXqiNdXdNorY*|#y(iz3NOscqmk{h7~^Ff6h=M~s!js)E{tKEsamC%@8oR_`FFa(Z4 zxB?~g(y451I;dh;8k7hn0t&%UP%0Oq60sab<3S8TMKFrMm|TFOxLAs#3E=nx@zz+Q z3D*LntBsMrgDcaSSD8G-VPA zD3M$$Fw$aLAQvGLfyqFTCXq}clZp&JJ+I>@sMHcdB~C(QQVEKx#WI9QN|q+7MQS90 zkR=m7uEy@pUaJ%Q|D+r#K}!dqtDbQt*B_y6F*-so6^(Z-&R)9^tN>M>@#sI zmlSN?zr&DNR$Dpm$IjA<+K!qI#W1y}*=$aY_7B^2d3XC2>EP(q@RWHk=GK0@>Dq;W z2P2O_&-1>c7rzQ-_RTo|1KhMirzm<>Vx6ygu{u1k{77AIWklE9#yz=Zmb*=BO`#dx z5sg1Z-aWI$t!QHduiiN*sA&D{IW!f&cB_1GG@N%&6?{5$e$uHvV5ukWuQ+h8ZlGpx zLT6X#{^bo||44TN&?T9njc-{KrtMzW-7_`x>H5Ee9uLhdy*jwQ`1WK!y1ME&U6`yv zfBd7eHHVg@-cpt9Lu*e#QR1YDn(!}|#OHkc`=UA9YeQONrUj&* zk3HdeFW3N{YiT=`^GE%v6K5X_-;q4Nurs1k2W)-#urUh>@x$*Ed8d1`b{9@E)t2g; zH>Mqly!UxymZQ3DVQKSsN^BbPV(^Y_!q*Y!{HFmPmERXLca=Wz{>U|I9np}KSMm>k C1yeZy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/lifebucket.png b/src/main/resources/assets/bloodmagic/textures/items/lifebucket.png new file mode 100644 index 0000000000000000000000000000000000000000..97a2999eb42f5ea5cefc1beec8f70e22548c8dea GIT binary patch literal 1369 zcmbVMZA=?w9KTV;2AMND7a^G(w`qLgdT+g6d!uxvEv#lm0x10;q1U^oZd zhRTu?Yi0vvAnpNe^0pogH1^ari9PM2L&98DXl0Uz0x@6+XfoEJ=zP+NE$Z@cojWEl zbP-~-JFz9Ff`NL}qiO(UEi5jQG=*{w3&mO;6jg!JB*hRENze|QqIfIEQ#N#YV9=T- zMfe79&9W`Hb7F0V5$6dakw{n)j78O=1m$oz2$Cjf8ixp6?^X;Ui7Wc1yn+|#q9(@; zSyj-Sq7YWQ3?~LXT?!!<4+K_(6@58TFl9tih!d2BBx12#T#IPkXaN7Zu_{_`>W%}V z0qAO%Cc^uOY|4{i?(S|V2ZY}6&uKEe6rsbbid`|F7=Eu4gI_F?Eb%lY*nt>faFKCv zxCE>KcQ7Q2N5Y~IVeG7(W5Riz)%evmua$AQ?Ih>nD9UHGdpwlS#xfM;WotauzC72j z=!T$(Aa7fSwwJlwUAeqR1A?JyO{&_FuY&qE)ll^|HI8~b=#$N|BB=@esoV`M1?&Zy zyaPxzni@kFQ_Rb&nCEB_4j47Xurw~(tPCz#Z8T0vjEw~pDUv|Mmif~EO&tN9B64-| zpSsB(!D7rUSGoXhR{97iuz57tCCUfL-w3j%*Y9;VB`=5P7ZzNm$6pypRgV|I`lmm= zHxLM9Cg0k(FZJd~Yx=R{=2>lnbTL#qYVN1V`CDhk&wn|Y{qgtOzMZa}-xl9@zo&LX(r93*U2$gVjwd!JX1V!wMq}R z4;7+E=WhQso}Inn=zE4!=&{~~{q8R=4P`D)amAxEr$CVTa5(kw^?+VgbtUz2@|Q5# za%A(_?9Fr0zUM!RQdjQzrnPrLI`H1%ulJ5@zL5Rl%(@#Xv#E71%wX z;#>Xp22VJQ9hhi-VPFRN{@v=r{nJyADnEaBy8fk1L2x(6nk;DyKbXp7h3%$8<+su= zKkIspA3Qu7xey8^|J;+A9NMz=)axa6!&MXgT>11^_uKB4mZ8(*@FHC UPVZSy=6-g5U!C`Ob?DW909(`SHUIzs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/livingboots.png b/src/main/resources/assets/bloodmagic/textures/items/livingboots.png new file mode 100644 index 0000000000000000000000000000000000000000..dc16c03ca1c61b02fd93c14c11057b62bf130c45 GIT binary patch literal 584 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/mailorder.png b/src/main/resources/assets/bloodmagic/textures/items/mailorder.png new file mode 100644 index 0000000000000000000000000000000000000000..2d224d821bfef35e1b68c241cdd6f1e8ff6f42dc GIT binary patch literal 853 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/miningsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/miningsigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..a116ac92c3e45e11f73b6ca60e8f93129207e2be GIT binary patch literal 1565 zcmbVMdrT8|96twhh!at9;QMmI;v(%mdbPc?RZFi(6N*r9pwsE~`YWy2yK;Bff|_YF z>TCGIF^xgz)QLp#8AXQ=26N8G!iJLt5{78hZIa=fMrSs6Me6p4@sC|{_xt{Szt89U z{@$AGteHb%N5?`CG{l<0*p)Rt{KgDaz7rliW0hr;Y$=d)1()n+MF5$cf&;)-FIx!g zfOVD@e*+8<6jkiWE07CpnKUPO)od7}4tRYE8-fhe13s230y69Xg&y9B{Px8;1ok+M zNWRvF*?eZ;_GFZaAh#?lk1H$UC?_&~8f*yAiUKc?SvcTb%u95@i1g{D6*+v2B5)r> zE;1s|ohqAaTtNaI!cXeNeahPVFJT7D2|~7rNVKV)Y149xc@;EYogOd z+nMx!TguLexMkT#qp08SSNk<;K`caZilR`AKnX&nAXHK*FS7v^FHMYSV1UGl9-r(H zcsQ()bqFQ05m7vS9)j0rv%OHvOZ|ybQicXtABw9n)awn$)rXd3JNVa)m!hS-QXfF= zKoUwsPN|1$VuY;Z?$w6EK*bw+mgrH6!Y*b6uEYy?*~%CZGJufp42tBJKaFq+wJ5&TgYE^pN!6_2vIYLr5VHGiz!exFXjmF%J7KFl+gIwBm}*dW@Suyf%ZL{FBj#S5-yxOwV?qH zkvX}Rnu9%vEi<9Hd~jRcy!yLo^6tm`R!==y*IZtd7>v(p|8#YCTFd9w5gp{vxkYwc z<C+D6@Pm}HHK4klHkPx|#2pg|AX~2FM+#tE5|4Nc{G&1+X9-Yt_3monizMeal~7%U)ea@FlT4; zmtEuNYBgB`br4;rlq`Z0L})`D@oD#n}w^vTmGsJT92Dg2?VFQ^zf- zh_YWRefPS!Kj=hO9=bZ7$qCht2`rj-zNBYNdB(Mj!QbvUHSN6PzEQ`t%4Io>X{%Y1 z)=gNrW7$Uw8V}fSRv+%!H0wfOX3Va^H9uVUA)_tH!$Y;dWG9U5m`=M>j@8$;4T~MP zoY;e}>2x&>AGE5a-QAThByP(b9ZWvzYHA_n+jYCnHH7}EBnKY8^~V#bMmT;d;ghr9 z^C#;Q8F*v#u!`GNhssx_mrkpG6dW+>NI}AQ@0@)dTzkEtlP{~9ttT@NY`J_ZeuYI{ zd1FvpF(%Gmlw?XyZe9EL`iC>VJ2Lm+=82Q_NpIfHj^9{rw^2+E|FEr=ET%4PVelXKDn#1= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/mundanelengtheningcatalyst.png b/src/main/resources/assets/bloodmagic/textures/items/mundanelengtheningcatalyst.png new file mode 100644 index 0000000000000000000000000000000000000000..6162e225c9f0b220c7808e815d1a0193116ba458 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)3Hc4lul!Q9bo2P=vF< zBeIx*fm;}a85w5HkpK#^mw5WRvft+tsWZRl)t zGT`A!P+a10=6a)}kLTO{Gg@SrxtWa*uRG=C_9*7Vd->*qGVA7TYfsm2weWAd(&Et; zZJsCezUk=t_l7&FSN)&< zJLBAk-w%V?^4j8Ccm=w-k_4tt`FB2B>v)3J;$s3;35v|0o2T>qU$;MD$EE~B7 zIhujHEneF%pDA_N{@8z>|L^xFRMb8-JUsd6X^GChR{8buh8*|AlPl^Tb28gMuAeij fa92W$YAS=uIrr#Ghp&nQJ<8ze>gTe~DWM4fFFS`B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/mundanepowercatalyst.png b/src/main/resources/assets/bloodmagic/textures/items/mundanepowercatalyst.png new file mode 100644 index 0000000000000000000000000000000000000000..80590eac7e6a4123b07fa933de4a32c7ca0931c4 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4$}E;1y^Tu^QRif|Tq zL>4nJa0`PlBg3pY5H=O_WNA?f=bG&ai4Yog&uplIEGl9PX6=%zdf^RLuaFt z0S`}tqFdnX-kbG&d~$4TVq$DSaBPw6?hbcQ7Px|x!WkO6mMccmd98YeRd{_7Hbiv#I_H1qS|0UDs?eAGMO)%Q)%_gJY z>rZ~`Z+r-J!S49~#xa$DXEg#r;km`?M|M8=HhViy`M*MgoZ5dAAF>H6Gk5Qh2s>*L eYj9|i5kv2PFT;{n;cr0iGI+ZBxvXJb^JA{>7I@`}E__syddA4jK7(!tR3CEFWnk-7~Sc z{^`S)rXa7sQQj^orPD84Gi=hC98h+Fy>kD~rE9a*o-d#Bvg9vs81JRi)pjw5-xah6 znk=;Ysp2WLHLTg@eBs=ukAC$WI=6CK{$AcDhUYS&=^9;48{Z53xzE5b_x+66rBfDt zxWs>hZ{{(HJ^3rIiX~5ru;*a^?Z&fL*W^Lk3+|1qc?G?B3A2F#z~JfX=d#Wzp$Pyu Chmx8A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/noderouter.png b/src/main/resources/assets/bloodmagic/textures/items/noderouter.png new file mode 100644 index 0000000000000000000000000000000000000000..776c5fc9b711df3b798d900c5016bfa0c425c298 GIT binary patch literal 492 zcmVVGd000McNliru-~}7WN?HL|xjq(`#Ggl~!Y0mxyJQklAc(A*ftJtXJRD|C8`Q%+lpu%AhM*)tZ!n;s zrkIKIATEimm#BM|X_Vt|bb5vk^AsznDb{7~Cu3QmW#yWhF0p%Hklbz_2Yb6P4$ZP^ zqgzR201)Fw8joP%1yr&pG{?_E3WZS0rWpX#*RI#6fSH9wdda=Q!Py~SMo~6$HNO#z zuW(R~k<~dt!*&NX`gKj=!{Z2T?(EUZ`UY8@6VxtSyMmf}z>}JR==b9$8e#1QFaWT* iCh5IW0f1k@f1(en0H}!4E&qN10000WdP)m{e`GRsVK^aoU^hlD58fzn3{}P_K)bH^#_WQAPXn> z)LT%{TCVNa-$gw{IVdA%mNsieNw`wBX+{rGxi)uu7)oIeQTOR`;T#UQBcf z_s@;&E7tG$dxDncdzdX2(6WFmI-a(0H`pL)F(Ro!jye1))X~baeDm)Fv1o+IyDrQ{ zMO@LZkxoN0l_c`%rgV0^MKc%>fh9{9aonN*Mq-RbBe+~{>~NifIl=3PYAgz4H{^-Q9%4 zVJ1u(!}r8jDs9!HJ#g05@}}py>I2ll*O!Ru( zlvPwx?>tRQ=#q>br|_O{SMhj110Oq;H;}97L8;)&{PI|Rrlb(cS^n_gQEL% zl$MQU{Y;rZcOJV+kEzzSr}V|+1e%(#+imp4NKzQ-;HOq6YYISiQj+#;#PC^@Y^R_pl+MaZ>=ipj7tJg|vTZnUK{3>w2oi|aR z7&W2NR!vH>NhF3wcUnXc5iBJpDJYpPB14D>Ue5)VnkP&3KC|pUS|SC-CixX-90q$m znL<4d^ef+GH@eS5dPqp8p)>edO*8e%U?N59gZ|MEc)9W7Kfm)&-pw(;zw5I>00000 LNkvXXu0mjf_rzWz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/plantoil.png b/src/main/resources/assets/bloodmagic/textures/items/plantoil.png new file mode 100644 index 0000000000000000000000000000000000000000..967c60648ea8cc59e0715c6b560fe2146602b8d0 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)35ZUNPLhcKF{cpa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-iR!6PoG7!;-h6#D7u;uvCa`t4*#ufqWXZTrJ# zExEB)T7N-Cc-I5oBIfcqhYx;AEavN0Pgu(yAR;cPxJ}wq$}u~u=5ySyn9^XW+;Y7? z;fK$BILmL${6FY(=iRry+plqQ{9(|Yb%4KOzK?)mhM?U1_E+u=#pm9>&3RZYm&CL0 zd0?36v4}|}4MARivrbz+Pb(CRWe_;NG5X5wtfn5n^BW%SucK>=awPs?BO`JBytIN=Z!|8-@4-#KO+PAF*3l z*={9D`b9!Gn_&MebdSw_#KMJv*}ZvhX5Kp?iT|9X_#z^C{(7>9$z%cm_?&%VG@fyE zy^r0)I{|>uIH_Z9oIm9GXgp(MWf{ZMCw#mc)=m(P_Z~_qydB*F05(@2@$zhut~Ic= zeSrIm9Rm0nmt-C>0ZDl8>Ah#a+veHun7vMu8|#X_PLnw%B+fYoK#1_o7=wPd&6}%B z_Bu_*jdO6(jW9(B@BLgsP7uI>;J5o6co9KT=*l!rr6{VkmP#ox#*_q4vMj4~AOQdR zkrJ)7gu*mUWjdYK7Hh3hnj%t~&bhgJO^%WaRfUV*jWN|CwpuMI?rp85)>`V;lGuL{ zfpZR7mND8}A~FELU@*vSFA)Ghm0bZCYX<<|MEO&bUZ_v400000NkvXXu0mjf%{9DU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/potionflask_overlay.png b/src/main/resources/assets/bloodmagic/textures/items/potionflask_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..2d969bfb294f2202ca8dd7e5d53c060a24467743 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)35ZUNPLhcKF{cpa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-gf%_+jVZ|~BdKp_WD7sn8b)5!@Ek_#3rcwm3D zjfIUZD9@v!!s2P0in@Amo=0%7@ErlQA|3%Tv9tsrm|<0_^>f`qkIxzlj2IYx=L)Q{ TZPQo+G>gI0)z4*}Q$iB}zYH@F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/potionflask_underlay.png b/src/main/resources/assets/bloodmagic/textures/items/potionflask_underlay.png new file mode 100644 index 0000000000000000000000000000000000000000..27f2919841299d506b0aea59b9854b882f2c7e73 GIT binary patch literal 460 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentbounce.png b/src/main/resources/assets/bloodmagic/textures/items/reagentbounce.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb11b7267f74b63ac51ef752a0b446727a1378d GIT binary patch literal 497 zcmV`03>LW0X+Z!0e(qD zK~y-)-ILEt+Hn}iUmso5k~Z=OIZK8sHX3dOg&@{o(nS=rL#Lv4=s)nfgSY($t-}r; z#@MMHH=-a96@*2!;XzhGwziROD$ZQrxu=5=jzl}g-lykzc;2t)`F!Ak|630i0@A8S z_pf0_e9@59;*dNY9jABBC0Cp_B`>suJYRe%9*;)=9MgjW5Q#)291cs<4bHx$c()Pb z!`nDIvmSus*E7n0la9~+GP$)3TBbs2KhMvVJ=GKd;Pd%JM6eAx$x@`0FOd2El^;t7tv|6| nZns;MQmF2m>@IJq>vb>Z+LMLL5B_Vo00000NkvXXu0mjfwyoCI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentbridge.png b/src/main/resources/assets/bloodmagic/textures/items/reagentbridge.png new file mode 100644 index 0000000000000000000000000000000000000000..17df28c6d5c5d3d2ccbc4e6b5a7702281ad2078d GIT binary patch literal 483 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 Rb>08~002ovPDHLkV1iEz`U3y} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagenthaste.png b/src/main/resources/assets/bloodmagic/textures/items/reagenthaste.png new file mode 100644 index 0000000000000000000000000000000000000000..f6530434c534ec73c0b59b591c283b493645eef5 GIT binary patch literal 520 zcmV+j0{8uiP)`9x$c|>Yo4r01RnV zSad^gZEa<4bN~PV006wMvY7w?0ewkCK~y-)-ILF2(s3BaUmtP)_--anf)dPqDG#EI zE(vDeh7h~hoF2xC9d}u$?h$zMujn%96i5q-E?xFRq((_}XweSCm4022C~i3B_I*0$ zNVH@0zCG}~U(fS?;DP^Jg-3>r>am?OgF0sVUT;D!KLmPINxgQiWe{h>+ZYK`KHFFbp` zqX6uK%uDy@-hLl_#D2wMF;Pn4_l>c>SyBJizx)DQVTR?#tWe(o0000< KMNUMnLSTYPuIG6G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentholding.png b/src/main/resources/assets/bloodmagic/textures/items/reagentholding.png new file mode 100644 index 0000000000000000000000000000000000000000..f6530434c534ec73c0b59b591c283b493645eef5 GIT binary patch literal 520 zcmV+j0{8uiP)`9x$c|>Yo4r01RnV zSad^gZEa<4bN~PV006wMvY7w?0ewkCK~y-)-ILF2(s3BaUmtP)_--anf)dPqDG#EI zE(vDeh7h~hoF2xC9d}u$?h$zMujn%96i5q-E?xFRq((_}XweSCm4022C~i3B_I*0$ zNVH@0zCG}~U(fS?;DP^Jg-3>r>am?OgF0sVUT;D!KLmPINxgQiWe{h>+ZYK`KHFFbp` zqX6uK%uDy@-hLl_#D2wMF;Pn4_l>c>SyBJizx)DQVTR?#tWe(o0000< KMNUMnLSTYPuIG6G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentlava.png b/src/main/resources/assets/bloodmagic/textures/items/reagentlava.png new file mode 100644 index 0000000000000000000000000000000000000000..9dbc6600d993bf8f3b2e679b623d418061cd5910 GIT binary patch literal 562 zcmV-20?qx2P)_F9kOwLpcBd0l!H^ zK~y-)#gku1Q*ji>KW7cS)Kb@AxZzCt2ZGT>?Sj~-D2QTR_7s@!(Oc+)gb&hlMK4Vs zEP5&m>ZO+`5DNNZ5y1?DNhzYHven3T*|4dnm%C7A5s3JO^YlCC%kO+Y98py^A`ctX z<{Bg}n0iU%{|yqorgn86Re;1rQ=_rt0S&i|$ zS+4+BKF&y1l_GH4wlo~9#a9z%$!m}rdCUDL!%}9@ErJdB-G_%AjS8^5qMR_J7}Zt0 z8gsC!Qrvwv$(?7DvL-|?unQ32# zr8xi=-C72+c@GB~>PY2tRAzS)nN57UH1Gd(>U!LwmcbD$VK8%WfQrCiQ`03>LW0X+Z!0e(qD zK~y-)-ILEt+Hn}iUmso5k~Z=OIZK8sHX3dOg&@{o(nS=rL#Lv4=s)nfgSY($t-}r; z#@MMHH=-a96@*2!;XzhGwziROD$ZQrxu=5=jzl}g-lykzc;2t)`F!Ak|630i0@A8S z_pf0_e9@59;*dNY9jABBC0Cp_B`>suJYRe%9*;)=9MgjW5Q#)291cs<4bHx$c()Pb z!`nDIvmSus*E7n0la9~+GP$)3TBbs2KhMvVJ=GKd;Pd%JM6eAx$x@`0FOd2El^;t7tv|6| nZns;MQmF2m>@IJq>vb>Z+LMLL5B_Vo00000NkvXXu0mjfwyoCI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentseverance.png b/src/main/resources/assets/bloodmagic/textures/items/reagentseverance.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf83f681d926005d211e2ed133a2d6f97f5099c GIT binary patch literal 526 zcmV+p0`dKcP)`DIV(CM`Qp103B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00DAIL_t(I%iWXDE5mUZ z$6ueZhRKhuk@-=y{P^09rr9KJn$|9Eii7{a)xk~t0ouXAVM!@hC6t4yg(6YXYNjDG zgv|_(gVM?xM|t1gPtWsue$)g1TbkyVpK^5BrdRWe+cho#cFixoz8>n@$K+St+?rqJ zr!q1O5O=B4VTRBZnLzph)!<;AQ}rOfMm)AdxyjJ)a@(y8J6RolY^E&6q4UGHD~H;eKx7TfC*CJUxbq z->$2?005WEB_e{Qs)P77JSOjmMy^OCR)0QXw(NGhD5X%kY7X|-)ZhA-5BZ6Mp!yvI Q`2YX_07*qoM6N<$f`Bn{iic=rGR0q03X zK~y-)&5_?rQ*ju^Ki_j!=eRYC4b7ZUP9qS!3c9g5Y%M0cC?V=*T^%o??)nG1@TNb( zi!Qnrq;e=Npu*MQUu?|{_8!(Auk>WQIwjV{6n82M zT)#JlVHoOAeoZ3RE~)YHadBOjbULkmZSJX=B_}|3^dq+=OF;KCkUEdw?^llF5Lnk~ z>L42WRoCcVF_KI82C)ADx0Pj1# zDa*20Diqkb`A7iTM2K~FW14$-xc-jI+Ht&XU*yK(q}m3EL?T$0g|6$oeKIM5!+y@K zhuPJ%$v(rSy+vnpw1J9LIO5w&qPbJL3C*o;KfyFjY}=+&GI_~^@PJS}Bew9Dix zD?Io-uXa3QG#bS)40?KcD3{CRaybzZjy1Kz@+vE9U-__DV4^gm>i$Aay}i9CwKdW- ojbgDVN-6d$FZW;P6#tce0OLisWFwXV`2YX_07*qoM6N<$f}^+!l>h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentsuppression.png b/src/main/resources/assets/bloodmagic/textures/items/reagentsuppression.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf01d099b13189cd5118d1da5e54d66e072028a GIT binary patch literal 543 zcmV+)0^t3LP)`6B5S8)iwYC03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00DzZL_t(I%iWXDYtnHT z$6ufCcg5O|FQSMtJ!mutkwGpD(;b9$Sb~#X8>>Tq!Oo+$lh8TB!@?b0bci}_5bZZK z#tt2Xu*r8Dl!(E!h)hxD(=CKVcZ}Y*_rvqNo*(eQ|E;IKl=RBc+D*!rl=;ZK06g=h zBpSWJjQgQns9VbSM4HK>yk1z5U@#~Evm^HeAdyH&JRX;>6XcpzGH*=MZ`T;stN>(+ zs|vvK%gR-^msl+J7euw2yCbs#uwKmki9fhGCl05Z0oNd{D@~5}^SnHKp*jNE^?3A= z0G!J?fr&|mjehoOyM(h5UKP?T7oIBsy;Jf1sX5UM#huI3jCnm+EiP`khdA9akX8*{ z>h$TC7R{=;)Yl16)+>y;^W`kh=lUnKR-^k0p-@O{HX9!6 zHH_vUw~wP7l;2Zo6ga7xY*n^ZR{%gb92OBFU>}DwsQmoS*FuTS^1I$gY?t5f7o`+- hymr%BjLTA<-Ba)LdoT6E|JJNEAV1Y;ZZmHU$#ke&0OqVg=`(8? zGh5_W-R7+!x$Rw$&G3|T8I=MsYBmYLc%V(b0%az+upc88G0D{V( z+8fCL-BNBd;%^kCR3->85$KQ#y^sRU#1@C0^c735J1Q%{t(j0<033vVe=WIM4r{4X zYV-(;iR}zT%NCvtc8Y`02ual6dzY2q}Z(k2`McCp=2~eucOZm53)qOfSN#JT&`C*+`vpZ9j4He#d(HOnnOg z=*fwRBSO2coHu#r-brw2KeC!S`T2-$wff2gAgl#hNgk=c^)H_khIq`}nADX30000< KMNUMnLSTX~s=@>S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagenttransposition.png b/src/main/resources/assets/bloodmagic/textures/items/reagenttransposition.png new file mode 100644 index 0000000000000000000000000000000000000000..556a63b668a22f8cc1c4eefe6819e15e9dad7be0 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPNlc1?EtQc+(Q?L$!fd1Y*VPP8<0jSSVR*d}~$A6U$t|XAa?0UH!N57!;?Qv#4oK4F6}Q zY9tsJ{OI!Dd3%al<2d%I9@?hG^``Yeapb3oLizV&PxLc1Gz-`;{#FF)d3J8M^<%9) oVjC{>tzzEdQjyj2zil6bsZF+l6@w`sFyI(GUHx3vIVCg!01MlnXaE2J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentvoid.png b/src/main/resources/assets/bloodmagic/textures/items/reagentvoid.png new file mode 100644 index 0000000000000000000000000000000000000000..4f090836e3df219dc5c70506c580d6374aac7b6d GIT binary patch literal 607 zcmV-l0-*hgP)`6C;-x)eHat03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00F~EL_t(I%f*vDYg2I) zho2L3O)nPhO|&sZOrs*cMe7UqQiviBW{8BKi$ewx1ktZxK7ilBMR4vE!BKDspDGs>;*5FLe6NoW6SbT5a1_fY`-^rqgLssgx#@N$vI8 zw%wnTo`pp0nMO|9eEBg&S2qZa`Nc2{+U+*l_UTwSz});S*=%;;CfTm>`lWjcaN(*Y zuItk6c4=17U?_w?cm%JZ6sC*3dp{+6X7I82R?bh1NVD0bvpAw#%SZL#rp4LFB&SAi z(Ahk|wG%1sTzSyn>fM=YtJT8e`gG`+%lP3Kqn3#|?8gpA_&oCy*WDmwg_$^gQ$Njq zkX-=NG^y2Uj7QGU?v$x}hgg_tQ2M@%Wtx_EHq8m5WoNc03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00G!ZL_t(I%f*w=OOpW@ z$3Ks@wKiHKS&< zGFt{kEYU{ITJv=+W4=$PjcgtQiN42&=lSqF&-ZymRoRLf*rNU|AaW(H0U7ywK;&Xv zPn{o9fXJn|9`6t1IGxad+^OY+LZOWWRYg_lzkE$cGaq#L_Lv%mp}ov;@YoqW#B*Y? zm`0;ft>zkrQLC$U@V&guWa0sn_r|ficVMFh`}D9tg^JBZr*A)lgM(_CCdp*7)`0wO zW6#N`0yw6wi-n2BPdo#+bobs4cD1!&$KvU1hQ!2OvDs|(fPjqPrVooEO=rgxK&^Gc z11E4dJNZ1HCht7JtEma*?vD$=wm-M3l<}Rrsj}UTE7*sp$%(7Im3`fQUVizCRVd@> z@X>WRtnZ&alsdpFGgv=X@OO2yR$9W2gG|=sUG^hRagtliVis~}gVc{u9RpzJkx}(} zy|j1wu^Jt$w)L<$pQg0@iEp_D7BWv{!yQ!pbrIyP4v~L+K?;QeZ)Ve!Op}$@(?~H# zF~7u~W|d7{2!%qd&D`LH9<9ZC`F*ho3M^OL(0fk9K zK~y-)-IGmd(s3BaKR-2HX#OWomRcFqSgn7D#t_7y!`LAN@i3x7F$Kzp*q!A!-10yL6ecBE#H`XIs{=P+Hv%~JrB?K^SrMTY3WvD z_`{G)%W&eZ0Jvt-GI}nEmbfkd*6l%B?q@~rJbWsCzh40C(YOFaA`uCP!_sjAvE`XD zy=D2;JmPWyP<}M607|ZYyr<6)3WffHsMf$9zbOFa>4o2UJrgXUgz?B zSeRFB0j=u0H~FhubDzuCuArH1sLUcS#;#LJO;MUlDF9F|zml8=t@I uPwXNQBh8jUaee(XfdG5e znz}qQ#hcf!SoyI=tzO6KIvAY}we&dm?%u&LIy75`8gZZokYneV<*(oA^?JN~@tn+q zN4zV2ru=h-4IC2j7|oV3D$#Kq08HD)vbz|j$?9qz=k`2XZ{M?l%}mEbM9%+()N~Sn z>Oq~g{5t9M9N+vkc9*|kT3xONLzw*|+<}u3i2#{}1w=$mj7QLQo%#9e6zm4EW)Dph zk`oacO_R-?3L+x;LgDNlhzObpt+q)x6r{Yp!|_p*$!rGA?_(k;Y?Xf_!0_^&05lN< zxOR1pt?de(j)kWbl}Z_(FM!#xP6TR0E>05wSJJbxy|b%=V>;33ILdR`uQp&X5Do>g zyAIw^0vV2TBa>lF58(D)1>m_Zea}PFgh(Vr+pxG435(rzC=`pM0DxRJ%kZ!s2q@Qe zL4eF0ZXyWfk&?2r00000NkvXX Hu0mjfu=X)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/reinforcedteleposerfocus.png b/src/main/resources/assets/bloodmagic/textures/items/reinforcedteleposerfocus.png new file mode 100644 index 0000000000000000000000000000000000000000..80c548df3ad8bc989c12da8dc81cc2e0649eb938 GIT binary patch literal 868 zcmV-q1DpJbP)6HwQb^s%ZcK03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00PKKL_t(I%cYWkNYr;2 z$6ufC_j~7$Q}4{vwYEI_b=X0Ml{X`zV#_AA=pPdsvhtq@jEEwrh@hbVHk>WjFBUW! z+c?6120=7}h={9=S%ziZ>8Y975ov53I;v!z#E>27w_kX5)nQov=0@2 z*t2Y!d~#ov{4c=IM^+2K=|k00{#B5c#tLcqu0m!9N;q|3l>i)XS~3HsrbcKx6qKsE zZwdeYD`_#9>@%qjG;rh0SqQq&yc!No$2&KVp2sFfFZ`!wIB+;~a21r0G;O}9Zy>Pc zQ^H*#sLH{=eh#yJ1z47V;UqQjdfI_8C6cdF1Qs-4?Y6ku+REhkI3c}~OtwW`xC;%N z;?MHQ`ou@VjLqD^sRPRevH7>_A~(*pu)pn&3P~m2azE=DxACXx=kPC`s^`%duVPWM zb&XxM3j{zreXv@5E9S9mYdzOmTWS9OA63y%C!VrWUOeh%M`aMVZ!Z4Y8aeUD19dOl z$LD3UnB_KT-aKE7<0o&coy+e4?Og20u)hs5mc=(4zGhKTF@Hz88S5V)l}rL~{dQEj zhI;{M@3b-YHde~Q)qV_Rl7DNEMTJT^*KOuT1r)U2E*Ny9;| zLt~>S_4bTEHZPI*XoiwG9!BHioDX#Smdq5V~tReC6KHU%FICSAse-U;%O>N!~N>dbhvUr(DGBlRq^38rVvm$L((k^qD@!5hXlT4lnDljwuxV`* zB~ciTn8bP$OjsFSTQ;`+9>B3nU1}gQ!inGRE7MHlE_D&QdY0$&bv&i{q=3-Pr)qF` ug1_z#scC|Uyf>THm&ufF{L&{M>U#scI!ZvChQ`4F0000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/ritual_dismantler.png b/src/main/resources/assets/bloodmagic/textures/items/ritual_dismantler.png new file mode 100644 index 0000000000000000000000000000000000000000..4451a808fc7a5c52f46ebdd726062720ba90384b GIT binary patch literal 693 zcmV;m0!safP)WFU8GbZ8()Nlj2>E@cM*00J3FL_t(I%cYZFOH@%5 z#ee(WQ5i#_VX8?hr6$T!NX;zCCNP}9iII%Lf*zyyzC!Q41bv8JtVS>-MSGCKn#h`h z%Bu~7R%#P8{+oNx?!gqziHbJthjZ3GYp=7{IijlkPgv_0Mg${*NDP1*=l1I5=1Tn) zFGyfSu-<}o3p{!eiBanJ;e46fgs&%&)hiegEWHCP7;9x+)*_)i!12K1Nc@M2}SI;PVVQlb8Bx8^7OX^xZPgKDdQvFgEG()gRaS zoJ(>%%1|5Bo`K+xHC zMQxu276iPz;(5yA_n=N?vq)ux!9hz7@9LwdtVIEmsbSfqpmCp%qx*|lSnzNcgIaf> zoQES0TWjO=^yCDfc26H;lfSVsSP|EZZysl=So5C2adHg3KO+@8cW}IEQ2}0kJPSZW zO=P9Bs-mj2pFFQCYC5>k7}A^9PU|Wbk6zMab#28mm@5iaJ{#_-AOs2$4kvx8>kt{jP!cL6Ky^0E8hs}WsI7z@R+D16+G(l9tBu-Emfny|%5(Hy+F@zIdc@Wc@ zDn^+mu71UqdGa7JT~9C=mP{sXNy?_EZ5Tn*G=`HHNunkK)w*S!Poc6_p4Y$uO;DwT zE-5mc)5u4ZF5QEeo-T(FPx$?-ie+sjQD(}p6raEd8;-@}xww|ln%)Hdbz@Dm7V1s_ ztO;mJmnxX`h?eKcX7289Cr||fYKE1K%)_Xk5X=j+eJn4de-9GsXDH%rk2CqZk!~1gV^xExS%IP9%O+lXP zlQo@}1(3HbnYLHB-urSHuL^iwQA3K-k?(?FOwkoBrX*mm7k+fNB#TN?dn{L><$yV$ zN_&A=uPSkPDaDMmhIxlT;7*a^QHmDrC{Ek$C@=67D!Lp54FurA-8izs7yobSFw-e4 z*C+q!o4m+u#@u#w3e3am90A!J9@U(ZvhMcH5LED-kE;o#eu~^P47RA^h2kOcbmp@0 zTV`M1JA>Z`swY0~Uq4jv%+X5AT7nBV>n^ci zzTv(ep3gD4u+uHD(N-FmKQY)BZ`Q zQc5N-^#+_fOC|^9M(b=Tk!8PrC4GHy&;C!34-b|#yz5(32CmF2nRD5p6MO&a73u!& zQs>nt&OH6=qOmZ;_AkthkySyhO}yy{hcABg;?#MAD?AOKof;2^Po2eY&6ZED+v6hf zqlG(%r&()g{7`nw)`JaV+VGd000McNliru-wF>CG6EoRB-sD}0ftFL zK~y-)t&+VI%5wSyQ5s4B}BC)uHhJcXclnkl)!v5e)hv$LwdtZ29RJEn1TX-Ee z5;{J|KR=7{<%dc}BlQV1-NI!*m6n!f?0YHt+U+c#9Vtz>D3{y|15CZ16iv4%PWc|d zR!!2;{)kn}D_e6rno^D28`2om3l(XI`?|0wzqdwy@Jv!y#M%_d_Lb0{9keh10aWH{?MRD00000NkvXXu0mjfH+I|; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sacrificeplate.png b/src/main/resources/assets/bloodmagic/textures/items/sacrificeplate.png new file mode 100644 index 0000000000000000000000000000000000000000..04a7d531e2e2d66feaf5a562866b2f8f10bec637 GIT binary patch literal 537 zcmV+!0_OdRP)w^xJjqtX26%FDB2I;B#vUI zgoaLq(oI1`9V}`Q6D5d>H=)#MGsM^Dbnsriw@D`d+jIUe=Wq^>s47o^^?$*(ENrW+ zT(vIV1TN`~BLI#uelEa!oaHw^SLIbW>=*i>eX2z68>$!TMe7???tl+NL%j5fyzp^V zdVpJa-~&6@1@b^kcQ*wf{3y~kRZ^}lCxTOD2db)!0Ih?Ad`={Y0rkKSpdVNP)v}4klBv245Wb&&J6R64;{ddG&7$z|KHbUEbdd{85D55NQpu-}G@m{KVBamx6ixR&m=azS^Y0mLVTb_0cO7+OErx= b^*jFqMtHYOdpp2O00000NkvXXu0mjf_+jKq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sacrificialdagger.png b/src/main/resources/assets/bloodmagic/textures/items/sacrificialdagger.png new file mode 100644 index 0000000000000000000000000000000000000000..e727f17374914161417bb88df0e0f8475e55360b GIT binary patch literal 1442 zcmbVMZA=?w96v&aY%5_ZVa4gV9lA*LdcEuGopih%9Zf8fuCgvF^Ll*>4Yb$Y9cw|M z%n6$l0*D5e&44VM8Hr$w`ei5>rhwBAei(~$8#)+l2FH-sNW*yrihdyb;3ap@+yD3b z{h$BKy;E4QKVjPw+aL%^u;kM=dE60sa4`bLyDN^5D#!}F~INu%64&109(9F z39tdiRe59>WI#~t5s%#=I;<~JEaz1*5gS#|>zC0Gl#vzA({K&j36Zwc!9{kL2tQFpn@i3m6wv|k!=it zS53q+6SC%%!&(UEay)=_DjmwI2^=<%DqN=}ar}9hP~#d5S7QW;;y9%>P`Dmme-K%X zceyDWZC=-sS0pcxL7=h)DpdMJCW!ikv?v1&1eW*s zMGxnLBaDobs}N0y?CIJSynd^7gV-mm2TBeZ7G(Swu2N%OZ{%L9)`DmQ|GKfMwP3IG z1Iz{lu7YRfe7Mu1U^#XV7m66l-cT>`9yuvYInA*ZUf>fgvy276C);4Aby}T{ zprcrePY@X&3!>T{S$hquH$N0h z7OTw1;r^3n7+d#^WHvj zKg2$sR)66uUtD(mVuSHqOUt8s+U~x$n0h(1u(I`dtLBA)Q`Se6F0#;jE4cC;GWFS( z&h|s&QbF5!3DrIM?ay_)_YTDa^dR5+SXH@0S5ikJHov55oAO+8s%$|U;bl%n13 zKP@dUawl6q?yfteF!a;cPEY?n_(|#qAJ(N5e_h@0ADbb~36|=PE=h5As#h`kO$hY< zHLk6X`7P`HBK3+ieyy#kCjE|LvG}GlI5+l`<7(sN&Xm5D@DC6E9@`#QlsqC)#06zB z^SO4WgbgnoKlah#2Ikir7ZvyOybYmHb;;7~WTJ93RMFaUrm<~iv3=CR9=nI_y3*Iz vAf?potGwJlH@|BnsdD~a%Jnvep6dxjkc?01-MP}z@%~;ySL2z=^LFnXGq=I8j>oacMl?cU}3CXqbfm(Zt(F-FFdk*wEmWoWZ8vRK?zkl}DxK`si_ zTFcYp1FO|biPr0Ne7^%gn!W;%Wf|65wAKPp3&W5kNdWM?HnZ6+0KVU0xxA;T((P$in zD?ot^1_J=BwdH%U@?rR7DWybfEm~_)N{LcRe*ArZ9sHB}0KP2DBBt^31ONa407*qo IM6N<$f<3CSI{*Lx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sanguinebook.png b/src/main/resources/assets/bloodmagic/textures/items/sanguinebook.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f07bf0edc78634d4abd76a1b0a97818acb6c7a GIT binary patch literal 695 zcmV;o0!aOdP)WFU8GbZ8()Nlj2>E@cM*00J9HL_t(I%cYXNYg2I) zhM#lOdwY`@8&pyv#!};8;v#hlsGFc2#1CA=K{^QiBiw}QB$h5kT3T9Z(Ltd?l@2-t zad55OiYOFp1#c6Z-ml+14#i?>{la%T!+Brc!+Ati`5$%sX`wqO>ZG>jkDkh32Nd>* zs=|2Gjfjw_Qp$_&43V8D9L$S`F-*rr1VKcYHXB?`*$Bd5=W1J%?FOa1s7YX?wI8*V zX5u3jJSD~!!A-eDNyNkWXj>EMJz#4TMNCCUXlR41mBo)Y2~0#TmBrV9wC(aN4hYq7 z+0NpJK7*O9CKkYL`xw6XtOo(c#CXXjkwB0HSYk05u490UlE%TobzH9a1xk6*?Grww z_tHy-(1dhJnuvsE5|dY#YpD#XO00%QaRV=DQM-4C<8yOZ0D%cO`SLOEvo;^HE&!G) zp@x8BjA1fvF`Kj)cs)=5#3+4zePl8jI@Z=B{LYBQ#YIjm%u+vd0mpJcA=i;(#x!UV za_+$}wOWm(r6tPcGGnLDv%r_FH|8ACA@>lasSzrb3a@JYyxV93aO2GjmY0_)6bh`Y ztT2E5CS6u1W65ee2U$n-mR+ECe3)vrO1)mEQmNp19>rpj;ZtYXmvWg%*0ve?38aiI zdOuetKRQHDPY<5w@%+*NUroSF^102}40U%BbB^fU^kLrm9$ d{x;xW^bN4X1!?}x#N+?~002ovPDHLkV1i2UD6aqj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/seersigil.png b/src/main/resources/assets/bloodmagic/textures/items/seersigil.png new file mode 100644 index 0000000000000000000000000000000000000000..ff99c09a509a856b509c41b7a18c182f99900dae GIT binary patch literal 693 zcmV;m0!safP)`BO#_xg3|y10zyed zK~y-)rIJf)6Hyq3pEHx0OhS{`q}qy&cwf}iw1Nu}qzgB$Du}o$ZlwMLxBdm)`3D5u zxD&6KLIsOpK~2*(trAU(vDP+|WRjW8<+$jD)^t(u-F+XN=l#yhE2NbCk3u_#bAyBO zaBmOg<;wO>(=_@Hr7&v^Qpp6*Uc3=I--xXXhO$|i>`rif^eQv+UkQ8<05uds*TZ<8 zM?POb*F(H~ofEqN!$U*zNZ&!mZ;vtZFb5cb4S*eJlv{N|io%nN{Y<>eQ8nunW@p9r z7X;9D+Dv_z=5eyc*o|xCiv{lFiaf|BSg(U=)sdwVsbn`*v%Wh630U@qW7}&pQdr{B zWD(O9j89jo*bT~#Nr1wmex)-+$8m@lI?a}i<2c+8*16^B+)LZ2n!t56DixntEP`xX zoq)dH9xA_9`I4U{oj%6z5F6%lBfytXQ(GkBalS7X5qmXJ04I*8`BqxO zvMd4uo_8&xY9WMx{;I~@=MrYE%AQRGI6E*P!@5Qy5km$(E5Fx42!z=1lu{Cn7_@AM znLc)*zv;X$ bz<%@>fr1HUy})9F00000NkvXXu0mjfeU&eI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/selfsacrificeplate.png b/src/main/resources/assets/bloodmagic/textures/items/selfsacrificeplate.png new file mode 100644 index 0000000000000000000000000000000000000000..098aca58bba630f92802ba9469539dee0d1ed10d GIT binary patch literal 512 zcmV+b0{{JqP)FdzGvIP=uN)i-E+>p_dEA{CW(Iu@6W`%=P~b1 zq-W;MO%Q`_90LfWD2-)shk0pnQDU`FNE6ecmlBWf8_E@RrS(+e7x1c5p_C%I;@c7{ zz)wi?1gPhvcat7PmT$a-%9t^L>gi*we8M$~fU*GL=HogTQ zCvjs&7)1=P#!U6V9e3AuwVZVC1iq$m?Z5wxe;aq3`0gRCl%*d40000 CkKUO8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_activated.png b/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..1728e89eeb71a434c0ee8ee7ddb2406c8fd343ea GIT binary patch literal 921 zcmV;K17`e*P)KX;hRqAf#|B=adj1Z^}3im*T#q4dy8iD+dI1a9`wlk^bLOCUts zB;QI5Mr1FBVSnhshk{rSJrsyg7P-KjvRTUJw%fz+Uc2}1UN>zv==bv5{q5f0J>Snc zzjMx&WLc(|!?u;1dy_G|$yo6W&>CVjO7eLyQ0mmJ`x2P?&2LB2UI$8@x|f^nXWOWP zhORr7_xTdpYk^W{mH_R3Qm!D>TCFPo-g6FsrMUR7tgH-xeGi7zd!>A-<|LphXu2?1 z5T6@~NU|(j`dYK03=r?T20%;qWdPoc1OeFIdEBuohy&-umv8vx8LrvRv~tPn~*hIeYa<~{+Co)rZ6xd6cY zt49EMrbAgI{z)xZkA!J0nEg5fz}Vm|;mb$_fM_%-GT_n@0DTiL0l0beFaW7kN;jv| zY27s$hax*pQ3s{yEKKMz1MCaO$zg;;+dS=1@7?H>l9vr+tif9$y+ z5EbNpya?%)YYZq30gVev4244SCS%l$gk*rXT^#_dHnj>u%fhGf?2OL0C-w_P_eP%p zuzQ!t6H|(EHTs_&=#bRkmO-eL-7OiO>5wi9t{I@d&~N|K+4vHyk$Bg79DqG7XT`ko z3xF>Qfu|F~=ar5f0DK%4r^hojt|)KIQf?XpTIH%S1yMdVo>c>M1pIdMc1k7TnjDY; zUb{urbGn*!=R7n2O(-85H~73wQYqx@2mE$()qg|6GaVvmt0QQu%iRy;>RgmHS&3!< z78gZ6C@(L!jP@XI-F}w+Kt6SRqtR}Brk8Mj{eTq(BMD<}H!9C(KWQ`HhP{Mki{c_} vgw&=}u~N?^Y;iGX9Ae(YkpAnh<9x<%r#5RqPbhTC00000NkvXXu0mjf2q~B> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_corrosive_activated.png b/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_corrosive_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..acfb68fa3250bcbc3c13c7c2c4c6d0f7580ec585 GIT binary patch literal 951 zcmV;o14#UdP)l6p7sC#TK`%{ z8HT}lF2`tI?umx+M8o43fHjb0D{U|@`kiiV|GZIbt6Q1!DeG^))2;ov-F=RsA}HMN zOM1>5N!;^0-3b7!_o;!B&>FRg{KKIi0Ca^r0m#V60ATf<832^HbS6@q^$POnHYWf}v*!Tt;?i>fBF7{L(tD(+I?7uCINPuUfUU}}lCj`O zrcL1i|A_g36>%lYH3@91ARc+=HaSzgVv7VfaUK9W*B=MKeQUO$k>m7zl6nkQ2E-p4 zS0yl!)CcD8yD@5xXl25df%rNA4dO<2CYl1^K5J0FX67x?=NnDYMd+A^PVIyy; zOXvZb1Qjm(ajH!Dls5ur8$1TU`IRpuo7ZM(b>7!5+1~uPDN*y5x|H)k+CYdaTu^5W zNAm((Cp3ddOJ$Yjp{>fVPS8YIqg3$8f_kkALXU$fv)y`Md_!^!rH>Ca+vDFckq-)z(vR&O^Q&WhabJ-dDNFW-iBhQ~I5C+eUY3RC|afF_UGSo-aC%mVl?zK#d8 Z{s1& zusS>vfSUU^0r1S;pYTioFg7Chqu)mWSf3LkpX+KCI$bjkheKJEz?-YbgVuKEBQY-l z=fGD0Oy{jWZg;!gKFTL2CjscH?2y$kJ?(S#dc8jTNHrcvEUOM0flqCf>Ii6KWW8sU zBm=N^FcyF)%}N<)KoYrAC6yPP+y_8$ZZ-f7ZIayh@E8CNYrpzF@czn)pb?1Me@bN^ z@UBn*ZZ|y?0Gf<-0E~=905Ifo`o(ySK?0(3_SYaxAK5LN&$2_od6gf9tJ?8k>h$QK2Q04x5=+qVFCI} jS*qrw{Qo!n=M(r1hCK)lo2fze00000NkvXXu0mjfB$j-o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..0418084169fd108398792788cb09e551349a875e GIT binary patch literal 851 zcmV-Z1FZasP)ATTfxfLe2v z;x__urZVD8Wt=h{op(=^>9YR_#F@(2wxUk}q@BnCptY(3fbg9M0C?R{<1vW^3B=}> z6PsI(HfpCe66-5CBt+H6p?InC@3E71acyGmD7MEaKvsOrI5-h-2qHBM?K6sJYg|>AZXZ z>=Tm!1P28HP|@}b0Ea_*VQNCo6ZUbre{>XpwXu?zqqAD*bk$fa7G*&K?<&vwt?bT4 zVom}dhX(VY1NREl5zwv+ zmtHt{1c24HF#tk-xqV=82!JPLmjFmPnFqlB9Wq-g>zV+Vw99jr_9pdpp#RP}zY*Aw zman=FC;+XMw*-J@OFRJMVG{s+8L_&(ZCqr8RBpa6vn3=HfS&p$xBFD5VXe6efb@*x zK2h${r}Lrys#m>00eIj3NB~6cPL_w9Kimj3Hn&Nygh-!vR^MDuxvFkhYp%jdw%5vM zbSYRYmU-2y?uNgWylJiz0PD9J-ST{LT-JxTEe}*HR~^7}b1IMuK!Q+d=V2js4>chs2hXCU|qTJ6~z~d3rTF*7-Gcd!std# zX$iV8kqwQBx)MTkftt85VdEo!un~hKs3o*DDwT3w+}<+NPN!9i=-o6knV$Lo|D5xm zGeSzqY#zr<2KUAzc;k`T17HM_?G)wn$AHsqx-a`1Eb}H-`-Sm3;B=c_ZWYh*s|?m2 z@@IX{H<5WS;B;pYFvb(PiqME!Ge2@=1b}EH20(FfF#zo+mZ+eWts-Alb1I-2lpk#= zNY2w05mL&mxlZN$X}tvS-TMkaW9=pYuH1eNz_A@u09IIJpcr$u&x0s! zEO_;6AgL}$uU2EVzib3wi(*V_rbGL0-`P; zG;`z2O$wyvX6@lX!F<5@(jXP46j=Iz>~D~7&Va8)G22tEa=W2?9{{eBbpV9JPXJh{ zQqFkn2LQ+SDln+Sp9f0?r7XUCiuCA-Mx&SD<+6BOXg%W>d7Ub-L^fNT{0e~idx2f90 z;joE$&z)KTR_#&+J2^R${G9|Kkw}=XnLjl<(=g*qm1I$1G!DSBrHhr3>{B`Y_FZ+u ziqd%ijE%iAF~5InApoVzYXErg_#Obm9~I-!-A^ih%<+#X;D}l)ASzphHy)vV@p%bQ zbEy{q&lWXj6Y?7Xz3=8GbF19bT~eiHz$3+cZqm>~cL!AUpWd#!L3jp3_6teC>1L+3 zM9*Nz$O>Z{73248d=6_YaYMYv!swTd~wF2)|&YwI}%;ziu;Og~0#r*O% z#k?t#xupWWiD?kcE()fE=WPc;%CZA!c3H1eT8Zw1UTO69%FS+5pAUaf)&8)v&z$q7 zF5!9GVY?5c6wu7m&z~rva$aWXgc?MVomJ|GL|s6fq=y$tEZW<(!#(UAv#oYxy!3%o zl*_X#o@ qKTcDO^k7Na>t6%#Uwj?sbAAGUvv=6DPB!=e00004!k`8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_destructive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_destructive_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c33e0299e81be7dd51d86fad7dc6580ff01618 GIT binary patch literal 864 zcmV-m1E2hfP)v)fsE{yx@DFB) z)I*fb7B(!EOiN;-Boal?zeQ!`405SkTGOr5!zFQ`c()ur*hx&?r3%nm?6KmY)Gy;1TR z0gbK}jjonsx`T7BiPM$&j(|p2OIlE$063bL1;8bJ4*)s4BLKK=eBm*Pc?l#I*O6FU zM^xN)#i};xDiA`TM4Z2p4buaA1%tip(1ZXmW*-5-VzB`5_4_0Md(t8S7&0`8jLasw z9(7Az6Hph`pf0K*G&aR+hpY0={u_bJ(0;*SKPj7Km!~K11t2OS8UU-+06=7zJpVBv zzn8Nw4gf<_i%3mvp|9_$q?kZ_K_&48m7G6buwY>mbLfm`1XBEa#NFy1%1Vv^Fg`H` zKww}X09}200PJ=-2S)9(2duWA0DQB`>r=O_2B5v8QK(dnn9XKsUIMQgN_-Z(vyqsU zz`(#D02k_8-P~@qTHTa891Z}^UF-zF>2$h1T`rf~JXnbbVhbyLM&QHkQe_0zu89KR zaP~$3hHY~HM}!0c@NV!60Hx&}0Gv80cgL>8odDeGXa-%>V{YFzE;=57Yb~&<7=XO2g0Xf()e zmY<)yAj(|{xx8;K_dE&zl4!gCMgU}G#sVT9Vv@TcICvERSFW1oRj%kXG#d0+ z(0Z+WO0^%e**vFu#i!wvYqEH0bFW?W1?G0Xy6!z)>00002N14>Cm zK~z}7)t6sLQ*ji>KX>Yu4?0AtG>RY?nPHJ)L_~$u3h^Z)%CJy^z?v1P1-&Ko2ZYis z&3Z_JTKLdIC7Kl!B!StB_F}$R*ecR=&Ob~xZx27O?ry)iW&WYx%jI5vJ3HrdzUTbT zPf=Bs%O<0ljm)JjiLm;+l^-3pUdnS{x*V) zqMES#%Dkc9>_&4)0D<*F*F6BBu*RfBOEn?^ErKn@ zw-+Sm!9)~QRm0|5TaV6pRe<-y7Xa9Cs1$&AFX{l;l$;Mh`=`b^Nt~q<00-G}4ahvt zEV;Ab>en36X+TCn%lWh6GXQKf=8DqEOaq|h^$h?HD#ZXy#rgnfa@7Kmx9tr8<@VX? z2&P~Nmz#_e_66$$fe|~%)}=sN1;LT0`}P5_{$!STZcPE;bb%Fsk_}Y=O!y~+fw6A@ zH1;(BaAapk2#K(LApQ8wMeB%xB%}m_>-<>7RRBi%M* b|nA<_xb?1(s2ra%H(d#?n?lEdWBY;znTS+&>~nS0)`Pefx;S-Vw-eRT=7^1xc^oV*rn_hs*V#m zjPdsCa%;#<0N_Xc69D2;l11d*%{uirv|1EvuXFB!#BMax#^TJ0)?TNs3(h#84HC7c z*~zBN3&oX!#I?>n02Hh`48VB8ppJmMNz}P9EeU{IU80$lT6+MflSD4nK;T59IkO;< z_cVu`0XhP;Ciys}k;p55qXIl=&jDb!IY(FL{Zrooc;4mI<-D%dqF8&Hqnih6P4cM! zg@m=&iNj#QVX#D=2O>=_XX#|UElZtNGXO(FLjWWtC52VHgKV9>VB4{gdbYOFK{nM< zR)6~{**_|>$md$hd@rXnLedVF>Gry0 f4*VCl<7n0&mtJ=k@1o~p00000NkvXXu0mjfg37fM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_steadfast_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_steadfast_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..b29a3b7c9dc2e255d40a9db851486c0e49dd4415 GIT binary patch literal 859 zcmV-h1El~5=#<@$}S}; zyA=Phc-5+Q>hlmnphldhnhg)wdjzH)b_B!#FlMm=V6j*L2v>#yh~Jt3z))wENZN1Y z#p{=f%LH^;#ptq%@eSSUvct6}a{i4#l425=OoVKRmP#{H00`Q)34r?sNkT;W$`|av z0Z0u`2B7+Vt%!?l zFz{^<0AtBb2e(_TRtM#ilal}x*U5D=GcyiPyWQ?E_fg}4(2P8{5$LbJu8u&Ue;@$6 z;?iVMgWqMfetz<-`v;`*+S>q}KYSU0fTJ=8dW*^du#JxZP;YKlp97!EFS(7t_9Iu+ z5tvx(p#ZcP%LG7-MhCz;jlcB3&{v1E^@x`2j zDGWB1EKdRR$Bc(m_WVb3fh1ZI~M=|002ovPDHLkV1hiMb3p(A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_vengeful_activated.png b/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_vengeful_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e8f4a7013f225e1c43feb54e98ffb86415c0ed GIT binary patch literal 971 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 Z_#0cM2e2=gWQPC%002ovPDHLkV1gdRDiZ(z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientboots_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/sentientboots_steadfast.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5720af122ac44af5cd0c0cb50acb64b34531a3 GIT binary patch literal 697 zcmV;q0!ICbP)Q?i@mSVMg{>sFT?XQA*7aXst2E(9(Wa z#B*@Jj&lEI8h1cO03Tko)`aUYcpdr7WZ zP9PA#T1#m%$@ZhQY-p_I&5P#*0)aoo&Tj&MikjU#yWS4tLSNrU)(tu6BF*bJZ+UR~ zDuKK(<&~BEoS1;nbO<7XF$QZb%?&5y<>x_p_dO$r4m3(E7DGfhT;C+Aj3@nLo*b;I zlRMvr5fMaWiokIkthE%Cm(bOA4?IiX`%gHIgNV@6-OKF@H?Tv)l<(Tgv9%>s_xGc< zp31=YeG-WTuby_YxuJ%#+A5ZnEX5du@B6G=wVWMIb!)5m^~sCYO)2N-SI;+R-8+GfRxljnL8k2&FWm z-WWwo63TU59LFIvFI)K{EXt45@#GfOWjp^YQHcn}3l>XyWN^9_7&or^*KBh_*?&DR f3aYG0!2wg zK~y-)#na78RACqe@bli@#*Z0CwC>DYg|J$bQ4}qL%2ia96r?FZn3Ihddd|G-1oE?N`!VUI)A|7_rQ4sNvtFW zR+tqRNC41U!!Qb6H?May5-CQ`(U@#)5f|iI^z~e2k>8JCxkRG*gt$~3fe>OzU>F9J zQWzY#!Bwup+{6Oz^*=&BpNC->cs%$5?sOWHaT}pq57?EPg4Vh~APLX&KoZRd4{(0= zJ#%v(c`kOEUAZZEo`=p@l-bM>GpScR)!4vp#|BA|ES&I%fBfWO-06J@I$4Z<8O82t z38Tuu@TXz)Ubzo{upIUEbx1f4;KPzYDFv-HF2>F<{qqgg;s`sUEewT1Ac@ZQHhS)N z=AALN9zDW=RC>8UN(rqsw(i=3hqvECyDq*ZzCua~l8ApELEp8zNYBjRP{Tf)-%*RE z@$rJ3B=Y$@EXzW)v4IP-ANXV9DbL2*XqqOJQs``NqccCmU#ZvZXl|luny@SjBq2y5 z91df9q=I%jgAE%uVvd>%0 ex-VP8EM1(*fKp+snl3ye@2ZzPs?G;_ujd}I9A6?h6i%WD} zN7r=`k&uAj??*(i$eJ zhku&w)B}VB0NTA?01EbOBfauCHM{a?i{BuX+O%4?zm$%Olg#$H=^yfi{;sKo0m!^>QpciPvdRY?kU8SkVbTx8PCtJ4W*y)IU>z zEY7sZm-|&}c6|o1GvA4vo`k_6lC!dyX=`P3OtP^|1Mv9zjOSb3-E>?(rxJ6EnRw&k zMZ-hPiEHQ|>mzDr3N1X0M|*9!JzeuD43CY4qI7r5vRbDyA3D!O>vLvfOlX5Wj7BUX zA=S*_%O(a&%1OCYf%D?|d4ZIbD*$NNn5L}mZkFD55*-XM8T`rOa1)~+KBD?RF|le zK~y-)m6BUXlu;CgzcWpaQI?~jWZCu4d@wA^N{B8L&2*6p3sfp}#D^j*!ZHwIQVSz0 zs@FmqF9a1dh?O9OW@?~auo^KdvCNFrZlgKP{JRJ7H;KRw?6>o+wOM;95n(*f?noN* zv9I$pgI~Rv{{=X&xoE7pVL*k>OzJ&v`P4taqUbR4)6di1-mVM*UDq+0Ok>;%^D}9D z*}?3{X{2sAI>w;%#(lMC_j(W!M1(*fKp+snma$FTy;r5+b*^ZdW=!LYE;LP}QqLAm z)6g_cL}XaN@Ao4j*fO?BkKQB&uXAPok_84d0#xeRa>iB8L1{7=H4>uTktAm>Wl`~| zp5o-2BqnT94Gs0oJ#m}}OE3xcYI*Y{O{tX@qD$I1wl@`EIK<>$FTh{$m8NC@o~T1o zSG7?^*u`^508rcV0)Rc+*AjQmN$KWY6q$46nD4C0OSACIxgQlYi7sChR`Ya} zNdXLR05BtLs&S%l>vW3DIWq7xL*?lfJXK}HY){7;v5+YXsrUo?_}=`0 zUm;dZ-R<-TO(0@^Jlzj#`H*#-IYmxfr%#Rw#70{IxE^yy*;_6$t<1#~J%CsL$>fPv z`a9pDy593KZH`fUqxuOOR{dF38L9Sohq&d7MMTgvjsJy3gx@Lpe9RV`onQa}002ov JPDHLkV1m)3U@QOt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_0.png new file mode 100644 index 0000000000000000000000000000000000000000..7227a2c4e42219ca38ff03812d928e60d548e459 GIT binary patch literal 611 zcmV-p0-XJcP)_|cY+C{pNd+L{TZi8u8inrAl0Ia{vDzi{( zL}}JK7jFn0clH8s&Hg|=E#HuKkx_d@b+y0#`B@{D=E%a8fP^an8So5B-dvTXR75&D zSlik@upr?|K!T2_3Ob@{cc(-;w}HFgMZ1U%;Hz1txhg==5mn8i3;Lq)aDoMW@n8#& xGcnOLP3q)sXx~WcadqndpKwGo+xN^&eYo%0zGkV<{XHz ztsxs?wYFJ_mY(7dq(3CaQk3ag=EA0J>3-n+aYg0)cAJWK+p+WMkE3fwKJfhU!1I3d zen0O=RFzYa{rde=KU0Q)qPI7HD4FA4!g(j92Y}r-4&#~hDgezt{=~L@ZoD~Lk^p~AqrBj9 zQRy$DzPC_Ia<(fVs4BgW0=l5wtydnL&;s9LT~O}UlGs`;i(6XW(}ytzV~iSOs0$pX z`O!x85C4U#;sof{Rsg=~zd$%-lSVotgAra&oli%`Zq3`ZQ^+(jHhQ1QGmmMDtWF-= z0kD6dK{i#*BKXA*96Gs?aLDHR)(G!UZ<4sgS?7uB@a^j`Ef)ZdW$~#q6#!9H78ZN7 zVOJR=sW<2wy2klm{nEO=NYgUXvEyHg%YB47zTb74L}`)LqOmMGoaYESmL(Jb1Us*? zB&U{G%02u!SM*HFSqX=1(o>3cAn4^!#|jC@6^&)#I&=bY$iEf<#;1(|;7)Uqw2yqt zqR;AhZD&)GBrEonwmH`bK-ZAXqJz=AjU zowoTKl6JDE?q$Y{nE;f(>rE(V>%Ij*S!o4;j9<5sim7L%@aawZmIidz=|%~MY>s^L zi@urvoHj4@(%IDwkcjb*a0Gy^n+c+d(m|!PkkN4s+_njJUd26S5?pRnYe$tN334a8 z0Ju9iNPTbNV>u5seaHQgVP=%PC$(0+vaf_%s~%s^dK?Z1q!APaMzz8=c zf;_PziHcWG;PH550l>N7e!b~_6dQ?@*q!QFxPk8WCR`Oxx_=!d<&j0axUn?O(aJT? z3xKF9z0LY}I_0)) zg)^~l`d+8UJdj~$tJdq)nZq*Ingt+Gx>xO!FH=&UNynKk8m|}O_xkXZ1$lq}E(uGR zlAI}(gb@HFVT8Vj_dWoi!`)AD`j?zKn#)k=Ct9z4Cw{Mwhpl;fHUDjCk~CQwX;ObU z+Ok+A9l+fl8~>_Xw0jah1p z(an4JVT@5@3)BEr8sm&>u} zIb@|0+r zhNfvEBJ%=sb90CYPG_3vzIGXH%$N1+Vh!jwpjV!f%T=|Uly-x$0GQ2YTrP)H79Yj; zqJllek4V^(rgE|~SXFkBaBCp7K@TXhWh=GCN_2G(<|D}f^8#64rU(IiAD$X;TU#p? z?HvH5wiHU%_jDDxeJ!Ck>%bCd?92oZQk*4MJ?GeZ;xRYwG^@6@RuW6y^ndOmwg0s2 z9Y|1-X*=-N-eW8*m~V4GNu_Qf0f4vrH2}GpDI{L=P?LTTTc2AdR$ozTVywLO6rh$Y zWoRZ6yJb1bqyXj<0N8CI#)-o0%dz#j<;=8GmFQNyjkk%{>w`*YszVT52dg?Red~32w zD$HZDqnX)YJEq}Y#+H}~k4<9u*;76pKS#_Z4^?Fs76ewVhz1~je}i&#UMJ*s6*k?^ zl>URD06SxYA5cRd8Oez;YHw73_pVKUR#kpi`(KBR$%!H&Xqv|V!Xm;ik_dH#>3D_0 P00000NkvXXu0mjf3A|TI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a73cdcd8a50343f5e339cee006b454ac91a04fca GIT binary patch literal 596 zcmV-a0;~OrP)Ao0pUqR zK~y-)m6A=N0Qf5}DSJNj?PTriceaF%voyOEqd%_N|qNi->Ke)F=1VEQk zvMJfJVp8$uMNga($vqZ;Hjxd;Mm;E&^6b0)8hP^+falo-RrdUKE4$a&RA5K@Q5fwUHf7m1_Tlm@SFsHO+y2=8*qFf#VmN=y-4{yk=1%Ku zY>0SbtgRN}T%Aako-qxQ=np{@g-!n$q@%6e*Bf5*zEViJ+or*OFz@k?qjN<*@WAti z&-=~${d_(jQB~BAD(RcZD~E+Alx5ZGQtTvC%*@Op>2Efx{ahXZzLj^N;BDl^?GiZ| z!x`w$lJpddKXJU%kGCS6CA56pCo4Q2A}w1O z@2FGnC;Jo-RF(AQn6|xFsp+wP_4{iw^YB(p|7vMlJb^I=V~iSO=#KT1J|5DR`AJk2 zHvprT0Z82$#7U;0U^$C_{K?b4db%DQQs?u}ghC^^v-kPv#&;UBnuLXnGZ(^LhF*B=u!O@HaE&L?ld8*2d2g(7<0IRJ>NVp+A?6KTg2Pe5Xr z_NuU44{Xwx3YIha@RWEePjjK-cjf9FA*)Grp@>oU0E4b~G7bRj_z2!$7cBlw_tek& z!}%-XBvX_;wN0l68wq(Egk_89LJ^*Ce?(mJI0ArY+4BG#&2JXHevS>%Zr1f2&5HD1 zI;NopO91S-du%v0n~C7}*JxxSKE0DipH2{B2Pcz<8 zr%Q=*UtHz>;yk6h-k0WJpPu+~C(Xe=;_+5oE*Df+m8&sEYc~0_uWhGZLskE`jWN0u qQ&#$_sw(A`RTyLbIrKz<|MnyM?Sg2To0}E@0000(*1 zK~y-)jgo&z)OQ%iUyn)6vL7NMBwDQxSLa%;rSwOnP>jj?Il_o#9=l*N!)s%W6$?~Y zas8rYe_Vw2!+u#z+SnYa+`>6?FgCErZ=UDeeFr0|J9BGXn%%QMZeAVrM-P19;rV>t zFW#T$c|=utnQ*&HlOEck2qPm=QYQ*(`IOjg%4E_$bNI{K6FiAgYSC z`E*xHGy4x6qp#yM0M7hT9P8Q>f^*+=3S%(<8r#0(TEk%l;tseI1R(sg4`+Tc09M~G z1iHS!v0{$^l&>#QKmY=}-%$t1z`#Jf2jV&`-n_HA>tX}mkBixM@C;e0QM|9-Bk*;x zzBjm5m}?|6`Zuy{3Y=`Bbf6i46o8H4f8oXt07U-$5jzy&-gp}0f89mWmU3Z^Uq?eh zShA4%lTBJ(ULzA`;Wt7NM}NOwbrDZ$?!n4*?*P zhv<#jPXPc{e=m*$-{UQ-fWGTox!NUmD8k}NTeav&t$1=AQXjaiq>slTDUuAxNS_IS zqsl9cKVY`%mcRK%NkLg`^(*9tu3WBf^wvc-)P0%vYheE?Ei4w(}vfsw=tqXf`*k z+W_$~Mn>)@ZCOE89rfLnO2Jh8bSeHWTs8Z}uKP?c-?^bye=p1T)ky-7la&j=sc%~e z9ABw)SK?Xqf#}%01at<_V-I8X_u^boKzGMcUH;Y%Vb#haHOA=Mo8QM6qsADvkA~Sk z8b(#0JH{COsr^ee#;B@7;nGF={{_aF7m8j4naKYGVhUf-D1ojo00000NkvXXu0mjf Dwt9A- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_0.png new file mode 100644 index 0000000000000000000000000000000000000000..ff44e3831b04f659c81bededb505d9d01a96373b GIT binary patch literal 606 zcmV-k0-^nhP)KOH{6%At4E*%Uc@YLPYni~y5AvRIE^bZK_vRqId z>R_i;bO`Dq*bme)Jj51X_ARG1A(l>ybV~MgC`G@zQE&Lb=ktO0`*}al`%%|kCIsNq z(GxiL4>C2_ujm1n+avAoVm?dtdl^gY(F2x3Ay(o^)`81ak(&cbnMn)2AZxh|w#p?A z9XLoRcnQNWlm#GSeB|8mV*n)HCb?f1xi>Y#!u(a%G8sl~HoVgpIvg2>@yF?1`5+E| zK%RUpip%X0hd&_G-|8~+qam86wN5+PC#lw-CCV27Vufvr`79$qWv9gXeZ$yN@3=lZ zpa3*Y6T>i+Pf~J2o#~uYp!!-I{(wXpS($V=rP=$H@{UC6zq+dT8Zx(KUFNF^IXr%< zLj)jLX~>>rm)j%p)lHeLy^TqaZEH#6K}21 sJEp%dZzRpQdiDR$7@s)(|D-nj1{O*Tkg&pRe*gdg07*qoM6N<$f=Yr1^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_1.png b/src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_1.png new file mode 100644 index 0000000000000000000000000000000000000000..89e04f1e62b7cb2d493f247a17def946409d618e GIT binary patch literal 846 zcmV-U1F`&xP)m8ZG4^t-yA5lTcRvn)Q1AYcy3?N^H|JG#h3jm(j7Lhk?Dy8uj*?Yl5OVf>5 zldHnb{l|}ZKG07}ViI-kuSv_y7R!pbiFkhhjbn9n{Q74r9l&z!C!Br-xnSE}RcQ%U`Wzd(PopY>PEG_aB#8Rx5j*n*lqgz4|-5MTIx33dp48|BW#!&0|nF?)F=Ws8o ziUr^r{{Yb3+ea|qCjodh)X$nvX5dRq*39n@3Mocr4u*K*m>iw_MsWZyd(*|Se7Rb;qW!;?i3HfY;}v*0z>V+z89(Pt>bdE=w@r=hH~F z_T4PuRlHYp#EM2zvHo}oiIaB$3Dc(oU~e3jrq@p?JXy=i!v|v!jijnf=o5hUp&kk^ z4gw(g#bxTMtiidtkhIKf>1_K$0m;2vuTxkl5`UZ4T(>49&!uNlt)!) U)0C#Cg z)Iodqqv*F))&R(yZC}!yUM3QMTLE=6*GVwo=Xmvhx@z9%+PJ=id+iSZqGx>G-_Ll^ zQdf~KbrmuGTz!GZczr%H7A$}(*LB;s-$-l+bLS*61}f-i7~8Y}44t^ezelcO-&HP$ z+~s(EJ`TCd866#slCyI1)EJ}r#bvQ?tI#%7^@CxI(eXJ;GVH3VWaZ>xj2SEXDB%70 YA6Vi| zK~y-)jgoyx6lNU9Kfm+sG88N$GsxVYODBaKZrB)`&_7*`kg*MPGb+ zFe?@cy{w$GHfS)Ez2cVn0vjr9SxBdLN7u=AV>8cF(K~PIZ+~2#JLVsI;DLwV^ZS1I zKF{wfs>=Uaj?#lMjeeh(;PfQ%ONCEoX7sjL`6xL~0N!r7LSK7#R8&<_gLCvgW0L_k zug{>q=2hHox5NXyGV9dLThpWf2W*e&j+A8j+PkSbdJLz>!@9II%J=VyarEfpPYZyk zDor7mUa7l8V|_he_VxqtprDZJ+iX$6XJ7RQ;Y9$Ne)yKI%V!jbI2ewf0^oD^J&JO- z0MPeqKkqnQoXE2Yz~15_1q8t1x~5!4TrO9{0YD4)^polf)E+-hL&ci}H>UH*Tkm6u zi(|IqYhkltZEy-HOaf3q8Y#d6@cj4;o%{(v&-es>pO;m?KVUW#U^@$JEOO|a*A4bu z0M&4|EIrKvFjG;fWzH-L-+Ph1k1uefs~Nw~%jDr&E|vvkUW6AM#VUy&03^}F?Zwe$ z0KmY=2yNS5;^ot?@k{s*ZghMvexH~0aIOASIVHUbHzhe}S6xVpKr9jqSd*Fxz=yV7 zGG$rd$ArK1sk5h|kluZpm|Zm>ELzcpG@iX0i~t;^2es7lN zGGHtah)G%gp_8b^uhzIc@}AqR8qU_-ck9IO^Rm|+(vprYz52n)WkA-33;>$H`Hr1; z`c*A{l|+v`42}Sjx;>u>-zWnkBiM6tIN#P43D6VI>`-Hj?kqWgF-DCsl+TS*J~xi4 z{%0Fw^jvGF8e>#dVXM7BA6{ULSy8kSWa<15J%VR1kO*Yo00000NkvXXu0mjf0ql50 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5bcd4835d8522ddf88b733ebb6e15fb806943e GIT binary patch literal 780 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 IM6N<$f-~e~KL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_0.png new file mode 100644 index 0000000000000000000000000000000000000000..082aa7fee2b54b08d9ddeb467347f6918f9a7324 GIT binary patch literal 620 zcmV-y0+aoTP)JRIi+^}-MT|HJ!z@B4nA%Jg*$ zz`=!YY&&}r=c$W|DhT+zVt*SsljYT4sLocm+)9ixH4+El*wP}7JNH#3>E>{dnbcRz zd6Rt&ySZ@n9=fh8C&1j`1V_#v2jFe|J>}F>2@b{>7;a-WWw2-OcHC!fY*3`@`d_8x z*N>&M)h(+Z6B6)wrL)y7YnS~}3I#>eH0#*O<@O%y&ndCb0Q`88!N{4gYbQU=0`=!k zGqanSYwQ_Q7iFK>qCJztNX(orRVdPA@)|T1oyQEa9MET8x zY>-?F#bCe4hqwS#7O6#ctY4;+Sq{H? z#P8@V058+;l#w&7QI@2xw)}w4E1xpsRAu5YF0T$;?>|Fs|(TK7a^>>WP z!`oNzcZ_YeF!g*?G)o2j0q6uSZqAOY(=ce0eEx%3a(9R!Vr`O!mAIC0>_Q3PU1E2Sc z_rv@1h^i9#`kX#85G0}L1K}Z6Ra&4cXFC*TZXtp!RC{z}?IHj_91&3o|Hq&0Ch0HUf?l@_S~ z%rTNK+bs4?(s;-zmn(Mbn$#46PjpMN<1^0NlPa^1;_?@ZMl%T}_A_9W#vA|y2S>@S zZ6aY#@J6m`Z~u2H9_rj>vaFAx(M*y*`2w-zpA`U}N>2jdY|&P^*Kv)a zQ(iW9d=!WHYJ2oZ>ka`JTb!n-I}!s_l@_R{)O8oT<@|`Hf8}gq z-OwqqLtze2{KWA7HB7agX3MH);_+GlqnB&|jvhGPdvJFz(X$3-c0;_?^AZ)1FFhTz~Rxi758bHT4$J#L8u zGS;U7Ff}{NtwN`+6fSlQGJkK0XX_41MSZ(|++0gVeLFW_eI3iPVEgl%)fl5YcUQ)L zTdn?xs{U^qV|3+AUhW1}RW>_b!Wi@5(L(|M?Y{w(1c+pbi#|Z#DcGnrp8YWEnAC?ZT)3QjpC8YC&Jk7R zd)AtiN zG&eU(2*5}CZ`v@v3x0Q$+}i!7 z8Ky;3;;7cm2ewGx*K7bI?Wx*X5Jzt8d`{HWakKDOtX3~OdfJJXf6$#cK5u(~+TdD}Th1yHr#^qyBJyDfa~cYf_RmugK1#bZ4Md zpg%=^kk3b-@hN&56KjtJA%&ThnjT>jdIvKg1J8Zy%NY^EhO)I}j~v*tU!R|U5rnL7 zdCZv2>uBiufrb|^`!jgg;vFz$Q#a;PxIJ45gX=XOrN)EZnJ-q>4s~@r(t5XtguGk{ z0wN}j1)!|@D$kRaD%-Q!b|h7_XF?D<0;qfYo_e>3nAwxKS5>SDOB}-d_!(-9(WK?8 zF~+DdhE3gVZ0c@9RlnNC7;D%RW4 zK~y-))ssC-TTvLte<$XRyfw+aI@wf0Xd)yiIQRt|qeBt;1%wtlh%Ti|JG6A|((Pu; zQo7yTd;kT%LKaa$aS`7_J&>jFcQPbb?vyTl;2F+==XZY3InObYm?dJ&82=W~vwr~u zC|`D!D>>tQ+W&oHqXDDQh)%B$z{A}QuUc!o`}qrde+xjT*C!SWNlO}MuH@+L=O6O? zK$0{V4D{{rNRs6FfmSv)6;C8JSrZGxuFp@|*=hrDF#N;Ga0tN8R-1St`TP?~<7QK4|KleE zP#D Q0RR9107*qoM6N<$g1jNg#Q*>R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..a52612ffc3da06bdefbd22c76cbafd719878a93a GIT binary patch literal 464 zcmV;>0WbcEP)zN^cOhQ95~b%C`33{OO1ik`5&B7W7|n% zjr{>ZMT>}eL#1TH!M8yay|~Gi9(acLf#>sl-d}iCW1qHTkt92vdtTg~ zlO%1&;^t0?awN>z9?1{uKfj?;t^xpVI}dnye*yqh%2mjb@b5#IrNy0%UrW(; zEP9^HP&gE9F#jqE#ZUl0WbcEP)yRY7oeu9> zMS{+J4{yl{0G(EFCxou1lJx2*< zB7^&9w3`haU!3FN@g1$7{^rgBDwR9{;Pd4zo*1evQebCRR2q0KjhjM96YRC<#OCAD#*T$dzqqT3W;p zQP<(Q4%gPQv~3%uQVGRk5te14kT>bM4h_SY@reKbnZ5ym@8&RD*da6k0000_Ls8pJurCV!;~AT9ochc&X-O}f;eO}4hjZ_DKP1r##&fx* z=R0U2p1gg>!u)(wt|fu;>Iwieb4%Qwc<3ja*pehg!+R77^?2BbS1T@KS!?qare{k4 zI6uB%?(gTu$PDG5Up;Q=@xQy7OvWz|>x!r{x9EwCK7T-^BkC0|jOVy?ty}iuQ_|@) ziDc5>LL}6q%SX?9cBk&X)Y!RaUOsG|Qd=OXe6dKrSVU5zfFxN3TUNpL3hVQ>Kv4BH zf%+Dfzd20LmbgEfW%=_*;1K{LXHSyqGXePY+ui&Xc6aVlxmuM~u$73#)!h+RS9@6T zXs@h-t#Y-h;La@^NWwqVXv0nz#ukf|*w<(D$9e(y&M)J`+NuYD!M$-R>wkO_o&z&E zKq_^FgU5%NymFCahleaGj>FZddyS4HVI~L2UN3R$W}4UU-vDqY|AN}O zORzJ9YBe$!hMMpB#xMpC9HP~qSr6m?!EHDG0{BUHNvp(F`2YX_07*qoM6N<$g4o9Z AjsO4v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_vengeful.png new file mode 100644 index 0000000000000000000000000000000000000000..6ecbf405ed1e75aba27aac00e8e9f058e2a29475 GIT binary patch literal 466 zcmV;@0WJQCP)u&*9t#1Gz04Aal zs*2p}?%Zs&yaDZY8&$Ic0I=UbvA#Tui=zS>A01KEtU!`nrb+f%Rb-Y6JG2a)Bw4p_ zcw0IrNm_=^?Ts}C1Ag{vBsc8g)kZE~1OPl;-=SHn0RVFOB7#Bxa0vahcx1e{Ti1nq z?RGGLtT!J~H7htiE#vaKI3IJg5@J#rX2@#B`V*jKh0AN0;L5aqM zcZl&gEJNqg^d!^iG_u(&GMNlCO~Ya;LCesos_KA7{QuAN149MmcXoRN%K!iX07*qo IM6N<$g44Ufj{pDw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientleggings.png b/src/main/resources/assets/bloodmagic/textures/items/sentientleggings.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8fbcc516dfd853367e610872feb8963233258b GIT binary patch literal 522 zcmV+l0`>igP)xS*kdKfo^n zfk+gI6fwrc5HrliyPla#Va3Ea!8~p^(#+A^?>kCF_@4<6AFQ?9dGuIpno_CNSh~1K zzn`>toE;D*5xq}4oH=z;RV%aVTf5Ea`U>J?IzV?j^tB$<+G@1`=ygAm z_tWWsv30!1d;eRJ3e!vrg5d7~$!vA>1Lqt7weyRA2ADs$fV26qW2I1P*jQ!^NqKHM zpuO>S6qfg%FdW+6`LKa=g9*TxNO9?ei2MxgK$s{gkM(z~iT^S`00C^oRi)?#SO5S3 M07*qoM6N<$g3_@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientleggings_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/sentientleggings_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2b93931cdccfa4288fb828a7a83dd4bf49c411 GIT binary patch literal 536 zcmV+z0_XjSP)KJq zKRL$S+$^0F!?&+rC|63DIN{or>+1f^8>b=>$e+k}1RUSTH25WI}nV+Ab)(Y5Z?qds z@M~ACu|$E!ExPDXqeG43Kon@K(F0Q$03@-&Eh^fzLoQ5BtMRI@j++6~S7#6@3~Ed; aFYz4`J>-*7^SsRf0000(tFE&~v=CQGA?ODXt9*_$A{JI5LWqiJA*S5M*3wT9NMU0u zf~c(^Qv{;yDC?iNJNw3+nfLCsSRH30?y9-)iVN@jxbL3x1T*7*%8WNkDXgu0VXvXk zXXWv6qzGU6u}{00000NkvXXu0mjfhFF#A7JO6-2hQCm95 zB(q2^%tN&t+!jlSMJ-6>W8(cg_GNXYS42d?TVLCt^9HBFjZMct&gi6|=(&ea((x2U zjY!bhx2=8P?hXe>`5;Gl0xh@wG~mPBGJgHJhT}PC`}Y6~B(t5}$r2ay^LxaCcV zdmhMIsZ;;}Rl5PlYmWx>ht?We>t~G=8s#*@F#a8ovc`iBlbm;AEe4;{U`0 Xk$K~X+rq+$00000NkvXXu0mjf)HvY( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientleggings_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/sentientleggings_vengeful.png new file mode 100644 index 0000000000000000000000000000000000000000..4f0c4022f1a2786ca0e06aff5df46c6b3bc5a6f1 GIT binary patch literal 523 zcmV+m0`&cfP)>}({g{0=)IVMB<8uSi%Dzd&N^hgjJl=?W1W zUnQl|>9o_CJ9o~pC}T>rK2CBMC%NyFbIET8xg{}EHwv|F>B7uRSUf5-Y ztMeC6W*Ae z;jl)8pU}}3=bhCRkWYZFV|XNm+_jB|+dLvf;A9fZn_I9PSG;R#0PU?U9M!a7vhB5X z6wCs4_x6H2B`Hy^)B%hQ_Twh^0$WN{Tn_*ci#DOfFrYxV&zm)X$mgvpB3P~q!_ZNZ z5+y022@RI(LP`4K!WV$2d>9cO_jwatsczAlXcv#gA_jZXV8M+6PX!Al#|doBX0rf* zhbI%ZBO3$4MMNN?x5fOB~`du#XasfD8H9<i<+m#MU{wGB N002ovPDHLkV1gkT;oblM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientplate.png b/src/main/resources/assets/bloodmagic/textures/items/sentientplate.png new file mode 100644 index 0000000000000000000000000000000000000000..d61fdaa5052e1202049a186936093d94edaab59c GIT binary patch literal 735 zcmV<50wDc~P)0&Gb{ zK~y-)t&>YgRB;r>fB*lz(~L8AXC|y5Xps;-7g0hWfl>R~rCOUB(2LRi)J$vir4qVsuau5+jgrF6XpcRqjB^5HiaES!1h_qk3;rWWT z)=1IT8p*}AUhY6dFabj0sPqrL2B5UG1Z5ar=NzVO8^h-#7q@2RQfa8&rj&@#cBM-O zUOWTfVEqBA>h=II`m7ItCF{yjT9JsyXo<%FSiiQI>dMW^1nB9x&Hb)!>`WSfkFN$$ z+F)_<27G=$V=tZ~BDBO~B;s*Qe*in3rn+)-_K0O=8D+S|{N`k7+erY$t? zty8Y+l1wJEEC4u;LvQaxwv<;eF!~NxKxu`zLe!egf`toNy{M2oeUC5<1EtiT2^_~k zM2Hm3lS55S)NZfgdn(QKo1HjHQBhjKg1K`@bam2l_%L}sLnV{R>?#1JX_Cog065)z z65H^R`8CO|9kpnsNOa%8Z)##knzHiM+MB>zL2J#awhQXe{@v1g>}Xa<0^z(oV#iN- z*AMx9N^9*2%mkR8oPKoy0M0iz|MNIjFrXaA;qL R46y(J002ovPDHLkV1kVfNf`hD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientplate_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/sentientplate_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..f94aa59f65fb3f53879a92ba7d56c1024cbbc18f GIT binary patch literal 735 zcmV<50wDc~P)eiRACf`pYPr~(>Pbh5re=&Xc1CDt6B_HP(xrSE}|c@s3ZtNh&Cb=gOx=@ zk(r7~Rs005D4mWg__sfOQ+HQ99n_JY3sF_vz&8R+ev)`h7c<5)p1Z zZj-lfMgVATJW6!`VF1PxqX1NFTZ>XK(0z^Ag-!r!q7kaL)F}gCFrHvA{tP>ln>hP^ z3Z-kTimt}D#7A;y5)mPGp_87DI~V~2J7ZI|r7kC8bn8Clq#ek@(AY5PRE9vPfG;Dn z%zT)_2pFX178!W@8~`Wn5Wn?EdB2d!WB}NGXcwc2PfSd`WMO(9!>!Tso!uGwD)I=ln zUw^1v*Zu7S0LO6{j3=n6-i+V$krhFyT&_5{l;tbRsM}G^gC_}eT}RjT-#)Ny8_Ti? zhD|xu+9Y$Sk1{_0LQY;eA&spKGCUKPuc>#^)ESdt*p$-JQqN2VfMFO|mIc7&^H;EZ zHg3w|_>tXcN~gWIj{@x@EvK*M*48xCuk{Si)0)P`j@zoC{-Cs<=>Wh|Hlc!ITFYKix(lqboIRe*p(KHPaArvT5Khlc=&~>i+ufquiij?Cx{7Inx%QgNBegX~z95_Bh RaAE)e002ovPDHLkV1nWeMYsR} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientplate_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/sentientplate_destructive.png new file mode 100644 index 0000000000000000000000000000000000000000..dde01e168832b2627e5456d9f7c17ae1fc2335ac GIT binary patch literal 732 zcmV<20wev2P)YgRB;r>fB$>$=xu~~5Gp0Li4cOI#6=q^D$^hdF)B49f+Ul6MS(#`3_TEp za>NocVuV6V%@Q-TQizH~K|v~Xky?u}j5513b7xMAVQ#gyZ+V{IIo~--L|6$lfK(9? z!SBxyzdu8Q?VZ@R4L~dwbL>r_4ibrklY@vLBKUl6@%h|RT(n7YbF;G5~s>jPR&$fQXgsI5swq zt}Ax!+(>%5i+7`+5D@~+tpsniW10q$NQ}bLs^k*$_Eaj%vPlShoEc^5r-jF3GBNpu z@$os#bc2P3CHe>Z0kABawotEfRER_(03542$neMq=Et5hJGV%h%fRC?nVnl?VQPr! z>95pQSE7`{Fbn`xN{*I$U93-=mB&xtlDXQ;`Re23!%arcj&yka7 zR3ece91bT{0I+SFo@XQMD=ud0{RF543WXqeyO5eVK@b+t#O{z@=Oj~H&ZhfCL*ob9_@ z8A{VM=fDhrcs!1#X^04>=~0&TT>t_Nt^YiZX?m1x+x%TX{g-cC34Q}ckr7#M$P8Hk O0000YgRZ$d%zrD{t9>d5-K?V_(rDOx88cCxbL_%St14$!O zDnu&KGz@xZam#`p6cI&|W>EAnlLogpKJM`x&uVbFryAQo+8Z9fwOzvVJOEtR4c;4DJMn!#$U#I95$u$Z*eM}dyEtF6GZ%`T5|T3)uLOVF zmT!`6%Qs0puCcWf5y1pVPqpRlhd}^}bCzK!Gw2+LJL!>Nn8f397tEK6(juiqgj46Q z%J9P{0Bot=&!PNc0Peqg48WS~RVbx77(Pd5Wi0>;H?F3fC&1&daal#s~NkG+Tpot3pTwKZXxNo;o=D9nqAxU{HHMLh=}pEu727>SOMW=*H> z^8me{USgRRUq-$W4tE0(^&HN2ol}7ej^hAOwzZu5uOD&e-5^8Xhehzz2s(P0dV>GE4r$WF*Y{JiXFuq zC@WFE?-PkcVlDu9o=0EzZI+d6;Kzf0L^@20E@|7zRqIKMXw2 zLqwQuXUM^QM_9MJoS#3(dDzkpu3|~)dgjcT$<4+K)YKioNH$d@5{ZohV45Zq6EO$s zk5{8S6We3%oCeiRACf`pYPr~<2W`A(`OJy?5rcn7r27-sL&xd(Zja^ByH4Yz7*@ zI*Evoo#B)044-uLJixYX04&RL;_cmiB$G+!4I+Yw5b%2?;P*;-;SMRt-zovWS2}wK zoLqHDkyMuy$$DLTcON2x0g#>Hlli$30QT%Wg07U)c^#IWz-8#H*X8Ezm%89Fr9^}$ zyv zbPiop9N4v;G`EYlU#Affn(HHU^z`6y8N@A%;?mlbh=mnF6|-!Tz?aE)tj1zwdOduY zUf_Ln7LUtdX=Rn+7sCL=EStN7kCd~8csvfksme-5CqFYgH^R))GH$~l)9YboX_)s>l;3>EDO^# z3HZGdZfcaZUlX$O{kgP+8YFz_qAW)HW$ou1x!rhK0)DULLUOE002ovPDHLkV1l+&Q!fAj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/set_area.png b/src/main/resources/assets/bloodmagic/textures/items/set_area.png new file mode 100644 index 0000000000000000000000000000000000000000..f43368b6f8d3b77bdfe3e94bda0d8c21d58cba24 GIT binary patch literal 505 zcmVVGd000McNliru-~I%5wSyQ5s4B}BC)uHhJcXclnkl)!v5e)hv$LwdtZ29RJEn1TX-Ee z5;{J|KR=7{<%dc}BlQV1-NI!*m6n!f?0YHt+U+c#9Vtz>D3{y|15CZ16iv4%PWc|d zR!!2;{)kn}D_e6rno^D28`2om3l(XI`?|0wzqdwy@Jv!y#M%_d_Lb0{9keh10aWH{?MRD00000NkvXXu0mjfjm_La literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/set_will_types.png b/src/main/resources/assets/bloodmagic/textures/items/set_will_types.png new file mode 100644 index 0000000000000000000000000000000000000000..b50ff47d5d4552afa94854843975923b59593eb5 GIT binary patch literal 593 zcmV-X0VGd000McNliru-~966G0rsf76eklEnJe;z6r!l1glY(Q0EbB|WI1msUv9vItU&AO(@$ym%5k zD4v9ZM0?4t;7LIjtZM>|2TQ5FwWLM-h?*5zw$e@1j;DmsWJNE&%M8Q(-v2Rg1b?A{ z=vgiV{BkC5i1Eo3|D;6xqP*K5m(^#MgG|EvRZt-Wa>e?R(?QPQPWXJtCBSrz;n$ zAGXFoRbz5&beP=IJ0d+NC=|XirzLGaSlt94K7J;jFYx%uGc;{VY>sM|K$H`h=65X1 fLer)M|5LvKJj=Di-X(BZ00000NkvXXu0mjfx@ipn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sheatheditem.png b/src/main/resources/assets/bloodmagic/textures/items/sheatheditem.png new file mode 100644 index 0000000000000000000000000000000000000000..b12e6d87eb776dfb9e7d442ebaebd22f496ee405 GIT binary patch literal 1373 zcmbVMTTC2P7#@N^rAq{@c4?zb2b)mi-1aiNGuahzmz7Oe#ARcN+PJebXJK6C!py)f z*aQj@+K7En$;&tsxPuA*NP?4~j-xt+b67glZt+GM)t%eIR{sl9_Y+ zzVH9ff0;u~jSrO+?n!1F8;CH{r$w%0Z(ZmZ04(mZtAV9Te>(X^M2PI8Add4@WcT`h!7hx|rmm z!O*%bxbkCdrm1lxnNFvPw3ATvR+45}mZTh{!+}EtZgeXqpTQNQGN%v(hM-HDDX9vY zRpb+Dr|HL_r)yV`wMb+`STWWE1w%$=c#Wh9ij?K-y;jkN83q5ku_@Y!b!&i(0z>W8 z1(=UyWsVGEcXLBoAoPZNSeIZ@`1YVGbjm<6!$Cg=PY6*GIS0*qfsl0Kf|K>&B5(nm zby99TnGpD-)9dznoQa&yW_+g3#XwAu@-j3{*STt46vMhHr#HaXh8(p_jvH1ClUD?g zvn@f}>)gOixm-X8ys7FjRc+5zK~tM*sz#ftp@9HewO3L^HErz4W@zogL7+=rKn&@s zjIM^5lQuD*WD^W9 z&ZKQcw^a<*9|*_or5{@>Y3u#iu-SfSP#FkGBlK0)PQmGXE!dT`|o;^A|dT#!@QAPpg zmDhs8ooB2Mr>1P%i6;xYkIgQ9w6khrWOk7_I9<)z8XEd-zVF{VNKws`E9y(Hf2RF0 zS66s9UJ_!G$>A%u;*QekpMMt?=4bp**{|(+W4VYIK!mEWUk$$6)PKFtj+DlcQOW*G TtbS-N`@;*@H3r{&Fy8+U4&>{g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofholding.png b/src/main/resources/assets/bloodmagic/textures/items/sigilofholding.png new file mode 100644 index 0000000000000000000000000000000000000000..55056c4b0b3148fdd129bb2457086e8aca4eb05b GIT binary patch literal 1605 zcmbVMdr%a09KZ2FK{6ns`9jwd^>Db`+k0@2xQKfR+8rkxdMKiMyT5}KZuhudxPvSQ zOFbkXWhx|u5T-(+AY+BrO&TJBAlW1#6&0CjLgjmgq&?)UKOFyPXLf(D@8|RR{=Sbb zHW`-$2h9xPa5%w<3EE_K4E4Rw2C(0`w?G36cSd z7v#2qSPo}=E@8GX7Q@R*jIs+*pN+t6cd%#^iXm2MSxlvl~lecLb>8Z}|E zRoq8TSqvsfLpcE?6-fD*P=r7-g#eLC6bKRxiG+w4Muf0P!AB6KM5aVyps|O`syT6+ zGFhu1(_&XDZWhBhlrZdaxdbk;fO2NSh(e)&g(6ra;u?l2f06O;5ZB`7miRDtcOluNMw8z6^Z#`DeI9?jsVOGxMO(y z|Ar1`oq~OJ@}Ii#Z?VPbn?CLWcJa860LeCwlkJk31*vm6oN?=?W@X!Ool+IJheeIMxe?HW8u*Fs54eC|TtE=u?LjCZXv2xq;^S_oqsHmUO z8FzTmzV@nGGK~UmZHvaXr1aPTllQopan-&*Yp7j=v9@ z%Zm($GEa2&uV|fcZ|II=UQg2Hvq8pl8`AsA2YO$MXp9UDODW$rbxP?6ZM9(``i1S? zi@@*elXl61t2(;&?B!jGD)}yB>c%qlR~6WVgQW-bk(K4cpJ(QIwrnZP@Q%E3vP&&) zOn=zpSu$K)To#$JX5s#Zvj$VRm0Ih?mR=4{7d)T&df=Sk&WmXgxgy2v>3CN&@8*}G z7qq)T0TB}UV^Z{%t=?{f$EqfMAi7(Gbj;QwB59!*o3LK>xIFr*GJ_Ix!(7QJ4S#0zpYc zK~y-)rIJreR8bhlf9Kq}GvmN`b7su3(9CLMV`HnL0yjZKixzEbmqid11wo5GK@b!{ zU!bob7=;Q_n2{|SXHupd)FB-~=Z|-sJ9F+mEi!S`h0wD)=fL}WpZC0v&|339^6k8w z>F?K_9WfU3%iC|JX%asirBvP^8nGB2`5<=Ih<^?Sl1UwDv$%2nDl@Y`@mvLf;q&45 z2T)3pN~Q7peY|@=CYk_e2L|-fcsqA)-{Qf=e3Qj<52yI_yo2+PS2%T|hq3XG6iXG- znT!CC00O8xbtb2#x$tP3H(z?V|F(fdaI&`>!#u|47jbgA1)`C*rUnu~19q(jK)umm zZEc;`H%$~ag~BR>Prjm-DtMlYlyWb?aU8VPR5xolj>EGnWk7NHX%-<(q~WKLDd1_3 z-CL6Y@s1e9QiboS46$gG#N7#ClaV3G@I5dLAJhd()p55zw+S#hJ|O^XyNY2L1cLz* zL(^P(S;bwkF$@FkdMKr6G*r_V+b1CeLcrWymez2XP^g8`!3|Wl$nx(3T5BR44wFvchQ3rLejVLXhjKf#=ba4-sk!vRQMO zNvFjg06;R4&;Xw6qC5{N1)-pcr~k&fT&eP7c2?}`V7HQqgmzsQAth1>T+bu5)%iex agXj-xIROE7`Ey?Y0000_Iyo=?*{T2l0zgSb zK~y-)rIOE16Hye#fA>yjS{h2FEl>zZAesmk3yCqo#Em=Mu;3M3y6_o%0iVEykHEr2 zqX82!A%tj@Qf&i5ia;4`>AxwRc4n>%v7x|%#BX))N$&4{=bTR{rT8ED&R*_JO{u|w z7`uDA*0nV);aMrI4obpX(OJ`BT;<2a;J zX$-^1+jmQChy<9Ko>s$y{XBd6gjajsB!B{}MgxFmt3|PR z%)-ne#ndlM^N3puC7Q(=p64Q^ya=#u8>JNWlLoeJ^Kx{ZS~gE|*+WPjsTtJsRXpW! zerpmSJ`kf+uCku`PAnRw`$Z0+OFj)1Sswn4rup#o7&uN7_jI@&fW;3V1%PGM(KL-f zz|YV^mE>j+0vej8;Z&M9jzg>EbhObv2_X;yve`{~LLq{|F4jg$H1;dx4@{KZA`%J{ z@cTR3Xal4Wlq)qXt4?lvhb8kH56n0cL8R{*_ypl_kaDGhxGaeR7#|zq=k_j^Ri{^J z?2=<_UuRG5qed00Uow=+RW3~;!0pLNq+zp> zPKyfwfMg<}06f>l@jRpy1Oqyr`Wx#?wa$-BMqKLPypoB8a$Of8B~l1n&m(pE^OXQs Z(H~GA0zBeOfZPB8002ovPDHLkV1o5yE(QPq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofseverance_activated.png b/src/main/resources/assets/bloodmagic/textures/items/sigilofseverance_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..828bda85217bdaca710d63310d04b63c2d07a420 GIT binary patch literal 1599 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 aMZoLsm7QMeU2)K)0Vlgf^nB{7P5%MBxa4~P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulaxe.png b/src/main/resources/assets/bloodmagic/textures/items/soulaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..9de970d90e50dbc97f4a32f6bfb30c035bc53584 GIT binary patch literal 935 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 DupzQN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon.png new file mode 100644 index 0000000000000000000000000000000000000000..01b03fee95fd0bb339272736d36d55bdb4131dfc GIT binary patch literal 717 zcmV;;0y6!HP)1co6|6oJ;^ZXQ)ATsqfT z(5L_aaO1&aXluoy8>p&^KJ!(kWtxyGgk1}7f+zsGuA?Xly+b1uds~S`qAbLsD1m@% zYN(~{Kr^Z|%XK5OQK;*B9-yk~->5Vw`Tj#jRPaROvb?l}Lyig(OHnNGFmswFb!l+Z z_h_R=0XXw}jo$k{Dy!Y{aIJ^t@Upb+D5cWntp4n`q z{)bOk$z*u*`lU>-uTtN4ODv5&#pAAH-Cjv{Y69)zW!%?$81CyS{Ds^UR+EX2qbG%K z=&X&u$6_iY8VDk^Uxd2c8_jao7hC;Cg)Qn2pm7caQK&1700000NkvXXu0mjfjpR+; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..406bba2ad0809736066e8effdae095c84f44ce18 GIT binary patch literal 725 zcmV;`0xJE9P)$n)InN#miKbbJ(qi~kW#V{B>b<@ z)YguQz%(U_BG8UGxtm=DfN7d2iUNR$Iaph~(%waCRRz&dh+sI(jIQJOHjXM3&ezw* z4T=*0xYqFqD$7VVOjK1RVf=|SB2j**`-MZBStp_Z7>0qOC^WZqkyufN?(;LD`$_%% zOjZ`}=G2i=Y)ZdeGM86~hGDD2NM#`f$iCg+Cn1p*x2yOXoWs~P<0mTOm5 z0HoClfF4>RGo_dl2g=#wEFcsKVH%QY-y9i^RBqjNvoPsrAsVKFp4BrxwOhEVs?6rp zh#Rk4WnD=X*2E-CT{7nN@M3U~>Fz%S^A8F~b~aKv%v)!$slB+<_MGkQ51`SQ6+v zSRfxOlx+FP39e<9|= zZn02a-6#yxVDbF`$(D5dKfMU;7gKe4E5l;Z7aRRXg$?2_@6`_q(A7w?00000NkvXX Hu0mjf++s%! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_destructive.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9cc2667ee83ade02fe2795f20c4fabe391f163 GIT binary patch literal 728 zcmV;}0w?{6P)9Q(J^BqFiL)CbCVNXc4v27G;G{ z5J5Z9F)PflD56M%3N7tH8JVIb<*4Z7B#!fRzOP02LRxv2_j1oU_j0b#TC)~}{jX8m z*n~u&l*TXwj(v&TOezCFDTQGe0Eh(#%ZnGATCkQCGw<`^_4{$o%wQWFMhb&7Rh27* zRuBMOZoUJ13yBITq?GJ<)1rgEAP+htDcr{WT;a|McRnYE@6Bw$dt!Q#MdV} zq!m}}w-;v&fWyD%INxCBfOSf5&dR5H;JLPjTS!Ta!!y*w%(RQ_v<%7%OL4rg>*XsO z0NQK@An2VXYEv%Tw-ynXoP|H&C!h>mvopl4w{Wegh4E1r?s-4OJXpHHeT#`YDS5W5 zLIhiCb#C5%V$2e!$6#!1gx8vl2Od5?_LEIhUZ=HI==QGJ%wOSLpzs9pIB z3oa}s6PbrjijWF1*ZqnpQ!K8ZzYva5CXS{qiY-K6to0iW)`-8EQx98|$}vR%0000< KMNUMnLSTY@&O?|0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_steadfast.png new file mode 100644 index 0000000000000000000000000000000000000000..47803fec48a42a1e7bec9fd30a370282c6dd253b GIT binary patch literal 722 zcmV;@0xkWCP)VPFzS6t%Jtf~Y^hMYOVUkw!$D zBDyR>EhCbkiwP12hDeqbWtc%?>ZF$AIO8}s=X>84FtIheuC%nAUclxUg;fJi7o*@s{y8IqG=lSO|2xCm*JoB z@x$*!cK%fPWrdU;E5+GqQ6agoSZJE&5TRy+sZJ;aN!a zk<{T)2^EPN4dA$Up8C5jq_Iuysw|+WFQ`(}?PR%}d>HXF;|<^{Eg<{kA;wyJRbt#l zfU;Nsi2jaHlx1W8;hp3aIf;a0D9vPU(#z(Jo9McFjZxnO!FZH%o-6?#TMaC_PVk6R z+^Fj$Fc%?NOGfH(hKEL(e%3?Bg$BmT?ZP;{M<}Hbn)t^SEbGAMq3`KOhQ}w#$h5Lv zx#%5wOW0j4?CE)I$SYB^U;|paeEXI~=B{&tKyX`sGYfm9-D+Lpi zWS5i>d*9D)Yxc@DCJYqc=MV#rZsYs#3Ex0B?RV~>*VTw(XD*)E5mI7dG$V=jqt$#K z{JPqSSMEP#Zef8hx7t-O79y>wQT*y^V|&gHLJk-4cW>~VIZw_dH_aE_D{mp8!fF`g zpRE$6G@0*xO{!tXH#&y!j5B#6XR%qr`eLousIkWQ16Otp>z;pLg8%>k07*qoM6N<$ Eg2psOqyPW_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_vengeful.png new file mode 100644 index 0000000000000000000000000000000000000000..43789d7505403cae4723fb4b94f50b414f81091e GIT binary patch literal 726 zcmV;{0xA88P)4OO5-I=y0%J); zK~y-)rITGqlVKFcf6x1FOP%wR{1}2+igaN^fzkW!*)8USKtgSEwL?pET9oh&ad5)6g#&drfL{2g6rT&gTz zXS5CgP}}kViuPhPB)YDX_u`QXEf~CX>=MZy?*@noz%UGSU8lOSh4=&en4Iz9MRI(w zSLK%EVzI_yy4|U|b9V}xzJ;|j8i20r|8PoD(9@x2bU60utxC+Y5trp;KH$R_9Y<7G zmok*(Msr(aMgurHy}*^mW)7NsDz9`mCkJ{|Qd$h@+tOK>>}Pgr7KhW$;S>Auv^A@> zCu;!8VgVp99>SWOPkvb;>5d(QgFz&cY0o@KDGA)FZD)MOkAFFYlc%eICpI${U8lFK zRJ^LHBOLHy(V_?|#m_IJyy@t}b-sZSr$floWkM;1(8MZWMbZ+D$LFR0;UMEtE60&1i{Nv|Y>pLn=-6VLS zQZPP2MnM5f10UIA%ZQk2KqNr^!Xi=M-pN4!6t4%oxEtCCS6vj2)GR!+KZsfiqM1!R zKT^);p|2Z*RCm9f`EZ!wyLVJz$-vfhPfT_{COb2iKyn((ANuf|xlCq_3-?vm`d?Vt z!e%y;bM~Atq`|`bUaaOsd}F^5p5IJVWJb(ZqAxc4jT)QOU%3$ukwIll(f|Me07*qo IM6N<$g3HTD+yDRo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb41c8dda5bf2fea1129c27412eae5664e7207a GIT binary patch literal 757 zcmVE@eFxA$}*Zb)|31Lx*B{QjKtKj$bB;eVd( zUx~9fZ=q3S>*{4nO%h*hs?No&09clVVHf}yvw&q;Ik@B29m;&IDDMVoT(yjy_4TC2 zYUHB7dj>LcSYBXOq$BuF)V5~EV^JwDu;FtRF&&Ok9vR~CL_&PmuFmOMi3r(j7OgcM z!FRHKNi|PHBQ$!JGVOGd%uJK&A7tT*T2j#%Y172t-NUo<7nIg|rUI=s0CBRca~HG6 zQ^S|&4@875b{DN{>ao6l#a*_DuIrs7M}~8Z4Pf6-leK*TD%-ZJ6QAD7k!lZ4yOTQQ zU?BE`LYs|mp%8cP1=zLTtK7DNoRJ2AI2-^Jxe5VDX0oJ9ikZ@o(u&WcAyTG^T`3Z! zZYDBmw$ht7G2pi2(3;4%5zNsDnM?-f_bAHzMb=eFZPgOQ?qK|Tn9;~EB7!p1-&5%S zJS592s`xn`r$}G|A@0z8D6rvi7X$F-;Zy1V9b>nDGVg(9S!ktbh^N%cLFjG=I!T6V9Qt4@Wo;;vzWtHmcxlK#^8P(+7q#pJ5 z(6V}?@^_q@D_|G~`y1A)?)$xD7MAil_>s1)JCw&>LQ`|InhL%me5i(+n-7&`S^3o$ nk-wtp*GK^}7iWx$pz(N#@kXp0}3US$@2n-4$ zkg$bhY9B^qODhtAtGHjw`8oPC4v1SBegKqG7={6Wu?Q%o5^#O%eY^obo}ELwEN?57#Q_Yv zSzm2?umBkeY)N2Iq@lZBi~T;-#2vk9RT@R^0O83f8@{jSZS=N2+89{Yv(Q@OI1W-u z8oKLsd9IHqU*6!~T#PamVJFP+$1qvBX^ceBKnA|bH27|((?^oi3Iq(t2G_6}j%Zk~5_ zQsJ-STHSR_%VJO2egJydu4U#-Y?rI6=4Bj&oh7^%*})ACg)rIuD- nYyDUF>UQXV<^L68rRV$y`h_$!66~1500000NkvXXu0mjfwO?4j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_destructive.png new file mode 100644 index 0000000000000000000000000000000000000000..aad55d4bb39e99d1fb3f3542195c68281f5e7e4c GIT binary patch literal 761 zcmVE)j=_M6m6j{(?)1p>l3u&WBg+UaQ zVL_Q%LRd0IL=S?ZS`-Fiq=x8N`Ak12ozWSmnR{9cP6@T@z#lI6p8GrZ{JBSo2>%m~ ze;riRH(;VDncpUni7*!ncdOdWLIAYZ7={r`6cI#(XfzsMpQ*pYm4N{U9-R{1(ImR( znT*^klIn)0c+RYhKdWl3@p{TdZ7g8N`^%D$v!mVv(-)0 z#Oo;+_lgbleSV2MHxFegWZFl!*GJBB7q&e?AQ0xd$3xY%*UB`_*b7Y4jL||ixC?Nv z*@gYB8$?6)CUWwN_%ay9u^gI_kqHKdy@&|PP`?4Q zk^lI#WG&9dH|9gEWQYV%Q9o9wgY<<+PPuacAvUR0m z+?R}!9QObK0)I(F zK~y-)rISlYRACgyf8V_`*U@Q8%Q7v>2C}FOdP-4YsL+F26hawM5N%2#$ZA<2xlr0< zWD)e3#9cydYSp5GD25Q9f#?|dN=LJCUO9KZ(?WcqtvYZP=YKe_|2apA2>&CFe>rYH z_hF()3*?KQu<0rvQx9{B0nl1w7zO}ps)N~Jm9K#%#f2oFgd}(OY8Gc&wBG$r^pIcO zID2|dA!D|owWg-3S=7OOM4tu4mE)qQ#7!hQLM-bC_{OBVq;Ag4N<>H|lbEJSO;xk( zIqBuo%Wm@bd$Ge7(O)*h6P>K^cnL*=#OxS>$MsZys8ptDPIh3L=47@}*p}y}=v*G% ztwV?iyN|gjIlh^wdyvIxnKa$6qbJlm9peBvITB&(>qZt;6sZRnTVzLhE-5Z28w(t? zw~vy#$jL}&7aa}tWS4JOc@Eb!X9j>+769(lGyuj&6Qss6NF)@|QRr;%LywK4oQhw| zJcR8(6!L0@#72)3%QP7r=tV{Pux*=&XBb;eAkh@oZ(4geUgrNkfSeRGaP8GF_pqT5>k#=9g;Bj@@Gv5 ze;|o=^`jEmWW~0Tf8JnAIL@2uTA{L3O(&Q-prQLsvbOXBdg(avZ*7noq3yMw&8Lca zRCApa%cAh$VE|e>zRkbHYXvuDb=e7YydUWa^Zwmi;+HoltF}!tpI%b7|1&@DeUVjX zwkqG9+jBWE41??|+f{EvBg$UNz}Hs16$jKhX9k`tyVOLppZ>D7*e#7pYmL@=GEhY3 k>D8STvJk$Is{eiGzp150p?kJ|2mk;807*qoM6N<$fJr-l_Ux&OXz?gox`B0h)zU_WJ(Z4P-I<%;Ej;5DArYE zWfvWE%b-9(>7tvuD1r_`rj}t@l5X0;!|JYw-G9I7V%b%}t{Qk@m~ZBt`Cev}i10t= z_}4>Ots4`?fu1h0$KX~`j=H&MCjeS&48sT~iU=Y?C=`nN<+XKO^LXfRxn#VhUV`7B zO6Rcxx#WHj&56L6-c@T&Yel7~?Ky0%aZ5tx0%Edu;q%8KYVY4>e$i>Q#1R`6(f|<40w6wa4gkU7Q4+^OC>?~6F?!y0 zF)|oHIUNioC*rdw*+wHkn4lriiDjDf_x0lOk6;IF2ICBD9l#2~lI#qe65^-Vho}D= zB7!p16hXw+UM!ciW$6s{3}MWVMJD~2y ziMxAU+0Cz+xOz_#3iFh^ylkchhGCFebV1eEJ!F9$q`jq?)Z#O0sWS=V{Bad%ZRSTo xIsP#Xhl)xQw6N*85BxeF?> z&?&VRK}HW;w1^0$T@NCVv>bIbb;h|q?u>JPzZNk*uvVVkIS0Pyd%ov;gi?yFgyVmW zmacAe1X3zAO)y@c$=$s^0Hl;?ng)PKFj!x_-rd6vUk!1~A{q#)7#8~Iq|k-NrRJs$ zgS7RDl#;gY9z^X?>{tvr7gFV=1^B#P0>#D3R+5|k-pv5EZKG)#tzA7N73Zt@xeziK zRJ)U1RHyAE8k{9CKI>d$o_a8mLFkI9%occ@I>EPw*CbHYEZg%3W z$4_`M_(4@yR$y3B`d;;uRa+?vb4qyI*{Kd4^NI0`m&v)&Lie?njlYm!(RjE@^bYi^ zmBj_>Pc(|5fNR);05FSh!P8e5D%tv(D0(JGd;00000NkvXXu0mjf D52Zsh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..9213631a7f84ccf539c262da0378115878150234 GIT binary patch literal 725 zcmV;`0xJE9P)fB$>OOM`C`Ei*^SaZ)2&hzk)J%P@){un41|LN_gm#Q4Bkd3NU<_|A8}^Bp0jWHVv< zU!%F(fr`K|B#I)KJ-D5F*);$dhJm6e0Ejq)wZ&FPFR3+lV&O2-`AUjdgy3YpP=&(f zGxh5RDQgqMFlcl1BC0FVBN5D=*Rr;xgcIdexQjkWT^h9aJlhDM>pF^}(9+#YhHXK5 zm)w{a`ej~nI=fTsc-?-|U1^LizFZMZ*Y#BmR8<8ar+85wEiPy9+pw%IE=H=75#JEg zvu?_4R*H65xbJu<0TEwC0jT@6OiNb}KHW=J(mv|;+8LjpB1_Aq&|FGJVj>w^Q|ah@ zOkmElvhE6i)HDDROD>5U@2}&Jcqq%>!*~BU?%*8GB_G$?I-sIKl%BdO0F#6PZ}nQ_niiN<2YLQ%ZJ zk0pB>UYCd9=&(%Bw31{kWi0%YBR!#25e>sY6#~!4R++zZ7olJnEoBRe5G;!T4QEf| zUj9w@-8-@%bWW6K=B;;P+(6+#1aq1Rm&b=II>OAC09{WWplKSFwFmxEPB8K2SUtII zO>f`{@hbe(IF=vMSWDM&HnL(yC920*j5$kD8=y|9LUncm>O?W*j%0*Z)GCMQ!;7 zG4QTk#+IX09KI+*u?X(zA6O4Hin-%CE5qW}7n}V?g-ymE8Ql$yuswIm00000NkvXX Hu0mjf)m=Yq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_destructive.png new file mode 100644 index 0000000000000000000000000000000000000000..2ade6647c2de0037e065f4470e7fc665eecb151b GIT binary patch literal 730 zcmV<00ww*4P)qg({lrWTbI6j_ZkYU0PJGtT&&_x>$pCdFELclTbn_ndpq6;eu; z6PEuqYMY&?2uxF=C<4#!WNxJt17MmailP7@!Uz@?FFD(YFD@Vy3{vpES%!Q%&t$ex zg~HjRRf`rW3lq~csdu&^3U^}YIwgIra`XCZw&xa67TqHaY0}WrzI1?L7$}NDU2_}z zR`$!u@d=9FwMwgXH5SJneoxKf_S(=scSH_m7{+1>0DYYoq$4w*Z(m=L<;X@=CC1Do zpFDmNV=VXrI=8#KNGhlnVJZs1fiXXIO)Z!~FWQDYw&d($(CvbR4AkUYtkJR95@NXS zY-iBzjnIv#ATzwYsVc)mZUFQ-A5kkL0Yk;*>Zj|)W8T;@#oW)2c!qx#=A1Y{8etBmJ zg+ffvNHlYtq~sJvM!dxL_R0jCgBZtFz63`pZ3+CPV45bX5ae{%NqcGD@fDbn`qG*C8dS)kfSU- z-Csp|ea%uQUcL8#f#;2K$F_U|MDwJp1Alp?$gpq3eWgamRU8+d>T}pH*W$cbyZ9Hv zDAI~giJton(mykY{qSiK2;ea4FCWD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_steadfast.png new file mode 100644 index 0000000000000000000000000000000000000000..1415d67fe644f3fe5604010ffd5ab8ff1c3813f7 GIT binary patch literal 723 zcmV;^0xbQBP)^hBGxrX_M&~W@=dyh)yM@XcR;cqzj3lMQN)jf@Vjx(cW~_2nIBFI#G>NJJvU`+ZWz5+rh_g-$5k zINz|Qkh1!qX&P}5EOYSOm;5kQRaXRbIvoI(V7@FrT}0-)h%BxsB+F{$)oVXf zV?MUq3)p(D7I)W2+3xB~<|qJX=R>q~xlrd-N^EAT>klw7K1+693dMF4Y1`6BH>ES& z(aDbmPqN*lfHWEbFkRax9$tS>AQ0tX*$%#sF5>$cWXUtn+uQeWH`+zEqfP`9QL1>k zBJjd&z^K#V^SS{D24axVBMouJzquLj9^jLGQN$-lnej~^r9>#=A5$=Hf+a8Ugi2h5 z33?zaCllYo9QuB@OwY*2lwZQv$S+R0!Yd$YnubmY%&j9*>!R9BV7>(4_ocL?mpl9$*137KY z>q)%d^Nh*I!*X|JDHtQXc{+sFbV%&66)<+QM_Mmeh?z^bu-$dwY;~;Ng=H7HjYq`D zgCQA=hbX*yQiKyR{8Q6pUO6T_b-R+qmeCg*-A08C#vd633)*J4@T&j-002ovPDHLk FV1gfB$>O3zm;08=6Wj(#ninWHE%Iq7h+>C?OPFB$ycyJ?ODZDN`&Y zkV=pcXJ{%iGs;%A)D{tiE?h~EnNgXvahj(ybML=Jj1R1pXLrtl?|kPw-w{$uRuiWG zHJbZus0a*0q9_9QAq(A`DgiJI14U5)5D5lLi??kK(ksh|MEfp$dho zbv4TdDN7T>Fle(m5aq?_(I_Qv2j$+QyRg<iP*oLxs*p$SsV;*4_p;zfKB|-iKE1*1 znq_xsHrYiR>Fw%~9Uu~`C;%sBgS7P8iT@0dY~DvcBe z$HC-WaADmA0I6vJj9xq^hA-bF7V@(BU;)92al$?~Gp+!)E#=A6L+lnexvOkH(qT z=fM-el54>;_nY+o5t(7mBPFkp@yHBS_VA*JhGC!zL4Iqyv~1r-I20z;l#CPt;SEvW zbQ1q;jQjVxWwfzI958QP?!<(F0?`QTG!tI8pNR7dpPfPM-F7rBiNh7ee<>%K7&=x% zcH51WPQ3g08P1*uvZ$n-h-TvL(|&@D$38EkYJJ3 za8|tQ?3BS+oSX|yA{>w6{oy3#e4UuA-m)+(VSTaMZ&X-i`~gu!4LhIFwJQJs002ov JPDHLkV1f#eM92UD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser.png new file mode 100644 index 0000000000000000000000000000000000000000..060fca6704386ba0e713641bd68222f67fdec5f7 GIT binary patch literal 719 zcmV;=0xBB+cgMQdS;idF_e8)@$%YL%NZsy`qq zl4jBf!fqHXLPCQwGJ?E2W~GB)HWwvF=lZ@aV!U9jJiBua=bY!9=Q%U&=0q6K6y3n|AwrSlU zZLK4vq|M!ls5?Y57Q;L0VbB-cF;H?ELOCed}B%k2-ysXxqIFoYjT zRd8NaR+VE8O7%6K5Ox{I(9>93qXFo;{A9yALW< zS+;^ARbv4-9SF1gc^BD@4K&6RWRHxhT@__0UFT_UFO@q=D9(4`x#w1n1N((xNng2{ z2B2&<05a_v6c{-K;t@=LfaPcmyOBkX)5)E?w+Wdugq#M8i72%^TSd@iSZULB%-IGG~cyH-v7>!)H$6u;d~%@edYkb^@~|pC`T87Q>{uT#OF% z6FzoOl$|(-Bd?UK(rQK`evW&VR~twv(S^X?_nv5YiQM!wCWeN%biSE-cZW!ehGEvE zu%?FCrvdgEh3j>Y5)eY*9U8_vK2CdwhdpgK#M@UdsNPzPZ~hzUv1K%?h3=D0d>I+t zsKlEckN6#r)6@M#mA15qnBicq=P@NkfB*lTnP${GGB}to8U!C0q>HF96^tyXhytOgh}uN^h-hhxG9n0C zL@g>DOAAD>Qd(353KeJ+hA))NW|+y>IM#KX$G!g+F+QkPe!FuH=Q|&K-w{eFHUiuK z22Cw~Gz6BVkWvubm(SgT1^_I}LP`mMNGn*|yykBsyP=-c@-ne_oY`oUoUsWsA-Qz= z#JWRrZDCm!&HgsTo?6UA0-N1Ve(<##o%q6Bp%+tG+-Pn8o4_an7LfStnTs_9Bug3MO8tnr#&*2}2{3WVxLfMw~kjI;h;$D0G{X zi>HnwrTn8nIUE3Fx-uxxvza!2GBxvqrNk1t+lklf=GN^;EQTUPa&&&B;?&c%YGbEv zr&-eohXNR*UFz_T?JOjtgah-m_q=5$G=s6FL~p-xD+96uR9E^anV9<_dNG z9o4oZCGEal{p>i%oA6(4TK@}a z6}sI{&B61+92&>4mdUhxh)jJ)1OtRm`c{smqc1l4jgk%GH}rxFM5xEIPyhe`07*qo IM6N<$f-f9CdH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_destructive.png new file mode 100644 index 0000000000000000000000000000000000000000..02b5f0a530c008af3a326ecd71f9e1f3a333f7a5 GIT binary patch literal 727 zcmV;|0x127P)rc3Z)dgf#rXL zidq*M0@GATDR7@T$itK(08G1rUpsF1MV&w3!hyw69{w=py!xpld0 z+adXPVVWjYt_H-Z0*qh~i`B}B{AViEkk-o7h%5PSZ z*VHDW0;}MeAuT_j;O9P$>uK9D#9-qirQfL*LEXV@XA>FDY}S$v5bo{4ef2iZ>Iz)7lbz60%A!- zK~y-)rISlYlyMZrfB*kCFLS1G@>Oby;G?2+Bg%w?ku9P{MT@WqL}<~jMMO(mlpzJR z2!e3oh(=I?g%S}hGDyQBdTHgOY^HBe$7$42=kb027BZSxE6?uU%RTqNIaes9*a$5D z8#J}~&=8oWLP|m4&^GSm)d66dCQ?cOL`uQm&8xmn+;z1imzG$J#h8vn$ox8rCL|Zn z)UP=t|1M0^q}kVrI8cKTk7Kb~arOt)m(h=e^0P3MNlW{^^#q1tAf@DTTPOC~8X_}c zeni5^z6rI{Th9J(d1^9|WWh|VEEVlT~U$R5lSgegrbx`>cV;WAR>{(@nTHvuHFMmGB)xRd%Bx=be>nYTgg39EnF4{ z7fzoI7=!RTAJoa`{F8rX_{z4kk;3aibZj4ck^rTH8;;SP}%Df z_E;43AO&78@wacNauuw#F%=+$U})qsp||hozU!l?wOPD;@|cR;A_Bj^Gu6xAL@{7jc(|$>$F!E-Ygqb1TWg0Rm?)QFyHh-<77dzmQVl zvRc{OcvKjlM~IqBq+30NCw?LVeuAe8SB|BkFE;v(k`3YyeN_rt>N_1%00000NkvXX Hu0mjfYf4C_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_vengeful.png new file mode 100644 index 0000000000000000000000000000000000000000..703888adb39f71a9630f3609a88b42687cf2024d GIT binary patch literal 723 zcmV;^0xbQBP)Kh!f=)u^1Msm7~LN)%es`0y!BN%A~2iYb$|a7)U9(-P(!0qMW70ATvur z4u9~dL*<2BpPW^5@dPVod~MM%jCBG{(^k96q_@A1MGekR3@BHw&W=6DS+=K=-|P$hIr3O8yl zA*EbZplmh((j2K|>rR$u!Ys`CiLI>Q)a|(4P98Kq$G5ml(5>?)5v2mpx{cksl}1g& z@0%s-WsfSYIY?}N8LvNpr*#0|+&nX-dxfw$kpAzuEExzX{^5enfiDo?bKfKpt0YrT zV`%gn;n{1rb`_9bP{L?rfivylbpq2g(S*R!|B+BMj4LmV!9gE2SMO2M+av7J z5cvG$mX#43{zR#syV=HMfDnR_sY!+g7kJX#MNUhzc>kt{lFWR(zotovg^^YZug_KU zWpr$767P3B<99sHNXuiTH#LZu?qcrU3-;yhXT`mn#Lyt#x?AMkt*7ly{pMdts?e=g zifZeGF)~TWjF4t^5&ZEJ;hn{QIdAP)GWue>-zeE8{sNhe2}Wd8NSpuw002ovPDHLk FV1gnGNRj{m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgempetty.png b/src/main/resources/assets/bloodmagic/textures/items/soulgempetty.png new file mode 100644 index 0000000000000000000000000000000000000000..06c8e124e30be16ae6dd8504dcb7f4ae0c8c0286 GIT binary patch literal 706 zcmV;z0zLhSP)WcQgL?x{b`t2ij-n{^^$$|o(T*02^IePc zOVfD$;wfELrwr%vB#m6LQP=fN0##N2W~IT~sc~W|gw~=2;xT&ao8*y02WUxVWxT~* zR8iNXO6CRe#s0b80;y9TgUi?Q^j_^O^P4FiAaIT(?Ld&1L{B zW#!abZIIlc`pcX=+~TIDu9lI>N%WjfAQmI;u(FZQ(80@1f?=x(v#JtW3GiTi44WP& zo=LH~7A2L*Ff{TCpNxu}f0khA8&XPyBK~m&a~aL{avb(b{EI#kn#R}ZX?$}txVw6= zS2a=5)XIE1!kK~8rjZQ8Kox?rsSk)oC%*TiR4hbrS}hC@Kd0vUCBaIF`nEPA6Yn@) z)v*1H1p^@jd7(n71>5$NMQwR%6n-+uOFQz)hq-kj@Zc79=}6YoDBVm+55 z+}uD0LDp&~Jn@W1S2Ib6ll-TT1h3x2b+;Gqt={dwP*7ntnUD*9bVDa$q_LRn#DDxm o1OtRFx{AXJ))%||MulDC4{g#5@}Ki3W&i*H07*qoM6N<$f&fWA(*OVf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgempetty_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/soulgempetty_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..e792af92ec22a9b107edebbaf5ec1f7dfd1e577f GIT binary patch literal 710 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..a70bbe96680b77e5220e5da927478c438dba7ff3 GIT binary patch literal 940 zcmV;d15^BoP)Ofj~4tBF02x42DJafnD6#HN`Di0)u2KUYe$5ZP)eY`~Lk<+w<|{JSWe2 zp7V%Oib5%+5E1sPcZhIn^WO?_qNHiKHo6XYaJgofJ8yKpZD$*|d<~~YP3Cpnrp3VnI z=ox+(d&o}f zu}!o+-OA#>fbkDn;e=Or?P2B>5diynucSM}?1&wb=(k(tSmOX5kB9emeu7;u<(b`0 z-26;qWA2>N91aIgrxVLEIeze9UV7cY@qIup|9FuvKR=+h_4V7 zE^VlXtc!8uWm&5$v=ZToqYgUclo*<(QR#6jZ@@=W>sBTwC)l#7O(v$NQMoMsm)=1{ zxU`|3Q@1+QcYEXPJhFxk>CFeE%2Q8eO{KaR{z5%e=Ta}e_7*kXCUjj#L|9*4i`(rc z5{VFrL^z+@rOM08F-BK17;4*Rz^AzW1Z7U@akA`xS)~CaV5 O0000Xf9H7~t{@I{=v`a146X?Q(N*x?OHtfL)-)|?t8lBeT5hdC=7&}b z4b7Qu8KJqF`Nig9we_L3u?Aa8czFxBy*QQuTMKNl%k6r(@^T-1p3?_}^YLuw?0?Sx z{}WYZrBoFWLH{_o+H}Sh(rFbLew29@{<%R}*}a(AcVk(Z*r~ty z;_Ep+zi^4cBWUxvNx9Yd99ANcz_x9?i4!`ZehMXuGqWtay~9PBB6%~#{yq8B*KVMH zWE;WbKk)OLPig~*;kquSX)?Y3T`80(jhoxV^a<^Ko2U=Pcwy5G4s4m_i5FXmSy_D4 zSiv*9!rZQqZIpNiYL+m~&0&r?DAoZabBX@lut;vTa)Y652o1cAkA7ZWXaPUBg zkNXW;J1?q{mzRgv>&0~)P9HnA{0q~f?OIqmzx$qVT3a+2+Cg;WSB6{maJGF6#bkOW z2_{%84j6_>Dw$%exf#x%0U#3cX($w;r@M#B@IHYhots}E6^oIR?OApYz;#{DU;K(A zCk}J;(A)6oX`+vpYUPdqmoIlyUbRcQx;g<6!zA%vjJf$VICmC^2qJ(z2OfjSrO$M0 zaS8o>{cNv(TCQ|oVf=Vl-|t`GXfTUEC+AsAF9Kk#WFUX7Fg33{TV1Tdsz>O(`V;p* zR3nkdRrdbYLsQ0te8QIs5cws6C&R*;yraM{45p{2se80o1Hnq7BLkF&o|56=Av~Gc zbQD#9T|iUa%VH*!3{yB2&O=^1E0$px_{$45Toa(Cri#IVL5jB5%D~VNx@7a%OK%|} zbQD!E@!oEI=h`eMOLLIAGs}Q%^;b|*T&OeS7qq|wy`_Zh}JKc1(iWJ4(cmpNVM<`i%jkdP^ES3Mofxubn z!_Tsj6|l^p6;F7j@fcsG-V=bEJ37Q0Z=kFtEt$|S@?E4Fzu(X2?>C^Y(Rs4=ZRWMJ zR5kjPR#sMq!{NX*4bGfAS+HKWFkX9Ex-WO}^JibE>YY1@jSTbhp%@dl&STh2;;C75 zz*0;=({$3QG`CNjfD7#a^lhzDyLMG`?b>yMhxQ2ymC0tvPG?zf+fYakz%)%R{BVg+ zPJK+vvEy+546#6s3WkDQ?d`$0e~&~W-35Uzq~iC;EN3u^3q%AFAeRA~M&GwTs!C5K z0|Nu>c;;#8>FuF;Z%oZ)KgGVTh5Y?nEH7mN5dK&H+*cgl9#FwhkpAEL*t|O+Lqkyx z4)>z0cW^aTDS)Ya#}Pw#_@TA}fu?E9&d&1O_Mi#{gTw}J;@h`dhK8cp)|PO^9e|vZ z$@XDcQ94$!@<>@LAABWZ(KHQzg-?Y;b=1}D;l_e!N3DuzMIwHd6En9K9TqF_+5{U%o z8uO~Wyd1+Y3eQ)u#lyzDO{KC6ls;I>JUO{LKDO%18?6_~<#L>U{RKn>(=-W(!;FoM z70h>e{b1zLY-?Fcr`Y6h5c|D{W4#{u{km26v=1~4vk00000NkvXX Hu0mjf{`tH~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_vengeful.png new file mode 100644 index 0000000000000000000000000000000000000000..6be3b218064e5daa191e898de1e5c123d6f42340 GIT binary patch literal 939 zcmV;c162HpP)VuHpGK&KLn zjYvhM+JI>jOGOQo7+tuKm5{K2#1?7`g|>rK>w7(=hF2>foyt(J* z+;i>`tu;%fwMInH@4WSYGqVPYA^@~?_KKE&Ko%gk8VaV7TrLNIQVOj#wC~g7UN1%W z6qC#($)L!lQ_R~7?2JYsvxZ|Wm2z|YW&{`JG7zABpPu&BA(<2fzx;~Vvf%!;u(B9# zPjf1j<%=_?7-z3OF!Qyf+MdIV$K%+xjk~)`Py6by!V~||&T#tA8FVDVTqeV7rK@$9ZgEcjL zT9}}3&l#=C%F1xN-8fE;p2LUpS{Nq1{-B)y;Vj>GeW(M0jfAiN%=M>2d=iP`D3j>l z31AU($pNJdl8GcYJ38RRF#v{ZE#1`I#L%T78n^5e7SZYXc`~yR?k#ZT-2-qOhZEm? z$DywG`DlMTeBMLYzd<(!{0t0Ur1ps|a^b>x0K_ne&&`saUjWSf0uez3u+!jD44?c` zS5{YZ%5e{Ed%IFE<>AtepkGT>63XBH>O(^Gt(R2Oi$U$j~L$ zHMPj_@K0>NF+^y^E$Mp$4KR>M<1$PzJ$VL7DWcIR&o+9s-``01+9qLKZ(W5BHu-7U)Xde+n9;*G#7>0p}@ZkClSe8XB z79$pm;q2|v<>lq%a=Co?D%MxC%CU7KJx^"dur{+OCv4&&~lC$VjtBd@n2A~=pi zFc@TVaxyQz^^gy8cTuiFvdILi-EP8{N0x_|H1c>nh{!Utsi`Rd{skojQo!o=D24z4 N002ovPDHLkV1mw$!A1Z8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel.png b/src/main/resources/assets/bloodmagic/textures/items/soulshovel.png new file mode 100644 index 0000000000000000000000000000000000000000..e3fd8d62c5a57bfa5984ca51761fe2ecca858a96 GIT binary patch literal 936 zcmV;Z16TZsP)Pl{H8{N%PXueFAJ$%!k$Hc$A<5Yg^-wjHPxtuC4E0$EpZCoqiNmd+}+B!N@JdmK3>Nt0}?s^(#Lss3bcS(iLosh=#bqug7MVHk)ArJn7$-ERDTKYqWT z54zSVDk{P>O|;h7?!}{IWan~XM?DWX9L(Jf@#od+8!l{lshdP1fn`~U2%X0Q^bF)6 zk|Yp!MHRU*As7qc%y$yWfNMWpK}4`DYs0B7mkSZuAe)|^2H;=)24MW2>rhw#0000< KMNUMnLSTX{MW}uN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/soulshovel_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b51e2639056d9eb6aff1a11adc68d98cd5b04e GIT binary patch literal 945 zcmV;i15W&jP)mStI9c;Bao?b39Plg!L- zX8wQCT9XW|H6p^5ga74{akI5i17t5~Qk6}>Y7^2PB9>(Vpp-&u&DBPDT-`^;Gb?dj zC}ns}J2Qv-b>8{4L?UsrbJIb=+|EZlmQO{r*8iJ4x#t0Mp&8cR+RVM8A5rh!&_<`1 zx;OSR78@ZNkI_B)2T$)zQCJ_v5e|njO_QOMZYK9Uz|~QL3mEdW6M4U1XMX=YO>ggG zB-TSv&+zl*KJs_DneT}u$ZgxkFbv9$OyKG$0pR||OGKLcb>??#XxdlH?eKNR;~_3y z>LLG?XE8%ID>HJ)GX#~~y|$qVfT8EwnX2p3>pFexe{%_Myq& z2TqA2`2nR2a_hz^JG&QvK=W=nH~6Bitn|~>b%isX$LJ1>B6m|Ls-I=7p;cChMgiEi z%~#*H({l1CIs5VqiLhuY-P>=7(TG!PL) z0CNsf71u6&qc^=!!SKj1IdhqkX9%HNQPwxiGuCigv^vj1d>#NtQi+}w!jqV0+ty<3 zf5}g8UoUB4heWd!mzPe+u0t(4aIjTS@K?B-R7V=qI1&U(DJCW+sHra1m6cog?M`2! zI75+|o=Im(1-~pFmxrGXvZM`CB!ztECp5PSqLjj0R;bOm$;;cfGBh+u)>MW}XDJpU z)4W#Olu+rHA5p*icP1l;ab%g25ocV35-di+DU9EXzV`jbmwHp7h)d4pg4N>0ZUSImcN4-DMZnywiwjn%K6D zi160YFlVpjAd(;uUs*Z1aUl|)#l6~1EFA`Vdk_(9+g^66*Xu<@mdQp(M*;W;r=nrw TwnG|l00000NkvXXu0mjfdGWSR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/soulshovel_destructive.png new file mode 100644 index 0000000000000000000000000000000000000000..42c62019ed8dc8e9f0aa4bc512adcf205b4fd244 GIT binary patch literal 938 zcmV;b16BNqP)- zJff6hSxPBHg!8Zd8(Y?{7wZ*3#G}xnCJozLgq7EjSS$vBrfDdpxKIz1J1>*6b`92! zLWVNic=(QX!e11%J_*3_t5tI9%6-b|bkcdDlXLBjjE{^nJYk_WKgh9j&9X`q8h~k< zeD-A`^b^jD+?mR-EKT;6~*vbMkZlr9|?I-Ex9w@7w&HnCU?r4&gwBMW4tC9|#aZEV(brUD@*`i2v}R6bWvG#bS;O+^5lN7Zj*bHG51}+=l*g+YsQ>@~ M07*qoM6N<$f^}K9egFUf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel_steadfast.png b/src/main/resources/assets/bloodmagic/textures/items/soulshovel_steadfast.png new file mode 100644 index 0000000000000000000000000000000000000000..da2e7f16b9fb001143be5615c8dc8b7eb0639030 GIT binary patch literal 929 zcmV;S177@zP)n_xb<;11?EK zK~y-)Rg+&#TLl!xf9Kx90H;N|c8eBu31y$EuG`#5(p6hs)i@gyR|4K7`sR!T2Mi!kp zq%fb9m>8?Ozu49RK=_Uj_l-WOllS+qb8jY}~Me_`)1h?z7z}dqbQiKYjcq2t{sA-dIv!TUwd#Ojm=wPB z2Z0mK08BZyy#H;3*4Ni@?%Y=#eETdnhJS{fD-+9KXDz8EB_)W+8rk^xH~@bGXh&aDnY%4W00000NkvXXu0mjf DtP!nm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/soulshovel_vengeful.png new file mode 100644 index 0000000000000000000000000000000000000000..11c5263abca95089c85cbdfdff771409c55ced87 GIT binary patch literal 940 zcmV;d15^BoP)wn zyc1oF6S*M9EJkC}CB|%K8zZskFm7%u$_6N)!LXT4+(;=DTV4u%|6Wuup3CRroag+` zc|$G*fBchc0-{k3?<0NP1C_Y!mFJ)g68W~ilD+<}M zdk<=00K-TzJ~6>LBSp)M3q2l>lTN1@>hLnXa~#jf03Kk-7v{jVs5(~UVQ=%(sI%X| z>@25-F7u?rNyIb(7n*6BSS%K*+Hc}H8315x(`gReimLG1b?kZmMHYK|$lSWgiNOIL z&&egGDV%vO(AT4_?EYNqegKB<2-EgkpXx0xVednYuxN1qdxwckPSRv|5KGPTSH>i1 zEM(ca-EO>IFQ%D=Dd=<-HOgbdlW_bCY9856Fc_r0rw60N&zx?h-)86F!rgqzKG9b$ zplKEgUig!$qq_mMJ$QD)KP)}c^kN(#W^6S_r(OefTGkJ7dn#Cy!4Zt)_KK?As zTOEhUfA$8a?mR;H`^~B(P{G;$?-+UXC8n=lR}ul<*WZ-M`F1jpZ6G3u0O=&y zGzLHaL~Y($%g@8ZSj;>@Ur(&{sau=M=7|6uY*Rt9u%PT)KFH zCBrJoT#dFPyQFJB>O*U@08GWtW7F3#i_R*8si`S;)ZV4)8|wKndXXi=Dt|jPZ1x<^ z1Zq%Y1A^@e#jRVhij~{lZxiYgbWPK!D)Xytb+t4;a35EG8iZw+qzg4vVwP=BwICv# z3Dod%)9*|t-oWE}mr$2vLsC&)LwV5#wfs@1sxB{4_ik)pV_gu7#e#@XR=J7N(o$lv z7_nH44_cS-`FvzD8I)4!%Zm%Ropve@cj7H9p)7YswpspgfWkIotKmyE?@Wo5y3Rg)uj6Uene!|+34sf0RI5LGEVqz2@-Mu O0000Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare.png b/src/main/resources/assets/bloodmagic/textures/items/soulsnare.png new file mode 100644 index 0000000000000000000000000000000000000000..37de2c13ae0853e26032a858163c04539e323c37 GIT binary patch literal 498 zcmVLRA0&0e?wE zK~y-)ol-qWLSYm=Ul{%DP8F0S6-1HnK%t?j93p559EB(Zp(Q91$_k`GjDE%-aS#N9 zf{JGik|60&RJ1jQi-eSgyM2upIZGo=%_>@L0OhH zXSx<-G8q6sIGLtD9AVY)j}my9f8qS*c3F-AI;*Lr2Xf&RHw};Fp3CK;AXyW%7r$Ws z`33o>M=Z}c;qiD->4n{HugxGDzvA5F1d7EX6h%QUmlFUWNfJw*I2;b4sW*CdOOwe& zJ>L9k>>Q`d;OW&3&TfXdw7XAT3qo@08|)3RwY`Jw<}P;kTeuWF&|FgG!Mpg1#guoQ zN4pz%Qwq4xW(5HBNmi=r2UncqqGk>{`vw>|OtP)RM5EDI^<%GOqc3v$i$(d2=6(yU zRvS{ObGUumhy}Nxswy6`StyDE*Ww!7V?*NSwG1WjLhJ;-kzw3jUkU&qK($yvePc6J os&J1E3e9_0($^bnO$q<4PffwF)2PD7lK=n!07*qoM6N<$g5TfJkpKVy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare_corrosive.png b/src/main/resources/assets/bloodmagic/textures/items/soulsnare_corrosive.png new file mode 100644 index 0000000000000000000000000000000000000000..a279a8f03396201a14ebebf4f9c546e70b9def2f GIT binary patch literal 499 zcmVt6r>0f0$F zK~y-)l~Tbg!*LvaUnYeAfMS^@Ma^X#+$1^3U*IrVldQ#Iv>CZ<*^l{0VRcqFc3JOu%R*7)Rk2^V>-I+`#3X&yBf$$DvuWyJ( z1+_#`REWmMHvAT7%< pb{CTKs@$y8P-(4m=g%f8!51c#nx6r-xQ74$002ovPDHLkV1hWs)UN;l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare_destructive.png b/src/main/resources/assets/bloodmagic/textures/items/soulsnare_destructive.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6bff2f3f806799f2d699b8b5b65200ede47255 GIT binary patch literal 499 zcmVz|V9d2+ZxX8TbA1zRSjxnH28g^{3h{k#wnAnAg-xxKo*GoaNDCzzr#5XO2 zm)8vXhv(t*`S3Ffx7%HOf`^MRdpxtqX0y;V4e4}R06>S+$?r`1JRV`{_wg!3Ns?$K zn}Wh^%x{p@)lr6npGM6K}dly8}JCK{|czra_TB(Y5yFKs6_BJPDk(q)ij5W42*VEPJ z!s*E=Hq{|4tsNt$6RBhhnx;XW8$fHo9bxwtW7Qa7hkjBv4=u6#S7|Q43;NWZH$b`-OEmCqs&0!=_ zRt~l#CQfP&oHmV%ebf5B$3goT-|FL6Z*Tp6J!0I=7$5SqpjcdwB5A2d}raAob3RplbBR%_0SZFQ|&oDcrmLQkQ&rjd4g zE5hLj2FCn23#>w=hD0I`MN!Z<>Vf3!5Pqg*$%19~F{URwae03w001>o%_t}=Dh5>* nlCxbf%=`QLX1}$eg#XqDPl2}3p;S#900000NkvXXu0mjfr`FVK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare_vengeful.png b/src/main/resources/assets/bloodmagic/textures/items/soulsnare_vengeful.png new file mode 100644 index 0000000000000000000000000000000000000000..251d1850a36b6cee87833a61da9133a3d2fa8533 GIT binary patch literal 496 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_corrosive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/soulsword_corrosive_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..e0bd985f61ed278c36c652e2ec8c0aded535e033 GIT binary patch literal 862 zcmV-k1EKthP)sf40_#ac zK~y-)m6K0sTy+q~Kl6LLv;}J*X%}MOTHJl3L|Zf^6$+))3SvM!cn}Lxgeq1OSQTttBb&`jtnOyJFYo=vLz|7_$$`1d zFvHAuJ|n8i|FPHg7zTsIl2b*ZC<4G3!*VkbK}4EGBElYB&o=uMYtL=am@xpJ6F}IVC8W*`8Q&l?c0a`C6b@yXA0M1T)!8&7!Ei5b$1OblYpsGAKG^ky}?J_#B zpK#48RvY2ekfrrvQhRo8?MFy#3YFKX9tyL@xR;oFI?xWB#1 z$=~+Taz3dKK9r=g<_15R8Ro|W?tY;vkH{D?V+>&!a`@GwN@5iji?+<@sY5%Zd|J8l z{080Co248rPz+1Vf6$<3;7{pX9D^8`wzf7Bi3A!&OdNlMD=*Jz_sCt6KLa;DbamJM zEWa=LT%P|P|LjeYeSgW;`a4aL&GH4rai}i-(G;}xLQ?njZsA%m$JhQe^-05y!J71j zW2h>}*QQn)SZjH2{1X{`?QO>1e2MCa)ra?PrXDr;k?Yhy6*l(OWb4gQtc5*ytmCp) z0f?>K9i$c^2Chy|Q(W9at))TbOr1nuP4+fMu_#Zrv@^v#g8Y}V(xQ^?^7O(F?`!_> z4$buBbR;M+5)??M)9QI1leU1WHoZwP8f!W o2-e!BMyXT^5ot~~H8lmm-!YwH!#phE7XSbN07*qoM6N<$f{R&`wg3PC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/soulsword_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcaf3d9994f275fd3087d2ec6f7c8ae81780617 GIT binary patch literal 15220 zcmeI3e^eCL700L6sKHu^v1&9YZWbY_>F(?gcVWk6fv`&<%_2no{^W*CNHlTwn+>EJtD{7e`J{?6{{C&AbK?&NG9 z!zMl`etv|#Sv~{9V&*UzSwfceX@X*%O47#W&`Ph<4b&KBjPtrlY6UIGa_C&f6)XRD z{b9L`vBk9wK?dTOX`bR3x4^J2nHZPMVe^Gpxm-*XyaM;-bO#f;_y9XV5%-dAT&+~$ zBRScqppQGBbNH5Kqj1_mJ874|13&eMe(pS0VEH_Dl$62gQ4@ojSgpa_Bd*u!95FR7 zSXKc90i+{(@)-qg8c(NrHlL$t%PMdy5hLBbz}N?iGbEBYGwRxDFEfgpIOBKowSvDw zMsTl0B1e+~%Vn^v!{qO>v;l;(|L$sW&STsGFj|J;a&x(wEPFdA(p1=vs$xx{Xt&W(dgJVF-&=_F<*hqo=PElYj z6vsvpc9wIJf{AgGxis!}}s86Na!0o1pkdwplwLVD%U(SZpE<2#ew zB*)X@j*FEKY`Nee7CfUwAK%U;NJ>1-Oq94GXqyoqGCH`dpl861`F{)Oj}N(zp2L$z zyY982{GoiR(Sz`;UGR_`osbK9;=Am1f7GFFq2Z0Vc=|h-p@r~|4z15X#}2QjQ9RTL z&X~ zFBSB2?yIDK6g(_|=M+5npfa?`!Hw_(8-sWB0|$n~p(HR3NgLskL<9>EE|`X-jc`dK zf&~Z{OheK}xFiw50)z{uA!#FAl89gd!UfZiv=J^zM6dwif@w(F2$v)xSb%WBG$d_= zOA-+*K)7HUk~YF6i3k=TTrdqu8{v{f1Pc%@n1-Z{a7iM91qc^RL()dLBoV;^gbSu2 zX(L>ch+qN21=EnU5iUtYumItLX-L`#mn0%sfN;SyByEIC5)mvwxL_KRHo_%|2o@k* zFbzo?;gUoI3lJ`thNO*fNg{#;2p3F4(nh!>5y1k43#K7y-xF8Z;H!VM3%u{=0WbDl zZk!YaUJ8^^$>~-MD~!ajwZF%(Z~MXbbqvc_Vc3mlF^nj~u<7i!XPS~QY|M!ib3%sq z)3;t;w*HkxGn&`57I?Z6-zsUkuP)r46nXGwqGw6f#r5&iFMrh#-Vna*QBJ=p{KMy! zbJB#!xf3fQCmvK*D7)&{O;{Sy^s~5kv%8*rE;o-qbpF)kc27s|?fNqN;y)E#Z7=^v zd5^KRzc(&wL;r);jv}m_Z=0>vo~&MZ{Nz8+=A=%&*?sKb-##BR{>aXnCDqq&ZtN&3 z-xs-ypG@|DnbO&FczI{d>1#K-o|$}PazsSkPv5Sry#HvaY(nXWHyg)~y*R)AzZ<@K zZ)5$Ace>79d-z+f>P+K;uZzx(;V$lo7@H73)zY>4T4_V?7v-OQaC+DE<=o4A<7%#U zZ+K+y&VrZDG;X|g_P&ggN!q{gr?Beus&LB#msWi_ZQ_yxpLT!Uap^+e$7(^p=g)Vo zuRM@x%!qsFQEjO@#n^Dl-O|!hTU&dz_~h0*egElrVhi=-8N~L}duH`LeyeQbwST=Z zd-h}6(s%xP0NbB>aJF%ySwzz6R&+^sj9fJ|JAzQmOUq0U%Fj=yk-44WAf{Yq$$>(_TRb3 zO^bh&}{qMK6O>HdR-gfR>%NyEC!>zyPu8t#4e6%30qOdWo@@RW| zIkvsLygGlmr}M;?x*ONCo2wR5x78~@*|zVIU)TMHzO&_ZwKnO>{P-C!mc5Z8-_?3y zQ*A}@=FXV6>-$z7JC=IpQeW+|#?@Q*Wk#JWYAtEL^4bSWHkFjjiZ3dfZ`ZSZZ8sJd zs}{9^*iX%w;#nP~{cK(0(VsNjRW{{pO|LTVPWxkBUES_=doK}|rA>xr_VCho&GLk) wmd$hXH*foBjy)-SY}rGfIHs*#Gaegre)%`4OP{ic@5QEAQqB9HeD?YO0g?41Pyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_activated.png b/src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..f522b9057f3f6f4c4eea571f665d788d94017fe9 GIT binary patch literal 866 zcmV-o1D*VdP)GH!T9Vx+Xe1_iJu;LLa@?r$Xjyxl3QFF!`p2K7L#7hhAmZ#nm;@#C^2e z4kS@g^4Sd5){IK>%v_#fWA#C*?{*ALRPy?sWwMD8!-?l=!eqFHvCT<2vg=|`b5ws# zq;%wPyAsI;xwGAJXS)@RMiq<2aHD;aL@CP@&d<-&-qxs|?w8cs64PSlq()Lll}I)y z2m-k?U2>y+ibNucL?UIttYl+bYl9NWM;ZTloQuEBTGOsTTU%T7zx6cc86OP%NG_Md z%uEv5Y!N1FZ)=n*h($07*qoM6N<$f(2oovj6}9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f84dc5e93b0cc78748c25d5482e3ce7b9cd94a GIT binary patch literal 847 zcmV-V1F-ywP)S-P+1mGcWPQWLQ4cyPoFjR(Ge+ zIfv(Y0POc7*gt2II5+bGXD^2J;_gQP7(I6p)}XFfEK(|!@O>Xi93Sr0$-bziQ~N02 zeHRU$vF)(q>~vVq?A!+W4b}?PujL!67JT2QTrM*_a#Sb#qPBm;=hf3wJQlu9_`Byh zGxdC@_${;NGI$#nhK7!)nujB3`dMQy?;-r*Ud~KDpq?jVG&Zcl z?dxQ|tuWBEWQC_jH}WwgaqwWbJ{dc~vA5qMJzHj`ov{DQ7%c-z>cDGVlo8#tej?XUNM{3K8%|4w$67Sv>lB3*absER;C{MnE0U<&>>ZYuje5$=T$^Ea z>0ui0b)3r9^V+VW6%u3M#DS(TIc{Rue<>@hh+S<_{gO@V$l)#}k}Yx<`f(TfiAJM} z#bUVeK_u07jl#LPIl4MqHPC-Z9qlnK5Li-I7KJKu*JA0!fqC=!X(0JDu6 zJ3CsGNIuTQ_Y+*cnztR>1Ff&GGj!}(%rj05e?zHM!puw(g+di3>*{QktCUG36J#f{ zv_G-WKFXx=eIMr>kH%yAYgJ57Pa8m6TU!;ve7=f(e0x;uKYXCBj%I~Ip??jNnK3Xj z&MU`9Sy)(LadDCP`FY~;_@;%9_LxegY7UpKT(eLpM7dnX%(!z>gCM}n@O>XMBbUno Z@HY`hWy1|i?wSAq002ovPDHLkV1iQjjiLYm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_activated.png b/src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..465921dc84be418c81d8149a4c8cb7801ca81e1f GIT binary patch literal 873 zcmV-v1D5=WP)KwH3%JZf<2xF9feF))`|UhM1TLm;r9YKbI!+ z#zZ%8L6->V60*gp3^YcG2{&FCrdBQpWo-pbOuH_VZlRN{6uy3Yj~DeTaFTOzPI6A3 z^E}THRmBfgMMUbgwH6V%r+2PTRUA+Y8C3$-S^yl!xo64ULn1<4AL7kJ|LEkpFHtc7 zY{Fb@=$>!5+>FfsJ()VNBv<`t%sf6pg7-LXXK6ve2 zjfYP#eDHbkmfy!RM@UzO^m6kVnp>Wxk_jMFHFR?(SUbTOgXeh+?(5fh_ynIUyd$rl z{FSY17Ma}jr>54QV#CJm$kYnVv?1$`(6G3l^brxqKjG~?htyh&T6pBzf*yZ$8)tX^ zp_d*$MYJserR7womdM^3fg1-&3>Z;WoW{mRnwpweQf2?>5I_F4j~$WEc^{094sRZS`$9%d($vKOZ-{6HK z0Z~;xYzQ&D3`9gwRi?^H|4XlE&#^&%9{QRsFYm=&gz|5e!tJkES?(b*5D-;(c10ui zi{XMT67Y2vfwH)$8m?s1tj<QT6FVDuqI!X7kwQ4z=DAU0qKwG4Ts+@$E8tY#3t<)>EC>D!EqtW`0NPDDBT|6Ae zA$2t+!C(;2^AHj4{?t$?got2_K}5)8G64Jsshw{P?O>9u00000NkvXXu0mjf_uiTn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..ade2c703399956000b07f4ce375aa695d240424e GIT binary patch literal 867 zcmV-p1DyPcP)i6Q_10`N&h zK~y-)m6Kg;(`6LKf9HMM_(A5>#StO_)>a@ZxVe=%y%4;zSZ55;7-B-ghuOf5_;G16 zZ%mXS3yKlYC1i_H8E6a|6K=RLOs!rR%GL!XG3~m{bqgJArS9MV-s45>z6$`++>~j*h zz0o;`F$RDRvl{v5PgUvZo@BJ)jBal00N~QOA#OTDpin5_c^=kURF!vjzp3%?NjY}l z8T`BM;7%iqmHN5da8?@{pP-ZuAQP4CW^J%?g0&Xk_vzc$tMTwj`C$GHUOx3BTUISF z`oiy|)}GdN>$f2jE3lK6ac_W{g)Zs(PzV@f@O_`x_Z-xE?m-el1%ZTO$>8y0SZi_4u_@B1C0!($ObS3#QxgE0Or~P{ zXgI3Fr)D&^zD0w<;J?BoBJA%QVDH->F*7s6?CdQ0e4c1Dx||Vdi8QN+k1>YSZz%}| tgZRFWh;VySL!l5Ng0&VAA)QVG@HZX5V&O>|T>bz6002ovPDHLkV1jf_mcal3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_vengeful_activated.png b/src/main/resources/assets/bloodmagic/textures/items/soulsword_vengeful_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd8bf57c126dbe81143038a60121e40ee9aab52 GIT binary patch literal 876 zcmV-y1C#uTP)hkkv~y321vAVLr|xpgv4>^#CB#7$F?(X-uteLaR%`w-{QMB z=jP;`dqh=fl&T^k&A+u45xJ$Odv+2>p6Hr(S+cCsuUg znEGt%)jW~^0rywzf9f+uI34Wpw;4cIU2e$n`kA9R1?1 z2oLsmQTx3};cSMZl?p>QmT+x!pEQIv4F?=Ys8mZ$K|k+|v-N>Aezw5uHUFw>x~+p&Mz=jcE}%mMX<`F%kCgU3E}3QG%Gi++}D-V zpU;lz;D%mZw<@Ln@Lu(Y_i8ekRL}FU!*8mp(stW_I@s$zrYVyf0G_Bp|x6#7q)Fe zL^v?<6~6ByBBH9~a=AL~-ky7Ob;{EnPd%>pdUxxS+jjxrI1VDhs?y<$ZG0000Yt&*4+(*#S5Vj5Hu68VU-F+hTi8-h9&B_xiIPHbleacn#D=Dq)QF?P_n@+Nn4 zZ_drhIroUF@_$PA?gnGPTC~!EL{S8QF@}X>B7%rCKq5k)-o~jHA7y-HhdQRd+jcE4 zv3~-swHRXn*lJwl@0qId#S0H}Jdx0cwsZk7cH}(9HX)@_i697Y90yh9;GU=SosN{` z<^#g!MKl?q-CB+(61r)LJ&Y(<|WfJ7fAlUnjL+ zixkdgIa;YOcyozdAKBj!*(^BVI6|dbY6$vSM?$yVpCQNfe{Xj?&VO$YX9amcD{oB*5?euV7W!6hF`&2=v%s+3H=j**e%~- zwkC)QlRr-~_d_==H*0({H_u?%k^EaPfmI$^b~{;02=d=A^XHU%J5&1O*-;(X*rV%L zr!^SbM=-RHR4S#O=V6ClM^zgw3mW9}dHOeQ(B9s)OnfuJsbjBl;^T9C^wl|jo2@aq zWxK?si91dlRzPyOT%GyCC$8;E>$-LKapC+0zPt8|bbCpy)oMJqeKR7$!SOE%f&dW_ zRmJ!HI_;kByLC<4)16N~ruTSv=@UD41K>CgBEstQD)l^1i^U?vViDJMab1@vit3JK zyp-NJb69)2IyD}T|0_%)!j9n&c>2Km%*@PCC={5Uo+gvYG%_M<(w+vkuEXUkKS?|u sCk#VG1Z!<0smWv#5os{XX0rhN1qx$eP0-^W_W%F@07*qoM6N<$f)25fXaE2J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/steadfastcrystal.png b/src/main/resources/assets/bloodmagic/textures/items/steadfastcrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..84733588f93bea8eb99ed41a4f488e33b9b4dcb0 GIT binary patch literal 557 zcmV+|0@D47P)D+r9>D>_X;f1H000McNliru-~${EF*oyptYQEF0lG;< zK~y-)?U7GNlW`cwKkpnb6J^s^n}S$FJY;VworU(Ztv#)xb^c8Nh4G6-1qeG{Q2Dpc<^rh-v%A%N0RPv6Z3q#AKC2Nv5;_RJF2+VV*+IQvGN37FO*0ziBID|@bR zMA1kCpoJo$>vlJRv1*9*&*NKzR|(2*MV-?@TWbs1Tp72|%_IxL;d0=)-o#eDe!7E7 zszT3YJ9m6N=sRDDzuQ7sDrE8o0Oh>F%f*i!;WHaK!3G?7Fs@uA^k42(6T6gDTcbigk;GivWIvIlcjy5fT~~;O;|%+~ zQk8>%e_nJy>L*jklHJ!yt#5<1#NmO#MmUOZe3Uj}ZDNSwh&!T6$9M12acX`0Sm*Y6(I1WwoW7CXWHc8_k zMNy=0ZLOBm)V#`*@4r(no1|PeNnbUIg#AIETFoLA@*DK{a7zB5KNT`FTCrMA)7Iu1 zJgMWT3M-F?CyH}ULI@H<5a*mY=k(+6`|IGJ=mRIdw86Ft=NSM1002ovPDHLkV1gji Bx3K^K literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/teleposerfocus.png b/src/main/resources/assets/bloodmagic/textures/items/teleposerfocus.png new file mode 100644 index 0000000000000000000000000000000000000000..d66e2d67559268fb0023c23552ded9babc79eb22 GIT binary patch literal 688 zcmV;h0#E&kP)6HXw(^E<*qS03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Ixs56iN&&Au7odGohj$gd*s&f+UIxx`0m^mNcOtA}B;CtW2{Y zU!+3P7t<_p7D%O=L=oC_+v#Btq*)I_=j|MRJ`Vr+kEklMDFd^tSp$rJ8rB?JtrAh1 z?{`V7PpLkTrAjQ7-d8eJD^oqFJF`|-m6j41>Y)4aTbP_+X>Jk*o0HzAXPmm(BQpYO zkLT&Sy@zSNe2MTxkosUY;mJwL&Am*hfdz>sMn=Y{y3;4qJh*-~UkmqnXuIa6@@kjV z2eYxeoD}ZaMZ>s@3%9yu)E^|pk;swa4E+t@Jzb!#O=Uds*5bMNTvqNZSF0n1z`K4b za&obxF2Px}K|5abN?*?ia}!J)-R6u!R27E>&K1OvVU6}H%1X4ly-gpyd9Bs$ZJM=X zyQUVnRaMDa2q*FkB+rX#jQ}S-ZnY-GaWHe3Wi}CW;a2W7He!m8XA4FEi%gP;t8Em*q3~ zvYUZHKM{=BEV0C!!+iZR&XwjN`D>5>JSFL>5ux^Bbj|%mX&N6R)HM12oy7nCOg{nq WE8<9cY1;(=0000c*jgAf=Fp*x-2S!D1w5ZplH)dw1{xgu4UU6EevYc z#y=q?yBHl zN^Ag*Mhe9e?72w*HOAL=q;@B1d zn#+aT?ZL7vVzD@Gw~O@RvKWX)0gwQZa9Hhatm9r+C;idyoS1E=WR$s_zD+ul=KR!6 z=2I!|1|O2o7bzKr+L%BB2w=6m%9n40n5N0~?l4`o_Zf;j=X9=bWo{5%9HKf{ z1;8%99{?AC0*ZzKz|m|6FM4|zFbBChdW)RTreda@H^E0pAqb2|fL|0!r9Xgjxs1>2 zM#L`Ct39UU?E_Z)pXt%Narxbtrb&J_PyNCv(oF+2O`hBu;<>YD)ZF|cjSY3Qv^0~> zEOD%Shnd_s9?gd)CCN+-d2j+_#UlB0n)t|w*v#PlhmQiFSS+Dw8eXr5e*Gy+&3&X+ zGn5W}#o3?4vMfx~LQ2V&5CMb`2m#~c6YQ?6#P9cEB_b5+`bd1Lz@xjS4;!c7 z0+2$G%@rsXOXP<`O#VoaHB!{p)?h1z$E}fw2Fd1fh@C__(%P!_wKS1PPN5u!CjA1c zCW@x%2q`e84q)yXVmX^%Q-3{!O@LC0w$@hVaq9#El_o2=mg69$!0**@)SA}0e2LMqF|lohzwO$PB-GZXY}-aii4+3cafq$I dyd&U$>NhLdD7cU++*SYp002ovPDHLkV1ks4Rzm;) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/transcendentbloodorb.png b/src/main/resources/assets/bloodmagic/textures/items/transcendentbloodorb.png new file mode 100644 index 0000000000000000000000000000000000000000..eebdd050e9cdaf112e9717f8095fb45527d1d3e5 GIT binary patch literal 1239 zcmV;|1StE7P)WFU8GbZ8()Nlj2>E@cM*00cWpL_t(o!|j*PYaLY- z$3JIYQY*1dv6dqKz*MW!2vS-@P!tL(SQK$15?%TaxR78Gb>T`^1zq@)E~>cD;!hA2 zt?9~YQqxfF3r#K5l%`EuV;Y;hH|Km^+<7lAZK6p?(M9iO<}x$)ob&y0?j5*1{^Maw z`KYV2LjaO!yne9%r$w*Vw3GyD0q08Mk|fa8*&!lB=1AhbZ7(8&X|Li6R!|}$aDQ0< zQQ)wrx6hUbfrj7!f$-dM0$1Px5kb@$6`^H7;K{oZ*SoguAR-uTI!{FK`N@9VoJu8- zM02x27`q>T2gx~e;xO(NB6cbx`1t38wqyjPRGlkQl~E-pMf4kKIhY}j!sG9?fag?Eo0yKAtK;`XSx7ma(oPOr@Q+lB=P9xr;wbMvqQLvQ7YsF zTUu`*BG~ccTPVaA0|T}o1ZrHnWkg;f0s@BsDIj+w$CY$ZuiS(@Coe%x;O+!Mp?M8I zX98(K7(6qCJlOui(`o+AcgUJ}_x+D>Ib#zO1n_3h8%Sd7hAo&wQ=B13tes57+?o6~=M5W>mxDsGTv8ItHdegHRPWmZKJrM5N5L}$}ANMdkPy8`&? zmqRvZ0s&aTX&TtK{oo=C=tP* zQ|BPWE4z0g!K=^igi4kEBR!a)Jn}0N5IJD1tV|IEZC9^H62lWCDVgf2dILkV)tJrl zq(l_z%?Su4&#Ul!rAlO0%o};NLJPu_C8tnBC+g^O!QDj&I49-(^ujKcdkm@|2{cZPZeupH{-f|m~7@hh9x8Sr-5r}nbZb1Q$ ztlxlJ@L72u5VV$B061Dbmbfnu&KoCN$l0&f2i#I`h=N}Qkj1QyID?i!#?sCM7mf$p zH%X|zOSWBcGm`VzwVN@)hbIpJFm(R6#H*#i-% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/transpositionsigil.png b/src/main/resources/assets/bloodmagic/textures/items/transpositionsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..e637b0c4d7f7d61b991ce48308930852186754a7 GIT binary patch literal 738 zcmV<80v-K{P)L3b>%;Fn=RD65N+|#$cT524ZfxUU zN~{BpG&PZP993Oe#?0(OzQO17QB_e&BAKQ%6y#~|3$Z1jv7teQN`jm{eS)EpaXi;q z1K+&GP{%zS$6;_Vg5R$bTaJql0|UPSO^uCeS5-OfZC7~G)r)Ca1OfqE*THoivY8w{ zzn?<~_R-h>hIk@HWO!Hr=l}x9WpliH{}J1^x!!t#`RD?lYQo%o{tRb%iObmxQ&ZEF zhDwMhQWO~mY0E+aD8S5Q0La-kJw_SrW3!|lc5*E?$5q>8s6LGU%sHf#0HiGoU=5JX zW>HFEt!C&xdW@ZK`)T_TMIh;jnMln~^{YOt$B*bTiZ-~Q15{O(u@GJ6%iu7VQfY2m zStv4Su`;x7H_$YloCsaG)WFU8GbZ8()Nlj2>E@cM*00Oy5L_t(I%XO1&OwC~! z#(&TGcM_c(r0CG9BPvv;dCOa5YsVKGv-!Zx3~OwCiqIBo%w|oN?TqAYW@BE~Qmtrg z#K=p-C>#9?MaQX5oK)xK_93w&?oapg?A~wJ?(4pki14q0?1o<~$h^!D1<|oI|_rp!ftQZoL zWBJ(OAbR{1s!DQYuYNW_MbL1gp-3tWR~Ov1G9xOC_b(hQUz@?l51;V)eK?&xL|dj& zQFd7J^fPLNf?U0f8G1G-NKQ>*(W+E#+^#2e?i@7DfTQ;lE$vNob-t(M;7)06Z5?t! z*L47znwn^+JSCgg+PHc39<@(jBASLZE}R&11PN&gc>CR?FI`Bn{XAQDA5#EYb8|EC z@$mq(yncKj+%yhLOe9MdB+~Y^n;n~Mn8%y2S}lwX3qkyT8lJzR>{7+S%F0TD(yHq@ z4&>zI;Oceb@%ngB*FaRGKGW5drI-C(_B7R#h?tJx4xt9N(}`&*HLV7PR6gurt`AcW_jLr6iFK)OU-BdA;F zDDskY?dYWp6p9##DP(H8rE|``d$;#}I#dItn}@!a2cC!L`+Rx$ennL|4lIrd`)DH? z32Pk+AOLo~`8!g8^{t=sPX)22h&D$f+T9rDj99gWbVrZaWJKa z2wG!NRfP*iX)PRZB^Ib%=+EVA)%2X=<)w2>o=$LnpjT@Ip64@S9D<$)z}U$G0JABF z=UZCBzKo=9c>qG#(kN{ z6m_OwX|35vsE(hn0g655Ed0ibY(v zinW#95!bDf6PwAP&%5miiIU45%jl=F%3dKX;~Aq9{NfZ8{YW8Vq}?WPj$x2FUK@B^n89MTFi+ zn1n6Nms}F{HoF+W$2JBZSauvD0@++%0OV+xTAHJ(zF)JlTdmfttiDn#Iftw)|2>Vr Y06IqhsH`LeLI3~&07*qoM6N<$f|xZixBvhE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/vengefulcrystal.png b/src/main/resources/assets/bloodmagic/textures/items/vengefulcrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e615b6f84fd8e210625a73bace04bca6d6c8a6 GIT binary patch literal 571 zcmV-B0>u4^P)D+r9>D>_X;f1H000McNliru-~${EFfaM`1$6)b0mw;2 zK~y-)?U7GNlW`cwKkr`Kt1r&TS}S7>D=2HTK!T+>tPVxsG3X+B2=Wji>d8y2C1v_X zx4K4jDk!>E2M;k@$xFRyytVMnvW4Nh_RqQL_UjM{(lYSe_w?{Q4O5Yt8l zz;bqh^kU)HJw`@^e{X>Cix)&ifH4#ids;(GTpt!2Yd7I_yD2U#(sm@oSmcUOw|HB=CPQ0$ z2OmGrVp$d`I|YENM#b%N5z`H#nzj-{`dvgdO_aVTnat-n7HnmQ&&$haPXVZDY~;N) zO?=AaM9U%k`#@HRDjLk*XYwz1C4Bnfhv#8G9c6t-;KfS-Ltq z+2z~Kl=+5WZ=bZv!TqkYqW#Qi?0kVA=``=AKT+5qlbla75q-fx&pCVz+j#QmG2ORs zNqVK?j(@^4Yu`$EQDBN~lTHOhPxC}jIV<_;@ZT3!|a zjfM@0Cxn6_iuywWgRimO3bE0*M2B;Do=5koEu@r(2>^r;fFhIqM5OyTZt*(sud}(iDUMX|Hzp^N%J==Bd5{vX g?eAayCxU;$58aar{pQl@D*ylh07*qoM6N<$f{eg7A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/warriorsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/items/warriorsigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..2c031b41725aa9bbe546a62017f20151212f5ff1 GIT binary patch literal 1583 zcmbVMeNfYO7_NAzuqjp14gAWgbHXi6(hu6i7J;UfibbpyaUzf=DGku1Hi5RBIL4TQ zhnrtF-I#bD$T+96c}^6!6YKYwPQAG~Hx;MMsRJkCPebwaw3S4`&@33Es^ME_}m0pNDF|S&SzM??DqZxGJv7< zvIS}jY;hZCCzD$0q34yR+sM*F5~XA_5&@kL69rtfKma~h5zAvfy{ums6W76GNCxyn zghIXSiBnmY48Xv7Xh1DjgCwj#01YZf)G8D~-UJjdqJ$6_QlKD$U@8rUBme`COtj{q z9GDe14cHQQdYMxY+!zFTy60tC+!o7IVU`~Vlo&F|N4OzG4nrtx$#UiZ}Yop z$V&5Ev4<4%;g}pEi?MsYp&(H72Akty#H0{KI7b${XjU-edYSk|PB9dwKnN{OI+P%( zL^U8qt7s5a!fMcACkcmAtJZ3i_K?oA_$Zp7Q5dvFSgT1u5ThyuP0<(-lh&A^O))0m zc!+Ced4XU_I%Jy>Z4Yqq=W;QFhb9EhW8=7@P!(i2If3JyoEtD0fN2XDmg2m8TrfjV zE{xM2ri7+U9?k{yhZtj?VP37G)DA?2fJy>}L6u#l1ql?Tf`bZHqX{ZnLCOaB)Qg4= z5}ksAb@IQu2_1>W7+gN>0&(-Sk7!nG9*@{1T{}huB$6bgl zqKX>5XiCH$|MjW+`Y`YJt5u7mbui3te6Z_$VlVwIc@Df zCZ8Rwz1mk;e~QT7Upn%7W8*uvunl9oleS39POO@Wn*-HXk4dvjS9IB9);QNEYfW1| zi_?73b7k_M@l{8tSLcMa!2WN-TW(D=na1zlRViQw`sI7RHc4w$LH)r|uhb<5emeMQ z@12gs--b>&-r3WXIm@XYmoYzl{IPq3sfEksTQj-O9|d|MyZ7n#_Aq0jj(yePi|Dk* zY-_Y%Z$`@3Va>N5j#?RTeEI96oB7$fxrY|78?L;g*6pdWR+Xcx^6PpBU6O-J!?ts= zzPc4>oNaxpEZ>e@mRC2fEqiPE!ano0o5j1|>Y5m{2?Z)ohabLr8BXkWoU+BMf7yNx zsgF5*ZP}Ig{F7>IDJ?Z4R@OJ)BhKtU-f%W`sl|T2;9%FgCF2{THh(lM?32{n>yt`q zas7?h=@nFbI}pEP?Ma8U!zg_}sl%5oX9GFsO*z;8eq-(jC#oY(0@ZMBR8oEJhwa>r z3mbKRUF_Y-v{jWFOxjVel}YqVCq|_;t*qFy&3b6qY}1;O-u&%pov}ZV$gaYn(+w-) sqVc9%turITm;aM_X>=ZRXHoeeNvvgvLG$p`$H8B?*_e*+Ov$VG7q3iBiU0rr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/warriorsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/warriorsigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..adcc645ffa63fdce3ac66fe804a69807fa210bb7 GIT binary patch literal 1580 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/weakbloodorb.png b/src/main/resources/assets/bloodmagic/textures/items/weakbloodorb.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e494d6cd9588a48741d80170fd0a4cdc19b2d1 GIT binary patch literal 1220 zcmV;#1UvhQP)dh?u-bEV1=fl7OkODiXX+clr(MAX;PXrI?ZI}-T!fM-kNn$BSfh8VG4xp62I5qrM?n4K@J<)PKIddtuZtK@(8)6XCI#S}17PI2y$KqSfd@>ydi0PGy!-iA0IXiQ!AWBHg-8D# zfOaY%fhk-i|0}t9dy14gGM^31KYeCz*vQvG;>3IvFHx%rNfb+lNqq9qE=;0lRWHbR z<=ChI-uwC|Cy94n+=yS{vugSTv)7tNq8AvgtDZ(qU5=p;nJqszjG%7$_ewQ zUj~U^YcrU{)}c2;?_RqM9^OB207-1^TZw>2Hm=7I(^qPkjK{l*7-H!7(XiR_UMIoG z@2Bz=xXI-)f*f%%`5>s>KQ2X64fyCh(S1^hG?b|UgMvnc0yf{5|5dl#lNKagf z?ykUm&59BN?p@uBfQRdW`N7FEAxF+mx)uc*$doRYg_=s37sAJLN~yU1F0QR5Gm0Z3 zC}6bjf>Mk5VqDSuG+tt^9wCW?qeqa$>rd@Lcs@Klg@EZBHH1Slz|ps|hy-`_uSJ4# zc^*lejiQ#EdhG6g1ROg*kx?L1do#rjkC}KMFQjHHG}5u@a*Mxc_#x9>N`009d?9X+ z_?f7*I<#K(8j{20FvMpken5h``2{2;f?*b{c4@AT5IvOzKi-8}%jv1>B|K0Y!A!1<`l0URG6&(8r%l>y>DP7*FjH8ne+nQSTj zl)MH~9fR`UFFx%JLNO%i z*w_R@&2yh?G+MhTZbg{*pcs2Z={fO3OOB*-qIsX}Cha_soC)`R@ja4QYkv!1_qt7( z#FeOqfQzme%o;@i?0Iq<5}f?*Pmt&>hWlqK(*TS|%N!D0y6Q<1c0LbeU2AE^0=W$9 zRCfd~Wtev8f?NRW?5}Y8WrdT(&(|&}EF4_EW7QoP@ca|^A>f;%r;$XtIs?E|yj_<0 zZJ!CVN~oborvB|1-olwM*8|B&PPZ3qd5g6D#f98;$D?HqU`wgiannUT(Do#p)5o10 iek;TM|KoJ20sI5UH@Yauebj;g0000rMvH zyd`|!i2aISvmfr&NXlT7Q(5&Odo8iPe&+ACh5C%>yn6W(1WG{EyVU#m_7LXN?(*jNG_Jjp-f=-;n3Dd z)FC&hG{d&&or2?}D4(3qFD)(Qm5O)-S;U8680HIve4!Ae5um>er;q@M`=>?}RG8mR zx_p$2z=5zLVk3$v1&8+Z^%cB6z5b0b?jH^m9Ws6Z@$n&^fbaE&?=^(>QwHo`H{Oc& zo639`-+=jvV$x3M!!b2NrepVRLt!B8jeH*IqLYGnRD`|Qi{X?`rQpzCc&H1N3n4^? z*&QO#E`p^Xiit5076~Mv!)8YuBAG-c71<&>Z{sV~QVFb5O9e7%CIqR)Ff7VZ&XKCb zDv?^F%z-0Z9qy+P+>S+TyJ*|P+{|}!2Jd-_cBP}IcTAtKpx`vM$k9Eb4zJ$~m=dg&6B?SI)VEag8h~c)!L+*d4;=9t ztZJ1FDNq%T@E*RjzeAt;>fnuzo}Mmqe_8GM{fn83Cn>iEp0u`w24C%6(_K7ykd+Ic z?Y+?`^?ao+e|%s^P&V#)G0rU_eJ#5K&&#)16Z%4bQ09%Sbot8a_S(y)Rd>Ps8J^6U z6Vy3r+p>gz5&a>c>917HdAq8rSko{aDu7n%?%K>BsX^U4@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/windsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/windsigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..7ebc64768fd3fd9d93d7a04b4e5c84ea23a1be27 GIT binary patch literal 1574 zcmbVMdr;GM9FK4}2U_Jo2UD0?WSpXHn)I0*ozSMxZWgiDQRg#FQmE11~*@u3a6r0Zl0*)n7VnQP7%D@;e$@*&~whENZtPM{A0Px@0HKz^Zow5 zk5uI4=15}4#R32zF`EdhILC$G*IyII3H{GVae7lQ+J#xHQ}B^I17y*xg8|KMvVgHN zBwf0+jmZFj=%p^3U9elG;}q+bkztI?@8(1{0Ax(_b0oEd5kLo1;PU98zN04~&_(N@ ze3eCR;S5Zn%T&fQv&wR9RM`>=qoHZHXP$g4IDLIOO8cc?$lo*0c1yMPofDt*2Vp0Ubl^PsTgF_D_TH|Ra zZY8pZY>7J^R451>4#Pg5Pv%p|SiS&8Fbsp`D2$>~5h3-KdIZuh^>`;n6bQyk@h(nq zu^uq2NIKYJK?jMRKEHySvshjTd%Qz|5<>?2Ne)J2a@g$--)j)<6|Bs^ZoCxjwUu%V zY-PM`F;9v4a88Vn#n`>tP#7qBgU{eyVp7N=f~AVxj7KmNI!OE?qg^zPBBYj~oC+zW zz%){tQ8H3YAy-MA4vKUtv?{Ge;fUzGj8AA03{|PKTEL#+*g1kajV7-Mb2O13Eq$ zFv0My5{Ay^SvNQsV%+r-^C~5+aw1AZsvzZZsnVg;N=Xc(!-G<;!qiFzrJx}`{eMFT zi%!AeI{8oCM2^H_3@=}Ffw+0mM~p{o9$xGcoGi@&fT;J)M3&9pxpRYMM#9W7fg77j zIxmN&XV3H~>!CJA|zWVm} z7sdqjpDvr{#20S=C>YQurf#RxeC^ksY#lf@U^?vXUVf_dFRGC1xZis>^Z5QNXC|*+ zY0|EG%8w1M7~P%Fx2wBg=knNF2WnG7PeP#uQT6oUbpiR=3EW7(<$+~m5Lr0p|%+-88v*A+Qy}qU` zKyv=&-df8iKiu0Bwcwq)tQK!d)zPP>hYv|va_}3di*Z(ThU)%Y(Y?4aJ-&E;4vMY4 zbPa8vJ@8ep`u^EBM)l&^x?H(aJ*+&+a`9x#qT!A96K7a(2Wm~D&R-4uK0nYlZ&;1H zt7lJ4X8G0|SNGk_DI1m&1lyNC4rmz3?A`iZzudq0Y<=E}%5PgU(59GB*TqWi&<7N! zO@1`}y}+C~MI8;hVy+mQcC6acQ5^l3iy&Ip@FkH|l8yr%W+g>-!oI4vuewWXMa>&M^+ViRFh`rvb=~26@ h((7WlnnzPk0v{iXm&|XNpbG!F&Bk0}uYS?We*lF6Sl<8u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/beam2.png b/src/main/resources/assets/bloodmagic/textures/misc/beam2.png new file mode 100644 index 0000000000000000000000000000000000000000..aa338d92659bf9f77ef2208fa8d8d55b80445326 GIT binary patch literal 487 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 b?7GUookLqb^un4;00000NkvXXu0mjfUmeC4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t2.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t2.png new file mode 100644 index 0000000000000000000000000000000000000000..896d122dd03cae1575517661f466bf0cb5458f09 GIT binary patch literal 37659 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%0D4{0Ba_Nk){u0l)a#1vlo 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t5.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t5.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7da23f0f16828095a62a4c3f95505b1a72fbd6 GIT binary patch literal 63113 zcmV(}K+wO5P)x0005zP)t-sQfo3$ zX)#Y|F-Kl3Rc|y@Z8Jt(DokWAS#vf~X)sP^FiK!7PGv7sZ8J}2FJXT>Tz5E3V=hWz zE=yu9L|G|Xbv9mmI#^aySaLO2R8c}!C|-IwPfSWQGBIFXT3lIHV0}7dVP0K%I5spg zURzjAVl7BUL{w`rmzS4MWG+|<1W8{kRcOifBiXl7$ra5Iz;2tGVIH#Rh4UtCFDDlRQ6MnpnZQ&4yf20=ePQcz87j6qup z1!;eRY-wg@V_;EdFD)x6GB7ShLO*hmmoP3ZZjVDLC?;r#KQl2fL_#Y+QYLR~X)hrO zV0$>dy}e)(4M;W`QwReJ3K5Nsjd2SFa#bmOe}J3A$Cqz7b8u}~WoM16ugS^Da%Ms` zsG))u5MFR|BOoMkbaj<}T!L^)qZ|}V?GfdOVr>LkWet1_y91{&8v9+~=pQQTx z`@+M+ShB6L)7VRjhHv26$o%`xpk9P$I+b}z)=lr z3gnrfzzktL-AUyHDKuN6yPeYIZA}=%qobR4!b$a#td}_xGYjLO-#~clHe&LylZ6M8 z$HZXjCrmo)y|-;~x`)+)Gee5!m-&^Z`iD|3Y?a1$#|8qxwS7s1}3{tEjyA(J;S7~d)9_M$_ z9JnaXbeS1mkS(PWI0?LRc68!d@|!s@OwfK$5&$O*YO`KCQGy9{5hFzt-Cj*Aw7=@r zBSi-@b>x*5E66p1vc!x$-{iL?8%JZ@DfRXU0ZA4ch%^7`82#`k6H+iIaVj&R&Cj%e zNkH0sLY?#MH+Jr-Ajd%%24)W&df+2Gfuj#R0wHnd#8;50R@xgs-2_~Lb}S4yH0ru7 zL*h8GJ$8Djz7%!x?Z*GOor@r6bA8j&&vfJYVQ#$bdNr%RKTvItKC&p4qASKkiVL-# z=N|GrpQb5a-tP`gtp=U@r~)oq(tWZ>?B_CR%;4sEcxpO2m<67heQM65>RrZthSk!JtnIqa>q^`y)57ulmWwz>B;bjs1xWu zoD3X9HFa<&FvxTI0tUX9rF(C0uAej2^JgAVM?_$x?3!iSw7}!>$QWQC&9SZOtLzE| z8CI$N*Z-=c{*Pe}(i@E+C)Lcm=1}z~Q68$$F0Isl@1N6`zsRmPL3pW>WD`}6saL9k zOKyJdl%`oVRE3wyKP&$Xzh>_3Y;HL0NWEF(s&H-!@Ct!~vqNxy@jgI!Yoz#dW7hCC zQ11b!mq)Y}dat;l2r_4j^VKxuMeny5E6iIFwM0@3JA2%n{B5x~s2YGAz`P#+Rv9=` z)taedW_zdI_WSb7%K{kyt5!I-Kl<}SURr@|rDT9Ho!V<=pg($+-V8dRbzN7?_ksnp zZQU7YM$%P4GpGa#GH?iM3=NbALZ*PyXvezG@uUehjcSQ2FvF?h=gc~_M8vEm1-;@z zYZHdhz)CB~U8%$RcH%4t@JoCd>^2SpVVI4YL*4}SF>+Y<Cd4<7@V3^V*=ilmhQVljlaZJg|5wXLA8ObiBteu|K)0?FSsu1@7i z|6vPmNf~S|6D*2pkd-Ykt8^djvv7Vkx0rz)sCd+IeTc_{Q z&N*rMhcZ0(`AWHsv4Scz#!I=;D+C)Lkm#yY`5V~C(P|qTn0N48AOMny5PYhz?dWOY zM``403!I!ZPz_Pa=>q;gn;kGRHpu5ZwFQ@LZv!UVWC1?7+5&viq*f+c-Wv`EQi^0d zqAa4&VYdS`fdSC;L4Jh|8b{U1=-EA^#LswzMl3-7E54E=`WCT~*?jhgiOxx{&GsCu zS6tIl;sYFogC(-A)z+<1^o%pG+1T;z= z)$Be#+h-a;aGh|cs(kd=fI!H+?p^G<6M5@oOZarrLAD_@p8(VJ;qdYT0v>Y~V=kC% z+bg-}{<$oqo4h5`Crd;xCVV&~5GO9>cy#+@vVD2KtoS2jmBQhsxv1lU_ox9Ldjy#X zHNk>m5jhEjfmAsG#+&`};Tf}i)Y;ze$7zm-kq1p6i$E5ay5R%}-+wjj_*f>zu$g%QWpr`?cWw_j$t!sjoy-E6(V>NJ`oF z^3SK%*}m#=A@q0=fo<4Z(YNjH@+GAleBWyn0aEWaCBECdXyZOo#^ACBX<@wzLl;a(NW)>cBD)%)gAZP?cDMG{NdJ}|{w&7Z$7FE^iNYeWIemU-@&<+j_^ME#H-Qo` zghse;u(&KhVZBKh-Cf@F*sATW^;~bwGC-R2TXJmpqHP=lYaMU_0ByNRY-Y3SlTs-} z-0k-JuIq$o+g3`vDwXHPddJ(Nv3-9$9$g}|`PaKc-*#`>3e)y1D8{GP3fu}XmQx}u z^Hmja3fQnane&-ni11VgbDEU1?_O-Y=*u%Q+IdRDb?*erKHe5hr>Zi>;qua zGdSnk_K`%K`TC-LU+MaKWzoOC`WNBu%~<5sryi2G!%x7Fg^W&<zS3L%tI=BQ=YNh$VwAq0L}+V{qJesiyzu?p)<3mk(0qG>Em6vKtl)`ry=Cq{3ycLHt7KqyM<9KJ zGSG>p-S;0G?EoF+ns;#1x ztx_*9FS2c#MxfZ42k|dS;{Xpx9+O6)j}qHfnci)yd!s;V{f87x7pcHW;i4bC-}F

      31|iqI60gMXu!_cM^#(N3d(Y+Pr8JqHmjzAa=Aq8lXc0-EuQl{ zp$$+j8i}8JFI?}FmVMMUoV1(*=0B(`tQ*@V@qXILr?r`-ZG^vh;20wRC)SKs8`ps_ ztS)OHWqq!5b*>Jad4#-ydZnv?0Yga$219W|pW(cML`d%Prstor6vdGpg{0jzyY1J} zNF!;`KXTgSB0F)DP2mNQ=`C_)z65yB=nHyW3?#<-ld&-xe`A^mVq`#qn?8wTa^y0sTlQ zfp1!jKk145j>*l}!(Zb-bY(F{uiw@HDDZO00?z5?@A!!~zTJI_IKRGH`%SRh?j-ak zgs%J0vKnMtYr5L7!T{2}{9U_?L|#<~6+cX7h+_LFfbuY#jl&@T0S4+S+3qd8)2r2X zi)xKaQeDYy3E4h7+h<@l1wW8&3B3)Wt3I^&AlqwWG(T8{)-xt!k`<t5k)@ugtTI`Ua-~xa7J!Dw{6xChuf|w|-yG8t;U1S+SmO`g>XpS+8)m2SYwJ zfpL{bwyz`Ch%DaS%r4gChcsbqJvn540&!C#Bs)KVOl@V8%E)oP?OU9Pti?YQP4Dm4 zHoYP*@l^F@Q{m1e_cYXQob4#vCl4n;c?GczkZBuMg3tCpAGr#VYebf|&T_V`C1;Jv zt@F=qxw@tBf3D4uqVl4&8lyX>n%;st+W93YT$Xli>q7kTfwe2UOg*QK*giJu% z7S1(mD(SNF8?8sz7wbe?RWfbU`hH)VN?dZiQuhZYo^>Y*Z4Aa7b!TTyZ`y2Pw$Hcn zw(Z?>YAq&QT$8qGcWImNJ|)}Br38-I7WaiaHALjy1 z(KI0-c~ca~NCOomItAi3W07s!^zM8?tE&FhcSWm}&-S=9pYR9>VFliFhM||8)O*hM zSYT;hl(wO;9sx78#0YsUe%>^UGjcosP7^p%6v|XPDG)nWF;r13h^iS8xzNxTx}}!-)$NysL%~ls>Tob-#>)etD<1g zohlk3rQ|-$Cv1as18VI5uKnP~{oW4&0*DC|P0pJf;2!@nnAV?dg}`;ifxVt1FwdvZ zm{=nOFkuLtS*88rz0MDz#IglaTifavBSQrfs~ z+p)O)+^qeF$Y5@G!n}2U7xIniHb(-a3A&lRjO3@3R=Bj*<=tG)tso!m$RPH`vH9o; zhigl6Us}m0*F>vo*L~a>{xLVVeruPTE#h*z<$@*`HJOoykdu%*hM5;darc_@Zfe3U z3U(mCq|__1PkW@4bVy4}O2axhT`q;>Gh0su6+eH%ja0EHnhy|c(D5zF8<1!#Kb-C3 zuV3hj9RPsb7y-OnN^ZLAUa1b*u90no<+w{9muIJR(KLWCVR?hZ8f1kkS)r#;KXQ7V zk?B;hr%R?98gsSv;b_CRT);KOqH2|z&*wxUJf^SOq?BHijTYNnezWW^$Y6e!$TqZ4 zDH#MLgQNrisT_qt;&2vco5QY#VV6>7^uB3GXm7ak9LZX(S=5WOBA=$;^73MyuYpnE z6N``3SYJv1b#L8B*#C(+pWU{RB#f5?H6RM^;{twwJ@g|8^8)Qt9|PpD1hm-B0ITK63C0G3 z zJFDN;jbBe?iqi1^CXI+_UuFm+SqJhyCEvF?=WLq%34|t=QLfBU&e}gmO?=>aHtup- z=*((^Z2Ns+QWXkJzUUFi4ph$NZ=@oPKTmWnyEi)N)NiM`R3iyWG}wr&F+CZ>S{+8( z1R?Kt4_5#&DZLN@BLuurLE8!j_w)-ID2?zqt zL_#kDCsb9p>6#M0L2LSh>f5xqMHsk=jXQ}Tw?XtJ^K?oLvhB`oK=xAV6i&TLmFv7BXE&+nKGS!l zRq;B}ZP~>!zaYJ}Jm7UIN~v2Pqc&1H)XYF+6DyWLRYU`-=v#G`RT_zmC{spff^O1x5l}MHfi`aXd42Q zTu%W;CjDDG;)rODj!Yq}e6!JPUrFcvJwZ7t7(vt%5Cl{bV{uf4Iklo3pf;xH90-Un zLZS63p}9#dvdsh=Hv_G=O1;D<8t7Kd0DPTj{8R?#!mrI|GJaiH>3fae9eO_V^b)mf zYhLz@yS74OP?8XkBf93YC}_+;b(MrpVr&I-Mq>n_8Kd(&70-j&Dv%Uf zAT@SaO)>U`9f(osge(BdFyg7`|dh#KAW=Oj~b11H?~iW z-5V2K4m^7(b(%MtZ5y2%j1FUj>_KU|w{y8Vm+m5Va|N6V%-TsNTCMKxQfhfH(4ErE z2sDgzX6(?PM;eFUV@?-9=f;)aB;YpZ=mw)hdnj8{y1vh$X0vY$_)PDMTF#9{b|JP@ zgt%|~-Y{jFsquCvE>J*gA(dUm<xke` z+d4K1CaHgn^`3PbWVk)?^yt)8M4e2J(>Jwhqy;HrCK!R*4o^i{GY^W!e)v7L$Tkpj z5{v}mIe~t=wlV3N!`kZd{kl|iAJ^${0OoqVJ{)xW>%M)gASQLr8>2fnj(I$Iq)OIo6Y9GpzQJ;GOb`BX;VSIk}yJG^X7Pl@3Acdiwb$hSq9NIy2azxsGIzqkCT`FNbxDvBDRY1rlwo@d~8 z0adUl#BFuHq3+jvsVSP#_$?IKq8Q0N{U@qdS$_lqRqRwcL``rc+~|sW4xdz zF5uK^9LqTfXcTw*WApLx>o*)dS|qzC|Nj&7u5hV+Ico{7Q?X^y8Ef(p|4 z04?LX2-pz{F9ztG zY|QCuL1^FYed9hpJ^lIT5qm`Y^Yf*2r-Hf|rfHOaO`1rZZged|F+-58D#qoK5esGg zQ3O>ink_=nsVK4zc2&iAqThdi!co^BKkhz!_~%pI#B=9zx3&aYsv>Bd2V+F=Zo?~6_@E(rfnw%rL4b_%Y3_#?ZTJQ5i18gY=D_WlU z9e_6b*u-oFiA*ji`bKF$0?O4VNUR{Xs)H>f^q3N3^RRb^7M%U4_qk~{n^?bmLcTrkawFEP4h3n7cbhw)DMgXJis?;A^6h#R zaHD(IaZX1}y;bjPY{p9E^$cI9SeqK@{(=L6@b&g}6E{{Iq+jR;47Tfx{BCbHrfp6C zJQRp8f}HJsI%8Uc;~ZZZPZr1P>)pm$==p$^wd$}@Uo&FPimiPYxBZOXWbZdZK^z)n zI}97OonT;;eb@#V>(5BGZZeVI&myszVYx>H973E+w9TX{yMbAeM4Zc`pE-ipQu5%m z4f7P+R`I^aB$)d8X+6c0A}OZ2CgM2Mh=hOHZ;4_|>2K?GHkdm(x@R=Ngaxfby-Vl^ zbT}rTRoXRiowGsuQrDs1>JpLP_Vqmuo0g2P_t^rMseKO>fky>r%&}tBer2?W*j$-W z)`o2F9QpxuZNQ*Nz--g!Sl8HN2w&7vkDESE!Buw=9g_>b5sn#9<)iVMYMW)#il8yKb30+OOuRb2-U-~t{b zh(H|b!@+<0{L(C_@?zCuOMjix()*T}knLsEevS(-U_d#>i1sE9l^M}OaH+UtOsDtn z>up_cx4Rwch25@^13$p9tKYv*Y0?i2ly!2plVS)uA66vJ4ZYiyb)IycIVHYDBV~(u ziAZ)h91b=9OIKr6QUR4ys@lO!r-E9-oG=6}#%DThtGG}sPjw1bmsmD*?sC zXj2lDrlcMtiU=wugD)!CHiL#+A^8H&ikpk-CkuWF{@@Pb%jbRboXKbLuo#YECdH)qSK8M= zo-m75oCO=pA7!Yss~x_{D+JzPW)Htl|9N?N;cPn}zMx2>{jhKJSDXh)H=wA_#*p6Z zA=vnRmLNtdxte7YXcgx-Z@;2Wg+eE+|?!+VeVGPDU{)oHJ{>#D37W+C( z#sFU2#i0>@`|Y=X%fH_W;VmyUbe-WGh%|TB0+|)Z0;-62Zzg@{L#!7-<|JqoM{}B* z6=AmjCG3h{6G^ggD-kZ?3=42{8q`LVxg21F-nNDvCG@V)2?+@yFd#=dHksxmW;BYc zd&_bV4Tju^yKqX-pT__6zW1uz?(}8GH;I0)x~zU(pH=nMD`v)zNB~Cs>s^pofw16N zYagM5tS>t|v~Zu1g!zwiH*n0Lz}k;#`>J-PX|k-OQkrI|s>6B2 znIAOr6sqW5dgY0+ZGWo0HVpCu;{Vmh;E?CFIMy7xp?7P5Gu3R8caYMYeN^1n^)p4u zW;HD+^=4+wxq?XJW!wJu&*5HRC^{$R3&Y#n`}-fhZMWhXx&p~nFDtM%L9Xy7%mhDQ~3T=G6vk!4+1RXvd)wr!9d zHcaX?wks7m@G-Q(9^VZuI+lAk!-6M&@hTpqQqI1e14eOk6i29d zxujw@;}j|;84*ET--rxX!S?l9?s%GN=BXfCTHRqM%Jwhk2*puXRIQ}OWYTCf9-ki{ zJN5SS^YcT$-;2LvBj^}|p7O^S>&1qDw5agJU#XM2y!~bzh*sxA>?}f=BD27M~QF8vG4F~ z;u(=&aAI6Mn_+p2N2A2|49gp2@CqDp@$F{1Vdzkj!T#wUpXrfSjsy<%7;-U$oeQ?T z!da;9a!HH4F9ldEh~$(=K5ZV^7~0pKVp{qlh#`tiX>dh0u<&b|0e$uGFr7Y4CZo~A z)6;O+=%O1t9Te8lk&P^-(Ns!RWiy>lXUS_Gsbe`!o+hrz0Z)Zz1=#*Y{9z15PIS{O zESi+PCfS2C4tS<_t;rQz2H;OSowdk}Se>{SPH<=1AiiR~Y+Jz2)e$4gZaHskRtHj{d! zX)Z(+(iIrf)Q|0Ud)OJa`(zCa@CWo`t07xeQ&qEBvr@@sF~+Oa=6F2T;1$@zC9tQV z3LB8k6#e(v+Y*X(-mDexE1l~N_Jc*ShycN(*)PzT9dD}5alCB zi7?v@5haHSw*MB3y*Q?MtifY zv5zJ4-_mFE6*IjcydsQr6XHRu@wl&|g3~youpw*;{`yr`YiBuIV=UZPzI`E$wzo%B zR?p9)8+2SB)*cR97(^ZFRJ`@UcG@y!nFv)?HI+)I3x(#mG#2!thz4{;g$oBJ!&fYu zcVL!n*Lv6~!S+EnZNxsJsHUo=?_r99!7LkoD_Ho)sj+36h0y)TYj!)&H#bBuh1tFt zQkWDc-Vi4qV`Z96*q?WrOQ+d1zr;cv0Hqen{M}xo!$Ncm9OgR?GU9?5K~j9dgfRq< zVR7v%t|$w!1wQ0sJ}4Ag&BaJ`QFSb@bHHFgZ-#bD5{=l7QuV*=tycK@0>^=ov6Qer zf1%FUjyIc82YvC~-d@D5GJ1ZdNpaHu2T{xuW~WoHw;QlwqikPfPEO8~$)v5RZ2EZo zPSy#1Pi7ctEUT)9(faNk{HkHetjR4{V9~a1n@7Cu)+-q4^s!>N%^2_$MN!8#8YB64 zY1_$ixtuwt+b1u(^$x`&0-S>M2TbS~)vZ>e0S~=Is!9Bl@90?0>xD3?a0(9?3;N3* z7CzAZe@izz;m+mOX|CmL)nacCBNv_OVTmOi(uOe?uc0f%mQobbZpK&&VAfXKFE7Ar z$+cm!@ySN~NKWxb=cKoHk{RVtOVQAL5SsZ4pLQlmuL!6#0qh*a7Ea%p(8$!e&Gs;CFHQz@?* zci+=C?_k%>-t#4P8fD0l1QocyHm=3K;q^BD5r&C^ksa*Mh<9?vag{nQZ7Z zSB5Up%(w6s<47dl8nMu+*N0+Jd>CP{vp{Qr?P12wl#}`7d-IYRwlT#vONvshR!b!k zT2+{$7Yd0|NtQ8yT&C@t84dWPwk*HRVkF!}tk&nUW@gK}=BJn-=gN&;j9if(5t-f

      GaoMAJ-$L-JVQ3!%nA#PR^O<B~~^;uOWRi&!6 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%0Ac{tsfN~(qVbD?z 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 KMNUMnLSTX(WuHX= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t6.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/altars/t6.png new file mode 100644 index 0000000000000000000000000000000000000000..09382a54e1531f31a13d092ac9ae869a548997fd GIT binary patch literal 72385 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/demons/ring1.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/demons/ring1.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4f9c8744ff60beb66262f67b60923f85b82569 GIT binary patch literal 21567 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/animalgrowth.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/animalgrowth.png new file mode 100644 index 0000000000000000000000000000000000000000..4923dcc77cc8ca7ba13e0cb28d295df214728f2e GIT binary patch literal 38609 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 K=Q_uu7yb`-P4a>O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/beatinganvil.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/beatinganvil.png new file mode 100644 index 0000000000000000000000000000000000000000..4f33c6517a0bd772fa08e06745e5fc7c6c2446c2 GIT binary patch literal 57210 zcmWhzWl+=)69z%LLsB~K=|pjW|?@&+90Y=rrJPf!jb4QpNoT1r_xc77fn9xzy1Ts%;R%G6g( zPFmU~Oj?kipN)k@h?fnbs3|VUPs9?zog10Wp+(e(uP6v$3(kqYz~zhvAUEd&OGl%)%~6r6tW^hDWX^Bc+B->`Oqc4JPNI!Lv|?a1w+C z`1?y^5x7L#`X>kQ6KBL`rLYlr*M6G`W9LgRNAM6PH;(S*w0sdJErfr5`qcH5+4Gd% z^_1TEBwvccMnhXq(10i!23Z}=qvJ&g;JmkOcxpYN=T)%7)GQbJwMQCO5JPiYSSo4a zL$C!w!$}PgHjOf7mhK^;CCo7p=_TREW4t#)`f8|%gI-56vvqjD&8(LU->ikcgFgST zq`p#wq=9kmr5UqhSRjkij1kiS(!Fc}B!;-41*>%~*JYA_u%-T3!qs=&!-6d;tHALA zS1dV9g7Fova*w3x?Pcq&0Ole`rbt$6kjUG(EZna=Wk19x8g6$73iPnjeK?%=lUN9R zc{W04f94w8Yq%cMGVqeiG9n7E;31h)+Ba$@MeUhRt83k-Bsq-Kr0p><&(B-w^_&-l zR3vZp=`x`?HxhP(-(Tj?|H4IyYSoDdH60yBHFE%C>Q6YWB4YQhSgyH5qMG2cNsHj& z-lN4e+yMcC_qN1ExFU)L_l_f_jyMc`54!p*fL)n_i`yuOZI`$$#>E6@03OHd)WYem~3_NHw>4WL)V z`aKEw|5(l{{&)J`n|>><<_GGNn~(smeo3cLhka6!#}Hx#xdp&BJT2tAEB+ z{Q*1lUAY@@joZ}#ubk2`10pT6VfUZD8&f`c*iDe&zjgGHjqTPjiD#5=Y=%;D>o*H( zhWlLa>y^$`*364mUt-n})Se;4zXgSmu(Gr889Tp&9#^nsjgNX;d>}>2a1CW~d869T zCs%SwZ1^PZPw5=(AwKy&)L=$p;lp0*q7m=Cw09p6@WuU=C zTz^A%)zZ;uCC5{?U|j=?+w3T8#d`I~szaX%Z$Mxv9l7v=Z?>81S zbItosa-7)uS0CfYUS&Rz6Z)l#71*%dj%}>s38PJj> z_&UjQv;N7)pUDnz=6b@` zV@ytB2Y%>KJg>9^-pOl|A*9A)1Agr0SmgE+8UD$Tgk*h~#%Lg&guhHq&hybJI+D`Y zX3*r;K|v(>orew=P9gHbZV&A8B?JiVi02-4^)j7X80<)pwZ3XR1eyG7QI3PU&^NF7 z2KdaWrk70PIM`@3hzQkQjauE!k$p+Ib%8T^BZ?}G5*h;Wzucxjes^;BPfJAum4^?! z&6%Hxpr7h}pjtHvRh*D18yc6>1tWJHCI?hyLey z3RVOun)eePx+X_y;Q)n#Pwm%k7YRLx^n%D&MG#)grO#PE2)FYa+qVGI;^_2ra3nK~ z_8iT%uA{|saTNoQBl9Igc)u;CcNsZ5SWk7!Oo+JH)Ye+$rLl^sp|(tF-eChRyg>NP zICp^d_J`{;mxy7<7I2etdcZ9{a%@q?1gqnQ#y%fAS1Xe$_(VQG^ax8Qr|J^}_ zX;P|F64QHO@{Mb-$1`L#U4qj!^>i2oxC+Ra%_7dclvJs5N{w0TiTTA6xxHnUTD@ax z^zHim;vNHp{t3@m{f?EY3(oUAD3u4*z{dWoAK3W~+IDO31Wt4*O8l~7H~=2Q5D?ms zB24E)y}bfk!nky+^BxmlD4LJo>)&(vK+n^$GeI-E=-H7i2D z1K(b^yM6gAVI;nsmiWl}dUMMLGMX`J1oL1g(aX*vgXwhbX_3EMti%Gl8rg%>eCXSf z)PgOo+u(k{3AG9v_vgxhk2E%h(V5ArW?}fx9oKmfUISyTWE3RKx>ctJI&WS$HQRS= zDuUBs3m(6~*7Xfb*GiJELlobY+J6$rNT{!TOPs~+gvFIki>U_vqiIk7>-7LOIC#yy z!i|rcOb&1UX59ZKM;H@KS9HYes(CjnjNs6MckxYC4MN<8fxF9KD-J&XrdBH!4ud~( zSkGSQEByzvkX_UM#HRhz67&ecf}C(H78z3DZfI~-U`K8UpjzITWi9`T0XX?FRECmR z@yQXly79(kq2wUu`Z-B;>iyP;F3%6MMzfx%!a7}Nkyf9ibVz&y9aw>UA|`^a*9jS^ z@!V2pxaIq;2lu9FjO<4+CxO-9c4LJ*a!||R8zD@Ys@3OIrdtqX_};N(iFds}&u&r}}sls7Rv}pOH6PtQgk#-Qtf4kDx<02Tx5DRt~brXx!2t zCK2$UknTC;OTI>`aa+0XW(?o{i57L~d9){!Ww!}tmg0i1;h@47pDr|dX==rYFl=v^ z<3LzFoO8c+37wPC7pY5SyT0*lz5N`*t&(Z^IpwP`ZB?ndvEegB>LUz{DZtFQIXX&0>E<>Ye%;U|mjC^Sj5s7s_ zp1nbMXA+bDd&jC0$%1VL!tF?pykT*e?b_ml4V-m!NDMl?e5uakD$6F;g=M z?lruDEw6kfFl@+}MWx-RA$~UkGze{fO8TkyEETQ*Icy<(2m|ggL77trMC|eJM+m=3eZ(1ssTE$JFW24>IDN?)hfxfc_$XLYwpOmARzNdU#R{P>sZ$F&e}&2#Se zO10@%9l~{?ZlAF_+F*()31yIELz^*av`SZ14W1`KWSft2-OK2MF;#FnZsvPBCzy@k zjO2EV-o|{@wy$vjUxU~ydzdKz;3=G9v$C6+DNZbpXAhgLOtPTZODQrmxDf$(NTu)T znBY_L@eR!+C2DV-(tz*7Y`@0woY?EC=ttNRQ8!tnx6~3 zfw52IG23F7KrY|-vS{Z!?oGuNtKhF(n#2yLL|_AF{gQIgv>q&=AJ!Oy@Nv>NW-@-O zVZL(fq{s`}aq~J)CVR1L;bqK%TsSyU#N$zMRnqc3c3b1z)YQvN7ILwE#@_0~ZOkFH z-sGvhCob_X;Ozq9GFt4f3e7Qm7p99xAP6zbz>83)y$flcEyDCNrUefFnClN2`{ZA( zzRJ{yUb!Qz=LDQyzXm^N5BhTPPZ1Y7-HF{k+tVqGZLS*Z`w~R#49s$Oxc%3L>(j#? zt8aA*<%!+q}5y+Kbl6tT6tR-+)^UnJ~kXVk3){1gZ_2ZSM%ducM%Fu_ja zQ-bM7C@y!nJLp@(qA+Mb9>)T_n&-J zxA%ql-AmpSSU=IME=X#4eT>S=SYY*DpE#t7t2ii3e8Qqao=$$!K{{hRR1%dr~IEn$XBXm`$aMSb7X}8}HK%@eJKP?4X3f)Trh-uh_Rj?pT ze+x?uxxt=-?EH1D=zl^30GXe1;59r@3jP4%;RtJ&BYbZ3`3$(v2&wiiE9@Wd=jP@FSkA&%?-lfwFjY zFM4Q6j~SA9{^$_2-+ej#?+KU)16(47R>-xhs6fX@lrwr^cVp3I^9P^GXrZF)BUmwnrwsBXgzFWa zV3CN*UKVVJ;6JaKdjFPL;bflafZ?;IY>whx+}akESA-~UUIeb98JG64QoK|dkSl9f zOR5Zw!2>VAxb$USfV=BI2{@NLHh+;a$ROk7D$+6-^~}8o?MVqQC)-3TW+8_?%OF)C zIBnAlWKWWw5NFp&`EP|aTgQIj;bz;+Zhl9db{ z6dbouQOxO*K9*5Y)=|Vee%tqxc-M;E_m%#<@TjRm64;670yofs^1q1;(j#j0y%>=e z3RTKbLhU4AiO1pDMF;2`<+ISza!alngy9o~Lt({kuI!zmodv!FxhFZx@Pic8NC#ZL zqQ_T}J~gM>^k-C~V_1sdTJN9T9)USs%r^lZ^dwpSqCx zBRSDrk+$r+?^LxiG&Qr!hKu1Ai0(VLpXP!-cjL)H;Grr=k5BTFESE-qY1O<|w00#4 zGWnJMw-U(~XbT*Am++zI+uOqcpRa)cQI^Ysug02huetdin3yo z_}RBX8#6y7ZMmk`8W)lz?>X(};$N!m-qF}U`Of36*g4FzFfF!Ho^bXll3{Aw_=onP z@24uI6K$uZcZ=YY-HS9kGpV9AV5y%*7zu@0B5v{`K3f=fzrQs4_ZAM%^Un+0m_sRr zVA{c{(6&0KDOqS~)Z+SA@T<;D=o`|s6>3+2-PhhT6(YF*SkkvupUO0r^sdRDov22I z-)DR(Mvgd$c7Yt=1%9ORX9|91qns=vitI_lM(ygcpse>-|H`eJYtJl}r3J>D za^{LS^D5D{^el!3IKSnhoGj4cJlYWsdI*)XuV_W=Gk7-CYatBFd=!n}Mj>7mA@tz}qRVc=tO8vk&%#r&~Tv-%Szz9yo(qHLYS_A3GQ?%!_>gHS{l=X>?k8G-{S7N7x^5)Xk}!9pUeVx^Rg`#F zj4e&9lC5ou)WhLvh;DjezUfQdfqsv_ffZFR$H=cPH+7UF?P!@gDrk_%5Qv}FUBEC; zMfWesu)lPvZh>KafwMRC3^v{CT+mSZZ{zw5G3hWDR3tkqf*?T`%iT4~sje)~s|!(9&Jc5m}fc0ic7Yx=%e#m91 zxo>QQbIMTahy!tk?sCkx8Pa+IX|n?C1IOIOS9y(r8%APpN<<$$pU%nFp+tTgn?S}9P03FP|*BV)5QD$ku ztq2Ni0fx>dg9FR=(3k3Z5@6JW7jT$S2atC*I1`K10TtE}rZrpOvQO5u1<*JMmxw5V zRfYtEQ$KgW*TQfe*22!iGC}Xkj-)op5FAi}q1u>cTV(s-lsz?DSlFDYfAyFv7pD@Iw0OByL}V&6%MFq`RlP9P+A;y`@n{9ogq7NNDD+r zT|BN2)rr0Ml0M3n3r=zlY=TcM{(J#w0gI8uiO&5yj+EQD?i)*M9V06Jho&h{b6^_F1W7kuAdiz{=Fe z&!U}8q3j6ka7X$8 zkQgYHPyOc|GVfo`6^SoDyPAGyDJWQZpYC%G3xXADWe=@oCAB^Lfg+_k1dEw4%`g$_}X6 zXUVEQHka#_Tk4DL$nm>4ymE8Uv1eg#WYn~4y+j8mwPlW#N{0(+k^(rWHb^9y0%67g zQT2-j6!7=;ctfj@G#;WVhKxLG_QBJpDI?|2lcMm~dpgcK8Ly$KGg^6N*8xTnH}CCv z|9m+z2c#13`}BR?aDxS}F*0bCk33IlPhbN?2s#2hGQ@#oVPcEEt@xed5%$Oxno({U zM&e8IK;M%J_~@eVcpRE|0@0pq0xgj#_kvxI@BeCz04|RYpn};v8 z5W0x(?-xZ8YB=wMd;gDZZ|#=cLxSZxE`dM=YfNTpop)0jN4zV5O!LWX7| zIK(7KP!x&Aq0q51oqe0ApcF|E9A&d8ZX5aIr9`UctG#R8zg5-YY%3OxG@NPcKJQ*F zz{+0dzP4I8kIl@9#&(f-{U&{guo!Xu*Ni#4xzhxjO{apqiSZvHiVm`6H(4Vz^SD}8 zc7G&QJb$Jx`HcNhnhQakqAvMwN7lfH2qcoGr3YQ)C~)YR2e}S?9Qx1!Z@2CVy*|EC z0``OjCHEK-XIYASIy#ePCCgg*U6-S(GQ?qjnAw0Gt$iV+bBTCiEx%Zo85@D zFd*olp_I;V`>03no(L3Y8>Qa-U-=2U&V3y}VxLXdZkQq#g}x-%PiHYZUv(X9`91`P zc}f~m*ya12l<4Y8BHqwCm=6UTVRb;N-h|sv(;&xqfejF;F*yG)W|k15k#4o=V)fj0 zqM9d~XJ9s@#fT@D*}`BT_EYuTIRTg<1z*>x?0tOu?e!cuMxlTm6|E;Hxp({B3QXMI z{_CY#9diV%+9x;tK{VFg940jkM1oXOL2>6Zl4(aWuw<>fgs}<~373YIh1msYj_k8H zELPnCr9fv z$@xZmMmcqOH{ICrilmqqmQQcI;q4(rw>ml+GdKT5i4OtM2_Ut@v^!Np1DJf5fmwit`ZNIfurKVc25-Yu;=2I=N03m*Ta|5fwlfI9JIYPgMt3Arsvf{_xTs;O0c^m->cd7zY_AffSg-jEd*}cUsKvAl zqE_k$8I4+3FAG8w(H~<+?*GvJ380i-{(Ak!=MwHJucq`YbZ`~XO5mc5*E{26erPCt~4b#i1f9mL76pF>Vtm&oB6D2k-*BFxA&8MGmFks=K`S$QLt zHyQJym!`QIQ?q0qx>^F^ED=K1awU-|abIyEcst_Au?+LxA0{^YMynxbE;-&&r>1*2 z$;I7}*?KyIDG7*J!KvoEYzKC7-(PmD&fw6Eb_k8TS{EXOx1TYWhCUU%VDV%M!ItPL zPjgVZBc+pfgZ)t?1`>sM^nccT?ka){y=XNp3H2ia?~6qh0b3s}V!|Luba2H#nJ-Hk z8Zf8%UEq~V3kapLbciV}aZXL0jo@#v8yw$qGA@T&3oVqtzy0@8?zb-OZ8tPN<0{f8 zoN26!<|4TGF>wnEsf$CkSPcWQPyQ(ItVIq3&B{pc*GT5_D;*F&^{7zQFhRls3k^(S zV`vNMP?JY$B*=`UvE}VQ&?{7Z(0WZmi2Z4Q`mr^mfK$!zIeTc7KTCdNSssRBI|voK zG{+0f7V1_xs;&^K?*G*S4=p>S&7!lbOPwlZZHQ{;Rb2ge3`wtem&Pd-HqScso3r?= zHH*p9zmMx(i(6jaU6Ae;vxpAP@#ud2d^0!i=|?NOs{lApo{#2q2RkInk$6+oHbwEB~ zHBc@Ole=>cgO}EyNn|eEusL7T}D5&B!G@W15Q634nRB~ zu_2GWVEYWA(dCr>r1wYJ=|bRNtvQFShu|;uez9LALa*?sIWh?4Q^K8gp8B@jS)hr) zMIWGh#UH+H#ac0+5sHsWvuol?66z$;CxYz9r(?b+JNw|nhHNrG>WR9)O|)?{7x3QE zyfp6ASgpP0ZQnk4Rw5)2>~N_f?s|c1zm5haDDCy$jV(-2fI7#ejsf@Nc@9Wo9m>CWi!nP`rxMn2=lx6C}$ z#0z-H>KO7PV~CvP;r+)7#Kpi&j7zn6zg9lUjo^jA$)ZM()dWynbf5sFhAUnM zlwu<%XFR>NzdkE%%TY8~E4W-*;nPqY@Fg#IDQy~y>tGvMAx#}tnsVb zF?U4*-WK(N`*7=L98PWcaJrDz&MRnRfOXWA&Z8_r%Z+XOof=<79b~| zuXFJ;;i^t(Eg>L`w31zsObj@|yoE_MZM_P5IzQizXjVhE=p9T9jsc3VK2}4ZR#xZR z+Cba@7wS+5m8$@z=x+I0p||8W$$X6s(-hb+*+*5x9ZeX?$is$b7hAat*nFcwSd)Y(AD{ysNoWs$SFnttdMyI3ztpIFB z!eOrQ>BMQZTobcIfH8QG>^uV`kCY3wfy%o`3uBdL@$B|V>+G&l$|dP!iMaR%0xwJ( z6;=*70&f#vr>o*d#^wTFcv_%UnRZ0`@6)ge-0KG-fKEd^)Ce$%@!twznu_Dv&u##UHh0)C3cAvpv%@9fQavN!A-6(xlb56S=rCF%n(`Gj|hB6KAjvL-Q< zbZ&2rX;eX+CGmxGggeQ89({X7U~P1F>lVzZX0+N#pMEi%a@61CWwM)FKW~dtG-mNMjRmHN>i&rq{f@| zdAnBdu{jiR@pfd>vci)~I%c$S{+EaCvZv-ieWE6B8@oS2Y~6g=0j~^7lRjSy<^IlG6eh}P`>UU8OJfd& z1!{(aQ9U(d|4hZyofqZ9XL)k5)2(^G3ErLreGx(%+mR8P6?=RtT|Z4D`roIhcQ@?YleNT53z0`tL zVg+~c@U1gPw+>xmb;0a-(8&-*Tqpj}@optt#avjHeX!8w)zyRV`(`Jk925KI{?SXl z)!eG93Bz-q^4cQ{)tx}XWBg;mfR9geXEX*mm9-Xs4*f1mJqNwh{m_S0xN9UPd)x+< zDX83Rn7+JuwVzk!IlIx^s+D>-{y`Px%p*O10ddZlmv}PKyRa_}m7D}_r|=N@sbO^n za`NxwWdD0CQ2=;Wf>Udm|LHE#Jc@WcxBbzKLVj!R)8~zO%LMxHvH49$BU#94~%^N^j*P~l4}EvejZ`LVsTzFh38(Yh6u7?fC8|D++L4nU zk9Hat#C*=1&Tb{L)ODR(ggMsHA&w!V0=829g!{)i5r!Wh4MLy2sPxyu*6#=K$FYEA zx97+~Lj4UiROb6)zZA6eWQf2(X|-mQZ0J(k6&IwC$;El z;>1RhFBbK!nv_@7_8~;YSM7mOvxc}<5}5Lgid{N-d@q#l)PaO*=UKVoRc3G6FQq~S7B}E^wxsz}WXZHxT`Pctqn=I=Tm}qPS zzsS@4QCXiR<`_KL^?PARt5C4aZ|tM{)76J@Tx%z#%55(202b1sU7Z~G8cR4Y3w*}i z9py1XMUbs5%BvoNkRfWpT})6h>2@+fz zwD~&D$N=aiK(z9~03D_3yrTJ`b^j71I%=I1=tGrqvf+J^eTL)^JsGDA50OTAGx{0c(DeFxSfko63WRvi1E_7y7t=xH>(}I>NBlp> zbozF2e0o-4)^t$Iew}|^YVb$fvIV1aRgPBc${cVg<)Od zA(Ga|Ghv$rTpcSo9@Wc#y*k9$l!~eckr!z4fk}2-OrVbTjOV0eamNr-w`~5>XbDO}zLwrSfq$SrqVT z*2)90e(&<+jk7jPFL{xbPnD&A`l-u3^8y+ys&7z8h`n_Z=x*&un_lIQQ_BPP3gWnO z6drw7^7aFl-rQ}jJC{VE7M)761o_~^UVbixiMsdRm)%&H-f%M3lm~N6T=H)B$tPZ- zrNbpKRO85<*g-wuv@#Z;c;i_K5HS6e-$XoD#TUr=(o;y9sBwu ziNY#y5Iv_)g!=iLwpAN_(MyiZcQ6i)ogr?ihA{b(c)TUHx30=wa%SKhTZ4no9U20$ zKh3MY;tzI3X!<0dd}$0X_>Z#u^P3?9vhC|0H-FlN@d3+t7habD5`+XHs7VVKaKuHb zm0)TV?MD3)N^#lfpBv$QXm(wnYdTt<+IK1wmDrywjqT(M!abw-CZ;h4BVCGJX=^AG z$m{&GknB^>kyd7r!`C9D^y_WSD}^jpVn?RQ=TXHPg87BY-nErEgSAY1lDY}#B2@SS z9Pg9M>AiiTMC;A#5#c|y3f9=I>*VAD{EO}BrLIfnbx$-+YPH4}d6X>48$rC73s} zi)F*+#E}suh+wXPw58DFxIbZiNpz9(X(hZP!y!<5&Ho)5a*cwWNU&QfqIvT`vIv@9 z#>I%89^1SybkI0kNpU{>_c>O4#J`_66Gj2F+{!`AaT_GUQZjOje0g$zB`3KXA6$8Ou`iq|ZNUTuLg?QolCIL_f;>IVr#X^v+FGY39dd!JI06ak%2i z!4;x`YbGS~cRr5&Yk~vHh z)bFb*7SWp%YvOIcdTf+B`X2~p^jsoJpP(p*n{qK!MzRDrV|V;gCrsp!6+ z%4Q{AVV~E0zZ!hC22X8!zg$xG{YE;hbQV2!>6j)N-KyZg0Td2O1{~hXywQ1nm zrMX+5KGov?<~hRh_(!GWVL~8vlj$RgocXZf$j8>ys*Geg=I?6AcsV?AwZy)i53$s7 z=g`cV&cW3FVOYO;R5DY}g7IJsD>Flhg{)Jzi^;Zli$Mzt#^sUIz|DH+vVT1+ABgGP zKEU$5`6wX7{mmJHUhb8qW*{i#g`gOwp|sm5mD zx|`hb-1SwNzSAb!FE0xu_uYJFhJT`mgVVeSMN2Sjy!j0rH?#C^iVR_HlJrO3-sxs` zs6F;vG9($Hk(xy^s{JjkX(d_X0}7MOhcl9k`Ab?-<%b9{l^+!#?Bc7>Pq%lnr`;T` zT7lvZ&f0n7CcoY-UWV0au(@IEE?5=vq5ODEbZ@F;UgBuD{B-jF%Hu?2*(R5o6H#f? zT4A-Z+s;e3cemo^9bjxZmH(wAC{oA!KKe<*>_L*&(bZ_UW2zmX( z+XF+Sd`5b0@sK%`k1C-B;c;s^dGAwa>L>H>oTZa39{!+*8~=x20PN<{3PsU#v5Hkb z7CCE_UNp|6ru@E1Yo=_W+KgYJRXNjOS!5)rUfRT4vest!c|Bm>^Dj&GF;A}5N^N%0 z5kx78Ztl6h`TEt5H@fzZOXpI5C2czFbDp{MeaD)2S8&h6>Omi=bGB!>Ldf*{Njcb- z&mhpM+Ze=o8Q%yQbedAwv*c;G#)`~vjzzzFy(le_{)rN4xr;EJii*U_h8-M!6-76pzQj)ZeHYD1vc5zE5&5RmwnJ%Q z#ZVoc81OP)sqHXCJl2KZ+3%w@Cz#F*Dig<8_3OMt^4UfA3#CxgyCE)RYPYIxLNS|& zphrX^#hLk0MExbt;eJZ_oLIDGqeOw$3tu)te!SE5AL~EH;eRAjbP!}Kb8G5$(;W0p zW@7mpwD2^o%ETo3%GZ4OT!n>yhqdR;hh~(MTV5A z={{Gy)d8A-u&blU=%koww3c}b=5qQ8DcqH*?m#Z}_O1q2=>p!PjE*l_H$hrO22UA6 z|Gtxrb=w*@2hdf;EQ}!ZN2P?=D*X)C!q8$rN*6mB%2~a7B`foRna$ab2XB2u=OEO_ zr~iQG#OA4Kn*UgjmZh#;S^$DkTOn{v)e&8_x{Ia+{!puUk~}uI^F4{8zy9!T zcUo4`PSZ|txZIybYx;)?oDWg%#poCG4OMW&62*~z6S+X_DozGoc+2JWEDTU_^ftRjU?|D0~%Dq&-z+Cin2K--M?p!E8KQ?JoQZ01G@k&Ill0DAU!fpOmRp6x(sX=re&d`a~3qI!#xTLVr(dvJ`wf^1_P zNX|METj3sk>uijw!l%i+uJ<{?z1g4hEBh)aj_)%{$@~#&?$YR_M%nUDqvmjWi;8Q$ zPhDqpKkXRL3Gt%bp6($`u*;|CTjATlcB6QjVk5>2?-0!Bk=IH+d(<(0)6cV6DwtkT z1rSA<54^B-pNK?LWZ8`u@6VTPf8j%d->nBWZF+LmMZX;kIZFck;tol=y4stRV|(?u z8k{pfmCttl`lVjx_btq|eZlOKaib$5#4fMj4>j4oxyQT3PLJ=F;M-`>1VA|0SkTZrN3w z)I}>W$9ci|M71G)uJ)}qcl@CJ$5NY)GVLxila_|N^2v-&^joF4>6kCFbFt6@D#Vr-h!C?mx@o+Tyk7|DJ(mAho#p0;;r;ES$ z4|(C8mb8!ke~Aliip53dm^Rp2svk7`9)EVF_KWZA+wI~YMkS(i3^#p zpJwjde@S?e(Tg{|r*FL1kumFQ@@)F;MJd0z5bH?#wjAUSQ z>i$_s{aZWoPiyP-nGpnwV=072Z_g}+M=|_S{DxhP-9*&%KlE6JwMh?A73vV*)?-r! z>SAuGKDGV}>fd)qA1tn7zwD5fnUU!<;-5px|6B7rmrD6m+bdtBR!X_Z)EK+sF23=K zi#xso@Pe)2?HrG`0&^rli2JuopzOge#+!gAS#KhCs}*eI zo8upt6UD-Y;hiv6YV)I?=f@l6<*wZ5UPn1T=&(x!B>Y)P`lhkdnCE7)iH%UUV%b^Y zSi?M*@;POfWr#%+#aeSu&hg)m$PI!sZ=EMv=-c*(9uzBs&^So=OKORN6P9@Y<9qicLpMI_C zM7T;js`jk~%v$l#ceIC|PXA_Bp*=R;2c=Ybxxjn7V~dQnYtJ=r6Co!E?M&1Qi40T?agor8p!)$r{6u!aKt7Xll+6SyMHCCUJ4chrL40wra z9dfRkN0aM#v%qlF)#y#`{#7%lLK&36^h-zAiEDMr!rym{eVlhw=#8ppZQ9Ee&l3(_ zDzR&svlMWZ$7oq%J#!aNHO`Iv?b!5#%(+u);a-kh$d0JAwo%rrx<6yn*L#T~ekOoI z{9hWcN*M_~#~zjHMHU)o{Q&9OES4H}o`*#mT}CB`=~Dom_5k;(*!b4U9);A);KkOp ziNMW>z|#%qKdR`|>+Odd6iYv%e7+}0U))EA{RmmHp6GAt-=XEP5gjw*-5VxULJ{b4 zvxLZ2CRz@e3pLUhjoSZNGSrdRamqwV#XIJtpX!}Q;8|5x^I<_l`{aubm!_eN zQxWg(&r5`?I2orkn)6)Ga{cie^tg4GU5q}vr|x!puhRRIXQIekZ7uGhvl*!NUqYw_ z|D#)nmWlhX{}A8$KK}Viqu+V)a@uioM*Y*bRBs;^EE8^OdJ5b0$U^dQ$ksQR%R8gz zhR@F`Ln-@MX-1m}HcJZw$62jQc~n_G2^JC>Iqutpm&0mEQCEkkB~8r9Tnp+?{J>+* zisSY_oA^Ilu+wt}(>{?%AK4zU{GYGB7Mv3D>Ka-q#x&zPUi3wI2b93g5%35+*A7^T zLPGH+y-{%XE9Lc6eJZD*uOhFyzhY(?QQnZ*i{Avifr_o!Xa?fk`pe$)*{JOceRdae z%b8%)572}F5s3SjI?0+NE5ot@;ts#`Ph_;3wio=(OckOn85WdKNVj4fHYx80yhJLc0vOOCC1brW(G+PN@t>`_l}{nxE$boXUKmwTaaCJ>qGm{fjurb|l$O5#ZO&)1 z{Vy#9+Y^V+WGk!s#db5ZSerRswN#VF4p=K2oXPO3pqCUmzDk>Xwf0%rc$`S; zl+N;jlTbQiEzDXLV*oMA6x>kH>q>!fWqel|^{X6Z^`yIW*U<_ux0TTM^`aQoauMUf zY0AnHYoiuq!c-{JV*|a1LBY>6z%Ok6y;6|sV-eU4X*dkq6!vfmJk93d}x4!vgOV*5yAvmbOMmxxTUvh=27Q!H7GO(2zcOl7! zIfQ$iJ*=p?S)&S@k3R_SQx#{AwGg&g_U0xJXU3GUB4%Vi9&v6WQFeGOGr3Lh_T0wG za0+(ztHj8)xbgaCq(tT?Jq(A1kYmGPBj#hcBs>U6O# z-6wD+5i5{SKk!A6Oskp91g%5k;zF>fJEY^w*S0pJvV}}WU8?YOV<)L~iuTe{C4a{* zrHSuxGlvT{2EJQ@0n_TL>#Pn7XUtai71mPmv4I4!>_+wpN$bA`lfTiJ2ZPW4?tcCs z04hM$zq`YHgG@m8I++$>2+W!Wtm2q;&3aR+xW>IKmVp_qYiM`mvBA|B;#PRG4#vSt zVfs|3Zehs`B@)};OXWHuI(2LQJiRA87cr0OIF5fTKcd}gC1k?k|5Qr}eG7|$oe|jk z5$NP>c5X!a<}-*(lsG=m%ZHqPZLwMh=pzp#`Z?gmmw+YrrOiFjP8aXSASrwgS9Yu@ zj5azcoK}JH7@js5k~GMTz^I6$MjcJzC~k2GbfQD(swC^RygNgoWq>9Zdgps$0{$8b zCl(&6rfh2^+&gH-f6z`4H;DwUzFXr*Mfgu3z8 z8}v`D{L#EtDi^=H-ZU2JMx%38A5qeHcB#d@gZbpP&hmM~iyhQt3CJH=a{AJNhUjG~ zK0Q>a$P5PHRGDE6m03<=gc4<@J98RNLzY>Me&3RddemSJvDOmH{&-vUwL!m#m>SSI zJcLPVb*gjnpN+f5KTDQd8^#36f(jmndo(i6ZW_K=FVPx+yUbr^4P;8bUrs&DK{i<}0X=6UL3WqAFnNZX0nEsNcdh`2l zzgxtiLlk>c==0FnR7G)?S=|6ZA(pbxmzObFv0T1Pizm;#03n-L;-EBjVe?@I5t*L! zrZOoCl|?1}&u2=%@-LMh-@u>XdZ5$*mcc}_P(G_ck45&&8C256%a>Kz>bdX`wG~Rv$lx z3lHp6YvZwMc-V;z69%Q+O@M4+R$lrM$OAIcIvKW4Y21m*-7MkVcQH-e7I4>sIz zw%YKFN}0XvMBj(45tqb+7;(@^IchZ0Wm=MJn%zyT_{hK9=f0OZ163ZD>vGA_Xd;7H zowRr56I{nvCX`hI;1Y@KC;)p}aH8y#1rHtE)f!x-^g!E~HzIy5W9}VDQ5w>z z7KV<(sD>vD8uz5}Fc&UziFySPOS~vh7m;EqXUpWOdaI(#vl$%7C3ipOk`*zuZ=;oe zr4k}rl{^AQ#^55DW5ZXAWgrRlcZtV9b>*`SS5ZsNtA}|HpzyllRq#btNw;pnC0MT~ z!ZH{FJVbzzoS~}295R6~L@z?tadCZ3V`AWW19IHUw5lzz&Vl|6?W$fc6$)D+4Vv0C zkoy13cL**uiRm4CTqYfqS9eOpv*8M8nlggKbP45A=aEhMFV(_~LzzC_0NM}Um9tk9 zw$>%CwSqgzvuK7{6RNCKCamPyT#Y9krsq6*S(ud4r-`kY)@%qLk$du@w@EBRB$%Ph zg~{;=p^xDY?_$Dw!uEoH+-Go>k6aeDyT5P8Hox$tEa=Il?o_~{i;R0Ag+6cCRt|6t z7ML!g%057bXBt2wowM4KY{CnBX=0&!Mx8l_($0px6uhDw_x5D-0NVJQk!}xiTDPZ4 z>Gn2(rdx6}1QJDN~$<_vsY1C+I05aEeWQM=RYdY|l5pT4oZ^lx|JTiPuR>fK-BxPaA-1gTTY&?yzss81xxGt^r5(^R7Fu0ri)(j2nxI%k?yTpoIt^yOHg4@!CdxT#)m z(-|D&*c}-)LFL)#vFl|QD{6?eos;DG9IpoBGaW&3*verZZdkC|_cC)*Ii`4%GjI$( z%MhDvS?lpo+j$EXGKc?_t=L}J3)?uMR9XPhh?`~#nTv%vmbkg4q&@<&zb7);7b>Hg zJcdekK_pa$N8o*a*Rb$;4&>5*(xh~)U z;z2;s(NMVcw=0@wH?O9|*4SZGIv8@t0w(xiHgjn0Ej%i542P+XaL9r>n0SZv@8ZJc;u5OoM66ivu z@TSCbQD~q?Jwb}i9%MShp@T~q$A)pQ7DyFm_)wY<2(MdP$TU^@fk}%|?&jvBzC>5MryXuP)Ir#;LmlL;gqd<;2E+F~xShL6`q&?@`c zR#*or*N75PNhLri(3z-onM1C1AQ67+(Nh>JDLKT7MS)7{!!_%{hy>%yTKV3>%54@- zly;$3hD#BxOp_~A0@-^IDdH9;qn_LW1D;P6R?T@l2C}&V@XHKC7_3gRI!e4gFl28t zXK2)U+yhmblgM6-6O7nQOhgm^q(o5zYpc1kRl^nnJ>Jy1DpBaaBG(&nztfcFGOQqY zwU^K}L$#^%I3KV%#j&~*YVf^TAuNcbsWGZNZOz^!mE>f@ojlHo+lSAdjYgDjyLLT2 zf9KshxjVOp;%K=tJrRXUYMUWaE9HbwjUf`D8U@vi`u5M#r-?uUB%=n&nge-qf&(J4 zx(Zlpp1{-1@L2gQ6$HbcFezOUss2)D5P2~MR*jY_S#Nj4D;!zOYGc;Y zR(>qrW=uTQIhY(mui#VIrFwSxjBb|)EQ>?@YL|~YIMCO+DERQ0@g3XDhl!9_EE?!)uCCzO64AhL zI8hR>=} zWWS4|B8zOQD77flYUCsEB`uXFKp(kS7ZtvEg1aO~FK`4@%5@2MCjKPC3e0dC)!F)% z;jvVOT>>miumq>IQtM)5VN6^N8l4y8U*743%o3hGL$(&mk*zimDaR6`4^_51t!(#; zZ0R^V9oqo|1K*~}X2+dW9dxuJR(oqYjW4E`_4Cg^<7=<3(9^!T3xN&I%M57tg5lK_ z!wGs{6P8AA%-e5h)sOj%NOQIR289ZEk+XNKimU?_f3Rr@whDqLOyZ!Ly^M6?=K@3pz_ z-;c1MXIooL?v%sbq%A)#Zsz zl2lzK((FTHq>p^_s`l_t1N&Z1zO7T$0iI=*CYaS*aB>U&DD*D)hnhm9i3qzwYGC4t zQldY)HsJv7DUdz+3!uZTu%E=E9Jel(X&ypagBPvwRZTTvYY-=!dO7(iuS~bwi`p}S7j(L4)9124+lt^Sq${Bi4FyES&%#p4mYSZ()}u*#>{F>ypBN_-cMjT_yE>`_vY##SfE ztjf-jCDuXCD%~7#R3S366Tpz&OuDG!O`7hXzvN`&+FZH^uJwP3(p;Gc^fFL8^9%WE zgRWCZWG%QaUVndt%*VpyxEkTlK^R{f!b*mSVb$lgO!`5&{+2E2+00b*AF~(0Qv`!j zIE2ZT$`in$LZw^+GZetFOXa?j-czK1N;+qV*wzRqhle~e5V8Y#R#Q-P4&Ru}5vMtI z$3VwMyMrjD`qnE82W{-K(Z((t{-q9A3^N>-Ygg(G|IOCf^|pB=S(vmaLLU$*ixf#< zIr>;hv?)`t92jexxu7ir89~v&jvxfs#K36m*f21&v%v!61lWrpcmCOXo>TQUMQ=_f zvPe;HJnzHmt~y=a>~zxU)!J#NL$0-@FD{Gt^`+U&je2W)k_wTL3r6(fg?hD8jz@`b z1hiv?wPu#Zm`Ewb_7SNJQ_pYK*gDPyz=ZCa?QSyNZKCFur5X~?s7v2K z?RM(2xqdr!+4QbFVqL){?0)Cy*Y#ggw+I7lv)SovQGId|T){P#w)Ed>G=^PiS!4F_ z;6OWbY~fHw69CXN9yqvsmM}_i2@H~61OEnJ7)gm&d|H0pI6r^>{M)%y&6k%5{yf-4 zE<@6z^&}>FrTaqSm2PPOKB~4g&^08UYy(0u*^(alQ}zh26O|ypKGkgL;q~kP{@Oc} z5@#81DW92B5~ZZ^)o&h=d`nc?H4{r#1ZkJzjyK2_?@+=wVKSS=9ly&Rmush|HT<8(1oJJp~9Lf5FVr zzzWKzk4#eXW;1YFJOfVagWpPN1~FIK!FmhHtEEgA>&iEl>4kIea$_N1s6 zwXPqhq`6L_8KjMs*dUV9#iGZBog$$Zp)hrbO8QTumGUvc6J>~N?NiEvAUOf#XEsV7 zB0!Q-35KZj5riY%A7n~-B;u@o{;BBj0t^!j8Vqu zD#6ctKvBUt=XnZ$TJE!xfV&}-kKBIF0a&aSE)R#zHN2G-!i=X$N}@jGw)Y=ya^J<% zMl82|lOA(!`-;;{te>V=PxPXOtyiB}iLblOQVIjPuBhu!pRV_9GIcb7v$}SN62={` z@d=iij`eaSOS*uIUBcFbqJto($oEp&ECSxLU&Ol%c*L#r;zzY_mCh*_6;mQoBExl3 z$x9D&-Wx}FVg-suQWZ{#PD^J_=$+lb)P6+dSXXma?1GgdBIh=rxUY~D%u^-M@^F7O zN+>}Rdi;w_^AE#Q7tTUi?;)cUAdQJ@R;RN<&gfm_gxPQy-)LIHfMEjcU(_~4GZ?fh(Ar28~T+INn<);$Gg2RPYR!`8j>yfW2`5;2gk-u=I6ZJfUGD-gQ@uPNP zm%a8TDe(aPESB?ZXku|Iet2|srMo(tHJB~I(BkIXYjq8QL*u?GYyoZF&_mt(CGPze z_a4b75~v|smh_9cD?w6O;l90g-OHCv;+^J_nGYoJV$720*b<^>U2QP1lPdcpIxm8) zFeX5gXTC>dr9U8WX=6=PjviMJ8z0e7daX?%)6guz79U}~`vH8b$^oa#Xqm+*lrdy&EXXl%43j#W?)|cpR z*W4MCqSGb<8niZQV~Ht?PtflBfpD5xcAhBJBD&Kb^!bD^IC(0Q=bH*8fQ%2ERzZpQ zuHe*51r(N`R8U^mvYX>hs}-}N+=5=O_sUHn&Pxk{SE3p%ju5EhCp3u7)jT{u9EIh& zomihEA!;loGrY0}=G~FA^bM3rLB3wsdI^!~L0S)UJ=2-2UM6=~aP>E89?Fwp62!fY~@VZ3!e|zVuW{@;M%t@fIaW zC#nXCh>?9Hj({{uWsU{q$rO!H(tNB2XNlqTHKc}3@v zkN@QC0YCIai%5T`h&QKlmS69gq*Q_rmi}`gAa6_as!{%VEZtn)92_X0@b))n94-X9 z;;##c|(-hx(t%u>poJIB2*%1B61d)-M?-LC3p;;j!aw3%*jFv%F?Ayqlr2 zQ`aaSx6c?=E9+LvWxC|5q^(>3OF-hxh@<3s5sf8-WW0?A--s#EBMU{@G3vA*$*Kn7 zNer~^j^xBDP^O)dMdG>N5P$?gAXO6URs~Oe?n6Mh0>T!XC*=pc3sIVq{`vu9wzJqQ zP-BbWg*VYk3Q46rWUZ-%f~3e#OC|YniSy{{rqgigrkGAGH7wWwub^a|@!DyRMp;FrP_opU zDE0Ma>N8?p%y|zmZQ{l>2ug?{cm^`*uynvrK`HrZdr7!8SVbd~l%~h}Mgz_FZ*%M{ zC{cc&18&KMocLVazkkCn1&yyaM_QjC*HKm9wUnsfZP$@AQednI(a{k%T=&_li!u~! zi34M$&z*Pe=_#>B0;<#Rji82;`NQlZ5i#@4r6{lxP&9 z3rE)ktj zRiP=6lGjF1DG7v#3GyC_4O;i-y3u6Gv!EbpZh;EF(FtJH9t zhXWHN>kw%`qz4g{NFdUN$P6NZM4>0Oy}!BP1hm!b>Cd%LtF@vi)$92xZJVf5D4dA4 zz4$J(Y^$YtSP6C=l&Y&Ayb0@jl6nwS1LO-p8*eaP0EslPCdrcknZ+5p0;ORyjq-v( zITB?0qkJK_XtvJ3KD0M`eIYk7juHL|Uq>{VK%nImqH zWPH5_<>8~7n>(`O+KMezfV!=&)_vTdzRQodb5XFqP!%*95NQCVWgI|RvI`58rJ79k zHhM_@X|F(+wws`txy6FyYz9g)+wHU=ST3Q5AbkkCK+!4P->mB+9j38`QXnNSK=6rn zCh9%<$dPI%6cH-cNhm>r>V8=kL>ZeTw#tKGnO#zW@|69vVbeHhT+mu&P=AkLnT|lp zqvtf;gos%ZpYVWrD{2-Gl72VZ2tpz&l+q*vv5d4PiK@T%&37Ye-|L&3rNN-pWQZF! z)qPGniiMta0Vuna1q*e7&7lP@Ycoc{Vh`12+(j~ccIJ-&ikiin!Q2aLU!jc$;eq#v z02Fe`=UN`=S&is=pQsC^twz{kou#E@Ii9#Z+dlavvdiO>&=7g2{V~3$F{^-lYLHJA zngLQI$>@K&O_P*XGRmL{O8Wwg0e?qtb1g+krAalEmJuL(-=*l}lfw5#`?x-Mx;7s1 zaAR)>@>OH9=Q+OGU> zb4Cf7L{r?McCm*#wN8hyy_>JT!_eDu^hcXjuV*vQCFy2IT6O>`66>l`!kK6^T9h>E zS>PNu8>YG?9+Zv`1yW+;YZVh?nslOv$DBkV@AEk$>LQmM0&w`S<)0M(6fVsj%pYVv0yI+@9tCnpE2AC zB;q}c_7REeDSCe_y_fb!k(J7ZyT?4sLy|>Rk$e}^ykBHF8>e6$S6NTBA{{~b z6+QVv*{nC}THWZ?6ef)ZgPe2H7S(}AT09!DbiqJ*0H1>m+#&d!nGd{%L--u|th_C4 zWJjzzugOO0_xatLBkuqssg9AvXG+>h0wvyhv|EyCxr|{t6-YH&v!e)mghK?05TnFx zMZU4;C|7s|5?%7eEgOuj4$6NDrBOkxq!Xn1iwlA%P>x0zL2*)m_sji&c=uSQ7$l_# zHDm;(By#t3oMMMqCBH;|IuthSul5(U*wjj(_BoQd168Vm7`&1|yQUy~b zz;@HihKh!M*UML$>b!TBdXNI4Cj}x11){CAcZ?{E9p=GWw@w|=x??{G6G>O=r;D`e z(xuo)Y%+>$XZe}P;eT?z-TTtFeszN%gM#Ez%n~^(0+wC*hF_U#w zSV%TRw_P36x)YNML@Y*VXHTjxZYK-kwpaR=-qiK9-{sELCjk z9$ji+wY8Gw+dYcOR9V?&wlTlL@()JZk5z1f(i4~0vrJO@K2;5;IWdZ*Q&)oRQc8&X zB%&x;`Z$o-&-3z}NHj!uUY(al6z^O@MrnQ)=kvrKQO%Tp{d1yJA2mom9j>(A z>M%$uFcm#Rd{g@2mhv-5+0G+1S$bA@lJbJ8J@@*G*;iAbt#NWP@wnRQU?2I!e7g;6 zw-=OiMVVlwbhUxR{OnQK?L?Y~>*}8bBdz!Dc+1^!7})fjJ&vM%%t%L*2AzzMBou}6 zpZ^Syryo&TUqwlB9-Ax$MoycdIYw@7j$%I3%7pp0WUYA)n@FOmV^tDK=?Ns=c`%Nn zSsWeM!HC zp%)@7Ro}>!P~xLbl@TZ(seuEQpFU+H_!CTQ-pF=<)TB*PcyeNt_5>g)m9cekQP;{$ zmTyr0^kWH5yA4wmB$4TgK{!7pqm3S8TN6`crrxai1i72Uug#Q)E;8w|S`ND)_j%_s zIc7`5RGKw2(j`EN-pHwBJwPa*3+0afefI2`JRIFInV&78-B4i4a@&$9`j(Hn(u}IF zevpg*61)z~t7~B9W&5=@V^O-X-IbIZhjXNF>bX`TFM$heG;x39EH;~Z3Pc71hH|P| z+$W9sZtH7lXcfvwBDgma%ITCGJQf|?l*qk&gH9w*l7UkH21t`hdWB{IY5i1I>2sML zo>}S?SEllk9wR>!*3u+}6+pd2xrcUWet3LQ z#?FsF>P-7ypR{FN{MI#d3hiu@y_2=71GSWX{pJZ2`{uZo=f<(2va`z;5CJy4|nQSy^ty%jGj=4| zIXB9uQe-=5v6A#qTJRxKT2!biMPfKjl8dekFu3!OM6^`fFvt}e03b;2b4=2qZCL;I zJk^dP-I2crFwQgN`_LhBT>1hYWSt{fPhzTk{`~dp*8?)w)}295s@D~VSOjZZElvhd z=F`pMZ+Tw)EmQm*ELMNjriXWt(66q&` zk3b?Xzz{YOL)3wR^RVhf7fBoLRFDW-?`difNg7#7_j86GB$0!WqJ$*5kd;7bm}&Cv z7nak^dUOw8Yly86TTGAx;cRtkipy>JcubsZGQWG&{j&Tk^&edX*+$R@9en_j=1N(A zx4l29q4<@G`M2o)rTvFF+b;g!W=HQag|%#0On8RPy*>CzcEhGqhvnguV_133XY0utjKk}1+YrQ&J65ebvXWRM73hV~t zV2j~HKyLIv>8w>CC7)3}0;S%=94h5$YNS8}r9IaGSweE2vleoTtrit(fkaM3rcO1> zDq5V+VN<5cTGPcdgJTJjbQ?hunT?l6zL$q98KoqYl39A2#C%MR3!*1TC~c{O(&y-# zucW&%k~F?5N;Jf7DKH5P0o;-L-6lq?$Y`its}F@%O^#7hYRV$QmScs(MIfkB@C)a* zWs0jw6FKuRqFJ%MhDCtzeTQjpv1Y)eM#)7&hP#`$fsMkH( ziD)`{Vz?#6-gO#6SXmT`I7DEjE`@Pxgd4T&CSZd?c6daKM?HExN`qf^_{D&&i%^Z& zoy8hzaN5klHml$rr9Fc^uk3&LWK)C{T%#0NZXY3Hl#&yk>ub3+6ov~02>L0skh?C> z1b^l%kVLxEq@~4OJ0GVa&GC(Qs6f&ZNi?qZbWZAXfHx!kfXUNC%JadE9Uxo_9fj2+46-HR>e9|SRd-j9eY6w~D6O1y1 z#4r*Y{V8qKy3qkWt2=AW-IiVZ?JcJ{5*`8OY~LtXC3gErM@ZC}B}GzCD(zWc8hD?x zgl%V(0=hf$a0^QGQYhWnaV=fl2PCS-%>r{#i!=d=uOg7h-kIYtrzn#|mAeK>a+tFA z4EKp%K1sbqKLklozJVm)K(c}fDlwNBbyNO3xPv6?7f8-^dU1~>)#uOU3v?v0R1MO8 z#zeVNBQV7nlx^+o(N}^+ne9O*`$3{hr!<66)Wh&d%F?r2!@3RcwomzidHYI=q4Z9g zM!0^l*GG_xe;eC4ej>77Zb-p)@m0x9Z@+*A#@j_?B}U)@>`T+v44J?%pzQC7oJ9q%RGL^1ch&jb0N! zeK6PkRrika zom`kontGi`qVpG}M)XX|6rOTzdNJKEB#{Qv2ax2y1xc&w1BGO$^z@?h_poG^Jk~d$ z{Hsr){gY5KgVmH{w5UdeQiX)18?3mP^?JJLa%IG3IP{G^yW>tB3VY&Bk6_a8yRxT> zXofaxbKCZoZ@bh=mpyHE`Rr#B?~$->eR`pd_PcD@!v+>h^{DImZ5>QGa$MRf2$WNy zG)vu8mYrc)x_7RC8G^5yT!e_r_v^Slx4jEE8#&Fme zGEOk^%ULx`qtvXqKQ&8?JSUf4SG1btC{mdG2w#eYaAfu! zv4tk}ulxGz zt2xd8@mHb_eHohND2@PW`Hk;89ESOrc`9*b`3O~Xh{%jeWeG_nlA?LCd%@D_so#RR z1t?+KkR2mPT9qN>c{-c3k*kz~azapE5tM)G(UC4`K;yd|-C{gEi7sUTN3YKso~&AA z2NE%r75ifbev$Y-Tf(OxsTM*@Lh z%u+)-II!=&p@(8EguaRIWRrxwSeg+_M{~(b15!1b=yc> z-IufBvqL*9My`5+3pbWen1vQ)z9guINu5u~-8S7T*ImMOmvD|cxs{T=lu{hxlxrrn znpV0r$SW7C*QrF>dTyWxK>SCAl87uQryu0Tisd0JG19ND{vDJk5H6%ZQJ|P4^2SE* zr)Jw~9JdZhSSCq8r5NClA52}uXIF>sep$L8T7#reKB`bMVS=$JE@mI%&~pA1Hr?2A zy_p6C^5+=*A6sYC)7F)RQ7!?CafL~ZV*EgC2NG`DG{TIc7BmlJ+CT#$N=2f{L!$|O z0I8Cp(op)sJVaG~_^j{S`yLafD+Bh>Dn)ns+_TT#`^sn4Ijcpqo>>!0xj+)FSS z*rY%uX!6IT7?+d6Fe$jd9y{t;c!kP#w~tCL{f z@BFm6UNRZYjD57UaBg<%Fj9teHU7 z%YCuX@u?FnWzu!7MZ4|ofM2qZ9l-K(U2A0-9Ur*lQ|>z~E~WC!`%1PAruO#M601De zI|!GBAsa09=bDoaLM5AfiqsGnHA1KEVqvd%s01Z8DM}s>lZNIy{%DuARl2i**I}I2 zTU3HohD&Td$!0KQ9vPd=4HVji2)uYu{#(tyeHh>qmAs2|on}tJ5piZ;D|!Oi9yy`A zLMj!eD0Pz^cNMm#+iT4t=z(j|JxBTvkjMF z3`tch-OY(gUy#YfF0GPL>N#^bl*-Wvm4Q?inR^E5-UNd5s!Q4RSfM%869+eWS_$ zs7E$k9$RJFJkXewN>(VhWRAajCX>^E$I37Xu`+mR{DZO%EPQs>*3_iYJmA$+EtPgy zR9dY~3NKOeW(^N*Qk6|q3a5nQ?dg$KGAK`~iZnX>4BFG9jd)04481}ss}mnL$HGyK zTBsCEm%5~UafI(352PCjoaM;i#KT8JB_dTX0av)PVuCD0#%ZuC-~k);uRHo@uovkt}qoI7r~~(xcKyr8Dfh8hqNv<5YQkyqDPJhYugD^8aNX(Ji1sX-zhn z2d_oRDopy`T2kE&p|DAMYxkHP986LN#%}=niX9yi7F)3uTuU(q!LStiL?IY9FbKj%hTo9$VENyBn8!K4^P zOZ5no8kNa5@XM!4I181dc(9lUXIXdP(!5tHST(lOC+?_yI8-#wdUEF{&_}%k{l2c* z9Bz253)h${i%P!bMguP^*SqV4H*%@R#g-%vNGVC2$l?G-b%9=F|D4P+hV3M5V4oT{AA_a@e?RRPw`(?a0ES5|?kS^3C2as1$pl z@%w^J)R5vEgKf|PzALVT}OyaOsq=QiK%eHV-TU5gI`CeKg zPgODm;~|#J;l4W@oqAWwko)WT)&eTsGzpc8TM!*~sHAl1OCOhw?s22ghDmjkrNccM z36#c}`-?ozjYQ5&1-(3S61ruddZcT)qwadEI&@>RdKSR^MDGfJYLb1ln$gZ+&}t1J zU2dgI%`s0WP}jZ^W2+pNgt}CMRQ~er&p)k_88cL_tx4qx42M?vOm1va+^j#L6|rg3 zBF&9V0VYM5G@~4p5xm-EEsDy9vk5L8xQRFzT`EZ`qf&Tblufk{jN{i6^>#R{>GqXn zRgFUfvIDEFzkS(<9%>MZO5H@6{s5JzK_$qg3RW|qVe0xbxcL>jsB~Ejk&P^k+EKQWCoaS<7TCku+BXr<%F!6C z(qPg=Ju&xp2z1?Ym@7}il0FHOpa=(#^|s&@{2Qjq2{OkFOFPW-*osR(v^ZRXyPjiz z6NAzwL7(xME=vP!Pf-xITAIh^7*n&nL8a)r%(dc?h|1gx37cg%q_;zw?}5Qu%3X+z z69+&h*Wn&0>ZwX8vmKEzC`{72lI0{B#8A1Uktv8{SEVw#>Mj-Ia8-)R;Y2D&qcSRS znKsWqe)?#W?-`eCiCx~me}4o%PZE_$m;^)$>9NUzHhH)Jrp#%W^dSRAPeH7$(lMGv zdSIqXm{{f6WHN?faakT%5Hi!H$2#O}K0Jo4PSmp$`n0nFmSrOx>R6^&>>KAycyp^Pqd^65Nb~bs)4}qIl|pc2^l5+(!7z zm+U&J!4hXXZ?U+%9C}m&Y9k18pi$c;+4BQL{>L&ue*AcS{fX$|gI&J4sZxK7i=J_q zOco7Gcq5Z0Cd5;aNx*ZdS>%Etl6LXwx=5AViK15hawDru&hqf?bV&*Jk3Yr`E>(pM zmtGjLDF%~IM~=>Yr=rRrFxkpazOtm6AqUc^kh2G^=ur1kUA-UrH&CfISf_Q`2=Ryn ziFV~N4y=nzIlalE0!f#^du0dF?I?KF3!3@N^t|2$-C&z^4{SAPBea6ACIoy zp7c6Su#!13dWI`E+?Emq$ZQR=1(vbu>2gUoSLsyCfr6JFSYvK(?I=A5OF(p*Ej=^y zi1g7BCJzHbBuHF|fp>4lz&=A_aUs_oyFJkO)D4-pURo02ZkrmF^@YN|bcx#uL9Wq2kgrr{*18BE~9l`47ANHB@pqu(m}$e=e64 zU3FN~-xsElkQPLxw=o7H45SpKVPnV`jBXeuA|N41cgF%4U89kb4gn=LP$Wckz;0rX9Y>BnN%*qRmoykS}LIL{RXnydzp|6I9$2~~+xwI$xk z=M!q7%)a&^r0Et6t9u#&_i}SLy-XfI?b`NETu6V4YgY|L*Pn6TW{%NBXVOXSH&4zE zyzifL2@u5JxvELpj{fK4=)YH1sRxA2Z6u^h==AjmUNWtLC$&r^Fw;Wno_Nl^`Li|s zDUsp`Jk(%c0|+h}5}XKry7iL7RmmIn_?v?qxM-LTc+;_EaB-0CqYb9FU-ai7gGb1v zVR}84>(njmUH?+Uc^2=IU@mC$02y%l;6<&u^kYYK_8z8M?Tb+|JTc!KdsP#2q~IDP zOn^VH;HjVJohFpHFW&U(B`O61sU=MfZk9ugfR!)3bW6zIZNK)W-#5Nm)SLfD$`p@m z^J%|d_!%Xz_a(MaS~e-quI%MYmf~Nx-(wq?cY39vX241wLNwf!pu(O9d6GHY)n(37 zhusC^Heph?maC-smAnW!e!W;kgSnhEG5mxo0@4Vj??ke!y);+7%iBW*hy|H7z|C2W z30sd$tRkLE6b{y-wQJXjh&rfmf35imGhxR=ANXgg_P21a!fRhlKI2pw57cx^v|bw{ z&~okiQ1nC|hFupOhMB8Why&HVk`_PqWAts12b#b#W;a4DgHx02as0Z!0KQ6;bN62=z}^?mg-J^w1r z$94|r@(Q47@QIW1QiUpK-fX7Rm>sw^Ka)*HVi zu(+*0G+50}>ffa)gGtI}W~~iqlJYPwS3MwEFaC7qz~1U44OwyyYTUaQ@-e!BTQ&_| zZS5x}k3M*5&SI*=m#=6#L+N{_n*QfdfarVN{rgdUx+x1WOApigT#xxq!TEH2o_Kvs zB1Q7`er?@Bluxm}NuhOa!b2Sy8fR_ZA%RRCG#y^NT+`RZ#F5VhRb5?$Ma~uUUaiyB zFUYB|P)LP8*Y}PLZ}wjh*2JCm}4C%S)K)8xj|GAz^sO);^V2-38 zLMiOQeo=My`mK-^cgdESxY<$;7*oXE%Rm`N#tnig)8?;FY@`Erk<5;`q|&(6n@( zO#RR|oKDwWGZ;y_+>RN+(QfmQ_l$Ead;uo^B(Q4P0c{-cld+4Wi=>7`)E5mfX^v;P z%Cz&EEV6=ciEyeHD}^olZ$Q=rfZj&uW-7D5-;rFo`Ko{TE=%}(g;n?!sib^k!Jup6 z6jjH)HBDl|riaVYKL}T6a3-6oopBX5eE%}M*I~{so8hou6V$QRfc zbs7S!PoC>QC39lvAGz5eT>5w^ItjZjxt#4l%20g!Bh^MhpvodI5$!cp1xqPt)#6fAxl4aqIikU+8c>Pm1&T;zps8f{K98c^~r4`MewL zoQ8Ooo-UXaL`8qde>I6m9r#(r?)AsIS?aUQbD5HFZ$j*iS!lpO`%|il<-Yx1zv1f| zzKP9&z=lJ=FPUX=_WR-s67Mk{Lc72Ph4P)u${EdTT}4ZLhl7K@rOB^M>2^oBse??` z>G0TZ2mb;_%aldjs6Yd5C2)auq-XAbu?I5J(qJ^GxVe}C_wh-EgCWY9%Dp#oxXp5GV}d7i^!BQi^lbl)Bw__iVB$JwQJMZwPm-SFay- z`sbfE{6qwAj~i}>VF6wWUtd-~Q2ePvYwiBtJK9F>bfha_qIiH8Li(wdGrtev`Omm zBP|#^n2z)ylf>}zjZ4mW+3#%Wmg~SlElTV9T-B!PfUtPV(Hq1E0T^(6gk zL_|q9r?-cvFDog+sITjjSm&m8=w*uhUM~-ukZX0>I}eMSOxyCcAo>u&Q<^z?5(9j5 z*rGDV^&nh9?mh4t6OG`DjpfWV#c(?pxmdT&oAQ1zFxk3ufEz2dym7Ox>V~~zyUZiH z8IGY)9o46)C?RIILQL+Xd*Q#fvhHR;!EZAoG!XBP0U3HODZKIn)h zBtJ*+=!MLV0bKD3&>Sm%ZeMrOJuW%Z|HORXAli;B(qQ&E7D>Vj?=3Egb2C@Ir@`+& zZBF1}7RIOUN24ypz(C|6NL^d6*ldj95wyz^oP*pvFsT*6OGo27Uu<{o<$b~)qZpP% zJ1kKpx3_h|9RaO~TjES9s-5ot6}1|iHw<4(9B&Ei7X^RXopuC2U?P#2)qb4{XEU0O zmu%Lry<^G06y{F~z7Y>bJdD(4L16QVK`FWieAt@wV-8BT4>)b7SYAUb)bl0#v_)$W zsBZ18fW2T80xpU=-Xs%!G_aKUn7-Sj>7v9xJ2pZqOk|H;yLo%h8E zHjIi*#cLB^xm0Hzu;yE8r?8UV+k6suT^f&4V}}bpq0zUz`cG2r*W+h5X+Okn*J_P0 zu=k~(jt?~}!?z0AfXr4>S=8at-`%s`#Xi}*N_x&%7l8*c8H$(lO)mQoc+qiF2`IKJ zVEenDkJ<3s{7YXy=;^EQypux-N$_^1n@<}S=u>AdUH7jX_8YiM?TN_{3lbLepwcas zEF5xPfw=(R>(7Wqh%K|{8Oi9&0IM(NGbYkRV6av-Dum7&%vQa8c{b?nu({J8ak2*z zPQx}#{V3vS!mJuy6{c4;!+_bs>a3`GnM9 zz${qh%+F=}^wMKOwT&9?en+04-oQI>-2Y2Cr+mGXgMT)z`Pe7ZojV5reSZKfo5$Zk z!po|hsZr6mH>%ggAnT%5>-FuQu59=di!aaYDvCdv_DG*tw!t6KKqcPl^5E4+8Hai+ zJi5ktR>ceDC5u$Qq}f;H(L=wmyhN0H6+d;dmUH&Jf}jgan4R6y=Xcb6ahQO>Ieqzi zwV`VK_;Ncp$@gj_y=LZuAaKjFvOg+ywnq5U#VLdcSUsN0mchU46u`gHemeZq`>h?f zrAY5phW$^Ung>gJxH6C$gM-M~TL*Wk@{*izfw$-$2|7{ z;NqugrG$uXQ9+ZtyCn|eSZ{24mV+@uZ12P+K4U%jLwxk2VXA7$>RFGe>?tq)Q=(w5 zvVLgz4g6OT;sPVZP8t97KSbj!uXT@?zi&A{9(7}S?a#8tix{3h_Q~8IsivtU0k@Cq zSNOYX@3)cdK|6f-uBhYlYbI5_k-eRz&wdzGC<@}6j%&iABKamY>c5vh|Myw8`a48O z(-gVDs6U(QyVJZ@58!TNH6-68K5JduYV6n+z2mC*wuh*^WFnZg`y=^zuLW!13Bk#=BYAWv?sqLZ@Li?bHb6QR!SYUm{Tnha|lnZt@)r=b~ihC z?rg4vk<=WepZ}UM;7;JbS50z1uYGFkwR}9Q5PU~x4?3DDAIzigH9t+0k|`q;y00~s z{TuzspYwgSbiHjti6%&VR0ZL>Vo+82r#bt5kMrZyTJgVn;DJeSDKD7C@8#d$HjUrPZwLC$S)IOJE1Nf=7|^Y`R~?Q=C?NfMQzx_M-nhr zrGsm`3ih2lI9spkEC(>~_;>fN0icJHmVc%jB}(qS^t9_Y_PZwRM;7u+SS)m{6UZI% zj}yE+%EJv_`QRXsCY6U%v@&jcJYa~_p8faSvpnd<_i9Do+xN~^5d^NL{<-f{H(1vB z@zI3trdloG#P+6A)#r$?_=qBS^=&Bq)JY<_k>f)RLd?7Oy9(t?)dNn*mV-no>z z8LK`(3-)3Nxa)KU-)ODrXD!SZ5$ZU@PpNm*Yl=pLf%hj$%49_tvw2L`s%Wsk^rU_} zPab_F-x8=128{EbthcTQxVJ%eJ&ox^0CBT@dM;t-9q$7QepT0*si|M+i4+OHpxQ0G zv%x7+SAXe*;wnQMgY8R1<-OWktW471hGdlKCO{t>31s)*VIe0T(Bdu1=T}@CWVCpe zL>t2G6GD%~PK|IyELBJcM@ehNMBe{;Ib@j;<7Y?tjN+HGm!-A#Iq9}rqB zZVAv~UQ0ZG_+EDeIGKUj$WoYQzEDyy z0SY@!v<}Y%MYU39Uo%o{-0$fp%o=RPP!Lyq(bu%LEwE9_aJnJZf>M5% zY8NMGw&FC_S{87#^@=H{;r)9FZGp*=t!Qz_G>P5a+Xru-viMzSG+@W+fQJ&Ab+$;< zw|npwgXH9|muD9E!4KF6pXZ2MAT_)pMx^nb$29OE9LvO`+pfQ2D8r$2ZKo)EEYXi zHF+|)JVbtE>yvvFS|3tFv2Nz_!1Xv3mnKX?08A3e!AXAoEKecTq;%3q(FU}CVg~TQ zcti!|dkh%!ls$g)EH_%Bu5bTU0snH;MA_)c!&9ExNZ!yZVrSvlFZid8i;N46(>%K} zHC>tkbwDgwym_G|<%~njvQZW>vMs0Wx$pHA2$N|$17ps6K2Rh&#sS;RUAZ*%8FVf#N@u7+>7zpPk@ zI1}y@U(+9sNtQ{<-80HUUIU$(3{I@yHdOmBfC)ZtFWnBk@a5pHiFdezZ+mH7t~ljl zO%+UjC40dv_s7Q#k43_pW3i`0;NmB~qeiz%(%SXym4!!`X0t3Whi*?aE}?-bK3!s|!{TIAgrN&PZA z%e$O-9`FkOecJR40a$5NDI+omIA#E|Z+xi(l&e?FI?2Q!B;iBQxa_$ySA!$C{{}pWWgvVL$_+C6i@zS zI_P6Z_0ynN=S#|{(Vz2?l0s$OI@;ULc~56E{~hSop1xKkZ+E#p*D6hQ$Pd}Dn}2M& zQ1S#b>^6sZD+z9|h&kZHJEw$vPaTs4vz&|8^26`&>m6u;Q{HXsgQI>G*vPa}fE4^v z9JGrzr61i32LN)KW^Kodg1M2`UUShpiDUGRuXSbFFeaH&EYbs@w7_qKGJMf_%cD;} zHcMe;ff?f@x9l*KDECzwq3nSY8ey2kVs8;nU|?BqZ$@xI!8=dmHmq5y&tiA-hFMI- zkb^XL93YpKjPd$-{CvZlju&5gFYaJ-3=ABn6`D@g==b1_%GvIM}Abq zzq;h)l^-5?l=tHN8tLLc)kT*a+3byT5r?Z(5zxLUFg}f1<-O%htlYtm53$6x`)~O8ayA|@J9!6y8d<~89iEiq5BFr#Uq_AX^bN>Nxo+<} zY*z_<_~w0RLBgnT;=xoPowX~8!tfvtf+sT@serAj;+RzOPo#ssvXs36_XOo{P3GN7 zXr~~*zlnN+V28Y(`vFh@KdgY3y5S8+M3Q7~&tb`LcoUJ}UNOLV!M=M~F4Mnr+ z7*i$^3nV*Jm~}&7w}O4P%LuQeuUkLa+Yr5X@Y{xYG0nQ6iVLPVQup&LJRUMJptOhd z6{A+h@Ji_cOG?&UYc{a^9Zq_EFc=7%h#TuUx4wjy5pD7*UP_Z5L9 zSRDF@U00^d72r4vSpL}HftdY~^Ys5ERQfV4~+b9xft%l6u$hJn=A+8@7)FlEA8~tv_Zs3jL9iuDrd~lPE#o9!V^@4ic{eXm#pmMjcBvW`9z>{jO8Hwud zauT@p7%gu;1<{#Y9fi3nEhX8cX#7HFPRMf!23rU2d!sBZXeoe@!&ULT97D4Qj~THj z@k?SUMbNo_WfVMLd(od0qU~~;X=1IZz829Uni9ob98}4n_rzb8l}DciRm91X{aNM; z1tL?6z4@cyS4C~9BbZcnB#<^bIvLd(q}2EDhV@md_>z{9s8oAp@U5$1G|t(Ca)7kI z5{J81Q~FT}=V$6f-Rxhb7sWp;f|4d$C6r;-0fAOgUEiBDJfU3o-LNQ+_iCI9gfB9A z^LP3_TSMab2}PlA#B&Z?l8Gs=^&yOqwIFj}FB}~y;#N+@>;FEi?8q4Y%fSq?P7)CO zDRmF;&O`REs@$~sMaRQ>BEpDXV2|~z{ukb8o%=^lxu;p~t=+4v_aafhztwZ_6CAF- zl@%-n5pD7f%YzjrpRvfJl;YViis6qd@l!u&StXx6_KwI4h#XmW{I|AiOKO4p5B#mw zIK+-sp$ti}Ep-QS(v0FnRdZJJu^&jO!E&f3@G)=F{=wiLN{SfRqEtuQB5?06kcX`9 z0l%65S!j5&+Xb@m5@M+@AugNuI`LJg)Mnvj3nDDnW3xV)FB$)%2j)LWbMx@e3dH&b z91{(9vnX=@8H$qn%gdJ|rH}--$oWJY_vzn6+G1E?!&Ffd*O|a$;jX9q%})uI8IeVr zemm7|$EdD1*#TT0!@G()<~$Df#Ks^3Z00D|HUVaHrqY0yb+uKj8{jZ8GtJ5jivF}g#v~Hwf)8y zwH+)Kq(GbnYuuRwDg7F_oB$uH`1>~btYOges$%~7mlJinzy6;fQQ|AuIzNAyzK;Gk zxwFDYRUn%#^}MFM-XPZZjLkuGgx{wZ{jD}P9Yg+v@wZe4)H9Xe(2a+eXaP)m(!wjz!5P7H;Hpz$ne z>szF$1zTsUgHaV&dW=iz5^L>ipHc?FC|!$ovF{j^1QZ>?Yz3sTqi&5CFRolhk*$;WjNY;nkNtM`iYfoCa1yK)LJ7KL({LJ` z-WL&Z-AIEk8A*9*U9jKp%S(EIA-eOS2@V7Gduk1L_nNSG)@UKFoyn9FWTx0+88jPC zXf`5g5>Lu4WH05wTPFhz>g;l}8+21K7KaIj`>_+zQq2lAHDALOi+qxopHNl~+TRwr zXFRB0ptRmFM5$oZe7D|hSqQe9g~vz~y{VWfTrb4BPlFuZE%rw8qEd`X-vEtEO}&U5 zmqMTawuU4y$z!w~JcRaa@0)OsK>!IhKCJE=M}ID-!d!ahoaInb`91@V7a!)bZ{_@0 z2y?xg4MRUO!n`dw`O3si}J2$Q1sX7w=H9H|JK#Kp;5Y{-r45dK^J@5i;+p!)l z0^|eK-b;Y!8vss^`6obCKUFp+-|)KEq%U3It&Q2bok6g6mYK>(a53N|rgm;>eCaPL z1;GTR>%iNTqe>O(0Aj^|uMn~BL}jwszjO6xZ4K&a-F^*$$ClaL!7mb!bpkro=yMsC zHe1te-b)PDDX%_ywrTVla3St>Jj~}asdbZIy{v1_)WBW~Cm9k}19rl^79RNI^##Az zwT5DdX=-`R4Q2}ik?XeaXIO(ng73U0vT)|;X$$k128pNQ?H=hZvf(PmtE?8Pto2xA za3yy>Z02?8c2+^N4cbt~O9ND~#Lrsyq3An;b@cnvy6%;_ZYPbjAZJ~#yMiDh!@vgl zbw`AYsfoS3)E6TTi=|%{OF^|VA!IYDE08;1KzmX6x-4@hc8#5X4&U9&YJcm_tZ2{w zzFEf}x3u4x%+95X#=O~u-bbRAq0ShokqlLLq%4%oH-)ZNH$RX=x2@h7wsiYIx|jnX796|$*@?UlI=l#yd&ZLk_b(|1aralWagG4)%&4Ye-WYmJA;$s(ZV6Yb)_xQ* zFh5tMYqd%f&}Dkz0Rw^P5hwx?LkuV@c2%y-vib3L_Ny0RN*FZy?CoJd^1eH{CTvwjHOw0n7+F7plk)54zguuYy$FGI z3dGoZ&V*MX|Jfh~%i6T&R{-XVX{`?tH$6CCZge(PMZ7ls(8N2>NWw;wGX{=rHf+K@DKK+WFx;BA#G zgIAEpc=cx$ahK(G_uIQ~Jcyu`-L`2KM`u==vo_q&0Zr=YUs~AjO)`}E7+f3v=3~}s zo3PXjS6iX6jgI2VA_DT`(U2t&g6UQ*ptXbd z?m`wB(sO4}vf-Z!_Z5pCT{owkS1uaEyXLkJ0H{XY@XfHBxNU6AwB=<`$5ryY$Hw_x z?1ju@z`d6rA`H5VNcW}>OOu|tYkneWN+`s~uvvQ%CgQPqNfaj(?E5Yn!ZMKi^S;WO zwm3x_AbCfr_TDV$u>D#x7&O_KH2s#3k&u_6QOci6$&0*2pd+MKzVPdKU@8U0O+vO5 zW{OfPpep!^n{{^L2TR76ZYKkfj?xb@i~~H)%uF-g{wBlbNI^?>%hhqbyO->(#8+uJ zC!_oCPa#G^r`SCuRWr=>Q-&ivpY7ZIHe{AA*U-F5kT`}E4*rAtgK)7=ZNpSZnsZ}|}lRv-j%O>rhfJR%H>nK0$ReSz2ILOLklEU1}{ zxq{zcko@U^TlHn4pnsXkqD`zR;v>SASeud>( zoE!>AY{`Dg@xn&S&5jYe!G#fgI>dQP!U<t$R>oJ_d8IEy84sH}Vql* zRXI&Jc|nnv4mBbim6F?*s;sl~^keXbbjYQ0=jWF|*0rS+XTK2{^U~_)6 z=|Xz#x`Ss(yJ;O?ZVP|1otemGM{X(F?+F6=e93Nd!C6B~4in$hHYa(c<`cOJza1g2 zUC3k=>z)jSw%HW9eS#JpP$7!!lZireQiT!Vcc1er+DeoQyF4x2lyt|qN1`g)+`SFM zOjD+Ez7swkiu*v-;c_jaGn@tjYspv+LPa&Q8g6a1PITeBC<`#lda{~1WJfn={cO?d z?xlwG#CXbC;PWX15-QL-K8Yfe$&^;~&cGElrAv2cRDi0ZO-=0CtrouD+qkV|79dYg==^nfpMf&x2Tc}`s10mzWBl^{ z%G31dSAlz%GuEsS(4=>`NmAh>k+=F6Gxz}d`h$5wB3zy$E}@n3IXN$2EbZ!!)U91w z!pQziR1^X3Owi)cFGWi2#Lp|t>h0(NK!e&IxYf4J=4s&cqd!?)r5kdAbT~ zUc6W1{{T?0!<}mj*6r;UP=s67P`IVXE}d5nO2V>s0>}^c$IPBVVa4a85LGkl^7jSx z{!L|VnOSu_)(evcdl@5;2D0biq^RCg4gld^B~*Zb(bOcp#RbR^v!@^bhkzMZT;+il=4AX2cZDnKTangT%e~_CrCRjzv9L ziwDxv26xzxWf1!w8Z*^u3k%C@6FuupQzyMIQ5V(NU} z-*)CX)gdl=VegSIe@z^Y3#sofM@?stLUO1^)n8fnDNK_zY$K&;W2Oe$+Twd`oEBMGJti?z{URDrNkWx(_wBI16d!{!=%4a$jg~U) zyGL_}HQwfdl_cwu(T5FW_i&4Rh6eVLD$&RIzm4<@lBKWO(E-ar`+mA4(DG z%=fF3P5r{b-j(uk^ft5F4d$lp4v*da@eDa1UZ_Qo5YKmssl?sv)8TBgI_jY8w zc8_a+)y2GP%OMR;`O%YZvqav1!cEXIQufX=x1NuhlFN0!pQ!wJ3;)N zwJ5-hO~w)$+H+-gQXh!JG^PT}}YbG)u_?$A9BZ-d5Kj>)WkW*|gJE18Xz73n4K zcby^cBzanGQ%lhxvUqGLgU7R5c6BvBOWvx)Ig4CoKthyZ4;=&Yv*G7r4eX5v$7skf zB<_O1WORA+J{rSjtIJxLo(sZN3^YqGxuC-1JN4H4JKZ3%EJ*AI&@6)NZ{Z|fD;HWs zTxXu27w63;qujMa)Nd*Jt2BPxBd?ME76#m&x(<=_^=kXk&{xjTpEzz-C*^1_4^fC5xIBupJQcjaxcL{m@mH<_~qLe)Vp7F1wB!;J=YMkq@@pTXza ziJOaV(Gw_Zx<2$m?o^tQcM$C6t(hi|+~?*zkBkz?5h>*UF@PJ&%|%#VwLzgrT57CAVq?#eH46A<2d{&N_;oBHs^H7E32@j6)1f+Mfi!sIRw~pKBAL+b^0`@#JFIe48 zZW$f>ijkGRYyR$JSOhuv_P56m>YsW$CBar%S`L>?D!RyD<2f-4Q66oxA-O4V7(h2|m?SPKWoVBj10|D{x=Cf6~!6oGb?Xz5!Jl7Pb#jSg}`<5F2 z{rl-M$u&OVS{dpW%h&70?B7^<9~Cm18bGfBy$71!_(8BTK_j} zq|}GrbxoiVN75XplAx8_-CRS@nA>l-bCcOiya{jn5y@&|L_U*4czI|YGKUBZ|7q$R zXhI1XP@Q5;^d99pmA~;lHPHukbLp32tI^i&zm#(9!?b(lZ1&$Dec0j2=PR}>oC@go z(~UXGSo^o6mRD?u1*CpCyQEby@ii47#b2JU$NCz3TN=RMejWYq-~05Xp7$^Dh*Dod zEhL(U`Pa`Rd!t)Rs6gSRbTO#sx6cGB3VTf+UA>Bi(ASw;*YPvdPPNCH!-SY2?G7h2 z>}gCLTUQ6RvMCA>|6g>D$p|;-CMKmZ9hngS!SSAvqO>I6V%0P6%w@_Fi0C#g=i^nr z#`vMRL?G-zoyh}bzoM5S zL9@uqf!y=Wo+Y1LmHMpXfe8Pu$o$MVL-ji!TNY3QBL@6_|^$wGH2 z7$*X+p_|;XSStD6ekr0&*x%3)w7<$~i~vb~#;?G{%!T9lQZzK6s`TodzvL*?@XW$~ zn>q2>vKSBO2UN!_A@NA>d5le5RO^ezD|=CmSSjH4n_-^U8y-j+A7tsh zzcx|jXwQKpK8mN9s4Y9sHhtqe*21tMiMUqt`r%@=|6o88?Ys5wTZ3!PbnhNV04<5^ zW4Amn<6vEPTm_pJuxMU~_PPMDQ>)qs9Two33{CjV=6@oJ>!}TpnPyj4Q6XLh_%s~|Cf`o9z ztTWK_jXnyRW4=NVcDryam#IG)UK8&!}KBR_ct} zi~xibY^PUM_endUcDIfn-#PtN#=w-NgtZXt_O&HwAo5Xlk8zy<3)RFa?)xaB;!v0+ z`P@G`$Cu+(CmAaA=f&%*8I z=5C%a2i#`M?sQxfGQOBiw$4r}b?7gE5QEkbZaN5Ph5I(&G=0Hjky5J!M5SmKR%zA_ z?l*SG!9KI)uz-X<-ia}`2+y*`)fCc)6F!^8|L{o6@+`+3$hNzNub+x`{PAYO5jN&z zH|R>E?>=I+pwthv-b4cm-l<$%^jo`}#3`f&q8` z2ReNEY@m;(lsDYnQgBfCi&^TlyvCx1rx(<7#8l&L?Rp=0U3CLpWD=^8n1v1|+5{9k zwNSE`rYojtH!bW2y_llMD9|Z(sOnccZ`$JD%+A<9>(tJS9wg}*^lhQcljpJna7>Hs z`4x2t8-G^BmNP+#DEr4=50GBAZEoQPZGpXjf)Hf^fXulUk8GoxznO-r;Ef^~9@Dr$ zkpip((JUfWe;qFKKf(CM8Xho)9s2!q0d>F-c?Hag&*ym@B~5sD8{87Zsmc859g(en z8@b0FYb@^}hh`d%0y5x$j~7N>0216u+#}qU#J{bSLNQ&@dHU}yQqYQIn>@mDG$vRD z{aV>JEQ6y3Sr>^zmGhK8TWvl=skM@Kui(l6?p&Z59$F2AuWU!AyK%dxZfkR3dKOnl zLB~ypWhdy9W#ukkP9nb~)l{&X4L1kA1}Q_vRa+~&V}f_gX3yi~-AbGyZmVyJ5!ucG z0A{;FgTJi4HwL{-Tew|uraLlUKCT^qH%F!UgWIPi% zk1SN0Su1P!RswQR31XgzKy7(-P1l-#O`ROeV-P%{ZoTK4H93)4iOsOY2KDv>=PZ zI>b2iA@nQAgUF7;U=)Tyaf;TZS{t=&PM2LB-et}s$*f!Gdg(lP7wP`O=F=j4-S}7` znh8bjQbEizEkGWLh;ioT`mx?3uU654U z&dMs&vnNTZE^xQsB`*~h+s|_xzMb5M3TBh^nm{X>*MUjUnBl&Ewed|B*2-2k+R!k0{xrKCwyc9A4}o5M-&x`9xf5*+ z+Ry17y`Lxlhe_?aD!S9+w#H4tuv+M0hjI%{xJ;x>Yg9Gfyq?@uZ7#$}k-5lD7IuYh zL*8S_sn-8qu`Rl_35#K#?M}Hr9anzp0$kb=H+T@|+vXdP`L8CxzUd&mlajZyv)ehC zf_7PJh(Xu)-BN4_k9CAniFsd`Ewd*+TaA9tXZJxpgt+~91K7LL*yQ#wYXPK8WIyLY z)J!+5b==2T44pJj@qdH3EGu-9+vrI?V#=9cYw7CySnGA)8%y9Rk^jBzrL6gHtZ2|X zUYTw{FkP5iE32}^VR4zp8vp_=WLrO)!oYUpO%mna_JJvcx8ZK7DT~F@H3+w$D3(fu z;7yzNGNCVIx50SJ3r@I=dQZCf^_wiH+1M`GbfbGa#~(;LPTCS$NO4oQJbZNAU+j&# z&7wbU`Pc_Nb{OuW3csv`SXWa$@6RK%ZuZjiSt)d^T>#F^Qnj}Kj(pQ>vpI~L4z$f6 zO&C^gQOl*Qn6KnFqJ9A`BhT1;pqFrRWH%Sw{hKu6KXf{hexN*0`c`g;Z$2OSeZR;xT^*z02EAPYeb610Uf1ewNB-<+L0<$Nd%TZFqs8-B0j zVzCvZCOX9k5U0Au#avZf$ImB5S8<20S8WhXE8gt=-^`Ciaj-}}6EI?gf%W4Wb26%Y($05cK1i4nQE&V zn$4Lk>XLpkSWxZrszF_N)HwD3e{ezg;mI_(ORoTnRR=S2lhn^{Q4HhUAjk&M#Y*GI zgelIeObC$3{|jL%ht6BCKta|~w1wj)G3L zMNy7f)4B(fnjxwdb&@IYil~(i%+&s0al-JhBdw&tjgls)CPwc6N8;@0%b&7TYk7&e zbwv|^DElPx*&U~)++(iMTe!!vooXoQ41ExK1Dkjz3o4eqr4F`-dFhdUw9UqoR;jGi zT80L5mtOI?pHc*}I4&%GyDB0^^^&99PvGsX?a2qNf70RtPvR-w103(L`^Jx#1s!aS zh-ifi*aP>5yX+{U6(+pXoJF|-L6m5ehTxu|jJup+gdb3uAzF39v0=kxk$0Q%BX`7X(GtYudqGJc zVW;!5aveJoHu=z8yN+EOaB6;h%?Z201{wyPr37o(fSj4^(`r3Tlwltu5_vJo6D5QQ z587jgpw0VmOLMh+UM41IBLp;Vr{s%jx7~A#v$tJ@Vhg?MV&dQDz&~Z@KdutyO)lR- zjy0Dcv_Y;Eq?p?E6hWLsQpUYon*~{h*Y6qWL*D&BC$(4*AFD%%DoA1=;l}r-pSBQO z-7|G0ixQdT>f*7I8EE#eD#ht92yR+pu;aK}$N)W_us71hVi6bn%FgtH& zpk+a7iRMj9)sT=}v0p_mKi|3y!+bG2I2+`-e{620|OGQ}pKCI-i`1~~TH`9{NtjfXlDiyH@I9cDM)ME4Rx~3u7 zuyJo^Ecq2E0v8th=u*Z$i-}yB7QOxte#aYxGE$9Q=%5)-%-6mhPt~}9(?70Ebw3|U z?BTh0<*zVd+MKX-_5OQZr8Sy00tJf^pQ31s>$eV~?!F09=z5xn*>4>*&z*WKO6Y0U z1R7#E&dpgYsQt&VnwQG!f}Xwc;YRd(>=)|d<%K>sjYmXrEaLlFue7-k1q0$o_vf zRe2XE=Vcnv38QE?1{hM+cIMyNtsX*!#DfTvv(%;|n(0yY@Go-~k2*wSfbxNHJgR4? z4*^;MK(61tMDh~~$|JuLUx{_0DP))19_r)$F_ZB^{6`J#Il;I0h$94b+13ST)7dxi z^Y!;XJE^}`e}(dd_14e2GSB_2wYHGyDpA*FiG~ zgtFv(cA^&0xWrdO+hAXWG&lbQ#Z*6*BwDQsg^sUxXr;3wd`I^%JWPdw)5lk4t7_lO zKHMhw<`8c+Lx*R!4nK;{xMPBlaB!nugtk*$wfd-^D{9 zdV)NfH*Wo5O!^?R1+pX{J+Sd7{$%5H*Qq z7eo>96l-x_U5JV~S?u#m={wJ3426fF)_0kq)&p!jx(7OivX=Q`^+&TCMvT|%6STMr z=RORc;0*07MB=>NXkmnt}UQa$Yn|*uC?)0;7uaugU@febm(9IQTnfW z>%R{ryQ(kJhdl|Vqaa)g`r~u1w}PGMgVSAA={kfqa7qEPC2Bn4NR1h@!{u-ebl?Pn zhZu+}aVRf5Vk^>CCdyt|z(D?IJmBki&}v06AGwk#IZiihvm=pA{UUFa>2dl%Su5lk zJ>*(bfa-_!2vgTG)i6nwg^0QKV{4GJ_vcsqc8#+kYElX&8c4xF!dfzQj7V9-Z?lx1 z)TtHZ|GgDzB|4cl2T1?_FGCm03X4F9SYxJ@D&`&OGP+qnksEXv(DREjw!Cir4LpRV zV@)s?&8yT@^dhj}x)H>IGH%@eN;(gRCYq;@t0+Y&7LX1~IrMx85F!Fn6r?1C77`Fe znn8>OArt{AN|zE!I7#S80wgG?AWf7eB>_bviaaVv7b!|my7J!hd-Dg}-t5kN=W~Ys+H$oa&43Yefz6^eZuD z@{)2TZ+7njCi&7fl99ciDU#Q-+Ob!%$BzD8?%g8~5uFA{@hWM5 z?mwvi^y4czgpnmX-dXx#>-U4FN_F>nNMjbcMGH#5;$4P0_KKxfKAfK%Se13_5O#Ul zr83&M_OFXa@mEs@=aVK@j;5BwZQBQY@fil<(KksgS$WO5n47NsXKbgwJ`$exBrCj{ zw2^0q@<5C9vgK>v_W&H>k16vWbh9RDC)AR!g_R@mTD~7{ow)hwfPoj!n%eyPRog@=J!tHL zL;3JEiPI=u9RnwDgn!{BaDdvJuD@h_iEo912KQ5Kua6G+7!no-Bu>l}^S>p&tZ%Rl z7oiG*_DcIFyk?<9L*3t_8>yHadXbkl>Fsv>>tfsw*%@`~;p5)dv`Gk?lC9o0hN)2H zvI`BRO%GHl{Ggy?5X;Gx)X}C_M+SztdC1Ofh5fULZR1V>f8F6;;)uAUJ&WJt(M6P;2(MqQEHe0l-RjNcfzjP}@-?Lb+ zO=?5zK#qvMN}<`z8Kv(o6UUTYA)W!x>pe|$x@8E3vX_jV?3v;xjISBL7f}P&glnQc zCvyYNs26=-6YK}Vx~sEE?1$&OaxJ*qpM0x!m8W?Iqn-NW@De-KEk zPcCobnl71+cx6o-Hf^BGoN(Y!1C9MA@xxetnaub^F@Net%Fxe5NvKzjk(_bG%+F3^ zm(pI=?xMF7OilnEZqWr?eR0H8a6B2UY8w?@Sx*NxzAVh*pQ(_trb8b%dS(^KOsiw% z!anq@t=9zN5rnn@2a+e52Efjme-!%RheW0=>3ZB;yA0T>A8(YlO+6_=dq59}>iWRb z2YnsrBidW;Io$daPO`#2w_*6_NrXL?qi*LerIlE)~RW$*l?2EHnr98%Gz@x%D? z973$+$X2h=^v1n2)7v)$Vi#YxEZ(zLC7e3|V#%R6hIV4w==CIx-^ z{)2Ew%U0>$GwpK;B6T#B9XF1oG^JJF)Wt}XvGiVjSxT1)@zx%?=S?~9B8!ksIqcos zBXf-S*{Q2S?NW1}?6J#O-p8Q?y~6wztLXqXf32Npl(*PrZepbTooU+qTj+(^q$oI3 zTUWpJQ9v7Gewx+%MSCcZwvhGLJ*XY-uiIeJC8py0nPGZGUdMn6bVrq^pcjH-rSExu z@gZ!f1s?c>5$)W$j7_O}zg%*ollTu|-$gu9#vCa{#mLIj+@@2}&umByyG^Jlhw+ni|jdh%>@RXayo2r??}3*MJ_dlBjNAW27doY2$2OtqP; zw&|C(I=e~Q8c9_uIQjRRTmNfYKpC-=d9?yH9DE>-OE-3zgk!bvbrn4RtoN}S+xUia z*IOsB^yWI1DckXTjPygLUdn&8^Gp<)dwI z>#y$Mp4B#jAq}Mm>6$cQ5AX*v>c`I_gi7X7x&O4 z!~Oj7W1z>k8veP;`OZ*FrWf$^kAPdY+5_ZJJXc9ZLuX+#G<3MAP3WR5+vXY=>%~pWu45^x%q8sE=Zys5%boB`gclw8S#nifHrCWHYq9Jtb_};+E9Xzve>RH_aA8Sl z_;gAg)X;oENh!zh$J$7A84YArpFVg?Qsn?+(dPZouewu{hlykUKen3WD)5d&Xh@ey z2C2_6=Yf%teIy2lP8G}x4`?%5=SjehMncSrOH&i*I|I>AR6oAzL)<--%mLD4`eKM2O|K5 zKh1soZp@y=aPD?;#M{vr@kqfW6j!a^Q;Q;(MnhdnYy9N|jN^uO)mZ!a2RkpWtMSx| ze&2lEV9tD|5aaQ0-|hs}@E@QVW|Po5k3kL;x^#%f-hE4DRYIk5jv;8(N7Bog=bM1$J9&Jy0mv`rx_+-0JTK{$y829E+#>w_veOMmkp zZ;jNTok$L&+Pn#Yt(AgI;6j_>o)Ybyul&@rvlGs~JS^&h{?)xY&)~}bm$i;Se%m2# z)y&TgnM1rIRC{|ES2&F^VG{wh%k?nmHz%9CE?L4GDDx9g(czE zHg2-vEG|)9fx@W&Fcx)~AsA!7FK6UE+U@PlTNPeC<|Q97yvdHx<*F4m{Uu`q+8B>f zvM&#d*Sk5MA8EFTnfIijHNu5r4;}HlL%+RuJZ~|AFS}=tOb*v@SYxI7>z2w|^|viU zvC|6P(WjV)snYnV>$2@OlcqmPc%jFjNDI$cOex;Ix{9A3_-6hvkamz|!O+z6f+t#( zwd<84Fjy`bX|JjOMb`ky?qcUY){!--oQf#pm^`%9HEw0JcfNQ_LO|;-a~_S+ySB#f zqpbg)tWevi{uv$ZWA`%)yl_cfCASZ^_SYR838{el%qngV+gZ@x{!) z)=)`9azuuQj#9B>yOK~{A!h=%QroeD=`_?mKtNn9lT+P!^jEnTKzANr((L$17d^#v zQ##^L{H_e^b^d8)q*4|J($Bs|IxhZO|6HBL=slmNN#42+lRqN@lkUXV_#K8|S`~i{ zTW+lU^CCQt3w#Ap+8j0X^P_+4j{J=}bDC-oZhh7bGYrltYVcImvWEI53<_7OiLJ*^ z?I(fhQ5ox2>S7c^eCbX7F5FP5=IphUc1_0l@Mic5g+6E2_g@sQES@{*nT;8?lpB!v zIDJ;I!5bbZPD4T*c$(zvrZeM-6Oy#cCCX}j^yX<(#h*TkM+dUvjcg|#XO@3YxZ?ty z7#Kb~cp^M{+$DGO?bqV=(PG@&dxSb4S-*g)riXs;xqx~ZCO=#gnhsv|{pTa2BH>6H%FnR4m5~XEVV|TA3h~#^D9MLWOi!)9 zXUl*0t7txb>mp$!gX>X&V(=GDTSkIRUTo!F-=|d>)N43w_CnnnR&c)2ecmbcj=kaX ztnr)D+~@J-lduO6vq$5}?DyrU2dV;@^$uHIrX(ho2&at3$0&#(4e098kx zsK4jDY3snUA`~$`Bdap7rn1PEpawmnli>t>nUwbAg&jJ&*7d?G1Bg~a>5#wu0~g(Y zZS*6B_{cH42CR7>j#U6f-y0M?-@Out1`l zCZn3;BW!{<`l>2XbTzlof@>^=1UwAikyEh+66JV1AKrxzI(uMY6QRv5C0NoUB0Cv} zsYX})t5&eDbL`xxc68$Z51M8(uV@$Ke`K`wpk43@XJdtA{fd`;_mfKzlvvEu00kB* zCnX{!(7AON6$l)8bi)EKz3jDpvLZ;ff;eq%uH5Dc{y8X|X?b^|AN_MvovW5;e*@-{ z0P5#{Z{8c7cTef?muF3${ocUudm(Yq_2lLc`@Qb(+g#!DU_0q}{&2^Pg+i|Wc1v-O z6HWSdG`zg;h3-sD4#}Q3@3mfDllF)g>i(h#YuS(|yA2X%l}Nz3iY%j-x<4DfpCJ^T zsq3L)E9ZkWy=(we;Oylc)C4R=6_9;+#;53E1e&_ApSm>ZjWo|~AwM$IC$z75gRUwpW$QrU3O#fo5uPZD=WdGY)qtfDusl@W5RU`ctJgFu%ZtBf%h@~z%4 z4vHYf7Xxau9&OQu`RAmqNWzVqy$EtCdZhIYOtS5z}nF0Sm zeRUZ$OXgu{TK2>?iThYw^j~2d;|`jopnyeCXi84ZX9JhiVf8k+2plFf*_0id7PLzd z`1IJtPGs2he% z)?D>Mp+i`R_M;#={7AHz;=UCLTGWWCmv_WKCOXiy5~2k;u*7iV^wO?Z_mENweUogv zqHVeq#*_bY?p$9KvF*}|yosG7%rdMTioy+dqO1TlraYdMT zuoPQ|f!w0L9Atu6Ih;W;+4Vsdw(P~KqQt)e9Yl$uSIybnm76R{wM}ilI;2I)3Uncw zsPZy60WaZMbG8Zw0=7c$E~#4qbmd^BJZ?8~tw)gLpYW&2#)AI+HoDCEzk#lJQnHPC zSMa|v&}jJ`+zgZbjHJ%OKV~<+{0#VC{b;<XbC&A2$jprBlP+oX4DRN# ze}cGzjzWx;cEBa%Y6fR(E9maHdMiWM{m{zd4mv6)`fD6o!`2eQ_`vV)!^4?Wn!Fb{ zF|Xwbf<>^>`DHn}!aLGfc;r9wX9|)f zw3+-<%Ek@3fyw%A*&yLzmM`J}iAlahH#V=n!I!<|zH?~I_j5Sf$F2QHHs)SvOdgA| zv)lNe|9P3pXbjpMXq0*$UB~E9zk|L<)NwVE$E{J&RvJFh2H$ia6#d$SM4z9wFFlmFe-F)v`Ow>`mQ&HL}aeLOCZ)4Pif9 z6BPgy>CJBck>I#jaBZ#O`EW_6TojiW9v#9}yY)l_IDXVdv#OeV#d%pd|a&WuBW=zc>xWz>U@fuZwoQ^#P~6KhmG!{p>4(95|Bcb)k$W(AOBa4nRXK zC&4i~6UXsy)OX#nQ{2)CE(XGXZqY>%v>-QiPo6&FT)^q&$i~4N9Zyi>sSn`;6!JG$ z9Vt#Hs|LrF7JU09O=f3mHWq8RMcYB!GW>c)R#~V6DVv)v!7`FV8XSWCJL0;uHB}IB z74Q?Xx!pQfR>qN~8!0)?WTQ0&u~otfH`URb$w5-$UN zeTO`WEJ*F5foaI2x|MeMc)NU$z?54&%SU{HiUI7S|I8>SD*$4wAi7ZKDP}CDvp+`c zvsm%N1D7j;7`P71Ip^IBG8Kl3Cj5ZG^MYg4ZdE{x{y?=o-9+SC&xCd{Y}j}bx*Yz3 zg!F^QcoV00brUqJl$`vu-~*rQ_zILm;|T`2zJn2q;rXtN`&Moa;na~i`)aHBA?8dc z&^NbN0BroEv~4wkJ@Mf=m+{QVEY~f6uic-pCs^c9h0i#qBTyr^`aPRNFGI?&B>J>D z%D1KNtTv>S&p(;8E=f+|HSVa-(v18t?)&J=eK`H=+D=yD_2_3H#A()M2;Jr5eO@NF zqpV1LhhSl>@!TaMuI9BM@N`b0hw-7{Q*(_fH8)fbaq4=pQe!c%P3^bkZ~3$+$0i$s zg0!L)q;RV@Gxy@Xacz>dI>LouMP+T10~J}ncAiTw{w*qZ&93YCr5TL66~ForWax;= z{9kG-Kytb>P-lVT^PgV}6%;OJU?|3CsSp}@=qX>+v^VWjN7L}fjkMl`@c_pFe7B>z z6`nn5Z6FRcd*1vKgnzG-foYFxv!Vylxy6lrR#xB%`6`UE3kFJnzZICcXyuE%OxRiX zP~d#(1Ivz2R)FtnJ45&P9ba3cA6AF@OCeuh?LIZIo)&~rM-cp*-}$Sl+^3Xscll-c zDFA7OYHAo62FK#wURuD0z+6!Cjy!`LpF(Z_V>MiVdM5k21L$kUgaJp0rajXGU$fQQ zar)*^dBH}5ZpPG$)48aIBY#@Fd5yKHDS2@ylC_Uuc$xp&#f3&OlWLIieB7F|SW~Y+ z2*g5y!1;UHXIY}|4hH))+$KfBZjpEG7ONdt>GHV(?tv(HlU*coE`T*`dB?cZ6QU>6 zGco4B7bb)(wFt3In4x8;UD>eD4P2@}OdZYIRUeB-etFfP02CZv#^jgri<*y!VU?uR zoAcE1G;M3DrwFQ31QLBNeI!E7f#zNJN!|s{n+T_?t~B^XQPc_}LznX;^r$%=`Yk z5OdP#6mwD6{-Z#=rsEL^5xDJDp)9VkVW^FvN*(3PmCw<2C@SVC%(>!@zgqI1%5s+*nvk5J-^Ii zm+h7XU&Qs!HnIPG#-`vGLj1BQerO6uYIkw)f+XbtMf~^cQw}h)e4clhDSpB)kX)ao66oZS69?3y+6en|rU zlAdH&uwiYtxd1Em_P3!h6B}l4zGog-P?Z%PaB^QZ$DuJ^1H1kdpnlQ>1nBt}qH?&A zbT{lb2^!JDR0cNX78Z7EDas%;{?!&7d^qlY(%JQ?RJs)&QCdPYhgZRNQW-0VLmNpl zcs`(W62=NVj=3BW3{|^oCG1ftxWqr|)>Y2S!zS1$ig?4x!_H;p5X@wIx>c*|{E6fr z2*Qbl$Z>c5g|v$V%6o$a=0%V9<-rgBeH`8mDpmhC$l&OkU_(i0WvL|G>d%&4(o{`y zG?VAEEODUXzet`q^~Tmrmvg6hOIH*Q338XMS#A)KA7sWq?iC{m-xP4WT>FR zO4no7OP^p$bT;M0!{C3YzbL***Jevi!PsFImFr`K2k$oDhCliycRRv_+;TWjJ{zNo zf6=a44MWM+W*gCepnwkK2uAqxJ>W`8oSiB63*a5@w#jR~F Xb0@y7NXqTn2LIqa2WP6xJY)V3#+H|6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/binding.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/binding.png new file mode 100644 index 0000000000000000000000000000000000000000..f9491698ef0565ec7e81ab57067ce346a29584b7 GIT binary patch literal 91100 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%0A^D-h(#PkA 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/containment.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/containment.png new file mode 100644 index 0000000000000000000000000000000000000000..ead4ad6b166a4352b34506f2121584ceb283978f GIT binary patch literal 38720 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/convocation.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/convocation.png new file mode 100644 index 0000000000000000000000000000000000000000..c2283d2e8f026f7a42dd1016ccafe84489c90e5b GIT binary patch literal 99654 zcmV)7K*zs{P)EG;Z5Dk>-_L_k0&CMG{qCtP?qLRKh3K0ZBAB|%jv zOi4*>jY1|QBrz{9Bq1U-Gc!zMFH})cWrRLaPEKTkJv1>fJ~}!(H#bT}MIas?I5sw6 ze>^)mIyf{mJ53}Lf2dbfR1pyo8yXsDhd^6cSPcveDKk7bNFiZeU7ivmDJnKLB_tLV z6*e3YMl&-nB_lLGMkEqrEFBy)AQw9-DI6s(MkE^-d7dXfOxyUMOgVW@BScIyyNtNmoTiLqZ8J}1 zFi&SNPG&Gxa5YtLG*Dc2Esi{o41R)9T{2w6&`0%fM-%7?{_e|Na%nw4TNBep9Vl1aZu2 z#A84VOlt>-Bi14!MJRsM^Y~TU`11$Uajp3SY8}^41E(tTw;KImz_o$cpiB+hZW_i7 z;+g{ET0#T3zJJhlOa>j4{R1jM^N+268rJPtJn*>DuUH$n;(i)v>zDNdaS!^Hx(BH5 z`=OHorUr$2)u3hmp7%a^;E~}0Y6EXfth~Gq%6S_orTeR@sK@DR2IwC2?LfU5@U-KD z3(y0^?*O%>34jN|_Xf}(63U%%?nipRF}{XSN%>wAK>fQNfCmnme+ayveQpn>?=`~h zA8`6eJG2KNJ}}Vx{rQFPxj)(KU=YMV0A2i8(N{{}_5%-ovy|~*yaYtXYKr049(WzX zUi@&xu>Aq2Uyy$LH+cWX^zmS}fB|Mo!HmK&a0(gyUhy6iz$||4K^aRw?R>_N3u+r}wuXlq@l6PejKvD!U&UApz^84vPJlXk& z!Su9A<6Eah5RV;Rucs`ooymTkDSjyt0G?Y0_mjQW3g(o-%Ydg30A~}xAwRRagI&l% zJooF<=8S;1DM0F?j=)H2fH?4Ew*Wj^fPV4;mJ5}g&f#N{ztsppX~2Jsa(B6xC>AX; zbB@NhQWVi|0uYqq$pR>YjAmTG3BcUo6#!9x0Pjx*tP%cZqFH9Jm}R~UDg4Qy4!{;) zd*j-&%6eZ%Uy>2c*@2TWum}K7Re-0FD_DSdNq#%#`~mxY_GvZD04#An)W>%?U+N@n z2dm$`OiUuaN%>5{I|rR$Ec(NnQvr^4$cBQB(L3Rz8%YO=E1pcQYyqJCNYbXS9#YAd=D_&U_j_230+NQCu^VwDuYK~` zBoCXE(UXaw;bSKb@PrJVgQ4j%N#SFEI^@zvFOz{rt~zow2vQ7(cCfY+2Q2BJ4!*q| zL`zFoV|*PTXZb4Uhd)8i?qdf|3?NqcxIo#Plknsid!iy%Cl#^69BgDY5Q9#A(Bx=M zI`hK9+QAeYHQce)3J^En+|owmnPHMk(Iw&1M$CPx4+CNEJsu&|a*;|tuC0%CY3Q+# zk0=TUqBBJg)qz-H1$do8y?y-R=zi^Swzhs!&o` z9?$eiSh5_Rr=@Ap>x_~-#e)(=}-{5gZMA;jNh2W zuaze$L{hJ2X(g#(64q4WRtbidi8M1N8VyQfa!#|J%LoRMw|`{tgt+uI8*q#uvNi=w zk&{G(75B5qNm9ThULk2C#r-5;L?p?{jnYWwKtoUCfxz~S6ebc4Taut?fXYd9YME?< zpktt$G2v`zU=Un!wCZ%93Hgt3SY^TABo)yL{X(O4kRwSQq$DY4lG%D+rEN)KZ)6{& zqIKu(CK1Ea_p?|9V(I=W zon*8YiB{Iw2FW73M<+o7gw3@vA z)K{XuaQBc2$f;9e-#;Dq}F zt+I6f_^1-nUVt!#{6X(CqkYK(4V}C65N1|V;niZAiZ=*FtNXinjZjG)2(g)DVSGkf zQ?Ik&v-8Ub=LZe1YcKdTylVYY&T7NxUic1!+VcF;5#Gb`5zV5=DcVW29wes^lqEmW zo1BeM7Su%OR8+GN5g>=q3t-bF76jG3=Gwp<= zAzd%3>w8HN#uexQs@$ZoZ=|P}3gkf4jod7P7moLNIiUcezEqyb{arbrUC<|^0~H|b z9PD@s$%YCLY(4Kxm*%fP*z#17xHWA+I zS@R~41EtZetMrR9BH`*%$khQ?18obG4E+e`{nT_ijSPrnT5Neej&w0;Mfz;@0;GGs z07*%*T+82!WY#C{c8i7{16i*Kan7v$3_2d%t0LwTwSu)Sk!V(U3P319?OF*^sh*7U8gP zkcCg^Xy`T&M2dzCy0Oz?YdBqOJ-K>1;y}D(TdVswo?;0}_*(kVVmIkl*TWr+D12?~ zja=--xP7~xidAJBh&oPZW)1bvo}mc~-{9)Tw#L}$!A^HLeQxVq)}_0jH%XZ2-(~j- zb+g}VjYZNLas1Zy8=5mtDP>**foRj(*rK(o?hXU3s_$MK^3Q%ZuFdsbVt0L?*I{w} zPsQF}H1;7rvsLy8w3@w6ahm7FUE@<`7qnekDXo&a4@Su(aYxpc=wl$9mDENm5fm-rLgC-Gp6v;eXu+|ydnZ@tHh4loImQ=D^yc_E*EyfzV57apSdO067E=!l| zY|4FqFnRBny!+96@2vYtT1$H~+aify0|~bf>g%P98H~Vi4VRpyGr*V230A-$C*jCo z5fXD}%h=^L6T8K3Z2Vwshn?kZ?h06k>lgt`VE03IS9Z_J_j;E5u@q1oZ0?K#```Rq&yxu+lhySz8yui6c)PF2ds486cmGxYfE@++h(pEl%Rb zo*ya$6iIto%8i{bFxOaN`t+eI3zlxD?3xhg^-YClHUwT zgohO#26z}tN~5nb{l01{y7?6R}5 z&sZ^y!~5VBFssY&Q(azee^z#xvI#J>yK%f{#QU`T=guxr49eE#KL-tX$nda~4n?B0 zBDFRmgAg$eIa>e&9O?v{ob!m~ag5zqz;j~-goo`*pd4Ur z+~th1%LxcMg%k>Rn1~}p6lwv+vZ%57%~*K?CNq{5CO}R_hOq`ao9qk(Sf;^Sw8tAv zfUayQQ)M=r5U#97I>0sO`Pcx|v0>2Wi|k|8oK0^j7;JUcV7iHaV5^`0D&>&ot=&BI zP8M-mCLUMtgogZyL65GWXX%eN2#;^{qz}#}z{%NLc$bYoLh@GRH=rKM zd;`P7#4#4Y(g5LM9dhOyIdNFP2FR1KL{&v(fk}V_7-pCO%Ldg>K({lC**U`q*bElH z1Xv8ZvI1pA;dklKlO7-e4n4)7nOI!U#aXiDjAuRX;r5)87Dxuu=I0KHG*L`Ft1%P5 zx`+Ac7f=DecW55EoZmmlIZ|~1B!?-HLK#p*)L4W32H~ZPXm-k-oeh4ib_RpoAx9k? zG!G6k*gA9*0SPe7&`qqfo&>lqVu{Eg&9Jap2e>?d`p*FC41RaGtN8u~O4ka2qh_26 zO~*W>1UV-UJH*Wt$qq|dPT&DDlKm(4&wx^5G?}M z?L}n-whh`cwhdK6+P9cMXG|~;tr6j-2qr-DuFg=-l={lWFZ+bS@ zv(tFDVUa;z9!g?|%CGwGom6|wf;DOrF&lyG_} z3MC5U!s&l>4}Xn=;^`q1ogNN373PG~D=d+OIt=-JN)kdNl%>`t2xV)BR96x4X{{3^ z6_L0@(5d-H)Tgi%gI9evug}`HWM}nhdM1ApQAqwM;_H+_E^ko%>$NJrpRH2%j=&n5Sei zWy6?~(qV>Ovz>{PLAKfX3v}37+)h9hG25pR1Q$nL<%YbpDXTQs;1UXyAF=5=RduZcO zLZ;)WL^dSJJnXbq^RQER$WWH*dCad!L>+>{&H#v_qevWvofV%_DS}U#xkBWMPg7D6 z8Hdk9#1KjS4xtqRAzlGItp6 z(rO4erF}|b12M=i7-IubxG9Bl!ceY5Q9Faul!kI?%!DptRGOpYQH*H+ulTD|714^3 zwHQsrmc}{XYp|C`@b)iZmY9d)YD@$f;9^^&<_b19Yg*KzW)t1@_ zseF3RAs>fREM1K2R1ay!K~A5C9Af~L*+XXaFeS(}l#4MlJUjAqq5{v^}$#(A0=wb=wc4d@t$ODxsNmz(h85l`ce1HyoQJsxHp z=r~PllZQnPQYxlVCQu^t(Cmzf#yo*?GtH$O+#uJi+@NH%7!A1`$K6z@dpZj_Rr1{_ zf`(2-sYsmT+3uXuR*i~~nrM{y-Nb0At<0NJS>{5qxnQr|pmdhwpaME4G+KJiazr|) zz8{eXl}fN&DVH*+7=>}5FwST*nvDu5HB@jsJp^U-kWg@-L#_l0&qu?kRVk}-1m!?y z<&0LR9>k_Mj4xl4+#{uVp%_S@vTaY4l)f)Yq|Sko(`i%krD%T0xTrsOgIYqZKL zqA61Da)DyX87)eWipqOMn|(2o1+l#zLCL63fWwoR?nw+vPDS$>qaIC9GD@IHM}Sc{ z2P#HAi-l`2IQ4h3d265gqf(y%PD^pB?`KN=fTW#56wm(G#MgU*i=9c$`JgZfhRG79HFeFm&yY<|YJePPL6p2o%D1;sOR=7p~K!8b+$1uL|MdAsHp5FQu{5;TAlsr=6E^A;37LCDIsjohG9sqLkoP z`Z20ZY1GVBI~AoQX!iNj2(XHb8pXIeC96mR&5|IOWwGp8?3w|hwKvBuP?1cPs?n-p zOjiS%Udk9$?eZZIyhW~WWxfW0>a&B#G1L>KG{tEg1R9!J)b!9%h1*9Q6CVfYL8VGo znpLp0LPEmoKs$0xQDJ@eT##MC-r+&=FF{^QmbOk)NoObR$k0?sX=@z=!Ll-NR zqj~C*D|M-IzUbrxdUOgLPYR7dNvXxIsIklTANv>-CE1AA+*ML-^u7kfa5<+ms&mbQ zmpx^ZQZYI|TW8HbehyB0Iw3trn}x#~s%pJ1wI~-9V+cdIZ{Kj}LC60SvD25l;y>B^{{wF5ypjqzcgQgB6VH)>Y@3{YBGeWCNpU1bPZSp1HdI%Rlxps> zRi|{SauwgaW2YXxmIQJ=fdMOxM4%OT&R7M>%k~;yzB{!ah(HmiDCP4M?e-KfYn^3} z2c^`7i>GiRA!mM2OiaK;0ujfZW*ZoMTecMA!t1K^@#pktaM7EcY|Tf11iCr=xev24u-_Kan6`74;n)$z+ehb(*X zN^+%;Lb|Q_8K{zsGsJP=67S5)D%_(~A^A(9D#TfaaHR~h;)Pjp9S%h@j4quy0#}?t zpAd3FSB^0rWNH;0Ee$M@EnuZmhFYL+{hqYnD?ZN79<9)ZM8Ls}6EzMP#mZB|2d-zt z^45-z+o(UA1LX=+O+4R|2%R1O7jVi;3enu;E46n;!&a93(%$Z6N&2`2e3oSz`P`bu zeuQ$GRo+IKNYGK1dsyLLzh1|oW(74X|EvSoYGwhKGM>x^R#{xQG$*MfLoGCGb?EiY zcNcW_a78KEq7*P|SsE6xvg9jE{j9*6r67?RCmyk)uP>yn-Hf}Qusk;TM!lvfUtlb7 z&=fcf$F}a&*7DbgpKXN!CRy{8ZPimq^b>HbG|#M@IShpq#{&N3ETniSBm@!p$sz=^ z3}=d|#HZnBgjv~yljpOF9Kgjhlj70CBM)p2JrBdy@D*zT9xubPWU09>$?MWmlXrab zj_;3Ej!|ibi}m&ylVQ>x~(%FuH>qi+SW-N8cPjh>~OL;)+eJ zZ~xHTugsx~vf^kf@xX`Z{_L1TaICLT_uYML(4L%PR_vkaE5e|TOMX!02K*g3;%nf1_4XHdN*(9%wX|PK#Ln23kL5iO- z=Y!}F;TRQLI?8GgbA&;m0>dDUM_O$E<>P!@(^#`UJ{H`PE)+!_nHi-BG7}A=8p%Mj zY{HWFHaC5{yYzNrx$v^2lpB)lUf`vl>Z(+z@-0(}gS`z4yZcTCNgSDd{EvMDX-= zaKtMmVaq9LWqP`C1X?cxEYGp`GzfTM;rgb`=Z?9NMqz1%!g~95w^|*E3PPGdrmbRL zK`Tx1G>jO<0n=rmJf-=fQt3{*-P)wnX`QggAAe|l6c`1%8+&w@BeBLft+NtBRt8)k z>6thZVw_5787aJLj%&P!g)9t_g^J_C?_6=eQ_sKAzTuf4fU`Zm?^&LPo-Ur<`jTyZ zA?65OS8R`qm@Owu>i#jf%G};Gja31y*CGBg=LLjk#G*B=@k-z?8!$F;p5k!<*IFLQ zWlF0P0n?3uKK;FphiTSo_4>(4ot`il9Ax1}@LFSh7ppEr>Bhx4JzZ;bBggT>=@;?? zTH;WouU4XjM7q(Hh;%l=_aX}g-vg1Im~;iPwMHrnVheLq55~04IcbQoU5ydN4s>+H zb}kDgAo288*Hy^YOKcr=Wf;7!Le|e0rBcjgkYT900#_HMIOe#kQX#DSv`; zG!F>C^fHt`d5nk6X17}hOk02{VZ2^%G`ihRXEJFvtJT4PP8BEl4UcNdY%kSvy=@FT#Hv5hCRaVdkaz7cw7E%eSdp}Jb3 z4B3Csdd&+3xkOt@Q(iz?@Fa=AxF{fCd;^SEs*_1~GMRL`AZZOSt+iU6Nvl;sP1c%~ z$~Ss+yWhWm`-V84z|xZ%4C8nZ92M2LA=UU&=9{P>vA*1sZe#IBzIP-eip%& z>zXYRf3;HevmhBH>T0uEalHd7p-@n#ak_}Ycq8Od7)A=?5vZ_Xyw>YTtVHmd>akw0 z)l8F9bui$xZB=lhH6rY{Z{NRv#}j6?+Ta9Fz?7o$Py<`%C$AKtyEWfcVNo8+N(p6t z#(Mpb*abmebXBw<=Oov*N|EGP-$(XVB3n<3d1M>3?fvc1f6l?SOUtd4J0&4^Hmpt} zzCLHVCS&W2%h5{d9lc(Df!BH+BQq6*Aq9`-c)dPqwdgD%RBP4h$w{**PO{Z#_MkHv^Pd(&#r1vFqcYCWyW1NVqDZYrC@a}#!f2Ij<0X?jQ99qOQn_x3 z^(2Xq_YglR>75Vh;~Kpd98UBYPIv zrI(Pck*L@AMfRTf-e}rl-TV|XHBV1n z$9cf{nKk}|8cwoaGaKJ)gTZ_B*<30v4oR-pwZtxJ1g)`OSl7s27rhcZ9~nZX$l-d3 z^-P&1Ol7~o?89|~ZF!}qg2SyXB* zU>CuxfgMq*@Nx)404`ncKL7 zzgEQ)&^Tw`Csj_{_qEAJJB^Uo1?dgRQ`FMWYiuc|wRi}%$S$t0e#BOrpSYa=zNa>r4--iD}PyvDE3kI(b_;)C$4`sIYOZ1>xu)Q_3h1yvgg$)BOx)_8^F$^tV39JRjo5xUm-0^;0V_*>>Dz!Yvu+9QN!TXK;Mv2fUiGKY!W;KRCGcjk> zF=O=1)3#%yan>re8ciX+KmPdTuYWx~cHM`|2gkOiXO=VMjgz<4+U#a>E3~w6B$Ey= z&rlv@D3c8r(|Dx=k*%lE^uQIF|B%_*F4<>rXb4{nnm1}qHiYomzt=lEb@6CBsLEcaS{)AtmNlq1M?C^;+aCH;w{1Dz<0TrW*}*ez zW;eIDKM>PW4n&mogTdezH087B)$|W+kwnRCDwAZ*wGH_q49?mw`H?ZAjO?Ogtu?5C zbHLzyIKr`xA>Mt%-aQh#qR$@jci*saGeSCR`9fgE>%1WVXJ`!z$dm-{Vi15!B?jOK z-EM)FktCALr5DKjB7ymgQPnfXtao;HipTM>+qNyMQW=q*XAkP0Hy&d;X*-tZw;k8D z9}x&yhiZFlo3v58%3}gQ|!+u1&Af{ zfXSB(#{YV~-bE2ui9Af^ip*?%7a0W3O_n3G3=n}gK=$exWTzNHax(_H-y@E4NGIvG zT^FY|HK(TMqev$ce@d;ibMoHy+HJ_$$ID0C_B_)+ySX)IGnI~%c3Mqmx#`k0y{>D! zzVCS_L~l_giou%AhYT)4`@jJ?fb)T%Rut55hH3qRqE`86?3psf&E{+5-7_kM-h25D zbLAV5c^d>0v_$6RJ3-*>mXWy-FbaVz6UYuEvI}TdL&&!$biEGx;&}Er?BOVhuQ)ES z)NJ@2cm^0!OjP33YSvF4EgZ6C(NS8yH}ZSH>ug3v!t;>{0+x>jIh{-!Q*YXZ@ql^f zn*dUPP(VXt~ z(Ht=}1D)J@dzwrdyK^@5DgB!O`@LHa^KqB+Tzg&cDqs; zcWM>9*2(*x$s|FP(+UMRM>#m>O=!(p(gZs25`+s1ImjDqF9#rz4dt<9TBKwJkrEU{ zN|wq%7_4@|7J*%Vx#R?%zmWtcL`GSENd$f&z}o^tvnK6wDM(8JVZGIA-)D4T1y85m zvxc`fpYed`!9e1+D=qT!s(xc+Hje9^UZ-b{&g{zL<<+J056g3|z}X=xa(Z@)#M7-m zP_2J8mzto~Iz5HJG8>~tr&%|9)oQb2g26Df18!aL#EV%i90Zp6aV?f$OY*GMbUqA7 zI%_3N38p8>gFqxC@*IC8k(d%wGz+~^y`PO5AIs1pYXREzn$*jJ6Bs{#Bsv8G1O$PR z@H-YD0;|AI22cq+KxhteJI@oo9OwYCnT8OY8*Ej`PrhQblu~& ztXZi7(q44s9Ak%o=K{R`WdjtTD0?a2(rq zudcw_*^DHtbS?}^Nr~DdQP#zA+w1j)V?1o+M7x5+?D=&cjT2@edU;@oxr|QWxw-5R z!U*KMzp~6WS{5uQAS7}E)u|>k2wQ>YQ(U{?D4of~^x;atEsP*DDfJTB z{Xu6Xgo(9D4#I|n@Fqoe<|eaP4_bsnr3;q(=GY4q2HXT}g;7CXc7!TTF{+Cy7e;a(QhaAlaNK5xgs}IfBcKv`MHDTt?}* zaNf)((yrW}yT895P0S%!IlQrY&QI`LkJ~Op%7xoLcL7>Vn6(Mcz#F@$($mwnP1cXw z_5j$Mo7t_jD0bVe?*8wn`wRCNFLiNj<25bM^I+LmhB(U6$oFl#j)$m(cf|pW=$!GJ zJ>CA*pvAG5pTM+D!6HjRVdCMT@I0ijy0{=4ELEO>0a4ECcz+nwQ)0g_K|5zW)u8P& zp1u}FU51DFmMmH0?UdG~K#06S-~hpzwCfTfI9N!r3&*3~wrx0XPfs*2R=ei??0#h8 z&&SUKh!Vxghi z|KCI*WNr7tb#R<0bL7IbgYmWJ*XR=M?Cj*^j36fH%vhW5v38vxpv|$O8}U5%5+N|3 zr!d)I6j%ug3)reYFEuHKe?z}vnF$Ut42Hzhbc;9Kk$9nDFe!7;h5&8Gcv_BP>c1El zDcMUQvYlE7ByDtvU~CPf1%g4^*Uyo52|J3!?p%o76r_chLo>c-0i2ai!@s{D(|OK@ zILcvfO-Ff5CV^$0d!B1uzdh0>Nlxsp5fLi5BuJYY?PC|t+of%JW79W#{_X7;C;8X| zW6y?+!Kv#&-ke+KC?fj;M>>Ta;QHRsp0ea~=qSA*PT5CVmeI_!v@lOm|8Jg%-w$%# z3kxOb4ZXIFzl_Jj;n2tbT5X6RG-6bUHj0a^rR>YIR+(C$@JiWW0&oWu);AGae9B>7 z8)3*k23vW1ykQg;#)HB2^|q)tkhp@UrA&b~?ym(;=M>4ZfKmhX9KXV$;>9Q;BrPIy zim<_(u4xo$6Cy2=4)9QHm9n~Hgbu8&lkj{=G$BmmMCeN2J>e$a(`0V>08 zur3^Dc;O)>Jh(oM#_@5ridQa9RAtRta9g-th=AM0kt$0hg@q3W=oV}TRJatG0=C)S zUBo-#gq1jK^>r}unPJ%ArduSpvEv&|>Hl+}zhr1mcn2D!v-y*^h zoEc$=5|0BO(XIj=XV^zXkyfTO!8t+%q<#IGNExC*X6_2W$)5v)pqvT^oO5YV`tc#anCnND9KzLC3@z$V`C(-J_)DYP6^6xm~=>_BZF^_4B}~D@U-6#-j?Exl(b=ZBqK>5q=hI76lq^^p7Ka}BS|YGF(UJ~Z+SwmD3XM) zUI9|>16gnF%ZJBD@BaSt=kcxI@~6FM6U5Q$gt|8UL{1&jE0%kV@$&fGa*oeDoKHF5 z&*MHYhs+e>6_Jcb*yj}F#}wcXVG^O36}R3V zXE@5+TN6UF(9e-(rx&O8g=e9fP?hIa@7VKN*At3lJk3bFs)qhX&s3Sg?m|24a|*Z# zJw1lmaABb&k6m$;U$~m`JHLbz)7OZsR%M>f_&bk41~ZGmFa%Foq`*^ycuEn; z(=tT@ilovcph$=a%k(YOyA-vjr-0_=mHPnF&hGu`?Y(K5h{(3RW7uq;Uf6IGFqU{j zGS_|Y?E3n@azI*$hOS2^gCZG?PV_m2yF2kYg--SKl)N4!1*|)d06QFiImatoHcry! zc_#fUvZ?lmCt+aeJfnzKluHddWRpao7?R?>*?r5WdPK5J3&&7eRg_IUQerk~$-rxI zq{lIT7lm{#PqlFE_aRSFkTDakMtF1-35%dFd8$Y&m8<3{QPW7mBhAw}MK%-(h^OHz zI$$nc->wkhq87JU@ZPS-db{_0cm%Cl#ypOUHD{h@mW^lq^pj%`dtMucoj*LguKafs zP@ZX%O7{A`o{%P!J3ROw0IY>x3Br0dbaT%`EqcS>znsesYz0fz(syF4O4BgmHjWgI zd`1coDUc2k@J#gQh>z$<#)U*Gk8p675((Qm!8TSAW1a3@Nae1o42{!pqw^eJTv8}` znjD28auNGRz9iBjNQsS{r*!6sa5J_qBZ8-~0C5ps|kaRuj_qlXE>LZ(C zpq70T&WNUboKhRY2S<4yBb#EbU5|EsmQ9ueB)X1u4)@NrZ5-uzRJj(3j*c$VIip0| z(TEhYL8x4*+%=oOVhs81jy{Hf%JUrbTeQpG@WQollE44%!sbN>b}YL-5Hpe_DzYPr z`yvJ9m4Hq(pl(g5dtF2w8H5zku#K`jQW4UyB>|-EP~mzO{7?$f&6BZ@)Bc7fGs)AH z7NPq_0O2%?5m_R#jwvEZOFWI^AM%uaJe64i+(Sp6Z+V_0n-L=ED&Q0ZhyZR5=xTZJ zUmQBha=^QDKGEDyke4V+3;N{Pw#WYU*HPmd?OBLdIS4IuOXuRX{@Y!>{_C&5PAYeI z@86G(o!&>%JCanWXDx8T0P^)+lcr_&q=!1kjnU=b*VE73y;S^9T3SC$dicspG(& zx%RLB+3@#rkd5}M6|?=5fI{>^g}Xbm^Xsq8=H1=N`?1r$`sfUi551{nwP6*YC>{G8 z9oTXlH0f@wa*sz#6O|+obRg4?q{q2JgqEUD0v^obfNkFOEZi@Zc&2d=6A^vEq_3XP zp|yHkv%4pK#bo5wX|yK}2&ZvQo~A;c5;S+an3GmOQ}C3z4>41&TAxauV)>A#JK||+ z@VCGH^49^UCPF;T`Lsho{ruSTY-f6Qq%$qZW!ldlaR2bH#m>#fkh|Z0YcziQ?e4Bp`8xji@gE;uSn!sGA;cP5Uw;4c`?+nQ;w`6*Gc?W4 z?Ay0`tW|L0x>FNI4lgy`nVHgtXQS|O)Eqk~2Jqf9C{1Q^>CaFYG zamQo`GQNycgK!#i;hL=JymQbb93&Aza}#pqT4vA$X>qDa%AmRCJOxg+lBaRXL&)Xw zU~uBP&1SvhP(H;Qgj9Q`Z=`&(hEpDr;|@X;MW+4lhc;^V=bt})`1EPo@UQ)^|NQ#Z zSCf#+CrWeb&%CMsA;u7Bp3YsZcK!A5ZTI6x^ky4h)<@in&{5)8sR6gC9REEV&1SRC zU@)kk;CFL*s%far1=OCN;OADmxM+QPszFZCG%klBGM?T_ZW8bI?agvY^KREiC|3R^ zLUQVkcG}<+)~A7Is+Zq{Sx$orVgs6pY#6cW;V)%_@~K{_HkSPQ>TtcSbol5Q*$JcE3-)|9kdy^8VzcGkE_WvX^r9W=Ty$;3h&v ze>35;b*gMkjnt5ba&1?S_{)khTN?`LOUaFUcYJ!{zR zbcVxDYc^}O*e4zG|4K=eSBXf&!P67}B|#HUXa5{Roj#c~$PSzL5?kB1F-sIuK4zwT zOdg^Z%|mLsPWU`z@K?~x)QOztHE5ZK=oNs|G-5BVLRp4T7$U@eRa1&kYX%P~ zXa)kBEcE|ueGPNkShlUcBWN68__6>c;f4Z`ivj_KUZq_bzgzxH+D3EX5X@M+|K=9As+UEdv@5c(&o~?Z>{lp zw#Mfb-&u$5s%G&Bi9FszI?*4U*sl*yURMr(2564moY}`xscx5#pz~Y&9Mo47*3!$D zFPlhZv5vpcro_8w85(`Zaq`#K@89Pu{BHPe7hgC94d-sHSU0O{t!gDx_;f*2f)|wZ zt!D*xKT!eL8LVZ@RmppZ;`pgmXlE2RRGx>qqNQI3(geY)SG(;Zb|oyX_BU)xz7E40lm{@OKhgQ*P?NJM zyuC_yJ@DaNzSwx5*uua;u3C7{#srbeo6E~=wNM4X-u!uelTN$$(c4-XLk!q?DBvDE zLX2KhXe#i~N=M?AZ5>*$fsT7E=xkjx{hu36ToZ{e@!2ZmqMQQbMG8sOP6h~Z#T`YH zLK7Y$$$d7XPyqNx$fuA$<)N*uZW&iIT`U?uURNUe~8HcM6WruiI&u6&94`CtmjU!TnkC8v?0V8J-wUr_MeyWcwHFj zaxQCTM5eEg*~?`)jUgmh2&oGenjs{L6cX=un$c1tLP+2tPeAKh*v{B?4;~Y)EoMz? zh3xZOzMQ6eY45QbNm{LA>5lMV?2w)-rCI842c?7Gj!U(pgCnDM;t*0EmV;YE|onl*YFUrXzl<3i7DhEv~CE!A3>Tg)%BY>Zy&GE8{o~noKj)DUo%yN znD|H4PZPzFM!S*_Ol zgM2SjUb32q5Zb5I&BiN)RxQD^D4{OhE;CbAp?5%y4+Bi2R&t!zhq2m%9MWV!ctKOfrjSq1Mb=kv-#p?l&^p#7NV4 zV~#(+t8>2}Y(U1vG|(69z&uspbOy`y=92oLaxQ<7$+WPI+0D4EES1d_i{^r*cu$t} zDHI@dN2C4QwU+aP04^dVux4^ua%1a0Q{tL4#_k9Za zvzhexu_#gqF?J>j1z|{`A%#LrAH}?Yie?J@TWLIYbfU)F0Zl^VzBFSth&^%bck`JlC8q^S&h zfY)FpN)n4Ui%56z3-;z0m@Um_x7woD7SeRbcK71q=BChkRw$4hRHz{EGmZA9e7W6M zY(fel#s)MHTFFKCBpYPOTX5P=;RT&_#I^IqikwFgg%HCJ6mcqcRtq6~Mf|y;Fy*{{tma@dvWY^L1qZ4W@m>nj|lQsMD6wPfL{HF70M z^M}JxD9eH@yF)ZQ$Yb&7xQBmyUmU8DUHTHRaZ5{pH3T@g1b04IwuN$_FQg+KUF#@fStuD#~UP#=Fs8w`oz zOVeOCTetfaLe6qNeSF!ij{P}p6nnGj0@y^4d1Jav2|UflKBfpF;Px=Gf6d*(-R-N`j=m3+VJt? zwcHa-SJWjOBX&n!79QQ{QLAm2u)ZB^kV*!8q-pQxdq$7rutqpMTH`Q!ZCCW?ZZHuv zO%ZfmM7}LcIzGloa}m|GT|YkB`#{oN$B|SVqJ)>gRkAE#tpKAx1s9}Ry>qr4XJ8Kw zKUi9g#Pkx)WPw%Upj3uF`5i*7guxV~5#H%v^!{#v7%3!p9CnB4=y+WVr1)83D_g05 zX`;RsA?)}2orVe92KP$3p9zS0=i_TXBYng66`^8&|R zK+ZFkd^zMKoAYm!OvX;6a8)ur@26f;ppr=(Bp$z`Co!CHIHZ!v>tbA^b;@Ef)J4SN z04^Q_d3elg=51_hnmw4tY;!g%Ri~0`_XoL--RT+4DZM-%2X_fL4og^6qB^E0hvB2U zSPP*jD~e^Q*2ZxSEQG9)Hn7t9aQNX6db*;h5E!)COqO*mn81!#Rex!0;YeK}7p)Xh z*&MV#Xv!{7vQ(!}(l=i2zS<=P79To*|6PNNS;H*eE6~m?QkgB_{S|sYJ$(X|ija6z zs6wo2Wvdc9lQ?2nMGGE7Lx?%K{e4_O8bBXF@yu7+wq5U0TR7!lOBl`9q7_bO zs*k=W6tT^cNhP5rlgOodME9~Eaccy2CA1rWpPo#JVYF#UimtnnCX56xYGpgfKpvT( zlx#ga>^cLdnQ!BKv=bZL7kRncuG6N}bW~Vx1o*?#fOcP*y?1}LvgD)CQs}Z1e6lvR?Tf2ZH z{77q+al~U0kGaG&xDUu<0(YDRUit!R7k?r8eXlGoVbaj{$5)hyiT7sYcPjP*tr_+~2o5ZKvd*>1kt>xa`oX z`U!|t$sM}zXe3d!L{$#3B{f~y&@}nCl5tQXxMbEyo9pQs@~o;>5G50qs)V7X26UUB z{l_0y`A+UC3#@FhROa(mBB@~Cq2VclQx;$D_6M{n6M$RAmB@F&co8+QnR2H?JyR~v zOwQJpZL`XVhNV=20NLyH(y3ey0wh$(RtvL6^r$wo_5~*(CSw}uG|pk$?9S>A@mgZ0 zi`Y_v@p=8@d?LK3Td!jRj|CLtMj)p!OF;*!%@6G&FN?1GpUWb}hCYv>_VJh)vREu& zvAEA;Gfi9alUA$r4DyJN*cxoJ+4O#+ff+fYh>^#BzwP`w*dOG2M!k#?Ne;xEybue~ zJz+SP;_-Qeo+m*&QqyI5GokCsf0@T*jZls4AKNEwR9J|xdP26WL}J5IEL99+^FS4g zr8+UntE;Q;-~YHOrw+d!lDIlll+8`Dwv0LySU}}Yze8fWBoP@Er6RN_uu8n*?{Wnu z=XbcAv^l$}ueL4lLYB$pOl-6&T$Xaa*L#*~G}6z$G|()e)P4b!VF{7h32Tdc{(o!z$_#}Rzto(RrMpUNr7l$Ax1#l*P3DvJxm zcesI8ioNNjFOM<&zLk*AP@y}*CNb_Q(uo)vS3M5cnoEX$AmG(I2YmiG-5(Ps*U%9YBT2DqQK6@ zWSc1~i-@tZ2&CnukIx!FiKDC{Mik}tmd65$flrD)fh~4IHQjC?k)=!~ok?NUh$u5u zWg6I*#ck94m0+$p0KPa*f4kW1RS0bfj2YUFU3A)-8(|*?Lp9JgH*{;`iIm(_60)4s zN=IBzhc$9s=X!djjQwh&Tnievb<3=!8n$_ z2wGUmB{qHn{qI~NydC~!6v^adlplMrneSE)4{cT$gV|Q0n@^#-LQO7pI&hq`)$H@< zb(%8!LTj~%`dT6+uG4aWNtU6<+U9c=NF>=n;DC!##(4wt^uk%dIfc)`c*J8v7V|wG zTMN{}vMR1sn~-&j+T))o2*t(-A_fk^W4E!}iLf9*olOw?h4{&X2NnZw9OPLrelj+4 zrJUXEbyJl*yjU||eZD39{Wq#i1y*H=I+kt7UHc&B^=+gwXWQl8pnQk6*x10vx#dx} z6NHJxlVnoI;UbHPWb%>nbV6t`%#hf}v5=i|q(hfP}n-YQD1#>8}^w2Q+mQYtMGQH>!d%?(dhY&^kJ~+;%IKGBYTqH56EOXLbV;E=p{p zW>mo{(d*(1xu)e%PJ`k9+~fH%MnzO&4l6Tw!KnjcF?DSedlVy(6gbTgruUVZDOYBw zx^Z8eVvOe_l|F*&$|p=$90W0}ff-++_(F`{C?K|#u4EdRb!nFDOt(^i0$M3oyU(5# z;Kg3wmz9ssFRMWx|1WiPD?g?6CNxH0uPc}DE5jQl; zQm`vGbRE+@CfC!C_KuKB45w$(Pf#AQB}M2#(Hx5bG^S*JuI&};#gmg}zwc0e%{MLN zOG#QZ*2Bg0-Q6}*V9N>+O4SK(qYX*X64_L`kS&nQ$)^K4hlk*NF>O2v>X4JER`z;> zL5JjI(vuCwDS?roq{L@R$R--tE_v47bR}P67pUhG zaw8^S4A7gjs^I&LN~c3}r1@f%OsrleoyxE|rgFFU>vjqKEA}Q*iI)}~r!h$7&fi{e zjk24;+R^6Gd;&1HBu$kPBFH4VS1OB&ragM9$WNDg`fsGCGiRhz&Y;EKOiB?dj7w6DW{+} zrL$;+oD2RyI1faQ? zP%I8$oP-#tN8x+$Km_rh2_E-B#z55BL_`o(F?s;B6{l%3UI@uB(@@rA+ix@n?^tvNl%9CXgl&%0eNQD(QEyK^myN1~>W_0430Hj1Js z;FM4P>(R!Bys3L75Ru~}($m|=%o!PE?8L@K0{Q{4M+_wun^S{0x7VnBe*L*vM4dgP zRC?et(2O>86Adg#B^T3CV83-bl12xLI{h?JguIYTS3w6Mx@FU?Eo{mt8VS_L*XWKF ze0t-bjT*LRYI}b>-D>toTL6tILY(aVg`?MKw$fy^S6ggBbi4T5bF#diu|{ZNtvz3= zXUxD5V?JjH3=27`#$xwfU!n+VAW%Oe@S=zpqE+NHWBN1A;5Nt*L5*kzDLQc&PgZ~o zlMf<*^SLDWd4#Cb_}CM?0H_(5b(-`5c`ldR&>t&KyGhPR=OUlCaa&fQRRt|KQIgDh zvkkD^ui4E;#~z%Yqbouod$t8g!I+a4%%jZ>$x9{^KuQosZBt3gs`?bLnUthreQ&L& z6R)&!5V(Veh#^2SvCwe@*phpcO0%?ADJB$Il16d&rAe(18fg;K?M}k? zElU=J&CNstDgAeuWO0ZL9ek`Td~&2RhF-u@-61_BhVC3P>E^&3xm(b4228Xo)xPW& z|DtD^l#ouKMlN3^sRxi-1!{I%&+j)vnd$tx zlFbROin_WXsvA#KD=8_2aq3ejI*Ei*qn;G`+-oD1A3pT^eYKO^`24sTr*iJ55FdXG*6IZoB`|TPE3D`O_`8DM4%<1bqdkG(%4)jk1failyU~v zm=aJX1rK0I4>3SK>A5p)FsdeA=85Q(O+3oI_zI7W#)9qD+SrpF8+;6VJ6EQ5pxbJt z(MzS7?^P(!sZ(qIaLf4vc^JWn%PK(CAEgtYqiP7j+F!qFe)pGVaN1$`j%c>aJ1_r4bsJU}OdTa^dB+CKF(Sg6i+s+zGKay~kBqnEE-T%hf_ zan8)MdffyIsqfPwcKVgR^KD?~zd8ID6+Fu_gYkO>-d+$SH61k%hb%){O(Kh-s7g`| zKch$n{>ky)k<&qU>a;aa(}ZCl>aMFt;}L3PX!guK;v%3VW(m%gluUxBNZ_fP1ZlY5 zbW7iEX&0Na0~8fusZdbd++c<^UFuAk|K^Jv>gzlRbluk)CGKt2+t{3Rl6t>i;iZr2 zE0YIG=60iD8zz%_GUcVz1CrfM<4+ey8r{Sej$HNk``#{)lN%N5xzyz#)k>1%L4p65 zvy7$F0Y1o?gg{JUB6u7$In4;eC8EY3LV=h7QAY?0SObCRhh7{+1Xj`rh#CeIoN0~y zeJIK#iIr1uK9H%L-KqDC7k1|cCLW%p^zsZ8fF9b44N+=#&TX_D=biI!ZPc7@7mF4m z+aGBp^N$QhoKR4GpU}%iRYbAXpswjdq!LOF+g0s897qQlLE}l2h!PA0XhM+;SU|Q) zd#^z}KcAQe+FUFOQA$49!1iwNCj}GbBr)CY3`7YXY~o3fq~(*X-YqE77gE@ib3K98 z9z`w&ybL_S06*I>O}cfc?c{Qz&r6zB+Wo6u!?E3HqfZBU&Ml>$O1=xJr2~-J1I?L_GshN|6pInf zSP=Av;5Y~(eE>!k!6-HbYElp_79cewL`4?|L8pgnJm@s{OK?7#O{CI6({9^0Z{B=q zgU*>IW#Od(+3xLm+xhnP{QTQDhuC(in?W9FVl{vD$1^y4$R(7~Cr_~@kpN;E?pzcJ zmC$-nBKnJ6NM-)~E& z$U8_S#3BgyE;uDfEG;N*SmQfZR0<|19PPx=olB^z|11G6OGs1cpIDUi$e$*cN5)(_ z!2kl5iVZ=e2+Iq_CzYW&%pAB$t6RSBd9j&8q7b7sP2eKlohTRMLGNysDj*UO5YOi< zBgXX=k24A2qBp@S7--_{p*R)*yf_~YA3{+Wn~uh=J6ouPsJ=V4d=IV}g0l#+AO%$f z$GvTsSU9$A$mON_{-9?#?Q*#f@pI6*Mk;CasdR>Z!#J~ZgXVd=e@-+0=S~NcGp)k+ zKU%GSegD_LNWaeFK;27<0cZ(l8cYar(dwhhQ7)TJ8)9zTaOzV{L;L1q?ZP@3X*$GM zpx)5Z>V#&sQZrNt2+-JqrQ!s%5Q-+w;PeM@jdQLjLKl!|^Xs&rvS~Qhd_@(uuqi=| zeDu*$geSz{4>TQ|*Fb@-V}ClNk5Ew)d|uT=Xm-$h7%8DIlRaIrjG^d44hiI*7n-R; z7nPjbv>*{HKO*GwQg;JW91|(1a#$6XFIX^XZZe@45X)G;K!^!J=mIo}f{aB9PUq1B z3ZjOOfSTgMAM4t5kwQNy9>Vns zB1&bWNLUNNGTQj+*Kg_eQFl0xAUjJy0XGaK1>!gWce9N-SF}xlT~)H=p|0~27__t7 zZ3oAIjVuf&?od`#3oD8o>+kp+SJ<7|EqkDa0Vy(?AmAA>^pF_T*b;l<4}0VfuWFnN zFrFY-eIO00xQVYC4pbtOCimb~SF1#Fz;ZxLP;HsICJN$zklt>G2>xjQa}`hEW(IJP z$#0xUXk)~QWrPdz$8Lx2LrqdAaG>#K4QP(;-Un&|cLi@Q#2#x>=#6Kz_;gngDJX{V zg%8wZL8KDbiFPJZNpg9;zYUQ!J;)F0?H4bMozm{v%iIT#?7=T5nNP9siv zIK??K_WmGyFxTzoA;PGZyP?XWtVa*=6UB!QdkxG-l}P6-G4Z;M-5H9%VEs-WJ|sMy zL%30O8CO5?`!$98B_PC{KqvZD!B6f#&@EvXh9 z=K*O+5Dzqu-h=(tD6+>K;y_00w0+pKJZ^n~lL4{LK!84-Q6io~)d-#!lxS9H%NZKz zEYtl9Z1QOV%v)=3Yvg45ITzpV+$;(TD_lf$LIF`^M1p~)=ld7wt-xB>>PliXg7^^ z|3$yP1AFQ0>}+|f#%KSL^;ne(^gE#}D`%+r#Or*G*%R>B{8h=XT;QyLzEvJ^w$Tg!gss! z9DJupWwl5~8}krwDUA9K-B}9Fj|Kp{tT%v~OZpn~@wvx;PheY_{2n*?@45T}f)AMb z#wV0-7c2;-k05ZB$#1|#4;yeSxP+RqiRigAhMIKiv4;vAqVXBK!-W`N0jWUEkvU!8&$|eH_J|BAEFZ{=8(~FPfe+fTdG8&!xciz~su` zuW-N}?Au`VjwsGW6=en;2NL2_{r4>F{0349;@E4@(uXoZH(Fg^`*9SU*;tpyo&}*8ozMP*;n1e}hVFoSwV4}rc* zC6~<^PwtF-jj+$ZkDS3Ba>h9@3QTP&jgly-8XNwj{cqeE$4x%dEjECR-1_Ub>L)f9!nx=s-lLwFufgj4(~8Qcngh z(Zea}I|?n1dOn{=fBz?_YsL~HKxPnyDw$Wn;!#Y1c5^GLA%Y@6dBH`%vVQ6&6Y4cgkY~n+t92V3@K~an~i@`$Is~iFJ1sn zr-aRGQmze#lsIa|okEpapw-LwpDr`RzB`%f?X4AXmw$05vHggg)(Sa?D@RM95)cqB zQi!W>z(vp@)J)`?nqorf#5o*#vUwkTzA`if*2A&Vpj1g+8 z>Jl}_jbBmyfR?=;ddnh-ti9f=TCLr_-q~s5*{)}2WJ*vbA!Ij!lT8dsRnFfQfM9#n zSh8L(pZl2a*dLuKsi^|i-69mDDWqQ=TL62i*Pw4ErPMUvv-{1juRr~n1to7`ZeDOL zZ81}TjFx0+Af|9X6Hhi!ePxhkdKZ6ucaiN%0Rv%R{}QRcG2j}J6eB}kaXwvu%bDbC zGz|xeVZ7u6>NsF^7*qSQH4OS!@)K&8@{W;Hdd<1k{{KQXEmb$h~cIzgUB$ zW7=)PrC0CXy}JgjeDUH<+c|^91f}2%o`h*P(LbJltE6&hf%Z=JKHi<0($w5Hz37MqPYwUbN1~1X+++5%<%h|4~He2dw zGr~Xg>1a6xd=`N2f+Oc@JPzQfP7ozVsm&m;aa>%2Cd0)MaFIZB0*jO5A~Uo&E(#nM zHS|Kla5nML%KXT_Ij+(RK7))~-WwGvhz)BOWq(~xbuYuVMvsM0 z%@?}_9rkSZtYo%#OHLcI+c!IthdWX+iOrw9K7pd()IWaw{=I#5<;Z&AX*$R&p@5Go z9%Qhf^SNuv1=aCd1vKaSA_WoRJsUjDWB_gBA$k-=7UoJqh_t{8Bh7M$x)Q+yEw>Gm`EQh;(XBn3wAE)?t_bqiwyZhbemTTPA=X%A+2mod=&UcVou1B zbL~x$E6<~0$ly^RT%`B-08NgIbWdFb(439pagK{Hsx^t@;sVgOAY3HW^t{P95dQ&4 z4Ssou=wym0>T1MMQ}8MJcuKcBby4e18ze(QWX7(%M>Rkl#Z_)X z%#461V_d9x7?>t3&Xaom2KX2Y#cT6B*v*S_E|Lz@Cvbs}mUcX5y$1?yT19eLbwQgv@zS?>pA^)ofgmO z=>^@O`sa)Ci)4tRv5|Bq5b!X7IhV94a1+T81672C^Y#1H*Q>8sK~Ak?%yAI|6i;mq z24l%Zlvnd}-7xk(<5TppDRtPUvMk~9gtdcOjnYXLP~Wxs9Gavs0E`}>y96wy#;o@*KCR`j^Jo=DObELX6RdeG};Erc;cN|~L z7Yjm7Y>Eo{kDK@J|HtV!?S5$x4BePkd-n#Y1T_-t8O~z_fq*clUI$*DpS^V|{cq=X z=WV;jQ)v`W(As{i11hibz^71?W{VhGV7OptZct873(8m;yCI(0l<`95%niR}+^zpcVWcb~p(4jMU}+S|st{p{d!Y34ulkd12h=H}ue*FpL^84zreq%#?8Qe-j*L+Qo){+lH9Id}V1lyaK()I$ z#c_dJO9$$QKU=y?b2rXirZoz3xT z#p&pwc8haH;y?ben7ZLZDGY-JWcHyTs@0ntAOYFxFYFvVTk!Ulrb>9R8pr{O-}V#n z2`-EdYFXN)hW`v~6YdC@CH{OH^iX0A6egt7`3Qlak_mk`a03(!HPEK2CT7#Qd^gj@ z$xlyjZc@+%YV8!7`l3z0ksy;QfbG25Nhq?WBoj&`TB@W?1Uc{oSs|vWWm6x&U!_Q2 z%|QWxsTv|Wy495+q8vKNdbY?{FaM6eQhqe;Ya6X!; z;=`F2W;2~i_q3a069W(#3xj+*t!hIpn7Ja#o2=R5Q!AN#`a~h=6SNZF2AzR(?&RLm zfOxr&^$R*u+WYXDrP8jrD)cbX64AQGW%$bFitVIQ3>U9yO%E`7QtWlnR5}nh+vQaM z1%4OXP7prb*u+>n5KvJ9SjL;lC}~NGHlAnG_Tc+f$Nty9GMTF@jKYPYA}5o`q#j~t zSTv#YnFN5N+8#?KhWs{^BnY+`BOQ(=81^jMGK- zThKU}d^qB`IEo^IMSq2hoG(5`^k-ZgN;p9%J|?C*mc%%ib=;4p+3ujzO`X2LVE*X^ zt-C=#*UgAyS@glyus#$Sqr{lAg2HW@XGRf9EF^WfBj=r^q<+4Mi&Z*#P0wNh`F3nC z&~$I=MYJ>H3Jw}t?A`zvp{=0?TpI%u^HG_M({Hu%xCxca%blIl=F^Rhq^xb~foRE+ zH1QYU5(#-jPhh^ozJiQn49UU#~d__gL>(pR6=<@IB@Eg%Q5Xi%;(_ zF+##rI}I((IAGHm!y(2qsDmOPTp}mD1aCM^y0b?xXeeo8@d{D zX<@Tl@}{QC(o+SJIvr5dQCj3S1~AV;o2;ky55{QNfTiQzZf-JeNL0zmzSsSFE5v>U2BPrGml~8V|9s~ z81EPgvo#cscy!4hQNe{ZT?8yn=E90Dsv^h52SC0FqR^y=#1}`h7F*#WsK6Q*=fK4U zKCYt0q#27Y{`>F0X~-Aa;tc>HkIVhy&9!6aa@WI$)1j#0*xaDO@DP^05}QD653q~#6wrYcDrtt`p~cgG0u#>7okYTf(9XS2sQb%bI$3d=b79Q(5OLT=X7-pbouASa3Eubr&Ahj%N`3@gXy1 zcDwK3%ZoSQixBHT(38oTm)J~fs2aQ~Wn)v((A=GINgai>i98~k7;Mf)qQ0q!ss=&3 zub?Ccan}{KcuWQ-)D;anI-aQW?wtWijb<8q#df2TLuLx8yit8N$N?vDq$*P#0@R6M@c-W;k!u>*(=qtuF%_C8px726ry0EPMGfHj=3u468JH@2%GW~de$zo zc?lZAR6DrNRkSM$vYMu(bgRSyEx}hgHsZarAHZ;Y*I)^wA7oSxi+3U`!eV?TX>r0u zZv~5sNE8VdU6_+me8F+ipFPA}m*vt-t`&~hEl;f~d|jdHU%+DX$ke{`ZtUq!I$- zGpJYSQ?YSejExgX46Iwm5^v`#G~|}!m=Ed%OV3eI{}U{FoGvmQ^*$`RbB>FPp#@y@ z7%q;ysj!HKBmpjlQ&mJbHkVpy_B4}hD_rI#+Z)MNF3EBz8awO+8|bimgDE-`c`NGVTPznq^wl0NOI%Ytco&xIJd`JKSt>P&W^% z6{ahujBvDYqgY}e16{FYTiI)WeRfK~2Bc@dk9p}Q^+vUVXk39Ci%cfWYXKrL+mgf} zXo#8ypL76wyol2ft_@Ja{)pTV?y;&L-mFS&alrB!Fb67Z`D(JnJ2tRbU96&kbH`CC?G8&v%$kCE#A^a zS50_YOg^KFD}rR>ckvuQUWg04%+umDTHMJbQ^&!}5|m9Zzp8Zkl>_>o(p=`;DJ&h2m00sf>;gi^{jemQvMX!Sv$l7QGQ9(l}H8mOX zila(2!r>{B;K0Ka%|Hl*DPO+aqT#DnkIK0l0}#r5egh!3huZGe>&Gu&*DIFMsDK7) zy67`udm+QWbxV=)zuSAypYMUyZk;}%%YiSRY%0dVLBp)nEr~2BAulRMJ3UbhCZjUN%q{T67`e z2xS$Lx*zF^VeIWaKRyQi-+^0hVqWjb)%t&}qzl}StvXzmtv5;a6R z+iic{f{qTK#?ng^MLfFR3`1XUWnIUy?_5`zT0hPsjh@=Qzhu37~{q^ z6M{g0JQ#P@pN-3SjwX;QoW@aKmQ8;y#=G?+)6 zIHW8v5r&;=TD@|7{5Agh_G{SkbZ6tmlT-5mZw7UdJ;KflUq?)jBqlOR(PuNsF#@In z5v9`c4o5sVd05dy<&oCc8yjY&8d|n3t0`X+rG&bOG=a2rLGl)psVcJw6n_Cr=JUfo z)Gw4qp8Y@q?Ek?(=jTKPd20MC=eZ%A8KuJ{`BXcc+@{2jzz)lP9KlN*d-Cb9Ow`3> znHJ|UblHDPiwjkCaaaQ6MW6gz^!;fnkmif|>YUk#yRg`!dxwV*`wKZbYM7{7YZfrA zjk(zCW(^Uq_uvmyugbFRiiRXo@$hK`5@?oWNP*HTzW~!)0 z+f>@JRg1yT4wRGQ=U+dEk_zuUC5i6TVh8nxDK{u6H8fjh1d$ZQo7o{#@dYdl6L?mJ zQ=Z}%;ZLHX$OgVrT9$Ybh7A>DMpxO)HcUp<7a2q@fc9mJt`E{D%)>x^_Uyx2u?%&h zoO}1fhiC63p%8ai;t*IFWdh7E@CY1?Dn$I>#{5qeIC2=f9vqs^3SV1jFkd zHoLj&YqYXnUl)OazT5BDY>1({Lxe!l0z(FtG-t9cMbwc2zeIlsQe|z_>7zLrvmemW z%voqFjL7H|`A0$w0|2tkipA>HV?2nldwXO`y2^V8VfN&Nwv@rD?Y#qdO}QLJOKWt+k*a^{QE(~5!2U17{b(4WpCL@fkzSC>4vr5XxM6(Xj` z5rfv#h7lnJ!55eE0LU+bg#nPnWXlq5NKy=*%{)i5fer)wW|7MnLL{8B-9rCS4c*L~ ziqQN>84|3!f?ONi(mnU{;vpm)&s}D{zj|(F0bb@!H^R)Jya!E!%j-}Rm_&JxP?QT4 zg)ED&0r}AZ!|%TE=iNSdNEbV4uw-aRW^7(xU%&aE za%tEtQ{t1sCN{Q#y!PXhJYQ6u~@zCSu?AMv5Z!aMGiuwz3sb(u-fErSp+*pW0o*4Ql^ z)AJn9*WaG*Jvjwa@PddTxO)N6kFs^6q_<#ALO=VZ z3tN@JnFCu26$?<6O+rg&;6KO=s_IjhPco0#6sDvZ7r?Ay@g3CT^C6%&iZXf5_iO~g znK*|Gx;Q=0&7K+YHwIvUkPnJP_G0#IYoUr8{ zY>8ig`uv~{5~7$IFj*Ld5#))fqDoO_;e<4FqwAXNh%ii~xu{6<_4}NWtYhZr+dfXG z0@NFmLif_mckqAG5K7f7#UWV@d@drMyceNtL+HO|(t3K#0>EP!w zsgJ}*-O-DW|B@G{$cw(v2%+fum1VfoBq`sV4uS- z?X5vhy(a?#*rv<`-Bu8{WPDy!WvAwCBpzrx`|BMV#p&#u#3Ga!(9Kr?Bbi{E7S&f2 zrps1%Ku`VQ9=!1whP=;R^W8fdSzPw9<+Al^9llXDq)0`^ngz5XE7!dKA5vX${SQR! zJs1)~83k602T6VAO=h)i*`Op9umo(NtX2urkD|Bf)-!YV+Zg;2w z!7@M!+MKCs)70j2%!%rLz1A4x0xhC?yWKTcL}JC!iP8a#Z!3oELLri5SCg62H~^}7 z`0!^6t@rOA--nY?wd>vg9&$m94=m=8R#h-E`Bkb zvr(@y4Wc_k6i{O(1|WrOLc`Ai0H|ssVfr9KUX%#4of{>6eUqok*4N_;8T2Kxbu;8k zNo1yYhQZM{2%KpGH`%~G0z-JE{z(D`f2{M>u`T+W)`qG*Q{#Rc$o7w9(UHD`ZBGAdn3DzqV@q-0- zqZ?I`s3AJiAO)X`Yf-*zQ7-9qppOspP}RMu2KR;cYOb212>_YFs5-Kxju1;3@#mi@ z@14LYZ)KEUez+M}%$Ww8%5LIInt;z*WW($=-IDjFT;!u!x!t-6;YZS;CTR5OYmE7! z1M$oY00p9{q&biNyqAg;29HzJxoWqucz+8{NlH5R&ac-cCK+bLjA{@l$mc9j7)i)M zpxua6K_J`nsrJJUf53!zu#vLUqSdkdF5>+);(VVcH_rKRaF)3*<$R)q{N)+Fe484D zS)5)_+RH2iALw+I@Dr#AwfxDEqmtt3QyCfFw+Q@XRi??>c|xz-0m%k{X7*veSstFB zf7o3^w^ZrFIgACei@3Fx9ba9)`4y7r)mj(Or@Pk7?hbQZOr?`Ou|W*J88I9>WMVX1 zXQ;89Hddo%M7Hdp*jTJVZn&ypq}@@crmX_mGwM%PdQem_^PX{Tr z@&5!x@<69N)s26ECu5@z;O`&39?Z$ZP!HJtwnR9&(L(=A@^fxDVU+w!aufwB6aSU= zd^oO@;$`HO#V1`rNKazY1rQoCwxFg0-$$0RarB9WbR)2ibrr@ej;-)WyVNGsm};^UkMx&$7>uZv`qg%%kCq ztzbkfLd6+w`RU#vDCttA8YmJ|m>)n~P-3OgFb!aH8*n{{!$39^UlttkhaVnq0;%u7 zgd08Xl+=EJcD?@~eMs(smtL|yUsV4k`^A*~cy^ppb`+Lp;6Lr{K$&~c;i=%)3^XjTb$KkqP%y(7U0}4^y z?bH+p&O}zLnzF$R#My_i=Ff0UzPe%A`t-{`c-92=ml-3JrJFia3`R4J*EE^cr(K}e zv=_^2SQW8eX;?tIYBZggNfd-?kn(KFcSP3?3c%sb97^byAP$KPq>TkLSb4d@`3OMl zW-zZ>Iw+4NDH6=+1}K#oqAfE-0`QRtzmfV;QrQnXe2XDLyx!&}hwSu>g$zT~oZ6%S zBrIIbgyC&|Lx7|%D*n3q*Xy5^i-muc!&4qyV?oW53l(XREvEd4xSx(l=w+q?WLJP> zS4tc;4hsczq>O9LwR1!>)NkREyTAN$czHQ0p?7U?xxRs!`{FerZOF%D#%41Q9Rc5$ zN(fnS&C%%aP;?!Lg|=j;mOHO|uqh2>jrOmu%C$F`iMzVStZH_5jaKymBBkf3!XS{5oKg zU@}wGNrpm>Gl%%!ChdV*eej7p2MlW#a5~{AGgk7WRKjaDFsR zR!Je?2{3i@dh9KhuLB$XH{K69FOxXQY^e(f5`R6w>k(du0u^#$z>R1A+qcv-hIn@V z;lqb>+SmqT!m9h1qvD`kynHr-LHHgUB+9iWd=gc;LV;iLF*rH``GcRXHKDmPBaX!oA9TAm`4J1{<6v}7_&fIVB(2=95pl@let7T<{c?OUI;KqzQ7Zu?LR3YB?U(XLM{9@JwfU$9r>-@#A%hC&A~Hw} z;GAxC&5thrc~yIZPy9^{Qp4IkY+`T`vE-R2rlvs>`cwgoV$1YrhEZ+EmAYZVl$b8!uq{Jw7qAi_ne}Pjzkq;`3s;w(3ZR+wO&sLZ= zQ|!PE5;;1}kp3MT}ooz%x)tR#?1WVJ9!N@Hn!g^h7T}6$DrY!G%fgoD{7IW4a96%8lyo z5X%UEL9!UYFE2~AJw5_L-!@y2G}gauB{YpKNGxy|GpH|9te93+sZ?c8lN!dyz|?uE zE~3e7S|J8cB){YyiCFt7$3YShlfQCY{9kh5XX5uQOcF>MiloF<-C!=P3a-m#ff!j) z)H|3-t2maU;|fRGZQ1Vzm$E6yYqp^`;PrOuT4@0c+{=hg!vYvtVF*|Yrz z&)|~vMnyC0RlUkA7!o}ow@o0~4q68qWNeX{43N$ZgUF6t+I|O7z+jSywg^Jd`5&Iu zYM5vE;UAZKH1|O$4d0U{H5!HBFY`!~W0eT7WWuiKM=(qo-fE+etr$9d6w(iH4#+e7 zu=DuwABeM1d+>Zpa?yWJa{o06GRK+uOPC};7Wfa|FD-e0LiXaX)9FB8%Hl2w@WP6~ zq`*#l5tw&@7~=Wi;j{De?i%PkA}l_c^}!_+*D-8)S?&}EGzRrzoUdi?-!HGN9n~-@ zH=v8j5NAO@N9EB;>7-agGeoV6fp2J}p%`nDWuTb=Rs?>%LQ1>BnnqaiZ>R{Gjwa#! zL8N~Fr7ov|tSd*to22%dP$? z&CPTNwPE>w3Hyu5l%@OkvAOODZh0~qjKEk1;{s_4xrHBS>4nZ@CD!?lssVOyU0wBS z*ZK1JZx?trb;XeZ5iQT|?xMMScN%$;rKNO;dlDc*rTQAr%Z-f(Xf2`7=~)MjD5#Ab zR17$@0$VorAh_=R2FJia3f@Ak19b(7%}}*DZLPCoN1cg`cAhb4>xKcLr&KHzVZ(o5 zP3Zpk?|e{xkM@z^A=PaRkYsa|B!mL;BV)EG1M-NPZd(=0u9!@t-F!?BRDsznL0En8 z7|fEI5AYZLi`=QvB#J{6L5TbzjorW?KUvD(6Oop11~cEeO@s7$C<^~d`)^I3A=7&+ z|9&)tR3_s_5l2Ai5+h?~vmfxBBWZT~gA$hYuXmu)^!Kp=1kk0|&(_vUU5s0x6}3oh zB)huVaCrmQxOxxfWU$LkKxQui@87Pp5mVQt_=1m~q z{`TARQ@ABM-=Apps$pnVOHHQ*FJRkgCW22gEl^|-9omR*CEEarJ`MtLsf-s<0*@$a}#;=2dvgtf#2#MXwX z8@hb(uuhEw$G?63^>1x_VVhX#7OTZ`EjzznIfd7NJ7&05?5EUimE2d&a>RSf&&$493bhTodCL<{+bQO)J z9Bp+z+aHri37F$iqKoIgE8az-6I2M?|9^?jad@Ir(_TD{<|=;0Uxp9I_MV$!-oF$@TMEe<`3Bb_=i8P*}z)s$TK(vISQfT^4CSPksY@mP$v%A*S>?CxhPLs1H-_KSfgPj6F3I8m4aR*xHN!4E}7;CW8LP(+)-I z9V^i5L=T%((*B=o>QE?CNt@ZSg|ucW20rCB8tu^T^WgRC?;d~mUB%Q)<3Q2j8Fi^@ z8Yfh2ZnwWa=1m|lWy6pvvLWi=3u+o#Hcq)@FCyR-J=7b}7Mr++tKIH(%C!!*4-KH$ z(;w1arcBz59>yBeBv;imR2MyiBD2f{_0`+=j~rf&Gn@*jtEL*E8hNI{M5an%1aqX3 z%>y5q?hXmu&U{9hPW#VH=PWZ_WX~4vzjJ*O-h-4IC7Woz6TUtU59ACyMVE=Mq%O!G4@FjRMRw2ngm z5m0?`aCEW{HhDr8ErdJ?X)7H!d!IgDJ5b z$3(2uDpb?{b$C6@@{;y$G5g3ejcUEY4jOGdNSCko@EuI~z*MRhSPDX=3>`r}XrO$8 zQu9p{$li-5a3BdUGs*UtBBU1a9Z!*2pj#I7x4N=fYiDU6I@)V7vTN3X>O%5$Bl(a@DQXgL;I?>FLWi^>-amo$+$nn(} zsm?>HbL~)A%}^?%R5uT?ZRu00yLkh_AbP`XF61!D1C-79?jlA()cFhG;8>`kt0F53 zzO8O=&m%e)@nSBg@P=Fc`~&r34L{rn=%o?enw!tJpb+d|c6yf|o?Tw%G#MPh#6_zw zwswwbz1tpkXu>k^SXww>7HTG* zPM5iEI!Q;La$OiLb6p%}oPT@6l*6FgHv}-KBxJmJ?xOCoJQX(pXEl?!1dcOweTfjy zV;l<=$3m4GCT+EkA8{k^c{uriwc1e^QyuwzTUYjpT z$Ih1)0C=$kA@mQ<`CO&WkO9ff)`SI6hXSBQrw-7+H1Qj%_ zhYHf(Zu9C*0X1!2rFui9jhtmc>`^L!I7+30#;w?E-y`xFwrPfeY|F~B(bJbz94Aw(8V?_KOFJmO_R%ypK5k|A%9uz&(^8rL24qPr z{us!zttF8fNFMAHI-sNgu3E3q<+a&vwpav22*EHJ3z;K`v--*ObG z=-3g2k4~6Mi;jfA2-$V9y6Qx6jAXZbLk9lG-{4B0(R~;AMU1BZVe{xS1SE<9-XLzr zn6$+IoieVUcd(KJmK>EzkX*l{>x)O19qezdk@!05TwZq2-vF^EFl7O8Ee>>upl!ND zZGG#Q3IU^TcRaX%f1lv%$@)4ZpyO7p)BClv@0pUJR?P|#`jZp#oUf5Hp^<~5 z0hJX|$ASUNUw!pIU-6oD;U0*e)u^J}RRP2S@z4)m^JQ#p#=!S-G0{t%_ zS#FBsjm>%$fCy^(RFXxMY0$jYgoJAt;GvC!hr8J#wTxsp_r}QmSaq=z9O>$TB{vRkavBBN4Q@#TEThOEDS;13JFO|AtHw9k zY#Q-wwpiSeZNQ*}_`jwg-2o;^0$|Whx^ovx7$nUWMEC`=xQZjeEzXa`L=uw}jzkpA z0C3d1cT@1NvP_Vdlc({i!gFe1~0Y@<|k1V-N1xJUnP zV!1;bK1aEZ%2?$qDr(nIsk(lX8zMGeti#tDCVvC!(G9Hv6CUiD2)mjL9A$>4iSSC) zU28N{#gM9X{sxSPRH~X`P;(03ZIxU52ko{(zu@ragB-nmJPVDc>z&kicP(ddv8ilwTl&-{PC4!TorS6LI(E zL?lt-XsWoaLWgwbHtFYG>d-lF7Ru+qJal^sRt*5N64dDc@RU%QrLys8U!fr=Qx+8) zo-~Qf#tzvM4Ik@(@*P}p*yXKAE|KS}5tI&Y-s12(X%d`s!*HM?+gF*X8 zn#C`b{{HOQKVYC47x-0L&0z^&S>YTa&7eF0rxIVkfX`|O5pNBE2sGZN_B3bMTs55p8aWuj}rdB1P&aj{y0at1!bw8S# zB|C~9Ml!02j4d&cfvSk^C~Wt(zpMBI5CP%h2axABYiKvXeghQEu=EOhfFN~!=og??{ThIAqI)i!XTER{Iy12>BXuIaf=A=rV-zY2w=5kUK}mtyb$BRQCJnI7P&Swb za~finBteV(+k`gbm3~|GwmnA>ILi4f<2mVwbN5L)I)!Et$z&qSv+fA)B>#{%gnGq1a&Y3RyXSkpvM7ka^0cq#>~2f zPz@vmO%K3u44&8RKOO&e`eIYU3E&V1ba19v7SoxvKygcFfuROdw_4R~AWd7M$pz*! z*;WkjNOJWmR5n<07h`faQ*ys77t$Z^-KT}U5CR4z>PE`f3fU6h6NJ$Ep2D5+r; zQo5+Ap6CTkTFt1malbb{%t4{V2L>hO2o@jQKSD3!32G2?hXxHNF@qTcN3-Y2#|$G~ zRZ1%lqAL9dzL7Y<*{0(lE{}s3+9`FJ!_oaT zq)1Vu26R|*INZm2_g3$+H==IGjUEJ^jef5bX^|o?MCNOj;x%YY$BOiD4>AcdC9Ul{ zZnt_+?K($CqvL)tS34VK&x*Ef(Zx(=#jWZJlT4*@U?~O+WP!wm&`?QAJ*aE#HfefK zpy|>0e*c1-a>ocQn5BVc0{VR{rg@-mqFRNfscKBigi|3BWP5JwmOs@rRncf%cc#g8 zhM)_E!~44mR7T}3wC@V{9-v41gplsZ4iz_hP)2g)el1rX(qfShm)N#bC@B0UqJYU7 z1n#+>iNcu_CcVQ$ybtw;EY;fY-$#KqceFOd?z2a_hF}lOqsd;B5u$Jr&i%WegB+gH zZeY+P@}v0_q<+Ck{cM@@!f^XvVUXZ0Ps6|A8#r*3g0UH$29r+1+%FU`8xCVqw8-X= zG;95RWbi@CX-4}!J^k2Jw3WK4f36|B}LLz1SqK4^~D zNeIHCCJtbjW>#%E0K_3<*|w@Hix6-`koK1}fhCVXhxoZE4+q5|t+08P2ZpD#so8XoxDg5g0EO=)(>wk|vwNL; z_i}?l7N7^ch&Q!%dLJq3=g<<` z?d}&3G5$fj6gs?*yo0|h7-zpzR^=qInLk$}OA#H}vmyB?Qq{6itROqWqQp#2T2Nro zw|rbY8x_xrXT7mWyZE%K7n%U`W^7qDELsQSw$SOy4j|2$;S6>LsHG~^6Rzp4Up%4s zy7jQG0<0=*VT+6&Niiiw2|(EvZ{MaIN3|tsqR>9$%!CD!Buh*;WTVPK5NJ#jz!;(a z9ZJhsYCvi8!Q=ZU_=XTm`W$YOE;fs`JSvy(s5PPVk9R1R{Gt(%(gnuYTw-=gb}+uk z7QN1HHhaHZMj;PvOlw0F1lN|u_E!yAv=!Znp(IGL8cG?*o2Q_=`Ra5s$wX{{q;|)L z3>zdNPkZW0gshkG6JMJy3mYEZv0yBSgj*OS@UxIwo&_@XXJ=s*uL}0fS%Ce9pBk(N zr84@f0M^%tn>@M)kb}{O9zB=PY(^tHN;|aj4}Xm9*sh#0O;cBpZ>7`ICw#;B&T$V5 ze#f1`#?c7yXFNEg=f&7jBClGpWWlPM4Ml2bj#f1+pa?_P4}en|P;zvHSfJWtT$A=> zsp(<6C-iy-#$o6UUD8u32u*s<6iG=u+ev5MzJ2xfZ4#w4RSkVcyxj3+CGBZ6)TICf zSqi`py0<{A-u;NsTFwt?M()80EJ=fYH0ih1Miqy@r&uQ5i3UTIF#iEcV>MiA?1>d9 zJpnCVd#m)uKxOx-*bXP)C0f+l*LIJn+Kz}}*@hMhae6AklT>IuEQY|kBH(erO+^7R zs~yn7fK?}ehO^}LHc*ZOcNBvg7=*m%38^Iv`tSHgTONf)v^t$<=qT*+1}jS7__ENb zoX03Lj#n4O-$#%$x_?|k^~O*n*Lku)*P&U;Y2QyYAQBn$!4{Q;1X8Lr3>_J>Vj&M2&;TBiba0F+)egnj zjTfi*q2hvdS|&l9$akt~8}TKIqY1NDoVRbw$nx+1T(v+e<5X%gPb-$DCNxaORLh*g zvn-ek_0871Uw(X-&C+$F`3H|r__KFH=!Y((?$APRdJjxVO}_bBiF$%e#!Tj@(BnYm zGXA4S?|b7edL@SC(rvXpfB!xP1wk>7jua*svaHQ?84aMm#-x>-v_>GuXDmq}t=)p0 z&tXsoc~6)nDBcLS@9-UnJ*g>8|A_yIZ#*aEWR@pkKJ$S0GWU2Tq>wGp<a^q zY~hsqWf*aQ>zU7<;vY+nBq7|604+6AeFQ}}R1+9GV63i7ngs~}b!4~-%2Z$fhLUC* z%Is1H0=B6Hp#*fetxkErM3f0MC7pT?r3RAyXz=#!N0uxcF$|;C^g;|G#hyndJVW<1 zgJc`*0DAC%Z?*z3e)izy(GmG2_V}X=Liz@|XB(ZX4}N)9ECG~en-408A`l#^Ko&tD z`f)P5ixb{yx0coR;*j!W86b9eQ*J-P2h^ZxPurWu)0AS`k?l$%bLNt|;)On~pI+v* z*rB_AT~`y;ZF~6+Z)LIYLv@PUlzWLnDsnqoLAV}LD#%D?;s)Xcu zB?PbsKkp77?G}(S!J`W$oVjLmef{s;mQy910En&lwj%;kX^M@sCnw+lY~pD8b1=&% zryHo1tZxzj?B~zMXEm4+hRmN06xp{xW+O$@1&MiVArrqB;nC2%LvTa{LhZmAI0fF_A{yAF3yR@9QqT0 zn1bJ_g>Hv-0Il<+pMCIn@8}55bRTJ*ip@uSJ3HP(Z~CJJF4n6JZ3A7GHdwIhAaa8w zOoOL|La&22(ltV#m)nso@$GO?m0ap+b zF|LJ1irU#(YjE~-Jia)C@1K=%04hpao4BaxtvFr?@!vL>tQZqee8X;t%tGOV*QuV< z^Q7HAB}uOi(Un%8F-Mv&Lj0jjFeOQu*s1t^5y%>!JAyhUj!JKlHs^rX0^p|1bcYrO zM21y)`I7D?eEs0T@6IfhF8)9N`hIxqvMm8{Qkn90>Q3b$ATM>a2V}+f5 zi(w0_Z-6VI*fl-_ZbgLc;rhC>Z0({+Hx3w!xg9FDz@RWNB_WB%@I;+COtK)+NLAZJ z6}bT!@cAjkBg8z&uXQy9=EdINA^X+fBWF+6Dns<#k`5cc>Ld3MTPCO_ImxdgpS7!y=3rR~$(HHHsC*W{2YryaHDphI1uChFIpUdJsEcpkib%>xw`>;OK{#+7O%&5G zNs8GK5Qk*Jl&7fpe*5j|#`=>dC>ETxI#>~kV&ECP@*>|=n5f8z%5EYHzBo-8+ctxc zGKWF~N}Vu8RV2fwGF7Fa@EQ}6SfvV02Rfa#V9HFi=W0s03tq{X8%2OTn1$bmEQ}VM z9yM;hZ8GrPAPA}+O$9}!Z6ZL{k6)89AuQsC4C9dRf-LuG4K=c4t(fJNkSu;WJY4HS@#k|qyiKcHramou;-Qbz z)fU^7jAXz_&^Z=Kww?z3SHX5pF*QTRqy;I1*4akCfA#`;_*t=Zk$-wMl%^1p&13vX0HDe9i12=c=$YX&Ek24k9WR15) zepT##ha9BU>6PCWa?G}M%|^gBC5Ax}W@&Z^po* zc0T@|_Dkw$ZoO=T57Ap|stqah7pBDm`)Mx!eTS|EcZ?7<81Xv=gc)Nfi`Zk zNS9M-hn7HqI{L_MvzQUci3#Iuhb&;}`E0VX2p1gWWc(n7cd+0#{e{vJ^m-YBL24od z+`{|}ctmS%&wwpW9Ecf}THzF13KY?_o`3rs6T<7Kn6!Whes(rGJ9}~lQ=Szs$`^mT zn!AC_(zXh%SeCYx84x*3DSpWO5I&h=Oa(JWcn$Tc2zl0ITkRNvoodTE-L+*aE4DLD zEoelNDo$_n7|sCqMAmB2w^r$GvnMJkm4?&Qibl;{4d?{QF?T)MPk}i5`|lfYN}Ac^ zj){lN$g?Kwy@&T~QQF+Bn@m^ahG;NDW{7L>lBc^(+(imkq%8B5&S}HY1*jQOn=7P&;8GopYDciC%E3xJ0*k^o-=i656$qNKl znDdON$i=XKad9OonaBwrE%~u2{W(11Kl!&pgyc_VJ{!~q7e!#$v0HeBW^gUG7tHs=yTAlulul0w`53Y!<9D&N(BSp(&wg$58DNw>9(tx2jrk1WY&)xoIr{?Gn^HdO#|VlU;NgZBCcoDupwikTL( zO!EL?vH?)6RVv(+{4%Glm#`n%5l+vY6Rprc|6GSL$!%$87t$uy;Z;@33L+hP@6?|< z#?w4yO7h38HlFqSG}p{;4dypM54t6kl!nzf6x|hXGIv~RO=baO3}PbALMCw>5wU10 z&j{nJCgC*p1VLnREP**XLds3!5rvx+$Wd=Vdd||gGcqphAFQr|(xfxf1qUw~7xqtq z^vq#LRE_C+;x6xE?tQK-BFtiLeSg2x=Y3keF-yd|h#A|9xsqDA2$sT%(?mcXtgs$UHH7k$Vh;3jLYu<{VQoYVkx2Kj>}G<_a~cQbP+k&z}P zff9CU9&on{f^L9_R1IbsR?LLd>K*(^lA4NS&@IKs{>sk&qd(t|vMm^Lz5nN^*IwT= zsx-%8LCjUF5x@$9t?pBS%#zXF#XGNFKBS3w%9d4f%Q~$(Fn=aTy;=B#AbWtYP`6lv zEmVaX(``|BTIhej$1lah)8?oL5DMQfXVk~T0xdNHnImfDknDeFdj?Yi?uUpfb7uQ# z1Wv~3IaM$HlqB6r&*C78Rw8-}lrKtOCfnvYkfUA*I-lEi7Q~_e`-9OiaV5e}T@~j4 zXp^2AEh!qy-s4$n61-?xXz*(}sY=5cvh@sWIr1rpYOb#Uhgz zo~LSrUO*~gP5__YlheWAYz)U748|nHUOeqR1%@g#fBNCs59g}qgOpl)j-%g3% zU0+uEtKG~+NwC8e&K_{GRJ_?asr|B2d3az|9&+6m|BzuVvSgiXyvK{- zc+HqGhF>eEBQ*@7x%zbH`|n}q`x{7>xXbd>rNLC%qn+U868dQf?Em@peLP9~=BgCg zw-{&DQKwNVOlDt5ihY~mVokUCTU>uGO;!YvD|<`S8xw^O5>oaAm^QgJttUaNi(&qi zARrHhvoFDmC?`JX(I)<-hC9HYB4mLwr`G|sff0j9lbw|ie`-24 zS82JjYiNNvano=Y2_g+_**a|j_?*5t8;{S%wTq_!K4%y}ewrWVb2MW7Q>i&LO~4l> zilUaJ)5^r3+Q@(c>*jc8+&OLWDy&ruM^_kfv7Ayo-?t@gAxMg&2!@GkcIZKU>Q6kS zx7ps_ajz1gRhf)kg&p_6STr0RJ;+wk}zN$=@9=i@N+;~f!;D_Q1+rb{4LQ9>J^zJB`#2}aHHA!oX^F5?yn8lcG%E+FAVBDZ$%fK1J3K_YfY7GgPs7j4|7MhD#g-UHy z1UG2np`un~CDw2n*me+2pKg8seQSeqC4d%fIe`%&7my{}2)77l`BENmv2c%1j8oe> z?H5(?%8FSi?4uFr6WU<+J5Z2|vk7Xq2`dR0;F4 zimDk9g7KaM{6fk0MTNG?2MReQ5G%i&l+1}Ac#P$yynmnX$juH5IqWqm6nKV!ZS!+r zexIe>)mRK&m6Dw3!l_mfDV)GYlJo5OoI_f7)pfUnkSlwWiA|_C;;0wW-jdC@FzYRw ziJ~Q&k>;U)huBOaPY`@Tcy@Th-C-BSJg5Xs=ypYbSg4AlKIF~fh=yeGPYHTzKgdkw zNm>#eR}}+Ovl9)`Z>E?!V=GRw%{0_TKt)dR4aPisTD$1&pVh`KR7c7e!w;p}08kid zxQV~@J>Xd;2MEt*8kG^9MYQ|i)i1kw*z#F9hlU0W0;Ek<^R%hBs?(lq&5f8H(YlZ} zwrhbwkZZQVfj6-Dmzta#mO|sW5#9fzCyI$5LqlQ?YZ!*|_I-s}6%LC-$pVozeb=BK z+eossSd*ay%XU@O8>rUE6;m=*YU11WZF0&sLH%!lEVv50zJ#wm&NTZt_8jncF|dR! zx%YN)ryEA$3I&J@>ijM$j~-i1fpi9Jm1j9X+LW`T=yF1kHi2&Ec}rDCVqQR~7l;!bj`8%1SmO$$I06wz zpv~vO<4VMSV|mFjT}Q1;NYefvuUs@a9a88QdIBZB7qh(_5J{{wpPAC;|czR z54B-_Nb2D6G4O0&mVHA4dabKi-&H<8e|NZxKwtX6tKj#_c~Bimr0J=J5}B@nILHjo zmUkf0+*UV^*GH|*5~{Jvr$Dq(2OHO1;uYs4>mjsqHi_!Uaz=fF zn(1rUMUJuqmXc#Wf)?cthu3d##Bxno4v5AMrDdAS%tfR*us05Ar(rrhqr1$&{2|)h zpx#UXNb6G_D3ul*A}Sf$A!6B*FNc2WGcF@Cm*|cwa3yY8)WScXids!R#skEI>&N$7 ztv<3mUB{U(c3Ryz)H*G#k-!isEYwY9u4y(+q|J>ec9~4J#6#1HgZ^2oH-ae;*5P5kKU~g{)hNQ|ny)bYt~64i2|^%fBIIft z_N)WQ;(i{gQ{C8dv$uY{)3#(=CdeB|_<|f8!dNtwMZn?)FfXKDxw}gR_3p49fMEa& zgGxoB7$^wYrm=u@p^_3zu4su?glualavDHu_H^_6@3+4B=9`z_P*WF`L^^aU=lvcD zdF$C4zXk<0Q%vfEmA|>lQuVhyyhhO%OIQE=Gl{kn{Z14j&#kObo^$R_9VaEEkmtz0 zT-nPc1Ze|~dVL8jL?qoV6f$sHMmEh%|BcF^!`%s>Er@9hlGs||zZA8aYlUJLUosat zv7VtrOX)fonCz6JkE^Tbq8G(PGTJOV5IchC z1JHvh%MwN=VWVFt6VeSZL$p>NAMYa$twDB?>bvMX75wx3IWz~rTDC-`>*p6CeDlClS2vxKw} z11O3(>h%TTj>wse_l5F_$s~~`awa3Pc+MsuJ9fCXhLiMpQ40^aN8#<;4m$4IfIBE7 zcW77SfL0VKlA{R$!(p8w32BBOD3GZf$1nq5gKC3xBS48ofF*lk>=>Fl9#D~stA4Re zbC>`43D!hw|4A8kfWCBmyi0iYz$%o7<1rSom7kS96o6sz{5X1s(PlxdC}4Vy-moi% zR+p5D4h~qi!3~yPd4g5vm{kA}6=YK}nTO65(YFnodBD6vxZs$V?|Of;OTn*((}Orl zx9{6{(UzeEXTXLeQi7@Xz)(^e^++o|6^5VgegFLq3`oz$Hvl|TJ88k1wBUceMw2GF zVU`ypKu6xd84F)sef8AJv2Eb0(TAtD2$%83lH&Yd8H)uR=<9VWQDSYX=~qHA|q)XFZ4T4;UhkCcph1eGmVxQ7P zbQ$fCedxVE{q*5@aDq<&Q#6RUg+sVz>Cb)}e|)idjuq`cKaKD03W3Y#3i$|GG4(TUeBEH_#W^9x0!vJ{83Jk_Zj((+WtA+2W< z?3Gfkn~uX7*LGs*&O9V#p7R(0RVp;bDgTSP79%}C3`c5ZhrB#VOC<7HUesD!qhr); zVsi!%!eOgLENTND39szr(M!!tO-{>^%|gl0e9>wk#jp?tq()-|DlL(Pr4mb`Itj5C z#43?C_xCY5yE(@A0Yd8F1VNP61=q$WwY9==ehp)BJ6nLxka;jjM%B~&`Hw$#zWeU6 zPzA)aR2#GEO2aYDD$Y=KUcu97$Or8`Kv_tS)HkA7TEl>bs0UJl()|~)0sg|Am>H5$ zZ#FR*pKV?bo8=Omv)cvHVL0Gc%8ue7^zDU8J(&s9HEJSbaoRz~a@m|E8{dBqNdWog z8+vf7+c)2!AcCKvAc8p>+6+%M2^!A8;P}&FcR2j&t6zWpis}(>z)yH&M+Y2c%JT$i z7hm`{kd|`Y64HLEI!P;H;(vs;gEAzEI|8RMb8!lavbxP_jGB>UZvo(xVes*Eyb^|o zhq-d?uinWT>W z2Q*WH*&+h3JS8ReTTqfQgjk$}3mk?qN>W=JI4}KNZ2*VN4f~i)tYM^$R@?VG;QL!! zd=ndj6`ifpkI%4VX$xu`NCvAP9H0zo$p(|>mZd~h2^6w!9#lXQppzSB-3stUg}x$1 zbo-2^#u?_zii#4nWK7f?BHu2bjL#1+Cw33Q%u`bn6~+`*fcv7|!Z%g{&zTfw1e+~@ zCuvl`XLnYSDe2CUmv{hSVM+4IZ~pK9-S79&$i$m{&|gH;8N0)Nt^8&UMg0NNB|2n> zUF7Fn0g^Tb9lAKY-8EP)f#SS`w2VcR?0kD3N`5%=rc;qa+H{D|nINq|42828FK}JX zV%)i^+V-k~V*wY3l|9-`SI#YaCv%8&lq!c*)GA=u_|YM7^_O2}^Y|jy$0Yb<81fG@ z1y7ggo^#8r#yA{wp@a!3Cej1N&@w5;LVI)lbg9I)PEW^Nh$TZ(r#lwMjZ3-Gpo68{ zCEPeL;6>44?p0@R1EhlADRN$(!iRYMy?eRg+}rbX6OJ7N=4smh0k&8uq+IDPdive*^Yy+fGEWVDZo z>sb-7kr=9X!(=YR3oXj1s;p-aWNkZ)R@elY5;8T1u+)CC0aLDXx5Q`^eq1MZ!WU~7 zXmosx6gk9LeCZ0A>$-psxXFR#8mIz7ZK;NWei9^rw81AxOWAHpkTw(mw-|@CglTn1 zdqhy+yhLKK#d@wuemdOVW}*r(8<2;mY|zQlAbZn0nHv(>gGzu7SiHcSC)d9G67|b3 zzoc`w-eW*os&2$_s6l^T7=bOBV%m0W+nCP*XPK4JLM9=?W;jAP#WyNJpLMWmt~7>Q zw)oA~BeaDbbw;C;eur1LVbHZ#z4qQFFH2yF%j*qvFJdRjp!1AABoy=&2&8q}a?Gk> zDF$P@C1VoA@T$6HK}aR3+{ASAtP(1V2}^@!L@v;xAnWqn2VFvciGA37`t(hAh{<>! z_;9httEX&chNf*Q2satqRSSiCA+pipdpP4an~<>pVINatF#M7h zq{B1uSES5|u1vHUq2#dDFO_M7HIQU^_y*azTqb@pL=fV@k~d4CB=&w0rBWQyinoxK zMF}8nYGp1aa+zcr6greE~ak&iJ0!U%p;<&j-MaMm=7gGPt zYj7ZxPe<$M+IjGJ6JlJ1P^wjv6r542&Lg@-T24$eHmhPKVoX+0=ZFqy!@UUP5CkG> zg)(BNPB%AOQA3aHU1B-_J=ok&f$th3<-H5dtkP05x};>Gf|#Uj&z2UZ4GI%(3(RGr z9EzGwPD#eZR18ds-1r#JH&k2ewU;}5$tgP+D&FDC)XIJ2tKoJ24ZO3Ayx)YAG(q;YP>uNsi*tpmtR7Ig;5b*v-qzfwbZXM;4QYTGKZlKn1RfuFy=NSaVlcn ziUPc#CR%7Jo_!~F)fC^|i01{Bye^*BAp3PXROv%>I;2awJGB#JU%L7rcT&Ovh!(%w zhjP)*OX`c;AB=nZ4_b(?&~^^&hN4t(Zd8PD4b^l2S$Qg&45|T2&9d51%}PVG@E%d$ z1}jomf$3sZO=89N1X-S>g!{ zh&EY7N|g3Y@q73kY_~xnmW+t!G0cdVOAqa7Bez80qE5UvWEJoeXs};hFK5T|yI^~} zykCmKZk|egg|&1ns>patNE-vvP6^TqfV7OHZR(@S@J1@Z(^N4P1fe<&;JS%O3?>6M zidR-3C@eMsKcKauvnN|aUr!cO1~@C^mgO=xW_I``pa(f-cQhV@XQt+oEJFltD8W>X zD&UfmqL@%|1BC?^WAnfi($M%ns;(!)lsxXVo{$u;0Kb+nijY*oz~Iu(AUrfHK%l8@w8ILkJ+mPcS@w zcu0RFZeexpTOz4Y(=91XSG+ zXf{!ONn+}D7&>7nNf~)_vqmaKZHUe+k}7gFJV3Be4RZ*sNYO~vh_3uPE^I+Z9fK(u z1})SP=%#$8fq68l_B7JBSp!n{gfTfzt25;b=1w;ehB*7;(|O1w=)&2eZT~njg?ujG z8K1zISUP!x^RmB*qkOz`e4m6H-W-SH-RgYzU>&4VvuCnck7lZDF?h_v0d-Kslnnel z*O^Ym=!z+Ow(gpq6(!rsz5?B{<3w>L(nkRYM-#t)%mXU4SD5TE9l=sSVeo||KQQlq*!KXPOujO6^yi4kT>3UjqT~cY2fFSKQjvqvG286>q zsr>XzP?nNBg19Skss z0IeUxgs(W!WQ;nnjS4g8;Fq#txDJ&MW|T0eQaWX?uz)!ZVAc+fE_I7SIqJcVJ#Ja# zKqvy}&n*4)?AZx69*oi6-5s>HFfUE_Q<4(5_wx9duB_YyqkR0GZb=G)rvo7-ku5!w zN!0%p*+4cl2NnY0R5QS{j^HsDDNYd6q3L8m$o^NPYe?o=!(yh6=48}~33E~aWI&t0 z+(W`F<*&2Zr>9f-z-j;&*Q<_V>Pnzyx+vBhcB@EXF%JGJn?{j1CiRt^63G!Z%*bk~)# zRG-8WbQqI(CdKvI08Isl1w4;FP3bilvWpH%V!@*ROi`&)o2odoKwd>7AilztRY8{3 z_U(N?>ktOk0baMbEK=?R&}GX%jrK=BH3uzhK!l)<5ff5v(EU%MD!RnUmal*O?(zET z3a!7FjX8N+T1nEjuloL+F+H&}iKGw@ViexZhAF2IA4OS~GrI4CT+4|e$)2No5O4V~ z7cFnzfG$%cU8dW8VVO`BRLQi$K$|EQ&IM{40Dak9xrE=$vf`A%B9(~976DkEG+Lc~ zd`G6;T4z34mLr}X-2})-+1hYc;G@&$;A61mI_D?-P7PHdj!7VlVjic<5|!X8a$ZWo z>>YBRi2nqntvLYliab#XR%d2)~+ z(3ZhN#9T5a59`Dfz68Pq0)i#MQ9v{SgR%|9Q!VDPYM?hH*K#ywd9q|7QE3j{RCjkf z1T9b6gnWPu2(*64mi>)Q#S&&e^7 zlE<5m4-C+csbL8go9fnd0kx^Y?l7wC`B2&x00Yo0RL0DefNC9Swvr0ws#IYs#xw|l z3|S~Eu-OhiW~fe2=z@$Ql?Iv@r}et|uud5^QqW%qFV+fF%eWrC89;`sDKeF0Vn}Q zfs;@HMZ62QOw#^GCP~{uxDq0BZOa5{WiHcZILNsxfQA65()Ojhgl5BKi-|Z-Lb~*W zd-jSbYU&nYuTO2T&3kCd%4R?H!GiNqyv2%}0x3^$$+hg4gKR!8nE?6e29qN#u#{~} zuWF(+pSu_zH*OF|s8RnH-y{wTazzBWq>LSTm!;xQKb1b9l>qUTRvsL;P@kf)jh}gk z@xzD5FKLhG-s7DO2t1&VtimMU7BrB>L`w%oIt@|;ddvh#lU5Rkff}ZfsWaOj)9}h9 z&C;+RZ4Z%E8>)Dv9^((7mFhs$XHQ@Zl4V{ns7D7CTGuUjk_2ew*j?~V$fgkZ0L#iX zH?z^=fPx2>#=3I#&o8Loep5^1_t4uzXzuZOX_{(k= z2w#>=nWaoq^A(}uFZ5WqrMq`CiRcJ2lM>MgfPH8(2S&u{BvW4Q)Bb$?rShepeuAd8 zhPLDaChE2@+IWoc${)Ia>zLZ!$dpz^i8akKLe&3lX{s)?yI;sm5e2~U>0*0Yt?G$5vo6aG z1o9C3HQv0TZMNkaejN8o#hTXp9;XrUfs3yX@BB}kS)2vDR5)^06~WlhY;P8`p~6DOXGGqGK%a@DQes>xL5fkHq6B#3|hzSETK zc;>x}c)NFG(d6lK`uo1KQOg5$i5vjt0KQUC2aLt14KPHW2_Hp(Uq<8w@9cD-w>vzv z63*p7lhYtcQ{5|7a>=}`i$LdvkfED9FeV1Z0JPu5vj~?&s&Wn`(rYJ2bN3zqO8pbX zVQ@jRq^cEvOCK-(KtOgi;;|2cAI7=%{rC7vv*k+D9yG47*svOz=DydY^+c0(tB}AA zVw4&9xo)vaWMYBk3pLz&aAV7pJvGk$U}*`a+kodSZ4jCT?gACTAK;~P zcRnLj3s5xcxJ(%5X~e+HoH1vqDLA+NLch*aX$NL1C#(qqcN-5p@>9gwxx;hR4gwga-lyaf@_Lmt9|I?GZ2XIO*f`IiUk3y(|bdzz`3n2VwQqrs85NC! z9h}Xve@gRUr6?3og}gH=WIEYLVkL!F!>!A@yHHg?vzEauy3&X<%-StGo3JE_1arp- z?xYo{+%*0`2zL=|Wse@!aruBl&`vBX<)3C+VkUp$G9yGcN*YM1?r;MH$u$y zEGA8zTio+$xtJ+!A0em_9^bnu`FQbL7)_G|E*Mq8CVT?~w~qVqF3d^d>o#I6=Sm?-Y*!jat)-<) zT?L4!6j;Cg>Z@lK{txB*~7gt0H1y+y* zYjKk>ZK)H|DWKcIMHNs@O>j`Ct|mCBFG})iSr6gW3qv8us{yhVXSjP8HU!X7mP4pf z{q>)zKQ60=%i~S>^yVII6JXblZ;o}d2zYKIJ0yg}QFCP0#(9FF&7kM1szcge1g24B2*_S=gr35-bRGK}%i*kv-MdcjScomd^2Sf@djVUOX9 zP#yM^ToHoM(|;T;b^g&gTwXqhtNlT;d#s)VC2YEKXd1vX4Xd$#rG$^pPU5>n>T@D0YeM8UF8l#&ls3RvW z6#rl0M)&BGa%F)C7M3BjpR3ti& z!xN5Fl~97SL;iJdo~}q*LXHRHFOk$(-bTI|7NiKP!YeW(knSJ{7`j~u$OuLOzm7m= zLeX$H%UChsD=Sp+51)Me-J@sUVdC{~2U|yb>b2nvc;(JN|7m+Bd<^fyENr`O*CtiS z;_ge+%wQ(kDIviE>ky{Z2&WQIZ8+jlt{CXZDt47m>!tE(oqT$~v~6We81vEkqep1q zf@8vncu`0Ov^ecXG(eRWF6~)znl`6FBwFNo>ek~aZ`VL`Q*KPVrpZOda);+~&}eN= z6~fH#^*11*ADlxQSUPzP-+Zx&{0q%K0FH&mb8!UVg?EdtjZ}xH1!m$}@RlS=1Qq?v zU9D}R(G!vC>K?R<{z=05t3CRHF6z>}>HhQfpL5G^b!Ol)K}(FX1DI0|3U$eJI?_;c>t- z=9*y|JE0oghQFdFw_VZTwod1tCO6=>99T6^0zoYUMubwnO||T1j+WifuA9z3e~WrD zR#;UXp1s?{^X1Lqal$N%5*EojM;mi!ulNVXzaax~sN}8{HE;kxN7bc2e!Ox(T^IPE z7|SxF8ahdwIIc*1;RqbMu}FmD7y$%EwvMKRM{vsd`PZ*k&d>1Tv&7*Xom+Zk53J2k z?NK%;A!-z(lth3M9wED96FKH#QvvOGdY5o&nhD_41sy=OMf{UeDjz(0I8YufjLhKX zLThGAFeeyO4G{(Xx%XZ(_>i1d0O*S)k``ggpCxC7v^is^Wj$f`b;X4zE7=u+AJ`Go zX+phl(D)VtmT$j?DPM!N9v)xNnB%pZImdGpcJA#hp~na=-|ICY7uW|!yI2Adl$(oJ z#}D>YB?m;|E7F9Q=fkjeTc$S5Q-Dt$Sd}OIv)?vJK89dDTXuu$od<||ArnR*`)Z;T zX;&9GjC1Pnbe3>w!(lBNn8zosR6hHT`r@I7(_o!&r3Cf2}?P2xoh7-L??$QGLSQVUg=r?ATEyVaZg4 zliZ5gdHZJguX1G{E*uB}D<1^eRLt#WNOYB&>L0Hm2_p7VDxhqr(U(x6` zn%uVdROU?jw5+1X^MvMDR)2bMv+f4>(Z(Dm_~Sc&L4%ZV;{vPxpQk5D)Nl}l(X$N{ z>mp}E&-N;*j|i~DjTOvCkVT+%CKD>lbCaY9eZyc*pw*1cMn1U~=aN@~hxim9JzHDE z0&kR{UZ^+xVSzHe*$cc`%QAAR!_wHKWmmv5%rt>zSXz)W*QDv`P}8SGK52&NK5(k7 z+4`!V5T-})%g2u%o!@8%Xf`9Jc?it_%mfd$xX@+; zU|C2vSV&qASYQN=#T*$3Tl4E~6-SgO=1V;5aKj~3 ziXz)_xCWL83*uL*-6uI(x(Peih_W@Ad&V&6cSTrj-yLFN$J=W?O<0 zU9ph#@Te)91tDZD!I4VIb1qIxy(vpe?mHZkm@H%AMoxSm6RrOG=<(lHw-GWgE>N?H z2PUPY>E~owl}!W5ndfCdYgeMgXnc|rcMuAwYUPTibsj_0eERe}j;b&Q#0_~bsG_JJ z;yRe^yE!{U${x>eC}w%~NGdWUd>kKojoG+VMXNraeV*V|o0Wuy09OA*tuaLtvl25` z?gOe47R4Q@Y9ek*u{_S%X#WMv4P zIkZpK)a+I7i|RyknIGWLg_?X4)>z5V#n`Q6o-W&jY2Up8=AD$U^M zoij4!8FtHJA?fy6i|0c$w(tsv)p0$KSHhT-17AQ7W_dg?LqN#T6cNqM!8c#WylRx8 z%?4J})WD6~iPiI{z{QrV4Oz?7vMWBQB5JE&+u2YBNKjwy?Oh=-K1B!hB%u-AzV61n z=fql&s4;JJ3DCY9{4+^RdiIRg8pLkuKKO8a;2-Ma{BV4BdhvZVB=OUAwZ@ck$?zoz z#kz|2~q{5YKY^EvC(kck{c{Q+_F|{c($H{!i)*?Z2nHEuCqzqf!o>mw6in`XtlWr!$R}dS2{#yuPD(shY*Y1>rbD)d-~iDpo2$7&+YY75P{(C z`cX&ej%y$ylob5z#U|zw#=xe%&dL~KiZc>kAQV7zZpQojQ41Jr>Dkqc1W z>MD(nHmJ(dnFa~HZ5qZfE%-t^@Dna%9ZSG&*&Dkt4MQz|c=W@w`ww?8R2AEmXH?*V z4ilKr@oYjjm;ft>H0`DqD3zQ5t?p{RZI)CaVm7UjEFrn4S}`QUDx9iml5i@|b>LKQ z+P2C@Pob6iKD-vu^*SwvgCSg5$^rAUcH0CaQpQx8!8~aOYKqSs@e#P>Z)@1Mg($l- zcZ?0CcjN#{py15KEp4YvO3CUv9m0Yj6M2$=kM#PoA0-c|%^$6#^Phh{r*=ax;&5D0 z+67<$ZxbX3n z$J(Mz96mMW4dM0iaLAEs5$gD$r9&MbHSZkBSap2xdG0WmrqIHcNKbu*^zpY(a8;f} zE?-4dT_*^uZcJDbQwJ=I`;pZ+DU(`NxiW8bt_4|Th%ktd3^$^P2eFG0?0^5^{(Wp+ zL277YHliEv@jVs5p8>?D?TOyB8*_h>X(YU9hEYj#NTs|@HHMlFhNH=paH^fk({590 z^|T9D?zVDrWy^yr3qy#}M5d{d*@v=?uhKwYQeoJDzF70QifB*f{0^D{)foW9VzST9 z8CD;z{dNvuaDZEB<79EbV=h|>{bPoxX~^(CwWZGX21d3dKo5C2VSX5@898^UtsVh%js7-;*H=5S>vAZ3 zED6()W<(GIMOod8&7~!zaXPAK5k<6a0E6p2oF8?3=)+X7Xm)<~XuJ3qeIH&)wxp55 z*kVfQ4a~}-zuBKPgsiS8X>$cS591TlpcPgkbx-{?t#EB>;CW0IK8xiPaVZD&ai9J0 z_rL$`K5Ap34{RfWNHeh2A+{#>iv8m8W4o%f;1Qm2-;dg zad*Gc^q~$vh9kp|XO3*ckt>s>L%~?l=;Lv)UzyjrnYVJ1HgOzkT6zI1Dr!PTRq_uK zdS?eGhZ`r5MGg>XA&<;ELoQE4$z-bAwkF3d9yyLlT*T#R63GInBuV&BaX1P4viE`F zEYA^?S)|G1Ak4(uFSd3L(Tl#dawJTVP@!^^P|_HvlC}v$gQC-fC0*Y>-xeV$Sgc3JBZYHcV4@$268O>>Hu0&W~CXPi}EYesMFpo+9ojjNGUvfU;-9zAm{44IMt{oftb8J=xX@ga`F zY?KZ{{4E=p6V{|CQl-7o6{j&#Pfx*5x~b+FZJNPkMyUq>^xCSMMG5FN+<2iJ0H8=$LnWosl>s? zKGON9+fDPys4Nn_D03XG>wRHeUydid0(o}Balu&-n3VEGLy=?l4b&=cY`~OwPk7)i z7st2N)F|&he0a37b+WToL;jS@SgFLNckkLNFH z(Q`jW+8^*Y<IKPM)r;AkYdy(MPwnNtYx1q*6MvmethNZ7xC_T{lVss1ntZS{Z%T zS;xP5i)M&W+wnF=bi+3q>kpWzAY+sBZ*nDls8YL)+C#a?iAB zjFc$>{k<29ObBV7rkOdN3Qu;OiCz>SgPcz*uM%zI`*mG#jXMD+%>XQO1)2eri*s7t zOkkn=)ZdmboQCWPtLl4*6&>Pp5~Ttz$yfWlCNav$<0 z`VlZW{BxpVlo7sABf1f3Kfl0)ZqqD>9`i_jlYy+v9KGZ1;gC?xzRX8JHTK|ABk#;2 zG_m;P#0@zyGGl*m;*nu^qHTF)lP0El>MN09U$aG?|K1u*4Q~2=qI1T#m1Y3%gdMTY z5M^`QKOX?bLhO;!kAw(9)9Z5GGF#m8QUjfvmXy+Mgl$XOGJj__lxTSlEr5&u`udls zrQCQwLVh+w9!IpZb>4xg?k{d_?70CSM{!Rt`wm@UfR}puNM=a$Q{$rJAPq>C*Q3 z_641+yCgDTy*Z7-AOP3F;$0v(fKE>U0+;%JSIKWfo#Z#21uZZl`coK+#(hNvxhgZUq zXZT55f}iDSC=4b&hjYs@9qvxXlZg?EQ|4OvP!1Q&aZy(Ky<@e959%ouA%Fm43dGi@ zv-62O7adTX(2et*r4A;NVB6W+orq=5&@e$A@sKT{tKGj(i~FCWIcz47M`a1!F06V| z#Id6=s49n6qd@ONu%-$y8WjrGPh;sIYO4b@J3$?2uylZS1gkyXXd7voTRF#@^s13)8;&!JKcy)=NF$;NbS8tY7dl2=PkEJS3YMs5zP3N8%ClzHXB;`L<~;LC`a41sc4$+;&uoK0j~k-AFHG>1)5dL=zgk>r&_;{ z1G;v0jzYezmHQi8OLyKxtftMQW|F+^)&0IQ=3kVw1~l92LlYRpQJnS?(E}xkIpC(A zKKv49e2D+>+)*3SsfZ_usZjva%eL^ct2YOzqfQXTgw)^>?WtwSFbM#eD;X05etHjO zLbqA}#bq}&g>WiAL7ZcCU6sr>yE@vC^F}h)od`?%cEBRZxEpdK3Egqzx+qAXh<}0T ziWo}-bse6$I_t)y10_w-O3mql&SaN!y5=ggWoH=y8*>J18c&n5(%MzU;K72)QrAID zbj=)^({{ViEnK0y1&GP-48YgGmz6_ex#RYvySr-|nh-SIlle7onL=hV1id6y^7Gja zvLaYyxpQveiif=?j*$d4XA!*El6HD|8Kp*bjpoklX54i`Rn2iVKc^P)U7_+4r~q9!r`K9ab9-4x+HfNSKVpaH z%82*XL)mLJB?cBHHTR^m2Q;OhR+%@Q0@(oh=w{=CpV&=J3fwI}(cqa~VjQ?Mb45(Z zfwhKfX*(6%Xt&_N7CN3P8_dLWh?$hcOj66b&c=+DHgo*kqV<8i6kZrG7!vk;hHb%^ z`*L!UMx4up4+|s8nmR~JY3g-gl(p17VdQMggHP2naXjh8v{^v(X(7<3WXd=IMKE1xt4=)WkScM5ou9RPv!Jrjj)5dp;kU$hd*3gP%Gqz6SVoN;Vx}%)6Gy$xMLz2|sQ_VNBX-nt6A2v|ABbapsPf?(2*X+Dn;3+N2J5J#In88Cz}HQk=9 z7;TyL9Ui-3K(Y>5{q0+VKNQrD@xpV9UtZ8E^$QS`3pG#q;zG&dv)+pNoqYixe1RddG;dvn2fDTK&M&s%42)G{Nm+kZRS;%OU>n~vM;R+U!Zz}T zpJ*bJoSUbkEF<^zy81-d3lNi(+hsd1X&{XtVj?o(1Hc;iGF^Jzt^)viZAvd_bi)!3 z{M8jgRsgwF@c>&=SJuuUq!!NI#MNT%@WQlx;hdU!dTk8}8g#2tEC3q#3lHdMquBC_ z9`yKKJ-BlZX+W6rrY-s*xZ>U!TAyn-*ic*JhS$Jk8oPrqQZ>m)48uMYkKc zRP#PDK&tig2cMEl(hegk*`p{+l|lp-Xc3eNLP1qL&1g5zDo^vw8sLWA@DrlIJx1;IIA|*XZET05VX`Fz2zrMxZn$z2oS79w8e2t9z+^5z)RerH}Q=^AtLkUNGs;g?62UT2Mz?P_!*s;Z>9t0Aa zv!G4jjvIS%-0-IlD3~DWPe+g%hGEMO{lZ<{NPUZ4Uh1}&=XO*T!%XO$w}RRbvWkQ# zTmV9py648NzeYShZUkhPfc6gef^|j~kVlL|qOnxI7O_BCSMO zC2SMMLw) zUAUS$_p+K~QEiXy-P1Z1Y+@!CFy>dTHG|ev@S)_Ds{GNiQQor@WvK^H@_=>Vk&;p zXi79_Mk5Bs;SuAwB*sxrK}_JhEU1}oTtn*Aug6TBf;?2jOw#hQc0EI{E8T*sAp=81 zg-_d=9bHHGm#hwg?WH<&gCHyu&SQU?B(y%LYwmBakS*^6))MkLdU^EbC4QpKeSSU&lN9z#6_4bcJK@_n9`;Nr zMP%7L%gj)3MoF4D{y21D$Jj^4s;8 zm+(!NX$2TZI|bvYh;iT-gM615hiuGAtF^0}Lt-YywQe_}x&$-vK!LMMp>spmXt_u3 z4Xkj1aoyx5t(3=nv5gTT>ORz5x7I!C$1%QrCP+M6|Smk#nKaq9Q+y{Hwk?~7h+Bt1O| zSj;(u=D_EoJE>*DV`s`@*N}05_)3PDpQjmN7pN9MNG063y8bz$E8Sa&ut+D<0opMu zPjbhxa$hnutRguSTB#8}ohAKMG$9;IIsdC!$M6T)YFXoXSvjY*l+tN@-yZO?3VOa} z#Wj$~vx8^oai*5?BcvTpzN7#PHhpoIlqeItK{3&sYLHbm{+B3$%z&Om|bjnRY+bJ=VGE4cToDNan zUfZ^;%Np`~kPW;E+dtJJP7Car8x1)NVm)+hR!)6U_PDN7$z&j+se#c;pa?-=B#Cbu zQi$rlkJW75;?1CGXyyt^fGvA8FzZsm=$pNj>NHAD%D4DPhd>H*fB| zxmv^$Y7F+lkQ<|yxN(xWa80*%r*V{pCD1KA!rql7A8`p32Ur*MD+F2OnN{%x#u34_ z=4g4}HVtY4v4cb2{Tz`%siE6DuNtJ zy(({qzt40l)iG=gYM-~HnWUUoe$MI20gn1RO!=Bt_O9UwqaJ_l=hxdyOX>}8Z564J zmV>~%$%`14X#%=*sVbQP;-th+Y~m+ff;ff-#$gcSn59BKFpeo02T4x2F$L&CRw9jg zY7A0hCXECD=0;bRLKjXGSP?m~ba)dAfFf?Wj5HW0g=p!7Ne+%M#+?~Y@DU5T%9=tL z0$CUX_qgg)Mzsy~5znhCR+XYVI(diB2QETQr)pC+=27AeLhLy^@4S2iQ=UWb*?Tib zy?aFH&QU%NlEM065g0n>I6`GDq%P#Zu^R1i5(Q}z`k*0<>J)l=lxFTMZ^Dx2ho2u~ zXyVou1}DOnxGN!pZhgMJu9VSN3yhg|X<5uF@@wB@7^QN}9VqEXN0c7lyi&<=wLIra z?X*Hpg-of6+tHJ`AkR_>d*S&8gD zRTSV#-p1>ACPZ`RSQvRN==r!y#1-=Tf~Fy&9?cs#BqL7HBJwv}>9ZO@Tk)EpAcX<=L5rNIoV{A=G)J{JNx^0bBAXeuV3T) zyv9ZGnmU9L=$9U(%^>HXk?j(>-mV;vWtr~ow=7as#Z>VVs{ua&co{NgYPd^_!cJ?< zhb<){aC>YRe`Fj}L&%YaP(9w?Eo`%3r{j|4W!*Y8WVg#oD{za6t?M!OAwiW9E(PR3 z2Szv?8X-)@ZCAQQ!ty9CYrkTB*SC{Q(@O_5Xx6=i-n=;n5Bb-dr8StcgJ8U~bOla<=DPW{q!&eT*b5-&M3$Qf zDOxUN)Ea#{8M?qiDcMm%ANbS%^92o8Svy1;Y3UG)Kw!j`uMl9r!DWf6NDvVyptLFR zL0KlX%Ob}@uoj?Qi52F2^b~g~{#6uDV7sfutIidyc)O()!W9TB-KDB$7!5{LAt4Mu zTu2xbdCvLH!FSJ|efMJSi2l;+wZjg4`!zKA<+Y9NxjBEgk>DL(YvKuCvosW3nMKk5Jh|pvPoz_~OFohAA2ydD zD0OZp18p3>gC&1?`ajsj`=fduLqt=bEX?@k?Cd37mTM4v&UdcU5v%ph^1)9Q;HSSQIFJcB)7gt5&F>~!Z<{qbHG)E*spM5VxBuq z_d08nQn^4zg*3m^PJWyPc)e1(S2) z9mG$}R*U#ai*(iWQX3F;)l4vsU1A(2F%JDB#(|(zQlOSprIk)5?xl_xlV0a=W+^Ae zE+CylqK|K40e z@-^J^)vxdV{qLjm|5?P`4H)xZ%9cOkzC1qx*g1Pcm*oZopO+`+|G0u=dxZe^{o2~| zq?TcV`sGYB5@P}*%ETRZ<+;%l(BY)X(Fs4%Q;W##^Dx1@wdOwf6u>#G_57_$KTNb<0`V|7XUZwh9^LD70AOEi(1v?zmcm2=^ikgvId6~0Y={qd z--KI=54;08t>H&_CTvNQt9M==odNQ^ ze7SL^q`Nn>A!73n9vnS=^<)zFd_N3wCWEXhqy5s<>&!Pq$)yt~yl3?LAx*|YcMuIJ zKYjr#zCPaBL0J&4zOTOe3ngJ-ORSfFiw( zpW7%{ctSmwDvPqIq^l1zt>@L04X8iw1CYv5FNYyK676^=4-ih*<{*z8(?k^56@a$W zxyOz2)I(6LxefqBy#roVu`#*URFJgFX40y8BduQ78a#G9EUZej9iUerzM{AP$Hx?B z54K<8l010%a_9Wz$r%M%5`2J|=%R%spMUK(k?e7dt4>K#jli;`Qe7>(@JL===BvN;XUh@Uy=D%~uGuNTq%A?C831 zg31wf?M88yIfdg;J8L4OlO)6te9tv}L03*gBV|8s3#AMZ1Zj|fckd3~{d%JCB20)L z@Au&6<-rapC3fl@k>IoT=C|cTHF^9HmVADf`a*h%Ru33!^h%gKx%5X?=2Cb z_~Hd!m2)rVHs^4^zS#GyOH-R^riE^|8*y1wnU-@v7^5s1tSp&q0AX70uClq7WnI#S zMiVwk$GgymOom)VIYf|d-v(*UExQ>ELR14Wdor2eciO$|zF=TGMo8Lkk}bV z@a_4w-J>GR%4RGxQkG6c=p?Wxq*BK*ngD_@qa2~?3jJuJ>?X1VD7$}$=lsMHqBSNH zuHJ=H;z1$#3QT$a<{a7`u+PbxH_ON9BgZj6dior->7h#{1$l4aPa5X>4tE9vtqCeE z3ZroiJVxu(L%@BsJHJ>1mBrmO2cQ1SH(#$jS^0(>5+3=D!apn6d3*2*hYlwo8~Kh? z7#MD`YZ-066%P$yI`OB)B;*WUTS%u3TuXRqKeEjnZHPw1!Z&B$6gv}5? z{-ZOURLhM6tUG^!sf;f`bzi)A4QhFuOWPWPc8FXEA-N#YlvntF4Rx=L6qet$tTCyp zyM}E8>kNgKmLMEns!dr5>{6HjGpAjH-NxwCn;6{!-vpTHj0A$h zk2v&2b23Siay$_Q!|~@b4PDdpi~;U0J571YB!XSwTMdA17+s^25xD#PNLfk{sjg69 zam?;HhgY5(X%OZ)O&g=m8ceBL#ZPR+--aod;FDk_WJ;`)IXR^8`eb$eZ8+@rb(v;W zmra5i$2ikC_w}UJ<3-#HS&um(dMn|QMEVxtlt*)5a)0>-;=psYRSIVO>MtNTM?+B;gh`OrxSn46|9T%Fc5A;coOV(uU$j9(CAcTU!~R4sPrWN$WGjpj$HGTM(r z(EQb(AkCgrl3K}@SpM~5sRJ|Ox;%t2*Vg=YV5HY|MXD)^Hru3{8iZk*Aux>egflC6d5u&>}RW%p^s3zorZZT}y43s$) z;&-71q7Hc7B5c6Mwd3B)Vr9p=8mArcfFw`=Kcm z@0iq_gLkO!G8!h6fdwW``>m)WLv0c~-$s2FOo@9F1pK&j210g*<-$*%uL~-JbA^aq zz1yxPQVULpg`=f_U`ZTTB8(~HjB!yf?tviCP9fAJ;3WZEAqtW)k#L4Te)ZKhb`l|T z`Rei8Fh^@96Gmz~98y>UiOYrWy9*0IK3G4cI`P0u;G2s0lA3X{M=48{v)sGY4Jb#g z=9eG_t$m!NhV=N^3)mZ@?QmBfo}In0ZOmj9=%(h_OdRLbmr26XWEdK{J2ralw(q8rRL zCEVexaI=#8qtf++AMh|3ik@GK_$_pv2M>-n-~hP6aGRkf5Nmj_fRV<8A->{Os8azD z=75;y5v<=cBUi?Ll!Bb*JZZISV``9Pod8+5=LBG%Y~eSx*IWtVKb*s8s?vUwc0JHo z>siIiO_Cb-!Ic_4w)tMSM5H)8#8*PIAYFIdq~jD+YTtG3V%*%KnDz%0W9mv@UGVfK zRk<*F4|)1KwT?M)3N3C<Z%0BI%SQ- zRm(YdySAfC36b}dLGi2PI4%ZB$>@Jch-KEPD=7hXZCP$wmCU?1H@^f3PTA(=+mW(! zcfS8(sRL7zCGVak$v%yoH$!I~7bX6K9D9IF2_`z?itL=d!~@l=gM8xB(W_TzF!;J> z#W7HiFNR^FPrZ5&;=DU=+^(bx-utS&ojwX^ah$17Tx5ev(Pb0(_cp@!^LxT!p>rIO6hab*o zmG*GMIW?VO@wVdS-qrGkN>a~V9ji@P%HnDg+MIbxFa{u; z@87~0(=-Uic$`^wH=|tGsV1fpW*elZrpY<{2l2VCfOfn=jR3u$AwX-aMx}GBRvX9+ z?G(~mvEUoVWu^NDvqvMHXIZL8(QW`IZ5jdP8DA>w)CkjYGC(M*L&tR^n*G{H!NcLl z*=B{<@8Q?)K^2b7$ylmOSmavNz6ey$KN=4_552@ zqtkHjI!m%LtRul3pg_yWvKo4uWN|uj`qaLIf=P5>0{ky6ZXm=Sc7XlSDfu<-M~FO6 z$g0p_zuDe~haSQ5(B*N*##$Wem1Q>ZKI8S2)t+Y}#?=0)xudc+&+pQFX|*`zhm(71 zF%r>8+Kfc2k@jv&UJ!&}%G*^~AFW(QuQA^L`8iUYhyVs;x7wx7^cuy&0x^wE`95$A zf}2k2!KtS4N@wE~IA$7jH4&slIBJrGbR`Sj#OJC)d^U`M)NbOli}a_+jG9Kzv~<78 zuWenlUAF|+Nf#JnPNnO4@Vn-_9M0!U+fP95;z|h4U8fleAuQHvr%td(vmI!r>_^$= z&AqcDSQ0iqIbTckmJsp2kw|kq0kfQ`cM$J>+<80`e9mCXGkiT-_;*%b5nYdrG;v0; zLj}3AVs+-&`6r)@6P?OdafzldafHFKzO4HvM>MquQS9~P?3|DXJ>TRZD0Wq z(Cd>eALs-iHO#}v^_(aQ+mQ=wU$>=~bTt|+p)Id03EYIU?Y_|pVu$LvWLRA7m$l;9L5wwwx63f1+H} z`*xFUrkSz|u#-<>U>w~QoL`%|&>O?x2@9e2{D_}qPQ=)kClGuv%bM(X1jpJ~--ac> zrg<&MZSlqmf0{@UHPTC)O3xZ6aO2E$>x3Gh`|C$2p(8H-nyyJS^uB)mGbXc=)udb_%{DmVb9jia^3=UBi^IgBa?EiUI#nfwZ^vWOM0FfE_f!a8o}Z)63-{&84|wj- z7|!FHEmwHpnoG0cYO3B~uwa?KZ@QkRIi+o-)c07U=Y7Kbq+m=>Bre~|DOh@w?fG~Q z4M6M>8s0nStD9EC^@nX9DDHUaZDxA zeZRoB)pBlwSu#EpauWMNIhpW=aq1*Vgpf`saN^*UCveJTNRsp9nRB;muHbYtSrQS6 zVi46NVI|D1bomG2;0%!IC&@0e%(7aIs9B2LvIYV?cUnLw*Wj8aam|XL%sz2V4P3L; zOf_3H0{>U0A>^i%)#AJyvKC@#fw&}I~+G{ zo+N=GHBD+Q36|-!IV3XH)Xo@g9dpM4fstbfPmUXZ$o61VZ08Tz<_^y5Inr1-wMm(} zi4a~MgrOTpIqg7NA!8~aI}?0PI)FR$)tF20^^>i*A0+*GgP@;r1vAY6Tk#WH_@LqMtW#;-*93ZSVJi3ospt8@QQw7_QBA^7%R?R}@igN| zZ*jShfU!@VL8}D@u7~DWgeihYtAzrulV>oc5(H??)vRotu1eAb)S|1k#Ve{eP;ux# z3l46DgED7?P?*MCH{Yjw4G_iCTY6L7Vwr}xrg+aaHKEx^Ya-&>+V!Q5tQKsOc5T+c zg^U@=w1{LPHrw8U)GiBM)2S>RuXCsfmhMX4B-s{(hMPDS&0B zj$jF|s)iCI#wYM0GZy9^~;h z%n8Bg0CeQM(}5+|(E35kbb4;=JE7By!&&nxDBHXgKspu|Lb6=MBBlWQH|j24S%IK( z{`zQxhRq)l8{8se;(<%zKO7AtyB@`T{Dq3Mm}eT-Ai~y`@7Tfx4mV4LnX+XDnj;~% z@Q^V%*4=0amZYl^RC0N?=L)LQ(PwMRwA39=s0ij&XI=>ho43LNzD%{sEUPcte2{|& zPIw{fYh(a^eRff>qZQ)x4Sqon|tWCOu^UFcQw5-J|a7oXuq?ARq&)67b#R_3v zO}K&zoKT1jkGU-pJ)Vv3M{a0s2bNqqLRx7t3;}vt#UKcTk+_b=Vaj#2bWN!QAf05& z!pwCy}B8anKB5p76V;|D(IBEAJjjOSxybL8B57CVEXlf-1wYIxqkj8-sLoy|% zkAE0Ht_J0GX#V)Dm;mYkHQ@et!NDPY)l4|pG)jQWn$xAAvCJgd1;iU!mL(cLObvXOGGV1Rs}TiLrhddD99)&=Q;m~{XWMu;XB(0m z0Q(_0>}ffQWthiKueUy%ade{+9Q+whdA0-Qveu`LtotGSF^Ed|Wbfvz+$IJM8!6MU z;-Mcl+T0^_Ra7ikf2n6)7m-OOf6!@Y3yAigHRHS+t zvFei3B&;fGlBg`L6t@r1Y#J~yYG3;Sru;B|{C58MVrPyd=6TSM_krj`!GWqcQ0gU= z3mU=3IVI?gA_enMT>$_o8sH2-O7)2gu36r2&GsMQj7H(M(B22;^nGA9DKJ+mFav^C zZNhB>GI~`pO-g)aTY`?Jyz94g%gS?Gmu)u!%WS2moO7B+eC-a0e!!R)aBeU+3N73U zh%Fy_n+c**WAAxq8x;a%%8d=cUrIK{ky!8%VvB*pog7YcW6KqY1#iy&)j2pj0CIw) z>R`0MHEuyDY+wzbbc)g8HEs%uW630QWG~@8A-{y(F(PCg(`mlL_aea*qd8zi)&8fx z|MMpY+oYuDq2F_Zib{di}vNmy{ha7(Iy=h`23x#V-UJ4 zHEDerhrFSM1a+U&Xfv7)f*BZ(;EM3TjSY1FDf#rKe`^KY28`q=r#{T8X9n;~!MO-` zcil7_c(#EnGlh?KbwC~~$y}u2W8X+}Dan*-P~MHeOg4g%)YdY!w(N`5|13D5%XE

      uQYECg*sb)nDi_XF_ znkTs;nJq(h!5umH{w`9PCgSpBQWrH?Cf*6Yf7bPV3!?iJEOVES?8#UNYQ(j2sI^%T zXl8{JC&M?a94DGg)LI!;GO9LH&tKhcmBFQTaE=Nr{7j0(w#%UMgTCW*ds&j|m0mbm zNKsI&N5mJ=&VI}xIXp@opJpJ%F-MWI11hTe;6EIed-sUW-MQoYlOC{U$Z58jvL&^Q zuT!_#+1Htu6Gr3$e)9z5)oeVmWHpk2qltB>kQFqt?MXk6cyPNM3xOCcN{ zjmJ6jVaj7t?Z`r8q8l5Lk;s@|e1U;q^a=+zlgba5K5WsRf4@Z=ZFsi$1ZUY4qC2P^ z2|$z00L{?*z%}a`*EA@v$#Vo%&UK?;%Jhe>I*Il;-#Ww3!BijJ1hU7Y1D|4l$ zXH%wUPi>XCgJX&uI*fTD^E{60x?tD+0N%#+a1`iWPs@UoOi2i3q%~42mF{!B}7P zxGvJ%(GpYCgR)LjUIzgJ4e+}q1@e7L&+=*ALE2L{<=o6dFwyNW`P*sow6=`u4OGDa zLjSB$;r$dg5~63F3U1d8AdFs*1nyyCknjj$NaP#AHLdqt^Aw22AvGL`rZTnG<)xVp z5tWHLf@DfXGF!Qmrk@z4&dZ``aaJ@7MG;*(rZF+i$wHo+aKH32$jEiuhWUw0bDoO2 z4Wb2>$tguEb0KmuD16{nnUsd`RNa6|+Tj7LTf2Ious7c2Jel$w<#ddaoiR{-6ga)4 z@F}}F8AWyA`ZBf={_f6%oG4g?7{iyYkk3)NDOLq9o7-HCHi@;Q>5V@57HnAv&=79 zzwdZ)Z;3IzU%QQ7Dhkdn$x(3TEI0yTXm)EUJSn_wnDDmwK8xiSJE35M3 zoZW4kI%a3n0t@o9ot;D7U67Iuggw);HpL)mfSf{Xe*DD zu|;)sQRLPSXhDTq<#gMId^M{wnRBT^mZshHLnBU-Sh*$8EQ~o@qo~}Hu1wX5w|yRq z5Ft5og4j>P#Pm7S7i_z7D&6ho%&9>p8y1G;crKOe0$# zV;apfJ}E7V$x_ASHmIX-Gw6R^FuQILASQ!50w75bEYr4~p;(Za?=$GP#4_{Cp{ZD= zJ7__Qt-)h1nQi9-E0=k@%~@c#aeRbmsBYlDb9MlAr~~a_C=AVxABS?m@TC;7?}~=8 z(4Xjl749@x(8rL(T_c(8)FYK($M=&ciuy4$8Je-o;#hSdtJAVUr{#T>$=p-!)STC0 zV8@b5n1C({fHQZWTMiKhmO? zNd)qXNsBrqS*wLE4_*_4G(2;FfuR4tpoVj;$%kbn+B51{Awda-2;(6nTO|z)sVS1u z;D;cfY0o2bL3XG0tky&XpYXCAwyk#Ak~j)N+bpHOdpFZwV z|Ins>cDVTKuLm&Y>iHS`I*6y!5FI6X(WC_x%^I1g7&~>*tZQV0$Vduh%Y&68HBb@) zx1Mp9^^$>3Ea0{anPwWi&+r~Ub#=~rN#YNjsEQ5IcYu}1mbfwd^tgVnAGzqoCBy?$ zhB3}Z5GR=c{7K5dukB03ntUimxTi$pXzuQQWl*j^2=)W!KqD|9q#x7n%P%@q0EWFe zYj|MFS%nYb9#pO1A&{lE%xn?HQd%_9MDJUl46iF%Cf!=Cw5)6Rl(ZHIs+b;eO%7DU z1x!V#W_*Kckjx-W&%L3JHBm>EpagZ)BqbCQ7^xYF=FnakmoY0w}cEHm~=Ylzdh{|a z<53)U8Nxi*&3?ofEt=^iG_68n@(XAOp0|C;4(PeNdKBuF#s+zhP@k00sRF;jsj?W; zS`N-b*KwRRs^%R8# zUX;iJH)^|W@|=}J60oR4_%>sQXV#{EM$_t1DT!z7AYd}Mnxv@^QIz;yD>9@6&=0LJ zzt*cl1{Q#&564_N55u_Y2Zj-wP;%VKBvhy6qXh44sKFP%K7AT4FyBnG)Qx(yOQ09k zJs6KBHucDcyzlqoxSx#TkZP^g6F#MlzEpZ9jMgZLrY*~spXjDnYidI#dQZwuNc48q3MJ0a%#=tZ

      iv`bDw`OfEyba10- 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 KMNUMnLSTY(zDvIV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/crusher.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/crusher.png new file mode 100644 index 0000000000000000000000000000000000000000..67d0e505d21f85cfd961a339a22ae7e9dc32810d GIT binary patch literal 78450 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
    1. aoX)7NNJkF1%@9d(%USMyxvPwTTT_ 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

      w#!QhC_bmB>$ZYFt*z4_?;EUb~5eirimoQt66e& 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 ohF~ulbZ0B}Ff#-T(jq07*qoM6N<$f=yM8x&QzG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/evaporation.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/evaporation.png new file mode 100644 index 0000000000000000000000000000000000000000..041ace21dad4a8495a4eb6c64fdf350c9a9c0356 GIT binary patch literal 70654 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

      x`4;gT@u0A61>uWKY;?kPl4Sfi!XvAY14NZCyJ9 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

      s8GwHqB790i`^?>~6> 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/greengrove.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/greengrove.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0e8adf3652f98f1227496d07ad218dbf0a79d6 GIT binary patch literal 38966 zcmV)2K+M01P)$C_6VdKs`M-Ml07G#UwLW@cPkT4G*aZEI^kAPYt$4lFtwaBpv5U0pN|uvjY& zDGh>jb8{aGWq5aYdU<&`Cl*|II8SIXNnkBZWG_x;Fi2i3OJXisb~j*tJ7j`AUVA!6 zT`W*(F-BV}W`#diaWzR3ZCIsUBc=d3@N2v7es`{E@b>ZX{hr71JMnAr_FdQa&f&;rgKL2gnK@qLJ)pbapU+`{67M$* z`cGZoZZ`<7*FH0}HqR&i+%$?BPE#-7+5rQ-5+6@c zzBdbUxQ%Y44aK}JT6}kV5cN$U7kK%MrW{SG5Hyc3cs_N?t-wy&@QVOc-c8gIX&KvbY)4&V3GE;%~3Q&_Z^MdyR^8)h* z1ctS(5qeyT2#X9@7tOE@g3ShiRB$Kj4!N%zU%1>yVBU;Z0_kKJU$`px2O*4qU;vz+ z6%e(MRxh9mX=1PIso?Vy$1`4Nn&1We1UYU6De9&fy+AYI-#LMNb-d4JL)M*mp{^q@ zOx-dHqPS;X$R-9B5iv`#NU(@Z1#O$M#+AEj*s2>KQUOl5IIWuqa(pztjJO3EyloGM zHbJePso++m#Qokm1lBMpDm9Y|cCZRAs-ngRjJO+I;0-S2E-Pr7_TqpJW)7^+XL>cL;%!e9lX%C-V4DDRv_7y ztnp9Vsu#d7GJ|tLFbtyr=u*~gI}DK-I=LW;0AEpI=glCQfr2D;*fPN?!8&3E3Om~} zr2Qob!~zeS{iXT}eAxl_ecSp7L=rWEVE~|dM2(-KO`CN6RrPq_N}@2}l0$%l62x0|0$S!*~!5&kB%;}xb^j--^qx)W@ zQ~=!Iqo+5fzC%VIcDrfUal~cU1Trd8*2u2G41K>r?5B1)Q9;)G zu0z9mI%!*k{L;Yfa39hpzCd= znA+hU`UWb1_;b+?F7&>3g5qzLI3Y<#B!IEY%}|13qpa(?hUdXrKTB}o7JfrTeTWsx z8nA^mZm08ZFbXG?$-2QE4s-*k8AS>ktZ4`42A>>mk{mR9m_i_>LhYcH!YG6l+XC-P z(?r_NA}Bm;ydP;hf6F_Vn_@FT0qbN!5|2Q1o_EhHDrLRhj^8SA19}3u0rzK^BY}}9 z+7=4fza?zomj)R>70DUBd`2<82TB2)3f6t^2wR&yiK96MVHfPs$FHEUhe2S&4}jQps(^$Fk=&x# zSJ-fT-;ZMT!wm|RPys(wgdO<-vEtK%FBT?&)OFe!l>NZo0g_qTP0~sRiQ^s4RquDh z@S{s6Vd*F=osR_AGLa3#Fq|d1%sJXYC8|(KfGu$rV2jgW2ZTHnDp5s{G_CMUV5=Vx zs<6WmAgJ&Xu>)umHvIrQ#C|wV{Q%m=4}i`5P*sT^aDhaU&}M5OE(y&;)L+Ei1866` zB%4X~LpOe`i|%&ia&olMq*GB2Ka%l?N`?Un7hq%4B7?hd70%~#G%ce93ZF;&zUv~` zQooRWfmA$=?*@t7K8fTY3cS;1<6+Ye@)LAKAqq%_A@alNw5?m?hd>*JaeyJ{ha^9M zb~Zl*LrA%RMC%0$yNcDokOQ3+ndDu!@VUMn(A7F^!hajmckp$W< zj{Z&!;r&2K8%qv3+Ds6>UZ7x55=zRgWq0s=#@#{EPExXGKk3_p`0m1OqFY@%`Ov`z z!0870_wV2FAZ)-@jwLlE3LD@Q_E|C?{eXXRlB#L}8?^D&@K@VFyJ>uWs8sUxr4n57 z?c)K7cngQs4;5B+x7+9E@hH%mM*Kj@XqF(6JrP=b(zb?h#t@M7arnDjIcWO0Vk8o_ z2XQ@ULk9u7&q|_p5&y|47zZD1GWhVYpE2zGAdHi+(SMK#Y|vKNl3YFPUW^m9`GnRFWFv07EG4D`|H$#Ah}`Fo~dM zGW>y?9Yo)&Asi*BDk1@_z4ixPzF%ZZ*~TrUQweS#+>7}$5Rj-LK0b~|?-|(#2ih{Xc^Tq%``5qlD?dIyf+2A2 zf<%8VXiG7{7kPz$U7x`%bS*6=CA5qb4`xN~c^^1qn2e#DlOwY5yW^8Kx$N zz{iRP6;#~rCHVdc?ePTCzUp{SCC%*y2{bCX-$}bx+VW+U_P^i=kNp{DWIa z5zs&qG{kK>1Qd;=iD1zPnqM<5W9TX&_Y!EZgLT7jvLg+SxHu9G8UZcs_Fi(qZU@*6 z)-bP`C$iB1&Ep{>_}%X7OC)uzv;ox9md|`XF-33iCrDbnmq>zU#Eyah+NfzkGmyqoS=@#_j zgsLGDtt?Rk;B3=q`v_{(oq8AHyGG?58VP0z^e1+hX$D+YBazVb!;q)FLA@1CZ#8#^ z*XdMMq^*uXylRWCny)X!aH_$K;-I*tzN1ljJVpm&LU=xpbl~y*{-tSf+-pv!=M!P< zabrO4aWhF6O|S%bD{flCCkf3GzDbBRSbeExw42WWfp;_M63%DUXd?j)4ojW}ZqK`7 z-*}JvM%Ugs%M8OSGtaOCuG`>gyFlB{GwajIYxa9+2CsogX#+QCEAHKHjLzp1wEaAU znqUcOLxH;vxW5AKI}?Cff|~J4(-H;T))E+Pc@2E?C}n`Y_jQ9Bh@@_)Cy)=fEDG5+ zVHoB#QRB$l1oCzqRd99{W|?MqmCidy+K4sbsIl8i@R;4~e#cD8emY5c4eE8wA|g);Wk&Q;9}JO~?S4h%f^PZuP`# zHzHMCHTR$aZ{XhV!CMS2xI>x{B>O!ytrm`7h!menzF5d~ABey$7YDTC;gx*Q zZl{(wqbTCyrV~$B$?{C_NHNES^|*asaXycKR#B6P@YW+JnNh+MkB5wm1%Bj->varz zh|UmUVYGz^nk{a&rH{d;Mm(Xo>#r~G2??vz6G3!Jcmww{pC{TwC<{_LRCEZuwK0Wt z$vdtKA!Uh(4Q7R0ZaYJF(5W@Y6qBixPOhYb9-c@+e01;jO%H%KL#Acwdxv zLs4p+N0a0LtqXnMd){g7z^6_{Xah`VD7*n&FyNxIS4i4N+z9aY5g#L;^N40rf-Id< z>X?F}_Ge=B7jJ2+ly|4R58yo&(G)Yh0V{6`76v#cB!Tu-7{J?P z3P5~`Zc#^pxQ`owZMIv0XxdT?Aep;8bkp$zXOzh0I<-oNl&b3cUU7$^^sirjOnExJ z2G{q);bjU0I7Cp53HA9zh&IZ5l;B;i%3I2_m;xeU`tdQICnBg&wSQUOXf_kxpPvv- z3WJKC_%4WVO#;e$P~MI5b}IU%qEjk*C4J!?lD@Ou!W}A9hDt?h9R+?o&bJFl-|C8_ zg>1Ej8a0_o~ubiVPL>8uC&M8n zE;i@ZL50{=mAtLSH+g^HXGpGzd8>#jK?~IpygxrZZ^TV-#dw*7x4NQBR7@48%^kpf z7AU$xRjsOes31xL+yGy$4F%ws9|quT5GQSg05>-T4kvS}z-bhxk1~$p$SURip}fUM zDenfV{l1#2x*6WXkn)DesD@!s-mUKgGOhsceWY@#qAS3g0S?}u%A3Gb)iqXG;5RJ} z;#UEV;=nYZ9RrI4fiv%eIG@OwZ5dAJBVTs}Te%}p;&`KYrf}fwQ3p*G=h32?@ZRb~ zy6^klZnNp=iWwD#h8od$`Q8Zkb$icS#(Q07RDCZhBx<=}|MXWT}P5Pfaw5S zAb}l$_X0eqKCEgraJCFoK}O&UdBA3i8a0H8Ki>{0aisHUljvKE=%%2Gh&Mvq{i@<& zbav{{G*ENYEWBj^66VnW4%HU_64m&x^ZEC0Q9T|t3hMZMe*bkCUfy)AHI?idfEIGwyZ zvsj3>4|qb4qh|N{iTm*0+d^)L+k-6qPA3L9coXCubi+s_FD&&hCaoJmec({A$YL1z8?kL6b zHD^Ahdj+{#(*16?&)4?hG^*0k<6#uNfVUCw5&!MxfnPjus37C?(Lt4u@J9r^VIH6_ zyn7%6$=`BenE2oG#hT0?h|?FF$QLEzwr@CS-w^6Z+s?%J>&}3;i%v4|mZNCACS&F> zXAT2@`Px0E(NIw)|36~%-U0Y-4mkHsQ&}xCMHxrlH1dCUSgimI@!@U7a@U z{PUbWj(2#;reBu%$+Agh4zhD9n+b7a49bi#mQAiq@=HGFjz(Hd7`69{DF^Kz(0*RM& zYl)Y1VUx6!{Y$!)$XO+9GFXYctRwPwvjKIbFdtFYVShxDpBuX>An}qejd5-bxkb`_ zK}pwh7r^Y#{UR62C0#bioA<0ii|Y`iB)vl=4utTib74svD# zzg8$l`PxE3l;2DT5H1z{Ri$E)`I^SjaV?ZigTthVB)Rgj$hjIa!WGD^H#j?{aIOHn z>y1+}%*)Mz3iEwlnYnEog?Ty7%bg>H5ld$$gPi##W8NZiI}e^jc}?WT8x$IEbX~e1 znymmTNF-~zg!I&Z02 zL7@rrVm_EP2T^_`%=Ou^at&ZYAj)+Kp{9`4g1MbNp(*@}8NpV8@-3p1X`dYgo3Y>> zLXgbPcsb;?8y{;9hPl}Qq~=JOLm8RF#`z+13b{LsP_8Zl9fjT<^M(KZhC9rS0Pp>l z%Yeh+XFBZTP|!?n&ANvpUXFr|IU?q*8SIn!LP8+(nK&;M0lFhaX);2)G9wfMy>KI7 za)&^73((tgO3(*~9L7Ez2~J3IzMGEzIp8(xo&mx}Nm}M+{NIo{mAzNmIOnqU9eBeYpKSQzCZC1C4cz8Nvt17QINaslm&`fQ=Xf{X_7s&| z4TL?gXzGQ3~R(~7nwh~x> zxVlY;d?cAJaJa$YXxB?0ob7VgvnvPsdV2t6|2A}+6AVfNoyEV@CS+>*7C2` zfY$tQ|Us6FB-(flUgCkQLUNJ$I$zt^u%49-Ql~$A7v>>t_=0Elqi>} zm!$>jrLCvXEywd#Y8La?%B*j=mf%|tp<^_B}w(+xLS~I8R>W0&Ku4L@OZn~728U)gGH}6cSuQLd= zYpLhc!j5U-n#u6X#h|x!qcJUj3HG%PVFVNVX$HIFkd`xik~B*=Zs7{lyJU_}>J3P~ zO`T~$P=1_UIo544uyw<0UMy8!J^vAeFbBsrPSEalDmp1a&4 z_4_h)?rA5neu=2tV$f$Dvh~_LN>FEBu)$7;P&;4Pp>fODnHUWAmC@dsdO((r)Arn4 zp4*to-e!^dwMd-{yRdw<8UA4NLRZcUAW4*~gPq#nK?{@x?B&G3E)iN2?WKB9wg|A# zw*ii`b`EHhu{>8Sv(&GoUed}^TAuCy!m1+A&= zPsPp~Jsa-swWl*%H7;GbVc{;uXm8XG(55>$K8rEg(b^?#k{E2T+j6kdA_nEVT>!Nv z+D#jN7!l{(xS=&`Z?LaM4!fu){~+?R6$xw8Q@@m_2N97&qhirKAj4MXu9_T^}| z9w{gJrPOduJc4>{P%ekN6~iMbcXk59YVH&l;+-{Nok>!b$zsKB-oiLOkhB}M^AvmA zEr|nm?o!P%m3!AEu?=??cf-9bUder>NlNA2=J~SN#4vC33EsuC_!r50Ow#Vtlsm;x z8!<_y4^5=cSCD&2{7A!{>-L$F&{3Q*$=lo+?>0HGychEPy`C)!wsCMo$<}{Gz&o>5 zX@>N{3bR*9HgBG!S)+2#UJUm{e2XLa!)(yGLSNvnV#|GfyhBYf)F#hw$URpSRDH-d z11kf5ol9QeU1rz19VS~9C8;P$(kxNU7M1Eq%$@lA+--6Q+%3u^&u{080@Y2qtz&&( z=Mod}Meq<8n*TN6!zQf)N|LmX$P8DzLZ#Y^gZf9@+i7xOyiZY*yV-YR zfIm%K!rWcx=h+38(*u+DHzM9~Cu*OSunW{!o#TEm+{^J!HCN&bc|PY7yKFZo-wpWW zNt{AsNATM+c&drA*#5U}l}%nj?6@Sc3zc0x*^XK6j|}&lT<-}R9{w`-i|B@zE4Tor{?VXlbMz+1He z|4zgYM!k^gOE&N`jEG`ehJI?=@{bZz_1@M%c!canK zLw?yOHhUMl`lZsamV7zpU2b2_tr%A+5z2NM{6O`Ld_}~Q{IX9xN`n7Z$WxwV?=pG% zq#!5CpTs=n8S>np`TgdU24iOu0c>0>4?5mr9!7s|eat(Q+ zFUuG1=xm+$B)Q$puE4nqr92zMALlao8S;7X%jApl0?PNu2mLzoDf*K9?K)p}ikmzU z#jPo~o940CDhs|u9{Tq~-jYw`Zaqf0ul!$Ln44Wj$FgkpCunqFjOAnJp+co9Q}?B>xQgPebxYF%SJB`Z9Sd zhwP7`huon2ljvWAb)YmP%|?4Q`Rb?Stv-XYSq%D8j`(TNTm7Fz{|^1Ec zH0Xiye;&Ohf0&j3G~HYMA4mV|52APJHhZ$pwj}@8$y5KWpm!y`McMpG_UHdz_HIJ5 zR+4s`&2@H;ye0Yn2K{ov|34V^S@zS7rd??^?E*@ouMPV5gZ_UMed&b9pACDWC(Az@ z_7TZEO761lGP}*{W0L(Jj`}~G@ZV*>jNY>UY1prgduR5Uc9Wevt@ac2R*w@_qwMNT z)c>H?zr{X}@<)B%k9vH2f{V79Ws-{W@E-cRMY)WgC$#2-IrRCkuZv+%_Dd)k_N&=P zD8Ci=_JpN4b|h&YP0c>RK=g)Wg0h5umc5PQcQd|aUq)Gud!CTSJy8C+a*s0%%M$xM ze3z~=^)57^v?M<~Ny|Qe0@*J`v0D}PDf^iWzMlQIHS7y1yb$;0A`zopb%VDY_=+-N z={!lhm9`HgT!#D_J0eMx*#}hDu>UP*6f^iYU}*w> zvDtIQhZjJSC^IC>?1$VLCW9B)FT_3J6Xn{Rzg+K2t=rmyZvvlfd%4*od{-}}3eVEb zk(_<@Y@R(x7TK5MK7R&C7Q>kE*VlWZ{7&HK&rp=5zP$)Pe+KW_<|3c;UAmCYKa8Lx z14>KMK4EUoubk-}#f&!BAP;NJ@H-|E}fM*a(BvpVgU&%h}w0vV5K<)1+@k0J=k z{BtGwXNm~F5cnjSf21r6zge=&GRn6j|K3`Z`Lv&Z{CKYBuLxwqFBN^a-&>OThf3^I zCHV)C^b`}uL`jks{x%E04yPnJyv@O1ANf3mD2v_Oa=(|*4=C4%zNK&5g!y@mGmjOR zM@o_h5tO720&V;OlE213&&IK>;3@rl zrO35!>xzDfzM%XG{e0}3TellfwwdQi%tHv~iIUwi{K3GVJ>|bhJG$0d_dc5t<@hA-Yq!QlhJ7?B zCBpiJ6AAT$fwY-StP4G_THyMPj^ zqJ(UhP;=Ku33jdW3a(zeg?XPnrZ|p|n;&oJ_fr6YBwaAbr%8O2NW>;FOyqqW>0d#X zWI(xF%A?Ftb$27eeU{K%bOGUF0RhYwTFR68Jh?lgY`X!<7GTFv;t@v)Ywy8Qp+1gJ zocJUD%(C&RAfF|%IUbFYC$2L96MABq}OpwGRNph3~B$){tqi?()+ANnqSu|yj5>k?o zl2nwCK`E`5igE@04azqH)7&R^Q0fy2f1?kM6QX~+bzf!GZ;lbTts7H| zm&^ACDUuW;QIaB(6p^G0gfS6TZ)1&2`ZV%Vw1$3zb|MS!DB447Xg)-FXHh~1BK1mMz!X{07fvdk#qZyzHk%2?aMy{EEX;AKIVl2HzLPS~o#OJOALo}*1(H4p_%i%T zGN2^>UGC~ivWjv&K-of_h+uc36_h*00qQy>sVG~z5) z$fC?M95sjJ_s8=SxS=^S6F5YaY1lvYcUk?}m3-Whc`!9Oz069kRLG+PD9V)RVhqSf z0C{YS>CCB4_WVz0AyBc3^k0(~7z2`PeQ(x1)%Mu7x&zDKL+RNNrI1vVdxLU5MA@}_ zi?Wl){@_q{Zmg&c`*h`*#TaYy@=~7b|Ayrs_gCs2fSWRnkQALK83TQyQU1krt|*fP zO0)+_hjP8S-mDWySu3`p9mE$9rAQkupkBbO8vIm9>1V%0mY@TL3FFMDcv3$0Y7s@~46f)4eX9m>u zHCU#PK3cevB#kRKFF*;ksasqOba|obpe>}WSF8GBY@JZLDcqu*C6tv~E);;=l@Zwv zP}`Pilw>%EQx4?wI7X!v2W91NtqhX-gNI&4lF${jPh;c~n&(+?mKKez=tU@x@*qko zqU2y<=5Q)^3p<7T)fhCfE{k>fc&h=+=7GVykmMBkU}nta(#k%W+xS-Un~$d*Lkzeu zbQR@66;bB*u7$23TovxMg7Uq3SI%FKl5_YvFMf{IIULGe%&z9E)toELxy3ea<|bt8 z!&!`Q3M;1h(9BrbCv!7OjH_~t@>B_b|9%jyparypGRngllrx7C^V&GdEZZ%1kY3tu zq0JLY&f)ZDTbsi<@)KoP&Np#mCRXOLp3AM=CL4o%CX!2%A(jc0(aJHG8)Ml|AN4<2 zkYkbeASnXLfHIp>x2$zPW((z_ktjPXWAvrtDEIxNijv)8UK}po4M+aeEhbFj;e1{? zpqH>g#nN14&CG({_W*|SLMktu#R#EXG&337dI$IjlxorUawR?L^Jk)Tri4IpPLd^* zB7RC;xY<=N50kGa{&mPI!=JW^v*@-bU& z^4Ropt(k~k21!v*5<5qaj|G&v4|YwI@|F?hH8jKW!_7zsC?`Sm>LN=6K67ZymF);h zh!(F57`~Skm-N||_3fGX{Tk(FjR{tVIIhj((v-j8M-CG%#g29rvOhaC(Vs*I|wQ*Uz6#lTpq< zY?%S_8682C3cG{awmq()7Ft2v?7xu|f~KZK&%+6Wf7hQ;1?#NHQe-vL2wj5|~1z zqD19OQ!>A%m%iLi(&uadkez@$wnbM8Nr&>HfRgOh;=Bo;+5KIGI7C@+C0Ke}Ld9i$ zsj#Ch3pIMp&P^g20@6%XyDTQdnCFLOkj&9)pllT7KZPXpUG(&1Q96>0^mwq)Gt@%b zeh;lwn7BZa72mRo5+s)$bZq5OLF{3h(U#HREqb%3x#r-xG>6LcQ&W+~qj44e( z+MRJ_L|QemotjczIYc>bN|Ia`QHnDIN@$MT*>d9&;zyFF^(+Tiy!Bv7lx8BIK9j3) zPq!Nm|E5H9rJb>*-=>*pXWH!E#iN<29wsqq$|+`M7tsI0On!iwv`>P3c>3cv=o&hm z>EMSFB4yXM!j$Fay6Q@jTuej>>Aoy)$0(2KX@}`3QBbjKc$Qx)Rr-YLzF=pvG(l&3 z!u7$CG@?`fq>k9GQZA7GwRq4`8DP&Oh*QZ&*9Y{N$W{3$n<_CMstU+^iMH|5rw za@M0fWRwh=dX$*V-e$1^;r()mpn?*rqpVNm^+AIuD|I@nJD!3LL-T!k*NxF=N79C) zZ8}=i*oHJ^+08(yBo*bq6y+; zQ@-;kA;{xjZiJ%k>>?8B6t=pA|tO>5|cm z)A}>6igLP}zW}AQlz;QRNR0XE6HQqlxpgEL+*;=}M3j5zx2!8jaU7sJN|^Hbastb3 zL>Xp)+GKtp%0j6gcU@ww9y)=wB~58a`j9)4(cero+Vz32#Xdk&0_9VW@`s{KG{5Z8}xfc+`Lhs|<>gmP6wIio2dI6y&?)@=cb=JBFR@^cEgj0=JxYiu_1Qsn zgl=Bn+`Qh~J6=M$bDTlRzeZ1vfTX%|MW3%JqV&^wW(o0iem)1wN1|l4#)_TinOWz# zlD%L{kMf&4r{E4MFx~DBIEb`mG^LVMl;4D;NI5G>{aV5POG8U2NwSXesJa2mu7Xlj z>>Rx1B_so9awW8?qnxQL$x=6eATys^mh#cRyue^<$q{{tod(i2J=-J=}8B|BUkVaf8nIhgK>_68_x`!DPT z+SH(I+<6lbNdjdPfN{|#GdmY{~$*@&YlJY(~l-`y0kw8?C43+39UdW+btPlo7 zE~2v>%1lTf45=5#NLljxWiv1&pcIxs=`yNt^r(7iq4fzcrILgxU5NtfO=>>{c&VTy z!jHUi7QG6|bwtvmT$Lz0r?NdDkW7+*T9mARYtzrKgPe+-JK)PzLV()t9H8&wqw8B^vz z1x#{MR48xer17{*icINIqBV9$U3uVK`Cg$UmP(To;1=a^|G3|mM`xmAR$tV^kmtd& z)|E{QZ5~>v=TOFhfLi2C>5aQ0Ju=HNP`aIaxD5F0VRt63oSloAt2BuV$9#bTid53q zhN3fT%0Q9`^H(6*;X(}8ffqe^(e9H-hM2@7b!AD?yRs+hGfRuIA4Z@k!t;vqfF&ra z*#ng1*myAFz1+T=>Glv=jCy9Zr2>cM0581Q>{?D$|ypH>A*CFzP2qUwaSg#?jo zGPI%uNtADOjVa+uknA8fu1F0i38rYsI)=`92srsMxRUP}B3R~JDQZU9(cas+=>ziz zYrQ6xe87=Vg5{(+qlVo(QaH%QvDB27q^mQD3Qb($nEe>s#2*6+rjr*z`SL=Rd=-*7 zOfOwqjVZew%&%}INCKsh^eAPoLB8V~)GvpsS`b-7YR!RY2g>~VY!xDbTWZ^=E;0Rq zLS=a8*h@z>d6?vD9m1(Y2g%n~T;qx!!k z4os(tGOz^70?l8reJ91~ICPqTErAjwUBQsAG(y=J+JQJz0_BKM-U!OuTmCDEq-&+@ znkl25vg?g45y(r@GyOihQbF$TN@BTUB8rl47fiQXAJs8|7<@@6K;zQ)f3QL;bm98* zXN3}-KYS)8n~L!Xxq_?8J;`xI5-36P{#nY#@-ODo{G=BMuh8a?k3#b3D4JhkN{@2! z4wC4NEhN3fl}hWJ)rY|AL?|dqJOx+kH3}|+Er}&BwLMCf1a-64{?tAeggpqc{7FoB zx?(b7OQd4Vwy)NfKnYLtbUb#|Lf5mj#w2gb2qorb`rSnGl~4-FLN%YSOjB$$;7w36 zNOdJzWA8*MSuvSM&qegWqa=<*^GtS}B0SHGLxZ0))&=QOX4raH>S7xx58AEJL?z1S zishJOaxp%w=98-~yE-G3AQ_`9fHEl=)0#09jp4;W2~z^4knHfV{ms$gTx7c`qY1Be z#@>aJU^1G3k{{K$k|FeX%Oa>Xc*+h&TQ$izQ@TbI!;Q>G}No`@imRFv}3lGQ>taitt6+(;#Jit=zbN~Ed@ zCbpBuy-H`$$r*uCRAfmpCS1uAY}S=P*P>K)20NRmKOo7TgXD#3H+P|8r0A_E*x zbw!t~Rl{oA2X36fv!8?4HzLTD z1tSt;WP{GQt*J-5RYnuw%Jx zQHt^?!P1~?wT&kg%F?4m*&kYZpyo@fOX6~|tSL!K@|Ar_Bn#%qb1NHku5XiqiTaz< z7f7PTd4y69Ke*=Dq5(_b2%f!MsW4^sja_+h*)fqlLAjBOmF^SSBbGo(x&lj&5-eSE zE!oHyjwDdll0@YnX_9;O&CO_3p@b#sVns!X}W{A&Bv(`}naNkB?G#+7}@ zu+%4d5L|f%SEkEtpxkViAspn_+xd8)T{R?NzLD4!H|a*c7NuutQPvd+WlZTw)}!QK z!Ru8Hm%JmnrMsh}&!5NR4s^h>Et1^)nxGVtq-_pmFeO-~C_&OL1kqP%e=(cauP zI7eG--xxbk%)1gKQ+ErQg4C4Gvprw5M z1Pja+$1s8`MVtW&C^r`6#-sEBAr)*%D2e6k>zc&On8Z_UR;D?@2A0M5+6tkcz_*00m( zUB4rZ9m*_Apve0+7soptO$7| zz4E?cN0zM(N>uEbl0DLgQ5GsiIh*l8kzcfsec7fcSE3W>07w2#MO~4wT%{;Y4sa+^ zh!!MRnzVsD*LNs;Kq>GQWz$3wZJ$;x7u|}I6rp66xr}MM>`aj%If)B5QMqYLH+P!y zT1`0*BrVE=dXyk(Q7S%zaw#(BK$9m)O3(5<=bLq9IOtsO%ARv&4&{C`iAO1VQH;F9 ztWf^-|3gV~rsi@K+KzCHlsdjOP`dfmlI#Xown4c_Pzp=&n$5csLXx^tVe!V%yHbBl zT{)2BX01?ebTkxQhd?)MLT9-q(W{r{VvSYXd9sYcET#Y*Z5%Kp^L znCXXSK3Q`$qr}0{>#;48@4BGn^*)YwNR#*_UNGTN8rXyzkyQO$I_#s z<4cURJ-HXp4lztXPI*n$J(u3eYO=1WGcnQXZ=HlJgoYKa+Emr*xAO_>g@?H+gFaOx z$k;x0TS2tBsf}#dB^O&}iD#iFqHc+x|AnEn@fWZYF0&0&HQ1v{&Eznrvgnc0fIbCX zI7k>_IsRMcpsEDLPWvqLOizu4JW#%)Qa;IVD?HXc3r zC=o|nMuNlB@_Q>F>k##JCoduD`c;i4w z+`8{^-OKJUP#n(0g$dK8fcR?!=~$XRkXh29g7PXzcO;Olpm-i|z_bAy0(1%Wpw=+# zfd_lush*Qq@;$`E0Hlj*V}Q||S@5Ayg@J6?+SaC(h4Hz$hw3=SgY`Q8RdIIEK3r>5f+~(z)1{lz2p|7;qJM;N=TLxJLQ=-}wc~^}_fW4xv(lJ&^>^6hK8HB3~6? zGTDeb!MXkHtBW1Lc5jW^Dkxq@{jG3bH~{iPN?5ABpRk#YuK3BcllRz%N)D z3|<-!=5PB3sOfwN58{q#R@045n-8Ek1#sjp>$gBdO@H7irCy1wAAk^{ z*8EloxvWb4oD158!7xffMkc>I&ka?u!6GU&`+|4HUc2N<*=i|Wcx?=yE8Z;P6%1G! z8NAe-@0&CAg-}^u2j#(ufX{~?kQ_%=QMRbRaUo53=n5%QE5OJ%cY=nDGiHJ?Nr;M` ze1@;mKPWOxv6IymfjAl+c_#pnGCJz#!Qwd1ToszOpD!}^4`oqm3o@TR4Y*@kY7onM z2a#=tiU++lJG);M8TY{C?&-S2hPpAO;uF{Z0o!E>2BtUbZ|&u*Qe~L#VxJ}BLhC1$ z_bh-6+;$}yxM*K zxj)?eJ^cZM@9jOXdu5^i@lUX0=U>Sv>x)4jp^(A=by~zw(*<}b{os5RWBni~ipS#q zpsAXD?)C29=@tfcW^-Tgu7f~2Ww9b%B}1Xy^JRK{_1m<^kapFOAc-R?}j48Pj`fb zh5yOXnkFgH3?%{g`?w+d(f+Ao)NX0pzXtycr>5V*Rcw&sb>}%Vv_{|^9c~ExYR+4< zX9Vb+(!&1FzLaiO`@j>ZfoCU+T>s>SBIT;5bdF!6YP z36kjP4r@b$AB!G%PxF>i3>A3*n%> zJo*~InNDdgKOD5G{F?pdRU53lp0~cwWEy}Xsw-ir%!JBvUWQCj1+3U{qA}A97?9z? zO=hNgL7K)sx1;Sn;)xwaGRYo8S+M_laNUCOw?cSZv~?Nja~^{Jf&u9!0Cxs^RK8uQUz~&zy&$$j|k^T5)W)pZ)HbfTAuP)p$ z^F6LZ6-HnfCkjCnVn)2a(GJn>LVl})ky_S)(P@!7P*7woFsFBz^<9`!HCzF(uKL6< zAofYRgX6tcR$!8;a2_8f1}&F7u!;uBs1m;;RpfhDNV0?=r512(fa$&4i8ugW@ObXF>v%;XTn&_0M2oJ-~3h@kmeu%rQjaeUj=fU!Pb1~i1X_{adKtg>1 zsOZzh5eQZYnRC)mqJS?9{XMo09IOuo36MXQS;_8THw;)WhxKjtxn7Qbjja@8w~dzy z5NOBQ@1-oKhM(;~Ya&I^F~>sGSzdGVX5i|Ro*(tC=!M7b&x8!L zi2Z6gOJe@^aZ9W(N?QZ|oiFDKP=tdadp@9$*E)4V{Nt<12jE;7nXf;+e8i(l-X1XE zMiXiifN7F=Ol3AsU*q7!Sm?>8RxK<;Hy0b_i8&vYv65TYJbs=y4FxirDaSH|Z-;#l z$lEP&-*!-OK{$#tLiSsY(q&(D=>!H=514`T`LH^S0o)=%56o{MTOzOEvd1&=jg(8^ zmQWjqpA~ucg&`?Lu^+sCyf+X50|#7ySC|>>_V)YOIGo*heU_3@Zk=_vc%HDcvS?1z zWk75$BtNwDG|gY(B@oC?R%ViKpSQod=i!8oUVmRFQ?8LZ?g)>#uvyyzQBDpS&|EBo zu^k&w?iO7@VDlaGkt!BLI!(b}#it6d+KPPSH<33LSk)nkpc!!&vpfBY@rqe!laCMB zL|yIgz6{c=7+Pq@_+;po!W`Ov+RW!uwc*-YwqtzCpO5ArTIpImXIrxS{O# zI#{K5+%ZxF;gJ&FxDxrZ>PK<@(f+|CgNjq@A=<$TKhtmY(7l}z;StFxD~xCi7`ACI zHTW}so!c7fssN2^YDPZUw9 zk-COu08^*;5hLQ17pZ{TTq5;EMWc+13 z=^X_&G#kXvvK}-l&Dmp;oYerZ>{SyMTs?)~q}(l+7jFFS1kc~OuiTvqC~{EyAIGvZ zV6WKDv1A()p$8my$dg%k9VlIs0~E{f$#^cYL+P=;;LM;}$>WDIQdQpYEt#Q5IQ#n5 zSL7Ka@}C83&4TkZoou0EB|W?@;*++?RaRe@Mi<-45A9J8SfHvav~Z4bsj{`bV4?db zA*q(JTbF-p|0}KlXw;L+H5U+5!EE5DhYN%ERV3-w21a*w>uy&&&|>KThpXp3#Sfnf zAH)h)?}wBCKF*K6Fz}PBkAF2K0v=?TsFotMXQ4b@=>5p$Gri<%v1ar5e`+K-C#=kK z1GM*Q5bK85YKWjLZC7+lqrh)oSw3)csP*fBI!Rvt)G-aHtpqWY*ByZA%XV9+%~iI| z@V>o?0=|%r`)L5R-U{^45MNFQt|B}!FBT;4OzKAQ^FDb3RpQeL}XFw+{lX#a2N_> zVG;#|#=9fOJ;P~%zV8qig2T?YYE=yCFe*g45|mR*6pFO{15c-N8!{UNetSam zLCEs3xZiR*2efjLS^29sfE6w7KxS2|CVXHfjuzcZQXpkCbJG$DL_m^Pry3n&33*Ke9#IVnQUEkKa>n1&FWYx6Xx^y#gQO(kpiu<6|(lmb5l{wx}s}_2*WPMe~-VS`ic99^{Kpy%-!~CW!szCOcWMTnw zuS<-Kt~_OgzC2cTDe<7)G+`yNyWF;9;>e{`?)!&POZK+S^v3F`&2Y&5l|hVnexGlr zck`Qtg;{?>RejFJ%xqa2%i(Q@v%3!Qm9iyO5Ec=Wf>DO5GUkHIp2uM?)@(%u77K^C z5hio!u7{SchwIlN>ch)RSK1#B2#{XC#fJer0c$@>_ma;pEDV1;O^6nF!2rENe*K13 zTsaS|3qKK>U9$0td<*Ezt^G6Dy8>=UJcRU0_G}Z5oEUy7yf zVo`X~J%Be?bGTu6Arj&ab{<8HbK5w`s=|lVjmMkz<0#&Gkqy)q#eR{hDNRfjKz*eM z(;OMUoMD}>$vNB$rFwo1cfE_eZXt?(lF@q=e0(8+Q4vQY)dNsdixP5aSeT_yUBsn2jc5`pB<=}34k1hjFN8K&Z>3|yYLv}?1 zNQ3HG&FU4A69yoZNF*(N*h>BONBhpk+I`+@0a>XK@$v*V@WM%B_oo*Oefo-B@zpTX z_P4^>3Vnu4bL@2ZFa%R8dS>Vw8fU3DvD z72CBX3%9nA;9uHaOpTAYGk$AFr=9#aDFF+F13Rp@=Z}LVJ}aK2*y(e%l->OqMik6l zE2X`1|3&D(#KkBs)W<(HKZfc%QI1>l?Kcq2V((<`T~=8`34XcF54I9foaf15R7|6k z!Zt}fr0x`MSj3LjxPN~MpTagPAr+?rqPh_+%hN$~$b=F177epG!2KF$1pDvO2k(zS z;#tlgRDTy<6q0_h}DM`bBoNgz+O4`4FQ`Slj$V-YP*#7+)n$ujhR`bzqaEyD= z0-}A1%t3uSW>JH~F}=X_)sHt-d?TJ(gS)~DE$kS}tuTV5NItNqwL{g7zvE>IPnyVx zM=hS!kI;7f$fnNJ$4MW9TmKfW-&*}k0@w)Yjb8``EL`MlqHNWgMbe^To$Y(z9XFKJV)PbXE+aUGF&$2VeV-PhTG=dkeWfqx{6z)0-(`JGa>0@qc?6fsLnx zCwhwzPf_>cWGsKh%3m=EmC&B)jdDAhzbV16^@?&c&4?Bb}E>JLIy_FJ3oY*C+m-joDtpp0FE}zGG0PFCBks?s^%-%OQ9vuI@bx;YrvCcDuC_b zQO8L5m&)>B#_=i8nNY0Y1y;ze={5Oa*Q?pLM8T%DK~A?*WTYh5|E!`EdTGIdn`>!Mn>h<%Af28(afOT`PoHGuZku`^gXfam7ldfj^saUX!sDQi-95aKL@lzI(a7J>rTgII0#E*xkL?uDvZ z%)q?Q1%sAH@N6_AAe~X~)?n;+=6Vuoj$8bfOV#!hT$?7;&|XYkrT_=orw5ym@bxDJ zP-?9zenip18Q5zsj3BrB@~N4YC?zS(v#{)n+gnZoM56hH-BkSrO=2u&GC9v0ZXN%b^7R7$R@ zup-=`g^a^URk970mbL+tU>G)Tz}tVSk3Xu4lMjFn@`5Qd?_eHhHR=Izo(0wRC9jc{ zuWNoI^UEut3-y{M8BPECenJ?kLdb`auscJ%*qyh()eQ%OoH6DCj)adkqm~BMcc}HU zh`D5Mf5&#mw9TT0z3{X4Dic4(% zq2A@oDyysUWEOH)>iBeV;IVBOQ0z<`wQ)5z(VRB$T{$hkuwVoy#Qg9f(*!zxoT3{g zfB{c+u|eW?L_itiE#0JXGw7w0SQ7w?>rI5sLtd*~Rk4l484L=$?35N#r7@T3=8?<&P2R8fJ z-sZh>iW#uU;3J&Bs=6`L`WMhN9j2|W*BJ#$v{MzAUAAfD!jGz z8*RwQq|EvvFRJk*JgA)FjjB<$gjjc{oN|6seNZhk6Hjq+tg=>|@s1;xw53D5^GeOk zSysLsEYYDdP5$B>>O~XWaup`NZQCTxL`0B-xe){BpWZ*62nX9+6rZb^Wi;{;ng(># zcAe!ry`p#R`B9^J#+pyi^@46FKGc@w2TF9K_xnM74_;wEUSR{#R9jkGwIThl@L*kA z?2#GmO^5nj;=_{PpC(+Mumkg~pDH|6HBCxAM%GpC<`kfO8s>!cdgtr5`&Ah6ifjl_(-vIA__pi#fuFf2D&b=eX;O zsEN6e7xKYo{1!3)w&3wx=1{TzDkpw3mJzxd(xnIsYX-{TStM%IH0wAj6c(xGTK%1en+^on6^2w5DWq7+uyrolizoA1gE{tzn)*7 zWj|WUC$T_1am2ll(I`ED$I0L-gF*T%V9(cvBagStmG6@M%4N!~nL{aaxx0{Z z)K}y^^5V14{0j_OXrqnZOXEF&m_0mNOIacyb^NVhNg(3;Z5FI@7jEIBB&UbUGsEic zWi~j;D|p9w1Rn_qRu#(#xbfZnh~E?%I1JEH&eCUI>(5?A6*znuVvrMcH-&izD3e?& zBrH~LS(~u{-XCq}$18<~>OVB6atlQo#lBm0P<}HbXXv{f7I2rb|EugyTHUj@jt zJ>epN>lt=7B^_S zKAn87L`BEGcXr3MEuPm8KfhHi`x4^#i{GibBpJL(ayyzYlw~KEKzeYHxp_4FOc!Sl z$cyD0wl8ZN0yVaHuRl)J&z=UWSuv`ISIcCqeG3L^?i=w%&~kzCiUIaIbD53P`gLYQ@w5l)2cSKPkYt0S`0Chf>@tzXamg_8MQ^42@#{C6K12H24Z zkK7FKs7f?8wr!KxF=YfhX4oLRm`R$0|GGPi-R~@@TuLGj!c{yCSz@n$uD|km-BGYs zV7%O<%}YkGr)=Z={DEXw#KuJN{hS@%hwv*YW56TP?g$Y0CoQIGTmr~mEF$gCKNfJ! z1?8A^;LMMs0pY&GLtX@%dI4vG|I7QkY@3;cK>{R5<%M5L)R!_@J|ZDw>g_AT{j!C1 z9e~LE2p4dp?gzx3G)#?;#QMbJTD$_``*t7k2+DE&j=NS0dSiIP-`nQRw_Yv9Utz*j znF}3g;|KWVjF-ow;U6IlM;o=P1{zVb7h8D?s<>VA?qV;w@`3Xe4n#aToLF|@Z9eT634qy%tW2*SU=Ph$lu(vNhjE`Q3ARoF5yiwB^Jq75y~7;=jY4MiOS->~@|e<%Q* zWnu~R4Z*&7&Oj(OW)aomNE?Y6XZE+d3CuXC+Fa}>)G(MIct$(p_o$w>>PEARHj?aq zH$PMdC&|Rdw8^Mf`76^YB`cVKOu(|BvxEA{?Sh|_xem0wmY@0^D6On@X<*OX$DG=7 zSTBhuuka^D>g?}c{qrYX#_iG&RfF+cMO9Rrjq5t{s0r}gL5LsIIoaEXh~rzv3jC!W zj~|5zOPMy2eMbn(9|+KhHu(_v49@`iNblN%0bL)sGe5YwH;@c)_5EU z^s>J45T<5pTzZ;<+^eBF?onWi^a@Ir%a#iTqYR88Y8+%O-P=~~ zvpF^}fiN&cd;>vv6I@n5iM?#LnTx&T?pRXm2snMZYP{-yFWhU+tbn_hm`ejMg@G`e z+n9<(eP8g3&+qH|E8U&BrG+TWs(CE+H#dPTOnEYZ^A>7(&#%9wT%Jv83gil z?;=9sNkeizx3&Y0`DRpU4Q}m-4FT0ec4-|7I}kGSfZrNx$z~5eufH8{GyvH#)SFrE zCHbT#iP$lc4ej+WKh5f;6k5$akNScxavsuA)mcT3?=ytaeI<7eo@l(A*c&4QJgM;ZT0>> z>8sDT8hh0%y#-S@mYboiwyvhh|IB<>*YY! z$lfB&0#vNR5B!m6t(D!3v%Z0qwf1YWdP&T92-KOU42h#HPQ-w^KkV;}HkvX7Y;hHsFU5#!|v00^`(GLyNSZ8<_j+#y|_ z?867qKES#3<_@FbdIZmO?(1MG4+&|>uo8($A=vYdPiVzX2)<2KxYsJ3HNF?nI*sR? z#{0kXfoHNwz~})7neG|yfkK7U1}>8GCJiEjX6=__%kmdJ;-&T`p$_ild8Z5fMJcP> z_aNd5*lnc3Ap5g0n>Vbm zpmEiw1gaZM3l30M>|!0fKn%lLzWUBy{9>h|N8SIBj}=M#JOXTjlgax=`qwG-N+zq3 z{9*CJokYkg^8ra5?N9Q?9&P#v67D60wVkHft3-Sz6APLKo^nHqp%1|0sV$of0Mm2Q6)fX$ zG2`s`W1mt`7U#}JZD2!*WFh6l8VL^AOg$uBZpDTM41IF&6xA6LOc>gEPhcct$GR^G zU!}c=G8J{ruk>yQjaj6g7+7+cFBj%J85 zRB_4*xWOS8O(~K=Tq}NzB3QbA6`*@|-|@h=Z&MIL-b1!?{NaN!zdp;Nc}|R*AUkJ1 zD>4-tGKD|xC`%AR2+T@u%9%k0lZ#|7i(sF__&hr|0|KECd3V#~CUGDSxdgm>0uoJP z1kNYIgI)&G>0VJG#0T-)!+4{v>0+FxD&cSsG~{Eequ=Yu^Nr2nQ^onmuPO`H7tAp# zVhj&U<|>3=c>0xHP3Bu|9tg?%kH4!hp~-AR!qV`CH$L$=I1xjk`?v9V~zX9i3{RF+gFS8=b9nhvC{!7o# zJLgb&+Vs;i#N+5_9ck5tRW4~3_{*_-bq&MuW~|qtix^(*SdYwJZ?6cqY*$76iMLcs zU_V*-g~TxUya;P!l`h9s3ni53=KaXAE}^$wWhjr^)otMI)`4T~xL*G{`fU98F1-RK zC9Db}Z5*{J+Pl5*B4MbmMk()!p+-HvI+}YDM1${HD}Ld0QR7Ve%fYC6#E7D$u~j|x zEx(-biz^|?|4ps6dvvOHi^UAIt=vWDGnnW*-!9^T&9Dv-tGDL7jb%~t0q+~QeK?)B zz)?a~uZQL6Yr#3W+1lRh~T+3Q(F`R@fBbNmK{PoS&& zO5a`n?N&i)>brY=x7qIvs+iOIKwiAy*JBEG9iwSb`+Tu>9Q7;efOOZ1UAys{M?ZH| zrwE}o$LXxi!a-Mb>Cb1=teVasdxOEZn{_V?lHPS^yI;oW`W`FWLUmd20hHr~Hh!^s z#;UA~*3cI>x)=sSf;agh06Q^hbpqL6&e3r2k;MV%-)6e_eAszhLe{0nE>Ow=@E|@X@fjBxd`93ik<@ zLFHAan_n>xa>lG7x5|T4c5bSTo4>mGEPN$mkX=w!Amd(z^aj@MYVfW=uF*c^4D}(a&?ITmUkwJsJO39xN%k)w|Y9sxwGi3(!W>#J3i$0{ram^ zJbnZLPj=u3zB4ChscPN`2#!()nXI!nMVr%0;8(7@@r03TG120rcj zf$q`0@9{axSX0v>CJ}B8_m(kVKMCh%XDmGv>oEKrW$0Anu6dDZi`n)B@4``lj6$l! zy9`$*ZyVRmGCQODv=RKdLBHcoxPJhUNs?+A`?f?S#Ay(q~2D z8E7ESIC{9GlDJo{1qvU1O*lW7e_I^krKD&-Wc;@lwlgLz8+EgJzSSp258P2}%^y!P zCE}dEpsOuE5Q>}$bUHc2{*nrxjFA@rO&lJH#=Z$-!uRDEXuL8n5MoMxHc3%UCr+ zlA|kO$U^dWY?=-@X=zUac_U2^ivi^Xb=1@!3tSCU97zk2Wm9b*?l9zC>h|id-YO%cqQfZ~n%qKRO z-5OCDfc{rgzSBWc<2T=O?c5M8y&H2)ip4qO(&5L&nCr1QV&79AlO~xq;a9BcO#{fR zx4Gl{#T$Mcy!(9mt|pr92c=j|G*$Ln^DjQ34?^u$*}(WEOG!oSRzv-TsEhzxYeG=y zq6usFW7Xx!z*nB{o1X4H)#~-5c8A#%^PgTHqvT?vI(TY%d~P3~JAeL(3Te7eUlipT ztWRDDvz}ABUM$9LUk!tg+V+lkERj`jp1F zXsEzUUWdo@-D{M-m--`}G;U!Yl^a#>XUtX2+jf7deE)6(IeX%xT3oSrbaK&ZG~q=j zzX`dW#n)GQyYf)doZM_{ulBPcFjnl(#gW8E&QiGtNx6O(?)Kj7V=<B4xS zT?E(s+$7GtRA2|*SJwJ_+S%G_F64Su;TzFJ`CBuSj+%ZaO}QUmoHx0ov`Li)Ge)n5 zSmVPI1KlWH2t{A%K9E(fCo+=eVh8=61gBBbFv!mQw{XX33*tjAPiuBL3R^>Zm2}sC z^7x5O@W;{enftL#JJNT%N1y(*P_UMI>ZhT=T2RJ0^tyMuxjg}H6M5_M7OUgT%zR~a zZSJ^L6Z}8PymuH}hPc8g{a&Key_AdpKR8_KB#t4<5=vdXi+}G=;G?f zDx2I%DuSZ0_?-nOgl|**m z2RtiCsN)Uo#f0aA!e5zZn%Ufv6Yf``VVj9H_Ma>6D$!iLDm#$=v8~?|%9rmOhd}2j zXHE64I}q}(fR??L=l2L z<)MSSRt?D(%@QVRt(8w&y;>bDD|c1JS9o884h9##moU3}&KgHM2x^N`&L(-Rre8X$Zxw^r3>#&a51&b`V z^kV_T^J_aCQQwl{AQv_SMQxgJChzXa>mV39602lCpn>!Aw5`ZHIDrRrn)>vkJAOn< zo_^+8F}2$rCM6(%2j2SOsImw^!%RulRYLxx1h*t-Qk~S-KSxDswc}lY6Xo{uT)v@Y z%m+Hj#+XoE@2g9&+iaZ zaz}Jyt>FF}l2OWvS9CK3oaR=WFX1yJ!u=3}EDMCUsEyD1t!9dClgrULTqS5KG z6(2gg)TXj62xc>Sd|eL86=1xWArIb--vx(}K5a&VIhSkil)&ibe{xX<6K

      !CC_BNH4qq1jF{3BZk_zMYz8K4;^)))JX8YDM;{ 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/harvest.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/harvest.png new file mode 100644 index 0000000000000000000000000000000000000000..81b3415b36ae0321452e1eb65bc6d3dda03ae0b0 GIT binary patch literal 73476 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 D=RJ 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%0D?NbCChn$?q9vEy}mMwIY4j>{`e=n&)d6xY`>= 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

      ZR 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%0AxO~Ayw0!)69o9>xlqI){dI52SopdT8T^s(M; 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

      Mu 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

        -yuzt|?KsEc@Yy4eh+Xw%D4` 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

        w1liCZlf`qA#|?M&@QFz#Z0xw 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/stallingomega.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/stallingomega.png new file mode 100644 index 0000000000000000000000000000000000000000..76ead6fab330007f6943b175e972b0df022b7fba GIT binary patch literal 96404 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
        {+|gKP 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Å?x;Ad1qJXx>x=@@mz?hlAR&( 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/stomach.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/stomach.png new file mode 100644 index 0000000000000000000000000000000000000000..5a30fc8a65e01b40ecb8e68d891cf50150fe731d GIT binary patch literal 76910 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/symmetryomega.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/symmetryomega.png new file mode 100644 index 0000000000000000000000000000000000000000..700df856f023942fd7f7be649badd7a7397fe02b GIT binary patch literal 22586 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/veilofevil.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/veilofevil.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1b51b5943b95fad4f355b4ba2417816d67b25f GIT binary patch literal 79972 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
        X+x`v1K7iU9;wdNv0kgO@X-s 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%0A5%#KmTh*4MAcK`M9MoId!y^E7r?Kmeacx_Q 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/zephyr.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/zephyr.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3b097d7e11ebdeb80b744bc56a4b88fd175b03 GIT binary patch literal 60404 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
        s=@tEjp*pWk z4~i&dvj~m-JLr2ueScL+0OdCoXbgKfBM+%E*rlQoJSI7TB%7wS;jGz4EzO7>Xbcgk zsDy_CbRN3jA45sBLh}Hv&q4o zPN!5^Y|Jlg|GvX-EH8zeOrCnBPGXo?V-A2&IWl0!MDfLAA9^^PhgRY>>NE_fzFY#G zRt!CDlwVKRAktM7fXbaaMjf?Gf@|(o*Z)hVDmzhkfKn*1)ChqZg?1&XB{aH?a?*F( z_T37!4kE?Y8$s0Qpl3|Tqua?}e{HFpciSyC;&w|`Ng5~xwIKKYe)&Z?ec+2bD6XWr zskPp1?c5$u49j2FAWNgNpI9709w%lAtt0gO#IiRg7S}6}&^}{rZq7)lRVmdLRIkl@ z0;$+tM76#=wI`@?xGIzUkmrpkYIg|e*AJJPp~Fo-0n1%!?c2kBf5rN%o99Ye z)L-%&_3=dXtSXsGnQ9KLL>&}MAtBa_&b!#YK&7fW5sN2pV)qf72W(f(4jv0CC!lLS zpFg5OYr)nM?Oqz0)ZZ?b^DolKGG3oi$s|dl-#mO1UVqp0`fw;qB@ zyYEGynED%)(w^qUO&pWWm~IhV^|jRY(#@cH=QZb8NZP1R)q7e-Y;@esIlY(#ja-Au z@fHpAfl6jOXgGU-u6ydKG|NkIbkBno8^LtkmmJCy!HvpO zJ|wt13TRmvga zXstSyPHGtix&{;6S~?2j!5BpV0~^79dh{Ho=jLbQ!Ug&DU@lxQr&e(5=`-;_+Jv*~ z>47+&b14fM$3w8zd_(oaYhEAB;r?@Q8o~BF7)o{?%*YNfsGNbyk+OKLtSNB|eZq7I zoAObPn~a!1&ly6O*WgY(7w0^uDb~pkqe>Eji8j9u?t3O7{R#Sl!rqh8bihhVtf!c) zaaBW}akaiE)j-|nA^{>Gxrl;-MHDJkn+O(k*#Qf>3rJJ}M{z zTC6bUav@g>TK6l#MCTsu^dq8kho(q$&<8<7nLN5tbjyJdz1{W)qG%X~fwT^NSg&qD zZr62P_g190eqlxO9yK1#Z=1_&fBLX;3scb~S3WTgV?=2R>H+$SOcPz# z{|sGr(2$y6MOP3-G-NQ0`|qNw3cgqC*&0;dg36nCeq^vi(v{G)bG|=ajxi7=S15sTHtiPSWpFdo@X14I?hV~ z1g*~fQ1F3DxGbyLdbI|XtDBo26A6{zk&VRyawuYpJVz@&&un^BSv-KsvOAQ4mYKwN zlJ!<)aB)#paVUxgyePm7&|y{bFmQElyQ|XBd03Tzwj_v4ene0s1PzA)Z8Wc91I;$x zej8Z8R9f8Jd4N;=>~p-aZ_^q>Xn@zX7fp=RzC8*GL=9BHWLK zWB1$`z=bkSK^Ns&?FaV3uA*TDM!N1AUcqCyy!j+?CtzSiE!ODx|@(>6rt+ z)E={}I30_?ZG`UxeNl1budItYH@jV2mp(^Xhojmpx&ac6dzBfrkxMV;-U?_@4@j18^Do!z61B`tXt$k?xXZdYP4LQz>~zB^S)aB3skN^ z%8fyj|He4+kjdi1uzAL421}bMO z{D8`d(D?Mk^Q1OrIA6cQqoWe15UCM>$;U0dXPXZnK3rYVy9|?ps_r!t4U;|i(GXu% z0!MoleyE*$QvJ%>#Fc+_DPy6`pxIDzIId4gL_1yvOGH+Qn?0|GtekMpmOpD8WNjFAyW^Rpm52C z$7?pFa*7c^PG50sfcxm`N0?@%T4WariczE~u&{%1@_|gH7J}+MxgTRcWz0g zl02umArmbkQQM+}ETpSU3wG!s$vK6O*b?P#pBK4#F*{@@c5vBNWs|*F#>6bo3mEKn z7*Qfi^iltuE@cM=XMicZu|}sP03@VE67bUSxBw!%S+r!jn1pzzZ)0kSahwHX5LN%g zpeX3?4TJ2w0jV0JfyyT|5IJ?1it!w>;QPtXpMqM$!&xa82*W}@Nz z^l8pT6{AI2QuNiJ5re#IkZx#EXRuI%Obs?C2D1k=*_LikGOgiC_AV8r;UuqZ%C`=2 zOcI9%3A-qY(of>sH&8jd`EjFELPy8*CHCnEOm?Z{3sN~AFXt?(J1UFA;pz(HBnVwR z095RP>w-<=Ch_uu^!5{@)!rCTaj;j14GfxguonaC4N4lI86>!$uI!-UUw_xdp+AW- zd2?Y|+oXZqwM6b%WYcneMYPn=tkvp%f~Ts;RTV-Uz2r=xvyvG)%YIf2MDk(agH~$A zVn7QGie(7{Z=q#p?P7N0t_dHt@iLz~5QS~WrQ_Pg$_F;?Q~-Hd=(=bcsErJYwM~gD zyWO{MKS1RQg*!*(^=LltPN-wh|A5 zdkI}ElghrKlJYxG87D>y>`7}s$W6$OsSXTiA%_x?M|L59p6-{n2}^5ap-gva{as5x z->9hDjHgms>Qtg!De6+>yC~F&%D3ouno{ta##`{K@NKYY3gazW3O+6J{K%p}r!L4L zrp#`(Xr9aNZN4rmnd@CDqVet@a%(D^H4=sJX_Y?U6}2sN!8^U#H|$FsDj}_mmDqw~ zPvs4dCV|R3_zP6>aCwafd?29Km^bzuBjd0|A4$@14?#^R~uwFHJv(?sbhr8VM+1Mq-|UP zij}KIEmXrm1 zw66ji{u<`|giwo@p-0XJvOd1Pn4p2;p0r$?p zg+`iy4HV*jyV&hMUS0iWX@YSXLkmv6k-x1412#lczrt?0tXtuOtnh2$)P!(qTttik zF4F*~x;=2Zy|WsAG{Oa?Zwu(PF=DcDCRPL13r&nW36*6xIM~*iXgI;P^xybb(j+J@ z&?v3(c37{6H679v=$jE50s3O53z~LQ4okDe9 z&QzCp3u+^$CdNc`3nh}6c%aZbliZu6Fkz_0rwk@gUc6v55tH@+D*x+ZV~CX+99bYB zm&|P4b(C`GIEDD46|8y~H2e8;QMm}Tk(f1GgUmIlB$I#t{rAtG>z@;zA`w9yl}n*= zK36Jv=y6oG7U$~!Xq>CuzvJ-I!ue-oWM5)3sFTZm`H*^>v|^GtlL{s^c-hkgt7U0Y zstIuYXsYqI1^sTxE^|yKd(m)84Yf=?VmNj2H1+3eqerq3-{Jv?0nVS8_B=7^kx5k^ zfUI|B%2*FAOPUM@&Ss+~)$uXQ+R)7l!q5NtIvd`$v11LBAt{EY#LBS+M{?vu8%y>! zNE0l!i`*EEcdN#b?xm-$CLOPa{>-q)S;vY2xIk^95q;#e4>el#`nq{tk$X z1yD*K36%H^CnCBjHn6!gycVB#C|;u2!Qa&2N`YS~IMWw|M< zO&ppPG?~i$Sara~7YpUJ3CT7|M90)^HZ={iDUFsEYPHU2P%V^3b7#d%k}UlrZQn^O@%45&-T2;Ca?~p4aV0!^<#0q^si6HzAT~1aP9W4xP?6 zYf>aX15d2?m1a}w#7<`b3Tie@z-8ZTe&5t9n7YMN;qT0+>!-j|GY@#g>{sYoGug7U zgFY}r%=b0(Aise`z6No58&rV_>X-pID%mjkmFU#a*|$1uQY*RGNOGnxIIkO@4jR*z>kPe_8^F!W=xTWOR@J{-XN0s|!Lb<W*~5|hhRfYq5}E~BD^Jr5`E=bVphu(LZN)Yx z_jD*Y0)4r8Gg38H>&37}*ODp9qjQYAAPzlw7x`Jxny(i|xNhII`bazXef0;qtrEcHSxJsgGz zO2U-wxXU-Zewj`(9s>uS$x0ySg+HAr4OYw0+$I5oD$}cO}&EmzZ-ZSqNfiMby=!X13P3B zKGPP)Yn<`=7RQ9n(BhlYS={F&RuXDXiyMz6Zd}oM4DXdGRat2aMm2RUllCACIEpOT zID|=tI4wtHs~DA=RHdkCt4ftvx%HLsv{Xtkt3*AX#>mDSC`+^L`&7a!&FAxz>+2c$ z*|TSGRFbX@QFt9n3Lem`b`W%i>Jx3E%Zu>6K1CJx@bl--%2Hw~{%BD?!*4{%PUR%e zQGjq6s#k+aScg2fA~70*R29N!Vj{_?l*jO9DQg)X(Kj$M(Gn$svD%AGO~A?+m|$Nn z_DJCir65q7uh&5!<^w!2AAFu}SkR5No7uOZyp-9+-RlyLoj^jK!uenqc=6NWC}Kdb z{H^S&;Hx9_L6tFbiS%|$r95H4ucUJIxvDZ64F+CSa$|*B1N?AM;_)n%5KM}cmqS6x zRDLmsSB_7BkRbJhzuVVvr~L3cL3v0~lsu<`yS|ip`|Yh_1Vwz@v=r^{efj)ZGA2`E zi;^Ip3CdHVJUQWB{{~k|L*C#?C>>0Vu#C4atrR)OWm%-J3InzT75@+pSL{M`FF+*a z!C(Lny+S6>rI?2wz!ZF{HMCHK*EC>R!hqqx+rxlcYrrss0kcY3vC&ahVPIm|nfDI` zZcql++(*l!_bf>H9$_oW;^!*M;IRpoc(9>aFd4+M0*$X1dR%}cfUF=|3AIYmqN^rg zR94A;73ua{0KShP`4;Lr)C94d*yHCX{s%jd;gD*bG z_#QXB6GSFAu-iADr^YCuCI2JS&KUeGO$fWw@T^)_)`YU_1DN~0OeslAaIK7i^LmwU zDsA1tSXw?r={jLnjhe8KQAUx=P#-@=iLwwueZ2)cZX;|{gK#dVE_zL76%U%mX>GTv zRZuINl&Tf0R)T^Hua;W#>-qIh+`GZ92ITUM+DZbaTiBrdD5t|b(r6EeXfJhxcOJ?f>HGS+%U)04KAv>B(JT#$I z(E}C(7$*mNuV72fPPJ@wa2&AN<=>G&*=+6`?RK-Q*vmZf;HhumwA2bbZ^Kz(LCruK z^NMOIVyT_fvDHfV1)F4_T2$lA$mhT2j{vpn*^FL!`VR;Vd)7nwoC_P=*x=wBqEk{g zrX@@{&3tunFVXep(+B0&v7|V{jvp+v?Oai#Pngx{Rv9Mk1)mnvP4dqdW8JUvQ_1-@g^MnuN*HXUrKbQQA$TL%V7uIh+32EgN0(@#QN@H=)v$$tV$+5Rnn_ zhA%Bm4~&T(G7s2lldv*GJ+Y6PEQ3XoJSKW@K*=f=L3VW(snbjiS;LStKkc8Eb}DG+ zEu=!4r|bWLjz@|~0$*Xha<0*hn(fybrcm&+aAB#0MLgmD(d7^hY+ zm+OKx2f(VnoEGy^=R#%% zO(Q$*Is1exDj+zy<%_Rj6dLnEjOp{>{xrko_kN68ajy9 zCH$DteYL`~ESJ8I=ipXPXiO5A6rnamTrMzY_YRPQHJj7lJ33r#wo}(czH-C zaI~as8d!6M^3Wh2j_9dj6cz=|g4RsUV$>|Ln1$A)IY}W-V#dZQGzla%wpPrUcRPC9 z(qoOXYQT(bL=+V{z6G+YN4E*qGC0a}87mba36w^UZJ?J@GYLsCDv%iJx>3DQ^+3z& z6$SP563byxVp~^s0J}%(lH@G`?m1C@xmCY(!20q%Nj?Hg zoRvU;5?gum^K*LUnCys1#=(I3+V&g3NN7Enl$T)XFe1UrC)1{Zw^hkx!XhU@(u`w+ zWQNpdLO31*7yFhFGy}uhh=$41&8necwgvK?m+tF^1~p|s5GK@W5mrn>&@u!;JrgfD;&7GtBE{r8lI#xlP3whIvY?gNvH>W5mNacu|iXMOvNAw zQ4__SX=nuiMd%&iMNtoms@LpCqvZPf@OlP*;*}?icP9|Iird(LC`vh0lq$AENuyre zf#t<5SgK$CSBF#qNRU*PCm=cHNi|S{CDw1d&9Te=?pS|$tXm&zdruAx7$wdKAoj#_ zB7e6-hq(&HGA5;EqAW%e85;x3OeV%WWKtZ#^HR0Uo|YL33e%zpfC9c-5QSDpJFQMj zc$t^W5s4f8vqsr=H439PYZRA|DF_ZyTx$^6u)DCQ+l&ne1pyK{6n!796J%hE8@>R3 z$CBQdu>xRgNj)giE6EZa0WCIz5G9?I$Nb&Sh930;rOGoI&Me&fd^w zH%SVLyIn*tSuR-{X>qjK&^Dt+i=%?3p;2?S4Qoz1)Uf!jI$Ez?p_wN@DJ2TTOC{OH zsVCXEwx!LJC-M!Djy<>#GAYxzq~i)b(Y}|))3W?VG1v6(`GY}EQS*PUigFMQMSy&E zjc%R3*rC)4NKx{j|K($p%%+MGetCaKmUr;Wv8`hjU(2w=2+$w!4+P^}L7t!g@(Z4D z0hH2dj>jY@EZf*A@ zb@8Y;@@O0;yIL#{9`*Otkt>h(S{@-{dvTXjyAp*f8{Q<=WGszp;dzC+Q(dl@jGG$4 zf(uE;7qV zMR`V5Mp)@IQ+gJn8&Y4vV42YHM@Q0D#4L^)7DqH}lyPVV^Q>r|1a=L?u(YcXVRfWL zd{=C$6Q?QuBN2}kiV3-Cxiy}fQW&;<98+X=Ou-a>a8NRZuT}?TOb8`4eSJsdcw8`t z2a>~^W|XBKHA84lCZ%Ym2fgHPc*X{tO#aXWN+d=>Nn=bGKMufzq**7<B1=UV$QWOl zPsv!^l|SDLh{O%kGysQ}T-NwCWXP=Rs#zh&rDcl1NxaKtSzrQ`ih*d^UUd|-OlmTT zWee^paVIQ~h|Qbb zl<7tiOZy)ogAcNd0U#OD%L5;pn}OBbY&y-rM0k!gRZT@HQ_!(ny>ZJoL}}NUog?y* zZf*$5AD=zD|3a38d3$mDZ5`{J@#b5IDj)9e?*%0)*g5{2%d>y{_=7#hQe+gjpYq%- z15(6q-JntS0g*3Xpwgu-;OXn+4iFAEcp3EM0in_N#p{BAImg4~I1J`=5nT$Tq&a{yH zjnXNBJXA|Yh`r|T!2rPk!;LsAI3eV8V+GA@FPWd34bUO;8)!Zp9eHe^Mf2$#RS#Kq zC}+y+dz55(*x%d$${%0dza>l1q+g!*>sZvNA6!iRUg)U~<#=(!|Ko3D1eP>nW8393ChOWC~R${)_nk<yAR5m!|dG1&$q#D!2)_ci_% zuQg(`QE=ghKTTYLT`sES068>P)dH%}q$;YSoa2hBN|5-CqSPK_JQE=|VM%xvB`XpL zAUc$D=B6J%e!NhYBDctwmt=WE0jkIJrhSYZ%Gr$XAT}gKIVZ~5%(84T3O|mA-Fn08 zcNBN{MV9U;K>e7gqcytc;jpUAa!G!)Qr(Ds?f*WFA(d8g_6=J5(({7tmh}_SY#O48 z1&u7?l(cd!o(<6a&WQ|P3JJ|DP?k$pDIpveDK^XakBDOEdGt*9^%8}cHkt{OH^VvH zK1vd(CUDzfUv)6(spdz1r@C5+YFXl-YYv(OHB&isE2;hc8}(WnTJ7~80}B=81jUJ%9DmqnlAulRN2P%bEJNI-M`ktoTs#dzr&5WVtK(aJiK{R=x>0+sbK z4a(dJG=^m;`x1|(Xjw{yd30n9&BTQP*w&gU8*ZG1_pOE5Q#v>`dPiU3g#5gr>aY=44jUsI2)8W8+F4r&>_gsfwgp=!Y-~c(ZfzW^jmalb8<*C`4P25Tm(>w>QRzY{2>aA#w;^{9iLr&lZ-s;# zn>ePU8yOBHL4@9R(lm_5hP$#{;?vX^8AIKbtTC6hp=VMTkp&osbvver&m}XyGd|`8-YXvH=7PnnYomz~LUqR1d zl!x~%%5$Jp&y?@En4RE{ONa(bC+%vd(wMuraM zf+WEbD92yZq;Ga1*oAn#d%WHzjIRL9V+J*- zDuXoW*$Tu~JzM!^Xsn&LuyYe^M_{ypt5$68lT~nqtjhcao(29a(V!qm17Jb!+$O4! zYQz1}Q}jY1YAFL62+N2Aqaupx7{LL4R^pTJWzj{5t|OCC7b6}HfR8*V_jGe8*H#xt zZHXx3tvN(Un=h`f=M=&NFv*A=N?qINP|Ao8D0{cudaVw^sH{SU3;eqMl|qzc`31ib zqHx6L#VcX{b1)>u>9j>TCCZbT#RsBpO_!o96=r*%Aua`W+nuOzQ6s_@F|rambJ!uM zVJ$P{ZUB>J2Df@(<(KEj$1v8gwN_{?U8to?TH07j6)+__3EZPr4J)=1UJfZho41FF zvl6O0VamBk^sj$q9F^*bX~{V_3a8a}t1~8)$<1bypbza&r$Pjh+!tLcGwOR#X6%J7 zl?{}KQesQx3yCwh<${A)JsgqpRE6{?ElN-n0ZVJj-q8~}!TyRWosrU_`~o3L4X^Of zK1vFw1Q4K{b|}H}FYTJH?2^5ELy`{WWw)y97Ij~;2qMZVO)HvfIOI(QiDNQJa<~ku zQr4im9kIe(QA9eOt!b{-)}YknRH-5C6xG(F#LY>SGlyuLFJ&ArweuzY-w4HN%G)6_ zSrf)!z>yrjmO=s~JkBy0E)O#Bcgn}dqU<4rbCK+k@{v_$sjbSp-6Sd&igG?zfJ8}{ zJV%^%DDl@5D_Th^OMCmY_6BMSlyxtNwE}`)T9j~1C--mP0_8qFw{7K=0+iD^opUay zZKMa5T;CFwmyRSGPIqrLcXKs&A18iw2_xl4M?suH_?kBxyyhIed{m(NgQ&r_rZV3f z40u2y=~2bYeXcLX=MK97;GMYTqGE^wT*8hK%%zvL$*V{VpLs zzOUMgcHU#}ttOkg-JY(zx$vUvNMCflLjhU`4>+$KuKA+b=MUwny`-wtVruWsWNIQGH+p(v^N)_8xP(X7{d~^(h{}CY>BC{iBNI+q1Kr&IQr3~i6YJ+c+R}9r1Fwc zKiVNb10MXXZlFC}az4ZnRT@UoE>vwpZ5;s1|JE~swsG3waB5LnimYTilw*-Og?`bU z55fRhK&HPfJC?4Ne5oT)CxWp>`3D7#NtCzeklS0J+#%~HxYivqhs=PmL&^JaL99RG zKjOP|(qGkei@F5M9}W_7zC*L8>6Y!DF&a>#D2{3Go!BfH9-+B+r7mjSzQsG6l?QgZGk6cCOgZ$D>Db|@t-`2wayIT=8WHw)R}QiE4tZ|tnlyFDPL%fMYPzS} zJNH_05pFny9j>mb0KA4-_QbyKzSZg{uGHQ2tri3%uC;E$S{J~+BPLCShtlQ9>y@ZM zo)7m@W=2fRw#*Dzqw)>GyM9Ej?3zsYJxgehj*iNJ+WWm|!zB}Fdse-!BWfFH8+25W z)efNjTWL%J^)Q?QBt+*u3X{gPD6wR$dFq>nT(;pH%jb@zT{U(KH*`tn%DdnHq9p%$ ze+!Jl^8EKZls(=itfssNg`k`gB^y>nNjKH=Q?it`Yk-tnIk#Kay)C5nj$CY527^5^ z;vR(yoO57Mpx`Kr>FCdeG0E=uxD4f{prc1-J2()l*N?2uRQuqg)(uhYDzkoT;IYc= zO4Ok(QBy55F*a;#F35L9mqFFFHYPPt_Zm(w%95A1Xw^0RRy~3`=Z4r5qjvD8KXG8i z_aEo`F2ZV3)OmoSls1kSFKw0DHRtV`ao3VOm;D=85a~ol6XV_QcW>VP@s%hq1mo?U z$oc*KZ@&e>V)_$cesm}SZ$58Pk|i+xgF==X1KOo){H(n_U2)1Yxe#G#AaTq}oda;Z z@`Q5$ed(FmZ1BpDkDcKvt#$vC-9t4yi`_moZ4Nvhfu{YU3DnKD!ue<{Rpts+W)zyX zYI(IKlIg`hU&iW)Oj?Xz+?dVH@M|9 z+g!?yv2E$(R?4z3t~_13BueX-dV2yrX=*WI)0hsz5f8lb{>^Ja`S*Lp2tR#s_dC2Y zxiTe31L~O51yRlf<&2!5Z*DdGjH6@s_=1-1}1|`C)RI5$% z=ReDQwTwX%FP&j+2g?PpT)NjL>ON4?Enz2z z(k+Xhp1F1Lc3=FpWr>H7OUa$~e5u7~6Q@jOe*JZEet&U)_Q%(+U*X@k&N3gYbFOTPglAJTF@f5H(QB90OZ~gb=ZXO=UR$eYpmGHp0ips}-MYG-7LW zb(N<0cMGDN5hYo^hk)eerR}?Q4Y7+xz?HU%&oA zl-4J;+5CUX&bO(JBMIX|`^RY61>2IKAm$8}7;LC3TY8slrCe05Dlb9~awy3b@zx5z z(D(lc_x!qdcGr-k?#8h}0(Dl;Z)c{vr)Tu((+&gQp`Q(7C;bQ}^L2;vd57|(MG3ne zrIYjnxdO_sbX%2)P6NDU$3`KLrPdTQGS*iNcv+T|Qg7Zg6TSN@<#2}Tt)V0JQ2$!z z;G?v62}_1p@;pbhHWmRH zC`khh3+M;Vj#7;QrFY4%K$-CVvut;lGEs^Ic>iTdW=C0pRap+-KWF*;oql#ovz*-= zZ`YEug+&;i*&R(%1sfyvCuKrep3JwX<4`mc%VU;@I=;KO7?D+&DF>*QJ?P$uih>+# zt`1{6XuPCmLV58vqGMzJLGg>{YDtEZ)%uESz6!W51eDXF*xW7_MQbF>&mJBM<)7xi*!nL9PA z2u^LPTn3aP=S8_3X%23%Ul0vDYXLnoyM#H9gcvu$~7kU0v0fcr1K!Ad` zPbDl07!bBGkNSeNN9xW{(fw#UN#?a4zR@@=#c%cEQe_7#eC9}=l{)#hm+6$H9!4Y* zD_N`rXe(EGmJnA4>S>xzN(|(Asg<_sp*6q~xfv+SNUyIjz$HQWSurpml*dP>>W%aW z(mRI-2F?Ik8I7~_5e$}(D*s_glaTbrLH)mVmY;ur@y8!Oy$7YG@>uM$UU`SNu@p;I zxYUHw^Al}`fRkidtm#l%aN?C^jH^bnKU(bskc`In4^sJ8X%Hv!WD}(Ytp*u_)fCfVpXyQk$kI@Uo~b zprYvNinMuMGk&ugV;|Q>_oY-si&s;E9af}0cfs^m6jT!6F=Ie3w_Y6e7KR2!BR7yF zLj&uzRz{8_BSIR=Q!DxxpHTI0i5B-NsQV8sumroc9wYv%Z{^VZDU?6q6ZZuKK366h z%W`vg4t>!wp!5dH1DhT}>6N;kS`6nMQgGd&au`?=Yo@p z2)?N?u`6&9G*wDPWc(}@D`8-~>r@mK8DL%_=<6|zqP4s!w(L9;2L&3%eQaBX9?r-R zF*cA@=k&Dl>Pk0PQt5AYuj`Y~a;xgCNGW&1O6G2?7g%6-3Mc!IGg;V`g+?xq46r!D zK8h@3_%3zdjbx!zQGsg2@@FH;LQWA-bLN577}G7O`FECVc+?-p%@;HZ6{%>3WyqA_ zZFCsD38efr>6ns5hy+0(APkcDqXd%;Mz%k zSMo_`8WGZ!mPYdVyop6c>yi_y;+uxtumbx^Ub2X-b&G6?m|mCX zSRm>zg>6TkPbMF2w~&Qg&y6O*0#2G+7)?a9vrrTtVQKOOl+XEqZD%>$zyV7!6Czj+ zHgS*^g{40X#sB;s`yfv|QiY>8M_KC{&NZ;Y@|*@g4YmR05h&FKdz6R6;(3uAlv~r3 z0D32s&0?{mh-+Sr$75<#$GN&6s}Pc*kPH)!epz)g1Rc~rK_MY05)u@dp-|jL0J6Rj zdF|eeOOA)w@xX5~Y7@Iwq=$c%Wq4GZ&DIv_B(E^CGr~#vVh8V;QQ2&&M{YJTCVYea zpIIm{@zlb2%=eSEjAJ5L=upD)$O=-KBn`)VFh1JCq29(G4r56IA+U6^PLf8aWL7=- zF(hPtu5=HUYd9CnQ#z)hR6B(w9+1T)wngxzqkOKP`Xad3&Oa)*X3M>yoXY9k+p8*O ztEQpWDrb{&I-O40355p~gecW1Yw3_lhvcuNROG@5c1iN4Pt&(~`q3a%h({!qt97MV zLE-z*Rlbh(#6#RBhSk#4gN-~_W?`X}9k6!M>(|<|wD? z1BNoNpxgia_!^?ZMFWsee$V6?boYpZEcVm_be98PsRoiZL3MV7fpq+2un zhZ38qBA1|qw6w@2*Y8!B0LL(Nn`nZKzKs1w$!#P@a$BLonL>pqYCUC(H8kz1r$%=| zN2)v~*r>C4M$KMhdsOt~uauU^*Os$X?8w)S<=$W-8kmS#@|L?5#Stdvy$QF_n^^CF z5+Cvqlop;J^n)tfGl1nV;RMRIdFd$)u3-&~T^uya{(P|(&3`RQu0j9>&&OC05@phk zTb76BiFGJ}=Omwpa%&1%zIBx55Ur)fR;8(nPam!1TBxfjFH;new8$mJjY)xw6SR1$ zCjIsikPx~Iqd!8Ia&%`I`aV?fSYtNRzrjzwPPr%WTGNy?1cypA91Fxb6~Ipho_2!+ zl;@bp^D2=E`Bk@M=`k^zrD@#+6K5V0MPE4UN2EecML8Zv>J%Kv?d|0YJDUl39ZS+Z z!`(QrG~k!*h8+ITTV8t(0mm1Rq5S|#3mHC%CGIQXT_&`V%jiA7iJnmSnS~;THgY3tW_MyuoEb8Fu z3Lyp@DNtx5g*umqoZ}%sc9C^4$_6V1Urc03OKiKf{uev)nennYO=RF@&*zqF7}~J- zrJAS7=d`tfk)fxq3z$ybMidDp4M9;luFA5mX?DtmTeEU zMKJpHTPX6^lRf)5ima)6N*c2)7X-&Yk1L>wh&tvgE}n#nTwGzm>o zup3>-g;0{`Iq!NUjho3?>M5`Ak@FKu=Q}T!d2)dASSa7|ZZcP7TyUJV2G&)fP_d!g z?FB`&05aNkMaHcnRn@kLXz>{57obnu4dbnvtjN#yXWBJN*1T;|6EA8FrEAU_# zdZjZJOg50<%d!n3kfhq$QHEM;NIFWQ%2Z`DyqgNS3aOhE8nNPdZ?BnYrbLpMd1^r( zb9);}zR)#7*A!hdbgcs%XR}u9l6R{v1TUh*q?JaoZv_1GsN z3`nxCYiXYBzs1Zd=dCd%I!YK@Bd7%BiL0Uz;zpVURVt))Ret*|ktm%i`$!v9IU7n_ zWUaLDnXgP*=Tjps!5@4;ndg*nk?y%`8irC9uosI3yOP<*nWplbd=ZmqLEd#y;A8V- zLZr#ha;)s_;Ra*Gtmyjo1*W&6VLVuwxs|IctfX{UtZ)b3?Co6~;wT!+%0|4URt{}0 z^av7+-d;WFhqP{271Uaieae38V^|FE1yPQ)5Z5G?YZQOr0&tqoo=wAqYv1 z%D1|CW=u%>P8X51gECJ}>3BSu zY&MI9Y-MwN6;`lyCo~NoFRSa!ZrRJsDfgwu{4KXqM{@EBRb&M-Ze_C{%SwioTf$+i z@Og|1S^UG`y^+os=}rp1(JBN0VO2Exs{+~uLvk#zvexKw=~gP+V-~;^zD>E z7*}S0A7M-xgc<0oXI)>y@FFjPCg^VV43$0-Vt#aEk>`TvXL&!$}@` zIsM!|E_$xM>IbE5Rx9#E*5R2JQd)CHO{ESM#mxRbW-6I!Fk@ES%)B?Vl9^r1U?s*3 zvQL7U@%Mbl@A60}ot?omk{}2h9fvIOio7E4(T7>68A`n(aHK53t={@R*+H-5TcKP! zO8smpj@=#zKti%ZiJSHslm~o$B8?>I-cv7)ZtW-1jC*Oef*Gt}hU!KKg_#AQ=z?T@ zMlo9xSg`gWK|WC93p2{)hLstWM!R>E%Ned&=wxMTPURzWoKjG6FvE?rz5PF!+5HPM zZA^bQQp3#j`_q8($l!sF?#U-Z!}796*@v63WQUxgJb~rw9wk3EjXt^~`@s``YFtv!>fCyhRLz1dRkD35?Oq_~^WNmy^1UDQm2$bAPc8 zOkq+?N)BMv;s5`Hv)1bFYhOSd&r{FNs2LKPq!;_8SFi3Juz3kYf-)Y|0w5^)OYye~ z-&EZyV2P9BGo zC-*oR&I&VETTb37P=IlU&j^fV2cfp72>wf>uhu#~MIsUBLV=Hvz z$1iDhP3)@_2La_VI9KVmFjQvlL(`FIPJBE)?gPpr{5VR7aDTiuD2GF0$&o{8ZB7a0 zulh9dUdHALN~TS6_f*0?rEpJ*s*`)h;U2kJUJm!v!%j8qjKa<&h4`?O)grK&MYy+M zWW#m58u8vF;=Pvvtlwx1i z*D5L<14_6zpoD@wNAl^<2B;+k=Ud#i|!UPfTE9Uj%p zPK1p#Bs(-DJ2WIaG?b#x_Za4C{n2^Cu;ikFy!+J$c(zX{yZsJURibDY%LJ76w@A64 z5|r(B5z46FW2u~_$i(Ym1w9s&PsgRw2|8C8l-ENJ*HU5~C6<7)ZBPByt;eB9;ps+rx*ndcY#L%kPIH66qW`hAheGTP$fUW zAtE!;UT$bcPoNyr2t)qvM@9=L%U&U7MR_^P==6ZBc^#6 z(caiYBgIAvjT9T@vF9>kqq2gdFqD1AP*a93gCKP%PjySL-rG1pXpA|P=kpJJV0qp7 zfWrsA@aKQ5@;FBl|Amm?R8U6uQG?PO2->W)7*kifgB{>t0!9^^Fs&mD4?fpgSqWvA zwIhJiu*7^Mi1=H2W~c20rIo1=%D$ky-$(QB_^6zGbg#2l|6r(|F``*bCYD$`Vnj2G zkmf<%Q)`NhUPNRxW@yC7NHz1%BQz?}k{R+8onoV1#YQs3B%KWX^2_Dr50`XkVOqk= z^a|I*j*Z674pyGk^@sj7CM0Gh&-(z9SVrYBa1;`8f0tv~iCKA)LuptOO1|!ehGYVO zQmd>q0tehJZB||@q8y41u)`05#DDDRE-0~M3d;6dgHm!>B6()<;|xxMm*^yTsR}1O zGIvKFQ|^|N5=xO-vlu9~|OZszW+skEBq)fmtyuNH|lX4YDjlv!hH z?ZM}Vo?27Xh-4!M0;6Wl5_FNFlO-CGr7A7akgbhBTwW4N>E-}s+#Pse>O%^_iREWj z>jBD-{cD2~)3W_1>yBXq<42DaX-N%xP6EmUN{b6nT6u|IgP=RSFe{_o5(c2u&ZnYz z%u1zW2&fcV-M$@UxkpMgFDP~PQBVH2gi|)?&CIfD%rr8q7HPGkCevz>S5snb8S%_ROExZ;S!*=Z=TO?rkJ(j;B8qG7mWCyuJoOrKPUHfVdJhDY zs^tnO^(HYSCG8QEU!0^f(j4yuKachqBVtwx%JYD-%aypVS{8${8&ImEKw@S=i4~eq z{*#|-^3%gLKUH%-U3n%`9$((w@A2uqma@sB!Z_ZOYRl);bId%e_Sj0SJgvsOnsSXh zcB8T<8^;TtGx2|BN#!RvJewsoklAN~jvnWHbeCRYSijAuSYa;}FBpb|^d}#s5?dEw zg&l4{i9*!^lzIyUl<`lhm%uki-SCih4~> z;80=g*dh&U;U`maH#RsUqC(TAEz1`JQhmxpLsew-sk7#h~dH>UUf z`PP?o$!)<8kLal<@|5Lvu{X(6bQL|dSabUGHK)&#(>d0hzQ5-5Y|ZJ}(PQQ<5y()l zMd;N7eUBZ|0fMoEHLB5d=~t*oz!MM?ZJ3&vssCW$w>z}kSQ!rx z%BRB8#^w7gM)ab32OwzGG@^rbaZCHOo|FzMM}?<2s`xbB~(L2c&~|RIX8!S+kfC;S96Ri;#9E zZ6|qzrkR?Dx>KguPk;_3l00#mjzdsd8;E?CkuCTMXCSV$ep7Gh?rv4T(6n?YJ8iqo zOee<#rBwkOXjWRN9#HD*I$jb|K8;8Ql$e$HTnhHzxd}3E#DJ|g*Md^`aV^fFwB~I5 zRzj)st0pCWDIyupnyoqO4?3&5=B#qTS#a0#EpG5AN8k5IgnKqs?xP>f}X=B)esbs4n zTZrFzsxc9VHKJys-=HKhs$veq616pLLaE4`OJp760i%PiiuKrCluyC7#^F#p$;~H; zcf|-OPrM8oNZJZ6yKi$SO$GvsiYq(9()6yKH`hH=sSgRIBRTXwdqf?vNgG2@dYvvX zu@rmVSr>QSB1!g|5$31dt|f zIh379PT&))odqZdIh0ysZCHO&L8;+T4oE+6^lj?V9{-YpU^qBqdaUkt!?BML|hD&+9LPL6<}3_z7U*XbVdqm_sQrRXD3%wN0K8lX8r$YPqDx z6u)mX0Y&NsE=wLu+)LsDwpfKC8L+00UgL2r`1ep$vRdr2oRE?lPm9q%!~aIZj9b|+hK-34F4=8~U6uV!f)97>Gf*ONRb~<`?hePwY z2<2%&N&60^a1@kMuLhJ~d{z#0zOlCjjN>$$t0Gy??oj%?)Iw~tQc!Z9AhcgHz7r9! z9>3#3mo!V$oTz|SkS|g-CoW(@F5p|n=HE1ySs=O{(-tF91+_p9KyDBTDXOijSJ0+0 zg|$!p0zpxxKLX3kOPy-`?$}dj4Tvo#
        `B2ozcI`V5-JC|iYZIaw2w(Zbn#A0;SZ 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 FV1l1kLaG1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/conduit.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/conduit.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc678c1dbbd1eb6123c2aa9709ccbc58d1b343f GIT binary patch literal 41574 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

        #*v^2j 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 WLXO2zI;cSa0000utoq8JpcjA1gl#}s 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/simplespelltable.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/spells/simplespelltable.png new file mode 100644 index 0000000000000000000000000000000000000000..1113ee1dab8b4976971ad1ce467029bf1ecae7d3 GIT binary patch literal 33963 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�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 N@9FC2vd$@?2>{9{pB4ZB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bindingarray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bindingarray.png new file mode 100644 index 0000000000000000000000000000000000000000..7309f9f8d53a65bb502330d5291dca57ac384bb8 GIT binary patch literal 43181 zcmb4qg;!Kh*#F(7OS-$eB&9p0LmH%0kZu+PMM97kN$Kvc73nSksRbmYyJO$|zQ6PS z0l(**J+t?oId`6U@-xrOeAd=f#=)e(1ONa>RYgG;0Kka9U;rHz(Omk^-6I-QYjtG> zM2nz1`HnC|gW;iK>;(W=g#Z0OKxP&h;w755s)iyO44aaOnSau7vk~!%+DYHYTi)Hx z&F-By;t>GkJ?-9l+u73jIe9zMDXVH|+w$0<0RSDKsvxWHzjT=Gw`guq2VV$P5BwxU z5O~t{AA7~frQIr8Vg;G#|#g7qc@cnJpz-ok1Yb7A$kSSjbvkBFo?sG2f`y0 z&(j*Dd!*N1iNyA=Jsf&X96Rg;oI``I_w9B%?8h_tl~n(~sElfB508yKH68G@qsu9g zP*7C`L6VYmi6h%1P?(uf05vr=j&))>HgB|D-uNO*v9?&Lw2F2fL}vq;lK;wcm%W z4+9w&as0bMId5k9^>uZDyuw0oPh>BK(QmQ~Y0rDVJ@yUIchumZDKf9d-GG|?3{G|g z8ECFM$iBKhv06WZu-rk3q3Cxvu=DTg?jW>-M+BGb>}6BD;Si7#_{}H5T@9-qh{VHi z3tc+}S(#T+;eP~{mN6odEd{;qbU%~(8Tx=Ep?5OedF@fq5`xMDJ>6pU5702Mq#d;~3KBvgYSeU>7p^Y7K9wK| z0^Q$SR;xt!O+2Tc62)jihP<2r+eM%rLRY#!Ewfntoh6TB!6tiOBU>g*Y~hO+&Bf6(^CTGT*|bFgs~x(heZg26)eys3{0igPM&_ zr3;TNgZ+657cG%Eccuo}p_24&fiD(+I0Jd*2L}Jm@|z>-lXE>4t|+k)g|xN-VWIO%g0y^gXT#cHy}U+KN4D4~Vs3}jHo z@#}%5;6r2=ijx;>oJL`T6gJ&1aj%5eFC=Wn>T-6USjOLDvAGoT?+gxPaK`gvQ8I-s zUv!dsSN*5*)W=3%)}CsHYe|MDzV&5#!)q*vR+?3JLQ-?PJ`xW&utD?*$pv(SWFzK- z`=8={uxAPLdw4vmMXQZ7SkWDe!=Ovhzx2j5Nb_9ND>W#OQiZ$;NG>H90E97|7QBl2 zF%=<4%!#d~(i*Hqpp}mfZvsV;8jE$6AKF1*vg59por%@?BG67VLV~y(i)wYmNT{^I zG)FC`@&VzNs$~(_8j;TfQ06ZvfwUgqjQnp>tjq>LA|HbvSZjk&=KE=&D~VETK%9ok ztrj>(b0ni?Sn7-ORk>_9!lRQgpZ!ZZ#vz8 z`$+3Ow!}Ioy%dg#39s&sG4!>Se~jA+*bq&M)dV%&;wya3sJZJu&(k;BVR{{!qqp_v z{IF8(@AVt2h8ITC-;pL+=pL1U8&G;NN(N-ZbHtCDT9VhwUh?zEKjWpWrqT9=|Lo7x zP6^r%Wd^amjlK|}aFJweDI(p;d&6WNP%|+MEbAna zW>H|K*krK!6}NO( z+vpTa=H#B%7?cvi%Yg_er;{mvqSc7kN64I%L4#sCdx2P@A9Jp1)W7-s@)4p}xsApD z=kp^pcS>n>6{=z^ZO%Va!*!H7%huKDSo)c<@GZ{FJEY)tVz=-JfSI{y1UEOOtj8xfYCbN@F*TvgLe1o)dd^u{4Bz5jJsO2~aW z;bsnqX7_%}X@dge%c|U&#uQ2=8|xe;cy7WSM5Azw(E^hZ>GMwlcY|YC)wmcEl~uL+aRqED_q0N9pm> zt-v~{hMfF`R8(!|A{%0X2z)3QEf)5@%S@X^pJgq8U<{*I`E_kl_BrjpegqxJ(c5=R zhMV?QPL59Gc@aHVi1&sSL^m$%@~3$U8TOR_d&dAX!Xisx7_9(Xq z&4A2%LQ7fMXd=%UI)LwVGwdR%J{gC6R|# zPf75yNvQa*;aMAgD6s%VLJ0*%*xiHnf?{Rd@F=wDt=*82V)g`9gAUvMs+;bS%Woz5 z0Z(L)1m;JP_?aOEQ3R zBny%v!5TBq60gkMcSU+--ah95*fV}&rp}xW;OTnMC zZ}(0<=fl2N1^#NlR(65z;6%bvs(3yk4;=n$<*CjNCROhy9G&3(FC~ZW`|X#TuDLUU z0{6?0))FtT9D-=S_OKe4w1{a;$jd}cy`$guTd))wBJKybp_cZTN^{wZE1TMg0*5)? zx#vXpIGRtA^H~cr$w$|H$>!PB*d0p4 zYLFuHgj<(V7d87P=S3D91El7-uh+azT!}2Z0m_3m8&$HXb%r_W%&XG|vowgXMoiQe z+tPHO{d{%a>8$ZUWG&g&K6CHpJQu>uCoo2t%QuuG_&_7Xf}dN1;aK8^E;_CjWKQYT z+O)l}UQ|lRfKr0`lx0nRxH=st6dX6FqK zMn&gWYkhGp+?*c>pCV{{L1o*v$P69*^T+xhYVGIb8yPSE!JNoPmHKQAo5nYWjJ zP>;Uhto)9-mWy0G|Iyn$A21@!6xX?g<+2bw{)GT-4D z>FWvfStjGl)CEV3WHFpQ4Y%B_ub^&j*=xv};}k?iT!$~3>$7zdL+YI@4#vwIeAb0I z57g6aDq3ahK8{jI{W|Y;njHnBvJib;K%_uos?^xCW&QQyXlKh>%>aj2cYcLY{~Xw1 zenHUmaAusCKz@7EPy9qbkCmn|B}ULf`j;D3sF0``S$n_IZ-=&GILJrg-GA}u1%G7a zCz7mV-3~do{!q<@&$qMPhFT?743=)JKVFdWYUGiB*Zcu`M+G`IW!jKXX#ycIE7xPT z@Z8CH3kjN35Yhq)`gHM{#4gl>6{!dN)DBPSrjN}_k986_Z6piMX6-#0x~KLhWL1Fp z)X(QMwrMKOWy^y)(5K$-f!1fCrI8E&BsIJ*URd4zsMMJLakROZ>5ttnBWgGh2k{BQ zkk=s`H2elz^zObQLJjYsq!gPD38hn7FS1^ZmS6QZ0HrGK$WWs%MpAhE(+nr;-l zKEzP%&R?AE;>4|~xtyo_pM@~5z2=Iwv@F3|5}lUJX0~zl;u;i9`z_o>va80#EaMqT zRHrd^`LOsAvN^Z?zU0-f?d7#J(54nSrb#0vcc8I1VAXPUgRx1Z{Z|3Kog_D6VTZ2ftiHVRAOW@bpsKFNXVZCDg zH85N9tCkg3BJ)%AY*Q36t>1fZpqLm<@I#WN=J+j12K)Qeg8|Pk#J7G2`&P=!UZ&C6 zze22iq`SjCzM;EfQ?Zn6Nt-M&YR$yk4i%j+faOjxZ+}eBYE>LkbBFuNBxk1h3fXdk z{XP+0Nbs-V>>?v8oj%hkYqeXTRP_ErAdA};3*XfY=QzHl;u^F&*<}ob>R^SlIHhnJcGM|^P6`1h+w;qE5fjiEx5gkc{1a@ zC>^vnG-uxCj{wznih*DC9NWuHxr#5{N-qK{gGreynJ*w=SjHkD=i{T+xh()PODwly zw&uJ16B}goD#ionpa44$Kz?j_%Y72-C66tSx#kG&Fla zl}CxR+P%KB!NZJQ99HuArWsU{^Ses01>|KtFS62ZYAM7tZln&ZaXatCZ{L(YJpW~$ zY+{fJ-AA7k_>fcadA)4*02;&p;29EQ6`-Dm;^(<{-0C)lf$qv?l4JheaZn|#KR;UD zk2I==oqexNIwuov9i&XwIXhw?GZV-CGw|k1>u8r0M(iHhYFo+px$@@%I#WOr=Ww*1 zPQyig>7M#wnt$Y|zES2uM5W^+`q9JpIlQV}QQbfj&95a!bUT_-WYU}LI_85R`0uq) zgY4s0;AqnlRwwl*q-c>>#=KY)B)FfIN86Vbt7nC4u{G0q2@>>l_f_`BA?x;RN{%H@~D%=VzLuGP@Ja0GO7 zgyn9EEn%>?ED&VUCj3bgD&kHc6o|;$T9)1a!?~Uk&}^4}N>uxm8M4{_DwJRSErXS7 z=+ME}*ze@u8IVBh&Xi_Kg%1jxzA~8LloZ`XydUR5jj}o?$ozK0VFnd7V9eguc{{e^ z;KiV0Agg~H=l@1wRTgM^ze2gEJHUb{LSrHx?tII$I`r_8n59xib zlpsx7Lk4{p8jafx0T_7G(UC`W#*G_4+Snd27FA+8T4mecCmnBh`se%?`*73#aI+4@ z_nE+h*Xaidg5`$xPRB+6^_bhI_KMQ%k|qA3S)G{Nbn}jTXPN8~LaN?&y@wf1FvHtle^BZT+bIjHKI9K8 zu7{|prQ$!U@@ue8qRagl8@_30zT05NfBcJ{pdwmAj#L^)c4g@}Ga0O4ZfdmM{o7H} zNGY;lxztOQu>-_;^c(sMbyrUN#+i6x>KGTzsuewr3#$r(LQUerhHj|w}N~^EC zudor;h2Hv=z0vLU%orQ+JO5Eiq=`tgSz21P?Fo&_> zCRo10dgfWj&Xdk-XNHnqTt>|I-AbSw&e}`*q~5k>?A4@Ra<jSB1ZO!KNY zU&M%jiG6z%E*x>#6#K%y=x+{Fy8GpN61e%W&U}X1ilr&xua0#p6MIF?b4O_|QpvIB z`>rnMV3Y+9qG3$(hkxi`v+?DT>c>sYDfB{mk z6*UCL$Am|p?}y$>bCx%?H$AA?z2(uEmzH~^K<+vUqZBRVIFKRR9(J3b?bn9p%J*+f z%0PuMpaR?}lFSpaA4oxDlAqnc^PB@QSqR^VUb$R2;KiDTOpTu?Pk zfgz)S)Hoi0jb`x}-=y@^G-(F@y0Btn{{lmW=E{|aB%+>et7C%k4$d10%V!CHh5#NP z{=!1#lI?!u;QDEmx;ZEt&7^1UjS3CP)0^KB*2=COaP2JZ`8;0<{;gFVF&+fBE*Qh5 zjb$Oa%9wEBkt($N#VN6~@%qPP2Z}+2K>2x zSB0O`s3*R;^D*1tTo10WMk_N=9Mf9VXlfdxqF>F%In=jvgNSN^MStJBag0Xzn$s2;>*D3<-zE1% zMdM=MN%e9}VBLm7f+-!9j7T7_ypdqod`1-&YFhi3O@y+O!wo(1m{XtR3%MtomcG5n z*qsE&BDG5a!HnY-Rax-?tg2^|;ynqCW|(mP5&UlvK+y*UM+`P34{pHA+mE5Ev+_#dxlrr4_w%{g2?PerRrev4G@=#Q^#+3dj;`Z&l&17WRN zzWqvhG*PFijdztvx*L%_zw{4SBMh?LDTi9bDN^dJr%`$uH|PQ!s4mU+dng0w_4x3< zTi`ngE;OFE%T!*~e0^!5TCPJa)xxM?N^seE#l4=#P+1kZFE-8YyPW7vi}YeN3C6)r ztaNK?XTkJ`bP-h!dVKzHXJ>$7;@ne#u(ae1kb`%8YO=QyOr+%j364o#UZFz2rkoZG zv6HQEhVGriNr}FmaIo7oqxW;%_a=4(C)nv6+b_UwOjYg|1w}$eY?@UgM{b`RsVLaV zwDT?3Uzw}Uhc2d03HRoRpK9gLA-WMFXnmK5Imo0S9;S;$lq_Ov^bWFHIsADY!tJY|Dy1dI&KvnQWAutBDe=zn)(yVg{cuRvs!rRwgM zLAOCed@xk5H>h}4uO8a^??M&|S5*&|^f^*b{g5ANnGd$kutpGl?qc66Xo3q?0N0?6o|;6v2A6 zjq6}cHjO2BuI0P3`GT|kloV$$fc~8}DR}T8raUL_jaA}53Q>?huhk-|o%mv*=%DqdyZHmNh|K?T6~H;qW*yE!4z!sQNVDs% zlYUbi&(Vyz5T*YhR+~_r{TNvSG=xPmk>d@j!*J^4l+S4l3#EM4O_o@pG^Ls_G^ID> z$bji91B+QqbnVZ@DN(1=8cC9{u`<#Ox(ScWz?0mDQ&@xt{Nx7E^X}SWL=GRv@N2?8 zHGRl#yLGyCQ@H;IwYQ^+jj60*hj!8bI_0VjFp!0GvdA6gze|Sqa5=4270y+kBGhZ~ z^DJn!PtKCg?lsT;0MWxoJxCGA;F_NZXF@MOx61=5&0#2c#j5XORG#6Smf(!aO?$+m zn&YoQ{ngI!+CJ{TXWey9r=yN6TnckTp#m;CZ$xpm=rw7eLiY#mrkhsb{oJv{7U*#V zCY%`3Ay*!Zzi1K_dL5x|VHu3!FJ72=)0Y&e5Ld7Ck|_V3j*79ny1AqQ%`CX)r<-jJ z%5=7qL<=W?UP`I1mC|H!6Ypu56l{h_Z=AhhBBOi`x;o3>WV(XDUh?HnI*js)#P@q+ zxbk%jy(?S~&~fMpcS=Xht?Q}$NGQc(*X%$CqQqKhM}0D5W|hEkM!Wu!J(Te-DB~*b zULTQC0x;lil@DdaRpV{O6yNzu#urAl^M07fq+&q|^#ARGhvtD$8l5ZJa9n2X$q9U| znf=Lz`F~q&L+`U`a5^ccepATvD+k8*@h+Fv(BN*=kShLlHyh?;x8xA3CdE4;3pxAQGK73Lam^_bv5dk zT{5=d#uFr1ahCdgrCO(q<|wy=5`tI(q!gd#5}kQF(|B}UJ$>|*k@<4-)Rx6F!ged* zT!I#yAgZLFE9+}oim-+C^6ney)stjMgTWvndcGGTKQ^ek178JECT{q<`n zJ-jZ)P{u%?V}S#&oo+D#Z|kNnsoO4gJ5OrNM5ye)UlI7Ll`r;K^-7EI+Kk*HEq95W zE<`(oh=6A?Mb|i0mwR(?o{1OL7Zi%0#^+2O2>zmHaj8mM5FqI*LaD0oK-(JJk7VgI zmcDqvAzeQ#<)f>1d17MpkY6m*s}jfc!v5q%Zu|*TDKopDmU+Hf_^di_C+{tQ>#9?W z$5xc`4>>p%pIYbUebNG9QUn|N`-7^^Ii3K3Kn<2$N-ce=Kq}q*uHw_|8;5J_Rbt?O#jZ56v*|u zs`MboaF!-YDA}3o>8o{{_7?(s3#8~@xcPx#Np_?;>>4r4uhu0*Rc>niB+rC)jB}8( zD)dz*GF5Ph<>!1rQTCG5>MsW-JfbOR6+OX~k7zd7bhX5FPPAX1GYdR?pvJ)L^g^^p;I0pIB*#c3JCokA%ao~Vky z(p2j2FeFA#RFKFZ)p40>vxc9ePZV5L<8WhldoGNjme8ZQf1P!k=}`pvnM(KawN+|4 z#(zQz>b0pydL%GX_H#HqGgBVmiVMvx3^!q|S&e?K1WVw}M3p!S+}l#vFl83fSm7QR zX!s?$&8`|tZor67xemBL%5COwP1+fzcQ8*5i)Y$_Oq<6&>rCy!4CC%2u>HHIM^LqQ z$U9bNZL=fE>m{**_5JKe|2|BkTV6}a)4wa(H_@!(U4@FsV}B+Eu@WPYrky2Mzgb!; zmktL#kQlrilV|xYLuV9Obgs)eJL!sn6e+`0J|>&`1|#m}SlW^VmFS04bpMO+Fvb#e zf8yoYE~pdzJJ$m(HmwriD?Vo>&Mn?3LuUJ>fR**M4CHjT-EAJbEoYg+C`XvFe!sdh z@zlMbJGQdr(jx5$?Ax5v-YSTckryG|MTOp^~BQ>Kg**vRgpKoj;vr0c;TftCYs0O-ba#buWl~|Z~6?fFy_FA6% zsMr7gF5xrBn3@AUmRx*(H z8y>2y|J`I_i|$?+;x{pQ)XQoDnI)H0>Ts|C|C~X9D`$Wl5;8N_qX95z-Trcu_bFL)iWAgJ;mvVX}8L#7by*iSP6Z#(bacI`Cfe`)W_uHypHKZpjEbz>OlVpe3p08^ z%c&uunEw0Hi`FEvY2$B@Mh~hvsS`4|IR2URg^H=%yxx3T)Ep3w4xJveaF+jN+H#g@ zpzx@ zjjdJf%O57DKi0rUQ&;}i(5-fct+gXK7BCO#EdEydz&71YMY_q|z{2YoxI~@sa+I!! z3eAFKXAae=Ic-z9c$&ouXMGxdblYb{iWi08an<@4zI|OMnP`h~gnEc({>FHcn3Xz8;T3dwkHET*mD&eEpHcW4Q6&5;{quOpdrkh=QDN3@ zE6ly`F*Y~7eOBL6|57$2rM-T8X`7OZyK1U&V?*YlI&_eE2gO&!Z}rq(Y-BsqQFDU! z$DhRD%((Iz#Hp1_Zgy^=(HrlAg5JE3)<9T$h_ILKW0qj7}WD+l!z0Ca&J+o zb#Tzh+}F39w$ioJkR`WFp)`Yb%1H8C|w@#JEpeW#w!80>R#B3_ib54qCIT4;91t zmGE>o<@W%oQXns~B#iwcAwH*&j|i1;AwUJI4o%`?@2_hV+r4CW3*wyupyXK|1J_&( z-3)`Pq(g1kSY&i~i7YOf<_2Tc@AKs^8@4_#JZUq`tfiQSrs(^%I3#c%txER1qo1bt z8)E%i^)_4~0%T7=?AmvfyuPJMZ zPvulZLWxOStG;!sKaxPIY#MiEDoSy;xeHQeP=K5E@+XL3$5Lzw%0|zdzU&2Diq(L! z)0%-{jk1*BlG@C|m~aR`6j#3ejH339xTowb5)^}f>AccltQ!;H;CL)L6sPEVK=DoA z_jUK2#vxRHrmI*$fqpgk_NkL3ko@>vs@h~2ri;2RGalX3UE%3K-Wwg5uce~U&)5Um za2_{pxL`@fuNa03BA}2j4~lIi_dzg7E%lRd-TFKzC))p}-JW=d&SAsS|G=$C?JQre zo285n-H6bitB_L*a1r73?jNRrX5;KXSL^j*sE&U+&Wp%?E_$SdoZ-wIavOy5Oei6J zL0Q8&3-*x}m@nmcL|WF1xmi|A-ByjdVAYYuo5Bj_>=W4UfY!ag=XM%c_9E2Ty@fCc zb7qd|0*Qw~lP(l@3uxD=&Xb=z{(%4GLf;vHtzMx&&-i=jl}lK16erdrK5R`^ z%k=gL>a3)QWm*z*l-r`nLePSZ{hbfHK?`EJHCXHqXAr=3)oDEZIAaq4w6LWI6bfIp z(qxnj$2U9u9+0Z&S0CPNTqYtx#km^K1p9A>9cc&Umc-sC6N;kNZa3=Bw(g4A4*Gs`{|D-fT z5yESW)5BfzC#U>mm+OHj@tEb#JI-z}YJ4~RN-l=-+x6{%COh;;s`wAeg0*PyClQZJ zJ>t>j&M0^eRDk~XLw)|68R{SUNl%USmB!Mx8q!FI`E+!~;T+wv^9|S^I=HnUb8b

        3rb`B%H(=_ExEXv}92e1*D2&A(sRA;XB9(yKNV~ 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bindinglightningarray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bindinglightningarray.png new file mode 100644 index 0000000000000000000000000000000000000000..529d6cf09e66b27159d155c6a7343ddb5ae417ee GIT binary patch literal 43258 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%0D(|4)%P> zdwRx^DyV?b1L52gE)4&a?h>0FFY~o+Dj5veh(LubBju?m$J>l2;Rabx^&7Hc?J*m++$yT5wp0}m@_1hh&#Tf;k-1tQWcm)X!Ly+R zlLELSL##y8eM10n&~ev0xen4TS&R-fVTg-9AS2Bh1V^fvipns6jy(R2H0Y^B~8dT7v=BIXEL_9{!wRX$}<@z8g{ehOM%p^Wg1RzIZ z0CL99xvpKqSJGZeSVn49XgzwWORBF3SSFvM9v6!z?wYdYXscF|&Qz$Li;zYbycrbJ z<+*tI6Bn^>mKpM#gEyH69n_jnLta#o3+S*FKNC0hD@!;UJjSZNi2U)|r#h3*gepd8 zU}?TK!P#m!=($#f8px%H87jG&g44BK{ZYD7@te#3d z$oxa{R=PnF)3cUM5^mRkvRG$IH>op=&qO;;)!yytBf86iw7Ck(eYO9pOV(c3w`IX^ zNcqNWIjZJfA!5^l4Bt_*q;WD+dGIXU_X-wwp16TwAAqH1xQ2jLSDPWz4$F2APnPrN z`%OKIw(1azWb%+YN4CsTy2Lw-7U85GWIkh%y)kV?L4=?+UEfjPFT-Z zy(^q=>r)yvlEE#8NfGZ}UqaFnkb|{2K)g)IpJupI+=9~i&FPp>m}9!4`dn>wwV(jb zv^*!4O+?La2X?v3LVjLAaqD;g6;kJFJ90b1)q@_E5C1aO@O1;7!F8;@u!`$5!m}Fv z{vMrqyH{II^~mdXqo|7@@4Cf-{!$H>j1I<((xraDt%;i*woy7VN;N-4IGgD z`sAfU0R@TUFNmY(1yLUe@`Xn|AN|V(Ff760|C&h<_8+u)V^=eilKbM_<9di-wM}rt zYv({`rfT58-sQEck?(Z*7wR+r_;~88OSL?4JvD(h^d2pHQ?(XRUV?}1;@?_Aln)>C z=Q`S6PVK1ffSo19AwUpF%Juqm>kZ(aBkH8XC5XVZ;T@f~T*`qt0qS7~gefzx5Cb!q z%;4rg#f9giBwg$h%)%i@YYz?W%=oY z$4iEIlR5)oMi>v8!{z|}X=nb2Q9kzFDMw?;R~}=U!@J3z7MF{_wt4Mm`;5-_5c>Dr zu{>ZbCEH&Fq*lkd2SZ-VSO2u#sqO7A5qPjm)7{p>aF-wHzg{%F+Lv#F2WpKK!*A@% z#@|x%$xy!gk-S)6Za~$^Cd=fBE~%M1NiNqP_Dr8%Rm>CBdn$6JoVi)L1*`$y>gZ~t z?dsMw*T4{zET|_U9hE@NdV(>*@E)W>;Z_(*x4t3}YM1+5`a^O(R(E~HpN&ay1_cMh%h{CT|ik7^Y zrOwqF=E&NrbV2k0q^P-v687uWem5w|!^;b)t9m{_u1oQAkXkDBZ6dpy5zr!LzZT1F zjXk#Pk2M^E)aKry(#ggKp6Zi6s zPZUX~F52j5_tx-M?~$6(11DGtAJ53K4{WH=f6I2CL?TE*9@!pQQnr(`z!5reTW-Xw z?dj!}pzAmG|7ro4@7KbRl)Q|LkE4Wug<%DQ6W?*7pC-TrNMNh_&f515D3+T_@!J4` zhj~MdKT`q<_*a6)6Cbal;5WND#@+Cpx8URIdhPP`PfYJ&tBS>PXXpY411y_Dcn6KL zO)Jp$+)aLVD+H%l4G$IuJm9SRR$n}QwO@nx5}0hsfz*+P6K4cICK=OnE8JUlKY)v9o_cpHhoE)GzW&xos@yT&4e{oULuSMYjyJK$H5 z8TE@!8b(w3S`~rUO(Xw@rmGH%s(IUIm+qAAkOn0LM7jh7q&qCSQA%QIkP_)G>6C6( zQt4c}q`N!zJMZthzW-r%&dfY9&vW1R1Zvta_Qjg1$swQS;!9Q%X}B|`mc^%jJPvb< z{@MI3%;A&oulO(<)wenfxv_G!5=69x@w@D#*jywp^D(qzSuX-64i%!lj|o|e(MVJq zfw+ZFF!qErCmaQJ+&_P2FTXhAwAxXrLnJ|GyjDAdRU^oFc5U+Z_wgyKx0Gg{iq&mDBXoI0E-B&Solbz0@cdvN3aKyQ55q(YT z=-Z=)9ffsE`{OEn<)i|y(BXN!vUfG?Kxw3{a#ZK#VA$=6T+rsc1@X^sd{*TRlZNyJ zD;-5n;ZXy>mTI2dnt^@0Qu2tNBdCb6?Snf&P_3?4Y)I-)=^6hPZRK<6PKwfjBNHhQ zosn&*$U=~uQU|0N)a-M}PXliQ22!vi4b=1`g*1CwFBodE%`7q6VJ#kE0dZn?Ikw21>eeh?DlS$$Cb2_2o_d{Lp?wgzyc zI)S|dI8~x<38XCHGT1cmSPw*2Z0QDda~bZbLJ_WwLX}yz<#(2!GMTO)Cu~R?J5)vw zJ9clMuqZ%82;oPDMn)z+Zwu73mL|u>o)g0PAPaqo@Z1O}P=0X&nU~PEUDWgsc{Jrr z2zi>q=k$m#mio>L+HRX&6dpptm-Y>^@`c&LxGCPYx8x@AD#9xO@`}9g#)b-wI*a3B zaC@8>=nF2gq%FU&%gc-rd-<{#G@FY?wNj0hrTFYcKWgu%yTpRVZ_7|XM2K}Q0c(32 z!i%K*A`3+4n8d?UeCK%*l;=@A>Y#XwCsTT67jIsIFiJn&xRDpl9e{$%7o*-WH)EXn zrm-U{rslY?Uc#|q-9AO4F=M8e!C?|CxnB}AudeN-I5vbMpAn4#kXveM-j@C97fk%B z4+Ml`;*22dpW{L@E=y2Ym_ThUy*tQ|Ppeo6du1Q9?^G;59`tkG?b-3EvT|8u*unJL zbM`3P#qp`x@nAJNge$+@iK9NBzLXAjfgRi_FSl;N%1Jba3v}#H6poyd9tXc&LONe0 z37|*}`>Cl$U4C=P^mBTV=X;OL%JIHY|NX6|wIDT6gNI5@zea7+H38K^z;ZZ!xIo}- zvGyFJok`F86RRx>m}&@fwV>Z8RkE&4!sRZ)=%mVPq-PSACPBrHq zR<|wNYf%vV9q|5_h%zaxvhTA>l+0BM)m-%HzMsKpkV!xY7qCYKeS_iw+7|KFMKX@L zHOvYY%2``O)=!S=$%^aMrp+0pKJc_eH`KYq<(n`ZpAKcTE3e%jQSbzB2$RD6YPmaR z`MK|&T~AEMN*}eL3>t%zm7)wOj7K!{in08nUQW*5-o7NnchQ{tkjsWL4{?im$&L;y zRLLK26y!dC`TUkr2zyD7xcW{q0=2jXw>rC0yrB{S`mW`F69b7nw(keZ^>$Z<|HDvP zSLY(A_~}MvBu3cBp=y8a5MCkZZ3u>QjHdE~~;1 z=>dhX8MS<e{p=ktZ0b$WId-s z2w`}Iaf~CdwtRncCRJ!!Z=DJ`CUU;jhws`3rAilbi- z8psU7F<U#$zW1AQlJcqW04(qUfs zzeuw~lRy{P();{zOf>5Uj(@vQMU1WZS9SOy@*^?J558+VTi=8ukVRq-ItFZ*P)6-C zn2-qp1k~8@_gj>XuM<5c8z|t&eEZDCw%5GTI1J2vXKN(aM-{+fy{Y&z`_VOu@ehjs zZoOh9>3SlT)O(0HLc*1AeW)D3JoI|O1zj{N%<61N_^M9K7KC5H@ug^cbK8GubK+He ziZt9)?ak_{ zg#;}vtu41f_0NcmHEG)iEpM^>Bht$o0}X#u2VSxW6fF_;SQA=$IMFE4w!3}@{cy(! ze+Ldd3IHz)(SHNw1XM~qxba;Fxg|Oom{?H(M*|(&l=WczY>d#o z|C8)CQq8t4mIRVr_xK9j&OAyVDOAy?5nfl4lCsbaHV}0ejpjt4s~R|uo^6}A!&FfJ zqAv9Yw8b_MI$=`Yf z%a1I6nJ! zVl!*C4xZ6?me?5OrX;DPObRy+4#IJ#MuvNFdS&|0tw4iV1j_R3=nCp2U@`ALqxA~c zW?+Id^~pGsza(BVC57qqYKOhXj5(iOB6-dZplCiDDX7ZwUzwh0pTK16dx_Jq z>`F2b(epk@`4foAkpe0yph$i1yKz2hJ}^qFPP|kEyqZRb3NE(AU}-leQdt)-J+T$0 zz6?WcgqW{Sfr zOKJa(lG*lt5J}<~55!5MSerkO;Tw3JL_bgjgAerviyBa+ZR?Z64pekV5L zY*xSI1dLABn7t7#=t+`dW7tyg=4mLXV8nZ2Lk>sq{wiIJd-Dg3e0Jl8W@I4~*5&G8 zwtfWeKVfOXLHfZbHJ7f!EZ?~(+8~;k*+RgM8ynuxJH^bzSZ9RdhLn=CE<~||qNB`Y z1V0#0VxUmJroYey4xvsDwUmd-911CP2SxsN-Vg6jAnRt zgkxRoN=|?mje{D~9>o?CstVwzXU?(Qob%jWAsqV|E<8#{#`%r6K4(I-aP7UlNqnHI zF zz@4BB)&S^hmOP8VkVHHC&=PGgB^R(;guefH74AfL%PKW9Z{=L`!eSA7B_z$E`LB}L z9rXuy-53v}gr zz$&$#rnV4<&cl>m1V40h-|aYLDPVdt{Sd*GeX+gHTVk*xJ90f=a!+39j)JTyx7+(uCO3|K` zf#~|8ydWYX&y-CtBXHJvRn!3-w<6{SPD-A@`Ql#DW0@Z^GZE_+B0R5P-4aQr$#4A2K^y4c{LDRSu?6zv6i+15JRnw?53Ue~e znCv*Z=9UZ!L$KtQ@3mdWYqBy`i~AE438REranplz4NnQA9|n;|&ReJQuYZ5AHjs>! zJ}KE#mm`VSENyvZ3vtr2wcVSFqI2yW6V3H%bu+T;n>;f6x*z{0<{nLMQbw+laEw08 z%8_X|^T&}(l_uxOxn8A^CTD^hYp&A$)|T97*ACx@xrO+jo12@$@tS7&K7&s@9u~Pt zb|1>0&=1|}ylG&|^$EAK)AnJPyMCAMx=w(Sh%Az}J)lP{-@z?)3t-TfL@m*h$eWQ8 zvkqUd>eIoHD+<9%5Q#r-JzQ+z8``Cj4{~tk0Dz~IZ^Ud`yB~4pp(3;!c9~rNlY@&0 zi)PFH&GGOwhAZDxNi&p6>8!?ba@w0{DR?w}f0ZsK3;f1_1wl1p=zi!H7<8PxCa-)9BO>yj*ot8}S;+o6^M=>Y8B zchL|&@6Jp(CzmVX*}YoWpN|iUNzGYOz9%om;Ezn*ErBG;TzCc~pm#S~N#pV{szbz` z@?!vQUqmnMD*BRNaRX}KmitQn6I|1AA;cGm(ZKgkey4UCxC$9iEH`ljlBMOA1$;9H z=bYA4?KDv{G)rE~`SB(w9|X&+h624@`OVFvo!G#YZ8>s$Vc`{Xgjh~8;nW7d_+H~3 zC?^LZL719j!sxV>eY&HYk$CzeXv)PSKSbaPC&2{;1vud`c8~>aZn7-(e+%8(bw0>0 z+|BSP3g)-%QPom%7$jqBfLnzV&97vni9m^jpyKsA#HL?IHHDs@uVcQ>QWL(12FlJp zuL=ZgjbmNBB7njaFn@yscR)SD!Y&zdkD%Ly@rKyhm72TqOkPfx`?GxZ)qkHJXhc3& z4B#peILSmTTW*;jf}(g3rdu|m#me~GaW9FX6>8tAfH249Kd$O}p%X z9$Q`x9-6*04Q(u&vJqkD>1?O71p%*l^su|A?@LKF5*DRH%|U*lvG3B^2b5I3>5VJw zdWEffvm#3t+4F!GD}M8h%=08;7;=-LVYu3q<||yAOYo_(y(3JeDC7y`0_DEyGf(!KQw>zf$}@*V`;HB?lA$=TwK`UXALNg?S68Iwe^$!M1Xq}DY-P+88!Gd zMl`VG-&=k4@@I+h->aF2mk+c0yk+FX)`a=%@BA>}tTdnAVu}=|3HV_J41FwbtY7QH2G93jxkLk?n^D&fzp2=454P_#cXihI+cs3swM$ql9qzwcz?P+$8cM%B0 zJI_^|q6tPZHvIbJ z)nFJbv6*B{2V&O3Ui{8aX$42Qn2gCQHf(9hzF|>!gvcz}ICzUK*zb~&sZaEbhV!nP zMn$e;Z8@FAAy%I+R}-L7>130uP1Llh=u3SpZMh$f^BAhBjSteR$o;A~(9%cuF-@wY81)%2C8(;A}pTg9jc-UmU1U$8LF z^B$fWz;1Vp)Z895jDYb-#q@|`8@N2_zG*N)xRsag(`Ra60mKk@g(H8`3rsWzQOrcL zu`AV~m90Vjifc<%RE^%6Ltca4R29wpmwRYU+3j94Upl1Dxzd8@DbN>w6_l)N#b} z%i)2&_W(RrXn55P_zZv1XBnUQ-oVn?6V4X(Uk%o#c}Pup+Da6C<(Y3Qp;Qd^7yK6$ z%M$g6WH4na>NJk#6IQX{S{}jt$@fgDvzS~`g!YYN0Yb0uMCWhBwpDHv!uxl;yT2+F&XwfI zC%Z1XG65EIo8hm~ZmLY_3E(13UP5wrKHvg&)>ETACt%9Gk^5*mAfn81;lS)Rr=+jX zbiI~QiTe*Xe^Q=t%Rz|AD>N*?c=;>XG)$5)>m)b675S!%C&WiIwo4O*`0l6^{ln6HYc!ig!3jRI9lxk}&}t!9UH`57Lre z+I=YR_J~(wjAOE#&G3#g>E2#f{ye3HH2EI~r@A54r&X>C(T0eKH}L?(3fc`ZQTf2u z8(NOExE8CaecQO={hZmV9=gxJ(Q20%N_?@|kItUyfl$t$P6jbyk9;e(eJmUNo{>H9xV(uI57XS@a?1j#9rI9ZMmHSorH-}+@Hr_RO#lCdzVLW;5#m`-?Hv;XnACZ zxbx*Z%B0_~$THm;Rn)1j;w1D61@v>c(pqgE1T<2R_3_dv%heQnv%yWQ1tK`}C319* zAa6-sZB}ZrjEU|ut@>}SWk2bmRB;iZwWZi&o8_c_#WXu!cu4c{1OcaJMXZ~&IBdY| zkA8CGzN(yX{;^#xqmq9Bw;*R$0v&IFq=wb-$&AtV{JUD;AU^>j6Qbif#du95k&8Dr9}{LK^%L}=8g@Jyr)iBdm>rr5;i=`k(T5~7;B9_PX!+hx;S~p*%w1rY&SP2 zS>RYKcN_s-L5aB=LbX{Hx!v3p=(x`OZYVpw|8Y}Pep5R1srCJSgoWu2zVh~lWQsPB zjG06-rqB6xHxqB=nv^HIN!#tC;FdKq=*t-(yS=Y2x5tiC_Y9xtHfNOM!O ztVBQh3na?6`lpT@hDHUBi{kHw4~W`tPHhkv>q`CH3tFEuQ%W;n^1* zczYdW`)NGF>807c@{}?5*~5qZWfHQ*^h68Fx$kbw?LIabd8tvFxjfThf&u+mLg@}rr8fQqI2^Dmj z&TGQSt&rr>KIr8aX{sZNzt76&$;SIg#w+RdAH2%_eXw{20Gju$Zsxh*C1=R)kw$m5 zV-?60aHAL70z3$kT>Mfk9! zz|O5v>o6gY0fS&|Ps{3d3@fLBkPjYNwfa+{f$YZla(Rfy)9wJ%cqm#nqn?uP&crX> zEDIblWn8TV&Kw!P=P)e*7wdUJP08eg_4f=>7%#AdGlR4YY9>}Xx}2I`c69Qi^2+~8 zS{>;)kulOEyixiKvZC6t$NjoRBbY~APR`cjRod36kr>fp@@J@?@&h@1UQRI8Z}-i{ z0(ygBl@alBsxix7X;qT3I=Rn6L~TP#%>n$+eDYl%fHi|I#jkNFlMOFn`H()>sJFWBcYMksf@{@L z?gYAaN6_#xv!tqV;hx6(7JFAv*z_)y5*s#r`eAmk=R>nz;H}F~pG+=0b`4x-Wvbx| zl*p|{&Vvfv@ux6JG#Wh&7@dqkc)^W(nWLLr;O$t1XHB^3L@of#3_ZILZh1uyZwGWX zV%UMPE9>Z~{9?S_K5<=1UShI%b_);f|BY8TXYkMk*`4d`H(AB#!`5NV+~liopIrq1 zlu=i5Ngcj${o@mWem1vVL~4V-VlFwnUHlekrJ*7&0gN5KSbL$|j!wvTEgI{;%}rjd zO%C?Of=>ax-98=YV%j=g>fVTa;GRov#w_lw&OdA4){8}5Is5R_*%+~MU*kk3H2B}* zs=%0+N1N3x@{BDwM0lUMfFyKwKSm;+H)E{Q^?8eQpa^mk!B=7py|tqzx%29(Y&ph? zyqwT5D<+~Z8p;{j@m^e!T4qxF+j)bMJ_wwdk$RD)n~Um`To(F0c9ts{~zkesWxA^8FA|_%%Vj2u%udJ+q5=1Sv6}OCOdo zkCYZ1wmW}j?O{+1xa!)tU*kWl2Pet-Taei1X{7nP=vH1hL`lZVQ%ZA-b@ zW=)$~&0V#2?b4;lQfeX{l~&iRkzJ7F&;@l{C1lLk{yijPIPzUTjU1VWPgc#op~98W zHGm^`9+r06*)9=1GL)!X{Qd_wAi2iW<%2l*IAbJ$M+P>6@pT*8p`-a~_D7a=55IoO ztFEhUC$jwaJ$)?n51HF}nRVB1L@+C!C@a%0k^|oFefoU%Cf&#Zm4I;za6E;Z`KB2q z#8Cz?xM6uGzvw`U4IeZ97&!u}tQKEr{R9Mm?euhKezCdJEnQs3npa|BP9F>Nc%bNg z-ln|ValDp|u~JEVnM6I;F?XBTFj>6V_G9-Il?-IthFzd5YMBXL%DE*5dQLgal4=lZm#2yN&wPOetma!M=QCex+g|Xmm zAgPu%&))XUWFkeBGbR<*+zMeJ6)R>p3^UB5ZQ<+4Y{ylf$&-39oi8Q3lirAQIp}py0T_dGhjQ^Xj()y8|pNZ+;mT-fob@0!0PR+UvKh#HnE#? zL_f~FP(?DXN*F=xs&3OYK0@H*1>B!cH&Le|dwL~hv4Oj}#1rl|5s8SA(+CaS$ z=-D<+AmY10Y}el_AT&oYSa|cy!?dW7^c+cmaQET+Tlc*u!A|^M;NwG^!ORjf&u`{a z6@UV4Y4so_Cf=IVLK=gSi^GLXisp@FFsPJ`0vixrdpn1jty51WEpuLP3s^iHP}$!z zbnf^?4*GIz_YIlugazI953-BlLEuDxYPN;H0U%n^j~?!?a1ySNa#LXQ=jc4$6~Z9Y zKqBkpa-3B?gh~AKAOhvtp19Ah`scs81~|fh2a~>q*y+urk?gVwH0)1OIzv!l?IC{6 zamQ=8NiJ*#L*n{^5LlnP`*<3~9irX#!nM`zc>wB;mn@#eLm|}#J^tVO7A<@V=GU1a zYE|tgWIGL z@**8!a_AShf}3(PKBi#?7?mA)za8}XNS7+k1%b)hs{cs?vLl(eY!|gqDEi#x2}rd8 zP#ulgHf-YkVb_b?d%jsyRIKsy6bQxTo0#Tu;F03Tjf&vF>G*gXqM@B}^Rm$Bz%O3f zrG63(uz1`9KCdeSE7g_N>(gXa2NsoDAUh49`|y5;%^=&W&j!gdYX}Z^mL^1T8EWcp z0^Dl_O(6aG_ww`e`3#r6KBZHQzxrvZZUn~j77|OABq$twdg8Q9BK!s=%L4D@fMR}W znYFJz==Bp8`2ktzGdn)}MW;(OtU!5ijDkW4uPDQ1#IJ`Zy7PsJ2EYo+s!U#SkMjj} z8nzn8MXcs-APbwI~T zg}2U|gU7!%SD$Bf!S6iD1t@VET#JRVq*&K?{QL(!WJf3M_F6h9wOaIy4kWaLCOTps z78u-kuA1>Bvq~$4T@H=EV=t3JvNuJx3}ub!WYg{p?H$mb>DQA=%Lp#80TYjHii>PL z2kI-*)Uw9!W!`+tS)49^u|=u_m_z2G6Ym&cT)^P-_gl3n6z|qS+R7vprnfA5KWYy& zm%TgGu}oX8nKNRa4`-03k`Mvb+9&gu$}mIxEc+vcN$nrTZy%GUXP1_Azh+2B4cCwX zulg_0oba~#Xa6w^#%!FbMF#t5txYollQdhEHui~(^LK$$OL`x;yrJjkmcZIJX= z{h+R2dptrkpJG*~1$mbHkqXA>y?m59g9&%>MQD>j;Ag?#-edmx;L}gFDNi(SU{mKB zZN~^2<>ehD`RYVBLyS57v9I4wm^&)NcB~VrVAqFuDQ-ZzNiPF9A=Z+7=9c0)EAc6D zx4D5zw6;9~e#N>c#(>BO)#eXO`$%`^HY!%5Fb2j{onGrMoP&ZX379&{C}Rq8h<_eW z)pEYYSm1yrCxg7~#b&}=fC6pBDaNv`shEu)43=e7jw^l4vdW=f$&G=T-%Kue=7rzw z2OCT;8mfIj|1;|hPEkh1+{1L?5tYblC|clT2(z}NylZT`8VeAbqdiR0W3=gTHrjZ} zww%o=*~j^r;LcxD`AIN5LDP?sN#Io;Q?3DH+Aro$;tWQi4AQ87GcB64Gu7nYk(g$b z#_xVFcJO%h_CsZ9ut96#OAk}<`s{x#OVc_Sj&>Hhpe(3BnAQZDr&~*UUC2%a(CrDA z#H)Ef3T)zW%POh-$vVN4-%Q zX@2cqHCPMJ&S53_sZ=lG}Tsa zi__aQ)7{~TWP@|g*TpJ<3TNau9W;IETJpd=qV2w7eiR-%ji zrvLNlD8}h_S;@k{d~AW2*Y|!Nt%y7#;)||#HL3rZ4EX#<)-l6cLtokMhzOR0$O#14 z*MveCK38D_W;MIqaR)Nr8KUrU;qYmQ71T)|b<;0muo@nCXt}v zn#k$PTRvGnXj-siN>%!=se#Gll^%xAn0p1GQIzvrKP5Q``L>P)U-OBp_k2M}Bm~OK z3YE-~{gO;72Y*9?Bzv&3sBiZ+lySa-aIE3uH#E9yPMUaZ#8mmcyQ7li>QLEWDE z|6~+itHZ4CuSM|fR?IQ-26uXoXz#CnOzKeo9n@I~dSWMNZAr4Ab%`Y%aDHP2)4Ko5 zn_A3pojOeLnVBn&c$f z;&kd)29SN6cZ#!5L6>S#3A|~ITdZHg`FlSdKA*(^;PEzWTU01E&1jXAr(#(yx?@7% zOCNQwS@^((;z=?xLkA=5eY4PlDBZ?mAE$f19T8~EE{1@@BQGgfDe4;g2lP80oPU#U!tuHRR|iaxGsza zZmpZr@bN2nJmOR#ly}r%y0rE&1dY+^#6H4TtuB*5(5{Q-4M!?KD4SLeWNvOA_MgLO zG=XGb+@MffJOY(cU^mhjF!|;zzrGpg=EIg)`W1|m3_==9? zD;e)MG}0eN-VpdHyhDXy+7tYnS)I1H{c$opeSvT~stKYMd$L#f$rhYUj2;X8zSIHI ziW)#wYc-$ijhdZxvVbq~#bhkmPy8NB$`5cvKfzZ?5Pte|bK9PUD&;K`#Jrh27UeqN z!cJ%O?H{N#s-ZUUf{g)4XRhH2dmU5CW0?AhCR(C8Q+43x4)ve<{Zb{=BjTVt`eS7i zC|85YtT8PR^0dj(@RcYT1b|a|<30Ob_$JP|&sl+NE;J~7VL023NwQ`B_TlL)8Mx^G zqOqR&Ip2{?%Ek#BoS$nw`XpZ5?Y7cKgGLndmDDdb7}|HaN>&fqMz7)>lJ(>+!B;_h z1Yofea#ajC2eQ~fzu-?@5FRsyzhpnEfFB)tMob9c$E7@(l#UBEJg-f;>g}YB?mT_! zI}*OXdz~HOe3)YFkWBCQ=E0n%UKYTB>RXexk-*t~U(AR5(0A)sWg7x%e3d$ z4Hnkd$@qFbgZEiU22UoH;)X&>=6`QRxQToVFl?0)*aJkRS`^iWpNT^LyC5~A2I>3(oDPP^*T=p|p>8FoV9MhnKS>8&Cp z5O~q@dn;gWd|!+innG!=<%0qLUCo0@oZUeVrWD@=QeUyG)J;Y*VFSNTzf(GfrwmciIGWhT)}D3M z_H17%v|~0Y!9F z%g(($84(P?W7bMD;WdC6zs?l7&Q0hsY8cmtPSbPXm_1m;z_1vM_;|~z$`uH}ZO57( z#dAo(0uX~u{1J{h4!L-v!mJ6X(6@&b_QKMC+!(!0j0Dpgp-v;BZlOi^eUoXH|0Z9R zuWKi3KwSuRH^=&Hsr5}j*Zm=PFe<72LZN}IZ;Qf>A)==3(;iXd=upq|XUK~mc`}4B zgxB=i(8r%GUz}`aQGp8AsMrhj8=4>LTMSBFE<<-ROa3A!fApYM_T~`t>`&*IfR@c9 zCB}+qjGigFx%+GgD%p@-m^2_FW1;yraQG59{(F*l^7L^<=*!Bs;O z+TOQY`pTpzh~`wMbCtu-@0WLYsgU3dgaD1h!+wCd6XUh1Y>SK>{gtupp8?s)i-;Vb z4wfgxfQS}&M6ky7s9{+>u@k89J>3V#jqupA(Bh|d=Zr`=*-!nNNtQ7{P-bV>N zP||ppK;QrU*O;yy1|jgZr4h6Ki8=niu%J6Cy?NY~$n1J!CLmrB^EyFjU4^+;qXAp( zZ8M%%SmOg0adzoUCBx0|e0LsR=RGa?;&9d1&%8G#s2{=*uYA5oZtmOJ{^3)!E97OS zk=}W+OR`G}@P0QS)fY?%BjShYmDLa15JJqMdM%>XrfDro5T{pJ{Bx(L()_742gW~l zOqlC+lBlDzwbL$`K=<1HT0Ojx5hZy$w~j^wb`vHGT;uD_caXO7{sf$!Nj`qFf*i*S ztw-$IssF$hy0lm<9G*a0ej-DAqY{qJ}iB(2IfzXC5)D@zn61IfR zY-&wRkMHyZXV#7^EdnW60lc80R0Spw8}vC_nr;4+dDmnZXuse-#R%*x2ZR)K)L!D% zbBrdg?rig80cBBQNtNb9C^K8L4g)C@?ao&wL4QRf>9ZUjB%ttDNrP`AAT(Q+&kf8O z;V&v~ykc2yUfI`2ag$ahxC#A>U*ITf`?bTTI>ZQboayan{qWcpWmUNdRG>cV&}T)YB=KYK*$p)re?}5NFKydPM#rL?f}bbVAH4k$nwfsw z@D#9w%nS__B@S?JS-5eb`QeBvsfjEw-XHP3tRNb8RJzEh5mk|=O}zRk^9NK5GhU9l z-X+JLcYJd@(D{|U*mmUANj;(c;pR-&jY&DF#RxVBD4HMB@dxRff)wXhr{~D`ROw-O z8lx2aU4S&+lOqQ9_TMGj`PRi!N;iR0=doyLAu^V6&KH(;=aPp7%F~TU?9)L&D$djV zd_l+Jrfvo{rQjb6+|;Us=D&HdEil&{U)>Jy2UsmsjEJt=lAo@bK0d-7aAM9}6CJ_C@ z^ewqFYb!ZRwdPxty@)T_2^IXgudPEP*8GdZfigzP)c4EbC8)061cvBWU-5PK}z(FgCBWfLUy7skZTT;)tpVp#FZNc9+ zZq(cmHeJp*qSS=cUkv!xs~y3P3U~cYfX(|wsgjLS$ zMNuL@yWN#~(oPdXfuv=Q^5FP0&z3o=Ls`nGyhAvHe7h0fTOi3FydV~^@U(7FTS&UC z3mzvCUG@Cdk`L=)W!EkuXu0&`d zx@@wph*{7|33ty0i4RDSYXTz5$$p+Y1fqBkLjg9SLYW+_FCUHuVveePJH{G^zf{Fv z-H==_*QoT}pK$}EQkeSh@UA9t`-oqPzMh31tl#+H-cdT=4P1YnB7v7JT}cne`9Va6 zs3zt=i9Wb`vL%nuA&x#om5iXw%zM;NPErU)0t|+*)DP`TREIvI6k6GF^0Uc)nZdvd zLF~ZAqV+%DZ#|aa|8&-k6-f*B|)4>h24D(PyxC#sBNR<(CqaaGWzu8AiYGFN=S`iV_{)NNNxYRL!#!sZ(WUBH&_Q@KNe#EK4GR_I=lS)Vx0MO7 zI59D*PPNOAFUfm+%`}%5W~!;&cBG@mk&n$TEv_QB7xw2DH{Bb#EY{p$Ps(h~5*fLq zO>2ibL<{j4Dlh>m__WZssmLkYK48M?l#9vJQd3`$ryrqR;NB4Xu}MGNO}%1jp1o~q zDK575ezUi81)y{0J7_8oG3E}jCf8Gf-FnG#=G?7sm&6yx91$T3Bx4`JM@=+$QG`L! zc+F<@n-4a@;U62wf#ifM5~FU>mLaO$n21x8iA+5}t7K}|yZqv-H{V{cB=i~&mKSk* zSmw6C?ci6OF>_lJ+|lAMU*{!l?DOTz7yFTOF#@T|+#_q?v5RW198XO}@0LJ(AaRUdoCY?N$i4k?Ui6 z5P$i(Klo?MJG1eDRr0FWdg#2sNe60Gjuh{`a^e3gJ`Yll=F}tN&e#*0B;h~BW77G| zJ3>A@5~0GzdUFMs*A}tOt5#zqYF@J;_=`tfoNke^>g`bAnhW+7T))VQiVATtF|k57 zcXxHDQxYr9{cBtCdiFEmDE;th$e$famzF$HoB3r_`SJ^Fps$*6r$BQqfP&clUj2w?N<)<6GQV)9S3PA^uioM>}j-!|FSwiu0i^}MpK z{f{N45pYiiCoTWt7jt{|i)U@M09@l>ra?5=J4iCpef^xiX)#Wfn%Lq|a>9^cbu09) z+fcu_ZmE3uajOw^=%zE2-gn0Er+AdO6T%QwzKm5ze)^|kZ4IH(D>RB+zFhlbgkJ#} z)zwwvs&o*f6hQ8jwO@gys;75#AXeK=XtAjlQCf%4I+dUw%)YOpl;TRD!FrAq+t+GC z+MxHEl0e9lPwE3-8ERf$kI4a9NfUlv zhOoe!lOBnPE6=g ztKel`evwp*7y!KOCfhnRi$O5{3-QeQtyYvG-BN)z7yR|tz@Jb2H6k7`XNs2W?K|t( zAXwb>2_c|?3Z;2a^2D?X`_0( zlT#ujFDxn}BSZGIwU9A%XK*c*s|)kWwvss81Q`@!`yrYQfbI!u!Zi-QR=~1oPBZvgX=o6{H@isEvkn^OrBGhIKYNDh7z6v8z4ZY1dOVNur9_ z)R|rs?`QT9r{oCR?NZZ<9X!9=m?AWa-!VzS`(4h9GvzB#skFM-Y($2+>7>QQzb*nv zJA~nUECX^53=Ir+MuxVP6X)Wd>1=D=W8WS8G`4hX?G*_QMh!<)oV-y^uA0Q`91~RL z=I28zO-*Y&5c>K zwNFMPhWdWOI~rF2ONg>a_tL!{zzugoq0aEaC4b(yT-S2bITJ8m_~YPrF~|k;6R>|( ziZ~5vLL@Y^Kkt zZ**WFp$hW{CG5aBa@uWZS1kYja6(i$l^JL?E7uK_^Umo@AAO|+-_+DA`|(=Dj#Do^PAg#L?9&?Q`0Nz9-}tqkr;apGlG~4zzV(cQ}FE(ZFRC6 z7}koE*l{XtI3i5t6wIg#`Eo?j+3rHN^9ZO5K7S1^;0^R;6=_1rE-nWrSnXNT}pc7GW9%X3Hv~RgO z^<_{*0{0f*P7?G;tCk>&-xvOOnkF9VSJm6F;CNFu7ZkoPFyWVmdmq3BnNm2G`0@W( zfUwL4kR?~wI{c)R(w>IzPSy%f$`3)~qrcbgHk2yF$$)nVa_-d2FJ1oaLCsh2G>Z%&nLT zw8m)qtnCxyS>2TTRm2qk5<84+Mby^H%#joV=n|7Jc`v==iwWLV>eeiGCT|h>tEKz~ z3dhnVaTNS9Z#vnnU2{%s1Zgo8)e$8Op8lG1E- z^~v!s#BD%sr4F!M)$COt7OEU*$)2=~QH_xrhzCf7+NW5t4eUtz@JN|4D@v6Pbk48q zzc~{>cJg(jK(<%G4PleyCUl#f8*M&|6()}zDDZJGkH{(>9w-K?{@A>CoTX;M0hl45 zLDtqOhX6Tz7yR|b=H}){-q-5x?(ST$fjWfWi#2Df@{X;oc>?q5X&o5iwi3AHYXrXE zzGKNj$^XaIAm%f-Km?!QRrS?VL(Y2Fir#y)U);&XSkwcJ^Ve5DnXn-SMT;&g=pv#( z-c?PzF9y7!4l%#wlR0DB(~VLsJSkjhxHntJ#0I_Q!7(j#SZw}62zvxC4YDAy@R!@) z&wq`5zwh4PH-EC5Cz+hxb9UyPIWzA7mDeAT#(mn*Hr(Gm+bENORkycC?^xI* z?8Ii;%GY{%dv70f@|B5>Odfdh0@F7h)Nw-+_l zf%;{Z>VG=W!p}V4q=udA=S58^RgYUc5-;Yb0wjV6P6=ZZB}AO$R)yMM5@N+D zA3RyjXYrN@r{SAUsTtDqlLwM zBB|3zAWnc~zWu_N{0gsQf#CZor6C4UGxr25^9g|y%929{P>qy>H>%;$h?kEKB?!S|Yy2fJQn;Rb{g!d>g_`j0!9g<>x_X9+TE+H7Tz)mgD zCN|N>b&=>;kXk*BVlejxw;m6_i=|7cjAO>iEX)3JL0ysl5OMy=hV5ig!Hppg+asnd zgW7N%>x{Z;sOKFVxhZcvqbfBlipe?@82@O^W~Sn^KeI~2pSH9sEX<{hxyj2XZ=}>n zUvj7o7Dd7yyBs^yj9jJv=p)6vE^#U4h3&5%-8vLzmQeaNm&tW@{Z1oS*RhZd)Hji? zTibl=Z?Rt6P2i(x^BN#nj%6qx_0Mwnde_1+2#%4R4Y|V4g3~k={=G7R9G3P*DW7G^ zm~>v))YLNQ|M+39?-|n?t|IOJgO$F81)r5{k5~rn z1J4DzhxND(w)`t-pnaBf>Q?nx^m~6hevz~Zf+6U*qKD3%H!U}-;0JJ6Lhw~6ffQt|QC9kURAak4*0x09*o{T*qK-~GOBSYpTpHQsp%!iS;+ zP5-m3o5N#fM`4T3m8Kh8Uq>633qmR6u+8tpo*Z7`4JF2IV7aPWt=FEeT#5nb^kZ%Y zQT|yAbGHNrf0loE1pqWB1*aLzca2~tp9hAU{4bnEwBCx$&^M`lBPr_07X*&!jDUnr zU)J9N58coC#wSTTF62RCC1>(OBOv_xGk(dppGxYI4HH2MTjT+|Kx*I5j>%0iA}bP! zL%&NOzFIb;Iw#MUr>lB@SCP@KH7W(da-aXm`FNS5laF4nZbXWWB6YgEstSm}h?Sw~ zMvaaZCii~9)4($(!0J=+uE#S-<*0^ZP|oP2cS@RNi{JeCF{fevol4HS9gonQhSqq9 zn{x@XW7EZc5rNzEC&OfGJMwoFC(9!ZYg{OR)XDKwIHM^FkkW;XD?84Zi~1itv-?rJ z{U5mj4ka{ZyjSw=&jgcx(*KxRU-|es$cMV^=g!?;L?_4IB`Gi5yeU>dJXrc}DVk4e z5IU}|C3o*G*q?J}W@2K3rqSo5cY76FWO})Y3j%+RlYFm!4}!6czEM-x^6<+K2msRRXBC zO^eQLI=x6X*4ODxN(^=3yKhGQ^G5xNF(SX=ya9^W=0Jr<#)50)btyRnxmt7&xnlA4 z7AgdH@l1}-zlgiM;EVwCAxQv1PPFBgqEbxK6H0sDL92K7J9omW6UWfYf@hXrc-w{Q z|LBCd8KfrhqGavy7q4W3BK-%7jLM$R%*@1c=W(J2B(U}nRNV~@2h;m=!>&5;)@*rT zeJNJ{*6i@`!ROJlaONYB*C;Gvjezy;4DHwz7*xv}*40!9IkNamI_oL?$Q4o^aYX^P zet&pb8;`B$3s8^}g(Ur5A~k+T24wLJMIalsq-%`_yM?-rEkLKu0A;TmH||4AG(XQ? zPk^B=IlN6VK14A;2XucjEXsM5d?jCda&(n_`=I^(?$NupDAr;L8{KJnbcoL5nm?Z} zyVw9xPji6Q2s)&6An|$z{?LL>*^u;WJT;n}Z8_)3laEI?b*!b6tUa|5NvN0laF`Z z<;gUYU`z;&9G7^cb3swB-*))!mAiZTPM7;7Wd6GKB`Y8auX_`@Nmm|gq1wpo_MkxD z&oJfQ8hf$`pc4?ldHFImjVh zi)o*Vn&5@_ZoACN(T?byXZ=hVcd*|e+|6+?g~u~nzgrtqffW)DcN-xM>SSE&PXIgp zprA_MWM{i?bsWC{b|YmzMSZ52hyb|nE>+F_TymNGc^Ak^cu0T7z}VxtN~miVDY{0f zU^X$Pm#Gw`7G&9bNdzSM%P@6MGU}F;3WlJ-(!Ig`lR0hGqsIMxPWUp*Gqw0v82>gG zhlU4j`W@^xo8)3|sV*h?=f-Li9iiow@8h!( z00%V`hyv*o9#@3@`Qd%hb8qpJ-#>NFI8cZ*BXr=(|_`XJPHG}@96SaUvhvBzSc^6nV(4) z!zrAiJlJQDqzXpM_}rRHlrrCB=10b=_MI*QFc1f+EN@qD%}e>WDeQo+m6Dz!Xd`v$^Qgm+c#Wy6&KS$=%1ITTN8x_WN&y~{ndB#h(uArkJ>q~MRftzs8 z%*x&ce{lU5%ABByz8U_lSL9aA7>c4a9>2Ny`*I8Ha{LF&%$C0gmhtLy95l8)-ykO` z?TmG>d8-c%!zot}iq65bq5Y7M1V>3ipIqRU{wJn>Q$OW@8Nxm9xdr3z_( z%NS6q%0K@8hC_i`5SL!tk6f(mqKu5wbN7d+2kAWKvAK6+a_P)}jyX6$@8=9!wg`b1 zWa)#9&=oRB651$iQ)b!LaFe&&@+FWT7}6XPTzpvE*>HSRFx7qh#Ne;OfvTlv$x71d zX)SyAOOZcg^vavO+t9K;tRrl+<{oV%iF3`O%4eo0pye#GcQga zy`I=t{jG2#>SPM=GU?fQ_;SY}pCkCObNlXW1zpVzU+1ST>=OkCG;S_O-o)RA-~XQN zJ_Kove4jmbL;zdG&d@0$(cg-id>!#1!(93=m0M3k88)k#UaeKpVC1AwV8lW!=vh4c zYi0bP^w`#l;k;N1pTsZK+y=nYBSoxOZQt!LQ8^V&t#~Lfj}YG4{WZq??>eDwu}e#? z$eFhoytXatRC>!e>yN7m!yy40eH(+eXbFexw9wLKb0UpvZC4RBzOD4LCMMhMs*l>& zuS&5{0NCULrC>~rASL0X-7psy_FIQ?cA`NpgQToh=TkM)U$#wKTpzYY)37MdPdelz^ zc$2sDGtB6z@1X;s%eFsvf&m*ZDi+Zh9 zD>P*~Md?2E=l}_WNIj)*A(l6dNTcwL-dcGJ?&2 ze~rT*hw2V;f(i|OLJTo-ix)A^JQONU85{ee$W;>$W|g`<@gghrzV@brBbr*SP>*dw zJTdC1%_O|=A&|4*cu`X_Ywqm)UPiHBK?x{|`v|fB8q5^qobuU%pkH3#?Ps;AZ&M>< zujoCr^IvK54tLCwb9|_A9d{}8o9rV?+SIYW4DH5VYqS`retN8LCfSjLL>@0v=X$g9 zq3^RqxayJkM{dQ%waB%Nl~A1hWpSbevIyKLFlKuJv*b?g}I@Pb>2Imj9ye z@tdJ!o`~93_Thlg2lise>aWOra~^VlSJnN;q(_SbGr^SX64r>R_bt zRgKQF#Qm)D6pBg-E??!zbBW(7Lmv1eQ20cwx0m0A2TE z@V{uFw*38bK;EaHuSC|8SxF(zJ2hG1H838(^o%Jq)9c+nVBUNLr4Sz`p<%2-#@WVE zDt;18OX;jb7+nkPpQ|jjvKHFWuNz1(y;*$Zdbn0(^z!)niU30GhtN?D*>UM13zcb0 zP2)AveV%*oTnr?>^S#x_F;^iu5>4#B$Y@a>%M;Q8%FG_Fbc_keY_;9;uhRMuL6AA;TYC5?X*HtoFQl^~W0Fx7 zK&}XMXd%kCD@FlY2BXVp=$I?M{4l6Y<8fc1 zXO#A)`xD&5 zF4K6o%2l=>Yrk%#k(u1U0iSmC8cSck#UIy-61#6j#ZZEw3%sK5zM=uzB&o~X9d8G| z#N05fF!)`R^d?w&ZbtK3R(MYQP_gTU_pOwMyp-=`ji*f)1U1*8#)l0Ajb^~vh}9*j ziPhT1w0o9VM$pR-@fkIJSXzy(_*ogm=*9Z z-Sea3f0L+3kGL>2dTs2fxj-YcuX}B-He9`B-+Oj1b*V57ixh^d{Hzji4*T_UysBSDL>gn(FO$ z&|W+!ya-BcjN5_(R}`_<>2I$e=jflTf~KUEFJZw|$eJnR{q6yqs%V46`^Ww=u57pv zcATPIj}t4d;o3l$Mq$sh%^|4b=39=U6C+wepY#2?t9yX*X@g6!9Cafz&|KY(2HQ-6 ztc$DDiwN`xAz*BUzc4tR%*%h$KzmuZdL3!2O5|fUhyN(4iwABkEE@UB$aA236aRSp zrMYg10NnT%o9o=8lH3apcPQC$X3G746##kn53jSZ68Dq?uV&xt${Gtsi7cO3ePe=P z%4%e?+WTTw!(zrla`5IluTIA(^`l=Rp}2w+z)2T9$Bfe-&hc<%#R*;bsIh)dsQLk> zVSmiLp5%yKd&D|#&Wd}5`)|n<|E&miRHju z5%+L66|SHX%sf()-aKxfqRb-i2iLT>)kBuN4`Ajd@+j` z3e4EFQ-<@tOLXPStC|Lotwa+T2g^!J1+O;y*$t3$N(EsHrSlDJO1Gf|R@X3`4SSuB zkqEf{ajpLmW!^AY??-UCx&w(?z4EEd)K@Ad-KT+Mdnq;YUe*R-@77WcbfHE0c!({S zksWeIcGB`(xX9$OA0$?A)L{fGfcW?AVkJxtAp;ezSM@T$DV5Ze840T2iP__bH40Xb z=?`|`R`APHt}yD9(6z{1RR!jk%$>)lJL5=Yw?G?tDsO9|8+x|-#PC)%ozZhCbS0I@ z)z*o`oo-7}07uL`*%ZR{a;<)-kV;(I3=60}MstJWeJ1^{HC|u?@;=^j{>}90Nbnzg z7p+9jS09m64hUd7)aM7dw%yZ~XcQHgxo<7SrksMEkH9SXPc~(noH$s4+S0_6&48v0 z6~Nw}WuDCfX$`B8zwfyzVQAd>@jCBKwr ziK&PbS744aXrSZ;$yE|GpRhI}_G4)l3F0tFB(prAG+lf6HP|K3nQrE6f6fH3Sh2%n z3uxpwnnQ@(qy>2Ms7IuOJ)7eRc#z9kd+n8m@~k)(^e|*zj`e#QHn=QtGOjJ4!y*A_ zc+1n_VolgjTa3#Lgt#v_=MD2q&6vZXiZNrH7_oz2*B2>3Qcot-Kp%FEL;kS-A8@ga zCuDa5z*bSwZMsE;?Z$58hsOQ&eUUqC>%?TkD(H=fg0zsG>`Y$>(=~l*REd$s!~OaJ z1U&R$l%0<~%pO0ReTxC3e=+wA?FDvi`uv8U6Su>i7tGgf*}oh4wb!fZ9I`f#lQ?U= z>^qZfxu?g>JxULEBf+=;V^CU4HvG1*OMNVljN9aF4OlZC?xs5!kfWfN+G>`w%?xPP ztOXF+eko@h4+I0x*%b>1bbFVhVu0m3JrFHKVtgsNVLrUK@D zD$;qqc8EIQJ3PizoZ&Cw{4;+tT@*Tg`)_sQECkF^yX6_kJx2sC1xv!tO_B@5Os|IvM>)plq|fCt}*v+yGZoZB$A{5 zH3AA%tfy@lIHEIm_Qre;s@|j;-O&cTp@QNOK2#*g4qR-xAdv2Iy@9#&9gu|-cVig( z`#qi*-gLrtD1^C#FZxP`J+*>(pLVt0;zEjE5bEVb?*XIk14PXv5P;fk=KS;cuq_p` z0ch<2NPh za~u*&Mu*CZJzr!4q(llLn1|B`t6ksz5W}N;PfCQM1gEk1z|%3enx|myTevN(8wCyD zBD29u(>0m`Sx4L+!iUTBCpS^DiOT`6$X9vNUS(@V$wwSEh5PZMYc~qHyj+=Bzt7~a zIb2R%I}Xq=wnPDNq1$noGz|e(dUbTrj^O%{NFxl9AeC{Zb<$g(i zCS1naO&V3FgZ=_xoY!B8y{HmvtGk!npn!bNR@kg*C5cf{P3~ihwtFK6j}HrA#|Pt- zt|vaLYqOsyi`uCD#j+8z7S; zba@$Vz|2jGr>~GUMDJeIq;FVcjnuOv5%r-?J4_)?tgeFhlAQIsKF?t^@{kZUz`4G+ z{yo$GM}XnA0ZXhs8!9L_alO;O3a^v#M?yjr*nFbo^v3Fvg6u|zy{iwWm?F@eiDY7|1CF5#qMIT$@0drTfa}>a~|J@SQ zch{c5B!wb!Jkqb>X1SXc%B3jxS<3=tLJ)tC@&?N;~3AwY% zAme|rO=hL}=e!?4VH8!z6t{WO07keKahC7oU^)Yeq_cT* z=tA`e=j>%=;x9Qqib z_S7qM3z6|?LgifGL(}6B*vHnPWOV_`)R(VIE@Bsr8N@STyF5DE`?$UHr-0{-@DXTP zAKecmU7|t2_ngX6=XyZqJZJB|)XxVs-S?7KO8^SkZlxHz+V9f>&5SZ=byeoZi^>%J z9GCAZsb&Bk!q}I}Ma9QfIpXwk`w_ybSTn^P*!~Q)@9Es|2W7G%s)bJ8nd5<^RlCWk zbb{A2km<(=BAxF;2@`{-kSg&B+Rj2x(}5I2I`QAEeKbQmDBxCAs-?}z1`|WY7LzC5 zU96Mb4yFVcb46K#%Kw|XntcE*1Kd0HlZG6D)cQq`WbQ6O+n-zA-DMII>HsW?NXiFt@CcR#RXVGM)*ulv+Ps!Qv}Lf+PrT&+%!6GJ}up z3uc;p0=WSJK{{c~Qq+o}Nsquvf>ETVnVnloq;K>Z`x5~E_Zg(e z$B=M;zsiv`iDMTaR${TR=4T2%hMzvy-D&(-8?cdC2N~9gv{C1mtW|qb|HhR)APRj0 zBYa*iJ=_ZkN;+QNw(#=vuKe>HnCHAae#IYk70709#YKZEj8QcyyToY9fhjrfbV zY|&x5PLK1bm#%~`3oPe8QIt%o*ueECG}I(oLtUpgCY6T$GB>o!ax7Q<*WchuRY1TS zsxUb^k?%)9271_8GtVx>yZ`18VgitYQg1YwUYn{$=DcJT&S_RWba>pKKu-h2kQxW` zCRrNVHE7?4i_$#VA_jrb$28QrMeUh31B>CYn(pSIw0U@Wb?>F?vUjFnCAk`j7`v*C zw#&fI_B-12JCy>y-Fg&VEsY z;@x@+!+2GU&+|npGH5x`IYwG&<{{RbUjeHXL9S({llvoLbVu4R&QJn#4grxvur>rv zwrW~nSpTNEdU~kogaDkm-X7jIduJNc9&h0Uu`r4rucmLR?lZzpWa4xUJMlxi1xQOKUqYtGL*>3ZLjbY5t<6uJ18$ zP_!FEGOEH^b_(jtq3upqy`s9-ECrd}Y+`f~J7Y4+$#`Z>);J!pAOsxO$T%MUeW<%2 z4ervGs!nKz5txUrUCh~8=b18G~ z$Cw@QWHB~t+Jn#8)=sDAlKK0duta%GSN)$u?dXK_N_ywRs>PGO@=VHI&tEpq%`4S` zN3Zrs;ZPJ@cybvq@9LSm_1S_6P-~KxI7f$>Os_os?aVHex;7N!Q8Vh>l{d{AEZ(9_ zD<#$#KrY0}CrA5OF1;u=`TeZ`|-@2>9`;Of?`*jk2JvA)pQEqN)@2Ko&SeZs2R}t7|cZ`1tUj3m!?n1ifD%w+@Nu)^|RkJTHTjK0BV8Fl`)v zIXO;ni26#N)vbBui#-l((LO;i!;24W3Y;2=0Nr7GM<4mGGL{*V(7|i+(UcfJ^X*9f zRMJ(4{Jh(a3ZNH7Z%7Nc`63DF%1aCZDxljsOvE^aOwG&`zUuRPa8!#eVxTMirn^L$ zv_nqT(+!{1?~A@!?v$|dpNO|`2};tevzWBs1#$Z$bJb}LWU_QDM7v*GVb58spKbsJ>fGQ#@JFX)J!|!WIr9DX`A9dlfox90$b~h2L!;DM7 z+N*8s8KAu=QTX>*L*BgafvJ;WS8~>sbpj|^b+mGXy%_4|$3#=>VfX1?LsMs|rdHLY zV8)zA{;DBdASSlm9*H|8;YA-l^woB| zZ?IWC;`-1_Sd~tqIt93)F-L@SW3-XY{=SJ37XP041%emJp2*6!_>1;x;gix2(79!r z8~q6B>8E(P-Y!Hh7!z~35T8j-6)E|vW0m2f{G-cVXPcm`n$&{px%UnX0}JfDX&rUU zC-<9TA+FKt#izn}dxL*tr|mcm?>g=l-zMy@Rh3mcx0<5T@+Ng^?#mRVyN$`Y*lvX! ze9mDc^vz;XbqPQGda)Pnzn|e01?k-GIs!BM#FAEn$hDj5mBPTa0jl3^@yBdLKN4D2 zzCd)lEW(4;{^o#&?#_~(0VMtLf%K4CGX%(BnJY~3ydzmX*HstaC0!bj=1453nh_Ch z*TS8&n)6npXL{|=+ke+R+@xU2AUgNOb+Nz;1{?jegKqKkTgg?GYyO==)t>@4KF8D@LEv-IKL|1w|CdANtafvEx{Vm+Ax) zu@edV>|Kjz8x z+1CRKv|eO8-BY@emPDTQXhu#Ot;>+_v^pV%_Tom}%t<_BwhExUHb9t{xWytEj_u{b z#YWh}P|lBk+ESr{(C97nup%1dI!FM6+Yj_L6zxHk@o!ihY{+otIphDFAfK|3Dc5Hy zFhem4%-!hZH-Svx;|;t}pp5}HNj?92oNSOI#FwJ{-;3;3i|%vr=fz+!9&mh{97si?_0Lu$rXZ7HTt%qhARNR N)KzrQrAk(z{{x2%t=j+q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bouncearray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/bouncearray.png new file mode 100644 index 0000000000000000000000000000000000000000..96bd00875cd7281b55611ceb563730d2e77c6607 GIT binary patch literal 35950 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/divinationsigil.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/divinationsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..598c297b34300228b49243c28a6c123e2cea10d5 GIT binary patch literal 33324 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/fastminersigil.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/fastminersigil.png new file mode 100644 index 0000000000000000000000000000000000000000..76d20b23cd4a4c35b6ea5b485cb9c24d1cdc191f GIT binary patch literal 30009 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�%q;`J zw$OX`<;bn!5PlL(fzM)`x$AqqRVa17PH*HN?-j2JzFU*c$qK-o!{S$Nv#adGE%eKq zE=j%f2T8mZ8$GfG?NK1C@Z>k%r7*?|(^UyNsXraWDGYie;~?}dkCq)Z4>>qaoz7Q5!k-5B$x6OZ=5ankME(!`&#G{E6{1UGRg7iY8VS3773q> zx@u}a(Gn$9Nro+nE{8wY_#?x{q3A*^S@W~%HOjT!Opv&hxnuk;q+hM=OGW64L`@?W z&j@s`t9? zqw$VufPJA?Fc0wXHG$VbhxC?~#?IvQj;UbiFUd2l{G=~_VE81S?P@oO9$h!j!~s zW-svrn9Ba;{%At8!T06_AAbt_o+l7Lrluh9$7+SoJHo_6Z(+_CQ_6jQdpkcBi; zcIEQtlQ(~*dPcLHog3=}AY#bRPm>Tdq&a!_-+}OVjDpq)GQ#qL7 z-}r^!?J?0>oC07UFv*4`;WNU0JIBPpkK(F6+C2Z8h&Jp`_v#Is9RS`%NHZbpx6TG> z&oJe|n7@r$9Fi^OUMck3s`HbV>n^%*D{ZuFTlpS;*1^1LFrutIO@H~$8wB#jzWki3 zS6qMC^|^ii}uLnvd=c zPvQFmeN3A+XofEoy1cCK@DV(E!{{NDKGDJKD>EB(6yK2 z?E>aiUeU_0H7#C)C;p{FHeL>2K5Tm@QIRnx$L8Zf3@%QT09Ep6Kc9dh2<_IY7NXj* zC!h(d5e1lt>%c6OoKFWumlfcliZdQQ-#;7Kq|dH<`j#HC`Y=5b0qMr<;~5IC0JSxDr}xJf|UaIh`TfahDi4gFf`^rN_|=4<+sd&(AqK((N>MI ziS8}5Y_O2s$%z&lIKjK8pztV6PIj_ppd1~!xogn+9P#>G9NIUY(1cERq3i4CAm$KKkS#qnW0n+w+Pr5>QWR3-faxMySq!6PMES_5^p32uk za5}~EKH_^h&56vfDQP4ql-mp4DhWm~bgyUG7bS3{hts8*3Tp>fsCTOVlI=Uv%n-0LAJJQq9p z((==!$<3`DlaVBS=0^CA};0H2lM`h*rfzy#Zu zbWxy5a$`jXNg_S)O9NPTbD4Hqj`NEhGiZvkt>fc4O7Dzh>=05-yh z6G9Ve0wwKWVK}rv^#uPMetW{!{54zz7Vu1Royh0Gz4eS0$TkC=w0yajv#o9zS$MDh zF{uh+eW}G*c7uYrJCw+V1q5{40SZo`A;09B#`?VcSUzj&&`5o(x7VxiY`?s!bk!kv zP)bSQ>9X3US6PU#6fXVU;wS+k0awyVIJr;o6lp%L5e_e5d^lVB4lu%XTkCW(cD)7O z0r4+~#ou~4i#6J$SE#Ex1wC*&=9sT~{kav^!h>i5LUwbuJeD%gi-I`kwUG2djhW@N zh_a{LrlU=>`FmjCe|*9S!rW$h%8$>F9=ZO!fm9~kzc)}iM$l#Zt5L*kTj*}Ow$lW@ zY5Z=fmCw#psk1f+6D=xh;CGE}!3sh`UvHH#8(`~MifRqMF|56VN^w0GMK&dF>%OmY zD$wl)d*cm?et@C#(#$Vq{_%=62U^q|+C^T&8_;$c`s}eoI%C1*dhAKH_lvrUU2y2X zx)6Al^9FlwSR@4GM5`CMbIN_&t^I849aT0UOz?9-@?&)dUqwsxgFF;3)2W`=0A#)7sN2(Z7I&*^jnGjPht z!wpPL^!v5BQB6!i z+>0u8ez`aTA78|e}S_-zYn6oTlef+c!4(v)Fj2CSXl2fv&en?d4t0t!0~1B0lyH{Wtp7NbZ9d(D>%EQ^=JfE9 zUkrIPd?nu~s?i>^5;fX*HXV;peZPwtyIaZWAW)`EF~o|Gd5&+J-o%qnCSJhX3Na3{ zV_d*_@*LaDW>a9Cl;qv$dp(a#BZha=#%}&fm`E^|xOzAf=Z@UFgR@VKVb$pbiSRto zE=*jLByjgs2HpAd(tq~o-Z#QUc)hl|#elIP-UJ^veA?$`s3SretXs20gyf6fi6KSw z!Mf~0+RXd3U_o^8&e?>Yn`tZ*0mJ8FppRkZVU8z>E-oDopYzgW{hCP?kF z4Rf~z!QXRzMP0ai^5q?$>8!FX{ z`kwn=YQ&1;o0_4|)ho|}g9XqpH+gbZ2|E8vkmFSoRWV$dQRcTzyjfS!$+wcPpPPJP zrTEmqtB74#+4V(@5y#&f1Y(m<7T1#EZ@PC=h*_=7_{J%y|Kz0qwQhgG!v|2@o&BZ_ zAJ@ZrB9kW!6qxPF5)q;^cEj)L2VqSU&Bw`(^LpXLSp}USukZMHKRlP>na(*4#xf9Ur)tK8jsGJ<_mOB=(uXt=(~50@^oO&bu{KM}kUh_}?Z>3x60 zl_TUkCH^5uBRsxT{1?1oOdAL}CeO8C>XkrxPn@y53O`GU4gHTRlrghRP?N#?{wZ9) zaVI#UaGMn#l84#8AJEJ6jLE%6@z;Zu#U}!@)67{VCGZ8Ud6jDD>CAj7Ds9cKjjE)-nEWfyjmu4nX@*)(i{PwJXJ5Xdr@vH zp;f%7a7@Yl7q{!AyjOPRH@Wg2^P_j*dC!vaD^Pu?9|}OnnlyhB8;5VETVHp=mJox2 zzM_h*l_Bac41DuK(|+d%!^!uRzH;c~?FDUz3;Cav+8`U8t*%h_VhG03fVZKGru!5j z&}q!0lZ5H}MN#sT=!l*f-^dV_0Mh79Jo72;=KJaBH*Fcj06zR=bC zZNuR^ioY@UwPv4u-#%0tm3dlFJ& z2HMO8)=`_8n4%WAQxsO|$9N%rCH^{)`VL4%|F6Xnk0mIvcDL+kt=Gc#ZGIP_v8RE4 z@lJ~kMV{qiQfQYu?;$;SG(SK@T7Z<^eOy{&E3cQ1g}{JN7@B5 zlftOETUxayKfs#I3=YQOI_70c4i~eN(;PP(&S&8H%Icr+=gUH<*M?dhz@0s#AAY7A zGhY))mH-a28$bA%t_rn|pTl>H@|K(aY(8Ese7$vJg`*V08$j@*^vtC3Y{!Uio<(nE z8D#7l9(MqWjfj%RxJCmkDgEKW=M)wP<@&b29xU&>oarVM)T#|L`+(viW;HW{RX7V6~HHs1S!^BR0ixVv$M$`RyoB zBLm-y8u-m&;p^6_xK??s5)#*+?V1lUjf(v%FY)+FZNl$6xh_n(`gXF79rO6$U2g}5 zG3hHMW&>p4ba8wV$nbZ1yrx}IFN*Evml8M$zYmGH`ZV!fOzoH~EWyxVm#qhH-a&D1P{b$LXq%Pe;!81c`*EA^}%GAztJA8YT{V(!O24p^eKgxswShH zV34yZlPGddTM-WGbA0gE1TaMXqGTCr*ePiZH%^@25hth)xhM5aU`3RU=DT+v7{vc2 zwRgNJ3qkUgkzA`-vD|-WFPg33__Wsso|}rC>(dC4ub^U+B-`M|jYw1^FWo;+zBr>hWbxmqQP!2}#uXoN<9d|Q7*nT~wxhMR>1Xg-S{PzqeWPQ?*1r|Vw7CC}}78)3GfYP$@`%kSsD(i)v zuWq0x(vB}dUcU1#`>dJ4d2c5OgQ$%C>ytn-Pu56Wz@p4OUApi;v;ICFFZ9nYQ$>1w z@z!6<935x_%g0jKlHn|+VcdD~X$}`CjvPuq z;sZndTH>JwnMLp~pFmO2BK?}tBx){P(8fzyS=MJ_Ty%A!=yd0pz#L5c=EHE#mHhqP z3e7blPEc6owl=tOZEep)frf7G-bUIz97NJG?S#QN$VD0cB|^6!`!X33jU>;hE9!z> zlPs0hs8|Qeg&Z9B2WHF7Kdu3f=9@bJ(U}u|S>09~EIqNkyHE8+sng}hH_cyS4_?`W zQr#EY0#n1s{nA4<2B3ThS?k8MsQ5u$6tBNfTbX}bz;*}A>Hnrhnl8+KoKk%9$I4(l zWbAfX;9F|>ly5BG-bzeq8$Mo4bB<}RPvy4?=k$4VKs~f1xZx(TcP_M8JhaKe9Ln`V zv`bd_e2|#9=V6*34_dC1YT>81KA9VuY~_52%2}1>{=F5AjX@ zyWOT{Q|$N}@4eN9ALm$NS`O&VTdF;}6BRw$T6T1mkL>o@d02e31Z93daU0sO{ck%` zX0xY|H;aG5f}Ll`)`hu@@353x~9NgRm^M$!*R1@N2; zFGa9XjvM2w?8e?(m11ux1_yOxR~`dDE*Ei*#~o6ul{ptlY|y2ANKVd?lOUpDXnVcF zK@Dbn1*8F_&xucf=HG)MWBkEtd8Z_=Q2-za*(RvF-Q@>Z0zo&H+<=j+=^3fxRSCcz z`Xs5o6msgjKk5OgBCccT3IrBN_PG$0fD%?~pA2CDq3Lp$w98^`&j+3mEL~J-w*glF zIZ~IWk&TWGECO?sO9RmEJ;?^ak_*j;afrKaV4_J-oC0;$&3zd+2RM0ANib_HEElMi(V4MPVqbhqTxB6kL?= ze3LfwNQGwVJIw!k%mpo)YC?)D%Mp{$1+H|ZUa!dGo;Z(EmIA=dfa^N~o}zh1ST5gx zlp%mO1{B}5#HEjOrF?>UvY_3>m#?BQ09bp~hJDrMz2ENepoAQ;@He>r9l2}__0tP0 zflw|UPVpqV`a5fGY`BmHDHw307nrW|i?pJ+G*^aoJ2SJs1K@n`n%#j@-s!31lD7%f|3PCQ5kDhEBKB=rF)~UYnY~`v}$NZJHL-M|b=J zhO19OIav@E5HLFUoX!JDSPnM&Ubs@utsQB~v49)AIG@Y<+TVxja*q=Xm$aUrctsnttk zsXoME=EeW>OK#Ww@(}E%kJXNF5wc^Rqto^Aiv}0^fw%5dI~AIFCR-Zn%#ekj!?Bi! zC+khE8*#Acv*(1xZ_G!S6C|)f-c*m8DjLZI@U2ZFe#jq}M~pgtBqLY9l~J69RZi3O zmIF5Zr2HboxbA0IS+qO(f#CwN64 zyxR{Z)#8{==0{cRMbKzDjbMVMhmw{r965^jkPQ{9mLegV#zW9V1!c~Ski0|te@F$X z>dQ)+I9uqyll-t9~Sbw5)!me~2Dh8BGSWNeH-PM@E-TzI8Oa z`r`E5L@1&*K%y~m&g{DD%l>l!<)YpzDOLxFbdxe^VHf|i1~;Ni6ZgUSs-y|Wrfsi; z8(pbssrc?u#!N1+mCB8LPYWAyypZb4T4sE_r6DPRC+0X}MV~7O)Fy6=Uc17twV0(( zB3>_eFl`xL`*!i~?X0(W12Ua+oqSdo``;-$6_0kn1mS*g90fDvOPd0}7rLe95%%c= z^V5yx#tgG#@NG93#bBGf9&#nGYv!%|9Zln1N-RoK(`eYSo(qELcGs>}g z`YstLU_7>RJ;2$bw`$|qs!bx&C;uZ+G7>YhA%e7EJ4(hfN)TL$)f}t*>eBiVnA8AS zM_x#+rAGhwI~Z9Og{_?`Q@+Fg-fE8i1HU^`5hmLbyT#&A2h(U^fowe;Y}OhI9h2a~ znJfR7GW5omLBG@x`S673 zod8;N<}OLQqVQ^Btt&j98yEB-ky_{Whb%tl@{943QyxNPiFb#QE#u!5EGhR2!7(kV zgCw$9aGo8(I5_2|;-Wr%$UCV1$h9PbOz%@z(8YRJ1Qg8-D7(E=hEL@;Zv+HFJ7Fy zQNE#)km*L1#|%cNV~7}8*C-Hwvd9eZT*mKZrEA~bCD?yn;ZT${z|oa3UUk~>^b6!S zk*y?x*3qL!b@8Gsxhi_XL`}1Hawa45lCH}e5P`|Hh$TJkE-j`sM9^Aw8XYfJyd_$6xhv_uzRE(SVSM_JJPGg;+%@@xucz0>mQ06UwC} zwecv*dpreHT2h*qJUBvNaX-|b@RS#^3glhG1c>n$JhG9|Ab(Wvfa1}c39EJXZ%Kha zDOfsOKYx27(8>I(M#43`YM=Zv5QmQlmb0eKI zg=8`V%#yRYjkK9s97UsBX-&0B02PVneMBt*(=BMGy`zg)yFZA$I8OMOHC@Sq`vK5Y zyFmw47pc}cvZtenzEY_z3WT|XyMYIQ7;{%45D$2I(gbPn`rR_CY%q;3X`B=~iouZn z6DABIu(dt@he|jOh1hbR=>xg{Io5)norH`pk9Sv>3=5nu5BT~tL(H7DX!dN(NIxs< z@vQUOeRZ!azQ4yAjUAkD>{l;^kP0`l(HyO=D-n0MnscIXeMds{)|};x4y^Q)#i2A> z61n&4cb?YPuZd?me`PH$IRk3>+;sP+p-2zh`d&)ljJBIjOp2fNt#>C{jQ*N=nc>1A zgwLKs%uCy;qBMNZi@gm1`DL~n5(~|tD<^!yR!B~!#fV{7d(V28};udql8WmFS zlAy-Ql{?@SB!K$$@22pRwRA6&<`fi-usak6AD30kGA57Q`d5zLnP_#sCrqxMo8O6w z#JxQp6^hFgXWd-5()T9n9Q`)j&r>TXNKu=}witUEPqPU%{>iCB<#*sh7x^^N9$mnk z`u4tNu(EhS&}i{|sYz#acu3MINm~?Z9EaB2a zAVMczqJdKG>yYOvemrPkv1R6bqXk?BB?0c#IN1y$00CyRA^Y5jCg4K$%$>!GdMR|! z)ok#5XXEgB2=p3%L5B#DyAl1(u!nuUx?rwiUcAX`;XQxx3Z&{^DC)W6p*K@wZJW6K znR zG87oW79PpqS^<&`cZKOfl`cU#* zfPpfSFr2c1eUmSeM*78)udaus=gXhX&_DS{btHT#`7cWLR7yTtQ}N(VLJl1|J@phb zpPw>^^vd;nQD>7RwWnc>L)t|-)*D|haz;8q1oJWCw~s{WBH6c|E$S~tiQWHris&0P zkR&oXCPUSlj}C#MBbNMTh-I3pr&0Jl;^s%5A4hJtGu*>|GTot$q!D&JNVeL2H1dGv z_zv~?5W%0}gEmsNynTVGt2p;EooTb9w!iD>xl9-Hfy?7$jAr-qvPj7T-cr$EsA8Di(SmU88p3$>S>S=Tr*El-Wtj?Cl^`H zEb>9KGs^35NJjFXx052Z=Yi)y6I1n4opPuho)$b?q4VaMVTh6keS z?hx5~HC_=s%QIDC&tF;89MC>%ayG2kI!+JrQL3clQ-LpRA1zlcHK4E~yZwg??P}Si zA5NoaC|^JyAA}b^sAIi{(Mps)zGN#1i_xDILp%6F zwu9B2nio9J|9%8>c)Ctayg+y^j01*qFk@n#sLGmJ$?X2vJ|50~Mr(jnC`>6XfGxgc zwu29!pweNlJc6Y4v*8C6Tt*XxB`wAW#y|pz&b+=?O&g;=_KLCiQNf6z4>IQg)}>P+ zaVY+Co{-bnnf(1Hce64b+H-eV71Yxba||Od^aw-gI=)!XdZhZ@jr{4V!h0yGxX%Vh zZt3Ki40J;LXITPe+gOS0=1dM0-Cccn6Q`>wqY?R?uj+dI+k$l7z}9by(Yg0yDa6H} zv8gvy;1r#+ubcX}&9WdFBVcZP2Kqsul!bmT4ZBQy@tDr;2Ch!nr%y4IaSX0jR!=nU51;t!*Qni2 z@S66&a|7jJ_(5O)-dTc7n04tfZzPTHb{R`~19t#`W{fCNHhTXf5x$z*DwGo7W)@Er2Tzi48BR}?{+!Q;REf^b1@NN($bGe0`(ygy zg+bJuBn6i}X^CtCVUU?Jp)x=+!D-EdtL9vwAdgI_Dd;FyX=d&g|Nckw^=ZU! zdc~bZ)kq8Ds|`bT(Yj*_r}q5LLQwxGg_egFCr$unL~|qRE7O%$9;K}#A#Rt`|0TD*A^Icb?5 zD{jKmZu`fr^H;cI$J9NE32&~*MDeZ^j9@E?tqhunzEg5^YP-!luD>B@PC1J&2S?l8 z|6#wM?GG`|8>xWmY0p}G#U!vsja-xaIQRy4^DC0tD3Lxrz6=C_va4+ zZeB8^`^Jg3#n%3+f45mngXb`&jd|@?Vp93rF>N`B7101;qgYA+27yGMCOog>ak0v< zGUOfwDDFii)9{dNIiG0B9K3HVR;FP{{Mih|=gdI%`m_vSg4&WI3V~xnPvgYnc>vr+ zXA>>&LH0=zzCa#iUjp$3kjXNy-K?OI03vUMrTw*i`iF`@jIOH_xC6-`UUI^-yM@dW z+ty_!Vambl#P_5K2*C%5J)INKaRu5bHYWr$m zzmL83zRv{h1T7b#3aRhE&3zM+$0U(p?GnY6|2Cf|Mvi9s2aHqDfsGsej20W z|2;@6EU}*P+A_5_VK+OjA4pSe&k67TU-?leam3A58Z}ZbaJK({`*D)FVqET|HqmC) Sp#(251#~p^HEPss!~YL3BXd#! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/growthsigil.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/growthsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcf86c0a72abf9983d0a1f72a6e7f014d4f9699 GIT binary patch literal 33209 zcmZVmWmsF!^FI!sB)A8PYk@*>ZHr4Av`B$srC5u*yQBuep}12h?p{1CS{#Z~q`12T z%|GwY_x?S)b6vT1bI#e>+1cHh*UXts*eeYsVgfn>004+plwsNc0LE0o03HseIP;mf z#uPa3UMj&bCFXPWq9qtp;JYXrx&r_q#eZKAkd{G%xrpnbqOO3uM1)Jt!$9<@TL^QB z(e|~0#|vjiM@uIU%ufJ#;bv*>VQInQZR=sfqNJk!%7Wh#7XVlQ6`1^MpSis@-yf9S zW3ncJ2fw}ywBxaY-JtTXKhpo;vH3ea{YY`lM(uB&V&q1ltEp*}(YrJ1JRzE>xF7BO zu3=+2u52qIggNrBEuaqs-u@U!9l4A#QVMY`7#S3=JsX_Z^!0&@{8^ZsoYb9^UeFE4 z0?TiJ0Qp6IRjz+&aJ1N z!5_o`@CO#fPSbLEjS}Mzax5fpIhLNKSe^j4#8)h2xN6Y<;UPRAQT_|9`i?kE7Dex;{2v)I2)71?+J6)UJ6#HfY^=&<|F1*2 z$b2!-|Eqq-ROKbK$f)qJLi{#q1*6|BV}ob^8wW_Q*H9$Gcc=9Kh~PO8)jE)^yTj$o zsMaXpa%A6rx3^{V!EA-U7J%OG)o*I8RQ3H)IX zz)=2`JXvz|mL--E_`u>>dYh6K_?#&2P)0V+T%7Fxx|t8xVE||;KFBd(9>K-wae}ql z{BHSn+({kZqs7ukZubQnEOh;jJ<=rq$I;Va*M`PNtGxfCx2Y(Lco;hwe0D2jjPrj? zXxp6Ce%}I#LdSl>JXoNCF~LFc2&RX*p$Xc|zxhAx5&f@EvOMQLf@kcV!PL-wgN;e* zuq`E539##t5`*IZ*r2(eNo=6M6QW1I2($4+z6<5bzfW4D>6PYK!TaAz>DsdH0Tqp+ zdJnMJ2iaV4uvRc*HGFpK%Co}Wi1wWiHc6a}j9hhxbKyR!

        6UAR)(pW%hY2Mwl+W z=Am_2+d!7BrM#yNX z)`yo7{5MT~ec`e^Jb^$I&;t@9M!uX#9lxLl^2lGKaOvOZzhXl@gqDM<0Hh`01sWxl zD|^q7@9;Ysvyl3t{*hAPpM3+&$lz_DzeHxmgoZr8TihHOt~AgfUfhrfc|r^!Xwd7b zjS=|*C;({ib4)DWu;6XY5D;Q%@${wWN1FesMA+~`_vK)r&@qeT>3bCz>8nk~>zD*> z9?!d&ZNN+f>PcGMoTysNq|&DvrVrSK*$6_TICI+&TQ00SyFPbptj+0&dwE!GqPA&R z2H}5l6E;J|zX}1ISaY*ygRV0W2M==#!?uiB-;^ZOa0}V30Iz#_fCYpN8*7?!W;WNw zch9`^_R@s8w-%T=c1|rZ@_z|FO$@4Kov#N`9t)J7_Yj@@3@V- zpTI$F+chm5f+~X#8y@|N52&gQ9i+xIM`)#X%h~HcC4VGEWcK`#(N7=*;xl9}g_E)d zxXg=;x85E0a02vTALK><0MKyZ&qs#Le|zvAc!8q&aGLZ}^7ck9RTBI`F819zwj9Xk zOM1qE3)Y*fpsS*sVPHw6F`M+qL{nylOGo;6)%9g3r&lwRXCyuFmZmE6&3wxK#tfqb z9`Yp#ITb|g`Nmhwe(ua3Zn@cX{Sz}AL{G2`28KxT-1y+;pq&bk%h&w?BsXv~um4@; z1VDb%C7S%E(ocn!`E|U14+3@}G-j(;M{q~=I@(LR@h*KV>!ZyWtNY7|AH*G` zhVv6jvnB!gqyP@?-|E!vb&XQ^#+^ebzHZh=?tkKBPX2e;YxGk=N#y-N!u(PLWo1B} z&YNOclY>AnDx4$lm2^jqFve0;|FV2;0#AGsu>SJ>T~bW-F3vJ*FMnq&flWpAKEL|# z>fZ+#CQ)o!f&tvEx;~oX z@7#kg3{l68lR6TQe`G6i4A+W(9zvUqx)*A*z6E2sH)dq zb4?nSB`XB9lgX!+0DNv1Z@(H!M$zjcS1Si z3XZS0xudQWZqYIgBK-aN!<4R;Zxa@P4|0*gf0wQrtG~P~CpPf^>y-p?TLcPdpaaTJF(%!+>g;x z$qU~G{m%g}u%J+R05vX)WWdS@*77HKzQqgAXzx9JT%`>|O+2iRk-itvypBrxuYyG8 ze{v^2GMN{Arm5OMXY&2G;PJVhWI=Olt$?h5#jmH$V463o&-hv}n2IL&Jx2{+^>7|# zQt+dl*QF|zCXP#AMJg>y|H;!4C-9ZBXI$RQit}fh&l>0`f#jTlbT`3L9x?ko5iY%C z-fa?$US9b~UB6mSYD={kVPnUVI}%nT0FBa7Z8Mf<{1dkIigiw#>j@8^ zRFub8MNyMqBg!}JT+kt1)%tm2Y3N-tA_O|NetQT(*qE}qNwT+OEcvG+HlSnL`LADQ zd4yxImAo>=lO2`*ZyJ}6atRZ(^>e z$}jNhg)kJ=&Z;gMi`3R`DMJcfgJ(XN?VUu=b{l-&@oh9 zMP0zjkBQ!3im~V*{l-4^sA3ns(kCk)}3-*t6fv4g(7oBC%_IOgp9S=^L z!zEPp$xTZ(s&W`e5*PvbVZD12I@Kk9Nkmbjwq4@tl|t(r`XeHVY)pGc3VHU#(`mDk zHFpv=p$gkKG~5rZY8h9CF_XoKQ0~852xt zh`Q|X8V6~4ZgfS4YZaqh4DUAk|7ynydkm)<((`r94;1|}-QZRa zSoya$5FlU0k!sR{;K?Orn`RZ8AIf$(|J&qeb&T&`ju^%3b~01kUD_(obUtXpD>Vj| zrd#i+<7oB$68YYnO>^)1M(oZ$&%mI3ww{h(Ud>g{^(Y^IO>WwDudzVAKj@4GcuBRH z!kW=46GP{+J6eO>$!A=ZZe3v&N#HF#OKEzcuv3(mT!}{##?z8*jo-{SShv=H<&_il z`Fy;rih^zv3{PcZuishe?5$6W3Qyir`}cQ8t9#d+u0X0kDJE#KYmG5cZ{ZOc;<(Zc z3=$jFo9v-X5Mb0ud)P1T5*$4p>s8LhGh5^nHZ0m?BF67{DySY3?R~FTO)oFpdf6f5RGDcqmF zR~s)k9J2(=^AiPs;i-5CTsPmE#MIlWIFlM|9t70mF;uHPsO)GrE`NB=$x&(1x%LR2 zZI{->O?WE0(fP3raDbT6zz>==xdNgK&+zT?>UN%dkkh+cpBGPv=r}xX{XNxHA+xh< z7lAuUx3MFOyJVUUlpVA9>P<9q6SXYrbq0EM(gAEWYjsLPrT}%b=rJu^62w4g_7Vtu z8U113?;kxLS7y~74#tgCBU;Su$clIdu^DgmC+}!{(|AW2Abl%R>{-5#d9g`EvMXCJz`O1`akhyX|tnu8$qLn{wLrWjlT3<$!fAi3ZH_MVyNF?0%{T zaE=N;ya)XyF>8PMXGm)wjG$m4>$1NMogpz;_~&gzEB9b%8BNf=sBY#0tj{Vt;?@y-6tnFc`^S zl{*YM5AcLIS6Y9mR_%-b*LZ%#uC8ApsK7z-eN~k>SYz;7Y9!*ALI$r3rNn}2{Sy4m zQPSCgvd(0WWt|Uz#4pQJJpjWOfg~S~O?P0S8zkr5e!m&=2=Lo9AEtj$r20*S@))O8 zXSDBG2tmQ_^A9YO;W;0#cR^Acm;N0w*Lzw!!)0ER*_V`Y`z!_Y(LyRuDGJsNh_iz- zIX7i(uX^XY$tq|btN7CLc1ZQ2goWmxA1JwSaTr-F(6gAjkz zmXALXB_DHRE%BCmqXEk%8?%O;i9`8VbGu=6k?68z?{3iIx3ytzc6jQSHmC+`6HnOR z_t?uXoJx#RFBkt^`lXZ!VAnum!xB4`(jUdNMkAWZwDehb6k$=YiFkw`R10GjG+_|b z$S_PaycCsy2;s@+H9QYxg?PfwsGw1+~$&DxxV=;6spE&V z`OXYqXEMIWlGAqu`o|}Ukzi6Le#oe%hw@qzwq4U)zU87luL9XnJQF3J_M^Ih8Z?-m z7WYwpnJ_kZ2_R{+jR4XmqE2g3&<*dFVK^zG8-3Ym``)K^z3GPg%v9aSNaJpE3yNLLHEs&%f z%e6X!A2?ijAtNJk`Z-zSY`CmIM(Eb^>NHa6G6HB2HVz{G?rd*lW6zmI#YnNA0TJv^ zVsX$1j9e<>On_!HN4tN<17DbN1$npBL1RK62i1n*=U$K_A?i$nbu9izsHXC?(x7*@ z11Fnu#DoWGpKj??SDBv#NXwn6dAP@ToA(<(ajFjl{}{;20?T$RJz(T9AZ*gm`uF{8 zXc^GgL&eTW!X{uaeeV3>%GmaA6SQOq#Fjz+L|xI1p?Zf7KjAq{G##PXEak+JtEF13 zP%uyxwu)^Q$a)=%_^TJ=9%dtw|2lmu!)AkZvxG(!#)hyVgA%jn{)E+mpu}vs|0aC9 zQxIFy`4a}o64w-C+N^#CT%J{2&3Y_?j_XTi^A#Pcn&J4)raST}BeT=QzcS+rs#<=W0O zdZ>YlWLiC%rVQIj)2p;ZV1z zBq;B!tzbvV&pl^=k8U&ewt9A+=H?A%bTp)61*%Q;g5@W{)T5~6lk6qlel|~G*OZVa zjRjg2I?qoX>DrmO{rby%9a_M68ec8TG=_QB=3un)r$frwOGUthw)NsEK5Rk}rc-p< zOaqOR9=;M$E$(LWJj)r5bT8!2&x*_omcL0gPu)_@Ox+G?k-ATlsJ!D-Pj@IZe+wdF z$rZ1=*hytP4YMK2rX|a?L}qN*e;$HaaOK-EjO>IJX>ir|KUm-;gB@6cQ#NYnY)yKy zD^a=`Y{q(by1%=z>8LUj^{zCa3$oKk=zzFaA{);t?;F=k^Z_w2a`JY&Y;wwhcT7cr z+X5GfcSw$W39G|~^0DNiwXKm^nqgantZ$xY%4^=M!ZaV}Uw9f`b!cXO5F6H3U7+bD zkZ;{`_H6`t;uN^*ykRCE+fXgO5bgJQ)03~I&{V+WpF8*+7S_;4;IUC$3I&|%3suixQAuJVR+Bed7+YkfDaA&R9z2?HYo}p z1GMy{Q@so|AKnFD(hw3N8(6Eu#6Z%Zvw!Xy&6j?Oon>UYe zm-(nygR5!Ku(jtPpV?2kjzA9rLMC~aZZ|G~p07I_@O1@)BN>6W_B97oeOSd)sAsco zDc zeZuZ_vyW~gX>Bo@vDll3t~t4Cs{Q#=vNkbP-G#~-nDQUz=??uPK35g z;W(k{(kM1^cXQ*3f$1a}_Y>wyMA|7RGBy*CpNkCUgM0s&sRnItGxZSY5Cz+uxE6;v z7FsDB==_cOBf9Dyrd;KF{gVnb8La>~tuK6t1L)Mow?AfReujH4_I5iJ!LyhetelJ2 zj0$MbqZaRJ;8dgyZ8`^4@nS&rSsoR#h3WkS*sMsoM%?e?$RD`=-3^51AW?Njw2eP@ zvLjn!WSv!0-=>vtkJyx_N7nV~hh}HU8vCh0WcixQ&mBURCWa-cSm}nT zEjU@E`o52{$bHOKWcB-W)$|Bj56s{o&-chO9-Oa5<(i83#P~2QxWsGQWmWb4Xp%@q zvfP?m-hkO1A=)8|vk= zTbXcOMA_|&O>0fS)ThcB3ePgkz@^>R5tvsU3lk7a4q-75BxiX%mwExyOvLdfzk7^O zBLn^(Xa`_d-g{SJw*iv4#$70SKDKEa1E1%5o6ke8&nbpb#(d;X?I!;eCZ!wZ!SQMn zcON4Oyx`XloR1qJKj@K*z;#n=BNT4=_Rbo(jyQg%Et7_U$Y%fOZSSKqsC`}c`oya_ zY|LoK5|8@{d*xFt=UwNKukQr z1)w$^E33l3$Q#%x4ygX%E3weXm7M<4A3=8WPEn0h5ySw489mPDkIH3sz2tLk@pyLY;y=yYmyEI_thpT& zV*{`=5R~t=YI%RIG#SnEPn;rW7&+%p%XMZhXU(aq6F0--LY+n6?YD~R4iXQbKr z5)pZY72~hxhkwF{S99!N@Z71f_=)050`fScF^#>Tpd<<{Tmc+EeKrbC;6S(s? zaXt%i@i3PohLx|?=tv4G{XOBD*J+-muXm?oOzZ5Th~igYzpNW=lYHm!`|=_#-6-S?LlWYu@ZpvO6$^y`K_j0=md5FmI}BP%pJ)Yc@Pt&kRw5A=M}zUdq-Uv zGQIDz(7`@S3uoe&XkLP+M#6Rxyqh6y7K-1kZ$T5F9|Ol+4g5PneTdD!DEB*RSIVWv zyQgDbex6)#t#`LkNpTXr2T_bXdAHx=6}}|k_<@MVG6aJw=^(7vPuq`is~*C!8wNAt zPsBEVJ%4Ebi{^#M;px)qOWDWyCf|k~bkX03|Ew{C#iVy+`nD&+T?wF37d~E5**aY+ z{Z;Q$eyMewu@}qvs#PBQNQEFYl5DkRXL|FqK@94dsi0@s!J;P>bO++SG~4C`n$vhY3{yVgk55JQ&JYhQocQ2< zoi-}7-ZyX7j9GzKY#9sPug`7mD{F0k@dn-^p&P8J%EBv@G5-!l9i)G~z8abfP>Zc# zw&`nDuu?wLki+)Owt4w|%Hp}KMVI?B02JY3e6=t9m+CKlqS$oyk);D4Z7GzG_+p-I z`u}oDiJPeJAhO;NsW4^mJWx>o-ZW%Ukg|>iY!NKysJ^cNiq_$#D*y%r8|f3nUx?Eu zQj|LU4ghkJw-;;87-eL4e@?N&%e#~}dhloFyaETqtSt&GUM3%NLI9e_8gLr4+qv=D z<7+WVEXYe9n8!wl5=~(@Mip~#;@TSchlZV`hl;1MsC(P>NxZUBd+I@l`_XP=V@k8X z0&jd3INOw5dC}JXZ~ox^(1Pv`tk2{P5}f{2zXZ^*hX|PlVpqw;w9#*Xi;`30gW7P+ zjGXM^w$=}GW4#`po|?p#a;p{#Bx-AN=Tq5?e`)UtcBaC;`&ixY%Gx}MyX~Hk7(?l?lSoPCbw!$*TZMHO-)7(2k=%>Z^1K|eE)^|(et=Cz9)rkX!EqajlcsA2P9NqaNWncbZEnS2Yg z`{aC@nY|j!@eMY2*G|xLm=RR#5XgE6+@>QMHr)ouFFdgMHRzxV$_FiP6<8&BAT=!{ zY3b=V-n&!#p{m7Nu-CX|8vgz_5MpBD(}BeOt*w;Tj~{qF%6$l%057u*)ZFXp>tAMz z`Nofu^rgbiaG>IuSKxtBe&M|FC-*=I`IsWC?kmE|%D}5Tuk79VQlH6vc+PJ*U~j|~ zMAv!oxmyKKL6Ky->T;^AJSd`j1)5}8eyd^fe!#AgciG?)t!~^vn$< z{J!9~)06Xt`g%tvL%q<7`*+n_*X8pyWwMF!N&__#;oU0aOX>WJ=BhY-I+OG9*v)leF=RIi-Q#&C+U!5D5j zGcc4PUOQD&rqEDR>E+?ER~vA3lEui#c=INy{?|V&sbs3G*UFmG0|@#wkOPaz;9KK9 zEp+qondvU`d9-JBe540DN0if?(syU1x@8qAuz znH}6-V8EMYz)MxwP*+z*ao}fWMtI)AflU4QbOXw)0MZqHogYK zsyXcv_KZH8>>rDe)F#5^+64(OAUv@LO=g_s_RU=2xHjkKLot{j&?*3aUlyqbnE6(r z@F~`xMK@rk86pWBVsTARO*MQOF#OnAy9WrWYx)J^g9PQR-biEuK&Wf|bit4>)EwXW zJXo|NC^|i~i0jg36osxiXD*F=3{?75H4-CJr09Z8exoxO;aBqgLz$9|i`^hGN&8#Z zZ`MQuk@O}S+>Rbho_>f%@B?^vq9XPKPNa+Zv7sgeu6I)}3w#1)SV=ySnaY1_`{*nU zFT7epn zaS}awdz}dk166(bB`wBMz2dhHY(n>n{mOa!wb2x&db`KgNRU{1)MYw`!~f>f5_kFb zKXL`_ypm2RQRQ1w`4hkK21y?t_`;Rl@+&}^N1TTDS~{>4eJ-jZI}8^5h+cA9T7kIW zp@Wi(=Z#p|mT>M|I=MLdT{8BKl01neff0-_$H!~hBOph$yeEC13Ur>hc@_`0q8Q+I zYapaxwmR>IW?NfluCd}w#w6OAvHQSWVAN?Zd&Bw#3VqJ7Ux}Af=o6~g-zNz0G4TfB z%9V$?G1Nj_1SElABJGN{wm>6l++`(kH^2_my8Fc9!e3GiPVHg%@oHtBy+Z;Y$}k-$eT zLfq>`9H#H}unZN#A!MZid*7QbE~|bEGw9z?n+8wB}bzq$T8j4&Bvk}-)gWfVh?-rEkqhM$9WFO+TnYfzC#@_18GFZ=z&dtpo^SUz< zQuE)km>nOA-^+UM%~bDe9d|jJd^f9bP=G0t1%)tw`IndV4|XO4#cpc$NZwz<pS)__4AVP+$M|P+`L+fyzn_xe+@n(I4ZT3pJp--7qXxB(z|71y) z=+y@E?WIS@M>Zb64?iD&sR(3K{uUAvg3s@EpH!t2o22kAQ7mSEb(#0H`e`X-;HRl- zXqF3I2RD4UG0gYuS~!MDlH7Bct8<{TM4I0NlE&jOFuH~ zfg?9NWVKbxiN-i+L!VROCg@0;D8sU~H}y!yyh%mzu~HSky_yNz?A#G|-#{(4XG?lJ zNkbiXQN9`@S<=ab`q<)fT+^MEI%{@J4-^h*O)v#4;2W3i^Fv~UnxT? z2eTljKJ)2351?5*T&CL)OxWP9>IV(H_gyjNu}+Nlk*R+^ibDCm_?F*oVyjy1dtv>;323yR&3xYfGDCb1f1rx=EXO+$qM?R`_mXbS9G3JDXzkYIVuDN>2ZD?rdj&H!uTMQ7ej#GL# z8W5?-?;M-Dn;s)+^V|<@3VZmGlJk>)UtYhKd4G)>%}YIA#8ci_MnT z$PP;*%dLEgr)Ap8M4U79DYOzxeKC$2HwPm!L%ZGG%8modoQ(MkwCxJuLl>tnZBZMQ z7fWy^#XIw>LUOEMLUhOBgHsE*6xHbG3dR6Zso#~(TdWoe!09hR8u=}3m&}d&Rm-!1 zlWY7T{{Ak}0q+FIH%Xo<#hDlrx;R}}es#L(UCp~o(Yq5o`yZgG?a3yyUDBxa3w&$k zVt9XNkjGpZ^(O}`HoM`IFiK*^4R=}rX!ZbrrmwPn?f4cHWWxNUoCG(A`cUG>KSDrS z0W9U)78BC#U1;3S<^}LK>;tH4CSzWz5e)b+O;Nc2tcK2h;?~?aXrbADKC#uK;I%-b zl>0rX&hJ|ld>}G{$t_$ z4CZZjxsdE^61Gc(+hL_in;*i`&{R?neM-guc1D*0UUNojp6bzg1MFBRww&z0i88r$ z%}`7v1;EIF-ostckJ+(7g%zxn`fKMkeQH0)<9QrZ?ql0?7r>*~-U#HtyR$4QB`NZ< z`oW4Gu)n`AIiq(xr>TCq6de4srmQfN6OCCA91+Kt3#1E-7a|sl!J(#k9}5hk-7rQ* z#VHyWjsqxx4a^HQ8Gu?nbnnS7uKl7GuS-OH4mC15&G}1AxT-;@{(r94@?-#DT+6zv zRsYO=WAM#DO}oYW`-B7IftsMzn)6^MJ#Qt}9VLAr+sDIN9DXlcJN<7OZ99CiN7kr? zT?LOIT}C_G%29>1Q@#kp! zsO-1j>;IO*7sn^T@KbT->zhw6CpyrwrBY!(WR+~1Jt7A8oUiJVLo_cH%R`NK7zVr3 zKzpEN;^f^G`pH5I#CTQjA3dGBN1Rr_R}cFA^l+v;6GUj#qErF4HG2_Lcu%8T~Qq}LO7cIh^M z2E5(Y?q&dP^h@KrL4pV&1}zeR3E_Y4T)NA8rB}2*Qp?oJ1)dQu6=v2=cXV`Is^#6S zb*r&AoVtyUj{a0L7?E;aPdQLRpA~miE^30_8=ByjJR2;YxW z?DC}nJQF7yEW{D$Sj(oEnjws?KF1)w@&T^kfts>p3<%$L&A1pj*;yKEloWLfFpJ*2 z1Uxoui?1Ct`y{TEfl!DI-m3!1UZ3Ky_^H2QfXwbp$f^^r(8i_<#iw87bp#C=9!mty zL&a`ezdoe>t;!vb9jYO$qN=qXsW7Uw8aleTxCkpRFVE|^JsCLgU6oh6qsLmNkKrFK z=OD1{zj8A&u=Za;5WXt7(;kNBt=4$gT%(<&^IL}Rz;(vBW;S0XDR0Yq&GCK zLrt8>?Qd=Udy^?WHD5ij?{-TJWBCX1^wkl2DygNH7(mhl*)tF*CxOTPwn@+q()6ob z>$p+OFMIxd($I+ty0CrhqYs2`D9gT;hnYNliizvLshu#)9JH9lA3ZN0_q8~pX(S&L zXNvK!8QknfF)PAae5Bf6aGhJd_F~Pws^deqg`j2Fxg{T#1_v6)|LBvESuBUR*u_p- z5LFjWLyqc|CeiBek?90JRrwneXSFrtNiv14Bj~=Ja;ogR!+zY`zel=UN748f>~iUU zRHuJm`E5Rr_vWqH10vU1Ij_imHKG=X)#!Ku*=bQ%`5sGoZ|7zRa>F;1aD003%s-;6 zr~YUbZE72G&-=$AJf?xb;S7|sn8ay@5Ca|(=^>k^Hs4L#E^gZro}zUAd=B^KkQrrf zqy1`bIJyvmGG6rV`W}IJmn^IKN>U8a=cuF+R4*i(5??+~6jy z*~hCpL2*;q48=oU4Rp)6`%XdZPbIVM)8v}!u6}Tc_gsk2(@Djgx2C_Wx4gdbRFySh9#RRm4c(CR{!s|1%k7>~nYGfSDj!xji zvy@8Q-*S(PJ_$ejF57dQ_qVW}Sa@O@yvzHn4oqWN13_M_dL?rgfM(`seMpcrK|#fX zQ7KU+`xTCDjz_9Xx0M>7jvMRm?A2>~EtRPbrq0}*`?+eWBw{~lyjk4KGaslUIzRPM zm#q{rz7XR*YHXndyvF%dXZ{%uNkXtw*^VUuQukw-+sp!sTW8gDFl02sof2bPZW?sL z*UfUR?2qvK#mCDSx==SOWASO4ffT}{9a#XC@0lwUZo=gP5HK_eDm#7T`4OgWnbq}U z|HJUxA;6_-|JCdvPn${n*)o6%E7-Qz=7$gcs7$@we zUJgK)LO)Q{?7+b^-Rf_lIOR1Z$EKHI{7bglwzrOpo550PrVuj=3`^l5_0Ph6@tj`A zzoxRy85^x`Q|TUo}yR0;BzK?9<;~ZVu=}B%WO$gEgk7xg8V;c4U_q` znD4J~_Hacq4G3~#QbPKP9Wn?yUpH%uRs;e8+dnHt0MUXv(-=D$=e-m!qj)8W_uCGM zp2=VlsW;`Jw&QT%hvtj^OP$A%WZP@^niT9);tHDkSH8aCA)d(vRkHqe*Qd#4GwD*} zw#|?nKrMO>#kmX+t?T4Fr4Z*lRali}kc&_K zhZW}QraBWbBBFOc`ntr)&F6O^DF@ack|M6y=Y@2~CWw)owj{{|adoXnu_+(c7(NI- zWYaztlPSA$YS$syIvi>4BhF^0+z`X}U0>LG_OVL@iYupwUblJa_=}-^>?mYI@dX9G z_C8)8-fQU~ws;wF(?@rT91^OJ({?RxKAioP1ZwV>)AX+dNNXej2lFFTcI;#dj;}Y? z=hbh~nFj~AF~kM_46Qnh9kCW_pJHD?VxFg#m6a9lH)iOu9sd5XCa7q0<``BlPMYB} zJX$S44dp%8B0k+9!n3xl5Zk&hv@#c#A@s{6_Q!7oY>s>mZ*GT;4APa%a>M{k4rj#h z{1f*3m@+#oa|!HULbH54FAl%a`2}Y`S~x(MG!q~}2G6eEg6#hcJO6Zj3z(tHW>j2( zuZ8Z?fT@2hsyf*^jjX)*zJiO4UC>(F-2_KYA3&eyobv#?mV+R%F{&z}hQuHWS%F8s zep%?H2y}1^rr$eej&j-QSig38kAiE9TDjQKR+a83T7cSSONz(-DdGhK1UUrYfPLol zx*ZMDk&d6s2lauuPBC1}ahA6GhvFWjpShxm9-5>% zd(@%YIhn;cHQbpWLm?(|Fdby(@59OEFE!ABhdjQ$c9K~-Tx}3xA(8vS2p%2r(%tX^ z1dcmy(x1PNY-J=q%vh;>Z3}ESB_Iwk`0FJ?K?17ug49|}DE zZ588nd=&)2C7IJ_fcKLc*Fk3fu4Xzl9KPdrq9a~*S5IAj$o4)*-kZlft?2ly>?1pC zPTZ=O_t(M$@uKOpI^1)D-yFo7)6RG`@$sDL4^))^kLos=y1|zGo22DBt#63ilOO)y!+oM-*99)29j9kOvH` z&qfoGWn5xF@T7-z4Bou-%RdL$x$U*)N8JyV0|J8c&C#jQhMPe3mP<>=EL7S1o5zgV z6C?FxjPU&*eVH9Y!6+u=C1^=SBScv9w^z&+_m7%-J}+@MbwCSv)a|lC@1K-0#oI?F2=d^fd1*J zC4jSLmEPT^xd8AUZH)_ew6Mv{&w(?=I~I-vnl7vx{yi(^lh45(BO-n3?ZcQ*QB{85 zTDu&g33v?DLXhvjfm;cI(k>9*0Wjg3Q0xVqlN8)%m1a<^4f`iiQo)&Rn!R2k_HR4$ zqFCX43dV(hj+9hFBP|}+RORz=gj0-!%nTojzVL-5ZN`sC1QD7s!9U0>W&fV^4*S%u z=2#7+*mdlVJmh*wTWeAyiL(O0I#e+>FeEUT?1^K+F{x2|H@>nO$H8b7ie+{o0uzHA z@=^#iVm?gvD#5j$Q&d<3JQ^L}KYQoMztQ_j-m0vOr&zf3bMR|JZ|aMHg{ohbO1y~S zA3cr;jO>k{;vBzq?`&1g&6U^*<{xPBe;9-#)}^E&sea3^~GBb7Cm3g3caGNswnrNMxJKS zbv#R35*K%(t6c#+YRm1ME3D|bIZ2Rm7>((1{2m~ttdMFyE^>FO=ONYF`A0v3RVf|D zMpj;yFds($T0WDwjQ;P@6Zm--$fevFu`hAP=hT2NM;a7_(VU6X(om#K!MOFZK}PxZ z4q9J6u-Q2VH~dZXqFIQsciPP(;nV#Fx5w75Kt^Tp;ihkzGv&nez(%a}+O4Q#3x1Ut z{&l38!xZBKNN+9^GL*^Kk%YV;xv{x*m{N*uXU2hzOGD1ea&uO&eHt<&N8yC}l!IG- zx&gRk)*GZh*ypoWqXR0BYv26Ybg+uDUrZo_2R>QI+^8j482ac1q=#`w4~toKi&Jy5 zkY_nD^@Ig(QIPD%H~Q);v|*=H2;$0l&)1Ht!$B(Jk4fZ)ACR3D`*B`B4u&yQV|SrA zz2C@|1`dZY+*PC@GPa1CvV8jgMT!B$2G69f2>|+&TF6ync{ga(zfLI(LS~n(1hF~Y zIw@_Qf3OuPe;=katNboD;#hOTB};6jIPsD3gp8vGiAi<)hE~IWZ&=abN&nFOaKG)1 zIXghTAsx`^0v%PX@&&cAsB%uUn^taLSEspA+x2HY+<6x0W)psk@lCk}MkcCG^wZpA z#}jVq2Rr4?_um0bka!^eAAN|Wwxn*bKsJHSUh zL7n{$U0iUZ-_(k>9=h?5m{YI3O%=uM!pDn>xv`n?X&kuGw_iku4fe`;N_ThjpZEk7 zbABmw&4-NJ~kVGfaAV^z!MK}yH}$=*7Ks-5L+^=bI-ZXNze@<&~hbMHu=~)R!ll5A0{(W(Dv+wX~^dw8fcp) z%xU`5B4@4%Y%QtbvagC=ZBP$ zIxH_yo6sWYy1_6Up@_-93{RKI+jyZY2~Z#HLaxv^wj~am&bl25lL`u}p7Ad?es%?$k{ z?<-_5v`}%-E%8t%C~}e-5hDU3KB)ooy!{jQFMQ^Zkhp@N?}fp9H;3kLbg)% z@B8Yt-7&FNSe-1?(eyWCuzdFqI0DBeik%*4PlU_pE-&QwQxn=8vF`xe0F`>of|BzkJhE^5mpoTwwS^k~KZq z7%pt0ZLqW)R+oy&4jP>8Un7(&U;4rW$N%5y49t6B4%>O%*y687Z#O$p6g;t|UyQd! zw9U(p;upD&R=x$`jIP)*_hciA2zSBqmhSHvp!GNS2{>kKPw%l=O9luaYwVWSJq|H& ztzWzsZ?Qp^gA=}nT%S9NW4puB9I~=}W8vjI@eezV-8F(qRc*P*+O-^H- z^6TjwhXhDCbl{{gbO=wp`tzn28+-(F|7$INIONp_2O;N8*D*tY4#=>WH{OqD5B!gw zOMD2W()^;N*6Cs*`(vK>1+>8wyBchj#L1ndqMc_t^Zq)bhYJ{$zh2X=F%!V=LU=LsObD2hnmMYuyODv@0nT>6ATeZ~=~J#XaB^hb6y3|6Oc-{&N$%`)s^GbC;}S zORKEByUsFxYNxIwK*&f~HYYmLq8zqrA?ImJ^EZJ2)lTMpWDx7Xhhih`s_A zsc~5_$`^t{e!|AMF!ucJ1CwVujEnxRm-)>i&HvlvRTrD7YB9o;o!cHqm z7Z)yDo}h8t(ewUK?*`Uio!`1UQer@yry>K8k#GL3ycmaF&aA-PGzD9h2yq$MOpYSa%c-3>BGclSMh@4ElN{bkmyy=Hd2JI=e`_j#TZ*T2f06BJ|%4aS?D z@~IXD?1qjUIQf%D4Zl5P+u(m^#e*-1fA|ALtsHR!zJb0E(NI73#UG@t$HlpE$SK`! zo?Zaa$If9P>vl_=hT-35cb2q%e!!eOHQ;s=M1nG5<{F8sXU#j>=>4?wY%#7v_``1} z>#x;b(fmw12gC}| zZP?Ic$?qLVa5%>(Ft9@Hgbbkg@Gk6>3uS??+64`ADBPVAWK(s^APgQ}-c@kEw$ zJ4%91Z+f16ifM&Pc)?t(#Au?XxE#A3qE^}3(A7!YQ1nGxk&Z|QKeO*F*71vORn4IA z?myo9!rbPG8smZ@do%9~JXs=syNSzyr6$CM2L4qT@2E#>LY_~o;~Bx<0I~uwm)?{c z2S#0;b!N7_2(tg|O+8S{)Uh&#bh_-njCD-Z#j4D_N%05N0;cJ3B{s|o3~_+NDc>tN z!Q#B-(Z{N*NW2`MRCW)JcOm#SvLyh^EZrmiyvL7gUJh2-b&{;mTkR$MiUl_3#V1>)HCd0C zK-u{&r!dP09walXR_#4rd7{9|#T4?lRn4O7qWNF9_ZuFeOE zT)KgFT^I8Kl4@m_wr-}UbryL@NQtGWDtOHq#3yyN*or~&0rEeuf7%@@3=?zDmr;Cb zqza+abKO+6)CyAkN8d3pNX;|Z=Md-EFvJue%lf?3 zo>G3xmN9r{srTDF)VAK;1Q?X{OqaNe#kxo;x?(UvOe^^xc^E*$W zfE*Re-;ygVngIuddd`2i4v?6GdU$>l-*};64yN3H=0NqxCP$UnvO|YEP&EU=$6Nb4 za{j8`H<)lkk1(e@8IIeDBE`T(w+!?f7mb9LzMoz4ji@s(siBTrIz)@-tY@=U^E)8! zFPWzn;2o3A$raSWTCF%=X=nEzdN%(dM|u*yvT0K$<}`65Zaai_)LmaK%$4#7$Qe@f zjqclE1rdho$cSbdGQ^$#oN3qxLZwyMlKc4|O~aPQxa}=P#O8mNwdp3VMI8}}iXuUh zw4>sjXF$CZOr(y#I}xcUyLy)vHLR?T5jgi2BQX9+1_YCLHDvF}-H8A*ndZ=Iqi;^R z_!O28_$@o4Y=7wyOQ#HzD`|cyRHTsY>`fX#`gjS;${#9>jw1FY|5h6?D2REitjRF| zx(XH0*GzDC`buSg&=h@o;_-@VEc`k#)f3I|aFi{^2ne8YHcXHS62Jl zAFh|N1?*aj>8Jb)J4oO(ExQGH-#1}~=m5NTDMIA8#;*Y3!#+LQu;)l~!bk1En|q)3 z+d|+dlr}WAj&KT*9`evHZDJ<|LL5~d)v-ucG;?I@vJqjq+UD?pqSHaj+-U{tsYx%h6G~`*hf{N%?0X+Uu zeP?^uH}k68UlJWyJ>otdeqY@^d#JfzVbdlS_%w>*O)SS>R;Uzbb3YgvX?vQW~*FYlhc~rKsbl=I`&a zG)ALSq#@5H_}2(0f*NCfm+%(>0h8xPkbll;|2O30qO$mQ`=W^N2vHHcImq*9@0HPL zG7*Pxo-B7OJ)%pU0F%d6V=-?0HIJN6S?Of&SbJpxdLtUj;wJ?rlzT)%61tWN-Xf2^ ziyv8gy4qTFjwkfS3ISuESSCzRISOy!v9|3pGyCpztXwEuVtBD=S{(A`UclwvWj$Z1 z6_s7R#I&sL`!$-j{j|l2wQ{|{G4)eO`4^toHY{2A_cZuxhQN_T6T^Q&iI_pcqm^oGG?&k(<8*`(mZvPk@?{o?5hF(mvgd#$KI5>Jt>3`}UMUDZ*c zec7qhIKEWBGa9exJFMc=x~Cu-^4;98j~|dzEH?`0-*x6ldjM9Y%7rq(t4uj`D`-v5 zrSoYMVggbhrrb7r5`qhjhvZ>e5v__H3@r9@PK@Y-Y2g&V@R*O?hw!msihaS=G8ud0CWJ%F6$-v$sxC<@N<@4Ve{4g0k#c$9oi+UHyyAiew!^C5VpqgNh@Q$2?JIGkKfd;dXBy!D6K=gXpQH# zj3ef}x3C<+c+u8-2H4U7&3O}xx53H^VLMZ8ORZrKBZrG0roau z$@#8NcTsf>oPJ=hR^spLmC2Mau?yrUaMAlCexhS0Nr+A#rX|ZRu)^K4suu8<>fhhH zr&4%7dVk2hFw{b~i74)TrD!@(r%2Twf2$6|JK1cA)mJFQ=)u^=BHn4Uc0peZeO3t(q+%Do;nK*^Q^|}9Gt#% z%?*x9U8N^Jd;ZfLiUc(RmdKj<d(UvYc}5vzjs8}aMcig17fR80q1|PCx-_B#4yc+bdfS!9h1KIt?CkOgMyTP&p+z~rt3QC z@oo`}$Iy=Q=%{fMe>~3T;~^T)rcI`b-CoE$-898;>s=GiP!-7=XyAHnWSBuX&O)2~ zzF|agIZj7WFh5rKZ=rKsMZ_Vx$lvK^c?Wy=08oqWDL-KA@S1>E+Atm^>}=D(@Hyy5;C|XiBqBw>ajA^{wM`KGV+1) z{BdDG1?qzIm$9sfvv0eC*p0rRlns0~Gr&#G%mp0J);6oBX>alLMjLr<2i@8WFM?m9 zL%>Z|XA?PWwSsCz2O$6a&PI7s{=r6Q`q88;%qmGK~|KR357D8p%OB9peX zr5nG^#qo^NZ8%7QIjQ6w^AemV%JKD-Lx40`zYRs!Bm4Ai5QnuPYFYoA!(Rr<@X3`g zRLjR=&_lE@kL6xp7bOb{e~*d`bt0$emtWiNpoS;9D&oOE=5T1I?^vA7sTGsF#q`eF zi!vZQy0n%s-rg}oumGsZ0cwR`$`LEqY}-IOo}(G@6=`ZsSe@RU$6)0}RiBY= z4HhiDd#UV8(%V*{(8j*KrP*WN18u1GxWw_^8Q?qKFajLV{71-pQlFoA0I-_$9uYSBe4M3PLA*sPk8Gzb-3@8ya4e%b~kLPzgtl((ERI%#y`cAUh-3MLV!~L6rLZ8@aVf)PFoh%l>Bo2 zv+r?!WmNVzHwiiE*3H~nx7VREi(f_My#X}jz&`)6zs&gr$HNfdHF*j0v7Y8hwXMl} z9;5FbUjwk-qc99D(rxame!1^5`E^tXA~E-WO(!S$WHL_T0kb8dlvd-UkzOIgcP~yt zkc-QRWnYx_;bL>Pk#QUg*^fGE*?4eM6GbsQEIPUuN^(f`Z@D8#t z=wQ}`EK`s~v6^;|er;yod3aCf7 z)TBLZTnR1xlhoKqt?8Uy68D`K9S!c3W5ko;MAaUuiN_h4CHsoCc#C=c)&7Q8oV}!0 z;$X!>ZThbRAI2lW(bi6ZUcrzoP=TlKau^>F^tnLh{50^k8X`H8U7Zos(Fn+jWH-e1 zXYoYN)&697t1Y&m$rwy2!kQRb*0(3A}v`fAJL?h%U&X9d); zwT>kl-{@OAy>|fSuLp0hz4Di&w9R^bE3>qT@GuAaM+dCSKa)fW3uD3SHVk){E~R*q zdCsYh*;FMe-hBuHhWxeIOaC~s>6XQeq09Bytmel`gGvoN$=%HVv>ocA^pMErcN7$T zVk^3bHb&zdn{=H^JvrJ?ZGSQ^$tso;kK-_kn}Ff857PfR$zT~16A-s(^LHlNh`yG4 zn%MA)VEnG~jrkbfLknghwlhKRy-ph>&@QMYcBkG>2)?K#I%30FKXw)Ybzf5lvKWgq z;~XQ0HvAbWK^m;3C`>+=xUo=pHC z7#BcbOaI5#aqQAogg%4MSVhq&SaKyRc7%Xulhz@S9Hduq_FU)M*-lo?YEEAbPC)|r zmtP=j8XK1GC^yxnFg3Y(qWn)JY?>pFNXnSIlQsNF z+ZCPug9n#aNR0J3lLRC+S%H%<|KQ|Xx&3?DlrXa$>-)Ia5z-BhUU^>pV5tD?9{^#N zE}bx6>nFNl%6AS@uPssPn?0WgoYpsU=T#GrV!T&m`+%#S5ftChD@Yir7}TB3 zg&M||*+3-HG3-586Br>eBa(XF@*BYCaKRy#Q%S$-p02lmiEb+6B~A4I@Q6|gqQ31{1ZGDX}CUT zO;S9CNJQ&F;8j#|ZUxEenT0-FO|FWhQT~leDmg-5m^^(gwF_*$ZsA~VlLV--t&vBv^)3S$*rese^gX8h`{5Jx0l5;zVpeD8qvG{fxAZ7T2W zx01~)55pL(oA^CS9IcQ|v6Uvc!IesnJK^Gb?QlIORY+LQ^s3TgW-Ovv<^30EH2T14 zhXgd5*3}ZJsMVAG!e$BNVkGlDf|;&$7=<`4{1b^;iHu;a^maILCr`EIx`KF6c!GV> z3O%*j!}Ur9#VY$x27zU@mE$ z&-d35(c?UhdGF%mbTPZ@!mnV<^Y4MmKk*xbqzR#$KW^Eg6)I_FyF(HxQLQ39`?IE> z5(ucF6xI{8{uJYTe<(1ufB(G`#NE3h#w&G~yqY!tMTBSPd_lLsBU}32&>v#k%o(aG zGKzj?z$6liQDpHgJ?HBeblyH2u3QKXDGx>CZ6RebGOtkFbVN=71dFkD{Zm_88#ZC8 zopJ6z3XMJ&=@n7!XJoa?Xhnn{i|aGO2aRv(lzDQBR3Vb>k$omsXn2C9wY&*l3#86* zG?6E7(g#!-fGN(>1pvp%#l@wzu5Oha?pdl&1C@$(EY)=u0YIHT`hN;F#Ob;Lh_^Bn zuiFF(#$6e`v2o6D{p>%Oa^>*{AK+3^p}boTtgp=2bB0koTNQaEEs^lnK_iOC- zClH}e2dZ_~JVU1!Qro8k!3EU4Z_tlrezGw2xw$X~e_WDrdsJX=ZucAzMYlpDJRsLS zd%;oaUzKsG=J%!Wv~0((WWq9LAnHZ;eM4=;)8heGYMzSPv1 z8(_XbtXaMhO^aRe%%($S{2oW6Kta`rlgwD0E13|1o?Ho+?0i&-#e*|VPZ-yXa6A0c znA}r30Q5INI=hpb8;zNzWj83i4JtAq@y3x{5HK!4V+{#)@X0n`sVl~3(W%Ed3U8rB zsIgDK;v%)Is;qSS%2nM~R`%CtsNp*qR`f?j#hy1_zvMq1i!d(C=o}#dGT_igbAB?( z(XXt^E0zaJK7P{Oeesi}q<8PVqHl8FhH1KPIcDbX$-PiN4-1vyWH7q<4DCVg!ZpRa zZFWz`?7gF#Ta6P)QeI*yQcr!d7>EGHb1C875HpaYRtn(pkj4{p4K2VDL7ZwkjuiLM z_u-k|1r??YKO2xtOE-DVd^~&?4rB!3{6GShqtts7449zWQoYU;(5{~>J{Q5XNRT*- zL#D${} zrRydlM`_)Rk(%E=k7qhzvhpXx1`Sl>JrZdrEitl*si}dB%ieR~?AzcDphQGy?l*1l z$^Gl=j0@xu*1!MlW!Smd@&Bvk9|$1X+7ZGFZo+GF+^w&kza;M2wXMEcjC%9akMBv7 z6BsV9hMs9Ee0?qXgY@jKzNMwboncZ24Zg^;eEsb;mzD;09ZJ`Ace~Qby@6=@_4QI6 zMd85DPv_egTxH0lodvR6Ms*fa6^z zj85-!dRwmqIpCsJb2alHPZ&}FE7|dTq+Z+7fG6;_KD@isJpcY9-^1Pgf4rEpMLlTG zpKQ>0oxdtTo*pN}_rH%4UEt}}ce#ut}IWFtV`U2sV|CVmiIpX8a zL3L~YDDW=Ag~&p6tNC@avjN>u!{OTQ7I;8uZ*Ol`{LQgOhWbF7+EbqBp$v@Avoq$a z1*=mFvEIL-OC}cD@GA9GNys_o=*#zTa;gMRB`SO?G0UMlKX7109F8k7jX&GMu2xM@ zSkCwtk>T?A?;64T;JU7>&3JCmVazDRmy9P)huC7X;|!$4C1%)ttlbTp93TJc5E2p+ zhI+2m#O2a*RwV<~28lFa`)#RSRmtn|OiWDBOfoJ+Mb4Z-k%7PAgCy}i%aG80qQ6%Pz$&ra zzyV5^X(MW9o#%7@uA}nxJHho7a^ZEo57`6;rkqB#UtGY=R^uBs+VE%@;y~-Bth06E zvD~^D-GNArLQ%!AqDOhf%T*#z&xkcxRt$~(5cgah8byeb33*0BV0*G1D@Tng$IA1Z zh{iK>9gc#Dp29*A1we?h>un>BSdJtjI#&HYl(mCxcm%8-ZBdV4w^mhGRfk{PJydlDRfA*V2*w5E$4W`Xg$Kpqt`av|JXiQT0@r*Q&230}7c zo&7xmUZYw$SL%zWB3c;ivZhv7LAEI|GTsCwu$8V>8lUfj%>5-kjJZWV7NZhO3 z%z^atgoTAsfz;n{tThXuM6Gm!9cX#+9v>f{4u8!A_;D21O-D{1Sm)zjsi=g(5Je3Y z_Z*2noOQc=HZV3eHpp$-V&-ZmS`6BOJD%*tp-Ff6gW%SZG9&>@k{@HOte~J^+G$!- zgJwIDm_ae4t&JqO6DB?UGqSy+qr}yk!~fey*hCeUG59y(&dyFFiLE4vCn!{}`WWwX zST8$8rc$8C@v$p6Iv7$<;nv`(hmoqz=%>FBGcsGU+3_pf#R0vj^uOhcIa~B1A4f;W zh@+TR7G{yCXB&OP-x1{*;^S{}eh;3Yz^a*Y_Ss=22I>a0JC4=uyoPCcMJ9upTH5Ln zECY2P?OY%xnXcylO*kAr*>?81%ufwGMn8q z!Rc3JemBL2I~UGps_ka{j}#{f!fp%tl;q@diHI}?<2vRb--WFYjaZ-E`PusNHznBQ z=VZNeoY}q14+;2~l&fvR(1zywWw@6O)Nh^ARf8qpt&D?I-QZT&`P0$2u7zwt8olD< zn?wa>{U?hy3&%403UPa0)*4b>nnLN=4`D$I!JRYblb|+i0Gib2L@E(2mK#fp3?n=| zyi12lJVtlMbiht8BZAP!cv!CL(}xQYwlcbVGof^<2dVTHi#oPt`wUe)*_h7H%`UV4 z|0din0ELTLjMYYKtcR%BY~W;M<N{u?5$oq@|_R_71OBa{NN9s{PkiY{cm<%lUc3iZrdB2U%r|x81$ov}vMB9fcii zWJE67ZKb2_9m0@eUr{E7I7MCT5W7va;Wr0tLtnkFsxcfEkzCQ}pn6%E;q7!EkrJ~q zn1f7jUZdvHFX6&U-+FMHnpJlD-Fe&K!Y@c8EdMj*;1+1d&VpubAZUD&C;lgi@myqn zRyxAGnk1`5%77!p%@oN~1o|K!`5x%72vEN-skKK61Z0g=j^6+t{v){6Weqir&eJxD z6UNNOE+!X}xeinrZ9~vM92F`hOP}R+Yv7KoAiz-)XAK9iJ{U(`!T zDa!f#4P2hhBhL`?@$R3?xsnBl52R4xx`1`OMkdnSq?pKDncpPtnj9b?A2|!j+Q|!1 z(oJ7YjR0poFMPtcD$!Cf#9**$%%G}XGRb?7geVNJpUxg$+){slRg^#4EF<;v8X5kQ z|FMVv(P`T+Vpt9~1YMZFb_hl*qI}zbtI|4tRFn-}VjtH5XwmBRRE~!Ld(o}O6?;Ga zd3)KPEsD|*tAMQ~R#k1UgnzBh&qBz42!CwgiBjd@9b#IJvfJ}8RG!q3Wwi|?hBh)q z_Cc=Is0@dU7!zcGJeCbhvyH+GivXp$Sj%3S_ek00Jst*MGH*Bsh;#DZlcL!xu!hr( z3!17NE-PKsw|4rFcc*n2E?x9rPM47k-b^E@qyO_grW4%jfEo0q-5Sl;FyNu>5~8P<qDdoWa-@L_FV*zxyYdXNn_M!yW$F#f<)+U9?Y$U}tZNadJ*%G=j~imOK-? za$t!+?3#I)rMOdPd0?PBGY|}$#JV1tRB?|r##m$@=_sG z>$Hfvd_l6#LfKqXf|(eK3AJ%P?Tfn!rmp4P0{ViWs@YXV7 z*EUpWU(+l25I}91A|uxG?h=`cvwBxU!o{GoNUxFCP=F_jtc#$J$SE&7Et+;7bqS-} z4RA^N13FUs)u}wX%R%_|QU)39XGxXku}aZmFE^JI@V~=P2N5tYr9U)VW|L zIMRX)^*p9}?F}qmrB>sUYnn=z<4wWG(~v<-6>YRWSSU|1g<&dn=0?C?YXHWEF)R!Q z{k>rya4QNsR{nie=ne}&Z;%#o2{x^0oZ?n#A^FP=Tm7)d%pAbnHr^mw z+Ft^kV9kGHE5<}qIn4PLkfZ9&`zN22%sT8{!V~9dP?}Vi<;PJ!*nLgrLy+}k>Xk${H-zr>#@6*>A$XS4E}4!NegW>kqn9HE(q5; z^;du6nuvF-eQ=YOdr<(x8h2(ZiboKI?5i{6ThRxS$K*j9wlvygL)qa;m0&CCGrd3Ekwt%QiM!WO^_-bR(=EA@dG@9LLkV-c z_c7kG;SBFgYF=>$k6|I}4W_!YR)Jq5fs+`dM1==iD<~*Q&O=8TyZB8=C_~x8=x@23 zCzi7NLL+RlYPvICJKrP2ar7?84L0D?5rSmY}FSsC>Wa zivc#qs{5C)G=8&7Rc6Z%&+j%?KD{WW*ODBN;%@WUG^WEI$6~WeIC#%G@Jpq@{zWveGQi*FoIMzHmi;> zWzI8|NC*2stgCy*L=F^L?-v4>*7xkgoMpu6)2a793BMZ3O_~B9(hzYO=k1*T?bU0e zW~NCh^;-602Ks$pObMM2>0n|#eC9En9Lwg|ty+qo0@EY51=GJ53`*J&lyBf*paO;-+ z-!NN7u?=p%%)Q_4azS_rZ5`WW&R_2@xnWy@0*Thx_u{Hu*|wGz=mzo#CC5%v6maGH zWQy#i;0>dF=CNrHl#q#B8hTbY+Zg#P>>uMqMD(l7z zMYJgK`UmGvHP7hCV)eSr>+9rAI+<5r@A2j5;Hnt3s4*YKReXoQ1ah*jYWemE4pn_< zB9$I0GwvMgFedHpqaD9`E{^{Y;Gm`mea9jre%#*J`Ta~~h3vUngal`MUjGb)kMr2W z?M+ww8-K?Ax{Lu2OWypo;>)A7dsqN`^xKy`Wrl?}tVQyVGA|0Jhf}NHZ+RjHXV#v( zqYg|`wPm*Ie9+GCF7_eomB>k1m9ROz`((o0eyZ)=5RjxowDN47e#v=#XjcrO`e3Po z`MI(1%H8AbYw`%ErtwUslpHfnmNuT^Dq4p5X?VwX6=}-U+3)s;{Hg06DnYeX{CiSw z5Nmw#jV=YgpD>hH_j3|_My4lpDAU7QAM$a)%TYOyg|{YkdB?xCbmlZA$9+LiD$8sD z^>IgqR&WOhK=Nkb`&#G(rN=K?8v2h#RHUhitLHWBtolo_r~)mSJCP=*@xQKqBo)Iq$^s?4!l&_0C@8IS9OS zqz#wyW(Yz+;fqA+xP%5$7X>E?9myQvVgWMHBPEnkh9EQC0b2C6qS$&DuF)3C0|(U+ zH{S?*&oFK1sr*=>fy!ac<<(w|H_Z0_rRhX*&)bKLsj!z-nf?VPP47NgBm_QePIJvP z_C#wdeZD{%h}+HNeoDAfQop^8J=P(8d>z>|*qZ2`CSuMih&-0j2=TLTpMR_!^6nJ$ z)_>(&YO^TTO-|T>Tug=?b3y@3GXCt^&bzZryfkI%qrCzGiQwp}ha^N67E@QN%mMK? z9xs49&ir(Z$J)t z#9DI#B*Z~k)p~SDN9_khlHbUKVy`70)DfR;P00rc&)|JL0o)Z&jZ4DveAG{izQlh{ z*(YDKR7QE~7rT0kHTr}BzhjDAUC(RRRFaYKRy+*>{vu@^<+TsqJpc*R3mXx)JHV@g zzY&S$Plafn;oM323Ek8{Dx_y>U+d+mKCp^%3_zdI>apMgfFV*KE!-J+vB(8C2M+y5 zI>kJ&Ixw(4AYMSIDM(S)WVe>`2}g&~j<+y6kJY!9#`$mOVHArkSBy$p4|&^prpqJ2 zYO(U75Q-(ejuJZ`x5#e+#!CanHPwtSbQ??=(cc_KJdc*tV+`{6E%d9sNzc-G{ZAMB z^iqqmcL1#Vi>O0WbvTiHlI&SNw2wRYE6JY&hm(=a29NB0Gs-g#I^4JjZ;ku9fo%~> zypE3#P3i$7ENvnKHS&LwnA*nTBdn!F&NmI%Fu^mr)2Cyt0&t~bpasnV*P;v8MEw0P>3gfk#e z1pR^=auK93g^%Dv^U9d-FRMyxdh>VA$YQ3O@hnEm-JW(X))h&LhqCkt2UuMk<`GL9 z{s8uyyhd(j?Z$&p(}8Pj2DYMkEqHXs`5ovI@GDz~Eln{G9B8C=wqu|%sSl2J?LD#l zZGTL_+Cx2bD)X7CJ#Y}PWo{E5Xp$NT<925ehTV$|;HU0`4{*>IP>^6Ah|55n`SZw{ zEsYv^ld7yZd*N|a@i~?1G6w;mo5=VuQT;^!i}}g}-KOxT<7%|ozyt2kr2^lmCPPrW z(SLjUK8cN!l2?pk$p~C#(3T@tr?oCo1Qh3ksw;0)NANKBzS=lhYM)9T-IZd;nXVWg z>$5l%JNB|_+NqxQQhxA%x7%%f6j(Ft?HAIW*vc3+l9C!)ZS=c`*)o^DkQTPM$o5u; z^5WmXDFQI}?Nzy1Zd74LX&rU)EyVH@H_g#Bc~|1Y*E0hU6zo6JIPWt|!kv8nb&Jjv_h4;X9&A>Izzr!_@ zQ3-E+0kF#Rac`8#L9a(+Lcjl=B;HYp@m&!kRbX_vj4FUdY`P`S&+sPnX7O(xN1;S2 z!f4UYzi6hV*sSn^Ww_%FPpJ0$)V;o`OsVKcX%Np=*%*9dGjQWy%lkjj>X4+9vW zYY`TH;|nB10+Hb7pGzVZlOOq&+y(YeUdW8^L;D9+rV!^&fDL4SJugI*_0Tqfx|~KB zdn_*1CcF<2?G+1XRC*{*-4?fEmuZ5RboV}ne;%xSN?u%zH?g}P@;hMK(US-atHfq9 zx=2Djt`*(zII72D%5+Uc^L#_^DgaG8h^TX!QjNH{3>fIJ2cqneow*lr0CgAghXAD4 z$*CU2X}fLhW{oJ6%SQ7V%RmgrK-Gcm4GWYB2ptg%(D`|8iM%!+YYZiVl90EBhfsmh zgv8rudqB~`0hx4e72ingR%S5a$)k$z(LeZ;%S$T9GWu>m2X7zVfkglZxR#6TKu1Qs&*D8>21 zXR+xI)&?nQJ zH!HXsB?GPpg32UPN})IP)$e2oznz}nF$Wy~+2352pEF?S)S_xjMF`#<@Z3EqAbUB$ z?mIJ&IAHDXKL_y+NHGh!38>dkAU@b?GtkGj%Vws3U%(l?J3YU$jm;L=$);O|0_Orwt=r zqXo;s3?5dv-xcEAhnHL}XRd$*Opg5K!*o ztA^!45t9dfuq*U-oATZ`1C#Q#jpnrWP2Azxs+Xqt1Ngb}SGZ5s(`F6wr-mVyO&kUD z;`?cl6{@5>@i~xFgv}e|)9k-usdin{37jyYT{8K8!V0qjJlOk`(Eg!6QVb_at@U=y zeQA=Trub_Xmg|u2mNm3!0SN z9)F%_m)Wl8Q7Ob@gT$!iX_CL(b+Kcl?B~%EA4d;v|9DxqEuHGOeiTNzi zE`L!&e`5m!Bi;#arZ{CfYC5dnztAdAr}nmC&iIIWp!dnc$QHUC(Ehk>@|wp2bF@|M7%<_n_82EuZe;I zU$tq(>JVTZi7sfI z+2rocqw)>!5YE;wr}i^xw;-!HLw7@~sH3^dB#;+854~kgA7)8t%{NNG6hfRu!>hkk z+5cy0XVD&#$uO=}xF}7qMT#9_9(gY9pg#A0*k(?}dfMEsRl zc}G!W_q{3`^P?N7zb&pE`~1w=y5TzoQT3YklwdyKpC^#9*t2`K;@MHHtcMS#h zkKfnkq;sdD5FvO-@)s4ZR_=6;uB9WU}hMZ7Zpq?$XjRt!O=a)<>q8PsalL51PAalMf z>3#@%nUyUspMIcE{-=L~AA#zic~?c{ke%Gsye;N({2Lw)n+*=iH|fEPgk70Ms9Yba4r-pp)ElF~Oy~Fe zlHRVWct8J-Z_csgxE3WSd{qYi9wF&L_R`}&fp*0jnPXDTF7+@u42IA5&SCG*kXK`d zmgG)-7pqri;rB{GrZ}0YOXBN3kNpAFvU8dHS7*eZeG+@}X;nh9AHr3v5N2hFhs)PO z*e4yRaUnr_SZ`+e=LV9PZ&XxX-|TL4GT+H#=ww>T-y`9t9Gq)*C1+z8a-PzpJbaE&(&pwF+qM}~2&}b9Lud z3w0URG2h@GRs1C;l5CZ{-hqc7u>`3tv|ewTk3>|{Fo5XVFR{^7X|8E>(T>k0L+ zY)lR2c0G5>kMXmc%O$xLSGYOfO~xqex87W*?V3{>$$`I(3~Rft0nM7s6MqB;#@VA_~0ha4Hv7jL0JII)KSYMF4yW zEv4)+t9-=fQvg7{lecK5U`TavBo2g#Zp|3QMzlUWMEM*h`*o~>DPi>k+jG0?XadH! zj5AYvoV#|e#{$rUf$nI;SHCi;Yy@3eL5zb0q)cT-aQKC{_%%2J$>-aG_6+)yF!q7; z6l8kETn;yOkAWmx<$ef(JeD~YcAZu%000N7igNnq{EQTY-au4JapuoV92GRMw+yxz zwm4HG^8bFVB;PB4@ce&;inbb4TK~6D2~F9J{(prDSnhfH<^L-kk%c7W?!Lqj1LXVJ z3HUGnSBUpEw1ORP6SH}QX7rx-f0d9P{`i3ShlCIW>d+=+L(Q5L z1iHmwatp-5b}!~m2A)+0M%(3T+eOB0I64d+9hMn>i#P7Rp`tUY1S|4QxD(Ist4JqF znxF%PLhl_N?#^v)Z>L&vr+OBQ{5n30EYslC-191^{bXd3=l}N}l#=5AYb=pS+=@oQ zBSC-}3*Q?dSp*zT1Asu$0wRGjtfZtJ00VK5NkL*zC>Q_+gNv3rm55hJ;KY&90wV*1 zod61o`0Bw_EmG-%_@gDw`DzJ|LHG9P|9itbivV8{dB8bgjb&o+-1^PoOS}mj9f~$G z;p0oouQt$E&fDCbvF6dawXuH(yt<{)!N=jm~VH$zy`4DxF*%aN`x2&T4(BjD8jzzve1%rpdGF)LZ?=QgxeXG9aS0#=V@p9(l|bI zmqmpE<@;~7nNS{yJvl@d2N#{ZpZTK*ZlHu)F4x;jlHh$?yHlK6wSn@bpa}qG>KN7n zNUR>&BfGU1(y6(*sPH1~$1(=z<|p+J0TMB;b)QySw>*Eeznuddh&hLE0<)Vc)!VGq$q#^S{|ocjR5GF-J|T9y zrQh7iuse~~Zj5aH8ifB?h3g$ULM&5U(E>9TLvK1Kh;n%P6_Uv&5-2&5F;$))-+-$C z4~cfXO)*O<4+Q8ckSR0bbk9^Nys3$R8oxkaCbErR(FBH+ku4D?%z){Z))c!}t6#8s z#rLBW1+@RO^~~=_K%G0zeq;D3ncxZ4CCDW^lLM7vn-?9GMilRVuxlspd_xfj#dkjE zPmA2m{tk23T`o9)2~}ZoXi8aEEoZ^+Rb)>f$0WNifKmszy7I5S{kq!Z*;GS|HgRD? zB7aHKz#W28Y&+%)_RX+r6?Za%=17M$wQOnc8G-1s6!?h4#8oRb^C?V<5LBK7;0yhN zQo}>>A>+JIk}bM>8OPLI7RHq@g$Pp4-O>Bxn?F<>dxaGWM z?!XfDRb6Qf3WS4@Qr5!%?9W1ENC{3q*;w9Hx&dF-pJ!(|Xna=vb(5jmi@r6KqS`+y zU43Pcd}w5mw8;Juwn5;e(XrYw{K|;}CePQQrV56^_`PdQ2?|(a(7IgLRc&AD{qc!p zqTu2DL9zg=UwRWeF3Dmmk^UoE>TvB!Bzb`ogb$c|RS67z2IcqRdOBtk?x7nbVVZpBBPQ22X{&}YJDej)yyq@DaQH3%7sI>QW&UZ{QI)8k+D zkL|W%{lbgA75>RdNd653Ag_vEE;*JJ67KjQP=4bdaCJOqn)fyahNKXAMlY*B2S$_~ z!v?McseT8I7n7-I4Y+1rra9@zmkXBiYu|*6-`XxV!{zEcZ_V|QOm?R6;+L3LoIx<0 z>gEgD3E@G1$vAb3(jW0%(iwTQzof~ruLeZvQF$3iQw3{#kAI4I$EX9eu7*Yi>7*T> z;#BuddFIb{pyw=H?GB|KmOgh+7nRpiXWlCHTSQW#IF)j}w$X)8m`vV8P4sR5X4oX$ z8tLj~|J|9gvFgJi?pS&4Rx)&oFd}!4+9amx$BL?!e@|^*%WuErw=ZGAxpKiACM=3vYUjJsw zegzCHWKq>Z>mnG9Pg?<3&XbHH>ns+te~=mdUGxg&IbOXGnBNp}$C-;};gM&5g%Uy7 zrz+R5;@3$+CPl>7S8Cz(cVK*x{Ct++gAi4h`M?Ud7Z!PBsmX?`2}_qC9Pb}k1qi1> zh2N@~DE?-##IKLakFWDGC+RV*3$JY;un68PA*{QUl}(=#{i zw1a+J?dV*btg7gs)n|!v^Z&6FQ?bh+LIax;{#M+E$M&&H8_(3m%jXmE zj)ux@A;7`t?C19nXi0!>W#~1MjLm*mOAZ1V&ywuwL(gAS|8S`iu^Vhr{ZskX%ysgE z2Jc?V(0k-9=G-sft=oAk-yk7O*tW;Qakq}}t1NxXh2@6VNjy6B>%*%G@6tLrDi4B< z4@5>j+%2=aKS5+RD3L4aml%4~xvh5{J=OcSQ-BYiLA#@g!z-+{*J{nC7&k|I6UEQc zw~gZJgHl#zRp9)8234e2kemo5s8Wv9@@y*U7eu~3RJcI|qNYg9kwn&l!$xMn^^TLR zq0M~xW%8Z$DtO9+r)DRhuEXq-zjDw%>nwBpm*xd=aBgm=o%%rJ4ewA=vh3*b(P3`2 zzZ2p*TJ>oW+pHbR7DgmQY-ePmArO8;r)FsnVK{e5f6Nv&%n^eE-7%6WSv?R7nyb{3UbR$+D=*!tBGLkN%w-<`q`n9Mbf4g z7>MXvz9Gk&G)P0T#m4+5P7je0IxNM6cZB$^OX?j*7gTF)c;7bJap%xHuR=u2TgAxK zoYwNH?#6;Dw9aa|x(-=GH!ky-VvpN7emD_B;k_?=^rAxsKz1*eG3~ZNjzV|Q z45)$CLFn(FcM8R6w>XStX@Vpv5+WUh9%#O2Kl6||v@BIBZ2UbS@HrV~ z43WH_9h&NFWu*~Fx4Ksu7Vd9P)|_oI#ZTmt?RJ>5O&QyZJ=t|tQL|$_<^>S)fPLId zW2HR7f9p2%2>{{TS}N_D+_uQpPz0};A+(j_YDbwq|1K+hPNkvaFMI!eGYsZ+a`PI! zA2AK$6K;yM=njxj|sS^hGm|XYIT+Qw0x*igy!406ID^vn;>uA^W6I9C|tZ#`O56tCBGZEH}EB5Cq&?{Hlo1#O>Ji>hM1k?$3KYwknC#h z$W5WkGz>)q6u4UVE@W2%7X#Jh&WsCfWQdv^v>HRrR|yXfirI07VN!u_Iq_#qrVhQ; z8Wyef{6(~g(YW|J;{QLFU1}o&1fZX<7bzyJZ6gkNpb=V#-uSgU0uSyWauPl$uZ5;) zZ4nLY8Zw#OZI!3^#DC-Q?7;h3hSpL`L5v~UkVbD)rC6*s(^7jBOMtMS7(P?4=c&F= za>+m=|BKqUg6ffjQu1GNNqZ=X5)QtoI0|JNE=C0KKtJXmV}y$e7>An>0qW4aHq2G_ zzx+(YV9FX1kmqW>Eu?N7?TrmX$V+Vexl0!C7l9~XG!?!T!LC)`XD92><|!bM6R#4M zH@8dqT}yz&0HH~o4r&@K@K*<+y7%$>075=DK8U|4rQ$k=MDO(VQV=m4W;Qu(nywHm zBFaq#nx~K0l7Am1T=ZU|_w0qh2|a(2c)Xi@*3-oJk_T^U;mlF)K83EdNn);VQYENZ zaJH#T>Rky$jQL>mR~!DUI~qOyrXD8l4eV&y?lbMg(mrl(Bd;n$Yc%Z&1GYc<2M4N? z81>lPNy(-x2$@zBTsH%RpmqaIL72KHz14HY;~s!Ok#dQkEAcVJtQ8~COOy2$yB6+RoY0Tx)c$nUalzSi{=Lrt;Tdsm9w;t^vq#AC$4F*HEUq%G&$z>Fk zKHr$9l$GQA+(`C(oK9l)GkX>@%=wPUxpb; zx(VXunX>9Ve0CpCI{$jxHK8k`_RGgUvvP9_xO`Lhl@Dclt6kwMjaA>WZi&#uzqOoi zpM{Ah9%dS}v?<@B1j_XdPW`z}FGEA04B?$a7x zSw>Sz@2?Cpc40m~+KjN;En)=yJ27D!SA&}jQDD91^aajqCiONM$337QVNQWN`f)1i1679t}HU7 z8EmnTu}ug!pT+tuZ?T=7YhA0~iuV=E)nM3RF+@WObaE><4nX;SGY5`XtlH+u9~rJt zQpE3FeM&Y390Fm;36wsVUdr2kda(KmL z+zu+2-?_L6=<3#vgHs-RdlkJ?WD^|9J~|CCk__PXmaum!5In>f@(8of<6^j&8AP7% zt%m$^JYWA5@+kF=6I~HOa4|Eone!m#tE}4AU5r%^L%z-)lPdQUvYkzli9AP%T3{Rj zd+#iR`n8bp0t}8dC4e%nTAH2RB;IdR&UUgIEu~LaIAlbL*g90U^>b7*e_`i1-hzBH zVtu@$V4Do88b?+3dy(Umk^qex;T+f;V8!R!P@-X9I!h`=nwCtvrZ9BgJygzMZ=ij@?k%CU~#0XzR=tVxcPtl7zynMJGZaVaKu83g1n!^jre@XkJ z?W7du)?B6+=Z#-S&TXzExlt|ENK!!QhMok-GVeMDZ9+7J_&vq?32ke=)hwBOBVd3k zG=`zr2fECgeZSJ(=irG^*E|IKC|h|}jQOZz>Ua2d z+mEWT%z|+A-%L%^7cR|NSqTkv-$A~q*cAf~o)P6Un<|6<^MR{>@j<&+UAoCM(<9wo zYJfYO4jIC@K0c(YDD0pcuR{MVZs$KQK>-~Uyf8Bgb++m^Y@fYdDk^go_Fv)2?bB|Y z=GFVQ5naIDUp}=pjsUDu6xW92JPEk~rSMBDeN@;Oj`W-~`3;o#<`n=9-A{2;=m=ZC zdvLyBT)~V|d?K%-h<^^_QmG-MvsC+6tBk0pO=UMYZ0)k!PYL(svdFYN1?P-b>JL<` zsF0=CCcc(=3LoovV)y13_7wN$E%)ZdfhSTr|9EocG&??PEw*5@8O>EH^t#qKBWgqK zz?rt94p_@?Kjm^lUqx&A3T_ST{GhLb!RP;*xLLo>^(UCpDiVD@4Pf=Dyy;VIDyS%2 z>`(n|xMQv@f`;x>iiWy!ElTS_7=;{eN8-wOZb zOoJ=bvZ~)Hy)A|pog2UIG`%FW$zqs9VcD@~Pgc;)Tz9Bd?3(3Z#WCSJtdIPi@1{8}_zA1`l2m z4gOm5K@H?l<#M=vGH}y<<%n176s|;|F9z_NNaGH$v98Vgy)r*1sCUd!ZV+Q9E zT+D9Ip~m{U0+2V7M)ESffVbHz9yG**EdcfD-`S#~xb}%~O1GiAAu%>+ng$rrb9#!u zyzTI?sfZw6+TYL7905Xmf>soNVmZ4h$?x?E(>24c8zVYi8O)o1vLnI6fv~+FaO075 zjD%+^F^h2400uqgPE{-c`uo|pZmg`ri4(1s(#73IXy5 z1yMozz2rs|@>z*eBtr^PepYZkmJ$-5_x{^t`0J4q+hpGR`fXc|`GkbMK{DfuL`d)r z079H-UU5kgCYH+pOI66_9wjv6+7KUdW)s>ZT7d;qd!E0qi1%w~Ip^GBRc|_7`AhaH5^PEZRcQq?kTVs9uOI7I$ zs6C}^QM1c*SAUr5 zJ}GpH$6cG<~jXz&`qKZ|ujIk83=t|kQ_OPO>MV4hv zrGCR~qPzHIV2Tr#?G{R<rK+bu)B)hpO%PITei7r+lLP_wZ=YInd)pPa zE$RTtWckOA5FQn{(tC+q74J1eX}KFy-=*xh97@V)mQ!w6p6c>{B_nlmy;e6K=HEd~ z#%FP*U?I~>i%y$B!aW@ImdMHM4Pe`2v-tBeaYsQ6R?ZLIG%H>L4dZhpp3cxfgoL8(ue8Pll8~s|(LEQbwMWoJ>}|xs&OV zlhi}uHh2{X8Op4b4q8fnm2Q9Ha>UsP!d~QRFGo!De!BQt*T^JNu~%tXzJBX*s%b`) zSIA~Kt$jUc%`W!jB-$}p1)+4Ek!zam*^!>L}(Ygn%nT5ra@bdcM0P(_tk=1{%ccMSe=1r%vvgm_=WSjP;`(2 z>%c}jnQ~V(?uY-5fil#b2;m~v1r9hJ4)q|Sra2ptM6pPA> zTQXq8X-@vR^0CoAutAEHij46SMTJeVS25$K%bG;4J}s--RpmS)Q*~%Jw*+z&8ot>| zGjq;i*3&-`z8cVu$*0bMHs0HM1TY8^ZI5_%LP#qVVFQJbVgr^xBKeFTnqI~(Hw{C= zd2hhZAgx;vcSzq|qX z(4(l81D8dPHnuh*>DH*20}@4|Ox=oxz>6M9(YmROG@UQcM@}9Xkn@5jWxRC&l%1`e zop32pJJ04c6*7kB`)3KZm@skTB37Eb;siH)Nwps|x0JL^$;ISN`d(FP=wQ!*pq_Ln z*7rJq=WnehL+v_|#_y%R$9$Y6IB6D(Z4;;m!!%_{ZJ?z$)#r?4u2oD~OEarpUiIrf zY^Fw@E4lb_`MoRfA;E3}98WJ4*2mE>kOi9H>{KIT5Rcm=W?l;0V^z>KG7KXPyYIv} zL-o<4m_me`Pi*Q&2sL~{t>qWbRI={__?uzoM67{Qh+rt>edoPPrC zxHEK15;43zN|iHXLNulj8xn5ttX+{*HDMSF_9;ufdulFJDk~#QZ&oQ=5g4(J{Q?4z zRWM?@9wIX|%+*u;zNF8^>+F{4CHQV)4z20fG*ujU(YGi%>ljKSjEcNzC#NtrHNx7d$;hk2Nd)HsD;Niuy{>x_G%)$#Lm1C^OoEhqQ%% zd9n2WdI3yCY+nkx*17GXQj?x?!6P6p!I}e;RBwJqMBoZKU4t{sQDT;tK%D58tFcwx z`_oA`aGGptCsG_7H2{ncMwL9s%b9N$#6}}zkf@Rp;2xvfthS#1IuoF~|4EH`ly6tH zg+UOFhX5EB3-0(Jw zEYp^s(*EjQe?RqgsyMSk{jj4;#kQ+E?G*7yuT9{9RS=Da0H_ug;a7nho*S9`I7-&x zI~f=hyYCOX#_g(g%=$?1U(i(0t)7*|(3?kg0p^g-T8D!r4W&3fY1wX$} z%%)&l2&KN)jsj`YP#_>kRxe?XZKrT>7xFEMf#!DHYQbY4Lh%y0Uf#_a|2J?Z+l)X# z09!n}k>CW}`?$Aylt*D|F2-#f`&)uYtqRxz2TY=%8;F;WD8J--o*h7T=%3|QgL0W_ zn^Tp1)0haKAH6ZUPAUdhLlpu?6jR;IUVb4DAPFK@wmS-e@5uB zjJ$&Q(Il_4T=RJrYt?rQANl~FEjr$#y^Yb)#^m(?#$_oadL+uj?Q8Svst@1?;l{G% zFJxj0?+&@8wF!46yga@5FBypZcA`E&r}WxbLS=Vb!C)Ml_!^c9*P_AW#Olbfj-WGZ zFnVg6yNrmvE1d(txW}5Dwlp*KfCsH=-xZX`HO{C>MD%A1njPz_&jA9CZcDEf6sJ>0 z13gC{PLaoHz>@J*goIM#KV}!<&Zf8B-X;rQe@d3LI zKUN$-eSB8p2UgA$51tB9W5>n<6^p{ZjY+HkWb)4rQ~foe=p_lvMZ;u2*I96dQ!Gy< zB{;wjC1F-XD9d8I@oZxMNt;P|!!`(6206~6h?BitW-7V-H*@q)+J6Dj#yOi$)eOHK zZ2M8A$t@2C)(1Pi5XW%$6Z?dk8G=^%i12pm8xw6rP8sLaeI-G=rI|(m-n}2wh%1u? zCYb{p4yn5So`BTe#qLrdoPklX&h^ZBRnbe3P|D4RLWXXpmyJu^^X_X0DM(=`A!o}! zm4U`J#eUIhcpa&Z`ob;)&cA;%E{jBo1`A-Un4AEjPl|ggJ$`WRR<0quyymPgn@1GS zp0noiK@aUC>Nv*t?cubv`3xH_ukByJ%v7IMQt7y20i~{0+=8_o?5PZxQ6A8$`+e<5 z`QCmDi6&F7AkG2%!fWEOTkXw_Uxo170ZQ#VeNRwGk#u?0pK0>F34a^HvWcN-wc+eX z_*gIx>ii^BKNjTsM?5+{ff|pM5Gr9m&9MY2V)~#)QR(e3J{V5oSBgR| zI=XoCEr9e)w(e zudAf0ABUVNI34VFNZL$F9v^FKdy)HKOE3AS6Te$-TrxBQp?fFCS>`C_OwBBejj{$u zndrWj$-+yblcML{NPeZT(iH1tt;)+kyT|Ig$l9V_^FmG**7gH{FDF;7Jg;UbIh%7CMltuQ2PY zGZT@Oy%v@l9`Y(X|4*Nf<;>PGUbdbXb=l;br*(~5L1-DtseVg9mFx-T1tS}_k*eV) zUBq=9CVcQJC3mMSx)X<)=~8DUvX0+BH~?PvwO|ZVgh~GI;}D0)S4a`X0K&)A=5XcD z%$pTQdFwGvr}Eh08#6yd;aW{mfbgCXCfPXWS%w~pZbR%JgT5im;nt9f6p;%E)zf}| z{OtJ&YYz>#_wK8leV`__mjdun>IOAHu`nriT70ONJNRnTR%%|n6rkL=v>QCTxhr!w zxzIC_vPn`8r%ME3D)p$!!ru;Ls_%+MKyimbZ~rZ+2AEwI)GR1lVxA}+aOAPzA@>nM z(b+zvyqfzk>VNZH#4*Z@g?^dOYtBi|y?*;B4P$Tnx;UEd%PU9pSj|H33S(k;k<>iI7GFiOuapkCTc4G4% zl?4YI@i!?J^0E8!jg!>2ZFCM#=!Z}>Ignr$W(Zr0Sux>U7`)xY(*=BVGc zONVKT5pUP^J&&^Q=`=j%i zLffA;+y!gd_&UENpdd2OEh_8<%p-WUHYOL`(Qv+cCYZ+uB?RjN=@|`ICO=h=;wQD3 zmmO?dXXoJ~?PS{TO6P59H|-fWmfnlu?6!_oPnY9r}pe8PZ z(Elm;dIkl`@{4frXty>|JpEaFC2I2rssmM$#|$*fZz}A7<}JbC%0#R2d8R{iGa2B+ zLQ@nqmIuf`nEc~Fhb%?Md`s&1-&08pm(NrNjW_&O0bpLJQfuYHqolkkhaJG86$JSDc+lO7;C z{7xs710>hbqfZPQF=V7@scySC@w%&F10XKYl$}WLT~|d^yJtuI$blL8n%wI!G17>6 z#U3Y4Y@?}&1K_E=IDeg}z{xX^PfFROHjlSl-cXWi*DZiZYX$GMdZ4%U+Dx|APOIYH zM6o%fXblDHTE14462u?G8-Y?tcixIFH4~-o49xZnUl@(M#(;fpD*D=wIuk9_0(|>; zbd9XdNb=89v|~Sy0P*3;!Lqs2(b`W7GHx&1WJ2Iv>5!qE9BYo{f9_#H`Pzl2FiQfG3ni_Ve_+H^BX4Jo2H6rf zU}>5DS}NNYK&QWk%+gL!9kaP}Z#(wPg8-YcV}ky!Txl6O>W}{44%_WZP!07|kb{C4 zvhm;cGGi9i+A9iEMb5)H$pEi0nq4{T?pT}NFiskcD&ea({Vl9AZ!)nt)-tmc;BVPF zUNCNo+gLOOzV>oIBXSmI7%M7Rp(g(ZmF5)$Bpd|2O8IL&LhjQ{&iw?aaxhc%xv9dX zR4rx<(%QPz-Cb3E&GGLx7FH&j0}VaqNEsS15cQL0QL37Xs<8q?hWr|RF%E_?9n<%$QzN>UcV!N$8#Hae<8?GD66jh;gc`fmi=|Zg`5WPx>{a|upldkHB>49=ZNg6B zWARq-qPj&h5P}#vXd<$#+YbAWIP9Mxz6ZPY-wR1zci+9W9L61Gv)t+J1cbMEsV;9m zOzsYzpCF!!kjaPdR>vJh>D_6w;HUlR9=qB|U9_S&7oTF5a-Qc=On)-3 z+k{iKG<{F)2_R(HkMc=T5$dh#pZ7nN!+YZQq*@tZuIMY7qLV}qimIyd<=0V&`??l8 zGpT|%ffdo)^MG_p#7OQ)iG9VM`ss0_@1K4Fb|B@&%6`Rs)82OC?NjRKOCQ5%j#0Iy zyNx0jE=kd{XG)eM_x#@oXi|0H9*w+TkUNrUV1+wm6;AbCJ>@>c{I~Bd{=6^Vy-ilY z(r2s!x6QWi-F^GoU81*if8TbeVDM`cxm@4`_xNs+N9#S^h-(;^M0we6I`$t&P;s+M zJEh`2+Foc~Hr=PJgvIU`5EX5GkmVMF6i4y+iU_xbR(HX%H?M5WBa~60ZJ}d3<5Ett zvcY(w;FRdUNGU;X$9r#@ccFTb95I8|=fxZj}s0o_%#9oHcN)Z&OTm^BO zIXb8mNiKdP@+PV`WiJa_AMH>lh)Y{=0yaukCM_`FQdgljV>aHL511!eGhS z1)?uZf-c5_Ik4apIm6u<(k6>GO_Jek9gXCkjK3Zk5!8-Ahq4>cEo!L4e(KGMQZ?j% zLFR`U^8Pt=c?a<9T^4M6(n?zH_;VojHS)oGEsH|%tJqFBmVQ*PiEc6&W4IxG_0W=XlZ7eSkLgoLWAfeP-mgBz_*_5%-S+f`$JEU<$s ze!XSmy7snDotMVNnnx6N7B*;cFbF`z=kx9zd+*PyQ~A=S36dbiP=h3IJi*fDTO|HX zC&zL_M>9o)P71v9@7vklSK?NEH#SwjY|K zqX~o!T3%yJz06Znpq^@&)lRTm#F~vw&|n`E&OwdD#6@5&0FWDz2Qot60|X(&p(Y3> z+AF~pgMLIoV$6(zfmIp|sY}d(7WD#^U^Ghi;#GN{B}SZ#VeM_QGfx z7N!ho!+v@7#DLJFn%AB`i|>C$dH&;dZ;f<=8L>b?s)LmU0%Kb4j@0t@x~TFQvVoPZ z(b;|XB%l(xR?mJpxo&6j`&fHbg0x_O>V7Hb$b-?ipueEIBvm&N@@?$)+dX7vtKBL< zLHr(Dd=JG*1yVA-=1H$?h&f!P!j;{Dw^XCeatd&um&x+?Kjq-N<|Mf^81~!^W5)YDk|D3z;9Qx#Wakt;7t6k9Z`L8dKXh?DNU*zb*0`5+hAQ4TS*}AQiG)<851e zlIQY3&0I?M-nq)QP`WIT5!8N0u11f1F42FN;>GIiU225Lh9}TY>iiCE-FZx)WCsQm zu>UbcNUf?U#L5AH{9dWBc8z-C`T^Zc@I49=X-cdv=(La&ABoX30e{(B++hfgE+WJ_ z#C*RI^ZDMN8ui|BGk9nOv(Bl`XY&jX6r0w8Iw`hewg7O$asMa~hCHc%lhC5imaj-j zf|_xs$D0A1VA*+hNvS_^>8sr~L@ew;l9rPVnO0>gc}`bJ*fFIUaW;fEeNe1nu_X!6 zGn;tmbv)?G8>pGQ^EgZ-3nNPDM8;*#Tc`DGOM0H#eTM?^JvA@Q=YetbCt2_S<6R+x z^aP$)hj%CBk4e^;vW&{`9QdmL4n0d~fFm3PMLZro#;&8)@?mD}(2B?bZ(=v6jF_-g6`B#y^`KgL9?NxwIpOX;5~j zBg%we8(^a8Q=spd^$(0Xb`Plt4baIy%{vdgt|4s5V-HFbE~imscTD^>ft2_Xi9Rv^5-GnFCCM_UR;oyGJbN&M|GejRO~ zR#4Tu)NhIdAOCFDBEf428TGx(hHH}hytBYjp8UvMn;Q+jvaJ(GtpfpvkNwli8q37g zp6W#m@6A4{7Iquz5PYRl8=uC?z;KBJcy7G$>;>b#KYWvC_w~b!)?ci%+V}45Ki`vy zy%r4TnIP;)=HK~IT2$Jm#wYoDk2zYvRYIF(HHB}71NBAVrWor`atwd8($l;DD%0oS z5cTJTFb?dH#PByQ5+wO$GYs2qu-mQdguhll(zN$YBFr&b+h~qz*vokN!+#Yb5R`0* zKA=IvKB>i(f-}D?rH&)*pwMG^)S?A3IR0diSWSNa;C4%|J&@8^LR zjmYBom%C5WEjTQT5*s$2&;mt%N3R6pF`zusJ7E3&JY+lt*5!@GEp&&h&x`UArI_mOr_0|#CWFTO9(I`EpbARa z;(6Q-itx&>()qN;^Bqkrk@(=0bV)*FIxZ%8K^u}WR@93K8tNWV_(I53o~yY@2o$^4 zJfs*?-Ez9G&fiu2GWoxa6HtaDV1;AC>?^pc01auv%{AFH0GVz&D4grN_K}fY?sKvG zmuv|y85somOl=R4*31XRBaCkX@8`R5-kRdLzmlVsw0zyG+Pj1n1q6N*Nud+8!#I@6 z*M6^QqJ12)Xm%l#?Pn ziZV96114sDJ+rCEcT6h^=JNs^LHx#`>-(#epzfcsz4JMgBxtj^V9|(f<((eB?ptFn zfQY{m3~R&RPDTGoYgsdvv^mI4eX7lk3iStg=u7uf2)McP$|d2dwkA_Y#ZctW|x)VwzSJdOT+ZX#|*`MiGF%L&JBtHmx&2~ zn3x6oj!_g9@6;o*H#=`X?YW@itK-r~2o62#-TY&Ey?*vxuD6A4997SCNZznqAKmUm z1TaB2-L1!)G7r`#f|UdPx<0&M7?z56o8aqASW`qC2ok#%2WDbMWxa2?u`|$<#IG?5 zs3^LOrN*y$|7$87S7V61nAeGK zs@+QmnK1L*_Mn>POjtWXojLMD?cA)#X9Y%N%f6ME<>kg__HNInx;_$o9(XUE3E1RX zKNTIAM%_QV9{F-aa#b}7fLRFPTt!gA+8Z7A5Fd3^f@wzrK6s9)u|G>YY4Jx5<2RRN zOMltRl<;tjC||@x)yBulqmf+sKlxVk%RwF8mx=0Ir8D<`1}pINvad`h=LI|fOU@am zJ*#QAxE%e&i_!)E^ru6azoww+gtUp`avo}ibch!wz<_t`_30(Y>8OJzx2PV6etiNw zA2V%cZ&jqy-R$E4h%c$VUH_KIlQhm8k6%M6EFax~pjLCcixe__OhO>oDz2?dPU^eu zK^vaDE~QaM*$v3~goVu5JU|E{Y~lVsPVTPQlPqYQeK0zLlGv9-L5@Jv z3?|phAH6eKOV44ZK@o8%T&T4-Y}x*I=YR*l@B}$_8TfWmGiCV&E}Q^j;M6{*W50iL zQS&*XeR4pIFCy-HuHLdEAn2!52~`W?mS-E&mrksHA&6_?l@0eE>kQHB0oDqYa5sUF zd&d% z_?L|?4`q>NQe>sroAh|IRX5z2a%FYKe94>{(d1X8s0B@*iFFWb?_8caA1l}*x_V~{It0Kxa`qV4;w>*-SDkDJT zhQ`WH%ScE+B>IK~wMx9pU8B_go9epW)Ma3wP<@qng*iUwHiiOO9$PjIXtm30IFrOXx%k9`D_?yc6MeWD6gA%~ z$c)~#Pjp167E| z<&Wshx2@FERkDTjuQi@BknmZMV52eMN#mfa`L`1R$$RtGN?Qd=)7H+UciBkroSU27 z9-p5uq}-VY@YP1Pac3yc)bUQYA2FaI8Ml!68VdeChdR)XS3Dr_6)Jmr$22x`CGRS9 z>eM54=B%ibGX7=#a5k5FP&~?>`ZnaD&9={fwuoJ@peYF!i+Til1@VzYQMwsY&aSO4bGE&DCmnUSj~>a4!aQ#X3b$t)oHJP+;#wRQ z|1xOz-7$K1l|>jo?rtgp=zvem;|~wnfcFSUi8s(u67P=$YWs`fCNz@p>?JMndN zmx9yb?4XnPC@q}6YI8(e@D;hc0O7|-8D6P;7(t^})#E{pJ)+1eITq|l(=&8I!+>QN z;D6#D=1P75dhnHm4(!8#8UfAHAbB2`n@O^g@XhxP9<(yInI~1O?0LS_5!N_6j`96& zSLmy3^sG1Nwv7!iy_0RlChG9H>XoW)aiGr zg@|7+@W0;+5OkvcY-GYwxwBv*9dq~Ek#$p$r}M{qXN8_Km>SP>!AIHwy3NBn zPpL1S=j=0em7ZQ+bHdsu&ENElNdk=un^|L8s~dUYysx62fDWT=hT!jSUc^o-cpw;7 zj7hh{NJ5II=S0OTk*z@o1xF2ao-;RR>o#9JnVI8YzN+(#G7-xhu&H*@*M{u;4P+Ur z)LR$lYX&2|UqzqF1Fx}R*$}wugxxmET}Z1|PP5*;ou^OyQx6bw?T+!~c!k|eXWeGl zlNrg(GT$dN_TxW)%8I%+hvqS=o82aM3^%_iuNnW^1D62^DOX{lx9L7T6o?1y)E?#5 zwA*M?wM^&!?qBb}YJZ$u+SvG%ccv~2VzT2wTpKHT_7^pqWVtaEL%*ti6TqC(k=U3z zX4?}@sWj}TEHJ%0aJ5u^SL>~&D)?DJ?De(I4U+_bNmQ!*e$^yy6 z>Kn*-vRi0~s^-IEkG@4;ka5clau=|ge|QkuNOhNFAw zjnX2mkDK{^`4L)X2N|O~N0FM2<_Wr~W#Jx6C%aMxOkf1z8IV7K4Cg_j(-z@{mF~p4 zZim004!A!giC6dzt*5~b;fu-1$qs3i$gc}0I*Nm~&AiaDgQof0gt(7UK5==fOl{h| zjKGZS281=k3if^tS`&M8fRicbOu>A0TV2_u=xO`Ng9C2C;d)~&tDpFL-Yr~GqHK1! z9?sWCNiVP_y-p#W{|Nrfi!k^~uJ9D7lCGgfc)99HW!rBFj0qg?>sgrci$-qJ3Ny-* zM`x{zXV}xBz_|lxFoD9+uRu1olkzPXHIe?DNo0pT%z<`?me3ebs)ezcQR}$c>Alb( z$!)|?5adv`BBjaO`Rrdf1*4XvY^2NYLl}|)F+Z|)LCSsIc5Md-B`CH=3lS^Toz%gY zp%ZMDzRfXzOjNC}o^qx20{DF{55~+w-xN;hF+yz@8tfVq9Up6KnBV-j^~sn9$<*%y z#xfg<)L)SBw0FrJUkU3uXOKN~oMt9m2n*WH zPYt?SIV`yA#hq(c886N?91aJ&A1j9`jGmIH9uxGe7VIvP#OloOI5d_f|7Ay!Dv8|# z2ll^DnxMuUyM0h8M+Jy`Dr?UllQmK$JD^AiY~V=tq=5Me;1*fs$zJ7&?kRA33)<$@ zTij(t5$AV*jfRoI^fGQT+N6i)PSPfnnL#~qAF*TO+of3wV% zMv{3LxsIPS<9mi%z0N=SMepWR7CdZiZ6W!7MjBQOV^UQ*69DuzGnYx%x(D#K^xjO@ zk^m4)c-p;}KHS~PX)Xaz2*9-5&wuC61IU_^M0dPDq11b>JM2;E#uI6267%RyAC*v4 zRAl5!a50=z*J0KbY%g&*suV`-?TKl%OmbUlPNh#t`@S0!IJA5j0eRjDd_Xc~ASSi^ z;6lwHA!SGKqvahEoLGquPA*gDhXz0Tj%A$MQ4K|sT8=fIiBP`!Xc=whP1O2ips&wJ z%9Zn`@EO}-7ZdNwXM!8V1DUD!uS4opr{VQ0*21cCtGG{=_IVy_v?|6w;)LePnua(v z{*r%zjD3=n#H(JkQPF4x&G8eiV>xP<*xPcJ@{`=qTX(kL{Yiv0h}@rIAdVklAoQUi ztt1fa2KZ6<0|3ew%;h^GT17a>Ro%z|!$+|J!vDx;8Z)jJqBO1yN+DzY`-gc&2UxFN z8Y3Vtp!uDrpgHQG5KJ#zw^z6z`%Qb*WxSqW{;$-vAqH~tfQAW=QRagDSJ0-DzVZWO zet)R-JI4#I3e%;sxWDYY+^j|@D`X7niQOF{I(}@Bsorr11{5jcgjYHPi#s2Ww!wxq zMCgYvl8A<2s}4f1YX~+ya~Ua5c?><`inFQQrAdOJiNCSdRwYDuDrS zB2tn-h$%~)2AAcdD>OPPv~2k`Ccxx=Ivm{KKVnIQBpm+a7f1roa??^hDFOi)PQG`a z`*-ChdyOjviHZf5LBz_}yoBhc^0pDT1lQ^G-R7sFe(ub1J+1-|7Blj7%6HA&{0kES zyHvJAq40IK;wTO>n=K;RAF-hlGUlw6`FmObzf!#(Nm-5?58anoiJR#ws z_fPP}rU$ggIYWqfUaPyMfO2nueyL#-u|a88S*Un0gkC4Zre}s71U>8 zJL-cqJqF2t8_M}VrEbm&(#~gqbB~~A$!%z;KY@aY1_@Aai~=m1+za7msezM$sk_8exzBE49=r4ZlLz}KDd)$@jKAVLhRL=(IG4H8+ zKF(G|ONbtlp3Wn|^qi|ed8=EZ?xt8A%AFKSggaiSY=fVeYK5YgEHGJ9{$5W5%F=ycUIchMOBO`^^E9G`97&z#XpQuW0@IN7@ zB?FaP_y=pW2QlzUUZbtTgyE7oJ)<@6*|Mjz#0O$lj;*vO97NWMQB(JNNRMG^kQ3`Z zt3ab9!9Of;g<_Fn4ugh^TDum8JzIF0cE#QX{`+ek(%kJ2MjuUqg)hF-SEZx@Km>L zzHsS)8Gf4&(u5F+UACmxR%G~`{6aA!0Oegva6Lo{>CV{}O>u!^=ozKu%V(jG=Su*| z9%} zVRM1jf9H;xPm%~t+LNhX&^P#IJR zSox+|4h{}ttJI>ySBdo&=x7#zH@=3*Y60qV4Y_gQd`GA&!4DN#I*vh%J%W0<9nRSJ zq-7#R2mbhS>2JN?YPi0yWSO3if1sT|xSeKTo1FM4GC2R;WqahR(&QyU_Nd=fj7mQ9LVgj8Q_a3_MEhf?J7w|yv6g** zST^Pr|K|L^mOW*JJ2~*D(!kLfIriH-cJUE_0&ArUuJCIZcr;1Q0>VNC?f*2j*)6EF zv+Ud6oz~mTxbrYStt-bpC9-`Pz#Bj`{fF5#B7av54-21TATA#LlFRNztVbNc ze^0hsh%genpq^`ZFb3q>dm0Yyn34Xm(^0@~)CtQb`Rl=TEcRzLfQ0!Ur3&wdXLB(v zSZrYdnnZ&C9HuOPiYPD%lw&iW%sAb6=eQTQ>@B8liG$7z+k@pV&ikQMGrz~1ZA#mP z_Qi%nym!Dt1NATvwMZ&oe3$4kp%6gjn6Ba*HKqhIaYTVD^I#>i;pSuY%zsLfNad)G z#PHlO;b12h{QtSNNpb9LCZA8Pq+B&ikcI5EZ%>}-F7vy?a-nn>K5(lLYC- z^z(s-;|9CsBh4bO^R3}F&7$-5N;4I7T?aAM-35Z@3^~pND`fw;Zi4zRK(v|*01Oi> z|E0-&E#ZPKY(I54K?(+w|FsT|Pf5fy-iqp$@X2ENSuj$bYz=4lEHo^ZGjA3}kqcd( zu(p7-x(D=r-|QBy<{KVBJT;kZShQWZWCSTO_=|G8g&9GR*z$X*f;s5Im4~1_Rw&0(A8K{v{ zTso#F^V_Ic4j+qK+&6I)=KM>weoSl=nC|}LK$>}8I59MT*=s9gX0PaW!p3cZ2aA9H z%K#UNq*5yC&+VJs5XAb&sQ>}&ICG? zAyhTpaHwV&?X^xPVKyuM(rio^i7E+ik;xmgxbpMm-W;lhos{u>pS+d9zwI=iwhUoa zImi@1%Eb!sS3O^Zo^YplY0pUy6aL#zWb?(WHjBVcJ|I|rs&S!X<+fmZd1Asj(MIUe zSh*Op_gX;w9&00{y2~44T==FzQMU4 zO2895>I=#?Jtzx@OJW)MT?{VfB}5IAfO4~}@idu0TQm8oY!@Ee_9Y~ePg+5^S-#`} zUK=#pALc-*TPe1XrAQA${^EF2A<+Ikz~I=|1&A;jg2X+3Iqvw0Tx87nWlr95{@#Q# zSX`P*qUum{GT;!$1*Nx`AVD_~4BV*>MPCK@OrFmU^;or#^wc<{`vc(el(`bewRS%H z!C2%!ddG>yko-5yVTLK(T%L-+SH0to)7vlAN*GKmLGA{7#DIU;i!V zUt-K75<*}M!UpGCIYmF~&J;d+Lb_N8i5kqkzcx<)nkR>{)dir9X=9n>cx@u7|B=?_d@nR4gi^!zKxZ`v$F!U1yf$)jN8vln|*+^D8}Az-KrUbBrk%+^F-%WUL9E-{ zcm3U;hvkj`nrh=St4!w278*JX|D{GEuc@}j4-+HHvwotbxO@6%w$k#dW5VgN;4VqD zGDvkkb(#N`LnxG3L9f|!5q}26DzHgAQ)X=7sB1em{qYP~ARyh;R|gLdqtc5kt7HiN zy?8@y$eN@Yj=PLQzx!aaMZ&aFrfe_0f({^oK#cTa6a^uDfAj0Pokye#Ug!NBA<2F8 zV-?Mpjg`o?1MQeo>jH=2B#w?ffepCvuusFXDhLh>$dRTrsMFM7(zDfIuF!!Fvk>@hzWnX zhzizZ&3cZMeSEg_QL4u)pUuPpIZD4dlJZ%F_&kK&FL!xD`Z_!38~loURqwv@Z|VOFa_O=`%(k7YvFt@V73<8;U~;Le42F7&{tBD1 z0eZqAFHoe8umJx_qXd3jFcm_>4N&w$G&&L3B3%pWF(R_@>5W>fM!6a_$HlHtN2BLZ z5cRkAewT?U1esK+m&!!cw7W8IOxA!0yYU94=sum*80m#_VC%U7^2%>+Y5iY7Uk5nv z^I~~1Bsg>J2sfrwivYRu-;xq{cRgKab_nU9mg6OvCLF--g7Iwu&W2YbzP>AYOE)En;W4_@ll9 zOyObI3@+7KYgQF(m54>1kgmsr0nqVCDo+s zV2lcTG$D&2e<)5H5ninvYoaLrY1xuj!6BH<^e=62>dWN&pLzr)doTn*PzK-a7GUDA zYSJ7WQ8B~4eUqftIVI_&FyRM$lJLX1+-E<`AJ7m5w3FzFPsTbBGfK0vOdK12g(p-Z zFT1b*sjh8cBL%yN}kXDkE5aVjMl9Aro3^8^dvSHF=;9_ z(hJjt7#9~i{C%MU$O?VO>~Qh$5k|tatkW%cOItfxfx2pq8G)!TDQ218FR=_UO|4d& z0@glQ^(cYE@7bQW1%T`KuJSqEkWS#NSahGa zr1V}%+&@GK$FU6MfXQU!4wK{q%Pp_p-)m!L+z`K5w;IF97zBle2>+{R2`GG^8{nT^ z2&)^+f{gVIFD6{{%ZPA6R5c^vhepepK9Mv|cwlCCY_F@6X z6UwKbSvN$CbXQZ<<^SBV3IJ0~GiEFJvZ?O6nDFb}VI4`p(HLavl`g?~%-$ysBQ3qf zXUdVEdG3XQ^TFq|I`m#pjTdyLmG8qn-pW+Jxcu1hCNQvBPUlhMoEQF#t?7pk3W7WC zb2B%<=;#u%(Fv@0Td_!EdxNctPm5fmznIbTuK-7nP-cHte#lN*uaPFoiE;5Mx+5)0 zG#mG56kn@N&f6gKr-GZ*m|!7oQ&{3GQyCLFXu3Nw(eWfC#bitV_v2R&Q-9ekt8HSgpa?>iLSN?eY$%G?y3?XK=FR>K9I&EDUEBuKt#YDy6K13P4`#U0p&%rW zZ;mma+suDTI-nHqTOoJ!*5~J{#vQ|6LJ#_*`nk)QJH-rzNfOnbV^6cL&XX9Slx}Ya zv^bJR%v@Q~bYd){=eCdlab$q`^*Ip`)jS3U0~_ICHrFig$G#Y^`TRO;epD0K)P{U8 znKIHs*#WE7`Y&VU6r|lxd|n`~aoB~iG*=D$&GH6`xhLN?Aaxc}8h4Kd*>nS;McMD@ zxh}fc^lO2oJRgR{bjb6sA?9t?3g8`LHuM+Uc=@C`f-OB4Li+)hG$;P5#Ge+jt#)J>J5jae2IgQ^5 zSfU_#YFgL4`RL8r6PrxLH;n-fT6LOJFMUFGyVS!l4Ob8=CR0U6d7B`ml9v4dh~vd3 zy8xMMzZOEh3|}@?i9mWU6}3FF^6ve5$EYhrL|RvrW!g@GC2TV^afm5c9wXc@K>^-0 zT{8?EXBnw|(Rr0%QjCUzIQ=uVu5oE3m%WiSmL62hA`9!V2KEFF+rEmil*oTghumT# zpID%+-t!*AnB>i#S9j+0*#$e%`qY%D`s;1I1v(}%*M|YIiBdoU2ltr;BV6^jJ)m{% zY$~>?ba|yKm_k7PDFK()%-B|(xU=6(81-Ryb<$YDU7am0nztJm!$l`UJ<=4Sr4@uBM0mn;MBs}Aa&Dt&DoPx`nK z^;41+YX#Yq_!0*LBOpplLQw+?uwQ4abXQ2#6)7bLj47cz`>f8%3Ta3Ls~Y%!Wg|-X zfeQ@MsdaPM&@`&44`3j0Xvi*Bu6!orP`C9*H}Ug?$uGaFN@p^QXd%db#(PDB)z>3L zxfL=%D|sxFEl_)YaE_YXL|-&W z4%m5-ewzC`tezdpTsSosRSW|^!gGha`w{I2b{))&UnH~ccIZh)In|&$1N+m@9@`=> z_ipUH!MJp;@2uEv919-m{uJGAn6R5r9QzYHv)l?PDS&G$YfHJ;M`SRlA5BJ8kYd;C z=L6u5Ij6vpL*)7MC9SPXY3ANoI^2d!B0Fb9N1W@lbOB}Q``rC8!@V6*N>-u~JW&61;0PI9NuKGw?asBy$aeE(l zq@=e*TmmPGNwMhe%~wQ`>gl=u_C9q~e(I4Pp#I|d#Wg^eI!K%hfZUPheN|ijLkf^d z!UgZG+xM?HU%Te_b{*)IM|?hng) zzB&6F>&8T#PFo{QpDO^}++B}ow2fD+)%_69BhQ~&-#xKz4e_3cT{^(tx(dkVVv3^3 zp(D}7Gk953b1z?WGnO@jh=;m#-UDT^Zdn`1WpV{Z9&Ko%dyJ#c6^Rf(gWEe8J~umJ zlp9HXfYlxSzg~ct!$7>hbIZv%HY?pzW@0*A6IcB5ncCvhzK%$)t*mSO2VqjU!AbeBmGeu)rYYza|(Rhn2XhSH~E}!dK=2vWI zn?H2w6Od9#d8RUe%c-6Ae;e7oo*?L%Orm`Hj3RE3Jl6jKBqG#0-)E3)DXJjcbhRx{ zys_N)2p*b+WA%OkDY8&#bs5dKY+`nRo5t)%{i+QLSCb0NeKm2mJ-BgB4RYN^qdPRq z+GDWliH`6?>4=$6?BP#bPltV(S=$&S!G!Z&pO=16DZ>VQ$ONNR3;y6>m;;I94c#7F zDJcs9@uBa`H}$`GN=NH*y`dY!)=y~Nfjv47h=k&T(r;6Mr%_-uV_on*)xc=AYv=U0 zSFMEcA&FLV#wS?>y_OJRbOaMkUhWb`uEB(NMdVI^Dt9aAHLGOTD>tLl-N-wyBL)!2 z)+i#K?HtXLu>fDf_Nzg7Kq5&@v-Rg4l}X>YjDyHvRV2sUbVkXX}&u?kbQX(+i~~(lYjEW5Nq9gbr@VaP5Y6D z99VBE?W*|*8fL`g8=9EPOC_&QQT&m|EwsO$750fjbStHQz82WQfXml0CY^m&OK?Wu zwJTXfOY;AsAWe+pIYOMOeQwXZRnSu1!X*b3PPX|Hmr+g~-Xu+e<&5`8Rl|%``^Sdl zK)LVMo!squO?2;Gtn*#WxG*W&iVzLKlk-xT9;vRbhjq_2I!5w&+dL=-@?@F%m`1fZ z%A43>oETuXH8k_%N0seb$$Q-|oZCMb zr?iA=4G3RR+xgCCc3G0wz5{?+s#UNJTFPd+%$-zEIV!l=R3}`WYpNBMEU&6+|$Z15hpRB6{@#j$64L zfN;C4kezvdLx7mGY<)NHv{shbRBufVu#=3g<)`JI=xRq#CVClKIHK&cbhfFxJXV+u zppx!UT9gPWT<3GUP+15YOA6$h+mBv7NK;nm)JjSl5!|Z>S1u$-nh@qWFwxmA7#=(h ziW4Lq2)qRcQQ-L7Bd51PH9*(W=KSkw5-buXLTML`CyV)X#G9`2fx+p7XP|k%`BSe1RURq zd%3qCecL0`{_Sn^_BX5Az;i>fOjj?#CU;MDbl3{|49{igiHA*mSKEJ&dVD1r^q&P{ z*ebU9F6LI{QtjTYUH$%BSnxP8Q%3sH97i;4U*ZJ6a9CXjId|i4RkSA6BFn^{{C(2z zK?tVh!b~1l=KAb~$e(;?OzBZSh*A}$Kjq6ST-U9NH@sVtv)tD|JZhib^Ol4QImURl zOSC8kIGCV70B%ae@qhHEHh_=Mlt`tcZTv2mU8pGd{t+FKa2MO)i}#`v8H0jVa*`yw z>glyF*+(w{|Fn1P0R#wD!WV#;*ZM;hfH!6*!Y)FHkhy(|^Kw5z3&CzFb;&O9L`Jxd ziU#cu9XA$6X}B|SHL)j9^lDO%t_8jlik3LyE>wLdHj_vFXM^NeRGeedAMj7;O!qOU zmMoHktt=3UNOvQ*yW9A@)u4L2 z8+5%h63LvIvFl*_xOezeD!uo9SShhHt!b{1~OldWbcRdW}HgcM)I`YwKIwd)=KEEcm%BK zvMrS^E)=4iQF)|q^rxrz2=(GA#?J+WSVs9o!w@*n5HH<$ZbAkmyEL}4f=;}PN{f0F z%q2RA5Q515J_fz^dnT5rLI}Np!i{@w1vk}7>ogxE-LZn3fNk|^4Y~g28Kn2fs0YYy zbP#|l)CH}JW+Y$}Y2`z&)pn9P>N(}IWO(?p&5b?Vz8Tek$)uNhpg1^Itax(RUa$3- zjSJV;g95g@y1g0wG?lJ%0}Ez~0YFu^??>d#Jo|1RhO_UF)Qg_?B)9p5W1VFs)(z!W3pmFAdfm1B=d1GK zZUv##%*#d;M<3?qQW0!g;{*UeqOj-c82LKvK%0xy_brt^04cZZ7q17zbA0tbH`}EB z_z$z#lHsLCPnU}!ibR{osSh5zwxCv;@vW_GHHGOzyI9Y=?W+A{UNm^RxFo8n_0FHu zQUHaBJJ<6K6pY_zNd%L-^y?L+P`J`0o#<-=o(=fI=_DJqN{>RP>{>GN=Wz}QAQXg#ZQJEu1|zYM#L+4M&BNdSC0-&o17pXW4AR@NBMLAhvUucM9FEg@W> zI>g+e_az7WF|?OwVX^eOEqPPUiM)70=|<=U@F|ZP*Sp>0Ls3AaB@J57?vXy*6FV~0 zQT9W^r0B&TE6E=lkU2Iyz?4ft?{d>|3kMhN3g@Lcg@@iCS>1`Yf*VyWBcp>_NWXXX z-&X`n4JMJ+!8o}(+YNzd9;r{gyZfl`mZ&jIeOhpUS=seJhIexT`PkIB?ys5qRJ?2r zZ5(0MMD)PRD?NqPM$61$#&9|$tdn7k#Nz?lXNu?_!A9D3>Z%Voj$XrwPcKOs%XGT! zHe7x+%dacj%Ii!|V8FBQGPp2?nTblDP52{YA(p_?A}@Wj&YaovwY))gg{#lgT6<)Z zj9@-rrrU%%?ZIC8ymhs!H1B;vi^M@uk2Bpe_v^rm9qC^wc4lfWe3s+wPo>$ zt*`g^wnHklq>DT65pF-DrIxA7D1wyLy<39z99T+4A z%qStV`UPxGxINp5mSB6TNvx{xI3%|dx^v)fDpaIvdUP$OJzJqeml{Q8*YFILNttVxF*;pi zhHzG){`u2(kd$~e;K@esY&Y|a;!OCL!e)*f({6w0QQ{3*WxvE+a_y6NYP8#kpZ2)d z$ro_Pq?MN*`#w$Y`~O#x^MH3|5_X3XYPjGk6Vef)N7!d#KhObzc%r}b7%R|wT9#@9 z>=zn9Z#jo8@ng+hmei|66dmA(A(qY0{&G>&v>s9yF4gI%lj{4M(`YDyqTRWC)eu*`c}z3n)B!W-az*_S*R;Y&qhh z-y$W*G?VM~9=x7&ILvID&tGtY${Kv(Gopgvus>5$z)$3vPZkX2`$U?)#btVIQiMtX z9EtK~HmfVK@nMaa$L6QV!#_9#=2EP1UGIV7Eq8Natb|bP-_~|e;QkNHri&M!E9*tI24gm zdndPQQdW6?uHFh@Pcx^;weG90`9uUaSL#tJvH{$@{Rh-9g%V!kz2+5wl<=aDEflN` z{bF(sJ*(lmfSkNm&S=LnP3*NK-&7~zx?54pz77$5kmNaRuG>LZ*BFpwfRI>Fe&WBi zC4uw3s%a-fSd2VAdoKkr1|4DPmIYAvi&0lFLUx+TL@)x*%|e86=ZdyPEOrmb5*-@y zeYgLEw%UwVP*73Fl-8a#PI$BI77ku%srbND-7X;}LI;7X686n{_h#{o(az54&4+WgiKBxy_vQgAOE6 zt}Z)lcGjB(9u+a|W9NXZ?qGhU|1+m{)KdSz)&N>d%~BW2=KYC0m!Q|?D?beHZZVeS|Von;LN|HXJ}G=a&K4c?yj zsVk&y2&>A<&4ngv1kd#GBg=ryW=;|=WR{s=Lj>SEKmn>V+A|E|1@Z{+Ohs}-J83B5 zTN8YcR!&ndeW?)zWXWFf^^#1Hy?$pdQlUT-cM*pUl*G_&a~Td$;9+>P!Ho`8%91_i zOEVu*tdLWIm4VPt7N1z3$ZNAhs(8Uici`D=|BSKtOpV@tG!0uX&0yWxWRv;odm?7l zymMXrZ)V?aoz1G#A2QM9*=Ss~P+_fQqn~pDO4%o*7eb+OJH!hC1e8>nq zw)w?RWp0CV4;kQ>{D2%vsvc7<_%vq|A%rxGFC}RL-WV723GWo*GEbKM6w!_KDM99^ z6pGD`AiTA=21lD82L1fBAGJm0t?n*KpN{vx*jDWwuYzmYB8Muja}OHgyD4v?0}6ua zW&%p`&J2)`yPg7!S^F#^OZ_*D*ft~Q!?(m&1=v3*BsQ0kxwGTf-ugT;7I7SZNIDx8 zjoxqL^AX*+ycp|Qe0zH}nfcH-hLL;fP%mUz!nI{LH9jyAYnfYpo+nZ}+eKlmTr}m$ zwB9H-@1jrsyQ@9gyD2LEzh@C6^Yq(mgIbSR$w^|+CvvQbqv=UV7^hkO8P`vYT(H_} zzJf^Q&UZckjUF{!{OuLAJgex*bU62yC(|;g%PyszF13f~o;la+NTEaFvDKlyc-W~y z<$Xodr}}z2=~)f!b`#Ltzi0#dp)29q33073as&}}N(LVbhjG6f6Wq#t-dO-XJYTIU zh;(B7r(655n&Q9whD_?o=&F_@Czf~1S_!Zh!g7Ml-B&%`ls*M#TuP^V^Adn>F$PhX zI83~Ah`^MTOXF0vQq8^Y$kdvld}Cjz z@x7jcoyDFtA?Rr8GaR~u9z+X&v3XHJSFoO2e`m)D;gz*^esok8lUNHpo8bqQVth1j zd|m;r50WS2;_TfX(VA6njpT$Z^gp3GzE)1f0V4AgJsCz_N(T7?Qw(qDwsYL-)&=EQ zpD54~o>9*40v*NnouyIHr6QEzN0+E@OO}b_;tZ4&;x-!Yh!wGDrA4LPlh@IWuAXn` z$jq_e9L!3_ecoI~=P{jE-zx6~vQ{|L$|%fk_u8}SHDK_84pY46_?Ix?u0YWznei$u z9+_PU^|~Y4<4%LOHGVZmBSa|bj#+7`?{4PZ{0SvM_pSV%!-f|S-$iqY3KsdH*Cv-Z zRgJ6c7A5Mm^YK$G0}Vu@@4z_WL)bl)@?sV_cAl&k&AIvWfYr%!FSaMzi=b>NJ^XX~ zc(>QxQ)ZVYa}gGiJaQ~xTDzbzG}A8fCU>s2z|PQo=#KV`6!*q@z&Bu&M22xUOhij| ztD4cdi(o+GDmJBJ9TD3G>`Ln9G#o3a^d~?1ohsEl@;zT7j0YDS<%*`&)@B@ z);()bH_{4#WpW>(Adz*~$ScXh0b!fWRAJEPY_t-cKfC{SS%$H(4^?Oz&a?2Mxtsh? z-$S4Gd?rCV2j=KBwDe{5>&Z{tpAmy&ZwuoDsTHNj-WRGm9~fo6k=uBQtH(%d5ZY%( zdzKsuGyXQc=YSj6D7PVDK6IN$Y9$4g-H?>E@D9wCh=9CwW<8g18Di*eL(`s3_4s{hkdi zucoYgka55Z+N-d>7r1i@vW%qW#uJ`hvKC)LTWM&`JCoO2|3b%MwNUP={=Yq83NZW-;fWTi&ByK!J&rWlk9ozmg*vc`zG0muF!yXDNXa3gp zys&>4d#{WJqodqA;G6m*mHYM2+3a}jU5PPrMCUh_fT)G9#kiuBW{e-5i}#P){$5pR zJql3P0m|bWoFBE(_>NF#EBpTPehwexgRUUQ(b6Ub(AjK#1QtQVp>X?&rg9|8F}fhi zb8z{ctGlo5ur^8FMneN{VgiLQL1M94P5&vPZ>lwW+`oO z#+XwOWu|=FLG;i;$DSdM!63dz9m-a9zZ~HuQ8jnkE(JY-M_BxKGZO^U6%)@t5riwO zO$VIy;lPn7G_IKU&M;|p^zP#vIBosNTFIKU+SBlKtv3U3;DZ$F`-pGDkAE{lkaQ{B z^uhaX3|nD|YRIo#zZ}?ekbIL}7bt6{5gaX#r`}F+^leMIiu3!a9pGa4t&R$z_4=J< zQh)93U0r=f2SApBr4T3AmT?coIcmN z=E_S!%y*&JU-MLa)M@I)tMKFUn0ioZza+&u z^Q*~U;>x$sR=Y8<&Ro^yT;Rspbnq)fLd;Z@m^7q>CC1toDIgBRW}~$p?WDk%wz8_Y zfmSWLe*KH3n z-d5_dWf!14{QB1u)$cw|cUZg{JR3_s~-sb(p|2HCLj0 zC5<=cOu8_mG1_>uq$57?bQtZPDz8+L4Z0~0MKQX8Qg%vU1bV^&wCqrobH3cCwm~mC zV?wW%;3Hg{PS{HP349#_po-iyv#axyfgn=2$l`}gcpa`^H2 zHm1}^ihUXAz(SXLWrb(3XGthETH$Mi)rmTjEJ4;7hl6;qOl?zyI;RvWVVi8l-0cK6 z$iomH$Yodk3Ywgg2Rg_GI^w9Y2I)51N!uUHqkN=sy#q@=5x(Fr6K3eXvY!@Sj`0*4 zce2J*lB(a_@ei3SVsYCe&rY@^wh2%rkt~M!6y8Ht=1{C*`&Yz8_m@0m$2^sH39w%` zs3b*II*?h3%|_ARxR^jDiTBka5rv=9#CPIYnDD;ikNhM15`&JDCUGIrd28@(P-OUD z2xL}{qWJ}9xMK>gkIB?H2H4DEiUTxptpmr(oz2Cm8-9N2d^HplGL{!KSneZ`1aIcE8w>Ji>Iicvc zQnIt?MA88;L>KN8)qgtUfoFZx(s<94Mil=(5|=;2!D#Cc-oj^tV2-3q-l8*W2}Zk5 z^|t=F`b3uG&5dOss?Y<4DGtK$4w32PJIxy%nH!rw?bkc+>PxUP zV|IrmW>dv#-(fW(0JbPLyvltOnN792NSH2TiI>KHnCM+hi^$PxjTn)VRGuiwws7=ChP;P#ETB~r zX#^O%QoJO8vuT30S+#4sH|y(zA@RfY@HJ~do+ETcw~EY;dNsncql~V<5%^Ou@`O0w6gevQJ%zJhEkhoIxZgjVwx*#?BU(7u8q8tlPD)uieZ z*3{nGSs*V3qJ<~NQ}rpj;Ed@t69j9mS&-ro7vD;cEP+S~u=+v|)LmYefI$Ks|Me19 z=if>{e=S()#qu*iemZ%*>1m@-*#QtSoYcq;f- zcb-}M6%qrc$;HG<`S<~~ZeM4bB+2prpwEezeeYRK$*F-IcV9Y3`_nmAw<*yCxVt#{ zzyGW8IXwRfM()Xm_JLIYz{m6{|la$MNvS5HWwffo-JJN``1~{@?GB61pcO&QXj!oYJ%Y*fHOh^Uj!9rJ(>t$b~Ls#T@|O zI)c}GB?d8!4-!a#@ec(U+=VbfuB-2t7VlPC&Sox-CoBY&NgiMKUeCo0N)GvnyD`Gu9(Va(`^#- z_PJj|m&9?XvKDEf%G^EWtfHemsq7=6-VuEPp?$6j)yTBY1w301L=AIXvKIQk%Kp;w zc9WcAS_)@idK%*-$ZfFThMnD=JTo8i2Z_JjWkqW*4DgfPAjBo5qdg8+oDJtymi=rw z)GKFUr~DtAtVILQ`>>(~8d|Q1zM?P!{fvHY4V5>D6UK?`0_$@7jk6kzY4|q-@Su+R zW^lmvrk5^I$1E9%_fvLTCe?2pgQ5+9YMY(K6~vEtn#HH#G|5#$^uE+B=0TaoUp423 z|E?(xT<6`{xgcC4aj}63$Uhn9a4~Bw=QCh^iYYb+D9GJHJ_~%(v!cGzw6X?HwB+AO zZ>mkDz<`|wRkVY}chBUL?{%VKfbeKsN-awxg>1dVd$ElT!{wxar3XqxG})$_22AN8 z8%FO_EwLb%V`TKDpGaCO7+kI^|8>xXg zX$D0APF_nfP7nF8Aewd*n?mlZ`6%~)3cJd;D8HwF@3Im~>=M$lEG+^qDI&43D@aIp zODZ5pOD;<-5(0t}N{0dqNJ~hFbc2LQeL=cITAuay4?OpEzc??>%!!$6=FI21W@bCB z*6fTlg^q5UH}DFMl|H*7`Sd^9|GbP@9dOg77Gogm4AHekbL!9{dn!i>3M~(t_aq6K zx(3o&9b>(h)K>?(>jf9-T?brg?XdAlFLiVsHJ}+L*C3HBkD}e(^KJ5kueya%s3!%Q zCLB}tvIud4>QQTZDLYLZE1psAJt%#tazgB({3~l^*x`ovHNo+)+o6 z;J|0B{4NsH{`oc8A0huuZt@-CbP=a9p`!RJ`g2xQE>Qi8eNE(?5w#V6{u@XZYKBtj zLdY{XY|(GWfd2}7$ETq6{Bzo`nd}uQQ)NDXOgk&sO6GPjjvGEbF#VKeOIQE4Qes6` zqfDQOS6=Y#{6q-c`ZA!KQ~8}9>Xfl6q?WFw7${Y}OZ|btZ}!?ePoR%w+Hcx_46~o0emwR5if76~vdRY&)BCWxh6r)e< zPf;8f_mkyYTe;;&e?_odG#0((YPIh~G`*kMR`ForNr1rZ*ta&~3#U!8FM21J$gFa_ zI7fEz$E^v!_mF$FwH3&uo=iA5qa}z$VwFhE`6%`J{XbRjxCk=*f!qM|#@gdZvn~C% z`y%U-4`#$F!7Zrl6^Exf(QSNhN|=M>mFq`=_gYK7Do_^;cT!2dS`pM>F5Y4}y$E z{)KCJ-hPYqS#Onr)0bNEGSw>43fe>i)E#&7PWwLH#8l

        u`=;-o&&hAdaT5jeQ7dxjU?8O7S8Ol8rruQA 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/lightsigil.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/lightsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..61efcd2e198a752f087a9bf74b5b7db4f4539e2b GIT binary patch literal 41435 zcmafabzDch5P`bDn&k=OmaI=}=SLq5uGZT2J>L900(CTQERILbx1; zO`a1j$F>@ZSdnM{a(> zgs%W_H_+{2u$wD)s8_Hjw~n5niK~PgDFAQ-diOLRgw5^Pdt|eJ`5Jw($7p1&mB390 z4NN8D&CRFEcJh@{WPK*>1ceBYKEr0ax=2MjH6^s__LC&VOIv4)1vUUY5OB=5KYOi9 z`vZqtPcPgMi1I-CU@V@052{iEC~Q$J7~kRQ~>f2+?) zeSPdBxG=e}$|vE7|G3p{!PGOuwO=?Y{@mwoXU4YZJyGf@5ZbrOrywT$9v3}C48qbu zdqOz>cyFJmEA&L^2gW6VOi2i`Dq6W2-S2sT7+Z}p3>4lzDc;C^z3mqHQigj_&b3EB z)w_&y{+{lSMM&& z3G6CsO$vAc$|hPihE?V#6&xmW{11~-dk`7F)tVV^@}m_%JEtcTR72qu!go6S5Q>Zd zMUHnIGb10vDrw4pasm#rA)9|0k>Vf~GAEXxM@mTQ40s~1N*=g@9*Gw&RdO>R|BnH& zXJe=zZ(RLDQwm%uv7ye*@E(IeNA$Mxo8L1hQA7KNfr==~8Xqpy4$HqBom{oFHF;>> z6(a=I<K-et_S7@)bDEG__?x(m}yvSki{Xyj-d zR8yC6E(dVX5CuF7YBv|2+OQ(MCXv+rnvw}W8NSI#P+03-!KdqP7Ws7o($_AC(V}MF6dxRx8uh|Rp&OzjY;*0-~UIsea-?U&1wu*d9d~))A%g3 zc8QDohfaSPLBR+NDZ9uDZ1F$`(o|B{LZIreXV;Zqk@d=Q1YOkjqiD;}b=X3vB=uvw ze?i1%y4~32GqP#I=)xAZW6y4r$Z(FH|L+ zW|-42NwHXH8+SVu_AfMON>9yWNz8kKfUfx-?Xe@!Y8Q1xkMJ zqy72MI*#V$H{NMD=;iKk3PaC`wlApN=9b1FB2D5vqcX_^T`h_sMr2;drmjI&6ZWrL zqtYb0jQ;VWKBn8{xH_UEZ1u*PEJmV;4oef(+Kp^=POYi)FXZ?ue_rrT{L(F_F$`qb zJ}HEvLt;q{xz92}#B~A%&7ujSk_OFj`7)NOEJ78V`%dN`JQBQX3L)^sO+50IEUpnM zsN}w@lbE48ds*wz3eE*Le>M0=tk0cH@nc}LK=sVy%3#le%MqtYJ;5F$Hwtxpy!CX^ zLc<_O=T&Euv7UrWrs~M~qj}o>%{%JxyuUt1zgXi%ZOc}nLz1$R zf{FeT_Qi{?dc{Hc3Hqs<*4md-J=-(VPm^x;dGVafklSk%b5O9rGiOoMw8* zG6SdAK00*GaekaZ&cDZRZoYh2QG)7!8(18IA26+EeS0#D9-Jq{E9=A5&B@8OaNWhb)b7{;7KNoPUP&dvV} zLJGr!2bE}ol4T@B4|EBUqzcpE?E5iu&AQHv0~->_ixcM#_ndW7VmkDB!z76SV_7X6 zH{$XqjxhZAU98mQW&7fhmoLbWzzKbSk^zw0G;oxpvG_xA3C+S-eoA~%8DRdje5(JJnp?l}#q@X%MB@wO z{Ub$%-ovw73=eUuywDk_Jk8gA$5a)OduN7`u~Zz^Z!b60qS#rA3e=$TeBtH^zY`Ow zR9o*b$81n6tvJ1?i@+{0kU@A))0t}hU8*bhiG}Kua8cg|c%^vC)C%0DE>>lRh7FTx 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/magnetismsigil.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/magnetismsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..63fa80c224c88a0bbb86e911c017339b1b13e0ea GIT binary patch literal 36653 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 bWf605xKezvxz5HS6ab$~X4aT;Q#|#*a{F3% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/movementarray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/movementarray.png new file mode 100644 index 0000000000000000000000000000000000000000..8149c3835434193f2d1bad7826299b01fecb29e3 GIT binary patch literal 46869 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/sightsigil.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/sightsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..ea384ead446b50b02865a89f21da55f6ea73afc9 GIT binary patch literal 43552 zcmagFXH-*N&^CNR=)FpBA)pi`bd@flg9u3P0)q4^AT5F*2nvK=1e9I`q)3qx1cZQq zNbkK%3(e5-=6>Gy`S-2$t*o=o?D;V#XV2_w&s=*>?32gpROD>r002;FYQPNufB-KN z0HnnD+ezTq1^!0-Oj{ie;QssNx0NL0HDq2IX1)MG!SLS&05{|yLWot~0*l6L<+*%<(N{+QqD+3K++Ms)rL9?cOpjUY#m zos>Z2C*?N{WG)4w1)`Cx0I>>~bo~`=A5;}?x?-kB_ab3Sb`T&2w#INRs@-BU685P7 zEF_XGXRCH<*Agiy0$m_Cz*Ypo3DO~iv7ip%Yf};8mp~u~N))iX2cf8N>k@d!F`_y^BA^;2_y)Ut7VrO^9$t$O4q^}s$X3M&BMY7?c(XFNIt&!Y z^es~Cu#qk$053=L_Q76NF(FUvW`_t44TtqS!COxv3!M-`7cqT82{OwffIDzQwsaTB zTgzkr$VT}bV9`06{0QTpCbo44z^ZHh!w2dFO(pQJ=fD*eDh^lxV0tFg!UN6AnjWAf zX+U;c@0{SiI$WVVe=ixBs}3Im4vFZt1q6XCP(8sGQGUWJ5#k^7(x&$yqw=RGBsGf}eP)2d+NAQvgAgtx?%d*EtNv!gdF`PrgjN3x<15Yyrx=v$3#Ya^+Sv_!pTg9hn zbJ_uUts$*Cmg^0*IU5USMlUmsNxXJ=yqi&8fz_JvO)0sXfNbsP`xht{w??DsVSD0+ zkIdqeOk_J1Pcs90RP!cnZH0bt&!8ws3@y6VKW#CrWaRhM-Zq5NeLi>1O)q;N`ar~i zlO1Wfr@x@f^le@G%j$Y7@3L5qz*gXbGR9sn*i)#~o*VfVX{l$=A3sEe4}Zq+wNN_b z7orY#v(K>-n%24)TO@n(Uxq_=U1&9C%-8zUCt7_)fyA6u?2tS3ZFH%9p;J$oC%-#% zx^fkcY)lJkRHZ5`jtFC9vk*;`Qs zWL78sW$z4VN zher8xl&_~poxV(TJ7(d%%_QggXYZZLxOUPxy`0C@GrSk6pnXq4A9#br(c46M!`m(x zC8Wy9^%uF}MzVkJV{@;M&NZuS>?~wX0vTVye;+*R34i?5f&w~;aWm5)GkaO;@p0{P z#<=rb=Iqz|=YgqrMAvo>9kJX#-(kzs`yhkPtVG8Nx_`p9j9%EL9V-o+A9(k*N zKGWmJ-j%1Gtcza>`Qy7F|92r!G(mi>Fyd^H$wBJN-e0p7vrj9E6$U-k7W@T%MT>e= zIU5jlR`sB{zn2$dlZH%TVdG&M@P&_M=9?pQBO}u0i$y=}|0mY8qL4xeDybb=?!*KIPs@Yb#Vx4BLh%w?`QnQbudG`$TNI0yi63`1(k9$uW-&zltVhao%o*rrzs9%U3hiY-J&YTBCL5+ zK7t+oZzlDg9&Wu0cCRZ_9Cv<0Vu^=Wo?TPWVrbku(AtGY)JjK** z__rZZvZjZ&&mJRDt<-LsQaG~fgk|CWd<2W-;l8RuVeOl>`4*$E6>0~Ksn|1OqTIw| zVO>4T!u=zxC4p)#XXS7)t0EqL46no}*o<;5wuHvwHpf|<*~ z8AH|ZyXbVSI{`;yU&+v`C)BU?H3{>_5$&(GHRIci>=d7Fa3T1iG9u4_n|vPd(qYUj zmf_3g9Ap^7N_j4JBZ)_&f2&qU3Bq0v!b?G+k&vsOlk(~#uZ*AEtN>lBZ8WxdcV=x! zPA1D|K@5H#o}>0DCj!QQ{=Qzwc+*>;FrJSEV{&u+$#bbNA>Rl8joZQ`TQLdEp(eLN z_8%dyA(i10dh_fir7%b{4eH6uN|MwV#f--o%2WE&m>4dFdzim(uCB?LSnkWSy$`@c zjNpySY-Rv%(drNzd>T;pc|SK-=Vghp{_q|DWtvjeAuMr$#YkWzSdz$FEYkJ^7j{mp z^6Qq^{b3=@U(V2PMyQt_#qPh#NJ<-$f~Nm-Ty^nYsAkwWLuL9ReTLp%|W1(^uzvGA$D)=PH1WikRgs z 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/skeletonturret2.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/skeletonturret2.png new file mode 100644 index 0000000000000000000000000000000000000000..115aad7315837a72e8f00701a7b63c36b5af8b3f GIT binary patch literal 30611 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 jD+nIo|JR>=A%hHV{8& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/stupidarray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/stupidarray.png new file mode 100644 index 0000000000000000000000000000000000000000..9a962b8a745641877add8b307c701e9dc506b3fa GIT binary patch literal 905 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¬+}k@r}QvGM}4+Nm|$IospwNS$62>p$TP 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

        126#V~Flo@M-s+D$Ug;bu=zVIrM8zwLNl3 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/updraftarray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/updraftarray.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5b6184d6b6f4f7220fc96074c8ff095dae5e17 GIT binary patch literal 43778 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 S?=c4f$W2{Y2U4kM8S#JYh7;`o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/voidsigil.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/voidsigil.png new file mode 100644 index 0000000000000000000000000000000000000000..3e05776d9c705334496cbb3c9175908e41258054 GIT binary patch literal 24185 zcmafbXIPU>6YeI2E*+#PV5o{xq<4_e1Sv}INSCexQWFvBAVmeG3MfjK-U+Dm4$?6+ zK?%}(NltjbbAF!-xB|)UKC?6T%{sO|vHeP%>QnK*0M97Q&mPPqpr;kzy{fQScXX=bx+?x$dMEPE}(@_F?=@tuQ{md z(`cs9Njk>7=+Vz}4x^WkuT#7%tV`9lRF%w)T99>7FMpw~K`kls7%}Ni9ohe(*G`0I zs_Lp%3WZ0J9i<1Qg`4>$t83=sY-)Eu-oN|Byt-xe>}#k^U(>nOuT#0z;B4nOHk*>o z^v$M0%x)h>P8beTq5c1TA3?s|;37jpz#BGNdlyx*Fer*EidHl8;d3qlKo-W;_JE5P zMhsMFc>-dH!g2r?S(t;Kfif*4fT>jQ3sC&mLG$3}qAJ~Sb<~+U0(ZmlN^MNn0lY#P z;dGzzzs`wUbKkJ=o&2Z_3vXF%#Ih~jR6-c)zXycd(7DzJQY(}BYX3Lph<`%3rC{Xd zaRJN!KHt1qe{{Qu`b!2Q>_U#jJwfgS`QA}M8^=#ZtCGBA6d;TY#T5gOD0b`-v?*QA zqxR6f7->NO^4jre^mTjyWuxAIQjE|{)-~#sDy~TE;qF{C(NY3LS@{{Ibn(IgW!g6I zi?P0MKL2p=?kGe^+v^kVIWXbHn{r146_p%wh5xG6E>T}LGu(W9G3x?C-< zxjooFmav0UNZR6EnHZP6+z!%4}7}Z5% z#V8R_Yhhp?LC{SUm(wXV)BY8@{PN>>f0(#}Rh5cRT{E_C?y)ev z_05VptH#N2Drbv2r7d%o-3zKav-{a=vbVb#LN67N@Y2}Ql3#gAkI1x$P5IPUAKi37O5u zV+6I%%MZV=sfLW>Pak}r1Lfo>B8Vky{u(HPoJB3YBw#0^PiTUzeA+W2Ps@{!%B63N3<)iW$ZGzFO^SD4rf=M^&lZ zI%A0sjUx2IG<>~x6b%lDy;)JKa`K0gD6CB7$I+WZnf>02a-(P;G>Jr>HtD zEWW~7ogB>q1WOzyKphD>7=(ysWluk5s6GC7_xztDi0|^^T=TMbNsImK<LugUo0O5B#cY*?07jOBKd?C z6@9fm4qBcnv}eH?;^p;HP7`^Wg*!*#&X@(+e9EaFG0yDyF^lw7)lpwrD!Yh+AR=WkFJCZ1 zU@9;>`RQh*>R*4AhJV+~j6cGQijKT1TfnS;rQLEW`YgpLYQY<`4K?L>$1Hv{nrV5u zM)l|_PMmM&To-Ia^PJ0~ygr#ZD_>J4SX}Ltb^H{R#sw?6@XA&9KcNC%e>P7$G@Xau zvkq*~9SE{*WJ+rcjg&X=f@0jT?Bw5{e$Zk1L_I7<3|O*kgObYGGa{MSt_+}2pNtk} zaQY64>K8vbojx1CJ&$qSoslXowxY5<)h#v699H;brx%@65DGA)A}^LV%gBaS@pm}u zOZvT5v0j5_SWWXf6Xs)9>_+5hWnjbJPsrlltr!r-6(&h>GH@AqdhX7=eH*J3cr>ss zx#<|W*SrZ28s|cWl&_Y2deeS#|?h_br~zh2V}?pRmVwgjbx7MNqN-;#3Mf(-7KQxanIA zJ0qoIWlVBYTNbkKJGE-ZaKkZ-Nn-J$hxt0Y0d!N^h!(rJfV8D-F0xf8z`N?3#22I+ ziJ=+AWXG{$96*67mdKnG@6I~1-a6%u15CCqE-p!e=Q5GcP8Un(YZIcaQ#&YaOQcLw zR~{`jOcI50$#bp;KA0&^v!fZ#*IVBTYW4LV91A~AgUm<4FIySi0^=nXwE>k=v!;B< zQtACBmTRL-%Xz+&L+`FgEq zYanuJVxl%b!M7xUg&&?B)8!1m-OW-dy7GhpvHa>}RocGKnS7*44Pne?UrN!hOMuVU zhQaISf1u4@#(&oLHvUVmF?QXYv**M3iRQTZT03z_dd@yWq??`aZ?>Fn*jl@ar}qa* z{E`qfDb3JdJsA(KqNbLWZ4+Z&6O-c8abw3;KPT^YB8(OKqs^|)oQ!ITu} z{@V(66CBr77;&{as_6QCA|$4yblk1S*6+0Y&xIo*GE#4l8~3xwM9)<+J^Kr&8{KcQ zzOUHv=gp8t=Ov6+Ca(y$ow;63(C-`#`gGcLQWaVb!Dq2(oAs?z#fA`y24+!w zBeFvdriz^^Wf=Q=33$Bh5Z_3^P9;SQ(z|X`Y2&uR-;eh}xkvkI*7&Nf%kIoOV zdaiv9^R!oJopTMpniVA3wm&Xs?rdF5TrQ100T*#$TVr=SOI>bq;qXO?+x;M`wnxD7 zO7{k;X#Y>ccH>Tu;JwPJ;L84oXnY!9i-g;_j+bOQ)(FgAZa4kx(zo~b-*dNOqAx9hwYK2QS?ke{9;TNM{@oXkUntgK<4mG5My zh}z0?RXEASC9BG*vvh)tjmh7?`Yd&nnU~S(<^cf*g?NZ}Vznv=G~Cjj^Bc|AToqsf zCHs<;f2p|022N6zU0+uxc7G>pt(Vwkd0IU{|L_Y9iRV&BJZTjj$PV4<=4W7tippMl zBDgDWQ2zY@SMPksHfewDW`DwS64W-R8S#}~C90Ex3%To14C~Utx?9tNZ@D+?>1_2W zob>%}Np9f{eS6|C`@Vl=M=}g$E#8n z{zoB~P`B)po8tY&*J~l`>1Z)vkg5fpAkFg5Bv7*8$YqQXG07~eThmadDpcNu0#O%XW?VvirFZP*4FI8To$DK zmU`(aF)FjDG`rZBIpqww(Qu8OjcvLy9+=h!?yp_9LVUYVbvW#WJe@JfiqHILrl$Ne z%AC3gY4j=yacK-Nu|6M@RW+$lQu6X%nP-8?-1(zqk4Q(265}kkfuf5cw z*0a*7vfh9gz0Z-5X%G;Dl8uFcM(C08+kGO!3dBI+7}@dE2Tqec2`yEscN^R=5FavJXHTv22x*Hb)p zct}9C`1{Uyb}8IDJLKAzf)j#8f^LAf$I=lMRUgaFYtXW|2&aD}+3p-FV_9cELCx%e zn+1OiB&`UekjPc)wI*f)>biTTRn2G^e14#uu3h4cGpU?vDvD>G_gWWWm-3YFpeOA- zkxbZef53U_4e@Qdhdl!rK1Gb^>ZO`I_yoPE6rXFTwon*ppMIw&zUezRCFf`9+y3~LT=wDbT6oV zcTPh{&d!w~S8aq2$T>R_8g?z5U&=$~%>h5r&6&AOdW;oQ^U<@yNQo9VesVr?wkkJno8ZWi^u=l_g~Yn_b_G<1vlk zD<;5i?DJ;1e5BqV|5pxEya+nw#IwduOatkeV1x8(uOmBiUe5h} z8@Bg`Q|duziu&in1NO~Z6L$D=I45WznNbPNI{>5z89R!BQAz%`_ zq~!wYV?{sXX+Woclrt?_jBP~~JPDD!Tgvv7jZcXfs3{L>X;Nak+=e;TfXdEh=0FMC z4@VZ6PUMG;&dhuZ|G0=oi*Fty*Rr(t4^Iu+BtG-j#;1_Bc#qZD6bQut=8o(@c8@Ex zxy`&}1+sYq>yeH1Yra(I#1?81!cLH+++(VvAgsp6FNj$qfphCvvc82~5 zsnjXs7$n|z28Pe*e4Aq!DgI{i?Oxt8(kkKx^mbE>yc#F6>a!Y>5CShk*35&v6XRFj zB|)>Vc0xYU#k74g*lDGv56LtmgEsqQ z{&Ar=RVK$S_GDHS!xq99s}iQJ z%y7?|Tk#JGRAvZ$cDJ#rzG8$M%fx1(ZgdEt{v`^twM_oz`XN+={_?K%bCHK8LQ%9s z2TSi+5mii|l+A9R@TIpHlll%>8~D5Ud$#OubJ=f&2#5|tlK;~KVfc;`V)+nWp`xUQ zz;VH|V>KTjjMx0#_T|_)S?qD${HHqJeE0XVmdD#$c>jHepnQOnsq-xp&`-f8c8SJeU-`r-k31Qfbecpn@i`mfoyXB!pR0Y@>9wPPOVoAf znz_k`SXBOgT$11qn;Q2wyOeO59Ud1Cft|1*#$wTLzvw!rp zY6;ezU5T4cQBqS*+t(+hOI&<|77A1%zrZs8amv|sX!|X~XEWlGqx<01a4CaIqQjqM zy%%f7r(-_F0hW@RC+=EuuoIUV@?<=-tK?H7JXd#X*0PNToqlA+eb}CkTUFLo5%V9< zeZBTbW#LG+Au z3x_>h;PIV5-yA0|DHN~gQ7hroqk;wCf_s=wHorGMCjW9D~G5zS4w@dVl(&-Iqhd(|A&0*Cj-c#LGNS;(U?bvn=p(r46#->P}kW? z9BI={{Wv+b@s-?q9o2LL&e_$)^d3o@l!OfR{-Bp1)X)Kr43Q2d17U)O&v&hVgrV7QwHk>x#tu*?c>x=Yi2qgTy4%?L1BufyL%_%S9C zq5=;}LH_GLBe*tz6MGmD+JfPp9XP3fyR5fU7N*(z>`-g5fGmpj&;nkek9ZH?kw+a% ztkA+YBLv;rNKuvIg~V3vagg%M=#$*uZ^X!TjN^-2^arK_&+Kg7eD-Kj)}r7 z!f!e7V+L4f0?h#hI@BYVlf+vI^$qCcl5rh7(}4*rw^ZVp77o@Xx|}cv^-fgx7eZM< zW`XU!^p_LPAkCCFl@`~Jvsl~tSnSE0tkj*&B>;V_6y%tszE6df%d7pGMLu7xnVh#H zL>c6kwydOuIW8j-c}K7fKUu={+I1GxOSb-Qf&oak@*~o%dCTfzB36lbH(&Bn(H&>Q zZ{I~wOLm;KRo~u96}MS9d3 znq@bm^EVe^R%*&!l8;Q4f;<{IcIL+Euf8^coSsAGW#%9v)-*c-)aZ2JWNbvza890E z<0o`90lB_}xy#v_uTeMtaAQhn>yiSXZm@d#=8y3HAd)f38Q~B=V9OlcWl47|1tLuh zNCpV{%|hubK(7Cjc^C*JPr9@aT7^0$35uANZ6hE=QqGIADB1M7jzyDSw9Vnq@o0Lo z_Z1ryej0k2M)_(JsOCk+ZvyPsYETL*_uWg=YM%1a{MMZ87YPWuB#S}y`2|%d?kJ*0 zA$^|y;v%SCiCHJ1ZR!PGjraLt=f}+hZ%IUc%3k$WKnXLyL8i(w5V}cU?k%4om#?L2 ze)+Q{z?TYz1;MP!tr3j~WcpGr|BEf1m#&?Sx+#Iz_H+>hLlBk@{9bIE02Kn6Wv3(h z1~$M}9j-Zm>`ZmXKYz!UX$|(DX{9BLYM+CXv6LVQ)XyY=f~U_qs+x!yA&kJ+Ua+%N>vmx(6kiXQFO!tn<}y>nRA9TBJ%_efaA_)-eMZW1^=G zR$uBo$p8FQD-a_8hmm#B`m@0-$8qQbAZ(#!nK{NjKf0d1tVdgY8KP~)GGjEQQ^F0N zeLLAuIo~J}@@DF8Wr2toCDLs)s67`|i5A)MP{FW1pHk zBfPK=S}x?(hvk<>&T!YZLebS8d{Je8y=L?QOda=roS1Dcx~0DC;>qFC2b4|XE;iUu zlpQF5q)oVDvwdx6vCW>*AIZG+0hqjut`lnA{5U-KAad$|j(vw7LcTcD7PxK)7`QRn zV+-|eW7;Chka^}~y~@|W0{$8ASlAh-Tm%diI@(WULxL~LNXi9v&VRA>f3V8(Fnr@h zf!d4l0_fY=;a8A#P7hP;;a8#hq6>k>rubglSwPkc4c6Cgq$ZtJW**hjqS=iZ2O(+p z=eVZO))(5xd<3^vq0{e4D3?)ONw35^YzvR1qhISYUHzYwi~odC$M5^@1VXO7 zJNLiu3QA)U0Y(MA$O~=IGC~wal$w1JBF%t99FFP+8|ArIp;ubX- zO0LAgFOM1BHie87Z-vc=3PvAJU!@}?cQOK4{v;mA8Pf}oQqE_G%~;Cq_qP1nx$yVg z(wa{6&Q#dv5z^zXMpEK6U-QH2~_Bm;t12g^~}7C(*;`8+$gK4%YB{vOg0 zf$k`XqySEic`lypjPW!R8r~VFJDALI}Aw^`h6=vJPsM z)>dsJV`Y>yJw=-t0WUGa*WQch8&4Hwi;f0_|> zmaAR<1HNNx0M8Ma(UJb-4Ki|G3A^lCD4`*@&8S* zoel&(nhyjMKg|K7nFt7SWwe=St*y9xX0@RjdF?-spnXdQywlZ@?}a%iIf>EG_(dLY zYDOxRv99X;zZUu#B}FdxrTSw+Ej@^phlwi&Y^*lH(P(tA6Haq zA>x0neovvVydw2Pa0HN{TY$QS-P=E2sdb8U`|r<6o+bd1j+Cb4i=0ddcChbptF+)% zRlwPGuxjz^kAcyu1Q{f!^6aIS@UD-?|M2;_gYU98!#{Ab{`nm4wZzEDm;Z(W1>2T) z$Xr6+Lfs14HT(~vv&@8rgalXtb=r9{JxsX0z=JX$tD%+cLy$pYn~R11r+955i)K+q}BLnDTzmt`@%x{ zu-ERVt7^F?Njs@N*Rxy50nxliNbn}L9UqWpMgR1%CS|PS3jc4w&tw9opee_oi9UMA z9uTTfU&f(as!bX$jKZ=v4gZT!)UhZiKk^j2H24QY6sSL>n)Cx>RU?2UFj znIx?G#SVtss_B8uccqSo9sdf-W1fo{g!4n`zgNCf+@VHAcr~s4SjXI5m5twMG+Ish zPwE1)uI;)LNN@FXsB(2I`gT*U6pv<3wUiA!j`*;dqKv#oGX!!_Dsgr z0Z-IwAdn)O%zL1^cH=IPjwTFsym!vE!No5Cy+I2h-@z12Oc0?9D~^AW!dfb{j{A)UUj3kImgfcO79-H*X`I#_y99pKxfgT=z*CY9BsD#nN zoRsLQxv`=a4w2cNm5U;~2V4HbgkwYTgY|Lyu+tWauf!;Ot3AWlil>_+U5(g!JXRJ# zFr_LJLEl>04^cT}0%4XA%PZUFUL$-ugi=OovG&GWqyEYP3Y6rUD>drL7=x|7Zqfz9 z68El?M2V;=>q2ciC0|+5*bY%tTDD?%cl?DKAsG_7#2@A8&BNV_)@0hr3K;Q=leR^^fDT>zcUm z!SC68wUGQ?CGYO1TLwu;@YEv}VMTvCIp0m%qEeXhQ=1CL=7O}m*z@tKXhM+;^P{V| z=Uil)UlPNsS0L zJbWOzQz}k)m>?tuigukuiy?!99=(Lr+9cL@^8nfkRlmgYtrTDWlS?Col9})5A>T1IOyyk=*1Fw(NBK)%8jH&q#@vAYJvzCy-zZ^Eaqy5o-= zw686=+0|w@|1xoD-gFm)_f3Ve26Msn9=+{sFfZUMQ(>wd*;~xkP|L6G-wdRyZ)d4g zDI>*wj9SmG_E~z%tu-mXs}im)pjg%TYEwkjoiz8E3NxH@`A6qR0!5NiZ8>{y5Pu8a z$!hKGZ!eBW`&gQs^oo#dQ#3muj5%GkUDf%W73gqym*3}QZhmol8{$|)^;9Z zd4d6Yd3eHV4`c|!`A=?R2erxcVMFMzmreZUuP?xx1? zCAP~P;67nD^H%P3bt6usTj@2?2g`*Q5xwzNzC<4tjtcG?X&b6atFa2zsNoL6JPc@d z^xVE#y)%71tjAs|Srhw^ORIjgLD)5;o%>3=0#UEe3e7Qp$l&Jfzl|NFR1<7+;@6bv zlt=6u@5g<$8cjh)ecz{xaUGcja z@_uQboBXHCz=!SAO#M;7^-r?VAlH=0=;<8uEojW;fq?He630)pb1Z7gsh6`q+Bhvt z-IoVyHUqRH)2PC=_glRTiJvm90{ydVEE!v?46glDHQo`Qz09oROa!( z)P*Sgs}rGPbe&(TDog)-xUO`4n_1!8=F3nMSq(P(#RvQg`}v-O`aK)kJ}0VWf}c{d zQnHp0d6q<9M_Gj~E*q@`V@Wb{LJU zR;;{I_z=1%%h;HC5VP3it~MUH?q70$wC{D^f>jIt9ZWa>FGGz~j!tTzV3zc+nEdl} zLXI5cubB2^?lta`e9=Vlp5M&xwu7V8-Q+`SdCumH6aSAwyK9?jZ#wtSUXC%}d3WCE zIU&2PLO1*1_YwAWBw_iwGKC7rI$iIm$S zI{{y`+4Mfe202#p$czZrL30Y z3+qZBgr2JY4R>^x(5f(RG~r*ccECGb??W~zu0NO?{=L~U-!r-~KCJ#!^}Pw;JP}7% zW<7hWrZZGW`yrM&#;Cn|%5(hZPJoX(v1VVtD-2zRbt0>H`dJV#-qFD&{#aVF63z#8hL~5eRgDmCQK{7$vLR;f z#AU9WCOQ3CUkXby(=3Cs-aFOOo0^qP8YMyJk1d(Jurai~Eg5hNMy10_%7UVK@g9i{ zsFDzjXNPg7S%@j7V`hhhXRhPNJF%oU<%Ly^zK9n_iDeKc4a!taE0g1ZHxh$^K30t0 zO(Prkfj8}M^Ktmvi>ny|=_r{ze#@^$MpJV`*fb6lEJFB|+3T{+jHp0X$^-4(^-!}< zbG+(_y=)*`aN;nbEy1d_K~N0iYZc$`V>GyJUF%msisF(!Enr4*J-T2-6X>fKv~M_% zHyxJ>ZRUSHEnoUvUO09*`t#|Yo|CV1KA)S-0QW6U?7O8K@<}Y6AHO%ZoH6oGIdko1JRY zR=EH|d;6VHb7IV$=j|T_UMVMug|gYwHxBwqEjM_4$j%fAjl9doNyTOG6kpo#${>SY zjdK3>KhL>=a58o9+AeB6A@Qg0kMlwv1I+GVEP*lI)nvjsFuHM{@l0l<1!}t3K3{F1 z=Ij}Hd$d4{+$Q5Fbd*o4hU2?6b0d}lzx<=yl^ES-bbXCB?ygZ#1^EHpfn8Y0cN^=q zKf| z*WcMSG%8*9TIq`xC~S_+dbv!ebSi#Y)f>XCm(>*{f7w7OzH05`A2nt(XI7(D?i=@S zJ$}15c#~@r$5HUFNH$iX8*0kDmZ6Y+P;`mrUL|H%h08AEbRA^wGEMMHfreH<;F_XE7ze{4?@7Uq9j2??z-Yas+3v=Pp-d0>}E9 z!mkJ`e|EbyvZeQS+Z4try#Ud?f33yu3Y)AyiO2iqE~C9j>C)!9^TLTatlG_!cr2Co z$BpZye~G(fNs{9e`m zf*Vrvw$NfiGaQ?nr13m9gKpRF_JIBx0_S?#h>g_$ah+KWco=H#>+iXh%dg2+gRWf5 z9n0;$DW#+d^!0{~r9`BedO_h)(PhX}JfS+4%hl8V#%%42!P9Gb?_#kyp5syFpB^il z^ajjVITaxLd(bf>SbhMNF$t%5PjQqyCgj9(EBd6$;@vW4V2g*>o4J&tbnPZlSWVSk zFXbu6esQv0b1h50?L%`at2b?{>zJ$GlAS|L)Nn#^L=$U~8%Y0Y$$sqMZTIR|ovzMb zYAqFjtDtZ`L~~~~E-&Hym(+ru;Y^L|014R_DyxMa^`9@qcv4%7Diw0yALNt^MhLhd z*W~zA8y-#*hk6*AeU@$BEPM1@X2Cj}>u((|l&rQxGjkyR^Ls)PXS(s)2&a~U)Qp)Z zfON_757Yjb=_rQh2w4!vt`)_@NiNIz<6x@S=ErYlRU(y|z!kBL>5e9td8UW`_+zO; zmcAD1zWl2tQB%AxQLRMD%Qo?3T(dklc{S8v&DWl4`}jhVN1YdSKL;*6TOfrT-++!-zfOLs)6-;~+=a|Z@;;+=aF2ZyrGyQkb@j;Wz4E|U z>7THhvcI7FPZRF9c81B~ezR_dGe7i}jCJr`_siT<&OFpv?caA5Sm&K9QF7*gjn8av z?2~c)eQVc4P0LEmh`qOoN|l2n0p7&JlljfbHjc%$@bmn052w?x=0yk9DklqFbXn zbOm899Xr>qj(^0czYWVZoyqD@{9TQ~I9}6dR~keNpGCtXRGAz)sg)(;bXO3fVJJ`4Ne}FDGrpCTK;u- zFSzpN6Wnrg<{cl61hwcUmpApS#LG_!){VuGE`H|Ljse*2;pZy zSI&t3YbI+lMP;)bGg(MVd(UoLj6cj{{(f`4j_L9X_j5&0Hpd|Fon_aJZb}`Y$dD8S zv1BCQ!QP~}IY^x-@#}^W#{}tX;ZM?72f1*~GozWWvRe>Bm31_ekUxe#6FBC#)ChEn z$J{8lYI;BVBx3l^?#)bU5B=|ArPS|>@1UHL5$%M-r`qq%>?`b?U{V+Hiy`S1~&Hk-ZfC|On3@#*s}m8J-6rsL|OUW1L|Qw!sVinte{EkmEI;)Fu+ z%H4P?x_TodZblwqm3-nNJrc#PwyaM#HNvv%mrNo2#O*E<>D@XWn2T{N(>H{S`m4%N zd^E;KQCdw26J6DdAZ#O}W{YgB1i8yvkp)O4o51Fml4OuzE^ayUP;NN#$2&xe`il<9 zOZO=j1Z)p95*BjT_`@vJ9D?Y~Y~$Yjot`H4`gGyg0#xy{_=(w^?U#fw%F| zstPW7J9 z{YE>&g`N;XT{l~w?{Hf4jDky}b_DZxbwQL;i4}bfBy@eHN=Omvl%TL7byy<`=0$6# zRlI#8glu8c(#DO<{A(qgAC!rt2mM{8beu`Q!{pj0ZGOs$SV(VNS*(10oIx=Uv!c|e*p%f4;#uQwqkYExV}U$| zZ~6@=B@q$c489M0Z9i+K_rqP`u^Ff{bV}e)M#@=iXe$J91Nvu>go*jnznBm(j`jZr zLNCoL1N+zkel-wpoEfe>wO#4ueTBd>QuIjL*Nq2hAKSdDobX`FrQiiaOdp}y+}l#h z=S^#6anf2&SLB3Jl$`NDDFKn~EtJFwzF>d*rP1#cI4Yu#Ksc)Ah>eL{9u!@oJbnPA zhwLD;AKGYs4ptvHk{c}(8kOpB{!niBNj+vwR_xU3TGl&6%0TCpsakZE%KWZnGeR<^ zj)Y)=O&c-i?9tiw+~PY0faQ7j`>&-*os+3#woOsRUt6Z9S#}$n1k0V(s=D2hoAW!; zsIDX*k1JtsU4q)qJl0`U!I`;N>g{Kf4*K2s23gwr5_J}fJC2TO`j@yc%_V>HGb41~ zy&$CdIPg>BU;zJdRZ9`e1C^)L4 zJfR&W(S_rnKQ`e7fWUJp_AT`AfGHMe(|IH*3-QbEw0O@m!R%PXUMl41#=~DErVcOf!-n+fVW(9}%h{FS50N(| z>Kb;~PGQpXntEv&^7}~(FU;7mt;qVRACRlLcFqsELSh@|Mno_kNeb6wDpn2W5su~n z8(7-ky@Ufs(;OsHu1@iF9x$a1SU3OPBv@alODKeV)1qDf=9z+I^~gI`R2HrzLiJj7 zP7|5tV*05oIDbnQWf9F^#||HY_3Tty0ZrojFlmB;!_MC>+Yo<&{;9-a%E}HPFp`D4p(7VwHr}}RHzqYltb;ipytW&Jwj14 z?{0Z^MRtR;oZw|Z^N2njCJ17#kllb$6K#E9np*-Z1TU{6Xo0^QW3apMLBFef?r( zgf=y>HXMuOG4oB3HOBLaR2cMdur!eFJ_AK1JRH7V_Jp(QJneE$dIC*4rW>iB@+?m> zq-eS1@)9J2!;HPW<5!qLwQN3F&NlBPo=mD+sf|@44{{|@X!qahz*z&!d4ZbW5Elns8Nf%ow~j5CQ4XIvM)k zj}=0`3|61rhZ#;_Oyyvw^xaAY#B;)CZo{-wVK@a~(a#!xfHD~wcckl9S-t5uXRb(vmN_}U z=eziAIsjtXC8nk<mu-d;N;cib3iN?KEJuhaAtKwBlk2$gVJwBTvr}W5owMo8@I9jd!uCFz83oU2 zI&h%+dLAv(rSt(vn{iG_Ivo{AoZX=y+=z++$)L@T|2Rk!$F}NuGAU&rfwB0ebZ4hb zAN=9y7iY$c7p{8~XbcCc!>qRtg zX7xiR3yum`zGG{_u+NJh4==C&C)_3$;xhrp9%F5W?`j%Nrk`~6ao9O)$nIEZ)%etn zqX==EB+SE7iv7X2hxT~F{}1?a@qYofz95CymR|VO6;KT1G0$Trmk;aLt-{#j?WS2e9y;oMx)-8W%RqHfe;KQrUj)KcoVJ;$N<3 zoHza@HYEfFsCO<7@1|IEKL!k3A+NEs@=zzI#K#533XkQ5Sg^2@A2Oeu|0XoY5~sO% zY+F2RrN5w%aXl~pN0!{Wfx)OSN0pk_tMOY;yAiTKx?#YhQE{$dDu4wDe%cZsmp2!ae$al{50 zF0larH8E1cJ+>=N?t;lkmgTZ->Oaxt@j`ZdQ>SN;*)rs2+f=KPHDO=FN%V|c-IQov zy4S6|aN=vbV_lH|RP!cmhH#tRb7t)X^)}U3WiOa@0C!FY$qUN-8<&(0v#HK)`9Fo6 zcRZEb$y`wi8pE^aEhi0ZGe?Pd&$FrEW#0$ zXPC1nrkriwYsl>}sFbkKPduf#$ZU|q)ZIk_V|@4Dz!!NNhpcnGq^=C!H}ZYt_aj^% zeD$}pYD{%6ou|L>_c*tXjj9T;4CHA$U) zOe+WlcpqpqfK(_JbJr4gX+$%Qk$@kifA&lTPpx;o`E4gfrh$$+3TQPLG{q=R?jd_;^-k~ar5L%HO!6Gp zRuekaIIezBi?wS9Km69m^|Z%((N^N-yi2AUCWK zs%6GCXEH?6eVK9DXO#))qKKVs_-^Piuk}q;`4^GU{HOs{bJS0E!g&-WPybGX+;1N@ z`Y=veR)|lW6^rfLITFW3;|&>a-UqQ_z)6Y?@R-IIrfqo(0H#?8Wc@oE z{2qCgn+s=3{YK!xKp@G&1hQ_#4PhQ%neH9ahS0*=e*XR^1oQ$f*TJs;_IadDsIS5@ex;x1G2TtDoffV%fb zno}(s$L{r0MLn0947~G^0Lh5EUsIEjoBI+A=W-H70KQ+{;B@p_uW6{=RGu!z*%YW6 zx~#m5UH__0_-q#_j7#puk<^I9CkFA7SDjC{pznV9=J05YEa;&0^pS2kgd+`MoZF8t zSl|*>(3h4ikA~z{-JoxFA(wy+by{#$`+1ytF>PCaBbg7^OLb`2OG5?jjFTg@=x4ly zaokDB?+Y0txkD*5Yz!P8?Yi7IiZ1%q@wfN~Z-zB!B=wFKhKZ(9ST^uWVHL%}s2#7+#tOFKwwzVaY!B zPk3Q+!T^{r&83(0&D{?d?&Jdr&(q1-pt30`9d@X zj#>_r!BP$M!p0Mcq((m9*Ep~R)ub1b=JMk%79Rao5D>WyHYW)V$ZRtrfT=nIb3Emr}_Mqk_oJXI(NaFh@xw(^E-k zYJ;=Wr}=ZLO-{B|1mgb#;Z?i6+1QbK`_~LXIJHG7gSZ}~4_oq}V5j?9DODv3v2JiY zS!K`^xb1%7Ewb;Bcc)ki&@}IpVwQ5W!R=h%gSx@#$vD zL>boZE04xUzS3F7%XLm+d@}~PzPie~t?1fsWm(I4KBu3T1ibWdX}+!6L6-n|NvHeo zl8RRlJ_Zbdu9u@TJi}xL8Z!56>p}Cqk16BnzOm{>8HxSlP-~&k1-i#;Bj!bl~-Yml$s?Uvl z_XezBFGQhbp0*%ut>wl~k8eH$;{CIxJAokk=Qx?AWsuOcEC%k~TWDh@ZSoa5xg8US zM5?;)Ph-yvkegFgtbp+8<0W%ij540hhGhW@p8!u~X?{EADk9Kvc$6u?OFttH^j@^w z4Gi+p#t{>9!P&ZEnMzl{Ll~!Zwvr@F7HrhAZOh_?j!)TF;!zeIM*1Iw1Bm0bF3+83 z-y0_*1&NP(Hd+VgFYd?aop?^{_*iKr1EU7cM_xchpI1EyKChR#*)7AKmT}H7GGFsX zY2Wgmeb#jT=ib4$z}|P~4{qVE0*!Wcp+FEdNe<|6xZOBBEe-OH^{fyz^hQ9vB@AYA zV)UyRj?R6O!FkfSJhtRh5z8= z$$y^dp;UGyG@J14Yu!yv`X5ynSRoHLhc_(>)PksVSs@})HHC1r0M>QV>-Zh}!4!FE zN)!KN%I5U>(X;Vb!0T!s+OQ*k6`4<|v}T2@WSJ!d0!5J4*Ot>0W-t&>#N`=nh-M2& zQZLM5P2F`%uNC+p^P}{vTV+Gqx$mXoCbk~YVBBb<1Yqme-b)R%Tt#z|CJII|AggP2 z6bc0k0a#$*t3UM7cLl1BrS~-)O3&_BamAc7&)l?u-LwV^D%&gZ)`{NnGjFha;T2{+ zxp85{M$JH)ZerMa?wm58*rR!oR#9$}5pv^-T=b~}>L)9KN&n81*f3$Fg#MkEu@&qD zt+*}+x4zK3FO-a%H|1M@4LSdL_@`+xWaUMJ*KU@ry@Am72k}mYYpW`%H&G3W9YF7rP!`Jh|IFnj-_3kg^Z5a-F}B1-toIs__>h2k7tEWKztk4BwOD9 ztwB1mx%M#AT;WvmZDeEyny0DqKP9zM1b7__E-qY>x41_w^}kGLrc$I zeIBCA<;rq@tI(~b1twGNHz%e(Qg-V*Wg)QtBZ7sm>7Gd+blQtS2BhErMT$q3@!#m* z$($b#lRzV1|<7Ll0pr}hl!T%W%aFi@KY3od*B)8Z5D z-r?^cbzk}%&gqd;hBc7co)XC&Q^P>eo_wtkYinvOxN`jCyrC(HPHsCwWS{OZ(geL`Nuw#W3^JQuB<1bBm4voOU~X!lpST-qp2GR*o{SVMdB5z9 z7;{2Jh#^JeySyr;B0@TMrnnWC*gnL>c7am>5AeGMU9-swt>Wi#Qr^#khlH=C!q;CO zQ9ayk{1kBPWc36iGRHi?J;(A0&I#Bq&MgBgRnu!l)6VI#?NS%*Taaic{i9haRd@u9ihuAgs#H45Jj5t-J;MjQ!ntfWoTwMWtqtZT~(Gd*s8qRrsCZpH@;zn_00!H8U`_hp9wJc&d#eBsA zhPqx0(dRkM3YAPt{B7;lg8fQ<;ZarJ6(|b$2k;Gj?;?tUn0P6Hn+Eg0OTl63veCg@ zwCVJ|H-6;dqCMJr1gX(2vS&n_Wy!8BuVsk@7~HzkFZh$J z7uRYhnzErGPmPa`7p$w8UVor}O8ts5%Qa_Tx(uF9?gDjTZ#_WhKSjL_0$j1PbapQf z2gr-NqQ$YHP88+>Tgb}FjW&_bH_icT)TF`Q#mj8pPc>d`wZ0fkrop_ie(ZY}u>wBG zbz^v6T?4F*t_=p74+m4V^bgHx*YPj=MIjGn9j5jTq0(HI$?9M_QA9E0E%E~s@Uhwg z6(b8SfNb<gOCKw8a^#vHnJ_=bLK?OS+l6GXi_2L6-}L|$v}nT1oOak? zBGr0+{lJ3azyV!h2RLG~i^?M)=n}TSAF~sF^b=NA5lEw(V_Hs2Zwk)gS$f_{;g@Co zI1GvmM!R2CTGRcSo^+@VI^|`W zVFxBUGrD~xkjF^B+SnD31bh3)oLM_zcxM|#Vg1WnqQnKwt2P{*RY`a5H*>%1k00fl z>FFcz<6SoqUmp;eNCiNI>vQ#MRh#YST%7(f0Lf6W&I|*l>)Ks-x_3M^y1a&ceyW_^ zJq=QDZXEO}NX4R&kfzVqPvigtAcNDP&5uvJIT*gU-LC>H=y!$sWMQZP_PO{8l_C_b zIB7@+pe;A7`Nxa@8{VJ;(@{|beq7FBK)a{QUafbR!j{do1VgT``0GegsA{~dF06Jz#|9DsDwQ%boZ)0*5p);Cf=^>$YZ&vS>#rk!lPnzvQ1-q zH{|;DOm2-&o=!@-2C-eZ3xsauMrLfbG!o~Pa34Bqg*s`BJ?h}B(@PI}9TyueXGx4r zxIoZEWR~VVzkBCRkK*xB>eIF%&drBkutXCSV{e_$<{v8k`46|LPTw??`jx2SL5P{= zZ!Z#wlR}a~jJf{fiWHK_LNG{_b4f-lsBn#`ZtiwuQ0dl7z;yQJ8Nj174Ol#!4+VBc z0tr%mD;p2kvse9&WByR%i!jA92}w=+osZzVs8j`IV5M|cX0{?PpB9g~UQfj-b#_w2 zjZ~lLT-)I_XD1jZ$X$69w0a$}-yW-|PhmyaS87$-R_mV6>+WiXEN`8Hxe=Oy&8vD_ z(5>s`_mGQePbC!0b1JJ9Iux%SX_}%UWRL>Sx=h^YT|WmCVka+O4BgF}uQa6+|KJfez|na&_$%ANCd6stcX3+@DB|RY zZs&Pfy|4{1?eB|)tD18#rtZ;2!F_9}_EM!U@zT^VP-~z39g|AdOwoy~R=Kuh`92Vp zH1h-tFaZzJ{DV7|o<*29ijA0J8)!k@^T7<&=$P7Em;?3p_pbL5y$?PWqM~{!dCD?s z7qs9mPKgsALx9F|LCz9U7bwY@I?elOy+Z!BC)$7o)bs}W_>FrOPTi`YOY-aB zH)S#0^{B_)4$0DVc#8w~DX!AEFjY?KTv0h1M7cB^>9AND7m(h9#-k1lyk&fdu zw-{aPZLVn#!n)_pZC-%XCiijR14m%Z!VMY4QH|wUZ{R8x;j3rVdd2&f3d&_= z%p9r)Kb2Fl6Z}=BQG6cx23bAWPEgZX)uxPWtX=` zopy*?vj*2Yq@2o^wRReR)-zFFq(5D~6f}6<7fx#CO$LQHcoQ-8=+1J^Nfg+{@f^ik zrdRt2)HSmHWI#vpOHvuLQlx>=wG;a3?_39}BZmjuBmdfH=QGkZHH!bN8uI7P?_C7N zRZ?;rh1Su2>G!ynP{=`6)$fSWkdt7*(Shh&Fs+r1Wgi^F*_x0C^Xz9k8-*71xi)3t zXf0<0dET+>As6s6qRvbfopJ_ePs3QWN28;5^jR?eHW{;G5OG&-~Ore70U*rP!{}`5P4ywDD|y#Xdgnc`7hA%wb9Kl^q+sT zEba$1eNq0?@}%YoPsPibPa)D_E-@-=Uoqz|1970g^BNmGAbfmiJR*5quIAr3O`fJf zJEbc<l7hC;h_vW&g|9MGAf@F{o`AIG5obu2pS1k`{20IlQX=Mp)Pl-6Fuy#x|r? z0a$s>A4zry-Kmsi$my?cfK4v(nT4rae^M_QH2JkB1doD`rYw1$8WGl3iXP`t%Zgr8 zcT+kVS0+y77FP(L+F{?NpKN(MA5Xt}yIW5;QJtHW7Bkb#xU~DQ6|^B$Tt~%2G-Qp9 zLi1pQedHC*ufH32=hEI*(P-Wm_-g!$dF-ibkpcJImd43GFAu0tD?SQ-xl7;w`#xdK zKt#-ik0JckBiq5mHhG*}Cse0cFWOq0LRWOTCq>PUGLpN=adCRkdwU$KGsH1M&bsA+=Aj`Tcwf2XJN#)?Nji4Le{6O4S&Bq z)#ZXp0x+4eyn@KXvrr&+PB%^Rv2_7ZbdgTcFF#gXtUZ`z1{N^h) zw7}l*+xLNK%@)bWnWg=xL~HHG@{WGq9WYX9ubTC~-mBv;lAF`9;2viqF80U_72%s; z-`W0Ol=c&CSsEp?F+CyJbg#og#C0%T8kYFr2^b$J7$z-Xl$Q^H!G84BUL99%B4*s0 z|BURyqjCtP^_-Xwmqo?EYTYj@`#;}^X93^&%$P~LLrGXzcc}9L%UMn}D^)JnKgId- zxO-t;UW><1&a%4WB1!bEy%cVTpN0o#QQa2wD*AwZ?+e>@r)~qj@$9qje6(`C93{9R zXFpAg*2{$GSGkX8KWsZM&CriPoknoVucSYdD|EA9-E(C_!qow-Ji1F z8P9g`w}*HbY#^47+dPrWt|guQ53A$5Qdw$iQNwXrG7VRCz$9ztEoSEI*$e+&1uL^~ z=zj!z92AT$|1V_RQafdZ4!keH%Z!E_;AjW`fEr4dD|m*x=i3SX4_y5IzrpFusEoZ+ Z$fSwJ5#pYU+*ty=k-izKN*5jVe*mE$O@;sf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/watersigil.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/watersigil.png new file mode 100644 index 0000000000000000000000000000000000000000..2a8e511dec8db605f7bcaea5dccbcf026e4bfc7f GIT binary patch literal 29093 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 T67V_^2>9q~8);Q**vI}KZK5e= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/wiparray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/wiparray.png new file mode 100644 index 0000000000000000000000000000000000000000..11297382699333125223b24da139234f956ee01a GIT binary patch literal 16402 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/zombiebeacon.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/zombiebeacon.png new file mode 100644 index 0000000000000000000000000000000000000000..52f57df6a593653e452ad45a0ccad43050209e6f GIT binary patch literal 40967 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 C_Xb!1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemytable.png b/src/main/resources/assets/bloodmagic/textures/models/alchemytable.png new file mode 100644 index 0000000000000000000000000000000000000000..95bc51ef81146b1f667317e7f10ef5dbc629aa94 GIT binary patch literal 10109 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/demoncrystallizer.png b/src/main/resources/assets/bloodmagic/textures/models/demoncrystallizer.png new file mode 100644 index 0000000000000000000000000000000000000000..370a1f77e60decf5ad032cf42dd8a254623418bc GIT binary patch literal 3406 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/demonpylon.png b/src/main/resources/assets/bloodmagic/textures/models/demonpylon.png new file mode 100644 index 0000000000000000000000000000000000000000..af5ad2bdc62e3c7c47581f70091ad10c66fceb4e GIT binary patch literal 5671 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/hellfireforge.png b/src/main/resources/assets/bloodmagic/textures/models/hellfireforge.png new file mode 100644 index 0000000000000000000000000000000000000000..081ab182333eb037eea424e5dc3086d42307d96f GIT binary patch literal 3581 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 Qm>)I3#K1zoN*5jTKM1(KtN;K2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/incensealtar.png b/src/main/resources/assets/bloodmagic/textures/models/incensealtar.png new file mode 100644 index 0000000000000000000000000000000000000000..68db926370292aff4dfdfe8e4cbcff961b77c4f9 GIT binary patch literal 6835 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/meteor.png b/src/main/resources/assets/bloodmagic/textures/models/meteor.png new file mode 100644 index 0000000000000000000000000000000000000000..e6926d121b4fe68c6cf7d85373783c93207821f0 GIT binary patch literal 1969 zcmV;i2Tu5jP)VGd000McNliru-wF^5Bo9~@Sh4^B2R=ze zK~#9!?V3w$TxS)>fA=x>&diH?J& z5)u*{3dmg`Rbq(*8(6`D1uCFKnh>CZ3IutSHco7(@gu1p^Nu~wJFh!)*>u6CSoDi~ zJ0fTM&F|{Y(a}BM|NM`HU`&pV+40dhUax`Q?_=SQe_-OwIXugE_;D@IE75&?Ltf+R z(JylE?p-X)!tnXX=krWXPO>n+fCzv2>QzbP{Uy-^96xl(9x}@ij+o8; z&M!S~%0_@JE^<8yMV8U*9)qzsm2#Ozvq{&o5aDm!x+U}M_+~Z7O4LtKvWZM2z^`+u1{X6KhV70p?|1?x*R$x@sH%&mF+e=v zXRWx!>!l0}iNpM$4$-GS!@_$jG?rKR&H6(Q`Q2PTco;J}Cd`Y5BKm;AJtMP{s-ac3 z**DEt2j3!2Ss$AwDgArnbLAt&GMax8lUs_##&Cv?D ze(yd*J};+x6?`Yo@bhn#I24bN$UWdJ@KRJm3H$MmMkpydzn(gP;?h|7*Bm|D7Uo4m zxQ{$DK4QN28f7x6bKfGpw#} zFr>nBA%*QsnuR;_v^)mE;W)P8XQL|%^SjyxlgZ>%GMRL1nwI>q-)ze+ioqeKhr>i8 zQNBHxrdTR*`}z$6s!S~u<9n|(sd@Ya_8mZ5+oX1H0b5aNb$i16BW;5hFJ5%--@iYx zyu7@9{`~oA+qR!H4C6tk)0s>p5~I;*w3E$dEC0#NoPBn--D;!eH_5K9aj6rgX7vaS z4`C!{7`%CnEA^vPav7>!&*mLAKBK&rxBGd*Yr}ezkyyUc=cbZqu zhmG0qD^1?4x9GLn#DjhUSX^;=Sj}$J7zpArt8_bUs#cFZ<`&IXo2KldYjrtj)#ztl z@dZP(*JT%b<1vnA3)EDbB|XSjW{yzoc9?9pId|qb%MUBamc`4S0(UJh#jcI2s+3zD z`k9xV*7HvDs?&PjXFRFAxsu=F*qQVE z`Pxm|*&NM!13Mb#{rDIKV~~^SEd9(YPV0H6dD&?_?=&wtt>>NQWvBJL)4Vb=JTiN% z`4BY};V%Ob9&{w4ip@KjBA-8fg5SOQS6bOT@kjuDAb_`2pcRT@>Mml2hiw%4nO9C3 z>g=lQVObC0uWd6%n*sj-vGH+==}p3PIiXu@v~6xLt>O)b36Afj+GtSf!kD>5Kl8HF zdfsVXaazwi%}XB)LWY0?Kpeal$AwZ?KJsGaA?Q# zgeLJTbsx9q=CCXa&F&OmMCQk zOpFcj-_E^>J?M=ZC1kc`jRWlpb$^JO+ef?I=H~6WkG}#Q1nlJJJMH)HdID|*4Ln{0UolNmu~6I|!ajqajwM)} zpWpF3vsK~J2Ig~{{K5~P2GjYRkUie_-e5W>mVmzZ28Fdizk7qiZLr_HJ>eap ze)k49G8wUtV845V!n?x#?(GTR1pD0^6y6o?cW+O)0xnEHfs?zwk6>3=tP7kn)V}ui zHVXx@dqBT?d&2jCnX}LKwYRrjsqi=+$K!Y$A2t3B)Qc8v9BUjQ00000NkvXXu0mjf D3iH=0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/modelinputroutingnode.png b/src/main/resources/assets/bloodmagic/textures/models/modelinputroutingnode.png new file mode 100644 index 0000000000000000000000000000000000000000..1d756a470382f9b018980e74cb2bae071e71cfdd GIT binary patch literal 1948 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/modeloutputroutingnode.png b/src/main/resources/assets/bloodmagic/textures/models/modeloutputroutingnode.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb5bd95b1a63b3865f70ff09cc140acdccbf343 GIT binary patch literal 1916 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 D&y8#< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/pedestal.png b/src/main/resources/assets/bloodmagic/textures/models/pedestal.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca87111cf382522f551e03c4209833470a49026 GIT binary patch literal 1469 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 RaQgrN002ovPDHLkV1jzh$9@0+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_base_d.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_base_d.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8ef737a35b38a134ff8baf40d3ef11bca51635 GIT binary patch literal 1489 zcmV;?1upuDP)XIO6~S1zt%+ zK~z}7t=7Gd9akO3@$bx>IrDz++_%lH<9L%babjT-s1OyRh5vyjJp~ni0}{~EP(z)9 z1_{w1AtV%VWMl(|wY}NBcYXK1&D?oAXXa3ZSi3?YNRwYR)yy-`Pdevg-9I@pqcowe z6=hX3Od=fDVY}Jm2pfYT@I0pDl*Q#0s%weEfc?H;I!^h`?;l#1zx|n+ed~Kz!Mz*L z-+b@Hy!GZCe)Zw+EIwz1Z9B|nQ>NpTw(YoFUU4u1G;cB%Z418vj5!g0m zQIZZ5ma8pIT@(5)O{2KXa=NY~+n4N%3V^?!&UyB73&5M-|M{!Gefapf#TSgI>IPp5 zjvw4-wOX^*qdF>Hp`KYO<5FJmPH(gG<8D| z_>4y>OyG)w9M^TpvYfV6ShmA-GD3F{ z244RLEDO>>LS2<4g8{DesA`334cRVdG#as5tr;XCLP+8;Kx@r(GA53~{s97CB0Z1W zZ@j_PdP`l`Owt5^*>sH7ihWU%V9^6N%hJ9HPClP}r!gMWl zqp51eG#&O2K-Y2l{ERe-$oB;Ylazzm7=X*g0OjHv1wOA0RL3xp6vf$SgP?wv#a_|YSL z;V>K~oSiQSe3#Z(jMD*FpxchWeEbC8bCIsY(cz4IUorpB1=MG(zAxzO3DN!HhsM1B zKE;buROGRC*BswU*gTW?+YRCI3HwJ+=(HyJ`q#)`JjXsvd0D^Ut?&HA>gx$%fAG^@ zE%fz-=(~dJp7_!I0pYvvlFdJ%NkZ~q$DP{)R)6b|SwVPwf`0gCKKS*cSDvu@2Dt8t z@SS^@Aiy7tiTr?}nbB?{q!&Xl#%UDpJ72xwiQWx-=84dgz+88C4_}wS9rLCfXWm^VSw9# zPz|<-NT&j=KV~{RAdbTR0Y3A@!E3Kk&Mj=;M{jbJ?x?Yl#!xOBWZMxWaQRf<@I>zb z*FE7Zk7y;xu0z)?R+FJDO(0{O)fP*%3|oUS=9MRU2e|Hu^ww>#Y{(r->7d+}C<)oG zEo3?Y$Hfg}8m(V>qW3v)-4oT*e`18gD$gl(&DPE!sc0RA%GSsGL!G{*TlCE9mQq-VJ>B r+utx3%gq;hVs*9sFHbyq`htH0we=U2>i%d(00000NkvXXu0mjfgPGa@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_base_s.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_base_s.png new file mode 100644 index 0000000000000000000000000000000000000000..1c6a0cc03c599d79d1040188305142a847385ead GIT binary patch literal 1517 zcmVj1Zb=m*`1$s$D zK~z}7t=3DA9Y+~};kT-*Z`J2EGskCU?C}^A;}FRK6hs6PAhG6$uwliL{}APOuwa4M zM+#CT!vdltM0le3ZWGVtobJ6t%xq@A|DzrP3qbxb+h^oiEAKQ-u{5d&-AM0K!o7&*zW$emy3 zqA14mLfY04>j+~ENiwId4OMCg!;sbfO-^4t=Q;4@7k9t$k6(^lu5J?e9;Hc<(s6Kb zgw`?8lW#XhE2Q*^B8@4x)J?;~2Pf2Z z$8#%ywuR!(atjmNJ>n(TN^^2ZZzp!-%$R zaBjfbo?&o+C5~fevqJ{k;<^DLJ^HSqX?mh4qVIyp0jn9k-@Ca0`wc6a7j zr?|K{1uS70VoZUMii3k=Vx15_xIaE1&r_~mJw(TvbaTex{xy=MLV5w|W{pxIeh?5v z0n^!nx~|FdEyK_=*lK)$vn|PFhLn;p(v)?Bvjcg0%IeA?ZP!y28CA7qvDn2|K3VpH zwyCJ=X8a`_hJn)L>@5$_I>y?bx@lPMUZJWCMZQ5PkNJE_Q&%7)ySw{H&(gKyHz0#B z#NqMa{yjG9HHX)3uv#5bH#IL_JY%o}i^VQUl5k~pL|wOZO-&d?%ohiv1H`S{KXXl; zF<%^#ZoXnNT_9zEwJl9uqI^XdYJ~7m!M|^QX;SRaGV~3PAAcf71&lqxSWl?;eq-J8 zr;f8vOQNvD-)uOZ-ryuiY14?Ew>0Zd46?WEzB}dOUcr1JaZk?p)q6L^SWk@Jz*tYH zu>qGo@y_0FnfySLf0+~L7QHPvo*nZKyQVG!mTzk=KI-|v{Q8wAMh9H>g#NiEo;j-B z2qk>l(Bo7M2#?fozy9J7TS|))7U?_<+lv@QO7Z z3tZ9S*&fezINLB#K;NTWfLs@7J>~SpQ!4WsHt^CDzVCBwdPuG`b+{#peY~F?dm*Fk;0*4O>%3&d_O_WCa5?>&lK@O zW5WS|8+bvH`od#X!4 z^{LA37)_`6u8VKmgr0{| zieKNpEe3DAr5aaXM11#~r`O;52IA$b;>sqB;iXpZlDQ)69gpl zIWIRF=(^6z@-n{flVll({XS`$vbC{+X__Qi#;y0>1K_8(|3rQF4gh(QFyFZcKzA@; z5XXF03{BG*O(w)~Oz8W_qQH(KWKrO|E)RP>e9xmE1Pq5m4h|3TT$kR_5yCJ4_{)P1 z{>OU&WP^do9)$qBzr8JZMvOeq32YnRvd~SF`CEQ|K~ zI$55hYZ?GQe)UyeyLt26!h<*7LjB?WX9JjqK>@sQ;R3c{P?RNxt|QBmdKlu{Hnk|? zV!Mr0ikk1EltKeEar)w&PKWMbaBkr|NkDsc1q{=+@ogI^CBEz8IS#|=l=*y)CIq%^ zV_Oz+nqmmSqr*dnaZD73IJyqNA3ylu6ANd90psm|Jrh8D``R_tYPB$Rot32}ydXdV znv|qP!DuwXa~%92z_l!nheL!?cwxv+3Al>uhdrl4Tj){e6<6 zpnr0LPKT;7=JPqe?^BB+MsZADmPDS1E(F)FT;b04 zHWNTdNhu|kWnq;iwrS#6R&@Z^wvlDYhxhMONJ$CQf`GwjglpRvy3TkyWvN!f^*n^G zGo8&?URpxH^8x5|yI7Wmp=szsfTpoptI<6;;BzZ0w3a{9wUKvyN%~K$f6)VIl=Q5 zd=d5G4${hqlMeMS-=I7+(H1Uz^#|~`d;I9Z@1OWYWq>oE$ch5-wJntEAlBBm2(ojUgV%3zV`kQji^{OI(aGoPpo z@WdzX-9wvLs5nRH9-4FzaSo#l%c}t%NCV4ho%0Ffc>tXGgn04l>3p4ru!u2>5n`o< zN_E6a4J;Q?Z;<^nd*Tz7EAX^WsGVJut|5E7$jKvy**@e4$i)!VKSDJl)ZNZGpD>=s zG&}Q&AKv{ft>Y$v?-L)+uuYQ(JAbB-lFOT$IDg;aWPHNqtu2OeeEJVk`50F8iOS>n od#}8ry8ZsA`h;nkpXn3-0d>~-FGE>tWB>pF07*qoM6N<$g4p%+-v9sr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_mid.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_mid.png new file mode 100644 index 0000000000000000000000000000000000000000..2e16a4b22e38076f2ae3e2d9961d024d66feb105 GIT binary patch literal 1901 zcmV-z2a@=SP)=6 zPm$RF2*F^G^}w=_O3~zYlSw66Tu9?;Y$EgFyTsfam12=tGzvzYYN-UkLMpYQe&X@R zIeF|T*~}ujXMad%S0^LauC9xK_4Kjh7y?*rHgr|R&~<9MPAZi`5TKMVP%{ifS!OAp z2jKLvHK4co0)YK{tQKVKg zICJbMgQrdj+#$YOxM1GX)WU30#ba?3pRe&^ZHzytS~}2n5?HE-fLsoK%$xg4G7VI~NBDj|?F@T^O3i^=ntTas4^~xuqq% zJ|CJ|W%8Skvf1w^mrk$G1Gg534;^B9;s%)D@_1+vppd)S=eJItKsOAkmJ=HiTj5 zG`F-+&gTh_k2ChK^J@~f+*(Xc&oKGH1T|f!kjqgnmJsUZngptP4ap_b{qpbm{LjBd zsK1|@rvL8>+|FpX!{qoV_wLz4_?aJYN|FhO$JqJlPp$IGe!h+- z=HhXDJ|BUApG+=KI-TY#U;Ucd<$N06B8f^$W9lkqR{MXK~)s6S_zMhvAM;M*YE%2Z^7uuFhheEamY^UhJnZD!zxNl zjF00GMN~~A*xSp{wJV5ran%QQf9^q3`7lp}?%qanCWcZjgT+Fyvx~ZEpeR)e*({o( zP%~;sP8Y2m9Z0gwhUMJ-;6tWA&`L)rL^yJTCRtw26S-WDEj}NmQi*D{%4{sgY&^~* z`}dQG&k!CR!*VzsH6x~J0^It%{l5FnFF*Ozns+e2xVW4r^8b-1{H?7d=H^&Pr?ER6 zw6q3LE9DjW!usY5zh<_(AArk+If{k`z*0U>BobLu0ZmaD9T~ovCo~nUs$jR^ zOcT*zN0KDsGc#BOuscMq3=S^m3+vUBrCa#8hR>e4V=qWfCsjou z80w;{w}%Ex1EIctsuh)dp@2h@*u8fjWu=N?7=#7}0F$<@?W_NUcLYH|ayrp89jnd0 zB2QQZs45l4hlg;wT=-gB(Nqn$+f6c=#4yc`6EF+|yVZ&y2*hGBN`*Y8Y2xvE$t07s z1pL??BI$(%)L4visf6Tok>wtC!wGmSuYS`l#so#tGC71FOx>CfP}3Y!uV1BRgFb%4M7$59MNsYDL9rwUA0A zZpv=65l_sKo}XWt2ksQHXq3p~ItCERW| zZGix@k;ujsP)bD#r6Q)Tlgnl?>vcR{FO^D}h6XFeVi5roYl8*%re-djJ%c1k$W4vN zZuiC&=-IK8zMdZTJ@5bm;Pv|v8XAaBOi(D~vDs{hqQt=Vom5IinzwA>GY>zEQ>F4$-ZwlA_k7`tW->OtYMd96^JuC@qq_;w=|q%e nbX_OAut2c4m+06iqFvMOpJ~07N7u znXE%Dmqp5mgf=tNvux<@WTr4f&x6;CoA*dtCVE;Wx*XB0w{UX~Ns^GZ4Qh*Z0FJ+W0B(Qm!Y#MmU4PYxSO0;#kPz^f-;qqI<_=G9SzLL?t$Kvs#4r*fam9 zTE#$0q!<}{i<#M3(kTN?)3|>1=9)u(``07MwX1KUC<;*$(OmSo_10~!oElmaxLDcL z8V#yt57S7ar8G2ELsi9^0Q{hd>6mo=B+vezK7o-okYW7Z8Mv3w?p5c{U1ZzNEqI6O zyl7lxa(a>{zWNw9ULRc>z~Mh0NDRXOMIdEJy*SGO=xo(n1NL z2vUZDb#}oIQH^0~MrLD3!?M9O_;jU00D&Kp2GRs!rgCWb-b?`69J?jn0j^ z5B@6{92(;0)nSA#a5D~}46$94IBZiXdQ2A!OG1nlCT!$N_U*DVb_4T1@g0Zo226pUV)8<}G zGtKz;1g_&!E|&3qA2;hTG&I7V2X~RuQ@nZY2I9K+QsO7K5`dNWpZdzf$v40EWU>~3 zNXE-~B3h9r#>d`S&J>EOuw~n3TCD)tidN+d?f1Vv#?HPa-~LzS%rYgl#X4gXV{0-X z!;rz@;iWuL^oR!%R83)SehwK*!cby5X@Vdi-?5Y%-Wi`<&KJt=M+cI8cb0QUue`5y z?EUiYCt zI>>e9h{6~*XA^~z4I4VKEQ?CHisyM~DHWj#@?BZx3Uk<5lSZvU5QM~WjJjSCx_Rs1 zBcJ~Gk`Kf&PR3?#W{ygwf~pE486l;lyimb%O>EmCiei#>8%0YH>jjYQatVR}P}s8N zL #x-NZNHxox~+Ho7pwlNHYW}`)Mu83)+N!s95>+1&)$q2vYBZR_KVVY{iW4bU) zsaPQlB`sfKq;)LEf_6erZx2E!Z0PPp2(f+uT^lihB=AFIC^3yRqAivzUD3$rvuK)5 z&|E2uf9+gDS9M}FrrGf6-_b`xg6&uot8*0Ri?sZJ&W*YCuVCLd9!-jc(p`4m rtOXc`PNnFPw$dm9OlRr3(%%0AV&YqoEeI8f00000NkvXXu0mjfC&hES literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_mid_d.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_mid_d.png new file mode 100644 index 0000000000000000000000000000000000000000..a2962ef426e20dba19bb80545063a461d5d8dfd6 GIT binary patch literal 1805 zcmV+o2lDudP)F(*Ry1S~nb`Ew%9$A^OJ>i|I z^ws~E>jn;+$g$UGc&gYK-w@U6-^eZO@8*nkMr1<$GKgIvLchu zWofoL_`Xl2Q~*)JbzIVhPQB5h(QMJ__OPA7bpncvu4$xGDge87?c~hV72+u5sc-(3 z(XmmEzB_SS1mu7I>j-h+Q>hf0oo`|F98^U@S7qWD+FhHOxkYqEMiM0e-m9s%x&RCh zmGQj^e)Ig3Bo}9Rdfzyy8|2o*sviCN#l1<_>QJvQlS&(OI~HfpU**7mjtkr+tY7U( zvLAVv{@g6$h{>`y$F?V4SlLg$`D5Geb9U+?p6_GZF0w2U1s(ve{OQG{)3LZVJih|mSyqFC+_8$1Lrw*;tZE&YC`^7`_?4CihwFh1inYN z+b5gN5C$Puw+}$G+2Z7>3F0WEzT84p6y_Fc04&Wf;5ZJ;jV9lIQ=wGIlS%8h=YgAF z{_>B5v|1LvAE3x0sdNh04*~e&%YR?B)^|NLRRO>>bBs?;vHyFIBJ8+_@9cdWKZx&~ zz`x%-{l0RowPsm;Y{!M!ggt*d4nRJm-?<6b>NEc*tWsdDKCgurp4*eWee?uz95Yld z&}ds+yEezEsp)lzi#NZtT1^_wHje92t1sg^Hmahm{}-anP`SYVm%hX=cHfJksdzWM zb4LmsICNx{(I##(+FH0aJIA(dV|@Ml2N@k5D3wYSO9jrIndGawk;H+|@$s{~dgxX^RI4=%P3Ct${{qkc_%HxNmE!H0 zaPJSkk(`=5&yMY5%r92Sqz%%U41N$1crJbrQK^)eo}K5?cpS^%COXTxe<`-+EbcHApD4IED zXJ*+nQlW1Ts4iQ#Z1CXrO-aGb;&}n?z$2ecBPkMA$3~Jx5)x9HM!9HGt2YVah>VfK zwjIhvlMTzc>;A3D{r8PgE}ER4{4c}9Am+{GS zi1ow!lEl530NniiiAT04UwLYGvhF#S#Fab|1mP`tqTlc1dme_a5QhQnuDvQ>$lrbb z&y0QOBmmC*1(x5rzOn0v%q%RetH8kXxp?6+l}eFZE{z{XXsU>+s`Tsuil$>KGLj?_ z1YKlF;^f5CO1=;t**TV^(H4zCJ*em58EA3DVON?dbHXWnyz8@ZH9)* zNRo^|f+&f&u7~5exPt-n3ron88$4E>ZXc`H$Iw(<$3YMTG8qHgc1fjliUpJ9#qvrn*!`Q51T;K2a1Ph!W*efiMOm zrEOdRK>#zC#T&R}b2$`MW8eh@Q9`fVr%))+YPHE_4P;p*W26YfkaDR=CT(n-KuT9p zHI1#KqcqzVp65|Avj9}eMZz$^c3gUW7eRo5AE2r#u45C&@y1)w?Kz}$jitp!q6A#m zL)TRLPMdNePrvV=sw$E!6GaiarjsNQ1J|L}=xm&Tsw&JcR*91YQIya$4R{AyJw8KxjBL` zq*yGXC=zeH^)9k36Gt&+Grw^U5XYEip2t7+D30qhR5DkxK)qHY3}bpdn`*U&=LhJj z%I81(7&{->&cOFKu0RmQE8~1*s7TSwuNvo?t|LhzR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/pillar_mid_s.png b/src/main/resources/assets/bloodmagic/textures/models/pillar_mid_s.png new file mode 100644 index 0000000000000000000000000000000000000000..3ebb670cf2feeb990dbf6b85c99fad726569a592 GIT binary patch literal 1794 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 BzG46X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/steadfastcrystal.png b/src/main/resources/assets/bloodmagic/textures/models/steadfastcrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..7f93d339cfce404b5e4df1463e0cf076fb81dbd6 GIT binary patch literal 734 zcmV<40wMj0P)D+r9>D>_X;f1H000McNliru-~${E9T0E2a;E?Q0&7V` zK~y-)CDKcl+(ZyS(HHrXRI08j+6LnZBlg8M*aLg?)Q8jH?$R$MWkv=A?i#NA`Nv=8 zf+MA#E+l*$fPl4t3=vX7PO$k2n$e>mQ8?Jy_Jxp!5m({z@(TACq`P2q#SH@he(Vv6 z==`9S6|Wg`VX!Bd60Y|b2v_9x3lbt$8u81BE{a6Yc<TR!7lOHjnL%lIiCm;7TE{SSoLNbOr@MH(cqA$L-;8Du)!-7}gwt+OW0IT4NkWlJyMtj%Jk< z6LtvOydxsy%k#!+VdM9uYxQ7;hckdupvX7jVH5N6*{0ck+jF z{nV504oBx{Tc*{9MWeO~u~D+2*@)3&X0+N6XT(bc;MfW!X98Ws44%_W`YGYlK>kq( zNvTB%qoBF4+eT~9T_fHi$3A1nPCyK)g*s)1-#yWUV>vi?p=QOh@_f$32ZRt%HJUR@ zKK_4zW;g`7jx6iW>ubUnW19+9Dz#SV6%$83GI={_=Z0=G9GReR@A%6FTPLRX7fgki zgzAjyPKq3yy0iXs;*%mcTFuzDA?r$LdT=}sE~Svqjs5Y3bnVfzpwo_>J2(f)A;F=0 zf#(AA!Zb~U*!Sp~spm#;&_3Qc)`*zL)&n^!c1<7w{rkkuo${PnwgtTMA2`@{bUKJ0 Q4gdfE07*qoM6N<$f}gia_y7O^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/models/vengefulcrystal.png b/src/main/resources/assets/bloodmagic/textures/models/vengefulcrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..5f70782552f9056a8c51ecc3290a56823d0fb971 GIT binary patch literal 737 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 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 Knife 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 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. 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 and 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 my 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 warry 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! + +# 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 health 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. When Will of the same type bump into each other in the Aura it tends to congregate similar to how impurities in an otherwise homogeneous liquid clump together. If a device is able to latch onto these clumps within the Raw Will in the Aura, chunks of pure Will of a particular type can be gathered. One such device 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 pray 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\tWhen it generates a crystal from Raw Will, there is a small chance (~40%%) for the formed crystal to be of one of the aspected types. Essentially, this is how you can initially gather the different types of Will. +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 Crash of the 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 + + + + +# 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! diff --git a/src/main/resources/assets/bloodmagicguide/textures/gui/alchemyarraycrafting.png b/src/main/resources/assets/bloodmagicguide/textures/gui/alchemyarraycrafting.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3a6eabfd31d2aced9e8ca07b3666d390f9dfcf GIT binary patch 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 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 S{}ljVJHE5G&iU47|NjBVa!e=y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagicguide/textures/gui/bullet_point.png b/src/main/resources/assets/bloodmagicguide/textures/gui/bullet_point.png new file mode 100644 index 0000000000000000000000000000000000000000..fd56d1bb0d67abaac3273f095eca6568630f53a3 GIT binary patch literal 17840 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagicguide/textures/gui/soulforge.png b/src/main/resources/assets/bloodmagicguide/textures/gui/soulforge.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee6acd20f42d4c7b65fa13d59cdbc755586359d GIT binary patch literal 3452 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 literal 0 HcmV?d00001 From 574056203d05738b19fd2283e3e504efeb81c3ba Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 2 Jan 2017 01:18:02 -0800 Subject: [PATCH 009/595] Fix JEI compat --- .../compat/jei/BloodMagicPlugin.java | 19 ++---- .../jei/CompatibilityJustEnoughItems.java | 24 -------- .../AlchemyArrayCraftingCategory.java | 7 +-- .../AlchemyArrayCraftingRecipeHandler.java | 2 +- .../AlchemyArrayCraftingRecipeJEI.java | 8 +-- .../AlchemyTableRecipeCategory.java | 2 +- .../AlchemyTableRecipeHandler.java | 2 +- .../alchemyTable/AlchemyTableRecipeJEI.java | 8 ++- .../compat/jei/altar/AltarRecipeCategory.java | 6 +- .../compat/jei/altar/AltarRecipeHandler.java | 2 +- .../compat/jei/altar/AltarRecipeJEI.java | 7 +-- .../ArmourDowngradeRecipeCategory.java | 7 ++- .../ArmourDowngradeRecipeJEI.java | 8 ++- .../jei/binding/BindingRecipeCategory.java | 21 ++++--- .../jei/binding/BindingRecipeHandler.java | 10 +--- .../compat/jei/binding/BindingRecipeJEI.java | 21 ++----- .../forge/TartaricForgeRecipeCategory.java | 24 +++++--- .../jei/forge/TartaricForgeRecipeHandler.java | 10 +--- .../jei/forge/TartaricForgeRecipeJEI.java | 28 ++++----- .../jei/orb/ShapedOrbRecipeHandler.java | 8 --- .../compat/jei/orb/ShapedOrbRecipeJEI.java | 59 ++++--------------- .../jei/orb/ShapelessOrbRecipeHandler.java | 8 --- .../compat/jei/orb/ShapelessOrbRecipeJEI.java | 53 +++-------------- 23 files changed, 100 insertions(+), 244 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/CompatibilityJustEnoughItems.java diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index 9399aee5..31f609e9 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -56,8 +56,8 @@ public class BloodMagicPlugin extends BlankModPlugin registry.addRecipes(AlchemyTableRecipeMaker.getRecipes()); registry.addRecipes(ArmourDowngradeRecipeMaker.getRecipes()); - registry.addDescription(new ItemStack(ModItems.ALTAR_MAKER), "jei.BloodMagic.desc.altarBuilder"); - registry.addDescription(new ItemStack(ModItems.MONSTER_SOUL), "jei.BloodMagic.desc.demonicWill"); + registry.addDescription(new ItemStack(ModItems.ALTAR_MAKER), "jei.bloodmagic.desc.altarBuilder"); + registry.addDescription(new ItemStack(ModItems.MONSTER_SOUL), "jei.bloodmagic.desc.demonicWill"); jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.BLOOD_LIGHT)); jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.SPECTRAL_BLOCK)); @@ -78,8 +78,6 @@ public class BloodMagicPlugin extends BlankModPlugin } } - jeiHelper.getSubtypeRegistry().useNbtForSubtypes(Item.getItemFromBlock(ModBlocks.BLOOD_TANK)); - registry.addRecipeClickArea(GuiSoulForge.class, 115, 15, 16, 88, Constants.Compat.JEI_CATEGORY_SOULFORGE); registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.ALTAR), Constants.Compat.JEI_CATEGORY_ALTAR); @@ -88,15 +86,10 @@ public class BloodMagicPlugin extends BlankModPlugin registry.addRecipeCategoryCraftingItem(new ItemStack(ModItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_BINDING); registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.ALCHEMY_TABLE), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.RITUAL_CONTROLLER), Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE); + } - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.OWNER_UUID); - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.OWNER_NAME); - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.USES); - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.SOULS); - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.X_COORD); - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.Y_COORD); - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.Z_COORD); - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.DIMENSION_ID); - jeiHelper.getNbtIgnoreList().ignoreNbtTagNames(Constants.NBT.ITEM_INVENTORY); + @Override + public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { + subtypeRegistry.useNbtForSubtypes(Item.getItemFromBlock(ModBlocks.BLOOD_TANK)); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/CompatibilityJustEnoughItems.java b/src/main/java/WayofTime/bloodmagic/compat/jei/CompatibilityJustEnoughItems.java deleted file mode 100644 index dc95a10d..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/CompatibilityJustEnoughItems.java +++ /dev/null @@ -1,24 +0,0 @@ -package WayofTime.bloodmagic.compat.jei; - -import WayofTime.bloodmagic.compat.ICompatibility; - -public class CompatibilityJustEnoughItems implements ICompatibility -{ - @Override - public void loadCompatibility(InitializationPhase phase) - { - - } - - @Override - public String getModId() - { - return "JEI"; - } - - @Override - public boolean enableCompat() - { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java index d2afe677..9635c043 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java @@ -24,7 +24,7 @@ public class AlchemyArrayCraftingCategory implements IRecipeCategory @Nonnull private final IDrawable background = BloodMagicPlugin.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"); + private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.alchemyArrayCrafting"); @Nonnull @Override @@ -69,10 +69,9 @@ public class AlchemyArrayCraftingCategory implements IRecipeCategory if (recipeWrapper instanceof AlchemyArrayCraftingRecipeJEI) { - AlchemyArrayCraftingRecipeJEI alchemyArrayWrapper = (AlchemyArrayCraftingRecipeJEI) recipeWrapper; recipeLayout.getItemStacks().set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); - recipeLayout.getItemStacks().set(CATALYST_SLOT, alchemyArrayWrapper.getCatalyst()); - recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0).get(0)); + recipeLayout.getItemStacks().set(CATALYST_SLOT, ingredients.getInputs(ItemStack.class).get(ingredients.getInputs(ItemStack.class).size() - 1)); + recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java index 42d996db..61eb4548 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java @@ -31,6 +31,6 @@ public class AlchemyArrayCraftingRecipeHandler implements IRecipeHandler 0 && recipe.getOutputs().size() > 0; + return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java index 6efbc435..1dbb5f98 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; -import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import com.google.common.collect.Lists; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; @@ -14,10 +14,8 @@ public class AlchemyArrayCraftingRecipeJEI extends BlankRecipeWrapper { @Nonnull private final List inputs; - @Nullable private final ItemStack catalyst; - @Nonnull private final ItemStack output; @@ -35,7 +33,7 @@ public class AlchemyArrayCraftingRecipeJEI extends BlankRecipeWrapper @Override public void getIngredients(IIngredients ingredients) { - ingredients.setOutputs(ItemStack.class, Collections.singletonList(output)); - ingredients.setInputs(ItemStack.class, inputs); + 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/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java index 34b16e28..a83e7896 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -26,7 +26,7 @@ public class AlchemyTableRecipeCategory implements IRecipeCategory @Nonnull private final IDrawable background = BloodMagicPlugin.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.alchemyTable"); + private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.alchemyTable"); @Nonnull private final ICraftingGridHelper craftingGridHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java index f271d1c4..983a457e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java @@ -31,6 +31,6 @@ public class AlchemyTableRecipeHandler implements IRecipeHandler 0 && recipe.getOutputs().size() > 0; + return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java index 3314ee2d..9c258297 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import lombok.Getter; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; @@ -22,7 +23,8 @@ public class AlchemyTableRecipeJEI extends BlankRecipeWrapper @Override public void getIngredients(IIngredients ingredients) { -// ingredients.setInputLists(ItemStack.class, Lists.newArrayList(recipe.getInput(), OrbRegistry.getOrbsDownToTier(recipe.getTierRequired()))); + List> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); + ingredients.setInputLists(ItemStack.class, expanded); ingredients.setOutput(ItemStack.class, recipe.getRecipeOutput(new ArrayList())); } @@ -32,8 +34,8 @@ public class AlchemyTableRecipeJEI extends BlankRecipeWrapper ArrayList ret = new ArrayList(); if (mouseX >= 58 && mouseX <= 78 && mouseY >= 21 && mouseY <= 34) { - ret.add(TextHelper.localize("jei.BloodMagic.recipe.lpDrained", recipe.getLpDrained())); - ret.add(TextHelper.localize("jei.BloodMagic.recipe.ticksRequired", recipe.getTicksRequired())); + ret.add(TextHelper.localize("jei.bloodmagic.recipe.lpDrained", recipe.getLpDrained())); + ret.add(TextHelper.localize("jei.bloodmagic.recipe.ticksRequired", recipe.getTicksRequired())); } return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java index b27cb37e..ba872ee0 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java @@ -25,7 +25,7 @@ public class AltarRecipeCategory implements IRecipeCategory @Nonnull private final IDrawable background = BloodMagicPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/altar.png"), 3, 4, 155, 65); @Nonnull - private final String localizedName = TextHelper.localize("jei.BloodMagic.recipe.altar"); + private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.altar"); @Nonnull @Override @@ -68,9 +68,7 @@ public class AltarRecipeCategory implements IRecipeCategory if (recipeWrapper instanceof AltarRecipeJEI) { - AltarRecipeJEI altarRecipeWrapper = (AltarRecipeJEI) recipeWrapper; - List> inputs = ingredients.getInputs(ItemStack.class); - recipeLayout.getItemStacks().set(INPUT_SLOT, inputs.get(0)); + recipeLayout.getItemStacks().set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java index 7fc390e2..bb421437 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java @@ -31,6 +31,6 @@ public class AltarRecipeHandler implements IRecipeHandler @Override public boolean isRecipeValid(@Nonnull AltarRecipeJEI recipe) { - return recipe.getInputs().size() > 0 && recipe.getOutputs().size() > 0; + return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java index a9e1cf18..22558ba6 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java @@ -17,7 +17,6 @@ public class AltarRecipeJEI extends BlankRecipeWrapper { @Nonnull private final List input; - @Nonnull private final ItemStack output; @@ -30,7 +29,7 @@ public class AltarRecipeJEI extends BlankRecipeWrapper this.input = input; this.output = output; - this.infoString = new String[] { TextHelper.localize("jei.BloodMagic.recipe.requiredTier", NumeralHelper.toRoman(tier)), TextHelper.localize("jei.BloodMagic.recipe.requiredLP", requiredLP) }; + this.infoString = new String[] { TextHelper.localize("jei.bloodmagic.recipe.requiredTier", NumeralHelper.toRoman(tier)), TextHelper.localize("jei.bloodmagic.recipe.requiredLP", requiredLP) }; this.consumptionRate = consumptionRate; this.drainRate = drainRate; } @@ -47,8 +46,8 @@ public class AltarRecipeJEI extends BlankRecipeWrapper ArrayList ret = new ArrayList(); if (mouseX >= 13 && mouseX <= 64 && mouseY >= 27 && mouseY <= 58) { - ret.add(TextHelper.localize("jei.BloodMagic.recipe.consumptionRate", consumptionRate)); - ret.add(TextHelper.localize("jei.BloodMagic.recipe.drainRate", drainRate)); + ret.add(TextHelper.localize("jei.bloodmagic.recipe.consumptionRate", consumptionRate)); + ret.add(TextHelper.localize("jei.bloodmagic.recipe.drainRate", drainRate)); } return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java index 5ca3e731..43452de7 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java @@ -26,7 +26,7 @@ public class ArmourDowngradeRecipeCategory implements IRecipeCategory @Nonnull private final IDrawable background = BloodMagicPlugin.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"); + private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.armourDowngrade"); @Nonnull private final ICraftingGridHelper craftingGridHelper; @@ -88,8 +88,9 @@ public class ArmourDowngradeRecipeCategory implements IRecipeCategory if (recipeWrapper instanceof ArmourDowngradeRecipeJEI) { - guiItemStacks.set(KEY_SLOT, ingredients.getInputs(ItemStack.class).get(1)); - craftingGridHelper.setOutput(guiItemStacks, ingredients.getOutputs(ItemStack.class).get(0)); + 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); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java index 8ab68515..e412380a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import com.google.common.collect.Lists; import lombok.Getter; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; @@ -8,6 +10,8 @@ import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.registry.ModItems; +import java.util.List; + public class ArmourDowngradeRecipeJEI extends BlankRecipeWrapper { @Getter @@ -20,7 +24,9 @@ public class ArmourDowngradeRecipeJEI extends BlankRecipeWrapper @Override public void getIngredients(IIngredients ingredients) { - // TODO - inputs + List> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); + expanded.add(Lists.newArrayList(recipe.getKey())); + ingredients.setInputLists(ItemStack.class, expanded); ItemStack upgradeStack = new ItemStack(ModItems.UPGRADE_TOME); LivingUpgrades.setUpgrade(upgradeStack, recipe.getRecipeOutput()); ingredients.setOutput(ItemStack.class, upgradeStack); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java index cc341cd1..09a57cf3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java @@ -1,9 +1,11 @@ package WayofTime.bloodmagic.compat.jei.binding; import javax.annotation.Nonnull; +import javax.annotation.Nullable; 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; @@ -22,7 +24,7 @@ public class BindingRecipeCategory implements IRecipeCategory @Nonnull private final IDrawable background = BloodMagicPlugin.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"); + private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.binding"); @Nonnull @Override @@ -51,26 +53,23 @@ public class BindingRecipeCategory implements IRecipeCategory } + @Nullable @Override - public void drawAnimations(Minecraft minecraft) - { - + public IDrawable getIcon() { + return null; } @Override - @SuppressWarnings("unchecked") - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) - { + 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) { - BindingRecipeJEI bindingRecipe = (BindingRecipeJEI) recipeWrapper; - recipeLayout.getItemStacks().set(INPUT_SLOT, bindingRecipe.getInputs()); - recipeLayout.getItemStacks().set(CATALYST_SLOT, bindingRecipe.getCatalyst()); - recipeLayout.getItemStacks().set(OUTPUT_SLOT, bindingRecipe.getOutputs()); + 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)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java index 34981bf9..c8703a1e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java @@ -15,14 +15,6 @@ public class BindingRecipeHandler implements IRecipeHandler return BindingRecipeJEI.class; } - @Deprecated - @Nonnull - @Override - public String getRecipeCategoryUid() - { - return Constants.Compat.JEI_CATEGORY_BINDING; - } - @Override public String getRecipeCategoryUid(@Nonnull BindingRecipeJEI recipe) { @@ -39,6 +31,6 @@ public class BindingRecipeHandler implements IRecipeHandler @Override public boolean isRecipeValid(@Nonnull BindingRecipeJEI recipe) { - return recipe.getInputs().size() > 0 && recipe.getOutputs().size() > 0; + 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 index 7081c921..b73dce1b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeJEI.java @@ -1,10 +1,11 @@ package WayofTime.bloodmagic.compat.jei.binding; -import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; +import com.google.common.collect.Lists; +import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; @@ -28,21 +29,9 @@ public class BindingRecipeJEI extends BlankRecipeWrapper } @Override - @Nonnull - public List getInputs() - { - return inputs; - } + public void getIngredients(IIngredients ingredients) { - public ItemStack getCatalyst() - { - return catalyst; - } - - @Override - @Nonnull - public List getOutputs() - { - return Collections.singletonList(output); + 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/forge/TartaricForgeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java index 999d6e8f..d3cde49f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java @@ -1,14 +1,15 @@ package WayofTime.bloodmagic.compat.jei.forge; -import java.util.ArrayList; import java.util.List; import javax.annotation.Nonnull; +import javax.annotation.Nullable; 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; @@ -27,7 +28,7 @@ public class TartaricForgeRecipeCategory implements IRecipeCategory @Nonnull private final IDrawable background = BloodMagicPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/soulForge.png"), 0, 0, 100, 40); @Nonnull - private final String localizedName = TextHelper.localize("jei.BloodMagic.recipe.soulForge"); + private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.soulForge"); @Nonnull private final ICraftingGridHelper craftingGridHelper; @@ -63,15 +64,15 @@ public class TartaricForgeRecipeCategory implements IRecipeCategory } + @Nullable @Override - public void drawAnimations(Minecraft minecraft) + public IDrawable getIcon() { - + return null; } @Override - @SuppressWarnings("unchecked") - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) + public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); @@ -87,12 +88,17 @@ public class TartaricForgeRecipeCategory implements IRecipeCategory } } + List> inputs = ingredients.getInputs(ItemStack.class); + List> outputs = ingredients.getOutputs(ItemStack.class); + if (recipeWrapper instanceof TartaricForgeRecipeJEI) { TartaricForgeRecipeJEI recipe = (TartaricForgeRecipeJEI) recipeWrapper; - guiItemStacks.set(GEM_SLOT, (ArrayList) recipe.getInputs().get(1)); - craftingGridHelper.setOutput(guiItemStacks, recipe.getOutputs()); - craftingGridHelper.setInput(guiItemStacks, (List) recipe.getInputs().get(0), 2, 3); + 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); } } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java index e5c0ac05..d435eee9 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java @@ -15,14 +15,6 @@ public class TartaricForgeRecipeHandler implements IRecipeHandler 0 && recipe.getOutputs().size() > 0; + return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java index e51511bd..82133b75 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java @@ -8,7 +8,10 @@ import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import com.google.common.collect.Lists; import lombok.Getter; +import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; @@ -20,7 +23,7 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper @Getter private TartaricForgeRecipe recipe; @Getter - private ArrayList validGems = new ArrayList(); + private List validGems = new ArrayList(); public TartaricForgeRecipeJEI(TartaricForgeRecipe recipe) { @@ -32,20 +35,11 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper } @Override - @Nonnull - public List getInputs() - { - ArrayList ret = new ArrayList(); - ret.add(recipe.getInput()); - ret.add(validGems); - return ret; - } - - @Override - @Nonnull - public List getOutputs() - { - return Collections.singletonList(recipe.getRecipeOutput()); + public void getIngredients(IIngredients ingredients) { + List> expandedInputs = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); + expandedInputs.add(validGems); + ingredients.setInputLists(ItemStack.class, expandedInputs); + ingredients.setOutput(ItemStack.class, recipe.getRecipeOutput()); } @Nullable @@ -55,8 +49,8 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper ArrayList ret = new ArrayList(); if (mouseX >= 40 && mouseX <= 60 && mouseY >= 21 && mouseY <= 34) { - ret.add(TextHelper.localize("jei.BloodMagic.recipe.minimumSouls", recipe.getMinimumSouls())); - ret.add(TextHelper.localize("jei.BloodMagic.recipe.soulsDrained", recipe.getSoulsDrained())); + ret.add(TextHelper.localize("jei.bloodmagic.recipe.minimumSouls", recipe.getMinimumSouls())); + ret.add(TextHelper.localize("jei.bloodmagic.recipe.soulsDrained", recipe.getSoulsDrained())); return ret; } return null; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeHandler.java index 4e746059..e869ea63 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeHandler.java @@ -19,14 +19,6 @@ public class ShapedOrbRecipeHandler implements IRecipeHandler> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(inputs); + ingredients.setInputLists(ItemStack.class, expanded); + ingredients.setOutput(ItemStack.class, output); } @Override - public List getOutputs() - { - return Collections.singletonList(output); - } - - @Override - public void drawInfo(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) - { - String draw = TextHelper.localize("jei.BloodMagic.recipe.requiredTier", NumeralHelper.toRoman(tier)); + public void drawInfo(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) { + String draw = TextHelper.localize("jei.bloodmagic.recipe.requiredTier", NumeralHelper.toRoman(tier)); minecraft.fontRendererObj.drawString(draw, 72 - minecraft.fontRendererObj.getStringWidth(draw) / 2, 10, Color.gray.getRGB()); } - - @Override - public List getFluidInputs() - { - return null; - } - - @Override - public List getFluidOutputs() - { - return null; - } - - @Override - public void drawAnimations(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight) - { - - } - - @Nullable - @Override - public List getTooltipStrings(int mouseX, int mouseY) - { - return null; - } - - @Override - public boolean handleClick(@Nonnull Minecraft minecraft, int mouseX, int mouseY, int mouseButton) - { - return false; - } -} +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeHandler.java index 5bca16e6..1e59b30d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeHandler.java @@ -17,14 +17,6 @@ public class ShapelessOrbRecipeHandler implements IRecipeHandler getOutputs() - { - return Collections.singletonList(output); + public void getIngredients(IIngredients ingredients) { + List> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(inputs); + ingredients.setInputLists(ItemStack.class, expanded); + ingredients.setOutput(ItemStack.class, output); } @Override public void drawInfo(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) { - String draw = TextHelper.localize("jei.BloodMagic.recipe.requiredTier", NumeralHelper.toRoman(tier)); + String draw = TextHelper.localize("jei.bloodmagic.recipe.requiredTier", NumeralHelper.toRoman(tier)); minecraft.fontRendererObj.drawString(draw, 72 - minecraft.fontRendererObj.getStringWidth(draw) / 2, 10, Color.gray.getRGB()); } - - @Override - public List getFluidInputs() - { - return null; - } - - @Override - public List getFluidOutputs() - { - return null; - } - - @Override - public void drawAnimations(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight) - { - - } - - @Nullable - @Override - public List getTooltipStrings(int mouseX, int mouseY) - { - return null; - } - - @Override - public boolean handleClick(@Nonnull Minecraft minecraft, int mouseX, int mouseY, int mouseButton) - { - return false; - } } From a628adfde8d6b4890abd91d7af88280811008485 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 2 Jan 2017 01:18:29 -0800 Subject: [PATCH 010/595] Lowercase all the tooltip strings --- .../api/DamageSourceBloodMagic.java | 2 +- .../api/altar/EnumAltarComponent.java | 2 +- .../api/livingArmour/LivingArmourUpgrade.java | 4 +- .../recipe/LivingArmourDowngradeRecipe.java | 2 +- .../api/recipe/TartaricForgeRecipe.java | 4 +- .../bloodmagic/api/ritual/Ritual.java | 8 ++-- .../bloodmagic/block/BlockAltar.java | 2 +- .../bloodmagic/block/BlockBloodRune.java | 2 +- .../bloodmagic/block/BlockLifeEssence.java | 2 +- .../WayofTime/bloodmagic/block/BlockPath.java | 2 +- .../block/BlockRitualController.java | 2 +- .../bloodmagic/block/BlockRitualStone.java | 2 +- .../client/gui/GuiAlchemyTable.java | 2 +- .../bloodmagic/client/gui/GuiHolding.java | 2 +- .../client/gui/GuiMasterRoutingNode.java | 2 +- .../bloodmagic/client/gui/GuiSoulForge.java | 2 +- .../bloodmagic/client/gui/GuiTeleposer.java | 2 +- .../command/sub/SubCommandNetwork.java | 2 +- .../compat/guideapi/GuideBloodMagic.java | 18 +++---- .../guideapi/page/PageAlchemyArray.java | 2 +- .../compat/guideapi/page/PageAltarRecipe.java | 6 +-- .../page/PageTartaricForgeRecipe.java | 6 +-- .../provider/DataProviderAlchemyArray.java | 6 +-- .../provider/DataProviderBloodAltar.java | 10 ++-- .../waila/provider/DataProviderBloodTank.java | 10 ++-- .../DataProviderRitualController.java | 10 ++-- .../waila/provider/DataProviderTeleposer.java | 6 +-- .../item/ItemActivationCrystal.java | 2 +- .../bloodmagic/item/ItemAltarMaker.java | 8 ++-- .../bloodmagic/item/ItemArcaneAshes.java | 2 +- .../bloodmagic/item/ItemBindableBase.java | 2 +- .../bloodmagic/item/ItemBloodOrb.java | 4 +- .../bloodmagic/item/ItemBoundSword.java | 8 ++-- .../bloodmagic/item/ItemBoundTool.java | 6 +-- .../bloodmagic/item/ItemDemonWillGauge.java | 2 +- .../bloodmagic/item/ItemExperienceBook.java | 6 +-- .../bloodmagic/item/ItemInscriptionTool.java | 2 +- .../bloodmagic/item/ItemRitualDiviner.java | 4 +- .../bloodmagic/item/ItemRitualReader.java | 6 +-- .../item/ItemSacrificialDagger.java | 4 +- .../bloodmagic/item/ItemSanguineBook.java | 6 +-- .../WayofTime/bloodmagic/item/ItemSlate.java | 2 +- .../item/ItemTelepositionFocus.java | 6 +-- .../bloodmagic/item/ItemUpgradeTome.java | 4 +- .../bloodmagic/item/ItemUpgradeTrainer.java | 2 +- .../item/alchemy/ItemCuttingFluid.java | 2 +- .../ItemLivingArmourPointsUpgrade.java | 2 +- .../item/armour/ItemLivingArmour.java | 8 ++-- .../item/block/ItemBlockBloodTank.java | 12 ++--- .../item/gear/ItemPackSacrifice.java | 4 +- .../item/gear/ItemPackSelfSacrifice.java | 4 +- .../item/routing/ItemNodeRouter.java | 20 ++++---- .../item/routing/ItemRouterFilter.java | 2 +- .../bloodmagic/item/sigil/ItemSigilBase.java | 4 +- .../item/sigil/ItemSigilHolding.java | 8 ++-- .../item/sigil/ItemSigilTeleposition.java | 4 +- .../item/sigil/ItemSigilToggleableBase.java | 6 +-- .../bloodmagic/item/soul/ItemMonsterSoul.java | 2 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 4 +- .../item/soul/ItemSentientPickaxe.java | 4 +- .../item/soul/ItemSentientShovel.java | 4 +- .../item/soul/ItemSentientSword.java | 4 +- .../bloodmagic/item/soul/ItemSoulGem.java | 6 +-- .../bloodmagic/item/soul/ItemSoulSnare.java | 2 +- .../bloodmagic/livingArmour/LivingArmour.java | 2 +- .../potion/item/ItemPotionFlask.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 2 +- .../ritual/RitualLivingArmourDowngrade.java | 9 ++-- .../structures/DungeonRoomLoader.java | 2 +- .../bloodmagic/tile/TileDemonCrucible.java | 29 +++++------ .../bloodmagic/tile/TileInventory.java | 48 +++++++++---------- .../tile/TileMasterRitualStone.java | 18 +++---- .../WayofTime/bloodmagic/tile/TileMimic.java | 20 ++++---- .../tile/routing/TileFilteredRoutingNode.java | 9 ++-- .../util/handler/event/ClientHandler.java | 4 +- .../util/handler/event/GenericHandler.java | 2 +- .../bloodmagic/schematics/schematics.json | 5 ++ 77 files changed, 225 insertions(+), 225 deletions(-) create mode 100644 src/main/resources/assets/bloodmagic/schematics/schematics.json diff --git a/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java b/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java index 8dab8ad2..6cd4140c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java @@ -19,6 +19,6 @@ public class DamageSourceBloodMagic extends DamageSource @Override public ITextComponent getDeathMessage(EntityLivingBase livingBase) { - return new TextComponentString(TextHelper.localizeEffect("chat.BloodMagic.damageSource", livingBase.getName())); + return new TextComponentString(TextHelper.localizeEffect("chat.bloodmagic.damageSource", livingBase.getName())); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java index 81acdd8b..319f018b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java @@ -17,7 +17,7 @@ public enum EnumAltarComponent CRYSTAL, NOTAIR; - private static final String BASE = "chat.BloodMagic.altar.comp."; + private static final String BASE = "chat.bloodmagic.altar.comp."; private String key; EnumAltarComponent() diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java index 4c14add6..bebd8f30 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java @@ -13,8 +13,8 @@ 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."; + 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() diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java index 727f1e45..2cfe9666 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java @@ -17,7 +17,7 @@ import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; public class LivingArmourDowngradeRecipe { protected LivingArmourUpgrade upgrade = null; - protected ItemStack keyStack = null; + protected ItemStack keyStack = ItemStack.EMPTY; protected List input = new ArrayList(); public LivingArmourDowngradeRecipe(LivingArmourUpgrade upgrade, ItemStack keyStack, Object... recipe) diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java index 073ea5c5..efe283ac 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java @@ -15,7 +15,7 @@ import java.util.List; public class TartaricForgeRecipe { protected ItemStack output = null; - protected ArrayList input = new ArrayList(); + protected List input = new ArrayList(); @Getter protected double minimumSouls; @Getter @@ -137,7 +137,7 @@ public class TartaricForgeRecipe * * @return The recipes input vales. */ - public ArrayList getInput() + public List getInput() { return this.input; } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java index 34dd7706..01822165 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java @@ -276,7 +276,7 @@ public abstract class Ritual AreaDescriptor descriptor = this.getBlockRange(range); if (descriptor == null) { - return new TextComponentTranslation("ritual.BloodMagic.blockRange.tooBig", "?"); + return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooBig", "?"); } List willConfig = master.getActiveWillConfig(); @@ -288,10 +288,10 @@ public abstract class Ritual if (maxVolume > 0 && descriptor.getVolumeForOffsets(offset1, offset2) > maxVolume) { - return new TextComponentTranslation("ritual.BloodMagic.blockRange.tooBig", maxVolume); + return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooBig", maxVolume); } else { - return new TextComponentTranslation("ritual.BloodMagic.blockRange.tooFar", maxVertical, maxHorizontal); + return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooFar", maxVertical, maxHorizontal); } } @@ -307,7 +307,7 @@ public abstract class Ritual return new TextComponentTranslation(this.getUnlocalizedName() + "." + range + ".info"); } else { - return new TextComponentTranslation("ritual.BloodMagic.blockRange.noRange"); + return new TextComponentTranslation("ritual.bloodmagic.blockRange.noRange"); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 41c8d138..d2b87a4d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -200,7 +200,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl IBloodAltar altar = ((IBloodAltar) world.getTileEntity(pos)); Pair missingBlock = BloodAltar.getAltarMissingBlock(world, pos, altar.getTier().toInt()); if (missingBlock != null) - docs.add(new TextComponentTranslation("chat.BloodMagic.altar.nextTier", new TextComponentTranslation(missingBlock.getRight().getKey()), Utils.prettifyBlockPosString(missingBlock.getLeft()))); + docs.add(new TextComponentTranslation("chat.bloodmagic.altar.nextTier", new TextComponentTranslation(missingBlock.getRight().getKey()), Utils.prettifyBlockPosString(missingBlock.getLeft()))); return docs; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java index aaffd0ed..b289acad 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java @@ -40,7 +40,7 @@ public class BlockBloodRune extends BlockEnum implements IVariant @Override public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.decoration.safe")); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java index bf43c742..1678a8ce 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java @@ -69,7 +69,7 @@ public class BlockLifeEssence extends BlockFluidClassic @Override public String getLocalizedName(FluidStack fluidStack) { - return TextHelper.localize("tile.BloodMagic.fluid.lifeEssence.name"); + return TextHelper.localize("tile.bloodmagic.fluid.lifeEssence.name"); } } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 1bfaaa76..9be944dc 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -48,7 +48,7 @@ public class BlockPath extends BlockEnum implements IIncensePath, IVar @Override public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.decoration.safe")); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 17c7c7ba..5e6797db 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -76,7 +76,7 @@ public class BlockRitualController extends BlockEnum imple } } else { - ChatUtil.sendNoSpamUnloc(player, "chat.BloodMagic.ritual.notValid"); + ChatUtil.sendNoSpamUnloc(player, "chat.bloodmagic.ritual.notValid"); } } } else if (getMetaFromState(state) == 1 && tile instanceof TileImperfectRitualStone) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 8afa09ef..e4e1e002 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -40,7 +40,7 @@ public class BlockRitualStone extends BlockEnum implements IRitual @Override public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.decoration.safe")); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java index a35248e2..22164f2f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java @@ -29,7 +29,7 @@ public class GuiAlchemyTable extends GuiContainer @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRendererObj.drawString(TextHelper.localize("tile.BloodMagic.alchemyTable.name"), 8, 5, 4210752); + this.fontRendererObj.drawString(TextHelper.localize("tile.bloodmagic.alchemyTable.name"), 8, 5, 4210752); this.fontRendererObj.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java index 91c6bf96..49893a7a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java @@ -31,7 +31,7 @@ public class GuiHolding extends GuiContainer protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { //the parameters for drawString are: string, x, y, color - fontRendererObj.drawString(TextHelper.localize("item.BloodMagic.sigil.holding.name"), 53, 4, 4210752); + fontRendererObj.drawString(TextHelper.localize("item.bloodmagic.sigil.holding.name"), 53, 4, 4210752); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java index ec110458..883ec432 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java @@ -27,7 +27,7 @@ public class GuiMasterRoutingNode extends GuiContainer @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("tile.bloodmagic.soulForge.name"), 8, 5, 4210752); // this.fontRendererObj.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java index 55e7bb42..7153656d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java @@ -28,7 +28,7 @@ public class GuiSoulForge extends GuiContainer @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("tile.bloodmagic.soulForge.name"), 8, 5, 4210752); this.fontRendererObj.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java index bb2ecd56..4bafa7f8 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java @@ -22,7 +22,7 @@ public class GuiTeleposer extends GuiContainer @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRendererObj.drawString(TextHelper.localize("tile.BloodMagic.teleposer.name"), 64, 23, 4210752); + this.fontRendererObj.drawString(TextHelper.localize("tile.bloodmagic.teleposer.name"), 64, 23, 4210752); this.fontRendererObj.drawString(TextHelper.localize("container.inventory"), 8, 47, 4210752); } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index b0603dd3..1e47012f 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -159,7 +159,7 @@ public class SubCommandNetwork extends CommandBase SoulNetwork network = NetworkHelper.getSoulNetwork(player); if (args.length > 1) - sender.sendMessage(new TextComponentString(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.divination.currentEssence", network.getCurrentEssence()))); + sender.sendMessage(new TextComponentString(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence()))); } }, diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java index 73cb0fdb..159de39e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java @@ -28,10 +28,10 @@ public class GuideBloodMagic implements IGuideBook @Override public Book buildBook() { guideBook = new Book(); - guideBook.setTitle("guide.BloodMagic.title"); - guideBook.setDisplayName("guide.BloodMagic.display"); - guideBook.setWelcomeMessage("guide.BloodMagic.welcome"); - guideBook.setAuthor("guide.BloodMagic.author"); + guideBook.setTitle("guide.bloodmagic.title"); + guideBook.setDisplayName("guide.bloodmagic.display"); + guideBook.setWelcomeMessage("guide.bloodmagic.welcome"); + guideBook.setAuthor("guide.bloodmagic.author"); guideBook.setRegistryName(new ResourceLocation(Constants.Mod.MODID, "guide")); guideBook.setColor(Color.RED); @@ -45,11 +45,11 @@ public class GuideBloodMagic implements IGuideBook @Override public void handlePost(ItemStack bookStack) { - guideBook.addCategory(new CategoryItemStack(CategoryAlchemy.buildCategory(), "guide.BloodMagic.category.alchemy", new ItemStack(ModItems.ARCANE_ASHES))); - guideBook.addCategory(new CategoryItemStack(CategoryArchitect.buildCategory(), "guide.BloodMagic.category.architect", new ItemStack(ModItems.SIGIL_DIVINATION))); - guideBook.addCategory(new CategoryItemStack(CategoryDemon.buildCategory(), "guide.BloodMagic.category.demon", new ItemStack(ModItems.BLOOD_SHARD))); - guideBook.addCategory(new CategoryItemStack(CategoryRitual.buildCategory(), "guide.BloodMagic.category.ritual", new ItemStack(ModBlocks.RITUAL_CONTROLLER))); -// guideBook.addCategory(new CategoryItemStack(CategorySpell.buildCategory(), "guide.BloodMagic.category.spell", new ItemStack(ModItems.ritualDiviner))); + guideBook.addCategory(new CategoryItemStack(CategoryAlchemy.buildCategory(), "guide.bloodmagic.category.alchemy", new ItemStack(ModItems.ARCANE_ASHES))); + guideBook.addCategory(new CategoryItemStack(CategoryArchitect.buildCategory(), "guide.bloodmagic.category.architect", new ItemStack(ModItems.SIGIL_DIVINATION))); + guideBook.addCategory(new CategoryItemStack(CategoryDemon.buildCategory(), "guide.bloodmagic.category.demon", new ItemStack(ModItems.BLOOD_SHARD))); + guideBook.addCategory(new CategoryItemStack(CategoryRitual.buildCategory(), "guide.bloodmagic.category.ritual", new ItemStack(ModBlocks.RITUAL_CONTROLLER))); +// guideBook.addCategory(new CategoryItemStack(CategorySpell.buildCategory(), "guide.bloodmagic.category.spell", new ItemStack(ModItems.ritualDiviner))); GameRegistry.addRecipe(new ShapelessOreRecipe(GuideAPI.getStackFromBook(GuideBloodMagic.guideBook), new ItemStack(Items.BOOK), Blocks.GLASS, Items.FEATHER)); } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java index b8fd8cfc..5c8065b6 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java @@ -56,7 +56,7 @@ public class PageAlchemyArray extends Page Minecraft.getMinecraft().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); + guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.alchemyArray"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); for (ResourceLocation arrayResource : arrayResources) { diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java index 48490476..a8402b0a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java @@ -43,7 +43,7 @@ public class PageAltarRecipe extends Page Minecraft.getMinecraft().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); + 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 @@ -71,7 +71,7 @@ public class PageAltarRecipe extends Page 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); + 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 index a63e14d6..51021663 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java @@ -50,7 +50,7 @@ public class PageTartaricForgeRecipe extends Page Minecraft.getMinecraft().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); + 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 @@ -131,8 +131,8 @@ public class PageTartaricForgeRecipe extends Page 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); + 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) diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index f840c83e..2e81535f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -44,14 +44,14 @@ public class DataProviderAlchemyArray implements IWailaDataProvider { TileAlchemyArray tileArray = (TileAlchemyArray) tile; if (!tileArray.getStackInSlot(0).isEmpty()) - currenttip.add(TextHelper.localize("waila.BloodMagic.array.reagent", tileArray.getStackInSlot(0).getDisplayName())); + currenttip.add(TextHelper.localize("waila.bloodmagic.array.reagent", tileArray.getStackInSlot(0).getDisplayName())); if (!tileArray.getStackInSlot(1).isEmpty()) - currenttip.add(TextHelper.localize("waila.BloodMagic.array.catalyst", tileArray.getStackInSlot(1).getDisplayName())); + currenttip.add(TextHelper.localize("waila.bloodmagic.array.catalyst", tileArray.getStackInSlot(1).getDisplayName())); } } else { - currenttip.add(TextHelper.localizeEffect("waila.BloodMagic.sneak")); + currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } return currenttip; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index 7a877071..9ec8b3b4 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -82,9 +82,9 @@ public class DataProviderBloodAltar implements IWailaDataProvider if (accessor.getBlock() instanceof BlockAltar && accessor.getTileEntity() instanceof TileAltar) { TileAltar altar = (TileAltar) accessor.getTileEntity(); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.seer.currentAltarTier", altar.getTier().toInt())); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.seer.currentAltarCapacity", altar.getCapacity())); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.seer.currentEssence", altar.getCurrentBlood())); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarTier", altar.getTier().toInt())); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarCapacity", altar.getCapacity())); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentEssence", altar.getCurrentBlood())); if (hasSeer) { @@ -93,12 +93,12 @@ public class DataProviderBloodAltar implements IWailaDataProvider int craftAmount = 1; if (accessor.getNBTData().getTagList("Items", 10).get(0).getId() == 10) craftAmount = ((NBTTagCompound)accessor.getNBTData().getTagList("Items", 10).get(0)).getByte("Count"); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.seer.currentAltarProgress.percent", (int) (((double) progress / (double) liquidRequired * 100) / craftAmount) + "%")); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent", (int) (((double) progress / (double) liquidRequired * 100) / craftAmount) + "%")); } } } else { - currenttip.add(TextHelper.localizeEffect("waila.BloodMagic.sneak")); + currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } return currenttip; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index 5e39a63b..cbfa05b6 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -45,21 +45,21 @@ public class DataProviderBloodTank implements IWailaDataProvider TileBloodTank bloodTank = (TileBloodTank) accessor.getTileEntity(); NBTTagCompound tag = accessor.getNBTData(); int capacity = tag.getInteger(Constants.NBT.ALTAR_CAPACITY); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.tier", bloodTank.getBlockMetadata() + 1)); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.capacity") + ": " + capacity + "mB"); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.tier", bloodTank.getBlockMetadata() + 1)); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity") + ": " + capacity + "mB"); tag = tag.getCompoundTag(Constants.NBT.TANK); FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); if (!Strings.isNullOrEmpty(tag.getString("FluidName")) && fluidStack != null) { - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.type") + ": " + fluidStack.getLocalizedName()); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + capacity + "mB"); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type") + ": " + fluidStack.getLocalizedName()); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + capacity + "mB"); } } } else { - currenttip.add(TextHelper.localizeEffect("waila.BloodMagic.sneak")); + currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } return currenttip; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index 6e2910fc..a3bc6c1b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -54,12 +54,12 @@ public class DataProviderRitualController implements IWailaDataProvider if (mrs.getCurrentRitual() != null && mrs.isActive()) { currenttip.add(TextHelper.localizeEffect(mrs.getCurrentRitual().getUnlocalizedName())); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.currentOwner", PlayerHelper.getUsernameFromUUID(mrs.getOwner()))); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromUUID(mrs.getOwner()))); if (!RitualRegistry.ritualEnabled(mrs.getCurrentRitual())) - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.config.disabled")); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.config.disabled")); } else { - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.deactivated")); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.deactivated")); } } @@ -76,14 +76,14 @@ public class DataProviderRitualController implements IWailaDataProvider { currenttip.add(TextHelper.localizeEffect(ritual.getUnlocalizedName())); if (!ImperfectRitualRegistry.ritualEnabled(ritual)) - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.config.disabled")); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.config.disabled")); } } } } } else { - currenttip.add(TextHelper.localizeEffect("waila.BloodMagic.sneak")); + currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } return currenttip; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java index 7a787263..1b5b9078 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java @@ -48,13 +48,13 @@ public class DataProviderTeleposer implements IWailaDataProvider BlockPos toPos = ((ItemTelepositionFocus) contained.getItem()).getBlockPos(contained); int dimensionID = contained.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.telepositionFocus.coords", toPos.getX(), toPos.getY(), toPos.getZ())); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.telepositionFocus.dimension", dimensionID)); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", toPos.getX(), toPos.getY(), toPos.getZ())); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", dimensionID)); } } } else { - currenttip.add(TextHelper.localizeEffect("waila.BloodMagic.sneak")); + currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } return currenttip; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index 13a0a7b1..52f88d86 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -46,7 +46,7 @@ public class ItemActivationCrystal extends ItemBindableBase implements IVariantP @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localize("tooltip.BloodMagic.activationCrystal." + names[stack.getItemDamage()])); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.activationCrystal." + names[stack.getItemDamage()])); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index ae9b2aa6..2421488a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -53,7 +53,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP { if (!stack.hasTagCompound()) return; - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.currentTier", stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentTier", stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)); } @Override @@ -65,7 +65,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP if (!player.capabilities.isCreativeMode) { - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.BloodMagic.altarMaker.creativeOnly")); + ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.creativeOnly")); return super.onItemRightClick(world, player, hand); } @@ -79,7 +79,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP stack.getTagCompound().setInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER, stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1); setTierToBuild(EnumAltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]); - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.BloodMagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); + ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); return super.onItemRightClick(world, player, hand); } @@ -89,7 +89,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK && world.getBlockState(rayTrace.getBlockPos()).getBlock() instanceof BlockAltar) { - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.BloodMagic.altarMaker.building", NumeralHelper.toRoman(tierToBuild.toInt()))); + ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.building", NumeralHelper.toRoman(tierToBuild.toInt()))); buildAltar(world, rayTrace.getBlockPos()); IBlockState state = world.getBlockState(rayTrace.getBlockPos()); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index 2081305a..6cb43f05 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -39,7 +39,7 @@ public class ItemArcaneAshes extends Item implements IVariantProvider @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.arcaneAshes")); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.arcaneAshes")); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index 686d4ba0..300ad7a0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -30,6 +30,6 @@ public class ItemBindableBase extends ItemBindable return; if (!Strings.isNullOrEmpty(getOwnerUUID(stack))) - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 39393177..49d0d5d0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -85,10 +85,10 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.orb.desc")); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.desc")); if (advanced) - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.orb.owner", getOrb(stack.getItemDamage()).getOwner())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", getOrb(stack.getItemDamage()).getOwner())); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index b8afe2d0..223c35d3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -102,13 +102,13 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable if (!stack.hasTagCompound()) return; - if (TextHelper.canTranslate("tooltip.BloodMagic.bound.sword.desc")) - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.bound.sword.desc")); + 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"))); + tooltip.add(TextHelper.localize("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated"))); if (!Strings.isNullOrEmpty(getOwnerUUID(stack))) - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index b25a0b63..421e68af 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -64,7 +64,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable setCreativeTab(BloodMagic.tabBloodMagic); this.name = name; - this.tooltipBase = "tooltip.BloodMagic.bound." + name + "."; + this.tooltipBase = "tooltip.bloodmagic.bound." + name + "."; } @Override @@ -202,13 +202,13 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable if (TextHelper.canTranslate(tooltipBase + "desc")) tooltip.add(TextHelper.localizeEffect(tooltipBase + "desc")); - tooltip.add(TextHelper.localize("tooltip.BloodMagic." + (getActivated(stack) ? "activated" : "deactivated"))); + tooltip.add(TextHelper.localize("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated"))); if (!stack.hasTagCompound()) return; if (!Strings.isNullOrEmpty(getOwnerUUID(stack))) - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index f4ab42fe..4b72a28a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -33,7 +33,7 @@ public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemon @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.BloodMagic.willGauge")))); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.willGauge")))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 7b29b518..38d73e31 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -44,15 +44,15 @@ public class ItemExperienceBook extends Item implements IVariantProvider @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.experienceTome")); + 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))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.experienceTome.exp", (int) storedExp)); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.experienceTome.expLevel", (int) getLevelForExperience(storedExp))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index e92cf79c..9f8307af 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -99,7 +99,7 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { - list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.BloodMagic.inscriber.desc")))); + list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.inscriber.desc")))); super.addInformation(stack, player, list, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index e3170e25..c133286f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -46,7 +46,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { public static String[] names = { "normal", "dusk", "dawn" }; - public static final String tooltipBase = "tooltip.BloodMagic.diviner."; + public static final String tooltipBase = "tooltip.bloodmagic.diviner."; public ItemRitualDiviner() { @@ -243,7 +243,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider Ritual ritual = RitualRegistry.getRitualForId(this.getCurrentRitual(stack)); if (ritual != null) { - tooltip.add(TextHelper.localize("tooltip.BloodMagic.diviner.currentRitual") + TextHelper.localize(ritual.getUnlocalizedName())); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.diviner.currentRitual") + TextHelper.localize(ritual.getUnlocalizedName())); boolean sneaking = Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); boolean extraInfo = sneaking && Keyboard.isKeyDown(Keyboard.KEY_M); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 9aaaed23..8ae94165 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -33,7 +33,7 @@ import WayofTime.bloodmagic.util.helper.TextHelper; public class ItemRitualReader extends Item implements IVariantProvider { - public static final String tooltipBase = "tooltip.BloodMagic.ritualReader."; + public static final String tooltipBase = "tooltip.bloodmagic.ritualReader."; public ItemRitualReader() { @@ -61,7 +61,7 @@ public class ItemRitualReader extends Item implements IVariantProvider tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(tooltipBase + "desc." + state.toString().toLowerCase())))); } else { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.extraInfo")); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.extraInfo")); } super.addInformation(stack, player, tooltip, advanced); @@ -158,7 +158,7 @@ public class ItemRitualReader extends Item implements IVariantProvider if (containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, pos.subtract(masterPos)); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.BloodMagic.blockRange.firstBlock")); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.firstBlock")); //TODO: Notify player. } else { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index effde62c..7927fabb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -72,10 +72,10 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { - list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.BloodMagic.sacrificialDagger.desc")))); + list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sacrificialDagger.desc")))); if (stack.getItemDamage() == 1) - list.add(TextHelper.localizeEffect("tooltip.BloodMagic.sacrificialDagger.creative")); + list.add(TextHelper.localizeEffect("tooltip.bloodmagic.sacrificialDagger.creative")); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index d654b58f..392f0dc2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -86,7 +86,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa stack.getTagCompound().setInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER, stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1); currentDisplayedTier = EnumAltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]; - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.BloodMagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); + ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); return super.onItemRightClick(world, player, hand); } @@ -111,9 +111,9 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa { if (!stack.hasTagCompound()) return; - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.book.shifting")); + 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)); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentTier", stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)); } // IVariantProvider diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java index de787725..b250f98f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java @@ -49,7 +49,7 @@ public class ItemSlate extends Item implements IVariantProvider @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { - list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.BloodMagic.slate.desc")))); + list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.slate.desc")))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 2323bb42..68697b42 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -74,7 +74,7 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localize("tooltip.BloodMagic.telepositionFocus." + names[stack.getItemDamage()])))); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localize("tooltip.bloodmagic.telepositionFocus." + names[stack.getItemDamage()])))); super.addInformation(stack, player, tooltip, advanced); @@ -87,8 +87,8 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP 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.getInteger(Constants.NBT.DIMENSION_ID))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", coords.getX(), coords.getY(), coords.getZ())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", tag.getInteger(Constants.NBT.DIMENSION_ID))); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index 6a983175..62439d69 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -105,13 +105,13 @@ public class ItemUpgradeTome extends Item implements IVariantProvider @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { -// tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.BloodMagic.livingArmour")))); +// 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.localizeEffect("tooltip.BloodMagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getUnlocalizedName()), upgrade.getUpgradeLevel() + 1)); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getUnlocalizedName()), upgrade.getUpgradeLevel() + 1)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index ba43e781..3dd969fc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -52,7 +52,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { -// tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.BloodMagic.livingArmour")))); +// tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour")))); if (!stack.hasTagCompound()) return; LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index 086cfcfe..b8bfa885 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -51,7 +51,7 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA if (!stack.hasTagCompound()) return; int max = getMaxUsesForFluid(stack); - tooltip.add(TextHelper.localize("tooltip.BloodMagic.cuttingFluidRatio", max - getDamageOfFluid(stack), max)); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.cuttingFluidRatio", max - getDamageOfFluid(stack), max)); } private void buildItemList() diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java index 7e71c112..6564c9fb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java @@ -59,7 +59,7 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi if (!stack.hasTagCompound()) return; - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.BloodMagic.livingArmourPointsUpgrade.desc", 200)))); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmourPointsUpgrade.desc", 200)))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index db0523da..2b9ea2af 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -309,19 +309,19 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (tracker != null) { double progress = tracker.getProgress(armour, upgrade.getUpgradeLevel()); - tooltip.add(TextHelper.localize("tooltip.BloodMagic.livingArmour.upgrade.progress", TextHelper.localize(upgrade.getUnlocalizedName()), MathHelper.clamp((int) (progress * 100D), 0, 100))); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.livingArmour.upgrade.progress", TextHelper.localize(upgrade.getUnlocalizedName()), MathHelper.clamp((int) (progress * 100D), 0, 100))); } } else { - tooltip.add(TextHelper.localize("tooltip.BloodMagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getUnlocalizedName()), upgrade.getUpgradeLevel() + 1)); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getUnlocalizedName()), upgrade.getUpgradeLevel() + 1)); } } } - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.livingArmour.upgrade.points", armour.totalUpgradePoints, armour.maxUpgradePoints)); + 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")); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour.extraExtraInfo")); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index 48b35ea4..d2169ec6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -42,27 +42,27 @@ public class ItemBlockBloodTank extends ItemBlock if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.TANK) && !stack.getTagCompound().getCompoundTag(Constants.NBT.TANK).getString("FluidName").equals("")) { NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); - return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.BloodMagic.tier", stack.getItemDamage() + 1) + " (" + FluidStack.loadFluidStackFromNBT(tag).getLocalizedName() + ")"; + return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1) + " (" + FluidStack.loadFluidStackFromNBT(tag).getLocalizedName() + ")"; } else { - return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.BloodMagic.tier", stack.getItemDamage() + 1); + return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1); } } @Override public void addInformation(ItemStack stack, EntityPlayer entityPlayer, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.tier", stack.getItemDamage() + 1)); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.capacity") + ": " + getCapacity(stack) + "mB"); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1)); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity") + ": " + getCapacity(stack) + "mB"); if (stack.hasTagCompound()) { NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); if (!Strings.isNullOrEmpty(tag.getString("FluidName")) && fluidStack != null) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.type") + ": " + fluidStack.getLocalizedName()); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + getCapacity(stack) + "mB"); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type") + ": " + fluidStack.getLocalizedName()); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + getCapacity(stack) + "mB"); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index 57bceebb..cf9f222a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -78,8 +78,8 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I if (!stack.hasTagCompound()) return; - list.add(TextHelper.localize("tooltip.BloodMagic.pack.sacrifice.desc")); - list.add(TextHelper.localize("tooltip.BloodMagic.pack.stored", getStoredLP(stack))); + list.add(TextHelper.localize("tooltip.bloodmagic.pack.sacrifice.desc")); + list.add(TextHelper.localize("tooltip.bloodmagic.pack.stored", getStoredLP(stack))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index c71772d4..bba354f1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -104,8 +104,8 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato { if (!stack.hasTagCompound()) return; - list.add(TextHelper.localize("tooltip.BloodMagic.pack.selfSacrifice.desc")); - list.add(TextHelper.localize("tooltip.BloodMagic.pack.stored", getStoredLP(stack))); + list.add(TextHelper.localize("tooltip.bloodmagic.pack.selfSacrifice.desc")); + list.add(TextHelper.localize("tooltip.bloodmagic.pack.stored", getStoredLP(stack))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index 98f0d385..9efc7c0b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -48,7 +48,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi 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.coords", coords.getX(), coords.getY(), coords.getZ())); } } @@ -70,7 +70,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi if (!containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, BlockPos.ORIGIN); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.remove")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.remove")); return EnumActionResult.FAIL; } return EnumActionResult.FAIL; @@ -80,7 +80,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi if (containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, pos); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.set")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.set")); return EnumActionResult.SUCCESS; } else { @@ -100,7 +100,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi master.addConnection(pos, containedPos); master.addNodeToList(node); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.link.master")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link.master")); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -108,7 +108,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi { master.addConnection(pos, containedPos); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.link.master")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link.master")); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -125,7 +125,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi master.addConnection(pos, containedPos); pastNode.addConnection(pos); master.addNodeToList(pastNode); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.link.master")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link.master")); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -133,7 +133,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi { master.addConnection(pos, containedPos); pastNode.addConnection(pos); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.link.master")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link.master")); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -153,7 +153,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.link")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link")); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } else if (pastNode.getMasterPos().equals(BlockPos.ORIGIN)) //pastNode is not connected to a master, but node is @@ -168,7 +168,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.link")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link")); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } else if (node.getMasterPos().equals(BlockPos.ORIGIN)) //node is not connected to a master, but pastNode is @@ -183,7 +183,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.BloodMagic.routing.link")); + ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link")); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } else diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 2888a9b7..e1fbaea8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -60,7 +60,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(TextHelper.localize("tooltip.BloodMagic.itemFilter." + names[stack.getItemDamage()])); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.itemFilter." + names[stack.getItemDamage()])); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index 99c4ea50..d7118cda 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -36,7 +36,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider setCreativeTab(BloodMagic.tabBloodMagic); this.name = name; - this.tooltipBase = "tooltip.BloodMagic.sigil." + name + "."; + this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; } public ItemSigilBase(String name) @@ -55,7 +55,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider return; if (!Strings.isNullOrEmpty(getOwnerName(stack))) - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index e85558f2..cd3909c9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -66,7 +66,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl if (item == null) return displayName; else - return TextHelper.localizeEffect("item.BloodMagic.sigil.holding.display", displayName, item.getDisplayName()); + return TextHelper.localizeEffect("item.bloodmagic.sigil.holding.display", displayName, item.getDisplayName()); } @Override @@ -74,7 +74,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { super.addInformation(stack, player, tooltip, advanced); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.holding.press", KeyBindings.OPEN_HOLDING.getKey().getDisplayName())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.press", KeyBindings.OPEN_HOLDING.getKey().getDisplayName())); if (!stack.hasTagCompound()) return; @@ -91,9 +91,9 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl { if (inv[i] != null) if (item != null && inv[i] == item) - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.holding.sigilInSlot", i + 1, "&o&n" + inv[i].getDisplayName())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, "&o&n" + inv[i].getDisplayName())); else - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.sigil.holding.sigilInSlot", i + 1, inv[i].getDisplayName())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, inv[i].getDisplayName())); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index fa5b03ae..291ff24b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -41,8 +41,8 @@ public class ItemSigilTeleposition extends ItemSigilBase if (tag != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) { tooltip.add(" "); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.telepositionFocus.coords", getValue(tag, Constants.NBT.X_COORD), getValue(tag, Constants.NBT.Y_COORD), getValue(tag, Constants.NBT.Z_COORD))); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.telepositionFocus.dimension", getValue(tag, Constants.NBT.DIMENSION_ID))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", getValue(tag, Constants.NBT.X_COORD), getValue(tag, Constants.NBT.Y_COORD), getValue(tag, Constants.NBT.Z_COORD))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", getValue(tag, Constants.NBT.DIMENSION_ID))); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 26a98b4f..63692bb4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -36,7 +36,7 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes setCreativeTab(BloodMagic.tabBloodMagic); this.name = name; - this.tooltipBase = "tooltip.BloodMagic.sigil." + name + "."; + this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; } @Override @@ -46,10 +46,10 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes super.addInformation(stack, player, tooltip, advanced); if (!stack.hasTagCompound()) return; - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic." + (getActivated(stack) ? "activated" : "deactivated"))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated"))); if (!Strings.isNullOrEmpty(getOwnerName(stack))) - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index 515f6440..d181f80a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -56,7 +56,7 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide { if (!stack.hasTagCompound()) return; - tooltip.add(TextHelper.localize("tooltip.BloodMagic.will", getWill(getType(stack), stack))); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.will", getWill(getType(stack), stack))); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index eca6badd..9258b7ed 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -307,8 +307,8 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP 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())); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientAxe.desc")))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 96bd90db..42b4c6ed 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -306,8 +306,8 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon 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())); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientPickaxe.desc")))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index ed3a1c3e..1863650e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -307,8 +307,8 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I 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())); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientShovel.desc")))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index cb39ba52..328bbebc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -278,8 +278,8 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM 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())); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientSword.desc")))); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index dd31e472..ecb02a04 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -120,9 +120,9 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I 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())); + 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, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index e1dfb842..dc61d420 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -75,7 +75,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.BloodMagic.soulSnare.desc")))); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.soulSnare.desc")))); super.addInformation(stack, player, tooltip, advanced); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index 9c1e1728..4507ba7e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -29,7 +29,7 @@ import com.google.common.collect.Multimap; public class LivingArmour implements ILivingArmour { - public static String chatBase = "chat.BloodMagic.livingArmour."; + public static String chatBase = "chat.bloodmagic.livingArmour."; public HashMap trackerMap = new HashMap(); public HashMap upgradeMap = new HashMap(); diff --git a/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java index 05fc2117..cf04c6d8 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java @@ -94,7 +94,7 @@ public class ItemPotionFlask extends Item implements IVariantProvider { PotionUtils.addPotionTooltip(stack, tooltip, 1.0F); tooltip.add(""); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.potion.uses", stack.getMaxDamage() - stack.getItemDamage())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.potion.uses", stack.getMaxDamage() - stack.getItemDamage())); } // @Override diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 82a41b2e..576a5ebc 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -511,7 +511,7 @@ public class ModRecipes public static void addLivingArmourDowngradeRecipes() { - String messageBase = "ritual.BloodMagic.downgradeRitual.dialogue."; + String messageBase = "ritual.bloodmagic.downgradeRitual.dialogue."; ItemStack bowStack = new ItemStack(Items.BOW); ItemStack bottleStack = new ItemStack(Items.POTIONITEM, 1, 0); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java index 1895d037..3b144d8e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java @@ -65,9 +65,8 @@ public class RitualLivingArmourDowngrade extends Ritual { if (player.getUniqueID().toString().equals(masterRitualStone.getOwner())) { - isActivatorPresent = true; ItemStack keyStack = getStackFromItemFrame(world, masterPos, masterRitualStone.getDirection()); - if (keyStack == null) + if (keyStack.isEmpty()) { return; } @@ -101,7 +100,7 @@ public class RitualLivingArmourDowngrade extends Ritual for (int i = 0; i < inv.getSlots(); i++) { ItemStack invStack = inv.getStackInSlot(i); - if (invStack != null) + if (!invStack.isEmpty()) { recipeList.add(invStack); } @@ -176,13 +175,13 @@ public class RitualLivingArmourDowngrade extends Ritual List frames = world.getEntitiesWithinAABB(EntityItemFrame.class, bb); for (EntityItemFrame frame : frames) { - if (frame.getDisplayedItem() != null) + if (!frame.getDisplayedItem().isEmpty()) { return frame.getDisplayedItem(); } } - return null; + return ItemStack.EMPTY; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java index 199a4763..05b3f415 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java @@ -56,7 +56,7 @@ public class DungeonRoomLoader { try { - URL schematicURL = DungeonRoomLoader.class.getResource(resLocToResourcePath(new ResourceLocation("bloodmagic:Schematics"))); + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index 61c75ec9..0308178f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -41,27 +41,24 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo { //TODO: Fill the contained gem if it is there. ItemStack stack = this.getStackInSlot(0); - if (stack != null) + if (stack.getItem() instanceof IDemonWillGem) { - if (stack.getItem() instanceof IDemonWillGem) + IDemonWillGem gemItem = (IDemonWillGem) stack.getItem(); + for (EnumDemonWillType type : EnumDemonWillType.values()) { - IDemonWillGem gemItem = (IDemonWillGem) stack.getItem(); - for (EnumDemonWillType type : EnumDemonWillType.values()) + if (willMap.containsKey(type)) { - if (willMap.containsKey(type)) + double current = willMap.get(type); + double fillAmount = Math.min(gemDrainRate, current); + if (fillAmount > 0) { - 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) { - fillAmount = gemItem.fillWill(type, stack, fillAmount, true); - if (willMap.get(type) - fillAmount <= 0) - { - willMap.remove(type); - } else - { - willMap.put(type, willMap.get(type) - fillAmount); - } + willMap.remove(type); + } else + { + willMap.put(type, willMap.get(type) - fillAmount); } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index 2480bb68..e99970e5 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -9,6 +9,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumFacing; +import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraftforge.common.capabilities.Capability; @@ -21,13 +22,13 @@ import WayofTime.bloodmagic.util.helper.TextHelper; public class TileInventory extends TileBase implements IInventory { protected int[] syncedSlots = new int[0]; - protected ItemStack[] inventory; + protected NonNullList inventory; private int size; private String name; public TileInventory(int size, String name) { - this.inventory = new ItemStack[size]; + this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); this.size = size; this.name = name; initializeItemHandlers(); @@ -50,7 +51,7 @@ public class TileInventory extends TileBase implements IInventory { super.deserialize(tagCompound); NBTTagList tags = tagCompound.getTagList("Items", 10); - inventory = new ItemStack[getSizeInventory()]; + inventory = NonNullList.withSize(size, ItemStack.EMPTY); for (int i = 0; i < tags.tagCount(); i++) { @@ -59,9 +60,9 @@ public class TileInventory extends TileBase implements IInventory NBTTagCompound data = tags.getCompoundTagAt(i); byte j = data.getByte("Slot"); - if (j >= 0 && j < inventory.length) + if (j >= 0 && j < inventory.size()) { - inventory[j] = new ItemStack(data); + inventory.set(i, new ItemStack(data)); } } } @@ -73,13 +74,13 @@ public class TileInventory extends TileBase implements IInventory super.serialize(tagCompound); NBTTagList tags = new NBTTagList(); - for (int i = 0; i < inventory.length; i++) + for (int i = 0; i < inventory.size(); i++) { - if ((!inventory[i].isEmpty()) && !isSyncedSlot(i)) + if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) { NBTTagCompound data = new NBTTagCompound(); data.setByte("Slot", (byte) i); - inventory[i].writeToNBT(data); + inventory.get(i).writeToNBT(data); tags.appendTag(data); } } @@ -104,52 +105,49 @@ public class TileInventory extends TileBase implements IInventory @Override public ItemStack getStackInSlot(int index) { - return inventory[index]; + return inventory.get(index); } @Override public ItemStack decrStackSize(int index, int count) { - if (inventory[index] != null) + if (!getStackInSlot(index).isEmpty()) { if (!getWorld().isRemote) getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); - if (inventory[index].getCount() <= count) + if (getStackInSlot(index).getCount() <= count) { - ItemStack itemStack = inventory[index]; - inventory[index] = null; + ItemStack itemStack = inventory.get(index); + inventory.set(index, ItemStack.EMPTY); markDirty(); return itemStack; } - ItemStack itemStack = inventory[index].splitStack(count); - if (inventory[index].getCount() == 0) - inventory[index] = null; - + ItemStack itemStack = inventory.get(index).splitStack(count); markDirty(); return itemStack; } - return null; + return ItemStack.EMPTY; } @Override public ItemStack removeStackFromSlot(int slot) { - if (inventory[slot] != null) + if (!inventory.get(slot).isEmpty()) { - ItemStack itemStack = inventory[slot]; - setInventorySlotContents(slot, null); + ItemStack itemStack = inventory.get(slot); + setInventorySlotContents(slot, ItemStack.EMPTY); return itemStack; } - return null; + return ItemStack.EMPTY; } @Override public void setInventorySlotContents(int slot, ItemStack stack) { - inventory[slot] = stack; + inventory.set(slot, stack); if (!stack.isEmpty() && stack.getCount() > getInventoryStackLimit()) stack.setCount(getInventoryStackLimit()); markDirty(); @@ -202,7 +200,7 @@ public class TileInventory extends TileBase implements IInventory @Override public void clear() { - this.inventory = new ItemStack[size]; + this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); } @Override @@ -224,7 +222,7 @@ public class TileInventory extends TileBase implements IInventory @Override public String getName() { - return TextHelper.localize("tile.BloodMagic." + name + ".name"); + return TextHelper.localize("tile.bloodmagic." + name + ".name"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index f5167081..dba2eb2a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -155,7 +155,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && !activator.capabilities.isCreativeMode) { - ChatUtil.sendNoSpamUnloc(activator, "chat.BloodMagic.ritual.weak"); + ChatUtil.sendNoSpamUnloc(activator, "chat.bloodmagic.ritual.weak"); return false; } @@ -166,7 +166,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) { - ChatUtil.sendNoSpamUnloc(activator, "chat.BloodMagic.ritual.prevent"); + ChatUtil.sendNoSpamUnloc(activator, "chat.bloodmagic.ritual.prevent"); return false; } @@ -175,7 +175,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (!isRedstoned() && !activator.capabilities.isCreativeMode) network.syphon(ritual.getActivationCost()); - ChatUtil.sendNoSpamUnloc(activator, "chat.BloodMagic.ritual.activate"); + ChatUtil.sendNoSpamUnloc(activator, "chat.bloodmagic.ritual.activate"); this.active = true; this.owner = crystalOwner; @@ -192,7 +192,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } } else { - ChatUtil.sendNoSpamUnloc(activator, "chat.BloodMagic.ritual.notValid"); + ChatUtil.sendNoSpamUnloc(activator, "chat.bloodmagic.ritual.notValid"); } return false; @@ -351,7 +351,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS ChatUtil.sendNoSpam(player, this.currentRitual.getErrorForBlockRangeOnFail(player, range, this, offset1, offset2)); } else { - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.BloodMagic.blockRange.success")); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.success")); } return allowed; @@ -359,7 +359,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (player != null) { - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.BloodMagic.blockRange.inactive")); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.inactive")); } return false; @@ -387,13 +387,13 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS for (int i = 0; i < typeList.size(); i++) { - translations[i] = new TextComponentTranslation("tooltip.BloodMagic.currentBaseType." + typeList.get(i).name.toLowerCase()); + translations[i] = new TextComponentTranslation("tooltip.bloodmagic.currentBaseType." + typeList.get(i).name.toLowerCase()); } - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.BloodMagic.willConfig.set", new TextComponentTranslation(constructedString, translations))); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.set", new TextComponentTranslation(constructedString, translations))); } else { - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.BloodMagic.willConfig.void")); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.void")); } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index b36f1e8d..a8257058 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -119,7 +119,7 @@ public class TileMimic extends TileInventory implements ITickable { setInventorySlotContents(1, heldItem.copy()); world.notifyBlockUpdate(pos, state, state, 3); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.potionSet")); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionSet")); } return true; } else if (heldItem.getItem() == ModItems.POTION_FLASK) @@ -129,7 +129,7 @@ public class TileMimic extends TileInventory implements ITickable { setInventorySlotContents(1, null); world.notifyBlockUpdate(pos, state, state, 3); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.potionRemove")); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionRemove")); } return true; } @@ -174,11 +174,11 @@ public class TileMimic extends TileInventory implements ITickable if (player.isSneaking()) { playerCheckRadius = Math.max(playerCheckRadius - 1, 0); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.detectRadius.down", playerCheckRadius)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); } else { playerCheckRadius++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.detectRadius.up", playerCheckRadius)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.up", playerCheckRadius)); } return false; @@ -200,11 +200,11 @@ public class TileMimic extends TileInventory implements ITickable if (player.isSneaking()) { potionSpawnRadius = Math.max(potionSpawnRadius - 1, 0); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.potionSpawnRadius.down", potionSpawnRadius)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionSpawnRadius.down", potionSpawnRadius)); } else { potionSpawnRadius++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.potionSpawnRadius.up", potionSpawnRadius)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionSpawnRadius.up", potionSpawnRadius)); } break; case NORTH: //When the block is clicked on the NORTH or SOUTH side, detectRadius is edited. @@ -212,11 +212,11 @@ public class TileMimic extends TileInventory implements ITickable if (player.isSneaking()) { playerCheckRadius = Math.max(playerCheckRadius - 1, 0); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.detectRadius.down", playerCheckRadius)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); } else { playerCheckRadius++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.detectRadius.up", playerCheckRadius)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.up", playerCheckRadius)); } break; case UP: //When the block is clicked on the UP or DOWN side, potionSpawnInterval is edited. @@ -224,11 +224,11 @@ public class TileMimic extends TileInventory implements ITickable if (player.isSneaking()) { potionSpawnInterval = Math.max(potionSpawnInterval - 1, 1); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.potionInterval.down", potionSpawnInterval)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionInterval.down", potionSpawnInterval)); } else { potionSpawnInterval++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.mimic.potionInterval.up", potionSpawnInterval)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionInterval.up", potionSpawnInterval)); } break; default: diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java index ba4ac2be..2fde0510 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java @@ -9,6 +9,7 @@ import net.minecraft.util.EnumFacing; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.item.inventory.ItemInventory; import WayofTime.bloodmagic.util.GhostItemHelper; +import net.minecraft.util.NonNullList; public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedInventory { @@ -60,7 +61,7 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn if (!tag.getBoolean("updated")) { NBTTagList tags = tag.getTagList("Items", 10); - inventory = new ItemStack[getSizeInventory()]; + inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); for (int i = 0; i < tags.tagCount(); i++) { if (!isSyncedSlot(i)) @@ -70,10 +71,10 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn if (j == 0) { - inventory[currentActiveSlot] = new ItemStack(data); - } else if (j >= 1 && j < inventory.length + 1) + inventory.set(i, new ItemStack(data)); + } else if (j >= 1 && j < inventory.size() + 1) { - inventory[j - 1] = new ItemStack(data); + inventory.set(j - 1, new ItemStack(data)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index af60ddc4..84b699ea 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -105,10 +105,10 @@ public class ClientHandler int amount = GhostItemHelper.getItemGhostAmount(stack); if (amount == 0) { - event.getToolTip().add(TextHelper.localize("tooltip.BloodMagic.ghost.everything")); + event.getToolTip().add(TextHelper.localize("tooltip.bloodmagic.ghost.everything")); } else { - event.getToolTip().add(TextHelper.localize("tooltip.BloodMagic.ghost.amount", amount)); + event.getToolTip().add(TextHelper.localize("tooltip.bloodmagic.ghost.amount", amount)); } } } 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 0865ab77..a361f563 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -357,7 +357,7 @@ public class GenericHandler if (block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && !event.getEntityPlayer().getHeldItemMainhand().isEmpty() && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) { ItemAltarMaker altarMaker = (ItemAltarMaker) event.getEntityPlayer().getHeldItemMainhand().getItem(); - ChatUtil.sendNoSpam(event.getEntityPlayer(), TextHelper.localizeEffect("chat.BloodMagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer()))); + ChatUtil.sendNoSpam(event.getEntityPlayer(), TextHelper.localizeEffect("chat.bloodmagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer()))); } } diff --git a/src/main/resources/assets/bloodmagic/schematics/schematics.json b/src/main/resources/assets/bloodmagic/schematics/schematics.json new file mode 100644 index 00000000..2f91ff04 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/schematics/schematics.json @@ -0,0 +1,5 @@ +[ + "bloodmagic:corridor1", + "bloodmagic:hallchest1", + "bloodmagic:rawbuilding1" +] \ No newline at end of file From 65104db5641646380b9ac6b47c1c11bbdda95986 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Wed, 14 Dec 2016 11:48:39 -0800 Subject: [PATCH 011/595] Added Fluid routing to the routing nodes - this is done by using the Fluid Filter and placing a fluid container as the filter. (cherry picked from commit a5a17f6) --- .settings/org.eclipse.jdt.core.prefs | 6 +- changelog.txt | 5 + .../WayofTime/bloodmagic/api/Constants.java | 1 + .../item/routing/IFluidFilterProvider.java | 13 ++ .../item/routing/IItemFilterProvider.java | 2 +- .../item/routing/IRoutingFilterProvider.java | 15 ++ .../item/routing/ItemFluidRouterFilter.java | 151 +++++++++++++ .../item/routing/ItemRouterFilter.java | 9 + .../bloodmagic/registry/ModItems.java | 3 + .../bloodmagic/routing/IFluidFilter.java | 36 +++ .../bloodmagic/routing/IFluidRoutingNode.java | 10 + .../routing/IInputFluidRoutingNode.java | 10 + .../bloodmagic/routing/IItemFilter.java | 2 +- .../routing/IOutputFluidRoutingNode.java | 10 + .../bloodmagic/routing/IRoutingFilter.java | 6 + .../routing/RoutingFluidFilter.java | 212 ++++++++++++++++++ .../bloodmagic/routing/TestItemFilter.java | 1 + .../container/ContainerItemRoutingNode.java | 18 +- .../tile/routing/TileInputRoutingNode.java | 43 +++- .../tile/routing/TileMasterRoutingNode.java | 156 ++++++++++--- .../tile/routing/TileOutputRoutingNode.java | 43 +++- .../item/ItemFluidRouterFilter.json | 16 ++ .../assets/bloodmagic/lang/en_US.lang | 10 +- .../textures/items/FluidRouterFilterExact.png | Bin 0 -> 681 bytes 24 files changed, 725 insertions(+), 53 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json create mode 100644 src/main/resources/assets/bloodmagic/textures/items/FluidRouterFilterExact.png diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 4e2ae6b4..74e1c18e 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,5 @@ # -#Sat Apr 02 15:31:00 EDT 2016 +#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 @@ -288,10 +288,10 @@ org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not 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 -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line eclipse.preferences.version=1 -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +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.formatter.alignment_for_superinterfaces_in_type_declaration=16 diff --git a/changelog.txt b/changelog.txt index 29eca95e..ef5c9955 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +------------------------------------------------------ +Version 2.1.1-70 +------------------------------------------------------ +- Added Fluid routing to the routing nodes - this is done by using the Fluid Filter and placing a fluid container as the filter. + ------------------------------------------------------ Version 2.1.0-69 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 626e228b..1d49da31 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -207,6 +207,7 @@ public class Constants NODE_ROUTER("ItemNodeRouter"), RITUAL_DIVINER("ItemRitualDiviner"), ROUTER_FILTER("ItemRouterFilter"), + FLUID_ROUTER_FILTER("ItemFluidRouterFilter"), SACRIFICIAL_DAGGER("ItemSacrificialDagger"), SACRIFICE_PACK("ItemPackSacrifice"), SELF_SACRIFICE_PACK("ItemPackSelfSacrifice"), diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java b/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java new file mode 100644 index 00000000..7f107ba3 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java @@ -0,0 +1,13 @@ +package WayofTime.bloodmagic.item.routing; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.capability.IFluidHandler; +import WayofTime.bloodmagic.routing.IFluidFilter; + +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 index 57e1c19e..9fc55d4b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java @@ -5,7 +5,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.routing.IItemFilter; -public interface IItemFilterProvider +public interface IItemFilterProvider extends IRoutingFilterProvider { IItemFilter getInputItemFilter(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 new file mode 100644 index 00000000..05093ff1 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java @@ -0,0 +1,15 @@ +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 new file mode 100644 index 00000000..0ecdbb24 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -0,0 +1,151 @@ +package WayofTime.bloodmagic.item.routing; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +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; + +public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, IVariantProvider +{ + public static String[] names = { "exact" }; + + public ItemFluidRouterFilter() + { + super(); + + setUnlocalizedName(Constants.Mod.MODID + ".fluidFilter."); + setHasSubtypes(true); + setCreativeTab(BloodMagic.tabBloodMagic); + } + + @Override + public String getUnlocalizedName(ItemStack stack) + { + return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item id, CreativeTabs creativeTab, List list) + { + for (int i = 0; i < names.length; i++) + list.add(new ItemStack(id, 1, i)); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + { + tooltip.add(TextHelper.localize("tooltip.BloodMagic.fluidFilter." + names[stack.getItemDamage()])); + + super.addInformation(stack, player, tooltip, advanced); + } + + @Override + public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) + { + IFluidFilter testFilter = new RoutingFluidFilter(); + + 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 == null) + { + 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 = new RoutingFluidFilter(); + + 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 == null) + { + continue; + } + + ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); + if (ghostStack.stackSize == 0) + { + ghostStack.stackSize = Integer.MAX_VALUE; + } + + filteredList.add(ghostStack); + } + + testFilter.initializeFilter(filteredList, tile, handler, true); + return testFilter; + } + + @Override + public List> getVariants() + { + List> ret = new ArrayList>(); + ret.add(new ImmutablePair(0, "type=exact")); + return ret; + } + + @Override + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) + { + ItemStack copyStack = keyStack.copy(); + GhostItemHelper.setItemGhostAmount(copyStack, 0); + copyStack.stackSize = 1; + return copyStack; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index e1fbaea8..06e5c543 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -165,4 +165,13 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari ret.add(new ImmutablePair(3, "type=oredict")); return ret; } + + @Override + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) + { + ItemStack copyStack = keyStack.copy(); + GhostItemHelper.setItemGhostAmount(copyStack, 0); + copyStack.stackSize = 1; + return copyStack; + } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java index 6973a278..49a54030 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java @@ -47,6 +47,7 @@ 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.ItemSigilAir; @@ -159,6 +160,7 @@ public class ModItems public static final Item SENTIENT_SHOVEL; public static final Item NODE_ROUTER; public static final Item BASE_ITEM_FILTER; + public static final Item BASE_FLUID_FILTER; public static final Item CUTTING_FLUID; public static final Item SANGUINE_BOOK; public static final Item ITEM_POINTS_UPGRADE; @@ -258,6 +260,7 @@ public class ModItems NODE_ROUTER = registerItem(new ItemNodeRouter(), Constants.BloodMagicItem.NODE_ROUTER.getRegName()); BASE_ITEM_FILTER = registerItem(new ItemRouterFilter(), Constants.BloodMagicItem.ROUTER_FILTER.getRegName()); + BASE_FLUID_FILTER = registerItem(new ItemFluidRouterFilter(), Constants.BloodMagicItem.FLUID_ROUTER_FILTER.getRegName()); CUTTING_FLUID = registerItem(new ItemCuttingFluid(), Constants.BloodMagicItem.CUTTING_FLUID.getRegName()); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java new file mode 100644 index 00000000..8d5f138b --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java @@ -0,0 +1,36 @@ +package WayofTime.bloodmagic.routing; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +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 new file mode 100644 index 00000000..4b109eac --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java @@ -0,0 +1,10 @@ +package WayofTime.bloodmagic.routing; + +import net.minecraft.util.EnumFacing; + +public interface IFluidRoutingNode extends IRoutingNode +{ + boolean isTankConnectedToSide(EnumFacing side); + + int getPriority(EnumFacing side); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java new file mode 100644 index 00000000..bd01f34f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java @@ -0,0 +1,10 @@ +package WayofTime.bloodmagic.routing; + +import net.minecraft.util.EnumFacing; + +public interface IInputFluidRoutingNode extends IFluidRoutingNode +{ + boolean isFluidInput(EnumFacing side); + + IFluidFilter getInputFluidFilterForSide(EnumFacing side); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java index 872057ab..da01785c 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java @@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.IItemHandler; -public interface IItemFilter +public interface IItemFilter extends IRoutingFilter { void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java new file mode 100644 index 00000000..85f49736 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java @@ -0,0 +1,10 @@ +package WayofTime.bloodmagic.routing; + +import net.minecraft.util.EnumFacing; + +public interface IOutputFluidRoutingNode extends IFluidRoutingNode +{ + boolean isFluidOutput(EnumFacing side); + + IFluidFilter getOutputFluidFilterForSide(EnumFacing side); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java new file mode 100644 index 00000000..4de55c21 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java @@ -0,0 +1,6 @@ +package WayofTime.bloodmagic.routing; + +public interface IRoutingFilter +{ + +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java new file mode 100644 index 00000000..0486e29d --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -0,0 +1,212 @@ +package WayofTime.bloodmagic.routing; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +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; + } + } + } + } + } + } + + public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) + { + FluidStack fluidStack = FluidUtil.getFluidContained(inputStack); + fluidStack.amount = inputStack.stackSize; + return fluidStack; + } + + /** + * 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(); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java index 3af3502e..4ebd6109 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java @@ -8,6 +8,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.util.GhostItemHelper; import WayofTime.bloodmagic.util.Utils; /** diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java index be325890..2bb8c7a8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java @@ -10,9 +10,8 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.item.routing.IItemFilterProvider; +import WayofTime.bloodmagic.item.routing.IRoutingFilterProvider; import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -import WayofTime.bloodmagic.util.GhostItemHelper; public class ContainerItemRoutingNode extends Container { @@ -100,6 +99,13 @@ public class ContainerItemRoutingNode extends Container GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); slot.putStack(copyStack); + + ItemStack filterStack = this.inventorySlots.get(0).getStack(); + if (filterStack.getItem() instanceof IRoutingFilterProvider) + { + ItemStack copyStack = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForItem(filterStack, heldStack); + slot.putStack(copyStack); + } } } } else @@ -136,14 +142,14 @@ public class ContainerItemRoutingNode extends Container { if (!this.mergeItemStack(itemstack1, slotsOccupied, slotsOccupied + 36, true)) { - return ItemStack.EMPTY; + return null; } slot.onSlotChange(itemstack1, itemstack); } else if (index > 0) { // return null; - if (itemstack1.getItem() instanceof IItemFilterProvider) // Change to check item is a filter + if (itemstack1.getItem() instanceof IRoutingFilterProvider) // Change to check item is a filter { if (!this.mergeItemStack(itemstack1, 0, 1, false)) { @@ -155,7 +161,7 @@ public class ContainerItemRoutingNode extends Container return ItemStack.EMPTY; } - if (itemstack1.getCount() == 0) + if (itemstack1.isEmpty()) { slot.putStack(ItemStack.EMPTY); } else @@ -195,7 +201,7 @@ public class ContainerItemRoutingNode extends Container @Override public boolean isItemValid(ItemStack itemStack) { - return itemStack.getItem() instanceof IItemFilterProvider; //TODO: Create a new Item that holds the filter. + return itemStack.getItem() instanceof IRoutingFilterProvider; //TODO: Create a new Item that holds the filter. } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java index a4df1665..66c7b8c2 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java @@ -3,14 +3,19 @@ package WayofTime.bloodmagic.tile.routing; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.item.routing.IFluidFilterProvider; import WayofTime.bloodmagic.item.routing.IItemFilterProvider; import WayofTime.bloodmagic.routing.DefaultItemFilter; +import WayofTime.bloodmagic.routing.IFluidFilter; +import WayofTime.bloodmagic.routing.IInputFluidRoutingNode; import WayofTime.bloodmagic.routing.IInputItemRoutingNode; import WayofTime.bloodmagic.routing.IItemFilter; import WayofTime.bloodmagic.util.Utils; -public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode +public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode, IInputFluidRoutingNode { public TileInputRoutingNode() { @@ -34,11 +39,14 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn { ItemStack filterStack = this.getFilterStack(side); - if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) + 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(); @@ -48,4 +56,35 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn return null; } + + @Override + public boolean isFluidInput(EnumFacing side) + { + return true; + } + + @Override + public IFluidFilter getInputFluidFilterForSide(EnumFacing side) + { + TileEntity tile = worldObj.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(EnumFacing side) + { + return true; + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index 074e9117..2344057c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -17,9 +17,12 @@ import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.routing.IFluidFilter; +import WayofTime.bloodmagic.routing.IInputFluidRoutingNode; import WayofTime.bloodmagic.routing.IInputItemRoutingNode; import WayofTime.bloodmagic.routing.IItemFilter; import WayofTime.bloodmagic.routing.IMasterRoutingNode; +import WayofTime.bloodmagic.routing.IOutputFluidRoutingNode; import WayofTime.bloodmagic.routing.IOutputItemRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; import WayofTime.bloodmagic.routing.NodeHelper; @@ -59,33 +62,65 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } Map> outputMap = new TreeMap>(); + Map> outputFluidMap = new TreeMap>(); for (BlockPos outputPos : outputNodeList) { TileEntity outputTile = getWorld().getTileEntity(outputPos); - if (outputTile instanceof IOutputItemRoutingNode && this.isConnected(new LinkedList(), outputPos)) + if (this.isConnected(new LinkedList(), outputPos)) { - IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - - for (EnumFacing facing : EnumFacing.VALUES) + if (outputTile instanceof IOutputItemRoutingNode) { - if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) - { - continue; - } + IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - IItemFilter filter = outputNode.getOutputFilterForSide(facing); - if (filter != null) + for (EnumFacing facing : EnumFacing.VALUES) { - int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) + if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) { - outputMap.get(priority).add(filter); - } else + continue; + } + + IItemFilter filter = outputNode.getOutputFilterForSide(facing); + if (filter != null) { - List filterList = new LinkedList(); - filterList.add(filter); - outputMap.put(priority, filterList); + 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 (EnumFacing facing : EnumFacing.VALUES) + { + if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) + { + continue; + } + + IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); + if (filter != null) + { + int priority = outputNode.getPriority(facing); + if (outputMap.containsKey(priority)) + { + outputFluidMap.get(priority).add(filter); + } else + { + List filterList = new LinkedList(); + filterList.add(filter); + outputFluidMap.put(priority, filterList); + } } } } @@ -93,33 +128,65 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } Map> inputMap = new TreeMap>(); + Map> inputFluidMap = new TreeMap>(); for (BlockPos inputPos : inputNodeList) { TileEntity inputTile = getWorld().getTileEntity(inputPos); - if (inputTile instanceof IInputItemRoutingNode && this.isConnected(new LinkedList(), inputPos)) + if (this.isConnected(new LinkedList(), inputPos)) { - IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - - for (EnumFacing facing : EnumFacing.VALUES) + if (inputTile instanceof IInputItemRoutingNode) { - if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) - { - continue; - } + IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - IItemFilter filter = inputNode.getInputFilterForSide(facing); - if (filter != null) + for (EnumFacing facing : EnumFacing.VALUES) { - int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) + if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) { - inputMap.get(priority).add(filter); - } else + continue; + } + + IItemFilter filter = inputNode.getInputFilterForSide(facing); + if (filter != null) { - List filterList = new LinkedList(); - filterList.add(filter); - inputMap.put(priority, filterList); + 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 (EnumFacing facing : EnumFacing.VALUES) + { + if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) + { + continue; + } + + IFluidFilter filter = inputNode.getInputFluidFilterForSide(facing); + if (filter != null) + { + int priority = inputNode.getPriority(facing); + if (inputMap.containsKey(priority)) + { + inputFluidMap.get(priority).add(filter); + } else + { + List filterList = new LinkedList(); + filterList.add(filter); + inputFluidMap.put(priority, filterList); + } } } } @@ -127,6 +194,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT)); + int maxFluidTransfer = 1000; for (Entry> outputEntry : outputMap.entrySet()) { @@ -147,6 +215,26 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } } + + 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) diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java index 135a8a0d..f1345b9b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java @@ -3,14 +3,19 @@ package WayofTime.bloodmagic.tile.routing; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.item.routing.IFluidFilterProvider; import WayofTime.bloodmagic.item.routing.IItemFilterProvider; import WayofTime.bloodmagic.routing.DefaultItemFilter; +import WayofTime.bloodmagic.routing.IFluidFilter; import WayofTime.bloodmagic.routing.IItemFilter; +import WayofTime.bloodmagic.routing.IOutputFluidRoutingNode; import WayofTime.bloodmagic.routing.IOutputItemRoutingNode; import WayofTime.bloodmagic.util.Utils; -public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode +public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode, IOutputFluidRoutingNode { public TileOutputRoutingNode() { @@ -34,11 +39,14 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO { ItemStack filterStack = this.getFilterStack(side); - if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) + 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(); @@ -48,4 +56,35 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO return null; } + + @Override + public boolean isFluidOutput(EnumFacing side) + { + return true; + } + + @Override + public IFluidFilter getOutputFluidFilterForSide(EnumFacing side) + { + TileEntity tile = worldObj.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(EnumFacing side) + { + return true; + } } diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json new file mode 100644 index 00000000..430e8f47 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json @@ -0,0 +1,16 @@ +{ + "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/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index dab626b3..c7efae3f 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -182,6 +182,7 @@ 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 @@ -444,7 +445,7 @@ tooltip.bloodmagic.activationCrystal.weak=Activates low-level rituals tooltip.bloodmagic.activationCrystal.awakened=Activates more powerful rituals tooltip.bloodmagic.activationCrystal.creative=Creative Only - Activates any ritual -tooltip.bloodmagic.diviner.currentRitual=Current 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 @@ -535,6 +536,7 @@ 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.itemFilter.exact=Filters the fluid input/output tooltip.bloodmagic.ghost.everything=Everything tooltip.bloodmagic.ghost.amount=Ghost item amount: %d @@ -697,9 +699,9 @@ ritual.bloodmagic.fullStomachRitual.fillRange.info=(Feeding) The range that the 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.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.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. @@ -708,7 +710,7 @@ ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Crystal) Demon Crystals in th 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.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. diff --git a/src/main/resources/assets/bloodmagic/textures/items/FluidRouterFilterExact.png b/src/main/resources/assets/bloodmagic/textures/items/FluidRouterFilterExact.png new file mode 100644 index 0000000000000000000000000000000000000000..5de1391d03e220b1402b6f963cfaeafbda02d0e8 GIT binary patch literal 681 zcmV;a0#^NrP)WFU8GbZ8()Nlj2>E@cM*00Iq3L_t(I%cYawOOtUF z#y@AgvR7=*ww5e0gGEpp3Q0PQs3c6(ya*z3PWl)63%co|3p1!Ff)EA~1VRwqb=QS? z5u~~7B9Sz0nZJh4z1w=<(}iqpGAQc6_vUb(hv#|D`HHIYKjkXd6p_E`0T|^5FArT; z5s|Zf{i+CWUcQhsJ$))7vRARO7u-ECq>+G+>_9}@nop6*W-uxY?R0)Z84_19I2H!e zZ8CH45V?#+Z6JVYn%K6@ls|}NS;WGnc8p?hbOO2?cIfZwrsa4OcOKuzLGbVQQS0;b zG5((DTM8tqx~o7{iB3S*wLx`&FAIx2d>Z5R$ZhV`2S_BASz7sy;dXPPtzDxNyO@#; zdLzSnuC0UWswy7Dp783{P2y=7^8|Tx6o#kb)YUhzwzf)RdsqP}AxQ6}*x1}8xt&79 zMf~mvW1b-6uVt#sBibFK= zA?8U&(OJ1A|9_7+qMha$}1?`L4FezZa3lWbyCSqc2e8qvKHA) zmJ3b}+qO%<1z_<5XzjeH0HNjLJYR3fnExW-f P00000NkvXXu0mjf>b@?t literal 0 HcmV?d00001 From 852d32f2334718d74a049ddad008e3f933a12d91 Mon Sep 17 00:00:00 2001 From: tartaric_acid <568248266@qq.com> Date: Thu, 15 Dec 2016 21:53:36 -0800 Subject: [PATCH 012/595] Update zh_CN file (#1003) * Update zh_CN file * Fix some mistakes (WIP) * Finish all fix * Fix some mistakes (cherry picked from commit ae2ff03) --- .../assets/bloodmagic/lang/zh_CN.lang | 1308 +++++++++-------- 1 file changed, 696 insertions(+), 612 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang index 22aef30e..d77a4201 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang @@ -1,698 +1,781 @@ #Creative Tab -itemGroup.bloodmagic.creativeTab=血魔法 -itemGroup.bloodmagic.creativeTabTome=血魔法强化手册 +itemGroup.BloodMagic.creativeTab=血魔法 +itemGroup.BloodMagic.creativeTabTome=血魔法强化手册 #Items -item.bloodmagic.activationCrystal.weak.name=[虚弱]激活水晶 -item.bloodmagic.activationCrystal.awakened.name=[觉醒]激活水晶 -item.bloodmagic.activationCrystal.creative.name=[创造]激活水晶 +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.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.lavaCrystal.name=熔岩晶体 -item.bloodmagic.bound.sword.name=æŸç¼šä¹‹å‰‘ -item.bloodmagic.bound.pickaxe.name=æŸç¼šä¹‹é• -item.bloodmagic.bound.axe.name=æŸç¼šä¹‹æ–§ -item.bloodmagic.bound.shovel.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.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.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.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.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.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.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.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.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.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.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.cuttingFluid.basicCuttingFluid.name=基础切削油 +item.BloodMagic.cuttingFluid.explosive.name=爆炸ç«è¯ -item.bloodmagic.baseComponent.mundaneLength.name=简å•的延时催化剂 -item.bloodmagic.baseComponent.mundanePower.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.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.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.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.teleposition.name=ä¼ é€å°è®° +item.BloodMagic.sigil.transposition.name=ç§»ä½å°è®° +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.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.altarMaker.name=ç¥­å›æ­å»ºå·¥å…· +item.BloodMagic.ritualDivinernormal.name=ä»ªå¼æŽ¨æµ‹ä»— +item.BloodMagic.ritualDivinerdusk.name=ä»ªå¼æŽ¨æµ‹ä»— [è–„æš®] +item.BloodMagic.ritualDivinerdawn.name=ä»ªå¼æŽ¨æµ‹ä»— [破晓] +item.BloodMagic.ritualReader.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.upgradeTrainer.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.sentientAxe.name=感知之斧 +item.BloodMagic.sentientPickaxe.name=æ„ŸçŸ¥ä¹‹é• +item.BloodMagic.sentientShovel.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.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.experienceTome.name=ç»éªŒæ‰‹å†Œ +item.BloodMagic.sanguineBook.name=指示之书 -item.bloodmagic.experienceTome.name=ç»éªŒæ‰‹å†Œ -item.bloodmagic.sanguineBook.name=指示之书 +item.BloodMagic.livingPointUpgrade.draftAngelus.name=祷告之始 -item.bloodmagic.livingPointUpgrade.draftAngelus.name=祷告之始 - -item.bloodmagic.willGauge.name=æ¶é­”æ„å¿—çµåŸŸæµ‹é‡å™¨ -item.bloodmagic.potionFlask.name=è¯å‰‚ç“¶ +item.BloodMagic.willGauge.name=çµåŸŸæµ‹é‡å™¨ +item.BloodMagic.potionFlask.name=è¯å‰‚ç“¶ # Blocks -tile.bloodmagic.fluid.lifeEssence.name=生命æºè´¨ +tile.BloodMagic.fluid.lifeEssence.name=生命æºè´¨ -tile.bloodmagic.stone.ritual.master.name=主仪å¼çŸ³ -tile.bloodmagic.stone.ritual.imperfect.name=ä¸å®Œå–„的仪å¼çŸ³ +tile.BloodMagic.stone.ritual.master.name=主仪å¼çŸ³ +tile.BloodMagic.stone.ritual.imperfect.name=ä¸å®Œå–„的仪å¼çŸ³ -tile.bloodmagic.altar.name=è¡€ä¹‹ç¥­å› -tile.bloodmagic.alchemyArray.name=&r&f炼金矩阵 +tile.BloodMagic.altar.name=è¡€ä¹‹ç¥­å› +tile.BloodMagic.alchemyArray.name=&r&f炼金矩阵 -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.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.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.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.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.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.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.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.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.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.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=Accented 原生石瓦 -tile.bloodmagic.bricks2.tilespecial_corrosive.name=Accented è…蚀性石瓦 -tile.bloodmagic.bricks2.tilespecial_destructive.name=Accented ç ´åæ€§çŸ³ç“¦ -tile.bloodmagic.bricks2.tilespecial_vengeful.name=Accented å¤ä»‡æ€§çŸ³ç“¦ -tile.bloodmagic.bricks2.tilespecial_steadfast.name=Accented åšå®šæ€§çŸ³ç“¦ +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.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.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.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.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.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.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.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.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.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.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.pillar2.raw.name=Accented 原生石柱 -tile.bloodmagic.pillar2.corrosive.name=Accented è…蚀性石柱 -tile.bloodmagic.pillar2.destructive.name=Accented ç ´åæ€§çŸ³æŸ± -tile.bloodmagic.pillar2.vengeful.name=Accented å¤ä»‡æ€§çŸ³æŸ± -tile.bloodmagic.pillar2.steadfast.name=Accented åšå®šæ€§çŸ³æŸ± +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.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.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.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.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.stairs1.raw.name=原生石楼梯 -tile.bloodmagic.stairs1.corrosive.name=è…蚀性石楼梯 -tile.bloodmagic.stairs2.destructive.name=ç ´åæ€§çŸ³æ¥¼æ¢¯ -tile.bloodmagic.stairs2.vengeful.name=å¤ä»‡æ€§çŸ³æ¥¼æ¢¯ -tile.bloodmagic.stairs3.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.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.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.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.currentBonus=当剿•ˆç›Š: +%d%% -tooltip.bloodmagic.sigil.water.desc=&oæ— é™æ°´æº? -tooltip.bloodmagic.sigil.lava.desc=&o噢好烫! ä¸è¦åƒ -tooltip.bloodmagic.sigil.void.desc=&o胜过速易æ´Â®! -tooltip.bloodmagic.sigil.greenGrove.desc=&oç»¿è‰²çŽ¯ä¿æ— æ±¡æŸ“ -tooltip.bloodmagic.sigil.magnetism.desc=&o我现在éžå¸¸å…·æœ‰å¸å¼•力 -tooltip.bloodmagic.sigil.suppression.desc=&o比念力移动更好... -tooltip.bloodmagic.sigil.haste.desc=&o42剂咖啡因åŽ... -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.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胜过速易æ´Â®! +tooltip.BloodMagic.sigil.greenGrove.desc=&oç»¿è‰²çŽ¯ä¿æ— æ±¡æŸ“ +tooltip.BloodMagic.sigil.magnetism.desc=&o我现在éžå¸¸å…·æœ‰å¸å¼•力 +tooltip.BloodMagic.sigil.suppression.desc=&o比念力移动更好... +tooltip.BloodMagic.sigil.haste.desc=&o42ç»§å’–å•¡å› åŽ... +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.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.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.sacrificialDagger.desc=åªè¦è½»è½»åˆ’过手指... +tooltip.BloodMagic.sacrificialDagger.creative=对ç€ç¥­å›æ½œè¡Œå³å‡»å¡«æ»¡ +tooltip.BloodMagic.slate.desc=在祭å›ä¸­å°†çŸ³å¤´è½¬åŒ– +tooltip.BloodMagic.inscriber.desc=在墙é¢ä¸Šçš„æ–‡å­—... -tooltip.bloodmagic.pack.selfSacrifice.desc=相当ä¸èˆ’适的背包... +tooltip.BloodMagic.pack.selfSacrifice.desc=相当ä¸èˆ’适的背包... +tooltip.BloodMagic.pack.sacrifice.desc=æè¿° +tooltip.BloodMagic.pack.stored=储存: %d LP -tooltip.bloodmagic.pack.stored=储存: %d LP +tooltip.BloodMagic.activationCrystal.weak=æ¿€æ´»ä½Žç­‰ä»ªå¼ +tooltip.BloodMagic.activationCrystal.awakened=æ¿€æ´»æ›´å¼ºå¤§çš„ä»ªå¼ +tooltip.BloodMagic.activationCrystal.creative=åˆ›é€ æ¨¡å¼ - æ¿€æ´»ä»»ä½•ä»ªå¼ -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.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.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.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.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.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.level=%s (等级 %d) +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.level=%s (等级 %d) +tooltip.BloodMagic.livingArmour.upgrade.points=&6强化点数: %s / %s -tooltip.bloodmagic.livingArmour.upgrade.points=&6强化点数: %s / %s +tooltip.BloodMagic.livingArmour.extraExtraInfo=&9-æŒ‰ä½ shift + M 查看进展信æ¯- -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.will=æ„å¿—è´¨é‡: %1$,.2f -tooltip.bloodmagic.sentientSword.desc=以æ¶é­”æ„志唤起其最大潜能. -tooltip.bloodmagic.soulGem.petty=ç”¨äºŽå­˜å‚¨å¾®é‡æ„志的晶石 -tooltip.bloodmagic.sentientAxe.desc=以æ¶é­”æ„志唤起其最大潜能. -tooltip.bloodmagic.sentientPickaxe.desc=以æ¶é­”æ„志唤起其最大潜能. -tooltip.bloodmagic.sentientShovel.desc=以æ¶é­”æ„志唤起其最大潜能. -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.itemFilter.ignoreNBT=忽视筛选的NBT -tooltip.bloodmagic.itemFilter.modItems=åŒMod的物å“å…¨éƒ¨åŒ¹é… -tooltip.bloodmagic.itemFilter.oreDict=凭借矿物辞典筛选 +tooltip.BloodMagic.fluid.type=æ‰€å«æ¶²ä½“ +tooltip.BloodMagic.fluid.amount=æ•°é‡ +tooltip.BloodMagic.fluid.capacity=å®¹é‡ -tooltip.bloodmagic.fluid.type=æ‰€å«æ¶²ä½“ -tooltip.bloodmagic.fluid.amount=æ•°é‡ -tooltip.bloodmagic.fluid.capacity=å®¹é‡ +tooltip.BloodMagic.ghost.everything=ä»»ä½•ç‰©å“ +tooltip.BloodMagic.ghost.amount=å¹½çµç‰©å“æ•°é‡: %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.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.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.experienceTome=用于储存ç»éªŒçš„书 -tooltip.bloodmagic.experienceTome.exp=ç»éªŒå€¼: %0.3f -tooltip.bloodmagic.experienceTome.expLevel=等级: %d +tooltip.BloodMagic.decoration.safe=安全装潢 +tooltip.BloodMagic.decoration.notSafe=å±é™©è£…æ½¢ -tooltip.bloodmagic.decoration.safe=安全装潢 -tooltip.bloodmagic.decoration.notSafe=å±é™©è£…æ½¢ +tooltip.BloodMagic.cuttingFluidRatio=%d/%d 所剩å¯ç”¨ -tooltip.bloodmagic.cuttingFluidRatio=%d/%d 所剩å¯ç”¨ +tooltip.BloodMagic.potion.uses=%d 使用剩余 -tooltip.bloodmagic.potion.uses=%d 使用剩余 +tooltip.BloodMagic.book.shifting=这些符å·ä¼¼ä¹Ž... &oåœ¨å˜æ¢ç€... -tooltip.bloodmagic.book.shifting=这些符å·ä¼¼ä¹Ž... &oåœ¨å˜æ¢ç€... - -tooltip.bloodmagic.willGauge=一个奇怪的装置, å¯ä»¥æµ‹é‡æ¶é­”çµåŸŸä¸­çš„æ¶é­”æ„å¿—. +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.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.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.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.waterRitual.info=通过主仪å¼çŸ³ç”Ÿæˆä¸€ä¸ªæ°´æºæ–¹å—. -ritual.bloodmagic.lavaRitual.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.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.greenGroveRitual.corrosive.info=(è…蚀性) 范围内的实体将被附近的æ¤ç‰©æ”»å‡», å¸é£Ÿä»–们的生命. -ritual.bloodmagic.greenGroveRitual.default.info=(原生) 加快所有的仪å¼è¿ä½œé€Ÿåº¦, å–决于çµåŸŸä¸­å…¨éƒ¨æ„å¿—. -ritual.bloodmagic.greenGroveRitual.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.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.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.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.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.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.waterRitual.waterRange.info=(æ°´æº) ä»ªå¼æ”¾ç½®æ°´æºæ–¹å—的区域. -ritual.bloodmagic.lavaRitual.lavaRange.info=(熔岩) ä»ªå¼æ”¾ç½®ç†”岩方å—的区域. -ritual.bloodmagic.lavaRitual.fireFuse.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.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.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.altarMaker.setTier=层级设置: %d +chat.BloodMagic.altarMaker.building=铺设一个 %d å±‚ç¥­å› +chat.BloodMagic.altarMaker.destroy=消除一个 %d å±‚ç¥­å› +chat.BloodMagic.altarMaker.creativeOnly=该物å“ä»…é™åˆ›é€ æ¨¡å¼. -chat.bloodmagic.damageSource=%s çš„çµé­‚开始å˜å¾—虚弱 +chat.BloodMagic.damageSource=%s çš„çµé­‚开始å˜å¾—虚弱 -chat.bloodmagic.ritual.weak=你感到有股拉力, ä½†æ²¡æœ‰è¶³å¤Ÿçš„åŠ›é‡æ¥å®Œæˆè¿™ä¸ªä»ªå¼. -chat.bloodmagic.ritual.prevent=仪å¼åœ¨ç§¯æžçš„æŠµæŠ—ä½ ! -chat.bloodmagic.ritual.activate=ä¸€è‚¡èƒ½é‡æµç»è¿™ä¸ªä»ªå¼! -chat.bloodmagic.ritual.notValid=这些仪å¼çŸ³ä¼¼ä¹Žæœ‰äº›æ‘†æ”¾ä¸å¾—当... +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.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.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.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.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=è¯å‰‚生æˆåŠå¾„已增加至: % 格方å—. -chat.bloodmagic.mimic.potionSpawnRadius.down=è¯å‰‚生æˆåŠå¾„å·²å‡å°‘至: % 格方å—. +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=è¯å‰‚生æˆåŠå¾„已增加至: % 格方å—. +chat.BloodMagic.mimic.potionSpawnRadius.down=è¯å‰‚生æˆåŠå¾„å·²å‡å°‘至: % 格方å—. # entity -entity.bloodmagic.SentientSpecter.name=æ„ŸçŸ¥ä¹‹çµ -entity.bloodmagic.Mimic.name=æ‹Ÿæ€ +entity.BloodMagic.SentientSpecter.name=æ„ŸçŸ¥ä¹‹çµ +entity.BloodMagic.Mimic.name=æ‹Ÿæ€ # sekrit - - +secret.BloodMagic.bread.bloody=&r&c血腥é¢åŒ… +secret.BloodMagic.bread.bloody.desc=唯有 &o坿€• &r&7紧急情况 # Commands commands.error.arg.invalid=æ— æ•ˆå‚æ•° @@ -724,9 +807,9 @@ commands.network.fill.success=æˆåŠŸå¡«å…… %s çš„çµé­‚网络. commands.network.cap.help=填充指定玩家的çµé­‚ç½‘ç»œè‡³å…¶æ‰€æŒæœ‰çš„æœ€é«˜é˜¶æ°”è¡€å®ç å®¹é‡çš„æœ€å¤§å€¼. commands.network.cap.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚网络. -commands.bind.usage=/bloodmagic bind [是(true)|å¦(false)] [玩家] +commands.bind.usage=/bind <玩家> commands.bind.help=用于设置/解除对手æŒç‰©å“的绑定情况. -commands.bind.success=绑定æˆåŠŸ +commands.bind.success=ç‰©å“æˆåŠŸç»‘å®š! commands.bind.remove.success=解除绑定æˆåŠŸ commands.orb.usage=/bloodmagic orb [设置(set)|查看(get)] <玩家> [等级] @@ -753,41 +836,42 @@ commands.soulnetwork.fillMax.success=æˆåŠŸå°† %s çš„çµé­‚ç½‘ç»œå¡«æ»¡è‡³å…¶å® commands.soulnetwork.create.success=创建 %s çš„çµé­‚网络æˆåŠŸ (å®ç ç­‰çº§: %d) # GUI -tile.bloodmagic.inputNode.name=输入节点 -tile.bloodmagic.outputNode.name=输出节点 +tile.BloodMagic.inputNode.name=输入节点 +tile.BloodMagic.outputNode.name=输出节点 # Keybinds -bloodmagic.keybind.open_holding=打开集æŒå°è®° -bloodmagic.keybind.cycle_holding_pos=循环选择å°è®° (+) -bloodmagic.keybind.cycle_holding_neg=循环选择å°è®° (-) +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.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.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å¯ä»¥é€šè¿‡ç”¨æ„ŸçŸ¥æ­¦å™¨æ€æ­»ç”Ÿç‰©æŽ‰è½, 或是对ç€ç”Ÿç‰©æŠ›æŽ·åŽŸå§‹æŠ•ç½‘, 当它出现白色颗粒时æ€äº†å®ƒ. +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=炼金矩阵 +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=血红奥术 From c46ed3e648321d9673c9df53ddc29a8c2f5b333a Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 19 Dec 2016 17:32:03 -0800 Subject: [PATCH 013/595] Sigils should draw LP from the bound network, not the user (cherry picked from commit 082d2b8) --- .../WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java | 4 ++-- .../WayofTime/bloodmagic/api/util/helper/NetworkHelper.java | 2 ++ .../WayofTime/bloodmagic/command/sub/SubCommandNetwork.java | 2 +- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java | 2 +- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java | 1 - .../WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java | 4 ++-- .../bloodmagic/item/sigil/ItemSigilEnderSeverance.java | 1 - .../WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java | 2 -- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java | 1 - .../java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java | 4 ++-- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java | 1 - .../bloodmagic/item/sigil/ItemSigilTransposition.java | 2 +- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java | 4 ++-- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java | 2 +- 14 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java index 7cf2393a..42352fbf 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java @@ -65,7 +65,7 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable @Override public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - return (NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + return (NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; } public boolean onSigilUse(ItemStack itemStack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) @@ -80,7 +80,7 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable { if (entityIn.ticksExisted % 100 == 0) { - if (!NetworkHelper.getSoulNetwork((EntityPlayerMP) entityIn).syphonAndDamage((EntityPlayer) entityIn, getLpUsed())) + if (!NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage((EntityPlayer) entityIn, getLpUsed())) { setActivatedState(stack, false); } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java index 8a8540b5..d2841ae3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java @@ -110,7 +110,9 @@ public class NetworkHelper * - Amount of LP to syphon * * @return - Whether the action should be performed. + * @deprecated Use {@link #getSoulNetwork(EntityPlayer)} and {@link SoulNetwork#syphonAndDamage(EntityPlayer, int)} */ + @Deprecated public static boolean syphonAndDamage(SoulNetwork soulNetwork, EntityPlayer user, int toSyphon) { diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 1e47012f..f54f501d 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -73,7 +73,7 @@ public class SubCommandNetwork extends CommandBase if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); - NetworkHelper.syphonAndDamage(NetworkHelper.getSoulNetwork(player), player, amount); + NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, amount); CommandBloodMagic.displaySuccessString(sender, "commands.network.syphon.success", amount, player.getDisplayName().getFormattedText()); } else { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index bf95f42a..86f794ee 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -54,7 +54,7 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP if (!world.isRemote) { if (!player.capabilities.isCreativeMode) - this.setUnusable(stack, !NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())); + this.setUnusable(stack, !NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())); if (!unusable) player.fallDistance = 0; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index d7118cda..9cff0cd1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -6,7 +6,6 @@ import java.util.List; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.ItemSigil; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import com.google.common.base.Strings; import lombok.Getter; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 42ddb560..aaf30f0c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -50,7 +50,7 @@ public class ItemSigilBloodLight extends ItemSigilBase { world.setBlockState(blockPos, ModBlocks.BLOOD_LIGHT.getDefaultState()); if (!world.isRemote) - NetworkHelper.syphonAndDamage(NetworkHelper.getSoulNetwork(player), player, getLpUsed()); + NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()); resetCooldown(stack); player.swingArm(hand); return super.onItemRightClick(world, player, hand); @@ -60,7 +60,7 @@ public class ItemSigilBloodLight extends ItemSigilBase if (!world.isRemote) { world.spawnEntity(new EntityBloodLight(world, player)); - NetworkHelper.syphonAndDamage(NetworkHelper.getSoulNetwork(player), player, getLpUsed()); + NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()); } resetCooldown(stack); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java index 20a869f2..cad5d7f9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java @@ -9,7 +9,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.registry.ModPotions; public class ItemSigilEnderSeverance extends ItemSigilToggleableBase diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java index 38631787..a42dd360 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java @@ -6,8 +6,6 @@ import net.minecraft.block.IGrowable; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java index 3eaf082a..4ad3fb96 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.registry.ModPotions; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index c362e1cc..ce9eac0d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -65,7 +65,7 @@ public class ItemSigilLava extends ItemSigilBase return super.onItemRightClick(world, player, hand); } - if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) + if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) { return super.onItemRightClick(world, player, hand); } @@ -96,7 +96,7 @@ public class ItemSigilLava extends ItemSigilBase FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000); int amount = handler.fill(fluid, false); - if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) + if (amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { handler.fill(fluid, true); return EnumActionResult.SUCCESS; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java index e5d97e22..d8b4e4c3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java @@ -15,7 +15,6 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.IBloodAltar; import WayofTime.bloodmagic.api.iface.IAltarReader; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index c9a65ccf..7d226a48 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -106,7 +106,7 @@ public class ItemSigilTransposition extends ItemSigilBase stack.getTagCompound().setByte(Constants.NBT.CONTAINED_BLOCK_META, metadata); stack.getTagCompound().setTag(Constants.NBT.CONTAINED_TILE_ENTITY, tileNBTTag); - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, cost); + NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, cost); world.removeTileEntity(blockPos); world.setBlockToAir(blockPos); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 749bcff2..9d8db890 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -102,7 +102,7 @@ public class ItemSigilVoid extends ItemSigilBase IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack amount = handler.drain(1000, false); - if (amount != null && amount.amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) + if (amount != null && amount.amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { handler.drain(1000, true); return EnumActionResult.SUCCESS; @@ -118,7 +118,7 @@ public class ItemSigilVoid extends ItemSigilBase return EnumActionResult.FAIL; } - if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) + if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { world.setBlockToAir(newPos); return EnumActionResult.SUCCESS; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index 9e93f578..c125b03e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -62,7 +62,7 @@ public class ItemSigilWater extends ItemSigilBase if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) return super.onItemRightClick(world, player, hand); - if (this.canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed()) && this.tryPlaceWater(world, blockpos1)) + if (this.canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceWater(world, blockpos1)) return super.onItemRightClick(world, player, hand); } } From 60eba2071d882328eadc78823718a7a15ae3013d Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 20 Dec 2016 16:28:16 -0800 Subject: [PATCH 014/595] Made it so the book does not give the filling recipe when the Blood Orb recipe is queried. (cherry picked from commit afa3d1e) --- changelog.txt | 1 + .../java/WayofTime/bloodmagic/util/helper/RecipeHelper.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index ef5c9955..eb4846c7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,6 +2,7 @@ Version 2.1.1-70 ------------------------------------------------------ - 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. ------------------------------------------------------ Version 2.1.0-69 diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java index 98f29fa0..acebf301 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java @@ -33,7 +33,7 @@ public class RecipeHelper { for (AltarRecipeRegistry.AltarRecipe recipe : AltarRecipeRegistry.getRecipes().values()) { - if (recipe != null) + if (recipe != null && !recipe.isFillable()) { ItemStack resultStack = recipe.getOutput(); if (!resultStack.isEmpty()) From e8dd07893ec385fd4411b67cd20689acbe156af9 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 20 Dec 2016 16:42:39 -0800 Subject: [PATCH 015/595] Added a null check for the Will getter for the Aura incase the WillChunk somehow does not generate. (#1011) (cherry picked from commit f083071) --- changelog.txt | 1 + .../bloodmagic/demonAura/WorldDemonWillHandler.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/changelog.txt b/changelog.txt index eb4846c7..20db1aa4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,7 @@ Version 2.1.1-70 ------------------------------------------------------ - 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. ------------------------------------------------------ Version 2.1.0-69 diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index 23109866..89762e2e 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -177,6 +177,11 @@ public class WorldDemonWillHandler { WillChunk willChunk = getWillChunk(world, pos); + if (willChunk == null) + { + return 0; + } + DemonWillHolder currentWill = willChunk.getCurrentWill(); return currentWill.getWill(type); } From bd4efb132079357320414bf0d611e92e16ec5072 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 30 Dec 2016 16:37:19 -0800 Subject: [PATCH 016/595] Blacklist sentient spectres from WoS and Sacrifice (#1015) A config refresh is required for this to take effect. Needs mentioning in changelog. (cherry picked from commit a5449d3) --- src/main/java/WayofTime/bloodmagic/ConfigHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 810ddcae..373f6a31 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -198,11 +198,11 @@ public class ConfigHandler category = "Well of Suffering Blacklist"; config.addCustomCategoryComment(category, "Entity blacklisting from WoS"); - wellOfSufferingBlacklist = Arrays.asList(config.getStringList("wellOfSufferingBlacklist", category, new String[] { "EntityArmorStand" }, "Use the class name of the Entity to blacklist it from usage.\nIE: EntityWolf, EntityWitch, etc")); + wellOfSufferingBlacklist = Arrays.asList(config.getStringList("wellOfSufferingBlacklist", category, new String[] { "EntityArmorStand", "EntitySentientSpecter" }, "Use the class name of the Entity to blacklist it from usage.\nIE: EntityWolf, EntityWitch, etc")); category = "Blood Altar Sacrificial Values"; config.addCustomCategoryComment(category, "Entity Sacrificial Value Settings"); - entitySacrificeValuesList = config.getStringList("entitySacrificeLP:HPValues", category, new String[] { "EntityVillager;100", "EntitySlime;15", "EntityEnderman;10", "EntityCow;100", "EntityChicken;100", "EntityHorse;100", "EntitySheep;100", "EntityWolf;100", "EntityOcelot;100", "EntityPig;100", "EntityRabbit;100", "EntityArmorStand;0" }, "Used to edit the amount of LP gained per HP sacrificed for the given entity.\nSetting an entity to 0 effectively blacklists it.\nIf a mod modifies an entity via the API, it will take precedence over this config.\nSyntax: EntityClassName;LPPerHP"); + entitySacrificeValuesList = config.getStringList("entitySacrificeLP:HPValues", category, new String[] { "EntityVillager;100", "EntitySlime;15", "EntityEnderman;10", "EntityCow;100", "EntityChicken;100", "EntityHorse;100", "EntitySheep;100", "EntityWolf;100", "EntityOcelot;100", "EntityPig;100", "EntityRabbit;100", "EntityArmorStand;0", "EntitySentientSpecter;0" }, "Used to edit the amount of LP gained per HP sacrificed for the given entity.\nSetting an entity to 0 effectively blacklists it.\nIf a mod modifies an entity via the API, it will take precedence over this config.\nSyntax: EntityClassName;LPPerHP"); buildEntitySacrificeValues(); category = "Potions"; From e0c0d095df23a07625d6d154c86cc58b1138ee3f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 30 Dec 2016 17:10:36 -0800 Subject: [PATCH 017/595] Fix meteor config not generating new defaults (cherry picked from commit 5c1b8b1) --- .../meteor/MeteorConfigHandler.java | 58 +++++++++++++------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index 0ef06ef9..31166dfa 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -2,6 +2,9 @@ package WayofTime.bloodmagic.meteor; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.gson.Serializers; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import org.apache.commons.io.FilenameUtils; @@ -9,14 +12,13 @@ import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.commons.lang3.tuple.Pair; import java.io.*; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; public class MeteorConfigHandler { - private static final Map DEFAULT_METEORS = new HashMap(); + private static final Map DEFAULT_METEORS = Maps.newHashMap(); private static File meteorDir; @@ -51,7 +53,7 @@ public class MeteorConfigHandler if (meteorFiles == null) return; - List> meteors = new ArrayList>(); + List> meteors = Lists.newArrayList(); // Filter names so we can compare to defaults for (File meteorFile : meteorFiles) @@ -62,22 +64,29 @@ public class MeteorConfigHandler if (checkNewVersion && ConfigHandler.getConfig().getBoolean("resyncOnVersionChange", "Meteors", true, "Should the default meteors be regenerated if the mod has updated them")) { - // Check defaults for new version + Set discoveredDefaults = Sets.newHashSet(); + + // Check existing defaults for new version for (Pair meteor : meteors) { Meteor defaultMeteor = DEFAULT_METEORS.get(meteor.getLeft()); - if (defaultMeteor != null && defaultMeteor.version > meteor.getRight().version) + if (defaultMeteor != null) { - String json = Serializers.GSON.toJson(defaultMeteor); - File meteorFile = new File(meteorDir, meteor.getLeft() + ".json"); - new PrintWriter(meteorFile).close(); // Clear the file - FileWriter fileWriter = new FileWriter(meteorFile); - fileWriter.write(json); // Write the new contents - fileWriter.close(); - - meteors.set(meteors.indexOf(meteor), Pair.of(meteor.getLeft(), defaultMeteor)); + 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 @@ -93,10 +102,10 @@ public class MeteorConfigHandler private static List> getDefaultMeteors() { - List> holders = new ArrayList>(); + List> holders = Lists.newArrayList(); // Iron - List ironMeteorList = new ArrayList(); + List ironMeteorList = Lists.newArrayList(); ironMeteorList.add(new MeteorComponent(400, "oreIron")); ironMeteorList.add(new MeteorComponent(200, "oreCopper")); ironMeteorList.add(new MeteorComponent(140, "oreTin")); @@ -108,7 +117,7 @@ public class MeteorConfigHandler Meteor ironMeteor = new Meteor(new ItemStack(Blocks.IRON_BLOCK), ironMeteorList, 15, 5, 1000); ironMeteor.setVersion(2); // Gold - List goldMeteorList = new ArrayList(); + List goldMeteorList = Lists.newArrayList(); goldMeteorList.add(new MeteorComponent(200, "oreIron")); goldMeteorList.add(new MeteorComponent(100, "oreCopper")); goldMeteorList.add(new MeteorComponent(60, "oreTin")); @@ -121,7 +130,7 @@ public class MeteorConfigHandler Meteor goldMeteor = new Meteor(new ItemStack(Blocks.GOLD_BLOCK), goldMeteorList, 18, 6, 1000); goldMeteor.setVersion(3); - List diamondMeteorList = new ArrayList(); + List diamondMeteorList = Lists.newArrayList(); diamondMeteorList.add(new MeteorComponent(50, "oreIron")); diamondMeteorList.add(new MeteorComponent(100, "oreGold")); diamondMeteorList.add(new MeteorComponent(10, "oreLapis")); @@ -143,4 +152,17 @@ public class MeteorConfigHandler DEFAULT_METEORS.put("DiamondMeteor", 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(); + } + } } From 1f3686720c758f87b51740404da237693fc5df80 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 30 Dec 2016 17:11:00 -0800 Subject: [PATCH 018/595] Gold meteor only needs it's version set once (cherry picked from commit fffed0e) --- .../java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index 31166dfa..487df85f 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -140,7 +140,7 @@ public class MeteorConfigHandler diamondMeteorList.add(new MeteorComponent(400, "minecraft:diamond_block")); Meteor diamondMeteor = new Meteor(new ItemStack(Blocks.DIAMOND_BLOCK), diamondMeteorList, 10, 3, 1000); - goldMeteor.setVersion(3); + diamondMeteor.setVersion(3); holders.add(Pair.of("IronMeteor", ironMeteor)); DEFAULT_METEORS.put("IronMeteor", ironMeteor); From 4c3938c0f9df9c2fa15508016cbdbbdf4703acf2 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 30 Dec 2016 17:12:38 -0800 Subject: [PATCH 019/595] Change meteor config NPE with EnderCore to a useful error message (cherry picked from commit 09007c5) --- .../WayofTime/bloodmagic/meteor/MeteorConfigHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index 487df85f..dbe77473 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.meteor; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.gson.Serializers; import com.google.common.collect.Lists; @@ -30,6 +31,11 @@ public class MeteorConfigHandler public static void handleMeteors(boolean checkNewVersion) { + if (meteorDir == null) { + BloodMagic.instance.getLogger().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(); From 91a900d84ef24feee60416b0b3a5aeefdd530a14 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 30 Dec 2016 17:34:43 -0800 Subject: [PATCH 020/595] Add current charge to Waila tooltip (#1013) (cherry picked from commit c7f2b7d) --- .../compat/waila/provider/DataProviderBloodAltar.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index 9ec8b3b4..b6011653 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -88,12 +88,14 @@ public class DataProviderBloodAltar implements IWailaDataProvider if (hasSeer) { + int charge = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_TOTAL_CHARGE); int progress = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_PROGRESS); int liquidRequired = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_LIQUID_REQ); int craftAmount = 1; if (accessor.getNBTData().getTagList("Items", 10).get(0).getId() == 10) craftAmount = ((NBTTagCompound)accessor.getNBTData().getTagList("Items", 10).get(0)).getByte("Count"); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent", (int) (((double) progress / (double) liquidRequired * 100) / craftAmount) + "%")); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentCharge", charge)); } } } else @@ -143,7 +145,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider if (player.getHeldItemMainhand().getItem() instanceof ItemSigilDivination) return true; - if (player.getHeldItemOffhand().getItem() instanceof ItemSigilDivination) + if (player.getHeldItemOffhand() != null && player.getHeldItemOffhand().getItem() instanceof ItemSigilDivination) return true; return false; From f3f1dfb08ae12dc2766a42f73be2435157ab05af Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 30 Dec 2016 17:43:02 -0800 Subject: [PATCH 021/595] Fix Expulsion whitelist (#1010) (cherry picked from commit b6eae2f) --- src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index ed43dd81..2e9cbe7f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -76,7 +76,7 @@ public class RitualExpulsion extends Ritual { IBindable bindable = (IBindable) itemStack.getItem(); if (!Strings.isNullOrEmpty(bindable.getOwnerName(itemStack)) && !allowedNames.contains(bindable.getOwnerName(itemStack))) - allowedNames.add(bindable.getOwnerName(itemStack)); + allowedNames.add(bindable.getOwnerUUID(itemStack)); } } } From 78093631c5d9c23438c6a4fa91f7bc92d0b47567 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 30 Dec 2016 18:27:16 -0800 Subject: [PATCH 022/595] Empty flasks can now be refilled (#976) Right click a water source (any block that uses Material.WATER, same as vanilla potions) to refill it. This removes all potion effects. The model will display without the fluid inside as a visual indicator. (cherry picked from commit 4c614df) --- .../{potion => }/item/ItemPotionFlask.java | 78 +++++++++++++++---- .../bloodmagic/proxy/ClientProxy.java | 3 + .../bloodmagic/registry/ModItems.java | 2 +- 3 files changed, 69 insertions(+), 14 deletions(-) rename src/main/java/WayofTime/bloodmagic/{potion => }/item/ItemPotionFlask.java (53%) diff --git a/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java similarity index 53% rename from src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java rename to src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index cf04c6d8..1dbc3922 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -1,31 +1,36 @@ -package WayofTime.bloodmagic.potion.item; +package WayofTime.bloodmagic.item; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import com.google.common.collect.Lists; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.SoundEvents; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionUtils; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; +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 org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.client.IVariantProvider; -public class ItemPotionFlask extends Item implements IVariantProvider +import javax.annotation.Nullable; + +public class ItemPotionFlask extends Item implements IMeshProvider { public ItemPotionFlask() { @@ -44,6 +49,8 @@ public class ItemPotionFlask extends Item implements IVariantProvider int remainingUses = stack.getMaxDamage() - stack.getItemDamage(); if (remainingUses <= 0) { + NBTHelper.checkNBT(stack); + stack.getTagCompound().setBoolean("empty", true); return stack; } @@ -75,6 +82,26 @@ public class ItemPotionFlask extends Item implements IVariantProvider return EnumAction.DRINK; } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing 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 EnumActionResult.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 EnumActionResult.SUCCESS; + } + + return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ); + } + @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { @@ -82,6 +109,8 @@ public class ItemPotionFlask extends Item implements IVariantProvider int remainingUses = stack.getMaxDamage() - stack.getItemDamage(); if (remainingUses <= 0) { + NBTHelper.checkNBT(stack); + stack.getTagCompound().setBoolean("empty", true); return new ActionResult(EnumActionResult.PASS, stack); } player.setActiveHand(hand); @@ -107,11 +136,34 @@ public class ItemPotionFlask extends Item implements IVariantProvider // } // } + + @SideOnly(Side.CLIENT) @Override - public List> getVariants() + public ItemMeshDefinition getMeshDefinition() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=normal")); - return ret; + return new ItemMeshDefinition() + { + @Override + public ModelResourceLocation getModelLocation(ItemStack stack) + { + boolean full = true; + if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) + full = false; + return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + getRegistryName().getResourcePath()), "full=" + (full ? "true" : "false")); + } + }; + } + + @Nullable + @Override + public ResourceLocation getCustomLocation() + { + return null; + } + + @Override + public List getVariants() + { + return Lists.newArrayList("full=true", "full=false"); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 9c0954d4..a160d70a 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -163,6 +163,9 @@ public class ClientProxy extends CommonProxy if (tintIndex != 0 && tintIndex != 2) return -1; + if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) + return -1; + return PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromStack(stack)); } }, ModItems.POTION_FLASK); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java index 49a54030..6a624790 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java @@ -82,7 +82,7 @@ import WayofTime.bloodmagic.item.soul.ItemSentientShovel; import WayofTime.bloodmagic.item.soul.ItemSentientSword; import WayofTime.bloodmagic.item.soul.ItemSoulGem; import WayofTime.bloodmagic.item.soul.ItemSoulSnare; -import WayofTime.bloodmagic.potion.item.ItemPotionFlask; +import WayofTime.bloodmagic.item.ItemPotionFlask; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; public class ModItems From e84533284660c9083efc84a0c18921b1d17a8105 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 2 Jan 2017 02:07:52 -0800 Subject: [PATCH 023/595] Fix compile/model errors --- .../bloodmagic/api/impl/ItemSigilToggleable.java | 2 +- .../WayofTime/bloodmagic/item/ItemPotionFlask.java | 2 +- .../item/routing/ItemFluidRouterFilter.java | 11 ++++++----- .../bloodmagic/item/routing/ItemRouterFilter.java | 2 +- .../bloodmagic/routing/RoutingFluidFilter.java | 2 +- .../tile/container/ContainerItemRoutingNode.java | 11 ++++++----- .../tile/routing/TileInputRoutingNode.java | 2 +- .../tile/routing/TileOutputRoutingNode.java | 2 +- ...RouterFilter.json => itemfluidrouterfilter.json} | 0 .../blockstates/item/itempotionflask.json | 9 +++++++-- ...erFilterExact.png => fluidrouterfilterexact.png} | Bin 11 files changed, 25 insertions(+), 18 deletions(-) rename src/main/resources/assets/bloodmagic/blockstates/item/{ItemFluidRouterFilter.json => itemfluidrouterfilter.json} (100%) rename src/main/resources/assets/bloodmagic/textures/items/{FluidRouterFilterExact.png => fluidrouterfilterexact.png} (100%) diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java index 42352fbf..8442bfc5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java @@ -65,7 +65,7 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable @Override public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - return (NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + return (NetworkHelper.getSoulNetwork(getOwnerUUID(player.getHeldItem(hand))).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; } public boolean onSigilUse(ItemStack itemStack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index 1dbc3922..dede4a52 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -99,7 +99,7 @@ public class ItemPotionFlask extends Item implements IMeshProvider return EnumActionResult.SUCCESS; } - return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ); + return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index 0ecdbb24..2c688aa6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -8,6 +8,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.NonNullList; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -45,7 +46,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, List list) + public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) { for (int i = 0; i < names.length; i++) list.add(new ItemStack(id, 1, i)); @@ -63,7 +64,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { - IFluidFilter testFilter = new RoutingFluidFilter(); + IFluidFilter testFilter; switch (filterStack.getMetadata()) { @@ -120,9 +121,9 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.stackSize == 0) + if (ghostStack.isEmpty()) { - ghostStack.stackSize = Integer.MAX_VALUE; + ghostStack.setCount(Integer.MAX_VALUE); } filteredList.add(ghostStack); @@ -145,7 +146,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); - copyStack.stackSize = 1; + copyStack.setCount(1); return copyStack; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 06e5c543..5cbd10dc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -171,7 +171,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); - copyStack.stackSize = 1; + copyStack.setCount(1); return copyStack; } } diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java index 0486e29d..2b5f7812 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -88,7 +88,7 @@ public class RoutingFluidFilter implements IFluidFilter public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) { FluidStack fluidStack = FluidUtil.getFluidContained(inputStack); - fluidStack.amount = inputStack.stackSize; + fluidStack.amount = inputStack.getCount(); return fluidStack; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java index 2bb8c7a8..e2ec3eee 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.tile.container; import javax.annotation.Nullable; +import WayofTime.bloodmagic.util.GhostItemHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.ClickType; @@ -85,10 +86,10 @@ public class ContainerItemRoutingNode extends Container if (dragType == 0) //Left mouse click-eth { { - if (heldStack == null && slotStack != null) + if (heldStack.isEmpty() && !slotStack.isEmpty()) { //I clicked on the slot with an empty hand. Selecting! - } else if (heldStack != null && slotStack == null) + } else if (!heldStack.isEmpty() && slotStack.isEmpty()) { if (!((SlotGhostItem) slot).canBeAccessed()) { @@ -103,15 +104,15 @@ public class ContainerItemRoutingNode extends Container ItemStack filterStack = this.inventorySlots.get(0).getStack(); if (filterStack.getItem() instanceof IRoutingFilterProvider) { - ItemStack copyStack = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForItem(filterStack, heldStack); - slot.putStack(copyStack); + ItemStack filterCopy = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForItem(filterStack, heldStack); + slot.putStack(filterCopy); } } } } else //Right mouse click-eth away { - slot.putStack(null); + slot.putStack(ItemStack.EMPTY); } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java index 66c7b8c2..1717445f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java @@ -66,7 +66,7 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn @Override public IFluidFilter getInputFluidFilterForSide(EnumFacing side) { - TileEntity tile = worldObj.getTileEntity(pos.offset(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); diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java index f1345b9b..3a98ed33 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java @@ -66,7 +66,7 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO @Override public IFluidFilter getOutputFluidFilterForSide(EnumFacing side) { - TileEntity tile = worldObj.getTileEntity(pos.offset(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); diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemfluidrouterfilter.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json rename to src/main/resources/assets/bloodmagic/blockstates/item/itemfluidrouterfilter.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json b/src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json index 4af6432c..3102ac66 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json +++ b/src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json @@ -5,13 +5,18 @@ "transform": "forge:default-item" }, "variants": { - "type": { - "normal": { + "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" + } } } } diff --git a/src/main/resources/assets/bloodmagic/textures/items/FluidRouterFilterExact.png b/src/main/resources/assets/bloodmagic/textures/items/fluidrouterfilterexact.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/FluidRouterFilterExact.png rename to src/main/resources/assets/bloodmagic/textures/items/fluidrouterfilterexact.png From 11fe41c654678cbf6d96427b82b73ec431081d31 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 2 Jan 2017 02:28:02 -0800 Subject: [PATCH 024/595] Fix durability bars --- .../bloodmagic/item/ItemInscriptionTool.java | 14 +++++++++++--- .../bloodmagic/item/soul/ItemSoulGem.java | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 9f8307af..92dcd5cf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -14,6 +14,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; 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; @@ -72,7 +73,7 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro { stack.getTagCompound().setInteger(Constants.NBT.USES, --uses); if (uses <= 0) - player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + player.inventory.setInventorySlotContents(player.inventory.currentItem, ItemStack.EMPTY); } return EnumActionResult.SUCCESS; } @@ -83,18 +84,25 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro @Override public boolean showDurabilityBar(ItemStack stack) { - return true; + return stack.hasTagCompound(); } @Override public double getDurabilityForDisplay(ItemStack stack) { - stack = NBTHelper.checkNBT(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, EntityPlayer player, List list, boolean advanced) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index ecb02a04..16d5ef87 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -13,6 +13,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.*; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -145,6 +146,19 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I 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) { From 930660bc30cc5c225516d1404942f9584a1a51af Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 01:31:37 -0800 Subject: [PATCH 025/595] Update Blood Tank model and texture Thanks @InsomniaKitten Need to rewrite inventory model handler because you *cannot* use GL there. (cherry picked from commit 6ff12aa) --- .../models/block/blockbloodtank.json | 788 ++++++++++-------- .../bloodmagic/textures/blocks/bloodtank.png | Bin 911 -> 1064 bytes 2 files changed, 432 insertions(+), 356 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/models/block/blockbloodtank.json b/src/main/resources/assets/bloodmagic/models/block/blockbloodtank.json index 679b2ac7..8ec58735 100644 --- a/src/main/resources/assets/bloodmagic/models/block/blockbloodtank.json +++ b/src/main/resources/assets/bloodmagic/models/block/blockbloodtank.json @@ -1,357 +1,433 @@ { - "__comment": "Copyright © InsomniaKitten 2016", - "textures": { - "texture": "bloodmagic:blocks/BloodTank" - }, - "elements": [ - { - "from": [ 3, 0, 3 ], - "to": [ 13, 1, 13 ], - "faces": { - "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#texture", "cullface": "down" }, - "up": { "uv": [ 5, 0, 10, 5 ], "texture": "#texture" }, - "north": { "uv": [ 0, 6.5, 5, 7 ], "texture": "#texture" }, - "south": { "uv": [ 0, 6.5, 5, 7 ], "texture": "#texture" }, - "west": { "uv": [ 0, 6.5, 5, 7 ], "texture": "#texture" }, - "east": { "uv": [ 0, 6.5, 5, 7 ], "texture": "#texture" } - } - }, - { - "from": [ 3, 1, 3 ], - "to": [ 4, 14, 4 ], - "faces": { - "up": { "uv": [ 4.5, 11.5, 5, 12 ], "texture": "#texture" }, - "north": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, - "west": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 3, 1, 4 ], - "to": [ 4, 14, 5 ], - "faces": { - "up": { "uv": [ 4.5, 11, 5, 11.5 ], "texture": "#texture" }, - "south": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" }, - "west": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 3, 1, 5 ], - "to": [ 4, 2, 11 ], - "faces": { - "up": { "uv": [ 0.5, 1.5, 1, 4.5 ], "texture": "#texture" }, - "west": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 3, 1, 11 ], - "to": [ 4, 14, 12 ], - "faces": { - "up": { "uv": [ 4.5, 7.5, 5, 8 ], "texture": "#texture" }, - "north": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "west": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 3, 1, 12 ], - "to": [ 4, 14, 13 ], - "faces": { - "up": { "uv": [ 4.5, 7, 5, 7.5 ], "texture": "#texture" }, - "south": { "uv": [ 0, 0, 0.5, 7 ], "texture": "#texture" }, - "west": { "uv": [ 0, 0, 0.5, 7 ], "texture": "#texture" } - } - }, - { - "from": [ 3, 10, 5 ], - "to": [ 4, 12, 11 ], - "faces": { - "down": { "uv": [ 4.5, 8, 5, 11 ], "texture": "#texture" }, - "up": { "uv": [ 4.5, 8, 5, 11.5 ], "texture": "#texture" }, - "west": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" }, - "east": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" } - } - }, - { - "from": [ 3, 13, 5 ], - "to": [ 4, 14, 11 ], - "faces": { - "down": { "uv": [ 1, 11.5, 4, 12 ], "texture": "#texture" }, - "up": { "uv": [ 1, 7, 4, 7.5 ], "texture": "#texture" }, - "west": { "uv": [ 1, 0, 4, 0.5 ], "texture": "#texture" }, - "east": { "uv": [ 1, 0, 4, 0.5 ], "texture": "#texture" } - } - }, - { - "from": [ 4, 1, 3 ], - "to": [ 5, 14, 4 ], - "faces": { - "up": { "uv": [ 4, 11.5, 4.5, 12 ], "texture": "#texture" }, - "north": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "south": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 4, 1, 12 ], - "to": [ 5, 14, 13 ], - "faces": { - "up": { "uv": [ 4, 7, 4.5, 7.5 ], "texture": "#texture" }, - "north": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "south": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 4, 11, 4 ], - "to": [ 12, 12, 12 ], - "faces": { - "down": { "uv": [ 5.5, 0.5, 9.5, 4.5 ], "texture": "#texture" }, - "up": { "uv": [ 5.5, 0.5, 9.5, 4.5 ], "texture": "#texture" }, - "north": { "uv": [ 0.5, 7.5, 4.5, 8 ], "texture": "#texture" }, - "south": { "uv": [ 0.5, 11, 4.5, 11.5 ], "texture": "#texture" }, - "west": { "uv": [ 0.5, 7.5, 1, 11.5 ], "texture": "#texture" }, - "east": { "uv": [ 4, 7.5, 4.5, 11.5 ], "texture": "#texture" } - } - }, - { - "from": [ 5, 1, 3 ], - "to": [ 11, 2, 4 ], - "faces": { - "up": { "uv": [ 1, 1.5, 4, 2 ], "texture": "#texture" }, - "north": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" }, - "south": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 5, 1, 12 ], - "to": [ 11, 2, 13 ], - "faces": { - "up": { "uv": [ 1, 1.5, 4, 2 ], "texture": "#texture" }, - "north": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" }, - "south": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 5, 10, 3 ], - "to": [ 11, 12, 4 ], - "faces": { - "down": { "uv": [ 1, 1.5, 4, 2 ], "texture": "#texture" }, - "up": { "uv": [ 1, 7, 4, 7.5 ], "texture": "#texture" }, - "north": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" }, - "south": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" } - } - }, - { - "from": [ 5, 10, 12 ], - "to": [ 11, 12, 13 ], - "faces": { - "down": { "uv": [ 1, 1.5, 4, 2 ], "texture": "#texture" }, - "up": { "uv": [ 1, 7, 4, 7.5 ], "texture": "#texture" }, - "north": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" }, - "south": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" } - } - }, - { - "from": [ 5, 12, 5 ], - "to": [ 11, 13, 11 ], - "faces": { - "up": { "uv": [ 1, 8, 4, 11 ], "texture": "#texture" }, - "north": { "uv": [ 5, 5.5, 8, 6 ], "texture": "#texture" }, - "south": { "uv": [ 5, 5.5, 8, 6 ], "texture": "#texture" }, - "west": { "uv": [ 5, 5.5, 8, 6 ], "texture": "#texture" }, - "east": { "uv": [ 5, 5.5, 8, 6 ], "texture": "#texture" } - } - }, - { - "from": [ 5, 13, 3 ], - "to": [ 11, 14, 4 ], - "faces": { - "down": { "uv": [ 1, 11.5, 4, 12 ], "texture": "#texture" }, - "up": { "uv": [ 1, 7, 4, 7.5 ], "texture": "#texture" }, - "north": { "uv": [ 1, 0, 4, 0.5 ], "texture": "#texture" }, - "south": { "uv": [ 1, 0, 4, 0.5 ], "texture": "#texture" } - } - }, - { - "from": [ 5, 13, 6 ], - "to": [ 6, 14, 10 ], - "faces": { - "up": { "uv": [ 3.5, 8.5, 4, 10.5 ], "texture": "#texture" }, - "north": { "uv": [ 7.5, 5, 8, 5.5 ], "texture": "#texture" }, - "south": { "uv": [ 5, 5, 5.5, 5.5 ], "texture": "#texture" }, - "west": { "uv": [ 5.5, 5, 7.5, 5.5 ], "texture": "#texture" } - } - }, - { - "from": [ 5, 13, 12 ], - "to": [ 11, 14, 13 ], - "faces": { - "down": { "uv": [ 1, 11.5, 4, 12 ], "texture": "#texture" }, - "up": { "uv": [ 1, 7, 4, 7.5 ], "texture": "#texture" }, - "north": { "uv": [ 1, 0, 4, 0.5 ], "texture": "#texture" }, - "south": { "uv": [ 1, 0, 4, 0.5 ], "texture": "#texture" } - } - }, - { - "from": [ 6, 13, 5 ], - "to": [ 10, 14, 6 ], - "faces": { - "up": { "uv": [ 1.5, 10.5, 3.5, 11 ], "texture": "#texture" }, - "north": { "uv": [ 5.5, 5, 7.5, 5.5 ], "texture": "#texture" }, - "west": { "uv": [ 5, 5, 5.5, 5.5 ], "texture": "#texture" }, - "east": { "uv": [ 7.5, 5, 8, 5.5 ], "texture": "#texture" } - } - }, - { - "from": [ 6, 13, 6 ], - "to": [ 10, 14, 10 ], - "faces": { - "up": { "uv": [ 1.5, 8.499999, 3.5, 10.5 ], "texture": "#texture" } - } - }, - { - "from": [ 6, 13, 10 ], - "to": [ 10, 14, 11 ], - "faces": { - "up": { "uv": [ 1.5, 8, 3.5, 8.5 ], "texture": "#texture" }, - "south": { "uv": [ 5.5, 5, 7.5, 5.5 ], "texture": "#texture" }, - "west": { "uv": [ 5, 5, 5.5, 5.5 ], "texture": "#texture" }, - "east": { "uv": [ 7.5, 5, 8, 5.5 ], "texture": "#texture" } - } - }, - { - "from": [ 10, 13, 6 ], - "to": [ 11, 14, 10 ], - "faces": { - "up": { "uv": [ 1, 8.5, 1.5, 10.5 ], "texture": "#texture" }, - "north": { "uv": [ 5, 5, 5.5, 5.5 ], "texture": "#texture" }, - "south": { "uv": [ 7.5, 5, 8, 5.5 ], "texture": "#texture" }, - "east": { "uv": [ 5.5, 5, 7.5, 5.5 ], "texture": "#texture" } - } - }, - { - "from": [ 11, 1, 3 ], - "to": [ 12, 14, 4 ], - "faces": { - "up": { "uv": [ 0.5, 11.5, 1, 12 ], "texture": "#texture" }, - "north": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "south": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" }, - "west": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 11, 1, 12 ], - "to": [ 12, 14, 13 ], - "faces": { - "up": { "uv": [ 0.5, 7, 1, 7.5 ], "texture": "#texture" }, - "north": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "south": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" }, - "west": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 12, 1, 3 ], - "to": [ 13, 14, 4 ], - "faces": { - "up": { "uv": [ 0, 11.5, 0.5, 12 ], "texture": "#texture" }, - "north": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 12, 1, 4 ], - "to": [ 13, 14, 5 ], - "faces": { - "up": { "uv": [ 0, 11, 0.5, 11.5 ], "texture": "#texture" }, - "south": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" }, - "west": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 12, 1, 5 ], - "to": [ 13, 2, 11 ], - "faces": { - "up": { "uv": [ 0.5, 1.5, 1, 4.5 ], "texture": "#texture" }, - "west": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 12, 1, 11 ], - "to": [ 13, 14, 12 ], - "faces": { - "up": { "uv": [ 0, 7.5, 0.5, 8 ], "texture": "#texture" }, - "north": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "west": { "uv": [ 0.5, 0, 1, 6.5 ], "texture": "#texture" }, - "east": { "uv": [ 4, 0, 4.5, 6.5 ], "texture": "#texture" } - } - }, - { - "from": [ 12, 1, 12 ], - "to": [ 13, 14, 13 ], - "faces": { - "up": { "uv": [ 0, 7, 0.5, 7.5 ], "texture": "#texture" }, - "south": { "uv": [ 0, 0, 0.5, 7 ], "texture": "#texture" }, - "east": { "uv": [ 0, 0, 0.5, 7 ], "texture": "#texture" } - } - }, - { - "from": [ 12, 10, 5 ], - "to": [ 13, 12, 11 ], - "faces": { - "down": { "uv": [ 0, 8, 0.5, 11 ], "texture": "#texture" }, - "up": { "uv": [ 0, 8, 0.5, 11 ], "texture": "#texture" }, - "west": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" }, - "east": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" } - } - }, - { - "from": [ 12, 13, 5 ], - "to": [ 13, 14, 11 ], - "faces": { - "down": { "uv": [ 1, 11.5, 4, 12 ], "texture": "#texture" }, - "up": { "uv": [ 1, 7, 4, 7.5 ], "texture": "#texture" }, - "west": { "uv": [ 1, 0, 4, 0.5 ], "texture": "#texture" }, - "east": { "uv": [ 1, 0, 4, 0.5 ], "texture": "#texture" } - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [ 75, 45, 0 ], - "translation": [ 0, 2.5, 0 ], - "scale": [ 0.375, 0.375, 0.375 ] - }, - "thirdperson_lefthand": { - "rotation": [ 75, 45, 0 ], - "translation": [ 0, 2.5, 0 ], - "scale": [ 0.375, 0.375, 0.375 ] - }, - "firstperson_righthand": { - "rotation": [ 0, 45, 0 ], - "scale": [ 0.4, 0.4, 0.4 ] - }, - "firstperson_lefthand": { - "rotation": [ 0, 45, 0 ], - "scale": [ 0.4, 0.4, 0.4 ] - }, - "gui": { - "rotation": [ 30, 225, 0 ], - "scale": [ 0.625, 0.625, 0.625 ] - }, - "head": { - "translation": [ 0, 12, 0 ], - "scale": [ 0.5, 0.5, 0.5 ] - }, - "ground": { - "translation": [ 0, 3, 0 ], - "scale": [ 0.25, 0.25, 0.25 ] - }, - "fixed": { - "scale": [ 0.5, 0.5, 0.5 ] - } - } -} \ No newline at end of file + "__comment": "Copyright © InsomniaKitten 2017", + "textures": { + "particle": "bloodmagic:blocks/BlankRune", + "texture": "bloodmagic:blocks/BloodTank" + }, + "elements": [ + { + "__comment": "Voxels-80FF00", + "from": [ 3, 0, 3 ], + "to": [ 13, 1, 13 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 5, 0, 10, 5 ], "texture": "#texture" }, + "north": { "uv": [ 0, 6.5, 5, 7 ], "texture": "#texture" }, + "south": { "uv": [ 0, 6.5, 5, 7 ], "texture": "#texture" }, + "west": { "uv": [ 0, 6.5, 5, 7 ], "texture": "#texture" }, + "east": { "uv": [ 0, 6.5, 5, 7 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF00FF", + "from": [ 3, 1, 3 ], + "to": [ 4, 14, 4 ], + "faces": { + "up": { "uv": [ 4.5, 11.5, 5, 12 ], "texture": "#texture" }, + "north": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF0000", + "from": [ 3, 1, 4 ], + "to": [ 4, 12, 5 ], + "faces": { + "up": { "uv": [ 4.5, 11, 5, 11.5 ], "texture": "#texture" }, + "south": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-71FFFF", + "from": [ 3, 1, 5 ], + "to": [ 4, 2, 11 ], + "faces": { + "up": { "uv": [ 0.5, 1.5, 1, 4.5 ], "texture": "#texture" }, + "west": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF0000", + "from": [ 3, 1, 11 ], + "to": [ 4, 12, 12 ], + "faces": { + "up": { "uv": [ 4.5, 7.5, 5, 8 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF00FF", + "from": [ 3, 1, 12 ], + "to": [ 4, 14, 13 ], + "faces": { + "up": { "uv": [ 4.5, 7, 5, 7.5 ], "texture": "#texture" }, + "north": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FFFF00", + "from": [ 3, 10, 5 ], + "to": [ 4, 12, 11 ], + "faces": { + "up": { "uv": [ 4.5, 8, 5, 11.5 ], "texture": "#texture" }, + "west": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" }, + "east": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF8000", + "from": [ 3, 13, 4 ], + "to": [ 4, 14, 12 ], + "faces": { + "down": { "uv": [ 0, 7.5, 0.5, 11.5 ], "texture": "#texture" }, + "up": { "uv": [ 4.5, 7.5, 5, 11.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 0, 4.5, 0.5 ], "texture": "#texture" }, + "east": { "uv": [ 0.5, 0, 4.5, 0.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF0000", + "from": [ 4, 1, 3 ], + "to": [ 5, 12, 4 ], + "faces": { + "up": { "uv": [ 4, 11.5, 4.5, 12 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF0000", + "from": [ 4, 1, 12 ], + "to": [ 5, 12, 13 ], + "faces": { + "up": { "uv": [ 4, 7, 4.5, 7.5 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-3AC6FF", + "from": [ 4, 11, 4 ], + "to": [ 12, 12, 12 ], + "faces": { + "down": { "uv": [ 5.5, 0.5, 9.5, 4.5 ], "texture": "#texture" }, + "up": { "uv": [ 5.5, 0.5, 9.5, 4.5 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 7.5, 4.5, 8 ], "texture": "#texture" }, + "south": { "uv": [ 0.5, 11, 4.5, 11.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 7.5, 1, 11.5 ], "texture": "#texture" }, + "east": { "uv": [ 4, 7.5, 4.5, 11.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-71FFFF", + "from": [ 5, 1, 3 ], + "to": [ 11, 2, 4 ], + "faces": { + "up": { "uv": [ 1, 1.5, 4, 2 ], "texture": "#texture" }, + "north": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-71FFFF", + "from": [ 5, 1, 12 ], + "to": [ 11, 2, 13 ], + "faces": { + "up": { "uv": [ 1, 1.5, 4, 2 ], "texture": "#texture" }, + "north": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FFFF00", + "from": [ 5, 10, 3 ], + "to": [ 11, 12, 4 ], + "faces": { + "down": { "uv": [ 1, 1.5, 4, 2 ], "texture": "#texture" }, + "up": { "uv": [ 1, 7, 4, 7.5 ], "texture": "#texture" }, + "north": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" }, + "south": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FFFF00", + "from": [ 5, 10, 12 ], + "to": [ 11, 12, 13 ], + "faces": { + "down": { "uv": [ 1, 1.5, 4, 2 ], "texture": "#texture" }, + "up": { "uv": [ 1, 7, 4, 7.5 ], "texture": "#texture" }, + "north": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" }, + "south": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF9571", + "from": [ 5, 12, 5 ], + "to": [ 11, 13, 11 ], + "faces": { + "up": { "uv": [ 1, 8, 4, 11 ], "texture": "#texture" }, + "north": { "uv": [ 5, 5.5, 8, 6 ], "texture": "#texture" }, + "south": { "uv": [ 5, 5.5, 8, 6 ], "texture": "#texture" }, + "west": { "uv": [ 5, 5.5, 8, 6 ], "texture": "#texture" }, + "east": { "uv": [ 5, 5.5, 8, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF8000", + "from": [ 4, 13, 3 ], + "to": [ 12, 14, 4 ], + "faces": { + "down": { "uv": [ 0.5, 11.5, 4.5, 12 ], "texture": "#texture" }, + "up": { "uv": [ 0.5, 7, 4.5, 7.5 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 0, 4.5, 0.5 ], "texture": "#texture" }, + "south": { "uv": [ 0.5, 0, 4.5, 0.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-EBAAFF", + "from": [ 5, 13, 6 ], + "to": [ 6, 14, 10 ], + "faces": { + "up": { "uv": [ 3.5, 8.5, 4, 10.5 ], "texture": "#texture" }, + "north": { "uv": [ 7.5, 5, 8, 5.5 ], "texture": "#texture" }, + "south": { "uv": [ 5, 5, 5.5, 5.5 ], "texture": "#texture" }, + "west": { "uv": [ 5.5, 5, 7.5, 5.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF8000", + "from": [ 4, 13, 12 ], + "to": [ 12, 14, 13 ], + "faces": { + "down": { "uv": [ 0.5, 11.5, 4.5, 12 ], "texture": "#texture" }, + "up": { "uv": [ 0.5, 7, 4.5, 7.5 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 0, 4.5, 0.5 ], "texture": "#texture" }, + "south": { "uv": [ 0.5, 0, 4.5, 0.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-EBAAFF", + "from": [ 6, 13, 5 ], + "to": [ 10, 14, 6 ], + "faces": { + "up": { "uv": [ 1.5, 10.5, 3.5, 11 ], "texture": "#texture" }, + "north": { "uv": [ 5.5, 5, 7.5, 5.5 ], "texture": "#texture" }, + "west": { "uv": [ 5, 5, 5.5, 5.5 ], "texture": "#texture" }, + "east": { "uv": [ 7.5, 5, 8, 5.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-5595FF", + "from": [ 6, 13, 6 ], + "to": [ 10, 14, 10 ], + "faces": { + "up": { "uv": [ 1.5, 8.499999, 3.5, 10.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-EBAAFF", + "from": [ 6, 13, 10 ], + "to": [ 10, 14, 11 ], + "faces": { + "up": { "uv": [ 1.5, 8, 3.5, 8.5 ], "texture": "#texture" }, + "south": { "uv": [ 5.5, 5, 7.5, 5.5 ], "texture": "#texture" }, + "west": { "uv": [ 5, 5, 5.5, 5.5 ], "texture": "#texture" }, + "east": { "uv": [ 7.5, 5, 8, 5.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-EBAAFF", + "from": [ 10, 13, 6 ], + "to": [ 11, 14, 10 ], + "faces": { + "up": { "uv": [ 1, 8.5, 1.5, 10.5 ], "texture": "#texture" }, + "north": { "uv": [ 5, 5, 5.5, 5.5 ], "texture": "#texture" }, + "south": { "uv": [ 7.5, 5, 8, 5.5 ], "texture": "#texture" }, + "east": { "uv": [ 5.5, 5, 7.5, 5.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF0000", + "from": [ 11, 1, 3 ], + "to": [ 12, 12, 4 ], + "faces": { + "up": { "uv": [ 0.5, 11.5, 1, 12 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 1, 1, 6.499999 ], "texture": "#texture" }, + "south": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF0000", + "from": [ 11, 1, 12 ], + "to": [ 12, 12, 13 ], + "faces": { + "up": { "uv": [ 0.5, 7, 1, 7.5 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF00FF", + "from": [ 12, 1, 3 ], + "to": [ 13, 14, 4 ], + "faces": { + "up": { "uv": [ 0, 11.5, 0.5, 12 ], "texture": "#texture" }, + "north": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF0000", + "from": [ 12, 1, 4 ], + "to": [ 13, 12, 5 ], + "faces": { + "up": { "uv": [ 0, 11, 0.5, 11.5 ], "texture": "#texture" }, + "south": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-71FFFF", + "from": [ 12, 1, 5 ], + "to": [ 13, 2, 11 ], + "faces": { + "up": { "uv": [ 0.5, 1.5, 1, 4.5 ], "texture": "#texture" }, + "west": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 1, 6, 4, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF0000", + "from": [ 12, 1, 11 ], + "to": [ 13, 12, 12 ], + "faces": { + "up": { "uv": [ 0, 7.5, 0.5, 8 ], "texture": "#texture" }, + "north": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 1, 1, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 4, 1, 4.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF00FF", + "from": [ 12, 1, 12 ], + "to": [ 13, 14, 13 ], + "faces": { + "up": { "uv": [ 0, 7, 0.5, 7.5 ], "texture": "#texture" }, + "north": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 0.5, 6.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FFFF00", + "from": [ 12, 10, 5 ], + "to": [ 13, 12, 11 ], + "faces": { + "down": { "uv": [ 0, 8, 0.5, 11 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 0.5, 11 ], "texture": "#texture" }, + "west": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" }, + "east": { "uv": [ 1, 1, 4, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Voxels-FF8000", + "from": [ 12, 13, 4 ], + "to": [ 13, 14, 12 ], + "faces": { + "down": { "uv": [ 4.5, 7.5, 5, 11.5 ], "texture": "#texture" }, + "up": { "uv": [ 0, 7.5, 0.5, 11.5 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 0, 4.5, 0.5 ], "texture": "#texture" }, + "east": { "uv": [ 0.5, 0, 4.5, 0.5 ], "texture": "#texture" } + } + }, + { + "__comment": "Cube33", + "from": [ 5, 2, 3 ], + "to": [ 11, 10, 4 ], + "faces": { + "north": { "uv": [ 1, 2, 4, 6 ], "texture": "#texture" }, + "south": { "uv": [ 1, 2, 4, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "Cube33", + "from": [ 3, 2, 5 ], + "to": [ 4, 10, 11 ], + "faces": { + "west": { "uv": [ 1, 2, 4, 6 ], "texture": "#texture" }, + "east": { "uv": [ 1, 2, 4, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "Cube33", + "from": [ 12, 2, 5 ], + "to": [ 13, 10, 11 ], + "faces": { + "west": { "uv": [ 1, 2, 4, 6 ], "texture": "#texture" }, + "east": { "uv": [ 1, 2, 4, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "Cube33", + "from": [ 5, 2, 12 ], + "to": [ 11, 10, 13 ], + "faces": { + "north": { "uv": [ 1, 2, 4, 6 ], "texture": "#texture" }, + "south": { "uv": [ 1, 2, 4, 6 ], "texture": "#texture" } + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [ 75, 45, 0 ], + "translation": [ 0, 2.5, 0 ], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "thirdperson_lefthand": { + "rotation": [ 75, 45, 0 ], + "translation": [ 0, 2.5, 0 ], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "scale": [ 0.4, 0.4, 0.4 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 45, 0 ], + "scale": [ 0.4, 0.4, 0.4 ] + }, + "gui": { + "rotation": [ 30, 225, 0 ], + "scale": [ 0.625, 0.625, 0.625 ] + }, + "head": { + "translation": [ 0, 12, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "ground": { + "translation": [ 0, 3, 0 ], + "scale": [ 0.25, 0.25, 0.25 ] + }, + "fixed": { + "scale": [ 0.5, 0.5, 0.5 ] + } + } +} diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/bloodtank.png b/src/main/resources/assets/bloodmagic/textures/blocks/bloodtank.png index 7c0348df62e99a88804c7510cee39157e10b3901..053e8280aa457c0f4fc20c1c963f995dc526ff01 100644 GIT binary patch delta 1043 zcmV+u1nm2d2dD^;B!BNoL_t(oh3%HRjvQ4GhQD*`%k0iB*ek;l7>S4g*`agGa$rY< zBs_oY{GkxFJd@ishU+dlr<^t6#;_r_Tr>V2nXTsOuW%9H*zJG=EKl_a194M@L8RoL#_d zN|6{NT5Beg3EpR#re;2$le3@{7-NYs()T?%XRNi%=X12yXszkG4iRB8nQRjK48YZ^ zpRR6&7!%GpmdhnoRk63X&tfrWcXyZL<71RkSZhfsVT>WAgw`4n!5G6jlNSb%bLQpC z=V)y)M&q0##(&7k$!p%cc|+g#93Fl`+qQV`M~QOIIOj$%IcG#`d6--y?*8h!A5W z=SR843d<*li@3&zCF~3*e0U_26|~tG&G`vI5vN4FHqLgiDt$vA@61bUI}^opNw+ zK;QQp1Anlkv`WDB-~b^6y!U+3&$wJUcBVD+6lvp<=Y!|B7bhcQBC_#0&?U2V>eug$ zu_&duTse$VEK;IUiXg&=?!4w(H6rgl%Vo#)>(?a&PhHnkt|H}3-*+q)3&Kjq%!-9o1t_Hy#+Y%A zY-_rz&bn6!k;P)k+qZw=eZaYjoHL8XlD;2EBJ8Z1R>{81fKmwx(;Iu zMk$^SfnQ&~=9d>I9CtmMchm3av(MFf&6j}d3~VJqIrTngoPsQZRtl{YUIg#`ICkNT z_A-jgdbSPqBY?6@09>gYUw(X;LB z51d5-ry*jkWj33g`=|sfR{^$_1SutAjNJR-=dlT`Z#p?=c6WCPA#m%~Egn63G|Ew! zEB#;_Q#Wtkl&<$X$t$B!RhD7|f1cyI6Rz5T!KZw9+b`(T~`@(cg~ N002ovPDHLkV1hiP|3Lr% delta 888 zcmV-;1Bd*m2#*JlB!5;(L_t(oh3%G2P9#SVg};c*>=q+++XfHv9WWLWS3pRH&Ftq0 zv$2H4Az1qYBjyNRvSiDT#0}UW4IYFLKhsr}8D7wlF7Q~Q+g|ddma6|UUc7h_k+QnF zY5*bvfSHkV#>@~ALI{*nxVgE(%urPTa?ZpU5fMr$s4Art&VSF(9}jvVB0$qLsH*tk zF-Dx!!^4C5=XZB^lv0Q>(sdoGimFz^8}_gIp?a3 zs}@3-Iruc$$ap+vGMS*N^&k&oW?Wrep{ke}rIadrO6duiN6s@6D5cPK9k;i)a(sMj zr4(6PTLWM)7=N(1xM)DlHpW;<K`xNEKryBm zSQY5Hj#5fB9#EBWk~0zLF|Y1DJUldi??K&kULyB`ca1ADE8;h5XX2Xj*dbwK}`&y85iD z+}_^u%YWz3d}&)geEi68IP{VsB5ZDMx^gpYBZQHi~&JFB?YGwiedwY8|bKnUH5n*R%ha|$? zv}L!qx9b7@i8zl3qNDqCAy|LXdAMsf6g zzMK--j6bK+FAoO9sS-f_?s=B~S%I$W2qB;%oKGekTwPJj_;qQCp9TYBjKmn(zqt6v z>Cz)OHv!)TZ7C!XiWw?`iqM$RG|iJG<5#u*ePJHyD*?aD0W7D)ySH!Y%=j)w!Z$MV zEOGm;_Y28f%gEdCOV?3=A5-G{7!lxRI*^{jgY`@Byc{n@^zHWH)2AoP#iyE=Xk%jo zfP;gBYP$dBPADSm?(Wv$Ap|Cq3B%#A27lgaE`R?< Date: Sat, 4 Feb 2017 22:44:57 -0800 Subject: [PATCH 026/595] No-spam messages should be handled on the main thread (#1035) (cherry picked from commit 305e001) --- src/main/java/WayofTime/bloodmagic/util/ChatUtil.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java index 100d5b30..ba5ff465 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java @@ -260,9 +260,14 @@ public class ChatUtil public static class Handler implements IMessageHandler { @Override - public IMessage onMessage(PacketNoSpamChat message, MessageContext ctx) + public IMessage onMessage(final PacketNoSpamChat message, MessageContext ctx) { - sendNoSpamMessages(message.chatLines); + Minecraft.getMinecraft().addScheduledTask(new Runnable() { + @Override + public void run() { + sendNoSpamMessages(message.chatLines); + } + }); return null; } } From 86ea69eaca72f6c9415d47855875ed49ea565a4f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 5 Feb 2017 11:58:23 -0800 Subject: [PATCH 027/595] Temporarily remove item rendering for tank fluid You cannot bake GL stuff. This is bad. Also it got broken at one point. I'll re-add this once I remove the need for a TESR. (cherry picked from commit 13228f6) --- .../render/model/BakedCustomItemModel.java | 205 ------------------ .../render/model/CustomModelFactory.java | 80 ------- .../util/handler/event/ClientHandler.java | 9 +- 3 files changed, 1 insertion(+), 293 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/model/BakedCustomItemModel.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/model/CustomModelFactory.java diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/BakedCustomItemModel.java b/src/main/java/WayofTime/bloodmagic/client/render/model/BakedCustomItemModel.java deleted file mode 100644 index 4529d6f7..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/BakedCustomItemModel.java +++ /dev/null @@ -1,205 +0,0 @@ -package WayofTime.bloodmagic.client.render.model; - -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.block.BlockBloodTank; -import WayofTime.bloodmagic.client.render.block.RenderBloodTank; -import WayofTime.bloodmagic.tile.TileBloodTank; -import com.google.common.collect.ImmutableMap; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.VertexBuffer; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ItemCameraTransforms; -import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; -import net.minecraft.client.renderer.block.model.ItemOverrideList; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.client.renderer.vertex.VertexFormat; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; -import net.minecraftforge.client.model.IPerspectiveAwareModel; -import net.minecraftforge.common.model.TRSRTransformation; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fml.relauncher.ReflectionHelper; -import org.apache.commons.lang3.tuple.Pair; - -import javax.vecmath.Matrix4f; -import javax.vecmath.Vector3f; -import java.util.List; -import java.util.Map; - -/** - * Shamelessly taken off of the Mekanism repository written by {@author aidancbrady} - * https://github.com/aidancbrady/Mekanism - */ -public class BakedCustomItemModel implements IPerspectiveAwareModel -{ - private IBakedModel baseModel; - private ItemStack stack; - - private TransformType prevTransform; - - private static VertexFormat prevFormat = null; - private static int prevMode = -1; - - private static final RenderBloodTank tankRenderer = (RenderBloodTank) TileEntityRendererDispatcher.instance.mapSpecialRenderers.get(TileBloodTank.class); - - public BakedCustomItemModel(IBakedModel model, ItemStack stack) - { - this.baseModel = model; - this.stack = stack; - } - - private void doRender(TransformType transformType) - { - Block block = Block.getBlockFromItem(stack.getItem()); - - if (transformType == TransformType.GUI) - { - GlStateManager.rotate(180F, 0.0F, 1.0F, 0.0F); - } - - if (block instanceof BlockBloodTank) - { - GlStateManager.pushMatrix(); - - FluidStack fluid = null; - float capacity = TileBloodTank.CAPACITIES[stack.getItemDamage()] * Fluid.BUCKET_VOLUME; - int amount = 0; - if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.TANK)) - { - NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); - fluid = FluidStack.loadFluidStackFromNBT(tag); - if (fluid != null) - amount = tag.getInteger("Amount"); - } - - if (fluid != null && amount > 0) - tankRenderer.renderFluid(amount / capacity, fluid.getFluid(), -0.498, -0.49, -0.498); - - GlStateManager.popMatrix(); - } - } - - @Override - public List getQuads(IBlockState state, EnumFacing side, long rand) - { - Tessellator tessellator = Tessellator.getInstance(); - pauseRenderer(tessellator); - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5F, 0.5F, 0.5F); - GlStateManager.rotate(180, 0.0F, 1.0F, 0.0F); - Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); - doRender(prevTransform); - GlStateManager.enableLighting(); - GlStateManager.enableLight(0); - GlStateManager.enableLight(1); - GlStateManager.enableColorMaterial(); - GlStateManager.colorMaterial(1032, 5634); - GlStateManager.enableCull(); - GlStateManager.popMatrix(); - - resumeRenderer(tessellator); - - return baseModel.getQuads(state, side, rand); - } - - @Override - public boolean isAmbientOcclusion() - { - return baseModel.isAmbientOcclusion(); - } - - @Override - public boolean isGui3d() - { - return baseModel.isGui3d(); - } - - @Override - public boolean isBuiltInRenderer() - { - return baseModel.isBuiltInRenderer(); - } - - @Override - public TextureAtlasSprite getParticleTexture() - { - return baseModel.getParticleTexture(); - } - - @Override - public ItemCameraTransforms getItemCameraTransforms() - { - return baseModel.getItemCameraTransforms(); - } - - private static TRSRTransformation get(float tx, float ty, float tz, float ax, float ay, float az, float s) - { - return new TRSRTransformation(new Vector3f(tx / 16, ty / 16, tz / 16), TRSRTransformation.quatFromXYZDegrees(new Vector3f(ax, ay, az)), new Vector3f(s, s, s), null); - } - - public static Map transforms = ImmutableMap.builder() - .put(TransformType.GUI, get(0, 0, 0, 30F, 225F, 0, 0.625F)) - .put(TransformType.THIRD_PERSON_RIGHT_HAND, get(0, 2.5F, 0, 75F, 45F, 0, 0.375F)) - .put(TransformType.THIRD_PERSON_LEFT_HAND, get(0, 2.5F, 0, 75F, 45F, 0, 0.375F)) - .put(TransformType.FIRST_PERSON_RIGHT_HAND, get(0, 0, 0, 0, 45F, 0, 0.4f)) - .put(TransformType.FIRST_PERSON_LEFT_HAND, get(0, 0, 0, 0, 225F, 0, 0.4F)) - .put(TransformType.GROUND, get(0, 2F, 0, 0, 0, 0, 0.25F)) - .put(TransformType.HEAD, get(0, 0, 0, 0, 0, 0, 1F)) - .put(TransformType.FIXED, get(0, 0, 0, 0, 0, 0, 1F)) - .put(TransformType.NONE, get(0, 0, 0, 0, 0, 0, 0)) - .build(); - - @Override - public Pair handlePerspective(ItemCameraTransforms.TransformType cameraTransformType) - { - prevTransform = cameraTransformType; - return Pair.of(this, transforms.get(cameraTransformType).getMatrix()); - } - - @Override - public ItemOverrideList getOverrides() - { - return ItemOverrideList.NONE; - } - - public static void pauseRenderer(Tessellator tess) - { - if (isDrawing(tess)) - { - prevFormat = tess.getBuffer().getVertexFormat(); - prevMode = tess.getBuffer().getDrawMode(); - tess.draw(); - } - } - - public static void resumeRenderer(Tessellator tess) - { - if (prevFormat != null) - { - tess.getBuffer().begin(prevMode, prevFormat); - } - - prevFormat = null; - prevMode = -1; - } - - public static boolean isDrawing(Tessellator tess) - { - return isDrawing(tess.getBuffer()); - } - - public static boolean isDrawing(VertexBuffer buffer) - { - return (Boolean) ReflectionHelper.getPrivateValue(VertexBuffer.class, buffer, "isDrawing", "field_179010_r"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/CustomModelFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/model/CustomModelFactory.java deleted file mode 100644 index cddd3773..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/CustomModelFactory.java +++ /dev/null @@ -1,80 +0,0 @@ -package WayofTime.bloodmagic.client.render.model; - -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.block.model.*; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; - -public class CustomModelFactory implements IBakedModel -{ - private IBakedModel baseModel; - - private BlockOverrideList override = new BlockOverrideList(); - - public CustomModelFactory(IBakedModel base) - { - baseModel = base; - } - - @Override - public ItemOverrideList getOverrides() - { - return override; - } - - @Override - public List getQuads(IBlockState state, EnumFacing facing, long rand) - { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isAmbientOcclusion() - { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isGui3d() - { - return baseModel.isGui3d(); - } - - @Override - public boolean isBuiltInRenderer() - { - throw new UnsupportedOperationException(); - } - - @Override - public TextureAtlasSprite getParticleTexture() - { - throw new UnsupportedOperationException(); - } - - @Override - public ItemCameraTransforms getItemCameraTransforms() - { - throw new UnsupportedOperationException(); - } - - private class BlockOverrideList extends ItemOverrideList - { - public BlockOverrideList() - { - super(new ArrayList()); - } - - @Override - public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) - { - return new BakedCustomItemModel(baseModel, stack); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 84b699ea..80c825f4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -7,7 +7,6 @@ import java.util.Map; import java.util.Set; import WayofTime.bloodmagic.client.key.KeyBindings; -import WayofTime.bloodmagic.client.render.model.CustomModelFactory; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.renderer.GlStateManager; @@ -218,12 +217,6 @@ public class ClientHandler @SubscribeEvent public void onModelBake(ModelBakeEvent event) { - ModelResourceLocation location = new ModelResourceLocation("bloodmagic:BlockBloodTank", "inventory"); - IBakedModel model = event.getModelRegistry().getObject(location); - - if (model != null) - event.getModelRegistry().putObject(location, new CustomModelFactory(model)); - if (BloodMagic.isDev() && SUPPRESS_ASSET_ERRORS) return; @@ -381,7 +374,7 @@ public class ClientHandler public static void renderRitualStones(TileMasterRitualStone masterRitualStone, float partialTicks) { EntityPlayerSP player = minecraft.player; - World world = player.world; + World world = player.getEntityWorld(); EnumFacing direction = mrsHoloDirection; Ritual ritual = mrsHoloRitual; From d0e9174446686b13b3fcfdd1b11c032118951eac Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 5 Feb 2017 12:42:28 -0800 Subject: [PATCH 028/595] Bound tools should drain LP (#1033) (cherry picked from commit 59920ef) --- .../java/WayofTime/bloodmagic/item/ItemBoundSword.java | 9 +++++++++ .../java/WayofTime/bloodmagic/item/ItemBoundTool.java | 10 +++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 223c35d3..418f4d56 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -5,10 +5,12 @@ import java.util.List; import javax.annotation.Nullable; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; @@ -70,6 +72,13 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable return super.onItemRightClick(world, player, hand); } + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) + { + if (entity instanceof EntityPlayer && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) + NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage((EntityPlayer) entity, 20); + } + @Override public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 421e68af..4ecef2e2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.Set; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Strings; @@ -87,16 +88,19 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable } @Override - public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { - if (entityIn instanceof EntityPlayer && getActivated(stack) && isSelected && getBeingHeldDown(stack) && stack == ((EntityPlayer) entityIn).getActiveItemStack()) + if (entity instanceof EntityPlayer && getActivated(stack) && isSelected && getBeingHeldDown(stack) && stack == ((EntityPlayer) entity).getActiveItemStack()) { - EntityPlayer player = (EntityPlayer) entityIn; + EntityPlayer player = (EntityPlayer) entity; setHeldDownCount(stack, Math.min(player.getItemInUseCount(), chargeTime)); } else if (!isSelected) { setBeingHeldDown(stack, false); } + + if (entity instanceof EntityPlayer && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) + NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage((EntityPlayer) entity, 20); } protected int getHeldDownCount(ItemStack stack) From 9010cebc40e6724762dd6df6b1d64000132ad642 Mon Sep 17 00:00:00 2001 From: pksiazek Date: Mon, 6 Feb 2017 16:03:27 -0800 Subject: [PATCH 029/595] #1036 Fixed Living Armor sacrifical upgrade (#1037) (cherry picked from commit 6802bc5) --- .../api/util/helper/PlayerSacrificeHelper.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java index 8b7b5b5e..6379902f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.api.util.helper; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.altar.IBloodAltar; +import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; import WayofTime.bloodmagic.registry.ModPotions; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -10,6 +11,7 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; public class PlayerSacrificeHelper { @@ -70,8 +72,13 @@ public class PlayerSacrificeHelper if (health > maxHealth / 10.0) { float sacrificedHealth = health - maxHealth / 10.0f; + int lpAdded = (int) (sacrificedHealth * ConfigHandler.sacrificialDaggerConversion * getModifier(amount)); - if (findAndFillAltar(player.getEntityWorld(), player, (int) (sacrificedHealth * ConfigHandler.sacrificialDaggerConversion * getModifier(amount)), false)) + SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, (int) sacrificedHealth, lpAdded); + if (MinecraftForge.EVENT_BUS.post(evt)) + return false; + + if (findAndFillAltar(player.getEntityWorld(), player, evt.lpAdded, false)) { player.setHealth(maxHealth / 10.0f); setPlayerIncense(player, 0); From f135dab7ba297806210b35227278f1715024a056 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 01:18:16 -0800 Subject: [PATCH 030/595] IMC API for adding new altar components (#1039) CC @Drullkus (cherry picked from commit 8a8bff8) --- .../bloodmagic/altar/BloodAltar.java | 5 +++- .../bloodmagic/api/BloodMagicAPI.java | 24 +++++++++++++++++++ .../bloodmagic/util/handler/IMCHandler.java | 12 ++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index b045d664..e221ce56 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -129,9 +129,12 @@ public class BloodAltar implements IFluidHandler EnumAltarComponent component = ((IAltarComponent) worldBlock.getBlock()).getType(world, worldBlock.getState(), componentPos); if (component == null || component != altarComponent.getComponent()) return false; - } else if (worldBlock.getBlock() != Utils.getBlockForComponent(altarComponent.getComponent())) + } else if (worldBlock.getBlock() != Utils.getBlockForComponent(altarComponent.getComponent())) // Special case Vanilla { return false; + } else if (BloodMagicAPI.getAltarComponents().get(worldBlock.getState()) != null) // Mod compat + { + return BloodMagicAPI.getAltarComponents().get(worldBlock.getState()) == altarComponent.getComponent(); } } else { diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java index c65e63cd..f667db7d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java @@ -1,9 +1,11 @@ package WayofTime.bloodmagic.api; +import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.util.helper.LogHelper; import lombok.Getter; import lombok.Setter; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -40,6 +42,8 @@ public class BloodMagicAPI private static final Map entitySacrificeValues = new HashMap(); @Getter private static final ArrayList greenGroveBlacklist = new ArrayList(); + @Getter + private static final Map altarComponents = new HashMap(); @Getter @Setter @@ -261,4 +265,24 @@ public class BloodMagicAPI if (!greenGroveBlacklist.contains(block)) greenGroveBlacklist.add(block); } + + /** + * Marks an IBlockState as a specific {@link EnumAltarComponent} without needing to implement + * {@link WayofTime.bloodmagic.api.altar.IAltarComponent} on the block. + * + * IMC: + * {@code FMLInterModComs.sendMessage("BloodMagic", "altarComponent", "domain:name:meta:component")} + * Example: + * {@code FMLInterModComs.sendMessage("BloodMagic", "altarComponent", "minecraft:glowstone:0:GLOWSTONE")} + * + * @param state + * - The IBlockState for this component + * @param altarComponent + * - The EnumAltarComponent for this state + */ + public static void addAltarComponent(IBlockState state, EnumAltarComponent altarComponent) + { + if (!altarComponents.containsKey(state)) + altarComponents.put(state, altarComponent); + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java index 5f0dccf6..4f2de729 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.util.handler; import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; @@ -54,6 +55,17 @@ public class IMCHandler 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])); + } + } } } } From 7f50780d2f5a88638bdbb0ecfc21f0569e756ea6 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 01:36:01 -0800 Subject: [PATCH 031/595] Fix modid references in API javadoc --- .../bloodmagic/api/BloodMagicAPI.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java index f667db7d..8273047e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java @@ -30,6 +30,7 @@ import java.util.Map; *
      1. {@link #addToTeleposerBlacklist(BlockStack)}
      2. *
      3. {@link #blacklistFromGreenGrove(Block)}
      4. *
      5. {@link #setEntitySacrificeValue(Class, int)}
      6. + *
      7. {@link #addAltarComponent(IBlockState, EnumAltarComponent)}
      8. * */ public class BloodMagicAPI @@ -130,9 +131,9 @@ public class BloodMagicAPI * be changed via Configuration files. * * IMC: - * {@code FMLInterModComs.sendMessage("BloodMagic", "teleposerBlacklist", ItemStack)} + * {@code FMLInterModComs.sendMessage("bloodmagic", "teleposerBlacklist", ItemStack)} * Example: - * {@code FMLInterModComs.sendMessage("BloodMagic", "teleposerBlacklist", new ItemStack(Blocks.bedrock))} + * {@code FMLInterModComs.sendMessage("bloodmagic", "teleposerBlacklist", new ItemStack(Blocks.bedrock))} * * @param blockStack * - The BlockStack to blacklist. @@ -172,9 +173,9 @@ public class BloodMagicAPI * cannot be changed via Configuration files. * * IMC: - * {@code FMLInterModComs.sendMessage("BloodMagic", "transpositionBlacklist", ItemStack)} + * {@code FMLInterModComs.sendMessage("bloodmagic", "transpositionBlacklist", ItemStack)} * Example: - * {@code FMLInterModComs.sendMessage("BloodMagic", "transpositionBlacklist", new ItemStack(Blocks.bedrock))} + * {@code FMLInterModComs.sendMessage("bloodmagic", "transpositionBlacklist", new ItemStack(Blocks.bedrock))} * * @param blockStack * - The BlockStack to blacklist. @@ -218,9 +219,9 @@ public class BloodMagicAPI * The default value for any unset Entity is 500 LP per sacrifice. * * IMC: - * {@code FMLInterModComs.sendMessage("BloodMagic", "sacrificeValue", "ClassName;Value")} + * {@code FMLInterModComs.sendMessage("bloodmagic", "sacrificeValue", "ClassName;Value")} * Example: - * {@code FMLInterModComs.sendMessage("BloodMagic", "sacrificeValue", "EntityVillager;2000")} + * {@code FMLInterModComs.sendMessage("bloodmagic", "sacrificeValue", "EntityVillager;2000")} * * @param entityClass * - The class of the entity to blacklist. @@ -253,9 +254,9 @@ public class BloodMagicAPI * Blacklists a block from the Green Grove Ritual and Sigil. * * IMC: - * {@code FMLInterModComs.sendMessage("BloodMagic", "greenGroveBlacklist", "domain:name")} + * {@code FMLInterModComs.sendMessage("bloodmagic", "greenGroveBlacklist", "domain:name")} * Example: - * {@code FMLInterModComs.sendMessage("BloodMagic", "greenGroveBlacklist", "minecraft:wheat")} + * {@code FMLInterModComs.sendMessage("bloodmagic", "greenGroveBlacklist", "minecraft:wheat")} * * @param block * - Block to blacklist @@ -271,9 +272,9 @@ public class BloodMagicAPI * {@link WayofTime.bloodmagic.api.altar.IAltarComponent} on the block. * * IMC: - * {@code FMLInterModComs.sendMessage("BloodMagic", "altarComponent", "domain:name:meta:component")} + * {@code FMLInterModComs.sendMessage("bloodmagic", "altarComponent", "domain:name:meta:component")} * Example: - * {@code FMLInterModComs.sendMessage("BloodMagic", "altarComponent", "minecraft:glowstone:0:GLOWSTONE")} + * {@code FMLInterModComs.sendMessage("bloodmagic", "altarComponent", "minecraft:glowstone:0:GLOWSTONE")} * * @param state * - The IBlockState for this component From ac5cf521512b6aca607161d0ff31ee71456db9fc Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 01:39:19 -0800 Subject: [PATCH 032/595] Fix some model errors --- .../assets/bloodmagic/blockstates/blockdimensionalportal.json | 3 ++- .../resources/assets/bloodmagic/models/block/blockaltar.obj | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json b/src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json index 3ed3ae07..a1ec1631 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json +++ b/src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json @@ -7,7 +7,8 @@ "variants": { "meta": { "0": {"model": "bloodmagic:BlockDimensionalPortalNS"}, - "1": {"model": "bloodmagic:BlockDimensionalPortalEW"} + "1": {"model": "bloodmagic:BlockDimensionalPortalEW"}, + "2": {} } } } \ 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 802fd9a7..55f9cc3d 100644 --- a/src/main/resources/assets/bloodmagic/models/block/blockaltar.obj +++ b/src/main/resources/assets/bloodmagic/models/block/blockaltar.obj @@ -310,7 +310,6 @@ vn 0.996200 -0.087100 0.000000 vn 0.087100 0.996200 0.000000 vn -0.087100 -0.996200 0.000000 usemtl Meta -s off f 1/1/1 2/2/1 3/3/1 4/4/1 f 5/5/2 6/6/2 7/7/2 8/8/2 f 8/9/3 1/1/3 4/4/3 5/10/3 From 2db775346c32a02143334bf14d410b763ac93508 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 01:59:30 -0800 Subject: [PATCH 033/595] Fix crash when unblocking slot in alchemy table why way why `boolean[] blocked = new boolean[slotCount]` :I --- src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index c3e9a446..f976fac7 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -76,7 +76,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, { if (blockedSlots.contains(slot)) { - blockedSlots.remove(slot); + blockedSlots.remove((Object) slot); } else { blockedSlots.add(slot); From 1728ba7b83a5d310347d01d59b550c2724b508fe Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 11:09:39 -0800 Subject: [PATCH 034/595] Migrate alchemy table blocking to a boolean array --- .../bloodmagic/tile/TileAlchemyTable.java | 41 +++++-------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index f976fac7..0b643d2b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -37,7 +37,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public int ticksRequired = 1; public BlockPos connectedPos = BlockPos.ORIGIN; - public List blockedSlots = new ArrayList(); + public boolean[] blockedSlots = new boolean[] { false, false, false, false, false, false }; public TileAlchemyTable() { @@ -60,28 +60,14 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return isSlave(); } - public boolean isInputSlotAccessible(int slot) - { - if (slot < 6 && slot >= 0) - { - return !blockedSlots.contains(slot); - } - - return true; + public boolean isInputSlotAccessible(int slot) { + return !(slot < 6 && slot >= 0) || !blockedSlots[slot]; } public void toggleInputSlotAccessible(int slot) { if (slot < 6 && slot >= 0) - { - if (blockedSlots.contains(slot)) - { - blockedSlots.remove((Object) slot); - } else - { - blockedSlots.add(slot); - } - } + blockedSlots[slot] = !blockedSlots[slot]; } @Override @@ -96,12 +82,9 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, burnTime = tag.getInteger("burnTime"); ticksRequired = tag.getInteger("ticksRequired"); - blockedSlots.clear(); - int[] blockedSlotArray = tag.getIntArray("blockedSlots"); - for (int blocked : blockedSlotArray) - { - blockedSlots.add(blocked); - } + byte[] array = tag.getByteArray("blockedSlots"); + for (int i = 0; i < array.length; i++) + blockedSlots[i] = array[i] != 0; } @Override @@ -118,13 +101,11 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, tag.setInteger("burnTime", burnTime); tag.setInteger("ticksRequired", ticksRequired); - int[] blockedSlotArray = new int[blockedSlots.size()]; - for (int i = 0; i < blockedSlots.size(); i++) - { - blockedSlotArray[i] = blockedSlots.get(i); - } + byte[] blockedSlotArray = new byte[blockedSlots.length]; + for (int i = 0; i < blockedSlots.length; i++) + blockedSlotArray[i] = (byte) (blockedSlots[i] ? 1 : 0); - tag.setIntArray("blockedSlots", blockedSlotArray); + tag.setByteArray("blockedSlots", blockedSlotArray); return tag; } From b00fe38e02c4f3d495658a66f4a27c7a15cb2774 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 11:24:56 -0800 Subject: [PATCH 035/595] Update version + changelog --- changelog.txt | 14 ++++++++++++++ gradle.properties | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 20db1aa4..a4049ef9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,9 +1,23 @@ ------------------------------------------------------ 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 diff --git a/gradle.properties b/gradle.properties index bd15f2b6..75eadcb8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.0 +mod_version=2.1.1 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From b0d35577a98512d6166699998aed2898e9f46a64 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 16:11:55 -0800 Subject: [PATCH 036/595] Fix server crash when adding categories to book (#1046) --- .../compat/guideapi/GuideBloodMagic.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java index 159de39e..d8192078 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java @@ -13,7 +13,9 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.oredict.ShapelessOreRecipe; import javax.annotation.Nullable; @@ -45,11 +47,13 @@ public class GuideBloodMagic implements IGuideBook @Override public void handlePost(ItemStack bookStack) { - guideBook.addCategory(new CategoryItemStack(CategoryAlchemy.buildCategory(), "guide.bloodmagic.category.alchemy", new ItemStack(ModItems.ARCANE_ASHES))); - guideBook.addCategory(new CategoryItemStack(CategoryArchitect.buildCategory(), "guide.bloodmagic.category.architect", new ItemStack(ModItems.SIGIL_DIVINATION))); - guideBook.addCategory(new CategoryItemStack(CategoryDemon.buildCategory(), "guide.bloodmagic.category.demon", new ItemStack(ModItems.BLOOD_SHARD))); - guideBook.addCategory(new CategoryItemStack(CategoryRitual.buildCategory(), "guide.bloodmagic.category.ritual", new ItemStack(ModBlocks.RITUAL_CONTROLLER))); -// guideBook.addCategory(new CategoryItemStack(CategorySpell.buildCategory(), "guide.bloodmagic.category.spell", new ItemStack(ModItems.ritualDiviner))); + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { + guideBook.addCategory(new CategoryItemStack(CategoryAlchemy.buildCategory(), "guide.bloodmagic.category.alchemy", new ItemStack(ModItems.ARCANE_ASHES))); + guideBook.addCategory(new CategoryItemStack(CategoryArchitect.buildCategory(), "guide.bloodmagic.category.architect", new ItemStack(ModItems.SIGIL_DIVINATION))); + guideBook.addCategory(new CategoryItemStack(CategoryDemon.buildCategory(), "guide.bloodmagic.category.demon", new ItemStack(ModItems.BLOOD_SHARD))); + guideBook.addCategory(new CategoryItemStack(CategoryRitual.buildCategory(), "guide.bloodmagic.category.ritual", new ItemStack(ModBlocks.RITUAL_CONTROLLER))); +// guideBook.addCategory(new CategoryItemStack(CategorySpell.buildCategory(), "guide.bloodmagic.category.spell", new ItemStack(ModItems.ritualDiviner))); + } GameRegistry.addRecipe(new ShapelessOreRecipe(GuideAPI.getStackFromBook(GuideBloodMagic.guideBook), new ItemStack(Items.BOOK), Blocks.GLASS, Items.FEATHER)); } From 2b634e20f7ee3b562ebb6031b2cf4b7dd5220ffd Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 16:13:19 -0800 Subject: [PATCH 037/595] Update version + changelog --- changelog.txt | 5 +++++ gradle.properties | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index a4049ef9..d58a7c6f 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +------------------------------------------------------ +Version 2.1.2 +------------------------------------------------------ +- Fixed server crash when creating the guide entries + ------------------------------------------------------ Version 2.1.1-70 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 75eadcb8..5c6d2e20 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.1 +mod_version=2.1.2 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From 59c20971ab929f76f9132854bcabf2d2cfef8d02 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 16:14:58 -0800 Subject: [PATCH 038/595] Fix Curse version marking --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index f41cd6e5..aace816f 100644 --- a/build.gradle +++ b/build.gradle @@ -216,8 +216,7 @@ curseforge { releaseType = 'beta' relations curseRelations - addGameVersion '1.10' - addGameVersion '1.10.2' + addGameVersion '1.11.2' addArtifact javadocJar addArtifact sourceJar From c13be9ebce12683eeb535bbd1fdad8bf4c91a15b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 12 Feb 2017 17:00:18 -0800 Subject: [PATCH 039/595] Cache the bound SoulNetwork for rituals Avoids looking up the map data once or more each tick --- .../bloodmagic/api/ritual/IMasterRitualStone.java | 3 +++ .../bloodmagic/ritual/RitualAltarBuilder.java | 15 ++++++--------- .../bloodmagic/ritual/RitualAnimalGrowth.java | 9 +++------ .../bloodmagic/ritual/RitualCobblestone.java | 9 +++------ .../bloodmagic/ritual/RitualContainment.java | 7 ++----- .../bloodmagic/ritual/RitualCrushing.java | 11 ++++------- .../bloodmagic/ritual/RitualCrystalHarvest.java | 9 +++------ .../bloodmagic/ritual/RitualExpulsion.java | 9 +++------ .../bloodmagic/ritual/RitualFeatheredKnife.java | 9 +++------ .../bloodmagic/ritual/RitualFelling.java | 9 +++------ .../bloodmagic/ritual/RitualForsakenSoul.java | 9 +++------ .../bloodmagic/ritual/RitualFullStomach.java | 10 +++------- .../bloodmagic/ritual/RitualGreenGrove.java | 9 +++------ .../bloodmagic/ritual/RitualHarvest.java | 9 +++------ .../bloodmagic/ritual/RitualInterdiction.java | 7 ++----- .../bloodmagic/ritual/RitualJumping.java | 9 +++------ .../WayofTime/bloodmagic/ritual/RitualLava.java | 9 +++------ .../ritual/RitualLivingArmourDowngrade.java | 7 ++----- .../bloodmagic/ritual/RitualMagnetic.java | 10 +++------- .../WayofTime/bloodmagic/ritual/RitualMeteor.java | 7 ++----- .../WayofTime/bloodmagic/ritual/RitualPlacer.java | 11 ++++------- .../WayofTime/bloodmagic/ritual/RitualPump.java | 9 +++------ .../bloodmagic/ritual/RitualRegeneration.java | 9 +++------ .../WayofTime/bloodmagic/ritual/RitualSpeed.java | 7 ++----- .../bloodmagic/ritual/RitualSuppression.java | 7 ++----- .../WayofTime/bloodmagic/ritual/RitualWater.java | 9 +++------ .../bloodmagic/ritual/RitualWellOfSuffering.java | 9 +++------ .../WayofTime/bloodmagic/ritual/RitualZephyr.java | 9 +++------ .../bloodmagic/tile/TileMasterRitualStone.java | 11 ++++++++++- 29 files changed, 93 insertions(+), 164 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java index 076c820d..7ffecdb9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.api.ritual; import java.util.List; +import WayofTime.bloodmagic.api.saving.SoulNetwork; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; @@ -18,6 +19,8 @@ public interface IMasterRitualStone { String getOwner(); + SoulNetwork getOwnerNetwork(); + boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator, Ritual ritual); void performRitual(World world, BlockPos pos); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index 90a5e8a1..4a148a97 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -5,12 +5,10 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.AltarComponent; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.util.Utils; @@ -47,15 +45,14 @@ public class RitualAltarBuilder extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); TileEntity tileEntity = world.getTileEntity(masterRitualStone.getBlockPos().up()); BlockPos altarPos = masterRitualStone.getBlockPos().up(2); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -68,7 +65,7 @@ public class RitualAltarBuilder extends Ritual { world.setBlockState(altarPos, ModBlocks.ALTAR.getDefaultState()); lightning(world, altarPos); - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); } if (altarComponentsIterator.hasNext()) @@ -87,7 +84,7 @@ public class RitualAltarBuilder extends Ritual { world.setBlockState(currentPos, blockStack.getState(), 3); lightning(world, currentPos); - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); } break; } @@ -98,7 +95,7 @@ public class RitualAltarBuilder extends Ritual { world.setBlockState(currentPos, blockStack.getState(), 3); lightning(world, currentPos); - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); } break; } @@ -109,7 +106,7 @@ public class RitualAltarBuilder extends Ritual { world.setBlockState(currentPos, blockStack.getState(), 3); lightning(world, currentPos); - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); } break; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java index 7e7c7c19..525d0a93 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java @@ -20,9 +20,7 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.util.Utils; @@ -54,12 +52,11 @@ public class RitualAnimalGrowth extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -195,7 +192,7 @@ public class RitualAnimalGrowth extends Ritual WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveDrain, true); } - network.syphon(totalGrowths * getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(totalGrowths * getRefreshCost()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java index 7756789a..10f6a51f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.item.ItemComponent; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.block.Block; @@ -29,14 +27,13 @@ public class RitualCobblestone extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); TileEntity tileEntity = world.getTileEntity(masterRitualStone.getBlockPos().up()); Block block = Blocks.COBBLESTONE; if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -87,7 +84,7 @@ public class RitualCobblestone extends Ritual } } - network.syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java index d96561e3..2ee8aa2f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -27,12 +25,11 @@ public class RitualContainment extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index 3c11f58c..4fa14bc1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -28,9 +28,7 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.util.Utils; @@ -71,12 +69,11 @@ public class RitualCrushing extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -179,7 +176,7 @@ public class RitualCrushing extends Ritual WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, willDrain, true); corrosiveWill -= willDrain; - network.syphon(lpDrain); + masterRitualStone.getOwnerNetwork().syphon(lpDrain); currentEssence -= lpDrain; isBlockClaimed = true; @@ -249,7 +246,7 @@ public class RitualCrushing extends Ritual } world.destroyBlock(newPos, false); - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); hasOperated = true; if (consumeRawWill) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java index c2ee0625..0aa5202c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java @@ -7,13 +7,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.tile.TileDemonCrystal; public class RitualCrystalHarvest extends Ritual @@ -32,13 +30,12 @@ public class RitualCrystalHarvest extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos pos = masterRitualStone.getBlockPos(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -68,7 +65,7 @@ public class RitualCrystalHarvest extends Ritual } } - network.syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index 2e9cbe7f..1f746fa7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -24,8 +24,6 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.Utils; @@ -46,12 +44,11 @@ public class RitualExpulsion extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -90,7 +87,7 @@ public class RitualExpulsion extends Ritual continue; if (teleportRandomly(player, teleportDistance)) - network.syphon(getRefreshCost() * 1000); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * 1000); } allowedNames.clear(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index 8a1ef785..7f0b4e57 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -22,9 +22,7 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; @@ -62,12 +60,11 @@ public class RitualFeatheredKnife extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -195,7 +192,7 @@ public class RitualFeatheredKnife extends Ritual } } - network.syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); if (totalEffects > 0 && consumeRawWill) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawWillDrain, true); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java index 9ee51f61..c7a34326 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; @@ -44,8 +42,7 @@ public class RitualFelling extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos masterPos = masterRitualStone.getBlockPos(); AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); @@ -53,7 +50,7 @@ public class RitualFelling extends Ritual if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -74,7 +71,7 @@ public class RitualFelling extends Ritual if (blockPosIterator.hasNext() && tileInventory != null && tileInventory instanceof IInventory) { - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); currentPos = blockPosIterator.next(); placeInInventory(world.getBlockState(currentPos), world, currentPos, chestRange.getContainedPositions(masterPos).get(0)); world.setBlockToAir(currentPos); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 7ac7ad56..9d00ddca 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -19,8 +19,6 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.tile.TileDemonCrystal; public class RitualForsakenSoul extends Ritual @@ -84,13 +82,12 @@ public class RitualForsakenSoul extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos pos = masterRitualStone.getBlockPos(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -161,7 +158,7 @@ public class RitualForsakenSoul extends Ritual } } - network.syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); } /** diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java index 2a811bcd..3490031e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemFood; @@ -36,8 +34,7 @@ public class RitualFullStomach extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos pos = masterRitualStone.getBlockPos(); @@ -91,13 +88,12 @@ public class RitualFullStomach extends Ritual if (totalEffects >= maxEffects) { - network.causeNausea(); - + masterRitualStone.getOwnerNetwork().causeNausea(); break; } } - network.syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 658357ec..8ad1cfdd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -25,10 +25,8 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.util.Utils; @@ -67,12 +65,11 @@ public class RitualGreenGrove extends Ritual { World world = masterRitualStone.getWorldObj(); BlockPos pos = masterRitualStone.getBlockPos(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -234,7 +231,7 @@ public class RitualGreenGrove extends Ritual } } - network.syphon(totalGrowths * getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(totalGrowths * getRefreshCost()); } public double getPlantGrowthChanceForWill(double will) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java index ff366848..fb5065de 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java @@ -3,10 +3,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IHarvestHandler; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.registry.HarvestRegistry; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -37,13 +35,12 @@ public class RitualHarvest extends Ritual @Override public void performRitual(IMasterRitualStone masterRitualStone) { - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); World world = masterRitualStone.getWorldObj(); BlockPos pos = masterRitualStone.getBlockPos(); - if (network.getCurrentEssence() < getRefreshCost()) + if (masterRitualStone.getOwnerNetwork().getCurrentEssence() < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -61,7 +58,7 @@ public class RitualHarvest extends Ritual } } - network.syphon(getRefreshCost() * harvested); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * harvested); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java index a94d9f53..a9965c40 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -27,12 +25,11 @@ public class RitualInterdiction extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java index e2f1c1ec..e71dd53a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -28,12 +26,11 @@ public class RitualJumping extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -66,7 +63,7 @@ public class RitualJumping extends Ritual } } - network.syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java index 11bdb3b6..22e688c9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java @@ -26,10 +26,8 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.util.Utils; @@ -70,13 +68,12 @@ public class RitualLava extends Ritual { timer++; World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); int lpDrain = 0; if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -253,7 +250,7 @@ public class RitualLava extends Ritual WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrained, true); } - network.syphon(lpDrain); + masterRitualStone.getOwnerNetwork().syphon(lpDrain); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java index 3b144d8e..e1d3fe8a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java @@ -25,8 +25,6 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.util.ChatUtil; @@ -47,12 +45,11 @@ public class RitualLivingArmourDowngrade extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java index ddf403dc..972b7157 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java @@ -14,7 +14,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.Constants; @@ -23,8 +22,6 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.Utils; public class RitualMagnetic extends Ritual @@ -90,12 +87,11 @@ public class RitualMagnetic extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -149,7 +145,7 @@ public class RitualMagnetic extends Ritual if (isBlockOre(checkStack)) { Utils.swapLocations(world, newPos, world, replacement); - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); k++; this.lastPos = new BlockPos(i, j, k); return; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index cc690201..e115111a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -13,9 +13,7 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; import WayofTime.bloodmagic.meteor.MeteorRegistry; @@ -36,8 +34,7 @@ public class RitualMeteor extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos pos = masterRitualStone.getBlockPos(); @@ -71,7 +68,7 @@ public class RitualMeteor extends Ritual if (destructiveWill >= destructiveWillDrain && currentEssence >= 1000000000) { - network.syphon(1000000); + masterRitualStone.getOwnerNetwork().syphon(1000000); } else { masterRitualStone.setActive(false); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java index fdc32722..8f908a42 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import net.minecraft.block.Block; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemBlock; @@ -35,16 +33,15 @@ public class RitualPlacer extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); BlockPos masterPos = masterRitualStone.getBlockPos(); AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity tileEntity = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -76,7 +73,7 @@ public class RitualPlacer extends Ritual world.setBlockState(blockPos, Block.getBlockFromItem(itemHandler.getStackInSlot(inv).getItem()).getStateFromMeta(itemHandler.getStackInSlot(inv).getItemDamage())); itemHandler.extractItem(inv, 1, false); tileEntity.markDirty(); - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); } } } @@ -103,7 +100,7 @@ public class RitualPlacer extends Ritual world.setBlockState(blockPos, Block.getBlockFromItem(inventory.getStackInSlot(inv).getItem()).getStateFromMeta(inventory.getStackInSlot(inv).getItemDamage())); inventory.decrStackSize(inv, 1); inventory.markDirty(); - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); break; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index 2a7c9471..45e6a31d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import net.minecraft.block.BlockLiquid; import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; @@ -40,13 +38,12 @@ public class RitualPump extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); TileEntity tileEntity = world.getTileEntity(masterRitualStone.getBlockPos().up()); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -79,7 +76,7 @@ public class RitualPump extends Ritual if (blockPosIterator.hasNext()) { - network.syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); currentPos = blockPosIterator.next(); fluidHandler.fill(fluidHandler.drain(1000, false), true); world.setBlockState(currentPos, Blocks.STONE.getDefaultState()); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java index fb03fa79..8a3df796 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java @@ -18,9 +18,7 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; @@ -47,12 +45,11 @@ public class RitualRegeneration extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -165,7 +162,7 @@ public class RitualRegeneration extends Ritual WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrain, true); } - network.syphon(totalCost); + masterRitualStone.getOwnerNetwork().syphon(totalCost); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java index 12caf0bb..e2bccc13 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java @@ -16,9 +16,7 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; @@ -41,12 +39,11 @@ public class RitualSpeed extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java index 99037752..872e7964 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java @@ -7,13 +7,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.tile.TileSpectralBlock; import WayofTime.bloodmagic.util.Utils; @@ -31,12 +29,11 @@ public class RitualSuppression extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java index b359e788..ac8c8112 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -25,12 +23,11 @@ public class RitualWater extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -53,7 +50,7 @@ public class RitualWater extends Ritual } } - network.syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index 5f1fbb4f..46230416 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -3,9 +3,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -41,12 +39,11 @@ public class RitualWellOfSuffering extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -122,7 +119,7 @@ public class RitualWellOfSuffering extends Ritual } } - network.syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java index e8b2d377..7769fc49 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java @@ -15,8 +15,6 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.Utils; public class RitualZephyr extends Ritual @@ -38,8 +36,7 @@ public class RitualZephyr extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); - int currentEssence = network.getCurrentEssence(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos masterPos = masterRitualStone.getBlockPos(); AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); @@ -47,7 +44,7 @@ public class RitualZephyr extends Ritual { if (currentEssence < getRefreshCost()) { - network.causeNausea(); + masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -82,7 +79,7 @@ public class RitualZephyr extends Ritual } } - network.syphon(this.getRefreshCost() * Math.min(count, 100)); + masterRitualStone.getOwnerNetwork().syphon(this.getRefreshCost() * Math.min(count, 100)); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index dba2eb2a..0b361f9a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -38,6 +38,7 @@ import com.google.common.base.Strings; public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone { private String owner; + private SoulNetwork cachedNetwork; private boolean active; private boolean redstoned; private int activeTime; @@ -84,6 +85,8 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS public void deserialize(NBTTagCompound tag) { owner = tag.getString(Constants.NBT.OWNER_UUID); + if (!Strings.isNullOrEmpty(owner)) + cachedNetwork = NetworkHelper.getSoulNetwork(owner); currentRitual = RitualRegistry.getRitualForId(tag.getString(Constants.NBT.CURRENT_RITUAL)); if (currentRitual != null) { @@ -140,7 +143,6 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS activationCrystal = NBTHelper.checkNBT(activationCrystal); String crystalOwner = activationCrystal.getTagCompound().getString(Constants.NBT.OWNER_UUID); -// crystalOwner = PlayerHelper.getUUIDFromPlayer(activator).toString(); //Temporary patch job if (!Strings.isNullOrEmpty(crystalOwner) && ritual != null) { @@ -179,6 +181,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS this.active = true; this.owner = crystalOwner; + this.cachedNetwork = network; this.currentRitual = ritual; notifyUpdate(); @@ -281,6 +284,12 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS return owner; } + @Override + public SoulNetwork getOwnerNetwork() + { + return cachedNetwork; + } + @Override public World getWorld() { From 61bf9c1b086126a6204f3636012a6c745f681300 Mon Sep 17 00:00:00 2001 From: neconeco2 Date: Tue, 14 Feb 2017 05:12:45 +0900 Subject: [PATCH 040/595] Update ja_JP.lang (MC1.11) (#1050) --- .../assets/bloodmagic/lang/ja_JP.lang | 60 ++++++++++++++++--- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang index dbc0a372..e6b2b161 100644 --- a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang +++ b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang @@ -114,6 +114,10 @@ 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=è¡€ã®ãƒ©ãƒ³ãƒ—ã®å°ç«  @@ -178,6 +182,7 @@ 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=インスペクトリス・スカンダルム @@ -376,6 +381,7 @@ 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=éžã‚¢ã‚¯ãƒ†ã‚£ãƒ– @@ -393,7 +399,7 @@ 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.void.desc=&oクイックルワイパー(R)より素晴らã—ã„ï¼ tooltip.bloodmagic.sigil.greenGrove.desc=&o環境ã«ã‚„ã•ã—ã„ tooltip.bloodmagic.sigil.magnetism.desc=&oç§ã¯å¼•ã付ã‘る性格ã§ã™ tooltip.bloodmagic.sigil.suppression.desc=&o素晴らã—ã„念動力ã ... @@ -492,7 +498,7 @@ 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.repair=補修 tooltip.bloodmagic.livingArmour.upgrade.slowness=引ããšã‚‹è¶³ @@ -501,8 +507,9 @@ 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.digSlowdown=朽ã¡ãŸãƒ„ルãƒã‚· tooltip.bloodmagic.livingArmour.upgrade.stormTrooper=çªæ’ƒå…µ +tooltip.bloodmagic.livingArmour.upgrade.slowHeal=ç—…æ°— tooltip.bloodmagic.livingArmour.upgrade.level=%s (Lv %d) tooltip.bloodmagic.livingArmour.upgrade.progress=%s (%d/100) tooltip.bloodmagic.livingArmour.upgrade.points=&6強化ãƒã‚¤ãƒ³ãƒˆï¼š %s / %s @@ -529,6 +536,7 @@ tooltip.bloodmagic.itemFilter.oreDict=鉱石辞書を用ã„ã¦ãƒ•ィルタã—ã¾ tooltip.bloodmagic.fluid.type=液体を格ç´ã™ã‚‹ tooltip.bloodmagic.fluid.amount=é‡ tooltip.bloodmagic.fluid.capacity=æœ€å¤§å®¹é‡ +tooltip.bloodmagic.itemFilter.exact=液体フィルタ 入力/出力 tooltip.bloodmagic.ghost.everything=全㦠tooltip.bloodmagic.ghost.amount=幻影アイテムã®å€‹æ•°ï¼š %d個 @@ -545,7 +553,7 @@ tooltip.bloodmagic.currentBaseType.destructive=破壊性 tooltip.bloodmagic.currentBaseType.vengeful=報復性 tooltip.bloodmagic.currentBaseType.steadfast=䏿´»æ€§ -tooltip.bloodmagic.experienceTome=経験値を貯蔵ã™ã‚‹ã®ã«ç”¨ã„る本 +tooltip.bloodmagic.experienceTome=経験値を貯蔵ã™ã‚‹ãŸã‚ã«ç”¨ã„る本 tooltip.bloodmagic.experienceTome.exp=Exp: %0.3f tooltip.bloodmagic.experienceTome.expLevel=レベル: %d @@ -558,7 +566,7 @@ tooltip.bloodmagic.potion.uses=%d 回使用å¯èƒ½ tooltip.bloodmagic.book.shifting=紋様ãŒ... &oShiftã—ã¦... -tooltip.bloodmagic.willGauge=大気中ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«ã‚’測定ã§ãる奇妙ãªè£…置。 +tooltip.bloodmagic.willGauge=大気中ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«ã‚’測定ã™ã‚‹ãŸã‚ã®å¥‡å¦™ãªè£…置。 # Ritual ritual.bloodmagic.blockRange.tooBig=指定ã•れãŸãƒ–ロック範囲ãŒåºƒã™ãŽã¾ã™ï¼æœ€å¤§%sブロックã®ç¯„囲内ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ @@ -601,24 +609,52 @@ ritual.bloodmagic.fellingRitual=木ã“りã®ç²‰ç • ritual.bloodmagic.pumpRitual=サイフォンã®è®ƒæ­Œ ritual.bloodmagic.altarBuilderRitual=高ä½ç¥­å£‡æ§‹ç¯‰å„€å¼ ritual.bloodmagic.portalRitual=組ã¿è¾¼ã¿ã‚²ãƒ¼ãƒˆ -ritual.bloodmagic.downgradeRitual=弱化ã®å„€å¼ +ritual.bloodmagic.downgradeRitual=é‡ãé­‚ã®æ‡ºæ‚” ritual.bloodmagic.waterRitual.info=マスター儀å¼çŸ³ã‹ã‚‰æ°´æºã‚’生æˆã—ã¾ã™ã€‚ ritual.bloodmagic.lavaRitual.info=マスター儀å¼çŸ³ã‹ã‚‰æº¶å²©æºã‚’生æˆã—ã¾ã™ã€‚ -ritual.bloodmagic.greenGroveRitual.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=マスター儀å¼çŸ³ã®ä¸€å®šã‚¨ãƒªã‚¢å†…ã®ç”Ÿç‰©ã‚’排除ã—ã¦ä¾µå…¥ã§ããªã„よã†ã«ã—ã¾ã™ã€‚ @@ -641,7 +677,10 @@ 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=(䏿´»æ€§) 範囲内ã®è€•ã—ãŸãƒ–ロックを湿らã›ã€ã‚¨ãƒªã‚¢å‘¨è¾ºã«ã‚る種å­ã‚’æ¤ãˆä»˜ã‘る。 @@ -651,6 +690,7 @@ 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=(粉砕) å„€å¼ã¯ã“ã®ã‚¨ãƒªã‚¢å†…ã®ãƒ–ロックを破壊ã—ã¦å…¥æ‰‹ã—ã¾ã™ã€‚ @@ -665,6 +705,7 @@ 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ã¤ã ã‘ã«ãªã£ãŸå ´åˆã¯ç ´å£Šã—ãªã„。 @@ -688,6 +729,10 @@ 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 @@ -812,6 +857,7 @@ 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 From 8259676d1b59f8068dd9f20c72041c1b91d61310 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 13 Feb 2017 12:57:41 -0800 Subject: [PATCH 041/595] Downgrade tomes are now know that they're downgrades Also Disoriented is localized finally (cherry picked from commit e092161) --- .../bloodmagic/item/ItemUpgradeTome.java | 12 ++++++++++++ .../assets/bloodmagic/lang/en_US.lang | 19 ++++++++----------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index 62439d69..469b521a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -75,6 +75,18 @@ public class ItemUpgradeTome extends Item implements IVariantProvider return super.onItemRightClick(world, player, hand); } + @Override + public String getUnlocalizedName(ItemStack stack) { + if (!stack.hasTagCompound()) + return super.getUnlocalizedName(stack); + + LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); + if (upgrade != null && upgrade.isDowngrade()) + return "item." + Constants.Mod.MODID + ".downgradeTome"; + + return super.getUnlocalizedName(stack); + } + @Override @SideOnly(Side.CLIENT) public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index c7efae3f..50982019 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -1,6 +1,6 @@ #Creative Tab itemGroup.bloodmagic.creativeTab=Blood Magic -itemGroup.bloodmagic.creativeTabTome=Blood Magic Upgrade Tomes +itemGroup.bloodmagic.creativeTabTome=Blood Magic | Tomes #Items item.bloodmagic.activationCrystal.weak.name=Weak Activation Crystal @@ -162,6 +162,7 @@ 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 @@ -445,7 +446,7 @@ tooltip.bloodmagic.activationCrystal.weak=Activates low-level rituals tooltip.bloodmagic.activationCrystal.awakened=Activates more powerful rituals tooltip.bloodmagic.activationCrystal.creative=Creative Only - Activates any ritual -tooltip.bloodmagic.diviner.currentRitual=Current 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 @@ -533,10 +534,11 @@ 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.itemFilter.exact=Filters the fluid input/output + tooltip.bloodmagic.fluid.type=Fluid Contained tooltip.bloodmagic.fluid.amount=Amount tooltip.bloodmagic.fluid.capacity=Capacity -tooltip.bloodmagic.itemFilter.exact=Filters the fluid input/output tooltip.bloodmagic.ghost.everything=Everything tooltip.bloodmagic.ghost.amount=Ghost item amount: %d @@ -699,9 +701,9 @@ ritual.bloodmagic.fullStomachRitual.fillRange.info=(Feeding) The range that the 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.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.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. @@ -710,7 +712,7 @@ ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Crystal) Demon Crystals in th 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.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. @@ -779,11 +781,6 @@ chat.bloodmagic.mimic.potionSpawnRadius.down=Potion spawning radius has been dec entity.bloodmagic.SentientSpecter.name=Sentient Specter entity.bloodmagic.Mimic.name=Mimic -# sekrit - -secret.bloodmagic.bread.bloody=&r&cBloody Bread -secret.bloodmagic.bread.bloody.desc=Only for &odire &r&7emergencies. - # Commands commands.error.arg.invalid=Invalid arguments commands.error.arg.missing=Not enough arguments From d41e1a5a237f0fc525a1915810544d2f9eb0b337 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 13 Feb 2017 16:01:19 -0800 Subject: [PATCH 042/595] Update README (cherry picked from commit 9cbec7d) --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 663795cd..743d18a3 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,7 @@ Blood Magic is an arcane art that is practiced by mages who attempt to gather a ##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. Open a command window there and run `gradlew setupDevWorkspace` then (if you use Eclipse) `gradlew eclipse` or (if you use IDEA) `gradlew idea`. -3. This process will setup [Forge](http://www.minecraftforge.net/forum/), your workspace, and link [MineTweaker](http://minetweaker3.powerofbytes.com/) as a dependency. -4. Open the project in your IDE of choice. -5. Set `../src/api/java` as a source directory. +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 From cdb5127598cd469de70aa6292cc65f35f1ffeb21 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 13 Feb 2017 17:13:28 -0800 Subject: [PATCH 043/595] Fix ore doubling potentially adding invalid recipes (#1051) (cherry picked from commit 9027f76) --- src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 576a5ebc..5e47ff68 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -452,8 +452,9 @@ public class ModRecipes { String dustName = ore.replaceFirst("ore", "dust"); + List discoveredOres = OreDictionary.getOres(ore); List dustList = OreDictionary.getOres(dustName); - if (dustList != null && dustList.size() > 0) + if (dustList != null && !dustList.isEmpty() && discoveredOres != null && !discoveredOres.isEmpty()) { ItemStack dustStack = dustList.get(0).copy(); dustStack.setCount(2); From 49b8c40e6ab51cfd9bd48a2e424277a5295e37d5 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 13 Feb 2017 19:35:14 -0800 Subject: [PATCH 044/595] More proper fix for #1019 (cherry picked from commit 2ee2cc5) --- .../upgrade/LivingArmourUpgradeHealthboost.java | 4 +++- .../upgrade/LivingArmourUpgradeKnockbackResist.java | 7 +++++-- .../upgrade/LivingArmourUpgradeMeleeDamage.java | 4 +++- .../livingArmour/upgrade/LivingArmourUpgradeSpeed.java | 4 +++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java index 4dc51e55..78a4b71b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -10,6 +10,7 @@ import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import org.apache.commons.codec.binary.StringUtils; import java.util.UUID; @@ -34,7 +35,8 @@ public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(9423688, 1), "Health modifier" + 1, 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; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java index c59f4e48..430fe22f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -7,6 +7,7 @@ import com.google.common.collect.Multimap; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.nbt.NBTTagCompound; +import org.apache.commons.codec.binary.StringUtils; import java.util.UUID; @@ -26,11 +27,13 @@ public class LivingArmourUpgradeKnockbackResist extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.KNOCKBACK_RESISTANCE.getName(), new AttributeModifier(new UUID(895132, 1), "Knockback modifier" + 1, kbModifier[this.level], 0)); + 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) { - modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(952142, 1), "Health modifier" + 1, 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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java index 4bbe2fc7..cd228a13 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -10,6 +10,7 @@ import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import org.apache.commons.codec.binary.StringUtils; import java.util.UUID; @@ -34,7 +35,8 @@ public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(new UUID(9423688, 1), "damage modifier" + 1, meleeDamage[this.level], 0)); + String name = getUniqueIdentifier() + "-DamageModifier1"; + modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "DamageModifier1", meleeDamage[this.level], 0)); return modifierMap; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 6e591e7a..14ff3c55 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -15,6 +15,7 @@ import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import org.apache.commons.codec.binary.StringUtils; public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade { @@ -61,7 +62,8 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade if (healthModifier[this.level] > 0) { - modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(952142, 1), "Health modifier" + 1, 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; From 64bc427c1cc6087175d291fa760b94cbeb036c47 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 13 Feb 2017 19:38:08 -0800 Subject: [PATCH 045/595] Missed a couple files (cherry picked from commit f0e3aa6) --- .../downgrade/LivingArmourUpgradeMeleeDecrease.java | 4 +++- .../livingArmour/downgrade/LivingArmourUpgradeSlowness.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java index 76ec099f..fbbf800f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -12,6 +12,7 @@ import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import org.apache.commons.codec.binary.StringUtils; import java.util.UUID; @@ -36,7 +37,8 @@ public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(new UUID(271023, 5321), "damage modifier" + 2, meleeDamage[this.level], 1)); + String name = getUniqueIdentifier() + "-DamageModifier1"; + modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "DamageModifier1", meleeDamage[this.level], 1)); return modifierMap; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java index b516db11..ff1dce79 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -13,6 +13,7 @@ import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import org.apache.commons.codec.binary.StringUtils; public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade { @@ -29,7 +30,8 @@ public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade { Multimap modifierMap = HashMultimap.create(); - modifierMap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(new UUID(85472, 8502), "speed modifier" + 2, speedModifier[this.level], 1)); + String name = getUniqueIdentifier() + "-SpeedModifier1"; + modifierMap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "SpeedModifier1", speedModifier[this.level], 1)); return modifierMap; } From 72c321acb0dc2f038ab71cd0feeae2533de6bbf7 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 13 Feb 2017 19:35:14 -0800 Subject: [PATCH 046/595] Implement an inverted MRS that requires an RS signal to function (#1022) (cherry picked from commit ddb7542) --- .../bloodmagic/block/BlockRitualController.java | 14 +++++++++----- .../block/enums/EnumRitualController.java | 4 +++- .../provider/DataProviderRitualController.java | 6 ++++-- .../WayofTime/bloodmagic/registry/ModRecipes.java | 2 ++ .../bloodmagic/tile/TileMasterRitualStone.java | 14 ++++++++++++-- .../blockstates/blockritualcontroller.json | 5 +++++ .../resources/assets/bloodmagic/lang/en_US.lang | 3 +++ .../blocks/masterritualstone_inverted.png | Bin 0 -> 724 bytes 8 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/masterritualstone_inverted.png diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 5e6797db..8f6f1492 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -60,7 +60,7 @@ public class BlockRitualController extends BlockEnum imple ItemStack heldItem = player.getHeldItem(hand); TileEntity tile = world.getTileEntity(pos); - if (getMetaFromState(state) == 0 && tile instanceof TileMasterRitualStone) + if (state.getValue(getProperty()) != EnumRitualController.IMPERFECT && tile instanceof TileMasterRitualStone) { if (heldItem.getItem() == ModItems.ACTIVATION_CRYSTAL) { @@ -73,13 +73,15 @@ public class BlockRitualController extends BlockEnum imple if (((TileMasterRitualStone) tile).activateRitual(heldItem, player, RitualRegistry.getRitualForId(key))) { ((TileMasterRitualStone) tile).setDirection(direction); + if (state.getValue(getProperty()) == EnumRitualController.INVERTED) + ((TileMasterRitualStone) tile).setInverted(true); } } else { ChatUtil.sendNoSpamUnloc(player, "chat.bloodmagic.ritual.notValid"); } } - } else if (getMetaFromState(state) == 1 && tile instanceof TileImperfectRitualStone) + } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) { IBlockState determinerState = world.getBlockState(pos.up()); @@ -110,13 +112,15 @@ public class BlockRitualController extends BlockEnum imple } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(IBlockState state) + { return true; } @Override - public TileEntity createTileEntity(World world, IBlockState state) { - return state.getValue(getProperty()) == EnumRitualController.MASTER ? new TileMasterRitualStone() : new TileImperfectRitualStone(); + public TileEntity createTileEntity(World world, IBlockState state) + { + return state.getValue(getProperty()) != EnumRitualController.IMPERFECT ? new TileMasterRitualStone() : new TileImperfectRitualStone(); } // IVariantProvider diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java index 45b22b24..46250f3a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java @@ -7,7 +7,9 @@ import net.minecraft.util.IStringSerializable; public enum EnumRitualController implements IStringSerializable { MASTER, - IMPERFECT; + IMPERFECT, + INVERTED, + ; @Override public String toString() diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index a3bc6c1b..60100dad 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -47,7 +47,9 @@ public class DataProviderRitualController implements IWailaDataProvider { if (accessor.getBlock() instanceof BlockRitualController) { - if (accessor.getBlock().getMetaFromState(accessor.getBlockState()) == 0 && accessor.getTileEntity() instanceof TileMasterRitualStone) + int controllerMeta = accessor.getBlock().getMetaFromState(accessor.getBlockState()); + + if ((controllerMeta == 0 || controllerMeta == 2) && accessor.getTileEntity() instanceof TileMasterRitualStone) { TileMasterRitualStone mrs = (TileMasterRitualStone) accessor.getTileEntity(); @@ -63,7 +65,7 @@ public class DataProviderRitualController implements IWailaDataProvider } } - if (accessor.getBlock().getMetaFromState(accessor.getBlockState()) == 1 && accessor.getTileEntity() instanceof TileImperfectRitualStone) + if (controllerMeta == 1 && accessor.getTileEntity() instanceof TileImperfectRitualStone) { if (accessor.getWorld().isAirBlock(accessor.getPosition().up())) { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 5e47ff68..42ea9744 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -150,6 +150,8 @@ public class ModRecipes GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.RITUAL_STONE, 4), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', new ItemStack(ModItems.SLATE, 1, 1), 'c', OrbRegistry.getOrbStack(ModItems.ORB_APPRENTICE))); GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.RITUAL_CONTROLLER), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', ModBlocks.RITUAL_STONE, 'c', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.RITUAL_CONTROLLER, 1, 1), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', "stone", 'c', OrbRegistry.getOrbStack(ModItems.ORB_WEAK))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.RITUAL_CONTROLLER, 1, 2), new ItemStack(ModBlocks.RITUAL_CONTROLLER), new ItemStack(Blocks.REDSTONE_TORCH), new ItemStack(ModItems.SLATE))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.RITUAL_CONTROLLER), new ItemStack(ModBlocks.RITUAL_CONTROLLER, 1, 2))); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.BASE_ITEM_FILTER, 1, 0), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "blockGlass", 's', "stickWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.BASE_ITEM_FILTER, 1, 1), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyeYellow", 's', "stickWood")); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 0b361f9a..c1029098 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -46,6 +46,8 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS private Ritual currentRitual; @Setter private EnumFacing direction = EnumFacing.NORTH; + @Setter + private boolean inverted; private List currentActiveWillConfig = new ArrayList(); @@ -55,7 +57,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (getWorld().isRemote) return; - if (getWorld().isBlockPowered(getPos()) && isActive()) + if (isPowered() && isActive()) { active = false; redstoned = true; @@ -63,7 +65,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS return; } - if (!isActive() && !getWorld().isBlockPowered(getPos()) && isRedstoned() && getCurrentRitual() != null) + if (!isActive() && !isPowered() && isRedstoned() && getCurrentRitual() != null) { active = true; ItemStack crystalStack = NBTHelper.checkNBT(new ItemStack(ModItems.ACTIVATION_CRYSTAL, 1, getCurrentRitual().getCrystalLevel())); @@ -405,4 +407,12 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.void")); } } + + public boolean isPowered() + { + if (inverted) + return !getWorld().isBlockPowered(getPos()); + + return getWorld().isBlockPowered(getPos()); + } } diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json b/src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json index 784afa96..1b8b489e 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json +++ b/src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json @@ -16,6 +16,11 @@ "textures": { "all": "bloodmagic:blocks/ImperfectRitualStone" } + }, + "inverted": { + "textures": { + "all": "bloodmagic:blocks/MasterRitualStone_Inverted" + } } } } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 50982019..b27ec8f1 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -198,6 +198,7 @@ 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=&r&fAlchemy Array @@ -511,6 +512,8 @@ 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 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/masterritualstone_inverted.png b/src/main/resources/assets/bloodmagic/textures/blocks/masterritualstone_inverted.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba93d8b8bbf23394f1c72ef43134b7804402b8b GIT binary patch literal 724 zcmV;_0xSKAP)8=17)8%FKm3=dwKtaSA`7HRfHbLt0D6ZY@3wEXNE5h9k;2~CvQ1KyL~_WPNulf$ zT%3E)mECR^0Yo5#h=?EpF+vCd5dk713WzAB03n0`fC2da?vA_dmSuLFPDixXY`3>8 z%Z!Mk?|a5^z&Qt^sH%#`f1i1Nd&9&S`T3_G`SSTQ)>zD@rm8BMFMlEmPNy?vS>n9s zaOlar=Ve*=;g8?hHw{K9#lyn`Ns{uM@Vc!XASf0@YXOnM?&Q67v^QgRwYUs#0OFl#${od9UzzxJY`iNn+?y_qO%NR z49hYTiLBRa#?f(ebHl6Ag!36ajI?b>2mvLcSg&iWb6j10pss7QRv3hAtX32;l4S-FP!KtE9m~96j3tD?@pxjDdaCh%gQVT5Gzl$NPX%N>P;+ zcA5ZTY&$X{Z(pAH%=h z;gSS^@cu*ulGGw17!l#@X42n&CC_tKtD4j4$T*H*48~dx`xnZhr0qKD^@{uZd%o^p z5mCr)w~O9;wARGfIA}A$<5Ybu@BWSG%A@U!J4Pmw=8q)y)0000 Date: Mon, 13 Feb 2017 19:35:14 -0800 Subject: [PATCH 047/595] Update version + changelog --- changelog.txt | 9 +++++++++ gradle.properties | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index d58a7c6f..a3ee271d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,12 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 5c6d2e20..1546590b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.2 +mod_version=2.1.3 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From 5475549c186ea421e6f38814c0deef057150e300 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 19 Feb 2017 16:06:29 -0800 Subject: [PATCH 048/595] More null stack fixes --- .../api/recipe/AlchemyTableRecipe.java | 20 ++++++-------- .../api/soul/PlayerDemonWillHandler.java | 25 ++++++++---------- .../item/inventory/InventoryHolding.java | 6 ++--- .../item/inventory/ItemInventory.java | 6 ++--- .../AlchemyTableDyeableRecipe.java | 26 ++++++++++++------- .../WayofTime/bloodmagic/tile/TileMimic.java | 2 +- .../bloodmagic/tile/TileSoulForge.java | 2 +- .../util/handler/event/GenericHandler.java | 2 +- .../handler/event/StatTrackerHandler.java | 6 ++--- .../util/handler/event/WillHandler.java | 4 +-- 10 files changed, 49 insertions(+), 50 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java index c5d4dc03..e200c95e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java @@ -15,7 +15,7 @@ import net.minecraftforge.oredict.OreDictionary; public class AlchemyTableRecipe { - protected ItemStack output = null; + protected ItemStack output = ItemStack.EMPTY; protected ArrayList input = new ArrayList(); @Getter protected int lpDrained; @@ -97,11 +97,9 @@ public class AlchemyTableRecipe { ArrayList required = new ArrayList(input); - for (int x = 0; x < checkedList.size(); x++) + for (ItemStack slot : checkedList) { - ItemStack slot = checkedList.get(x); - - if (slot != null) + if (!slot.isEmpty()) { boolean inRecipe = false; @@ -109,14 +107,12 @@ public class AlchemyTableRecipe { boolean match = false; - Object next = aRequired; - - if (next instanceof ItemStack) + if (aRequired instanceof ItemStack) { - match = OreDictionary.itemMatches((ItemStack) next, slot, false); - } else if (next instanceof List) + match = OreDictionary.itemMatches((ItemStack) aRequired, slot, false); + } else if (aRequired instanceof List) { - Iterator itr = ((List) next).iterator(); + Iterator itr = ((List) aRequired).iterator(); while (itr.hasNext() && !match) { match = OreDictionary.itemMatches(itr.next(), slot, false); @@ -126,7 +122,7 @@ public class AlchemyTableRecipe if (match) { inRecipe = true; - required.remove(next); + required.remove(aRequired); break; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java index fb9944e9..12b7ebf2 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java @@ -29,15 +29,12 @@ public class PlayerDemonWillHandler for (ItemStack stack : inventory) { - if (stack != null) + if (stack.getItem() instanceof IDemonWill && ((IDemonWill) stack.getItem()).getType(stack) == type) { - 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); - } + souls += ((IDemonWill) stack.getItem()).getWill(type, stack); + } else if (stack.getItem() instanceof IDemonWillGem) + { + souls += ((IDemonWillGem) stack.getItem()).getWill(type, stack); } } @@ -78,7 +75,7 @@ public class PlayerDemonWillHandler boolean hasGem = false; for (ItemStack stack : inventory) { - if (stack != null && stack.getItem() instanceof IDemonWillGem) + if (stack.getItem() instanceof IDemonWillGem) { hasGem = true; if (((IDemonWillGem) stack.getItem()).getWill(type, stack) < ((IDemonWillGem) stack.getItem()).getMaxWill(type, stack)) @@ -145,11 +142,11 @@ public class PlayerDemonWillHandler for (ItemStack stack : inventory) { - if (stack != null && stack.getItem() instanceof IDemonWillGem) + if (stack.getItem() instanceof IDemonWillGem) { ItemStack newStack = ((IDemonWillGem) stack.getItem()).fillDemonWillGem(stack, willStack); - if (newStack == null) - return null; + if (newStack.isEmpty()) + return ItemStack.EMPTY; } } @@ -176,7 +173,7 @@ public class PlayerDemonWillHandler for (ItemStack stack : inventory) { - if (stack != null && stack.getItem() instanceof IDemonWillGem) + if (stack.getItem() instanceof IDemonWillGem) { remaining -= ((IDemonWillGem) stack.getItem()).fillWill(type, stack, remaining, true); if (remaining <= 0) @@ -209,7 +206,7 @@ public class PlayerDemonWillHandler for (ItemStack stack : inventory) { - if (stack != null && !stack.equals(ignored) && stack.getItem() instanceof IDemonWillGem) + if (!stack.equals(ignored) && stack.getItem() instanceof IDemonWillGem) { remaining -= ((IDemonWillGem) stack.getItem()).fillWill(type, stack, remaining, true); diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java index 60a8447a..c0030d76 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java @@ -17,15 +17,13 @@ public class InventoryHolding extends ItemInventory public InventoryHolding(ItemStack itemStack) { super(itemStack, ItemSigilHolding.inventorySize, "SigilOfHolding"); - -// readFromNBT(itemStack.getTagCompound()); } public void onGuiSaved(EntityPlayer entityPlayer) { masterStack = findParentStack(entityPlayer); - if (masterStack != null) + if (!masterStack.isEmpty()) { save(); } @@ -50,7 +48,7 @@ public class InventoryHolding extends ItemInventory } } - return null; + return ItemStack.EMPTY; } public void save() diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java index d27d816e..ff9a64e6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java @@ -25,7 +25,7 @@ public class ItemInventory implements IInventory this.name = name; this.masterStack = masterStack; - if (masterStack != null) + if (!masterStack.isEmpty()) this.readFromStack(masterStack); } @@ -150,13 +150,13 @@ public class ItemInventory implements IInventory @Override public ItemStack removeStackFromSlot(int slot) { - if (inventory[slot] != null) + if (!inventory[slot].isEmpty()) { ItemStack itemStack = inventory[slot]; setInventorySlotContents(slot, ItemStack.EMPTY); return itemStack; } - return null; + return ItemStack.EMPTY; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index d94d13bd..d3aef56e 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -66,7 +66,7 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe ItemStack tagOrDyeStack = inputList.get(nameTagOrDyeLocation); ItemStack inputStack = inputList.get(inputItemLocation); - if (inputStack == null || tagOrDyeStack == null) + if (inputStack.isEmpty() || tagOrDyeStack.isEmpty()) { return output.copy(); } @@ -106,19 +106,27 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe boolean hasNameTagOrDye = false; boolean hasInputItem = false; - for (ItemStack slot : checkedList) { - if (slot != null) { + for (ItemStack slot : checkedList) + { + if (!slot.isEmpty()) + { boolean match = OreDictionary.itemMatches(inputItem, slot, false); - if (match && hasInputItem) { + if (match && hasInputItem) + { return false; - } else if (match) { + } else if (match) + { hasInputItem = true; - } else { - if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) { - if (hasNameTagOrDye) { + } else + { + if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) + { + if (hasNameTagOrDye) + { return false; - } else { + } else + { hasNameTagOrDye = true; } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index a8257058..ba6d1158 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -127,7 +127,7 @@ public class TileMimic extends TileInventory implements ITickable //The potion flask is empty, therefore we have to reset the stored potion. if (!world.isRemote) { - setInventorySlotContents(1, null); + setInventorySlotContents(1, ItemStack.EMPTY); world.notifyBlockUpdate(pos, state, state, 3); ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionRemove")); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index a99b696c..1aa3cc29 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -223,7 +223,7 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil double souls = soul.drainWill(type, soulStack, requested); if (soul.getWill(type, soulStack) <= 0) { - setInventorySlotContents(soulSlot, null); + setInventorySlotContents(soulSlot, ItemStack.EMPTY); } return souls; } 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 a361f563..bd6cc5ac 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -493,7 +493,7 @@ public class GenericHandler { for (ItemStack stack : player.inventory.mainInventory) { - if (stack != null && stack.getItem() instanceof ItemExperienceBook) + if (stack.getItem() instanceof ItemExperienceBook) { ItemExperienceBook.addExperience(stack, event.getOrb().xpValue); event.getOrb().xpValue = 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 index 4cf9e5cb..4c320e72 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -54,7 +54,7 @@ public class StatTrackerHandler if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (chestStack != null && chestStack.getItem() instanceof ItemLivingArmour) + if (chestStack.getItem() instanceof ItemLivingArmour) { LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); @@ -133,7 +133,7 @@ public class StatTrackerHandler } else { ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (chestStack != null && chestStack.getItem() instanceof ItemSentientArmour) + if (chestStack.getItem() instanceof ItemSentientArmour) { ItemSentientArmour armour = (ItemSentientArmour) chestStack.getItem(); armour.onPlayerAttacked(chestStack, source, attackedPlayer); @@ -165,7 +165,7 @@ public class StatTrackerHandler if (player.getEntityWorld().getLight(player.getPosition()) <= 9) StatTrackerNightSight.incrementCounter(armour, amount); - if (mainWeapon != null && mainWeapon.getItem() instanceof ItemSpade) + if (mainWeapon.getItem() instanceof ItemSpade) StatTrackerGraveDigger.incrementCounter(armour, amount); if (player.isSprinting()) 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 5bd47c12..95c79bff 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -48,7 +48,7 @@ public class WillHandler public void onItemPickup(EntityItemPickupEvent event) { ItemStack stack = event.getItem().getEntityItem(); - if (stack != null && stack.getItem() instanceof IDemonWill) + if (stack.getItem() instanceof IDemonWill) { EntityPlayer player = event.getEntityPlayer(); EnumDemonWillType pickupType = ((IDemonWill) stack.getItem()).getType(stack); @@ -98,7 +98,7 @@ public class WillHandler { EntityPlayer player = (EntityPlayer) entity; ItemStack heldStack = player.getHeldItemMainhand(); - if (heldStack != null && heldStack.getItem() instanceof IDemonWillWeapon && !player.getEntityWorld().isRemote) + if (heldStack.getItem() instanceof IDemonWillWeapon && !player.getEntityWorld().isRemote) { IDemonWillWeapon demonWillWeapon = (IDemonWillWeapon) heldStack.getItem(); List droppedSouls = demonWillWeapon.getRandomDemonWillDrop(attackedEntity, player, heldStack, event.getLootingLevel()); From 58d11dfbdc00ae37e2d5071e68d7fbd206a4d1ae Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 20 Feb 2017 13:13:15 -0800 Subject: [PATCH 049/595] Fix Sigil of Holding crash when opening gui (#1056) --- .../item/inventory/ItemInventory.java | 41 ++++++++++--------- .../tile/routing/TileFilteredRoutingNode.java | 2 +- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java index ff9a64e6..36e7af47 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java @@ -7,20 +7,21 @@ import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; public class ItemInventory implements IInventory { protected int[] syncedSlots = new int[0]; - private ItemStack[] inventory; + private NonNullList inventory; private int size; private String name; protected ItemStack masterStack; public ItemInventory(ItemStack masterStack, int size, String name) { - this.inventory = new ItemStack[size]; + this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); this.size = size; this.name = name; this.masterStack = masterStack; @@ -51,7 +52,7 @@ public class ItemInventory implements IInventory public void readFromNBT(NBTTagCompound tagCompound) { NBTTagList tags = tagCompound.getTagList(Constants.NBT.ITEMS, 10); - inventory = new ItemStack[getSizeInventory()]; + inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); for (int i = 0; i < tags.tagCount(); i++) { @@ -60,9 +61,9 @@ public class ItemInventory implements IInventory NBTTagCompound data = tags.getCompoundTagAt(i); byte j = data.getByte(Constants.NBT.SLOT); - if (j >= 0 && j < inventory.length) + if (j >= 0 && j < inventory.size()) { - inventory[j] = new ItemStack(data); + inventory.set(i, new ItemStack(data)); } } } @@ -72,13 +73,13 @@ public class ItemInventory implements IInventory { NBTTagList tags = new NBTTagList(); - for (int i = 0; i < inventory.length; i++) + for (int i = 0; i < inventory.size(); i++) { - if ((inventory[i] != null) && !isSyncedSlot(i)) + if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) { NBTTagCompound data = new NBTTagCompound(); data.setByte(Constants.NBT.SLOT, (byte) i); - inventory[i].writeToNBT(data); + inventory.get(i).writeToNBT(data); tags.appendTag(data); } } @@ -117,28 +118,28 @@ public class ItemInventory implements IInventory @Override public ItemStack getStackInSlot(int index) { - return inventory[index]; + return inventory.get(index); } @Override public ItemStack decrStackSize(int index, int count) { - if (!inventory[index].isEmpty()) + if (!inventory.get(index).isEmpty()) { // if (!worldObj.isRemote) // worldObj.markBlockForUpdate(this.pos); - if (inventory[index].getCount() <= count) + if (inventory.get(index).getCount() <= count) { - ItemStack itemStack = inventory[index]; - inventory[index] = ItemStack.EMPTY; + ItemStack itemStack = inventory.get(index); + inventory.set(index, ItemStack.EMPTY); markDirty(); return itemStack; } - ItemStack itemStack = inventory[index].splitStack(count); - if (inventory[index].isEmpty()) - inventory[index] = ItemStack.EMPTY; + ItemStack itemStack = inventory.get(index).splitStack(count); + if (inventory.get(index).isEmpty()) + inventory.set(index, ItemStack.EMPTY); markDirty(); return itemStack; @@ -150,9 +151,9 @@ public class ItemInventory implements IInventory @Override public ItemStack removeStackFromSlot(int slot) { - if (!inventory[slot].isEmpty()) + if (!inventory.get(slot).isEmpty()) { - ItemStack itemStack = inventory[slot]; + ItemStack itemStack = inventory.get(slot); setInventorySlotContents(slot, ItemStack.EMPTY); return itemStack; } @@ -162,7 +163,7 @@ public class ItemInventory implements IInventory @Override public void setInventorySlotContents(int slot, ItemStack stack) { - inventory[slot] = stack; + inventory.set(slot, stack); if (stack.getCount() > getInventoryStackLimit()) stack.setCount(getInventoryStackLimit()); markDirty(); @@ -221,7 +222,7 @@ public class ItemInventory implements IInventory @Override public void clear() { - this.inventory = new ItemStack[size]; + this.inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java index 2fde0510..d63884c2 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java @@ -16,7 +16,7 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn public int currentActiveSlot = 0; public int[] priorities = new int[6]; - public ItemInventory itemInventory = new ItemInventory(null, 9, ""); + public ItemInventory itemInventory = new ItemInventory(ItemStack.EMPTY, 9, ""); public TileFilteredRoutingNode(int size, String name) { From 93d7efcb407d1f2a01839a8d8a75496fb434d125 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 20 Feb 2017 13:47:36 -0800 Subject: [PATCH 050/595] Fix crash when creating a tank stack with meta > 15 (#1057) Also finally fixes the tanks so they properly drop themselves. --- .../bloodmagic/block/BlockBloodTank.java | 28 +++++++++++++++---- .../compat/jei/BloodMagicPlugin.java | 3 +- .../waila/provider/DataProviderBloodTank.java | 13 ++++----- .../item/block/ItemBlockBloodTank.java | 22 +++++++-------- .../network/SigilHoldingPacketProcessor.java | 4 +-- .../assets/bloodmagic/lang/en_US.lang | 6 ++-- 6 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 664a3ddf..7af1f082 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockInteger; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileBloodTank; +import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -29,6 +30,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -88,6 +90,17 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider return false; } + @Override + public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity tile, ItemStack stack) { + super.harvestBlock(world, player, pos, state, tile, stack); + world.setBlockToAir(pos); + } + + @Override + public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) { + return willHarvest || super.removedByPlayer(state, world, pos, player, willHarvest); + } + @Override public boolean onBlockActivated(World world, BlockPos blockPos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { @@ -115,17 +128,19 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider @Override public List getDrops(IBlockAccess world, BlockPos pos, IBlockState blockState, int fortune) { - ArrayList list = new ArrayList(); + List list = Lists.newArrayList(); TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBloodTank) { TileBloodTank bloodTank = (TileBloodTank) tile; - ItemStack drop = new ItemStack(this); + ItemStack drop = new ItemStack(this, 1, bloodTank.getBlockMetadata()); NBTTagCompound tag = new NBTTagCompound(); - bloodTank.serialize(tag); + + if (bloodTank.getTank().getFluid() != null) + bloodTank.getTank().getFluid().writeToNBT(tag); + drop.setTagCompound(tag); - drop.setItemDamage(getMetaFromState(blockState)); list.add(drop); } @@ -138,11 +153,12 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBloodTank) { + TileBloodTank bloodTank = (TileBloodTank) tile; NBTTagCompound tag = stack.getTagCompound(); if (tag != null) { - ((TileBloodTank) tile).deserialize(tag); - blockState.withProperty(getProperty(), stack.getMetadata()); + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); + bloodTank.getTank().setFluid(fluidStack); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index 31f609e9..bfabaa27 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -5,7 +5,6 @@ import java.util.Map; import javax.annotation.Nonnull; import mezz.jei.api.*; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.api.Constants; @@ -90,6 +89,6 @@ public class BloodMagicPlugin extends BlankModPlugin @Override public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { - subtypeRegistry.useNbtForSubtypes(Item.getItemFromBlock(ModBlocks.BLOOD_TANK)); + } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index cbfa05b6..81c2891d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -44,16 +44,15 @@ public class DataProviderBloodTank implements IWailaDataProvider { TileBloodTank bloodTank = (TileBloodTank) accessor.getTileEntity(); NBTTagCompound tag = accessor.getNBTData(); - int capacity = tag.getInteger(Constants.NBT.ALTAR_CAPACITY); + int capacity = accessor.getNBTData().getInteger(Constants.NBT.ALTAR_CAPACITY); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.tier", bloodTank.getBlockMetadata() + 1)); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity") + ": " + capacity + "mB"); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity", capacity)); - tag = tag.getCompoundTag(Constants.NBT.TANK); - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); - if (!Strings.isNullOrEmpty(tag.getString("FluidName")) && fluidStack != null) + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag(Constants.NBT.TANK)); + if (fluidStack != null) { - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type") + ": " + fluidStack.getLocalizedName()); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + capacity + "mB"); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type", fluidStack.getLocalizedName())); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount", fluidStack.amount, capacity)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index d2169ec6..4d642d42 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -1,10 +1,8 @@ package WayofTime.bloodmagic.item.block; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.BlockBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -13,6 +11,7 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.MathHelper; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.fluids.*; import net.minecraftforge.fluids.capability.templates.FluidHandlerItemStack; @@ -39,10 +38,10 @@ public class ItemBlockBloodTank extends ItemBlock @Override public String getItemStackDisplayName(ItemStack stack) { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.TANK) && !stack.getTagCompound().getCompoundTag(Constants.NBT.TANK).getString("FluidName").equals("")) + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(stack.getTagCompound()); + if (fluidStack != null) { - NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); - return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1) + " (" + FluidStack.loadFluidStackFromNBT(tag).getLocalizedName() + ")"; + return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1) + " (" + fluidStack.getLocalizedName() + ")"; } else { @@ -54,15 +53,15 @@ public class ItemBlockBloodTank extends ItemBlock public void addInformation(ItemStack stack, EntityPlayer entityPlayer, List tooltip, boolean advanced) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1)); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity") + ": " + getCapacity(stack) + "mB"); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity", getCapacity(stack))); if (stack.hasTagCompound()) { - NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); + NBTTagCompound tag = stack.getTagCompound(); FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); - if (!Strings.isNullOrEmpty(tag.getString("FluidName")) && fluidStack != null) + if (fluidStack != null) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type") + ": " + fluidStack.getLocalizedName()); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + getCapacity(stack) + "mB"); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type", fluidStack.getLocalizedName())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount", fluidStack.amount, getCapacity(stack))); } } } @@ -77,7 +76,8 @@ public class ItemBlockBloodTank extends ItemBlock public int getCapacity(ItemStack container) { - return container != null && Block.getBlockFromItem(container.getItem()) instanceof BlockBloodTank ? TileBloodTank.CAPACITIES[container.getMetadata()] * Fluid.BUCKET_VOLUME : 0; + int meta = MathHelper.clamp(container.getItemDamage(), 0, TileBloodTank.CAPACITIES.length); + return !container.isEmpty() && Block.getBlockFromItem(container.getItem()) instanceof BlockBloodTank ? TileBloodTank.CAPACITIES[meta] * Fluid.BUCKET_VOLUME : 0; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java index de688e44..da7b1fcc 100644 --- a/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java @@ -39,14 +39,14 @@ public class SigilHoldingPacketProcessor implements IMessage, IMessageHandler -1 && message.slot < 9) { itemStack = ctx.getServerHandler().playerEntity.inventory.getStackInSlot(message.slot); } - if (itemStack != null) + if (!itemStack.isEmpty()) { ItemSigilHolding.cycleToNextSigil(itemStack, message.mode); } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index b27ec8f1..cf54f344 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -539,9 +539,9 @@ tooltip.bloodmagic.itemFilter.oreDict=Used to filter through the Ore Dictionary tooltip.bloodmagic.itemFilter.exact=Filters the fluid input/output -tooltip.bloodmagic.fluid.type=Fluid Contained -tooltip.bloodmagic.fluid.amount=Amount -tooltip.bloodmagic.fluid.capacity=Capacity +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 From da1bb01ff026f4c268c99c398e47b5361eb7b051 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 20 Feb 2017 14:15:41 -0800 Subject: [PATCH 051/595] Return past functionality to canCombine --- .../java/WayofTime/bloodmagic/util/Utils.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 00ece993..43f44f77 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -531,8 +531,8 @@ public class Utils } /** - * Used to determine if stack1 can be placed into stack2. If stack2 is null - * and stack1 isn't null, returns true. Ignores stack size + * 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 @@ -544,18 +544,7 @@ public class Utils @Deprecated public static boolean canCombine(ItemStack stack1, ItemStack stack2) { - return ItemHandlerHelper.canItemStacksStack(stack1, stack2); -// if (stack1.isEmpty() || stack1.isItemStackDamageable() ^ stack2.isItemStackDamageable()) -// { -// return false; -// } -// -// if (stack2.isEmpty()) -// { -// return true; -// } -// -// return stack1.getItem() == stack2.getItem() && stack1.getItemDamage() == stack2.getItemDamage() && ItemStack.areItemStackTagsEqual(stack1, stack2); + return stack1.isEmpty() && !stack2.isEmpty() || ItemHandlerHelper.canItemStacksStack(stack1, stack2); } /** From a7a6b1fddc46aba37a4be138fedb74b49d0aabed Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 21 Feb 2017 16:08:34 -0800 Subject: [PATCH 052/595] Fix oddity with comparators on Altars (#1058) *shakes fist at @Arcaratus* (cherry picked from commit 461c476) --- src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index e221ce56..e855aab5 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -400,7 +400,7 @@ public class BloodAltar implements IFluidHandler { BlockPos newPos = pos.offset(facing); IBlockState block = world.getBlockState(newPos); - block.getBlock().onNeighborChange(world, pos, newPos); + block.getBlock().onNeighborChange(world, newPos, pos); } } if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) From 91aeb4bf4854c78c6ca085d5f5d646fab798fcaa Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 21 Feb 2017 16:52:39 -0800 Subject: [PATCH 053/595] Update version + changelog --- changelog.txt | 9 +++++++++ gradle.properties | 4 ++-- .../util/handler/event/LivingArmourHandler.java | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/changelog.txt b/changelog.txt index a3ee271d..0ced6128 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,12 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 1546590b..4654e615 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.3 +mod_version=2.1.4 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 @@ -9,4 +9,4 @@ mappings_version=snapshot_20161212 jei_version=4.0.5.203 waila_version=1.8.5-B19 -guideapi_version=2.1.0-47 \ No newline at end of file +guideapi_version=2.1.0-50 \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index a4ef11d1..f41e1968 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -159,7 +159,7 @@ public class LivingArmourHandler } } - if (event.getItemStack() != null && event.getItemStack().getItemUseAction() == EnumAction.DRINK) + if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) { ItemStack drinkStack = event.getItemStack(); From 0927fa16f6c6a6e28c5bc3ff93ccc008a600ac10 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 22 Feb 2017 16:15:45 -0800 Subject: [PATCH 054/595] Special case RAW will when converting enums (cherry picked from commit e8f0194) --- .../WayofTime/bloodmagic/block/enums/EnumSubWillType.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java index f61e5366..d42e974c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java @@ -26,6 +26,11 @@ public enum EnumSubWillType implements IStringSerializable } public EnumDemonWillType getType() { - return EnumDemonWillType.valueOf(name()); + String name = name(); + + if (this == RAW) + name = EnumDemonWillType.DEFAULT.name(); + + return EnumDemonWillType.valueOf(name); } } From 88efd672d53450f5296281ab6dad12c1ed822c20 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 22 Feb 2017 16:25:06 -0800 Subject: [PATCH 055/595] Fix crash when using newly created toggle sigils (#1059) (cherry picked from commit b55b453) --- .../WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java index 8442bfc5..42ef9d80 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.iface.IActivatable; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import com.google.common.base.Strings; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -65,6 +66,10 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable @Override public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); + if (Strings.isNullOrEmpty(getOwnerUUID(stack)) || player.isSneaking()) // Make sure Sigils are bound before handling. Also ignores while toggling state + return EnumActionResult.PASS; + return (NetworkHelper.getSoulNetwork(getOwnerUUID(player.getHeldItem(hand))).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; } From 72bf53f8d336bf69741600ae26e96557039342e6 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 23 Feb 2017 19:45:09 -0800 Subject: [PATCH 056/595] Fix crash when teleposing Demon Will Crystals (#1062) (cherry picked from commit 970acd4) --- .../bloodmagic/block/BlockDemonCrystal.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 819df5e3..ff7e64ff 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -158,12 +158,16 @@ public class BlockDemonCrystal extends Block @Override public void breakBlock(World world, BlockPos pos, IBlockState state) { - TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); - EnumDemonWillType type = state.getValue(TYPE); - int number = tile.getCrystalCount(); + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof TileDemonCrystal) { + EnumDemonWillType type = state.getValue(TYPE); + int number = ((TileDemonCrystal) tile).getCrystalCount(); - spawnAsEntity(world, pos, getItemStackDropped(type, number)); - world.removeTileEntity(pos); + spawnAsEntity(world, pos, getItemStackDropped(type, number)); + world.removeTileEntity(pos); + } + + super.breakBlock(world, pos, state); } public static ItemStack getItemStackDropped(EnumDemonWillType type, int crystalNumber) From 40bac681901593ad8d43f2a8921c6c6c3e3f0c0d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 23 Feb 2017 20:01:07 -0800 Subject: [PATCH 057/595] Break early if activation crystal isn't bound Fixes annoying and usually false "not configured correctly" message. https://redd.it/5vte95 (cherry picked from commit 32668f7) --- .../bloodmagic/block/BlockRitualController.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 8f6f1492..3d5efaf9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -5,6 +5,8 @@ import java.util.List; import javax.annotation.Nullable; +import WayofTime.bloodmagic.api.iface.IBindable; +import com.google.common.base.Strings; import WayofTime.bloodmagic.block.base.BlockEnum; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -64,10 +66,13 @@ public class BlockRitualController extends BlockEnum imple { if (heldItem.getItem() == ModItems.ACTIVATION_CRYSTAL) { + IBindable bindable = (IBindable) heldItem.getItem(); + if (Strings.isNullOrEmpty(bindable.getOwnerName(heldItem))) + return false; + String key = RitualHelper.getValidRitual(world, pos); EnumFacing direction = RitualHelper.getDirectionOfRitual(world, pos, key); - // TODO: Give a message stating that this ritual is not a valid - // ritual. + // TODO: Give a message stating that this ritual is not a valid ritual. if (!key.isEmpty() && direction != null && RitualHelper.checkValidRitual(world, pos, key, direction)) { if (((TileMasterRitualStone) tile).activateRitual(heldItem, player, RitualRegistry.getRitualForId(key))) From 45faf421672f591540e332a936c6a5dd68297fc7 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 25 Feb 2017 14:07:11 -0800 Subject: [PATCH 058/595] Fix OBO when getting blood tank capacity (#1066) --- .../WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index 4d642d42..f270cdda 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -76,7 +76,7 @@ public class ItemBlockBloodTank extends ItemBlock public int getCapacity(ItemStack container) { - int meta = MathHelper.clamp(container.getItemDamage(), 0, TileBloodTank.CAPACITIES.length); + 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; } From 6ac31ba1e8b870ad2fbe66b57a2bd9d5121eeeff Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 25 Feb 2017 17:16:25 -0800 Subject: [PATCH 059/595] Dagger of Sacrifice should not work for FakePlayers (cherry picked from commit c4f9270) --- .../java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index 06ad4c91..fb23c81c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -12,6 +12,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.SoundCategory; +import net.minecraftforge.common.util.FakePlayer; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -37,6 +38,9 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider @Override public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + if (attacker instanceof FakePlayer) + return false; + if (target == null || attacker == null || attacker.getEntityWorld().isRemote || (attacker instanceof EntityPlayer && !(attacker instanceof EntityPlayerMP))) return false; From 8360041da20e45180889eddc185c505a035e1444 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 25 Feb 2017 18:00:17 -0800 Subject: [PATCH 060/595] Child mobs are now viable for sacrifice at half the rate (cherry picked from commit 719cff0) --- .../bloodmagic/item/ItemDaggerOfSacrifice.java | 11 ++++++++++- .../bloodmagic/ritual/RitualWellOfSuffering.java | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index fb23c81c..967218c8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -47,7 +48,10 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider if (!target.isNonBoss()) return false; - if (target.isChild() || target instanceof EntityPlayer) + if (target instanceof EntityPlayer) + return false; + + if (target.isChild() && !(target instanceof IMob)) return false; if (target.isDead || target.getHealth() < 0.5F) @@ -71,6 +75,11 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider lifeEssence = (int) (lifeEssence * (1 + PurificationHelper.getCurrentPurity((EntityAnimal) 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index 46230416..c914019f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -106,6 +106,9 @@ public class RitualWellOfSuffering extends Ritual if (BloodMagicAPI.getEntitySacrificeValues().containsKey(entityName)) lifeEssenceRatio = BloodMagicAPI.getEntitySacrificeValues().get(entityName); + if (entity.isChild()) + lifeEssenceRatio *= 0.5F; + tileAltar.sacrificialDaggerCall(lifeEssenceRatio, true); totalEffects++; From 4e7f0d12f9ff1260015c719c1c0cb9f4aaf199bd Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 27 Feb 2017 16:44:40 -0800 Subject: [PATCH 061/595] Fix Alchemy Table JEI compat being fundamentally wrong (#1069) (cherry picked from commit fedea85) --- .../AlchemyTableRecipeCategory.java | 34 ++++--------------- .../alchemyTable/AlchemyTableRecipeJEI.java | 4 ++- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java index a83e7896..d8306508 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -1,23 +1,21 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import WayofTime.bloodmagic.api.registry.OrbRegistry; 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 mezz.jei.api.recipe.BlankRecipeCategory; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; -public class AlchemyTableRecipeCategory implements IRecipeCategory +public class AlchemyTableRecipeCategory extends BlankRecipeCategory { private static final int OUTPUT_SLOT = 0; private static final int ORB_SLOT = 1; @@ -57,21 +55,7 @@ public class AlchemyTableRecipeCategory implements IRecipeCategory } @Override - public void drawExtras(Minecraft minecraft) - { - - } - - @Nullable - @Override - public IDrawable getIcon() - { - return null; - } - - @SuppressWarnings("unchecked") - @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) + public void setRecipe(IRecipeLayout recipeLayout, AlchemyTableRecipeJEI recipeWrapper, IIngredients ingredients) { IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); @@ -87,12 +71,8 @@ public class AlchemyTableRecipeCategory implements IRecipeCategory } } - if (recipeWrapper instanceof AlchemyTableRecipeJEI) - { - AlchemyTableRecipeJEI recipe = (AlchemyTableRecipeJEI) recipeWrapper; - guiItemStacks.set(ORB_SLOT, ingredients.getInputs(ItemStack.class).get(1)); - craftingGridHelper.setOutput(guiItemStacks, ingredients.getOutputs(ItemStack.class).get(0)); - craftingGridHelper.setInputs(guiItemStacks, ingredients.getInputs(ItemStack.class), 3, 2); - } + guiItemStacks.set(ORB_SLOT, OrbRegistry.getOrbsDownToTier(recipeWrapper.getRecipe().getTierRequired())); + guiItemStacks.set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); + craftingGridHelper.setInputs(guiItemStacks, ingredients.getInputs(ItemStack.class), 3, 2); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java index 9c258297..594f83ec 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import com.google.common.collect.Lists; import lombok.Getter; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; @@ -25,7 +26,7 @@ public class AlchemyTableRecipeJEI extends BlankRecipeWrapper public void getIngredients(IIngredients ingredients) { List> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); ingredients.setInputLists(ItemStack.class, expanded); - ingredients.setOutput(ItemStack.class, recipe.getRecipeOutput(new ArrayList())); + ingredients.setOutput(ItemStack.class, recipe.getRecipeOutput(Lists.newArrayList())); } @Override @@ -34,6 +35,7 @@ public class AlchemyTableRecipeJEI extends BlankRecipeWrapper ArrayList ret = new ArrayList(); if (mouseX >= 58 && mouseX <= 78 && mouseY >= 21 && mouseY <= 34) { + ret.add(TextHelper.localize("tooltip.bloodmagic.tier", recipe.getTierRequired())); ret.add(TextHelper.localize("jei.bloodmagic.recipe.lpDrained", recipe.getLpDrained())); ret.add(TextHelper.localize("jei.bloodmagic.recipe.ticksRequired", recipe.getTicksRequired())); } From 3cbfb0a40f8c4d5b66afa2e3c7843fb9c7260efe Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 27 Feb 2017 17:37:30 -0800 Subject: [PATCH 062/595] Sort rituals by component count to avoid conflicts (#1070) Large rituals can now use, for example, the Serenade of the Nether layout if wanted. (cherry picked from commit 0b93c11) --- .../java/WayofTime/bloodmagic/BloodMagic.java | 15 ++++----- .../api/registry/RitualRegistry.java | 33 ++++++++++++++++--- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index cf953fb3..1d862212 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic; import java.io.File; import WayofTime.bloodmagic.command.CommandBloodMagic; +import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.meteor.MeteorConfigHandler; import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; @@ -11,12 +12,7 @@ import net.minecraft.launchwrapper.Launch; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLInterModComms; -import net.minecraftforge.fml.common.event.FMLModIdMappingEvent; -import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.common.event.*; import net.minecraftforge.fml.common.network.NetworkRegistry; import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; @@ -105,8 +101,6 @@ public class BloodMagic proxy.preInit(); } - - @Mod.EventHandler public void init(FMLInitializationEvent event) { @@ -133,6 +127,11 @@ public class BloodMagic proxy.postInit(); } + @Mod.EventHandler + public void loadComplete(FMLLoadCompleteEvent event) { + RitualRegistry.orderLookupList(); + } + @Mod.EventHandler public void modMapping(FMLModIdMappingEvent event) { diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java index f348f630..cd389d37 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java @@ -6,20 +6,21 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class RitualRegistry { public static final Map enabledRituals = new HashMap(); private static final BiMap registry = HashBiMap.create(); + private static final List lookupList = new ArrayList(); /** * Ordered list for actions that depend on the order that the rituals were * registered in */ private static final ArrayList orderedIdList = new ArrayList(); + private static boolean locked; + /** * The safe way to register a new Ritual. * @@ -30,6 +31,13 @@ public class RitualRegistry */ public static void registerRitual(Ritual ritual, String id, boolean enabled) { + if (locked) + { + BloodMagicAPI.getLogger().error("This registry has been locked. Please register your ritual earlier."); + BloodMagicAPI.getLogger().error("If you reflect this, I will hunt you down. - TehNut"); + return; + } + if (ritual != null) { if (registry.containsKey(id)) @@ -109,7 +117,7 @@ public class RitualRegistry public static ArrayList getIds() { - return new ArrayList(registry.keySet()); + return new ArrayList(lookupList); } public static ArrayList getOrderedIds() @@ -121,4 +129,21 @@ public class RitualRegistry { return new ArrayList(registry.values()); } + + public static void orderLookupList() + { + locked = true; // Lock registry so no no rituals can be registered + lookupList.clear(); // Make sure it's empty + lookupList.addAll(registry.keySet()); + Collections.sort(lookupList, new Comparator() + { + @Override + public int compare(String o1, String o2) + { + Ritual ritual1 = registry.get(o1); + Ritual ritual2 = registry.get(o2); + return ritual1.getComponents().size() > ritual2.getComponents().size() ? -1 : 0; // Put earlier if bigger + } + }); + } } From f3d980ee89563b08808b068d7e4a1189afd3040c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 25 Feb 2017 17:59:10 -0800 Subject: [PATCH 063/595] Rewrite Hymn of Syphoning for caps Needs testing and needs to be optimized. (cherry picked from commit 3f24e46) --- .../bloodmagic/ritual/RitualPump.java | 68 ++++++++++--------- .../assets/bloodmagic/lang/en_US.lang | 2 +- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index 45e6a31d..48ef6552 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -2,28 +2,32 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.*; +import com.google.common.collect.Lists; import net.minecraft.block.BlockLiquid; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; 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.ArrayList; import java.util.Iterator; +import java.util.List; public class RitualPump extends Ritual { public static final String PUMP_RANGE = "pumpRange"; - private ArrayList liquidsCache; - private Iterator blockPosIterator; - - private boolean cached = false; - private BlockPos currentPos; + private List> liquidsCache; + private Iterator> blockPosIterator; public RitualPump() { @@ -31,7 +35,7 @@ public class RitualPump extends Ritual addBlockRange(PUMP_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-16, -16, -16), new BlockPos(17, 17, 17))); setMaximumVolumeAndDistanceOfRange(PUMP_RANGE, 0, 16, 16); - liquidsCache = new ArrayList(); + liquidsCache = Lists.newArrayList(); } @Override @@ -47,39 +51,39 @@ public class RitualPump extends Ritual return; } - if (tileEntity != null && tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN)) - { + if (tileEntity != null && tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN)) { IFluidHandler fluidHandler = tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (!cached || liquidsCache.isEmpty()) - { - if (fluidHandler.drain(1000, false) != null) - { - FluidStack fluidStack = fluidHandler.drain(1000, false); - if (fluidStack == null) - return; + IBlockState tankState = world.getBlockState(masterRitualStone.getBlockPos().up()); + int maxDrain = fluidHandler.getTankProperties()[0].getCapacity(); - for (BlockPos blockPos : getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) - { - if (!liquidsCache.contains(blockPos)) - { - if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock() == fluidStack.getFluid().getBlock() && world.getBlockState(blockPos).getValue(BlockLiquid.LEVEL) == 0) - { - liquidsCache.add(blockPos); - } - } + if (fluidHandler.getTankProperties()[0].getContents() != null && fluidHandler.getTankProperties()[0].getContents().amount >= maxDrain) + return; + + for (BlockPos pos : getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) { + IBlockState 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); } } - - cached = true; - blockPosIterator = liquidsCache.iterator(); } - if (blockPosIterator.hasNext()) - { + blockPosIterator = liquidsCache.iterator(); + if (blockPosIterator.hasNext()) { + Pair posInfo = blockPosIterator.next(); masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); - currentPos = blockPosIterator.next(); - fluidHandler.fill(fluidHandler.drain(1000, false), true); - world.setBlockState(currentPos, Blocks.STONE.getDefaultState()); + fluidHandler.fill(posInfo.getRight(), true); + world.setBlockState(posInfo.getLeft(), Blocks.STONE.getDefaultState()); + world.notifyBlockUpdate(posInfo.getLeft(), tankState, tankState, 3); blockPosIterator.remove(); } } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index cf54f344..2b382440 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -611,7 +611,7 @@ ritual.bloodmagic.meteorRitual=Mark of the Falling Tower 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.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 From 203a2f5fc7038aaad51d31ac9ae187a7df9b9082 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 25 Feb 2017 17:59:10 -0800 Subject: [PATCH 064/595] Fix off by 1 letter in inventory serialization (#1072) --- src/main/java/WayofTime/bloodmagic/tile/TileInventory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index e99970e5..acf47041 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -62,7 +62,7 @@ public class TileInventory extends TileBase implements IInventory if (j >= 0 && j < inventory.size()) { - inventory.set(i, new ItemStack(data)); + 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 } } } From 5e2ef61e07e5d621f0329191ab4fc6bb5cb3fc4d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 25 Feb 2017 17:59:10 -0800 Subject: [PATCH 065/595] Update changelog + version --- changelog.txt | 11 +++++++++++ gradle.properties | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 0ced6128..1c1edb00 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,14 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 4654e615..6ce6e060 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.4 +mod_version=2.1.5 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From b1670cdbd5d80b1b47aeff619e8562e2df6e58ab Mon Sep 17 00:00:00 2001 From: neconeco2 Date: Thu, 2 Mar 2017 20:32:55 -0800 Subject: [PATCH 066/595] Update ja_JP.lang (#1076) (cherry picked from commit 22354ea) --- .../assets/bloodmagic/lang/ja_JP.lang | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang index e6b2b161..6bc2153f 100644 --- a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang +++ b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang @@ -1,6 +1,6 @@ #Creative Tab itemGroup.bloodmagic.creativeTab=Blood Magic -itemGroup.bloodmagic.creativeTabTome=Blood Magic å¼·åŒ–ã®æ›¸ +itemGroup.bloodmagic.creativeTabTome=Blood Magic ¦ 書物 #Items item.bloodmagic.activationCrystal.weak.name=å¼±ã„起動クリスタル @@ -162,6 +162,7 @@ item.bloodmagic.ritualReader.name=å„€å¼ã®èª¿æ•´å™¨ item.bloodmagic.arcaneAshes.name=秘儀ã®ç° item.bloodmagic.upgradeTome.name=ç”Ÿä½“ã‚¢ãƒ¼ãƒžãƒ¼å¼·åŒ–ã®æ›¸ +item.bloodmagic.downgradeTome.name=ç”Ÿä½“ã‚¢ãƒ¼ãƒžãƒ¼å¼±åŒ–ã®æ›¸ item.bloodmagic.upgradeTrainer.name=生体アーマー養æˆãƒ–レスレット item.bloodmagic.sentientSword.name=ç†åŠ›ã®å‰£ @@ -197,6 +198,7 @@ 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=&r&f錬金術魔法陣 @@ -261,11 +263,11 @@ 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.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=é•·ã„è…食性ã®çŸ³ãƒ¬ãƒ³ã‚¬ @@ -381,7 +383,7 @@ tooltip.bloodmagic.orb.owner=以下ã«ã‚ˆã‚‹è¿½åŠ è¦ç´ ï¼š %s tooltip.bloodmagic.currentOwner=ç¾åœ¨ã®æ‰€æœ‰è€…: %s tooltip.bloodmagic.currentTier=祭壇ã®ã‚°ãƒ¬ãƒ¼ãƒ‰ï¼š %d tooltip.bloodmagic.config.disabled=ç¾åœ¨configã«ã‚ˆã‚Šç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ -tooltip.bloodmagic.tier=グレード %d +tooltip.bloodmagic.tier=グレード%d tooltip.bloodmagic.activated=アクティブ tooltip.bloodmagic.deactivated=éžã‚¢ã‚¯ãƒ†ã‚£ãƒ– @@ -509,7 +511,9 @@ 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.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 @@ -533,10 +537,11 @@ tooltip.bloodmagic.itemFilter.ignoreNBT=NBTã‚¿ã‚°ã§ãƒ•ィルタã—ã¾ã™ tooltip.bloodmagic.itemFilter.modItems=特定MODã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’フィルタã—ã¾ã™ tooltip.bloodmagic.itemFilter.oreDict=鉱石辞書を用ã„ã¦ãƒ•ィルタã—ã¾ã™ -tooltip.bloodmagic.fluid.type=液体を格ç´ã™ã‚‹ -tooltip.bloodmagic.fluid.amount=é‡ -tooltip.bloodmagic.fluid.capacity=æœ€å¤§å®¹é‡ -tooltip.bloodmagic.itemFilter.exact=液体フィルタ 入力/出力 +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個 @@ -779,11 +784,6 @@ chat.bloodmagic.mimic.potionSpawnRadius.down=ãƒãƒ¼ã‚·ãƒ§ãƒ³ç”Ÿæˆã®åŠ¹æžœç¯„ entity.bloodmagic.SentientSpecter.name=ç†åŠ›ã®éœŠé­‚ entity.bloodmagic.Mimic.name=ミミック -# sekrit - -secret.bloodmagic.bread.bloody=&r&cè¡€ã®ãƒ‘ン -secret.bloodmagic.bread.bloody.desc=&o切迫ã—ãŸ&r&7緊急時専用 - # Commands commands.error.arg.invalid=無効ãªå¼•æ•°ã§ã™ commands.error.arg.missing=引数ãŒè¶³ã‚Šã¾ã›ã‚“ From fd54ab04588b859d1d4189d82be23019cae3d25a Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 3 Mar 2017 16:45:53 -0800 Subject: [PATCH 067/595] Fix tartaric gem returning null (#1068) --- src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index 16d5ef87..a77b0f0d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -180,7 +180,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I setWill(thisType, soulGemStack, newSoulsLeft); if (soul.getWill(thisType, soulStack) <= 0) { - return null; + return ItemStack.EMPTY; } } } From 58db36033a192873705f9b34e9fe7e8c414ee5f5 Mon Sep 17 00:00:00 2001 From: majikguy Date: Fri, 3 Mar 2017 16:57:04 -0800 Subject: [PATCH 068/595] Fixed a typo that made stage 4 of the Body Builder upgrade 5x as difficult as stage 5. (#1080) (cherry picked from commit 9540df7) --- .../bloodmagic/livingArmour/tracker/StatTrackerFood.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java index e32e7e38..18f1964f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java @@ -19,7 +19,7 @@ public class StatTrackerFood extends StatTracker { public static Map lastFoodEatenMap = new HashMap(); - public static int[] foodRequired = new int[] { 100, 200, 300, 5000, 1000 }; + public static int[] foodRequired = new int[] { 100, 200, 300, 500, 1000 }; public int foodEaten = 0; From 4e5bc46e21e99adc4c460bf99f8387ad295c7ce3 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 3 Mar 2017 17:21:36 -0800 Subject: [PATCH 069/595] Fix JEI not displaying armor tomes --- .../java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index bfabaa27..247c91d3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -89,6 +89,6 @@ public class BloodMagicPlugin extends BlankModPlugin @Override public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { - + subtypeRegistry.useNbtForSubtypes(ModItems.UPGRADE_TOME); } } From f083e4e036f8b60bc182b8c5b11e7b8e7f884538 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 5 Mar 2017 10:28:06 -0800 Subject: [PATCH 070/595] Fix Sigil of Holding (#1081) --- .../client/hud/HUDElementHolding.java | 17 +-- .../item/sigil/ItemSigilHolding.java | 120 +++++++----------- .../util/handler/event/ClientHandler.java | 4 +- 3 files changed, 58 insertions(+), 83 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java index 7e397955..f56e2cbc 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java @@ -13,7 +13,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderGameOverlayEvent; -import javax.annotation.Nullable; +import java.util.List; public class HUDElementHolding extends HUDElement { @@ -43,15 +43,12 @@ public class HUDElementHolding extends HUDElement ingameGui.drawTexturedModalRect(resolution.getScaledWidth() / 2 + 99 + (currentSlot * 20) + getXOffset(), resolution.getScaledHeight() - 23 + getYOffset(), 0, 22, 24, 24); RenderHelper.enableGUIStandardItemLighting(); - ItemStack[] holdingInv = ItemSigilHolding.getInternalInventory(sigilHolding); + List holdingInv = ItemSigilHolding.getInternalInventory(sigilHolding); int xOffset = 0; - if (holdingInv != null) + for (ItemStack sigil : holdingInv) { - for (ItemStack sigil : holdingInv) - { - renderHotbarItem(resolution.getScaledWidth() / 2 + 103 + xOffset + getXOffset(), resolution.getScaledHeight() - 18 + getYOffset(), partialTicks, minecraft.player, sigil); - xOffset += 20; - } + renderHotbarItem(resolution.getScaledWidth() / 2 + 103 + xOffset + getXOffset(), resolution.getScaledHeight() - 18 + getYOffset(), partialTicks, minecraft.player, sigil); + xOffset += 20; } RenderHelper.disableStandardItemLighting(); @@ -63,9 +60,9 @@ public class HUDElementHolding extends HUDElement return true; } - protected void renderHotbarItem(int x, int y, float partialTicks, EntityPlayer player, @Nullable ItemStack stack) + protected void renderHotbarItem(int x, int y, float partialTicks, EntityPlayer player, ItemStack stack) { - if (stack != null) + if (!stack.isEmpty()) { float animation = (float) stack.getAnimationsToGo() - partialTicks; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index cd3909c9..ecc92a71 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -10,10 +10,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; @@ -55,15 +52,11 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl @Override public String getHighlightTip(ItemStack stack, String displayName) { - ItemStack[] inv = getInternalInventory(stack); - - if (inv == null) - return displayName; - + List inv = getInternalInventory(stack); int currentSlot = getCurrentItemOrdinal(stack); - ItemStack item = inv[currentSlot]; + ItemStack item = inv.get(currentSlot); - if (item == null) + if (item.isEmpty()) return displayName; else return TextHelper.localizeEffect("item.bloodmagic.sigil.holding.display", displayName, item.getDisplayName()); @@ -79,21 +72,18 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl if (!stack.hasTagCompound()) return; - ItemStack[] inv = getInternalInventory(stack); - - if (inv == null) - return; - + List inv = getInternalInventory(stack); int currentSlot = getCurrentItemOrdinal(stack); - ItemStack item = inv[currentSlot]; + ItemStack item = inv.get(currentSlot); for (int i = 0; i < inventorySize; i++) { - if (inv[i] != null) - if (item != null && inv[i] == item) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, "&o&n" + inv[i].getDisplayName())); + 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, inv[i].getDisplayName())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, invStack.getDisplayName())); } } @@ -105,14 +95,10 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return EnumActionResult.FAIL; int currentSlot = getCurrentItemOrdinal(stack); - ItemStack[] inv = getInternalInventory(stack); + List inv = getInternalInventory(stack); + ItemStack itemUsing = inv.get(currentSlot); - if (inv == null) - return EnumActionResult.PASS; - - ItemStack itemUsing = inv[currentSlot]; - - if (itemUsing == null || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing))) + if (itemUsing.isEmpty() || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing))) return EnumActionResult.PASS; EnumActionResult result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); @@ -129,14 +115,10 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return ActionResult.newResult(EnumActionResult.FAIL, stack); int currentSlot = getCurrentItemOrdinal(stack); - ItemStack[] inv = getInternalInventory(stack); + List inv = getInternalInventory(stack); + ItemStack itemUsing = inv.get(currentSlot); - if (inv == null) - return ActionResult.newResult(EnumActionResult.PASS, stack); - - ItemStack itemUsing = inv[currentSlot]; - - if (itemUsing == null || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing))) + if (itemUsing.isEmpty() || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing))) return ActionResult.newResult(EnumActionResult.PASS, stack); itemUsing.getItem().onItemRightClick(world, player, hand); @@ -146,7 +128,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return ActionResult.newResult(EnumActionResult.PASS, stack); } - public void saveInventory(ItemStack itemStack, ItemStack[] inventory) + public void saveInventory(ItemStack itemStack, List inventory) { NBTTagCompound itemTag = itemStack.getTagCompound(); @@ -159,11 +141,11 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl for (int i = 0; i < inventorySize; i++) { - if (inventory[i] != null) + if (!inventory.get(i).isEmpty()) { NBTTagCompound tag = new NBTTagCompound(); tag.setByte(Constants.NBT.SLOT, (byte) i); - inventory[i].writeToNBT(tag); + inventory.get(i).writeToNBT(tag); itemList.appendTag(tag); } } @@ -182,21 +164,17 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl public void tickInternalInventory(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected) { - ItemStack[] inv = getInternalInventory(itemStack); - - if (inv == null) - { - return; - } + List inv = getInternalInventory(itemStack); for (int i = 0; i < inventorySize; i++) { - if (inv[i] == null) + ItemStack stack = inv.get(i); + if (stack.isEmpty()) { continue; } - inv[i].getItem().onUpdate(inv[i], world, entity, itemSlot, isSelected); + stack.getItem().onUpdate(stack, world, entity, itemSlot, isSelected); } } @@ -224,12 +202,12 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return index; } - private static void initModeTag(ItemStack itemStack) + private static void initModeTag(ItemStack stack) { - if (itemStack.getTagCompound() == null) + if (!stack.hasTagCompound()) { - itemStack = NBTHelper.checkNBT(itemStack); - itemStack.getTagCompound().setInteger(Constants.NBT.CURRENT_SIGIL, inventorySize); + stack = NBTHelper.checkNBT(stack); + stack.getTagCompound().setInteger(Constants.NBT.CURRENT_SIGIL, inventorySize); } } @@ -237,22 +215,22 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl { if (itemStack.getItem() instanceof ItemSigilHolding) { - ItemStack[] itemStacks = getInternalInventory(itemStack); - if (itemStacks != null) - return itemStacks[slot == 5 ? 4 : slot]; + List inv = getInternalInventory(itemStack); + if (inv != null) + return inv.get(slot == 5 ? 4 : slot); else - return null; + return ItemStack.EMPTY; } - return null; + return ItemStack.EMPTY; } - public static int getCurrentItemOrdinal(ItemStack itemStack) + public static int getCurrentItemOrdinal(ItemStack stack) { - if (itemStack.getItem() instanceof ItemSigilHolding) + if (stack.getItem() instanceof ItemSigilHolding) { - initModeTag(itemStack); - int currentSigil = itemStack.getTagCompound().getInteger(Constants.NBT.CURRENT_SIGIL); + initModeTag(stack); + int currentSigil = stack.getTagCompound().getInteger(Constants.NBT.CURRENT_SIGIL); currentSigil = MathHelper.clamp(currentSigil, 0, inventorySize - 1); return currentSigil; } @@ -260,33 +238,33 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return 0; } - public static ItemStack[] getInternalInventory(ItemStack itemStack) + public static List getInternalInventory(ItemStack stack) { - initModeTag(itemStack); - NBTTagCompound tagCompound = itemStack.getTagCompound(); + initModeTag(stack); + NBTTagCompound tagCompound = stack.getTagCompound(); if (tagCompound == null) { - return null; + return NonNullList.withSize(inventorySize, ItemStack.EMPTY); } NBTTagList tagList = tagCompound.getTagList(Constants.NBT.ITEMS, 10); - if (tagList == null) + if (tagList.hasNoTags()) { - return null; + return NonNullList.withSize(inventorySize, ItemStack.EMPTY); } - ItemStack[] inv = new ItemStack[inventorySize]; + List inv = NonNullList.withSize(inventorySize, ItemStack.EMPTY); for (int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound data = tagList.getCompoundTagAt(i); byte j = data.getByte(Constants.NBT.SLOT); - if (j >= 0 && j < inv.length) + if (j >= 0 && j < inv.size()) { - inv[j] = new ItemStack(data); + inv.set(j, new ItemStack(data)); } } @@ -304,14 +282,14 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl { int currentIndex = getCurrentItemOrdinal(itemStack); ItemStack currentItemStack = getItemStackInSlot(itemStack, currentIndex); - if (currentItemStack == null) + if (currentItemStack.isEmpty()) return; if (mode < 0) { index = next(currentIndex); currentItemStack = getItemStackInSlot(itemStack, index); - while (currentItemStack == null) + while (currentItemStack.isEmpty()) { index = next(index); currentItemStack = getItemStackInSlot(itemStack, index); @@ -321,7 +299,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl index = prev(currentIndex); currentItemStack = getItemStackInSlot(itemStack, index); - while (currentItemStack == null) + while (currentItemStack.isEmpty()) { index = prev(index); currentItemStack = getItemStackInSlot(itemStack, index); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 80c825f4..1b782631 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -21,6 +21,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.MouseEvent; @@ -298,8 +299,7 @@ public class ClientHandler ItemSigilHolding.cycleToNextSigil(stack, mode); BloodMagicPacketHandler.INSTANCE.sendToServer(new SigilHoldingPacketProcessor(player.inventory.currentItem, mode)); ItemStack newStack = ItemSigilHolding.getItemStackInSlot(stack, ItemSigilHolding.getCurrentItemOrdinal(stack)); - if (!newStack.isEmpty()) - player.sendStatusMessage(newStack.getTextComponent(), true); + player.sendStatusMessage(newStack.isEmpty() ? new TextComponentString("") : newStack.getTextComponent(), true); } private static TextureAtlasSprite forName(TextureMap textureMap, String name, String dir) From 3a707df23cf9a26ad42512aec10ca0d153d19693 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 5 Mar 2017 10:38:23 -0800 Subject: [PATCH 071/595] Fix inability to remove gem from crucible (#1079) --- .../WayofTime/bloodmagic/block/BlockDemonCrucible.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 4836416a..6a329fd5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -78,9 +78,12 @@ public class BlockDemonCrucible extends Block implements IVariantProvider if (crucible == null || player.isSneaking()) return false; - if (!(heldItem.getItem() instanceof IDiscreteDemonWill) && !(heldItem.getItem() instanceof IDemonWillGem)) + if (!heldItem.isEmpty()) { - return true; + if (!(heldItem.getItem() instanceof IDiscreteDemonWill) && !(heldItem.getItem() instanceof IDemonWillGem)) + { + return true; + } } Utils.insertItemToTile(crucible, player); From 52861ef7c2b4455c5d06dba67d063c0d08d4f735 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 5 Mar 2017 10:44:55 -0800 Subject: [PATCH 072/595] Fix Cutting Fluid returning null when it empties (#1082) --- .../WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index b8bfa885..18f1063a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -135,7 +135,7 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA applyDamageToFluid(stack); if (getDamageOfFluid(stack) >= getMaxUsesForFluid(stack)) { - return null; + return ItemStack.EMPTY; } return stack; From fceb50bd000f7cc6757f1f20a1f9bce0facdd382 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 6 Mar 2017 16:05:52 -0800 Subject: [PATCH 073/595] Initialize default altar result as empty stack (#1086) --- src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index e855aab5..497ec555 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -82,7 +82,7 @@ public class BloodAltar implements IFluidHandler private int cooldownAfterCrafting = 60; private AltarRecipe recipe; - private ItemStack result; + private ItemStack result = ItemStack.EMPTY; @Getter private EnumAltarTier currentTierDisplayed = EnumAltarTier.ONE; From 333ad6a09ee47205d82bab74b8372424c53e6c76 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 6 Mar 2017 16:09:11 -0800 Subject: [PATCH 074/595] Fix null stacks in Utils class --- src/main/java/WayofTime/bloodmagic/util/Utils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 43f44f77..91f1833f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -447,7 +447,7 @@ public class Utils for (int x = 0; x < inventory.length; x++) { ItemStack stack = inventory[x]; - if (stack == null) + if (stack.isEmpty()) { continue; } @@ -918,7 +918,7 @@ public class Utils ItemStack invStack = inventory.getStackInSlot(i); - if (invStack != null && canCombine(stack, invStack)) + if (!invStack.isEmpty() && canCombine(stack, invStack)) { numberMatching += invStack.getCount(); } From 85a16ac075e68ffb0486ff50652f69f3c2a35151 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 6 Mar 2017 16:18:55 -0800 Subject: [PATCH 075/595] Should fix Blood Light being collidable (#1083) Why did this only occur in obfuscated environments? --- .../WayofTime/bloodmagic/block/BlockBloodLight.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java index 4b9fe9b1..e6fcedeb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.block; -import java.util.List; import java.util.Random; import net.minecraft.block.Block; @@ -9,7 +8,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.particle.ParticleManager; -import net.minecraft.entity.Entity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.AxisAlignedBB; @@ -21,6 +19,8 @@ import net.minecraftforge.fml.relauncher.SideOnly; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.registry.ModItems; +import javax.annotation.Nullable; + public class BlockBloodLight extends Block { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.4, 0.4, 0.4, 0.6, 0.6, 0.6); @@ -32,10 +32,17 @@ public class BlockBloodLight extends Block setUnlocalizedName(Constants.Mod.MODID + ".bloodLight"); } + @Nullable @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity) + public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { + return null; + } + @Override + public boolean isCollidable() + { + return false; } @Override From b4603a4b9a7f63297911ceecca16cdfe8b64df36 Mon Sep 17 00:00:00 2001 From: majikguy Date: Tue, 7 Mar 2017 19:17:18 -0500 Subject: [PATCH 076/595] Entity Registration Fix (#1087) * Replaced the Entity registration code. Before, the code was manually adding entities to the GameRegistry. Doing this prevents the engine from fully registering the added entities in all the proper places. The result was that the Client was never informed of when these entities were created or what they were doing, as all of that behavior is managed by the EntityRegistry. Changing to the proper EntityRegistry calls fixes issue #1065. * Changed ResourceLocation calls to the one with two arguments. Didn't know that was a thing before. :D Also added more consistent whitespace. --- .../bloodmagic/registry/ModEntities.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java b/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java index b7ff118d..acfa88d5 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java @@ -1,6 +1,8 @@ package WayofTime.bloodmagic.registry; -import net.minecraftforge.fml.common.registry.EntityEntry; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; @@ -11,21 +13,22 @@ 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 net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.common.registry.EntityRegistry; public class ModEntities { public static void init() { - GameRegistry.register(new EntityEntry(EntityBloodLight.class, "BloodLight").setRegistryName("BloodLight")); - GameRegistry.register(new EntityEntry(EntitySoulSnare.class, "SoulSnare").setRegistryName("SoulSnare")); - GameRegistry.register(new EntityEntry(EntitySentientArrow.class, "SoulArrow").setRegistryName("SoulArrow")); - GameRegistry.register(new EntityEntry(EntityMeteor.class, "Meteor").setRegistryName("Meteor")); - GameRegistry.register(new EntityEntry(EntitySentientSpecter.class, "SentientSpecter").setRegistryName("SentientSpecter")); - GameRegistry.register(new EntityEntry(EntityMimic.class, "Mimic").setRegistryName("Mimic")); - GameRegistry.register(new EntityEntry(EntityCorruptedZombie.class, "CorruptedZombie").setRegistryName("CorruptedZombie")); - GameRegistry.register(new EntityEntry(EntityCorruptedSheep.class, "CorruptedSheep").setRegistryName("CorruptedSheep")); - GameRegistry.register(new EntityEntry(EntityCorruptedChicken.class, "CorruptedChicken").setRegistryName("CorruptedChicken")); - GameRegistry.register(new EntityEntry(EntityCorruptedSpider.class, "CorruptedSpider").setRegistryName("CorruptedSpider")); + int entities = 0; + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "BloodLight"), EntityBloodLight.class, "BloodLight", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "SoulSnare"), EntitySoulSnare.class, "SoulSnare", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "SoulArrow"), EntitySentientArrow.class, "SoulArrow", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "Meteor"), EntityMeteor.class, "Meteor", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "SentientSpecter"), EntitySentientSpecter.class, "SentientSpecter", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "Mimic"), EntityMimic.class, "Mimic", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "CorruptedZombie"), EntityCorruptedZombie.class, "CorruptedZombie", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "CorruptedSheep"), EntityCorruptedSheep.class, "CorruptedSheep", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "CorruptedChicken"), EntityCorruptedChicken.class, "CorruptedChicken", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "CorruptedSpider"), EntityCorruptedSpider.class, "CorruptedSpider", ++entities, BloodMagic.instance, 16*4, 3, true); } } From 0940c9ea92609a94cc89f6bb49a2b2bb98964204 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 7 Mar 2017 17:34:59 -0800 Subject: [PATCH 077/595] Update changelog + version --- changelog.txt | 26 ++++++++++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 1c1edb00..1f7f468e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,29 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 6ce6e060..1cb12f14 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.5 +mod_version=2.1.6 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From 7c8e9b6d8d0e6592c2f9aa4d2916fbf10aab8db8 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 8 Mar 2017 18:00:36 -0800 Subject: [PATCH 078/595] Move some of the ritual chat lines to action bar --- .../bloodmagic/block/BlockRitualController.java | 3 ++- .../WayofTime/bloodmagic/item/ItemRitualDiviner.java | 4 +++- .../bloodmagic/tile/TileMasterRitualStone.java | 10 +++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 3d5efaf9..f19b7126 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -18,6 +18,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.fml.common.Optional; @@ -83,7 +84,7 @@ public class BlockRitualController extends BlockEnum imple } } else { - ChatUtil.sendNoSpamUnloc(player, "chat.bloodmagic.ritual.notValid"); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); } } } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index c133286f..d10e0cde 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -18,6 +18,8 @@ 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.TextComponentString; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -586,7 +588,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider Ritual ritual = RitualRegistry.getRitualForId(key); if (ritual != null) { - ChatUtil.sendNoSpam(player, TextHelper.localize(tooltipBase + "currentRitual") + TextHelper.localize(ritual.getUnlocalizedName())); + player.sendStatusMessage(new TextComponentTranslation(ritual.getUnlocalizedName()), true); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index c1029098..b1ff85e6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -93,7 +93,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (currentRitual != null) { NBTTagCompound ritualTag = tag.getCompoundTag(Constants.NBT.CURRENT_RITUAL_TAG); - if (ritualTag != null) + if (!ritualTag.hasNoTags()) { currentRitual.readFromNBT(ritualTag); } @@ -159,7 +159,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && !activator.capabilities.isCreativeMode) { - ChatUtil.sendNoSpamUnloc(activator, "chat.bloodmagic.ritual.weak"); + activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.weak"), true); return false; } @@ -170,7 +170,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) { - ChatUtil.sendNoSpamUnloc(activator, "chat.bloodmagic.ritual.prevent"); + activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.prevent"), true); return false; } @@ -179,7 +179,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (!isRedstoned() && !activator.capabilities.isCreativeMode) network.syphon(ritual.getActivationCost()); - ChatUtil.sendNoSpamUnloc(activator, "chat.bloodmagic.ritual.activate"); + activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.activate"), true); this.active = true; this.owner = crystalOwner; @@ -197,7 +197,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } } else { - ChatUtil.sendNoSpamUnloc(activator, "chat.bloodmagic.ritual.notValid"); + activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); } return false; From c4f04b158980a350cacd2547dbe7ba9cff34270e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 11 Mar 2017 15:53:43 -0800 Subject: [PATCH 079/595] Fix another null check crash (#1091) --- .../WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java | 4 ++-- .../WayofTime/bloodmagic/util/handler/event/WillHandler.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java index 12b7ebf2..34c2cfa9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java @@ -135,8 +135,8 @@ public class PlayerDemonWillHandler */ public static ItemStack addDemonWill(EntityPlayer player, ItemStack willStack) { - if (willStack == null) - return null; + if (willStack.isEmpty()) + return ItemStack.EMPTY; NonNullList inventory = player.inventory.mainInventory; 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 95c79bff..9dd3d359 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -109,7 +109,7 @@ public class WillHandler { remainder = PlayerDemonWillHandler.addDemonWill(player, willStack); - if (remainder != null) + if (!remainder.isEmpty()) { EnumDemonWillType pickupType = ((IDemonWill) remainder.getItem()).getType(remainder); if (((IDemonWill) remainder.getItem()).getWill(pickupType, remainder) >= 0.0001) From 9cea8e8b73c26a976e876c46409b93d92db73141 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 11 Mar 2017 16:01:00 -0800 Subject: [PATCH 080/595] Fix dupe with Crash of the Timberman (#1090) Also took the time to add IItemHandler support --- .../bloodmagic/ritual/RitualFelling.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java index c7a34326..69ccff60 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java @@ -11,7 +11,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; 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; @@ -69,11 +72,12 @@ public class RitualFelling extends Ritual blockPosIterator = treePartsCache.iterator(); } - if (blockPosIterator.hasNext() && tileInventory != null && tileInventory instanceof IInventory) + if (blockPosIterator.hasNext() && tileInventory != null) { masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); currentPos = blockPosIterator.next(); - placeInInventory(world.getBlockState(currentPos), world, currentPos, chestRange.getContainedPositions(masterPos).get(0)); + IItemHandler inventory = Utils.getInventory(tileInventory, EnumFacing.DOWN); + placeInInventory(world.getBlockState(currentPos), world, currentPos, inventory); world.setBlockToAir(currentPos); blockPosIterator.remove(); } @@ -108,23 +112,16 @@ public class RitualFelling extends Ritual return new RitualFelling(); } - private void placeInInventory(IBlockState blockState, World world, BlockPos blockPos, BlockPos tileEntityPos) + private void placeInInventory(IBlockState choppedState, World world, BlockPos choppedPos, @Nullable IItemHandler inventory) { - TileEntity tile = world.getTileEntity(tileEntityPos); - if (tile != null) + if (inventory == null) + return; + + for (ItemStack stack : choppedState.getBlock().getDrops(world, choppedPos, world.getBlockState(choppedPos), 0)) { - if (tile instanceof IInventory) - { - for (ItemStack stack : blockState.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), 0)) - { - ItemStack copyStack = stack.copy(); - Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); - if (!copyStack.isEmpty()) - { - world.spawnEntity(new EntityItem(world, blockPos.getX() + 0.4, blockPos.getY() + 2, blockPos.getZ() + 0.4, copyStack)); - } - } - } + ItemStack remainder = ItemHandlerHelper.insertItem(inventory, stack, false); + if (!remainder.isEmpty()) + world.spawnEntity(new EntityItem(world, choppedPos.getX() + 0.4, choppedPos.getY() + 2, choppedPos.getZ() + 0.4, remainder)); } } } From 0208d5412cf3f3b3efb5d2a762ffb971d03b65f7 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 11 Mar 2017 16:09:57 -0800 Subject: [PATCH 081/595] Fix crash when meteor hits (#1088) --- .../bloodmagic/entity/projectile/EntityMeteor.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index 5170be8c..d9c0096a 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -25,7 +25,7 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity protected double fillerChance = 0; @Setter - public ItemStack meteorStack; + public ItemStack meteorStack = ItemStack.EMPTY; public EntityMeteor(World world) { @@ -112,10 +112,10 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity nbt.setDouble("radiusModifier", radiusModifier); nbt.setDouble("explosionModifier", explosionModifier); nbt.setDouble("fillerChance", fillerChance); - if (meteorStack != null) - { + if (!meteorStack.isEmpty()) meteorStack.writeToNBT(nbt); - } + else + nbt.setBoolean("noItem", true); } @Override @@ -127,7 +127,10 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity radiusModifier = nbt.getDouble("radiusModifier"); explosionModifier = nbt.getDouble("explosionModifier"); fillerChance = nbt.getDouble("fillerChance"); - meteorStack = new ItemStack(nbt); + if (!nbt.hasKey("noItem")) + meteorStack = new ItemStack(nbt); + else + meteorStack = ItemStack.EMPTY; } @Override From 35ceb9d21e05be33f44fb053cd09b9a646b8dd8d Mon Sep 17 00:00:00 2001 From: A_D Date: Sun, 12 Mar 2017 04:07:24 -0700 Subject: [PATCH 082/595] fixed inconsistent altar tier readout with seer's sigil (#1094) (cherry picked from commit 2b92151) --- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java index d8b4e4c3..fb68435c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java @@ -72,7 +72,7 @@ public class ItemSigilSeer extends ItemSigilBase implements IAltarReader int progress = altar.getProgress(); int totalLiquidRequired = altar.getLiquidRequired() * ((IInventory) tile).getStackInSlot(0).getCount(); int consumptionRate = (int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1)); - ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarProgress", progress, totalLiquidRequired), new TextComponentTranslation(tooltipBase + "currentAltarConsumptionRate", consumptionRate), new TextComponentTranslation(tooltipBase + "currentAltarTier", tier), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity), new TextComponentTranslation(tooltipBase + "currentCharge", charge)); + ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarProgress", progress, totalLiquidRequired), new TextComponentTranslation(tooltipBase + "currentAltarConsumptionRate", consumptionRate), new TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity), new TextComponentTranslation(tooltipBase + "currentCharge", charge)); } else { ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity), new TextComponentTranslation(tooltipBase + "currentCharge", charge)); From 68ca7cf9a590f876439a5968ae877f7a45cc3026 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 13 Mar 2017 16:14:07 -0700 Subject: [PATCH 083/595] Fix Grave Digger not applying damage bonus (#1098) --- .../livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java index fef4c4da..0c8796a4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java @@ -21,7 +21,7 @@ public class LivingArmourUpgradeGraveDigger extends LivingArmourUpgrade @Override public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { - if (weapon != null && weapon.getItem() instanceof ItemSpade) + if (!weapon.isEmpty() && weapon.getItem() instanceof ItemSpade) { return getDamageModifier(); } From 350c7cde4221955171555e5641666a04cc1090c0 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 13 Mar 2017 16:21:30 -0700 Subject: [PATCH 084/595] Update changelog + version --- changelog.txt | 16 ++++++++++++++++ gradle.properties | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 1f7f468e..d7af49f9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,19 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 1cb12f14..874b03bb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.6 +mod_version=2.1.7 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From 41c2f37042961628928694229b566a5e8e88c437 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 14 Mar 2017 19:13:08 -0700 Subject: [PATCH 085/595] Change lots of recipes to use oredict (#1101) I probably missed a few --- .../bloodmagic/registry/ModRecipes.java | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 42ea9744..d44d2a6a 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -125,7 +125,7 @@ public class ModRecipes GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_STONE, 1, 1), "aa", "aa", 'a', new ItemStack(ModBlocks.BLOOD_STONE))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.BLOOD_STONE, 16), "stone", new ItemStack(ModItems.BLOOD_SHARD))); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.ACTIVATION_CRYSTAL, 1, 1), new ItemStack(Items.NETHER_STAR), OrbRegistry.getOrbStack(ModItems.ORB_ARCHMAGE)); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.SOUL_SNARE, 4, 0), "sis", "iri", "sis", 's', new ItemStack(Items.STRING), 'i', "ingotIron", 'r', "dustRedstone")); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.SOUL_SNARE, 4, 0), "sis", "iri", "sis", 's', "string", 'i', "ingotIron", 'r', "dustRedstone")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_TANK), "RBR", "G G", "RRR", 'R', new ItemStack(ModBlocks.BLOOD_RUNE), 'B', ModBlocks.BLOOD_STONE, 'G', "blockGlass")); for (int i = 1; i < TileBloodTank.CAPACITIES.length; i++) @@ -170,7 +170,7 @@ public class ModRecipes GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 6), Blocks.OBSIDIAN, Blocks.OBSIDIAN, Blocks.OBSIDIAN, Blocks.OBSIDIAN, OrbRegistry.getOrbStack(ModItems.ORB_ARCHMAGE))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 7), new ItemStack(ModBlocks.PATH_BLOCK, 1, 6), new ItemStack(ModBlocks.PATH_BLOCK, 1, 6), new ItemStack(ModBlocks.PATH_BLOCK, 1, 6), new ItemStack(ModBlocks.PATH_BLOCK, 1, 6))); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.EXPERIENCE_TOME), "ses", "lbl", "gog", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN), 'e', Blocks.LAPIS_BLOCK, 'l', new ItemStack(ModItems.SLATE, 1, 2), 'b', Items.ENCHANTED_BOOK, 's', Items.STRING, 'g', "ingotGold")); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.EXPERIENCE_TOME), "ses", "lbl", "gog", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN), 'e', Blocks.LAPIS_BLOCK, 'l', new ItemStack(ModItems.SLATE, 1, 2), 'b', Items.ENCHANTED_BOOK, 's', "string", 'g', "ingotGold")); GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.RITUAL_READER), "gog", "isi", " s ", 's', new ItemStack(ModItems.SLATE, 1, 3), 'g', "blockGlass", 'i', "ingotGold", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MASTER))); GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.ALCHEMY_TABLE), "sss", "wbw", "gog", 's', "stone", 'w', "plankWood", 'b', Items.BLAZE_ROD, 'g', "ingotGold", 'o', OrbRegistry.getOrbStack(ModItems.ORB_WEAK))); @@ -195,7 +195,7 @@ public class ModRecipes GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 4, 0), "b b", " r ", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 4, 1), "bsb", "srs", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 's', "stone", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 4, 2), "bsb", "srs", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 's', "blockGlass", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 2, 3), "bnb", "trt", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 'n', Blocks.GLOWSTONE, 't', "torch", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 2, 3), "bnb", "trt", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 'n', "glowstone", 't', "torch", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); for (int i = 0; i < 5; i++) { @@ -347,21 +347,21 @@ public class ModRecipes TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_AXE), 0, 0, new ItemStack(ModItems.SOUL_GEM), new ItemStack(Items.IRON_AXE)); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_PICKAXE), 0, 0, new ItemStack(ModItems.SOUL_GEM), new ItemStack(Items.IRON_PICKAXE)); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_SHOVEL), 0, 0, new ItemStack(ModItems.SOUL_GEM), new ItemStack(Items.IRON_SHOVEL)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_BOW), 70, 0, new ItemStack(Items.BOW), new ItemStack(ModItems.SOUL_GEM, 1, 1), Items.STRING, Items.STRING); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.ARCANE_ASHES), 0, 0, "dustRedstone", "dyeWhite", new ItemStack(Items.GUNPOWDER), Items.COAL); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_BOW), 70, 0, new ItemStack(Items.BOW), new ItemStack(ModItems.SOUL_GEM, 1, 1), "string", "string"); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.ARCANE_ASHES), 0, 0, "dustRedstone", "dyeWhite", "gunpowder", Items.COAL); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_WATER), 10, 3, new ItemStack(Items.SUGAR), new ItemStack(Items.WATER_BUCKET), new ItemStack(Items.WATER_BUCKET)); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_LAVA), 32, 10, Items.LAVA_BUCKET, "dustRedstone", "cobblestone", "blockCoal"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_VOID), 64, 10, Items.BUCKET, Items.STRING, Items.STRING, Items.GUNPOWDER); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), 128, 20, "treeSapling", "treeSapling", Items.REEDS, Items.SUGAR); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AIR), 128, 20, Items.GHAST_TEAR, Items.FEATHER, Items.FEATHER); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_VOID), 64, 10, Items.BUCKET, "string", "string", "gunpowder"); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), 128, 20, "treeSapling", "treeSapling", "sugarcane", Items.SUGAR); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AIR), 128, 20, Items.GHAST_TEAR, "feather", "feather"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), 64, 0, ModItems.SIGIL_DIVINATION, "blockGlass", "blockGlass", "dustGlowstone"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), 64, 20, Blocks.CHEST, "leather", "string", "string"); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), 64, 20, "chestWood", "leather", "string", "string"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), 128, 10, Items.IRON_PICKAXE, Items.IRON_AXE, Items.IRON_SHOVEL, Items.GUNPOWDER); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), 300, 30, ModItems.SIGIL_WATER, ModItems.SIGIL_AIR, ModItems.SIGIL_LAVA, Blocks.OBSIDIAN); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), 500, 50, ModBlocks.TELEPOSER, Items.WATER_BUCKET, Items.LAVA_BUCKET, Items.BLAZE_ROD); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), 400, 10, "dustGlowstone", "dustRedstone", "nuggetGold", Items.GUNPOWDER); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), 300, 10, "glowstone", Blocks.TORCH, "dustRedstone", "dustRedstone"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), 600, 10, Items.STRING, "ingotGold", "blockIron", "ingotGold"); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), 600, 10, "string", "ingotGold", "blockIron", "ingotGold"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HASTE), 1400, 100, Items.COOKIE, Items.SUGAR, Items.COOKIE, "stone"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE), 600, 50, Blocks.SOUL_SAND, Blocks.SOUL_SAND, "stone", Blocks.OBSIDIAN); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE), 800, 70, Items.ENDER_EYE, Items.ENDER_PEARL, "ingotGold", "ingotGold"); @@ -369,7 +369,7 @@ public class ModRecipes TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), 1500, 200, ModBlocks.TELEPOSER, "glowstone", "blockRedstone", "ingotGold"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), 1500, 200, ModBlocks.TELEPOSER, "gemDiamond", Items.ENDER_PEARL, Blocks.OBSIDIAN); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_CLAW), 800, 120, Items.FLINT, Items.FLINT, ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), 200, 20, Blocks.SLIME_BLOCK, Blocks.SLIME_BLOCK, Items.LEATHER, Items.STRING); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), 200, 20, Blocks.SLIME_BLOCK, Blocks.SLIME_BLOCK, Items.LEATHER, "string"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FROST), 80, 10, Blocks.ICE, Items.SNOWBALL, Items.SNOWBALL, "dustRedstone"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_ARMOUR_GEM), 240, 150, Items.DIAMOND_CHESTPLATE, new ItemStack(ModItems.SOUL_GEM, 1, 1), Blocks.IRON_BLOCK, Blocks.OBSIDIAN); @@ -399,7 +399,7 @@ public class ModRecipes AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.FLINT, 2), 0, 20, 0, Blocks.GRAVEL, Items.FLINT); AlchemyTableRecipeRegistry.registerRecipe(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); - AlchemyTableRecipeRegistry.registerRecipe(ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE), 500, 200, 1, Items.GUNPOWDER, Items.GUNPOWDER, "dustCoal"); + AlchemyTableRecipeRegistry.registerRecipe(ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE), 500, 200, 1, "gunpowder", "gunpowder", "dustCoal"); AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.BREAD), 100, 200, 1, Items.WHEAT, Items.SUGAR); AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Blocks.GRASS), 200, 200, 1, Blocks.DIRT, new ItemStack(Items.DYE, 1, 15), Items.WHEAT_SEEDS); @@ -413,7 +413,7 @@ public class ModRecipes AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ItemComponent.getStack(ItemComponent.SAND_COAL, 4), 100, 100, 1, new ItemStack(Items.COAL, 1, 0), new ItemStack(Items.COAL, 1, 0), Items.FLINT)); - AlchemyTableRecipeRegistry.registerRecipe(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 1000, 400, 1, "dustCoal", Items.GUNPOWDER, Items.REDSTONE, Items.SUGAR, ItemComponent.getStack(ItemComponent.PLANT_OIL), new ItemStack(Items.POTIONITEM)); + AlchemyTableRecipeRegistry.registerRecipe(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 1000, 400, 1, "dustCoal", "gunpowder", Items.REDSTONE, Items.SUGAR, ItemComponent.getStack(ItemComponent.PLANT_OIL), new ItemStack(Items.POTIONITEM)); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ItemComponent.getStack(ItemComponent.SAND_IRON, 2), 400, 200, 1, "oreIron", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ItemComponent.getStack(ItemComponent.SAND_GOLD, 2), 400, 200, 1, "oreGold", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); @@ -428,21 +428,21 @@ public class ModRecipes AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(new ItemStack(Blocks.GRAVEL), 50, 50, 1, "cobblestone", ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE))); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(new ItemStack(Blocks.SAND), 50, 50, 1, Blocks.GRAVEL, ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE))); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, Items.CARROT, Items.CARROT, Items.CARROT, new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, Items.POTATO, Items.POTATO, new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, Items.WHEAT, Items.WHEAT, new ItemStack(Items.DYE, 1, 15)); + AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, "cropCarrot", "cropCarrot", "cropCarrot", new ItemStack(Items.DYE, 1, 15)); + AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, "cropPotato", "cropPotato", new ItemStack(Items.DYE, 1, 15)); + AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, "cropWheat", "cropWheat", new ItemStack(Items.DYE, 1, 15)); AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, Items.BEETROOT, Items.BEETROOT, Items.BEETROOT, new ItemStack(Items.DYE, 1, 15)); AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.NEURO_TOXIN), 1000, 100, 2, new ItemStack(Items.FISH, 1, 3)); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.ANTISEPTIC, 2), 1000, 200, 2, ItemComponent.getStack(ItemComponent.PLANT_OIL), "nuggetGold", Items.WHEAT, Items.SUGAR, Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM); + AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.ANTISEPTIC, 2), 1000, 200, 2, ItemComponent.getStack(ItemComponent.PLANT_OIL), "nuggetGold", "cropWheat", Items.SUGAR, Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM); AlchemyTableRecipeRegistry.registerRecipe(ItemLivingArmourPointsUpgrade.getStack(ItemLivingArmourPointsUpgrade.DRAFT_ANGELUS), 20000, 400, 3, ItemComponent.getStack(ItemComponent.NEURO_TOXIN), ItemComponent.getStack(ItemComponent.ANTISEPTIC), "dustGold", Items.FERMENTED_SPIDER_EYE, new ItemStack(ModItems.BLOOD_SHARD, 1, 0), Items.GHAST_TEAR); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(ModItems.SIGIL_HOLDING))); - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(ModItems.POTION_FLASK), 1000, 200, 2, new ItemStack(Items.POTIONITEM), Items.NETHER_WART, Items.REDSTONE, Items.GLOWSTONE_DUST); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1), 1000, 100, 2, Items.GUNPOWDER, Items.NETHER_WART, "gemLapis"); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_POWER_1), 1000, 100, 2, Items.GUNPOWDER, Items.NETHER_WART, "dustRedstone"); + AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(ModItems.POTION_FLASK), 1000, 200, 2, new ItemStack(Items.POTIONITEM), "cropNetherWart", "dustRedstone", "dustGlowstone"); + AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1), 1000, 100, 2, "gunpowder", "cropNetherWart", "gemLapis"); + AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_POWER_1), 1000, 100, 2, "gunpowder", "cropNetherWart", "dustRedstone"); } public static void addOreDoublingAlchemyRecipes() @@ -491,7 +491,7 @@ public class ModRecipes addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new PotionEffect(ModPotions.deafness, 450)); // AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(5000, 100, 4, new ItemStack(Blocks.SLIME_BLOCK), new PotionEffect(ModPotions.bounce, 15 * 60 * 20))); -// AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(5000, 100, 4, new ItemStack(Items.STRING), new PotionEffect(ModPotions.bounce, 15 * 60 * 20))); +// AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(5000, 100, 4, new ItemStack("string"), new PotionEffect(ModPotions.bounce, 15 * 60 * 20))); } static ItemStack mundaneLengtheningStack = ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1); @@ -547,10 +547,10 @@ public class ModRecipes LivingArmourDowngradeRecipeRegistry.registerDialog(keyStack, textMap); } - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeStormTrooper(0), bowStack, Items.ARROW, Items.STRING, "ingotIron", "ingotIron"); + 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, Items.FEATHER); - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeStormTrooper(3), bowStack, Items.PRISMARINE_SHARD, Items.BLAZE_ROD, Items.FEATHER, Items.FEATHER); + 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); From 216bdb2d2e1e20d2f25c8712fa61868336820518 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 14 Mar 2017 19:33:13 -0700 Subject: [PATCH 086/595] Fixed many sigils using the wrong stack for their logic (#1102) This is why you use custom methods for things like this instead of MC methods --- .../java/WayofTime/bloodmagic/api/iface/ISigil.java | 10 ++++++++++ .../bloodmagic/api/impl/ItemSigilToggleable.java | 5 +++++ .../bloodmagic/item/sigil/ItemSigilAir.java | 3 +++ .../bloodmagic/item/sigil/ItemSigilBloodLight.java | 3 +++ .../bloodmagic/item/sigil/ItemSigilDivination.java | 3 +++ .../bloodmagic/item/sigil/ItemSigilHolding.java | 12 +++++++++++- .../bloodmagic/item/sigil/ItemSigilLava.java | 3 +++ .../bloodmagic/item/sigil/ItemSigilSeer.java | 3 +++ .../bloodmagic/item/sigil/ItemSigilTeleposition.java | 5 +++++ .../item/sigil/ItemSigilTransposition.java | 3 +++ .../bloodmagic/item/sigil/ItemSigilVoid.java | 3 +++ .../bloodmagic/item/sigil/ItemSigilWater.java | 3 +++ 12 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java b/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java index ef3ad2a5..2e318247 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java @@ -1,8 +1,12 @@ package WayofTime.bloodmagic.api.iface; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import javax.annotation.Nonnull; + /** * Used for all {@link WayofTime.bloodmagic.api.impl.ItemSigil} EXCEPT * Sigils of Holdings. @@ -12,4 +16,10 @@ public interface ISigil boolean performArrayEffect(World world, BlockPos pos); boolean hasArrayEffect(); + + interface Holding + { + @Nonnull + ItemStack getHeldItem(ItemStack holdingStack, EntityPlayer player); + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java index 42ef9d80..0d4e75cd 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.api.impl; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IActivatable; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; @@ -49,6 +50,8 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); @@ -67,6 +70,8 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing 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 (Strings.isNullOrEmpty(getOwnerUUID(stack)) || player.isSneaking()) // Make sure Sigils are bound before handling. Also ignores while toggling state return EnumActionResult.PASS; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index 86f794ee..29e6913b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.item.sigil; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -29,6 +30,8 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index aaf30f0c..ef7ef638 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.item.sigil; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -34,6 +35,8 @@ public class ItemSigilBloodLight extends ItemSigilBase public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index 2282a9de..31e610ae 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item.sigil; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.api.iface.ISigil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -47,6 +48,8 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader // world.spawnEntityInWorld(fred); // } 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(EnumActionResult.FAIL, stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index ecc92a71..a1318abc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item.sigil; import java.util.Collections; import java.util.List; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.key.KeyBindings; import net.minecraft.entity.Entity; @@ -30,7 +31,9 @@ import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; -public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAltarReader +import javax.annotation.Nonnull; + +public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAltarReader, ISigil.Holding { public static final int inventorySize = 5; @@ -128,6 +131,13 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return ActionResult.newResult(EnumActionResult.PASS, stack); } + @Nonnull + @Override + public ItemStack getHeldItem(ItemStack holdingStack, EntityPlayer player) + { + return getInternalInventory(holdingStack).get(getCurrentItemOrdinal(holdingStack)); + } + public void saveInventory(ItemStack itemStack, List inventory) { NBTTagCompound itemTag = itemStack.getTagCompound(); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index ce9eac0d..387928f6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.item.sigil; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.block.material.Material; @@ -31,6 +32,8 @@ public class ItemSigilLava extends ItemSigilBase public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java index fb68435c..11025a9a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item.sigil; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.util.helper.NumeralHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -33,6 +34,8 @@ public class ItemSigilSeer extends ItemSigilBase implements IAltarReader public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 291ff24b..7b07b258 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.item.sigil; import java.util.List; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -50,6 +51,8 @@ public class ItemSigilTeleposition extends ItemSigilBase public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); @@ -71,6 +74,8 @@ public class ItemSigilTeleposition extends ItemSigilBase public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing 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 EnumActionResult.FAIL; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index 7d226a48..3e042a4a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.item.sigil; import java.util.List; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -69,6 +70,8 @@ public class ItemSigilTransposition extends ItemSigilBase public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing 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 EnumActionResult.FAIL; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 9d8db890..0e27f2be 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.item.sigil; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; @@ -29,6 +30,8 @@ public class ItemSigilVoid extends ItemSigilBase public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index c125b03e..2de40557 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.item.sigil; +import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.block.BlockCauldron; @@ -34,6 +35,8 @@ public class ItemSigilWater extends ItemSigilBase public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); From a5a47c42aa0447c68b4a8bc8c54a6857a90d456e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 14 Mar 2017 20:17:57 -0700 Subject: [PATCH 087/595] Rewrite the placer ritual Includes a slight nerf: Instead of placing the entire 25x25 at the same time, it now places 1 block at a time. This was brought on by 30 minutes of debugging an intended feature that was mistaken for a bug in #1103 TODO: Rewrite most of the rituals to get rid of any remaining legacy code --- .../bloodmagic/ritual/RitualPlacer.java | 59 +++++-------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java index 8f908a42..fb21568b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java @@ -3,8 +3,9 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.*; import net.minecraft.block.Block; -import net.minecraft.inventory.IInventory; +import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; @@ -46,11 +47,9 @@ public class RitualPlacer extends Ritual } AreaDescriptor areaDescriptor = getBlockRange(PLACER_RANGE); - IInventory inventory; if (tileEntity != null) { - // Using the new Forge inventory system if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); @@ -60,50 +59,24 @@ public class RitualPlacer extends Ritual return; } + posLoop: for (BlockPos blockPos : areaDescriptor.getContainedPositions(masterRitualStone.getBlockPos())) { - for (int inv = 0; inv < itemHandler.getSlots(); inv++) - { - if (world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos) && !itemHandler.getStackInSlot(inv).isEmpty()) - { - if (itemHandler.getStackInSlot(inv).getItem() instanceof ItemBlock && world.isAirBlock(blockPos.down())) - { - if (!itemHandler.extractItem(inv, 1, true).isEmpty()) - { - world.setBlockState(blockPos, Block.getBlockFromItem(itemHandler.getStackInSlot(inv).getItem()).getStateFromMeta(itemHandler.getStackInSlot(inv).getItemDamage())); - itemHandler.extractItem(inv, 1, false); - tileEntity.markDirty(); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); - } - } - } - } - } - //Compatibility with the old system, as it still exists - } else if (tileEntity instanceof IInventory) - { - inventory = (IInventory) tileEntity; + if (!world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos)) + continue; - if (inventory.getSizeInventory() <= 0) - { - return; - } - - for (BlockPos blockPos : areaDescriptor.getContainedPositions(masterRitualStone.getBlockPos())) - { - for (int inv = 0; inv < inventory.getSizeInventory(); inv++) + for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) { - if (world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos) && !inventory.getStackInSlot(inv).isEmpty()) - { - if (inventory.getStackInSlot(inv).getItem() instanceof ItemBlock && world.isAirBlock(blockPos.down())) - { - world.setBlockState(blockPos, Block.getBlockFromItem(inventory.getStackInSlot(inv).getItem()).getStateFromMeta(inventory.getStackInSlot(inv).getItemDamage())); - inventory.decrStackSize(inv, 1); - inventory.markDirty(); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); - break; - } - } + ItemStack stack = itemHandler.extractItem(invSlot, 1, true); + if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) + continue; + + IBlockState 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(getRefreshCost()); + break posLoop; // Break instead of return in case we add things later } } } From 7cafd833c3769b7941e736897aed51b18f951f3f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 20 Mar 2017 22:37:23 -0700 Subject: [PATCH 088/595] Fix fluid dupe when inserting into blood tank with bucket (#1108) --- src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 7af1f082..3acdc104 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -23,6 +23,7 @@ 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.FluidActionResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.relauncher.Side; @@ -106,8 +107,10 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider { ItemStack held = player.getHeldItem(hand); TileBloodTank fluidHandler = (TileBloodTank) world.getTileEntity(blockPos); - if (FluidUtil.interactWithFluidHandler(held, fluidHandler.getTank(), player).isSuccess()) + FluidActionResult result = FluidUtil.interactWithFluidHandler(held, fluidHandler.getTank(), player); + if (result.isSuccess()) { + player.setHeldItem(hand, result.getResult()); world.checkLight(blockPos); world.updateComparatorOutputLevel(blockPos, this); world.markAndNotifyBlock(blockPos, world.getChunkFromBlockCoords(blockPos), state, state, 3); From 07e025d6352595b60f09c5f713b66d080418b82f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 28 Mar 2017 18:32:08 -0700 Subject: [PATCH 089/595] Fix README --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 743d18a3..61f510ae 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,28 @@ -#Blood Magic: Alchemical Wizardry [![](http://cf.way2muchnoise.eu/full_blood-magic_downloads.svg)](https://minecraft.curseforge.com/projects/blood-magic) +# Blood Magic: Alchemical Wizardry [![](http://cf.way2muchnoise.eu/full_blood-magic_downloads.svg)](https://minecraft.curseforge.com/projects/blood-magic) -###Gruesome? Probably. Worth it? Definitely! -###[Downloads](http://minecraft.curseforge.com/mc-mods/224791-blood-magic/files) +### Gruesome? Probably. Worth it? Definitely! +### [Downloads](http://minecraft.curseforge.com/projects/blood-magic/files) -##Information +## 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 +## 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/mc-mods/224791-blood-magic) +* [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 +## 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 +#### 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`. @@ -30,7 +30,7 @@ Blood Magic is an arcane art that is practiced by mages who attempt to gather a [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 +## Developing Addons Add to your build.gradle: @@ -46,23 +46,23 @@ Add to your build.gradle: `` can be found on CurseForge (or via the Maven itself), check the file name of the version you want. -##Custom Builds +## 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: +#### 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 +## 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 +## 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! @@ -72,7 +72,7 @@ This mod requires "Minecraft Forge" in order to operate. It is incredibly easy t 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 +## FAQ **Q**: My weak blood orb doesn't show my current LP! Fix it please. From d524cc32b7154ccef8be5854a5981283703f6d4c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 28 Mar 2017 18:32:25 -0700 Subject: [PATCH 090/595] Another null stack in the Sentient Specters --- .../WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 11eb66eb..655e2371 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -479,7 +479,7 @@ public class EntitySentientSpecter extends EntityDemonBase public void attackEntityWithRangedAttack(EntityLivingBase target, float velocity) { ItemStack heldStack = this.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); - if (heldStack != null && heldStack.getItem() == ModItems.SENTIENT_BOW) + if (!heldStack.isEmpty() && heldStack.getItem() == ModItems.SENTIENT_BOW) { EntityTippedArrow arrowEntity = ((ItemSentientBow) heldStack.getItem()).getArrowEntity(getEntityWorld(), heldStack, target, this, velocity); if (arrowEntity != null) From 3134f6b9f396d690f129934676b885b1cf34f729 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 28 Mar 2017 18:40:24 -0700 Subject: [PATCH 091/595] Fix bound tools not checking if they're bound (#1114) --- src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java | 5 +++++ src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 418f4d56..23efa140 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -75,6 +75,11 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + if (Strings.isNullOrEmpty(getOwnerUUID(stack))) { + setActivatedState(stack, false); + return; + } + if (entity instanceof EntityPlayer && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage((EntityPlayer) entity, 20); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 4ecef2e2..77ff7710 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -90,6 +90,11 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable @Override public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + if (Strings.isNullOrEmpty(getOwnerUUID(stack))) { + setActivatedState(stack, false); + return; + } + if (entity instanceof EntityPlayer && getActivated(stack) && isSelected && getBeingHeldDown(stack) && stack == ((EntityPlayer) entity).getActiveItemStack()) { EntityPlayer player = (EntityPlayer) entity; From f17f284575466e5c93122543298a01e065d1ed99 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 28 Mar 2017 18:45:45 -0700 Subject: [PATCH 092/595] Nullcheck the ritual activator (#1113) --- .../bloodmagic/api/util/helper/PlayerHelper.java | 2 +- .../bloodmagic/tile/TileMasterRitualStone.java | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java index 634f33f0..75b5f6f9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java @@ -79,7 +79,7 @@ public class PlayerHelper */ public static boolean isFakePlayer(EntityPlayer player) { - return player != null && (player instanceof FakePlayer || knownFakePlayers.contains(player.getClass().getCanonicalName())); + return player instanceof FakePlayer || (player != null && knownFakePlayers.contains(player.getClass().getCanonicalName())); } public static void causeNauseaToPlayer(ItemStack stack) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index b1ff85e6..afac6658 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -33,6 +33,8 @@ import WayofTime.bloodmagic.util.ChatUtil; import com.google.common.base.Strings; +import javax.annotation.Nullable; + @Getter @NoArgsConstructor public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone @@ -138,7 +140,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator, Ritual ritual) + public boolean activateRitual(ItemStack activationCrystal, @Nullable EntityPlayer activator, Ritual ritual) { if (PlayerHelper.isFakePlayer(activator)) return false; @@ -157,7 +159,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS { SoulNetwork network = NetworkHelper.getSoulNetwork(crystalOwner); - if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && !activator.capabilities.isCreativeMode) + if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && (activator != null && !activator.capabilities.isCreativeMode)) { activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.weak"), true); return false; @@ -176,10 +178,11 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (ritual.activateRitual(this, activator, crystalOwner)) { - if (!isRedstoned() && !activator.capabilities.isCreativeMode) + if (!isRedstoned() && (activator != null && !activator.capabilities.isCreativeMode)) network.syphon(ritual.getActivationCost()); - activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.activate"), true); + if (activator != null) + activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.activate"), true); this.active = true; this.owner = crystalOwner; @@ -197,7 +200,8 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } } else { - activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); + if (activator != null) + activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); } return false; From 487c7e4aa38599675d4272d8f0923f56aad4ea99 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 28 Mar 2017 18:48:27 -0700 Subject: [PATCH 093/595] Forgot one... --- .../java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index afac6658..1b21dbe7 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -172,7 +172,8 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) { - activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.prevent"), true); + if (activator != null) + activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.prevent"), true); return false; } From ed59c4633e34cec439837788b238bedc5e5a23e2 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 28 Mar 2017 19:07:16 -0700 Subject: [PATCH 094/595] Fixed null stack in plantable harvest handler --- .../bloodmagic/ritual/harvest/HarvestHandlerPlantable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index ff8db2e9..6696d367 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -46,7 +46,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler for (ItemStack stack : drops) { - if (stack == null) + if (stack.isEmpty()) continue; if (stack.getItem() instanceof IPlantable) From 22e3d4d62c8472d0ee9946805e7d13a22719e3a2 Mon Sep 17 00:00:00 2001 From: "Urey. Xue" Date: Sun, 19 Mar 2017 09:54:40 -0700 Subject: [PATCH 095/595] Update zh_CN.lang (#1052) * Simp. Chinese translation for SANGVINE SCIENTIEM, round I * Simp. Chinese translation for SANGVINE SCIENTIEM, round I Also contains update for main language file * Amendment I * Amendment II * use "/cut" to trick String.split(), so that we could manually split page * Minor improvements on translation * Amendment III * Amendment IV * Amendment V * Amendment VI (cherry picked from commit ad46745) --- .../assets/bloodmagic/lang/zh_CN.lang | 1455 +++++++++-------- .../assets/bloodmagicguide/lang/zh_CN.lang | 258 +++ 2 files changed, 989 insertions(+), 724 deletions(-) create mode 100644 src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang diff --git a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang index d77a4201..f824d9ce 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang @@ -1,789 +1,796 @@ #Creative Tab -itemGroup.BloodMagic.creativeTab=血魔法 -itemGroup.BloodMagic.creativeTabTome=血魔法强化手册 +itemGroup.bloodmagic.creativeTab=血魔法 +itemGroup.bloodmagic.creativeTabTome=血魔法|手册 #Items -item.BloodMagic.activationCrystal.weak.name=[虚弱]激活水晶 -item.BloodMagic.activationCrystal.awakened.name=[觉醒]激活水晶 -item.BloodMagic.activationCrystal.creative.name=[创造]激活水晶 +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.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.lavaCrystal.name=熔岩晶体 -item.BloodMagic.bound.sword.name=æŸç¼šä¹‹å‰‘ -item.BloodMagic.bound.pickaxe.name=æŸç¼šä¹‹é• -item.BloodMagic.bound.axe.name=æŸç¼šä¹‹æ–§ -item.BloodMagic.bound.shovel.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.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.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.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.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.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.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.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.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.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.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.cuttingFluid.basicCuttingFluid.name=基础切削油 +item.bloodmagic.cuttingFluid.explosive.name=爆炸ç«è¯ -item.BloodMagic.baseComponent.mundaneLength.name=简å•的延时催化剂 -item.BloodMagic.baseComponent.mundanePower.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.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.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.teleposition.name=ä¼ é€å°è®° -item.BloodMagic.sigil.transposition.name=ç§»ä½å°è®° -item.BloodMagic.sigil.claw.name=爪之å°è®° -item.BloodMagic.sigil.bounce.name=弹性å°è®° -item.BloodMagic.sigil.frost.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.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.altarMaker.name=ç¥­å›æ­å»ºå·¥å…· -item.BloodMagic.ritualDivinernormal.name=ä»ªå¼æŽ¨æµ‹ä»— -item.BloodMagic.ritualDivinerdusk.name=ä»ªå¼æŽ¨æµ‹ä»— [è–„æš®] -item.BloodMagic.ritualDivinerdawn.name=ä»ªå¼æŽ¨æµ‹ä»— [破晓] -item.BloodMagic.ritualReader.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.upgradeTrainer.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.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.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.experienceTome.name=ç»éªŒæ‰‹å†Œ +item.bloodmagic.sanguineBook.name=指示之书 -item.BloodMagic.livingPointUpgrade.draftAngelus.name=祷告之始 +item.bloodmagic.livingPointUpgrade.draftAngelus.name=祷告之始 -item.BloodMagic.willGauge.name=çµåŸŸæµ‹é‡å™¨ -item.BloodMagic.potionFlask.name=è¯å‰‚ç“¶ +item.bloodmagic.willGauge.name=çµåŸŸæµ‹é‡ä»ª +item.bloodmagic.potionFlask.name=è¯å‰‚ç“¶ # Blocks -tile.BloodMagic.fluid.lifeEssence.name=生命æºè´¨ +tile.bloodmagic.fluid.lifeEssence.name=生命æºè´¨ -tile.BloodMagic.stone.ritual.master.name=主仪å¼çŸ³ -tile.BloodMagic.stone.ritual.imperfect.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=&r&f炼金矩阵 +tile.bloodmagic.altar.name=è¡€ä¹‹ç¥­å› +tile.bloodmagic.alchemyArray.name=&r&f炼金矩阵 -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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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=åšå®šçŸ³æ¥¼æ¢¯ +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.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.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.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胜过速易æ´Â®! -tooltip.BloodMagic.sigil.greenGrove.desc=&oç»¿è‰²çŽ¯ä¿æ— æ±¡æŸ“ -tooltip.BloodMagic.sigil.magnetism.desc=&o我现在éžå¸¸å…·æœ‰å¸å¼•力 -tooltip.BloodMagic.sigil.suppression.desc=&o比念力移动更好... -tooltip.BloodMagic.sigil.haste.desc=&o42ç»§å’–å•¡å› åŽ... -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.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胜过速易æ´Â®! +tooltip.bloodmagic.sigil.greenGrove.desc=&oç»¿è‰²çŽ¯ä¿æ— æ±¡æŸ“ +tooltip.bloodmagic.sigil.magnetism.desc=&o我现在éžå¸¸å…·æœ‰å¸å¼•力 +tooltip.bloodmagic.sigil.suppression.desc=&o比念力移动更好... +tooltip.bloodmagic.sigil.haste.desc=&o42ç»§å’–å•¡å› åŽ... +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.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.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.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.pack.selfSacrifice.desc=相当ä¸èˆ’适的背包... +tooltip.bloodmagic.pack.sacrifice.desc=æè¿° +tooltip.bloodmagic.pack.stored=储存:%d LP -tooltip.BloodMagic.activationCrystal.weak=æ¿€æ´»ä½Žç­‰ä»ªå¼ -tooltip.BloodMagic.activationCrystal.awakened=æ¿€æ´»æ›´å¼ºå¤§çš„ä»ªå¼ -tooltip.BloodMagic.activationCrystal.creative=åˆ›é€ æ¨¡å¼ - æ¿€æ´»ä»»ä½•ä»ªå¼ +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.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.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.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.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.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.level=%s (等级 %d) -tooltip.BloodMagic.livingArmour.upgrade.points=&6强化点数: %s / %s +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.extraExtraInfo=&9-æŒ‰ä½ shift + M 查看进展信æ¯- +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.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.livingArmour.extraExtraInfo=&9-æŒ‰ä½ Shift + M 查看进展信æ¯- -tooltip.BloodMagic.itemFilter.exact=将确ä¿ç‰©å“ç²¾ç¡®åŒ¹é… -tooltip.BloodMagic.itemFilter.ignoreNBT=忽视筛选的NBT -tooltip.BloodMagic.itemFilter.modItems=åŒMod的物å“å…¨éƒ¨åŒ¹é… -tooltip.BloodMagic.itemFilter.oreDict=凭借矿物辞典筛选 +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.fluid.type=æ‰€å«æ¶²ä½“ -tooltip.BloodMagic.fluid.amount=æ•°é‡ -tooltip.BloodMagic.fluid.capacity=å®¹é‡ +tooltip.bloodmagic.itemFilter.exact=精确匹é…ç‰©å“ +tooltip.bloodmagic.itemFilter.ignoreNBT=忽视筛选的NBT +tooltip.bloodmagic.itemFilter.modItems=åŒMod的物å“å…¨éƒ¨åŒ¹é… +tooltip.bloodmagic.itemFilter.oreDict=按矿物辞典筛选 -tooltip.BloodMagic.ghost.everything=ä»»ä½•ç‰©å“ -tooltip.BloodMagic.ghost.amount=å¹½çµç‰©å“æ•°é‡: %d +tooltip.bloodmagic.itemFilter.exact=ç²¾ç¡®åŒ¹é…æ¶²ä½“ -tooltip.BloodMagic.currentType.default=è•´å«: 原生æ„å¿— -tooltip.BloodMagic.currentType.corrosive=è•´å«: è…蚀æ„å¿— -tooltip.BloodMagic.currentType.destructive=è•´å«: ç ´åæ„å¿— -tooltip.BloodMagic.currentType.vengeful=è•´å«: å¤ä»‡æ„å¿— -tooltip.BloodMagic.currentType.steadfast=è•´å«: åšå®šæ„å¿— +tooltip.bloodmagic.fluid.type=æ‰€å«æ¶²ä½“:%s +tooltip.bloodmagic.fluid.amount=æ•°é‡ï¼š%d / %d mB +tooltip.bloodmagic.fluid.capacity=容é‡ï¼š%d mB -tooltip.BloodMagic.currentBaseType.default=原生 -tooltip.BloodMagic.currentBaseType.corrosive=è…蚀 -tooltip.BloodMagic.currentBaseType.destructive=ç ´å -tooltip.BloodMagic.currentBaseType.vengeful=å¤ä»‡ -tooltip.BloodMagic.currentBaseType.steadfast=åšå®š +tooltip.bloodmagic.ghost.everything=ä»»ä½•ç‰©å“ +tooltip.bloodmagic.ghost.amount=å¹½çµç‰©å“æ•°é‡ï¼š%d -tooltip.BloodMagic.experienceTome=用于储存ç»éªŒçš„书 -tooltip.BloodMagic.experienceTome.exp=ç»éªŒå€¼: %0.3f -tooltip.BloodMagic.experienceTome.expLevel=等级: %d +tooltip.bloodmagic.currentType.default=è•´å«ï¼šåŽŸç”Ÿæ„å¿— +tooltip.bloodmagic.currentType.corrosive=è•´å«ï¼šè…蚀æ„å¿— +tooltip.bloodmagic.currentType.destructive=è•´å«ï¼šç ´åæ„å¿— +tooltip.bloodmagic.currentType.vengeful=è•´å«ï¼šå¤ä»‡æ„å¿— +tooltip.bloodmagic.currentType.steadfast=è•´å«ï¼šå𿝅æ„å¿— -tooltip.BloodMagic.decoration.safe=安全装潢 -tooltip.BloodMagic.decoration.notSafe=å±é™©è£…æ½¢ +tooltip.bloodmagic.currentBaseType.default=原生 +tooltip.bloodmagic.currentBaseType.corrosive=è…蚀 +tooltip.bloodmagic.currentBaseType.destructive=ç ´å +tooltip.bloodmagic.currentBaseType.vengeful=å¤ä»‡ +tooltip.bloodmagic.currentBaseType.steadfast=åšæ¯… -tooltip.BloodMagic.cuttingFluidRatio=%d/%d 所剩å¯ç”¨ +tooltip.bloodmagic.experienceTome=用于储存ç»éªŒçš„书 +tooltip.bloodmagic.experienceTome.exp=ç»éªŒå€¼ï¼š%0.3f +tooltip.bloodmagic.experienceTome.expLevel=等级:%d -tooltip.BloodMagic.potion.uses=%d 使用剩余 +tooltip.bloodmagic.decoration.safe=安全装潢 +tooltip.bloodmagic.decoration.notSafe=å±é™©è£…æ½¢ -tooltip.BloodMagic.book.shifting=这些符å·ä¼¼ä¹Ž... &oåœ¨å˜æ¢ç€... +tooltip.bloodmagic.cuttingFluidRatio=%d/%d 所剩å¯ç”¨ -tooltip.BloodMagic.willGauge=一个奇怪的装置, å¯ä»¥æµ‹é‡æ¶é­”çµåŸŸä¸­çš„æ¶é­”æ„å¿—. +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.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.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.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.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.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.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.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.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.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=好了,赶紧考虑å§ã€‚ä½ æˆ–è®¸ä¼šåŽæ‚”,因为哪怕你的æ¯å­ç©ºäº†ï¼Œå®ƒä¹Ÿå¾ˆéš¾åœ¨è¢«å¡«æ»¡... +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.altarMaker.setTier=层级设置:%d +chat.bloodmagic.altarMaker.building=铺设一个 %d å±‚ç¥­å› +chat.bloodmagic.altarMaker.destroy=消除一个 %d å±‚ç¥­å› +chat.bloodmagic.altarMaker.creativeOnly=该物å“ä»…é™åˆ›é€ æ¨¡å¼ã€‚ -chat.BloodMagic.damageSource=%s çš„çµé­‚开始å˜å¾—虚弱 +chat.bloodmagic.damageSource=%s çš„çµé­‚开始å˜å¾—虚弱 -chat.BloodMagic.ritual.weak=你感到有股拉力, ä½†æ²¡æœ‰è¶³å¤Ÿçš„åŠ›é‡æ¥å®Œæˆè¿™ä¸ªä»ªå¼. -chat.BloodMagic.ritual.prevent=仪å¼åœ¨ç§¯æžçš„æŠµæŠ—ä½ ! -chat.BloodMagic.ritual.activate=ä¸€è‚¡èƒ½é‡æµç»è¿™ä¸ªä»ªå¼! -chat.BloodMagic.ritual.notValid=这些仪å¼çŸ³ä¼¼ä¹Žæœ‰äº›æ‘†æ”¾ä¸å¾—当... +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.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.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.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.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=è¯å‰‚生æˆåŠå¾„已增加至: % 格方å—. -chat.BloodMagic.mimic.potionSpawnRadius.down=è¯å‰‚生æˆåŠå¾„å·²å‡å°‘至: % 格方å—. +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=æ‹Ÿæ€ - -# sekrit - -secret.BloodMagic.bread.bloody=&r&c血腥é¢åŒ… -secret.BloodMagic.bread.bloody.desc=唯有 &o坿€• &r&7紧急情况 +entity.bloodmagic.SentientSpecter.name=æ„ŸçŸ¥ä¹‹çµ +entity.bloodmagic.Mimic.name=æ‹Ÿæ€ # Commands commands.error.arg.invalid=æ— æ•ˆå‚æ•° commands.error.arg.missing=傿•°ä¸è¶³ -commands.error.arg.player.missing=ä½ å¿…é¡»æŒ‡å®šä¸€ä¸ªçŽ©å®¶æ¥æ‰§è¡Œè¯¥å‘½ä»¤. -commands.error.404=命令未找到! -commands.error.unknown=未知的命令! -commands.error.perm=你没有使用该命令的æƒé™. +commands.error.arg.player.missing=ä½ å¿…é¡»æŒ‡å®šä¸€ä¸ªçŽ©å®¶æ¥æ‰§è¡Œè¯¥å‘½ä»¤ã€‚ +commands.error.404=å‘½ä»¤æœªæ‰¾åˆ°ï¼ +commands.error.unknown=æœªçŸ¥çš„å‘½ä»¤ï¼ +commands.error.perm=你没有使用该命令的æƒé™ã€‚ commands.success=æˆåŠŸæ‰§è¡Œ @@ -791,87 +798,87 @@ commands.format.help=%s - %s commands.format.error=%s - %s commands.help.usage=/bloodmagic help -commands.help.help=使用"/bloodmagic help"命令显示指令列表. +commands.help.help=使用"/bloodmagic help"命令显示指令列表。 commands.network.usage=/bloodmagic network [å¸å–(syphon)|添加(add)|查看(get)|å¡«å……(fill)|填满(cap)] <玩家> [æ•°é‡] commands.network.help=çµé­‚网络实用工具 -commands.network.syphon.help=从指定玩家的çµé­‚网络中移出指定的LP值. -commands.network.syphon.success=æˆåŠŸä»Ž %s å¸å–出 %dLP . -commands.network.add.help=添加指定的LP值到指定玩家的çµé­‚网络中. æœä»Žæ ‡å‡†çš„LP增加规则. -commands.network.add.success=æˆåŠŸæ·»åŠ  %dLP 到 %s çš„çµé­‚网络. -commands.network.set.help=将指定玩家的LP设置为所给数值. -commands.network.set.success=æˆåŠŸå°† %s çµé­‚网络中的LP设置为 %d . -commands.network.get.help=返还指定玩家çµé­‚网络中的LP值. -commands.network.fill.help=将指定玩家的LP填充为 %d. -commands.network.fill.success=æˆåŠŸå¡«å…… %s çš„çµé­‚网络. -commands.network.cap.help=填充指定玩家的çµé­‚ç½‘ç»œè‡³å…¶æ‰€æŒæœ‰çš„æœ€é«˜é˜¶æ°”è¡€å®ç å®¹é‡çš„æœ€å¤§å€¼. -commands.network.cap.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚网络. +commands.network.syphon.help=从指定玩家的çµé­‚网络中移出指定的LP值。 +commands.network.syphon.success=æˆåŠŸä»Ž %s å¸å–出 %dLP。 +commands.network.add.help=添加指定的LP值到指定玩家的çµé­‚网络中。æœä»Žæ ‡å‡†çš„LP增加规则。 +commands.network.add.success=æˆåŠŸæ·»åŠ  %dLP 到 %s çš„çµé­‚网络。 +commands.network.set.help=将指定玩家的LP设置为所给数值。 +commands.network.set.success=æˆåŠŸå°† %s çµé­‚网络中的LP设置为 %d。 +commands.network.get.help=返还指定玩家çµé­‚网络中的LP值。 +commands.network.fill.help=将指定玩家的LP填充为 %d。 +commands.network.fill.success=æˆåŠŸå¡«å…… %s çš„çµé­‚网络。 +commands.network.cap.help=填充指定玩家的çµé­‚ç½‘ç»œè‡³å…¶æ‰€æŒæœ‰çš„æœ€é«˜é˜¶æ°”è¡€å®ç å®¹é‡çš„æœ€å¤§å€¼ã€‚ +commands.network.cap.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚网络。 commands.bind.usage=/bind <玩家> -commands.bind.help=用于设置/解除对手æŒç‰©å“的绑定情况. -commands.bind.success=ç‰©å“æˆåŠŸç»‘å®š! +commands.bind.help=用于设置/解除对手æŒç‰©å“的绑定情况。 +commands.bind.success=ç‰©å“æˆåŠŸç»‘å®šï¼ commands.bind.remove.success=解除绑定æˆåŠŸ commands.orb.usage=/bloodmagic orb [设置(set)|查看(get)] <玩家> [等级] commands.orb.help=用于设置或查看玩家的最高血å®ç ç­‰çº§. commands.bind.usage=/bind <玩家> -commands.bind.success=ç‰©å“æˆåŠŸç»‘å®š! +commands.bind.success=ç‰©å“æˆåŠŸç»‘å®šï¼ commands.bind.failed.noPlayer=没有指定玩家 -commands.bind.failed.alreadyBound=物å“å·²ç»è¢«ç»‘定; 使用 /unbind æ¥è§£é™¤ç»‘定 +commands.bind.failed.alreadyBound=物å“å·²ç»è¢«ç»‘定;使用 /unbind æ¥è§£é™¤ç»‘定 commands.bind.failed.notBindable=ç‰©å“æ— æ³•被绑定 commands.unbind.usage=/unbind -commands.unbind.success=ç‰©å“æˆåŠŸè§£é™¤ç»‘å®š! +commands.unbind.success=ç‰©å“æˆåŠŸè§£é™¤ç»‘å®šï¼ commands.unbind.failed.notBindable=ç‰©å“æ— æ³•解除绑定 commands.soulnetwork.usage=/soulnetwork <玩家> <添加(add)|å‡åŽ»(subtract)|填满(fill)|清空(empty)|查看(get)> [æ•°é‡] -commands.soulnetwork.add.success=æˆåŠŸæ·»åŠ  %dLP 到 %s çš„çµé­‚网络! -commands.soulnetwork.subtract.success=æˆåŠŸä»Ž %s çš„çµé­‚网络中å‡åŽ» %dLP ! -commands.soulnetwork.fill.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚网络! -commands.soulnetwork.empty.success=æˆåŠŸæ¸…ç©º %s çš„çµé­‚网络! -commands.soulnetwork.get.success=%s çš„çµé­‚网络中有 %dLP ! +commands.soulnetwork.add.success=æˆåŠŸæ·»åŠ  %dLP 到 %s çš„çµé­‚ç½‘ç»œï¼ +commands.soulnetwork.subtract.success=æˆåŠŸä»Ž %s çš„çµé­‚网络中å‡åŽ» %dLPï¼ +commands.soulnetwork.fill.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚ç½‘ç»œï¼ +commands.soulnetwork.empty.success=æˆåŠŸæ¸…ç©º %s çš„çµé­‚ç½‘ç»œï¼ +commands.soulnetwork.get.success=%s çš„çµé­‚网络中有 %dLPï¼ commands.soulnetwork.noPlayer=没有指定玩家 commands.soulnetwork.noCommand=è¿™ä¸ç¬¦å‘½ä»¤è§„定 commands.soulnetwork.notACommand=è¿™ä¸æ˜¯æœ‰æ•ˆçš„命令 -commands.soulnetwork.fillMax.success=æˆåŠŸå°† %s çš„çµé­‚网络填满至其å®ç çš„æœ€å¤§å€¼! -commands.soulnetwork.create.success=创建 %s çš„çµé­‚网络æˆåŠŸ (å®ç ç­‰çº§: %d) +commands.soulnetwork.fillMax.success=æˆåŠŸå°† %s çš„çµé­‚网络填满至其å®ç çš„æœ€å¤§å€¼ï¼ +commands.soulnetwork.create.success=创建 %s çš„çµé­‚网络æˆåŠŸï¼ˆå®ç ç­‰çº§ï¼š%d) # GUI -tile.BloodMagic.inputNode.name=输入节点 -tile.BloodMagic.outputNode.name=输出节点 +tile.bloodmagic.inputNode.name=输入节点 +tile.bloodmagic.outputNode.name=输出节点 # Keybinds -BloodMagic.keybind.open_holding=打开集æŒå°è®° -BloodMagic.keybind.cycle_holding_pos=循环选择å°è®° (+) -BloodMagic.keybind.cycle_holding_neg=循环选择å°è®° (-) +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.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å¯ä»¥é€šè¿‡ç”¨æ„ŸçŸ¥æ­¦å™¨æ€æ­»ç”Ÿç‰©æŽ‰è½, 或是对ç€ç”Ÿç‰©æŠ›æŽ·åŽŸå§‹æŠ•ç½‘, 当它出现白色颗粒时æ€äº†å®ƒ. +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=炼金矩阵 +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=血红奥术 @@ -879,7 +886,7 @@ tc.research_category.BLOODMAGIC=血红奥术 # Thaumcraft Research bloodmagic.research_name.BLOODMAGIC=血魔法 bloodmagic.research_text.BLOODMAGIC=血红奥术 -bloodmagic.research_page.BLOODMAGIC.1=è¡€é­”æ³•çš„é¢†åŸŸæ€»æ˜¯ä¼¼ä¹Žæœ‰äº›å­¤ç«‹ä¸”åƒæ˜¯"个人"艺术, åŒä¼—所周知的喜爱éšå±…有时还有点疯癫的血魔法师. 然而, 自我牺牲与生命æºè´¨çš„力é‡ç”šè‡³æ‹¥æœ‰è¶…出一般血魔法师所è§çš„用途, 事实上, è¿™ç§åЛ釿˜¾ç„¶ç»ˆç©¶èƒ½åº”用于神秘学. +bloodmagic.research_page.BLOODMAGIC.1=è¡€é­”æ³•çš„é¢†åŸŸæ€»æ˜¯ä¼¼ä¹Žæœ‰äº›å­¤ç«‹ä¸”åƒæ˜¯â€œä¸ªäººâ€è‰ºæœ¯ï¼ŒåŒä¼—所周知的喜爱éšå±…有时还有点疯癫的血魔法师。然而,自我牺牲与生命æºè´¨çš„力é‡ç”šè‡³æ‹¥æœ‰è¶…出一般血魔法师所è§çš„用途,事实上,这ç§åЛ釿˜¾ç„¶ç»ˆç©¶èƒ½åº”用于神秘学。 # Buttons button.bloodmagic.tooltip.fill=填充网络 diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang new file mode 100644 index 00000000..7732676e --- /dev/null +++ b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang @@ -0,0 +1,258 @@ +# 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点生命值(åŠé¢—心)。因为是普通的急迫效果,所以它也å¯ä»¥æé«˜ä½ çš„æ”»å‡»é€Ÿåº¦ï¼Œä¸è¿‡è¦è®°ä½ï¼Œåˆ«çš„çŽ©å®¶åŒæ ·ä¼šè¢«é˜µåˆ—è¦†ç›–åˆ°ï¼ From de0fd9d7195a8200ee9e4960b12198e5d7e8fcaf Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 28 Mar 2017 19:32:34 -0700 Subject: [PATCH 096/595] Update changelog + version (cherry picked from commit 0b0ec65) --- changelog.txt | 19 +++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index d7af49f9..283b9cdc 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,22 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 874b03bb..815bbdea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.7 +mod_version=2.1.8 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From 78a71e47e04571bee510153942d359e915d1842d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 3 Apr 2017 16:56:21 -0700 Subject: [PATCH 097/595] Fix Alchemy Table overwriting output each time it crafts (#1119) --- .../java/WayofTime/bloodmagic/tile/TileAlchemyTable.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 0b643d2b..0003f75e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -14,6 +14,7 @@ import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.SidedInvWrapper; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.saving.SoulNetwork; @@ -295,11 +296,10 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return false; if (currentOutputStack.isEmpty()) return true; - if (!currentOutputStack.isItemEqual(outputStack)) + if (!ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) return false; int result = currentOutputStack.getCount() + outputStack.getCount(); return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); - } public int getTierOfOrb() @@ -356,9 +356,9 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, if (currentOutputStack.isEmpty()) { setInventorySlotContents(outputSlot, outputStack); - } else if (currentOutputStack.getItem() == currentOutputStack.getItem()) + } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) { - currentOutputStack.setCount(outputStack.getCount()); + currentOutputStack.grow(outputStack.getCount()); } consumeInventory(recipe); From 805576a19bf88a15e5c320c6a28a9d0473cea91d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 3 Apr 2017 17:03:46 -0700 Subject: [PATCH 098/595] Allow commands to be used in command blocks (#1117) --- .../WayofTime/bloodmagic/command/CommandBloodMagic.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java index 625166fa..dd92000e 100644 --- a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java @@ -29,6 +29,12 @@ public class CommandBloodMagic extends CommandTreeBase return "/bloodmagic help"; } + @Override + public int getRequiredPermissionLevel() + { + return 2; + } + public static void displayHelpString(ICommandSender commandSender, String display, Object... info) { commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); From dd7f94e7568c905cdc09bcacfb6687bbe4ff945e Mon Sep 17 00:00:00 2001 From: NatsuArashi Date: Mon, 3 Apr 2017 17:09:44 -0700 Subject: [PATCH 099/595] Traditional Chinese update. (#1116) * Update zh_TW.lang * Create zh_TW.lang * Update zh_TW.lang (cherry picked from commit f44ad3a) --- .../assets/bloodmagicguide/lang/zh_TW.lang | 258 ++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang new file mode 100644 index 00000000..d568239a --- /dev/null +++ b/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang @@ -0,0 +1,258 @@ +# 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點生命值(åŠé¡†å¿ƒï¼‰ã€‚因為是普通的急迫效果,所以它也å¯ä»¥æé«˜ä½ çš„æ”»æ“Šé€Ÿåº¦ï¼Œä¸éŽè¦è¨˜ä½ï¼Œåˆ¥çš„çŽ©å®¶åŒæ¨£æœƒè¢«é™£åˆ—è¦†è“‹åˆ°ï¼ From 83bba44ab6aa4e07a0539c420db5317b3566da26 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 3 Apr 2017 17:32:20 -0700 Subject: [PATCH 100/595] Forgot to lowercase these --- .../assets/bloodmagicguide/lang/zh_TW.lang | 456 +++++++++--------- 1 file changed, 228 insertions(+), 228 deletions(-) diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang index d568239a..c4aaf9d8 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang @@ -1,258 +1,258 @@ # Book Information -guide.BloodMagic.title=血染知書 -guide.BloodMagic.display=血染知書 -guide.BloodMagic.author=血魔法 -guide.BloodMagic.welcome=血魔法 +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=煉金法陣 +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=煉金術士 +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.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查詢到——查詢主儀å¼çŸ³çš„用途å³å¯ã€‚å¦å¤–ï¼Œå°æ–¼ä¸€å€‹ç‰¹å®šçš„é™ç´šä¾†èªªï¼Œæ ¸å¿ƒç‰©å“是一定的,所以你也å¯ä»¥é¸æ“‡æŸ¥è©¢æŸå€‹ç‰©å“ä¾†å®šä½æŸå€‹é™ç´šæ‰€éœ€çš„祭å“。 +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.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.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.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.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.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=éˆåŸŸæ¸¬é‡å„€ +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=你需è¦ä¸€å€‹æ¸¬é‡å„€ä¾†æ¸¬å®šéˆåŸŸä¸­çš„æƒ¡é­”æ„志濃度。åªéœ€è¦ä¸€ç›´æ”¾åœ¨ä½ çš„背包中,測é‡å„€ä¾¿å¯å°‡æ¿ƒåº¦ä»¥äº”個指示器的形å¼é¡¯ç¤ºå‡ºä¾†ï¼ˆåœ¨å±å¹•左上角)。潛行時你還能得知具體數é‡ï¼Œä½†é€™å€‹çµæžœæ˜¯ç¶“éŽå››æ¨äº”入的。 +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=法陣:速掘 +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點生命值(åŠé¡†å¿ƒï¼‰ã€‚因為是普通的急迫效果,所以它也å¯ä»¥æé«˜ä½ çš„æ”»æ“Šé€Ÿåº¦ï¼Œä¸éŽè¦è¨˜ä½ï¼Œåˆ¥çš„çŽ©å®¶åŒæ¨£æœƒè¢«é™£åˆ—è¦†è“‹åˆ°ï¼ +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點生命值(åŠé¡†å¿ƒï¼‰ã€‚因為是普通的急迫效果,所以它也å¯ä»¥æé«˜ä½ çš„æ”»æ“Šé€Ÿåº¦ï¼Œä¸éŽè¦è¨˜ä½ï¼Œåˆ¥çš„çŽ©å®¶åŒæ¨£æœƒè¢«é™£åˆ—è¦†è“‹åˆ°ï¼ From bffd191efd0a2fb2f23659770078da1640f5ad62 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 3 Apr 2017 17:57:40 -0700 Subject: [PATCH 101/595] Re-implement Soul Fray on death This should be all that's needed --- .../bloodmagic/potion/PotionEventHandlers.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 081d1a87..382e81da 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -1,15 +1,18 @@ package WayofTime.bloodmagic.potion; +import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; import WayofTime.bloodmagic.registry.ModPotions; import net.minecraft.entity.Entity; import net.minecraft.entity.IProjectile; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityThrowable; +import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -109,6 +112,20 @@ public class PotionEventHandlers } } + @SubscribeEvent + public void onPlayerRespawn(PlayerEvent.Clone event) + { + if (event.isWasDeath()) + event.getEntityPlayer().addPotionEffect(new PotionEffect(ModPotions.soulFray, 400)); + } + + @SubscribeEvent + public void onSacrificeKnifeUsed(SacrificeKnifeUsedEvent event) + { + if (event.player.isPotionActive(ModPotions.soulFray)) + event.lpAdded = (int) (event.lpAdded * 0.1D); + } + @SubscribeEvent(priority = EventPriority.HIGHEST) public void onPlayerDamageEvent(LivingAttackEvent event) { From 09bab4fca02f210baaefdd280b056be7ba6df48e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 3 Apr 2017 18:02:56 -0700 Subject: [PATCH 102/595] Update changelog + version (cherry picked from commit 078ab16) --- changelog.txt | 14 ++++++++++++++ gradle.properties | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 283b9cdc..a6b19db1 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,17 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 815bbdea..a991a5bc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.8 +mod_version=2.1.9 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From 7c19e2e2d2232cd4ef522ec9d656bffa4f19635f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 30 Apr 2017 17:20:17 -0700 Subject: [PATCH 103/595] Sanity check pos passed by client Prevents malicious clients from loading arbitrary chunks. Thanks to @pau101 for spotting it. --- .../bloodmagic/network/ItemRouterAmountPacketProcessor.java | 3 +++ .../bloodmagic/network/ItemRouterButtonPacketProcessor.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java index debc75e3..d6cc57b8 100644 --- a/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java @@ -67,6 +67,9 @@ public class ItemRouterAmountPacketProcessor implements IMessage, IMessageHandle World world = DimensionManager.getWorld(dimension); if (world != null) { + if (!world.isBlockLoaded(pos)) + return; + TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileFilteredRoutingNode) { diff --git a/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java index d3b3dcf8..905af75a 100644 --- a/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java @@ -63,6 +63,9 @@ public class ItemRouterButtonPacketProcessor implements IMessage, IMessageHandle World world = DimensionManager.getWorld(dimension); if (world != null) { + if (!world.isBlockLoaded(pos)) + return; + TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileFilteredRoutingNode) { From 2789e351c0cc0fabe1c7fa9869a116de172d0179 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 8 May 2017 19:36:48 -0700 Subject: [PATCH 104/595] Bound tools now properly mark themselves as tools Because *somebody* forgot to do that. (cherry picked from commit 717279d) --- src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 77ff7710..ed35e9b9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -63,6 +63,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable super(damage, 1, ModItems.BOUND_TOOL_MATERIAL, effectiveBlocks); setUnlocalizedName(Constants.Mod.MODID + ".bound." + name); setCreativeTab(BloodMagic.tabBloodMagic); + setHarvestLevel(name, 4); this.name = name; this.tooltipBase = "tooltip.bloodmagic.bound." + name + "."; From 66e3066dc955349616cf6160fd04c3a6948b1bbb Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 8 May 2017 19:39:31 -0700 Subject: [PATCH 105/595] Update changelog + version --- changelog.txt | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index a6b19db1..bb6911c0 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,10 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index a991a5bc..09cec845 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.9 +mod_version=2.1.10 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From a2ceee32184a14b4aebd5856ce1cd72a4b8d41ff Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 21 May 2017 12:25:35 -0700 Subject: [PATCH 106/595] Fix diamond meteor giving blocks + dynamically calculate weight (#1126) --- .../java/WayofTime/bloodmagic/meteor/Meteor.java | 8 ++++++-- .../bloodmagic/meteor/MeteorConfigHandler.java | 12 ++++++------ .../WayofTime/bloodmagic/meteor/MeteorRegistry.java | 4 ++-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java index 0a28f0b3..cb0e2aa0 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java @@ -25,13 +25,17 @@ public class Meteor @Setter public int version; - public Meteor(ItemStack catalystStack, List components, float explosionStrength, int radius, int maxWeight) + public Meteor(ItemStack catalystStack, List components, float explosionStrength, int radius) { this.catalystStack = catalystStack; this.components = components; this.explosionStrength = explosionStrength; this.radius = radius; - this.maxWeight = maxWeight; + + int weight = 0; + for (MeteorComponent component : components) + weight += component.getWeight(); + this.maxWeight = weight; } public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index dbe77473..ab2bd130 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -120,8 +120,9 @@ public class MeteorConfigHandler 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, 1000); + Meteor ironMeteor = new Meteor(new ItemStack(Blocks.IRON_BLOCK), ironMeteorList, 15, 5); ironMeteor.setVersion(2); + // Gold List goldMeteorList = Lists.newArrayList(); goldMeteorList.add(new MeteorComponent(200, "oreIron")); @@ -132,10 +133,10 @@ public class MeteorConfigHandler 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, 1000); + Meteor goldMeteor = new Meteor(new ItemStack(Blocks.GOLD_BLOCK), goldMeteorList, 18, 6); goldMeteor.setVersion(3); + // Diamond List diamondMeteorList = Lists.newArrayList(); diamondMeteorList.add(new MeteorComponent(50, "oreIron")); diamondMeteorList.add(new MeteorComponent(100, "oreGold")); @@ -143,9 +144,8 @@ public class MeteorConfigHandler diamondMeteorList.add(new MeteorComponent(250, "oreDiamond")); diamondMeteorList.add(new MeteorComponent(180, "oreEmerald")); diamondMeteorList.add(new MeteorComponent(50, "oreRedstone")); - diamondMeteorList.add(new MeteorComponent(400, "minecraft:diamond_block")); - - Meteor diamondMeteor = new Meteor(new ItemStack(Blocks.DIAMOND_BLOCK), diamondMeteorList, 10, 3, 1000); + diamondMeteorList.add(new MeteorComponent(400, "oreDiamond")); + Meteor diamondMeteor = new Meteor(new ItemStack(Blocks.DIAMOND_BLOCK), diamondMeteorList, 10, 3); diamondMeteor.setVersion(3); holders.add(Pair.of("IronMeteor", ironMeteor)); diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java index f85cbcc4..9e7fd9aa 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java @@ -23,9 +23,9 @@ public class MeteorRegistry } } - public static void registerMeteor(ItemStack stack, List componentList, float explosionStrength, int radius, int maxWeight) + public static void registerMeteor(ItemStack stack, List componentList, float explosionStrength, int radius) { - Meteor holder = new Meteor(stack, componentList, explosionStrength, radius, maxWeight); + Meteor holder = new Meteor(stack, componentList, explosionStrength, radius); registerMeteor(stack, holder); } From 5b9bb07d8da8c434ee288a5730aaf0681564a0df Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 21 May 2017 12:29:52 -0700 Subject: [PATCH 107/595] Large Bloodstone Bricks should get 4 from crafting (#1125) --- src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index d44d2a6a..b059e375 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -122,7 +122,7 @@ public class ModRecipes GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.PACK_SACRIFICE), "aba", "cdc", "aea", 'a', "blockGlass", 'b', Items.BUCKET, 'c', "ingotIron", 'd', Items.LEATHER_CHESTPLATE, 'e', ModItems.SLATE)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.RITUAL_DIVINER), "dfd", "ase", "dwd", 'f', EnumRuneType.FIRE.getScribeStack(), 'a', EnumRuneType.AIR.getScribeStack(), 'w', EnumRuneType.WATER.getScribeStack(), 'e', EnumRuneType.EARTH.getScribeStack(), 'd', "gemDiamond", 's', "stickWood")); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.RITUAL_DIVINER, 1, 1), " S ", "tdt", " S ", 'S', new ItemStack(ModItems.SLATE, 1, 3), 't', EnumRuneType.DUSK.getScribeStack(), 'd', new ItemStack(ModItems.RITUAL_DIVINER))); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_STONE, 1, 1), "aa", "aa", 'a', new ItemStack(ModBlocks.BLOOD_STONE))); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_STONE, 4, 1), "aa", "aa", 'a', new ItemStack(ModBlocks.BLOOD_STONE))); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.BLOOD_STONE, 16), "stone", new ItemStack(ModItems.BLOOD_SHARD))); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.ACTIVATION_CRYSTAL, 1, 1), new ItemStack(Items.NETHER_STAR), OrbRegistry.getOrbStack(ModItems.ORB_ARCHMAGE)); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.SOUL_SNARE, 4, 0), "sis", "iri", "sis", 's', "string", 'i', "ingotIron", 'r', "dustRedstone")); From c7f644528bcf06711d654296581afe54513c8722 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 21 May 2017 12:56:51 -0700 Subject: [PATCH 108/595] Fix permission level for commands (#1117) --- .../WayofTime/bloodmagic/command/sub/SubCommandBind.java | 6 ++++++ .../WayofTime/bloodmagic/command/sub/SubCommandNetwork.java | 6 ++++++ .../WayofTime/bloodmagic/command/sub/SubCommandOrb.java | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index ae6489d9..0798f3fe 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -26,6 +26,12 @@ public class SubCommandBind extends CommandBase return TextHelper.localizeEffect("commands.bind.usage"); } + @Override + public int getRequiredPermissionLevel() + { + return 2; + } + @Override public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index f54f501d..f874d954 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -25,6 +25,12 @@ public class SubCommandNetwork extends CommandBase return TextHelper.localizeEffect("commands.network.usage"); } + @Override + public int getRequiredPermissionLevel() + { + return 2; + } + @Override public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java index d982059b..58c5396c 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -26,6 +26,12 @@ public class SubCommandOrb extends CommandBase return TextHelper.localizeEffect("commands.orb.usage"); } + @Override + public int getRequiredPermissionLevel() + { + return 2; + } + @Override public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { From abef1bada7c7daefba22eda335cb595ba8891141 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 21 May 2017 13:08:29 -0700 Subject: [PATCH 109/595] Add support for ExU and AA crops to plantable handler (#1107) Theoretically. Don't actually know if their stuff is written properly. --- .../harvest/HarvestHandlerPlantable.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index 6696d367..6345269f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -7,9 +7,12 @@ import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; +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.util.List; @@ -28,6 +31,13 @@ public class HarvestHandlerPlantable implements IHarvestHandler 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); } @Override @@ -51,11 +61,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler if (stack.getItem() instanceof IPlantable) { - if (stack.getCount() > 1) - stack.shrink(1); - else - drops.remove(stack); - + stack.shrink(1); foundSeed = true; break; } @@ -67,6 +73,9 @@ public class HarvestHandlerPlantable implements IHarvestHandler world.playEvent(2001, pos, Block.getStateId(blockStack.getState())); for (ItemStack stack : drops) { + if (stack.isEmpty()) + continue; + if (!world.isRemote) { EntityItem toDrop = new EntityItem(world, pos.getX(), pos.getY() + 0.5, pos.getZ(), stack); @@ -79,4 +88,14 @@ public class HarvestHandlerPlantable implements IHarvestHandler return false; } + + 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); + } } From 2c08d046f8ff1c0c5e2c36121c7c5993c41e1d3f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 21 May 2017 13:45:24 -0700 Subject: [PATCH 110/595] Node Router now prints to action bar instead of chat --- .../item/routing/ItemNodeRouter.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index 9efc7c0b..cad28fcb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -7,7 +7,6 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.routing.IMasterRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; -import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -18,6 +17,7 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -70,7 +70,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi if (!containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, BlockPos.ORIGIN); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.remove")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.remove"), true); return EnumActionResult.FAIL; } return EnumActionResult.FAIL; @@ -80,7 +80,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi if (containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, pos); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.set")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.set"), true); return EnumActionResult.SUCCESS; } else { @@ -100,7 +100,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi master.addConnection(pos, containedPos); master.addNodeToList(node); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link.master")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -108,7 +108,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi { master.addConnection(pos, containedPos); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link.master")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -125,7 +125,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi master.addConnection(pos, containedPos); pastNode.addConnection(pos); master.addNodeToList(pastNode); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link.master")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -133,7 +133,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi { master.addConnection(pos, containedPos); pastNode.addConnection(pos); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link.master")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -153,7 +153,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } else if (pastNode.getMasterPos().equals(BlockPos.ORIGIN)) //pastNode is not connected to a master, but node is @@ -168,7 +168,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } else if (node.getMasterPos().equals(BlockPos.ORIGIN)) //node is not connected to a master, but pastNode is @@ -183,7 +183,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - ChatUtil.sendChat(player, TextHelper.localize("chat.bloodmagic.routing.link")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } else From e9ce88fc73f4f4fe471f15c5ecffaa9a4c93a0b0 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 23 May 2017 18:53:32 -0700 Subject: [PATCH 111/595] Fixed capacity on tank being reset when tile was reloaded (#1138) --- src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java index 3f0001c3..0df38b4a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java @@ -34,6 +34,7 @@ public class TileBloodTank extends TileBase super.deserialize(tagCompound); tank.readFromNBT(tagCompound.getCompoundTag(Constants.NBT.TANK)); capacity = tagCompound.getInteger(Constants.NBT.ALTAR_CAPACITY); + tank.setCapacity(capacity); } @Override From 38e54a4e2f6621df459c19d4d28e72f086fd8ef2 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 23 May 2017 18:41:24 -0700 Subject: [PATCH 112/595] Fixed NPE in Fluid Filter (#1139) (cherry picked from commit 9a7db20) --- .../WayofTime/bloodmagic/routing/RoutingFluidFilter.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java index 2b5f7812..b5132798 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -13,6 +13,8 @@ import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; +import javax.annotation.Nullable; + public class RoutingFluidFilter implements IFluidFilter { protected List requestList; @@ -85,9 +87,13 @@ public class RoutingFluidFilter implements IFluidFilter } } + @Nullable public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) { FluidStack fluidStack = FluidUtil.getFluidContained(inputStack); + if (fluidStack == null) + return null; + fluidStack.amount = inputStack.getCount(); return fluidStack; } From e95b6f3bf25ce6f2cf08f86d9ddb6c7b7f85c363 Mon Sep 17 00:00:00 2001 From: NoX-programer Date: Wed, 24 May 2017 20:00:48 +0700 Subject: [PATCH 113/595] Update ru_RU.lang: fix many typos (branch 1.11) (#1148) * Update ru_RU.lang * Update ru_RU.lang --- .../assets/bloodmagic/lang/ru_RU.lang | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang index 47c36889..db0f46b8 100644 --- a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang +++ b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang @@ -1,4 +1,4 @@ -#Creative Tab +#Creative Tab itemGroup.bloodmagic.creativeTab=Blood Magic itemGroup.bloodmagic.creativeTabTome=Blood Magic Upgrade Tomes @@ -221,10 +221,10 @@ 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.currentBonus=БонуÑ: +%,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.currentBonus=БонуÑ: +%d%% tooltip.bloodmagic.sigil.water.desc=&oÐужна вода? tooltip.bloodmagic.sigil.lava.desc=&oГОРЯЧЕЕ! ÐЕ ЕСТЬ! tooltip.bloodmagic.sigil.void.desc=&oЛучше чем Swiffer! @@ -235,15 +235,15 @@ 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=ПрогреÑÑ: %d LP/ %s LP tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent=ПрогреÑÑ: %s -tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate=РаÑход: %,d LP +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.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ÐеприÑтноÑти Ð´Ð»Ñ Ñтранников КраÑ! @@ -262,7 +262,7 @@ tooltip.bloodmagic.inscriber.desc=ÐадпиÑи на Ñтене... tooltip.bloodmagic.pack.selfSacrifice.desc=This pack really chafes... tooltip.bloodmagic.pack.sacrifice.desc=Description -tooltip.bloodmagic.pack.stored=Ðакоплено: %,d LP +tooltip.bloodmagic.pack.stored=Ðакоплено: %d LP tooltip.bloodmagic.activationCrystal.weak=Ðктивирует проÑтые ритуалы tooltip.bloodmagic.activationCrystal.awakened=Ðктивирует Ñложные ритуалы @@ -282,7 +282,7 @@ tooltip.bloodmagic.diviner.currentDirection=Ðаправление: %s tooltip.bloodmagic.arcaneAshes=Пепел Ð´Ð»Ñ Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ð°Ð»Ñ…Ð¸Ð¼Ð¸Ñ‡ÐµÑких знаков -tooltip.bloodmagic.telepositionFocus.coords=Координаты: (%,d, %,d, %,d) +tooltip.bloodmagic.telepositionFocus.coords=Координаты: (%d, %d, %d) tooltip.bloodmagic.telepositionFocus.dimension=ID ИзмерениÑ: %d tooltip.bloodmagic.telepositionFocus.weak=Может перемещать блоки tooltip.bloodmagic.telepositionFocus.enhanced=Может перемещать блоки @@ -320,9 +320,9 @@ tooltip.bloodmagic.itemFilter.ignoreNBT=ПозволÑет игнорирова tooltip.bloodmagic.itemFilter.modItems=ПозволÑет отобрать предметы из одного мода tooltip.bloodmagic.itemFilter.oreDict=Фильтр иÑпользующий Ore Dictionary -tooltip.bloodmagic.fluid.type=Содержит -tooltip.bloodmagic.fluid.amount=Кол-во -tooltip.bloodmagic.fluid.capacity=ÐмкоÑть +tooltip.bloodmagic.fluid.type=ЖидкоÑть: %s +tooltip.bloodmagic.fluid.amount=Кол-во: %d / %d мВ +tooltip.bloodmagic.fluid.capacity=ÐмкоÑть: %d мВ # Ritual ritual.bloodmagic.testRitual=ТеÑтовый ритуал @@ -375,10 +375,10 @@ jei.bloodmagic.recipe.altar=Кровавый алтарь jei.bloodmagic.recipe.binding=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° (СвÑзывание) jei.bloodmagic.recipe.alchemyArrayCrafting=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° jei.bloodmagic.recipe.soulForge=ÐдÑÐºÐ°Ñ ÐºÑƒÐ·Ð½Ð¸Ñ†Ð° -jei.bloodmagic.recipe.requiredLP=LP: %,d +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.consumptionRate=РаÑход: %d LP/t +jei.bloodmagic.recipe.drainRate=Потери: %d LP/t jei.bloodmagic.recipe.minimumSouls=Минимум: %1$,.2f Ñнергии jei.bloodmagic.recipe.soulsDrained=Затраты: %1$,.2f Ñнергии @@ -401,4 +401,4 @@ 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! \ No newline at end of file +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! From 6656fe58dc2f751674e7576ef09e872568bdc52c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 27 May 2017 16:04:40 -0700 Subject: [PATCH 114/595] Moved living armor notifications to action bar --- .../WayofTime/bloodmagic/item/armour/ItemLivingArmour.java | 2 +- .../java/WayofTime/bloodmagic/livingArmour/LivingArmour.java | 3 ++- .../livingArmour/upgrade/LivingArmourUpgradeFireResist.java | 3 ++- .../upgrade/LivingArmourUpgradeGrimReaperSprint.java | 3 ++- .../livingArmour/upgrade/LivingArmourUpgradePoisonResist.java | 3 ++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 2b9ea2af..71ff29f1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -158,7 +158,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP ItemStack leggings = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); ItemStack boots = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); - if (helmet == null || leggings == null || boots == null) + if (helmet.isEmpty() || leggings.isEmpty() || boots.isEmpty()) { damageAmount *= (armourReduction); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index 4507ba7e..1986b435 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -13,6 +13,7 @@ import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; @@ -175,7 +176,7 @@ public class LivingArmour implements ILivingArmour @Override public void notifyPlayerOfUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) { - ChatUtil.sendChat(user, TextHelper.localizeEffect(chatBase + "newUpgrade")); + user.sendStatusMessage(new TextComponentString(TextHelper.localizeEffect(chatBase + "newUpgrade")), true); } /** diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java index 9733a93a..634f5b3e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java @@ -4,6 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; +import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; @@ -33,7 +34,7 @@ public class LivingArmourUpgradeFireResist extends LivingArmourUpgrade player.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, fireResistDuration[this.level])); fireCooldown = fireCooldownTime[this.level]; - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect(chatBase + "fireRemove")); + player.sendStatusMessage(new TextComponentString(TextHelper.localizeEffect(chatBase + "fireRemove")), true); } else if (fireCooldown > 0) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java index bd600265..7ebd95f1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java @@ -4,6 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; +import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; @@ -90,7 +91,7 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade } deathTimer = rebirthDelay[this.level]; - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect(chatBase + "grimReaper")); + player.sendStatusMessage(new TextComponentString(TextHelper.localizeEffect(chatBase + "grimReaper")), true); } public boolean canSavePlayer(EntityPlayer player) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java index db3b3905..080f7b68 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java @@ -4,6 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; +import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; @@ -35,7 +36,7 @@ public class LivingArmourUpgradePoisonResist extends LivingArmourUpgrade player.removePotionEffect(MobEffects.POISON); poisonCooldown = poisonCooldownTime[this.level]; - ChatUtil.sendNoSpam(player, TextHelper.localize(chatBase + "poisonRemove")); + player.sendStatusMessage(new TextComponentString(TextHelper.localize(chatBase + "poisonRemove")), true); } } else if (poisonCooldown > 0) { From f7b8dc0d841bbf9ca7bf7b8a3b26ec8ce426871c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 1 Jun 2017 22:16:24 -0700 Subject: [PATCH 115/595] API-facing methods for removing recipes (#1152) --- .../bloodmagic/api/recipe/AlchemyTableRecipe.java | 4 ++++ .../bloodmagic/api/recipe/TartaricForgeRecipe.java | 4 ++++ .../api/registry/AlchemyArrayRecipeRegistry.java | 10 ++-------- .../api/registry/AlchemyTableRecipeRegistry.java | 5 +++++ .../bloodmagic/api/registry/AltarRecipeRegistry.java | 5 +++++ .../api/registry/TartaricForgeRecipeRegistry.java | 5 +++++ 6 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java index e200c95e..497102ae 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java @@ -5,7 +5,9 @@ import java.util.Iterator; import java.util.List; import com.google.common.collect.ImmutableList; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.ToString; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -13,6 +15,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; +@EqualsAndHashCode +@ToString public class AlchemyTableRecipe { protected ItemStack output = ItemStack.EMPTY; diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java index efe283ac..88f102c3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java @@ -1,6 +1,8 @@ package WayofTime.bloodmagic.api.recipe; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.ToString; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -12,6 +14,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +@EqualsAndHashCode +@ToString public class TartaricForgeRecipe { protected ItemStack output = null; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java index 349d315d..a90b6139 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java @@ -74,13 +74,7 @@ public class AlchemyArrayRecipeRegistry } } - if (circleRenderer == null) - { - recipes.put(input, new AlchemyArrayRecipe(input, catalystStack, arrayEffect, defaultRenderer)); - } else - { - recipes.put(input, new AlchemyArrayRecipe(input, catalystStack, arrayEffect, circleRenderer)); - } + recipes.put(input, new AlchemyArrayRecipe(input, catalystStack, arrayEffect, circleRenderer == null ? defaultRenderer : circleRenderer)); } public static AlchemyArrayEffect getAlchemyArrayEffect(String key) @@ -116,7 +110,7 @@ public class AlchemyArrayRecipeRegistry } /** - * @param Output + * @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 diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java index f97025ad..cbc13263 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java @@ -22,6 +22,11 @@ public class AlchemyTableRecipeRegistry 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) diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java index c2ebc323..3f71204b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java @@ -42,6 +42,11 @@ public class AltarRecipeRegistry 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. * diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java index 35c6edfa..24ad8e39 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java @@ -22,6 +22,11 @@ public class TartaricForgeRecipeRegistry 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) From 273dca3e4de3ec5d56b3f8140afea8751d34cd9a Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 1 Jun 2017 22:17:46 -0700 Subject: [PATCH 116/595] Fix client not registering capability (#1150) --- src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index a160d70a..60cac2cc 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -138,6 +138,7 @@ public class ClientProxy extends CommonProxy @Override public void init() { + super.init(); Minecraft.getMinecraft().getItemColors().registerItemColorHandler(new IItemColor() { @Override From f576ec595b3219c340ae844f68e86039aae0e5a8 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 1 Jun 2017 22:31:17 -0700 Subject: [PATCH 117/595] Fix some inverted logic with Sentient Mimics (#1149) --- src/main/java/WayofTime/bloodmagic/tile/TileMimic.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index ba6d1158..afc7b0ea 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -63,10 +63,10 @@ public class TileMimic extends TileInventory implements ITickable } internalCounter++; - if (internalCounter % potionSpawnInterval == 0 && this.getBlockMetadata() != BlockMimic.sentientMimicMeta) + if (internalCounter % potionSpawnInterval == 0 && this.getBlockMetadata() == BlockMimic.sentientMimicMeta) { ItemStack potionStack = this.getStackInSlot(1); - if (potionStack != null) + if (!potionStack.isEmpty()) { AxisAlignedBB bb = new AxisAlignedBB(this.getPos()).expand(playerCheckRadius, playerCheckRadius, playerCheckRadius); List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, bb); From 061850ee2972fb63a4bd3021d2d34efec7b9a129 Mon Sep 17 00:00:00 2001 From: Graham Hughes Date: Wed, 21 Jun 2017 20:46:42 -0500 Subject: [PATCH 118/595] Add crop support for Pam's Harvestcraft and Roots herbs (#1164) * Add harvest ritual support for Pam's crops. * Add roots crops. * Per @TehNut, use BM instance logger. * Call getMaxAge rather than hardcode 3. --- .../harvest/HarvestHandlerPlantable.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index 6345269f..9da9a653 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -1,9 +1,15 @@ package WayofTime.bloodmagic.ritual.harvest; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; + +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.iface.IHarvestHandler; import WayofTime.bloodmagic.api.registry.HarvestRegistry; import net.minecraft.block.Block; +import net.minecraft.block.BlockCrops; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; @@ -13,6 +19,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.registry.ForgeRegistries; +import net.minecraftforge.fml.relauncher.ReflectionHelper; import java.util.List; @@ -38,6 +45,15 @@ public class HarvestHandlerPlantable implements IHarvestHandler 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 @@ -98,4 +114,37 @@ public class HarvestHandlerPlantable implements IHarvestHandler if (block != null && block != Blocks.AIR) HarvestRegistry.registerStandardCrop(block, matureMeta); } + + private static void addPamCrops() + { + if (!Loader.isModLoaded("harvestcraft")) + return; + + try { + ClassLoader loader = HarvestHandlerPlantable.class.getClassLoader(); + String className = "com.pam.harvestcraft.blocks.CropRegistry"; + Class registry = ReflectionHelper.getClass(loader, className); + Field names = ReflectionHelper.findField(registry, "cropNames"); + Method getCrop = registry.getMethod("getCrop", String.class); + for (String name : (String[])names.get(null)) { + BlockCrops crop = (BlockCrops) getCrop.invoke(null, name); + HarvestRegistry.registerStandardCrop(crop, crop.getMaxAge()); + } + } catch (NoSuchMethodException e) { + BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; unable to find crop name mapper"); + return; + } catch (IllegalAccessException e) { + BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; crop name lookup broke"); + return; + } catch (InvocationTargetException e) { + BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; crop name lookup broke"); + return; + } catch (ReflectionHelper.UnableToFindClassException e) { + BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; unable to find crop registry"); + return; + } catch (ReflectionHelper.UnableToFindFieldException e) { + BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; unable to find crop names in registry"); + return; + } + } } From 16d4609a4852734c1c08b0a8cfe0a457dc1cb2fe Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 21 Jun 2017 19:11:08 -0700 Subject: [PATCH 119/595] Fix HarvestHandlerStem not working (#1165) --- .../WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java index 1d98a5f1..86ebcffe 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -39,7 +39,7 @@ public class HarvestHandlerStem implements IHarvestHandler BlockPos cropPos = pos; if (HarvestRegistry.getStemCrops().containsKey(blockStack)) { - EnumFacing cropDir = blockStack.getState().getValue(BlockStem.FACING); + EnumFacing cropDir = blockStack.getBlock().getActualState(blockStack.getState(), world, pos).getValue(BlockStem.FACING); if (cropDir != EnumFacing.UP) { From 8c12b48695d9a9a17a8edc2ab791096717685980 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 21 Jun 2017 19:14:25 -0700 Subject: [PATCH 120/595] Fix ItemStackWrapper ignoring stack's NBT (#1155) who even made this class i mean come on this is such a stupid thing to do like omgwtf what a moron --- .../java/WayofTime/bloodmagic/api/ItemStackWrapper.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java index 687930ee..dd9c53bb 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java @@ -56,11 +56,11 @@ public class ItemStackWrapper public static ItemStackWrapper getHolder(ItemStack stack) { if (stack.isEmpty()) - { return null; - } - return new ItemStackWrapper(stack.getItem(), stack.getCount(), stack.getItemDamage()); + ItemStackWrapper wrapper = new ItemStackWrapper(stack.getItem(), stack.getCount(), stack.getItemDamage()); + wrapper.setNbtTag(stack.getTagCompound()); + return wrapper; } public ItemStack toStack() From 973f1019a52055581a9a5c60cb9829116dab6f75 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 21 Jun 2017 20:10:32 -0700 Subject: [PATCH 121/595] Update changelog + version (cherry picked from commit 730b26b) --- build.gradle | 2 +- changelog.txt | 21 +++++++++++++++++++++ gradle.properties | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index aace816f..72caca4b 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ buildscript { plugins { id "net.minecraftforge.gradle.forge" version "2.0.2" - id 'com.matthewprenger.cursegradle' version '1.0.7' + id 'com.matthewprenger.cursegradle' version '1.0.9' id 'io.franzbecker.gradle-lombok' version '1.6' } diff --git a/changelog.txt b/changelog.txt index bb6911c0..bad8aefb 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,24 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 09cec845..bfbd15a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.10 +mod_version=2.1.11 mc_version=1.11 forge_version=13.19.1.2189 curse_id=224791 From 5fcdd978d767c7a844018a055df7efbe8f690c71 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 14 Aug 2017 20:53:42 -0700 Subject: [PATCH 122/595] this doesn't compile yet, but have something to peek at --- build.gradle | 60 +- gradle.properties | 14 +- .../java/WayofTime/bloodmagic/BloodMagic.java | 60 +- .../WayofTime/bloodmagic/ConfigHandler.java | 31 +- .../AlchemyArrayEffectAttractor.java | 4 +- .../bloodmagic/altar/BloodAltar.java | 16 +- .../WayofTime/bloodmagic/api/BlockStack.java | 34 +- .../bloodmagic/api/BloodMagicAPI.java | 40 +- .../WayofTime/bloodmagic/api/Constants.java | 54 +- .../alchemyCrafting/AlchemyArrayEffect.java | 12 +- .../bloodmagic/api/altar/AltarComponent.java | 14 +- .../bloodmagic/api/altar/AltarUpgrade.java | 63 +- .../api/altar/EnumAltarComponent.java | 7 +- .../bloodmagic/api/altar/EnumAltarTier.java | 6 +- .../api/event/AltarCraftedEvent.java | 10 +- .../bloodmagic/api/iface/IAlchemyArray.java | 2 +- .../bloodmagic/api/impl/ItemSigil.java | 6 +- .../bloodmagic/api/orb/BloodOrb.java | 42 +- .../bloodmagic/api/orb/IBloodOrb.java | 11 +- .../bloodmagic/api/package-info.java | 3 +- .../api/recipe/AlchemyTableRecipe.java | 57 +- .../api/recipe/TartaricForgeRecipe.java | 54 +- .../api/registry/AltarRecipeRegistry.java | 78 ++- .../bloodmagic/api/registry/OrbRegistry.java | 65 +- .../bloodmagic/api/ritual/Ritual.java | 97 ++- .../api/ritual/RitualComponent.java | 17 +- .../api/ritual/imperfect/ImperfectRitual.java | 59 +- .../api/saving/BMWorldSavedData.java | 2 +- .../bloodmagic/api/saving/SoulNetwork.java | 28 +- .../bloodmagic/api/util/helper/LogHelper.java | 6 +- .../bloodmagic/block/BlockAlchemyArray.java | 13 +- .../bloodmagic/block/BlockAlchemyTable.java | 16 +- .../bloodmagic/block/BlockAltar.java | 7 +- .../bloodmagic/block/BlockBloodLight.java | 8 +- .../bloodmagic/block/BlockBloodRune.java | 22 +- .../block/BlockBloodStoneBrick.java | 40 -- .../bloodmagic/block/BlockBloodTank.java | 26 +- .../bloodmagic/block/BlockCrystal.java | 40 -- .../bloodmagic/block/BlockDecorative.java | 23 + .../bloodmagic/block/BlockDemonBase.java | 17 +- .../bloodmagic/block/BlockDemonCrucible.java | 6 +- .../bloodmagic/block/BlockDemonCrystal.java | 20 +- .../block/BlockDemonCrystallizer.java | 5 +- .../bloodmagic/block/BlockDemonLight.java | 16 +- .../block/BlockDemonPillarBase.java | 19 +- .../block/BlockDemonPillarCapBase.java | 19 +- .../bloodmagic/block/BlockDemonPylon.java | 5 +- .../block/BlockDemonStairsBase.java | 14 +- .../bloodmagic/block/BlockDemonWallBase.java | 10 +- .../block/BlockDimensionalPortal.java | 4 +- .../bloodmagic/block/BlockIncenseAltar.java | 6 +- .../block/BlockInputRoutingNode.java | 3 +- .../block/BlockInversionPillar.java | 9 +- .../block/BlockInversionPillarEnd.java | 5 +- .../block/BlockItemRoutingNode.java | 4 +- .../bloodmagic/block/BlockLifeEssence.java | 16 +- .../block/BlockMasterRoutingNode.java | 5 +- .../bloodmagic/block/BlockMimic.java | 27 +- .../block/BlockOutputRoutingNode.java | 3 +- .../WayofTime/bloodmagic/block/BlockPath.java | 21 +- .../bloodmagic/block/BlockPhantom.java | 6 +- .../block/BlockRitualController.java | 32 +- .../bloodmagic/block/BlockRitualStone.java | 28 +- .../bloodmagic/block/BlockRoutingNode.java | 11 +- .../bloodmagic/block/BlockSoulForge.java | 6 +- .../bloodmagic/block/BlockSpectral.java | 5 +- .../bloodmagic/block/BlockTeleposer.java | 4 +- .../WayofTime/bloodmagic/block/IBMBlock.java | 8 + .../bloodmagic/block/base/BlockEnum.java | 47 +- .../block/base/BlockEnumStairs.java | 2 +- .../bloodmagic/block/base/BlockInteger.java | 7 +- .../bloodmagic/block/base/BlockString.java | 22 +- ...EnumBrickSize.java => EnumDecorative.java} | 13 +- .../client/gui/GuiAlchemyTable.java | 4 +- .../bloodmagic/client/gui/GuiHolding.java | 8 +- .../client/gui/GuiItemRoutingNode.java | 4 +- .../client/gui/GuiMasterRoutingNode.java | 4 +- .../bloodmagic/client/gui/GuiSoulForge.java | 4 +- .../bloodmagic/client/gui/GuiTeleposer.java | 4 +- .../client/gui/config/ConfigGui.java | 4 +- .../bloodmagic/client/hud/HUDElement.java | 38 +- .../client/hud/HUDElementDemonWillAura.java | 7 +- .../client/hud/HUDElementHolding.java | 10 +- .../client/key/KeyBindingBloodMagic.java | 4 +- .../bloodmagic/client/key/KeyBindings.java | 4 +- .../mesh/CustomMeshDefinitionActivatable.java | 6 +- .../mesh/CustomMeshDefinitionMultiWill.java | 6 +- .../mesh/CustomMeshDefinitionWillGem.java | 10 +- .../client/render/LayerBloodElytra.java | 4 +- .../AttractorAlchemyCircleRenderer.java | 2 +- .../BindingAlchemyCircleRenderer.java | 2 +- .../render/block/RenderItemRoutingNode.java | 8 +- .../render/entity/RenderEntityMeteor.java | 4 +- .../render/entity/RenderEntityMimic.java | 2 +- .../render/entity/RenderEntitySoulSnare.java | 4 +- .../entity/layer/LayerAlchemyCircle.java | 2 +- .../bloodmagic/compat/ICompatibility.java | 59 -- .../compat/guideapi/GuideBloodMagic.java | 59 +- .../compat/guideapi/book/CategoryAlchemy.java | 8 +- .../guideapi/book/CategoryArchitect.java | 112 ++-- .../compat/guideapi/book/CategoryDemon.java | 38 +- .../compat/guideapi/book/CategoryRitual.java | 16 +- .../guideapi/page/PageAlchemyArray.java | 9 +- .../compat/jei/BloodMagicPlugin.java | 34 +- .../ArmourDowngradeRecipeJEI.java | 4 +- .../jei/forge/TartaricForgeRecipeJEI.java | 18 +- .../compat/waila/CompatibilityWaila.java | 26 - ...andler.java => WailaPluginBloodMagic.java} | 23 +- .../provider/DataProviderAlchemyArray.java | 6 +- .../provider/DataProviderBloodAltar.java | 6 +- .../compress/StorageBlockCraftingManager.java | 2 +- ...StorageBlockCraftingRecipeAssimilator.java | 43 +- .../WayofTime/bloodmagic/demonAura/PosXY.java | 49 +- .../bloodmagic/demonAura/WillChunk.java | 38 +- .../bloodmagic/demonAura/WillWorld.java | 13 +- .../demonAura/WorldDemonWillHandler.java | 6 +- .../entity/ai/EntityAIAttackStealthMelee.java | 6 +- .../entity/ai/EntityAIFollowOwner.java | 2 +- .../ai/EntityAIGrabEffectsFromOwner.java | 2 +- .../entity/ai/EntityAIOwnerHurtByTarget.java | 2 +- .../entity/ai/EntityAIOwnerHurtTarget.java | 6 +- .../entity/ai/EntityAIPickUpAlly.java | 4 +- .../entity/ai/EntityAIProtectAlly.java | 6 +- .../entity/ai/EntityAIRetreatToHeal.java | 16 +- .../entity/ai/EntityAIStealthRetreat.java | 6 +- .../ai/EntityAIStealthTowardsTarget.java | 14 +- .../entity/mob/EntityCorruptedSheep.java | 16 +- .../entity/mob/EntityCorruptedSpider.java | 8 +- .../entity/mob/EntityCorruptedZombie.java | 8 +- .../entity/mob/EntityDemonBase.java | 7 + .../bloodmagic/entity/mob/EntityMimic.java | 21 +- .../entity/mob/EntitySentientSpecter.java | 31 +- .../entity/projectile/EntityBloodLight.java | 4 +- .../entity/projectile/EntityMeteor.java | 6 +- .../fakePlayer/FakeNetHandlerPlayServer.java | 2 +- .../bloodmagic/fakePlayer/FakePlayerBM.java | 8 +- .../bloodmagic/fuel/FuelHandler.java | 4 +- .../bloodmagic/gson/Serializers.java | 7 +- .../incense/TranquilityHandlers.java | 4 +- .../item/ItemActivationCrystal.java | 4 +- .../bloodmagic/item/ItemAltarMaker.java | 4 +- .../bloodmagic/item/ItemArcaneAshes.java | 9 +- .../bloodmagic/item/ItemBindableBase.java | 3 +- .../bloodmagic/item/ItemBloodOrb.java | 70 ++- .../bloodmagic/item/ItemBloodShard.java | 5 +- .../bloodmagic/item/ItemBoundAxe.java | 2 +- .../bloodmagic/item/ItemBoundShovel.java | 2 +- .../bloodmagic/item/ItemBoundSword.java | 8 +- .../bloodmagic/item/ItemBoundTool.java | 8 +- .../bloodmagic/item/ItemComponent.java | 9 +- .../item/ItemDaggerOfSacrifice.java | 5 +- .../bloodmagic/item/ItemDemonCrystal.java | 39 +- .../bloodmagic/item/ItemDemonWillGauge.java | 5 +- .../bloodmagic/item/ItemExperienceBook.java | 5 +- .../bloodmagic/item/ItemInscriptionTool.java | 3 +- .../bloodmagic/item/ItemLavaCrystal.java | 63 +- .../bloodmagic/item/ItemPotionFlask.java | 8 +- .../bloodmagic/item/ItemRitualDiviner.java | 11 +- .../bloodmagic/item/ItemRitualReader.java | 3 +- .../item/ItemSacrificialDagger.java | 10 +- .../bloodmagic/item/ItemSanguineBook.java | 4 +- .../WayofTime/bloodmagic/item/ItemSlate.java | 5 +- .../item/ItemTelepositionFocus.java | 4 +- .../bloodmagic/item/ItemUpgradeTome.java | 7 +- .../bloodmagic/item/ItemUpgradeTrainer.java | 5 +- .../item/alchemy/ItemCuttingFluid.java | 9 +- .../ItemLivingArmourPointsUpgrade.java | 9 +- .../item/armour/ItemLivingArmour.java | 48 +- .../item/armour/ItemSentientArmour.java | 44 +- .../item/gear/ItemPackSacrifice.java | 4 +- .../item/gear/ItemPackSelfSacrifice.java | 4 +- .../item/routing/ItemFluidRouterFilter.java | 5 +- .../item/routing/ItemNodeRouter.java | 4 +- .../item/routing/ItemRouterFilter.java | 5 +- .../bloodmagic/item/sigil/ItemSigilAir.java | 6 +- .../bloodmagic/item/sigil/ItemSigilBase.java | 5 +- .../item/sigil/ItemSigilBloodLight.java | 4 +- .../item/sigil/ItemSigilGreenGrove.java | 2 +- .../item/sigil/ItemSigilPhantomBridge.java | 6 +- .../item/sigil/ItemSigilToggleableBase.java | 6 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 4 +- .../item/soul/ItemSentientArmourGem.java | 5 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 10 +- .../bloodmagic/item/soul/ItemSentientBow.java | 12 +- .../item/soul/ItemSentientPickaxe.java | 10 +- .../item/soul/ItemSentientShovel.java | 10 +- .../item/soul/ItemSentientSword.java | 12 +- .../bloodmagic/item/soul/ItemSoulGem.java | 4 +- .../bloodmagic/item/soul/ItemSoulSnare.java | 5 +- .../LivingArmourUpgradeBattleHungry.java | 4 +- .../LivingArmourUpgradeCrippledArm.java | 4 +- .../LivingArmourUpgradeDigSlowdown.java | 5 +- .../LivingArmourUpgradeDisoriented.java | 4 +- .../LivingArmourUpgradeMeleeDecrease.java | 4 +- .../LivingArmourUpgradeQuenched.java | 4 +- .../LivingArmourUpgradeSlippery.java | 12 +- .../LivingArmourUpgradeSlowHeal.java | 4 +- .../LivingArmourUpgradeSlowness.java | 4 +- .../LivingArmourUpgradeStormTrooper.java | 4 +- .../tracker/StatTrackerArrowProtect.java | 10 +- .../tracker/StatTrackerArrowShot.java | 10 +- .../tracker/StatTrackerCriticalStrike.java | 10 +- .../tracker/StatTrackerDigging.java | 10 +- .../tracker/StatTrackerExperience.java | 10 +- .../tracker/StatTrackerFallProtect.java | 10 +- .../tracker/StatTrackerFireResist.java | 10 +- .../livingArmour/tracker/StatTrackerFood.java | 10 +- .../tracker/StatTrackerGraveDigger.java | 10 +- .../tracker/StatTrackerGrimReaperSprint.java | 12 +- .../tracker/StatTrackerHealthboost.java | 10 +- .../livingArmour/tracker/StatTrackerJump.java | 10 +- .../tracker/StatTrackerMeleeDamage.java | 10 +- .../tracker/StatTrackerMovement.java | 10 +- .../tracker/StatTrackerNightSight.java | 14 +- .../tracker/StatTrackerPhysicalProtect.java | 10 +- .../tracker/StatTrackerPoison.java | 10 +- .../tracker/StatTrackerRepairing.java | 10 +- .../tracker/StatTrackerSelfSacrifice.java | 10 +- .../tracker/StatTrackerSolarPowered.java | 10 +- .../tracker/StatTrackerSprintAttack.java | 10 +- .../tracker/StatTrackerStepAssist.java | 10 +- .../LivingArmourUpgradeArrowProtect.java | 4 +- .../upgrade/LivingArmourUpgradeArrowShot.java | 4 +- .../LivingArmourUpgradeCriticalStrike.java | 4 +- .../upgrade/LivingArmourUpgradeDigging.java | 4 +- .../upgrade/LivingArmourUpgradeElytra.java | 4 +- .../LivingArmourUpgradeExperience.java | 4 +- .../LivingArmourUpgradeFallProtect.java | 4 +- .../LivingArmourUpgradeFireResist.java | 4 +- .../LivingArmourUpgradeGraveDigger.java | 4 +- .../LivingArmourUpgradeGrimReaperSprint.java | 9 +- .../LivingArmourUpgradeHealthboost.java | 4 +- .../upgrade/LivingArmourUpgradeJump.java | 4 +- .../LivingArmourUpgradeKnockbackResist.java | 4 +- .../LivingArmourUpgradeMeleeDamage.java | 4 +- .../LivingArmourUpgradeNightSight.java | 3 +- .../LivingArmourUpgradePhysicalProtect.java | 6 +- .../LivingArmourUpgradePoisonResist.java | 4 +- .../upgrade/LivingArmourUpgradeRepairing.java | 4 +- .../LivingArmourUpgradeSelfSacrifice.java | 4 +- .../LivingArmourUpgradeSolarPowered.java | 8 +- .../upgrade/LivingArmourUpgradeSpeed.java | 4 +- .../LivingArmourUpgradeSprintAttack.java | 4 +- .../LivingArmourUpgradeStepAssist.java | 3 +- .../WayofTime/bloodmagic/meteor/Meteor.java | 33 +- .../bloodmagic/meteor/MeteorComponent.java | 27 +- .../meteor/MeteorConfigHandler.java | 10 +- .../network/BloodMagicPacketHandler.java | 4 +- .../bloodmagic/network/KeyProcessor.java | 2 +- .../PlayerFallDistancePacketProcessor.java | 2 +- .../network/SigilHoldingPacketProcessor.java | 2 +- .../bloodmagic/potion/BMPotionUtils.java | 8 +- .../bloodmagic/potion/PotionBloodMagic.java | 6 +- .../potion/PotionEventHandlers.java | 35 +- .../bloodmagic/proxy/ClientProxy.java | 26 +- .../AlchemyTableDyeableRecipe.java | 2 +- .../AlchemyTablePotionAugmentRecipe.java | 6 +- .../AlchemyTablePotionRecipe.java | 10 +- .../bloodmagic/registry/ModBlocks.java | 293 --------- .../bloodmagic/registry/ModCompatibility.java | 25 - .../registry/ModCorruptionBlocks.java | 6 +- .../bloodmagic/registry/ModEntities.java | 34 -- .../bloodmagic/registry/ModItems.java | 336 ----------- .../bloodmagic/registry/ModPotions.java | 68 --- .../bloodmagic/registry/ModRecipes.java | 562 +++++++++++------- .../registry/RegistrarBloodMagic.java | 130 ++++ .../registry/RegistrarBloodMagicBlocks.java | 189 ++++++ .../registry/RegistrarBloodMagicItems.java | 231 +++++++ .../bloodmagic/ritual/RitualAltarBuilder.java | 14 +- .../bloodmagic/ritual/RitualAnimalGrowth.java | 4 +- .../bloodmagic/ritual/RitualArmourEvolve.java | 4 +- .../bloodmagic/ritual/RitualCobblestone.java | 4 +- .../bloodmagic/ritual/RitualContainment.java | 4 +- .../bloodmagic/ritual/RitualCrushing.java | 8 +- .../ritual/RitualCrystalHarvest.java | 4 +- .../bloodmagic/ritual/RitualExpulsion.java | 4 +- .../ritual/RitualFeatheredKnife.java | 6 +- .../bloodmagic/ritual/RitualFelling.java | 5 +- .../bloodmagic/ritual/RitualForsakenSoul.java | 4 +- .../bloodmagic/ritual/RitualFullStomach.java | 4 +- .../bloodmagic/ritual/RitualGreenGrove.java | 6 +- .../bloodmagic/ritual/RitualHarvest.java | 4 +- .../bloodmagic/ritual/RitualInterdiction.java | 4 +- .../bloodmagic/ritual/RitualJumping.java | 4 +- .../bloodmagic/ritual/RitualLava.java | 6 +- .../ritual/RitualLivingArmourDowngrade.java | 4 +- .../bloodmagic/ritual/RitualMagnetic.java | 4 +- .../bloodmagic/ritual/RitualMeteor.java | 6 +- .../bloodmagic/ritual/RitualPlacer.java | 4 +- .../bloodmagic/ritual/RitualPortal.java | 26 +- .../bloodmagic/ritual/RitualPump.java | 4 +- .../bloodmagic/ritual/RitualRegeneration.java | 6 +- .../bloodmagic/ritual/RitualSpeed.java | 4 +- .../bloodmagic/ritual/RitualSuppression.java | 4 +- .../ritual/RitualUpgradeRemove.java | 8 +- .../bloodmagic/ritual/RitualWater.java | 4 +- .../ritual/RitualWellOfSuffering.java | 10 +- .../bloodmagic/ritual/RitualZephyr.java | 8 +- .../harvest/HarvestHandlerPlantable.java | 15 +- .../ritual/imperfect/ImperfectRitualDay.java | 4 +- .../imperfect/ImperfectRitualNight.java | 4 +- .../ritual/imperfect/ImperfectRitualRain.java | 4 +- .../imperfect/ImperfectRitualResistance.java | 5 +- .../imperfect/ImperfectRitualZombie.java | 5 +- .../ritual/portal/LocationsHandler.java | 18 +- .../bloodmagic/ritual/portal/Teleports.java | 19 +- .../bloodmagic/routing/ModIdItemFilter.java | 1 - .../structures/BuildTestStructure.java | 6 +- .../structures/DungeonRoomLoader.java | 8 +- .../bloodmagic/tile/TileAlchemyArray.java | 16 +- .../bloodmagic/tile/TileAlchemyTable.java | 38 +- .../bloodmagic/tile/TileDemonCrystal.java | 23 +- .../tile/TileDemonCrystallizer.java | 4 +- .../tile/TileDimensionalPortal.java | 5 - .../tile/TileImperfectRitualStone.java | 2 - .../bloodmagic/tile/TileInversionPillar.java | 182 +++++- .../tile/TileMasterRitualStone.java | 72 ++- .../WayofTime/bloodmagic/tile/TileMimic.java | 10 +- .../bloodmagic/tile/TilePhantomBlock.java | 5 +- .../WayofTime/bloodmagic/tile/TilePlinth.java | 9 - .../bloodmagic/tile/TileSpectralBlock.java | 4 +- .../java/WayofTime/bloodmagic/util/Utils.java | 20 +- .../util/handler/event/ClientHandler.java | 16 +- .../util/handler/event/CraftingHandler.java | 21 +- .../util/handler/event/GenericHandler.java | 23 +- .../handler/event/LivingArmourHandler.java | 21 +- .../handler/event/StatTrackerHandler.java | 6 +- .../util/handler/event/WillHandler.java | 16 +- .../bloodmagic/util/helper/RecipeHelper.java | 4 +- 329 files changed, 3247 insertions(+), 2953 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockBloodStoneBrick.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockCrystal.java create mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java create mode 100644 src/main/java/WayofTime/bloodmagic/block/IBMBlock.java rename src/main/java/WayofTime/bloodmagic/block/enums/{EnumBrickSize.java => EnumDecorative.java} (51%) delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/ICompatibility.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/CompatibilityWaila.java rename src/main/java/WayofTime/bloodmagic/compat/waila/{WailaCallbackHandler.java => WailaPluginBloodMagic.java} (58%) delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModEntities.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModItems.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModPotions.java create mode 100644 src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagic.java create mode 100644 src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicBlocks.java create mode 100644 src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicItems.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TilePlinth.java diff --git a/build.gradle b/build.gradle index 72caca4b..14a5a1bb 100644 --- a/build.gradle +++ b/build.gradle @@ -5,26 +5,21 @@ buildscript { maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - classpath 'org.ajoberstar:gradle-git:0.10.1' + classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' } } plugins { id "net.minecraftforge.gradle.forge" version "2.0.2" id 'com.matthewprenger.cursegradle' version '1.0.9' - id 'io.franzbecker.gradle-lombok' version '1.6' + id 'maven-publish' } -apply plugin: 'maven-publish' - def build_number = 'CUSTOM' - if (System.getenv('BUILD_NUMBER') != null) build_number = System.getenv('BUILD_NUMBER') -def username = 'BloodMagicDev' - +def username = "${mod_name}" if (project.hasProperty('dev_username')) username = "${dev_username}" @@ -32,38 +27,15 @@ group = package_group archivesBaseName = mod_name version = "${mc_version}-${mod_version}-${build_number}" -if (project.hasProperty('gitpush')) - version += "-ss" - -import org.ajoberstar.grgit.* - -ext.repo = Grgit.open(project.file('.')) -def gitHash = 'unknown' - -if (new File(projectDir, '.git').exists()) - gitHash = repo.log().find().abbreviatedId - repositories { maven { url "http://dvs1.progwml6.com/files/maven" } maven { url "http://tehnut.info/maven" } - - ivy { - name "Thaumcraft" - artifactPattern "https://dl.dropboxusercontent.com/u/47135879/[module]-[revision]-deobf.[ext]" - } - ivy { - name "Baubles" - artifactPattern "https://dl.dropboxusercontent.com/u/47135879/[module]-1.8.9-[revision]-deobf.[ext]" - } } dependencies { deobfCompile "mezz.jei:jei_${mc_version}:${jei_version}" deobfCompile "mcp.mobius.waila:Hwyla:${waila_version}_${mc_version}" deobfCompile "info.amerifrance.guideapi:Guide-API:${mc_version}-${guideapi_version}" - -// compile name: "Thaumcraft", version: "${mc_version}-${thaumcraft_version}", ext: "jar" -// compile name: 'Baubles', version: "${baubles_version}", ext: 'jar' } minecraft { @@ -104,23 +76,6 @@ if (JavaVersion.current().isJava8Compatible()) { } } -lombok { - version = "1.16.6" - sha256 = "e0a471be03e1e6b02bf019480cec7a3ac9801702bf7bf62f15d077ad4df8dd5d" -} - -import io.franzbecker.gradle.lombok.task.DelombokTask - -task delombok(type: DelombokTask) { - args("src/main/java", "-d", "build/sources/delomboked/java") -} - -task delombokHelp(type: DelombokTask) { - args "--help" -} - -tasks.eclipse.dependsOn installLombok - jar { classifier = '' manifest.mainAttributes( @@ -128,7 +83,6 @@ jar { "Created-By": "${System.getProperty('java.vm.version')} + (${System.getProperty('java.vm.vendor')})", "Implementation-Title": project.name, "Implementation-Version": project.version, - "Git-Hash": gitHash, "Built-On": "${mc_version}-${forge_version}" ) } @@ -147,11 +101,6 @@ task javadocJar(type: Jar, dependsOn: javadoc) { classifier = 'javadoc' } -javadoc { - source = projectDir.path + "/build/sources/delomboked/java" -} - -tasks.javadoc.dependsOn delombok tasks.build.dependsOn javadoc, javadocJar, apiJar tasks.withType(JavaCompile) { task -> @@ -202,7 +151,7 @@ String getChangelogText() { def curseRelations = { optionalLibrary 'just-enough-items-jei' - optionalLibrary 'waila' + optionalLibrary 'hwyla' requiredLibrary 'guide-api' } @@ -216,7 +165,6 @@ curseforge { releaseType = 'beta' relations curseRelations - addGameVersion '1.11.2' addArtifact javadocJar addArtifact sourceJar diff --git a/gradle.properties b/gradle.properties index bfbd15a5..bcf9d97a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,12 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.1.11 -mc_version=1.11 -forge_version=13.19.1.2189 +mod_version=2.2.0 +mc_version=1.12 +forge_version=14.21.1.2443 curse_id=224791 -mappings_version=snapshot_20161212 +mappings_version=snapshot_20170814 -jei_version=4.0.5.203 -waila_version=1.8.5-B19 -guideapi_version=2.1.0-50 \ No newline at end of file +jei_version=4.7.5.85 +waila_version=1.8.20-B35 +guideapi_version=2.1.4-56 \ 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 1d862212..aacd5ff9 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -5,7 +5,6 @@ import java.io.File; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.meteor.MeteorConfigHandler; -import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.launchwrapper.Launch; @@ -15,19 +14,14 @@ import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.*; import net.minecraftforge.fml.common.network.NetworkRegistry; import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.LogHelper; import WayofTime.bloodmagic.client.gui.GuiHandler; -import WayofTime.bloodmagic.compat.ICompatibility; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.proxy.CommonProxy; import WayofTime.bloodmagic.registry.ModArmourTrackers; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModCompatibility; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.registry.ModCorruptionBlocks; -import WayofTime.bloodmagic.registry.ModEntities; -import WayofTime.bloodmagic.registry.ModItems; -import WayofTime.bloodmagic.registry.ModPotions; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.registry.ModRecipes; import WayofTime.bloodmagic.registry.ModRituals; import WayofTime.bloodmagic.registry.ModTranquilityHandlers; @@ -35,31 +29,27 @@ import WayofTime.bloodmagic.structures.ModDungeons; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.handler.IMCHandler; -@Mod(modid = Constants.Mod.MODID, name = Constants.Mod.NAME, version = Constants.Mod.VERSION, dependencies = Constants.Mod.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory") -@Getter +@Mod(modid = BloodMagic.MODID, name = BloodMagic.NAME, version = BloodMagic.VERSION, dependencies = BloodMagic.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory") public class BloodMagic { - @SidedProxy(serverSide = "WayofTime.bloodmagic.proxy.CommonProxy", clientSide = "WayofTime.bloodmagic.proxy.ClientProxy") - public static CommonProxy proxy; - - @Mod.Instance(Constants.Mod.MODID) - public static BloodMagic instance; - - public static CreativeTabs tabBloodMagic = new CreativeTabs(Constants.Mod.MODID + ".creativeTab") + 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 CreativeTabs TAB_BM = new CreativeTabs(MODID + ".creativeTab") { @Override public ItemStack getTabIconItem() { - return new ItemStack(ModItems.BLOOD_ORB); + return new ItemStack(RegistrarBloodMagicItems.BLOOD_ORB); } }; - - public static CreativeTabs tabUpgradeTome = new CreativeTabs(Constants.Mod.MODID + ".creativeTabTome") + public static CreativeTabs TAB_TOMES = new CreativeTabs(MODID + ".creativeTabTome") { @Override public ItemStack getTabIconItem() { - return new ItemStack(ModItems.UPGRADE_TOME); + return new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); } @Override @@ -67,33 +57,28 @@ public class BloodMagic { return true; } - }.setNoTitle().setBackgroundImageName("upgrade_tomes.png"); - - @Getter - private static boolean isDev = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + }.setNoTitle().setBackgroundImageName("items_search.png"); + public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); static { - tabUpgradeTome.setNoTitle().setBackgroundImageName("upgrade_tomes.png"); - FluidRegistry.enableUniversalBucket(); } - private LogHelper logger = new LogHelper(Constants.Mod.MODID); + @SidedProxy(serverSide = "WayofTime.bloodmagic.proxy.CommonProxy", clientSide = "WayofTime.bloodmagic.proxy.ClientProxy") + public static CommonProxy proxy; + @Mod.Instance(BloodMagic.MODID) + public static BloodMagic instance; + + public LogHelper logger = new LogHelper(MODID); private File configDir; @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { configDir = new File(event.getModConfigurationDirectory(), "BloodMagic"); - ConfigHandler.init(new File(getConfigDir(), "BloodMagic.cfg")); + ConfigHandler.init(new File(configDir, "BloodMagic.cfg")); - ModBlocks.init(); - ModItems.init(); - ModPotions.init(); - ModEntities.init(); - ModCompatibility.registerModCompat(); - ModCompatibility.loadCompat(ICompatibility.InitializationPhase.PRE_INIT); ModTranquilityHandlers.init(); ModDungeons.init(); @@ -105,13 +90,13 @@ public class BloodMagic public void init(FMLInitializationEvent event) { BloodMagicPacketHandler.init(); + RegistrarBloodMagicBlocks.registerBlacklists(); ModRecipes.init(); ModRituals.initRituals(); ModRituals.initImperfectRituals(); MeteorConfigHandler.init(new File(configDir, "meteors")); ModArmourTrackers.init(); - ModCompatibility.loadCompat(ICompatibility.InitializationPhase.INIT); NetworkRegistry.INSTANCE.registerGuiHandler(BloodMagic.instance, new GuiHandler()); ModCorruptionBlocks.init(); @@ -122,7 +107,6 @@ public class BloodMagic public void postInit(FMLPostInitializationEvent event) { ModRecipes.addCompressionHandlers(); - ModCompatibility.loadCompat(ICompatibility.InitializationPhase.POST_INIT); proxy.postInit(); } @@ -135,7 +119,7 @@ public class BloodMagic @Mod.EventHandler public void modMapping(FMLModIdMappingEvent event) { - ModCompatibility.loadCompat(ICompatibility.InitializationPhase.MAPPING); + } @Mod.EventHandler diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 373f6a31..8146e99d 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -8,11 +8,9 @@ import java.util.List; import java.util.Map; import WayofTime.bloodmagic.meteor.MeteorConfigHandler; -import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.config.Property; import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.ForgeRegistries; @@ -26,28 +24,23 @@ import WayofTime.bloodmagic.util.Utils; @Handler public class ConfigHandler { - @Getter - private static Configuration config; + public static Configuration config; // Teleposer public static String[] teleposerBlacklisting; - public static ArrayList teleposerBlacklist = new ArrayList(); + public static ArrayList teleposerBlacklist = new ArrayList<>(); public static List teleposerBlacklistEntity; // Transposition Sigil public static String[] transpositionBlacklisting; - public static ArrayList transpositionBlacklist = new ArrayList(); - - // Item/Block Disabling - public static List itemBlacklist; - public static List blockBlacklist; + public static ArrayList transpositionBlacklist = new ArrayList<>(); // Well of Suffering Blacklist public static List wellOfSufferingBlacklist; // Blood Altar Sacrificial Values public static String[] entitySacrificeValuesList; - public static Map entitySacrificeValues = new HashMap(); + public static Map entitySacrificeValues = new HashMap<>(); // Rituals public static boolean ritualAnimalGrowth; @@ -167,23 +160,11 @@ public class ConfigHandler public static void syncConfig() { - boolean configVersionChanged = false; - String category; - category = "Version"; - Property prop = config.get(category, "Config Version", Constants.Mod.VERSION); - if (!prop.getString().equals(Constants.Mod.VERSION)) - { - configVersionChanged = true; - prop.setValue(Constants.Mod.VERSION); - } - category = "Item/Block Blacklisting"; config.addCustomCategoryComment(category, "Allows disabling of specific Blocks/Items.\nNote that using this may result in crashes. Use is not supported."); config.setCategoryRequiresMcRestart(category, true); - itemBlacklist = Arrays.asList(config.getStringList("itemBlacklist", category, new String[] {}, "Items to not be registered. This requires their mapping name. Usually the same as the class name. Can be found in F3+H mode.")); - blockBlacklist = Arrays.asList(config.getStringList("blockBlacklist", category, new String[] {}, "Blocks to not be registered. This requires their mapping name. Usually the same as the class name. Can be found in F3+H mode.")); category = "Teleposer Blacklist"; config.addCustomCategoryComment(category, "Block blacklisting"); @@ -306,7 +287,7 @@ public class ConfigHandler category = "General"; config.addCustomCategoryComment(category, "General settings"); - BloodMagicAPI.setLoggingEnabled(config.getBoolean("enableLogging", category, true, "Allows logging information to the console. Fatal errors will bypass this")); + BloodMagicAPI.loggingEnabled = config.getBoolean("enableLogging", category, true, "Allows logging information to the console. Fatal errors will bypass this"); sacrificialPackConversion = config.getInt("sacrificialPackConversion", category, 20, 0, 100, "Base multiplier for the Coat of Arms. DamageDealt * sacrificialPackConversion"); sacrificialDaggerDamage = config.getInt("sacrificialDaggerDamage", category, 2, 0, 10000, "Damage done from using the Sacrificial Dagger"); sacrificialDaggerConversion = config.getInt("sacrificialDaggerConversion", category, 100, 0, 10000, "Amount of LP received per damage point (not heart!)"); @@ -376,7 +357,7 @@ public class ConfigHandler @SubscribeEvent public void onConfigChanged(ConfigChangedEvent event) { - if (event.getModID().equals(Constants.Mod.MODID)) + if (event.getModID().equals(BloodMagic.MODID)) { syncConfig(); MeteorConfigHandler.handleMeteors(false); diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java index fc933397..6ea52f66 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -6,6 +6,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.ai.EntityAIBase; @@ -28,7 +29,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.FakePlayer; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; import WayofTime.bloodmagic.fakePlayer.FakePlayerBM; import WayofTime.bloodmagic.tile.TileAlchemyArray; @@ -400,7 +400,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { public Target(World world, BlockPos pos) { - super(world, pos, new GameProfile(null, Constants.Mod.MODID + "ArrayAttractor" + ":" + pos)); + super(world, pos, new GameProfile(null, BloodMagic.MODID + "ArrayAttractor" + ":" + pos)); posY += 1; } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 497ec555..6f4ac6de 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.altar; import java.util.List; -import lombok.Getter; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -54,7 +53,7 @@ public class BloodAltar implements IFluidHandler private EnumAltarTier altarTier = EnumAltarTier.ONE; private AltarUpgrade upgrade; private int capacity = Fluid.BUCKET_VOLUME * 10; - private FluidStack fluid = new FluidStack(BloodMagicAPI.getLifeEssence(), 0); + private FluidStack fluid = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); private int liquidRequired; // mB private boolean canBeFilled; private int consumptionRate; @@ -84,7 +83,6 @@ public class BloodAltar implements IFluidHandler private AltarRecipe recipe; private ItemStack result = ItemStack.EMPTY; - @Getter private EnumAltarTier currentTierDisplayed = EnumAltarTier.ONE; public BloodAltar(TileAltar tileAltar) @@ -132,9 +130,9 @@ public class BloodAltar implements IFluidHandler } else if (worldBlock.getBlock() != Utils.getBlockForComponent(altarComponent.getComponent())) // Special case Vanilla { return false; - } else if (BloodMagicAPI.getAltarComponents().get(worldBlock.getState()) != null) // Mod compat + } else if (BloodMagicAPI.altarComponents.get(worldBlock.getState()) != null) // Mod compat { - return BloodMagicAPI.getAltarComponents().get(worldBlock.getState()) == altarComponent.getComponent(); + return BloodMagicAPI.altarComponents.get(worldBlock.getState()) == altarComponent.getComponent(); } } else { @@ -261,10 +259,10 @@ public class BloodAltar implements IFluidHandler if (fluid != null) setMainFluid(fluid); - FluidStack fluidOut = new FluidStack(BloodMagicAPI.getLifeEssence(), tagCompound.getInteger(Constants.NBT.OUTPUT_AMOUNT)); + FluidStack fluidOut = new FluidStack(BloodMagicAPI.lifeEssence, tagCompound.getInteger(Constants.NBT.OUTPUT_AMOUNT)); setOutputFluid(fluidOut); - FluidStack fluidIn = new FluidStack(BloodMagicAPI.getLifeEssence(), tagCompound.getInteger(Constants.NBT.INPUT_AMOUNT)); + FluidStack fluidIn = new FluidStack(BloodMagicAPI.lifeEssence, tagCompound.getInteger(Constants.NBT.INPUT_AMOUNT)); setInputFluid(fluidIn); } @@ -880,4 +878,8 @@ public class BloodAltar implements IFluidHandler { return new IFluidTankProperties[] { new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity)) }; } + + public EnumAltarTier getCurrentTierDisplayed() { + return currentTierDisplayed; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/BlockStack.java b/src/main/java/WayofTime/bloodmagic/api/BlockStack.java index fe2e9341..264f348b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BlockStack.java +++ b/src/main/java/WayofTime/bloodmagic/api/BlockStack.java @@ -1,15 +1,11 @@ package WayofTime.bloodmagic.api; -import lombok.EqualsAndHashCode; -import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -@Getter -@EqualsAndHashCode(exclude = { "state" }) public class BlockStack { private final Block block; @@ -39,6 +35,36 @@ public class BlockStack return new ItemStack(block, 1, meta); } + public Block getBlock() { + return block; + } + + public int getMeta() { + return meta; + } + + public IBlockState 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() { diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java index 8273047e..488cddc1 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java @@ -1,9 +1,8 @@ package WayofTime.bloodmagic.api; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.util.helper.LogHelper; -import lombok.Getter; -import lombok.Setter; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; @@ -35,38 +34,27 @@ import java.util.Map; */ public class BloodMagicAPI { - @Getter - private static final List teleposerBlacklist = new ArrayList(); - @Getter - private static final List transpositionBlacklist = new ArrayList(); - @Getter - private static final Map entitySacrificeValues = new HashMap(); - @Getter - private static final ArrayList greenGroveBlacklist = new ArrayList(); - @Getter - private static final Map altarComponents = new HashMap(); + public static final List teleposerBlacklist = new ArrayList(); + public static final List transpositionBlacklist = new ArrayList(); + public static final Map entitySacrificeValues = new HashMap(); + public static final ArrayList greenGroveBlacklist = new ArrayList(); + public static final Map altarComponents = new HashMap(); - @Getter - @Setter - private static boolean loggingEnabled; + public static boolean loggingEnabled; - @Getter - private static LogHelper logger = new LogHelper("BloodMagic|API"); + public static LogHelper logger = new LogHelper("BloodMagic|API"); - @Getter - private static DamageSource damageSource = new DamageSourceBloodMagic(); + public static DamageSource damageSource = new DamageSourceBloodMagic(); - @Getter - @Setter - private static Fluid lifeEssence; - private static ItemStack lifeEssenceBucket; + public static Fluid lifeEssence; + public static ItemStack lifeEssenceBucket; public static ItemStack getLifeEssenceBucket() { if (lifeEssenceBucket != null) return lifeEssenceBucket; - lifeEssenceBucket = UniversalBucket.getFilledBucket(ForgeModContainer.getInstance().universalBucket, getLifeEssence()); + lifeEssenceBucket = UniversalBucket.getFilledBucket(ForgeModContainer.getInstance().universalBucket, lifeEssence); return lifeEssenceBucket; } @@ -82,7 +70,7 @@ public class BloodMagicAPI */ public static Item getItem(String name) { - return ForgeRegistries.ITEMS.getValue(new ResourceLocation(Constants.Mod.MODID, name)); + return ForgeRegistries.ITEMS.getValue(new ResourceLocation(BloodMagic.MODID, name)); } /** @@ -110,7 +98,7 @@ public class BloodMagicAPI */ public static Block getBlock(String name) { - return ForgeRegistries.BLOCKS.getValue(new ResourceLocation(Constants.Mod.MODID, name)); + return ForgeRegistries.BLOCKS.getValue(new ResourceLocation(BloodMagic.MODID, name)); } /** diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 1d49da31..3cc3c3ff 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.api; import java.util.Locale; -import lombok.Getter; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; @@ -132,11 +132,7 @@ public class Constants public static class Mod { - public static final String MODID = "bloodmagic"; - public static final String DOMAIN = MODID.toLowerCase(Locale.ENGLISH) + ":"; - 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 String DOMAIN = BloodMagic.MODID.toLowerCase(Locale.ENGLISH) + ":"; } public static final class Gui @@ -151,19 +147,19 @@ public class Constants public static class Compat { - public static final String JEI_CATEGORY_ALTAR = Mod.MODID + ":altar"; - public static final String JEI_CATEGORY_BINDING = Mod.MODID + ":binding"; - public static final String JEI_CATEGORY_ALCHEMYARRAY = Mod.MODID + ":alchemyArray"; - public static final String JEI_CATEGORY_SOULFORGE = Mod.MODID + ":soulForge"; - public static final String JEI_CATEGORY_ALCHEMYTABLE = Mod.MODID + ":salchemyTable"; - public static final String JEI_CATEGORY_ARMOURDOWNGRADE = Mod.MODID + ":armourDowngrade"; + 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 WAILA_CONFIG_BYPASS_SNEAK = Mod.MODID + ".bypassSneak"; - public static final String WAILA_CONFIG_ALTAR = Mod.MODID + ".bloodAltar"; - public static final String WAILA_CONFIG_TELEPOSER = Mod.MODID + ".teleposer"; - public static final String WAILA_CONFIG_RITUAL = Mod.MODID + ".ritualController"; - public static final String WAILA_CONFIG_ARRAY = Mod.MODID + ".array"; - public static final String WAILA_CONFIG_BLOOD_TANK = Mod.MODID + ".bloodTank"; + public static final String WAILA_CONFIG_BYPASS_SNEAK = BloodMagic.MODID + ".bypassSneak"; + 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 final Item THAUMCRAFT_GOGGLES = ForgeRegistries.ITEMS.getValue(new ResourceLocation("Thaumcraft", "goggles")); } @@ -187,12 +183,6 @@ public class Constants BOUND_PICKAXE("ItemBoundPickaxe"), BOUND_SHOVEL("ItemBoundShovel"), BOUND_SWORD("ItemBoundSword"), - /** - * @deprecated - Use - * {@code UniversalBucket.getFilledBucket(ForgeModContainer.getInstance().universalBucket, BloodMagicAPI.getLifeEssence())} - **/ - @Deprecated - BUCKET_ESSENCE("ItemBucketEssence"), COMPONENT("ItemComponent"), CUTTING_FLUID("ItemCuttingFluid"), DEMON_CRYSTAL("ItemDemonCrystal"), @@ -257,7 +247,6 @@ public class Constants SIGIL_BOUNCE("ItemSigilBounce"), SIGIL_FROST("ItemSigilFrost"); - @Getter private final String regName; BloodMagicItem(String regName) @@ -267,7 +256,12 @@ public class Constants public Item getItem() { - return BloodMagicAPI.getItem(getRegName()); + return BloodMagicAPI.getItem(regName); + } + + public String getRegName() + { + return regName; } } @@ -319,7 +313,6 @@ public class Constants INVERSION_PILLAR("BlockInversionPillar"), INVERSION_PILLAR_END("BlockInversionPillarEnd"); - @Getter private final String regName; BloodMagicBlock(String regName) @@ -329,7 +322,12 @@ public class Constants public Block getBlock() { - return BloodMagicAPI.getBlock(getRegName()); + return BloodMagicAPI.getBlock(regName); + } + + public String getRegName() + { + return regName; } } } diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java index 4e07a969..37946018 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.api.alchemyCrafting; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; @@ -10,12 +8,14 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.iface.IAlchemyArray; -@RequiredArgsConstructor public abstract class AlchemyArrayEffect { - @Getter public final String key; + public AlchemyArrayEffect(String key) { + this.key = key; + } + public abstract boolean update(TileEntity tile, int ticksActive); public abstract void writeToNBT(NBTTagCompound tag); @@ -28,4 +28,8 @@ public abstract class AlchemyArrayEffect { } + + public String getKey() { + return key; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java b/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java index 7fd90b66..1ff69871 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java @@ -1,12 +1,10 @@ package WayofTime.bloodmagic.api.altar; -import lombok.Getter; import net.minecraft.util.math.BlockPos; /** * Used for building the altar structure. */ -@Getter public class AltarComponent { private BlockPos offset; @@ -50,4 +48,16 @@ public class AltarComponent this.upgradeSlot = true; return this; } + + public BlockPos getOffset() { + return offset; + } + + public boolean isUpgradeSlot() { + return upgradeSlot; + } + + public EnumAltarComponent getComponent() { + return component; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java b/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java index faecb757..d8b73f87 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java @@ -1,12 +1,5 @@ package WayofTime.bloodmagic.api.altar; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -@AllArgsConstructor public class AltarUpgrade { private int speedCount; @@ -20,6 +13,22 @@ public class AltarUpgrade private int accelerationCount; private int chargingCount; + public AltarUpgrade(int speedCount, int efficiencyCount, int sacrificeCount, int selfSacrificeCount, int displacementCount, int capacityCount, int orbCapacityCount, int betterCapacityCount, int accelerationCount, int chargingCount) { + this.speedCount = speedCount; + this.efficiencyCount = efficiencyCount; + this.sacrificeCount = sacrificeCount; + this.selfSacrificeCount = selfSacrificeCount; + this.displacementCount = displacementCount; + this.capacityCount = capacityCount; + this.orbCapacityCount = orbCapacityCount; + this.betterCapacityCount = betterCapacityCount; + this.accelerationCount = accelerationCount; + this.chargingCount = chargingCount; + } + + public AltarUpgrade() { + } + // Adders public AltarUpgrade addSpeed() @@ -81,4 +90,44 @@ public class AltarUpgrade chargingCount++; return this; } + + public int getSpeedCount() { + return speedCount; + } + + public int getEfficiencyCount() { + return efficiencyCount; + } + + public int getSacrificeCount() { + return sacrificeCount; + } + + public int getSelfSacrificeCount() { + return selfSacrificeCount; + } + + public int getDisplacementCount() { + return displacementCount; + } + + public int getCapacityCount() { + return capacityCount; + } + + public int getOrbCapacityCount() { + return orbCapacityCount; + } + + public int getBetterCapacityCount() { + return betterCapacityCount; + } + + public int getAccelerationCount() { + return accelerationCount; + } + + public int getChargingCount() { + return chargingCount; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java index 319f018b..185fc725 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java @@ -2,12 +2,9 @@ package WayofTime.bloodmagic.api.altar; import java.util.Locale; -import lombok.Getter; - /** * List of different components used to construct different tiers of altars. */ -@Getter public enum EnumAltarComponent { GLOWSTONE, @@ -24,4 +21,8 @@ public enum EnumAltarComponent { this.key = BASE + name().toLowerCase(Locale.ENGLISH); } + + public String getKey() { + return key; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java index 6d7cfcb8..ba1ec6ac 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java @@ -1,12 +1,10 @@ package WayofTime.bloodmagic.api.altar; -import lombok.Getter; import net.minecraft.util.math.BlockPos; import java.util.ArrayList; //@formatter:off -@Getter public enum EnumAltarTier { ONE(), TWO() @@ -152,4 +150,8 @@ public enum EnumAltarTier { return ordinal() + 1; } + + public ArrayList getAltarComponents() { + return altarComponents; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java index 6ea69d0e..11891289 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.api.event; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; -import lombok.Getter; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.eventhandler.Event; @@ -10,7 +9,6 @@ import net.minecraftforge.fml.common.eventhandler.Event; * * It is not cancelable, however you can modify the output stack. */ -@Getter public class AltarCraftedEvent extends Event { @@ -28,4 +26,12 @@ public class AltarCraftedEvent extends Event 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/api/iface/IAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java index 62406021..e06393b1 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java @@ -4,5 +4,5 @@ import net.minecraft.util.EnumFacing; public interface IAlchemyArray { - public abstract EnumFacing getRotation(); + EnumFacing getRotation(); } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java index 53bb0872..fcf7b227 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.api.impl; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import lombok.Getter; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -13,7 +12,6 @@ import net.minecraft.world.World; */ public class ItemSigil extends ItemBindable implements ISigil { - @Getter private int lpUsed; public ItemSigil(int lpUsed) @@ -49,4 +47,8 @@ public class ItemSigil extends ItemBindable implements ISigil { return false; } + + public int getLpUsed() { + return lpUsed; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java b/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java index fb15cdb1..a3c801ff 100644 --- a/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java @@ -1,22 +1,23 @@ package WayofTime.bloodmagic.api.orb; -import WayofTime.bloodmagic.api.registry.OrbRegistry; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraftforge.registries.IForgeRegistryEntry; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * Base object for all Blood Orbs. Makes Orb creation quite a bit easier. * - * Just create a new BloodOrb instance then register it with - * {@link OrbRegistry#registerOrb(BloodOrb)} This will allow the use of just one - * item ID for all orbs. If an addon dev needs more control over the intricacies - * of their orb (custom right clicking, renderers, etc), they can just create - * their own item as normal. + * Just create a new BloodOrb instance then register it in {@link net.minecraftforge.event.RegistryEvent.Register} */ -public class BloodOrb +public class BloodOrb extends IForgeRegistryEntry.Impl { - private String name; - private int tier; - private int capacity; - private String owner = "BloodMagic"; + private final String name; + private final int tier; + private final int capacity; + @Nullable + private ModelResourceLocation modelLocation; /** * A base object for BloodOrbs. A bit cleaner than the old way through @@ -51,26 +52,19 @@ public class BloodOrb return capacity; } - public String getOwner() - { - return owner; + @Nullable + public ModelResourceLocation getModelLocation() { + return modelLocation; } - /** - * For setting the MODID of the mod that creates the Orb. Not required, but - * preferred. - * - * @return - The BloodOrb object for further use. - */ - public BloodOrb setOwner(String owner) - { - this.owner = owner; + public BloodOrb withModel(@Nonnull ModelResourceLocation modelLocation) { + this.modelLocation = modelLocation; return this; } @Override public String toString() { - return "BloodOrb{" + "name='" + name + '\'' + ", tier=" + tier + ", capacity=" + capacity + ", owner=" + owner + '}'; + return "BloodOrb{" + "name='" + name + '\'' + ", tier=" + tier + ", capacity=" + capacity + ", owner=" + getRegistryName() + '}'; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java b/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java index 998a0205..230b8332 100644 --- a/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java @@ -1,10 +1,11 @@ package WayofTime.bloodmagic.api.orb; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nullable; + public interface IBloodOrb { - BloodOrb getOrb(int meta); - - int getMaxEssence(int meta); - - int getOrbLevel(int meta); + @Nullable + BloodOrb getOrb(ItemStack stack); } diff --git a/src/main/java/WayofTime/bloodmagic/api/package-info.java b/src/main/java/WayofTime/bloodmagic/api/package-info.java index 8700523a..3f175867 100644 --- a/src/main/java/WayofTime/bloodmagic/api/package-info.java +++ b/src/main/java/WayofTime/bloodmagic/api/package-info.java @@ -1,4 +1,5 @@ -@API(owner = Constants.Mod.MODID, provides = Constants.Mod.MODID + "|API", apiVersion = Constants.Mod.VERSION) +@API(owner = BloodMagic.MODID, provides = BloodMagic.MODID + "|API", apiVersion = BloodMagic.VERSION) package WayofTime.bloodmagic.api; +import WayofTime.bloodmagic.BloodMagic; import net.minecraftforge.fml.common.API; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java index 497102ae..c677afb2 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java @@ -5,27 +5,20 @@ import java.util.Iterator; import java.util.List; import com.google.common.collect.ImmutableList; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; 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; -@EqualsAndHashCode -@ToString public class AlchemyTableRecipe { protected ItemStack output = ItemStack.EMPTY; protected ArrayList input = new ArrayList(); - @Getter protected int lpDrained; - @Getter protected int ticksRequired; - @Getter protected int tierRequired; public AlchemyTableRecipe(Block result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) @@ -186,4 +179,52 @@ public class AlchemyTableRecipe 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/api/recipe/TartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java index 88f102c3..813d4b04 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java @@ -1,28 +1,22 @@ package WayofTime.bloodmagic.api.recipe; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; 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; -@EqualsAndHashCode -@ToString public class TartaricForgeRecipe { protected ItemStack output = null; protected List input = new ArrayList(); - @Getter protected double minimumSouls; - @Getter protected double soulsDrained; public TartaricForgeRecipe(Block result, double minSouls, double drain, Object... recipe) @@ -145,4 +139,50 @@ public class TartaricForgeRecipe { 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/api/registry/AltarRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java index 3f71204b..687813fd 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java @@ -5,11 +5,9 @@ import WayofTime.bloodmagic.api.ItemStackWrapper; import WayofTime.bloodmagic.api.altar.EnumAltarTier; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; 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; @@ -34,7 +32,7 @@ public class AltarRecipeRegistry if (!recipes.containsValue(altarRecipe) && altarRecipe.getInput().size() > 0) recipes.put(altarRecipe.getInput(), altarRecipe); else - BloodMagicAPI.getLogger().error("Error adding altar recipe for input [{}].", altarRecipe.toString()); + BloodMagicAPI.logger.error("Error adding altar recipe for input [{}].", altarRecipe.toString()); } public static void registerFillRecipe(ItemStack orbStack, EnumAltarTier tier, int maxForOrb, int consumeRate, int drainRate) @@ -87,9 +85,6 @@ public class AltarRecipeRegistry return HashBiMap.create(recipes); } - @Getter - @ToString - @EqualsAndHashCode public static class AltarRecipe { private final List input; @@ -174,5 +169,74 @@ public class AltarRecipeRegistry return false; } + + public List getInput() { + return input; + } + + public ItemStack getOutput() { + return output; + } + + public EnumAltarTier 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/api/registry/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java index 226626a4..19c8500a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java @@ -5,13 +5,16 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.EnumAltarTier; import WayofTime.bloodmagic.api.orb.BloodOrb; import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import com.google.common.collect.ArrayListMultimap; import net.minecraft.client.renderer.block.model.ModelBakery; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -23,57 +26,14 @@ import java.util.List; * 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 { private static List orbs = new ArrayList(); - private static ArrayListMultimap tierMap = ArrayListMultimap.create(); + public static ArrayListMultimap tierMap = ArrayListMultimap.create(); - private static Item orbItem = Constants.BloodMagicItem.BLOOD_ORB.getItem(); - - public static void registerOrb(BloodOrb orb) - { - if (!orbs.contains(orb)) - { - orbs.add(orb); - registerOrbForTier(orb.getTier(), getOrbStack(orb)); - } else - BloodMagicAPI.getLogger().error("Error adding orb %s. Orb already exists!", orb.toString()); - } - - public static void registerOrbForTier(int tier, ItemStack stack) - { - if (stack.getItem() instanceof IBloodOrb) - tierMap.put(tier, stack); - } - - @SideOnly(Side.CLIENT) - public static void registerOrbTexture(BloodOrb orb, ResourceLocation resourceLocation) - { - int meta = getIndexOf(orb); - - ModelBakery.registerItemVariants(orbItem, resourceLocation); - ModelLoader.setCustomModelResourceLocation(orbItem, meta, new ModelResourceLocation(resourceLocation, "inventory")); - } - - public static BloodOrb getOrb(int index) - { - return orbs.get(index); - } - - public static int getIndexOf(BloodOrb orb) - { - return orbs.indexOf(orb); - } - - public static boolean isEmpty() - { - return orbs.isEmpty(); - } - - public static int getSize() - { - return orbs.size(); - } + @GameRegistry.ObjectHolder("bloodmagic:blood_orb") + private static final Item ORB_ITEM = null; public static List getOrbsForTier(int tier) { @@ -105,12 +65,11 @@ public class OrbRegistry public static ItemStack getOrbStack(BloodOrb orb) { - return new ItemStack(orbItem, 1, getIndexOf(orb)); - } - - public static List getOrbs() - { - return new ArrayList(orbs); + ItemStack ret = new ItemStack(ORB_ITEM); + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("orb", orb.getRegistryName().toString()); + ret.setTagCompound(tag); + return ret; } public static ArrayListMultimap getTierMap() diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java index 01822165..bec8ef1c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java @@ -6,10 +6,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -21,15 +17,12 @@ import net.minecraft.world.World; import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import org.apache.commons.lang3.builder.ToStringBuilder; /** * Abstract class for creating new rituals. Rituals need be registered with * {@link WayofTime.bloodmagic.api.registry.RitualRegistry#registerRitual(Ritual, String)} */ -@Getter -@RequiredArgsConstructor -@EqualsAndHashCode(exclude = { "modableRangeMap", "ritualComponents", "renderer", "volumeRangeMap", "horizontalRangeMap", "verticalRangeMap" }) -@ToString public abstract class Ritual { public final ArrayList ritualComponents = new ArrayList(); @@ -44,6 +37,14 @@ public abstract class Ritual protected final Map horizontalRangeMap = new HashMap(); protected final Map verticalRangeMap = new HashMap(); + 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 @@ -365,4 +366,84 @@ public abstract class Ritual } public abstract Ritual getNewCopy(); + + public ArrayList getRitualComponents() { + return ritualComponents; + } + + public String getName() { + return name; + } + + public int getCrystalLevel() { + return crystalLevel; + } + + public int getActivationCost() { + return activationCost; + } + + public RitualRenderer getRenderer() { + return renderer; + } + + public String getUnlocalizedName() { + 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("ritualComponents", ritualComponents) + .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; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java b/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java index 2fdf3ab9..2bfd071f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.api.ritual; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; @@ -9,13 +7,16 @@ import net.minecraft.util.math.BlockPos; * Used to set a {@link EnumRuneType} type to a given {@link BlockPos} for usage * in Ritual creation. */ -@Getter -@RequiredArgsConstructor 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(EnumFacing direction) { switch (direction) @@ -55,4 +56,12 @@ public class RitualComponent { 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/api/ritual/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java index c9ec02a6..28b92f67 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java @@ -1,9 +1,6 @@ package WayofTime.bloodmagic.api.ritual.imperfect; import WayofTime.bloodmagic.api.BlockStack; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; @@ -12,9 +9,6 @@ import net.minecraft.world.World; * registered with * {@link WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry#registerRitual(ImperfectRitual)} */ -@RequiredArgsConstructor -@Getter -@EqualsAndHashCode public abstract class ImperfectRitual { @@ -24,6 +18,14 @@ public abstract class ImperfectRitual private final boolean lightshow; private final String unlocalizedName; + public ImperfectRitual(String name, BlockStack requiredBlock, int activationCost, boolean lightshow, String unlocalizedName) { + this.name = name; + this.requiredBlock = requiredBlock; + this.activationCost = activationCost; + this.lightshow = lightshow; + this.unlocalizedName = unlocalizedName; + } + /** * @param name * - The name of the ritual @@ -49,9 +51,54 @@ public abstract class ImperfectRitual */ public abstract boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player); + public String getName() { + return name; + } + + public BlockStack getRequiredBlock() { + return requiredBlock; + } + + public int getActivationCost() { + return activationCost; + } + + public boolean isLightshow() { + return lightshow; + } + + public String getUnlocalizedName() { + return unlocalizedName; + } + @Override public String toString() { return getName() + ":" + getRequiredBlock().toString() + "@" + 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 (lightshow != that.lightshow) return false; + if (name != null ? !name.equals(that.name) : that.name != null) return false; + if (requiredBlock != null ? !requiredBlock.equals(that.requiredBlock) : that.requiredBlock != 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 + (requiredBlock != null ? requiredBlock.hashCode() : 0); + result = 31 * result + activationCost; + result = 31 * result + (lightshow ? 1 : 0); + result = 31 * result + (unlocalizedName != null ? unlocalizedName.hashCode() : 0); + return result; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java b/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java index 3499c82c..eae38187 100644 --- a/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java +++ b/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java @@ -4,7 +4,7 @@ import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.world.WorldSavedData; +import net.minecraft.world.storage.WorldSavedData; import java.util.*; diff --git a/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java index 53324cf0..57048184 100644 --- a/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java @@ -5,7 +5,6 @@ import WayofTime.bloodmagic.api.event.AddToNetworkEvent; import WayofTime.bloodmagic.api.event.SoulNetworkEvent; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import com.google.common.base.Strings; -import lombok.Getter; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; @@ -18,7 +17,6 @@ import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nullable; import java.util.UUID; -@Getter public class SoulNetwork implements INBTSerializable { private BMWorldSavedData parent; @@ -129,7 +127,7 @@ public class SoulNetwork implements INBTSerializable if (!user.capabilities.isCreativeMode) { user.hurtResistantTime = 0; - user.attackEntityFrom(BloodMagicAPI.getDamageSource(), 1.0F); + user.attackEntityFrom(BloodMagicAPI.damageSource, 1.0F); } } else if (syphon >= 100) @@ -139,7 +137,7 @@ public class SoulNetwork implements INBTSerializable for (int i = 0; i < ((syphon + 99) / 100); i++) { user.hurtResistantTime = 0; - user.attackEntityFrom(BloodMagicAPI.getDamageSource(), 1.0F); + user.attackEntityFrom(BloodMagicAPI.damageSource, 1.0F); } } } @@ -151,7 +149,7 @@ public class SoulNetwork implements INBTSerializable if (getParent() != null) getParent().markDirty(); else - BloodMagicAPI.getLogger().error("A SoulNetwork was created, but a parent was not set to allow saving."); + BloodMagicAPI.logger.error("A SoulNetwork was created, but a parent was not set to allow saving."); } @Nullable @@ -184,6 +182,26 @@ public class SoulNetwork implements INBTSerializable return this; } + public BMWorldSavedData getParent() { + return parent; + } + + public EntityPlayer getCachedPlayer() { + return cachedPlayer; + } + + public UUID getPlayerId() { + return playerId; + } + + public int getCurrentEssence() { + return currentEssence; + } + + public int getOrbTier() { + return orbTier; + } + // INBTSerializable @Override diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java index ca72d76e..a7fe7f78 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java @@ -15,19 +15,19 @@ public class LogHelper public void info(String info, Object... format) { - if (BloodMagicAPI.isLoggingEnabled()) + if (BloodMagicAPI.loggingEnabled) logger.info(info, format); } public void error(String error, Object... format) { - if (BloodMagicAPI.isLoggingEnabled()) + if (BloodMagicAPI.loggingEnabled) logger.error(error, format); } public void debug(String debug, Object... format) { - if (BloodMagicAPI.isLoggingEnabled()) + if (BloodMagicAPI.loggingEnabled) logger.debug(debug, format); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java index 3f486341..538a176c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java @@ -3,12 +3,11 @@ package WayofTime.bloodmagic.block; import java.util.List; import java.util.Random; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -23,8 +22,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.Utils; @@ -38,13 +36,12 @@ public class BlockAlchemyArray extends Block { super(Material.CLOTH); - setUnlocalizedName(Constants.Mod.MODID + ".alchemyArray"); + setUnlocalizedName(BloodMagic.MODID + ".alchemyArray"); setHardness(0.1f); } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity) - { + public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean p_185477_7_) { // No-op } @@ -134,7 +131,7 @@ public class BlockAlchemyArray extends Block @Override public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { - return new ItemStack(ModItems.ARCANE_ASHES); + return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java index f8040fed..ce4bc9d0 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -1,15 +1,14 @@ package WayofTime.bloodmagic.block; +import WayofTime.bloodmagic.item.block.ItemBlockAlchemyTable; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumBlockRenderType; @@ -24,7 +23,7 @@ import WayofTime.bloodmagic.tile.TileAlchemyTable; import javax.annotation.Nullable; -public class BlockAlchemyTable extends Block +public class BlockAlchemyTable extends Block implements IBMBlock { public static final PropertyBool INVISIBLE = PropertyBool.create("invisible"); public static final PropertyEnum DIRECTION = PropertyEnum.create("direction", EnumFacing.class); @@ -34,8 +33,8 @@ public class BlockAlchemyTable extends Block super(Material.ROCK); // this.setDefaultState(this.blockState.getBaseState().withProperty(DIRECTION, EnumFacing.DOWN).withProperty(INVISIBLE, false)); - setUnlocalizedName(Constants.Mod.MODID + ".alchemyTable"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".alchemyTable"); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 0); @@ -173,4 +172,9 @@ public class BlockAlchemyTable extends Block } } } + + @Override + public ItemBlock 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 index d2b87a4d..2c1ed34c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -26,7 +26,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.IAltarManipulator; import WayofTime.bloodmagic.api.iface.IAltarReader; import WayofTime.bloodmagic.api.iface.IBindable; @@ -47,8 +46,8 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl { super(Material.ROCK); - setUnlocalizedName(Constants.Mod.MODID + ".altar"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".altar"); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 1); @@ -73,7 +72,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl TileAltar altar = (TileAltar) tile; ItemStack orbStack = altar.getStackInSlot(0); - if (world.getBlockState(pos.down()).getBlock() instanceof BlockBloodStoneBrick) + if (world.getBlockState(pos.down()).getBlock() instanceof BlockDecorative) { if (orbStack.getItem() instanceof IBloodOrb && orbStack.getItem() instanceof IBindable) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java index e6fcedeb..33815c73 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.block; import java.util.Random; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -16,8 +17,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import javax.annotation.Nullable; @@ -29,7 +29,7 @@ public class BlockBloodLight extends Block { super(Material.CLOTH); - setUnlocalizedName(Constants.Mod.MODID + ".bloodLight"); + setUnlocalizedName(BloodMagic.MODID + ".bloodLight"); } @Nullable @@ -109,7 +109,7 @@ public class BlockBloodLight extends Block 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); - if (!playerSP.getActiveItemStack().isEmpty() && playerSP.getActiveItemStack().getItem() == ModItems.SIGIL_BLOOD_LIGHT) + if (!playerSP.getActiveItemStack().isEmpty() && playerSP.getActiveItemStack().getItem() == RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT) { 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); 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); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java index b289acad..30e399f4 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java @@ -5,27 +5,28 @@ import java.util.List; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.world.World; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumBloodRune; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; -public class BlockBloodRune extends BlockEnum implements IVariantProvider +public class BlockBloodRune extends BlockEnum { public BlockBloodRune() { super(Material.ROCK, EnumBloodRune.class); - setUnlocalizedName(Constants.Mod.MODID + ".rune."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".rune."); + setCreativeTab(BloodMagic.TAB_BM); setSoundType(SoundType.STONE); setHardness(2.0F); setResistance(5.0F); @@ -38,18 +39,9 @@ public class BlockBloodRune extends BlockEnum implements IVariant } @Override - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); - super.addInformation(stack, player, tooltip, advanced); - } - - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; + super.addInformation(stack, world, tooltip, tooltipFlag); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodStoneBrick.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodStoneBrick.java deleted file mode 100644 index 2dfd0095..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodStoneBrick.java +++ /dev/null @@ -1,40 +0,0 @@ -package WayofTime.bloodmagic.block; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumBrickSize; -import WayofTime.bloodmagic.client.IVariantProvider; - -public class BlockBloodStoneBrick extends BlockEnum implements IVariantProvider -{ - public BlockBloodStoneBrick() - { - super(Material.ROCK, EnumBrickSize.class); - - setUnlocalizedName(Constants.Mod.MODID + ".bloodstonebrick."); - setCreativeTab(BloodMagic.tabBloodMagic); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } - - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 3acdc104..f08e8135 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockInteger; import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.item.block.ItemBlockBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank; import com.google.common.collect.Lists; import net.minecraft.block.SoundType; @@ -11,6 +11,7 @@ import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -31,12 +32,11 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -public class BlockBloodTank extends BlockInteger implements IVariantProvider +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); @@ -44,12 +44,12 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider { super(Material.IRON, TileBloodTank.CAPACITIES.length - 1, "tier"); - setUnlocalizedName(Constants.Mod.MODID + ".bloodTank"); + setUnlocalizedName(BloodMagic.MODID + ".bloodTank"); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.GLASS); setHarvestLevel("pickaxe", 1); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); setLightOpacity(0); } @@ -105,12 +105,9 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider @Override public boolean onBlockActivated(World world, BlockPos blockPos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - ItemStack held = player.getHeldItem(hand); - TileBloodTank fluidHandler = (TileBloodTank) world.getTileEntity(blockPos); - FluidActionResult result = FluidUtil.interactWithFluidHandler(held, fluidHandler.getTank(), player); - if (result.isSuccess()) + boolean success = FluidUtil.interactWithFluidHandler(player, hand, world, blockPos, side); + if (success) { - player.setHeldItem(hand, result.getResult()); world.checkLight(blockPos); world.updateComparatorOutputLevel(blockPos, this); world.markAndNotifyBlock(blockPos, world.getChunkFromBlockCoords(blockPos), state, state, 3); @@ -216,14 +213,19 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider return true; } + @Override + public ItemBlock getItem() { + return new ItemBlockBloodTank(this); + } + // IVariantProvider @Override public List> getVariants() { - List> ret = new ArrayList>(); + List> ret = Lists.newArrayList(); for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) - ret.add(new ImmutablePair(i, "inventory")); + ret.add(Pair.of(i, "inventory")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockCrystal.java deleted file mode 100644 index 0ee11fa4..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockCrystal.java +++ /dev/null @@ -1,40 +0,0 @@ -package WayofTime.bloodmagic.block; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumBrickSize; -import WayofTime.bloodmagic.client.IVariantProvider; - -public class BlockCrystal extends BlockEnum implements IVariantProvider -{ - public BlockCrystal() - { - super(Material.ROCK, EnumBrickSize.class); - - setUnlocalizedName(Constants.Mod.MODID + ".crystal."); - setCreativeTab(BloodMagic.tabBloodMagic); - setSoundType(SoundType.STONE); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 2); - } - - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java new file mode 100644 index 00000000..a22fd8a8 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java @@ -0,0 +1,23 @@ +package WayofTime.bloodmagic.block; + +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.base.BlockEnum; +import WayofTime.bloodmagic.block.enums.EnumDecorative; + +public class BlockDecorative extends BlockEnum +{ + public BlockDecorative() + { + super(Material.ROCK, EnumDecorative.class); + + setUnlocalizedName(BloodMagic.MODID + "."); + 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/BlockDemonBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java index ab665f5b..e093621a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java @@ -1,17 +1,15 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; import java.util.List; +import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.IStringSerializable; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.client.IVariantProvider; @@ -21,20 +19,11 @@ public class BlockDemonBase & IStringSerializable> extends Blo { super(Material.ROCK, enumClass); - setUnlocalizedName(Constants.Mod.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); setHarvestLevel("pickaxe", 2); } - - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; - } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 6a329fd5..612c73d5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -21,7 +20,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.IDemonWillGem; import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.client.IVariantProvider; @@ -36,8 +34,8 @@ public class BlockDemonCrucible extends Block implements IVariantProvider { super(Material.ROCK); - setUnlocalizedName(Constants.Mod.MODID + ".demonCrucible"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".demonCrucible"); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 0); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index ff7e64ff..7f9e6a24 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -1,12 +1,10 @@ package WayofTime.bloodmagic.block; -import java.util.List; import java.util.Random; +import WayofTime.bloodmagic.item.block.ItemBlockDemonCrystal; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockStateContainer; @@ -14,6 +12,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; @@ -26,7 +25,6 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.item.ItemDemonCrystal; @@ -34,7 +32,7 @@ import WayofTime.bloodmagic.tile.TileDemonCrystal; import javax.annotation.Nullable; -public class BlockDemonCrystal extends Block +public class BlockDemonCrystal extends Block implements IBMBlock { public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 6); public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumDemonWillType.class); @@ -45,8 +43,8 @@ public class BlockDemonCrystal extends Block super(Material.ROCK); this.setDefaultState(this.blockState.getBaseState().withProperty(TYPE, EnumDemonWillType.DEFAULT).withProperty(ATTACHED, EnumFacing.UP)); - setUnlocalizedName(Constants.Mod.MODID + ".demonCrystal."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".demonCrystal."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 2); @@ -89,8 +87,7 @@ public class BlockDemonCrystal extends Block } @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item item, CreativeTabs creativeTabs, NonNullList list) + public void getSubBlocks(CreativeTabs creativeTabs, NonNullList list) { for (int i = 0; i < EnumDemonWillType.values().length; i++) list.add(new ItemStack(this, 1, i)); @@ -233,6 +230,11 @@ public class BlockDemonCrystal extends Block return new TileDemonCrystal(); } + @Override + public ItemBlock getItem() { + return new ItemBlockDemonCrystal(this); + } + // @Override // public java.util.List getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune) // { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java index aef22bcd..f2251c90 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java @@ -17,7 +17,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileDemonCrystallizer; @@ -27,8 +26,8 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr { super(Material.ROCK); - setUnlocalizedName(Constants.Mod.MODID + ".demonCrystallizer"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".demonCrystallizer"); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 0); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java index 71bc8c46..6d776883 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java @@ -10,32 +10,22 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumSubWillType; import WayofTime.bloodmagic.client.IVariantProvider; -public class BlockDemonLight extends BlockEnum implements IVariantProvider +public class BlockDemonLight extends BlockEnum { public BlockDemonLight() { super(Material.ROCK, EnumSubWillType.class); - setUnlocalizedName(Constants.Mod.MODID + ".demonlight."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".demonlight."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); setHarvestLevel("pickaxe", 2); setLightLevel(1); } - - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; - } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java index 8fd5c2a0..53c2c495 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java @@ -1,29 +1,26 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; import java.util.List; +import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockEnumPillar; -import WayofTime.bloodmagic.client.IVariantProvider; -public class BlockDemonPillarBase & IStringSerializable> extends BlockEnumPillar implements IVariantProvider +public class BlockDemonPillarBase & IStringSerializable> extends BlockEnumPillar { public BlockDemonPillarBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); - setUnlocalizedName(Constants.Mod.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); @@ -33,18 +30,14 @@ public class BlockDemonPillarBase & IStringSerializable> exten @Override public List> getVariants() { - List> ret = new ArrayList>(); + List> ret = Lists.newArrayList(); //This is done to make the ItemBlocks have the proper model EnumFacing.Axis[] axis = new EnumFacing.Axis[] { EnumFacing.Axis.Y, EnumFacing.Axis.X, EnumFacing.Axis.Z }; for (int i = 0; i < 3; i++) - { for (int j = 0; j < this.getTypes().length; j++) - { - ret.add(new ImmutablePair(i * 5 + j, "axis=" + axis[i] + ",type=" + this.getTypes()[j])); - } - } + ret.add(Pair.of(i * 5 + j, "axis=" + axis[i] + ",type=" + this.getTypes()[j])); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java index b2729cfa..865b89ca 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java @@ -1,29 +1,26 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; import java.util.List; +import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockEnumPillarCap; -import WayofTime.bloodmagic.client.IVariantProvider; -public class BlockDemonPillarCapBase & IStringSerializable> extends BlockEnumPillarCap implements IVariantProvider +public class BlockDemonPillarCapBase & IStringSerializable> extends BlockEnumPillarCap { public BlockDemonPillarCapBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); - setUnlocalizedName(Constants.Mod.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); @@ -33,17 +30,13 @@ public class BlockDemonPillarCapBase & IStringSerializable> ex @Override public List> getVariants() { - List> ret = new ArrayList>(); + List> ret = Lists.newArrayList(); //This is done to make the ItemBlocks have the proper model for (int i = 0; i < EnumFacing.values().length; i++) - { for (int j = 0; j < this.getTypes().length; j++) - { - ret.add(new ImmutablePair(i * 2 + j, "facing=" + EnumFacing.values()[i] + ",type=" + this.getTypes()[j])); - } - } + ret.add(Pair.of(i * 2 + j, "facing=" + EnumFacing.values()[i] + ",type=" + this.getTypes()[j])); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java index 26b8f331..1eda088e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -16,7 +16,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileDemonPylon; @@ -26,8 +25,8 @@ public class BlockDemonPylon extends BlockContainer implements IVariantProvider { super(Material.ROCK); - setUnlocalizedName(Constants.Mod.MODID + ".demonPylon"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".demonPylon"); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 0); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java index 084c90ed..26ae4b4e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.List; +import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.IStringSerializable; @@ -11,18 +12,17 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockEnumStairs; import WayofTime.bloodmagic.client.IVariantProvider; -public class BlockDemonStairsBase & IStringSerializable> extends BlockEnumStairs implements IVariantProvider +public class BlockDemonStairsBase & IStringSerializable> extends BlockEnumStairs { public BlockDemonStairsBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); - setUnlocalizedName(Constants.Mod.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); @@ -32,12 +32,10 @@ public class BlockDemonStairsBase & IStringSerializable> exten @Override public List> getVariants() { - List> ret = new ArrayList>(); + List> ret = Lists.newArrayList(); for (int i = 0; i < this.getTypes().length; i++) - { - ret.add(new ImmutablePair(i, "facing=south,half=bottom,shape=straight,type=" + this.getTypes()[i])); - } + ret.add(Pair.of(i, "facing=south,half=bottom,shape=straight,type=" + this.getTypes()[i])); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java index 08fd0e72..3bd4be9f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.List; +import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.IStringSerializable; @@ -10,18 +11,17 @@ import net.minecraft.util.IStringSerializable; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockEnumWall; import WayofTime.bloodmagic.client.IVariantProvider; -public class BlockDemonWallBase & IStringSerializable> extends BlockEnumWall implements IVariantProvider +public class BlockDemonWallBase & IStringSerializable> extends BlockEnumWall { public BlockDemonWallBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); - setUnlocalizedName(Constants.Mod.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); @@ -31,7 +31,7 @@ public class BlockDemonWallBase & IStringSerializable> extends @Override public List> getVariants() { - List> ret = new ArrayList>(); + List> ret = Lists.newArrayList(); for (int i = 0; i < this.getTypes().length; i++) ret.add(Pair.of(i, "east=true,north=false,south=false,type=" + this.getTypes()[i] + ",up=true,west=true")); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index a5ce9e94..1fe90938 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.Random; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockInteger; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -16,7 +17,6 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.teleport.PortalLocation; import WayofTime.bloodmagic.api.teleport.TeleportQueue; @@ -35,7 +35,7 @@ public class BlockDimensionalPortal extends BlockInteger public BlockDimensionalPortal() { super(Material.PORTAL, 2); - setUnlocalizedName(Constants.Mod.MODID + ".dimensionalPortal"); + setUnlocalizedName(BloodMagic.MODID + ".dimensionalPortal"); setBlockUnbreakable(); setResistance(2000); setLightOpacity(0); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java index 92ace672..edc30df5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; @@ -18,7 +17,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileIncenseAltar; @@ -32,8 +30,8 @@ public class BlockIncenseAltar extends Block implements IVariantProvider { super(Material.ROCK); - setUnlocalizedName(Constants.Mod.MODID + ".incenseAltar"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".incenseAltar"); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 0); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java index f7217004..8fdf5607 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; @@ -20,7 +19,7 @@ public class BlockInputRoutingNode extends BlockRoutingNode { super(); - setUnlocalizedName(Constants.Mod.MODID + ".inputRouting"); + setUnlocalizedName(BloodMagic.MODID + ".inputRouting"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java index b05b122d..396c320d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java @@ -19,19 +19,18 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.enums.EnumSubWillType; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileInversionPillar; -public class BlockInversionPillar extends BlockEnum implements IVariantProvider +public class BlockInversionPillar extends BlockEnum { public BlockInversionPillar() { super(Material.ROCK, EnumSubWillType.class); - setUnlocalizedName(Constants.Mod.MODID + ".inversionpillar."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".inversionpillar."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); @@ -92,7 +91,7 @@ public class BlockInversionPillar extends BlockEnum implements { List> ret = new ArrayList>(); for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "static=false,type=" + this.getTypes()[i])); + ret.add(Pair.of(i, "static=false,type=" + this.getTypes()[i])); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java index 0840c48b..873e466a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java @@ -14,7 +14,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumInversionCap; import WayofTime.bloodmagic.client.IVariantProvider; @@ -25,8 +24,8 @@ public class BlockInversionPillarEnd extends BlockEnum impleme { super(Material.ROCK, EnumInversionCap.class); - setUnlocalizedName(Constants.Mod.MODID + ".inversionpillarend."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".inversionpillarend."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java index 8bc69487..32dc9d79 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.block; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.routing.TileItemRoutingNode; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; @@ -16,7 +16,7 @@ public class BlockItemRoutingNode extends BlockRoutingNode { super(); - setUnlocalizedName(Constants.Mod.MODID + ".itemRouting"); + setUnlocalizedName(BloodMagic.MODID + ".itemRouting"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java index 1678a8ce..11e26187 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java @@ -2,9 +2,8 @@ package WayofTime.bloodmagic.block; import java.awt.Color; -import lombok.Getter; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -19,16 +18,15 @@ import WayofTime.bloodmagic.util.helper.TextHelper; public class BlockLifeEssence extends BlockFluidClassic { - @Getter - private static Fluid lifeEssence = new FluidLifeEssence(); + private static final Fluid LIFE_ESSENCE = new FluidLifeEssence(); public BlockLifeEssence() { - super(lifeEssence, Material.WATER); + super(LIFE_ESSENCE, Material.WATER); - setUnlocalizedName(Constants.Mod.MODID + ".fluid.lifeEssence"); + setUnlocalizedName(BloodMagic.MODID + ".fluid.lifeEssence"); getLifeEssence().setBlock(this); - BloodMagicAPI.setLifeEssence(getLifeEssence()); + BloodMagicAPI.lifeEssence = LIFE_ESSENCE; } @Override @@ -43,6 +41,10 @@ public class BlockLifeEssence extends BlockFluidClassic return !world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isLiquid() && super.displaceIfPossible(world, blockPos); } + public static Fluid getLifeEssence() { + return LIFE_ESSENCE; + } + @Override public BlockRenderLayer getBlockLayer() { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java index 1ae1b8a6..eec3d1e4 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java @@ -4,7 +4,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; import javax.annotation.Nullable; @@ -15,8 +14,8 @@ public class BlockMasterRoutingNode extends BlockRoutingNode { super(); - setUnlocalizedName(Constants.Mod.MODID + ".masterRouting"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".masterRouting"); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 2); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 599b5a18..188f2f74 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -1,8 +1,5 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - import javax.annotation.Nullable; import WayofTime.bloodmagic.block.base.BlockEnum; @@ -26,20 +23,15 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.altar.IAltarComponent; import WayofTime.bloodmagic.block.enums.EnumMimic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMimic; import WayofTime.bloodmagic.util.Utils; -public class BlockMimic extends BlockEnum implements IVariantProvider, IAltarComponent +public class BlockMimic extends BlockEnum implements IAltarComponent { public static final int sentientMimicMeta = 4; @@ -47,8 +39,8 @@ public class BlockMimic extends BlockEnum implements IVariantProvider { super(Material.ROCK, EnumMimic.class); - setUnlocalizedName(Constants.Mod.MODID + ".mimic."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".mimic."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); @@ -171,7 +163,7 @@ public class BlockMimic extends BlockEnum implements IVariantProvider { if (block.getRenderType(mimicState) == EnumBlockRenderType.ENTITYBLOCK_ANIMATED) { - return ModBlocks.BLOOD_LIGHT.getDefaultState(); //Small and invisible-ish, basically this is returned in order to not render over the animated block (TESR) + 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); @@ -225,15 +217,6 @@ public class BlockMimic extends BlockEnum implements IVariantProvider super.breakBlock(world, blockPos, blockState); } - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; - } - @Override public boolean hasTileEntity(IBlockState state) { return true; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java index 194490f0..3b65f42d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; @@ -20,7 +19,7 @@ public class BlockOutputRoutingNode extends BlockRoutingNode { super(); - setUnlocalizedName(Constants.Mod.MODID + ".outputRouting"); + setUnlocalizedName(BloodMagic.MODID + ".outputRouting"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 9be944dc..4e5099f1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -6,6 +6,7 @@ import java.util.List; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -15,22 +16,21 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.incense.IIncensePath; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumPath; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; -public class BlockPath extends BlockEnum implements IIncensePath, IVariantProvider +public class BlockPath extends BlockEnum implements IIncensePath { public BlockPath() { super(Material.ROCK, EnumPath.class); - setUnlocalizedName(Constants.Mod.MODID + ".path."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".path."); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.STONE); @@ -46,10 +46,10 @@ public class BlockPath extends BlockEnum implements IIncensePath, IVar } @Override - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, tooltipFlag); } @Override @@ -73,13 +73,4 @@ public class BlockPath extends BlockEnum implements IIncensePath, IVar return 0; } } - - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; - } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java index 8b35601e..257d417e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; @@ -22,7 +21,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TilePhantomBlock; @@ -34,8 +32,8 @@ public class BlockPhantom extends Block implements IVariantProvider { super(Material.CLOTH); - setUnlocalizedName(Constants.Mod.MODID + ".phantom"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".phantom"); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index f19b7126..08884846 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -1,8 +1,5 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - import javax.annotation.Nullable; import WayofTime.bloodmagic.api.iface.IBindable; @@ -21,36 +18,28 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.Explosion; import net.minecraft.world.World; -import net.minecraftforge.fml.common.Optional; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.api.util.helper.RitualHelper; import WayofTime.bloodmagic.block.enums.EnumRitualController; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileImperfectRitualStone; import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.util.ChatUtil; import amerifrance.guideapi.api.IGuideLinked; -@Optional.Interface(modid = "guideapi", iface = "amerifrance.guideapi.api.IGuideLinked") -public class BlockRitualController extends BlockEnum implements IVariantProvider, IGuideLinked +public class BlockRitualController extends BlockEnum implements IGuideLinked { public BlockRitualController() { super(Material.ROCK, EnumRitualController.class); - setUnlocalizedName(Constants.Mod.MODID + ".stone.ritual."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".stone.ritual."); + setCreativeTab(BloodMagic.TAB_BM); setSoundType(SoundType.STONE); setHardness(2.0F); setResistance(5.0F); @@ -65,7 +54,7 @@ public class BlockRitualController extends BlockEnum imple if (state.getValue(getProperty()) != EnumRitualController.IMPERFECT && tile instanceof TileMasterRitualStone) { - if (heldItem.getItem() == ModItems.ACTIVATION_CRYSTAL) + if (heldItem.getItem() == RegistrarBloodMagicItems.ACTIVATION_CRYSTAL) { IBindable bindable = (IBindable) heldItem.getItem(); if (Strings.isNullOrEmpty(bindable.getOwnerName(heldItem))) @@ -129,17 +118,6 @@ public class BlockRitualController extends BlockEnum imple return state.getValue(getProperty()) != EnumRitualController.IMPERFECT ? new TileMasterRitualStone() : new TileImperfectRitualStone(); } - // IVariantProvider - - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; - } - // IGuideLinked @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index e4e1e002..050aa5bc 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -6,42 +6,45 @@ import java.util.List; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; 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 org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.helper.TextHelper; -public class BlockRitualStone extends BlockEnum implements IRitualStone, IVariantProvider +public class BlockRitualStone extends BlockEnum implements IRitualStone { public BlockRitualStone() { super(Material.IRON, EnumRuneType.class); - setUnlocalizedName(Constants.Mod.MODID + ".ritualStone."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(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, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, tooltipFlag); } @Override @@ -66,16 +69,7 @@ public class BlockRitualStone extends BlockEnum implements IRitual public void setRuneType(World world, BlockPos pos, EnumRuneType runeType) { int meta = runeType.ordinal(); - IBlockState newState = ModBlocks.RITUAL_STONE.getStateFromMeta(meta); + IBlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); world.setBlockState(pos, newState); } - - @Override - public List> getVariants() - { - List> ret = new ArrayList>(); - for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); - return ret; - } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java index bf068a92..1234bab3 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.block; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumBlockRenderType; @@ -18,7 +18,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -public class BlockRoutingNode extends Block +public class BlockRoutingNode extends Block implements IBMBlock { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.378F, 0.378F, 0.378F, 0.625F, 0.625F, 0.625F); @@ -33,7 +33,7 @@ public class BlockRoutingNode extends Block { super(Material.ROCK); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); setHarvestLevel("pickaxe", 2); @@ -140,4 +140,9 @@ public class BlockRoutingNode extends Block super.breakBlock(world, pos, blockState); } + + @Override + public ItemBlock getItem() { + return new ItemBlock(this); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index 2203c7d5..129edaaa 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -4,12 +4,10 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; @@ -37,12 +35,12 @@ public class BlockSoulForge extends Block implements IVariantProvider { super(Material.IRON); - setUnlocalizedName(Constants.Mod.MODID + ".soulForge"); + setUnlocalizedName(BloodMagic.MODID + ".soulForge"); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.METAL); setHarvestLevel("pickaxe", 1); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java index e72b9abb..c11a4365 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; @@ -24,7 +24,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileSpectralBlock; @@ -38,7 +37,7 @@ public class BlockSpectral extends Block implements IVariantProvider { super(Material.CLOTH); - setUnlocalizedName(Constants.Mod.MODID + ".spectral"); + setUnlocalizedName(BloodMagic.MODID + ".spectral"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index da254a0d..4c764482 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -30,8 +30,8 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider { super(Material.ROCK); - setCreativeTab(BloodMagic.tabBloodMagic); - setUnlocalizedName(Constants.Mod.MODID + ".teleposer"); + setCreativeTab(BloodMagic.TAB_BM); + setUnlocalizedName(BloodMagic.MODID + ".teleposer"); setHardness(2.0F); setResistance(5.0F); } diff --git a/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java b/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java new file mode 100644 index 00000000..7dd5b818 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java @@ -0,0 +1,8 @@ +package WayofTime.bloodmagic.block; + +import net.minecraft.item.ItemBlock; + +public interface IBMBlock { + + ItemBlock getItem(); +} diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java index 36c41e6d..451ec2a8 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java @@ -1,23 +1,24 @@ package WayofTime.bloodmagic.block.base; -import lombok.Getter; +import WayofTime.bloodmagic.block.IBMBlock; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.item.block.base.ItemBlockEnum; +import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; import net.minecraft.util.NonNullList; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import org.apache.commons.lang3.tuple.Pair; import java.util.List; -@Getter -public class BlockEnum & IStringSerializable> extends Block +public class BlockEnum & IStringSerializable> extends Block implements IBMBlock, IVariantProvider { private final E[] types; private final PropertyEnum property; @@ -68,16 +69,44 @@ public class BlockEnum & IStringSerializable> extends Block return getMetaFromState(state); } - @SideOnly(Side.CLIENT) @Override - public void getSubBlocks(Item item, CreativeTabs tab, NonNullList subBlocks) + public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { for (E type : types) - subBlocks.add(new ItemStack(item, 1, type.ordinal())); + subBlocks.add(new ItemStack(this, 1, type.ordinal())); } protected BlockStateContainer createStateContainer() { return new BlockStateContainer.Builder(this).add(property).build(); } + + @Override + public ItemBlock getItem() { + return new ItemBlockEnum<>(this); + } + + @Override + public List> getVariants() { + List> variants = Lists.newArrayList(); + if (getItem() == null) + return variants; + + for (int i = 0; i < types.length; i++) + variants.add(Pair.of(i, getProperty().getName() + "=" + types[i].name())); + + return variants; + } + + 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/BlockEnumStairs.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java index 1cfa5837..271c5b76 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java @@ -71,7 +71,7 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn) + public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { state = this.getActualState(state, worldIn, pos); diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java index 5d24ed53..3bf70c91 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.block.base; -import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyInteger; @@ -18,7 +17,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; * * These states will be numbered 0 through {@code maxMeta}. */ -@Getter public class BlockInteger extends Block { private final int maxMeta; @@ -65,11 +63,10 @@ public class BlockInteger extends Block return getMetaFromState(state); } - @SideOnly(Side.CLIENT) @Override - public void getSubBlocks(Item item, CreativeTabs tab, NonNullList subBlocks) { + public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { for (int i = 0; i < maxMeta; i++) - subBlocks.add(new ItemStack(item, 1, i)); + subBlocks.add(new ItemStack(this, 1, i)); } protected BlockStateContainer createStateContainer() { diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java index d6381cdf..9b989e9a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.block.base; -import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.BlockStateContainer; @@ -21,7 +20,6 @@ import org.apache.commons.lang3.ArrayUtils; * way, each value is {@code toLowerCase()}'ed, so the blockstate JSON needs all * values to be lowercase. */ -@Getter public class BlockString extends Block { private final int maxMeta; @@ -78,10 +76,10 @@ public class BlockString extends Block @SideOnly(Side.CLIENT) @Override - public void getSubBlocks(Item item, CreativeTabs tab, NonNullList subBlocks) + public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { for (int i = 0; i < maxMeta; i++) - subBlocks.add(new ItemStack(item, 1, i)); + subBlocks.add(new ItemStack(this, 1, i)); } protected BlockStateContainer createStateContainer() @@ -91,4 +89,20 @@ public class BlockString extends Block System.out.println("Number of states: " + ctn.getValidStates().size()); return ctn; } + + public int getMaxMeta() { + return maxMeta; + } + + public String[] getTypes() { + return types; + } + + public PropertyString getProperty() { + return property; + } + + public BlockStateContainer getRealStateContainer() { + return realStateContainer; + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumBrickSize.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java similarity index 51% rename from src/main/java/WayofTime/bloodmagic/block/enums/EnumBrickSize.java rename to src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java index b76396e1..c9ae8947 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumBrickSize.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java @@ -4,20 +4,23 @@ import java.util.Locale; import net.minecraft.util.IStringSerializable; -public enum EnumBrickSize implements IStringSerializable +public enum EnumDecorative implements IStringSerializable { - LARGE, - BRICK; + BLOODSTONE_TILE, + BLOODSTONE_BRICK, + CRYSTAL_TILE, + CRYSTAL_BRICK, + ; @Override public String toString() { - return name().toLowerCase(Locale.ENGLISH); + return name().toLowerCase(Locale.ROOT); } @Override public String getName() { - return this.toString(); + return toString(); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java index 22164f2f..5794d1e6 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.client.gui; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.InventoryPlayer; @@ -8,7 +9,6 @@ import net.minecraft.inventory.Slot; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.TileAlchemyTable; import WayofTime.bloodmagic.tile.container.ContainerAlchemyTable; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -37,7 +37,7 @@ public class GuiAlchemyTable extends GuiContainer protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation soulForgeGuiTextures = new ResourceLocation(Constants.Mod.MODID + ":textures/gui/alchemyTable.png"); + 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; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java index 49893a7a..c5a8383c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.client.gui; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.item.inventory.ContainerHolding; import WayofTime.bloodmagic.item.inventory.InventoryHolding; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; @@ -16,7 +16,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class GuiHolding extends GuiContainer { - private ResourceLocation texture = new ResourceLocation(Constants.Mod.MODID, "gui/SigilHolding.png"); + private ResourceLocation texture = new ResourceLocation(BloodMagic.MODID, "gui/SigilHolding.png"); private EntityPlayer player; public GuiHolding(EntityPlayer player, InventoryHolding inventoryHolding) @@ -43,7 +43,7 @@ public class GuiHolding extends GuiContainer int x = (width - xSize) / 2; int y = (height - ySize) / 2; this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize); - if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() == ModItems.SIGIL_HOLDING) + if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().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 index ddb5a2b8..049a8fdf 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.client.gui; import java.io.IOException; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiTextField; @@ -15,7 +16,6 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.ItemRouterAmountPacketProcessor; import WayofTime.bloodmagic.network.ItemRouterButtonPacketProcessor; @@ -211,7 +211,7 @@ public class GuiItemRoutingNode extends GuiContainer protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation soulForgeGuiTextures = new ResourceLocation(Constants.Mod.MODID + ":textures/gui/routingNode.png"); + 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(); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java index 883ec432..d8f0c3bb 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.gui; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.tile.container.ContainerMasterRoutingNode; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; @@ -35,7 +35,7 @@ public class GuiMasterRoutingNode extends GuiContainer protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation soulForgeGuiTextures = new ResourceLocation(Constants.Mod.MODID + ":textures/gui/masterRoutingNode.png"); + 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; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java index 7153656d..6dc01ad4 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.gui; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.tile.TileSoulForge; import WayofTime.bloodmagic.tile.container.ContainerSoulForge; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -36,7 +36,7 @@ public class GuiSoulForge extends GuiContainer protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation soulForgeGuiTextures = new ResourceLocation(Constants.Mod.MODID + ":textures/gui/soulForge.png"); + 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; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java index 4bafa7f8..74729451 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.gui; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.tile.container.ContainerTeleposer; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.gui.inventory.GuiContainer; @@ -30,7 +30,7 @@ public class GuiTeleposer extends GuiContainer protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation teleposerGuiTextures = new ResourceLocation(Constants.Mod.MODID + ":textures/gui/teleposer.png"); + 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; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java index 9daa85d1..910bba94 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.gui.config; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; import net.minecraft.client.gui.GuiScreen; import net.minecraftforge.common.config.ConfigElement; import net.minecraftforge.fml.client.config.GuiConfig; @@ -15,7 +15,7 @@ public class ConfigGui extends GuiConfig public ConfigGui(GuiScreen parentScreen) { - super(parentScreen, getConfigElements(parentScreen), Constants.Mod.MODID, false, false, "BloodMagic Configuration"); + super(parentScreen, getConfigElements(parentScreen), BloodMagic.MODID, false, false, "BloodMagic Configuration"); } @SuppressWarnings("rawtypes") diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java index 3bb369d7..ea91517c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java @@ -1,17 +1,13 @@ package WayofTime.bloodmagic.client.hud; import WayofTime.bloodmagic.util.handler.event.ClientHandler; -import lombok.Getter; -import lombok.Setter; 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.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraftforge.client.event.RenderGameOverlayEvent; -@Getter -@Setter public abstract class HUDElement { @@ -52,12 +48,32 @@ public abstract class HUDElement float f = 0.00390625F; float f1 = 0.00390625F; Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer vertexbuffer = tessellator.getBuffer(); - vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX); - vertexbuffer.pos((double) (x + 0), (double) (y + height), 0).tex((double) ((float) (textureX + 0) * f), (double) ((float) (textureY + height) * f1)).endVertex(); - vertexbuffer.pos((double) (x + width), (double) (y + height), 0).tex((double) ((float) (textureX + width) * f), (double) ((float) (textureY + height) * f1)).endVertex(); - vertexbuffer.pos((double) (x + width), (double) (y + 0), 0).tex((double) ((float) (textureX + width) * f), (double) ((float) (textureY + 0) * f1)).endVertex(); - vertexbuffer.pos((double) (x + 0), (double) (y + 0), 0).tex((double) ((float) (textureX + 0) * f), (double) ((float) (textureY + 0) * f1)).endVertex(); + 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(); } + + public int getxOffset() { + return xOffset; + } + + public int getyOffset() { + return yOffset; + } + + public int getxOffsetDefault() { + return xOffsetDefault; + } + + public int getyOffsetDefault() { + return yOffsetDefault; + } + + public RenderGameOverlayEvent.ElementType getElementType() { + return elementType; + } } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java index 4226c787..45d8ce3e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java @@ -3,15 +3,14 @@ package WayofTime.bloodmagic.client.hud; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderGameOverlayEvent; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.proxy.ClientProxy; import WayofTime.bloodmagic.util.Utils; @@ -41,7 +40,7 @@ public class HUDElementDemonWillAura extends HUDElement return; } - minecraft.getTextureManager().bindTexture(new ResourceLocation(Constants.Mod.MODID, "textures/hud/bars.png")); + minecraft.getTextureManager().bindTexture(new ResourceLocation(BloodMagic.MODID, "textures/hud/bars.png")); GlStateManager.color(1.0F, 1.0F, 1.0F); this.drawTexturedModalRect(getXOffset(), getYOffset(), 0, 105 * 2, 80, 46); @@ -52,7 +51,7 @@ public class HUDElementDemonWillAura extends HUDElement { i++; GlStateManager.color(1.0F, 1.0F, 1.0F); - minecraft.getTextureManager().bindTexture(new ResourceLocation(Constants.Mod.MODID, "textures/hud/bars.png")); + minecraft.getTextureManager().bindTexture(new ResourceLocation(BloodMagic.MODID, "textures/hud/bars.png")); int textureXOffset = (i > 3) ? (i - 3) : (3 - i); int maxBarSize = 30 - 2 * textureXOffset; diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java index f56e2cbc..e390f1c7 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.client.hud; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; @@ -28,15 +28,15 @@ public class HUDElementHolding extends HUDElement { ItemStack sigilHolding = minecraft.player.getHeldItemMainhand(); // Check mainhand for Sigil of Holding - if (!(sigilHolding.getItem() == ModItems.SIGIL_HOLDING)) + if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) sigilHolding = minecraft.player.getHeldItemOffhand(); // Check offhand for Sigil of Holding - if (!(sigilHolding.getItem() == ModItems.SIGIL_HOLDING)) + if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) return; Gui ingameGui = minecraft.ingameGUI; - minecraft.getTextureManager().bindTexture(new ResourceLocation(Constants.Mod.MODID, "textures/gui/widgets.png")); + minecraft.getTextureManager().bindTexture(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png")); GlStateManager.color(1.0F, 1.0F, 1.0F); ingameGui.drawTexturedModalRect(resolution.getScaledWidth() / 2 + 100 + getXOffset(), resolution.getScaledHeight() - 22 + getYOffset(), 0, 0, 102, 22); int currentSlot = ItemSigilHolding.getCurrentItemOrdinal(sigilHolding); diff --git a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java index 32f65613..6d2ba73b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.key; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.settings.KeyBinding; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.relauncher.Side; @@ -11,7 +11,7 @@ public class KeyBindingBloodMagic extends KeyBinding { public KeyBindingBloodMagic(KeyBindings key) { - super(key.getDescription(), key.getKeyConflictContext(), key.getKeyModifier(), key.getKeyCode(), Constants.Mod.NAME); + 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 index eb894c9b..d10e0897 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.key; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.KeyProcessor; @@ -106,6 +106,6 @@ public enum KeyBindings public String getDescription() { - return Constants.Mod.MODID + ".keybind." + name().toLowerCase(Locale.ENGLISH); + 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 index 934600ff..2ba73161 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.mesh; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.iface.IActivatable; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; @@ -21,8 +21,8 @@ public class CustomMeshDefinitionActivatable implements ItemMeshDefinition { if (stack != null && stack.getItem() instanceof IActivatable) if (((IActivatable) stack.getItem()).getActivated(stack)) - return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + name), "active=true"); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "active=true"); - return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + name), "active=false"); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + 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 index ed901323..0edb0e0c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.client.mesh; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IMultiWillTool; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; @@ -23,9 +23,9 @@ public class CustomMeshDefinitionMultiWill implements ItemMeshDefinition if (stack != null && stack.getItem() instanceof IMultiWillTool) { EnumDemonWillType type = ((IMultiWillTool) stack.getItem()).getCurrentType(stack); - return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + name), "type=" + type.getName().toLowerCase()); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "type=" + type.getName().toLowerCase()); } - return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + name), "type=default"); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + 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 index ed3383c2..9fce3d6b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.mesh; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.item.soul.ItemSoulGem; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; public class CustomMeshDefinitionWillGem implements ItemMeshDefinition { @@ -21,12 +21,12 @@ public class CustomMeshDefinitionWillGem implements ItemMeshDefinition @Override public ModelResourceLocation getModelLocation(ItemStack stack) { - if (stack != null && stack.getItem() == ModItems.SOUL_GEM) + if (stack != null && stack.getItem() == RegistrarBloodMagicItems.SOUL_GEM) { EnumDemonWillType type = ((ItemSoulGem) stack.getItem()).getCurrentType(stack); - return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + name), "type=" + ItemSoulGem.names[stack.getItemDamage()] + "_" + type.getName().toLowerCase()); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "type=" + ItemSoulGem.names[stack.getItemDamage()] + "_" + type.getName().toLowerCase()); } - return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + name), "type=petty_default"); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + 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 index a6c6ab6f..08186d3b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; import net.minecraft.client.entity.AbstractClientPlayer; @@ -31,7 +31,7 @@ public class LayerBloodElytra implements LayerRenderer if (LivingArmour.hasFullSet(clientPlayer)) { ItemStack chestStack = clientPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (ItemLivingArmour.hasUpgrade(Constants.Mod.MODID + ".upgrade.elytra", chestStack)) + if (ItemLivingArmour.hasUpgrade(BloodMagic.MODID + ".upgrade.elytra", chestStack)) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.enableBlend(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java index 09e0c193..2318d142 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -50,7 +50,7 @@ public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer { if (craftTime < secondaryOffset) { - float modifier = 90 * (craftTime - offset) / (float) (secondaryOffset - offset); + float modifier = 90 * (craftTime - offset) / (secondaryOffset - offset); return modifier; } else { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index be708860..0ef9593e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -96,7 +96,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer float offset = 2; if (circle == -1) { - return (float) (craftTime * 360 * 2 / 5 / sweepTime); + return craftTime * 360 * 2 / 5 / sweepTime; } if (craftTime >= offset) { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java index 4f69d238..83774dd1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.block; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.INodeRenderer; import WayofTime.bloodmagic.client.helper.ShaderHelper; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; @@ -20,7 +20,7 @@ import java.util.List; public class RenderItemRoutingNode extends TileEntitySpecialRenderer { - private static final ResourceLocation beamTexture = new ResourceLocation(Constants.Mod.MODID, "textures/entities/nodeBeam.png"); + private static final ResourceLocation beamTexture = new ResourceLocation(BloodMagic.MODID, "textures/entities/nodeBeam.png"); private static final Minecraft mc = Minecraft.getMinecraft(); // private static final ResourceLocation test = new ResourceLocation("luminescence:textures/models/InputMirror.png"); @@ -71,11 +71,11 @@ public class RenderItemRoutingNode extends TileEntitySpecialRenderer { public ModelBase model = new ModelMeteor(); private float scale = 1; - private static final ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "textures/models/Meteor.png"); + private static final ResourceLocation resource = new ResourceLocation(BloodMagic.MODID, "textures/models/Meteor.png"); public RenderEntityMeteor(RenderManager renderManagerIn) { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java index 9d2c755c..08e6f26f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java @@ -82,7 +82,7 @@ public class RenderEntityMimic extends RenderLiving if (!StringUtils.isNullOrEmpty(s)) { - gameprofile = TileEntitySkull.updateGameprofile(new GameProfile((UUID) null, s)); + gameprofile = TileEntitySkull.updateGameprofile(new GameProfile(null, s)); nbttagcompound.setTag("SkullOwner", NBTUtil.writeGameProfile(new NBTTagCompound(), gameprofile)); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java index 788f0616..1e7fe96f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderItem; @@ -30,7 +30,7 @@ public class RenderEntitySoulSnare extends Render GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); GlStateManager.rotate(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); this.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); - this.renderItem.renderItem(new ItemStack(ModItems.SOUL_SNARE), ItemCameraTransforms.TransformType.GROUND); + this.renderItem.renderItem(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE), ItemCameraTransforms.TransformType.GROUND); GlStateManager.disableRescaleNormal(); GlStateManager.popMatrix(); super.doRender(entity, x, y, z, entityYaw, partialTicks); 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 index f2148ee2..454a71fa 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java @@ -35,7 +35,7 @@ public class LayerAlchemyCircle implements Layer VertexBuffer wr = tessellator.getBuffer(); GlStateManager.pushMatrix(); - float rot = (float) this.rotationspeed * (partialTicks + demon.ticksExisted); + float rot = this.rotationspeed * (partialTicks + demon.ticksExisted); float secondaryRot = 0; float size = 3.0F; diff --git a/src/main/java/WayofTime/bloodmagic/compat/ICompatibility.java b/src/main/java/WayofTime/bloodmagic/compat/ICompatibility.java deleted file mode 100644 index c1c75352..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/ICompatibility.java +++ /dev/null @@ -1,59 +0,0 @@ -package WayofTime.bloodmagic.compat; - -/** - * Implement on all primary compatibility classes. - */ -public interface ICompatibility -{ - /** - * Called during each initialization phase after the given - * {@link #getModId()} has been verified as loaded. - * - * @param phase - * - The load phase at which this method is being called. - */ - void loadCompatibility(InitializationPhase phase); - - /** - * @return The {@code modid} of the mod we are adding compatibility for. - */ - String getModId(); - - /** - * Whether or not compatibility should be loaded even if the mod were to be - * found. - * - * Generally a determined by a config option. - * - * @return If Compatibility should load. - */ - boolean enableCompat(); - - /** - * Represents a given mod initialization state. - */ - enum InitializationPhase - { - /** - * Represents - * {@link net.minecraftforge.fml.common.event.FMLPreInitializationEvent} - */ - PRE_INIT, - /** - * Represents - * {@link net.minecraftforge.fml.common.event.FMLInitializationEvent} - */ - INIT, - /** - * Represents - * {@link net.minecraftforge.fml.common.event.FMLPostInitializationEvent} - */ - POST_INIT, - /** - * Represents - * {@link net.minecraftforge.fml.common.event.FMLModIdMappingEvent} - */ - MAPPING, - ; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java index d8192078..44e32f8f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java @@ -1,60 +1,55 @@ package WayofTime.bloodmagic.compat.guideapi; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.compat.guideapi.book.*; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.registry.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.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; +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 -public class GuideBloodMagic implements IGuideBook -{ - public static Book guideBook; +@GuideBook(priority = EventPriority.HIGHEST) +public class GuideBloodMagic implements IGuideBook { + + public static final Book GUIDE_BOOK = new Book(); @Nullable @Override public Book buildBook() { - guideBook = new Book(); - guideBook.setTitle("guide.bloodmagic.title"); - guideBook.setDisplayName("guide.bloodmagic.display"); - guideBook.setWelcomeMessage("guide.bloodmagic.welcome"); - guideBook.setAuthor("guide.bloodmagic.author"); - guideBook.setRegistryName(new ResourceLocation(Constants.Mod.MODID, "guide")); - guideBook.setColor(Color.RED); + 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 guideBook; - } - - @Override - public void handleModel(ItemStack bookStack) { - GuideAPI.setModel(guideBook); + return GUIDE_BOOK; } @Override public void handlePost(ItemStack bookStack) { - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { - guideBook.addCategory(new CategoryItemStack(CategoryAlchemy.buildCategory(), "guide.bloodmagic.category.alchemy", new ItemStack(ModItems.ARCANE_ASHES))); - guideBook.addCategory(new CategoryItemStack(CategoryArchitect.buildCategory(), "guide.bloodmagic.category.architect", new ItemStack(ModItems.SIGIL_DIVINATION))); - guideBook.addCategory(new CategoryItemStack(CategoryDemon.buildCategory(), "guide.bloodmagic.category.demon", new ItemStack(ModItems.BLOOD_SHARD))); - guideBook.addCategory(new CategoryItemStack(CategoryRitual.buildCategory(), "guide.bloodmagic.category.ritual", new ItemStack(ModBlocks.RITUAL_CONTROLLER))); -// guideBook.addCategory(new CategoryItemStack(CategorySpell.buildCategory(), "guide.bloodmagic.category.spell", new ItemStack(ModItems.ritualDiviner))); - } + 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))); + } - GameRegistry.addRecipe(new ShapelessOreRecipe(GuideAPI.getStackFromBook(GuideBloodMagic.guideBook), new ItemStack(Items.BOOK), Blocks.GLASS, Items.FEATHER)); + @Nullable + @Override + public IRecipe getRecipe(@Nonnull ItemStack bookStack) { + return new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "guide"), GuideAPI.getStackFromBook(GUIDE_BOOK), new ItemStack(Items.BOOK), "glass", "feather"); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index e6d0a5ce..39700f14 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.compat.guideapi.book; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; 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.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.RecipeHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.IPage; @@ -27,7 +27,7 @@ public class CategoryAlchemy public static Map buildCategory() { Map entries = new LinkedHashMap(); - String keyBase = "guide." + Constants.Mod.MODID + ".entry.alchemy."; + String keyBase = "guide." + BloodMagic.MODID + ".entry.alchemy."; List introPages = new ArrayList(); introPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "intro" + ".info"), 370)); @@ -35,7 +35,7 @@ public class CategoryAlchemy List ashPages = new ArrayList(); - TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModItems.ARCANE_ASHES)); + TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); if (ashRecipe != null) { ashPages.add(new PageTartaricForgeRecipe(ashRecipe)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index 8766ab28..620c5d4f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -6,10 +6,10 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; import WayofTime.bloodmagic.api.registry.OrbRegistry; @@ -19,8 +19,8 @@ import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; import WayofTime.bloodmagic.item.ItemComponent; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.RecipeHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.IPage; @@ -33,7 +33,7 @@ public class CategoryArchitect public static Map buildCategory() { Map entries = new LinkedHashMap(); - String keyBase = "guide." + Constants.Mod.MODID + ".entry.architect."; + String keyBase = "guide." + BloodMagic.MODID + ".entry.architect."; List introPages = new ArrayList(); introPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "intro" + ".info"), 370)); @@ -42,7 +42,7 @@ public class CategoryArchitect List altarPages = new ArrayList(); - IRecipe altarRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.ALTAR)); + IRecipe altarRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ALTAR)); if (altarRecipe != null) { altarPages.add(BookUtils.getPageForRecipe(altarRecipe)); @@ -50,7 +50,7 @@ public class CategoryArchitect altarPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bloodaltar" + ".info.1"), 370)); - IRecipe daggerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModItems.SACRIFICIAL_DAGGER)); + IRecipe daggerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SACRIFICIAL_DAGGER)); if (daggerRecipe != null) { altarPages.add(BookUtils.getPageForRecipe(daggerRecipe)); @@ -61,7 +61,7 @@ public class CategoryArchitect List ashPages = new ArrayList(); - TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModItems.ARCANE_ASHES)); + TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); if (ashRecipe != null) { ashPages.add(new PageTartaricForgeRecipe(ashRecipe)); @@ -71,7 +71,7 @@ public class CategoryArchitect List divinationPages = new ArrayList(); - PageAlchemyArray divinationRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_DIVINATION)); + PageAlchemyArray divinationRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION)); if (divinationRecipePage != null) { divinationPages.add(divinationRecipePage); @@ -88,7 +88,7 @@ public class CategoryArchitect List weakorbPages = new ArrayList(); weakorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakorb" + ".info.1"), 370)); - AltarRecipe weakorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(ModItems.ORB_WEAK)); + AltarRecipe weakorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_WEAK)); if (weakorbRecipe != null) { weakorbPages.add(new PageAltarRecipe(weakorbRecipe)); @@ -99,7 +99,7 @@ public class CategoryArchitect List incensePages = new ArrayList(); - IRecipe incenseRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.INCENSE_ALTAR)); + IRecipe incenseRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.INCENSE_ALTAR)); if (incenseRecipe != null) { incensePages.add(BookUtils.getPageForRecipe(incenseRecipe)); @@ -107,7 +107,7 @@ public class CategoryArchitect incensePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "incense" + ".info.1"), 370)); - IRecipe woodPathRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.PATH_BLOCK, 1, 0)); + IRecipe woodPathRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0)); if (woodPathRecipe != null) { incensePages.add(BookUtils.getPageForRecipe(woodPathRecipe)); @@ -118,7 +118,7 @@ public class CategoryArchitect List runePages = new ArrayList(); - IRecipe runeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 0)); + IRecipe runeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 0)); if (runeRecipe != null) { runePages.add(BookUtils.getPageForRecipe(runeRecipe)); @@ -129,7 +129,7 @@ public class CategoryArchitect List inspectPages = new ArrayList(); - AltarRecipe inspectRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(ModItems.SANGUINE_BOOK)); + AltarRecipe inspectRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK)); if (inspectRecipe != null) { inspectPages.add(new PageAltarRecipe(inspectRecipe)); @@ -140,7 +140,7 @@ public class CategoryArchitect List speedRunePages = new ArrayList(); - IRecipe speedRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 1)); + IRecipe speedRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1)); if (speedRecipe != null) { speedRunePages.add(BookUtils.getPageForRecipe(speedRecipe)); @@ -157,7 +157,7 @@ public class CategoryArchitect waterPages.add(new PageTartaricForgeRecipe(waterRecipe)); } - PageAlchemyArray waterRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_WATER)); + PageAlchemyArray waterRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER)); if (waterRecipePage != null) { waterPages.add(waterRecipePage); @@ -174,7 +174,7 @@ public class CategoryArchitect lavaPages.add(new PageTartaricForgeRecipe(lavaRecipe)); } - PageAlchemyArray lavaRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_LAVA)); + PageAlchemyArray lavaRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA)); if (lavaRecipePage != null) { lavaPages.add(lavaRecipePage); @@ -185,7 +185,7 @@ public class CategoryArchitect List lavaCrystalPages = new ArrayList(); - IRecipe lavaCrystalRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModItems.LAVA_CRYSTAL)); + IRecipe lavaCrystalRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL)); if (lavaCrystalRecipe != null) { lavaCrystalPages.add(BookUtils.getPageForRecipe(lavaCrystalRecipe)); @@ -196,7 +196,7 @@ public class CategoryArchitect List apprenticeorbPages = new ArrayList(); - AltarRecipe apprenticeorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(ModItems.ORB_APPRENTICE)); + AltarRecipe apprenticeorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_APPRENTICE)); if (apprenticeorbRecipe != null) { apprenticeorbPages.add(new PageAltarRecipe(apprenticeorbRecipe)); @@ -207,7 +207,7 @@ public class CategoryArchitect List daggerPages = new ArrayList(); - AltarRecipe daggerOfSacrificeRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(ModItems.DAGGER_OF_SACRIFICE)); + AltarRecipe daggerOfSacrificeRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE)); if (daggerOfSacrificeRecipe != null) { daggerPages.add(new PageAltarRecipe(daggerOfSacrificeRecipe)); @@ -218,7 +218,7 @@ public class CategoryArchitect List runeSacrificePages = new ArrayList(); - IRecipe runeSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 3)); + IRecipe runeSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3)); if (runeSacrificeRecipe != null) { runeSacrificePages.add(BookUtils.getPageForRecipe(runeSacrificeRecipe)); @@ -229,7 +229,7 @@ public class CategoryArchitect List runeSelfSacrificePages = new ArrayList(); - IRecipe runeSelfSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 4)); + IRecipe runeSelfSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); if (runeSelfSacrificeRecipe != null) { runeSelfSacrificePages.add(BookUtils.getPageForRecipe(runeSelfSacrificeRecipe)); @@ -246,7 +246,7 @@ public class CategoryArchitect holdingPages.add(new PageTartaricForgeRecipe(holdingRecipe)); } - PageAlchemyArray holdingRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_HOLDING)); + PageAlchemyArray holdingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING)); if (holdingRecipePage != null) { holdingPages.add(holdingRecipePage); @@ -263,7 +263,7 @@ public class CategoryArchitect airPages.add(new PageTartaricForgeRecipe(airRecipe)); } - PageAlchemyArray airRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_AIR)); + PageAlchemyArray airRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR)); if (airRecipePage != null) { airPages.add(airRecipePage); @@ -280,7 +280,7 @@ public class CategoryArchitect voidPages.add(new PageTartaricForgeRecipe(voidRecipe)); } - PageAlchemyArray voidRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_VOID)); + PageAlchemyArray voidRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID)); if (voidRecipePage != null) { voidPages.add(voidRecipePage); @@ -297,7 +297,7 @@ public class CategoryArchitect greenGrovePages.add(new PageTartaricForgeRecipe(greenGroveRecipe)); } - PageAlchemyArray greenGroveRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_GREEN_GROVE)); + PageAlchemyArray greenGroveRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE)); if (greenGroveRecipePage != null) { greenGrovePages.add(greenGroveRecipePage); @@ -314,7 +314,7 @@ public class CategoryArchitect fastMinerPages.add(new PageTartaricForgeRecipe(fastMinerRecipe)); } - PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_FAST_MINER)); + PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER)); if (fastMinerRecipePage != null) { fastMinerPages.add(fastMinerRecipePage); @@ -331,7 +331,7 @@ public class CategoryArchitect seerPages.add(new PageTartaricForgeRecipe(seerRecipe)); } - PageAlchemyArray seerRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_SEER)); + PageAlchemyArray seerRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER)); if (seerRecipePage != null) { seerPages.add(seerRecipePage); @@ -342,7 +342,7 @@ public class CategoryArchitect List magicianOrbPages = new ArrayList(); - AltarRecipe magicianOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN)); + AltarRecipe magicianOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN)); if (magicianOrbRecipe != null) { magicianOrbPages.add(new PageAltarRecipe(magicianOrbRecipe)); @@ -353,7 +353,7 @@ public class CategoryArchitect List capacityPages = new ArrayList(); - IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 4)); + IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); if (capacityRecipe != null) { capacityPages.add(BookUtils.getPageForRecipe(capacityRecipe)); @@ -364,7 +364,7 @@ public class CategoryArchitect List displacementPages = new ArrayList(); - IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 4)); + IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); if (displacementRecipe != null) { displacementPages.add(BookUtils.getPageForRecipe(displacementRecipe)); @@ -381,7 +381,7 @@ public class CategoryArchitect affinityPages.add(new PageTartaricForgeRecipe(affinityRecipe)); } - PageAlchemyArray affinityRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_ELEMENTAL_AFFINITY)); + PageAlchemyArray affinityRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY)); if (affinityRecipePage != null) { affinityPages.add(affinityRecipePage); @@ -398,7 +398,7 @@ public class CategoryArchitect lampPages.add(new PageTartaricForgeRecipe(lampRecipe)); } - PageAlchemyArray lampRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_BLOOD_LIGHT)); + PageAlchemyArray lampRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT)); if (lampRecipePage != null) { lampPages.add(lampRecipePage); @@ -415,7 +415,7 @@ public class CategoryArchitect magnetismPages.add(new PageTartaricForgeRecipe(magnetismRecipe)); } - PageAlchemyArray magnetismRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_MAGNETISM)); + PageAlchemyArray magnetismRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM)); if (magnetismRecipePage != null) { magnetismPages.add(magnetismRecipePage); @@ -426,7 +426,7 @@ public class CategoryArchitect List peritiaPages = new ArrayList(); - IRecipe peritiaRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModItems.EXPERIENCE_TOME)); + IRecipe peritiaRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.EXPERIENCE_TOME)); if (peritiaRecipe != null) { peritiaPages.add(BookUtils.getPageForRecipe(peritiaRecipe)); @@ -443,25 +443,25 @@ public class CategoryArchitect livingArmourPages.add(new PageTartaricForgeRecipe(bindingRecipe)); } - PageAlchemyArray bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.LIVING_ARMOUR_CHEST)); + PageAlchemyArray bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST)); if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); } - bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.LIVING_ARMOUR_HELMET)); + bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET)); if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); } - bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.LIVING_ARMOUR_LEGS)); + bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS)); if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); } - bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.LIVING_ARMOUR_BOOTS)); + bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS)); if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); @@ -482,13 +482,13 @@ public class CategoryArchitect List teleposerPages = new ArrayList(); - AltarRecipe teleposerFocusRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(ModItems.TELEPOSITION_FOCUS)); + AltarRecipe teleposerFocusRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)); if (teleposerFocusRecipe != null) { teleposerPages.add(new PageAltarRecipe(teleposerFocusRecipe)); } - IRecipe teleposerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.TELEPOSER)); + IRecipe teleposerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER)); if (teleposerRecipe != null) { teleposerPages.add(BookUtils.getPageForRecipe(teleposerRecipe)); @@ -499,7 +499,7 @@ public class CategoryArchitect List boundBladePages = new ArrayList(); - PageAlchemyArray boundBladePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.BOUND_SWORD)); + PageAlchemyArray boundBladePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD)); if (boundBladePage != null) { boundBladePages.add(boundBladePage); @@ -510,19 +510,19 @@ public class CategoryArchitect List boundToolPages = new ArrayList(); - PageAlchemyArray boundToolPage = BookUtils.getAlchemyPage(new ItemStack(ModItems.BOUND_PICKAXE)); + PageAlchemyArray boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)); if (boundToolPage != null) { boundToolPages.add(boundToolPage); } - boundToolPage = BookUtils.getAlchemyPage(new ItemStack(ModItems.BOUND_AXE)); + boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)); if (boundToolPage != null) { boundToolPages.add(boundToolPage); } - boundToolPage = BookUtils.getAlchemyPage(new ItemStack(ModItems.BOUND_SHOVEL)); + boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)); if (boundToolPage != null) { boundToolPages.add(boundToolPage); @@ -538,7 +538,7 @@ public class CategoryArchitect List masterOrbPages = new ArrayList(); - AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(ModItems.ORB_MASTER)); + AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER)); if (magicianOrbRecipe != null) { masterOrbPages.add(new PageAltarRecipe(masterOrbRecipe)); @@ -549,7 +549,7 @@ public class CategoryArchitect List orbRunePages = new ArrayList(); - IRecipe orbRuneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 8)); + IRecipe orbRuneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 8)); if (orbRuneRecipe != null) { orbRunePages.add(BookUtils.getPageForRecipe(orbRuneRecipe)); @@ -560,7 +560,7 @@ public class CategoryArchitect List augmentedCapacityPages = new ArrayList(); - IRecipe augmentedCapacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 7)); + IRecipe augmentedCapacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 7)); if (orbRuneRecipe != null) { augmentedCapacityPages.add(BookUtils.getPageForRecipe(augmentedCapacityRecipe)); @@ -571,7 +571,7 @@ public class CategoryArchitect List chargingPages = new ArrayList(); - IRecipe chargingRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 10)); + IRecipe chargingRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 10)); if (orbRuneRecipe != null) { chargingPages.add(BookUtils.getPageForRecipe(chargingRecipe)); @@ -582,7 +582,7 @@ public class CategoryArchitect List accelerationPages = new ArrayList(); - IRecipe accelerationRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 9)); + IRecipe accelerationRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 9)); if (orbRuneRecipe != null) { accelerationPages.add(BookUtils.getPageForRecipe(accelerationRecipe)); @@ -599,7 +599,7 @@ public class CategoryArchitect suppressionPages.add(new PageTartaricForgeRecipe(suppressionRecipe)); } - PageAlchemyArray suppressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_SUPPRESSION)); + PageAlchemyArray suppressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION)); if (suppressionRecipePage != null) { suppressionPages.add(suppressionRecipePage); @@ -616,7 +616,7 @@ public class CategoryArchitect hastePages.add(new PageTartaricForgeRecipe(hasteRecipe)); } - PageAlchemyArray hasteRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_HASTE)); + PageAlchemyArray hasteRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE)); if (hasteRecipePage != null) { hastePages.add(hasteRecipePage); @@ -633,7 +633,7 @@ public class CategoryArchitect severancePages.add(new PageTartaricForgeRecipe(severanceRecipe)); } - PageAlchemyArray severanceRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_ENDER_SEVERANCE)); + PageAlchemyArray severanceRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE)); if (severanceRecipePage != null) { severancePages.add(severanceRecipePage); @@ -650,7 +650,7 @@ public class CategoryArchitect telepositionPages.add(new PageTartaricForgeRecipe(telepositionRecipe)); } - PageAlchemyArray telepositionRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_TELEPOSITION)); + PageAlchemyArray telepositionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION)); if (telepositionRecipePage != null) { telepositionPages.add(telepositionRecipePage); @@ -667,7 +667,7 @@ public class CategoryArchitect compressionPages.add(new PageTartaricForgeRecipe(compressionRecipe)); } - PageAlchemyArray compressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_COMPRESSION)); + PageAlchemyArray compressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION)); if (compressionRecipePage != null) { compressionPages.add(compressionRecipePage); @@ -684,7 +684,7 @@ public class CategoryArchitect bridgePages.add(new PageTartaricForgeRecipe(bridgeRecipe)); } - PageAlchemyArray bridgeRecipePage = BookUtils.getAlchemyPage(new ItemStack(ModItems.SIGIL_PHANTOM_BRIDGE)); + PageAlchemyArray bridgeRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE)); if (bridgeRecipePage != null) { bridgePages.add(bridgeRecipePage); @@ -695,7 +695,7 @@ public class CategoryArchitect List mimicPages = new ArrayList(); - IRecipe mimicRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.MIMIC, 1, 1)); + IRecipe mimicRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 1, 1)); if (mimicRecipe != null) { mimicPages.add(BookUtils.getPageForRecipe(mimicRecipe)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java index 37d5f3d6..932a25ca 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java @@ -6,16 +6,16 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.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.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.RecipeHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.IPage; @@ -29,7 +29,7 @@ public class CategoryDemon public static Map buildCategory() { Map entries = new LinkedHashMap(); - String keyBase = "guide." + Constants.Mod.MODID + ".entry.demon."; + String keyBase = "guide." + BloodMagic.MODID + ".entry.demon."; List introPages = new ArrayList(); introPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "intro" + ".info"), 370)); @@ -39,7 +39,7 @@ public class CategoryDemon List snarePages = new ArrayList(); snarePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "snare" + ".info.1"), 370)); - IRecipe snareRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModItems.SOUL_SNARE)); + IRecipe snareRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE)); if (snareRecipe != null) { snarePages.add(BookUtils.getPageForRecipe(snareRecipe)); @@ -51,7 +51,7 @@ public class CategoryDemon List forgePages = new ArrayList(); forgePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "forge" + ".info.1"), 370)); - IRecipe forgeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.SOUL_FORGE)); + IRecipe forgeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE)); if (forgeRecipe != null) { forgePages.add(BookUtils.getPageForRecipe(forgeRecipe)); @@ -62,7 +62,7 @@ public class CategoryDemon List pettyPages = new ArrayList(); pettyPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "petty" + ".info.1"), 370)); - TartaricForgeRecipe pettyRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModItems.SOUL_GEM)); + TartaricForgeRecipe pettyRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM)); if (pettyRecipe != null) { pettyPages.add(new PageTartaricForgeRecipe(pettyRecipe)); @@ -72,7 +72,7 @@ public class CategoryDemon List swordPages = new ArrayList(); swordPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "sword" + ".info.1"), 370)); - TartaricForgeRecipe swordRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModItems.SENTIENT_SWORD)); + TartaricForgeRecipe swordRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SWORD)); if (swordRecipe != null) { swordPages.add(new PageTartaricForgeRecipe(swordRecipe)); @@ -82,7 +82,7 @@ public class CategoryDemon List lesserPages = new ArrayList(); lesserPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lesser" + ".info.1"), 370)); - TartaricForgeRecipe lesserRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModItems.SOUL_GEM, 1, 1)); + TartaricForgeRecipe lesserRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1)); if (lesserRecipe != null) { lesserPages.add(new PageTartaricForgeRecipe(lesserRecipe)); @@ -100,28 +100,28 @@ public class CategoryDemon entries.put(new ResourceLocation(keyBase + "sentientGem"), new EntryText(sentientGemPages, TextHelper.localize(keyBase + "sentientGem"), true)); List routingPages = new ArrayList(); - TartaricForgeRecipe nodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModBlocks.ITEM_ROUTING_NODE)); + TartaricForgeRecipe nodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); if (nodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(nodeRecipe)); } - TartaricForgeRecipe inputNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModBlocks.INPUT_ROUTING_NODE)); + TartaricForgeRecipe inputNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE)); if (inputNodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(inputNodeRecipe)); } - TartaricForgeRecipe outputNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModBlocks.OUTPUT_ROUTING_NODE)); + TartaricForgeRecipe outputNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE)); if (outputNodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(outputNodeRecipe)); } - TartaricForgeRecipe masterNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModBlocks.MASTER_ROUTING_NODE)); + TartaricForgeRecipe masterNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE)); if (masterNodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(masterNodeRecipe)); } - TartaricForgeRecipe nodeRouterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModItems.NODE_ROUTER)); + TartaricForgeRecipe nodeRouterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER)); if (nodeRouterRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(nodeRouterRecipe)); @@ -142,7 +142,7 @@ public class CategoryDemon List cruciblePages = new ArrayList(); - TartaricForgeRecipe crucibleRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModBlocks.DEMON_CRUCIBLE)); + TartaricForgeRecipe crucibleRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRUCIBLE)); if (crucibleRecipe != null) { cruciblePages.add(new PageTartaricForgeRecipe(crucibleRecipe)); @@ -153,7 +153,7 @@ public class CategoryDemon List crystallizerPages = new ArrayList(); - TartaricForgeRecipe crystallizerRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModBlocks.DEMON_CRYSTALLIZER)); + TartaricForgeRecipe crystallizerRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTALLIZER)); if (crystallizerRecipe != null) { crystallizerPages.add(new PageTartaricForgeRecipe(crystallizerRecipe)); @@ -164,7 +164,7 @@ public class CategoryDemon List clusterPages = new ArrayList(); - TartaricForgeRecipe clusterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModBlocks.DEMON_CRYSTAL)); + TartaricForgeRecipe clusterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL)); if (clusterRecipe != null) { clusterPages.add(new PageTartaricForgeRecipe(clusterRecipe)); @@ -175,7 +175,7 @@ public class CategoryDemon List pylonPages = new ArrayList(); - TartaricForgeRecipe pylonRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModBlocks.DEMON_PYLON)); + TartaricForgeRecipe pylonRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PYLON)); if (pylonRecipe != null) { pylonPages.add(new PageTartaricForgeRecipe(pylonRecipe)); @@ -186,7 +186,7 @@ public class CategoryDemon List gaugePages = new ArrayList(); - TartaricForgeRecipe gaugeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModItems.DEMON_WILL_GAUGE)); + TartaricForgeRecipe gaugeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE)); if (gaugeRecipe != null) { gaugePages.add(new PageTartaricForgeRecipe(gaugeRecipe)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index 344069b3..b80a4530 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -6,17 +6,17 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.RecipeHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.IPage; @@ -26,7 +26,7 @@ import amerifrance.guideapi.page.PageText; public class CategoryRitual { - static String keyBase = "guide." + Constants.Mod.MODID + ".entry.ritual."; + static String keyBase = "guide." + BloodMagic.MODID + ".entry.ritual."; public static Map buildCategory() { @@ -37,7 +37,7 @@ public class CategoryRitual List ritualStonePages = new ArrayList(); - IRecipe ritualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.RITUAL_STONE)); + IRecipe ritualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE)); if (ritualStoneRecipe != null) { ritualStonePages.add(BookUtils.getPageForRecipe(ritualStoneRecipe)); @@ -60,7 +60,7 @@ public class CategoryRitual List masterRitualStonePages = new ArrayList(); - IRecipe masterRitualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModBlocks.RITUAL_CONTROLLER, 1, 0)); + IRecipe masterRitualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 0)); if (masterRitualStoneRecipe != null) { masterRitualStonePages.add(BookUtils.getPageForRecipe(masterRitualStoneRecipe)); @@ -73,7 +73,7 @@ public class CategoryRitual activationCrystalPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "activationCrystal" + ".info.1"), 370)); - AltarRecipe crystalRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(ModItems.ACTIVATION_CRYSTAL)); + AltarRecipe crystalRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL)); if (crystalRecipe != null) { activationCrystalPages.add(new PageAltarRecipe(crystalRecipe)); @@ -86,7 +86,7 @@ public class CategoryRitual divinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "diviner" + ".info.1"), 370)); - IRecipe divinerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(ModItems.RITUAL_DIVINER)); + IRecipe divinerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER)); if (divinerRecipe != null) { divinerPages.add(BookUtils.getPageForRecipe(divinerRecipe)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java index 5c8065b6..3c5479de 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java @@ -5,7 +5,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import lombok.AllArgsConstructor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.GlStateManager; @@ -21,7 +20,6 @@ import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; import amerifrance.guideapi.gui.GuiBase; -@AllArgsConstructor public class PageAlchemyArray extends Page { public static final double scale = 58d / 256d; @@ -31,6 +29,13 @@ public class PageAlchemyArray extends Page public final ItemStack outputStack; + 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); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index 247c91d3..36488e9f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -31,8 +31,8 @@ import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeHandler; import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeMaker; import WayofTime.bloodmagic.compat.jei.orb.ShapedOrbRecipeHandler; import WayofTime.bloodmagic.compat.jei.orb.ShapelessOrbRecipeHandler; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; @JEIPlugin public class BloodMagicPlugin extends BlankModPlugin @@ -55,14 +55,14 @@ public class BloodMagicPlugin extends BlankModPlugin registry.addRecipes(AlchemyTableRecipeMaker.getRecipes()); registry.addRecipes(ArmourDowngradeRecipeMaker.getRecipes()); - registry.addDescription(new ItemStack(ModItems.ALTAR_MAKER), "jei.bloodmagic.desc.altarBuilder"); - registry.addDescription(new ItemStack(ModItems.MONSTER_SOUL), "jei.bloodmagic.desc.demonicWill"); + registry.addDescription(new ItemStack(RegistrarBloodMagicItems.ALTAR_MAKER), "jei.bloodmagic.desc.altarBuilder"); + registry.addDescription(new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL), "jei.bloodmagic.desc.demonicWill"); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.BLOOD_LIGHT)); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.SPECTRAL_BLOCK)); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.PHANTOM_BLOCK)); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.ALCHEMY_ARRAY)); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.DIMENSIONAL_PORTAL, 1, OreDictionary.WILDCARD_VALUE)); + jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_LIGHT)); + jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.SPECTRAL)); + jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.PHANTOM)); + jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.ALCHEMY_ARRAY)); + jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL, 1, OreDictionary.WILDCARD_VALUE)); for (Map.Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { @@ -70,7 +70,7 @@ public class BloodMagicPlugin extends BlankModPlugin int maxLevel = entry.getValue(); for (int i = 0; i < maxLevel - 1; i++) { - ItemStack stack = new ItemStack(ModItems.UPGRADE_TOME); + ItemStack stack = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); LivingUpgrades.setKey(stack, key); LivingUpgrades.setLevel(stack, i); jeiHelper.getItemBlacklist().addItemToBlacklist(stack); @@ -79,16 +79,16 @@ public class BloodMagicPlugin extends BlankModPlugin registry.addRecipeClickArea(GuiSoulForge.class, 115, 15, 16, 88, Constants.Compat.JEI_CATEGORY_SOULFORGE); - registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.ALTAR), Constants.Compat.JEI_CATEGORY_ALTAR); - registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.SOUL_FORGE), Constants.Compat.JEI_CATEGORY_SOULFORGE); - registry.addRecipeCategoryCraftingItem(new ItemStack(ModItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY); - registry.addRecipeCategoryCraftingItem(new ItemStack(ModItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_BINDING); - registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.ALCHEMY_TABLE), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); - registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.RITUAL_CONTROLLER), Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE); + registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicBlocks.ALTAR), Constants.Compat.JEI_CATEGORY_ALTAR); + registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE), Constants.Compat.JEI_CATEGORY_SOULFORGE); + registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY); + registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_BINDING); + registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicBlocks.ALCHEMY_TABLE), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); + registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE); } @Override public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { - subtypeRegistry.useNbtForSubtypes(ModItems.UPGRADE_TOME); + subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.UPGRADE_TOME); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java index e412380a..dc52ada3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java @@ -8,7 +8,7 @@ import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import java.util.List; @@ -27,7 +27,7 @@ public class ArmourDowngradeRecipeJEI extends BlankRecipeWrapper List> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); expanded.add(Lists.newArrayList(recipe.getKey())); ingredients.setInputLists(ItemStack.class, expanded); - ItemStack upgradeStack = new ItemStack(ModItems.UPGRADE_TOME); + ItemStack upgradeStack = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); LivingUpgrades.setUpgrade(upgradeStack, recipe.getRecipeOutput()); ingredients.setOutput(ItemStack.class, upgradeStack); } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java index 82133b75..054bf9ab 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java @@ -1,21 +1,17 @@ package WayofTime.bloodmagic.compat.jei.forge; import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.List; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import com.google.common.collect.Lists; import lombok.Getter; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; public class TartaricForgeRecipeJEI extends BlankRecipeWrapper @@ -58,12 +54,12 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper public enum DefaultWill { - SOUL(new ItemStack(ModItems.MONSTER_SOUL, 1, 0), 64), - PETTY(new ItemStack(ModItems.SOUL_GEM, 1, 0), 64), - LESSER(new ItemStack(ModItems.SOUL_GEM, 1, 1), 256), - COMMON(new ItemStack(ModItems.SOUL_GEM, 1, 2), 1024), - GREATER(new ItemStack(ModItems.SOUL_GEM, 1, 3), 4096), - GRAND(new ItemStack(ModItems.SOUL_GEM, 1, 4), 16384); + 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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/CompatibilityWaila.java b/src/main/java/WayofTime/bloodmagic/compat/waila/CompatibilityWaila.java deleted file mode 100644 index 8ef1264e..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/CompatibilityWaila.java +++ /dev/null @@ -1,26 +0,0 @@ -package WayofTime.bloodmagic.compat.waila; - -import net.minecraftforge.fml.common.event.FMLInterModComms; -import WayofTime.bloodmagic.compat.ICompatibility; - -public class CompatibilityWaila implements ICompatibility -{ - @Override - public void loadCompatibility(InitializationPhase phase) - { - if (phase == InitializationPhase.INIT) - FMLInterModComms.sendMessage(getModId(), "register", "WayofTime.bloodmagic.compat.waila.WailaCallbackHandler.callbackRegister"); - } - - @Override - public String getModId() - { - return "waila"; - } - - @Override - public boolean enableCompat() - { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaCallbackHandler.java b/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java similarity index 58% rename from src/main/java/WayofTime/bloodmagic/compat/waila/WailaCallbackHandler.java rename to src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java index dd76cf93..07b7226a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaCallbackHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java @@ -1,14 +1,17 @@ package WayofTime.bloodmagic.compat.waila; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.*; import WayofTime.bloodmagic.compat.waila.provider.*; +import mcp.mobius.waila.api.IWailaPlugin; import mcp.mobius.waila.api.IWailaRegistrar; import WayofTime.bloodmagic.api.Constants; +import mcp.mobius.waila.api.WailaPlugin; -public class WailaCallbackHandler -{ - public static void callbackRegister(IWailaRegistrar registrar) - { +@WailaPlugin +public class WailaPluginBloodMagic implements IWailaPlugin { + @Override + public void register(IWailaRegistrar registrar) { registrar.registerBodyProvider(new DataProviderBloodAltar(), BlockAltar.class); registrar.registerNBTProvider(new DataProviderBloodAltar(), BlockAltar.class); registrar.registerBodyProvider(new DataProviderTeleposer(), BlockTeleposer.class); @@ -20,11 +23,11 @@ public class WailaCallbackHandler registrar.registerStackProvider(new DataProviderMimic(), BlockMimic.class); registrar.registerNBTProvider(new DataProviderMimic(), BlockMimic.class); - registrar.addConfig(Constants.Mod.MODID, Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK, false); - registrar.addConfig(Constants.Mod.MODID, Constants.Compat.WAILA_CONFIG_ALTAR, true); - registrar.addConfig(Constants.Mod.MODID, Constants.Compat.WAILA_CONFIG_TELEPOSER, true); - registrar.addConfig(Constants.Mod.MODID, Constants.Compat.WAILA_CONFIG_RITUAL, true); - registrar.addConfig(Constants.Mod.MODID, Constants.Compat.WAILA_CONFIG_ARRAY, true); - registrar.addConfig(Constants.Mod.MODID, Constants.Compat.WAILA_CONFIG_BLOOD_TANK, true); + registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK, false); + registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_ALTAR, true); + registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_TELEPOSER, true); + registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_RITUAL, true); + registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_ARRAY, true); + registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_BLOOD_TANK, true); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index 2e81535f..0e42a93e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -12,8 +12,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -22,7 +22,7 @@ public class DataProviderAlchemyArray implements IWailaDataProvider @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return new ItemStack(ModItems.ARCANE_ASHES).setStackDisplayName(TextHelper.getFormattedText(ModBlocks.ALCHEMY_ARRAY.getLocalizedName())); + return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES).setStackDisplayName(TextHelper.getFormattedText(RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getLocalizedName())); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index b6011653..dfc428ec 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -17,7 +17,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -64,8 +64,8 @@ public class DataProviderBloodAltar implements IWailaDataProvider } case 2: { - hasSeer = hasStack(new ItemStack(ModItems.SIGIL_SEER), accessor.getPlayer()); - hasSigil = hasSeer || hasStack(new ItemStack(ModItems.SIGIL_DIVINATION), accessor.getPlayer()); + hasSeer = hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), accessor.getPlayer()); + hasSigil = hasSeer || hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), accessor.getPlayer()); break; } default: diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 7a2844a2..61561423 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -27,7 +27,7 @@ public class StorageBlockCraftingManager { this.recipes = new StorageBlockCraftingRecipeAssimilator().getPackingRecipes(); - BloodMagic.instance.getLogger().info("Total number of compression recipes: " + this.recipes.size()); + BloodMagic.instance.logger.info("Total number of compression recipes: " + this.recipes.size()); } private static boolean isResultStackReversible(ItemStack stack, int gridSize, World world, List list) diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java index 20316b3d..7841cab2 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java @@ -5,11 +5,9 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.item.crafting.*; import net.minecraft.world.World; +import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; @@ -44,7 +42,7 @@ public class StorageBlockCraftingRecipeAssimilator { packingRecipes.add(packingRecipe); } - } else if ((output.getCount() == 4 || output.getCount() == 9) && recipe.getRecipeSize() == 1) + } else if ((output.getCount() == 4 || output.getCount() == 9) && recipe.canFit(1, 1)) { unpackingRecipes.add(recipe); } @@ -99,7 +97,7 @@ public class StorageBlockCraftingRecipeAssimilator { // unknown IRecipe, check through the recipe conventionally verify recipe size for 3x3 to skip anything smaller quickly - if (unpacked.getCount() == 9 && recipePack.recipe.getRecipeSize() < 9) + if (unpacked.getCount() == 9 && recipePack.recipe.getIngredients().size() < 9) continue; // initialize inventory late, but only once per unpack recipe @@ -149,7 +147,7 @@ public class StorageBlockCraftingRecipeAssimilator @SuppressWarnings("unchecked") private List getCraftingRecipes() { - return CraftingManager.getInstance().getRecipeList(); + return ForgeRegistries.RECIPES.getValues(); } private Container makeDummyContainer() @@ -166,27 +164,10 @@ public class StorageBlockCraftingRecipeAssimilator private PackingRecipe getPackingRecipe(IRecipe recipe) { - if (recipe.getRecipeSize() < 4) + if (recipe.getIngredients().size() < 4) return null; - List inputs; - - if (recipe instanceof ShapedRecipes) - { - inputs = Arrays.asList(((ShapedRecipes) recipe).recipeItems); - } else if (recipe instanceof ShapelessRecipes) - { - inputs = ((ShapelessRecipes) recipe).recipeItems; - } else if (recipe instanceof ShapedOreRecipe) - { - inputs = Arrays.asList(((ShapedOreRecipe) recipe).getInput()); - } else if (recipe instanceof ShapelessOreRecipe) - { - inputs = ((ShapelessOreRecipe) recipe).getInput(); - } else - { - return new PackingRecipe(recipe, null, -1); - } + List inputs = recipe.getIngredients(); // check if the recipe inputs are size 4 or 9 @@ -203,7 +184,7 @@ public class StorageBlockCraftingRecipeAssimilator // grab identical inputs - List identicalInputs = getIdenticalInputs(inputs); + List identicalInputs = getIdenticalInputs(inputs); if (identicalInputs == null) return null; @@ -219,18 +200,18 @@ public class StorageBlockCraftingRecipeAssimilator * @return List List of all options. */ @SuppressWarnings("unchecked") - private List getIdenticalInputs(List inputs) + private List getIdenticalInputs(List inputs) { - List options = null; + List options = null; - for (Object input : inputs) + for (Ingredient input : inputs) { if (input == null) continue; List offers; - if (input instanceof ItemStack) + if (input. instanceof ItemStack) { offers = Collections.singletonList((ItemStack) input); } else if (input instanceof List) diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java b/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java index 309090b8..8a478e7d 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java @@ -1,17 +1,20 @@ package WayofTime.bloodmagic.demonAura; -import lombok.*; +import org.apache.commons.lang3.builder.ToStringBuilder; -@EqualsAndHashCode -@ToString -@NoArgsConstructor -@AllArgsConstructor -@Setter 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) { @@ -29,4 +32,38 @@ public class PosXY implements Comparable { 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 index 15db5c60..bf0c4f6e 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java @@ -1,14 +1,10 @@ package WayofTime.bloodmagic.demonAura; import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import lombok.Getter; -import lombok.Setter; import net.minecraft.world.chunk.Chunk; import java.lang.ref.WeakReference; -@Getter -@Setter public class WillChunk { PosXY loc; @@ -23,7 +19,7 @@ public class WillChunk public WillChunk(Chunk chunk, short base, DemonWillHolder currentWill) { - this.loc = new PosXY(chunk.xPosition, chunk.zPosition); + this.loc = new PosXY(chunk.x, chunk.z); this.chunkRef = new WeakReference(chunk); this.base = base; this.currentWill = currentWill; @@ -32,4 +28,36 @@ public class WillChunk 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 index e66411a8..3d3f0164 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java @@ -1,15 +1,10 @@ package WayofTime.bloodmagic.demonAura; -import lombok.Getter; -import lombok.Setter; - import java.util.concurrent.ConcurrentHashMap; public class WillWorld { int dim; - @Getter - @Setter ConcurrentHashMap willChunks = new ConcurrentHashMap(); // private static ConcurrentHashMap nodeTickets = new ConcurrentHashMap(); @@ -29,6 +24,14 @@ public class WillWorld return this.willChunks.get(loc); } + public ConcurrentHashMap getWillChunks() { + return willChunks; + } + + public void setWillChunks(ConcurrentHashMap willChunks) { + this.willChunks = willChunks; + } + // public static ConcurrentHashMap getNodeTickets() // { // return nodeTickets; diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index 89762e2e..65f783ab 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -54,14 +54,14 @@ public class WorldDemonWillHandler if (!containedWills.containsKey(dim)) { containedWills.put(dim, new WillWorld(dim)); - BloodMagicAPI.getLogger().info("Creating demon will cache for world " + dim); + BloodMagicAPI.logger.info("Creating demon will cache for world " + dim); } } public static void removeWillWorld(int dim) { containedWills.remove(dim); - BloodMagicAPI.getLogger().info("Removing demon will cache for world " + dim); + BloodMagicAPI.logger.info("Removing demon will cache for world " + dim); } public static void addWillChunk(int dim, Chunk chunk, short base, DemonWillHolder currentWill) @@ -71,7 +71,7 @@ public class WorldDemonWillHandler { aw = new WillWorld(dim); } - aw.getWillChunks().put(new PosXY(chunk.xPosition, chunk.zPosition), new WillChunk(chunk, base, currentWill)); + aw.getWillChunks().put(new PosXY(chunk.x, chunk.z), new WillChunk(chunk, base, currentWill)); containedWills.put(dim, aw); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java index 6a5ca700..066033ac 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java @@ -79,9 +79,9 @@ public class EntityAIAttackStealthMelee extends EntityAIBase } @Override - public boolean continueExecuting() + public boolean shouldContinueExecuting() { - return chicken.attackStateMachine == 1 && super.continueExecuting(); + return chicken.attackStateMachine == 1 && super.shouldContinueExecuting(); } @Override @@ -114,7 +114,7 @@ public class EntityAIAttackStealthMelee extends EntityAIBase if (this.chicken.getNavigator().getPath() != null) { net.minecraft.pathfinding.PathPoint finalPathPoint = this.chicken.getNavigator().getPath().getFinalPathPoint(); - if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.xCoord, finalPathPoint.yCoord, finalPathPoint.zCoord) < 1) + if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.x, finalPathPoint.y, finalPathPoint.z) < 1) failedPathFindingPenalty = 0; else failedPathFindingPenalty += 10; diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java index cac00901..92e7bebb 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java @@ -130,7 +130,7 @@ public class EntityAIFollowOwner extends EntityAIBase { 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)).isFullyOpaque() && this.isEmptyBlock(new BlockPos(i + l, k, j + i1)) && this.isEmptyBlock(new BlockPos(i + l, k + 1, j + 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.clearPathEntity(); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java index 1559d2b2..364506fc 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java @@ -143,7 +143,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { 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)).isFullyOpaque() && this.isEmptyBlock(new BlockPos(i + l, k, j + i1)) && this.isEmptyBlock(new BlockPos(i + l, k + 1, j + 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.clearPathEntity(); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java index ef8ca421..37213741 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java @@ -34,7 +34,7 @@ public class EntityAIOwnerHurtByTarget extends EntityAITarget return false; } else { - this.theOwnerAttacker = owner.getAITarget(); + this.theOwnerAttacker = owner.getRevengeTarget(); int i = owner.getRevengeTimer(); return i != this.timestamp && this.isSuitableTarget(this.theOwnerAttacker, false) && this.theDefendingTameable.shouldAttackEntity(this.theOwnerAttacker, owner); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java index 5c7ee8f2..70980372 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java @@ -34,8 +34,8 @@ public class EntityAIOwnerHurtTarget extends EntityAITarget return false; } else { - this.theTarget = entitylivingbase.getLastAttacker(); - int i = entitylivingbase.getLastAttackerTime(); + this.theTarget = entitylivingbase.getLastAttackedEntity(); + int i = entitylivingbase.getLastAttackedEntityTime(); return i != this.timestamp && this.isSuitableTarget(this.theTarget, false) && this.theEntityDemonBase.shouldAttackEntity(this.theTarget, entitylivingbase); } } @@ -51,7 +51,7 @@ public class EntityAIOwnerHurtTarget extends EntityAITarget if (entitylivingbase != null) { - this.timestamp = entitylivingbase.getLastAttackerTime(); + this.timestamp = entitylivingbase.getLastAttackedEntityTime(); } super.startExecuting(); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java index 62477326..427f4ae3 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java @@ -56,7 +56,7 @@ public class EntityAIPickUpAlly extends EntityAIBase 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).expandXyz(5); + 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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); for (EntityLivingBase testEntity : list) { @@ -124,7 +124,7 @@ public class EntityAIPickUpAlly extends EntityAIBase if (this.entity.getNavigator().getPath() != null) { net.minecraft.pathfinding.PathPoint finalPathPoint = this.entity.getNavigator().getPath().getFinalPathPoint(); - if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.xCoord, finalPathPoint.yCoord, finalPathPoint.zCoord) < 1) + if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.x, finalPathPoint.y, finalPathPoint.z) < 1) failedPathFindingPenalty = 0; else failedPathFindingPenalty += 10; diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java index 23b345ca..93e64955 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java @@ -36,7 +36,7 @@ public class EntityAIProtectAlly extends EntityAIBase @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).expandXyz(5); + 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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); for (EntityLivingBase testEntity : list) { @@ -76,7 +76,7 @@ public class EntityAIProtectAlly extends EntityAIBase * Returns whether an in-progress EntityAIBase should continue executing */ @Override - public boolean continueExecuting() + public boolean shouldContinueExecuting() { return castTimer > 0; } @@ -90,7 +90,7 @@ public class EntityAIProtectAlly extends EntityAIBase 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).expandXyz(5); + 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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); for (EntityLivingBase testEntity : list) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java index 57561229..69b30960 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java @@ -40,13 +40,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase public EntityAIRetreatToHeal(EntityDemonBase theEntityIn, Class classToAvoidIn, Predicate avoidTargetSelectorIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) { - this.canBeSeenSelector = new Predicate() - { - public boolean apply(@Nullable Entity p_apply_1_) - { - return p_apply_1_.isEntityAlive() && EntityAIRetreatToHeal.this.theEntity.getEntitySenses().canSee(p_apply_1_); - } - }; + 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; @@ -69,7 +63,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase } //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(new Predicate[] { EntitySelectors.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector })); + List list = this.theEntity.getEntityWorld().getEntitiesWithinAABB(this.classToAvoid, this.theEntity.getEntityBoundingBox().expand((double) this.avoidDistance, 3.0D, (double) this.avoidDistance), Predicates.and(EntitySelectors.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector)); if (list.isEmpty()) { @@ -82,12 +76,12 @@ public class EntityAIRetreatToHeal extends EntityAIBase if (vec3d == null) { return false; //Nowhere to run, gotta fight! - } else if (this.closestLivingEntity.getDistanceSq(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord) < this.closestLivingEntity.getDistanceSqToEntity(this.theEntity)) + } else if (this.closestLivingEntity.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < this.closestLivingEntity.getDistanceSqToEntity(this.theEntity)) { return false; //I'll be headed off if I choose this direction. } else { - this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord); + this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.x, vec3d.y, vec3d.z); return this.entityPathEntity != null; } } @@ -97,7 +91,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase * Returns whether an in-progress EntityAIBase should continue executing */ @Override - public boolean continueExecuting() + public boolean shouldContinueExecuting() { return this.theEntity.shouldEmergencyHeal();//!this.entityPathNavigate.noPath(); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java index 533af52b..5f8b5e33 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java @@ -48,12 +48,12 @@ public class EntityAIStealthRetreat extends EntityAIBase if (vec3d == null) { return false; - } else if (attacked.getDistanceSq(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord) < attacked.getDistanceSqToEntity(this.entity)) + } else if (attacked.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < attacked.getDistanceSqToEntity(this.entity)) { return false; } else { - this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord); + this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.x, vec3d.y, vec3d.z); return this.entityPathEntity != null; } } @@ -62,7 +62,7 @@ public class EntityAIStealthRetreat extends EntityAIBase } @Override - public boolean continueExecuting() + public boolean shouldContinueExecuting() { if (this.entityPathNavigate.noPath()) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java index cba52335..11ac1534 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java @@ -48,9 +48,9 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase } else { ticksLeft = this.entity.getEntityWorld().rand.nextInt(200) + 100; - this.xPosition = vec3d.xCoord; - this.yPosition = vec3d.yCoord; - this.zPosition = vec3d.zCoord; + this.xPosition = vec3d.x; + this.yPosition = vec3d.y; + this.zPosition = vec3d.z; return true; } } @@ -62,7 +62,7 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase } @Override - public boolean continueExecuting() + public boolean shouldContinueExecuting() { ticksLeft--; if (ticksLeft <= 0) @@ -86,9 +86,9 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase if (vec3d != null) { - this.xPosition = vec3d.xCoord; - this.yPosition = vec3d.yCoord; - this.zPosition = vec3d.zCoord; + this.xPosition = vec3d.x; + this.yPosition = vec3d.y; + this.zPosition = vec3d.z; this.entity.getNavigator().tryMoveToXYZ(this.xPosition, this.yPosition, this.zPosition, this.speed); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java index b6ceb3c6..b9e3e3c0 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java @@ -6,7 +6,6 @@ import java.util.Random; import javax.annotation.Nullable; -import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IEntityLivingData; @@ -53,7 +52,6 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh */ private int sheepTimer; - @Getter private int castTimer = 0; private EntityAIEatAndCorruptBlock entityAIEatGrass; private EntityAIProtectAlly entityAIProtectAlly; @@ -66,7 +64,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh public static float[] getDyeRgb(EnumDyeColor dyeColor) { - return (float[]) DYE_TO_RGB.get(dyeColor); + return DYE_TO_RGB.get(dyeColor); } public EntityCorruptedSheep(World world) @@ -289,7 +287,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh */ public EnumDyeColor getFleeceColor() { - return EnumDyeColor.byMetadata(((Byte) this.dataManager.get(DYE_COLOR)).byteValue() & 15); + return EnumDyeColor.byMetadata(this.dataManager.get(DYE_COLOR).byteValue() & 15); } /** @@ -297,7 +295,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh */ public void setFleeceColor(EnumDyeColor color) { - byte b0 = ((Byte) this.dataManager.get(DYE_COLOR)).byteValue(); + byte b0 = this.dataManager.get(DYE_COLOR).byteValue(); this.dataManager.set(DYE_COLOR, Byte.valueOf((byte) (b0 & 240 | color.getMetadata() & 15))); } @@ -306,7 +304,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh */ public boolean getSheared() { - return (((Byte) this.dataManager.get(DYE_COLOR)).byteValue() & 16) != 0; + return (this.dataManager.get(DYE_COLOR).byteValue() & 16) != 0; } /** @@ -314,7 +312,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh */ public void setSheared(boolean sheared) { - byte b0 = ((Byte) this.dataManager.get(DYE_COLOR)).byteValue(); + byte b0 = this.dataManager.get(DYE_COLOR).byteValue(); if (sheared) { @@ -408,4 +406,8 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh this.playSound(SoundEvents.ENTITY_SHEEP_SHEAR, 1.0F, 1.0F); return ret; } + + public int getCastTimer() { + return castTimer; + } } \ 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 index 1b6ec0cc..05957123 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java @@ -207,9 +207,9 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase /** * Returns whether an in-progress EntityAIBase should continue executing */ - public boolean continueExecuting() + public boolean shouldContinueExecuting() { - float f = this.attacker.getBrightness(1.0F); + float f = this.attacker.getBrightness(); if (f >= 0.5F && this.attacker.getRNG().nextInt(100) == 0) { @@ -217,7 +217,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase return false; } else { - return super.continueExecuting(); + return super.shouldContinueExecuting(); } } @@ -239,7 +239,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase */ public boolean shouldExecute() { - float f = this.taskOwner.getBrightness(1.0F); + float f = this.taskOwner.getBrightness(); return !(f >= 0.5F) && super.shouldExecute(); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java index 719b98de..3e96d17b 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java @@ -50,10 +50,10 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase this.tasks.addTask(8, new EntityAILookIdle(this)); this.tasks.addTask(6, new EntityAIMoveThroughVillage(this, 1.0D, false)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true, new Class[] { EntityPigZombie.class })); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); - this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityVillager.class, false)); - this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityIronGolem.class, true)); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true, EntityPigZombie.class)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); + this.targetTasks.addTask(3, new EntityAINearestAttackableTarget<>(this, EntityVillager.class, false)); + this.targetTasks.addTask(3, new EntityAINearestAttackableTarget<>(this, EntityIronGolem.class, true)); this.setCombatTask(); // this.targetTasks.addTask(8, new EntityAINearestAttackableTarget(this, EntityMob.class, 10, true, false, new TargetPredicate(this))); diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java index 7373eea7..0aad0e12 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java @@ -37,6 +37,8 @@ import net.minecraft.world.WorldServer; import com.google.common.base.Optional; import com.google.common.base.Predicate; +import javax.annotation.Nullable; + public class EntityDemonBase extends EntityCreature implements IEntityOwnable { protected static final DataParameter TAMED = EntityDataManager.createKey(EntityDemonBase.class, DataSerializers.BYTE); @@ -286,7 +288,12 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable return SoundEvents.ENTITY_COW_AMBIENT; } + @Nullable @Override + protected SoundEvent getHurtSound(DamageSource damageSourceIn) { + return getHurtSound(); + } + protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_COW_HURT; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index cfe63b1a..ee5dbb28 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -35,7 +35,7 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import WayofTime.bloodmagic.block.BlockMimic; import WayofTime.bloodmagic.entity.ai.EntityAIMimicReform; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMimic; public class EntityMimic extends EntityDemonBase @@ -110,7 +110,7 @@ public class EntityMimic extends EntityDemonBase { if (world.isAirBlock(pos)) { - IBlockState mimicState = ModBlocks.MIMIC.getStateFromMeta(BlockMimic.sentientMimicMeta); + IBlockState mimicState = RegistrarBloodMagicBlocks.MIMIC.getStateFromMeta(BlockMimic.sentientMimicMeta); world.setBlockState(pos, mimicState, 3); TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileMimic) @@ -367,15 +367,6 @@ public class EntityMimic extends EntityDemonBase super(spider, 1.0D, true); } - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return super.continueExecuting(); - } - @Override protected double getAttackReachSqr(EntityLivingBase attackTarget) { @@ -389,13 +380,5 @@ public class EntityMimic extends EntityDemonBase { super(spider, classTarget, true); } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() - { - return super.shouldExecute(); - } } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 655e2371..28870cf9 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -4,10 +4,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; -import javax.annotation.Nullable; - -import lombok.Getter; -import lombok.Setter; import net.minecraft.block.Block; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; @@ -54,16 +50,11 @@ import WayofTime.bloodmagic.entity.ai.EntityAIOwnerHurtByTarget; import WayofTime.bloodmagic.entity.ai.EntityAIOwnerHurtTarget; import WayofTime.bloodmagic.entity.ai.EntityAIRetreatToHeal; import WayofTime.bloodmagic.item.soul.ItemSentientBow; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; public class EntitySentientSpecter extends EntityDemonBase { - @Getter - @Setter protected EnumDemonWillType type = EnumDemonWillType.DESTRUCTIVE; - - @Getter - @Setter protected boolean wasGivenSentientArmour = false; private final EntityAIAttackRangedBow aiArrowAttack = new EntityAIAttackRangedBow(this, 1.0D, 20, 15.0F); @@ -355,7 +346,7 @@ public class EntitySentientSpecter extends EntityDemonBase if (wasGivenSentientArmour) { - this.entityDropItem(new ItemStack(ModItems.SENTIENT_ARMOUR_GEM), 0); + this.entityDropItem(new ItemStack(RegistrarBloodMagicItems.SENTIENT_ARMOUR_GEM), 0); } this.setDead(); @@ -479,7 +470,7 @@ public class EntitySentientSpecter extends EntityDemonBase public void attackEntityWithRangedAttack(EntityLivingBase target, float velocity) { ItemStack heldStack = this.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); - if (!heldStack.isEmpty() && heldStack.getItem() == ModItems.SENTIENT_BOW) + if (!heldStack.isEmpty() && heldStack.getItem() == RegistrarBloodMagicItems.SENTIENT_BOW) { EntityTippedArrow arrowEntity = ((ItemSentientBow) heldStack.getItem()).getArrowEntity(getEntityWorld(), heldStack, target, this, velocity); if (arrowEntity != null) @@ -565,4 +556,20 @@ public class EntitySentientSpecter extends EntityDemonBase { 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 6d8f86ef..3f9c0c9d 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.entity.projectile; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -107,7 +107,7 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit if (getEntityWorld().isAirBlock(blockPos)) { - getEntityWorld().setBlockState(blockPos, ModBlocks.BLOOD_LIGHT.getDefaultState()); + getEntityWorld().setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index d9c0096a..51e4aee6 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.entity.projectile; -import lombok.Setter; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityThrowable; @@ -24,7 +23,6 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity protected double explosionModifier = 1; protected double fillerChance = 0; - @Setter public ItemStack meteorStack = ItemStack.EMPTY; public EntityMeteor(World world) @@ -150,4 +148,8 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity { } + + public void setMeteorStack(ItemStack meteorStack) { + this.meteorStack = meteorStack; + } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java index b807b886..7fba5008 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java @@ -34,7 +34,7 @@ public class FakeNetHandlerPlayServer extends NetHandlerPlayServer } @Override - public void disconnect(String reason) + public void disconnect(final ITextComponent textComponent) { } diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java index 1de85e6b..cd1b41b8 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java @@ -6,6 +6,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -14,11 +15,16 @@ import com.mojang.authlib.GameProfile; /** * All credits for this go to CrazyPants, from EIO */ +@SuppressWarnings("EntityConstructor") public class FakePlayerBM extends FakePlayer { + public FakePlayerBM(WorldServer world, GameProfile name) { + super(world, name); + } + public FakePlayerBM(World world, BlockPos pos, GameProfile profile) { - super(FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(world.provider.getDimension()), 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; diff --git a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java index d1ad5777..5aeac49d 100644 --- a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java +++ b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.fuel; import WayofTime.bloodmagic.item.ItemComponent; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.IFuelHandler; @@ -10,7 +10,7 @@ public class FuelHandler implements IFuelHandler @Override public int getBurnTime(ItemStack fuel) { - if (fuel != null && fuel.getItem() == ModItems.ITEM_COMPONENT && fuel.getMetadata() == ItemComponent.getStack(ItemComponent.SAND_COAL).getMetadata()) + if (fuel != null && fuel.getItem() == RegistrarBloodMagicItems.ITEM_COMPONENT && fuel.getMetadata() == ItemComponent.getStack(ItemComponent.SAND_COAL).getMetadata()) { return 1600; } diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java index 3b67c610..709c66a8 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -40,7 +40,12 @@ public class Serializers @Override public DataParameter createKey(int id) { - return new DataParameter(id, this); + return new DataParameter<>(id, this); + } + + @Override + public EnumDemonWillType copyValue(EnumDemonWillType value) { + return EnumDemonWillType.valueOf(value.getName()); } }; diff --git a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java index 4e1d3d69..a5bb1bca 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.incense; import WayofTime.bloodmagic.api.incense.EnumTranquilityType; import WayofTime.bloodmagic.api.incense.ITranquilityHandler; import WayofTime.bloodmagic.api.incense.TranquilityStack; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import net.minecraft.block.*; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; @@ -122,7 +122,7 @@ public class TranquilityHandlers return new TranquilityStack(EnumTranquilityType.WATER, 1); } - if (block == ModBlocks.LIFE_ESSENCE) + if (block == RegistrarBloodMagicBlocks.LIFE_ESSENCE) { return new TranquilityStack(EnumTranquilityType.WATER, 1.5); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index 52f88d86..c2f2fe97 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.creativetab.CreativeTabs; @@ -24,7 +24,7 @@ public class ItemActivationCrystal extends ItemBindableBase implements IVariantP { super(); - setUnlocalizedName(Constants.Mod.MODID + ".activationCrystal."); + setUnlocalizedName(BloodMagic.MODID + ".activationCrystal."); setHasSubtypes(true); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 2421488a..239f3365 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -41,8 +41,8 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP public ItemAltarMaker() { super(); - setUnlocalizedName(Constants.Mod.MODID + ".altarMaker"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".altarMaker"); + setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); setFull3D(); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index 6cb43f05..0455e0cf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -19,9 +19,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -29,10 +28,10 @@ public class ItemArcaneAshes extends Item implements IVariantProvider { public ItemArcaneAshes() { - setUnlocalizedName(Constants.Mod.MODID + ".arcaneAshes"); + setUnlocalizedName(BloodMagic.MODID + ".arcaneAshes"); setMaxStackSize(1); setMaxDamage(19); //Allows for 20 uses - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override @@ -53,7 +52,7 @@ public class ItemArcaneAshes extends Item implements IVariantProvider if (!world.isRemote) { EnumFacing rotation = EnumFacing.fromAngle(player.getRotationYawHead()); - world.setBlockState(newPos, ModBlocks.ALCHEMY_ARRAY.getDefaultState()); + world.setBlockState(newPos, RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getDefaultState()); TileEntity tile = world.getTileEntity(newPos); if (tile instanceof TileAlchemyArray) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index 300ad7a0..8f8c07e8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.ItemBindable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; @@ -19,7 +18,7 @@ public class ItemBindableBase extends ItemBindable { super(); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 49d0d5d0..11363574 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -2,19 +2,18 @@ package WayofTime.bloodmagic.item; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.registry.RegistrarBloodMagic; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; -import net.minecraft.util.SoundCategory; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.orb.BloodOrb; import WayofTime.bloodmagic.api.orb.IBloodOrb; @@ -25,11 +24,13 @@ import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; +import javax.annotation.Nullable; + public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindable { public ItemBloodOrb() { - setUnlocalizedName(Constants.Mod.MODID + ".orb."); + setUnlocalizedName(BloodMagic.MODID + ".orb"); this.setMaxDamage(0); setHasSubtypes(true); } @@ -37,27 +38,41 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab @Override public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + OrbRegistry.getOrb(stack.getItemDamage()).getName(); + BloodOrb orb = getOrb(stack); + if (orb == null) + return super.getUnlocalizedName(stack); + + return super.getUnlocalizedName(stack) + "." + orb.getName(); } @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - for (int i = 0; i < OrbRegistry.getSize(); i++) - list.add(new ItemStack(id, 1, i)); + if (!isInCreativeTab(creativeTab)) + return; + + for (BloodOrb orb : RegistrarBloodMagic.BLOOD_ORBS) { + ItemStack orbStack = new ItemStack(this); + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("orb", orb.getRegistryName().toString()); + orbStack.setTagCompound(tag); + list.add(orbStack); + } } @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); + BloodOrb orb = getOrb(stack); + + if (orb == null) + return ActionResult.newResult(EnumActionResult.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); - // SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, - // 20, world.provider.getDimensionId(), 4, posX, posY, posZ); if (PlayerHelper.isFakePlayer(player)) return super.onItemRightClick(world, player, hand); @@ -74,9 +89,9 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab return super.onItemRightClick(world, player, hand); if (getOwnerUUID(stack).equals(PlayerHelper.getUsernameFromPlayer(player))) - NetworkHelper.setMaxOrb(NetworkHelper.getSoulNetwork(getOwnerUUID(stack)), getOrbLevel(stack.getItemDamage())); + NetworkHelper.setMaxOrb(NetworkHelper.getSoulNetwork(getOwnerUUID(stack)), orb.getTier()); - NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).add(200, getMaxEssence(stack.getItemDamage())); + NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).add(200, orb.getCapacity()); NetworkHelper.getSoulNetwork(player).hurtPlayer(player, 200); return super.onItemRightClick(world, player, hand); } @@ -87,8 +102,9 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.desc")); - if (advanced) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", getOrb(stack.getItemDamage()).getOwner())); + BloodOrb orb = getOrb(stack); + if (advanced && orb != null) + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", orb.getRegistryName())); super.addInformation(stack, player, tooltip, advanced); } @@ -115,21 +131,13 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab // IBloodOrb + @Nullable @Override - public BloodOrb getOrb(int meta) - { - return OrbRegistry.getOrb(meta); - } + public BloodOrb getOrb(ItemStack stack) { + if (!stack.hasTagCompound()) + return null; - @Override - public int getMaxEssence(int meta) - { - return OrbRegistry.getOrb(meta).getCapacity(); - } - - @Override - public int getOrbLevel(int meta) - { - return OrbRegistry.getOrb(meta).getTier(); + ResourceLocation id = new ResourceLocation(stack.getTagCompound().getString("orb")); + return RegistrarBloodMagic.BLOOD_ORBS.getValue(id); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java index ed72887e..303b5c87 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -23,8 +22,8 @@ public class ItemBloodShard extends Item implements IVariantProvider { super(); - setCreativeTab(BloodMagic.tabBloodMagic); - setUnlocalizedName(Constants.Mod.MODID + ".bloodShard."); + setCreativeTab(BloodMagic.TAB_BM); + setUnlocalizedName(BloodMagic.MODID + ".bloodShard."); setHasSubtypes(true); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index cafe5944..b76723ca 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -67,7 +67,7 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider boolean silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0; int fortuneLvl = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack); - int range = (int) (charge / 6); //Charge is a max of 30 - want 5 to be the max + int range = charge / 6; //Charge is a max of 30 - want 5 to be the max HashMultiset drops = HashMultiset.create(); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index c7f5b9eb..16e3d7ac 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -66,7 +66,7 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider boolean silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0; int fortuneLvl = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack); - int range = (int) (charge / 6); //Charge is a max of 30 - want 5 to be the max + int range = charge / 6; //Charge is a max of 30 - want 5 to be the max HashMultiset drops = HashMultiset.create(); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 23efa140..fb92e1f1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -35,7 +35,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; @@ -46,10 +46,10 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable { public ItemBoundSword() { - super(ModItems.BOUND_TOOL_MATERIAL); + super(RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL); - setUnlocalizedName(Constants.Mod.MODID + ".bound.sword"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".bound.sword"); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index ed35e9b9..a06f4815 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -41,7 +41,7 @@ import WayofTime.bloodmagic.api.event.BoundToolEvent; import WayofTime.bloodmagic.api.iface.IActivatable; import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.ImmutableSet; @@ -60,9 +60,9 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable public ItemBoundTool(String name, float damage, Set effectiveBlocks) { - super(damage, 1, ModItems.BOUND_TOOL_MATERIAL, effectiveBlocks); - setUnlocalizedName(Constants.Mod.MODID + ".bound." + name); - setCreativeTab(BloodMagic.tabBloodMagic); + super(damage, 1, RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL, effectiveBlocks); + setUnlocalizedName(BloodMagic.MODID + ".bound." + name); + setCreativeTab(BloodMagic.TAB_BM); setHarvestLevel(name, 4); this.name = name; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java index 0d4bcaa8..872943a7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java @@ -15,9 +15,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; public class ItemComponent extends Item implements IVariantProvider { @@ -62,9 +61,9 @@ public class ItemComponent extends Item implements IVariantProvider { super(); - setUnlocalizedName(Constants.Mod.MODID + ".baseComponent."); + setUnlocalizedName(BloodMagic.MODID + ".baseComponent."); setHasSubtypes(true); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); buildItemList(); } @@ -122,7 +121,7 @@ public class ItemComponent extends Item implements IVariantProvider public static ItemStack getStack(String name) { - return new ItemStack(ModItems.ITEM_COMPONENT, 1, names.indexOf(name)); + return new ItemStack(RegistrarBloodMagicItems.ITEM_COMPONENT, 1, names.indexOf(name)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index 967218c8..d0dcd611 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.api.util.helper.PurificationHelper; import WayofTime.bloodmagic.client.IVariantProvider; @@ -30,8 +29,8 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider public ItemDaggerOfSacrifice() { super(); - setUnlocalizedName(Constants.Mod.MODID + ".daggerOfSacrifice"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".daggerOfSacrifice"); + setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); setFull3D(); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java index 1eb88a7b..431ece2c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.item; import java.util.ArrayList; import java.util.List; -import lombok.Getter; +import com.google.common.collect.Lists; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -16,16 +16,14 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVariantProvider { - @Getter - private static ArrayList names = new ArrayList(); + public static final ArrayList NAMES = Lists.newArrayList(); public static final String CRYSTAL_DEFAULT = "crystalDefault"; public static final String CRYSTAL_CORROSIVE = "crystalCorrosive"; @@ -37,39 +35,42 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria { super(); - setUnlocalizedName(Constants.Mod.MODID + ".demonCrystal."); + setUnlocalizedName(BloodMagic.MODID + ".demonCrystal."); setHasSubtypes(true); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); buildItemList(); } private void buildItemList() { - names.add(0, CRYSTAL_DEFAULT); - names.add(1, CRYSTAL_CORROSIVE); - names.add(2, CRYSTAL_DESTRUCTIVE); - names.add(3, CRYSTAL_VENGEFUL); - names.add(4, CRYSTAL_STEADFAST); + NAMES.add(0, CRYSTAL_DEFAULT); + NAMES.add(1, CRYSTAL_CORROSIVE); + NAMES.add(2, CRYSTAL_DESTRUCTIVE); + NAMES.add(3, CRYSTAL_VENGEFUL); + NAMES.add(4, CRYSTAL_STEADFAST); } @Override public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names.get(stack.getItemDamage()); + return super.getUnlocalizedName(stack) + NAMES.get(stack.getItemDamage()); } @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - for (int i = 0; i < names.size(); i++) - list.add(new ItemStack(id, 1, i)); + if (!isInCreativeTab(creativeTab)) + return; + + for (int i = 0; i < NAMES.size(); i++) + list.add(new ItemStack(this, 1, i)); } public static ItemStack getStack(String name) { - return new ItemStack(ModItems.ITEM_DEMON_CRYSTAL, 1, names.indexOf(name)); + return new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, NAMES.indexOf(name)); } @Override @@ -109,8 +110,8 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria public List> getVariants() { List> ret = new ArrayList>(); - for (String name : names) - ret.add(new ImmutablePair(names.indexOf(name), "type=" + name)); + for (String name : NAMES) + ret.add(new ImmutablePair(NAMES.indexOf(name), "type=" + name)); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index 4b72a28a..c5490674 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -15,7 +15,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IDemonWillViewer; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -24,9 +23,9 @@ public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemon { public ItemDemonWillGauge() { - setUnlocalizedName(Constants.Mod.MODID + ".willGauge"); + setUnlocalizedName(BloodMagic.MODID + ".willGauge"); setMaxStackSize(1); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 38d73e31..5d236668 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -19,7 +19,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -28,9 +27,9 @@ public class ItemExperienceBook extends Item implements IVariantProvider { public ItemExperienceBook() { - setUnlocalizedName(Constants.Mod.MODID + ".experienceTome"); + setUnlocalizedName(BloodMagic.MODID + ".experienceTome"); setMaxStackSize(1); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 92dcd5cf..609c71a5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -35,7 +36,7 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro { super(); - setUnlocalizedName(Constants.Mod.MODID + ".scribe."); + setUnlocalizedName(BloodMagic.MODID + ".scribe."); setHasSubtypes(true); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index d7efd026..64ff93d6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -1,31 +1,26 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; +import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; -import net.minecraftforge.fml.common.IFuelHandler; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IVariantProvider; -import com.google.common.base.Strings; - -public class ItemLavaCrystal extends ItemBindableBase implements IFuelHandler, IVariantProvider +public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvider { public ItemLavaCrystal() { super(); - setUnlocalizedName(Constants.Mod.MODID + ".lavaCrystal"); + setUnlocalizedName(BloodMagic.MODID + ".lavaCrystal"); } @Override @@ -45,50 +40,26 @@ public class ItemLavaCrystal extends ItemBindableBase implements IFuelHandler, I } @Override - public int getBurnTime(ItemStack fuel) - { - if (fuel == null) - { - return 0; + public int getItemBurnTime(ItemStack stack) { + if (getOwnerUUID(stack) == null) + return -1; + + if (NetworkHelper.canSyphonFromContainer(stack, 25)) + return 200; + else { + EntityPlayer player = PlayerHelper.getPlayerFromUUID(getOwnerUUID(stack)); + if (player != null) + player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 99)); } - Item fuelItem = fuel.getItem(); - - if (fuelItem instanceof ItemLavaCrystal) - { -// -// if (FMLCommonHandler.instance().getSide() == Side.CLIENT) -// { -// return 200; -// } -// System.out.println(FMLCommonHandler.instance().getSide()); - - if (NetworkHelper.canSyphonFromContainer(fuel, 25)) - { - return 200; - } else - { - if (!Strings.isNullOrEmpty(this.getOwnerUUID(fuel))) - { - EntityPlayer player = PlayerHelper.getPlayerFromUUID(this.getOwnerUUID(fuel)); - if (player != null) - { - player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 99)); - } - } - - return 0; - } - } - - return 0; + return -1; } @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=normal")); + List> ret = Lists.newArrayList(); + ret.add(Pair.of(0, "type=normal")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index dede4a52..c5ab320a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.api.util.helper.NBTHelper; @@ -26,7 +25,6 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import javax.annotation.Nullable; @@ -34,8 +32,8 @@ public class ItemPotionFlask extends Item implements IMeshProvider { public ItemPotionFlask() { - setUnlocalizedName(Constants.Mod.MODID + ".potionFlask"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".potionFlask"); + setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); setMaxDamage(8); setNoRepair(); @@ -149,7 +147,7 @@ public class ItemPotionFlask extends Item implements IMeshProvider boolean full = true; if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) full = false; - return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + getRegistryName().getResourcePath()), "full=" + (full ? "true" : "false")); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + getRegistryName().getResourcePath()), "full=" + (full ? "true" : "false")); } }; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index d10e0cde..a4f33273 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -18,7 +18,6 @@ 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.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -37,7 +36,7 @@ import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.util.helper.RitualHelper; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; @@ -52,8 +51,8 @@ public class ItemRitualDiviner extends Item implements IVariantProvider public ItemRitualDiviner() { - setUnlocalizedName(Constants.Mod.MODID + ".ritualDiviner"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".ritualDiviner"); + setCreativeTab(BloodMagic.TAB_BM); setHasSubtypes(true); setMaxStackSize(1); } @@ -166,7 +165,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider return false; } int meta = component.getRuneType().ordinal(); - IBlockState newState = ModBlocks.RITUAL_STONE.getStateFromMeta(meta); + IBlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); world.setBlockState(newPos, newState); return true; } else @@ -224,7 +223,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider if (item instanceof ItemBlock) { Block block = ((ItemBlock) item).getBlock(); - if (block == ModBlocks.RITUAL_STONE) + if (block == RegistrarBloodMagicBlocks.RITUAL_STONE) { newStack.shrink(1); return true; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 8ae94165..29cbb7a6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -38,7 +39,7 @@ public class ItemRitualReader extends Item implements IVariantProvider public ItemRitualReader() { super(); - setUnlocalizedName(Constants.Mod.MODID + ".ritualReader"); + setUnlocalizedName(BloodMagic.MODID + ".ritualReader"); setMaxStackSize(1); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 7927fabb..a1584cb6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -24,9 +24,6 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; @@ -34,7 +31,6 @@ import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -48,8 +44,8 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider { super(); - setUnlocalizedName(Constants.Mod.MODID + ".sacrificialDagger."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sacrificialDagger."); + setCreativeTab(BloodMagic.TAB_BM); setHasSubtypes(true); setMaxStackSize(1); setFull3D(); @@ -203,7 +199,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider if (canUseForSacrifice(stack)) variant = "type=ceremonial"; - return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/ItemSacrificialDagger"), variant); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/ItemSacrificialDagger"), variant); } }; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index 392f0dc2..6470657e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -38,8 +38,8 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa public ItemSanguineBook() { - setUnlocalizedName(Constants.Mod.MODID + ".sanguineBook"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sanguineBook"); + setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java index b250f98f..2a394754 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.creativetab.CreativeTabs; @@ -26,8 +25,8 @@ public class ItemSlate extends Item implements IVariantProvider { super(); - setCreativeTab(BloodMagic.tabBloodMagic); - setUnlocalizedName(Constants.Mod.MODID + ".slate."); + setCreativeTab(BloodMagic.TAB_BM); + setUnlocalizedName(BloodMagic.MODID + ".slate."); setHasSubtypes(true); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 68697b42..1b781ac4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -34,8 +34,8 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP { super(); - setUnlocalizedName(Constants.Mod.MODID + ".focus."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".focus."); + setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); setHasSubtypes(true); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index 469b521a..0ed7fdaa 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; @@ -35,8 +34,8 @@ public class ItemUpgradeTome extends Item implements IVariantProvider { super(); - setCreativeTab(BloodMagic.tabUpgradeTome); - setUnlocalizedName(Constants.Mod.MODID + ".upgradeTome"); + setCreativeTab(BloodMagic.TAB_TOMES); + setUnlocalizedName(BloodMagic.MODID + ".upgradeTome"); setHasSubtypes(true); setMaxStackSize(1); } @@ -82,7 +81,7 @@ public class ItemUpgradeTome extends Item implements IVariantProvider LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); if (upgrade != null && upgrade.isDowngrade()) - return "item." + Constants.Mod.MODID + ".downgradeTome"; + return "item." + BloodMagic.MODID + ".downgradeTome"; return super.getUnlocalizedName(stack); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index 3dd969fc..7f451541 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -28,8 +27,8 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian { super(); - setCreativeTab(BloodMagic.tabUpgradeTome); - setUnlocalizedName(Constants.Mod.MODID + ".upgradeTrainer"); + setCreativeTab(BloodMagic.TAB_TOMES); + setUnlocalizedName(BloodMagic.MODID + ".upgradeTrainer"); setHasSubtypes(true); setMaxStackSize(1); } diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index 18f1063a..c375b389 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -17,11 +17,10 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.ICustomAlchemyConsumable; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomAlchemyConsumable @@ -36,9 +35,9 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA { super(); - setUnlocalizedName(Constants.Mod.MODID + ".cuttingFluid."); + setUnlocalizedName(BloodMagic.MODID + ".cuttingFluid."); setHasSubtypes(true); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); buildItemList(); @@ -76,7 +75,7 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA public static ItemStack getStack(String name) { - return new ItemStack(ModItems.CUTTING_FLUID, 1, names.indexOf(name)); + return new ItemStack(RegistrarBloodMagicItems.CUTTING_FLUID, 1, names.indexOf(name)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java index 6564c9fb..a4a9030e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java @@ -25,11 +25,10 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.Iterables; @@ -45,9 +44,9 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi { super(); - setUnlocalizedName(Constants.Mod.MODID + ".livingPointUpgrade."); + setUnlocalizedName(BloodMagic.MODID + ".livingPointUpgrade."); setHasSubtypes(true); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); buildItemList(); } @@ -137,7 +136,7 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi public static ItemStack getStack(String name) { - return new ItemStack(ModItems.ITEM_POINTS_UPGRADE, 1, names.indexOf(name)); + return new ItemStack(RegistrarBloodMagicItems.ITEM_POINTS_UPGRADE, 1, names.indexOf(name)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 71ff29f1..31abf8de 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -45,7 +45,7 @@ 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.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -69,16 +69,16 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP public ItemLivingArmour(EntityEquipmentSlot armorType) { super(ItemArmor.ArmorMaterial.IRON, 0, armorType); - setUnlocalizedName(Constants.Mod.MODID + ".livingArmour."); + setUnlocalizedName(BloodMagic.MODID + ".livingArmour."); // setMaxDamage(250); setMaxDamage((int) (getMaxDamage() * 1.5)); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override public void onCreated(ItemStack stack, World world, EntityPlayer player) { - if (stack != null && !world.isRemote && stack.getItem() == ModItems.LIVING_ARMOUR_CHEST) + if (stack != null && !world.isRemote && stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { Utils.setUUID(stack); } @@ -87,12 +87,12 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { - if (this == ModItems.LIVING_ARMOUR_CHEST || this == ModItems.LIVING_ARMOUR_HELMET || this == ModItems.LIVING_ARMOUR_BOOTS) + 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 == ModItems.LIVING_ARMOUR_LEGS) + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { return "bloodmagic:models/armor/livingArmour_layer_2.png"; } else @@ -125,13 +125,13 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP double armourReduction = 0.0; double damageAmount = 0.25; - if (this == ModItems.LIVING_ARMOUR_BOOTS || this == ModItems.LIVING_ARMOUR_HELMET) + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS || this == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) { damageAmount = 3d / 20d * 0.6; - } else if (this == ModItems.LIVING_ARMOUR_LEGS) + } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { damageAmount = 6d / 20d * 0.6; - } else if (this == ModItems.LIVING_ARMOUR_CHEST) + } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { damageAmount = 0.64; } @@ -150,7 +150,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return new ArmorProperties(-1, 0, 0); } - if (this == ModItems.LIVING_ARMOUR_CHEST) + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { armourReduction = 0.24 / 0.64; // This values puts it at iron level @@ -208,22 +208,22 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { - if (armor.getItem() == ModItems.LIVING_ARMOUR_HELMET) + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) { return 3; } - if (armor.getItem() == ModItems.LIVING_ARMOUR_CHEST) + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { return 8; } - if (armor.getItem() == ModItems.LIVING_ARMOUR_LEGS) + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { return 6; } - if (armor.getItem() == ModItems.LIVING_ARMOUR_BOOTS) + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS) { return 3; } @@ -234,7 +234,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { - if (this == ModItems.LIVING_ARMOUR_CHEST) + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { int preDamage = stack.getItemDamage(); if (source.isUnblockable()) @@ -286,7 +286,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (!stack.hasTagCompound()) return; - if (this == ModItems.LIVING_ARMOUR_CHEST) + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { LivingArmour armour = getLivingArmourFromStack(stack); for (Entry entry : armour.upgradeMap.entrySet()) @@ -333,7 +333,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP { super.onArmorTick(world, player, stack); - if (world.isRemote && this == ModItems.LIVING_ARMOUR_CHEST) + if (world.isRemote && this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { if (player instanceof EntityPlayerSP) //Sanity check { @@ -358,7 +358,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(Constants.Mod.MODID + ".upgrade.elytra", chestStack); + 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) @@ -384,7 +384,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } } - if (this == ModItems.LIVING_ARMOUR_CHEST) + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { if (!hasLivingArmour(stack)) { @@ -405,7 +405,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { - if (this == ModItems.LIVING_ARMOUR_CHEST && isEnabled(stack) && slot == EntityEquipmentSlot.CHEST) + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST && isEnabled(stack) && slot == EntityEquipmentSlot.CHEST) { LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(stack); @@ -431,11 +431,11 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP public ModelResourceLocation getModelLocation(ItemStack stack) { assert getCustomLocation() != null; - if (stack.getItem() == ModItems.LIVING_ARMOUR_HELMET) + if (stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) return new ModelResourceLocation(getCustomLocation(), "armour=head"); - else if (stack.getItem() == ModItems.LIVING_ARMOUR_CHEST) + else if (stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) return new ModelResourceLocation(getCustomLocation(), "armour=body"); - else if (stack.getItem() == ModItems.LIVING_ARMOUR_LEGS) + else if (stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) return new ModelResourceLocation(getCustomLocation(), "armour=leg"); else return new ModelResourceLocation(getCustomLocation(), "armour=feet"); @@ -446,7 +446,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override public ResourceLocation getCustomLocation() { - return new ResourceLocation(Constants.Mod.MODID, "item/ItemLivingArmour"); + return new ResourceLocation(BloodMagic.MODID, "item/ItemLivingArmour"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index d45d9f65..d1fa549b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -31,7 +31,7 @@ import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -56,15 +56,15 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public ItemSentientArmour(EntityEquipmentSlot armorType) { super(ItemArmor.ArmorMaterial.IRON, 0, armorType); - setUnlocalizedName(Constants.Mod.MODID + ".sentientArmour."); + setUnlocalizedName(BloodMagic.MODID + ".sentientArmour."); setMaxDamage(250); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { - if (this == ModItems.SENTIENT_ARMOUR_CHEST || this == ModItems.SENTIENT_ARMOUR_HELMET || this == ModItems.SENTIENT_ARMOUR_BOOTS) + if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST || this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET || this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS) { switch (this.getCurrentType(stack)) { @@ -82,7 +82,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes return "bloodmagic:models/armor/sentientArmour_layer_1.png"; } - if (this == ModItems.SENTIENT_ARMOUR_LEGS) + if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { switch (this.getCurrentType(stack)) { @@ -159,13 +159,13 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes double armourReduction = 0.0; double damageAmount = 0.25; - if (this == ModItems.SENTIENT_ARMOUR_BOOTS || this == ModItems.SENTIENT_ARMOUR_HELMET) + if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS || this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) { damageAmount = 3d / 20d * 0.6; - } else if (this == ModItems.SENTIENT_ARMOUR_LEGS) + } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { damageAmount = 6d / 20d * 0.6; - } else if (this == ModItems.SENTIENT_ARMOUR_CHEST) + } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { damageAmount = 0.64; } @@ -184,7 +184,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes return new ArmorProperties(-1, 0, 0); } - if (this == ModItems.SENTIENT_ARMOUR_CHEST) + if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { armourReduction = 0.24 / 0.64; // This values puts it at iron level @@ -230,22 +230,22 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes @Override public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { - if (armor.getItem() == ModItems.SENTIENT_ARMOUR_HELMET) + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) { return 3; } - if (armor.getItem() == ModItems.SENTIENT_ARMOUR_CHEST) + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { return 8; } - if (armor.getItem() == ModItems.SENTIENT_ARMOUR_LEGS) + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { return 6; } - if (armor.getItem() == ModItems.SENTIENT_ARMOUR_BOOTS) + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS) { return 3; } @@ -329,13 +329,13 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public ModelResourceLocation getModelLocation(ItemStack stack) { assert getCustomLocation() != null; - EnumDemonWillType type = ((ItemSentientArmour) ModItems.SENTIENT_ARMOUR_HELMET).getCurrentType(stack); + EnumDemonWillType type = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET).getCurrentType(stack); String additional = "_" + type.getName().toLowerCase(); - if (stack.getItem() == ModItems.SENTIENT_ARMOUR_HELMET) + if (stack.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) return new ModelResourceLocation(getCustomLocation(), "armour=head" + additional); - else if (stack.getItem() == ModItems.SENTIENT_ARMOUR_CHEST) + else if (stack.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) return new ModelResourceLocation(getCustomLocation(), "armour=body" + additional); - else if (stack.getItem() == ModItems.SENTIENT_ARMOUR_LEGS) + else if (stack.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) return new ModelResourceLocation(getCustomLocation(), "armour=leg" + additional); else return new ModelResourceLocation(getCustomLocation(), "armour=feet" + additional); @@ -346,7 +346,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes @Override public ResourceLocation getCustomLocation() { - return new ResourceLocation(Constants.Mod.MODID, "item/ItemSentientArmour"); + return new ResourceLocation(BloodMagic.MODID, "item/ItemSentientArmour"); } @Override @@ -440,10 +440,10 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes ItemStack bootsStack = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); { - ItemStack omegaHelmetStack = ((ItemSentientArmour) ModItems.SENTIENT_ARMOUR_HELMET).getSubstituteStack(type, will, helmetStack); - ItemStack omegaChestStack = ((ItemSentientArmour) ModItems.SENTIENT_ARMOUR_CHEST).getSubstituteStack(type, will, chestStack); - ItemStack omegaLeggingsStack = ((ItemSentientArmour) ModItems.SENTIENT_ARMOUR_LEGS).getSubstituteStack(type, will, leggingsStack); - ItemStack omegaBootsStack = ((ItemSentientArmour) ModItems.SENTIENT_ARMOUR_BOOTS).getSubstituteStack(type, will, bootsStack); + 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_LEGS).getSubstituteStack(type, will, leggingsStack); + ItemStack omegaBootsStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS).getSubstituteStack(type, will, bootsStack); player.setItemStackToSlot(EntityEquipmentSlot.HEAD, omegaHelmetStack); player.setItemStackToSlot(EntityEquipmentSlot.CHEST, omegaChestStack); diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index cf9f222a..ead9db6f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -33,8 +33,8 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I { super(ArmorMaterial.CHAIN, 0, EntityEquipmentSlot.CHEST); - setUnlocalizedName(Constants.Mod.MODID + ".pack.sacrifice"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".pack.sacrifice"); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index bba354f1..93368f20 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -49,8 +49,8 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato { super(ArmorMaterial.CHAIN, 0, EntityEquipmentSlot.CHEST); - setUnlocalizedName(Constants.Mod.MODID + ".pack.selfSacrifice"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".pack.selfSacrifice"); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index 2c688aa6..df290575 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -17,7 +17,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.inventory.ItemInventory; import WayofTime.bloodmagic.routing.IFluidFilter; @@ -33,9 +32,9 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, { super(); - setUnlocalizedName(Constants.Mod.MODID + ".fluidFilter."); + setUnlocalizedName(BloodMagic.MODID + ".fluidFilter."); setHasSubtypes(true); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index cad28fcb..7e565530 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -32,9 +32,9 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi { public ItemNodeRouter() { - setUnlocalizedName(Constants.Mod.MODID + ".nodeRouter"); + setUnlocalizedName(BloodMagic.MODID + ".nodeRouter"); setMaxStackSize(1); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 5cbd10dc..be5eaef0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -17,7 +17,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.inventory.ItemInventory; import WayofTime.bloodmagic.routing.DefaultItemFilter; @@ -37,9 +36,9 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari { super(); - setUnlocalizedName(Constants.Mod.MODID + ".itemFilter."); + setUnlocalizedName(BloodMagic.MODID + ".itemFilter."); setHasSubtypes(true); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index 29e6913b..c924da7d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -48,9 +48,9 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP wantedVelocity += (1 + amplifier) * (0.35); } - player.motionX = vec.xCoord * wantedVelocity; - player.motionY = vec.yCoord * wantedVelocity; - player.motionZ = vec.zCoord * wantedVelocity; + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index 9cff0cd1..8bc97fda 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -17,7 +17,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -31,8 +30,8 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider { super(lpUsed); - setUnlocalizedName(Constants.Mod.MODID + ".sigil." + name); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sigil." + name); + setCreativeTab(BloodMagic.TAB_BM); this.name = name; this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index ef7ef638..16270618 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -15,7 +15,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; public class ItemSigilBloodLight extends ItemSigilBase { @@ -51,7 +51,7 @@ public class ItemSigilBloodLight extends ItemSigilBase if (world.isAirBlock(blockPos)) { - world.setBlockState(blockPos, ModBlocks.BLOOD_LIGHT.getDefaultState()); + world.setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); if (!world.isRemote) NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()); resetCooldown(stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java index a42dd360..95c4120b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java @@ -61,7 +61,7 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase BlockPos blockPos = new BlockPos(ix, iy, iz); Block block = worldIn.getBlockState(blockPos).getBlock(); - if (!BloodMagicAPI.getGreenGroveBlacklist().contains(block)) + if (!BloodMagicAPI.greenGroveBlacklist.contains(block)) { if (block instanceof IPlantable || block instanceof IGrowable) { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java index 9dfeaec3..1317289f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java @@ -6,14 +6,12 @@ import java.util.Map; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { @@ -88,7 +86,7 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase BlockPos blockPos = new BlockPos(ix + posX, posY + verticalOffset, iz + posZ); if (world.isAirBlock(blockPos)) - world.setBlockState(blockPos, ModBlocks.PHANTOM_BLOCK.getDefaultState()); + world.setBlockState(blockPos, RegistrarBloodMagicBlocks.PHANTOM.getDefaultState()); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 63692bb4..286ff886 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -4,9 +4,7 @@ import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.impl.ItemSigilToggleable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; @@ -32,8 +30,8 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes { super(lpUsed); - setUnlocalizedName(Constants.Mod.MODID + ".sigil." + name); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sigil." + name); + setCreativeTab(BloodMagic.TAB_BM); this.name = name; this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index d181f80a..117b3f17 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -30,8 +30,8 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide { super(); - setUnlocalizedName(Constants.Mod.MODID + ".monsterSoul."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".monsterSoul."); + setCreativeTab(BloodMagic.TAB_BM); setHasSubtypes(true); setMaxStackSize(1); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index 6b13d6b3..1a7c9e7c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -12,7 +12,6 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; @@ -23,8 +22,8 @@ public class ItemSentientArmourGem extends Item { super(); - setCreativeTab(BloodMagic.tabBloodMagic); - setUnlocalizedName(Constants.Mod.MODID + ".sentientArmourGem"); + setCreativeTab(BloodMagic.TAB_BM); + setUnlocalizedName(BloodMagic.MODID + ".sentientArmourGem"); setMaxStackSize(1); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 9258b7ed..1908126c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -40,7 +40,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; @@ -80,8 +80,8 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); - setUnlocalizedName(Constants.Mod.MODID + ".sentientAxe"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sentientAxe"); + setCreativeTab(BloodMagic.TAB_BM); } @Override @@ -100,7 +100,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); + return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) @@ -372,7 +372,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP double willModifier = killedEntity instanceof EntitySlime ? 0.67 : 1; - IDemonWill soul = ((IDemonWill) ModItems.MONSTER_SOUL); + IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); EnumDemonWillType type = this.getCurrentType(stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 366c29ba..756afb9d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -31,7 +31,7 @@ import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import java.util.Locale; @@ -47,8 +47,8 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public ItemSentientBow() { super(); - setUnlocalizedName(Constants.Mod.MODID + ".sentientBow"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sentientBow"); + setCreativeTab(BloodMagic.TAB_BM); this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) @@ -60,7 +60,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } else { ItemStack itemstack = entityIn.getActiveItemStack(); - return !itemstack.isEmpty() && itemstack.getItem() == ModItems.SENTIENT_BOW ? (float) (stack.getMaxItemUseDuration() - entityIn.getItemInUseCount()) / 20.0F : 0.0F; + return !itemstack.isEmpty() && itemstack.getItem() == RegistrarBloodMagicItems.SENTIENT_BOW ? (float) (stack.getMaxItemUseDuration() - entityIn.getItemInUseCount()) / 20.0F : 0.0F; } } }); @@ -77,7 +77,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien @SideOnly(Side.CLIENT) public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { - return ((ItemSentientBow) ModItems.SENTIENT_BOW).getCurrentType(stack).ordinal(); + return ((ItemSentientBow) RegistrarBloodMagicItems.SENTIENT_BOW).getCurrentType(stack).ordinal(); } }); } @@ -85,7 +85,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); + return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 42b4c6ed..d5ff992e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -40,7 +40,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; @@ -80,8 +80,8 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); - setUnlocalizedName(Constants.Mod.MODID + ".sentientPickaxe"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sentientPickaxe"); + setCreativeTab(BloodMagic.TAB_BM); } @Override @@ -100,7 +100,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); + return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) @@ -371,7 +371,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon double willModifier = killedEntity instanceof EntitySlime ? 0.67 : 1; - IDemonWill soul = ((IDemonWill) ModItems.MONSTER_SOUL); + IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); EnumDemonWillType type = this.getCurrentType(stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index 1863650e..cd7f8772 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -40,7 +40,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; @@ -80,8 +80,8 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); - setUnlocalizedName(Constants.Mod.MODID + ".sentientShovel"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sentientShovel"); + setCreativeTab(BloodMagic.TAB_BM); } @Override @@ -100,7 +100,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); + return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) @@ -372,7 +372,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I double willModifier = killedEntity instanceof EntitySlime ? 0.67 : 1; - IDemonWill soul = ((IDemonWill) ModItems.MONSTER_SOUL); + IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); EnumDemonWillType type = this.getCurrentType(stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 328bbebc..c91d43b2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -38,7 +38,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; @@ -70,16 +70,16 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public ItemSentientSword() { - super(ModItems.SOUL_TOOL_MATERIAL); + super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); - setUnlocalizedName(Constants.Mod.MODID + ".sentientSword"); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".sentientSword"); + setCreativeTab(BloodMagic.TAB_BM); } @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ModItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); + return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) @@ -343,7 +343,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM double willModifier = killedEntity instanceof EntitySlime ? 0.67 : 1; - IDemonWill soul = ((IDemonWill) ModItems.MONSTER_SOUL); + IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); EnumDemonWillType type = this.getCurrentType(stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index a77b0f0d..e065e8b2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -37,10 +37,10 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I { super(); - setUnlocalizedName(Constants.Mod.MODID + ".soulGem."); + setUnlocalizedName(BloodMagic.MODID + ".soulGem."); setHasSubtypes(true); setMaxStackSize(1); - setCreativeTab(BloodMagic.tabBloodMagic); + setCreativeTab(BloodMagic.TAB_BM); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index dc61d420..4fa4a6af 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -30,8 +29,8 @@ public class ItemSoulSnare extends Item implements IVariantProvider { super(); - setUnlocalizedName(Constants.Mod.MODID + ".soulSnare."); - setCreativeTab(BloodMagic.tabBloodMagic); + setUnlocalizedName(BloodMagic.MODID + ".soulSnare."); + setCreativeTab(BloodMagic.TAB_BM); setHasSubtypes(true); setMaxStackSize(16); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java index db53c6f8..51bac32a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.downgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -43,7 +43,7 @@ public class LivingArmourUpgradeBattleHungry extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.battleHunger"; + return BloodMagic.MODID + ".upgrade.battleHunger"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java index 81b646bf..489dfd4d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.downgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -25,7 +25,7 @@ public class LivingArmourUpgradeCrippledArm extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.crippledArm"; + return BloodMagic.MODID + ".upgrade.crippledArm"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java index 8da4d5bc..22c7f835 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java @@ -2,13 +2,12 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import java.util.HashMap; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.LivingArmour; public class LivingArmourUpgradeDigSlowdown extends LivingArmourUpgrade { @@ -38,7 +37,7 @@ public class LivingArmourUpgradeDigSlowdown extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.digSlowdown"; + return BloodMagic.MODID + ".upgrade.digSlowdown"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java index 81b1ae68..748e46c5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.downgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -36,7 +36,7 @@ public class LivingArmourUpgradeDisoriented extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.disoriented"; + return BloodMagic.MODID + ".upgrade.disoriented"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java index fbbf800f..7bf7d5b7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.downgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -46,7 +46,7 @@ public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.meleeDecrease"; + return BloodMagic.MODID + ".upgrade.meleeDecrease"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java index acad75c6..57af0b42 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.downgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -25,7 +25,7 @@ public class LivingArmourUpgradeQuenched extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.quenched"; + return BloodMagic.MODID + ".upgrade.quenched"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java index cfa1f3a4..aded04f5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.livingArmour.downgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -34,8 +34,8 @@ public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade f6 = world.getBlockState(blockpos$pooledmutableblockpos).getBlock().slipperiness * 0.91F; } - player.motionX /= (double) (f6 / 0.91); - player.motionZ /= (double) (f6 / 0.91); + player.motionX /= f6 / 0.91; + player.motionZ /= f6 / 0.91; float f7 = 0.16277136F / (f6 * f6 * f6); float f8; @@ -48,9 +48,9 @@ public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade f8 = player.jumpMovementFactor; } - player.moveRelative(-player.moveStrafing, -player.moveForward, f8); + player.moveRelative(-player.moveStrafing, -player.moveForward, f8, 0.02F); - player.moveRelative(player.moveStrafing, player.moveForward, f8 / 10); + player.moveRelative(player.moveStrafing, player.moveForward, f8 / 10, 0.02F); player.motionX *= 0.90; player.motionY *= 0.90; @@ -67,7 +67,7 @@ public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.slippery"; + return BloodMagic.MODID + ".upgrade.slippery"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java index 5951579a..97100bee 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.downgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -32,7 +32,7 @@ public class LivingArmourUpgradeSlowHeal extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.slowHeal"; + return BloodMagic.MODID + ".upgrade.slowHeal"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java index ff1dce79..bd1c9898 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -2,12 +2,12 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import java.util.UUID; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -45,7 +45,7 @@ public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.slowness"; + return BloodMagic.MODID + ".upgrade.slowness"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java index 8074631d..33f589b4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.downgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -31,7 +31,7 @@ public class LivingArmourUpgradeStormTrooper extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.stormTrooper"; + return BloodMagic.MODID + ".upgrade.stormTrooper"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java index 64371af5..a0dff362 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java @@ -4,11 +4,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerArrowProtect extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.arrowProtect"; + return BloodMagic.MODID + ".tracker.arrowProtect"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerArrowProtect extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamage = tag.getInteger(Constants.Mod.MODID + ".tracker.arrowProtect"); + totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.arrowProtect"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.arrowProtect", totalDamage); + tag.setInteger(BloodMagic.MODID + ".tracker.arrowProtect", totalDamage); } @Override @@ -105,7 +105,7 @@ public class StatTrackerArrowProtect extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.arrowProtect"); + return key.equals(BloodMagic.MODID + ".upgrade.arrowProtect"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java index 2f1da239..edbac486 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerArrowShot extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.trickShot"; + return BloodMagic.MODID + ".tracker.trickShot"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerArrowShot extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalShots = tag.getInteger(Constants.Mod.MODID + ".tracker.trickShot"); + totalShots = tag.getInteger(BloodMagic.MODID + ".tracker.trickShot"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.trickShot", totalShots); + tag.setInteger(BloodMagic.MODID + ".tracker.trickShot", totalShots); } @Override @@ -105,7 +105,7 @@ public class StatTrackerArrowShot extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.arrowShot"); + return key.equals(BloodMagic.MODID + ".upgrade.arrowShot"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java index 4980448d..2dfb8b41 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerCriticalStrike extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.criticalStrike"; + return BloodMagic.MODID + ".tracker.criticalStrike"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerCriticalStrike extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamageDealt = tag.getDouble(Constants.Mod.MODID + ".tracker.criticalStrike"); + totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.criticalStrike"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.criticalStrike", totalDamageDealt); + tag.setDouble(BloodMagic.MODID + ".tracker.criticalStrike", totalDamageDealt); } @Override @@ -105,7 +105,7 @@ public class StatTrackerCriticalStrike extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.criticalStrike"); + return key.equals(BloodMagic.MODID + ".upgrade.criticalStrike"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java index 8241ce84..5979d7c9 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerDigging extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.digging"; + return BloodMagic.MODID + ".tracker.digging"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerDigging extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalBlocksDug = tag.getInteger(Constants.Mod.MODID + ".tracker.digging"); + totalBlocksDug = tag.getInteger(BloodMagic.MODID + ".tracker.digging"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.digging", totalBlocksDug); + tag.setInteger(BloodMagic.MODID + ".tracker.digging", totalBlocksDug); } @Override @@ -105,7 +105,7 @@ public class StatTrackerDigging extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.digging"); + return key.equals(BloodMagic.MODID + ".upgrade.digging"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java index cbaee6c2..5a602e47 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerExperience extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.experienced"; + return BloodMagic.MODID + ".tracker.experienced"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerExperience extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalExperienceGained = tag.getDouble(Constants.Mod.MODID + ".tracker.experienced"); + totalExperienceGained = tag.getDouble(BloodMagic.MODID + ".tracker.experienced"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.experienced", totalExperienceGained); + tag.setDouble(BloodMagic.MODID + ".tracker.experienced", totalExperienceGained); } @Override @@ -105,7 +105,7 @@ public class StatTrackerExperience extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.experienced"); + return key.equals(BloodMagic.MODID + ".upgrade.experienced"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java index 349ba96e..3170af53 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerFallProtect extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.fallProtect"; + return BloodMagic.MODID + ".tracker.fallProtect"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerFallProtect extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamage = tag.getInteger(Constants.Mod.MODID + ".tracker.fallProtect"); + totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.fallProtect"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.fallProtect", totalDamage); + tag.setInteger(BloodMagic.MODID + ".tracker.fallProtect", totalDamage); } @Override @@ -105,7 +105,7 @@ public class StatTrackerFallProtect extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.fallProtect"); + return key.equals(BloodMagic.MODID + ".upgrade.fallProtect"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java index 179870c0..4b37e65a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java @@ -3,10 +3,10 @@ package WayofTime.bloodmagic.livingArmour.tracker; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -22,7 +22,7 @@ public class StatTrackerFireResist extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.fire"; + return BloodMagic.MODID + ".tracker.fire"; } @Override @@ -34,13 +34,13 @@ public class StatTrackerFireResist extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalFireTicks = tag.getInteger(Constants.Mod.MODID + ".tracker.fire"); + totalFireTicks = tag.getInteger(BloodMagic.MODID + ".tracker.fire"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.fire", totalFireTicks); + tag.setInteger(BloodMagic.MODID + ".tracker.fire", totalFireTicks); } @Override @@ -87,7 +87,7 @@ public class StatTrackerFireResist extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.fireResist"); + return key.equals(BloodMagic.MODID + ".upgrade.fireResist"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java index 18f1964f..4227f9ab 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java @@ -5,10 +5,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -26,7 +26,7 @@ public class StatTrackerFood extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.foodEaten"; + return BloodMagic.MODID + ".tracker.foodEaten"; } @Override @@ -38,13 +38,13 @@ public class StatTrackerFood extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - foodEaten = tag.getInteger(Constants.Mod.MODID + ".tracker.foodEaten"); + foodEaten = tag.getInteger(BloodMagic.MODID + ".tracker.foodEaten"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.foodEaten", foodEaten); + tag.setInteger(BloodMagic.MODID + ".tracker.foodEaten", foodEaten); } @@ -107,7 +107,7 @@ public class StatTrackerFood extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.knockback"); + return key.equals(BloodMagic.MODID + ".upgrade.knockback"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java index f4fe2cc3..b0a7ffd4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerGraveDigger extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.graveDigger"; + return BloodMagic.MODID + ".tracker.graveDigger"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerGraveDigger extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamageDealt = tag.getDouble(Constants.Mod.MODID + ".tracker.graveDigger"); + totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.graveDigger"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.graveDigger", totalDamageDealt); + tag.setDouble(BloodMagic.MODID + ".tracker.graveDigger", totalDamageDealt); } @Override @@ -105,7 +105,7 @@ public class StatTrackerGraveDigger extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.graveDigger"); + return key.equals(BloodMagic.MODID + ".upgrade.graveDigger"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java index 80cdb444..fb32dfe2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -23,7 +23,7 @@ public class StatTrackerGrimReaperSprint extends StatTracker public static void incrementCounter(LivingArmour armour) { - StatTracker tracker = armour.getTracker(Constants.Mod.MODID + ".tracker.grimReaper"); + StatTracker tracker = armour.getTracker(BloodMagic.MODID + ".tracker.grimReaper"); if (tracker instanceof StatTrackerGrimReaperSprint) { ((StatTrackerGrimReaperSprint) tracker).totalDeaths++; @@ -36,7 +36,7 @@ public class StatTrackerGrimReaperSprint extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.grimReaper"; + return BloodMagic.MODID + ".tracker.grimReaper"; } @Override @@ -48,13 +48,13 @@ public class StatTrackerGrimReaperSprint extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDeaths = tag.getInteger(Constants.Mod.MODID + ".tracker.grimReaper"); + totalDeaths = tag.getInteger(BloodMagic.MODID + ".tracker.grimReaper"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.grimReaper", totalDeaths); + tag.setInteger(BloodMagic.MODID + ".tracker.grimReaper", totalDeaths); } @Override @@ -112,7 +112,7 @@ public class StatTrackerGrimReaperSprint extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.grimReaper"); + return key.equals(BloodMagic.MODID + ".upgrade.grimReaper"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java index 3e522b27..a17414aa 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerHealthboost extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.health"; + return BloodMagic.MODID + ".tracker.health"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerHealthboost extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalHealthGenned = tag.getDouble(Constants.Mod.MODID + ".tracker.health"); + totalHealthGenned = tag.getDouble(BloodMagic.MODID + ".tracker.health"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.health", totalHealthGenned); + tag.setDouble(BloodMagic.MODID + ".tracker.health", totalHealthGenned); } @Override @@ -105,7 +105,7 @@ public class StatTrackerHealthboost extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.health"); + return key.equals(BloodMagic.MODID + ".upgrade.health"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java index 4c9be523..4a789d1c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerJump extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.jump"; + return BloodMagic.MODID + ".tracker.jump"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerJump extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalJumps = tag.getInteger(Constants.Mod.MODID + ".tracker.jump"); + totalJumps = tag.getInteger(BloodMagic.MODID + ".tracker.jump"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.jump", totalJumps); + tag.setInteger(BloodMagic.MODID + ".tracker.jump", totalJumps); } @@ -106,7 +106,7 @@ public class StatTrackerJump extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.jump"); + return key.equals(BloodMagic.MODID + ".upgrade.jump"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java index c5912864..7ecc77d2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerMeleeDamage extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.meleeDamage"; + return BloodMagic.MODID + ".tracker.meleeDamage"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerMeleeDamage extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamageDealt = tag.getDouble(Constants.Mod.MODID + ".tracker.meleeDamage"); + totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.meleeDamage"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.meleeDamage", totalDamageDealt); + tag.setDouble(BloodMagic.MODID + ".tracker.meleeDamage", totalDamageDealt); } @Override @@ -105,7 +105,7 @@ public class StatTrackerMeleeDamage extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.meleeDamage"); + return key.equals(BloodMagic.MODID + ".upgrade.meleeDamage"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java index b9e6fc60..fcf3b000 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java @@ -5,10 +5,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -27,7 +27,7 @@ public class StatTrackerMovement extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.movement"; + return BloodMagic.MODID + ".tracker.movement"; } @Override @@ -39,13 +39,13 @@ public class StatTrackerMovement extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalMovement = tag.getDouble(Constants.Mod.MODID + ".tracker.movement"); + totalMovement = tag.getDouble(BloodMagic.MODID + ".tracker.movement"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.movement", totalMovement); + tag.setDouble(BloodMagic.MODID + ".tracker.movement", totalMovement); } @@ -115,7 +115,7 @@ public class StatTrackerMovement extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.movement"); + return key.equals(BloodMagic.MODID + ".upgrade.movement"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java index 8c0b7913..fdd9ad6b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java @@ -4,11 +4,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -33,7 +33,7 @@ public class StatTrackerNightSight extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.nightSight"; + return BloodMagic.MODID + ".tracker.nightSight"; } @Override @@ -46,15 +46,15 @@ public class StatTrackerNightSight extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamageDealt = tag.getDouble(Constants.Mod.MODID + ".tracker.nightSight"); - totalNightVision = tag.getInteger(Constants.Mod.MODID + ".tracker.nightSightVision"); + totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.nightSight"); + totalNightVision = tag.getInteger(BloodMagic.MODID + ".tracker.nightSightVision"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.nightSight", totalDamageDealt); - tag.setInteger(Constants.Mod.MODID + ".tracker.nightSightVision", totalNightVision); + tag.setDouble(BloodMagic.MODID + ".tracker.nightSight", totalDamageDealt); + tag.setInteger(BloodMagic.MODID + ".tracker.nightSightVision", totalNightVision); } @Override @@ -128,7 +128,7 @@ public class StatTrackerNightSight extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.nightSight"); + return key.equals(BloodMagic.MODID + ".upgrade.nightSight"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java index 638ee99a..a4f06f95 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerPhysicalProtect extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.physicalProtect"; + return BloodMagic.MODID + ".tracker.physicalProtect"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerPhysicalProtect extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamage = tag.getInteger(Constants.Mod.MODID + ".tracker.physicalProtect"); + totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.physicalProtect"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.physicalProtect", totalDamage); + tag.setInteger(BloodMagic.MODID + ".tracker.physicalProtect", totalDamage); } @Override @@ -105,7 +105,7 @@ public class StatTrackerPhysicalProtect extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.physicalProtect"); + return key.equals(BloodMagic.MODID + ".upgrade.physicalProtect"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java index 588e9a83..528f2eef 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java @@ -3,11 +3,11 @@ package WayofTime.bloodmagic.livingArmour.tracker; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -23,7 +23,7 @@ public class StatTrackerPoison extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.poison"; + return BloodMagic.MODID + ".tracker.poison"; } @Override @@ -35,13 +35,13 @@ public class StatTrackerPoison extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalPoisonTicks = tag.getInteger(Constants.Mod.MODID + ".tracker.poison"); + totalPoisonTicks = tag.getInteger(BloodMagic.MODID + ".tracker.poison"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.poison", totalPoisonTicks); + tag.setInteger(BloodMagic.MODID + ".tracker.poison", totalPoisonTicks); } @Override @@ -88,7 +88,7 @@ public class StatTrackerPoison extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.poisonResist"); + return key.equals(BloodMagic.MODID + ".upgrade.poisonResist"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java index 8a3271f1..c8457c24 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerRepairing extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.repair"; + return BloodMagic.MODID + ".tracker.repair"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerRepairing extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamage = tag.getDouble(Constants.Mod.MODID + ".tracker.repair"); + totalDamage = tag.getDouble(BloodMagic.MODID + ".tracker.repair"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.repair", totalDamage); + tag.setDouble(BloodMagic.MODID + ".tracker.repair", totalDamage); } @Override @@ -105,7 +105,7 @@ public class StatTrackerRepairing extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.repair"); + return key.equals(BloodMagic.MODID + ".upgrade.repair"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java index c18f9e17..26448f93 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerSelfSacrifice extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.selfSacrifice"; + return BloodMagic.MODID + ".tracker.selfSacrifice"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerSelfSacrifice extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalSacrifices = tag.getInteger(Constants.Mod.MODID + ".tracker.selfSacrifice"); + totalSacrifices = tag.getInteger(BloodMagic.MODID + ".tracker.selfSacrifice"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.selfSacrifice", totalSacrifices); + tag.setInteger(BloodMagic.MODID + ".tracker.selfSacrifice", totalSacrifices); } @@ -106,7 +106,7 @@ public class StatTrackerSelfSacrifice extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.selfSacrifice"); + return key.equals(BloodMagic.MODID + ".upgrade.selfSacrifice"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java index b68ef8e0..7ff2a4d7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerSolarPowered extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.solarPowered"; + return BloodMagic.MODID + ".tracker.solarPowered"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerSolarPowered extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalHealthGenned = tag.getDouble(Constants.Mod.MODID + ".tracker.solarPowered"); + totalHealthGenned = tag.getDouble(BloodMagic.MODID + ".tracker.solarPowered"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.solarPowered", totalHealthGenned); + tag.setDouble(BloodMagic.MODID + ".tracker.solarPowered", totalHealthGenned); } @Override @@ -105,7 +105,7 @@ public class StatTrackerSolarPowered extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.solarPowered"); + return key.equals(BloodMagic.MODID + ".upgrade.solarPowered"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java index a3e36c19..a587a494 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -29,7 +29,7 @@ public class StatTrackerSprintAttack extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.sprintAttack"; + return BloodMagic.MODID + ".tracker.sprintAttack"; } @Override @@ -41,13 +41,13 @@ public class StatTrackerSprintAttack extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalDamageDealt = tag.getDouble(Constants.Mod.MODID + ".tracker.sprintAttack"); + totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.sprintAttack"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.sprintAttack", totalDamageDealt); + tag.setDouble(BloodMagic.MODID + ".tracker.sprintAttack", totalDamageDealt); } @Override @@ -105,7 +105,7 @@ public class StatTrackerSprintAttack extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.sprintAttack"); + return key.equals(BloodMagic.MODID + ".upgrade.sprintAttack"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java index cae6b9eb..d102438f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java @@ -5,10 +5,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -26,7 +26,7 @@ public class StatTrackerStepAssist extends StatTracker @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".tracker.stepAssist"; + return BloodMagic.MODID + ".tracker.stepAssist"; } @Override @@ -38,13 +38,13 @@ public class StatTrackerStepAssist extends StatTracker @Override public void readFromNBT(NBTTagCompound tag) { - totalMovement = tag.getDouble(Constants.Mod.MODID + ".tracker.stepAssist"); + totalMovement = tag.getDouble(BloodMagic.MODID + ".tracker.stepAssist"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setDouble(Constants.Mod.MODID + ".tracker.stepAssist", totalMovement); + tag.setDouble(BloodMagic.MODID + ".tracker.stepAssist", totalMovement); } @@ -115,7 +115,7 @@ public class StatTrackerStepAssist extends StatTracker @Override public boolean providesUpgrade(String key) { - return key.equals(Constants.Mod.MODID + ".upgrade.stepAssist"); + return key.equals(BloodMagic.MODID + ".upgrade.stepAssist"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java index 818d8a16..b5567bea 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; public class LivingArmourUpgradeArrowProtect extends LivingArmourUpgrade @@ -30,7 +30,7 @@ public class LivingArmourUpgradeArrowProtect extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.arrowProtect"; + return BloodMagic.MODID + ".upgrade.arrowProtect"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java index c85e6d05..bb447592 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; @@ -26,7 +26,7 @@ public class LivingArmourUpgradeArrowShot extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.arrowShot"; + return BloodMagic.MODID + ".upgrade.arrowShot"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java index 5a9d1fb5..039b85a1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; public class LivingArmourUpgradeCriticalStrike extends LivingArmourUpgrade @@ -39,7 +39,7 @@ public class LivingArmourUpgradeCriticalStrike extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.criticalStrike"; + return BloodMagic.MODID + ".upgrade.criticalStrike"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java index 7f545d90..059f6bd0 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java @@ -2,12 +2,12 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import java.util.HashMap; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -55,7 +55,7 @@ public class LivingArmourUpgradeDigging extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.digging"; + return BloodMagic.MODID + ".upgrade.digging"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java index 908bc3ee..2cd24cb8 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; @@ -25,7 +25,7 @@ public class LivingArmourUpgradeElytra extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.elytra"; + return BloodMagic.MODID + ".upgrade.elytra"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java index 7cab3ea4..0bf1fd38 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; @@ -22,7 +22,7 @@ public class LivingArmourUpgradeExperience extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.experienced"; + return BloodMagic.MODID + ".upgrade.experienced"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java index 39d51dc5..d5da14a8 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; @@ -30,7 +30,7 @@ public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.fallProtect"; + return BloodMagic.MODID + ".upgrade.fallProtect"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java index 634f5b3e..05f94c2e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; @@ -9,7 +10,6 @@ import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.TextHelper; public class LivingArmourUpgradeFireResist extends LivingArmourUpgrade @@ -45,7 +45,7 @@ public class LivingArmourUpgradeFireResist extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.fireResist"; + return BloodMagic.MODID + ".upgrade.fireResist"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java index 0c8796a4..34fcbc24 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; public class LivingArmourUpgradeGraveDigger extends LivingArmourUpgrade @@ -37,7 +37,7 @@ public class LivingArmourUpgradeGraveDigger extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.graveDigger"; + return BloodMagic.MODID + ".upgrade.graveDigger"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java index 7ebd95f1..1dde6181 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java @@ -1,15 +1,14 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.TextHelper; public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade @@ -41,7 +40,7 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.grimReaper"; + return BloodMagic.MODID + ".upgrade.grimReaper"; } @Override @@ -59,13 +58,13 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade @Override public void readFromNBT(NBTTagCompound tag) { - deathTimer = tag.getInteger(Constants.Mod.MODID + ".tracker.grimReaper"); + deathTimer = tag.getInteger(BloodMagic.MODID + ".tracker.grimReaper"); } @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.grimReaper", deathTimer); + tag.setInteger(BloodMagic.MODID + ".tracker.grimReaper", deathTimer); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java index 78a4b71b..ee231a07 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; @@ -44,7 +44,7 @@ public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.health"; + return BloodMagic.MODID + ".upgrade.health"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java index 0b317a1e..876a94f3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -26,7 +26,7 @@ public class LivingArmourUpgradeJump extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.jump"; + return BloodMagic.MODID + ".upgrade.jump"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java index 430fe22f..461b7e04 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -42,7 +42,7 @@ public class LivingArmourUpgradeKnockbackResist extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.knockback"; + return BloodMagic.MODID + ".upgrade.knockback"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java index cd228a13..44ed0210 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; @@ -44,7 +44,7 @@ public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.meleeDamage"; + return BloodMagic.MODID + ".upgrade.meleeDamage"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java index 696b3c4b..662c78fb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -55,7 +56,7 @@ public class LivingArmourUpgradeNightSight extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.nightSight"; + return BloodMagic.MODID + ".upgrade.nightSight"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java index d58094db..44fc26a9 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; @@ -19,7 +19,7 @@ public class LivingArmourUpgradePhysicalProtect extends LivingArmourUpgrade @Override public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { - if (source.getEntity() != null && !source.isMagicDamage() && !source.isProjectile()) + if (source.getTrueSource() != null && !source.isMagicDamage() && !source.isProjectile()) { return protectionLevel[this.level]; } @@ -30,7 +30,7 @@ public class LivingArmourUpgradePhysicalProtect extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.physicalProtect"; + return BloodMagic.MODID + ".upgrade.physicalProtect"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java index 080f7b68..fb4f7af1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; @@ -9,7 +10,6 @@ import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.TextHelper; public class LivingArmourUpgradePoisonResist extends LivingArmourUpgrade @@ -47,7 +47,7 @@ public class LivingArmourUpgradePoisonResist extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.poisonResist"; + return BloodMagic.MODID + ".upgrade.poisonResist"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java index 00f17e9f..ac5469fc 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -52,7 +52,7 @@ public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.repair"; + return BloodMagic.MODID + ".upgrade.repair"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java index c711a537..7bb7c94e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; @@ -23,7 +23,7 @@ public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.selfSacrifice"; + return BloodMagic.MODID + ".upgrade.selfSacrifice"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java index 5196c902..73787d8c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -7,7 +8,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -58,7 +58,7 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.solarPowered"; + return BloodMagic.MODID + ".upgrade.solarPowered"; } @Override @@ -76,13 +76,13 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade @Override public void writeToNBT(NBTTagCompound tag) { - tag.setInteger(Constants.Mod.MODID + ".tracker.solarPowered", counter); + tag.setInteger(BloodMagic.MODID + ".tracker.solarPowered", counter); } @Override public void readFromNBT(NBTTagCompound tag) { - counter = tag.getInteger(Constants.Mod.MODID + ".tracker.solarPowered"); + counter = tag.getInteger(BloodMagic.MODID + ".tracker.solarPowered"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 14ff3c55..3a2a61f5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import java.util.UUID; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; @@ -9,7 +10,6 @@ import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; @@ -72,7 +72,7 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.movement"; + return BloodMagic.MODID + ".upgrade.movement"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java index 8dd3ea30..eae1a291 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade @@ -53,7 +53,7 @@ public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.sprintAttack"; + return BloodMagic.MODID + ".upgrade.sprintAttack"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java index 9971a7cf..3b43023c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.livingArmour.upgrade; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; @@ -23,7 +24,7 @@ public class LivingArmourUpgradeStepAssist extends LivingArmourUpgrade @Override public String getUniqueIdentifier() { - return Constants.Mod.MODID + ".upgrade.stepAssist"; + return BloodMagic.MODID + ".upgrade.stepAssist"; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java index cb0e2aa0..9e929db6 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java @@ -3,15 +3,12 @@ package WayofTime.bloodmagic.meteor; import java.util.List; import java.util.Random; -import lombok.Getter; -import lombok.Setter; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.util.Utils; -@Getter public class Meteor { private static final Random RAND = new Random(); @@ -21,8 +18,6 @@ public class Meteor private final float explosionStrength; private final int radius; private final int maxWeight; - - @Setter public int version; public Meteor(ItemStack catalystStack, List components, float explosionStrength, int radius) @@ -94,4 +89,32 @@ public class Meteor 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; + } } \ 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 index 1c230eef..3c4d7e5f 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java @@ -2,9 +2,6 @@ package WayofTime.bloodmagic.meteor; import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; @@ -15,14 +12,16 @@ import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.util.Utils; -@Getter -@Setter -@AllArgsConstructor public class MeteorComponent { public int weight; public String oreName; + public MeteorComponent(int weight, String oreName) { + this.weight = weight; + this.oreName = oreName; + } + public IBlockState getStateFromOre() { if (oreName.contains(":")) @@ -60,4 +59,20 @@ public class MeteorComponent 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 index ab2bd130..b755ff3c 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -32,7 +32,7 @@ public class MeteorConfigHandler public static void handleMeteors(boolean checkNewVersion) { if (meteorDir == null) { - BloodMagic.instance.getLogger().error("Attempted to handle meteor config but the folder has not been initialized. Was this run too early?"); + BloodMagic.instance.logger.error("Attempted to handle meteor config but the folder has not been initialized. Was this run too early?"); return; } @@ -64,11 +64,13 @@ public class MeteorConfigHandler // Filter names so we can compare to defaults for (File meteorFile : meteorFiles) { - Meteor meteor = Serializers.GSON.fromJson(new FileReader(meteorFile), Meteor.class); + 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.getConfig().getBoolean("resyncOnVersionChange", "Meteors", true, "Should the default meteors be regenerated if the mod has updated them")) + if (checkNewVersion && ConfigHandler.config.getBoolean("resyncOnVersionChange", "Meteors", true, "Should the default meteors be regenerated if the mod has updated them")) { Set discoveredDefaults = Sets.newHashSet(); @@ -103,7 +105,7 @@ public class MeteorConfigHandler e.printStackTrace(); } - ConfigHandler.getConfig().save(); + ConfigHandler.config.save(); } private static List> getDefaultMeteors() diff --git a/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java b/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java index aeb1dad6..e0847590 100644 --- a/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java +++ b/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java @@ -1,17 +1,17 @@ package WayofTime.bloodmagic.network; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayerMP; 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 WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.util.ChatUtil; public class BloodMagicPacketHandler { - public static final SimpleNetworkWrapper INSTANCE = new SimpleNetworkWrapper(Constants.Mod.MODID); + public static final SimpleNetworkWrapper INSTANCE = new SimpleNetworkWrapper(BloodMagic.MODID); public static void init() { diff --git a/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java b/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java index 4cd933f4..a41c5c70 100644 --- a/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java @@ -41,7 +41,7 @@ public class KeyProcessor implements IMessage, IMessageHandler -1 && message.slot < 9) { - itemStack = ctx.getServerHandler().playerEntity.inventory.getStackInSlot(message.slot); + itemStack = ctx.getServerHandler().player.inventory.getStackInSlot(message.slot); } if (!itemStack.isEmpty()) diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index 4306fdfa..5e8fdc05 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -22,8 +22,6 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionAugmentRecipe; -import com.google.common.base.Objects; - public class BMPotionUtils { public static Random rand = new Random(); @@ -50,7 +48,7 @@ public class BMPotionUtils BlockPos blockPos = entity.getPosition().add(rand.nextInt(horizontalRadius * 2 + 1) - horizontalRadius, rand.nextInt(verticalRadius * 2 + 1) - verticalRadius, rand.nextInt(horizontalRadius * 2 + 1) - horizontalRadius); Block block = world.getBlockState(blockPos).getBlock(); - if (!BloodMagicAPI.getGreenGroveBlacklist().contains(block)) + if (!BloodMagicAPI.greenGroveBlacklist.contains(block)) { if (block instanceof IPlantable || block instanceof IGrowable) { @@ -79,7 +77,7 @@ public class BMPotionUtils if (incurredDamage > 0) { - entity.attackEntityFrom(BloodMagicAPI.getDamageSource(), (float) incurredDamage); + entity.attackEntityFrom(BloodMagicAPI.damageSource, (float) incurredDamage); } return incurredDamage; @@ -125,7 +123,7 @@ public class BMPotionUtils return stack; } else { - NBTTagCompound nbttagcompound = (NBTTagCompound) Objects.firstNonNull(stack.getTagCompound(), new NBTTagCompound()); + NBTTagCompound nbttagcompound = stack.hasTagCompound() ? stack.getTagCompound() : new NBTTagCompound(); NBTTagList nbttaglist = new NBTTagList(); for (PotionEffect potioneffect : effects) diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java b/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java index 7af491ad..892ea5de 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.potion; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.Minecraft; import net.minecraft.entity.EntityLivingBase; import net.minecraft.potion.Potion; @@ -11,9 +11,9 @@ import net.minecraftforge.fml.relauncher.SideOnly; public class PotionBloodMagic extends Potion { - public static ResourceLocation texture = new ResourceLocation(Constants.Mod.MODID, "textures/misc/potions.png"); + public static ResourceLocation texture = new ResourceLocation(BloodMagic.MODID, "textures/misc/potions.png"); - public PotionBloodMagic(String name, ResourceLocation texture, boolean badEffect, int potionColor, int iconIndexX, int iconIndexY) + public PotionBloodMagic(String name, boolean badEffect, int potionColor, int iconIndexX, int iconIndexY) { super(badEffect, potionColor); this.setPotionName(name); diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 382e81da..78421d2f 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -1,36 +1,33 @@ package WayofTime.bloodmagic.potion; import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.registry.ModPotions; +import WayofTime.bloodmagic.registry.RegistrarBloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.IProjectile; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingEvent; 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.List; +@Mod.EventBusSubscriber public class PotionEventHandlers { - public PotionEventHandlers() - { - MinecraftForge.EVENT_BUS.register(this); - } @SubscribeEvent - public void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) + public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) { - if (event.getEntityLiving().isPotionActive(ModPotions.boost)) + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { - int i = event.getEntityLiving().getActivePotionEffect(ModPotions.boost).getAmplifier(); + int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); event.getEntityLiving().motionY += (0.1f) * (2 + i); } @@ -40,7 +37,7 @@ public class PotionEventHandlers } @SubscribeEvent - public void onEntityUpdate(LivingEvent.LivingUpdateEvent event) + public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { // if (event.getEntityLiving().isPotionActive(ModPotions.boost)) // { @@ -58,7 +55,7 @@ public class PotionEventHandlers // } // } - if (event.getEntityLiving().isPotionActive(ModPotions.whirlwind)) + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.WHIRLWIND)) { int d0 = 3; AxisAlignedBB axisAlignedBB = new AxisAlignedBB(event.getEntityLiving().posX - 0.5, event.getEntityLiving().posY - 0.5, event.getEntityLiving().posZ - 0.5, event.getEntityLiving().posX + 0.5, event.getEntityLiving().posY + 0.5, event.getEntityLiving().posZ + 0.5).expand(d0, d0, d0); @@ -113,30 +110,30 @@ public class PotionEventHandlers } @SubscribeEvent - public void onPlayerRespawn(PlayerEvent.Clone event) + public static void onPlayerRespawn(PlayerEvent.Clone event) { if (event.isWasDeath()) - event.getEntityPlayer().addPotionEffect(new PotionEffect(ModPotions.soulFray, 400)); + event.getEntityPlayer().addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, 400)); } @SubscribeEvent - public void onSacrificeKnifeUsed(SacrificeKnifeUsedEvent event) + public static void onSacrificeKnifeUsed(SacrificeKnifeUsedEvent event) { - if (event.player.isPotionActive(ModPotions.soulFray)) + if (event.player.isPotionActive(RegistrarBloodMagic.SOUL_FRAY)) event.lpAdded = (int) (event.lpAdded * 0.1D); } @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onPlayerDamageEvent(LivingAttackEvent event) + public static void onPlayerDamageEvent(LivingAttackEvent event) { - if (event.getEntityLiving().isPotionActive(ModPotions.whirlwind) && event.isCancelable() && event.getSource().isProjectile()) + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.WHIRLWIND) && event.isCancelable() && event.getSource().isProjectile()) event.setCanceled(true); } @SubscribeEvent - public void onEndermanTeleportEvent(EnderTeleportEvent event) + public static void onEndermanTeleportEvent(EnderTeleportEvent event) { - if (event.getEntityLiving().isPotionActive(ModPotions.planarBinding) && event.isCancelable()) + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.PLANAR_BINDING) && event.isCancelable()) { event.setCanceled(true); } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 60cac2cc..87aa212f 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -57,8 +57,8 @@ 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.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; @@ -92,10 +92,10 @@ public class ClientProxy extends CommonProxy renderHelper = new InventoryRenderHelper(Constants.Mod.DOMAIN); renderHelperV2 = new InventoryRenderHelperV2(Constants.Mod.DOMAIN); - OBJLoader.INSTANCE.addDomain(Constants.Mod.MODID); + OBJLoader.INSTANCE.addDomain(BloodMagic.MODID); - ModBlocks.initRenders(); - ModItems.initRenders(); + RegistrarBloodMagicBlocks.initRenders(); + RegistrarBloodMagicItems.initRenders(); ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() { @@ -155,7 +155,7 @@ public class ClientProxy extends CommonProxy } return -1; } - }, ModItems.SIGIL_HOLDING); + }, RegistrarBloodMagicItems.SIGIL_HOLDING); Minecraft.getMinecraft().getItemColors().registerItemColorHandler(new IItemColor() { @Override @@ -169,7 +169,7 @@ public class ClientProxy extends CommonProxy return PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromStack(stack)); } - }, ModItems.POTION_FLASK); + }, RegistrarBloodMagicItems.POTION_FLASK); addElytraLayer(); } @@ -188,7 +188,7 @@ public class ClientProxy extends CommonProxy { IVariantProvider variantProvider = (IVariantProvider) block; for (Pair variant : variantProvider.getVariants()) - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), variant.getLeft(), new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, name), variant.getRight())); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), variant.getLeft(), new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), variant.getRight())); } } @@ -201,14 +201,14 @@ public class ClientProxy extends CommonProxy ModelLoader.setCustomMeshDefinition(item, meshProvider.getMeshDefinition()); ResourceLocation resourceLocation = meshProvider.getCustomLocation(); if (resourceLocation == null) - resourceLocation = new ResourceLocation(Constants.Mod.MODID, "item/" + name); + resourceLocation = new ResourceLocation(BloodMagic.MODID, "item/" + name); for (String variant : meshProvider.getVariants()) ModelLoader.registerItemVariants(item, new ModelResourceLocation(resourceLocation, variant)); } else if (item instanceof IVariantProvider) { IVariantProvider variantProvider = (IVariantProvider) item; for (Pair variant : variantProvider.getVariants()) - ModelLoader.setCustomModelResourceLocation(item, variant.getLeft(), new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + name), variant.getRight())); + ModelLoader.setCustomModelResourceLocation(item, variant.getLeft(), new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), variant.getRight())); } } @@ -219,11 +219,11 @@ public class ClientProxy extends CommonProxy { RenderPlayer renderPlayer = ObfuscationReflectionHelper.getPrivateValue(RenderManager.class, renderManager, "playerRenderer", "field_178637_m"); renderPlayer.addLayer(new LayerBloodElytra(renderPlayer)); - BloodMagic.instance.getLogger().info("Elytra layer added"); + BloodMagic.instance.logger.info("Elytra layer added"); } catch (Exception e) { - BloodMagic.instance.getLogger().error("Failed to set custom Elytra Layer for Elytra Living Armour Upgrade."); - BloodMagic.instance.getLogger().error(e.getLocalizedMessage()); + BloodMagic.instance.logger.error("Failed to set custom Elytra Layer for Elytra Living Armour Upgrade."); + BloodMagic.instance.logger.error(e.getLocalizedMessage()); } } diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index d3aef56e..bc8e601b 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -91,7 +91,7 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe outputStack.setTagCompound(new NBTTagCompound()); } - outputStack.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(dyeColor.getMapColor().colorValue)); + outputStack.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(dyeColor.getColorValue())); return outputStack; } diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java index f10586cb..9b0c084f 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java @@ -7,7 +7,7 @@ import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionUtils; import WayofTime.bloodmagic.potion.BMPotionUtils; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { @@ -60,7 +60,7 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { if (inputStack == null) { - ItemStack outputStack = new ItemStack(ModItems.POTION_FLASK); + ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); List effectList = new ArrayList(); int potionLength = wantedPotion.isInstant() ? 1 : BMPotionUtils.getAugmentedLength(baseEffect.getDuration(), lengthAugment, powerAugment - baseEffect.getAmplifier()); @@ -95,7 +95,7 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe public static ItemStack getAugmentedPotionFlask(PotionEffect baseEffect) { - ItemStack outputStack = new ItemStack(ModItems.POTION_FLASK); + ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); List effectList = new ArrayList(); effectList.add(baseEffect); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index 23e24887..c1cdb1bc 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -9,11 +9,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { - public static final ItemStack basePotionFlaskStack = new ItemStack(ModItems.POTION_FLASK, 1, OreDictionary.WILDCARD_VALUE); + public static final ItemStack basePotionFlaskStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK, 1, OreDictionary.WILDCARD_VALUE); protected PotionEffect baseEffect; public static final int temporaryMaximumEffectsOnThePotionFlaskYesThisIsALongFieldItIsJustSoIRemember = 3; @@ -50,7 +50,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe if (slot != null) { - boolean match = slot.getItem() == ModItems.POTION_FLASK; + boolean match = slot.getItem() == RegistrarBloodMagicItems.POTION_FLASK; if (match) { @@ -91,7 +91,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe } if (match) { - if (next instanceof ItemStack && ((ItemStack) next).getItem() == ModItems.POTION_FLASK) { + if (next instanceof ItemStack && ((ItemStack) next).getItem() == RegistrarBloodMagicItems.POTION_FLASK) { if (!isPotionFlaskValidInput(slot)) { break; } @@ -135,7 +135,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { if (inputStack.isEmpty()) { - ItemStack outputStack = new ItemStack(ModItems.POTION_FLASK); + ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); List effectList = new ArrayList(); effectList.add(baseEffect); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java deleted file mode 100644 index b76b8028..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java +++ /dev/null @@ -1,293 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.item.ItemBlock; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.block.BlockAlchemyArray; -import WayofTime.bloodmagic.block.BlockAlchemyTable; -import WayofTime.bloodmagic.block.BlockAltar; -import WayofTime.bloodmagic.block.BlockBloodLight; -import WayofTime.bloodmagic.block.BlockBloodRune; -import WayofTime.bloodmagic.block.BlockBloodStoneBrick; -import WayofTime.bloodmagic.block.BlockBloodTank; -import WayofTime.bloodmagic.block.BlockCrystal; -import WayofTime.bloodmagic.block.BlockDemonBase; -import WayofTime.bloodmagic.block.BlockDemonCrucible; -import WayofTime.bloodmagic.block.BlockDemonCrystal; -import WayofTime.bloodmagic.block.BlockDemonCrystallizer; -import WayofTime.bloodmagic.block.BlockDemonLight; -import WayofTime.bloodmagic.block.BlockDemonPillarBase; -import WayofTime.bloodmagic.block.BlockDemonPillarCapBase; -import WayofTime.bloodmagic.block.BlockDemonPylon; -import WayofTime.bloodmagic.block.BlockDemonStairsBase; -import WayofTime.bloodmagic.block.BlockDemonWallBase; -import WayofTime.bloodmagic.block.BlockDimensionalPortal; -import WayofTime.bloodmagic.block.BlockIncenseAltar; -import WayofTime.bloodmagic.block.BlockInputRoutingNode; -import WayofTime.bloodmagic.block.BlockInversionPillar; -import WayofTime.bloodmagic.block.BlockInversionPillarEnd; -import WayofTime.bloodmagic.block.BlockItemRoutingNode; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import WayofTime.bloodmagic.block.BlockMasterRoutingNode; -import WayofTime.bloodmagic.block.BlockMimic; -import WayofTime.bloodmagic.block.BlockOutputRoutingNode; -import WayofTime.bloodmagic.block.BlockPath; -import WayofTime.bloodmagic.block.BlockPhantom; -import WayofTime.bloodmagic.block.BlockRitualController; -import WayofTime.bloodmagic.block.BlockRitualStone; -import WayofTime.bloodmagic.block.BlockSoulForge; -import WayofTime.bloodmagic.block.BlockSpectral; -import WayofTime.bloodmagic.block.BlockTeleposer; -import WayofTime.bloodmagic.block.enums.EnumBloodRune; -import WayofTime.bloodmagic.block.enums.EnumBrickSize; -import WayofTime.bloodmagic.block.enums.EnumDemonBlock1; -import WayofTime.bloodmagic.block.enums.EnumDemonBlock2; -import WayofTime.bloodmagic.block.enums.EnumDemonBlock3; -import WayofTime.bloodmagic.block.enums.EnumInversionCap; -import WayofTime.bloodmagic.block.enums.EnumMimic; -import WayofTime.bloodmagic.block.enums.EnumPath; -import WayofTime.bloodmagic.block.enums.EnumRitualController; -import WayofTime.bloodmagic.block.enums.EnumSubWillType; -import WayofTime.bloodmagic.block.enums.EnumSubWillType1; -import WayofTime.bloodmagic.block.enums.EnumSubWillType2; -import WayofTime.bloodmagic.block.enums.EnumSubWillType3; -import WayofTime.bloodmagic.block.enums.EnumWillWall; -import WayofTime.bloodmagic.item.block.ItemBlockAlchemyTable; -import WayofTime.bloodmagic.item.block.ItemBlockBloodTank; -import WayofTime.bloodmagic.item.block.ItemBlockDemonCrystal; -import WayofTime.bloodmagic.item.block.base.ItemBlockEnum; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.tile.TileBloodTank; -import WayofTime.bloodmagic.tile.TileDemonCrucible; -import WayofTime.bloodmagic.tile.TileDemonCrystal; -import WayofTime.bloodmagic.tile.TileDemonCrystallizer; -import WayofTime.bloodmagic.tile.TileDemonPylon; -import WayofTime.bloodmagic.tile.TileDimensionalPortal; -import WayofTime.bloodmagic.tile.TileImperfectRitualStone; -import WayofTime.bloodmagic.tile.TileIncenseAltar; -import WayofTime.bloodmagic.tile.TileInversionPillar; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.tile.TileMimic; -import WayofTime.bloodmagic.tile.TilePhantomBlock; -import WayofTime.bloodmagic.tile.TilePlinth; -import WayofTime.bloodmagic.tile.TileSoulForge; -import WayofTime.bloodmagic.tile.TileSpectralBlock; -import WayofTime.bloodmagic.tile.TileTeleposer; -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 WayofTime.bloodmagic.util.helper.InventoryRenderHelper; -import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; - -public class ModBlocks -{ - public static final Block ALTAR; - public static final Block BLOOD_RUNE; - public static final Block RITUAL_CONTROLLER; - public static final Block RITUAL_STONE; - public static final Block BLOOD_LIGHT; - public static final Block TELEPOSER; - public static final Block ALCHEMY_ARRAY; - public static final Block SPECTRAL_BLOCK; - public static final Block PHANTOM_BLOCK; - public static final Block SOUL_FORGE; - public static final Block INCENSE_ALTAR; - public static final Block DEMON_CRUCIBLE; - public static final Block DEMON_PYLON; - public static final Block DEMON_CRYSTALLIZER; - public static final Block DEMON_CRYSTAL; - public static final Block ALCHEMY_TABLE; - public static final Block LIFE_ESSENCE; - public static final Block CRYSTAL; - public static final Block BLOOD_STONE; - public static final Block PATH_BLOCK; - public static final Block MASTER_ROUTING_NODE; - public static final Block INPUT_ROUTING_NODE; - public static final Block OUTPUT_ROUTING_NODE; - public static final Block ITEM_ROUTING_NODE; - public static final Block DIMENSIONAL_PORTAL; - public static final Block BLOOD_TANK; - public static final Block MIMIC; - public static final Block DEMON_BRICK_1; - public static final Block DEMON_BRICK_2; - public static final Block DEMON_EXTRAS; - public static final Block DEMON_PILLAR_1; - public static final Block DEMON_PILLAR_2; - public static final Block DEMON_PILLAR_CAP_1; - public static final Block DEMON_PILLAR_CAP_2; - public static final Block DEMON_PILLAR_CAP_3; - public static final Block DEMON_LIGHT; - public static final Block DEMON_WALL_1; - public static final Block DEMON_STAIRS_1; - public static final Block DEMON_STAIRS_2; - public static final Block DEMON_STAIRS_3; - public static final Block INVERSION_PILLAR; - public static final Block INVERSION_PILLAR_END; - - static - { - FluidRegistry.registerFluid(BlockLifeEssence.getLifeEssence()); - FluidRegistry.addBucketForFluid(BlockLifeEssence.getLifeEssence()); - LIFE_ESSENCE = registerBlock(new BlockLifeEssence(), Constants.BloodMagicBlock.LIFE_ESSENCE.getRegName()); - - ALTAR = registerBlock(new BlockAltar(), Constants.BloodMagicBlock.ALTAR.getRegName()); - BLOOD_RUNE = registerBlock(new ItemBlockEnum(new BlockBloodRune()), Constants.BloodMagicBlock.BLOOD_RUNE.getRegName()); - RITUAL_CONTROLLER = registerBlock(new ItemBlockEnum(new BlockRitualController()), Constants.BloodMagicBlock.RITUAL_CONTROLLER.getRegName()); - RITUAL_STONE = registerBlock(new ItemBlockEnum(new BlockRitualStone()), Constants.BloodMagicBlock.RITUAL_STONE.getRegName()); - BLOOD_LIGHT = registerBlock(new BlockBloodLight(), Constants.BloodMagicBlock.BLOOD_LIGHT.getRegName()); - TELEPOSER = registerBlock(new BlockTeleposer(), Constants.BloodMagicBlock.TELEPOSER.getRegName()); - ALCHEMY_ARRAY = registerBlock(new BlockAlchemyArray(), Constants.BloodMagicBlock.ALCHEMY_ARRAY.getRegName()); - SPECTRAL_BLOCK = registerBlock(new BlockSpectral(), Constants.BloodMagicBlock.SPECTRAL.getRegName()); - PHANTOM_BLOCK = registerBlock(new BlockPhantom(), Constants.BloodMagicBlock.PHANTOM.getRegName()); - SOUL_FORGE = registerBlock(new BlockSoulForge(), Constants.BloodMagicBlock.SOUL_FORGE.getRegName()); - CRYSTAL = registerBlock(new ItemBlockEnum(new BlockCrystal()), Constants.BloodMagicBlock.CRYSTAL.getRegName()); - BLOOD_STONE = registerBlock(new ItemBlockEnum(new BlockBloodStoneBrick()), Constants.BloodMagicBlock.BLOOD_STONE.getRegName()); - MASTER_ROUTING_NODE = registerBlock(new ItemBlock(new BlockMasterRoutingNode()), Constants.BloodMagicBlock.MASTER_ROUTING_NODE.getRegName()); - INPUT_ROUTING_NODE = registerBlock(new ItemBlock(new BlockInputRoutingNode()), Constants.BloodMagicBlock.INPUT_ROUTING_NODE.getRegName()); - OUTPUT_ROUTING_NODE = registerBlock(new ItemBlock(new BlockOutputRoutingNode()), Constants.BloodMagicBlock.OUTPUT_ROUTING_NODE.getRegName()); - ITEM_ROUTING_NODE = registerBlock(new ItemBlock(new BlockItemRoutingNode()), Constants.BloodMagicBlock.ITEM_ROUTING_NODE.getRegName()); - INCENSE_ALTAR = registerBlock(new BlockIncenseAltar(), Constants.BloodMagicBlock.INCENSE_ALTAR.getRegName()); - PATH_BLOCK = registerBlock(new ItemBlockEnum(new BlockPath()), Constants.BloodMagicBlock.PATH.getRegName()); - DEMON_CRUCIBLE = registerBlock(new BlockDemonCrucible(), Constants.BloodMagicBlock.DEMON_CRUCIBLE.getRegName()); - DEMON_PYLON = registerBlock(new BlockDemonPylon(), Constants.BloodMagicBlock.DEMON_PYLON.getRegName()); - DEMON_CRYSTALLIZER = registerBlock(new BlockDemonCrystallizer(), Constants.BloodMagicBlock.DEMON_CRYSTALLIZER.getRegName()); - DEMON_CRYSTAL = registerBlock(new ItemBlockDemonCrystal(new BlockDemonCrystal()), Constants.BloodMagicBlock.DEMON_CRYSTAL.getRegName()); - - ALCHEMY_TABLE = registerBlock(new ItemBlockAlchemyTable(new BlockAlchemyTable()), Constants.BloodMagicBlock.ALCHEMY_TABLE.getRegName()); - - DIMENSIONAL_PORTAL = registerBlock(new BlockDimensionalPortal(), Constants.BloodMagicBlock.DIMENSIONAL_PORTAL.getRegName()); - BLOOD_TANK = registerBlock(new ItemBlockBloodTank(new BlockBloodTank()), Constants.BloodMagicBlock.BLOOD_TANK.getRegName()); - - MIMIC = registerBlock(new ItemBlockEnum(new BlockMimic()), Constants.BloodMagicBlock.MIMIC.getRegName()); - - DEMON_BRICK_1 = registerBlock(new ItemBlockEnum(new BlockDemonBase("bricks1", EnumDemonBlock1.class)), Constants.BloodMagicBlock.DEMON_BRICK_1.getRegName()); - DEMON_BRICK_2 = registerBlock(new ItemBlockEnum(new BlockDemonBase("bricks2", EnumDemonBlock2.class)), Constants.BloodMagicBlock.DEMON_BRICK_2.getRegName()); - DEMON_EXTRAS = registerBlock(new ItemBlockEnum(new BlockDemonBase("extras", EnumDemonBlock3.class)), Constants.BloodMagicBlock.DEMON_BLOCK_EXTRA.getRegName()); - - DEMON_PILLAR_1 = registerBlock(new ItemBlockEnum(new BlockDemonPillarBase("pillar1", Material.ROCK, EnumSubWillType.class)), Constants.BloodMagicBlock.DEMON_PILLAR_1.getRegName()); - DEMON_PILLAR_2 = registerBlock(new ItemBlockEnum(new BlockDemonPillarBase("pillar2", Material.ROCK, EnumSubWillType.class)), Constants.BloodMagicBlock.DEMON_PILLAR_2.getRegName()); - DEMON_PILLAR_CAP_1 = registerBlock(new ItemBlockEnum(new BlockDemonPillarCapBase("pillarCap1", Material.ROCK, EnumSubWillType1.class)), Constants.BloodMagicBlock.DEMON_PILLAR_CAP_1.getRegName()); - DEMON_PILLAR_CAP_2 = registerBlock(new ItemBlockEnum(new BlockDemonPillarCapBase("pillarCap2", Material.ROCK, EnumSubWillType2.class)), Constants.BloodMagicBlock.DEMON_PILLAR_CAP_2.getRegName()); - DEMON_PILLAR_CAP_3 = registerBlock(new ItemBlockEnum(new BlockDemonPillarCapBase("pillarCap3", Material.ROCK, EnumSubWillType3.class)), Constants.BloodMagicBlock.DEMON_PILLAR_CAP_3.getRegName()); - - DEMON_LIGHT = registerBlock(new ItemBlockEnum(new BlockDemonLight()), Constants.BloodMagicBlock.DEMON_LIGHT.getRegName()); - - DEMON_WALL_1 = registerBlock(new ItemBlockEnum(new BlockDemonWallBase("wall1", Material.ROCK, EnumWillWall.class)), Constants.BloodMagicBlock.DEMON_WALL_1.getRegName()); - - DEMON_STAIRS_1 = registerBlock(new ItemBlockEnum(new BlockDemonStairsBase("stairs1", Material.ROCK, EnumSubWillType1.class)), Constants.BloodMagicBlock.DEMON_STAIRS_1.getRegName()); - DEMON_STAIRS_2 = registerBlock(new ItemBlockEnum(new BlockDemonStairsBase("stairs2", Material.ROCK, EnumSubWillType2.class)), Constants.BloodMagicBlock.DEMON_STAIRS_2.getRegName()); - DEMON_STAIRS_3 = registerBlock(new ItemBlockEnum(new BlockDemonStairsBase("stairs3", Material.ROCK, EnumSubWillType3.class)), Constants.BloodMagicBlock.DEMON_STAIRS_3.getRegName()); - - INVERSION_PILLAR = registerBlock(new ItemBlockEnum(new BlockInversionPillar()), Constants.BloodMagicBlock.INVERSION_PILLAR.getRegName()); - INVERSION_PILLAR_END = registerBlock(new ItemBlockEnum(new BlockInversionPillarEnd()), Constants.BloodMagicBlock.INVERSION_PILLAR_END.getRegName()); - } - - public static void init() - { - BloodMagicAPI.addToTeleposerBlacklist(INPUT_ROUTING_NODE); - BloodMagicAPI.addToTranspositionBlacklist(INPUT_ROUTING_NODE); - BloodMagicAPI.addToTeleposerBlacklist(OUTPUT_ROUTING_NODE); - BloodMagicAPI.addToTranspositionBlacklist(OUTPUT_ROUTING_NODE); - BloodMagicAPI.addToTeleposerBlacklist(ITEM_ROUTING_NODE); - BloodMagicAPI.addToTranspositionBlacklist(ITEM_ROUTING_NODE); - BloodMagicAPI.addToTeleposerBlacklist(DEMON_CRYSTAL); - BloodMagicAPI.addToTranspositionBlacklist(DEMON_CRYSTAL); - - initTiles(); - } - - public static void initTiles() - { - GameRegistry.registerTileEntity(TileAltar.class, Constants.Mod.MODID + ":" + TileAltar.class.getSimpleName()); - GameRegistry.registerTileEntity(TileImperfectRitualStone.class, Constants.Mod.MODID + ":" + TileImperfectRitualStone.class.getSimpleName()); - GameRegistry.registerTileEntity(TileMasterRitualStone.class, Constants.Mod.MODID + ":" + TileMasterRitualStone.class.getSimpleName()); - GameRegistry.registerTileEntity(TilePlinth.class, Constants.Mod.MODID + ":" + TilePlinth.class.getSimpleName()); - GameRegistry.registerTileEntity(TileAlchemyArray.class, Constants.Mod.MODID + ":" + TileAlchemyArray.class.getSimpleName()); - GameRegistry.registerTileEntity(TileSpectralBlock.class, Constants.Mod.MODID + ":" + TileSpectralBlock.class.getSimpleName()); - GameRegistry.registerTileEntity(TilePhantomBlock.class, Constants.Mod.MODID + ":" + TilePhantomBlock.class.getSimpleName()); - GameRegistry.registerTileEntity(TileTeleposer.class, Constants.Mod.MODID + ":" + TileTeleposer.class.getSimpleName()); - GameRegistry.registerTileEntity(TileSoulForge.class, Constants.Mod.MODID + ":" + TileSoulForge.class.getSimpleName()); - GameRegistry.registerTileEntity(TileMasterRoutingNode.class, Constants.Mod.MODID + ":" + TileMasterRoutingNode.class.getSimpleName()); - GameRegistry.registerTileEntity(TileInputRoutingNode.class, Constants.Mod.MODID + ":" + TileInputRoutingNode.class.getSimpleName()); - GameRegistry.registerTileEntity(TileOutputRoutingNode.class, Constants.Mod.MODID + ":" + TileOutputRoutingNode.class.getSimpleName()); - GameRegistry.registerTileEntity(TileItemRoutingNode.class, Constants.Mod.MODID + ":" + TileItemRoutingNode.class.getSimpleName()); - GameRegistry.registerTileEntity(TileIncenseAltar.class, Constants.Mod.MODID + ":" + TileIncenseAltar.class.getSimpleName()); - GameRegistry.registerTileEntity(TileDemonCrucible.class, Constants.Mod.MODID + ":" + TileDemonCrucible.class.getSimpleName()); - GameRegistry.registerTileEntity(TileDemonPylon.class, Constants.Mod.MODID + ":" + TileDemonPylon.class.getSimpleName()); - GameRegistry.registerTileEntity(TileDemonCrystallizer.class, Constants.Mod.MODID + ":" + TileDemonCrystallizer.class.getSimpleName()); - GameRegistry.registerTileEntity(TileDemonCrystal.class, Constants.Mod.MODID + ":" + TileDemonCrystal.class.getSimpleName()); - GameRegistry.registerTileEntity(TileAlchemyTable.class, Constants.Mod.MODID + ":" + TileAlchemyTable.class.getSimpleName()); - - GameRegistry.registerTileEntity(TileDimensionalPortal.class, Constants.Mod.MODID + ":" + TileDimensionalPortal.class.getSimpleName()); - GameRegistry.registerTileEntity(TileBloodTank.class, Constants.Mod.MODID + ":" + TileBloodTank.class.getSimpleName()); - GameRegistry.registerTileEntity(TileMimic.class, Constants.Mod.MODID + ":" + TileMimic.class.getSimpleName()); - GameRegistry.registerTileEntity(TileInversionPillar.class, Constants.Mod.MODID + ":" + TileInversionPillar.class.getSimpleName()); - } - - @SideOnly(Side.CLIENT) - public static void initRenders() - { - InventoryRenderHelper renderHelper = BloodMagic.proxy.getRenderHelper(); - InventoryRenderHelperV2 renderHelperV2 = BloodMagic.proxy.getRenderHelperV2(); - - renderHelper.fluidRender(LIFE_ESSENCE); - - renderHelper.itemRender(InventoryRenderHelper.getItemFromBlock(BLOOD_LIGHT)); - renderHelper.itemRender(InventoryRenderHelper.getItemFromBlock(ALCHEMY_ARRAY)); - renderHelper.itemRender(InventoryRenderHelper.getItemFromBlock(OUTPUT_ROUTING_NODE)); - renderHelper.itemRender(InventoryRenderHelper.getItemFromBlock(INPUT_ROUTING_NODE)); - renderHelper.itemRender(InventoryRenderHelper.getItemFromBlock(MASTER_ROUTING_NODE)); - renderHelper.itemRender(InventoryRenderHelper.getItemFromBlock(ITEM_ROUTING_NODE)); - renderHelper.itemRender(InventoryRenderHelper.getItemFromBlock(ALCHEMY_TABLE)); - renderHelperV2.registerRender(InventoryRenderHelper.getItemFromBlock(DEMON_CRYSTAL), 0, "ItemBlockDemonCrystal", "default"); - renderHelperV2.registerRender(InventoryRenderHelper.getItemFromBlock(DEMON_CRYSTAL), 1, "ItemBlockDemonCrystal", "corrosive"); - renderHelperV2.registerRender(InventoryRenderHelper.getItemFromBlock(DEMON_CRYSTAL), 2, "ItemBlockDemonCrystal", "destructive"); - renderHelperV2.registerRender(InventoryRenderHelper.getItemFromBlock(DEMON_CRYSTAL), 3, "ItemBlockDemonCrystal", "vengeful"); - renderHelperV2.registerRender(InventoryRenderHelper.getItemFromBlock(DEMON_CRYSTAL), 4, "ItemBlockDemonCrystal", "steadfast"); - - renderHelper.itemRender(InventoryRenderHelper.getItemFromBlock(DIMENSIONAL_PORTAL)); - } - - private static Block registerBlock(Block block, String name) - { - if (!ConfigHandler.blockBlacklist.contains(name)) - { - if (block.getRegistryName() == null) - block.setRegistryName(name); - GameRegistry.register(block); - GameRegistry.register(new ItemBlock(block).setRegistryName(name)); - BloodMagic.proxy.tryHandleBlockModel(block, name); - } - - return block; - } - - private static Block registerBlock(ItemBlock itemBlock, String name) - { - Block block = itemBlock.getBlock(); - - if (block.getRegistryName() == null) - block.setRegistryName(name); - - if (!ConfigHandler.blockBlacklist.contains(name)) - { - GameRegistry.register(block); - GameRegistry.register(itemBlock.setRegistryName(name)); - BloodMagic.proxy.tryHandleBlockModel(block, name); - } - - return block; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java b/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java deleted file mode 100644 index 17ec3bf8..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCompatibility.java +++ /dev/null @@ -1,25 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import WayofTime.bloodmagic.compat.ICompatibility; -import WayofTime.bloodmagic.compat.waila.CompatibilityWaila; -import net.minecraftforge.fml.common.Loader; - -import java.util.ArrayList; - -public class ModCompatibility -{ - private static ArrayList compatibilities = new ArrayList(); - - public static void registerModCompat() - { - compatibilities.add(new CompatibilityWaila()); -// compatibilities.add(new CompatibilityThaumcraft()); - } - - public static void loadCompat(ICompatibility.InitializationPhase phase) - { - for (ICompatibility compatibility : compatibilities) - if (Loader.isModLoaded(compatibility.getModId()) && compatibility.enableCompat()) - compatibility.loadCompatibility(phase); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java index 7e4c1cbc..00f5aa8a 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java @@ -10,9 +10,9 @@ public class ModCorruptionBlocks { for (EnumDemonWillType type : EnumDemonWillType.values()) { - CorruptionHandler.registerBlockCorruption(type, Blocks.STONE, 0, ModBlocks.DEMON_EXTRAS.getStateFromMeta(type.ordinal())); - CorruptionHandler.registerBlockCorruption(type, Blocks.GRASS, 0, ModBlocks.DEMON_EXTRAS.getStateFromMeta(type.ordinal())); - CorruptionHandler.registerBlockCorruption(type, Blocks.DIRT, 0, ModBlocks.DEMON_EXTRAS.getStateFromMeta(type.ordinal())); + 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/ModEntities.java b/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java deleted file mode 100644 index acfa88d5..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java +++ /dev/null @@ -1,34 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; -import WayofTime.bloodmagic.entity.mob.EntityMimic; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -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 net.minecraftforge.fml.common.registry.EntityRegistry; - -public class ModEntities -{ - public static void init() - { - int entities = 0; - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "BloodLight"), EntityBloodLight.class, "BloodLight", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "SoulSnare"), EntitySoulSnare.class, "SoulSnare", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "SoulArrow"), EntitySentientArrow.class, "SoulArrow", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "Meteor"), EntityMeteor.class, "Meteor", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "SentientSpecter"), EntitySentientSpecter.class, "SentientSpecter", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "Mimic"), EntityMimic.class, "Mimic", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "CorruptedZombie"), EntityCorruptedZombie.class, "CorruptedZombie", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "CorruptedSheep"), EntityCorruptedSheep.class, "CorruptedSheep", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "CorruptedChicken"), EntityCorruptedChicken.class, "CorruptedChicken", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(Constants.Mod.MODID, "CorruptedSpider"), EntityCorruptedSpider.class, "CorruptedSpider", ++entities, BloodMagic.instance, 16*4, 3, true); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java deleted file mode 100644 index 6a624790..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java +++ /dev/null @@ -1,336 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.common.util.EnumHelper; -import net.minecraftforge.fml.common.IFuelHandler; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.registry.OrbRegistry; -import WayofTime.bloodmagic.item.ItemActivationCrystal; -import WayofTime.bloodmagic.item.ItemAltarMaker; -import WayofTime.bloodmagic.item.ItemArcaneAshes; -import WayofTime.bloodmagic.item.ItemBloodOrb; -import WayofTime.bloodmagic.item.ItemBloodShard; -import WayofTime.bloodmagic.item.ItemBoundAxe; -import WayofTime.bloodmagic.item.ItemBoundPickaxe; -import WayofTime.bloodmagic.item.ItemBoundShovel; -import WayofTime.bloodmagic.item.ItemBoundSword; -import WayofTime.bloodmagic.item.ItemComponent; -import WayofTime.bloodmagic.item.ItemDaggerOfSacrifice; -import WayofTime.bloodmagic.item.ItemDemonCrystal; -import WayofTime.bloodmagic.item.ItemDemonWillGauge; -import WayofTime.bloodmagic.item.ItemExperienceBook; -import WayofTime.bloodmagic.item.ItemInscriptionTool; -import WayofTime.bloodmagic.item.ItemLavaCrystal; -import WayofTime.bloodmagic.item.ItemRitualDiviner; -import WayofTime.bloodmagic.item.ItemRitualReader; -import WayofTime.bloodmagic.item.ItemSacrificialDagger; -import WayofTime.bloodmagic.item.ItemSanguineBook; -import WayofTime.bloodmagic.item.ItemSlate; -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.item.ItemUpgradeTome; -import WayofTime.bloodmagic.item.ItemUpgradeTrainer; -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.ItemSigilAir; -import WayofTime.bloodmagic.item.sigil.ItemSigilBloodLight; -import WayofTime.bloodmagic.item.sigil.ItemSigilBounce; -import WayofTime.bloodmagic.item.sigil.ItemSigilClaw; -import WayofTime.bloodmagic.item.sigil.ItemSigilCompression; -import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; -import WayofTime.bloodmagic.item.sigil.ItemSigilElementalAffinity; -import WayofTime.bloodmagic.item.sigil.ItemSigilEnderSeverance; -import WayofTime.bloodmagic.item.sigil.ItemSigilFastMiner; -import WayofTime.bloodmagic.item.sigil.ItemSigilFrost; -import WayofTime.bloodmagic.item.sigil.ItemSigilGreenGrove; -import WayofTime.bloodmagic.item.sigil.ItemSigilHaste; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.item.sigil.ItemSigilLava; -import WayofTime.bloodmagic.item.sigil.ItemSigilMagnetism; -import WayofTime.bloodmagic.item.sigil.ItemSigilPhantomBridge; -import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; -import WayofTime.bloodmagic.item.sigil.ItemSigilSuppression; -import WayofTime.bloodmagic.item.sigil.ItemSigilTeleposition; -import WayofTime.bloodmagic.item.sigil.ItemSigilTransposition; -import WayofTime.bloodmagic.item.sigil.ItemSigilVoid; -import WayofTime.bloodmagic.item.sigil.ItemSigilWater; -import WayofTime.bloodmagic.item.sigil.ItemSigilWhirlwind; -import WayofTime.bloodmagic.item.soul.ItemMonsterSoul; -import WayofTime.bloodmagic.item.soul.ItemSentientArmourGem; -import WayofTime.bloodmagic.item.soul.ItemSentientAxe; -import WayofTime.bloodmagic.item.soul.ItemSentientBow; -import WayofTime.bloodmagic.item.soul.ItemSentientPickaxe; -import WayofTime.bloodmagic.item.soul.ItemSentientShovel; -import WayofTime.bloodmagic.item.soul.ItemSentientSword; -import WayofTime.bloodmagic.item.soul.ItemSoulGem; -import WayofTime.bloodmagic.item.soul.ItemSoulSnare; -import WayofTime.bloodmagic.item.ItemPotionFlask; -import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; - -public class ModItems -{ - public static final BloodOrb ORB_WEAK; - public static final BloodOrb ORB_APPRENTICE; - public static final BloodOrb ORB_MAGICIAN; - public static final BloodOrb ORB_MASTER; - public static final BloodOrb ORB_ARCHMAGE; - public static final BloodOrb ORB_TRANSCENDENT; - - public static final Item BLOOD_ORB; - public static final Item ACTIVATION_CRYSTAL; - public static final Item SLATE; - public static final Item INSCRIPTION_TOOL; - public static final Item SACRIFICIAL_DAGGER; - public static final Item PACK_SELF_SACRIFICE; - public static final Item PACK_SACRIFICE; - public static final Item DAGGER_OF_SACRIFICE; - public static final Item RITUAL_DIVINER; - public static final Item RITUAL_READER; - public static final Item LAVA_CRYSTAL; - public static final Item BOUND_SWORD; - public static final Item BOUND_PICKAXE; - public static final Item BOUND_AXE; - public static final Item BOUND_SHOVEL; - public static final Item SIGIL_DIVINATION; - public static final Item SIGIL_AIR; - public static final Item SIGIL_WATER; - public static final Item SIGIL_LAVA; - public static final Item SIGIL_VOID; - public static final Item SIGIL_GREEN_GROVE; - public static final Item SIGIL_BLOOD_LIGHT; - public static final Item SIGIL_ELEMENTAL_AFFINITY; - public static final Item SIGIL_HASTE; - public static final Item SIGIL_MAGNETISM; - public static final Item SIGIL_SUPPRESSION; - public static final Item SIGIL_FAST_MINER; - public static final Item SIGIL_SEER; - public static final Item SIGIL_ENDER_SEVERANCE; - public static final Item SIGIL_WHIRLWIND; - public static final Item SIGIL_PHANTOM_BRIDGE; - public static final Item SIGIL_COMPRESSION; - public static final Item SIGIL_HOLDING; - public static final Item SIGIL_TELEPOSITION; - public static final Item SIGIL_TRANSPOSITION; - public static final Item SIGIL_CLAW; - public static final Item SIGIL_BOUNCE; - public static final Item SIGIL_FROST; - public static final Item ITEM_COMPONENT; - public static final Item ITEM_DEMON_CRYSTAL; - public static final Item TELEPOSITION_FOCUS; - public static final Item EXPERIENCE_TOME; - public static final Item BLOOD_SHARD; - public static final Item LIVING_ARMOUR_HELMET; - public static final Item LIVING_ARMOUR_CHEST; - public static final Item LIVING_ARMOUR_LEGS; - public static final Item LIVING_ARMOUR_BOOTS; - public static final Item SENTIENT_ARMOUR_HELMET; - public static final Item SENTIENT_ARMOUR_CHEST; - public static final Item SENTIENT_ARMOUR_LEGS; - public static final Item SENTIENT_ARMOUR_BOOTS; - public static final Item ALTAR_MAKER; - public static final Item UPGRADE_TOME; - public static final Item UPGRADE_TRAINER; - public static final Item ARCANE_ASHES; - public static final Item MONSTER_SOUL; - public static final Item SOUL_GEM; - public static final Item SOUL_SNARE; - public static final Item SENTIENT_SWORD; - public static final Item SENTIENT_BOW; - public static final Item SENTIENT_ARMOUR_GEM; - public static final Item SENTIENT_AXE; - public static final Item SENTIENT_PICKAXE; - public static final Item SENTIENT_SHOVEL; - public static final Item NODE_ROUTER; - public static final Item BASE_ITEM_FILTER; - public static final Item BASE_FLUID_FILTER; - public static final Item CUTTING_FLUID; - public static final Item SANGUINE_BOOK; - public static final Item ITEM_POINTS_UPGRADE; - public static final Item DEMON_WILL_GAUGE; - public static final Item POTION_FLASK; - - public static final Item.ToolMaterial BOUND_TOOL_MATERIAL = EnumHelper.addToolMaterial("BoundToolMaterial", 4, 1, 10, 8, 50); - public static final Item.ToolMaterial SOUL_TOOL_MATERIAL = EnumHelper.addToolMaterial("SoulToolMaterial", 4, 520, 7, 8, 50); - - static - { - BLOOD_ORB = registerItem(new ItemBloodOrb(), Constants.BloodMagicItem.BLOOD_ORB.getRegName()); - ORB_WEAK = new BloodOrb("weak", 1, 5000); - ORB_APPRENTICE = new BloodOrb("apprentice", 2, 25000); - ORB_MAGICIAN = new BloodOrb("magician", 3, 150000); - ORB_MASTER = new BloodOrb("master", 4, 1000000); - ORB_ARCHMAGE = new BloodOrb("archmage", 5, 10000000); - ORB_TRANSCENDENT = new BloodOrb("transcendent", 6, 30000000); - - ACTIVATION_CRYSTAL = registerItem(new ItemActivationCrystal(), Constants.BloodMagicItem.ACTIVATION_CRYSTAL.getRegName()); - SLATE = registerItem(new ItemSlate(), Constants.BloodMagicItem.SLATE.getRegName()); - INSCRIPTION_TOOL = registerItem(new ItemInscriptionTool(), Constants.BloodMagicItem.INSCRIPTION_TOOL.getRegName()); - - SACRIFICIAL_DAGGER = registerItem(new ItemSacrificialDagger(), Constants.BloodMagicItem.SACRIFICIAL_DAGGER.getRegName()); - PACK_SACRIFICE = registerItem(new ItemPackSacrifice(), Constants.BloodMagicItem.SACRIFICE_PACK.getRegName()); - PACK_SELF_SACRIFICE = registerItem(new ItemPackSelfSacrifice(), Constants.BloodMagicItem.SELF_SACRIFICE_PACK.getRegName()); - DAGGER_OF_SACRIFICE = registerItem(new ItemDaggerOfSacrifice(), Constants.BloodMagicItem.DAGGER_OF_SACRIFICE.getRegName()); - - RITUAL_DIVINER = registerItem(new ItemRitualDiviner(), Constants.BloodMagicItem.RITUAL_DIVINER.getRegName()); - RITUAL_READER = registerItem(new ItemRitualReader(), Constants.BloodMagicItem.RITUAL_READER.getRegName()); - - LAVA_CRYSTAL = registerItem(new ItemLavaCrystal(), Constants.BloodMagicItem.LAVA_CRYSTAL.getRegName()); - - BOUND_SWORD = registerItem(new ItemBoundSword(), Constants.BloodMagicItem.BOUND_SWORD.getRegName()); - BOUND_PICKAXE = registerItem(new ItemBoundPickaxe(), Constants.BloodMagicItem.BOUND_PICKAXE.getRegName()); - BOUND_AXE = registerItem(new ItemBoundAxe(), Constants.BloodMagicItem.BOUND_AXE.getRegName()); - BOUND_SHOVEL = registerItem(new ItemBoundShovel(), Constants.BloodMagicItem.BOUND_SHOVEL.getRegName()); - - SIGIL_DIVINATION = registerItem(new ItemSigilDivination(), Constants.BloodMagicItem.SIGIL_DIVINATION.getRegName()); - SIGIL_AIR = registerItem(new ItemSigilAir(), Constants.BloodMagicItem.SIGIL_AIR.getRegName()); - SIGIL_WATER = registerItem(new ItemSigilWater(), Constants.BloodMagicItem.SIGIL_WATER.getRegName()); - SIGIL_LAVA = registerItem(new ItemSigilLava(), Constants.BloodMagicItem.SIGIL_LAVA.getRegName()); - SIGIL_VOID = registerItem(new ItemSigilVoid(), Constants.BloodMagicItem.SIGIL_VOID.getRegName()); - SIGIL_GREEN_GROVE = registerItem(new ItemSigilGreenGrove(), Constants.BloodMagicItem.SIGIL_GREEN_GROVE.getRegName()); - SIGIL_BLOOD_LIGHT = registerItem(new ItemSigilBloodLight(), Constants.BloodMagicItem.SIGIL_BLOOD_LIGHT.getRegName()); - SIGIL_ELEMENTAL_AFFINITY = registerItem(new ItemSigilElementalAffinity(), Constants.BloodMagicItem.SIGIL_ELEMENTAL_AFFINITY.getRegName()); - SIGIL_MAGNETISM = registerItem(new ItemSigilMagnetism(), Constants.BloodMagicItem.SIGIL_MAGNETISM.getRegName()); - SIGIL_SUPPRESSION = registerItem(new ItemSigilSuppression(), Constants.BloodMagicItem.SIGIL_SUPPRESION.getRegName()); - SIGIL_HASTE = registerItem(new ItemSigilHaste(), Constants.BloodMagicItem.SIGIL_HASTE.getRegName()); - SIGIL_FAST_MINER = registerItem(new ItemSigilFastMiner(), Constants.BloodMagicItem.SIGIL_FAST_MINER.getRegName()); - SIGIL_SEER = registerItem(new ItemSigilSeer(), Constants.BloodMagicItem.SIGIL_SEER.getRegName()); - SIGIL_PHANTOM_BRIDGE = registerItem(new ItemSigilPhantomBridge(), Constants.BloodMagicItem.SIGIL_PHANTOM_BRIDGE.getRegName()); - SIGIL_WHIRLWIND = registerItem(new ItemSigilWhirlwind(), Constants.BloodMagicItem.SIGIL_WHIRLWIND.getRegName()); - SIGIL_COMPRESSION = registerItem(new ItemSigilCompression(), Constants.BloodMagicItem.SIGIL_COMPRESSION.getRegName()); - SIGIL_ENDER_SEVERANCE = registerItem(new ItemSigilEnderSeverance(), Constants.BloodMagicItem.SIGIL_ENDER_SEVERANCE.getRegName()); - SIGIL_HOLDING = registerItem(new ItemSigilHolding(), Constants.BloodMagicItem.SIGIL_HOLDING.getRegName()); - - SIGIL_TELEPOSITION = registerItem(new ItemSigilTeleposition(), Constants.BloodMagicItem.SIGIL_TELEPOSITION.getRegName()); - SIGIL_TRANSPOSITION = registerItem(new ItemSigilTransposition(), Constants.BloodMagicItem.SIGIL_TRANSPOSITION.getRegName()); - - SIGIL_CLAW = registerItem(new ItemSigilClaw(), Constants.BloodMagicItem.SIGIL_CLAW.getRegName()); - SIGIL_BOUNCE = registerItem(new ItemSigilBounce(), Constants.BloodMagicItem.SIGIL_BOUNCE.getRegName()); - SIGIL_FROST = registerItem(new ItemSigilFrost(), Constants.BloodMagicItem.SIGIL_FROST.getRegName()); - - ITEM_COMPONENT = registerItem(new ItemComponent(), Constants.BloodMagicItem.COMPONENT.getRegName()); - ITEM_DEMON_CRYSTAL = registerItem(new ItemDemonCrystal(), Constants.BloodMagicItem.DEMON_CRYSTAL.getRegName()); - TELEPOSITION_FOCUS = registerItem(new ItemTelepositionFocus(), Constants.BloodMagicItem.TELEPOSITION_FOCUS.getRegName()); - EXPERIENCE_TOME = registerItem(new ItemExperienceBook(), Constants.BloodMagicItem.EXPERIENCE_TOME.getRegName()); - - BLOOD_SHARD = registerItem(new ItemBloodShard(), Constants.BloodMagicItem.BLOOD_SHARD.getRegName()); - - LIVING_ARMOUR_HELMET = registerItem(new ItemLivingArmour(EntityEquipmentSlot.HEAD), "ItemLivingArmourHelmet"); - LIVING_ARMOUR_CHEST = registerItem(new ItemLivingArmour(EntityEquipmentSlot.CHEST), "ItemLivingArmourChest"); - LIVING_ARMOUR_LEGS = registerItem(new ItemLivingArmour(EntityEquipmentSlot.LEGS), "ItemLivingArmourLegs"); - LIVING_ARMOUR_BOOTS = registerItem(new ItemLivingArmour(EntityEquipmentSlot.FEET), "ItemLivingArmourBoots"); - - SENTIENT_ARMOUR_HELMET = registerItem(new ItemSentientArmour(EntityEquipmentSlot.HEAD), "ItemSentientArmourHelmet"); - SENTIENT_ARMOUR_CHEST = registerItem(new ItemSentientArmour(EntityEquipmentSlot.CHEST), "ItemSentientArmourChest"); - SENTIENT_ARMOUR_LEGS = registerItem(new ItemSentientArmour(EntityEquipmentSlot.LEGS), "ItemSentientArmourLegs"); - SENTIENT_ARMOUR_BOOTS = registerItem(new ItemSentientArmour(EntityEquipmentSlot.FEET), "ItemSentientArmourBoots"); - - ALTAR_MAKER = registerItem(new ItemAltarMaker(), Constants.BloodMagicItem.ALTAR_MAKER.getRegName()); - UPGRADE_TOME = registerItem(new ItemUpgradeTome(), Constants.BloodMagicItem.UPGRADE_TOME.getRegName()); - UPGRADE_TRAINER = registerItem(new ItemUpgradeTrainer(), Constants.BloodMagicItem.UPGRADE_TRAINER.getRegName()); - - ARCANE_ASHES = registerItem(new ItemArcaneAshes(), Constants.BloodMagicItem.ARCANE_ASHES.getRegName()); - MONSTER_SOUL = registerItem(new ItemMonsterSoul(), Constants.BloodMagicItem.MONSTER_SOUL.getRegName()); - SOUL_GEM = registerItem(new ItemSoulGem(), Constants.BloodMagicItem.SOUL_GEM.getRegName()); - SOUL_SNARE = registerItem(new ItemSoulSnare(), Constants.BloodMagicItem.SOUL_SNARE.getRegName()); - - SENTIENT_SWORD = registerItem(new ItemSentientSword(), Constants.BloodMagicItem.SENTIENT_SWORD.getRegName()); - SENTIENT_BOW = registerItem(new ItemSentientBow(), Constants.BloodMagicItem.SENTIENT_BOW.getRegName()); - SENTIENT_ARMOUR_GEM = registerItem(new ItemSentientArmourGem(), Constants.BloodMagicItem.SENTIENT_ARMOR_GEM.getRegName()); - SENTIENT_AXE = registerItem(new ItemSentientAxe(), Constants.BloodMagicItem.SENTIENT_AXE.getRegName()); - SENTIENT_PICKAXE = registerItem(new ItemSentientPickaxe(), Constants.BloodMagicItem.SENTIENT_PICKAXE.getRegName()); - SENTIENT_SHOVEL = registerItem(new ItemSentientShovel(), Constants.BloodMagicItem.SENTIENT_SHOVEL.getRegName()); - - NODE_ROUTER = registerItem(new ItemNodeRouter(), Constants.BloodMagicItem.NODE_ROUTER.getRegName()); - BASE_ITEM_FILTER = registerItem(new ItemRouterFilter(), Constants.BloodMagicItem.ROUTER_FILTER.getRegName()); - BASE_FLUID_FILTER = registerItem(new ItemFluidRouterFilter(), Constants.BloodMagicItem.FLUID_ROUTER_FILTER.getRegName()); - - CUTTING_FLUID = registerItem(new ItemCuttingFluid(), Constants.BloodMagicItem.CUTTING_FLUID.getRegName()); - - SANGUINE_BOOK = registerItem(new ItemSanguineBook(), Constants.BloodMagicItem.SANGUINE_BOOK.getRegName()); - - ITEM_POINTS_UPGRADE = registerItem(new ItemLivingArmourPointsUpgrade(), Constants.BloodMagicItem.ARMOUR_POINTS_UPGRADE.getRegName()); - - DEMON_WILL_GAUGE = registerItem(new ItemDemonWillGauge(), Constants.BloodMagicItem.DEMON_WILL_GAUGE.getRegName()); - - POTION_FLASK = registerItem(new ItemPotionFlask(), Constants.BloodMagicItem.POTION_FLASK.getRegName()); - } - - public static void init() - { - OrbRegistry.registerOrb(ORB_WEAK); - OrbRegistry.registerOrb(ORB_APPRENTICE); - OrbRegistry.registerOrb(ORB_MAGICIAN); - OrbRegistry.registerOrb(ORB_MASTER); - OrbRegistry.registerOrb(ORB_ARCHMAGE); - OrbRegistry.registerOrb(ORB_TRANSCENDENT); - - GameRegistry.registerFuelHandler((IFuelHandler) LAVA_CRYSTAL); - } - - @SideOnly(Side.CLIENT) - public static void initRenders() - { - InventoryRenderHelper renderHelper = BloodMagic.proxy.getRenderHelper(); - - final ResourceLocation holdingLoc = new ResourceLocation("bloodmagic", "item/ItemSigilHolding"); - ModelLoader.setCustomMeshDefinition(SIGIL_HOLDING, new ItemMeshDefinition() - { - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.COLOR)) - return new ModelResourceLocation(holdingLoc, "type=color"); - return new ModelResourceLocation(holdingLoc, "type=normal"); - } - }); - ModelLoader.registerItemVariants(SIGIL_HOLDING, new ModelResourceLocation(holdingLoc, "type=normal")); - ModelLoader.registerItemVariants(SIGIL_HOLDING, new ModelResourceLocation(holdingLoc, "type=color")); - - renderHelper.itemRenderAll(BLOOD_ORB); - OrbRegistry.registerOrbTexture(ORB_WEAK, new ResourceLocation(Constants.Mod.DOMAIN + "ItemBloodOrbWeak")); - OrbRegistry.registerOrbTexture(ORB_APPRENTICE, new ResourceLocation(Constants.Mod.DOMAIN + "ItemBloodOrbApprentice")); - OrbRegistry.registerOrbTexture(ORB_MAGICIAN, new ResourceLocation(Constants.Mod.DOMAIN + "ItemBloodOrbMagician")); - OrbRegistry.registerOrbTexture(ORB_MASTER, new ResourceLocation(Constants.Mod.DOMAIN + "ItemBloodOrbMaster")); - OrbRegistry.registerOrbTexture(ORB_ARCHMAGE, new ResourceLocation(Constants.Mod.DOMAIN + "ItemBloodOrbArchmage")); - OrbRegistry.registerOrbTexture(ORB_TRANSCENDENT, new ResourceLocation(Constants.Mod.DOMAIN + "ItemBloodOrbTranscendent")); - - renderHelper.itemRender(SENTIENT_BOW, 0, "ItemSentientBow"); -// renderHelper.itemRender(sentientBow, 1, "ItemSentientBow_pulling_0"); -// renderHelper.itemRender(sentientBow, 2, "ItemSentientBow_pulling_1"); -// renderHelper.itemRender(sentientBow, 3, "ItemSentientBow_pulling_2"); - - renderHelper.itemRender(SENTIENT_ARMOUR_GEM, 0, "ItemSentientArmourGem0"); - renderHelper.itemRender(SENTIENT_ARMOUR_GEM, 1, "ItemSentientArmourGem1"); - } - - private static Item registerItem(Item item, String name) - { - if (!ConfigHandler.itemBlacklist.contains(name)) - { - if (item.getRegistryName() == null) - item.setRegistryName(name); - GameRegistry.register(item); - BloodMagic.proxy.tryHandleItemModel(item, name); - } - - return item; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModPotions.java b/src/main/java/WayofTime/bloodmagic/registry/ModPotions.java deleted file mode 100644 index 915b5037..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModPotions.java +++ /dev/null @@ -1,68 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import net.minecraft.potion.Potion; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.GameRegistry; -import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.potion.PotionBloodMagic; -import WayofTime.bloodmagic.potion.PotionEventHandlers; - -public class ModPotions -{ - public static Potion drowning; - public static Potion boost; - public static Potion heavyHeart; - public static Potion whirlwind; - public static Potion planarBinding; - public static Potion soulSnare; - public static Potion soulFray; - public static Potion fireFuse; - public static Potion constrict; - public static Potion plantLeech; - public static Potion deafness; - - public static Potion bounce; - public static Potion cling; - public static Potion sacrificialLamb; - - public static void init() - { - new PotionEventHandlers(); - - // TODO FUTURE MAKE POTION TEXTURES - - // final String resourceLocation = Constants.Mod.MODID + - // ":textures/potions/"; - - // drowning = new PotionBloodMagic("Drowning", new - // ResourceLocation(resourceLocation + - // drowning.getName().toLowerCase()), true, 0, 0, 0); - boost = registerPotion("Boost", new ResourceLocation("boost"), false, 0xFFFFFF, 0, 1); - // new ResourceLocation(resourceLocation + - // boost.getName().toLowerCase()) - - whirlwind = registerPotion("Whirlwind", new ResourceLocation("whirlwind"), false, 0, 1, 0); - planarBinding = registerPotion("Planar Binding", new ResourceLocation("planarBinding"), false, 0, 2, 0); - soulSnare = registerPotion("Soul Snare", new ResourceLocation("soulSnare"), false, 0xFFFFFF, 3, 0); - soulFray = registerPotion("Soul Fray", new ResourceLocation("soulFray"), true, 0xFFFFFF, 4, 0); - PlayerSacrificeHelper.soulFrayId = soulFray; - - fireFuse = registerPotion("Fire Fuse", new ResourceLocation("fireFuse"), true, 0xFF3333, 5, 0); - constrict = registerPotion("Constriction", new ResourceLocation("constrict"), true, 0x000000, 6, 0); - plantLeech = registerPotion("Plant Leech", new ResourceLocation("plantLeech"), true, 0x000000, 7, 0); - deafness = registerPotion("Deaf", new ResourceLocation("deafness"), true, 0x000000, 0, 1); - bounce = registerPotion("Bounce", new ResourceLocation("bounce"), false, 0x000000, 1, 1); - cling = registerPotion("Cling", new ResourceLocation("cling"), false, 0x000000, 2, 1); - sacrificialLamb = registerPotion("S. Lamb", new ResourceLocation("lamb"), false, 0x000000, 3, 1); - // heavyHeart = new PotionBloodMagic("Heavy Heart", new - // ResourceLocation(resourceLocation + - // heavyHeart.getName().toLowerCase()), true, 0, 0, 0); - } - - protected static Potion registerPotion(String name, ResourceLocation location, boolean badEffect, int potionColour, int x, int y) - { - Potion potion = new PotionBloodMagic(name, location, badEffect, potionColour, x, y); - GameRegistry.register(potion.setRegistryName(location.getResourcePath())); - return potion; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index b059e375..998a7c07 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -1,15 +1,23 @@ package WayofTime.bloodmagic.registry; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.*; import java.util.Map.Entry; +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.block.enums.EnumBloodRune; +import WayofTime.bloodmagic.item.soul.ItemSoulGem; import WayofTime.bloodmagic.tile.TileBloodTank; +import com.google.common.collect.ImmutableMap; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.init.MobEffects; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.potion.PotionEffect; @@ -19,9 +27,6 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.oredict.RecipeSorter; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; import org.apache.commons.lang3.tuple.Pair; @@ -33,15 +38,11 @@ import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectMovement; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSigil; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSkeletonTurret; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectUpdraft; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.EnumAltarTier; import WayofTime.bloodmagic.api.compress.CompressionRegistry; import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.recipe.AlchemyTableCustomRecipe; -import WayofTime.bloodmagic.api.recipe.ShapedBloodOrbRecipe; -import WayofTime.bloodmagic.api.recipe.ShapelessBloodOrbRecipe; import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; @@ -49,7 +50,6 @@ import WayofTime.bloodmagic.api.registry.LivingArmourDowngradeRecipeRegistry; import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.block.enums.EnumBloodRune; import WayofTime.bloodmagic.client.render.alchemyArray.AttractorAlchemyCircleRenderer; import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; import WayofTime.bloodmagic.client.render.alchemyArray.DualAlchemyCircleRenderer; @@ -62,7 +62,6 @@ import WayofTime.bloodmagic.item.ItemComponent; import WayofTime.bloodmagic.item.ItemDemonCrystal; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; -import WayofTime.bloodmagic.item.soul.ItemSoulGem; import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeBattleHungry; import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeCrippledArm; import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeDigSlowdown; @@ -85,9 +84,6 @@ public class ModRecipes public static void init() { - RecipeSorter.register(Constants.Mod.DOMAIN + "shapedorb", ShapedBloodOrbRecipe.class, RecipeSorter.Category.SHAPED, "before:minecraft:shapeless"); - RecipeSorter.register(Constants.Mod.DOMAIN + "shapelessorb", ShapelessBloodOrbRecipe.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); - initOreDict(); addFurnaceRecipes(); addCraftingRecipes(); @@ -115,118 +111,118 @@ public class ModRecipes public static void addCraftingRecipes() { - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.SOUL_FORGE), "i i", "sgs", "sos", 'i', "ingotIron", 's', "stone", 'g', "ingotGold", 'o', "blockIron")); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.SACRIFICIAL_DAGGER), "aaa", " ba", "c a", 'a', "blockGlass", 'b', "ingotGold", 'c', "ingotIron")); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.ALTAR), "a a", "aba", "cdc", 'a', "stone", 'b', Blocks.FURNACE, 'c', "ingotGold", 'd', new ItemStack(ModItems.MONSTER_SOUL))); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.PACK_SELF_SACRIFICE), "aba", "cdc", "aea", 'a', "blockGlass", 'b', Items.BUCKET, 'c', Items.FLINT, 'd', Items.LEATHER_CHESTPLATE, 'e', ModItems.SLATE)); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.PACK_SACRIFICE), "aba", "cdc", "aea", 'a', "blockGlass", 'b', Items.BUCKET, 'c', "ingotIron", 'd', Items.LEATHER_CHESTPLATE, 'e', ModItems.SLATE)); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.RITUAL_DIVINER), "dfd", "ase", "dwd", 'f', EnumRuneType.FIRE.getScribeStack(), 'a', EnumRuneType.AIR.getScribeStack(), 'w', EnumRuneType.WATER.getScribeStack(), 'e', EnumRuneType.EARTH.getScribeStack(), 'd', "gemDiamond", 's', "stickWood")); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.RITUAL_DIVINER, 1, 1), " S ", "tdt", " S ", 'S', new ItemStack(ModItems.SLATE, 1, 3), 't', EnumRuneType.DUSK.getScribeStack(), 'd', new ItemStack(ModItems.RITUAL_DIVINER))); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_STONE, 4, 1), "aa", "aa", 'a', new ItemStack(ModBlocks.BLOOD_STONE))); - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.BLOOD_STONE, 16), "stone", new ItemStack(ModItems.BLOOD_SHARD))); - GameRegistry.addShapelessRecipe(new ItemStack(ModItems.ACTIVATION_CRYSTAL, 1, 1), new ItemStack(Items.NETHER_STAR), OrbRegistry.getOrbStack(ModItems.ORB_ARCHMAGE)); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.SOUL_SNARE, 4, 0), "sis", "iri", "sis", 's', "string", 'i', "ingotIron", 'r', "dustRedstone")); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE), "i i", "sgs", "sos", 'i', "ingotIron", 's', "stone", 'g', "ingotGold", 'o', "blockIron"); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.SACRIFICIAL_DAGGER), "aaa", " ba", "c a", 'a', "blockGlass", 'b', "ingotGold", 'c', "ingotIron"); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.ALTAR), "a a", "aba", "cdc", 'a', "stone", 'b', Blocks.FURNACE, 'c', "ingotGold", 'd', new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL)); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.PACK_SELF_SACRIFICE), "aba", "cdc", "aea", 'a', "blockGlass", 'b', Items.BUCKET, 'c', Items.FLINT, 'd', Items.LEATHER_CHESTPLATE, 'e', RegistrarBloodMagicItems.SLATE); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.PACK_SACRIFICE), "aba", "cdc", "aea", 'a', "blockGlass", 'b', Items.BUCKET, 'c', "ingotIron", 'd', Items.LEATHER_CHESTPLATE, 'e', RegistrarBloodMagicItems.SLATE); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER), "dfd", "ase", "dwd", 'f', EnumRuneType.FIRE.getScribeStack(), 'a', EnumRuneType.AIR.getScribeStack(), 'w', EnumRuneType.WATER.getScribeStack(), 'e', EnumRuneType.EARTH.getScribeStack(), 'd', "gemDiamond", 's', "stickWood"); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER, 1, 1), " S ", "tdt", " S ", 'S', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 't', EnumRuneType.DUSK.getScribeStack(), 'd', new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER)); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 4, 1), "aa", "aa", 'a', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK)); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 16), "stone", new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL, 1, 1), new ItemStack(Items.NETHER_STAR), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE)); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE, 4, 0), "sis", "iri", "sis", 's', "string", 'i', "ingotIron", 'r', "dustRedstone"); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_TANK), "RBR", "G G", "RRR", 'R', new ItemStack(ModBlocks.BLOOD_RUNE), 'B', ModBlocks.BLOOD_STONE, 'G', "blockGlass")); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_TANK), "RBR", "G G", "RRR", 'R', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'B', RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 'G', "blockGlass"); for (int i = 1; i < TileBloodTank.CAPACITIES.length; i++) - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_TANK, 1, i), "RBR", "T T", "RRR", 'R', new ItemStack(ModBlocks.BLOOD_RUNE), 'B', ModBlocks.BLOOD_STONE, 'T', new ItemStack(ModBlocks.BLOOD_TANK, 1, i - 1))); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_TANK, 1, i), "RBR", "T T", "RRR", 'R', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'B', RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 'T', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_TANK, 1, i - 1)); - GameRegistry.addShapelessRecipe(new ItemStack(ModItems.TELEPOSITION_FOCUS, 1, 2), new ItemStack(ModItems.TELEPOSITION_FOCUS, 1, 1), new ItemStack(ModItems.BLOOD_SHARD)); - GameRegistry.addShapelessRecipe(new ItemStack(ModItems.TELEPOSITION_FOCUS, 1, 3), new ItemStack(ModItems.TELEPOSITION_FOCUS, 1, 2), new ItemStack(ModItems.BLOOD_SHARD, 1, 1)); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.TELEPOSER), "ggg", "efe", "ggg", 'g', "ingotGold", 'e', new ItemStack(Items.ENDER_PEARL), 'f', ModItems.TELEPOSITION_FOCUS)); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 2), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 3), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 2), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 1)); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER), "ggg", "efe", "ggg", 'g', "ingotGold", 'e', new ItemStack(Items.ENDER_PEARL), 'f', RegistrarBloodMagicItems.TELEPOSITION_FOCUS); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.LAVA_CRYSTAL), "aba", "bcb", "ded", 'a', "blockGlass", 'b', Items.LAVA_BUCKET, 'c', OrbRegistry.getOrbStack(ModItems.ORB_WEAK), 'd', Blocks.OBSIDIAN, 'e', "gemDiamond")); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.BLOOD_RUNE), "aaa", "bcb", "aaa", 'a', "stone", 'b', ModItems.SLATE, 'c', OrbRegistry.getOrbStack(ModItems.ORB_WEAK))); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 1), "aba", "cdc", "aba", 'a', "stone", 'b', ModItems.SLATE, 'c', Items.SUGAR, 'd', new ItemStack(ModBlocks.BLOOD_RUNE))); //Speed -// GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.bloodRune, 1, 2), "aba", "cdc", "aba", 'a', "stone", 'b', ModItems.slate, 'c', Items.sugar, 'd', new ItemStack(ModBlocks.bloodRune))); //Efficiency - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 3), "aba", "cdc", "aea", 'a', "stone", 'b', new ItemStack(ModItems.SLATE, 1, 1), 'c', "ingotGold", 'd', new ItemStack(ModBlocks.BLOOD_RUNE), 'e', OrbRegistry.getOrbStack(ModItems.ORB_APPRENTICE))); //Sacrifice - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 4), "aba", "cdc", "aea", 'a', "stone", 'b', new ItemStack(ModItems.SLATE, 1, 1), 'c', "dustGlowstone", 'd', new ItemStack(ModBlocks.BLOOD_RUNE), 'e', OrbRegistry.getOrbStack(ModItems.ORB_APPRENTICE))); //Self-Sacrifice - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 5), "aba", "bcb", "ada", 'a', "stone", 'b', Items.WATER_BUCKET, 'c', new ItemStack(ModBlocks.BLOOD_RUNE), 'd', new ItemStack(ModItems.SLATE, 1, 2))); //Displacement - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 6), "aba", "bcb", "ada", 'a', "stone", 'b', Items.BUCKET, 'c', new ItemStack(ModBlocks.BLOOD_RUNE), 'd', new ItemStack(ModItems.SLATE, 1, 2))); //Capacity - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 7), "aba", "cdc", "aea", 'a', Blocks.OBSIDIAN, 'b', new ItemStack(ModItems.SLATE, 1, 3), 'c', Items.BUCKET, 'd', new ItemStack(ModBlocks.BLOOD_RUNE, 1, 6), 'e', OrbRegistry.getOrbStack(ModItems.ORB_MASTER))); //Augmented Capacity - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 8), "aba", "cdc", "aba", 'a', "stone", 'b', OrbRegistry.getOrbStack(ModItems.ORB_WEAK), 'c', new ItemStack(ModBlocks.BLOOD_RUNE), 'd', OrbRegistry.getOrbStack(ModItems.ORB_MASTER))); //Orb - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 9), "aba", "cdc", "aea", 'a', Items.BUCKET, 'b', new ItemStack(ModItems.SLATE, 1, 3), 'c', "ingotGold", 'd', new ItemStack(ModBlocks.BLOOD_RUNE, 1, 1), 'e', OrbRegistry.getOrbStack(ModItems.ORB_MASTER))); //Acceleration - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.BLOOD_RUNE, 1, 10), "RsR", "GrG", "ReR", 'G', "glowstone", 's', new ItemStack(ModItems.SLATE, 1, 3), 'R', "dustRedstone", 'r', new ItemStack(ModBlocks.BLOOD_RUNE, 1), 'e', OrbRegistry.getOrbStack(ModItems.ORB_MASTER))); //Charging - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.RITUAL_STONE, 4), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', new ItemStack(ModItems.SLATE, 1, 1), 'c', OrbRegistry.getOrbStack(ModItems.ORB_APPRENTICE))); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.RITUAL_CONTROLLER), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', ModBlocks.RITUAL_STONE, 'c', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.RITUAL_CONTROLLER, 1, 1), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', "stone", 'c', OrbRegistry.getOrbStack(ModItems.ORB_WEAK))); - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.RITUAL_CONTROLLER, 1, 2), new ItemStack(ModBlocks.RITUAL_CONTROLLER), new ItemStack(Blocks.REDSTONE_TORCH), new ItemStack(ModItems.SLATE))); - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.RITUAL_CONTROLLER), new ItemStack(ModBlocks.RITUAL_CONTROLLER, 1, 2))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL), "aba", "bcb", "ded", 'a', "blockGlass", 'b', Items.LAVA_BUCKET, 'c', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), 'd', Blocks.OBSIDIAN, 'e', "gemDiamond")); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), "aaa", "bcb", "aaa", 'a', "stone", 'b', RegistrarBloodMagicItems.SLATE, 'c', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK))); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1), "aba", "cdc", "aba", 'a', "stone", 'b', RegistrarBloodMagicItems.SLATE, 'c', Items.SUGAR, 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE)); //Speed +// addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.bloodRune, 1, 2), "aba", "cdc", "aba", 'a', "stone", 'b', RegistrarBloodMagicItems.slate, 'c', Items.sugar, 'd', new ItemStack(RegistrarBloodMagicBlocks.bloodRune))); //Efficiency +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3), "aba", "cdc", "aea", 'a', "stone", 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), 'c', "ingotGold", 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_APPRENTICE))); //Sacrifice +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4), "aba", "cdc", "aea", 'a', "stone", 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), 'c', "dustGlowstone", 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_APPRENTICE))); //Self-Sacrifice + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 5), "aba", "bcb", "ada", 'a', "stone", 'b', Items.WATER_BUCKET, 'c', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'd', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); //Displacement + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 6), "aba", "bcb", "ada", 'a', "stone", 'b', Items.BUCKET, 'c', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'd', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); //Capacity +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 7), "aba", "cdc", "aea", 'a', Blocks.OBSIDIAN, 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 'c', Items.BUCKET, 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 6), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); //Augmented Capacity +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 8), "aba", "cdc", "aba", 'a', "stone", 'b', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), 'c', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'd', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); //Orb +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 9), "aba", "cdc", "aea", 'a', Items.BUCKET, 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 'c', "ingotGold", 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); //Acceleration +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 10), "RsR", "GrG", "ReR", 'G', "glowstone", 's', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 'R', "dustRedstone", 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); //Charging +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE, 4), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), 'c', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_APPRENTICE))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', RegistrarBloodMagicBlocks.RITUAL_STONE, 'c', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 1), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', "stone", 'c', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK))); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), new ItemStack(Blocks.REDSTONE_TORCH), new ItemStack(RegistrarBloodMagicItems.SLATE)); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 2)); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.BASE_ITEM_FILTER, 1, 0), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "blockGlass", 's', "stickWood")); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.BASE_ITEM_FILTER, 1, 1), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyeYellow", 's', "stickWood")); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.BASE_ITEM_FILTER, 1, 2), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyeGreen", 's', "stickWood")); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.BASE_ITEM_FILTER, 1, 3), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyePurple", 's', "stickWood")); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.BASE_ITEM_FILTER, 1, 0), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "blockGlass", 's', "stickWood"); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.BASE_ITEM_FILTER, 1, 1), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyeYellow", 's', "stickWood"); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.BASE_ITEM_FILTER, 1, 2), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyeGreen", 's', "stickWood"); + addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.BASE_ITEM_FILTER, 1, 3), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyePurple", 's', "stickWood"); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.UPGRADE_TRAINER), "ngn", "ioi", "ngn", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MASTER), 'i', "ingotIron", 'n', "nuggetGold", 'g', "ingotGold")); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicItems.UPGRADE_TRAINER), "ngn", "ioi", "ngn", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), 'i', "ingotIron", 'n', "nuggetGold", 'g', "ingotGold")); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.INCENSE_ALTAR), "s s", "shs", "coc", 'o', OrbRegistry.getOrbStack(ModItems.ORB_WEAK), 's', "stone", 'c', "cobblestone", 'h', new ItemStack(Items.COAL, 1, 1))); - GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 0), "plankWood", "plankWood", "plankWood", "plankWood", OrbRegistry.getOrbStack(ModItems.ORB_APPRENTICE))); - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 1), new ItemStack(ModBlocks.PATH_BLOCK, 1, 0), new ItemStack(ModBlocks.PATH_BLOCK, 1, 0), new ItemStack(ModBlocks.PATH_BLOCK, 1, 0), new ItemStack(ModBlocks.PATH_BLOCK, 1, 0))); - GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 2), "stone", "stone", "stone", "stone", OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 3), new ItemStack(ModBlocks.PATH_BLOCK, 1, 2), new ItemStack(ModBlocks.PATH_BLOCK, 1, 2), new ItemStack(ModBlocks.PATH_BLOCK, 1, 2), new ItemStack(ModBlocks.PATH_BLOCK, 1, 2))); - GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 4), new ItemStack(ModBlocks.PATH_BLOCK, 1, 2), new ItemStack(ModBlocks.PATH_BLOCK, 1, 2), new ItemStack(ModBlocks.PATH_BLOCK, 1, 2), new ItemStack(ModBlocks.PATH_BLOCK, 1, 2), OrbRegistry.getOrbStack(ModItems.ORB_MASTER))); - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 5), new ItemStack(ModBlocks.PATH_BLOCK, 1, 4), new ItemStack(ModBlocks.PATH_BLOCK, 1, 4), new ItemStack(ModBlocks.PATH_BLOCK, 1, 4), new ItemStack(ModBlocks.PATH_BLOCK, 1, 4))); - GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 6), Blocks.OBSIDIAN, Blocks.OBSIDIAN, Blocks.OBSIDIAN, Blocks.OBSIDIAN, OrbRegistry.getOrbStack(ModItems.ORB_ARCHMAGE))); - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.PATH_BLOCK, 4, 7), new ItemStack(ModBlocks.PATH_BLOCK, 1, 6), new ItemStack(ModBlocks.PATH_BLOCK, 1, 6), new ItemStack(ModBlocks.PATH_BLOCK, 1, 6), new ItemStack(ModBlocks.PATH_BLOCK, 1, 6))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.INCENSE_ALTAR), "s s", "shs", "coc", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), 's', "stone", 'c', "cobblestone", 'h', new ItemStack(Items.COAL, 1, 1))); +// GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 0), "plankWood", "plankWood", "plankWood", "plankWood", OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE))); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 1), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0)); +// GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 2), "stone", "stone", "stone", "stone", OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN))); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 3), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2)); +// GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 4), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 5), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 4), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 4), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 4), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 4)); +// GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 6), Blocks.OBSIDIAN, Blocks.OBSIDIAN, Blocks.OBSIDIAN, Blocks.OBSIDIAN, OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE))); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 7), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 6), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 6), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 6), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 6)); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.EXPERIENCE_TOME), "ses", "lbl", "gog", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN), 'e', Blocks.LAPIS_BLOCK, 'l', new ItemStack(ModItems.SLATE, 1, 2), 'b', Items.ENCHANTED_BOOK, 's', "string", 'g', "ingotGold")); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.RITUAL_READER), "gog", "isi", " s ", 's', new ItemStack(ModItems.SLATE, 1, 3), 'g', "blockGlass", 'i', "ingotGold", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MASTER))); - - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.ALCHEMY_TABLE), "sss", "wbw", "gog", 's', "stone", 'w', "plankWood", 'b', Items.BLAZE_ROD, 'g', "ingotGold", 'o', OrbRegistry.getOrbStack(ModItems.ORB_WEAK))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicItems.EXPERIENCE_TOME), "ses", "lbl", "gog", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), 'e', Blocks.LAPIS_BLOCK, 'l', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), 'b', Items.ENCHANTED_BOOK, 's', "string", 'g', "ingotGold")); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicItems.RITUAL_READER), "gog", "isi", " s ", 's', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 'g', "blockGlass", 'i', "ingotGold", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); +// +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.ALCHEMY_TABLE), "sss", "wbw", "gog", 's', "stone", 'w', "plankWood", 'b', Items.BLAZE_ROD, 'g', "ingotGold", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_WEAK))); for (int i = 1; i < EnumBloodRune.values().length; i++) - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModBlocks.BLOOD_RUNE), new ItemStack(ModBlocks.BLOOD_RUNE, 1, i))); + addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, i)); for (int i = 0; i < ItemSoulGem.names.length; i++) { - for (int j = 0; j < ItemDemonCrystal.getNames().size(); j++) + for (int j = 0; j < ItemDemonCrystal.NAMES.size(); j++) { - ItemStack baseGemStack = new ItemStack(ModItems.SOUL_GEM, 1, i); - ItemStack newGemStack = new ItemStack(ModItems.SOUL_GEM, 1, i); + ItemStack baseGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); + ItemStack newGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); - ItemStack crystalStack = new ItemStack(ModItems.ITEM_DEMON_CRYSTAL, 1, j); + ItemStack crystalStack = new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, j); - ((ItemSoulGem) ModItems.SOUL_GEM).setCurrentType(((ItemDemonCrystal) ModItems.ITEM_DEMON_CRYSTAL).getType(crystalStack), newGemStack); - GameRegistry.addShapelessRecipe(newGemStack, baseGemStack, crystalStack); + ((ItemSoulGem) RegistrarBloodMagicItems.SOUL_GEM).setCurrentType(((ItemDemonCrystal) RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL).getType(crystalStack), newGemStack); + addShapelessRecipe(newGemStack, baseGemStack, crystalStack); } } - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 4, 0), "b b", " r ", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 4, 1), "bsb", "srs", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 's', "stone", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 4, 2), "bsb", "srs", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 's', "blockGlass", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); - GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.MIMIC, 2, 3), "bnb", "trt", "bob", 'b', new ItemStack(ModBlocks.BLOOD_STONE), 'r', new ItemStack(ModBlocks.BLOOD_RUNE), 'n', "glowstone", 't', "torch", 'o', OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 4, 0), "b b", " r ", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 4, 1), "bsb", "srs", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 's', "stone", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 4, 2), "bsb", "srs", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 's', "blockGlass", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); +// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 2, 3), "bnb", "trt", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'n', "glowstone", 't', "torch", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); for (int i = 0; i < 5; i++) { - ItemStack crystalStack = new ItemStack(ModItems.ITEM_DEMON_CRYSTAL, 1, i); - ItemStack baseStoneStack = new ItemStack(ModBlocks.DEMON_EXTRAS, 1, i); - ItemStack baseStoneStackCrafted = new ItemStack(ModBlocks.DEMON_EXTRAS, 16, i); - ItemStack polishedStoneStack = new ItemStack(ModBlocks.DEMON_EXTRAS, 1, i + 5); - ItemStack willBrickStack = new ItemStack(ModBlocks.DEMON_BRICK_1, 1, i); - ItemStack willBrickStackCrafted = new ItemStack(ModBlocks.DEMON_BRICK_1, 4, i); + ItemStack crystalStack = new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, i); + ItemStack baseStoneStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_EXTRAS, 1, i); + ItemStack baseStoneStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_EXTRAS, 16, i); + ItemStack polishedStoneStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_EXTRAS, 1, i + 5); + ItemStack willBrickStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_1, 1, i); + ItemStack willBrickStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_1, 4, i); - ItemStack willSmallBrickStack = new ItemStack(ModBlocks.DEMON_BRICK_2, 1, i); - ItemStack willSmallBrickStackCrafted = new ItemStack(ModBlocks.DEMON_BRICK_2, 1, i); - ItemStack pillarStack = new ItemStack(ModBlocks.DEMON_PILLAR_1, 1, i); - ItemStack pillarStackCrafted = new ItemStack(ModBlocks.DEMON_PILLAR_1, 6, i); + ItemStack willSmallBrickStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_2, 1, i); + ItemStack willSmallBrickStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_2, 1, i); + ItemStack pillarStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_PILLAR_1, 1, i); + ItemStack pillarStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_PILLAR_1, 6, i); - GameRegistry.addRecipe(new ShapelessOreRecipe(baseStoneStackCrafted, crystalStack, "stone", "stone", "stone", "stone", "stone", "stone", "stone", "stone")); - GameRegistry.addRecipe(willBrickStackCrafted, "ss", "ss", 's', baseStoneStack); - GameRegistry.addRecipe(willSmallBrickStackCrafted, "ss", "ss", 's', willBrickStack); - GameRegistry.addRecipe(new ItemStack(ModBlocks.DEMON_BRICK_2, 9, i + 5), "scs", "ccc", "scs", 's', baseStoneStack, 'c', willBrickStack); - GameRegistry.addRecipe(new ItemStack(ModBlocks.DEMON_BRICK_2, 9, i + 10), "scs", "coc", "scs", 's', baseStoneStack, 'c', willBrickStack, 'o', crystalStack); - GameRegistry.addRecipe(pillarStackCrafted, "ss", "ss", "ss", 's', polishedStoneStack); - GameRegistry.addRecipe(new ItemStack(ModBlocks.DEMON_PILLAR_2, 8, i), "ppp", "pcp", "ppp", 'p', pillarStack, 'c', crystalStack); + addShapelessRecipe(baseStoneStackCrafted, crystalStack, "stone", "stone", "stone", "stone", "stone", "stone", "stone", "stone"); + addShapedRecipe(willBrickStackCrafted, "ss", "ss", 's', baseStoneStack); + addShapedRecipe(willSmallBrickStackCrafted, "ss", "ss", 's', willBrickStack); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_2, 9, i + 5), "scs", "ccc", "scs", 's', baseStoneStack, 'c', willBrickStack); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_2, 9, i + 10), "scs", "coc", "scs", 's', baseStoneStack, 'c', willBrickStack, 'o', crystalStack); + addShapedRecipe(pillarStackCrafted, "ss", "ss", "ss", 's', polishedStoneStack); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PILLAR_2, 8, i), "ppp", "pcp", "ppp", 'p', pillarStack, 'c', crystalStack); - GameRegistry.addRecipe(new ItemStack(ModBlocks.DEMON_WALL_1, 6, i), "sss", "sss", 's', willBrickStack); - GameRegistry.addRecipe(new ItemStack(ModBlocks.DEMON_WALL_1, 6, i + 5), "sss", "sss", 's', willSmallBrickStack); - GameRegistry.addRecipe(new ItemStack(ModBlocks.DEMON_WALL_1, 6, i + 10), "sss", "sss", 's', polishedStoneStack); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_WALL_1, 6, i), "sss", "sss", 's', willBrickStack); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_WALL_1, 6, i + 5), "sss", "sss", 's', willSmallBrickStack); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_WALL_1, 6, i + 10), "sss", "sss", 's', polishedStoneStack); - GameRegistry.addRecipe(new ItemStack(i < 2 ? ModBlocks.DEMON_STAIRS_1 : (i < 4 ? ModBlocks.DEMON_STAIRS_2 : ModBlocks.DEMON_STAIRS_3), 8, i % 2), "s ", "ss ", "sss", 's', polishedStoneStack); - GameRegistry.addRecipe(new ItemStack(i < 2 ? ModBlocks.DEMON_PILLAR_CAP_1 : (i < 4 ? ModBlocks.DEMON_PILLAR_CAP_2 : ModBlocks.DEMON_PILLAR_CAP_3), 6, i % 2), "sss", "sss", 's', pillarStack); + addShapedRecipe(new ItemStack(i < 2 ? RegistrarBloodMagicBlocks.DEMON_STAIRS_1 : (i < 4 ? RegistrarBloodMagicBlocks.DEMON_STAIRS_2 : RegistrarBloodMagicBlocks.DEMON_STAIRS_3), 8, i % 2), "s ", "ss ", "sss", 's', polishedStoneStack); + addShapedRecipe(new ItemStack(i < 2 ? RegistrarBloodMagicBlocks.DEMON_PILLAR_CAP_1 : (i < 4 ? RegistrarBloodMagicBlocks.DEMON_PILLAR_CAP_2 : RegistrarBloodMagicBlocks.DEMON_PILLAR_CAP_3), 6, i % 2), "sss", "sss", 's', pillarStack); - GameRegistry.addRecipe(new ItemStack(ModBlocks.DEMON_LIGHT, 5, i), "sgs", "ggg", "sgs", 's', polishedStoneStack, 'g', Blocks.GLOWSTONE); + addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_LIGHT, 5, i), "sgs", "ggg", "sgs", 's', polishedStoneStack, 'g', Blocks.GLOWSTONE); GameRegistry.addSmelting(baseStoneStack, polishedStoneStack, 0.15f); } @@ -235,81 +231,81 @@ public class ModRecipes public static void addAltarRecipes() { // ONE - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(ModItems.ORB_WEAK), EnumAltarTier.ONE, ModItems.ORB_WEAK.getCapacity(), 2, 1); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.DIAMOND), OrbRegistry.getOrbStack(ModItems.ORB_WEAK), EnumAltarTier.ONE, 2000, 2, 1)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.STONE), new ItemStack(ModItems.SLATE), EnumAltarTier.ONE, 1000, 5, 5)); + AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE, RegistrarBloodMagic.ORB_WEAK.getCapacity(), 2, 1); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.DIAMOND), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE, 2000, 2, 1)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.STONE), new ItemStack(RegistrarBloodMagicItems.SLATE), EnumAltarTier.ONE, 1000, 5, 5)); AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.BUCKET), new ItemStack(ForgeModContainer.getInstance().universalBucket), EnumAltarTier.ONE, 1000, 5, 0)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.BOOK), new ItemStack(ModItems.SANGUINE_BOOK), EnumAltarTier.ONE, 1000, 20, 0)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.BOOK), new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK), EnumAltarTier.ONE, 1000, 20, 0)); // TWO - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(ModItems.ORB_APPRENTICE), EnumAltarTier.TWO, ModItems.ORB_APPRENTICE.getCapacity(), 5, 5); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.REDSTONE_BLOCK), OrbRegistry.getOrbStack(ModItems.ORB_APPRENTICE), EnumAltarTier.TWO, 5000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(ModItems.SLATE), new ItemStack(ModItems.SLATE, 1, 1), EnumAltarTier.TWO, 2000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.IRON_SWORD), new ItemStack(ModItems.DAGGER_OF_SACRIFICE), EnumAltarTier.TWO, 3000, 5, 5)); + AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), EnumAltarTier.TWO, RegistrarBloodMagic.ORB_APPRENTICE.getCapacity(), 5, 5); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.REDSTONE_BLOCK), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), EnumAltarTier.TWO, 5000, 5, 5)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), EnumAltarTier.TWO, 2000, 5, 5)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.IRON_SWORD), new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE), EnumAltarTier.TWO, 3000, 5, 5)); // THREE - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN), EnumAltarTier.THREE, ModItems.ORB_MAGICIAN.getCapacity(), 15, 15); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.GOLD_BLOCK), OrbRegistry.getOrbStack(ModItems.ORB_MAGICIAN), EnumAltarTier.THREE, 25000, 20, 20)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(ModItems.SLATE, 1, 1), new ItemStack(ModItems.SLATE, 1, 2), EnumAltarTier.THREE, 5000, 15, 10)); + AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), EnumAltarTier.THREE, RegistrarBloodMagic.ORB_MAGICIAN.getCapacity(), 15, 15); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.GOLD_BLOCK), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), EnumAltarTier.THREE, 25000, 20, 20)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), EnumAltarTier.THREE, 5000, 15, 10)); AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.OBSIDIAN), EnumRuneType.EARTH.getScribeStack(), EnumAltarTier.THREE, 1000, 5, 5)); AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.LAPIS_BLOCK), EnumRuneType.WATER.getScribeStack(), EnumAltarTier.THREE, 1000, 5, 5)); AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.MAGMA_CREAM), EnumRuneType.FIRE.getScribeStack(), EnumAltarTier.THREE, 1000, 5, 5)); AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.GHAST_TEAR), EnumRuneType.AIR.getScribeStack(), EnumAltarTier.THREE, 1000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(ModItems.LAVA_CRYSTAL), new ItemStack(ModItems.ACTIVATION_CRYSTAL), EnumAltarTier.THREE, 10000, 20, 10)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL), new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL), EnumAltarTier.THREE, 10000, 20, 10)); // FOUR - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(ModItems.ORB_MASTER), EnumAltarTier.FOUR, ModItems.ORB_MASTER.getCapacity(), 25, 25); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(ModItems.BLOOD_SHARD), OrbRegistry.getOrbStack(ModItems.ORB_MASTER), EnumAltarTier.FOUR, 25000, 30, 50)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(ModItems.SLATE, 1, 2), new ItemStack(ModItems.SLATE, 1, 3), EnumAltarTier.FOUR, 15000, 20, 20)); + AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), EnumAltarTier.FOUR, RegistrarBloodMagic.ORB_MASTER.getCapacity(), 25, 25); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), EnumAltarTier.FOUR, 25000, 30, 50)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), EnumAltarTier.FOUR, 15000, 20, 20)); AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.COAL_BLOCK), EnumRuneType.DUSK.getScribeStack(), EnumAltarTier.FOUR, 2000, 20, 10)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.ENDER_PEARL), new ItemStack(ModItems.TELEPOSITION_FOCUS), EnumAltarTier.FOUR, 2000, 10, 10)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(ModItems.TELEPOSITION_FOCUS), new ItemStack(ModItems.TELEPOSITION_FOCUS, 1, 1), EnumAltarTier.FOUR, 10000, 20, 10)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.ENDER_PEARL), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), EnumAltarTier.FOUR, 2000, 10, 10)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), EnumAltarTier.FOUR, 10000, 20, 10)); // FIVE - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(ModItems.ORB_ARCHMAGE), EnumAltarTier.FIVE, ModItems.ORB_ARCHMAGE.getCapacity(), 50, 50); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.NETHER_STAR), OrbRegistry.getOrbStack(ModItems.ORB_ARCHMAGE), EnumAltarTier.FIVE, 80000, 50, 100)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.SLATE, 1, 4), EnumAltarTier.FIVE, 30000, 40, 100)); + AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), EnumAltarTier.FIVE, RegistrarBloodMagic.ORB_ARCHMAGE.getCapacity(), 50, 50); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.NETHER_STAR), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), EnumAltarTier.FIVE, 80000, 50, 100)); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4), EnumAltarTier.FIVE, 30000, 40, 100)); // SIX - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(ModItems.ORB_TRANSCENDENT), EnumAltarTier.SIX, ModItems.ORB_TRANSCENDENT.getCapacity(), 50, 50); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(ModBlocks.CRYSTAL), OrbRegistry.getOrbStack(ModItems.ORB_TRANSCENDENT), EnumAltarTier.SIX, 200000, 100, 200)); + AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), EnumAltarTier.SIX, RegistrarBloodMagic.ORB_TRANSCENDENT.getCapacity(), 50, 50); + AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, 2), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), EnumAltarTier.SIX, 200000, 100, 200)); AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.GLOWSTONE), EnumRuneType.DAWN.getScribeStack(), EnumAltarTier.SIX, 200000, 100, 200)); } public static void addAlchemyArrayRecipes() { - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_SWORD), new AlchemyArrayEffectBinding("boundSword", Utils.setUnbreakable(new ItemStack(ModItems.BOUND_SWORD))), new BindingAlchemyCircleRenderer()); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_AXE), new AlchemyArrayEffectBinding("boundAxe", Utils.setUnbreakable(new ItemStack(ModItems.BOUND_AXE)))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_PICKAXE), new AlchemyArrayEffectBinding("boundPickaxe", Utils.setUnbreakable(new ItemStack(ModItems.BOUND_PICKAXE)))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_SHOVEL), new AlchemyArrayEffectBinding("boundShovel", Utils.setUnbreakable(new ItemStack(ModItems.BOUND_SHOVEL)))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_HELMET), new AlchemyArrayEffectBinding("livingHelmet", new ItemStack(ModItems.LIVING_ARMOUR_HELMET))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_CHESTPLATE), new AlchemyArrayEffectBinding("livingChest", new ItemStack(ModItems.LIVING_ARMOUR_CHEST))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_LEGGINGS), new AlchemyArrayEffectBinding("livingLegs", new ItemStack(ModItems.LIVING_ARMOUR_LEGS))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_BOOTS), new AlchemyArrayEffectBinding("livingBoots", new ItemStack(ModItems.LIVING_ARMOUR_BOOTS))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_SWORD), new AlchemyArrayEffectBinding("boundSword", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD))), new BindingAlchemyCircleRenderer()); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_AXE), new AlchemyArrayEffectBinding("boundAxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_PICKAXE), new AlchemyArrayEffectBinding("boundPickaxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_SHOVEL), new AlchemyArrayEffectBinding("boundShovel", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_HELMET), new AlchemyArrayEffectBinding("livingHelmet", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_CHESTPLATE), new AlchemyArrayEffectBinding("livingChest", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_LEGGINGS), new AlchemyArrayEffectBinding("livingLegs", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_BOOTS), new AlchemyArrayEffectBinding("livingBoots", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS))); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(new ItemStack(Items.REDSTONE), new ItemStack(ModItems.SLATE), new ItemStack(ModItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(new ItemStack(Items.REDSTONE), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_WATER), new ItemStack(ModItems.SLATE), new ItemStack(ModItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_LAVA), new ItemStack(ModItems.SLATE), new ItemStack(ModItems.SIGIL_LAVA), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LavaSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AIR), new ItemStack(ModItems.SLATE, 1, 1), new ItemStack(ModItems.SIGIL_AIR), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/AirSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), new ItemStack(ModItems.SLATE, 1, 1), new ItemStack(ModItems.SIGIL_FAST_MINER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_VOID), new ItemStack(ModItems.SLATE, 1, 1), new ItemStack(ModItems.SIGIL_VOID), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/VoidSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), new ItemStack(ModItems.SLATE, 1, 1), new ItemStack(ModItems.SIGIL_GREEN_GROVE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/GrowthSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), new ItemStack(ModItems.SLATE, 1, 2), new ItemStack(ModItems.SIGIL_ELEMENTAL_AFFINITY), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ElementalAffinitySigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), new ItemStack(ModItems.SLATE, 1, 1), new ItemStack(ModItems.SIGIL_SEER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), new ItemStack(ModItems.SLATE, 1, 2), new ItemStack(ModItems.SIGIL_HOLDING), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), new ItemStack(ModItems.SLATE, 1, 2), new ItemStack(ModItems.SIGIL_BLOOD_LIGHT), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LightSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), new ItemStack(ModItems.SLATE, 1, 2), new ItemStack(ModItems.SIGIL_MAGNETISM), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MagnetismSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.SIGIL_SUPPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SuppressionSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HASTE), new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.SIGIL_HASTE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE), new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.SIGIL_PHANTOM_BRIDGE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION), new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.SIGIL_COMPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE), new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.SIGIL_ENDER_SEVERANCE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.SIGIL_TELEPOSITION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.SIGIL_TRANSPOSITION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_CLAW), new ItemStack(ModItems.SLATE, 1, 2), new ItemStack(ModItems.SIGIL_CLAW), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), new ItemStack(ModItems.SLATE, 1, 1), new ItemStack(ModItems.SIGIL_BOUNCE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FROST), new ItemStack(ModItems.SLATE, 1, 1), new ItemStack(ModItems.SIGIL_FROST), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_WATER), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_LAVA), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LavaSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AIR), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/AirSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_VOID), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/VoidSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/GrowthSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ElementalAffinitySigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LightSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MagnetismSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SuppressionSigil.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HASTE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TRANSPOSITION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_CLAW), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_CLAW), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_BOUNCE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FROST), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FROST), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); 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"))); @@ -318,7 +314,7 @@ public class ModRecipes 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(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), new ItemStack(Items.IRON_PICKAXE), new AlchemyArrayEffectSigil("fastMiner", (ISigil) ModItems.SIGIL_FAST_MINER), new SingleAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png"))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), new ItemStack(Items.IRON_PICKAXE), new AlchemyArrayEffectSigil("fastMiner", (ISigil) RegistrarBloodMagicItems.SIGIL_FAST_MINER), new SingleAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png"))); } @@ -333,32 +329,32 @@ public class ModRecipes CompressionRegistry.registerItemThreshold(new ItemStack(Blocks.COBBLESTONE), 64); stopwatch.stop(); - BloodMagic.instance.getLogger().info("Added compression recipes in {}", stopwatch); + BloodMagic.instance.logger.info("Added compression recipes in {}", stopwatch); } public static void addSoulForgeRecipes() { - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SOUL_GEM), 1, 1, "dustRedstone", "ingotGold", "blockGlass", "dyeBlue"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SOUL_GEM, 1, 1), 60, 20, new ItemStack(ModItems.SOUL_GEM), "gemDiamond", "blockRedstone", "blockLapis"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SOUL_GEM, 1, 2), 240, 50, new ItemStack(ModItems.SOUL_GEM, 1, 1), "gemDiamond", "blockGold", new ItemStack(ModItems.SLATE, 1, 2)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SOUL_GEM, 1, 3), 1000, 100, new ItemStack(ModItems.SOUL_GEM, 1, 2), new ItemStack(ModItems.SLATE, 1, 3), new ItemStack(ModItems.BLOOD_SHARD), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SOUL_GEM, 1, 4), 4000, 500, new ItemStack(ModItems.SOUL_GEM, 1, 3), Items.NETHER_STAR); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_SWORD), 0, 0, new ItemStack(ModItems.SOUL_GEM), new ItemStack(Items.IRON_SWORD)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_AXE), 0, 0, new ItemStack(ModItems.SOUL_GEM), new ItemStack(Items.IRON_AXE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_PICKAXE), 0, 0, new ItemStack(ModItems.SOUL_GEM), new ItemStack(Items.IRON_PICKAXE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_SHOVEL), 0, 0, new ItemStack(ModItems.SOUL_GEM), new ItemStack(Items.IRON_SHOVEL)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_BOW), 70, 0, new ItemStack(Items.BOW), new ItemStack(ModItems.SOUL_GEM, 1, 1), "string", "string"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.ARCANE_ASHES), 0, 0, "dustRedstone", "dyeWhite", "gunpowder", Items.COAL); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), 1, 1, "dustRedstone", "ingotGold", "blockGlass", "dyeBlue"); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), 60, 20, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), "gemDiamond", "blockRedstone", "blockLapis"); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), 240, 50, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "gemDiamond", "blockGold", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 1000, 100, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 4), 4000, 500, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), Items.NETHER_STAR); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SWORD), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_SWORD)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_AXE), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_AXE)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_PICKAXE), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_PICKAXE)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SHOVEL), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_SHOVEL)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_BOW), 70, 0, new ItemStack(Items.BOW), new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "string", "string"); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), 0, 0, "dustRedstone", "dyeWhite", "gunpowder", Items.COAL); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_WATER), 10, 3, new ItemStack(Items.SUGAR), new ItemStack(Items.WATER_BUCKET), new ItemStack(Items.WATER_BUCKET)); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_LAVA), 32, 10, Items.LAVA_BUCKET, "dustRedstone", "cobblestone", "blockCoal"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_VOID), 64, 10, Items.BUCKET, "string", "string", "gunpowder"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), 128, 20, "treeSapling", "treeSapling", "sugarcane", Items.SUGAR); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AIR), 128, 20, Items.GHAST_TEAR, "feather", "feather"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), 64, 0, ModItems.SIGIL_DIVINATION, "blockGlass", "blockGlass", "dustGlowstone"); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), 64, 0, RegistrarBloodMagicItems.SIGIL_DIVINATION, "blockGlass", "blockGlass", "dustGlowstone"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), 64, 20, "chestWood", "leather", "string", "string"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), 128, 10, Items.IRON_PICKAXE, Items.IRON_AXE, Items.IRON_SHOVEL, Items.GUNPOWDER); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), 300, 30, ModItems.SIGIL_WATER, ModItems.SIGIL_AIR, ModItems.SIGIL_LAVA, Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), 500, 50, ModBlocks.TELEPOSER, Items.WATER_BUCKET, Items.LAVA_BUCKET, Items.BLAZE_ROD); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), 300, 30, RegistrarBloodMagicItems.SIGIL_WATER, RegistrarBloodMagicItems.SIGIL_AIR, RegistrarBloodMagicItems.SIGIL_LAVA, Blocks.OBSIDIAN); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), 500, 50, RegistrarBloodMagicBlocks.TELEPOSER, Items.WATER_BUCKET, Items.LAVA_BUCKET, Items.BLAZE_ROD); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), 400, 10, "dustGlowstone", "dustRedstone", "nuggetGold", Items.GUNPOWDER); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), 300, 10, "glowstone", Blocks.TORCH, "dustRedstone", "dustRedstone"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), 600, 10, "string", "ingotGold", "blockIron", "ingotGold"); @@ -366,31 +362,31 @@ public class ModRecipes TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE), 600, 50, Blocks.SOUL_SAND, Blocks.SOUL_SAND, "stone", Blocks.OBSIDIAN); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE), 800, 70, Items.ENDER_EYE, Items.ENDER_PEARL, "ingotGold", "ingotGold"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION), 2000, 200, "blockIron", "blockGold", Blocks.OBSIDIAN, "cobblestone"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), 1500, 200, ModBlocks.TELEPOSER, "glowstone", "blockRedstone", "ingotGold"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), 1500, 200, ModBlocks.TELEPOSER, "gemDiamond", Items.ENDER_PEARL, Blocks.OBSIDIAN); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "glowstone", "blockRedstone", "ingotGold"); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "gemDiamond", Items.ENDER_PEARL, Blocks.OBSIDIAN); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_CLAW), 800, 120, Items.FLINT, Items.FLINT, ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), 200, 20, Blocks.SLIME_BLOCK, Blocks.SLIME_BLOCK, Items.LEATHER, "string"); TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FROST), 80, 10, Blocks.ICE, Items.SNOWBALL, Items.SNOWBALL, "dustRedstone"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.SENTIENT_ARMOUR_GEM), 240, 150, Items.DIAMOND_CHESTPLATE, new ItemStack(ModItems.SOUL_GEM, 1, 1), Blocks.IRON_BLOCK, Blocks.OBSIDIAN); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_ARMOUR_GEM), 240, 150, Items.DIAMOND_CHESTPLATE, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), Blocks.IRON_BLOCK, Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 400, 10, "blockGlass", "stone", new ItemStack(ModItems.SLATE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.NODE_ROUTER), 400, 5, "stickWood", new ItemStack(ModItems.SLATE, 1, 1), "gemLapis", "gemLapis"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.ITEM_ROUTING_NODE), 400, 5, "dustGlowstone", "dustRedstone", "blockGlass", "stone"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.OUTPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotIron", new ItemStack(ModBlocks.ITEM_ROUTING_NODE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.INPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotGold", new ItemStack(ModBlocks.ITEM_ROUTING_NODE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.MASTER_ROUTING_NODE), 400, 200, "blockIron", "gemDiamond", new ItemStack(ModItems.SLATE, 1, 2)); + TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 400, 10, "blockGlass", "stone", new ItemStack(RegistrarBloodMagicItems.SLATE)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER), 400, 5, "stickWood", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), "gemLapis", "gemLapis"); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE), 400, 5, "dustGlowstone", "dustRedstone", "blockGlass", "stone"); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotIron", new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotGold", new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE), 400, 200, "blockIron", "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.DEMON_CRYSTAL, 1, 0), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.DEMON_CRYSTAL, 1, 1), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.DEMON_CRYSTAL, 1, 2), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.DEMON_CRYSTAL, 1, 3), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.DEMON_CRYSTAL, 1, 4), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 0), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 1), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 2), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 3), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 4), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.DEMON_CRUCIBLE), 400, 100, Items.CAULDRON, "stone", "gemLapis", "gemDiamond"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.DEMON_PYLON), 400, 50, "blockIron", "stone", "gemLapis", ModItems.ITEM_DEMON_CRYSTAL); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModBlocks.DEMON_CRYSTALLIZER), 500, 100, ModBlocks.SOUL_FORGE, "stone", "gemLapis", "blockGlass"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(ModItems.DEMON_WILL_GAUGE), 400, 50, "ingotGold", "dustRedstone", "blockGlass", ModItems.ITEM_DEMON_CRYSTAL); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRUCIBLE), 400, 100, Items.CAULDRON, "stone", "gemLapis", "gemDiamond"); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PYLON), 400, 50, "blockIron", "stone", "gemLapis", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTALLIZER), 500, 100, RegistrarBloodMagicBlocks.SOUL_FORGE, "stone", "gemLapis", "blockGlass"); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE), 400, 50, "ingotGold", "dustRedstone", "blockGlass", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); } public static void addAlchemyTableRecipes() @@ -436,11 +432,11 @@ public class ModRecipes AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.NEURO_TOXIN), 1000, 100, 2, new ItemStack(Items.FISH, 1, 3)); AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.ANTISEPTIC, 2), 1000, 200, 2, ItemComponent.getStack(ItemComponent.PLANT_OIL), "nuggetGold", "cropWheat", Items.SUGAR, Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM); - AlchemyTableRecipeRegistry.registerRecipe(ItemLivingArmourPointsUpgrade.getStack(ItemLivingArmourPointsUpgrade.DRAFT_ANGELUS), 20000, 400, 3, ItemComponent.getStack(ItemComponent.NEURO_TOXIN), ItemComponent.getStack(ItemComponent.ANTISEPTIC), "dustGold", Items.FERMENTED_SPIDER_EYE, new ItemStack(ModItems.BLOOD_SHARD, 1, 0), Items.GHAST_TEAR); + AlchemyTableRecipeRegistry.registerRecipe(ItemLivingArmourPointsUpgrade.getStack(ItemLivingArmourPointsUpgrade.DRAFT_ANGELUS), 20000, 400, 3, ItemComponent.getStack(ItemComponent.NEURO_TOXIN), ItemComponent.getStack(ItemComponent.ANTISEPTIC), "dustGold", Items.FERMENTED_SPIDER_EYE, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0), Items.GHAST_TEAR); - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(ModItems.SIGIL_HOLDING))); + AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING))); - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(ModItems.POTION_FLASK), 1000, 200, 2, new ItemStack(Items.POTIONITEM), "cropNetherWart", "dustRedstone", "dustGlowstone"); + AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.POTION_FLASK), 1000, 200, 2, new ItemStack(Items.POTIONITEM), "cropNetherWart", "dustRedstone", "dustGlowstone"); AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1), 1000, 100, 2, "gunpowder", "cropNetherWart", "gemLapis"); AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_POWER_1), 1000, 100, 2, "gunpowder", "cropNetherWart", "dustRedstone"); } @@ -484,11 +480,11 @@ public class ModRecipes addPotionRecipe(1000, 1, new ItemStack(Items.REDSTONE), new PotionEffect(MobEffects.HASTE, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.GLASS_BOTTLE), new PotionEffect(MobEffects.INVISIBILITY, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.POISONOUS_POTATO), new PotionEffect(MobEffects.SATURATION, 1)); - addPotionRecipe(1000, 1, new ItemStack(ModItems.BLOOD_SHARD, 1, 0), new PotionEffect(MobEffects.HEALTH_BOOST, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Blocks.SLIME_BLOCK), new PotionEffect(ModPotions.bounce, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.STRING), new PotionEffect(ModPotions.cling, 2 * 60 * 20)); + addPotionRecipe(1000, 1, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0), new PotionEffect(MobEffects.HEALTH_BOOST, 2 * 60 * 20)); + addPotionRecipe(1000, 1, new ItemStack(Blocks.SLIME_BLOCK), new PotionEffect(RegistrarBloodMagic.BOUNCE, 2 * 60 * 20)); + addPotionRecipe(1000, 1, new ItemStack(Items.STRING), new PotionEffect(RegistrarBloodMagic.CLING, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new PotionEffect(ModPotions.deafness, 450)); + addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new PotionEffect(RegistrarBloodMagic.DEAFNESS, 450)); // AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(5000, 100, 4, new ItemStack(Blocks.SLIME_BLOCK), new PotionEffect(ModPotions.bounce, 15 * 60 * 20))); // AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(5000, 100, 4, new ItemStack("string"), new PotionEffect(ModPotions.bounce, 15 * 60 * 20))); @@ -572,34 +568,192 @@ public class ModRecipes switch (tier) { case 0: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "ingotIron", new ItemStack(ModItems.SLATE, 1, 0)); + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "ingotIron", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 0)); break; case 1: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "dustRedstone", "dustRedstone", "ingotIron", new ItemStack(ModItems.SLATE, 1, 0)); + 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(ModItems.SLATE, 1, 1)); + 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(ModItems.SLATE, 1, 1)); + 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(ModItems.SLATE, 1, 2)); + 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(ModItems.SLATE, 1, 2)); + 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(ModItems.SLATE, 1, 3)); + 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(ModItems.SLATE, 1, 3)); + 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(ModItems.SLATE, 1, 4)); + 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(ModItems.SLATE, 1, 4)); + LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.NETHER_STAR, "gemDiamond", "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4)); + } + } + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static File RECIPE_DIR = null; + private static final Set USED_OD_NAMES = new TreeSet<>(); + + private static void setupDir() { + if (RECIPE_DIR == null) { + RECIPE_DIR = ConfigHandler.config.getConfigFile().toPath().resolve("../recipes/").toFile(); + } + + if (!RECIPE_DIR.exists()) { + RECIPE_DIR.mkdir(); + } + } + + private static void addShapedRecipe(ItemStack result, Object... components) { + setupDir(); + + // GameRegistry.addShapedRecipe(result, components); + + Map json = new HashMap<>(); + + List pattern = new ArrayList<>(); + int i = 0; + while (i < components.length && components[i] instanceof String) { + pattern.add((String) components[i]); + i++; + } + json.put("pattern", pattern); + + boolean isOreDict = false; + Map> key = new HashMap<>(); + Character curKey = null; + for (; i < components.length; i++) { + Object o = components[i]; + if (o instanceof Character) { + if (curKey != null) + throw new IllegalArgumentException("Provided two char keys in a row"); + curKey = (Character) o; + } else { + if (curKey == null) + throw new IllegalArgumentException("Providing object without a char key"); + if (o instanceof String) + isOreDict = true; + key.put(Character.toString(curKey), serializeItem(o)); + curKey = null; + } + } + json.put("key", key); + json.put("type", isOreDict ? "forge:ore_shaped" : "minecraft:crafting_shaped"); + json.put("result", serializeItem(result)); + + // names the json the same name as the output's registry name + // repeatedly adds _alt if a file already exists + // janky I know but it works + String suffix = result.getItem().getHasSubtypes() ? "_" + result.getItemDamage() : ""; + File f = new File(RECIPE_DIR, result.getItem().getRegistryName().getResourcePath() + suffix + ".json"); + + while (f.exists()) { + suffix += "_alt"; + f = new File(RECIPE_DIR, result.getItem().getRegistryName().getResourcePath() + suffix + ".json"); + } + + try (FileWriter w = new FileWriter(f)) { + GSON.toJson(json, w); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void addShapelessRecipe(ItemStack result, Object... components) + { + setupDir(); + + // addShapelessRecipe(result, components); + + Map json = new HashMap<>(); + + boolean isOreDict = false; + List> ingredients = new ArrayList<>(); + for (Object o : components) { + if (o instanceof String) + isOreDict = true; + ingredients.add(serializeItem(o)); + } + json.put("ingredients", ingredients); + json.put("type", isOreDict ? "forge:ore_shapeless" : "minecraft:crafting_shapeless"); + json.put("result", serializeItem(result)); + + // names the json the same name as the output's registry name + // repeatedly adds _alt if a file already exists + // janky I know but it works + String suffix = result.getItem().getHasSubtypes() ? "_" + result.getItemDamage() : ""; + File f = new File(RECIPE_DIR, result.getItem().getRegistryName().getResourcePath() + suffix + ".json"); + + while (f.exists()) { + suffix += "_alt"; + f = new File(RECIPE_DIR, result.getItem().getRegistryName().getResourcePath() + suffix + ".json"); + } + + + try (FileWriter w = new FileWriter(f)) { + GSON.toJson(json, w); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static Map serializeItem(Object thing) { + if (thing instanceof Item) { + return serializeItem(new ItemStack((Item) thing)); + } + if (thing instanceof Block) { + return serializeItem(new ItemStack((Block) thing)); + } + if (thing instanceof ItemStack) { + ItemStack stack = (ItemStack) thing; + Map ret = new HashMap<>(); + ret.put("item", stack.getItem().getRegistryName().toString()); + if (stack.getItem().getHasSubtypes() || stack.getItemDamage() != 0) { + ret.put("data", stack.getItemDamage()); + } + if (stack.getCount() > 1) { + ret.put("count", stack.getCount()); + } + + if (stack.hasTagCompound()) { + throw new IllegalArgumentException("nbt not implemented"); + } + + return ret; + } + if (thing instanceof String) { + Map ret = new HashMap<>(); + USED_OD_NAMES.add((String) thing); + ret.put("item", "#" + ((String) thing).toUpperCase(Locale.ROOT)); + return ret; + } + + throw new IllegalArgumentException("Not a block, item, stack, or od name"); + } + + private static void generateConstants() { + List> json = new ArrayList<>(); + for (String s : USED_OD_NAMES) { + Map entry = new HashMap<>(); + entry.put("name", s.toUpperCase(Locale.ROOT)); + entry.put("ingredient", ImmutableMap.of("type", "forge:ore_dict", "ore", s)); + json.add(entry); + } + + try (FileWriter w = new FileWriter(new File(RECIPE_DIR, "_constants.json"))) { + GSON.toJson(json, w); + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagic.java new file mode 100644 index 00000000..9d73e45f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagic.java @@ -0,0 +1,130 @@ +package WayofTime.bloodmagic.registry; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api.registry.OrbRegistry; +import WayofTime.bloodmagic.entity.mob.*; +import WayofTime.bloodmagic.entity.projectile.*; +import WayofTime.bloodmagic.potion.PotionBloodMagic; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.init.MobEffects; +import net.minecraft.potion.Potion; +import net.minecraft.util.ResourceLocation; +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.EntityRegistry; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryBuilder; + +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) +@GameRegistry.ObjectHolder(BloodMagic.MODID) +public class RegistrarBloodMagic { + + @GameRegistry.ObjectHolder("weak") + public static final BloodOrb ORB_WEAK = new BloodOrb("", 0, 0); + @GameRegistry.ObjectHolder("apprentice") + public static final BloodOrb ORB_APPRENTICE = new BloodOrb("", 0, 0); + @GameRegistry.ObjectHolder("magician") + public static final BloodOrb ORB_MAGICIAN = new BloodOrb("", 0, 0); + @GameRegistry.ObjectHolder("master") + public static final BloodOrb ORB_MASTER = new BloodOrb("", 0, 0); + @GameRegistry.ObjectHolder("archmage") + public static final BloodOrb ORB_ARCHMAGE = new BloodOrb("", 0, 0); + @GameRegistry.ObjectHolder("transcendent") + public static final BloodOrb ORB_TRANSCENDENT = new BloodOrb("", 0, 0); + + public static final Potion BOOST = MobEffects.HASTE; + public static final Potion WHIRLWIND = MobEffects.HASTE; + public static final Potion PLANAR_BINDING = MobEffects.HASTE; + public static final Potion SOUL_SNARE = MobEffects.HASTE; + public static final Potion SOUL_FRAY = MobEffects.HASTE; + public static final Potion FIRE_FUSE = MobEffects.HASTE; + public static final Potion CONSTRICT = MobEffects.HASTE; + public static final Potion PLANT_LEECH = MobEffects.HASTE; + public static final Potion DEAFNESS = MobEffects.HASTE; + public static final Potion BOUNCE = MobEffects.HASTE; + public static final Potion CLING = MobEffects.HASTE; + public static final Potion SACRIFICIAL_LAMB = MobEffects.HASTE; + + public static IForgeRegistry BLOOD_ORBS = null; + + @SubscribeEvent + public static void registerBloodOrbs(RegistryEvent.Register event) { + event.getRegistry().registerAll( + new BloodOrb("weak", 1, 5000).setRegistryName("weak"), + new BloodOrb("apprentice", 2, 25000).setRegistryName("apprentice"), + new BloodOrb("magician", 3, 150000).setRegistryName("magician"), + new BloodOrb("master", 4, 1000000).setRegistryName("master"), + new BloodOrb("archmage", 5, 10000000).setRegistryName("archmage"), + new BloodOrb("transcendent", 6, 30000000).setRegistryName("transcendent") + ); + } + + @SubscribeEvent + public static void registerPotions(RegistryEvent.Register event) { + event.getRegistry().registerAll( + new PotionBloodMagic("Boost", false, 0xFFFFFF, 0, 1).setRegistryName("boost"), + 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("constriction"), + 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") + ); + } + + @SubscribeEvent + public static void registerEntities(RegistryEvent.Register event) { + int entities = 0; + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "BloodLight"), EntityBloodLight.class, "BloodLight", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "SoulSnare"), EntitySoulSnare.class, "SoulSnare", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "SoulArrow"), EntitySentientArrow.class, "SoulArrow", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "Meteor"), EntityMeteor.class, "Meteor", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "SentientSpecter"), EntitySentientSpecter.class, "SentientSpecter", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "Mimic"), EntityMimic.class, "Mimic", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "CorruptedZombie"), EntityCorruptedZombie.class, "CorruptedZombie", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "CorruptedSheep"), EntityCorruptedSheep.class, "CorruptedSheep", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "CorruptedChicken"), EntityCorruptedChicken.class, "CorruptedChicken", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "CorruptedSpider"), EntityCorruptedSpider.class, "CorruptedSpider", ++entities, BloodMagic.instance, 16*4, 3, true); + } + + @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(); + } + + @SubscribeEvent + public static void registerModels() { + 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(); + }); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicBlocks.java new file mode 100644 index 00000000..0b2bee5c --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicBlocks.java @@ -0,0 +1,189 @@ +package WayofTime.bloodmagic.registry; + +import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.block.*; +import com.google.common.collect.Sets; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +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 WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.enums.EnumDemonBlock1; +import WayofTime.bloodmagic.block.enums.EnumDemonBlock2; +import WayofTime.bloodmagic.block.enums.EnumDemonBlock3; +import WayofTime.bloodmagic.block.enums.EnumSubWillType; +import WayofTime.bloodmagic.block.enums.EnumSubWillType1; +import WayofTime.bloodmagic.block.enums.EnumSubWillType2; +import WayofTime.bloodmagic.block.enums.EnumSubWillType3; +import WayofTime.bloodmagic.block.enums.EnumWillWall; +import WayofTime.bloodmagic.tile.TileAlchemyArray; +import WayofTime.bloodmagic.tile.TileAlchemyTable; +import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.tile.TileBloodTank; +import WayofTime.bloodmagic.tile.TileDemonCrucible; +import WayofTime.bloodmagic.tile.TileDemonCrystal; +import WayofTime.bloodmagic.tile.TileDemonCrystallizer; +import WayofTime.bloodmagic.tile.TileDemonPylon; +import WayofTime.bloodmagic.tile.TileDimensionalPortal; +import WayofTime.bloodmagic.tile.TileImperfectRitualStone; +import WayofTime.bloodmagic.tile.TileIncenseAltar; +import WayofTime.bloodmagic.tile.TileInversionPillar; +import WayofTime.bloodmagic.tile.TileMasterRitualStone; +import WayofTime.bloodmagic.tile.TileMimic; +import WayofTime.bloodmagic.tile.TilePhantomBlock; +import WayofTime.bloodmagic.tile.TileSoulForge; +import WayofTime.bloodmagic.tile.TileSpectralBlock; +import WayofTime.bloodmagic.tile.TileTeleposer; +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 java.util.Set; + +@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 Set blocks; + + @SubscribeEvent + public static void registerBlocks(RegistryEvent.Register event) + { + FluidRegistry.registerFluid(BlockLifeEssence.getLifeEssence()); + FluidRegistry.addBucketForFluid(BlockLifeEssence.getLifeEssence()); + + blocks = Sets.newHashSet( + 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])); + + registerTiles(); + } + + private static void registerTiles() + { + GameRegistry.registerTileEntity(TileAltar.class, BloodMagic.MODID + ":" + TileAltar.class.getSimpleName()); + GameRegistry.registerTileEntity(TileImperfectRitualStone.class, BloodMagic.MODID + ":" + TileImperfectRitualStone.class.getSimpleName()); + GameRegistry.registerTileEntity(TileMasterRitualStone.class, BloodMagic.MODID + ":" + TileMasterRitualStone.class.getSimpleName()); + GameRegistry.registerTileEntity(TileAlchemyArray.class, BloodMagic.MODID + ":" + TileAlchemyArray.class.getSimpleName()); + GameRegistry.registerTileEntity(TileSpectralBlock.class, BloodMagic.MODID + ":" + TileSpectralBlock.class.getSimpleName()); + GameRegistry.registerTileEntity(TilePhantomBlock.class, BloodMagic.MODID + ":" + TilePhantomBlock.class.getSimpleName()); + GameRegistry.registerTileEntity(TileTeleposer.class, BloodMagic.MODID + ":" + TileTeleposer.class.getSimpleName()); + GameRegistry.registerTileEntity(TileSoulForge.class, BloodMagic.MODID + ":" + TileSoulForge.class.getSimpleName()); + GameRegistry.registerTileEntity(TileMasterRoutingNode.class, BloodMagic.MODID + ":" + TileMasterRoutingNode.class.getSimpleName()); + GameRegistry.registerTileEntity(TileInputRoutingNode.class, BloodMagic.MODID + ":" + TileInputRoutingNode.class.getSimpleName()); + GameRegistry.registerTileEntity(TileOutputRoutingNode.class, BloodMagic.MODID + ":" + TileOutputRoutingNode.class.getSimpleName()); + GameRegistry.registerTileEntity(TileItemRoutingNode.class, BloodMagic.MODID + ":" + TileItemRoutingNode.class.getSimpleName()); + GameRegistry.registerTileEntity(TileIncenseAltar.class, BloodMagic.MODID + ":" + TileIncenseAltar.class.getSimpleName()); + GameRegistry.registerTileEntity(TileDemonCrucible.class, BloodMagic.MODID + ":" + TileDemonCrucible.class.getSimpleName()); + GameRegistry.registerTileEntity(TileDemonPylon.class, BloodMagic.MODID + ":" + TileDemonPylon.class.getSimpleName()); + GameRegistry.registerTileEntity(TileDemonCrystallizer.class, BloodMagic.MODID + ":" + TileDemonCrystallizer.class.getSimpleName()); + GameRegistry.registerTileEntity(TileDemonCrystal.class, BloodMagic.MODID + ":" + TileDemonCrystal.class.getSimpleName()); + GameRegistry.registerTileEntity(TileAlchemyTable.class, BloodMagic.MODID + ":" + TileAlchemyTable.class.getSimpleName()); + + GameRegistry.registerTileEntity(TileDimensionalPortal.class, BloodMagic.MODID + ":" + TileDimensionalPortal.class.getSimpleName()); + GameRegistry.registerTileEntity(TileBloodTank.class, BloodMagic.MODID + ":" + TileBloodTank.class.getSimpleName()); + GameRegistry.registerTileEntity(TileMimic.class, BloodMagic.MODID + ":" + TileMimic.class.getSimpleName()); + GameRegistry.registerTileEntity(TileInversionPillar.class, BloodMagic.MODID + ":" + TileInversionPillar.class.getSimpleName()); + } + + public static void registerBlacklists() { + BloodMagicAPI.addToTeleposerBlacklist(INPUT_ROUTING_NODE); + BloodMagicAPI.addToTranspositionBlacklist(INPUT_ROUTING_NODE); + BloodMagicAPI.addToTeleposerBlacklist(OUTPUT_ROUTING_NODE); + BloodMagicAPI.addToTranspositionBlacklist(OUTPUT_ROUTING_NODE); + BloodMagicAPI.addToTeleposerBlacklist(ITEM_ROUTING_NODE); + BloodMagicAPI.addToTranspositionBlacklist(ITEM_ROUTING_NODE); + BloodMagicAPI.addToTeleposerBlacklist(DEMON_CRYSTAL); + BloodMagicAPI.addToTranspositionBlacklist(DEMON_CRYSTAL); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicItems.java new file mode 100644 index 00000000..ed3fa1db --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicItems.java @@ -0,0 +1,231 @@ +package WayofTime.bloodmagic.registry; + +import WayofTime.bloodmagic.block.IBMBlock; +import WayofTime.bloodmagic.client.IVariantProvider; +import com.google.common.collect.Sets; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.init.Items; +import net.minecraft.inventory.EntityEquipmentSlot; +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 WayofTime.bloodmagic.BloodMagic; +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 org.apache.commons.lang3.tuple.Pair; + +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_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 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_LEGS = 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_LEGS = 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 ITEM_POINTS_UPGRADE = Items.AIR; + public static final Item DEMON_WILL_GAUGE = Items.AIR; + public static final Item POTION_FLASK = 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); + + private static Set items; + + @SubscribeEvent + public static void registerItems(RegistryEvent.Register event) + { + items = Sets.newHashSet( + 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("sacrificial_pack"), + new ItemPackSelfSacrifice().setRegistryName("pack_of_sacrifice"), + new ItemDaggerOfSacrifice().setRegistryName("dagger_of_sacrifice"), + new ItemRitualDiviner().setRegistryName("ritual_diviner"), + 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().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_growth"), + new ItemSigilBloodLight().setRegistryName("sigil_light"), + new ItemSigilElementalAffinity().setRegistryName("sigil_elemental"), + new ItemSigilMagnetism().setRegistryName("sigil_magnetism"), + new ItemSigilSuppression().setRegistryName("sigil_suppression"), + new ItemSigilHaste().setRegistryName("sigil_haste"), + new ItemSigilFastMiner().setRegistryName("sigil_fast_miner"), + new ItemSigilSeer().setRegistryName("sigil_seer"), + new ItemSigilPhantomBridge().setRegistryName("sigil_bridge"), + new ItemSigilWhirlwind().setRegistryName("sigil_whirlwind"), + new ItemSigilCompression().setRegistryName("sigil_compression"), + new ItemSigilEnderSeverance().setRegistryName("sigil_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 ItemComponent().setRegistryName("component"), + new ItemDemonCrystal().setRegistryName("demon_crystal"), + new ItemTelepositionFocus().setRegistryName("teleposition_focus"), + new ItemExperienceBook().setRegistryName("experience_book"), + new ItemBloodShard().setRegistryName("blood_shard"), + new ItemLivingArmour(EntityEquipmentSlot.HEAD).setRegistryName("living_helm"), + new ItemLivingArmour(EntityEquipmentSlot.CHEST).setRegistryName("living_chest"), + new ItemLivingArmour(EntityEquipmentSlot.LEGS).setRegistryName("living_leggings"), + new ItemLivingArmour(EntityEquipmentSlot.FEET).setRegistryName("living_boots"), + new ItemSentientArmour(EntityEquipmentSlot.HEAD).setRegistryName("sentient_helm"), + new ItemSentientArmour(EntityEquipmentSlot.CHEST).setRegistryName("sentient_chest"), + new ItemSentientArmour(EntityEquipmentSlot.LEGS).setRegistryName("sentient_leggings"), + new ItemSentientArmour(EntityEquipmentSlot.FEET).setRegistryName("sentient_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("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("router_filter"), + new ItemFluidRouterFilter().setRegistryName("fluid_router_filter"), + new ItemCuttingFluid().setRegistryName("cutting_fluid"), + new ItemSanguineBook().setRegistryName("sanguine_book"), + new ItemLivingArmourPointsUpgrade().setRegistryName("living_armor_point_upgrade"), + new ItemDemonWillGauge().setRegistryName("demon_will_gauge"), + new ItemPotionFlask().setRegistryName("potion_flask") + ); + + 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())); + }); + + 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(item -> { + IVariantProvider variantProvider = (IVariantProvider) item; + for (Pair variant : variantProvider.getVariants()) + ModelLoader.setCustomModelResourceLocation(item, variant.getLeft(), new ModelResourceLocation(item.getRegistryName(), variant.getRight())); + }); + + RegistrarBloodMagicBlocks.blocks.stream().filter(i -> i instanceof IVariantProvider).forEach(block -> { + IVariantProvider variantProvider = (IVariantProvider) block; + for (Pair variant : variantProvider.getVariants()) + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), variant.getLeft(), new ModelResourceLocation(block.getRegistryName(), variant.getRight())); + }); + + final ResourceLocation holdingLoc = new ResourceLocation("bloodmagic", "item/ItemSigilHolding"); + ModelLoader.setCustomMeshDefinition(SIGIL_HOLDING, stack -> { + if (stack.hasTagCompound() && stack.getTagCompound().hasKey("color")) + return new ModelResourceLocation(holdingLoc, "type=color"); + return new ModelResourceLocation(holdingLoc, "type=normal"); + }); + ModelLoader.registerItemVariants(SIGIL_HOLDING, new ModelResourceLocation(holdingLoc, "type=normal")); + ModelLoader.registerItemVariants(SIGIL_HOLDING, new ModelResourceLocation(holdingLoc, "type=color")); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index 4a148a97..4855b98b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.AltarComponent; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.altar.EnumAltarTier; @@ -10,7 +10,7 @@ import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.block.BlockBloodRune; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.entity.effect.EntityLightningBolt; @@ -38,7 +38,7 @@ public class RitualAltarBuilder extends Ritual public RitualAltarBuilder() { - super("ritualAltarBuilder", 0, 450, "ritual." + Constants.Mod.MODID + ".altarBuilderRitual"); + super("ritualAltarBuilder", 0, 450, "ritual." + BloodMagic.MODID + ".altarBuilderRitual"); } @Override @@ -61,9 +61,9 @@ public class RitualAltarBuilder extends Ritual altarComponentsIterator = new ArrayList(EnumAltarTier.SIX.getAltarComponents()).iterator(); } - if (world.getBlockState(altarPos).getBlock().isReplaceable(world, altarPos) && hasItem(tileEntity, Item.getItemFromBlock(ModBlocks.ALTAR), 0, true)) + if (world.getBlockState(altarPos).getBlock().isReplaceable(world, altarPos) && hasItem(tileEntity, Item.getItemFromBlock(RegistrarBloodMagicBlocks.ALTAR), 0, true)) { - world.setBlockState(altarPos, ModBlocks.ALTAR.getDefaultState()); + world.setBlockState(altarPos, RegistrarBloodMagicBlocks.ALTAR.getDefaultState()); lightning(world, altarPos); masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); } @@ -290,7 +290,7 @@ public class RitualAltarBuilder extends Ritual if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune) && itemHandler.extractItem(i, 1, true) != null) { Block block = Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()); - if (block != null && block != Blocks.GLOWSTONE && block != ModBlocks.BLOOD_STONE && block != ModBlocks.CRYSTAL) + if (block != null && block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK && block != RegistrarBloodMagicBlocks.CRYSTAL) { BlockStack blockStack = new BlockStack(block, itemHandler.getStackInSlot(i).getItemDamage()); itemHandler.extractItem(i, 1, false); @@ -306,7 +306,7 @@ public class RitualAltarBuilder extends Ritual if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune)) { Block block = Block.getBlockFromItem(inv.getStackInSlot(i).getItem()); - if (block != Blocks.GLOWSTONE && block != ModBlocks.BLOOD_STONE && block != ModBlocks.CRYSTAL) + if (block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK && block != RegistrarBloodMagicBlocks.CRYSTAL) { BlockStack blockStack = new BlockStack(block, inv.getStackInSlot(i).getItemDamage()); inv.decrStackSize(i, 1); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java index 525d0a93..f6c2b484 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -14,7 +15,6 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -40,7 +40,7 @@ public class RitualAnimalGrowth extends Ritual public RitualAnimalGrowth() { - super("ritualAnimalGrowth", 0, 10000, "ritual." + Constants.Mod.MODID + ".animalGrowthRitual"); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java index caff98f0..0872e9bc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; @@ -20,7 +20,7 @@ public class RitualArmourEvolve extends Ritual public RitualArmourEvolve() { - super("ritualArmourEvolve", 0, 50000, "ritual." + Constants.Mod.MODID + ".armourEvolveRitual"); + super("ritualArmourEvolve", 0, 50000, "ritual." + BloodMagic.MODID + ".armourEvolveRitual"); addBlockRange(CHECK_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1, 2, 1)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java index 10f6a51f..0977427b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.item.ItemComponent; import WayofTime.bloodmagic.tile.TileAlchemyArray; @@ -19,7 +19,7 @@ public class RitualCobblestone extends Ritual public RitualCobblestone() { - super("ritualCobblestone", 0, 500, "ritual." + Constants.Mod.MODID + ".cobblestoneRitual"); + super("ritualCobblestone", 0, 500, "ritual." + BloodMagic.MODID + ".cobblestoneRitual"); addBlockRange(COBBLESTONE_RANGE, new AreaDescriptor.Cross(new BlockPos(0, 1, 0), 1)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java index 2ee8aa2f..250439a2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.EntityLivingBase; @@ -16,7 +16,7 @@ public class RitualContainment extends Ritual public RitualContainment() { - super("ritualContainment", 0, 2000, "ritual." + Constants.Mod.MODID + ".containmentRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index 4fa14bc1..1b1d752c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -19,7 +20,6 @@ import net.minecraft.world.World; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.compress.CompressionRegistry; import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; @@ -30,7 +30,7 @@ import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; public class RitualCrushing extends Ritual @@ -51,7 +51,7 @@ public class RitualCrushing extends Ritual public RitualCrushing() { - super("ritualCrushing", 0, 5000, "ritual." + Constants.Mod.MODID + ".crushingRitual"); + 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)); @@ -117,7 +117,7 @@ public class RitualCrushing extends Ritual IBlockState state = world.getBlockState(newPos); Block block = state.getBlock(); - if (block.equals(ModBlocks.RITUAL_CONTROLLER) || block.equals(ModBlocks.RITUAL_STONE) || block.getBlockHardness(state, world, newPos) == -1.0F || Utils.isBlockLiquid(state)) + if (block.equals(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER) || block.equals(RegistrarBloodMagicBlocks.RITUAL_STONE) || block.getBlockHardness(state, world, newPos) == -1.0F || Utils.isBlockLiquid(state)) { continue; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java index 0aa5202c..797f5eed 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -20,7 +20,7 @@ public class RitualCrystalHarvest extends Ritual public RitualCrystalHarvest() { - super("ritualCrystalHarvest", 0, 40000, "ritual." + Constants.Mod.MODID + ".crystalHarvestRitual"); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index 1f746fa7..e0e30068 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -17,7 +18,6 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; @@ -35,7 +35,7 @@ public class RitualExpulsion extends Ritual public RitualExpulsion() { - super("ritualExpulsion", 0, 10000, "ritual." + Constants.Mod.MODID + ".expulsionRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index 7f0b4e57..774a77c7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; @@ -14,7 +15,6 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.IBloodAltar; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; @@ -48,7 +48,7 @@ public class RitualFeatheredKnife extends Ritual public RitualFeatheredKnife() { - super("ritualFeatheredKnife", 0, 25000, "ritual." + Constants.Mod.MODID + ".featheredKnifeRitual"); + 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)); @@ -161,7 +161,7 @@ public class RitualFeatheredKnife extends Ritual LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.selfSacrifice", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.selfSacrifice", chestStack); if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java index 69ccff60..fd8a1e74 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; -import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -31,7 +30,7 @@ public class RitualFelling extends Ritual public RitualFelling() { - super("ritualFelling", 0, 20000, "ritual." + Constants.Mod.MODID + ".fellingRitual"); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 9d00ddca..32f20fe1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; @@ -13,7 +14,6 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -36,7 +36,7 @@ public class RitualForsakenSoul extends Ritual public RitualForsakenSoul() { - super("ritualForsakenSoul", 0, 40000, "ritual." + Constants.Mod.MODID + ".forsakenSoulRitual"); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java index 3490031e..00d72cb5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -22,7 +22,7 @@ public class RitualFullStomach extends Ritual public RitualFullStomach() { - super("ritualFullStomach", 0, 100000, "ritual." + Constants.Mod.MODID + ".fullStomachRitual"); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 8ad1cfdd..0bd2cebf 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.Block; import net.minecraft.block.BlockFarmland; import net.minecraft.block.IGrowable; @@ -19,7 +20,6 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -51,7 +51,7 @@ public class RitualGreenGrove extends Ritual public RitualGreenGrove() { - super("ritualGreenGrove", 0, 5000, "ritual." + Constants.Mod.MODID + ".greenGroveRitual"); + 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)); @@ -106,7 +106,7 @@ public class RitualGreenGrove extends Ritual IBlockState state = world.getBlockState(newPos); Block block = state.getBlock(); - if (!BloodMagicAPI.getGreenGroveBlacklist().contains(block)) + if (!BloodMagicAPI.greenGroveBlacklist.contains(block)) { if (block instanceof IPlantable || block instanceof IGrowable) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java index fb5065de..abc6dea5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.IHarvestHandler; import WayofTime.bloodmagic.api.registry.HarvestRegistry; import WayofTime.bloodmagic.api.ritual.*; @@ -27,7 +27,7 @@ public class RitualHarvest extends Ritual public RitualHarvest() { - super("ritualHarvest", 0, 20000, "ritual." + Constants.Mod.MODID + ".harvestRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java index a9965c40..57255109 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.EntityLivingBase; @@ -16,7 +16,7 @@ public class RitualInterdiction extends Ritual public RitualInterdiction() { - super("ritualInterdiction", 0, 1000, "ritual." + Constants.Mod.MODID + ".interdictionRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java index e71dd53a..5cc64b52 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; @@ -17,7 +17,7 @@ public class RitualJumping extends Ritual public RitualJumping() { - super("ritualJump", 0, 5000, "ritual." + Constants.Mod.MODID + ".jumpRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java index 22e688c9..2dbd107e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -20,7 +21,6 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -49,7 +49,7 @@ public class RitualLava extends Ritual public RitualLava() { - super("ritualLava", 0, 10000, "ritual." + Constants.Mod.MODID + ".lavaRitual"); + 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)); @@ -231,7 +231,7 @@ public class RitualLava extends Ritual if (!entity.isDead && entity.hurtTime <= 0 && Utils.isImmuneToFireDamage(entity)) { - if (entity.attackEntityFrom(BloodMagicAPI.getDamageSource(), damage)) + if (entity.attackEntityFrom(BloodMagicAPI.damageSource, damage)) { corrosiveDrained += corrosiveWillDrain; corrosiveWill -= corrosiveWillDrain; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java index e1d3fe8a..c6e26ab9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; @@ -16,7 +17,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.api.registry.LivingArmourDowngradeRecipeRegistry; @@ -37,7 +37,7 @@ public class RitualLivingArmourDowngrade extends Ritual public RitualLivingArmourDowngrade() { - super("ritualDowngrade", 0, 10000, "ritual." + Constants.Mod.MODID + ".downgradeRitual"); + super("ritualDowngrade", 0, 10000, "ritual." + BloodMagic.MODID + ".downgradeRitual"); addBlockRange(DOWNGRADE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-3, 0, -3), 7)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java index 972b7157..ab176dc3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.Block; import net.minecraft.block.BlockOre; import net.minecraft.block.BlockRedstoneOre; @@ -16,7 +17,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -35,7 +35,7 @@ public class RitualMagnetic extends Ritual public RitualMagnetic() { - super("ritualMagnetic", 0, 5000, "ritual." + Constants.Mod.MODID + ".magneticRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index e115111a..72090b53 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -3,11 +3,11 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -25,7 +25,7 @@ public class RitualMeteor extends Ritual public RitualMeteor() { - super("ritualMeteor", 0, 1000000, "ritual." + Constants.Mod.MODID + ".meteorRitual"); + super("ritualMeteor", 0, 1000000, "ritual." + BloodMagic.MODID + ".meteorRitual"); addBlockRange(ITEM_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); setMaximumVolumeAndDistanceOfRange(ITEM_RANGE, 0, 10, 10); } @@ -57,7 +57,7 @@ public class RitualMeteor extends Ritual for (EntityItem entityItem : itemList) { - ItemStack stack = entityItem.getEntityItem(); + ItemStack stack = entityItem.getItem(); if (MeteorRegistry.hasMeteorForItem(stack)) { EntityMeteor meteor = new EntityMeteor(world, pos.getX(), 260, pos.getZ(), 0, -0.1, 0, radiusModifier, explosionModifier, fillerChance); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java index fb21568b..28abcbb3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -22,7 +22,7 @@ public class RitualPlacer extends Ritual public RitualPlacer() { - super("ritualPlacer", 0, 5000, "ritual." + Constants.Mod.MODID + ".placerRitual"); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java index 215e313a..6e4855cc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.teleport.PortalLocation; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.tile.TileDimensionalPortal; import net.minecraft.block.state.IBlockState; @@ -29,7 +29,7 @@ public class RitualPortal extends Ritual public RitualPortal() { - super("ritualPortal", 0, 50000, "ritual." + Constants.Mod.MODID + ".portalRitual"); + super("ritualPortal", 0, 50000, "ritual." + BloodMagic.MODID + ".portalRitual"); portalRitualTag = new NBTTagCompound(); } @@ -55,7 +55,7 @@ public class RitualPortal extends Ritual { for (int k = z - 2; k <= z + 2; k++) { - if (!world.isAirBlock(new BlockPos(i, y, k)) && !(getBlockState(world, i, y, k).getBlock() == ModBlocks.RITUAL_STONE)) + 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))); @@ -64,7 +64,7 @@ public class RitualPortal extends Ritual } 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() == ModBlocks.RITUAL_STONE)) + 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))); @@ -72,7 +72,7 @@ public class RitualPortal extends Ritual } for (int j = y + 1; j <= y + 5; j++) { - if (!world.isAirBlock(new BlockPos(x + 3, j, z)) && !(getBlockState(world, x + 3, j, z) == ModBlocks.RITUAL_STONE)) + 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))); @@ -84,7 +84,7 @@ public class RitualPortal extends Ritual { for (int i = x - 2; i <= x + 2; i++) { - if (!world.isAirBlock(new BlockPos(i, y, k)) && !(getBlockState(world, i, y, k).getBlock() == ModBlocks.RITUAL_STONE)) + 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))); @@ -93,7 +93,7 @@ public class RitualPortal extends Ritual } 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() == ModBlocks.RITUAL_STONE)) + 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))); @@ -101,7 +101,7 @@ public class RitualPortal extends Ritual } 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() == ModBlocks.RITUAL_STONE)) + 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))); @@ -142,7 +142,7 @@ public class RitualPortal extends Ritual if (world.isAirBlock(tempPos)) { - IBlockState blockState = ModBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(0); + IBlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(0); world.setBlockState(tempPos, blockState, 3); if (world.getTileEntity(tempPos) != null && world.getTileEntity(tempPos) instanceof TileDimensionalPortal) @@ -163,7 +163,7 @@ public class RitualPortal extends Ritual BlockPos tempPos = new BlockPos(x, j, k); if (world.isAirBlock(tempPos)) { - IBlockState blockState = ModBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(1); + IBlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(1); world.setBlockState(tempPos, blockState, 3); if (world.getTileEntity(tempPos) != null && world.getTileEntity(tempPos) instanceof TileDimensionalPortal) @@ -196,7 +196,7 @@ public class RitualPortal extends Ritual { for (int j = y + 1; j <= y + 3; j++) { - if (getBlockState(world, i, j, z).getBlock() == ModBlocks.DIMENSIONAL_PORTAL) + if (getBlockState(world, i, j, z).getBlock() == RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL) { world.setBlockToAir(new BlockPos(i, j, z)); } @@ -208,7 +208,7 @@ public class RitualPortal extends Ritual { for (int j = y + 1; j <= y + 3; j++) { - if (getBlockState(world, x, j, k).getBlock() == ModBlocks.DIMENSIONAL_PORTAL) + if (getBlockState(world, x, j, k).getBlock() == RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL) { world.setBlockToAir(new BlockPos(x, j, k)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index 48ef6552..ca63f12a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import com.google.common.collect.Lists; import net.minecraft.block.BlockLiquid; @@ -31,7 +31,7 @@ public class RitualPump extends Ritual public RitualPump() { - super("ritualPump", 0, 500, "ritual." + Constants.Mod.MODID + ".pumpRitual"); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java index 8a3df796..5e7fd81d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -12,7 +13,6 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -33,7 +33,7 @@ public class RitualRegeneration extends Ritual public RitualRegeneration() { - super("ritualRegeneration", 0, 25000, "ritual." + Constants.Mod.MODID + ".regenerationRitual"); + 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)); @@ -105,7 +105,7 @@ public class RitualRegeneration extends Ritual float currentHealth = damagedEntity.getHealth(); - damagedEntity.attackEntityFrom(BloodMagicAPI.getDamageSource(), Math.min(player.getMaxHealth() - player.getHealth(), syphonedHealthAmount)); + damagedEntity.attackEntityFrom(BloodMagicAPI.damageSource, Math.min(player.getMaxHealth() - player.getHealth(), syphonedHealthAmount)); float healthDifference = currentHealth - damagedEntity.getHealth(); if (healthDifference > 0) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java index e2bccc13..a2de3a23 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.EnumFacing; @@ -10,7 +11,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -30,7 +30,7 @@ public class RitualSpeed extends Ritual public RitualSpeed() { - super("ritualSpeed", 0, 1000, "ritual." + Constants.Mod.MODID + ".speedRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java index 872e7964..9c593771 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -21,7 +21,7 @@ public class RitualSuppression extends Ritual public RitualSuppression() { - super("ritualSuppression", 0, 10000, "ritual." + Constants.Mod.MODID + ".suppressionRitual"); + super("ritualSuppression", 0, 10000, "ritual." + BloodMagic.MODID + ".suppressionRitual"); addBlockRange(SUPPRESSION_RANGE, new AreaDescriptor.HemiSphere(new BlockPos(0, 0, 0), 10)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java index 79dacbe7..9e43019e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java @@ -5,13 +5,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map.Entry; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; @@ -22,7 +22,7 @@ import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import com.google.common.collect.Iterables; @@ -32,7 +32,7 @@ public class RitualUpgradeRemove extends Ritual public RitualUpgradeRemove() { - super("ritualUpgradeRemove", 0, 25000, "ritual." + Constants.Mod.MODID + ".upgradeRemoveRitual"); + super("ritualUpgradeRemove", 0, 25000, "ritual." + BloodMagic.MODID + ".upgradeRemoveRitual"); addBlockRange(CHECK_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1, 2, 1)); } @@ -70,7 +70,7 @@ public class RitualUpgradeRemove extends Ritual LivingArmourUpgrade upgrade = entry.getValue(); String upgradeKey = entry.getKey(); - ItemStack upgradeStack = new ItemStack(ModItems.UPGRADE_TOME); + ItemStack upgradeStack = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); LivingUpgrades.setKey(upgradeStack, upgradeKey); LivingUpgrades.setLevel(upgradeStack, upgrade.getUpgradeLevel()); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java index ac8c8112..9d4dcbc6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.*; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; @@ -14,7 +14,7 @@ public class RitualWater extends Ritual public RitualWater() { - super("ritualWater", 0, 500, "ritual." + Constants.Mod.MODID + ".waterRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index c914019f..28d2bc0e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; @@ -27,7 +27,7 @@ public class RitualWellOfSuffering extends Ritual public RitualWellOfSuffering() { - super("ritualWellOfSuffering", 0, 40000, "ritual." + Constants.Mod.MODID + ".wellOfSufferingRitual"); + 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)); @@ -89,7 +89,7 @@ public class RitualWellOfSuffering extends Ritual continue; String simpleClassName = entity.getClass().getSimpleName(); - if (BloodMagicAPI.getEntitySacrificeValues().containsKey(simpleClassName) && BloodMagicAPI.getEntitySacrificeValues().get(simpleClassName) <= 0) + if (BloodMagicAPI.entitySacrificeValues.containsKey(simpleClassName) && BloodMagicAPI.entitySacrificeValues.get(simpleClassName) <= 0) continue; if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) @@ -103,8 +103,8 @@ public class RitualWellOfSuffering extends Ritual if (ConfigHandler.entitySacrificeValues.containsKey(entityName)) lifeEssenceRatio = ConfigHandler.entitySacrificeValues.get(entityName); - if (BloodMagicAPI.getEntitySacrificeValues().containsKey(entityName)) - lifeEssenceRatio = BloodMagicAPI.getEntitySacrificeValues().get(entityName); + if (BloodMagicAPI.entitySacrificeValues.containsKey(entityName)) + lifeEssenceRatio = BloodMagicAPI.entitySacrificeValues.get(entityName); if (entity.isChild()) lifeEssenceRatio *= 0.5F; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java index 7769fc49..30a252f1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java @@ -3,13 +3,13 @@ package WayofTime.bloodmagic.ritual; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -24,7 +24,7 @@ public class RitualZephyr extends Ritual public RitualZephyr() { - super("ritualZephyr", 0, 1000, "ritual." + Constants.Mod.MODID + ".zephyrRitual"); + 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)); @@ -60,7 +60,7 @@ public class RitualZephyr extends Ritual continue; } - ItemStack copyStack = entityItem.getEntityItem().copy(); + ItemStack copyStack = entityItem.getItem().copy(); int originalAmount = copyStack.getCount(); ItemStack newStack = Utils.insertStackIntoTile(copyStack, tileInventory, EnumFacing.DOWN); @@ -70,7 +70,7 @@ public class RitualZephyr extends Ritual if (newStack.isEmpty()) entityItem.setDead(); - entityItem.getEntityItem().setCount(newStack.getCount()); + entityItem.getItem().setCount(newStack.getCount()); } if (newStack.isEmpty()) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index 9da9a653..acef5d0a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -131,20 +131,11 @@ public class HarvestHandlerPlantable implements IHarvestHandler HarvestRegistry.registerStandardCrop(crop, crop.getMaxAge()); } } catch (NoSuchMethodException e) { - BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; unable to find crop name mapper"); - return; + BloodMagic.instance.logger.error("HarvestCraft integration cancelled; unable to find crop name mapper"); } catch (IllegalAccessException e) { - BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; crop name lookup broke"); - return; + BloodMagic.instance.logger.error("HarvestCraft integration cancelled; crop name lookup broke"); } catch (InvocationTargetException e) { - BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; crop name lookup broke"); - return; - } catch (ReflectionHelper.UnableToFindClassException e) { - BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; unable to find crop registry"); - return; - } catch (ReflectionHelper.UnableToFindFieldException e) { - BloodMagic.instance.getLogger().error("HarvestCraft integration cancelled; unable to find crop names in registry"); - return; + BloodMagic.instance.logger.error("HarvestCraft integration cancelled; crop name lookup broke"); } } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java index 3e9859bb..810c5d33 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual.imperfect; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; @@ -11,7 +11,7 @@ public class ImperfectRitualDay extends ImperfectRitual { public ImperfectRitualDay() { - super("day", new BlockStack(Blocks.GOLD_BLOCK), 5000, true, "ritual." + Constants.Mod.MODID + ".imperfect.day"); + super("day", new BlockStack(Blocks.GOLD_BLOCK), 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.day"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java index f09168d1..6c06d69f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual.imperfect; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; @@ -11,7 +11,7 @@ public class ImperfectRitualNight extends ImperfectRitual { public ImperfectRitualNight() { - super("night", new BlockStack(Blocks.LAPIS_BLOCK), 100, true, "ritual." + Constants.Mod.MODID + ".imperfect.night"); + super("night", new BlockStack(Blocks.LAPIS_BLOCK), 100, true, "ritual." + BloodMagic.MODID + ".imperfect.night"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java index 2ff4f07c..92a858bc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual.imperfect; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; @@ -11,7 +11,7 @@ public class ImperfectRitualRain extends ImperfectRitual { public ImperfectRitualRain() { - super("rain", new BlockStack(Blocks.WATER), 5000, true, "ritual." + Constants.Mod.MODID + ".imperfect.rain"); + super("rain", new BlockStack(Blocks.WATER), 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.rain"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java index 9e897e8e..521cf385 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java @@ -1,20 +1,19 @@ package WayofTime.bloodmagic.ritual.imperfect; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; -import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; public class ImperfectRitualResistance extends ImperfectRitual { public ImperfectRitualResistance() { - super("resistance", new BlockStack(Blocks.BEDROCK), 5000, "ritual." + Constants.Mod.MODID + ".imperfect.resistance"); + super("resistance", new BlockStack(Blocks.BEDROCK), 5000, "ritual." + BloodMagic.MODID + ".imperfect.resistance"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java index 75dfaf5d..c18a5f17 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java @@ -1,21 +1,20 @@ package WayofTime.bloodmagic.ritual.imperfect; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; -import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; public class ImperfectRitualZombie extends ImperfectRitual { public ImperfectRitualZombie() { - super("zombie", new BlockStack(Blocks.COAL_BLOCK), 5000, "ritual." + Constants.Mod.MODID + ".imperfect.zombie"); + super("zombie", new BlockStack(Blocks.COAL_BLOCK), 5000, "ritual." + BloodMagic.MODID + ".imperfect.zombie"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java index 18ee3ad0..7001a118 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual.portal; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.teleport.PortalLocation; import net.minecraftforge.common.DimensionManager; @@ -13,7 +13,7 @@ public class LocationsHandler implements Serializable { public static final long serialVersionUID = 10102001; - private static final String fileName = String.valueOf(DimensionManager.getCurrentSaveRootDirectory()) + "/" + Constants.Mod.MODID + "/PortalLocations.dat"; + private static final String fileName = String.valueOf(DimensionManager.getCurrentSaveRootDirectory()) + "/" + BloodMagic.MODID + "/PortalLocations.dat"; private static HashMap> portals; private static LocationsHandler locationsHandler; @@ -47,11 +47,11 @@ public class LocationsHandler implements Serializable { if (file.createNewFile()) { - BloodMagicAPI.getLogger().info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + BloodMagicAPI.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); } } else if (file.createNewFile()) { - BloodMagicAPI.getLogger().info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + BloodMagicAPI.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); } } FileInputStream fileIn = new FileInputStream(file); @@ -65,7 +65,7 @@ public class LocationsHandler implements Serializable return null; } catch (ClassNotFoundException e) { - BloodMagicAPI.getLogger().error(String.valueOf(file) + " was not found in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + BloodMagicAPI.logger.error(String.valueOf(file) + " was not found in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); return null; } } @@ -94,13 +94,13 @@ public class LocationsHandler implements Serializable } if (!portals.get(name).isEmpty() && portals.get(name).size() >= 2) { - BloodMagicAPI.getLogger().info("Location " + name + " already exists."); + BloodMagicAPI.logger.info("Location " + name + " already exists."); updateFile(fileName, portals); return false; } else { portals.get(name).add(location); - BloodMagicAPI.getLogger().info("Adding " + name); + BloodMagicAPI.logger.info("Adding " + name); updateFile(fileName, portals); return true; } @@ -113,12 +113,12 @@ public class LocationsHandler implements Serializable if (portals.get(name).contains(location)) { portals.get(name).remove(location); - BloodMagicAPI.getLogger().info("Removing " + name); + BloodMagicAPI.logger.info("Removing " + name); updateFile(fileName, portals); return true; } else { - BloodMagicAPI.getLogger().info("No location matching " + name); + BloodMagicAPI.logger.info("No location matching " + name); updateFile(fileName, portals); return false; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index f15568ad..8d7ecfe3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -4,7 +4,6 @@ import WayofTime.bloodmagic.api.event.TeleposeEvent; import WayofTime.bloodmagic.api.saving.SoulNetwork; import WayofTime.bloodmagic.api.teleport.Teleport; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import lombok.Getter; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; @@ -18,7 +17,6 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.WorldServer; -import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -102,7 +100,6 @@ public class Teleports } } - @Getter public static class TeleportToDim extends Teleport { private World oldWorld; @@ -130,8 +127,8 @@ public class Teleports if (entity.timeUntilPortal <= 0) { MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); - WorldServer oldWorldServer = server.worldServerForDimension(entity.dimension); - WorldServer newWorldServer = server.worldServerForDimension(newWorldID); + WorldServer oldWorldServer = server.getWorld(entity.dimension); + WorldServer newWorldServer = server.getWorld(newWorldID); if (entity instanceof EntityPlayer) { @@ -202,5 +199,17 @@ public class Teleports { return 10000; } + + public World getOldWorld() { + return oldWorld; + } + + public int getNewWorldID() { + return newWorldID; + } + + public boolean isTeleposer() { + return teleposer; + } } } diff --git a/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java index 8b0afb1b..56eb3644 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java @@ -4,7 +4,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; -import net.minecraftforge.fml.common.registry.GameData; public class ModIdItemFilter extends TestItemFilter { diff --git a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java index 1957af31..2b18479e 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java @@ -2,14 +2,12 @@ package WayofTime.bloodmagic.structures; import java.util.Random; -import WayofTime.bloodmagic.api.Constants; -import net.minecraft.block.Block; +import WayofTime.bloodmagic.BloodMagic; 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.util.math.ChunkPos; import net.minecraft.world.WorldServer; import net.minecraft.world.gen.structure.template.PlacementSettings; import net.minecraft.world.gen.structure.template.Template; @@ -25,7 +23,7 @@ public class BuildTestStructure MinecraftServer minecraftserver = world.getMinecraftServer(); TemplateManager templatemanager = world.getStructureTemplateManager(); - ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "Corridor1"); + ResourceLocation resource = new ResourceLocation(BloodMagic.MODID, "Corridor1"); Template template = templatemanager.getTemplate(minecraftserver, resource); if (template == null) diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java index 05b3f415..05ee3546 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java @@ -9,20 +9,16 @@ import java.net.URL; import java.util.List; import java.util.Random; +import WayofTime.bloodmagic.BloodMagic; import com.google.common.base.Charsets; import com.google.common.io.Resources; import com.google.common.reflect.TypeToken; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import org.apache.commons.io.IOUtils; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.gson.Serializers; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - public class DungeonRoomLoader { public static void saveDungeons() @@ -73,7 +69,7 @@ public class DungeonRoomLoader public static void test() { - ResourceLocation id = new ResourceLocation(Constants.Mod.MODID, "testGson"); + ResourceLocation id = new ResourceLocation(BloodMagic.MODID, "testGson"); String s = id.getResourceDomain(); String s1 = id.getResourcePath(); InputStream inputstream = null; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index a1ebd2cf..70f11cc8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,12 +1,8 @@ package WayofTime.bloodmagic.tile; -import lombok.Getter; -import lombok.Setter; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import WayofTime.bloodmagic.api.Constants; @@ -18,9 +14,6 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche { public boolean isActive = false; public int activeCounter = 0; - - @Getter - @Setter public EnumFacing rotation = EnumFacing.HORIZONTALS[0];; private String key = "empty"; @@ -153,4 +146,13 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche return false; } + + @Override + public EnumFacing getRotation() { + return rotation; + } + + public void setRotation(EnumFacing rotation) { + this.rotation = rotation; + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 0003f75e..e5849e20 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.tile; import java.util.ArrayList; import java.util.List; -import lombok.Getter; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -25,7 +24,6 @@ import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import com.google.common.base.Strings; -@Getter public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable { public static final int orbSlot = 6; @@ -398,4 +396,40 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, setInventorySlotContents(i, result[i]); } } + + public static int getOrbSlot() { + return orbSlot; + } + + public static int getToolSlot() { + return toolSlot; + } + + public static int getOutputSlot() { + return outputSlot; + } + + public EnumFacing 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; + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index b1083df8..d442fa49 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -1,8 +1,6 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.tile.base.TileTicking; -import lombok.Getter; -import lombok.Setter; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; @@ -25,12 +23,7 @@ public class TileDemonCrystal extends TileTicking public double progressToNextCrystal = 0; public int internalCounter = 0; - - @Getter - @Setter public int crystalCount = 1; - @Getter - @Setter public EnumFacing placement = EnumFacing.UP; //Side that this crystal is placed on. public TileDemonCrystal() @@ -188,4 +181,20 @@ public class TileDemonCrystal extends TileTicking tag.setDouble("progress", progressToNextCrystal); return tag; } + + public int getCrystalCount() { + return crystalCount; + } + + public void setCrystalCount(int crystalCount) { + this.crystalCount = crystalCount; + } + + public EnumFacing getPlacement() { + return placement; + } + + public void setPlacement(EnumFacing placement) { + this.placement = placement; + } } \ 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 index a0acb3ee..b560f6d6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -4,7 +4,7 @@ import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.IDemonWillConduit; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -60,7 +60,7 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond public boolean formCrystal(EnumDemonWillType type, BlockPos position) { - getWorld().setBlockState(position, ModBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal())); + getWorld().setBlockState(position, RegistrarBloodMagicBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal())); TileEntity tile = getWorld().getTileEntity(position); if (tile instanceof TileDemonCrystal) { diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java index f65977a2..83db6385 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java @@ -13,11 +13,6 @@ public class TileDimensionalPortal extends TileBase public int masterStoneY; public int masterStoneZ; - public TileDimensionalPortal() - { - ; - } - public void deserialize(NBTTagCompound tagCompound) { portalID = tagCompound.getString(RitualPortal.PORTAL_ID_TAG); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java index 1bf00be6..4d6784cd 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java @@ -6,13 +6,11 @@ import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.base.TileBase; -import lombok.NoArgsConstructor; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -@NoArgsConstructor public class TileImperfectRitualStone extends TileBase implements IImperfectRitualStone { // IImperfectRitualStone diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index a2a5f56a..22e8f743 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -4,8 +4,6 @@ import java.util.Collections; import java.util.List; import java.util.Locale; -import lombok.Getter; -import lombok.Setter; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; @@ -26,13 +24,11 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.inversion.InversionPillarHandler; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.base.TileTicking; import com.google.common.collect.ImmutableMap; -@Getter -@Setter public class TileInversionPillar extends TileTicking { public static double willPerOperation = 0.5; @@ -73,7 +69,7 @@ public class TileInversionPillar extends TileTicking public TileInversionPillar(EnumDemonWillType type) { this.type = type; - asm = BloodMagic.proxy.load(new ResourceLocation(Constants.Mod.MODID.toLowerCase(), "asms/block/inversion_pillar.json"), ImmutableMap.of("offset", animationOffset, "cycle_length", cycleLength)); + asm = BloodMagic.proxy.load(new ResourceLocation(BloodMagic.MODID.toLowerCase(), "asms/block/inversion_pillar.json"), ImmutableMap.of("offset", animationOffset, "cycle_length", cycleLength)); animationOffsetValue = -1; } @@ -156,9 +152,9 @@ public class TileInversionPillar extends TileTicking if (!candidatePos.equals(BlockPos.ORIGIN)) { currentInversion = 0; - IBlockState pillarState = ModBlocks.INVERSION_PILLAR.getStateFromMeta(type.ordinal()); - IBlockState bottomState = ModBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2); - IBlockState topState = ModBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2 + 1); + IBlockState pillarState = RegistrarBloodMagicBlocks.INVERSION_PILLAR.getStateFromMeta(type.ordinal()); + IBlockState bottomState = RegistrarBloodMagicBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2); + IBlockState topState = RegistrarBloodMagicBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2 + 1); getWorld().setBlockState(candidatePos, pillarState); getWorld().setBlockState(candidatePos.down(), bottomState); getWorld().setBlockState(candidatePos.up(), topState); @@ -178,9 +174,9 @@ public class TileInversionPillar extends TileTicking { 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.xCoord, vec.yCoord, vec.zCoord); + BlockPos centralPos = pos.add(vec.x, vec.y, vec.z); - getWorld().setBlockState(centralPos, ModBlocks.DEMON_EXTRAS.getStateFromMeta(0)); + getWorld().setBlockState(centralPos, RegistrarBloodMagicBlocks.DEMON_EXTRAS.getStateFromMeta(0)); currentInversion -= 1000; } } @@ -197,7 +193,7 @@ public class TileInversionPillar extends TileTicking 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.xCoord, vec.yCoord, vec.zCoord); + BlockPos centralPos = pillarPos.add(vec.x, vec.y, vec.z); BlockPos testPos = null; candidateTest: for (int h = 0; h <= heightCheckRange; h++) { @@ -385,7 +381,7 @@ public class TileInversionPillar extends TileTicking Block block = state.getBlock(); if (block == Blocks.DIRT || block == Blocks.STONE || block == Blocks.GRASS) { - if (getWorld().setBlockState(offsetPos, ModBlocks.DEMON_EXTRAS.getStateFromMeta(0))) + if (getWorld().setBlockState(offsetPos, RegistrarBloodMagicBlocks.DEMON_EXTRAS.getStateFromMeta(0))) { WorldDemonWillHandler.drainWill(getWorld(), pos, type, willPerOperation, true); currentInversion -= inversionPerOperation; @@ -434,4 +430,164 @@ public class TileInversionPillar extends TileTicking } return super.getCapability(capability, side); } + + 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 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 double getMaxWillForChunk() { + return maxWillForChunk; + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 1b21dbe7..7dd3f9f2 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -4,9 +4,6 @@ import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.tile.base.TileTicking; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -28,15 +25,13 @@ import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.api.util.helper.RitualHelper; import WayofTime.bloodmagic.item.ItemActivationCrystal; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.ChatUtil; import com.google.common.base.Strings; import javax.annotation.Nullable; -@Getter -@NoArgsConstructor public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone { private String owner; @@ -46,11 +41,8 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS private int activeTime; private int cooldown; private Ritual currentRitual; - @Setter private EnumFacing direction = EnumFacing.NORTH; - @Setter private boolean inverted; - private List currentActiveWillConfig = new ArrayList(); @Override @@ -70,7 +62,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (!isActive() && !isPowered() && isRedstoned() && getCurrentRitual() != null) { active = true; - ItemStack crystalStack = NBTHelper.checkNBT(new ItemStack(ModItems.ACTIVATION_CRYSTAL, 1, getCurrentRitual().getCrystalLevel())); + ItemStack crystalStack = NBTHelper.checkNBT(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL, 1, getCurrentRitual().getCrystalLevel())); crystalStack.getTagCompound().setString(Constants.NBT.OWNER_UUID, getOwner()); activateRitual(crystalStack, null, getCurrentRitual()); redstoned = false; @@ -420,4 +412,64 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS return getWorld().isBlockPowered(getPos()); } + + public void setOwner(String owner) { + this.owner = owner; + } + + public SoulNetwork getCachedNetwork() { + return cachedNetwork; + } + + public void setCachedNetwork(SoulNetwork cachedNetwork) { + this.cachedNetwork = cachedNetwork; + } + + public boolean isActive() { + return 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 void setDirection(EnumFacing direction) { + this.direction = direction; + } + + 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; + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index afc7b0ea..5e0c6a3d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -27,8 +27,8 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.ReflectionHelper; import WayofTime.bloodmagic.block.BlockMimic; import WayofTime.bloodmagic.entity.mob.EntityMimic; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; @@ -79,7 +79,7 @@ public class TileMimic extends TileInventory implements ITickable 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() == ModItems.POTION_FLASK ? Items.SPLASH_POTION : potionStack.getItem()); + ItemStack newStack = new ItemStack(potionStack.getItem() == RegistrarBloodMagicItems.POTION_FLASK ? Items.SPLASH_POTION : potionStack.getItem()); newStack.setTagCompound(potionStack.getTagCompound()); EntityPotion potionEntity = new EntityPotion(getWorld(), posX, posY, posZ, newStack); @@ -122,7 +122,7 @@ public class TileMimic extends TileInventory implements ITickable ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionSet")); } return true; - } else if (heldItem.getItem() == ModItems.POTION_FLASK) + } else if (heldItem.getItem() == RegistrarBloodMagicItems.POTION_FLASK) { //The potion flask is empty, therefore we have to reset the stored potion. if (!world.isRemote) @@ -143,7 +143,7 @@ public class TileMimic extends TileInventory implements ITickable if (player.isSneaking()) return false; - if (!player.getHeldItem(hand).isEmpty() && player.getHeldItem(hand).getItem() == new ItemStack(ModBlocks.MIMIC).getItem()) + if (!player.getHeldItem(hand).isEmpty() && player.getHeldItem(hand).getItem() == new ItemStack(RegistrarBloodMagicBlocks.MIMIC).getItem()) return false; if (!getStackInSlot(0).isEmpty() && !player.getHeldItem(hand).isEmpty()) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index d495095b..0b8435e0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -2,14 +2,15 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.base.TileTicking; -import lombok.NoArgsConstructor; import net.minecraft.nbt.NBTTagCompound; -@NoArgsConstructor public class TilePhantomBlock extends TileTicking { private int ticksRemaining = 10; + public TilePhantomBlock() { + } + public TilePhantomBlock(int ticksRemaining) { this.ticksRemaining = ticksRemaining; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePlinth.java b/src/main/java/WayofTime/bloodmagic/tile/TilePlinth.java deleted file mode 100644 index bb824969..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePlinth.java +++ /dev/null @@ -1,9 +0,0 @@ -package WayofTime.bloodmagic.tile; - -public class TilePlinth extends TileInventory -{ - public TilePlinth() - { - super(1, "plinth"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java index 22c48fef..17a69a18 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.base.TileTicking; import com.google.common.base.Strings; import net.minecraft.block.Block; @@ -88,7 +88,7 @@ public class TileSpectralBlock extends TileTicking if (world.isAirBlock(blockPos)) return; IBlockState cachedState = world.getBlockState(blockPos); - world.setBlockState(blockPos, ModBlocks.SPECTRAL_BLOCK.getDefaultState()); + 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/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 91f1833f..129d0714 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -25,7 +25,6 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; @@ -33,7 +32,6 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumFacing; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -46,12 +44,10 @@ import net.minecraftforge.common.ISpecialArmor.ArmorProperties; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fml.common.discovery.ASMDataTable; -import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; -import net.minecraftforge.items.wrapper.PlayerInvWrapper; import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; import net.minecraftforge.items.wrapper.SidedInvWrapper; import WayofTime.bloodmagic.BloodMagic; @@ -62,7 +58,7 @@ import WayofTime.bloodmagic.api.iface.IDemonWillViewer; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; -import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileInventory; import com.google.common.collect.Iterables; @@ -142,7 +138,7 @@ public class Utils 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); - EnumFacing dir = EnumFacing.getFacingFromVector((float) relativePosition.xCoord, (float) relativePosition.yCoord, (float) relativePosition.zCoord); + EnumFacing dir = EnumFacing.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.getFrontOffsetX() * 0.4, pos.getY() + 0.5 + dir.getFrontOffsetY() * 0.4, pos.getZ() + 0.5 + dir.getFrontOffsetZ() * 0.4), false, true, true); return result == null || pos.equals(result.getBlockPos()); } @@ -226,7 +222,7 @@ public class Utils World world = itemEntity.getEntityWorld(); BlockPos pos = itemEntity.getPosition(); - ItemStack stack = itemEntity.getEntityItem(); + ItemStack stack = itemEntity.getItem(); int planted = plantItemStack(world, pos, stack, horizontalRadius, verticalRadius); @@ -408,13 +404,13 @@ public class Utils case GLOWSTONE: return Blocks.GLOWSTONE; case BLOODSTONE: - return ModBlocks.BLOOD_STONE; + return RegistrarBloodMagicBlocks.DECORATIVE_BRICK; case BEACON: return Blocks.BEACON; case BLOODRUNE: - return ModBlocks.BLOOD_RUNE; + return RegistrarBloodMagicBlocks.BLOOD_RUNE; case CRYSTAL: - return ModBlocks.CRYSTAL; + return RegistrarBloodMagicBlocks.CRYSTAL; case NOTAIR: return Blocks.STONEBRICK; default: @@ -1016,7 +1012,7 @@ public class Utils } } - entityItem.setEntityItemStack(stack); + entityItem.setItem(stack); return world.spawnEntity(entityItem); } @@ -1120,7 +1116,7 @@ public class Utils Class handlerClass = Class.forName(data.getClassName()); Object handlerImpl = handlerClass.newInstance(); MinecraftForge.EVENT_BUS.register(handlerImpl); - BloodMagic.instance.getLogger().debug("Registering event handler for class {}", data.getClassName()); + BloodMagic.instance.logger.debug("Registering event handler for class {}", data.getClassName()); } catch (Exception e) { // No-op diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 1b782631..348fbbd8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -218,7 +218,7 @@ public class ClientHandler @SubscribeEvent public void onModelBake(ModelBakeEvent event) { - if (BloodMagic.isDev() && SUPPRESS_ASSET_ERRORS) + if (BloodMagic.IS_DEV && SUPPRESS_ASSET_ERRORS) return; Stopwatch stopwatch = Stopwatch.createStarted(); @@ -228,13 +228,13 @@ public class ClientHandler // Collect all Blood Magic model errors List errored = new ArrayList(); for (ResourceLocation modelError : modelErrors.keySet()) - if (modelError.getResourceDomain().equalsIgnoreCase(Constants.Mod.MODID)) + if (modelError.getResourceDomain().equalsIgnoreCase(BloodMagic.MODID)) errored.add(modelError); // Collect all Blood Magic variant errors List missing = new ArrayList(); for (ModelResourceLocation missingVariant : missingVariants) - if (missingVariant.getResourceDomain().equalsIgnoreCase(Constants.Mod.MODID)) + if (missingVariant.getResourceDomain().equalsIgnoreCase(BloodMagic.MODID)) missing.add(missingVariant); // Remove discovered model errors @@ -245,17 +245,17 @@ public class ClientHandler missingVariants.removeAll(missing); if (errored.size() > 0) - BloodMagic.instance.getLogger().info("Suppressed {} model errors from Blood Magic.", errored.size()); + BloodMagic.instance.logger.info("Suppressed {} model errors from Blood Magic.", errored.size()); if (missing.size() > 0) - BloodMagic.instance.getLogger().info("Suppressed {} variant errors from Blood Magic.", missing.size()); - BloodMagic.instance.getLogger().debug("Suppressed discovered model/variant errors in {}", stopwatch.stop()); + BloodMagic.instance.logger.info("Suppressed {} variant errors from Blood Magic.", missing.size()); + BloodMagic.instance.logger.debug("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 void onTextureStitch(TextureStitchEvent.Post event) { - if (BloodMagic.isDev() && SUPPRESS_ASSET_ERRORS) + if (BloodMagic.IS_DEV && SUPPRESS_ASSET_ERRORS) return; Stopwatch stopwatch = Stopwatch.createStarted(); @@ -284,7 +284,7 @@ public class ClientHandler missingTextures.keySet().remove(mc); badTextureDomains.remove(mc); } - BloodMagic.instance.getLogger().debug("Suppressed required texture errors in {}", stopwatch.stop()); + BloodMagic.instance.logger.debug("Suppressed required texture errors in {}", stopwatch.stop()); } public static void cycleSigil(ItemStack stack, EntityPlayer player, int dWheel) diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index 81fceba7..36e543e5 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.util.handler.event; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; @@ -21,7 +22,7 @@ import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.util.helper.ItemHelper; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.item.ItemInscriptionTool; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; @Handler public class CraftingHandler @@ -55,11 +56,11 @@ public class CraftingHandler { if (ConfigHandler.thaumcraftGogglesUpgrade) { - if (event.getLeft().getItem() == ModItems.LIVING_ARMOUR_HELMET && event.getRight().getItem() == Constants.Compat.THAUMCRAFT_GOGGLES && !event.getRight().isItemDamaged()) + if (event.getLeft().getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET && event.getRight().getItem() == Constants.Compat.THAUMCRAFT_GOGGLES && !event.getRight().isItemDamaged()) { - ItemStack output = new ItemStack(ModItems.UPGRADE_TOME); + ItemStack output = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); output = NBTHelper.checkNBT(output); - ItemHelper.LivingUpgrades.setKey(output, Constants.Mod.MODID + ".upgrade.revealing"); + ItemHelper.LivingUpgrades.setKey(output, BloodMagic.MODID + ".upgrade.revealing"); ItemHelper.LivingUpgrades.setLevel(output, 1); event.setCost(1); @@ -69,7 +70,7 @@ public class CraftingHandler } } - if (event.getLeft().getItem() == ModItems.SIGIL_HOLDING) + if (event.getLeft().getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING) { if (event.getRight().getItem() == Items.NAME_TAG) { @@ -90,7 +91,7 @@ public class CraftingHandler ItemStack output = event.getLeft().copy(); if (!output.hasTagCompound()) output.setTagCompound(new NBTTagCompound()); - output.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(dyeColor.getMapColor().colorValue)); + output.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(dyeColor.getColorValue())); event.setCost(1); event.setOutput(output); @@ -101,9 +102,9 @@ public class CraftingHandler if (event.getLeft().getItem() == Items.BOOK && event.getRight().getItem() == Items.ELYTRA && !event.getRight().isItemDamaged()) { - ItemStack output = new ItemStack(ModItems.UPGRADE_TOME); + ItemStack output = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); output = NBTHelper.checkNBT(output); - ItemHelper.LivingUpgrades.setKey(output, Constants.Mod.MODID + ".upgrade.elytra"); + ItemHelper.LivingUpgrades.setKey(output, BloodMagic.MODID + ".upgrade.elytra"); ItemHelper.LivingUpgrades.setLevel(output, 1); event.setCost(30); @@ -112,7 +113,7 @@ public class CraftingHandler return; } - if (event.getLeft().getItem() == ModItems.UPGRADE_TOME && event.getRight().getItem() == ModItems.UPGRADE_TOME) + 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()))) @@ -133,7 +134,7 @@ public class CraftingHandler } } - if (event.getLeft().getItem() instanceof IUpgradeTrainer && event.getRight().getItem() == ModItems.UPGRADE_TOME) + if (event.getLeft().getItem() instanceof IUpgradeTrainer && event.getRight().getItem() == RegistrarBloodMagicItems.UPGRADE_TOME) { LivingArmourUpgrade rightUpgrade = ItemHelper.LivingUpgrades.getUpgrade(event.getRight()); if (rightUpgrade != null) 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 bd6cc5ac..d0bbccc7 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Random; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; @@ -78,7 +79,7 @@ import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrific import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.DemonAuraPacketProcessor; import WayofTime.bloodmagic.potion.BMPotionUtils; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; @@ -160,7 +161,7 @@ public class GenericHandler EntityItem itemEntity = event.getEntityItem(); if (itemEntity != null) { - ItemStack stack = itemEntity.getEntityItem(); + ItemStack stack = itemEntity.getItem(); Item item = stack.getItem(); if (stack.hasTagCompound() && item instanceof ISentientTool) { @@ -180,7 +181,7 @@ public class GenericHandler Vec3d position = exp.getPosition(); double radius = 3; - AxisAlignedBB bb = new AxisAlignedBB(position.xCoord - radius, position.yCoord - radius, position.zCoord - radius, position.xCoord + radius, position.yCoord + radius, position.zCoord + radius); + 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()) { @@ -201,9 +202,9 @@ public class GenericHandler if (event.getEntity().getEntityWorld().isRemote) return; - if (event.getSource().getEntity() instanceof EntityPlayer && !PlayerHelper.isFakePlayer((EntityPlayer) event.getSource().getEntity())) + if (event.getSource().getTrueSource() instanceof EntityPlayer && !PlayerHelper.isFakePlayer((EntityPlayer) event.getSource().getTrueSource())) { - EntityPlayer player = (EntityPlayer) event.getSource().getEntity(); + EntityPlayer player = (EntityPlayer) event.getSource().getTrueSource(); if (!player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).isEmpty() && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() instanceof ItemPackSacrifice) { @@ -224,7 +225,7 @@ public class GenericHandler if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.battleHunger", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.battleHunger", chestStack); if (upgrade instanceof LivingArmourUpgradeBattleHungry) { ((LivingArmourUpgradeBattleHungry) upgrade).resetTimer(); @@ -368,7 +369,7 @@ public class GenericHandler if (ConfigHandler.teleposerBlacklist.contains(event.initialStack) || ConfigHandler.teleposerBlacklist.contains(event.finalStack)) event.setCanceled(true); - if (BloodMagicAPI.getTeleposerBlacklist().contains(event.initialStack) || BloodMagicAPI.getTeleposerBlacklist().contains(event.finalStack)) + if (BloodMagicAPI.teleposerBlacklist.contains(event.initialStack) || BloodMagicAPI.teleposerBlacklist.contains(event.finalStack)) event.setCanceled(true); } @@ -443,7 +444,7 @@ public class GenericHandler if (armour != null) { StatTrackerSelfSacrifice.incrementCounter(armour, event.healthDrained / 2); - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.selfSacrifice", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.selfSacrifice", chestStack); if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) { @@ -461,17 +462,17 @@ public class GenericHandler { EntityLivingBase attackedEntity = event.getEntityLiving(); DamageSource source = event.getSource(); - Entity entity = source.getEntity(); + Entity entity = source.getTrueSource(); if (entity != null && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; ItemStack heldStack = player.getHeldItemMainhand(); - if (!heldStack.isEmpty() && heldStack.getItem() == ModItems.BOUND_SWORD && !(attackedEntity instanceof EntityAnimal)) + if (!heldStack.isEmpty() && heldStack.getItem() == RegistrarBloodMagicItems.BOUND_SWORD && !(attackedEntity instanceof EntityAnimal)) for (int i = 0; i <= EnchantmentHelper.getLootingModifier(player); i++) if (attackedEntity.getEntityWorld().rand.nextDouble() < 0.2) - event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(ModItems.BLOOD_SHARD, 1, 0))); + event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0))); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index f41e1968..a6f32d17 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.util.handler.event; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -58,7 +59,7 @@ public class LivingArmourHandler if (armour != null) { double modifier = 1; - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.slowHeal", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.slowHeal", chestStack); if (upgrade instanceof LivingArmourUpgradeSlowHeal) { @@ -121,7 +122,7 @@ public class LivingArmourHandler LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.stormTrooper", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stormTrooper", chestStack); if (upgrade instanceof LivingArmourUpgradeStormTrooper) { @@ -151,7 +152,7 @@ public class LivingArmourHandler { if (event.getHand() == EnumHand.OFF_HAND) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.crippledArm", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.crippledArm", chestStack); if (upgrade instanceof LivingArmourUpgradeCrippledArm) { @@ -164,7 +165,7 @@ public class LivingArmourHandler ItemStack drinkStack = event.getItemStack(); //TODO: See if the item is a splash potion? Those should be usable. - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.quenched", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); if (upgrade instanceof LivingArmourUpgradeQuenched) { @@ -192,7 +193,7 @@ public class LivingArmourHandler { StatTrackerGrimReaperSprint.incrementCounter(armour); - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.grimReaper", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.grimReaper", chestStack); if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) { @@ -225,7 +226,7 @@ public class LivingArmourHandler if (!player.isSneaking()) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(Constants.Mod.MODID + ".upgrade.jump", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.jump", chestStack); if (upgrade instanceof LivingArmourUpgradeJump) { @@ -257,7 +258,7 @@ public class LivingArmourHandler LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.stepAssist", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stepAssist", chestStack); if (upgrade instanceof LivingArmourUpgradeStepAssist) { @@ -279,7 +280,7 @@ public class LivingArmourHandler LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(Constants.Mod.MODID + ".upgrade.movement", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.movement", chestStack); if (upgrade instanceof LivingArmourUpgradeSpeed) { @@ -298,7 +299,7 @@ public class LivingArmourHandler if (percentIncrease > 0 && (player.onGround || player.capabilities.isFlying) && (Math.abs(player.moveForward) > 0 || Math.abs(player.moveStrafing) > 0)) { - player.moveRelative(player.moveStrafing, player.moveForward, player.capabilities.isFlying ? (percentIncrease / 2.0f) : percentIncrease); + player.moveRelative(player.moveStrafing, player.moveForward, player.capabilities.isFlying ? (percentIncrease / 2.0f) : percentIncrease, 0.02F); } } } @@ -323,7 +324,7 @@ public class LivingArmourHandler { StatTrackerArrowShot.incrementCounter(armour); - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.arrowShot", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.arrowShot", chestStack); if (upgrade instanceof LivingArmourUpgradeArrowShot) { int charge = event.getCharge(); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java index 4c320e72..e4d8ff82 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.util.handler.event; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -17,7 +18,6 @@ import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; @@ -106,7 +106,7 @@ public class StatTrackerHandler public void entityHurt(LivingHurtEvent event) { DamageSource source = event.getSource(); - Entity sourceEntity = event.getSource().getEntity(); + Entity sourceEntity = event.getSource().getTrueSource(); EntityLivingBase attackedEntity = event.getEntityLiving(); if (attackedEntity instanceof EntityPlayer) @@ -196,7 +196,7 @@ public class StatTrackerHandler LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.experienced", chestStack); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.experienced", chestStack); if (upgrade instanceof LivingArmourUpgradeExperience) { double modifier = ((LivingArmourUpgradeExperience) upgrade).getExperienceModifier(); 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 9dd3d359..cc107dd4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -34,7 +34,7 @@ import WayofTime.bloodmagic.demonAura.PosXY; import WayofTime.bloodmagic.demonAura.WillChunk; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import WayofTime.bloodmagic.registry.ModPotions; @Handler @@ -47,7 +47,7 @@ public class WillHandler @SubscribeEvent public void onItemPickup(EntityItemPickupEvent event) { - ItemStack stack = event.getItem().getEntityItem(); + ItemStack stack = event.getItem().getItem(); if (stack.getItem() instanceof IDemonWill) { EntityPlayer player = event.getEntityPlayer(); @@ -67,7 +67,7 @@ public class WillHandler { if (event.getSource() instanceof EntityDamageSourceIndirect) { - Entity sourceEntity = event.getSource().getSourceOfDamage(); + Entity sourceEntity = event.getSource().getImmediateSource(); if (sourceEntity instanceof EntitySentientArrow) { @@ -82,7 +82,7 @@ public class WillHandler { EntityLivingBase attackedEntity = event.getEntityLiving(); DamageSource source = event.getSource(); - Entity entity = source.getEntity(); + Entity entity = source.getTrueSource(); if (attackedEntity.isPotionActive(ModPotions.soulSnare) && (attackedEntity instanceof EntityMob || attackedEntity.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL)) { @@ -90,7 +90,7 @@ public class WillHandler int lvl = eff.getAmplifier(); double amountOfSouls = attackedEntity.getEntityWorld().rand.nextDouble() * (lvl + 1) * (lvl + 1) * 5; - ItemStack soulStack = ((IDemonWill) ModItems.MONSTER_SOUL).createWill(0, amountOfSouls); + ItemStack soulStack = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL).createWill(0, amountOfSouls); event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); } @@ -159,18 +159,18 @@ public class WillHandler public void chunkSave(ChunkDataEvent.Save event) { int dim = event.getWorld().provider.getDimension(); - ChunkPos loc = event.getChunk().getChunkCoordIntPair(); + ChunkPos loc = event.getChunk().getPos(); NBTTagCompound nbt = new NBTTagCompound(); event.getData().setTag("BloodMagic", nbt); - WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.chunkXPos, loc.chunkZPos); + WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.x, loc.z); if (ac != null) { nbt.setShort("base", ac.getBase()); ac.getCurrentWill().writeToNBT(nbt, "current"); if (!event.getChunk().isLoaded()) - WorldDemonWillHandler.removeWillChunk(dim, loc.chunkXPos, loc.chunkZPos); + WorldDemonWillHandler.removeWillChunk(dim, loc.x, loc.z); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java index acebf301..73d27fd3 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java @@ -1,17 +1,17 @@ package WayofTime.bloodmagic.util.helper; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; +import net.minecraftforge.fml.common.registry.ForgeRegistries; public class RecipeHelper { public static IRecipe getRecipeForOutput(ItemStack stack) { - for (IRecipe recipe : CraftingManager.getInstance().getRecipeList()) + for (IRecipe recipe : ForgeRegistries.RECIPES.getValues()) { if (recipe != null) { From 554c9852e6b53987e5f17e47593942a04bb76ebd Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 15 Aug 2017 18:14:28 -0700 Subject: [PATCH 123/595] Move commonly used API systems to a plugin based system Create a class that implements IBloodMagicPlugin and annotate it with `@BloodMagicPlugin`. The `register` method will be called during init. Currently implemented systems: - Blacklisting - Teleposer - Teleposer (entity) - Transposition - Well of Suffering - Green Grove - Setting sacrificial values - Adding altar components --- .../java/WayofTime/bloodmagic/BloodMagic.java | 16 +- .../bloodmagic/altar/BloodAltar.java | 40 ++- .../bloodmagic/api/BloodMagicAPI.java | 260 +----------------- .../api/altar/EnumAltarComponent.java | 1 + .../bloodmagic/api/event/TeleposeEvent.java | 10 +- .../bloodmagic/api/registry/OrbRegistry.java | 10 - .../bloodmagic/api_impl/BloodMagicAPI.java | 56 ++++ .../api_impl/BloodMagicBlacklist.java | 97 +++++++ .../api_impl/BloodMagicCorePlugin.java | 54 ++++ .../bloodmagic/apiv2/BloodMagicPlugin.java | 12 + .../bloodmagic/apiv2/IBloodMagicAPI.java | 18 ++ .../apiv2/IBloodMagicBlacklist.java | 24 ++ .../bloodmagic/apiv2/IBloodMagicPlugin.java | 6 + .../bloodmagic/block/BlockAlchemyArray.java | 2 +- .../bloodmagic/block/BlockBloodLight.java | 2 +- .../bloodmagic/block/BlockLifeEssence.java | 2 - .../bloodmagic/block/BlockMimic.java | 2 +- .../block/BlockRitualController.java | 2 +- .../bloodmagic/block/BlockRitualStone.java | 6 +- .../bloodmagic/client/gui/GuiHolding.java | 2 +- .../client/hud/HUDElementHolding.java | 2 +- .../mesh/CustomMeshDefinitionWillGem.java | 2 +- .../render/entity/RenderEntitySoulSnare.java | 2 +- .../compat/guideapi/GuideBloodMagic.java | 4 +- .../compat/guideapi/book/CategoryAlchemy.java | 2 +- .../guideapi/book/CategoryArchitect.java | 4 +- .../compat/guideapi/book/CategoryDemon.java | 4 +- .../compat/guideapi/book/CategoryRitual.java | 4 +- .../compat/jei/BloodMagicPlugin.java | 4 +- .../compat/jei/altar/AltarRecipeMaker.java | 7 +- .../ArmourDowngradeRecipeJEI.java | 2 +- .../jei/forge/TartaricForgeRecipeJEI.java | 2 +- .../provider/DataProviderAlchemyArray.java | 4 +- .../provider/DataProviderBloodAltar.java | 2 +- .../RegistrarBloodMagic.java | 28 +- .../RegistrarBloodMagicBlocks.java | 17 +- .../RegistrarBloodMagicItems.java | 2 +- .../bloodmagic/entity/mob/EntityMimic.java | 2 +- .../entity/mob/EntitySentientSpecter.java | 2 +- .../entity/projectile/EntityBloodLight.java | 2 +- .../bloodmagic/fuel/FuelHandler.java | 2 +- .../incense/TranquilityHandlers.java | 2 +- .../bloodmagic/item/ItemArcaneAshes.java | 2 +- .../bloodmagic/item/ItemBloodOrb.java | 4 +- .../bloodmagic/item/ItemBoundSword.java | 2 +- .../bloodmagic/item/ItemBoundTool.java | 2 +- .../bloodmagic/item/ItemComponent.java | 2 +- .../item/ItemDaggerOfSacrifice.java | 21 +- .../bloodmagic/item/ItemDemonCrystal.java | 2 +- .../bloodmagic/item/ItemRitualDiviner.java | 2 +- .../item/alchemy/ItemCuttingFluid.java | 2 +- .../ItemLivingArmourPointsUpgrade.java | 2 +- .../item/armour/ItemLivingArmour.java | 2 +- .../item/armour/ItemSentientArmour.java | 2 +- .../item/sigil/ItemSigilBloodLight.java | 2 +- .../item/sigil/ItemSigilGreenGrove.java | 19 +- .../item/sigil/ItemSigilPhantomBridge.java | 2 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 2 +- .../bloodmagic/item/soul/ItemSentientBow.java | 2 +- .../item/soul/ItemSentientPickaxe.java | 2 +- .../item/soul/ItemSentientShovel.java | 2 +- .../item/soul/ItemSentientSword.java | 2 +- .../bloodmagic/potion/BMPotionUtils.java | 11 +- .../potion/PotionEventHandlers.java | 2 +- .../bloodmagic/proxy/ClientProxy.java | 4 +- .../AlchemyTablePotionAugmentRecipe.java | 2 +- .../AlchemyTablePotionRecipe.java | 2 +- .../registry/ModCorruptionBlocks.java | 1 + .../bloodmagic/registry/ModRecipes.java | 3 + .../bloodmagic/ritual/RitualAltarBuilder.java | 2 +- .../bloodmagic/ritual/RitualCrushing.java | 2 +- .../bloodmagic/ritual/RitualForsakenSoul.java | 39 +-- .../bloodmagic/ritual/RitualGreenGrove.java | 15 +- .../bloodmagic/ritual/RitualPortal.java | 2 +- .../ritual/RitualUpgradeRemove.java | 2 +- .../ritual/RitualWellOfSuffering.java | 23 +- .../tile/TileDemonCrystallizer.java | 2 +- .../bloodmagic/tile/TileInversionPillar.java | 2 +- .../tile/TileMasterRitualStone.java | 2 +- .../WayofTime/bloodmagic/tile/TileMimic.java | 4 +- .../bloodmagic/tile/TileSpectralBlock.java | 2 +- .../WayofTime/bloodmagic/util/PluginUtil.java | 36 +++ .../java/WayofTime/bloodmagic/util/Utils.java | 2 +- .../util/handler/event/CraftingHandler.java | 9 +- .../util/handler/event/GenericHandler.java | 51 ++-- .../util/handler/event/WillHandler.java | 2 +- 86 files changed, 528 insertions(+), 496 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java create mode 100644 src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java create mode 100644 src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java create mode 100644 src/main/java/WayofTime/bloodmagic/apiv2/BloodMagicPlugin.java create mode 100644 src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicAPI.java create mode 100644 src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java create mode 100644 src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicPlugin.java rename src/main/java/WayofTime/bloodmagic/{registry => core}/RegistrarBloodMagic.java (82%) rename src/main/java/WayofTime/bloodmagic/{registry => core}/RegistrarBloodMagicBlocks.java (94%) rename src/main/java/WayofTime/bloodmagic/{registry => core}/RegistrarBloodMagicItems.java (99%) create mode 100644 src/main/java/WayofTime/bloodmagic/util/PluginUtil.java diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index aacd5ff9..1ff629aa 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,10 +1,16 @@ package WayofTime.bloodmagic; import java.io.File; +import java.util.List; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; +import WayofTime.bloodmagic.apiv2.IBloodMagicPlugin; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.meteor.MeteorConfigHandler; +import WayofTime.bloodmagic.util.PluginUtil; +import com.google.common.collect.Lists; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.launchwrapper.Launch; @@ -19,15 +25,15 @@ import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.proxy.CommonProxy; import WayofTime.bloodmagic.registry.ModArmourTrackers; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.registry.ModCorruptionBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.registry.ModRecipes; import WayofTime.bloodmagic.registry.ModRituals; import WayofTime.bloodmagic.registry.ModTranquilityHandlers; import WayofTime.bloodmagic.structures.ModDungeons; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.handler.IMCHandler; +import org.apache.commons.lang3.tuple.Pair; @Mod(modid = BloodMagic.MODID, name = BloodMagic.NAME, version = BloodMagic.VERSION, dependencies = BloodMagic.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory") public class BloodMagic @@ -59,6 +65,7 @@ public class BloodMagic } }.setNoTitle().setBackgroundImageName("items_search.png"); public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + public static final List> PLUGINS = Lists.newArrayList(); static { @@ -79,6 +86,8 @@ public class BloodMagic configDir = new File(event.getModConfigurationDirectory(), "BloodMagic"); ConfigHandler.init(new File(configDir, "BloodMagic.cfg")); + PLUGINS.addAll(PluginUtil.getPlugins(event.getAsmData())); + ModTranquilityHandlers.init(); ModDungeons.init(); @@ -90,7 +99,8 @@ public class BloodMagic public void init(FMLInitializationEvent event) { BloodMagicPacketHandler.init(); - RegistrarBloodMagicBlocks.registerBlacklists(); + for (Pair plugin : PLUGINS) + plugin.getLeft().register(BloodMagicAPI.INSTANCE); ModRecipes.init(); ModRituals.initRituals(); diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 6f4ac6de..2f15c9b6 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -2,6 +2,8 @@ package WayofTime.bloodmagic.altar; import java.util.List; +import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -22,7 +24,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.AltarComponent; import WayofTime.bloodmagic.api.altar.AltarUpgrade; @@ -118,27 +119,20 @@ public class BloodAltar implements IFluidHandler for (AltarComponent altarComponent : EnumAltarTier.values()[altarTier].getAltarComponents()) { BlockPos componentPos = worldPos.add(altarComponent.getOffset()); - BlockStack worldBlock = new BlockStack(world.getBlockState(componentPos).getBlock(), world.getBlockState(componentPos).getBlock().getMetaFromState(world.getBlockState(componentPos))); + IBlockState state = world.getBlockState(componentPos); - if (altarComponent.getComponent() != EnumAltarComponent.NOTAIR) - { - if (worldBlock.getBlock() instanceof IAltarComponent) - { - EnumAltarComponent component = ((IAltarComponent) worldBlock.getBlock()).getType(world, worldBlock.getState(), componentPos); - if (component == null || component != altarComponent.getComponent()) - return false; - } else if (worldBlock.getBlock() != Utils.getBlockForComponent(altarComponent.getComponent())) // Special case Vanilla - { - return false; - } else if (BloodMagicAPI.altarComponents.get(worldBlock.getState()) != null) // Mod compat - { - return BloodMagicAPI.altarComponents.get(worldBlock.getState()) == altarComponent.getComponent(); - } - } else - { - if (world.isAirBlock(componentPos)) + if (altarComponent.getComponent() == EnumAltarComponent.NOTAIR && world.isAirBlock(componentPos)) + return false; + + if (state.getBlock() instanceof IAltarComponent) { + EnumAltarComponent component = ((IAltarComponent) state.getBlock()).getType(world, state, componentPos); + if (component == null || component != altarComponent.getComponent()) return false; } + + EnumAltarComponent component = BloodMagicAPI.INSTANCE.getAltarComponents().get(state); + if (component == null || component != altarComponent.getComponent()) + return false; } return true; @@ -259,10 +253,10 @@ public class BloodAltar implements IFluidHandler if (fluid != null) setMainFluid(fluid); - FluidStack fluidOut = new FluidStack(BloodMagicAPI.lifeEssence, tagCompound.getInteger(Constants.NBT.OUTPUT_AMOUNT)); + FluidStack fluidOut = new FluidStack(BlockLifeEssence.getLifeEssence(), tagCompound.getInteger(Constants.NBT.OUTPUT_AMOUNT)); setOutputFluid(fluidOut); - FluidStack fluidIn = new FluidStack(BloodMagicAPI.lifeEssence, tagCompound.getInteger(Constants.NBT.INPUT_AMOUNT)); + FluidStack fluidIn = new FluidStack(BlockLifeEssence.getLifeEssence(), tagCompound.getInteger(Constants.NBT.INPUT_AMOUNT)); setInputFluid(fluidIn); } @@ -540,8 +534,8 @@ public class BloodAltar implements IFluidHandler { int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 ? consumptionRate * (1 + consumptionMultiplier) : consumptionRate), fluid.amount); - int drain = NetworkHelper.getSoulNetwork(ownerUUID).add(liquidDrained, (int) (item.getMaxEssence(returnedItem.getMetadata()) * this.orbCapacityMultiplier)); - + BloodOrb orb = item.getOrb(returnedItem); + int drain = orb == null ? 0 : NetworkHelper.getSoulNetwork(ownerUUID).add(liquidDrained, (int) (orb.getCapacity() * this.orbCapacityMultiplier)); fluid.amount = fluid.amount - drain; if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java index 488cddc1..01b09f14 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java @@ -1,277 +1,19 @@ package WayofTime.bloodmagic.api; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.util.helper.LogHelper; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.ForgeModContainer; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.UniversalBucket; -import net.minecraftforge.fml.common.registry.ForgeRegistries; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; /** * The primary API class. Includes helper methods and blacklists. * * Some API methods can be used via IMC instead. The supported methods are: - * - *
          - *
        • {@link #addToTeleposerBlacklist(BlockStack)}
        • - *
        • {@link #blacklistFromGreenGrove(Block)}
        • - *
        • {@link #setEntitySacrificeValue(Class, int)}
        • - *
        • {@link #addAltarComponent(IBlockState, EnumAltarComponent)}
        • - *
        */ +// TODO - Nuke this class public class BloodMagicAPI { - public static final List teleposerBlacklist = new ArrayList(); - public static final List transpositionBlacklist = new ArrayList(); - public static final Map entitySacrificeValues = new HashMap(); - public static final ArrayList greenGroveBlacklist = new ArrayList(); - public static final Map altarComponents = new HashMap(); - public static boolean loggingEnabled; public static LogHelper logger = new LogHelper("BloodMagic|API"); public static DamageSource damageSource = new DamageSourceBloodMagic(); - - public static Fluid lifeEssence; - public static ItemStack lifeEssenceBucket; - - public static ItemStack getLifeEssenceBucket() - { - if (lifeEssenceBucket != null) - return lifeEssenceBucket; - - lifeEssenceBucket = UniversalBucket.getFilledBucket(ForgeModContainer.getInstance().universalBucket, lifeEssence); - return lifeEssenceBucket; - } - - /** - * Used to obtain Items from BloodMagic. Use - * {@link WayofTime.bloodmagic.api.Constants.BloodMagicItem} to get the - * registered name. - * - * @param name - * - The registered name of the item. Usually the same as the class - * name. - * @return - The requested Item - */ - public static Item getItem(String name) - { - return ForgeRegistries.ITEMS.getValue(new ResourceLocation(BloodMagic.MODID, name)); - } - - /** - * @see #getItem(String) - * - * @param bloodMagicItem - * - The {@link WayofTime.bloodmagic.api.Constants.BloodMagicItem} to - * get. - * @return - The requested Item - */ - public static Item getItem(Constants.BloodMagicItem bloodMagicItem) - { - return getItem(bloodMagicItem.getRegName()); - } - - /** - * Used to obtain Blocks from BloodMagic. Use - * {@link WayofTime.bloodmagic.api.Constants.BloodMagicBlock} to get the - * registered name. - * - * @param name - * - The registered name of the block. Usually the same as the class - * name. - * @return - The requested Block - */ - public static Block getBlock(String name) - { - return ForgeRegistries.BLOCKS.getValue(new ResourceLocation(BloodMagic.MODID, name)); - } - - /** - * @see #getBlock(String) - * - * @param bloodMagicBlock - * - The {@link WayofTime.bloodmagic.api.Constants.BloodMagicBlock} - * to get. - * @return - The requested Block - */ - public static Block getBlock(Constants.BloodMagicBlock bloodMagicBlock) - { - return getBlock(bloodMagicBlock.getRegName()); - } - - /** - * Used to add a {@link BlockStack} to the Teleposer blacklist that cannot - * be changed via Configuration files. - * - * IMC: - * {@code FMLInterModComs.sendMessage("bloodmagic", "teleposerBlacklist", ItemStack)} - * Example: - * {@code FMLInterModComs.sendMessage("bloodmagic", "teleposerBlacklist", new ItemStack(Blocks.bedrock))} - * - * @param blockStack - * - The BlockStack to blacklist. - */ - public static void addToTeleposerBlacklist(BlockStack blockStack) - { - if (!teleposerBlacklist.contains(blockStack)) - teleposerBlacklist.add(blockStack); - } - - /** - * @see #addToTeleposerBlacklist(BlockStack) - * - * @param block - * - The block to blacklist - * @param meta - * - The meta of the block to blacklist - */ - public static void addToTeleposerBlacklist(Block block, int meta) - { - addToTeleposerBlacklist(new BlockStack(block, meta)); - } - - /** - * @see #addToTeleposerBlacklist(BlockStack) - * - * @param block - * - The block to blacklist - */ - public static void addToTeleposerBlacklist(Block block) - { - addToTeleposerBlacklist(block, 0); - } - - /** - * Used to add a {@link BlockStack} to the Transposition blacklist that - * cannot be changed via Configuration files. - * - * IMC: - * {@code FMLInterModComs.sendMessage("bloodmagic", "transpositionBlacklist", ItemStack)} - * Example: - * {@code FMLInterModComs.sendMessage("bloodmagic", "transpositionBlacklist", new ItemStack(Blocks.bedrock))} - * - * @param blockStack - * - The BlockStack to blacklist. - */ - public static void addToTranspositionBlacklist(BlockStack blockStack) - { - if (!transpositionBlacklist.contains(blockStack)) - transpositionBlacklist.add(blockStack); - } - - /** - * @see #addToTranspositionBlacklist(BlockStack) - * - * @param block - * - The block to blacklist - * @param meta - * - The meta of the block to blacklist - */ - public static void addToTranspositionBlacklist(Block block, int meta) - { - addToTranspositionBlacklist(new BlockStack(block, meta)); - } - - /** - * @see #addToTranspositionBlacklist(BlockStack) - * - * @param block - * - The block to blacklist - */ - public static void addToTranspositionBlacklist(Block block) - { - addToTranspositionBlacklist(block, 0); - } - - /** - * Used to set the sacrifice value of an Entity. The value provided is how - * much LP will be gained when the entity is sacrificed at a Blood Altar. - * - * Setting a sacrificeValue of 0 will effectively blacklist the entity. - * - * The default value for any unset Entity is 500 LP per sacrifice. - * - * IMC: - * {@code FMLInterModComs.sendMessage("bloodmagic", "sacrificeValue", "ClassName;Value")} - * Example: - * {@code FMLInterModComs.sendMessage("bloodmagic", "sacrificeValue", "EntityVillager;2000")} - * - * @param entityClass - * - The class of the entity to blacklist. - * @param sacrificeValue - * - The Amount of LP to provide per each HP of the entity - * sacrificed. - */ - public static void setEntitySacrificeValue(Class entityClass, int sacrificeValue) - { - if (!entitySacrificeValues.containsKey(entityClass.getSimpleName())) - entitySacrificeValues.put(entityClass.getSimpleName(), sacrificeValue); - } - - /** - * @see #setEntitySacrificeValue(Class, int) - * - * @param entityClassName - * - The name of the class of the entity to blacklist. - * @param sacrificeValue - * - The Amount of LP to provide per each HP of the entity - * sacrificed. - */ - public static void setEntitySacrificeValue(String entityClassName, int sacrificeValue) - { - if (!entitySacrificeValues.containsKey(entityClassName)) - entitySacrificeValues.put(entityClassName, sacrificeValue); - } - - /** - * Blacklists a block from the Green Grove Ritual and Sigil. - * - * IMC: - * {@code FMLInterModComs.sendMessage("bloodmagic", "greenGroveBlacklist", "domain:name")} - * Example: - * {@code FMLInterModComs.sendMessage("bloodmagic", "greenGroveBlacklist", "minecraft:wheat")} - * - * @param block - * - Block to blacklist - */ - public static void blacklistFromGreenGrove(Block block) - { - if (!greenGroveBlacklist.contains(block)) - greenGroveBlacklist.add(block); - } - - /** - * Marks an IBlockState as a specific {@link EnumAltarComponent} without needing to implement - * {@link WayofTime.bloodmagic.api.altar.IAltarComponent} on the block. - * - * IMC: - * {@code FMLInterModComs.sendMessage("bloodmagic", "altarComponent", "domain:name:meta:component")} - * Example: - * {@code FMLInterModComs.sendMessage("bloodmagic", "altarComponent", "minecraft:glowstone:0:GLOWSTONE")} - * - * @param state - * - The IBlockState for this component - * @param altarComponent - * - The EnumAltarComponent for this state - */ - public static void addAltarComponent(IBlockState state, EnumAltarComponent altarComponent) - { - if (!altarComponents.containsKey(state)) - altarComponents.put(state, altarComponent); - } } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java index 185fc725..2afd90e8 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java @@ -14,6 +14,7 @@ public enum EnumAltarComponent CRYSTAL, NOTAIR; + public static final EnumAltarComponent[] VALUES = values(); private static final String BASE = "chat.bloodmagic.altar.comp."; private String key; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java index eb9e3833..26ee25e2 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.api.event; -import WayofTime.bloodmagic.api.BlockStack; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -18,21 +18,21 @@ public class TeleposeEvent extends Event { public final World initalWorld; public final BlockPos initialBlockPos; - public final BlockStack initialStack; + public final IBlockState initialState; public final World finalWorld; public final BlockPos finalBlockPos; - public final BlockStack finalStack; + public final IBlockState finalState; public TeleposeEvent(World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) { this.initalWorld = initialWorld; this.initialBlockPos = initialBlockPos; - this.initialStack = BlockStack.getStackFromPos(initialWorld, initialBlockPos); + this.initialState = initialWorld.getBlockState(initialBlockPos); this.finalWorld = finalWorld; this.finalBlockPos = finalBlockPos; - this.finalStack = BlockStack.getStackFromPos(finalWorld, finalBlockPos); + this.finalState = finalWorld.getBlockState(finalBlockPos); } public TileEntity getInitialTile() diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java index 19c8500a..a0d2eebe 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java @@ -1,22 +1,12 @@ package WayofTime.bloodmagic.api.registry; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.EnumAltarTier; import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; import com.google.common.collect.ArrayListMultimap; -import net.minecraft.client.renderer.block.model.ModelBakery; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java new file mode 100644 index 00000000..2177fa35 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java @@ -0,0 +1,56 @@ +package WayofTime.bloodmagic.api_impl; + +import WayofTime.bloodmagic.api.altar.EnumAltarComponent; +import WayofTime.bloodmagic.apiv2.IBloodMagicAPI; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.ResourceLocation; + +import java.util.Map; + +public class BloodMagicAPI implements IBloodMagicAPI { + + public static final BloodMagicAPI INSTANCE = new BloodMagicAPI(); + + private final BloodMagicBlacklist blacklist; + private final Map sacrificialValues; + private final Map altarComponents; + + public BloodMagicAPI() { + this.blacklist = new BloodMagicBlacklist(); + this.sacrificialValues = Maps.newHashMap(); + this.altarComponents = Maps.newHashMap(); + } + + @Override + public BloodMagicBlacklist getBlacklist() { + return blacklist; + } + + @Override + public void setSacrificialValue(ResourceLocation entityId, int value) { + sacrificialValues.put(entityId, value); + } + + @Override + public void registerAltarComponent(IBlockState state, String componentType) { + EnumAltarComponent component = EnumAltarComponent.NOTAIR; + for (EnumAltarComponent type : EnumAltarComponent.VALUES) { + if (type.name().equalsIgnoreCase(componentType)) { + component = type; + break; + } + } + + altarComponents.put(state, component); + } + + public Map getSacrificialValues() { + return ImmutableMap.copyOf(sacrificialValues); + } + + public Map getAltarComponents() { + return ImmutableMap.copyOf(altarComponents); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java new file mode 100644 index 00000000..0d448390 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java @@ -0,0 +1,97 @@ +package WayofTime.bloodmagic.api_impl; + +import WayofTime.bloodmagic.apiv2.IBloodMagicBlacklist; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.ResourceLocation; + +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(IBlockState state) { + if (!teleposer.contains(state)) + teleposer.add(state); + } + + @Override + public void addTeleposer(Block block) { + for (IBlockState state : block.getBlockState().getValidStates()) + addTeleposer(state); + } + + @Override + public void addTeleposer(ResourceLocation entityId) { + if (!teleposerEntities.contains(entityId)) + teleposerEntities.add(entityId); + } + + @Override + public void addTransposition(IBlockState state) { + if (!transposition.contains(state)) + transposition.add(state); + } + + @Override + public void addTransposition(Block block) { + for (IBlockState state : block.getBlockState().getValidStates()) + addTransposition(state); + } + + @Override + public void addGreenGrove(IBlockState state) { + if (!greenGrove.contains(state)) + greenGrove.add(state); + } + + @Override + public void addGreenGrove(Block block) { + for (IBlockState state : block.getBlockState().getValidStates()) + addGreenGrove(state); + } + + @Override + public void addSacrifice(ResourceLocation entityId) { + if (!sacrifice.contains(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 new file mode 100644 index 00000000..e2800fc6 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java @@ -0,0 +1,54 @@ +package WayofTime.bloodmagic.api_impl; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.altar.EnumAltarComponent; +import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; +import WayofTime.bloodmagic.apiv2.IBloodMagicAPI; +import WayofTime.bloodmagic.apiv2.IBloodMagicPlugin; +import WayofTime.bloodmagic.block.BlockBloodRune; +import WayofTime.bloodmagic.block.BlockDecorative; +import WayofTime.bloodmagic.block.enums.EnumBloodRune; +import WayofTime.bloodmagic.block.enums.EnumDecorative; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import net.minecraft.init.Blocks; +import net.minecraft.util.ResourceLocation; + +@BloodMagicPlugin +public class BloodMagicCorePlugin implements IBloodMagicPlugin { + + @Override + public void register(IBloodMagicAPI api) { + // 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().addSacrifice(new ResourceLocation("armor_stand")); + api.getBlacklist().addSacrifice(new ResourceLocation(BloodMagic.MODID, "sentient_specter")); + + // TODO - Register things from config + + // Add standard blocks for altar components + api.registerAltarComponent(Blocks.GLOWSTONE.getDefaultState(), EnumAltarComponent.GLOWSTONE.name()); + api.registerAltarComponent(Blocks.SEA_LANTERN.getDefaultState(), EnumAltarComponent.GLOWSTONE.name()); + api.registerAltarComponent(Blocks.BEACON.getDefaultState(), EnumAltarComponent.BEACON.name()); + + BlockDecorative decorative = (BlockDecorative) RegistrarBloodMagicBlocks.DECORATIVE_BRICK; + api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.BLOODSTONE_BRICK), EnumAltarComponent.BLOODSTONE.name()); + api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.BLOODSTONE_TILE), EnumAltarComponent.BLOODSTONE.name()); + api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.CRYSTAL_BRICK), EnumAltarComponent.CRYSTAL.name()); + api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.CRYSTAL_TILE), EnumAltarComponent.CRYSTAL.name()); + + BlockBloodRune bloodRune = (BlockBloodRune) RegistrarBloodMagicBlocks.BLOOD_RUNE; + for (EnumBloodRune runeType : EnumBloodRune.values()) + api.registerAltarComponent(bloodRune.getDefaultState().withProperty(bloodRune.getProperty(), runeType), EnumAltarComponent.BLOODRUNE.name()); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/apiv2/BloodMagicPlugin.java new file mode 100644 index 00000000..6458977d --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/apiv2/BloodMagicPlugin.java @@ -0,0 +1,12 @@ +package WayofTime.bloodmagic.apiv2; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface BloodMagicPlugin { + +} diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicAPI.java new file mode 100644 index 00000000..0e7c8d50 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicAPI.java @@ -0,0 +1,18 @@ +package WayofTime.bloodmagic.apiv2; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.ResourceLocation; + +public interface IBloodMagicAPI { + + /** + * Retrieves the instance of the blacklisting system that Blood Magic uses. + * + * @return the active blacklist instance + */ + IBloodMagicBlacklist getBlacklist(); + + void setSacrificialValue(ResourceLocation entityId, int value); + + void registerAltarComponent(IBlockState state, String componentType); +} diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java new file mode 100644 index 00000000..61caa272 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java @@ -0,0 +1,24 @@ +package WayofTime.bloodmagic.apiv2; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.ResourceLocation; + +public interface IBloodMagicBlacklist { + + void addTeleposer(IBlockState state); + + void addTeleposer(Block block); + + void addTeleposer(ResourceLocation entityId); + + void addTransposition(IBlockState state); + + void addTransposition(Block block); + + void addGreenGrove(IBlockState state); + + void addGreenGrove(Block block); + + void addSacrifice(ResourceLocation entityId); +} diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicPlugin.java new file mode 100644 index 00000000..ad2098a7 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicPlugin.java @@ -0,0 +1,6 @@ +package WayofTime.bloodmagic.apiv2; + +public interface IBloodMagicPlugin { + + void register(IBloodMagicAPI api); +} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java index 538a176c..589703ee 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java @@ -22,7 +22,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java index 33815c73..3b395958 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -17,7 +17,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import javax.annotation.Nullable; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java index 11e26187..51f7cb2b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java @@ -12,7 +12,6 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -26,7 +25,6 @@ public class BlockLifeEssence extends BlockFluidClassic setUnlocalizedName(BloodMagic.MODID + ".fluid.lifeEssence"); getLifeEssence().setBlock(this); - BloodMagicAPI.lifeEssence = LIFE_ESSENCE; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 188f2f74..19b6c3b2 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -27,7 +27,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.altar.IAltarComponent; import WayofTime.bloodmagic.block.enums.EnumMimic; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMimic; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 08884846..16c12687 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -27,7 +27,7 @@ import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.api.util.helper.RitualHelper; import WayofTime.bloodmagic.block.enums.EnumRitualController; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileImperfectRitualStone; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import amerifrance.guideapi.api.IGuideLinked; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 050aa5bc..6bb21812 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; import java.util.List; import net.minecraft.block.SoundType; @@ -14,15 +13,12 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.helper.TextHelper; public class BlockRitualStone extends BlockEnum implements IRitualStone diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java index c5a8383c..8a21e4e2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java @@ -4,7 +4,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.item.inventory.ContainerHolding; import WayofTime.bloodmagic.item.inventory.InventoryHolding; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java index e390f1c7..227b832c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.client.hud; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java index 9fce3d6b..dc2c6825 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java @@ -7,7 +7,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.item.soul.ItemSoulGem; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; public class CustomMeshDefinitionWillGem implements ItemMeshDefinition { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java index 1e7fe96f..9e42137d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderItem; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java index 44e32f8f..7294e344 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.compat.guideapi; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.compat.guideapi.book.*; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index 39700f14..3e6f6549 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -6,7 +6,7 @@ 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.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.RecipeHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.IPage; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index 620c5d4f..6bace0a1 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -19,8 +19,8 @@ import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; import WayofTime.bloodmagic.item.ItemComponent; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java index 932a25ca..c64ca7fc 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java @@ -14,8 +14,8 @@ import WayofTime.bloodmagic.api.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.registry.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index b80a4530..62b1cf94 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -15,8 +15,8 @@ import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index 36488e9f..aa1bcb3e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -31,8 +31,8 @@ import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeHandler; import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeMaker; import WayofTime.bloodmagic.compat.jei.orb.ShapedOrbRecipeHandler; import WayofTime.bloodmagic.compat.jei.orb.ShapelessOrbRecipeHandler; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; @JEIPlugin public class BloodMagicPlugin extends BlankModPlugin diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java index 190629df..0d9b3b92 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java @@ -6,12 +6,15 @@ import java.util.Map; import javax.annotation.Nonnull; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.ItemStackWrapper; +import WayofTime.bloodmagic.block.BlockLifeEssence; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.orb.IBloodOrb; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; import net.minecraftforge.common.ForgeModContainer; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; public class AltarRecipeMaker { @@ -35,7 +38,7 @@ public class AltarRecipeMaker int drainRate = itemStackAltarRecipeEntry.getValue().getDrainRate(); if (output.getItem() == ForgeModContainer.getInstance().universalBucket && requiredLP == 1000) - output = BloodMagicAPI.getLifeEssenceBucket(); + output = FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)); AltarRecipeJEI recipe = new AltarRecipeJEI(input, output, requiredTier, requiredLP, consumptionRate, drainRate); recipes.add(recipe); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java index dc52ada3..60bb0f00 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java @@ -8,7 +8,7 @@ import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import java.util.List; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java index 054bf9ab..a9f9fc8e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java @@ -11,7 +11,7 @@ import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; public class TartaricForgeRecipeJEI extends BlankRecipeWrapper diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index 0e42a93e..01f993dd 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -12,8 +12,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index dfc428ec..22960cf1 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -17,7 +17,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java similarity index 82% rename from src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagic.java rename to src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 9d73e45f..074f188a 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.registry; +package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.orb.BloodOrb; @@ -10,6 +10,7 @@ import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.init.MobEffects; import net.minecraft.potion.Potion; 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; @@ -17,6 +18,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; 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; @@ -84,16 +87,16 @@ public class RegistrarBloodMagic { @SubscribeEvent public static void registerEntities(RegistryEvent.Register event) { int entities = 0; - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "BloodLight"), EntityBloodLight.class, "BloodLight", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "SoulSnare"), EntitySoulSnare.class, "SoulSnare", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "SoulArrow"), EntitySentientArrow.class, "SoulArrow", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "Meteor"), EntityMeteor.class, "Meteor", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "SentientSpecter"), EntitySentientSpecter.class, "SentientSpecter", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "Mimic"), EntityMimic.class, "Mimic", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "CorruptedZombie"), EntityCorruptedZombie.class, "CorruptedZombie", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "CorruptedSheep"), EntityCorruptedSheep.class, "CorruptedSheep", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "CorruptedChicken"), EntityCorruptedChicken.class, "CorruptedChicken", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "CorruptedSpider"), EntityCorruptedSpider.class, "CorruptedSpider", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "blood_light"), EntityBloodLight.class, "BloodLight", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "soul_snare"), EntitySoulSnare.class, "SoulSnare", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "soul_arrow"), EntitySentientArrow.class, "SoulArrow", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "meteor"), EntityMeteor.class, "Meteor", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "sentient_specter"), EntitySentientSpecter.class, "SentientSpecter", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "mimic"), EntityMimic.class, "Mimic", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_zombie"), EntityCorruptedZombie.class, "CorruptedZombie", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_sheep"), EntityCorruptedSheep.class, "CorruptedSheep", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_chicken"), EntityCorruptedChicken.class, "CorruptedChicken", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_spider"), EntityCorruptedSpider.class, "CorruptedSpider", ++entities, BloodMagic.instance, 16*4, 3, true); } @SubscribeEvent @@ -106,8 +109,9 @@ public class RegistrarBloodMagic { .create(); } + @SideOnly(Side.CLIENT) @SubscribeEvent - public static void registerModels() { + public static void registerModels(ModelRegistryEvent event) { for (BloodOrb orb : BLOOD_ORBS) { ModelResourceLocation modelLocation = orb.getModelLocation(); if (modelLocation == null) diff --git a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicBlocks.java rename to src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java index 0b2bee5c..0f2d063d 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java @@ -1,6 +1,5 @@ -package WayofTime.bloodmagic.registry; +package WayofTime.bloodmagic.core; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.block.*; import com.google.common.collect.Sets; import net.minecraft.block.Block; @@ -149,8 +148,7 @@ public class RegistrarBloodMagicBlocks registerTiles(); } - private static void registerTiles() - { + private static void registerTiles() { GameRegistry.registerTileEntity(TileAltar.class, BloodMagic.MODID + ":" + TileAltar.class.getSimpleName()); GameRegistry.registerTileEntity(TileImperfectRitualStone.class, BloodMagic.MODID + ":" + TileImperfectRitualStone.class.getSimpleName()); GameRegistry.registerTileEntity(TileMasterRitualStone.class, BloodMagic.MODID + ":" + TileMasterRitualStone.class.getSimpleName()); @@ -175,15 +173,4 @@ public class RegistrarBloodMagicBlocks GameRegistry.registerTileEntity(TileMimic.class, BloodMagic.MODID + ":" + TileMimic.class.getSimpleName()); GameRegistry.registerTileEntity(TileInversionPillar.class, BloodMagic.MODID + ":" + TileInversionPillar.class.getSimpleName()); } - - public static void registerBlacklists() { - BloodMagicAPI.addToTeleposerBlacklist(INPUT_ROUTING_NODE); - BloodMagicAPI.addToTranspositionBlacklist(INPUT_ROUTING_NODE); - BloodMagicAPI.addToTeleposerBlacklist(OUTPUT_ROUTING_NODE); - BloodMagicAPI.addToTranspositionBlacklist(OUTPUT_ROUTING_NODE); - BloodMagicAPI.addToTeleposerBlacklist(ITEM_ROUTING_NODE); - BloodMagicAPI.addToTranspositionBlacklist(ITEM_ROUTING_NODE); - BloodMagicAPI.addToTeleposerBlacklist(DEMON_CRYSTAL); - BloodMagicAPI.addToTranspositionBlacklist(DEMON_CRYSTAL); - } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicItems.java rename to src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index ed3fa1db..d6385a0a 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.registry; +package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.block.IBMBlock; import WayofTime.bloodmagic.client.IVariantProvider; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index ee5dbb28..890c3392 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -35,7 +35,7 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import WayofTime.bloodmagic.block.BlockMimic; import WayofTime.bloodmagic.entity.ai.EntityAIMimicReform; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMimic; public class EntityMimic extends EntityDemonBase diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 28870cf9..670addf3 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -50,7 +50,7 @@ import WayofTime.bloodmagic.entity.ai.EntityAIOwnerHurtByTarget; import WayofTime.bloodmagic.entity.ai.EntityAIOwnerHurtTarget; import WayofTime.bloodmagic.entity.ai.EntityAIRetreatToHeal; import WayofTime.bloodmagic.item.soul.ItemSentientBow; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; public class EntitySentientSpecter extends EntityDemonBase { diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index 3f9c0c9d..534f94dc 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.entity.projectile; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java index 5aeac49d..ff3288c8 100644 --- a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java +++ b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.fuel; import WayofTime.bloodmagic.item.ItemComponent; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.IFuelHandler; diff --git a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java index a5bb1bca..b5d6b14d 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.incense; import WayofTime.bloodmagic.api.incense.EnumTranquilityType; import WayofTime.bloodmagic.api.incense.ITranquilityHandler; import WayofTime.bloodmagic.api.incense.TranquilityStack; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import net.minecraft.block.*; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index 0455e0cf..8f66d4b2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -20,7 +20,7 @@ import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 11363574..2a23f3cd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -3,11 +3,10 @@ package WayofTime.bloodmagic.item; import java.util.List; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.registry.RegistrarBloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.*; @@ -17,7 +16,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.orb.BloodOrb; import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index fb92e1f1..802c36cd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -35,7 +35,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index a06f4815..950ce1bb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -41,7 +41,7 @@ import WayofTime.bloodmagic.api.event.BoundToolEvent; import WayofTime.bloodmagic.api.iface.IActivatable; import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.ImmutableSet; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java index 872943a7..c82e49ac 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java @@ -16,7 +16,7 @@ import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; public class ItemComponent extends Item implements IVariantProvider { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index d0dcd611..eeca6902 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -3,6 +3,8 @@ package WayofTime.bloodmagic.item; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import com.google.common.collect.Lists; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.passive.EntityAnimal; @@ -14,12 +16,13 @@ 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 org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.api.util.helper.PurificationHelper; import WayofTime.bloodmagic.client.IVariantProvider; @@ -56,14 +59,8 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider if (target.isDead || target.getHealth() < 0.5F) return false; - String entityName = target.getClass().getSimpleName(); - int lifeEssenceRatio = 25; - - if (ConfigHandler.entitySacrificeValues.containsKey(entityName)) - lifeEssenceRatio = ConfigHandler.entitySacrificeValues.get(entityName); - - if (BloodMagicAPI.getEntitySacrificeValues().containsKey(entityName)) - lifeEssenceRatio = BloodMagicAPI.getEntitySacrificeValues().get(entityName); + EntityEntry entityEntry = EntityRegistry.getEntry(target.getClass()); + int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getSacrificialValues().getOrDefault(entityEntry.getRegistryName(), 25); if (lifeEssenceRatio <= 0) return false; @@ -83,7 +80,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { 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(BloodMagicAPI.getDamageSource()); + target.onDeath(WayofTime.bloodmagic.api.BloodMagicAPI.damageSource); } return false; @@ -92,8 +89,8 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=normal")); + List> ret = Lists.newArrayList(); + ret.add(Pair.of(0, "type=normal")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java index 431ece2c..ee9c01a8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java @@ -19,7 +19,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVariantProvider { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index a4f33273..99da587c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -36,7 +36,7 @@ import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.util.helper.RitualHelper; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index c375b389..fbaede56 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -20,7 +20,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.iface.ICustomAlchemyConsumable; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomAlchemyConsumable diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java index a4a9030e..c701e1df 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java @@ -28,7 +28,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.Iterables; diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 31abf8de..1cca89be 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -45,7 +45,7 @@ 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.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index d1fa549b..064389f8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -31,7 +31,7 @@ import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 16270618..03e54516 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -15,7 +15,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; public class ItemSigilBloodLight extends ItemSigilBase { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java index 95c4120b..279460ca 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java @@ -1,19 +1,18 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import net.minecraft.block.Block; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import net.minecraft.block.IGrowable; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.BonemealEvent; import net.minecraftforge.fml.common.eventhandler.Event.Result; -import WayofTime.bloodmagic.api.BloodMagicAPI; public class ItemSigilGreenGrove extends ItemSigilToggleableBase { @@ -28,7 +27,7 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase if (PlayerHelper.isFakePlayer(player)) return false; - if (applyBonemeal(world, blockPos, player)) + if (applyBonemeal(world, blockPos, player, stack)) { if (!world.isRemote) { @@ -59,16 +58,16 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase for (int iy = posY - verticalRange; iy <= posY + verticalRange; iy++) { BlockPos blockPos = new BlockPos(ix, iy, iz); - Block block = worldIn.getBlockState(blockPos).getBlock(); + IBlockState state = worldIn.getBlockState(blockPos); - if (!BloodMagicAPI.greenGroveBlacklist.contains(block)) + if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { - if (block instanceof IPlantable || block instanceof IGrowable) + if (state.getBlock() instanceof IGrowable) { if (worldIn.rand.nextInt(50) == 0) { IBlockState preBlockState = worldIn.getBlockState(blockPos); - block.updateTick(worldIn, blockPos, worldIn.getBlockState(blockPos), worldIn.rand); + state.getBlock().updateTick(worldIn, blockPos, state, worldIn.rand); IBlockState newState = worldIn.getBlockState(blockPos); if (!newState.equals(preBlockState) && !worldIn.isRemote) @@ -81,11 +80,11 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase } } - private boolean applyBonemeal(World worldIn, BlockPos target, EntityPlayer player) + private boolean applyBonemeal(World worldIn, BlockPos target, EntityPlayer player, ItemStack sigilStack) { IBlockState iblockstate = worldIn.getBlockState(target); - BonemealEvent event = new BonemealEvent(player, worldIn, target, iblockstate); + BonemealEvent event = new BonemealEvent(player, worldIn, target, iblockstate, EnumHand.MAIN_HAND, sigilStack); if (MinecraftForge.EVENT_BUS.post(event)) return false; else if (event.getResult() == Result.ALLOW) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java index 1317289f..e391c276 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java @@ -11,7 +11,7 @@ import net.minecraft.world.World; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 1908126c..3eec1f87 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -40,7 +40,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 756afb9d..0a06e2e4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -31,7 +31,7 @@ import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import java.util.Locale; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index d5ff992e..a7e70b1d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -40,7 +40,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index cd7f8772..b7caaec3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -40,7 +40,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index c91d43b2..eb7e8a1a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -38,7 +38,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index 5e8fdc05..7751ab33 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.List; import java.util.Random; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import net.minecraft.block.Block; import net.minecraft.block.IGrowable; import net.minecraft.block.state.IBlockState; @@ -16,8 +17,6 @@ import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.common.IPlantable; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionAugmentRecipe; @@ -46,11 +45,11 @@ public class BMPotionUtils 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); - Block block = world.getBlockState(blockPos).getBlock(); + IBlockState state = world.getBlockState(blockPos); - if (!BloodMagicAPI.greenGroveBlacklist.contains(block)) + if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { - if (block instanceof IPlantable || block instanceof IGrowable) + if (state.getBlock() instanceof IGrowable) { growList.add(blockPos); } @@ -77,7 +76,7 @@ public class BMPotionUtils if (incurredDamage > 0) { - entity.attackEntityFrom(BloodMagicAPI.damageSource, (float) incurredDamage); + entity.attackEntityFrom(WayofTime.bloodmagic.api.BloodMagicAPI.damageSource, (float) incurredDamage); } return incurredDamage; diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 78421d2f..fa7c6237 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.potion; import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.registry.RegistrarBloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.IProjectile; import net.minecraft.entity.projectile.EntityArrow; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 87aa212f..d65d42cd 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -57,8 +57,8 @@ 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.registry.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java index 9b0c084f..4b9811cb 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java @@ -7,7 +7,7 @@ import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionUtils; import WayofTime.bloodmagic.potion.BMPotionUtils; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index c1cdb1bc..032bff2f 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -9,7 +9,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java index 00f5aa8a..c425cfd9 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.registry; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import net.minecraft.init.Blocks; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.inversion.CorruptionHandler; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 998a7c07..ac80d534 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -8,6 +8,9 @@ import java.util.Map.Entry; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.block.enums.EnumBloodRune; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.soul.ItemSoulGem; import WayofTime.bloodmagic.tile.TileBloodTank; import com.google.common.collect.ImmutableMap; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index 4855b98b..6b7a905b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -10,7 +10,7 @@ import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.block.BlockBloodRune; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.entity.effect.EntityLightningBolt; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index 1b1d752c..515bf11a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -30,7 +30,7 @@ import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; public class RitualCrushing extends Ritual diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 32f20fe1..ae60ee22 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; @@ -20,6 +21,8 @@ import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.tile.TileDemonCrystal; +import net.minecraftforge.fml.common.registry.EntityEntry; +import net.minecraftforge.fml.common.registry.EntityRegistry; public class RitualForsakenSoul extends Ritual { @@ -116,29 +119,31 @@ public class RitualForsakenSoul extends Ritual for (EntityLivingBase entity : entities) { - if (!ConfigHandler.wellOfSufferingBlacklist.contains(entity.getClass().getSimpleName())) + EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); + + if (BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) + continue; + + if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { - if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) + if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) { - if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) + if (!entity.isEntityAlive()) { - if (!entity.isEntityAlive()) + int uniqueness = calculateUniqueness(entity); + double modifier = 1; + if (entity instanceof EntityAnimal && !entity.isCollided) { - int uniqueness = calculateUniqueness(entity); - double modifier = 1; - if (entity instanceof EntityAnimal && !entity.isCollided) - { - modifier = 4; - } + modifier = 4; + } - willBuffer += modifier * getWillForUniqueness(uniqueness) / HEALTH_THRESHOLD * entity.getMaxHealth(); - crystalBuffer += modifier * entity.getMaxHealth() / HEALTH_THRESHOLD; + willBuffer += modifier * getWillForUniqueness(uniqueness) / HEALTH_THRESHOLD * entity.getMaxHealth(); + crystalBuffer += modifier * entity.getMaxHealth() / HEALTH_THRESHOLD; - totalEffects++; - if (totalEffects >= maxEffects) - { - break; - } + totalEffects++; + if (totalEffects >= maxEffects) + { + break; } } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 0bd2cebf..996c7656 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Random; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.block.Block; import net.minecraft.block.BlockFarmland; import net.minecraft.block.IGrowable; @@ -19,7 +21,6 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; @@ -28,7 +29,6 @@ import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.util.Utils; public class RitualGreenGrove extends Ritual @@ -104,15 +104,14 @@ public class RitualGreenGrove extends Ritual for (BlockPos newPos : growingRange.getContainedPositions(pos)) { IBlockState state = world.getBlockState(newPos); - Block block = state.getBlock(); - if (!BloodMagicAPI.greenGroveBlacklist.contains(block)) + if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { - if (block instanceof IPlantable || block instanceof IGrowable) + if (state.getBlock() instanceof IGrowable) { if (world.rand.nextDouble() < growthChance) { - block.updateTick(world, newPos, state, new Random()); + state.getBlock().updateTick(world, newPos, state, new Random()); IBlockState newState = world.getBlockState(newPos); if (!newState.equals(state)) { @@ -214,12 +213,12 @@ public class RitualGreenGrove extends Ritual continue; } - if (entityLiving.isPotionActive(ModPotions.plantLeech) || !entityLiving.isPotionApplicable(new PotionEffect(ModPotions.plantLeech))) + if (entityLiving.isPotionActive(RegistrarBloodMagic.PLANT_LEECH) || !entityLiving.isPotionApplicable(new PotionEffect(RegistrarBloodMagic.PLANT_LEECH))) { continue; } - entityLiving.addPotionEffect(new PotionEffect(ModPotions.plantLeech, 200, 0)); + entityLiving.addPotionEffect(new PotionEffect(RegistrarBloodMagic.PLANT_LEECH, 200, 0)); corrosiveWill -= corrosiveWillDrain; corrosiveDrain += corrosiveWillDrain; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java index 6e4855cc..171c068e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java @@ -6,7 +6,7 @@ import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.teleport.PortalLocation; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.tile.TileDimensionalPortal; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java index 9e43019e..c7dce0df 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java @@ -22,7 +22,7 @@ import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import com.google.common.collect.Iterables; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index 28d2bc0e..69651ce0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -12,6 +12,8 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.DamageSource; 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; @@ -85,27 +87,20 @@ public class RitualWellOfSuffering extends Ritual for (EntityLivingBase entity : entities) { - if (ConfigHandler.wellOfSufferingBlacklist.contains(entity.getClass().getSimpleName())) + EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); + + if (BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) continue; - String simpleClassName = entity.getClass().getSimpleName(); - if (BloodMagicAPI.entitySacrificeValues.containsKey(simpleClassName) && BloodMagicAPI.entitySacrificeValues.get(simpleClassName) <= 0) + int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getSacrificialValues().getOrDefault(entityEntry.getRegistryName(), SACRIFICE_AMOUNT); + + if (lifeEssenceRatio <= 0) continue; if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) { - String entityName = entity.getClass().getSimpleName(); - - int lifeEssenceRatio = SACRIFICE_AMOUNT; - - if (ConfigHandler.entitySacrificeValues.containsKey(entityName)) - lifeEssenceRatio = ConfigHandler.entitySacrificeValues.get(entityName); - - if (BloodMagicAPI.entitySacrificeValues.containsKey(entityName)) - lifeEssenceRatio = BloodMagicAPI.entitySacrificeValues.get(entityName); - if (entity.isChild()) lifeEssenceRatio *= 0.5F; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index b560f6d6..c153f800 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -4,7 +4,7 @@ import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.IDemonWillConduit; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index 22e8f743..fb578023 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -24,7 +24,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.inversion.InversionPillarHandler; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.base.TileTicking; import com.google.common.collect.ImmutableMap; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 7dd3f9f2..2faf553d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -25,7 +25,7 @@ import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.api.util.helper.RitualHelper; import WayofTime.bloodmagic.item.ItemActivationCrystal; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.ChatUtil; import com.google.common.base.Strings; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index 5e0c6a3d..71669907 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -27,8 +27,8 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.ReflectionHelper; import WayofTime.bloodmagic.block.BlockMimic; import WayofTime.bloodmagic.entity.mob.EntityMimic; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java index 17a69a18..d55faece 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.base.TileTicking; import com.google.common.base.Strings; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java new file mode 100644 index 00000000..e84b34fd --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java @@ -0,0 +1,36 @@ +package WayofTime.bloodmagic.util; + +import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; +import WayofTime.bloodmagic.apiv2.IBloodMagicPlugin; +import com.google.common.collect.Lists; +import net.minecraftforge.fml.common.discovery.ASMDataTable; +import org.apache.commons.lang3.tuple.Pair; + +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Set; + +public class PluginUtil { + + @SuppressWarnings("unchecked") + @Nonnull + public static List> getPlugins(ASMDataTable dataTable) { + List> discoveredAnnotations = Lists.newArrayList(); + Set discoveredPlugins = dataTable.getAll(BloodMagicPlugin.class.getCanonicalName()); + + for (ASMDataTable.ASMData data : discoveredPlugins) { + try { + Class asmClass = Class.forName(data.getClassName()); + Class pluginClass = asmClass.asSubclass(IBloodMagicPlugin.class); + + IBloodMagicPlugin instance = pluginClass.newInstance(); + + discoveredAnnotations.add(Pair.of(instance, pluginClass.getAnnotation(BloodMagicPlugin.class))); + } catch (Exception e) { + e.printStackTrace(); + } + } + + return discoveredAnnotations; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 129d0714..e252640b 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -58,7 +58,7 @@ import WayofTime.bloodmagic.api.iface.IDemonWillViewer; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileInventory; import com.google.common.collect.Iterables; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index 36e543e5..ebebde12 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.BlockLifeEssence; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; @@ -11,10 +12,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.event.AnvilUpdateEvent; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.event.AltarCraftedEvent; import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; @@ -22,7 +25,7 @@ import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.util.helper.ItemHelper; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.item.ItemInscriptionTool; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; @Handler public class CraftingHandler @@ -45,7 +48,7 @@ public class CraftingHandler if (event.getOutput().getItem() == ForgeModContainer.getInstance().universalBucket && event.getAltarRecipe().getSyphon() == 1000) { - NBTTagCompound bucketTags = BloodMagicAPI.getLifeEssenceBucket().getTagCompound(); + NBTTagCompound bucketTags = FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)).getTagCompound(); event.getOutput().setTagCompound(bucketTags); } } 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 d0bbccc7..41c63451 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -6,6 +6,9 @@ import java.util.Map; import java.util.Random; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; @@ -49,7 +52,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.event.ItemBindEvent; import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; @@ -79,13 +81,14 @@ import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrific import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.DemonAuraPacketProcessor; import WayofTime.bloodmagic.potion.BMPotionUtils; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.registry.ModPotions; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; +import net.minecraftforge.fml.common.registry.EntityEntry; +import net.minecraftforge.fml.common.registry.EntityRegistry; @Handler public class GenericHandler @@ -99,7 +102,7 @@ public class GenericHandler if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (player.isPotionActive(ModPotions.bounce) && !player.isSneaking() && event.getDistance() > 2) + if (player.isPotionActive(RegistrarBloodMagic.BOUNCE) && !player.isSneaking() && event.getDistance() > 2) { event.setDamageMultiplier(0); @@ -144,10 +147,10 @@ public class GenericHandler @SubscribeEvent public void onPlayerClick(PlayerInteractEvent event) { - if (event.isCancelable() && event.getEntityPlayer().isPotionActive(ModPotions.constrict)) + if (event.isCancelable() && event.getEntityPlayer().isPotionActive(RegistrarBloodMagic.CONSTRICT)) { EntityPlayer player = event.getEntityPlayer(); - int level = player.getActivePotionEffect(ModPotions.constrict).getAmplifier(); + int level = player.getActivePotionEffect(RegistrarBloodMagic.CONSTRICT).getAmplifier(); if (event.getHand() == EnumHand.OFF_HAND || level > 1) { event.setCanceled(true); @@ -253,7 +256,7 @@ public class GenericHandler if (event.getEntityLiving() instanceof EntityAnimal) { EntityAnimal animal = (EntityAnimal) event.getEntityLiving(); - if (animal.isPotionActive(ModPotions.sacrificialLamb)) + if (animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { if (!targetTaskMap.containsKey(animal)) { @@ -267,7 +270,7 @@ public class GenericHandler if (animal.getAttackTarget() != null && animal.getDistanceSqToEntity(animal.getAttackTarget()) < 4) { - animal.getEntityWorld().createExplosion(null, animal.posX, animal.posY + (double) (animal.height / 16.0F), animal.posZ, 2 + animal.getActivePotionEffect(ModPotions.sacrificialLamb).getAmplifier() * 1.5f, false); + 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); } @@ -284,7 +287,7 @@ public class GenericHandler if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; - if (player.isSneaking() && player.isPotionActive(ModPotions.cling) && Utils.isPlayerBesideSolidBlockFace(player) && !player.onGround) + if (player.isSneaking() && player.isPotionActive(RegistrarBloodMagic.CLING) && Utils.isPlayerBesideSolidBlockFace(player) && !player.onGround) { if (player.getEntityWorld().isRemote) { @@ -307,24 +310,24 @@ public class GenericHandler } } - if (entity.isPotionActive(ModPotions.fireFuse)) + 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(ModPotions.fireFuse).getAmplifier(); - int radius = 1 * r + 1; + int r = entity.getActivePotionEffect(RegistrarBloodMagic.FIRE_FUSE).getAmplifier(); + int radius = r + 1; - if (entity.getActivePotionEffect(ModPotions.fireFuse).getDuration() <= 3) + if (entity.getActivePotionEffect(RegistrarBloodMagic.FIRE_FUSE).getDuration() <= 3) { entity.getEntityWorld().createExplosion(null, entity.posX, entity.posY, entity.posZ, radius, false); } } - if (entity.isPotionActive(ModPotions.plantLeech)) + if (entity.isPotionActive(RegistrarBloodMagic.PLANT_LEECH)) { - int amplifier = entity.getActivePotionEffect(ModPotions.plantLeech).getAmplifier(); - int timeRemaining = entity.getActivePotionEffect(ModPotions.plantLeech).getDuration(); + 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)); @@ -366,10 +369,7 @@ public class GenericHandler @SubscribeEvent public void onTelepose(TeleposeEvent event) { - if (ConfigHandler.teleposerBlacklist.contains(event.initialStack) || ConfigHandler.teleposerBlacklist.contains(event.finalStack)) - event.setCanceled(true); - - if (BloodMagicAPI.teleposerBlacklist.contains(event.initialStack) || BloodMagicAPI.teleposerBlacklist.contains(event.finalStack)) + if (BloodMagicAPI.INSTANCE.getBlacklist().getTeleposer().contains(event.initialState) || BloodMagicAPI.INSTANCE.getBlacklist().getTeleposer().contains(event.finalState)) event.setCanceled(true); } @@ -377,7 +377,8 @@ public class GenericHandler @SubscribeEvent public void onTeleposeEntity(TeleposeEvent.Ent event) { - if (ConfigHandler.teleposerBlacklistEntity.contains(event.entity.getClass().getSimpleName())) + EntityEntry entry = EntityRegistry.getEntry(event.entity.getClass()); + if (BloodMagicAPI.INSTANCE.getBlacklist().getTeleposerEntities().contains(entry.getRegistryName())) event.setCanceled(true); } @@ -427,8 +428,12 @@ public class GenericHandler IBloodOrb bloodOrb = (IBloodOrb) held.getItem(); SoulNetwork network = NetworkHelper.getSoulNetwork(player); - if (bloodOrb.getOrbLevel(held.getItemDamage()) > network.getOrbTier()) - network.setOrbTier(bloodOrb.getOrbLevel(held.getItemDamage())); + 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/WillHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java index cc107dd4..23da80b0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -34,7 +34,7 @@ import WayofTime.bloodmagic.demonAura.PosXY; import WayofTime.bloodmagic.demonAura.WillChunk; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.registry.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.registry.ModPotions; @Handler From 348fee1e2a7fe7e09a1e8ad1de5a0c3215da058b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 15 Aug 2017 20:21:54 -0700 Subject: [PATCH 124/595] It compiles. Somehow. --- .../AlchemyArrayEffectAttractor.java | 24 +- .../AlchemyArrayEffectSkeletonTurret.java | 20 +- .../WayofTime/bloodmagic/api/Constants.java | 160 ----- .../bloodmagic/api/ItemStackWrapper.java | 32 +- .../AlchemyArrayEffectCrafting.java | 2 - .../AlchemyCircleRenderer.java | 4 +- .../bloodmagic/api/impl/ItemBindable.java | 4 +- .../api/livingArmour/LivingArmourHandler.java | 2 +- .../api/recipe/ShapedBloodOrbRecipe.java | 305 ---------- .../api/recipe/ShapelessBloodOrbRecipe.java | 201 ------- .../registry/AlchemyArrayRecipeRegistry.java | 49 +- .../api/registry/ImperfectRitualRegistry.java | 4 +- .../api/registry/RitualRegistry.java | 8 +- .../bloodmagic/api/ritual/EnumRuneType.java | 9 +- .../api/teleport/ChunkPairSerializable.java | 38 -- .../api/teleport/PortalLocation.java | 23 +- .../bloodmagic/api/teleport/Teleport.java | 54 +- .../api/util/helper/NetworkHelper.java | 9 +- .../util/helper/PlayerSacrificeHelper.java | 4 +- .../bloodmagic/block/BlockAltar.java | 7 +- .../bloodmagic/block/BlockSpectral.java | 2 +- .../bloodmagic/block/base/BlockInteger.java | 12 + .../client/gui/GuiAlchemyTable.java | 4 +- .../bloodmagic/client/gui/GuiHolding.java | 2 +- .../client/gui/GuiItemRoutingNode.java | 8 +- .../bloodmagic/client/gui/GuiSoulForge.java | 4 +- .../bloodmagic/client/gui/GuiTeleposer.java | 4 +- .../client/gui/config/ConfigGui.java | 18 +- .../client/gui/config/ConfigGuiFactory.java | 17 +- .../bloodmagic/client/hud/HUDElement.java | 9 +- .../client/hud/HUDElementDemonWillAura.java | 3 +- .../client/hud/HUDElementHolding.java | 2 +- .../mesh/CustomMeshDefinitionActivatable.java | 2 +- .../mesh/CustomMeshDefinitionMultiWill.java | 2 +- .../mesh/CustomMeshDefinitionWillGem.java | 2 +- .../AttractorAlchemyCircleRenderer.java | 4 +- .../BindingAlchemyCircleRenderer.java | 4 +- .../DualAlchemyCircleRenderer.java | 4 +- .../SingleAlchemyCircleRenderer.java | 4 +- .../StaticAlchemyCircleRenderer.java | 4 +- .../render/block/RenderAlchemyArray.java | 2 +- .../client/render/block/RenderAltar.java | 14 +- .../client/render/block/RenderBloodTank.java | 6 +- .../render/block/RenderDemonCrucible.java | 8 +- .../client/render/block/RenderFakeBlocks.java | 5 +- .../render/block/RenderItemRoutingNode.java | 8 +- .../client/render/block/RenderMimic.java | 4 +- .../entity/RenderEntitySentientArrow.java | 4 +- .../render/entity/RenderSentientSpecter.java | 56 +- .../entity/layer/LayerAlchemyCircle.java | 4 +- .../layer/LayerCorruptedSpiderEyes.java | 4 +- .../bloodmagic/compat/guideapi/BookUtils.java | 12 - .../compat/guideapi/GuideBloodMagic.java | 2 +- .../guideapi/book/CategoryArchitect.java | 9 +- .../ShapedBloodOrbRecipeRenderer.java | 79 --- .../ShapelessBloodOrbRecipeRenderer.java | 92 --- .../compat/jei/BloodMagicPlugin.java | 54 +- .../AlchemyArrayCraftingCategory.java | 6 + .../AlchemyArrayCraftingRecipeMaker.java | 2 +- .../AlchemyTableRecipeCategory.java | 6 + .../alchemyTable/AlchemyTableRecipeJEI.java | 6 +- .../compat/jei/altar/AltarRecipeCategory.java | 6 + .../compat/jei/altar/AltarRecipeJEI.java | 4 +- .../ArmourDowngradeRecipeCategory.java | 6 + .../ArmourDowngradeRecipeJEI.java | 6 +- .../jei/binding/BindingRecipeCategory.java | 6 + .../jei/binding/BindingRecipeMaker.java | 2 +- .../forge/TartaricForgeRecipeCategory.java | 6 + .../jei/forge/TartaricForgeRecipeJEI.java | 11 +- .../jei/orb/ShapedOrbRecipeHandler.java | 40 -- .../compat/jei/orb/ShapedOrbRecipeJEI.java | 68 --- .../jei/orb/ShapelessOrbRecipeHandler.java | 38 -- .../compat/jei/orb/ShapelessOrbRecipeJEI.java | 58 -- .../compress/StorageBlockCraftingManager.java | 2 +- ...StorageBlockCraftingRecipeAssimilator.java | 562 +++++++++--------- .../core/RegistrarBloodMagicItems.java | 4 +- .../entity/projectile/EntitySoulSnare.java | 4 +- .../bloodmagic/fakePlayer/FakePlayerBM.java | 1 + .../bloodmagic/fuel/FuelHandler.java | 2 +- .../item/ItemActivationCrystal.java | 13 +- .../bloodmagic/item/ItemAltarMaker.java | 3 +- .../bloodmagic/item/ItemArcaneAshes.java | 3 +- .../bloodmagic/item/ItemBindableBase.java | 4 +- .../bloodmagic/item/ItemBloodOrb.java | 7 +- .../bloodmagic/item/ItemBloodShard.java | 7 +- .../bloodmagic/item/ItemBoundSword.java | 10 +- .../bloodmagic/item/ItemBoundTool.java | 41 +- .../bloodmagic/item/ItemComponent.java | 15 +- .../bloodmagic/item/ItemDemonWillGauge.java | 3 +- .../bloodmagic/item/ItemExperienceBook.java | 3 +- .../bloodmagic/item/ItemInscriptionTool.java | 12 +- .../bloodmagic/item/ItemLavaCrystal.java | 3 + .../bloodmagic/item/ItemPotionFlask.java | 18 +- .../bloodmagic/item/ItemRitualDiviner.java | 10 +- .../bloodmagic/item/ItemRitualReader.java | 5 +- .../item/ItemSacrificialDagger.java | 14 +- .../bloodmagic/item/ItemSanguineBook.java | 3 +- .../WayofTime/bloodmagic/item/ItemSlate.java | 11 +- .../item/ItemTelepositionFocus.java | 12 +- .../bloodmagic/item/ItemUpgradeTome.java | 9 +- .../bloodmagic/item/ItemUpgradeTrainer.java | 9 +- .../item/alchemy/ItemCuttingFluid.java | 18 +- .../ItemLivingArmourPointsUpgrade.java | 16 +- .../item/armour/ItemLivingArmour.java | 5 +- .../item/armour/ItemSentientArmour.java | 4 +- .../item/block/ItemBlockBloodTank.java | 10 +- .../item/gear/ItemPackSacrifice.java | 3 +- .../item/gear/ItemPackSelfSacrifice.java | 3 +- .../item/routing/ItemFluidRouterFilter.java | 13 +- .../item/routing/ItemNodeRouter.java | 3 +- .../item/routing/ItemRouterFilter.java | 13 +- .../bloodmagic/item/sigil/ItemSigilAir.java | 6 +- .../bloodmagic/item/sigil/ItemSigilBase.java | 16 +- .../item/sigil/ItemSigilBounce.java | 4 +- .../bloodmagic/item/sigil/ItemSigilClaw.java | 4 +- .../item/sigil/ItemSigilCompression.java | 3 + .../item/sigil/ItemSigilEnderSeverance.java | 4 +- .../item/sigil/ItemSigilFastMiner.java | 4 +- .../bloodmagic/item/sigil/ItemSigilHaste.java | 4 +- .../item/sigil/ItemSigilHolding.java | 5 +- .../item/sigil/ItemSigilTeleposition.java | 5 +- .../item/sigil/ItemSigilToggleableBase.java | 6 +- .../item/sigil/ItemSigilTransposition.java | 19 +- .../item/sigil/ItemSigilWhirlwind.java | 4 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 14 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 3 +- .../item/soul/ItemSentientPickaxe.java | 3 +- .../item/soul/ItemSentientShovel.java | 3 +- .../item/soul/ItemSentientSword.java | 3 +- .../bloodmagic/item/soul/ItemSoulGem.java | 11 +- .../bloodmagic/item/soul/ItemSoulSnare.java | 12 +- .../bloodmagic/livingArmour/LivingArmour.java | 10 +- .../bloodmagic/proxy/ClientProxy.java | 70 +-- .../bloodmagic/proxy/CommonProxy.java | 13 - .../bloodmagic/registry/ModRecipes.java | 2 +- .../bloodmagic/ritual/RitualAltarBuilder.java | 6 +- .../bloodmagic/ritual/RitualAnimalGrowth.java | 6 +- .../ritual/RitualFeatheredKnife.java | 6 +- .../bloodmagic/ritual/RitualLava.java | 6 +- .../bloodmagic/tile/TileAlchemyTable.java | 4 +- .../java/WayofTime/bloodmagic/util/Utils.java | 2 +- .../bloodmagic/util/handler/IMCHandler.java | 103 ++-- .../util/handler/event/ClientHandler.java | 4 +- .../handler/event/LivingArmourHandler.java | 8 +- .../util/handler/event/WillHandler.java | 6 +- .../util/helper/InventoryRenderHelper.java | 181 ------ .../util/helper/InventoryRenderHelperV2.java | 64 -- src/main/resources/Guide-API-Version.info | 1 - src/main/resources/mcmod.info | 6 +- src/main/resources/todo.txt | 2 - 150 files changed, 1029 insertions(+), 2186 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/api/recipe/ShapedBloodOrbRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/recipe/ShapelessBloodOrbRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/teleport/ChunkPairSerializable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/ShapedBloodOrbRecipeRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/ShapelessBloodOrbRecipeRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeJEI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeJEI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/InventoryRenderHelper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/InventoryRenderHelperV2.java delete mode 100644 src/main/resources/Guide-API-Version.info delete mode 100644 src/main/resources/todo.txt diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java index 6ea52f66..7ac8a57f 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -235,7 +235,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { EntityMob mod = (EntityMob) ent; mod.faceEntity(getTarget(ent.getEntityWorld(), pos), 180, 0); - mod.moveEntityWithHeading(0, 0.3f); + mod.getMoveHelper().strafe(0, 0.3f); if (mod.posY < pos.getY()) { mod.setJumping(true); @@ -313,7 +313,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect if (entry.action instanceof AttractTask) { AttractTask at = (AttractTask) entry.action; - if (at.coord.equals(pos) || !at.continueExecuting()) + if (at.coord.equals(pos) || !at.shouldExecute()) { remove = entry.action; } else @@ -423,19 +423,6 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect @Override public boolean shouldExecute() - { - return continueExecuting(); - } - - @Override - public void resetTask() - { - started = false; - updatesSincePathing = 0; - } - - @Override - public boolean continueExecuting() { boolean res = false; //TODO: @@ -448,6 +435,13 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect return res; } + @Override + public void resetTask() + { + started = false; + updatesSincePathing = 0; + } + @Override public boolean isInterruptible() { diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java index 3577178b..8396bec4 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java @@ -154,19 +154,6 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect @Override public boolean shouldExecute() - { - return continueExecuting(); - } - - @Override - public void resetTask() - { - started = false; - updatesSincePathing = 0; - } - - @Override - public boolean continueExecuting() { boolean res = false; //TODO: @@ -179,6 +166,13 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect return res; } + @Override + public void resetTask() + { + started = false; + updatesSincePathing = 0; + } + @Override public boolean isInterruptible() { diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 3cc3c3ff..92f8b7a6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.api; import java.util.Locale; import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; @@ -171,163 +170,4 @@ public class Constants public static final int NIGHT_VISION_CONSTANT_BEGIN = 30002; public static final int NIGHT_VISION_CONSTANT_END = 30000; } - - public enum BloodMagicItem - { - ACTIVATION_CRYSTAL("ItemActivationCrystal"), - ALTAR_MAKER("ItemAltarMaker"), - ARCANE_ASHES("ItemArcaneAshes"), - BLOOD_ORB("ItemBloodOrb"), - BOUND_AXE("ItemBoundAxe"), - BLOOD_SHARD("ItemBloodShard"), - BOUND_PICKAXE("ItemBoundPickaxe"), - BOUND_SHOVEL("ItemBoundShovel"), - BOUND_SWORD("ItemBoundSword"), - COMPONENT("ItemComponent"), - CUTTING_FLUID("ItemCuttingFluid"), - DEMON_CRYSTAL("ItemDemonCrystal"), - DAGGER_OF_SACRIFICE("ItemDaggerOfSacrifice"), - INSCRIPTION_TOOL("ItemInscriptionTool"), - LAVA_CRYSTAL("ItemLavaCrystal"), - LIVING_ARMOR_HELMET("ItemLivingArmourHelmet"), - LIVING_ARMOR_CHEST("ItemLivingArmourChest"), - LIVING_ARMOR_LEGS("ItemLivingArmourLegs"), - LIVING_ARMOR_BOOTS("ItemLivingArmourBoots"), - MONSTER_SOUL("ItemMonsterSoul"), - NODE_ROUTER("ItemNodeRouter"), - RITUAL_DIVINER("ItemRitualDiviner"), - ROUTER_FILTER("ItemRouterFilter"), - FLUID_ROUTER_FILTER("ItemFluidRouterFilter"), - SACRIFICIAL_DAGGER("ItemSacrificialDagger"), - SACRIFICE_PACK("ItemPackSacrifice"), - SELF_SACRIFICE_PACK("ItemPackSelfSacrifice"), - SENTIENT_ARMOR_HELMET("ItemSentientArmourHelmet"), - SENTIENT_ARMOR_CHEST("ItemSentientArmourChest"), - SENTIENT_ARMOR_LEGS("ItemSentientArmourLegs"), - SENTIENT_ARMOR_BOOTS("ItemSentientArmourBoots"), - SENTIENT_ARMOR_GEM("ItemSentientArmourGem"), - SENTIENT_AXE("ItemSentientAxe"), - SENTIENT_BOW("ItemSentientBow"), - SENTIENT_PICKAXE("ItemSentientPickaxe"), - SENTIENT_SHOVEL("ItemSentientShovel"), - SENTIENT_SWORD("ItemSentientSword"), - SOUL_GEM("ItemSoulGem"), - SOUL_SNARE("ItemSoulSnare"), - SIGIL_AIR("ItemSigilAir"), - SIGIL_BLOOD_LIGHT("ItemSigilBloodLight"), - SIGIL_COMPRESSION("ItemSigilCompression"), - SIGIL_DIVINATION("ItemSigilDivination"), - SIGIL_ELEMENTAL_AFFINITY("ItemSigilElementalAffinity"), - SIGIL_ENDER_SEVERANCE("ItemSigilEnderSeverance"), - SIGIL_FAST_MINER("ItemSigilFastMiner"), - SIGIL_GREEN_GROVE("ItemSigilGreenGrove"), - SIGIL_HASTE("ItemSigilHaste"), - SIGIL_LAVA("ItemSigilLava"), - SIGIL_MAGNETISM("ItemSigilMagnetism"), - SIGIL_PHANTOM_BRIDGE("ItemSigilPhantomBridge"), - SIGIL_SEER("ItemSigilSeer"), - SIGIL_SUPPRESION("ItemSigilSuppression"), - SIGIL_VOID("ItemSigilVoid"), - SIGIL_WATER("ItemSigilWater"), - SIGIL_WHIRLWIND("ItemSigilWhirlwind"), - SLATE("ItemSlate"), - TELEPOSITION_FOCUS("ItemTelepositionFocus"), - UPGRADE_TOME("ItemUpgradeTome"), - UPGRADE_TRAINER("ItemUpgradeTrainer"), - SIGIL_TELEPOSITION("ItemSigilTeleposition"), - EXPERIENCE_TOME("ItemExperienceBook"), - SIGIL_TRANSPOSITION("ItemSigilTransposition"), - RITUAL_READER("ItemRitualReader"), - SANGUINE_BOOK("ItemSanguineBook"), - SIGIL_HOLDING("ItemSigilHolding"), - ARMOUR_POINTS_UPGRADE("ItemLivingArmourPointsUpgrade"), - DEMON_WILL_GAUGE("ItemDemonWillGauge"), - POTION_FLASK("ItemPotionFlask"), - SIGIL_CLAW("ItemSigilClaw"), - SIGIL_BOUNCE("ItemSigilBounce"), - SIGIL_FROST("ItemSigilFrost"); - - private final String regName; - - BloodMagicItem(String regName) - { - this.regName = regName; - } - - public Item getItem() - { - return BloodMagicAPI.getItem(regName); - } - - public String getRegName() - { - return regName; - } - } - - public enum BloodMagicBlock - { - ALCHEMY_ARRAY("BlockAlchemyArray"), - ALTAR("BlockAltar"), - BLOOD_LIGHT("BlockBloodLight"), - BLOOD_RUNE("BlockBloodRune"), - BLOOD_STONE("BlockBloodStoneBrick"), - CRYSTAL("BlockCrystal"), - INPUT_ROUTING_NODE("BlockInputRoutingNode"), - ITEM_ROUTING_NODE("BlockItemRoutingNode"), - LIFE_ESSENCE("BlockLifeEssence"), - MASTER_ROUTING_NODE("BlockMasterRoutingNode"), - OUTPUT_ROUTING_NODE("BlockOutputRoutingNode"), - @Deprecated - PEDESTAL("BlockPedestal"), - /** No longer included in the mod. */ - PHANTOM("BlockPhantom"), - RITUAL_CONTROLLER("BlockRitualController"), - RITUAL_STONE("BlockRitualStone"), - SOUL_FORGE("BlockSoulForge"), - SPECTRAL("BlockSpectral"), - TELEPOSER("BlockTeleposer"), - INCENSE_ALTAR("BlockIncenseAltar"), - PATH("BlockPath"), - DEMON_CRUCIBLE("BlockDemonCrucible"), - DEMON_PYLON("BlockDemonPylon"), - DEMON_CRYSTALLIZER("BlockDemonCrystallizer"), - DEMON_CRYSTAL("BlockDemonCrystal"), - DIMENSIONAL_PORTAL("BlockDimensionalPortal"), - BLOOD_TANK("BlockBloodTank"), - MIMIC("BlockMimic"), - ALCHEMY_TABLE("BlockAlchemyTable"), - DEMON_BRICK_1("BlockDemonBricks1"), - DEMON_BRICK_2("BlockDemonBricks2"), - DEMON_BLOCK_EXTRA("BlockDemonExtra"), - DEMON_PILLAR_1("BlockPillar1"), - DEMON_PILLAR_2("BlockPillar2"), - DEMON_PILLAR_CAP_1("BlockPillarCap1"), - DEMON_PILLAR_CAP_2("BlockPillarCap2"), - DEMON_PILLAR_CAP_3("BlockPillarCap3"), - DEMON_WALL_1("BlockWall1"), - DEMON_STAIRS_1("BlockStairs1"), - DEMON_STAIRS_2("BlockStairs2"), - DEMON_STAIRS_3("BlockStairs3"), - DEMON_LIGHT("BlockDemonLight"), - INVERSION_PILLAR("BlockInversionPillar"), - INVERSION_PILLAR_END("BlockInversionPillarEnd"); - - private final String regName; - - BloodMagicBlock(String regName) - { - this.regName = regName; - } - - public Block getBlock() - { - return BloodMagicAPI.getBlock(regName); - } - - public String getRegName() - { - return regName; - } - } } diff --git a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java index dd9c53bb..fc1258d3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java @@ -1,8 +1,5 @@ package WayofTime.bloodmagic.api; -import lombok.EqualsAndHashCode; -import lombok.RequiredArgsConstructor; -import lombok.Setter; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -12,16 +9,19 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -@RequiredArgsConstructor -@EqualsAndHashCode public class ItemStackWrapper { public final Item item; public final int stackSize; public final int meta; - @Setter public NBTTagCompound 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); @@ -103,4 +103,24 @@ public class ItemStackWrapper return stackList; } + + public Item getItem() { + return item; + } + + public int getStackSize() { + return stackSize; + } + + public int getMeta() { + return meta; + } + + public NBTTagCompound getNbtTag() { + return nbtTag; + } + + public void setNbtTag(NBTTagCompound nbtTag) { + this.nbtTag = nbtTag; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java index 56badd4f..a3a17109 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.api.alchemyCrafting; -import lombok.Getter; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -9,7 +8,6 @@ import net.minecraft.util.math.BlockPos; public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect { - @Getter public final ItemStack outputStack; public int tickLimit; diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java index 6a505119..37dd53d0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.api.alchemyCrafting; 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.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; @@ -81,7 +81,7 @@ public class AlchemyCircleRenderer TileAlchemyArray tileArray = (TileAlchemyArray) tile; Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer wr = tessellator.getBuffer(); + BufferBuilder wr = tessellator.getBuffer(); GlStateManager.pushMatrix(); // float rot = (float)(this.worldObj.provider.getWorldTime() % (360 / diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java index 0fd8c86e..034655d1 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java @@ -30,12 +30,12 @@ public class ItemBindable extends Item implements IBindable @Override public String getOwnerName(ItemStack stack) { - return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; + return !stack.isEmpty() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; } @Override public String getOwnerUUID(ItemStack stack) { - return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; + return !stack.isEmpty() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java index c320559b..0d3c652e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java @@ -36,7 +36,7 @@ public class LivingArmourHandler Constructor ctor = clazz.getConstructor(int.class); if (ctor == null) { - BloodMagicAPI.getLogger().error("Error adding living armour upgrade {} as it doesn't have a valid constructor.", upgrade.getUniqueIdentifier()); + BloodMagicAPI.logger.error("Error adding living armour upgrade {} as it doesn't have a valid constructor.", upgrade.getUniqueIdentifier()); } else { upgradeConstructorMap.put(upgrade.getUniqueIdentifier(), ctor); diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/ShapedBloodOrbRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/ShapedBloodOrbRecipe.java deleted file mode 100644 index 798965e4..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/ShapedBloodOrbRecipe.java +++ /dev/null @@ -1,305 +0,0 @@ -package WayofTime.bloodmagic.api.recipe; - -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import net.minecraft.block.Block; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -/** - * Shaped Blood Orb Recipe Handler by joshie * - */ -public class ShapedBloodOrbRecipe implements IRecipe -{ - private static final int MAX_CRAFT_GRID_WIDTH = 3; - private static final int MAX_CRAFT_GRID_HEIGHT = 3; - - private ItemStack output = null; - private Object[] input = null; - public int width = 0; - public int height = 0; - private int tier; - private boolean mirrored = true; - - public ShapedBloodOrbRecipe(Block result, Object... recipe) - { - this(new ItemStack(result), recipe); - } - - public ShapedBloodOrbRecipe(Item result, Object... recipe) - { - this(new ItemStack(result), recipe); - } - - public ShapedBloodOrbRecipe(ItemStack result, Object... recipe) - { - output = result.copy(); - - String shape = ""; - int idx = 0; - - if (recipe[idx] instanceof Boolean) - { - mirrored = (Boolean) recipe[idx]; - if (recipe[idx + 1] instanceof Object[]) - { - recipe = (Object[]) recipe[idx + 1]; - } else - { - idx = 1; - } - } - - if (recipe[idx] instanceof String[]) - { - String[] parts = ((String[]) recipe[idx++]); - - for (String s : parts) - { - width = s.length(); - shape += s; - } - - height = parts.length; - } else - { - while (recipe[idx] instanceof String) - { - String s = (String) recipe[idx++]; - shape += s; - width = s.length(); - height++; - } - } - - if (width * height != shape.length()) - { - String ret = "Invalid shaped ore recipe: "; - for (Object tmp : recipe) - { - ret += tmp + ", "; - } - ret += output; - throw new RuntimeException(ret); - } - - HashMap itemMap = new HashMap(); - - for (; idx < recipe.length; idx += 2) - { - Character chr = (Character) recipe[idx]; - Object in = recipe[idx + 1]; - - if (in instanceof IBloodOrb || (in instanceof ItemStack && ((ItemStack) in).getItem() instanceof IBloodOrb)) - { - // If the item is an instanceof IBloodOrb then save the level of - // the orb. - if (in instanceof ItemStack) - { - ItemStack inStack = (ItemStack) in; - tier = ((IBloodOrb) inStack.getItem()).getOrbLevel(inStack.getItemDamage()); - itemMap.put(chr, tier); - } else - { - tier = ((IBloodOrb) in).getOrbLevel(0); - itemMap.put(chr, tier); - } - } else if (in instanceof ItemStack) - { - itemMap.put(chr, ((ItemStack) in).copy()); - } else if (in instanceof Item) - { - itemMap.put(chr, new ItemStack((Item) in)); - } else if (in instanceof Block) - { - itemMap.put(chr, new ItemStack((Block) in, 1, OreDictionary.WILDCARD_VALUE)); - } else if (in instanceof String) - { - itemMap.put(chr, OreDictionary.getOres((String) in)); - } else - { - String ret = "Invalid shaped orb recipe: "; - for (Object tmp : recipe) - { - ret += tmp + ", "; - } - ret += output; - throw new RuntimeException(ret); - } - } - - input = new Object[width * height]; - int x = 0; - for (char chr : shape.toCharArray()) - { - input[x++] = itemMap.get(chr); - } - } - - ShapedBloodOrbRecipe(ShapedRecipes recipe, Map replacements) - { - output = recipe.getRecipeOutput(); - width = recipe.recipeWidth; - height = recipe.recipeHeight; - - input = new Object[recipe.recipeItems.length]; - - for (int i = 0; i < input.length; i++) - { - ItemStack ingred = recipe.recipeItems[i]; - - if (ingred == null) - continue; - - input[i] = recipe.recipeItems[i]; - - for (Entry replace : replacements.entrySet()) - { - if (OreDictionary.itemMatches(replace.getKey(), ingred, true)) - { - input[i] = OreDictionary.getOres(replace.getValue()); - break; - } - } - } - } - - @Override - public ItemStack getCraftingResult(InventoryCrafting var1) - { - return output.copy(); - } - - @Override - public int getRecipeSize() - { - return input.length; - } - - @Override - public ItemStack getRecipeOutput() - { - return output; - } - - @Override - public boolean matches(InventoryCrafting inv, World world) - { - for (int x = 0; x <= MAX_CRAFT_GRID_WIDTH - width; x++) - { - for (int y = 0; y <= MAX_CRAFT_GRID_HEIGHT - height; ++y) - { - if (checkMatch(inv, x, y, false)) - { - return true; - } - - if (mirrored && checkMatch(inv, x, y, true)) - { - return true; - } - } - } - - return false; - } - - @SuppressWarnings("unchecked") - private boolean checkMatch(InventoryCrafting inv, int startX, int startY, boolean mirror) - { - for (int x = 0; x < MAX_CRAFT_GRID_WIDTH; x++) - { - for (int y = 0; y < MAX_CRAFT_GRID_HEIGHT; y++) - { - int subX = x - startX; - int subY = y - startY; - Object target = null; - - if (subX >= 0 && subY >= 0 && subX < width && subY < height) - { - if (mirror) - { - target = input[width - subX - 1 + subY * width]; - } else - { - target = input[subX + subY * width]; - } - } - - ItemStack slot = inv.getStackInRowAndColumn(x, y); - // If target is integer, then we should be check the blood orb - // value of the item instead - if (target instanceof Integer) - { - if (!slot.isEmpty() && slot.getItem() instanceof IBloodOrb) - { - IBloodOrb orb = (IBloodOrb) slot.getItem(); - if (orb.getOrbLevel(slot.getItemDamage()) < (Integer) target) - { - return false; - } - } else - return false; - } else if (target instanceof ItemStack) - { - if (!OreDictionary.itemMatches((ItemStack) target, slot, false)) - { - return false; - } - } else if (target instanceof List) - { - boolean matched = false; - - Iterator itr = ((List) target).iterator(); - while (itr.hasNext() && !matched) - { - matched = OreDictionary.itemMatches(itr.next(), slot, false); - } - - if (!matched) - { - return false; - } - } else if (target == null && !slot.isEmpty()) - { - return false; - } - } - } - - return true; - } - - public ShapedBloodOrbRecipe setMirrored(boolean mirror) - { - mirrored = mirror; - return this; - } - - public Object[] getInput() - { - return this.input; - } - - public NonNullList getRemainingItems(InventoryCrafting inv) - { - return ForgeHooks.defaultRecipeGetRemainingItems(inv); - } - - public int getTier() - { - return tier; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/ShapelessBloodOrbRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/ShapelessBloodOrbRecipe.java deleted file mode 100644 index abbc1643..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/ShapelessBloodOrbRecipe.java +++ /dev/null @@ -1,201 +0,0 @@ -package WayofTime.bloodmagic.api.recipe; - -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import net.minecraft.block.Block; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapelessRecipes; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -/** - * Shapeless Blood Orb Recipe Handler by joshie * - */ -public class ShapelessBloodOrbRecipe implements IRecipe -{ - private ItemStack output = null; - private ArrayList input = new ArrayList(); - private int tier; - - public ShapelessBloodOrbRecipe(Block result, Object... recipe) - { - this(new ItemStack(result), recipe); - } - - public ShapelessBloodOrbRecipe(Item result, Object... recipe) - { - this(new ItemStack(result), recipe); - } - - public ShapelessBloodOrbRecipe(ItemStack result, Object... recipe) - { - output = result.copy(); - for (Object in : recipe) - { - if (in instanceof IBloodOrb || (in instanceof ItemStack && ((ItemStack) in).getItem() instanceof IBloodOrb)) - { - // If the item is an instanceof IBloodOrb then save the level of - // the orb. - if (in instanceof ItemStack) - { - ItemStack inStack = (ItemStack) in; - tier = ((IBloodOrb) inStack.getItem()).getOrbLevel(inStack.getItemDamage()); - input.add(tier); - } else - { - tier = ((IBloodOrb) in).getOrbLevel(0); - input.add(tier); - } - } else if (in instanceof ItemStack) - { - input.add(((ItemStack) in).copy()); - } else if (in instanceof Item) - { - input.add(new ItemStack((Item) in)); - } else if (in instanceof Block) - { - input.add(new ItemStack((Block) in)); - } else if (in instanceof String) - { - input.add(OreDictionary.getOres((String) in)); - } else - { - String ret = "Invalid shapeless ore recipe: "; - for (Object tmp : recipe) - { - ret += tmp + ", "; - } - ret += output; - throw new RuntimeException(ret); - } - } - } - - ShapelessBloodOrbRecipe(ShapelessRecipes recipe, Map replacements) - { - output = recipe.getRecipeOutput(); - - for (ItemStack ingred : recipe.recipeItems) - { - Object finalObj = ingred; - for (Entry replace : replacements.entrySet()) - { - if (OreDictionary.itemMatches(replace.getKey(), ingred, false)) - { - finalObj = OreDictionary.getOres(replace.getValue()); - break; - } - } - input.add(finalObj); - } - } - - @Override - public int getRecipeSize() - { - return input.size(); - } - - @Override - public ItemStack getRecipeOutput() - { - return output; - } - - @Override - public ItemStack getCraftingResult(InventoryCrafting var1) - { - return output.copy(); - } - - @SuppressWarnings("unchecked") - @Override - public boolean matches(InventoryCrafting var1, World world) - { - ArrayList required = new ArrayList(input); - - for (int x = 0; x < var1.getSizeInventory(); x++) - { - ItemStack slot = var1.getStackInSlot(x); - - if (!slot.isEmpty()) - { - boolean inRecipe = false; - Iterator req = required.iterator(); - - while (req.hasNext()) - { - boolean match = false; - - Object next = req.next(); - - // If target is integer, then we should be check the blood - // orb value of the item instead - if (next instanceof Integer) - { - if (slot.getItem() instanceof IBloodOrb) - { - IBloodOrb orb = (IBloodOrb) slot.getItem(); - if (orb.getOrbLevel(slot.getItemDamage()) < (Integer) next) - { - return false; - } - } else - return false; - match = true; - } else 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(); - } - - public ArrayList getInput() - { - return this.input; - } - - @Override - public NonNullList getRemainingItems(InventoryCrafting inv) - { - return ForgeHooks.defaultRecipeGetRemainingItems(inv); - } - - public int getTier() - { - return tier; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java index a90b6139..a94370cf 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java @@ -7,9 +7,6 @@ import java.util.Map.Entry; import javax.annotation.Nullable; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.oredict.OreDictionary; @@ -128,8 +125,8 @@ public class AlchemyArrayRecipeRegistry if (effectEntry.getValue() instanceof AlchemyArrayEffectCrafting) { AlchemyArrayEffectCrafting craftingEffect = (AlchemyArrayEffectCrafting) effectEntry.getValue(); - ItemStack resultStack = craftingEffect.getOutputStack(); - if (resultStack != null && resultStack.getItem() != null) + ItemStack resultStack = craftingEffect.outputStack; + if (!resultStack.isEmpty()) { if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { @@ -291,9 +288,6 @@ public class AlchemyArrayRecipeRegistry return getAlchemyCircleRenderer(Collections.singletonList(itemStack), catalystStack); } - @Getter - @ToString - @EqualsAndHashCode public static class AlchemyArrayRecipe { public AlchemyCircleRenderer defaultCircleRenderer; @@ -384,6 +378,45 @@ public class AlchemyArrayRecipeRegistry 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; + } } public static BiMap, AlchemyArrayRecipe> getRecipes() diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java index 36456448..247a2f6e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java @@ -28,7 +28,7 @@ public class ImperfectRitualRegistry if (imperfectRitual != null) { if (registry.containsKey(id)) - BloodMagicAPI.getLogger().error("Duplicate imperfect ritual id: %s", id); + BloodMagicAPI.logger.error("Duplicate imperfect ritual id: %s", id); else { registry.put(id, imperfectRitual); @@ -88,7 +88,7 @@ public class ImperfectRitualRegistry return enabledRituals.get(imperfectRitual); } catch (NullPointerException e) { - BloodMagicAPI.getLogger().error("Invalid Imperfect Ritual was called"); + BloodMagicAPI.logger.error("Invalid Imperfect Ritual was called"); return false; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java index cd389d37..4b090f4c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java @@ -33,15 +33,15 @@ public class RitualRegistry { if (locked) { - BloodMagicAPI.getLogger().error("This registry has been locked. Please register your ritual earlier."); - BloodMagicAPI.getLogger().error("If you reflect this, I will hunt you down. - TehNut"); + BloodMagicAPI.logger.error("This registry has been locked. Please register your ritual earlier."); + BloodMagicAPI.logger.error("If you reflect this, I will hunt you down. - TehNut"); return; } if (ritual != null) { if (registry.containsKey(id)) - BloodMagicAPI.getLogger().error("Duplicate ritual id: %s", id); + BloodMagicAPI.logger.error("Duplicate ritual id: %s", id); else { registry.put(id, ritual); @@ -95,7 +95,7 @@ public class RitualRegistry return enabledRituals.get(ritual); } catch (NullPointerException e) { - BloodMagicAPI.getLogger().error("Invalid Ritual was called"); + BloodMagicAPI.logger.error("Invalid Ritual was called"); return false; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java index 9be20395..eceeb97f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java @@ -1,9 +1,11 @@ package WayofTime.bloodmagic.api.ritual; -import WayofTime.bloodmagic.api.Constants; +import net.minecraft.init.Items; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fml.common.registry.GameRegistry; import java.util.Locale; @@ -17,6 +19,9 @@ public enum EnumRuneType implements IStringSerializable DUSK(TextFormatting.DARK_GRAY), DAWN(TextFormatting.GOLD); + @GameRegistry.ObjectHolder("bloodmagic:inscription_tool") + public static final Item INSCRIPTION_TOOL = Items.AIR; + public final TextFormatting colorCode; EnumRuneType(TextFormatting colorCode) @@ -34,7 +39,7 @@ public enum EnumRuneType implements IStringSerializable public ItemStack getScribeStack() { - return new ItemStack(Constants.BloodMagicItem.INSCRIPTION_TOOL.getItem(), 1, ordinal()); + return new ItemStack(INSCRIPTION_TOOL, 1, ordinal()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/ChunkPairSerializable.java b/src/main/java/WayofTime/bloodmagic/api/teleport/ChunkPairSerializable.java deleted file mode 100644 index 1ff58db1..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/ChunkPairSerializable.java +++ /dev/null @@ -1,38 +0,0 @@ -package WayofTime.bloodmagic.api.teleport; - -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; -import net.minecraft.util.math.BlockPos; - -import java.io.Serializable; - -@ToString -@EqualsAndHashCode -@Getter -public class ChunkPairSerializable implements Serializable -{ - private int chunkXPos; - private int chunkZPos; - - public ChunkPairSerializable(int chunkXPos, int chunkZPos) - { - this.chunkXPos = chunkXPos; - this.chunkZPos = chunkZPos; - } - - public ChunkPairSerializable(BlockPos blockPos) - { - this(blockPos.getX() >> 4, blockPos.getZ() >> 4); - } - - public BlockPos getChunkCenter(int y) - { - return new BlockPos((chunkXPos << 4) + 8, y, (chunkZPos << 4) + 8); - } - - public BlockPos getChunkCenter() - { - return getChunkCenter(64); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java b/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java index 644b4ffd..d4c2e9ce 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java +++ b/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java @@ -1,23 +1,16 @@ package WayofTime.bloodmagic.api.teleport; import WayofTime.bloodmagic.api.Constants; -import lombok.Getter; -import lombok.ToString; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; import java.io.Serializable; -@ToString public class PortalLocation implements Serializable { - @Getter private int x; - @Getter private int y; - @Getter private int z; - @Getter private int dimension; public PortalLocation(int x, int y, int z, int dimension) @@ -87,4 +80,20 @@ public class PortalLocation implements Serializable 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; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java b/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java index 8b0d470c..d2535574 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java +++ b/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java @@ -1,24 +1,14 @@ package WayofTime.bloodmagic.api.teleport; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; -@ToString -@EqualsAndHashCode public abstract class Teleport implements ITeleport { - @Getter protected int x; - @Getter protected int y; - @Getter protected int z; - @Getter protected Entity entity; - @Getter protected String networkToDrain; public Teleport(int x, int y, int z, Entity entity, String networkToDrain) @@ -34,4 +24,48 @@ public abstract class Teleport implements ITeleport { this(blockPos.getX(), blockPos.getY(), blockPos.getZ(), entity, networkToDrain); } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getZ() { + return z; + } + + public Entity getEntity() { + return entity; + } + + public String getNetworkToDrain() { + return networkToDrain; + } + + @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 networkToDrain != null ? networkToDrain.equals(teleport.networkToDrain) : teleport.networkToDrain == 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 + (networkToDrain != null ? networkToDrain.hashCode() : 0); + return result; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java index d2841ae3..8b1396d6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.api.util.helper; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.event.SoulNetworkEvent; +import WayofTime.bloodmagic.api.orb.BloodOrb; import WayofTime.bloodmagic.api.orb.IBloodOrb; import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.api.saving.BMWorldSavedData; @@ -87,9 +88,11 @@ public class NetworkHelper if (tier > OrbRegistry.getTierMap().size() || tier < 0) return ret; - for (ItemStack orbStack : OrbRegistry.getOrbsForTier(tier)) - if (((IBloodOrb) orbStack.getItem()).getMaxEssence(orbStack.getItemDamage()) > ret) - ret = ((IBloodOrb) orbStack.getItem()).getMaxEssence(orbStack.getItemDamage()); + for (ItemStack orbStack : OrbRegistry.getOrbsForTier(tier)) { + BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); + if (orb.getCapacity() > ret) + ret = orb.getCapacity(); + } return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java index 6379902f..aa0702b7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.api.util.helper; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.altar.IBloodAltar; import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.registry.ModPotions; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.potion.Potion; @@ -82,7 +82,7 @@ public class PlayerSacrificeHelper { player.setHealth(maxHealth / 10.0f); setPlayerIncense(player, 0); - player.addPotionEffect(new PotionEffect(ModPotions.soulFray, soulFrayDuration)); + player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, soulFrayDuration)); return true; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 2c1ed34c..32106390 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -7,6 +7,7 @@ import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.altar.IBloodAltar; import WayofTime.bloodmagic.api.iface.IDocumentedBlock; +import WayofTime.bloodmagic.api.orb.BloodOrb; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -76,13 +77,13 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl { if (orbStack.getItem() instanceof IBloodOrb && orbStack.getItem() instanceof IBindable) { - IBloodOrb bloodOrb = (IBloodOrb) orbStack.getItem(); + BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); IBindable bindable = (IBindable) orbStack.getItem(); - if (!Strings.isNullOrEmpty(bindable.getOwnerUUID(orbStack))) + if (orb != null && !Strings.isNullOrEmpty(bindable.getOwnerUUID(orbStack))) { SoulNetwork soulNetwork = NetworkHelper.getSoulNetwork(bindable.getOwnerUUID(orbStack)); - int maxEssence = bloodOrb.getMaxEssence(orbStack.getItemDamage()); + int maxEssence = orb.getCapacity(); int currentEssence = soulNetwork.getCurrentEssence(); int level = currentEssence * 15 / maxEssence; return Math.min(15, level) % 16; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java index c11a4365..6f70bee1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -91,7 +91,7 @@ public class BlockSpectral extends Block implements IVariantProvider } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity) + public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity, boolean bool) { } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java index 3bf70c91..1e3fcd0e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java @@ -72,4 +72,16 @@ public class BlockInteger extends Block 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/client/gui/GuiAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java index 5794d1e6..4c0d214f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java @@ -29,8 +29,8 @@ public class GuiAlchemyTable extends GuiContainer @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRendererObj.drawString(TextHelper.localize("tile.bloodmagic.alchemyTable.name"), 8, 5, 4210752); - this.fontRendererObj.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); + this.fontRenderer.drawString(TextHelper.localize("tile.bloodmagic.alchemyTable.name"), 8, 5, 4210752); + this.fontRenderer.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java index 8a21e4e2..f68ef440 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java @@ -31,7 +31,7 @@ public class GuiHolding extends GuiContainer protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { //the parameters for drawString are: string, x, y, color - fontRendererObj.drawString(TextHelper.localize("item.bloodmagic.sigil.holding.name"), 53, 4, 4210752); + fontRenderer.drawString(TextHelper.localize("item.bloodmagic.sigil.holding.name"), 53, 4, 4210752); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java index 049a8fdf..1f4d9a13 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -80,7 +80,7 @@ public class GuiItemRoutingNode extends GuiContainer this.buttonList.add(this.decrementButton = new GuiButton(7, left + 132, top + 50, 10, 18, "<")); disableDirectionalButton(inventory.currentActiveSlot); - this.textBox = new GuiTextField(0, this.fontRendererObj, left + 94, top + 37, 70, 12); + this.textBox = new GuiTextField(0, this.fontRenderer, left + 94, top + 37, 70, 12); this.textBox.setEnableBackgroundDrawing(false); this.textBox.setText(""); } @@ -155,7 +155,7 @@ public class GuiItemRoutingNode extends GuiContainer { super.drawScreen(mouseX, mouseY, partialTicks); - Minecraft.getMinecraft().fontRendererObj.drawString(inventory.getName(), xSize, ySize / 4, 4210752); + Minecraft.getMinecraft().fontRenderer.drawString(inventory.getName(), xSize, ySize / 4, 4210752); } /** @@ -193,7 +193,7 @@ public class GuiItemRoutingNode extends GuiContainer @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRendererObj.drawString("" + getCurrentActiveSlotPriority(), 143 + 5, 51 + 4, 0xFFFFFF); + this.fontRenderer.drawString("" + getCurrentActiveSlotPriority(), 143 + 5, 51 + 4, 0xFFFFFF); String s = ""; if (container.lastGhostSlotClicked != -1) { @@ -204,7 +204,7 @@ public class GuiItemRoutingNode extends GuiContainer } } - this.fontRendererObj.drawStringWithShadow(s.substring(0, Math.min(16, s.length())), 81, 19, 0xFFFFFF); + this.fontRenderer.drawStringWithShadow(s.substring(0, Math.min(16, s.length())), 81, 19, 0xFFFFFF); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java index 6dc01ad4..a383f96d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java @@ -28,8 +28,8 @@ public class GuiSoulForge extends GuiContainer @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); + this.fontRenderer.drawString(TextHelper.localize("tile.bloodmagic.soulForge.name"), 8, 5, 4210752); + this.fontRenderer.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java index 74729451..2220e04b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java @@ -22,8 +22,8 @@ public class GuiTeleposer extends GuiContainer @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRendererObj.drawString(TextHelper.localize("tile.bloodmagic.teleposer.name"), 64, 23, 4210752); - this.fontRendererObj.drawString(TextHelper.localize("container.inventory"), 8, 47, 4210752); + this.fontRenderer.drawString(TextHelper.localize("tile.bloodmagic.teleposer.name"), 64, 23, 4210752); + this.fontRenderer.drawString(TextHelper.localize("container.inventory"), 8, 47, 4210752); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java index 910bba94..c535ebd0 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java @@ -25,15 +25,15 @@ public class ConfigGui extends GuiConfig // adds sections declared in ConfigHandler. toLowerCase() is used // because the configuration class automatically does this, so must we. - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Potions".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Client".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Compatibility".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Teleposer Blacklist".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Well of Suffering Blacklist".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Item/Block Blacklisting".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("General".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Rituals".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.getConfig().getCategory("Blood Altar Sacrificial Values".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Potions".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Client".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Compatibility".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Teleposer Blacklist".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Well of Suffering Blacklist".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Item/Block Blacklisting".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("General".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Rituals".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Blood Altar Sacrificial Values".toLowerCase()))); return list; } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java index 05c72094..8b2e4598 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java @@ -8,28 +8,23 @@ import java.util.Set; public class ConfigGuiFactory implements IModGuiFactory { - @Override - public void initialize(Minecraft minecraftInstance) - { + public void initialize(Minecraft minecraftInstance) { } @Override - public Class mainConfigGuiClass() - { - return ConfigGui.class; + public boolean hasConfigGui() { + return false; } @Override - public Set runtimeGuiCategories() - { - return null; + public GuiScreen createConfigGui(GuiScreen parentScreen) { + return new ConfigGui(parentScreen); } @Override - public RuntimeOptionGuiHandler getHandlerFor(IModGuiFactory.RuntimeOptionCategoryElement element) - { + public Set runtimeGuiCategories() { return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java index ea91517c..7aea273b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java @@ -10,7 +10,6 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent; public abstract class HUDElement { - private int xOffset; private int yOffset; private final int xOffsetDefault; @@ -57,19 +56,19 @@ public abstract class HUDElement tessellator.draw(); } - public int getxOffset() { + public int getXOffset() { return xOffset; } - public int getyOffset() { + public int getYOffset() { return yOffset; } - public int getxOffsetDefault() { + public int getXOffsetDefault() { return xOffsetDefault; } - public int getyOffsetDefault() { + public int getYOffsetDefault() { return yOffsetDefault; } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java index 45d8ce3e..f7f195e0 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java @@ -7,7 +7,6 @@ import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderGameOverlayEvent; @@ -74,7 +73,7 @@ public class HUDElementDemonWillAura extends HUDElement String value = "" + (int) amount; GlStateManager.translate(x - 2 * textureXOffset - value.length() * 0 + 70, (y - 1), 0); GlStateManager.scale(0.5, 0.5, 1); - minecraft.fontRendererObj.drawStringWithShadow("" + (int) amount, 0, 2, 0xffffff); + minecraft.fontRenderer.drawStringWithShadow("" + (int) amount, 0, 2, 0xffffff); GlStateManager.popMatrix(); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java index 227b832c..9914bbf1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java @@ -80,7 +80,7 @@ public class HUDElementHolding extends HUDElement if (animation > 0.0F) GlStateManager.popMatrix(); - Minecraft.getMinecraft().getRenderItem().renderItemOverlays(Minecraft.getMinecraft().fontRendererObj, stack, x, y); + Minecraft.getMinecraft().getRenderItem().renderItemOverlays(Minecraft.getMinecraft().fontRenderer, stack, x, y); } } } diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java index 2ba73161..add94841 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java @@ -19,7 +19,7 @@ public class CustomMeshDefinitionActivatable implements ItemMeshDefinition @Override public ModelResourceLocation getModelLocation(ItemStack stack) { - if (stack != null && stack.getItem() instanceof IActivatable) + if (!stack.isEmpty() && stack.getItem() instanceof IActivatable) if (((IActivatable) stack.getItem()).getActivated(stack)) return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "active=true"); diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java index 0edb0e0c..283f5358 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java @@ -20,7 +20,7 @@ public class CustomMeshDefinitionMultiWill implements ItemMeshDefinition @Override public ModelResourceLocation getModelLocation(ItemStack stack) { - if (stack != null && stack.getItem() instanceof IMultiWillTool) + if (!stack.isEmpty() && stack.getItem() instanceof IMultiWillTool) { EnumDemonWillType type = ((IMultiWillTool) stack.getItem()).getCurrentType(stack); return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "type=" + type.getName().toLowerCase()); diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java index dc2c6825..45e4af99 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java @@ -21,7 +21,7 @@ public class CustomMeshDefinitionWillGem implements ItemMeshDefinition @Override public ModelResourceLocation getModelLocation(ItemStack stack) { - if (stack != null && stack.getItem() == RegistrarBloodMagicItems.SOUL_GEM) + if (!stack.isEmpty() && stack.getItem() == RegistrarBloodMagicItems.SOUL_GEM) { EnumDemonWillType type = ((ItemSoulGem) stack.getItem()).getCurrentType(stack); return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "type=" + ItemSoulGem.names[stack.getItemDamage()] + "_" + type.getName().toLowerCase()); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java index 2318d142..b8af70c5 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -1,9 +1,9 @@ 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.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; @@ -71,7 +71,7 @@ public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer TileAlchemyArray tileArray = (TileAlchemyArray) tile; Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer wr = tessellator.getBuffer(); + BufferBuilder wr = tessellator.getBuffer(); GlStateManager.pushMatrix(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index 0ef9593e..208ca594 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -1,9 +1,9 @@ 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.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; @@ -168,7 +168,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer wr = tessellator.getBuffer(); + BufferBuilder wr = tessellator.getBuffer(); GlStateManager.pushMatrix(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java index bb7248da..f9d62120 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java @@ -1,9 +1,9 @@ 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.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; @@ -56,7 +56,7 @@ public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer TileAlchemyArray tileArray = (TileAlchemyArray) tile; Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer wr = tessellator.getBuffer(); + BufferBuilder wr = tessellator.getBuffer(); GlStateManager.pushMatrix(); // float rot = (float)(this.worldObj.provider.getWorldTime() % (360 / diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java index fe71a314..b4c2059c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java @@ -1,9 +1,9 @@ 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.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; @@ -54,7 +54,7 @@ public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer TileAlchemyArray tileArray = (TileAlchemyArray) tile; Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer wr = tessellator.getBuffer(); + BufferBuilder wr = tessellator.getBuffer(); GlStateManager.pushMatrix(); // float rot = (float)(this.worldObj.provider.getWorldTime() % (360 / diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java index 3de40f39..ea243639 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java @@ -1,9 +1,9 @@ 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.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; @@ -58,7 +58,7 @@ public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer TileAlchemyArray tileArray = (TileAlchemyArray) tile; Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer wr = tessellator.getBuffer(); + BufferBuilder wr = tessellator.getBuffer(); GlStateManager.pushMatrix(); 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 bd8913c3..61e4d563 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java @@ -9,7 +9,7 @@ import net.minecraft.item.ItemStack; public class RenderAlchemyArray extends TileEntitySpecialRenderer { @Override - public void renderTileEntityAt(TileAlchemyArray alchemyArray, double x, double y, double z, float partialTicks, int destroyStage) + 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); 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 5192a0a2..e51545d7 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -30,7 +30,7 @@ public class RenderAltar extends TileEntitySpecialRenderer public static float maxHeight = 0.745f; @Override - public void renderTileEntityAt(TileAltar tileAltar, double x, double y, double z, float partialTicks, int destroyStage) + public void render(TileAltar tileAltar, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { ItemStack inputStack = tileAltar.getStackInSlot(0); @@ -40,7 +40,7 @@ public class RenderAltar extends TileEntitySpecialRenderer GlStateManager.translate(x, y, z); if (level > 0) this.renderFluid(getWorld(), level); - this.renderItem(tileAltar.getWorld(), inputStack, partialTicks); + this.renderItem(tileAltar.getWorld(), inputStack); GlStateManager.popMatrix(); if (tileAltar.getCurrentTierDisplayed() != EnumAltarTier.ONE) @@ -59,7 +59,7 @@ public class RenderAltar extends TileEntitySpecialRenderer GlStateManager.translate(0.5, minHeight + (fluidLevel) * (maxHeight - minHeight), 0.5); Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer wr = tessellator.getBuffer(); + BufferBuilder wr = tessellator.getBuffer(); float size = 0.8f; @@ -95,14 +95,14 @@ public class RenderAltar extends TileEntitySpecialRenderer GlStateManager.color(red, green, blue, 1.0F); } - private void renderItem(World world, ItemStack stack, float partialTicks) + private void renderItem(World world, ItemStack stack) { RenderItem itemRenderer = mc.getRenderItem(); - if (stack != null) + if (!stack.isEmpty()) { GlStateManager.translate(0.5, 1, 0.5); EntityItem entityitem = new EntityItem(world, 0.0D, 0.0D, 0.0D, stack); - entityitem.getEntityItem().setCount(1); + entityitem.getItem().setCount(1); entityitem.hoverStart = 0.0F; GlStateManager.pushMatrix(); GlStateManager.disableLighting(); @@ -113,7 +113,7 @@ public class RenderAltar extends TileEntitySpecialRenderer GlStateManager.scale(0.5F, 0.5F, 0.5F); GlStateManager.pushAttrib(); RenderHelper.enableStandardItemLighting(); - itemRenderer.renderItem(entityitem.getEntityItem(), ItemCameraTransforms.TransformType.FIXED); + itemRenderer.renderItem(entityitem.getItem(), ItemCameraTransforms.TransformType.FIXED); RenderHelper.disableStandardItemLighting(); GlStateManager.popAttrib(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java index 73da5b03..844d41ce 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java @@ -2,10 +2,10 @@ 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.VertexBuffer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -21,7 +21,7 @@ public class RenderBloodTank extends TileEntitySpecialRenderer private static final Minecraft mc = Minecraft.getMinecraft(); @Override - public void renderTileEntityAt(TileBloodTank bloodTank, double x, double y, double z, float partialTicks, int destroyStage) + public void render(TileBloodTank bloodTank, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { if (bloodTank == null) return; @@ -50,7 +50,7 @@ public class RenderBloodTank extends TileEntitySpecialRenderer GlStateManager.disableBlend(); Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer buffer = tessellator.getBuffer(); + BufferBuilder buffer = tessellator.getBuffer(); TextureAtlasSprite fluid = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(renderFluid.getStill().toString()); fluid = fluid == null ? mc.getTextureMapBlocks().getMissingSprite() : fluid; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java index 875e5254..9b7ed869 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java @@ -20,7 +20,7 @@ public class RenderDemonCrucible extends TileEntitySpecialRenderer { - public void renderTileEntityAt(TileMimic mimic, double x, double y, double z, float partialTicks, int destroyStage) + 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.renderTileEntityAt(testTile, x, y, z, partialTicks, destroyStage); + TileEntityRendererDispatcher.instance.render(testTile, x, y, z, partialTicks, destroyStage); } } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java index ee35fc89..7667e9f5 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.client.render.entity; +import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; @@ -38,7 +38,7 @@ public class RenderEntitySentientArrow extends Render 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(); - VertexBuffer worldrenderer = tessellator.getBuffer(); + BufferBuilder worldrenderer = tessellator.getBuffer(); int i = 0; float f = 0.0F; float f1 = 0.5F; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java index 38416f92..2dc7df63 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java @@ -40,18 +40,8 @@ public class RenderSentientSpecter extends RenderBiped */ public void doRender(EntitySentientSpecter entity, double x, double y, double z, float entityYaw, float partialTicks) { -// if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.RenderPlayerEvent.Pre(entity, this, partialTicks, x, y, z))) -// return; -// if (!entity.isUser() || this.renderManager.renderViewEntity == entity) - { - double d0 = y; - - this.setModelVisibilities(entity); -// GlStateManager.enableBlendProfile(GlStateManager.Profile.PLAYER_SKIN); - super.doRender(entity, x, d0, z, entityYaw, partialTicks); -// GlStateManager.disableBlendProfile(GlStateManager.Profile.PLAYER_SKIN); - } -// net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.RenderPlayerEvent.Post(entity, this, partialTicks, x, y, z)); + this.setModelVisibilities(entity); + super.doRender(entity, x, y, z, entityYaw, partialTicks); } private void setModelVisibilities(EntitySentientSpecter clientPlayer) @@ -60,13 +50,13 @@ public class RenderSentientSpecter extends RenderBiped ItemStack itemstack = clientPlayer.getHeldItemMainhand(); ItemStack itemstack1 = clientPlayer.getHeldItemOffhand(); - modelplayer.setInvisible(true); + modelplayer.setVisible(false); modelplayer.isSneak = clientPlayer.isSneaking(); ModelBiped.ArmPose modelbiped$armpose = ModelBiped.ArmPose.EMPTY; ModelBiped.ArmPose modelbiped$armpose1 = ModelBiped.ArmPose.EMPTY; - if (itemstack != null) + if (!itemstack.isEmpty()) { modelbiped$armpose = ModelBiped.ArmPose.ITEM; @@ -84,7 +74,7 @@ public class RenderSentientSpecter extends RenderBiped } } - if (itemstack1 != null) + if (!itemstack1.isEmpty()) { modelbiped$armpose1 = ModelBiped.ArmPose.ITEM; @@ -134,40 +124,4 @@ public class RenderSentientSpecter extends RenderBiped float f = 0.9375F; GlStateManager.scale(0.9375F, 0.9375F, 0.9375F); } - -// public void renderRightArm(EntitySentientSpecter clientPlayer) -// { -// float f = 1.0F; -// GlStateManager.color(1.0F, 1.0F, 1.0F); -// float f1 = 0.0625F; -// ModelBiped modelplayer = this.getMainModel(); -// this.setModelVisibilities(clientPlayer); -// GlStateManager.enableBlend(); -// modelplayer.swingProgress = 0.0F; -// modelplayer.isSneak = false; -// modelplayer.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, clientPlayer); -// modelplayer.bipedRightArm.rotateAngleX = 0.0F; -// modelplayer.bipedRightArm.render(0.0625F); -// modelplayer.bipedRightArmwear.rotateAngleX = 0.0F; -// modelplayer.bipedRightArmwear.render(0.0625F); -// GlStateManager.disableBlend(); -// } -// -// public void renderLeftArm(EntitySentientSpecter clientPlayer) -// { -// float f = 1.0F; -// GlStateManager.color(1.0F, 1.0F, 1.0F); -// float f1 = 0.0625F; -// ModelBiped modelplayer = this.getMainModel(); -// this.setModelVisibilities(clientPlayer); -// GlStateManager.enableBlend(); -// modelplayer.isSneak = false; -// modelplayer.swingProgress = 0.0F; -// modelplayer.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, clientPlayer); -// modelplayer.bipedLeftArm.rotateAngleX = 0.0F; -// modelplayer.bipedLeftArm.render(0.0625F); -// modelplayer.bipedLeftArmwear.rotateAngleX = 0.0F; -// modelplayer.bipedLeftArmwear.render(0.0625F); -// GlStateManager.disableBlend(); -// } } \ No newline at end of file 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 index 454a71fa..26d3fdc9 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.client.render.entity.layer; 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.VertexBuffer; import net.minecraft.client.renderer.entity.layers.LayerRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.ResourceLocation; @@ -32,7 +32,7 @@ public class LayerAlchemyCircle implements Layer } Tessellator tessellator = Tessellator.getInstance(); - VertexBuffer wr = tessellator.getBuffer(); + BufferBuilder wr = tessellator.getBuffer(); GlStateManager.pushMatrix(); float rot = this.rotationspeed * (partialTicks + demon.ticksExisted); 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 index 2101fae7..f2ba759d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSpiderEyes.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSpiderEyes.java @@ -41,11 +41,11 @@ public class LayerCorruptedSpiderEyes implements LayerRenderer weakorbPages = new ArrayList(); weakorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakorb" + ".info.1"), 370)); - AltarRecipe weakorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_WEAK)); + AltarRecipe weakorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK)); if (weakorbRecipe != null) { weakorbPages.add(new PageAltarRecipe(weakorbRecipe)); @@ -196,7 +197,7 @@ public class CategoryArchitect List apprenticeorbPages = new ArrayList(); - AltarRecipe apprenticeorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_APPRENTICE)); + AltarRecipe apprenticeorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE)); if (apprenticeorbRecipe != null) { apprenticeorbPages.add(new PageAltarRecipe(apprenticeorbRecipe)); @@ -342,7 +343,7 @@ public class CategoryArchitect List magicianOrbPages = new ArrayList(); - AltarRecipe magicianOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN)); + AltarRecipe magicianOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN)); if (magicianOrbRecipe != null) { magicianOrbPages.add(new PageAltarRecipe(magicianOrbRecipe)); @@ -538,7 +539,7 @@ public class CategoryArchitect List masterOrbPages = new ArrayList(); - AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER)); + AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER)); if (magicianOrbRecipe != null) { masterOrbPages.add(new PageAltarRecipe(masterOrbRecipe)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/ShapedBloodOrbRecipeRenderer.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/ShapedBloodOrbRecipeRenderer.java deleted file mode 100644 index e142a2f0..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/ShapedBloodOrbRecipeRenderer.java +++ /dev/null @@ -1,79 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.page.recipeRenderer; - -import java.util.List; - -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.api.recipe.ShapedBloodOrbRecipe; -import WayofTime.bloodmagic.api.registry.OrbRegistry; -import amerifrance.guideapi.api.impl.Book; -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 amerifrance.guideapi.page.reciperenderer.BasicRecipeRenderer; - -// TODO: Fix rendering of recipe -public class ShapedBloodOrbRecipeRenderer extends BasicRecipeRenderer -{ - public ShapedBloodOrbRecipeRenderer(ShapedBloodOrbRecipe recipe) - { - super(recipe); - } - - @SuppressWarnings("unchecked") - @Override - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) - { - super.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); - for (int y = 0; y < recipe.height; y++) - { - for (int x = 0; x < recipe.width; x++) - { - int stackX = (x + 1) * 17 + (guiLeft + 29); - int stackY = (y + 1) * 17 + (guiTop + 40); - Object component = recipe.getInput()[y * recipe.width + 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); - } - } else if (component instanceof Integer) - { - List list = OrbRegistry.getOrbsDownToTier((Integer) component); - if (!list.isEmpty()) - { - ItemStack stack = list.get(getRandomizedCycle(x + (y * 3), list.size())); - GuiHelper.drawItemStack(stack, stackX, stackY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) - { - tooltips = GuiHelper.getTooltip(stack); - } - } - } else - { - List list = (List) component; - if (!list.isEmpty()) - { - ItemStack stack = list.get(getRandomizedCycle(x + (y * 3), list.size())); - GuiHelper.drawItemStack(stack, stackX, stackY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) - { - tooltips = GuiHelper.getTooltip(stack); - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/ShapelessBloodOrbRecipeRenderer.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/ShapelessBloodOrbRecipeRenderer.java deleted file mode 100644 index 85684219..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/recipeRenderer/ShapelessBloodOrbRecipeRenderer.java +++ /dev/null @@ -1,92 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.page.recipeRenderer; - -import java.util.List; - -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.api.recipe.ShapelessBloodOrbRecipe; -import WayofTime.bloodmagic.api.registry.OrbRegistry; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.page.reciperenderer.BasicRecipeRenderer; - -public class ShapelessBloodOrbRecipeRenderer extends BasicRecipeRenderer -{ - - public ShapelessBloodOrbRecipeRenderer(ShapelessBloodOrbRecipe recipe) - { - super(recipe); - } - - @SuppressWarnings("unchecked") - @Override - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) - { - super.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); - for (int y = 0; y < 3; y++) - { - for (int x = 0; x < 3; x++) - { - int i = 3 * y + x; - if (i >= recipe.getRecipeSize()) - { - } else - { - int stackX = (x + 1) * 17 + (guiLeft + 29); - int stackY = (y + 1) * 17 + (guiTop + 40); - Object component = recipe.getInput().get(i); - 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); - } - } else if (component instanceof Integer) - { - List list = OrbRegistry.getOrbsDownToTier((Integer) component); - if (!list.isEmpty()) - { - ItemStack stack = list.get(getRandomizedCycle(x + (y * 3), list.size())); - GuiHelper.drawItemStack(stack, stackX, stackY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) - { - tooltips = GuiHelper.getTooltip(stack); - } - } - } else - { - List list = (List) component; - if (!list.isEmpty()) - { - ItemStack stack = list.get(getRandomizedCycle(x + (y * 3), list.size())); - GuiHelper.drawItemStack(stack, stackX, stackY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) - { - tooltips = GuiHelper.getTooltip(stack); - } - } - } - } - } - } - } - } - - @Override - protected String getRecipeName() - { - return TextHelper.localizeEffect("text.shapeless.crafting"); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index aa1bcb3e..1a1de334 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -5,8 +5,8 @@ import java.util.Map; import javax.annotation.Nonnull; import mezz.jei.api.*; +import mezz.jei.api.recipe.IRecipeCategoryRegistration; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; @@ -29,8 +29,6 @@ import WayofTime.bloodmagic.compat.jei.binding.BindingRecipeMaker; import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeCategory; import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeHandler; import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeMaker; -import WayofTime.bloodmagic.compat.jei.orb.ShapedOrbRecipeHandler; -import WayofTime.bloodmagic.compat.jei.orb.ShapelessOrbRecipeHandler; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; @@ -44,9 +42,14 @@ public class BloodMagicPlugin extends BlankModPlugin { jeiHelper = registry.getJeiHelpers(); - registry.addRecipeCategories(new AltarRecipeCategory(), new BindingRecipeCategory(), new AlchemyArrayCraftingCategory(), new TartaricForgeRecipeCategory(), new AlchemyTableRecipeCategory(), new ArmourDowngradeRecipeCategory()); - - registry.addRecipeHandlers(new AltarRecipeHandler(), new BindingRecipeHandler(), new AlchemyArrayCraftingRecipeHandler(), new TartaricForgeRecipeHandler(), new AlchemyTableRecipeHandler(), new ArmourDowngradeRecipeHandler(), new ShapedOrbRecipeHandler(), new ShapelessOrbRecipeHandler()); + registry.addRecipeHandlers( + new AltarRecipeHandler(), + new BindingRecipeHandler(), + new AlchemyArrayCraftingRecipeHandler(), + new TartaricForgeRecipeHandler(), + new AlchemyTableRecipeHandler(), + new ArmourDowngradeRecipeHandler() + ); registry.addRecipes(AltarRecipeMaker.getRecipes()); registry.addRecipes(BindingRecipeMaker.getRecipes()); @@ -55,14 +58,8 @@ public class BloodMagicPlugin extends BlankModPlugin registry.addRecipes(AlchemyTableRecipeMaker.getRecipes()); registry.addRecipes(ArmourDowngradeRecipeMaker.getRecipes()); - registry.addDescription(new ItemStack(RegistrarBloodMagicItems.ALTAR_MAKER), "jei.bloodmagic.desc.altarBuilder"); - registry.addDescription(new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL), "jei.bloodmagic.desc.demonicWill"); - - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_LIGHT)); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.SPECTRAL)); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.PHANTOM)); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.ALCHEMY_ARRAY)); - jeiHelper.getItemBlacklist().addItemToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL, 1, OreDictionary.WILDCARD_VALUE)); + 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()) { @@ -73,22 +70,37 @@ public class BloodMagicPlugin extends BlankModPlugin ItemStack stack = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); LivingUpgrades.setKey(stack, key); LivingUpgrades.setLevel(stack, i); - jeiHelper.getItemBlacklist().addItemToBlacklist(stack); + jeiHelper.getIngredientBlacklist().addIngredientToBlacklist(stack); } } registry.addRecipeClickArea(GuiSoulForge.class, 115, 15, 16, 88, Constants.Compat.JEI_CATEGORY_SOULFORGE); - registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicBlocks.ALTAR), Constants.Compat.JEI_CATEGORY_ALTAR); - registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE), Constants.Compat.JEI_CATEGORY_SOULFORGE); - registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY); - registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_BINDING); - registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicBlocks.ALCHEMY_TABLE), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); - registry.addRecipeCategoryCraftingItem(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE); + 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); } @Override public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.UPGRADE_TOME); } + + @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() + ); + } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java index 9635c043..dbafede6 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import WayofTime.bloodmagic.BloodMagic; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.ingredients.IIngredients; @@ -74,4 +75,9 @@ public class AlchemyArrayCraftingCategory implements IRecipeCategory 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/AlchemyArrayCraftingRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java index ad94d56e..80490fc7 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java @@ -33,7 +33,7 @@ public class AlchemyArrayCraftingRecipeMaker ItemStack catalyst = entry.getKey().toStack(); if (AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(input, catalyst) instanceof AlchemyArrayEffectCrafting) { - ItemStack output = ((AlchemyArrayEffectCrafting) itemStackAlchemyArrayRecipeEntry.getValue().getAlchemyArrayEffectForCatalyst(catalyst)).getOutputStack(); + ItemStack output = ((AlchemyArrayEffectCrafting) itemStackAlchemyArrayRecipeEntry.getValue().getAlchemyArrayEffectForCatalyst(catalyst)).outputStack; AlchemyArrayCraftingRecipeJEI recipe = new AlchemyArrayCraftingRecipeJEI(input, catalyst, output); recipes.add(recipe); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java index d8306508..de1ceca0 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; import javax.annotation.Nonnull; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.registry.OrbRegistry; import mezz.jei.api.gui.ICraftingGridHelper; import mezz.jei.api.gui.IDrawable; @@ -75,4 +76,9 @@ public class AlchemyTableRecipeCategory extends BlankRecipeCategory validGems = new ArrayList(); public TartaricForgeRecipeJEI(TartaricForgeRecipe recipe) @@ -70,4 +67,12 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper this.minSouls = minSouls; } } + + public TartaricForgeRecipe getRecipe() { + return recipe; + } + + public List getValidGems() { + return validGems; + } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeHandler.java deleted file mode 100644 index e869ea63..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.orb; - -import java.util.Arrays; - -import javax.annotation.Nonnull; - -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; -import mezz.jei.api.recipe.VanillaRecipeCategoryUid; -import WayofTime.bloodmagic.api.recipe.ShapedBloodOrbRecipe; - -public class ShapedOrbRecipeHandler implements IRecipeHandler -{ - - @Nonnull - @Override - public Class getRecipeClass() - { - return ShapedBloodOrbRecipe.class; - } - - @Nonnull - public String getRecipeCategoryUid(@Nonnull ShapedBloodOrbRecipe recipe) - { - return VanillaRecipeCategoryUid.CRAFTING; - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull ShapedBloodOrbRecipe recipe) - { - return new ShapedOrbRecipeJEI(Arrays.asList(recipe.getInput()), recipe.getTier(), recipe.getRecipeOutput()); - } - - @Override - public boolean isRecipeValid(@Nonnull ShapedBloodOrbRecipe recipe) - { - return recipe.getInput().length > 0; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeJEI.java deleted file mode 100644 index acb6d5fe..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapedOrbRecipeJEI.java +++ /dev/null @@ -1,68 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.orb; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import WayofTime.bloodmagic.util.helper.NumeralHelper; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.BlankRecipeWrapper; -import mezz.jei.api.recipe.wrapper.IShapedCraftingRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.api.registry.OrbRegistry; -import WayofTime.bloodmagic.util.helper.TextHelper; - -public class ShapedOrbRecipeJEI extends BlankRecipeWrapper implements IShapedCraftingRecipeWrapper -{ - - @Nonnull - private final List inputs; - - private final int tier; - - @Nonnull - private final ItemStack output; - - @SuppressWarnings("unchecked") - public ShapedOrbRecipeJEI(@Nonnull List input, int tier, @Nonnull ItemStack output) - { - ArrayList inputList = new ArrayList(input); - - for (Object object : inputList) - if (object instanceof Integer) - inputList.set(inputList.indexOf(object), OrbRegistry.getOrbsDownToTier((Integer) object)); - - this.inputs = inputList; - this.tier = tier; - this.output = output; - } - - @Override - public int getWidth() - { - return 3; - } - - @Override - public int getHeight() - { - return 3; - } - - @Override - public void getIngredients(IIngredients ingredients) { - List> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(inputs); - ingredients.setInputLists(ItemStack.class, expanded); - ingredients.setOutput(ItemStack.class, output); - } - - @Override - public void drawInfo(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) { - String draw = TextHelper.localize("jei.bloodmagic.recipe.requiredTier", NumeralHelper.toRoman(tier)); - minecraft.fontRendererObj.drawString(draw, 72 - minecraft.fontRendererObj.getStringWidth(draw) / 2, 10, Color.gray.getRGB()); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeHandler.java deleted file mode 100644 index 1e59b30d..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.orb; - -import javax.annotation.Nonnull; - -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; -import mezz.jei.api.recipe.VanillaRecipeCategoryUid; -import WayofTime.bloodmagic.api.recipe.ShapelessBloodOrbRecipe; - -public class ShapelessOrbRecipeHandler implements IRecipeHandler -{ - - @Nonnull - @Override - public Class getRecipeClass() - { - return ShapelessBloodOrbRecipe.class; - } - - @Override - public String getRecipeCategoryUid(@Nonnull ShapelessBloodOrbRecipe recipe) - { - return VanillaRecipeCategoryUid.CRAFTING; - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull ShapelessBloodOrbRecipe recipe) - { - return new ShapelessOrbRecipeJEI(recipe.getInput(), recipe.getTier(), recipe.getRecipeOutput()); - } - - @Override - public boolean isRecipeValid(@Nonnull ShapelessBloodOrbRecipe recipe) - { - return recipe.getInput().size() > 0; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeJEI.java deleted file mode 100644 index dd9eccc5..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/orb/ShapelessOrbRecipeJEI.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.orb; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import WayofTime.bloodmagic.util.helper.NumeralHelper; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.BlankRecipeWrapper; -import mezz.jei.api.recipe.wrapper.ICraftingRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; -import WayofTime.bloodmagic.api.registry.OrbRegistry; -import WayofTime.bloodmagic.util.helper.TextHelper; - -public class ShapelessOrbRecipeJEI extends BlankRecipeWrapper implements ICraftingRecipeWrapper -{ - - @Nonnull - private final List inputs; - private final int tier; - @Nonnull - private final ItemStack output; - - @SuppressWarnings("unchecked") - public ShapelessOrbRecipeJEI(@Nonnull List input, int tier, @Nonnull ItemStack output) - { - ArrayList inputList = new ArrayList(input); - - for (Object object : inputList) - if (object instanceof Integer) - inputList.set(inputList.indexOf(object), OrbRegistry.getOrbsDownToTier((Integer) object)); - - this.inputs = inputList; - this.tier = tier; - this.output = output; - } - - @Override - public void getIngredients(IIngredients ingredients) { - List> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(inputs); - ingredients.setInputLists(ItemStack.class, expanded); - ingredients.setOutput(ItemStack.class, output); - } - - @Override - public void drawInfo(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) - { - String draw = TextHelper.localize("jei.bloodmagic.recipe.requiredTier", NumeralHelper.toRoman(tier)); - minecraft.fontRendererObj.drawString(draw, 72 - minecraft.fontRendererObj.getStringWidth(draw) / 2, 10, Color.gray.getRGB()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 61561423..46730d7b 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -25,7 +25,7 @@ public class StorageBlockCraftingManager public void addStorageBlockRecipes() { - this.recipes = new StorageBlockCraftingRecipeAssimilator().getPackingRecipes(); +// this.recipes = new StorageBlockCraftingRecipeAssimilator().getPackingRecipes(); BloodMagic.instance.logger.info("Total number of compression recipes: " + this.recipes.size()); } diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java index 7841cab2..f119e102 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java @@ -16,285 +16,285 @@ import java.util.*; 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; - } +// 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/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index d6385a0a..8af50e57 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -77,7 +77,7 @@ public class RegistrarBloodMagicItems 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 ITEM_COMPONENT = 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; @@ -160,7 +160,7 @@ public class RegistrarBloodMagicItems new ItemSigilBounce().setRegistryName("sigil_bounce"), new ItemSigilFrost().setRegistryName("sigil_frost"), new ItemComponent().setRegistryName("component"), - new ItemDemonCrystal().setRegistryName("demon_crystal"), + new ItemDemonCrystal().setRegistryName("item_demon_crystal"), new ItemTelepositionFocus().setRegistryName("teleposition_focus"), new ItemExperienceBook().setRegistryName("experience_book"), new ItemBloodShard().setRegistryName("blood_shard"), diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java index ee30ed6d..efbfb5c4 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.entity.projectile; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.potion.PotionEffect; @@ -7,7 +8,6 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -import WayofTime.bloodmagic.registry.ModPotions; public class EntitySoulSnare extends EntityThrowable { @@ -41,7 +41,7 @@ public class EntitySoulSnare extends EntityThrowable { if (result.entityHit instanceof EntityLivingBase && result.entityHit.getEntityWorld().rand.nextDouble() < 0.25) { - ((EntityLivingBase) result.entityHit).addPotionEffect(new PotionEffect(ModPotions.soulSnare, 300, 0)); + ((EntityLivingBase) result.entityHit).addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_SNARE, 300, 0)); } result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), (float) 0); diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java index cd1b41b8..dfe50f3c 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java @@ -18,6 +18,7 @@ import com.mojang.authlib.GameProfile; @SuppressWarnings("EntityConstructor") public class FakePlayerBM extends FakePlayer { + public FakePlayerBM(WorldServer world, GameProfile name) { super(world, name); } diff --git a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java index ff3288c8..feca5d39 100644 --- a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java +++ b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java @@ -10,7 +10,7 @@ public class FuelHandler implements IFuelHandler @Override public int getBurnTime(ItemStack fuel) { - if (fuel != null && fuel.getItem() == RegistrarBloodMagicItems.ITEM_COMPONENT && fuel.getMetadata() == ItemComponent.getStack(ItemComponent.SAND_COAL).getMetadata()) + if (fuel != null && fuel.getItem() == RegistrarBloodMagicItems.COMPONENT && fuel.getMetadata() == ItemComponent.getStack(ItemComponent.SAND_COAL).getMetadata()) { return 1600; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index c2f2fe97..2bb80bde 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -3,11 +3,13 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; +import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -36,19 +38,22 @@ public class ItemActivationCrystal extends ItemBindableBase implements IVariantP @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localize("tooltip.bloodmagic.activationCrystal." + names[stack.getItemDamage()])); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 239f3365..ebbc7239 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -6,6 +6,7 @@ import java.util.List; import WayofTime.bloodmagic.util.helper.NumeralHelper; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -49,7 +50,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer playerIn, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index 8f66d4b2..c83f0634 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item; import java.util.ArrayList; import java.util.List; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -36,7 +37,7 @@ public class ItemArcaneAshes extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.arcaneAshes")); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index 8f8c07e8..1aa5d370 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -5,8 +5,10 @@ import WayofTime.bloodmagic.api.impl.ItemBindable; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -23,7 +25,7 @@ public class ItemBindableBase extends ItemBindable @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 2a23f3cd..d071fbc4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -4,6 +4,7 @@ import java.util.List; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; @@ -96,15 +97,15 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.desc")); BloodOrb orb = getOrb(stack); - if (advanced && orb != null) + if (flag.isAdvanced() && orb != null) tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", orb.getRegistryName())); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java index 303b5c87..bf9f9f78 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java @@ -29,10 +29,13 @@ public class ItemBloodShard extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 802c36cd..056afef8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -9,6 +9,7 @@ import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -104,14 +105,17 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item itemIn, CreativeTabs tab, NonNullList subItems) + public void getSubItems(CreativeTabs tab, NonNullList subItems) { - subItems.add(Utils.setUnbreakable(new ItemStack(itemIn))); + if (!isInCreativeTab(tab)) + return; + + subItems.add(Utils.setUnbreakable(new ItemStack(this))); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 950ce1bb..d5ea23b5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -12,9 +12,9 @@ import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Strings; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; -import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -47,7 +47,6 @@ import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multiset; -@Getter public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { protected final String tooltipBase; @@ -72,7 +71,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable @Override public float getStrVsBlock(ItemStack stack, IBlockState state) { - return getActivated(stack) ? getToolMaterial().getEfficiencyOnProperMaterial() : 1.0F; + return getActivated(stack) ? toolMaterial.getEfficiencyOnProperMaterial() : 1.0F; } @Override @@ -82,10 +81,12 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable } @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item itemIn, CreativeTabs tab, NonNullList subItems) + public void getSubItems(CreativeTabs tab, NonNullList subItems) { - subItems.add(Utils.setUnbreakable(new ItemStack(itemIn))); + if (isInCreativeTab(tab)) + return; + + subItems.add(Utils.setUnbreakable(new ItemStack(this))); } @Override @@ -146,10 +147,10 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { BoundToolEvent.Charge event = new BoundToolEvent.Charge(player, stack); if (MinecraftForge.EVENT_BUS.post(event)) - return new ActionResult(EnumActionResult.FAIL, event.result); + return new ActionResult<>(EnumActionResult.FAIL, event.result); player.setActiveHand(hand); - return new ActionResult(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(EnumActionResult.SUCCESS, stack); } return super.onItemRightClick(world, player, hand); @@ -207,7 +208,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (TextHelper.canTranslate(tooltipBase + "desc")) tooltip.add(TextHelper.localizeEffect(tooltipBase + "desc")); @@ -220,7 +221,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable if (!Strings.isNullOrEmpty(getOwnerUUID(stack))) tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override @@ -304,4 +305,24 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable return null; } + + 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; + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java index c82e49ac..eee18546 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.item; import java.util.ArrayList; import java.util.List; -import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -20,7 +19,6 @@ import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; public class ItemComponent extends Item implements IVariantProvider { - @Getter private static ArrayList names = new ArrayList(); public static final String REAGENT_WATER = "reagentWater"; @@ -113,15 +111,18 @@ public class ItemComponent extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.size(); i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } public static ItemStack getStack(String name) { - return new ItemStack(RegistrarBloodMagicItems.ITEM_COMPONENT, 1, names.indexOf(name)); + return new ItemStack(RegistrarBloodMagicItems.COMPONENT, 1, names.indexOf(name)); } @Override @@ -140,4 +141,8 @@ public class ItemComponent extends Item implements IVariantProvider return stack; } + + public static ArrayList getNames() { + return names; + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index c5490674..c46debd1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -30,7 +31,7 @@ public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemon @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.willGauge")))); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 5d236668..17282fd5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item; import java.util.ArrayList; import java.util.List; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; @@ -41,7 +42,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.experienceTome")); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 609c71a5..b39f8814 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -6,6 +6,7 @@ import java.util.List; import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -48,11 +49,14 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 1; i < EnumRuneType.values().length; i++) { - ItemStack stack = NBTHelper.checkNBT(new ItemStack(id, 1, i)); + ItemStack stack = NBTHelper.checkNBT(new ItemStack(this, 1, i)); stack.getTagCompound().setInteger(Constants.NBT.USES, 10); list.add(stack); } @@ -106,10 +110,10 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.inscriber.desc")))); - super.addInformation(stack, player, list, advanced); + super.addInformation(stack, world, list, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index 64ff93d6..f31b92e2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -41,6 +41,9 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide @Override public int getItemBurnTime(ItemStack stack) { + if (!stack.hasTagCompound()) + return -1; + if (getOwnerUUID(stack) == null) return -1; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index c5ab320a..7e14e342 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -9,6 +9,7 @@ import com.google.common.collect.Lists; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; @@ -117,7 +118,7 @@ public class ItemPotionFlask extends Item implements IMeshProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { PotionUtils.addPotionTooltip(stack, tooltip, 1.0F); tooltip.add(""); @@ -139,16 +140,11 @@ public class ItemPotionFlask extends Item implements IMeshProvider @Override public ItemMeshDefinition getMeshDefinition() { - return new ItemMeshDefinition() - { - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { - boolean full = true; - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) - full = false; - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + getRegistryName().getResourcePath()), "full=" + (full ? "true" : "false")); - } + return stack -> { + boolean full = true; + if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) + full = false; + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + getRegistryName().getResourcePath()), "full=" + (full ? "true" : "false")); }; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index 99da587c..5417cf22 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -7,6 +7,7 @@ import java.util.List; import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -78,10 +79,13 @@ public class ItemRitualDiviner extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override @@ -236,7 +240,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 29cbb7a6..17f457dd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.List; import WayofTime.bloodmagic.BloodMagic; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -45,7 +46,7 @@ public class ItemRitualReader extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { if (!stack.hasTagCompound()) return; @@ -65,7 +66,7 @@ public class ItemRitualReader extends Item implements IVariantProvider tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.extraInfo")); } - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, tooltipFlag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index a1584cb6..72991095 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -8,6 +8,7 @@ import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.client.IMeshProvider; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -59,14 +60,17 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sacrificialDagger.desc")))); @@ -126,11 +130,11 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider if (evt.shouldDrainHealth) { player.hurtResistantTime = 0; - player.attackEntityFrom(BloodMagicAPI.getDamageSource(), 0.001F); + player.attackEntityFrom(BloodMagicAPI.damageSource, 0.001F); player.setHealth(Math.max(player.getHealth() - ConfigHandler.sacrificialDaggerDamage, 0.0001f)); if (player.getHealth() <= 0.001f) { - player.onDeath(BloodMagicAPI.getDamageSource()); + player.onDeath(BloodMagicAPI.damageSource); player.setHealth(0); } // player.attackEntityFrom(BloodMagicAPI.getDamageSource(), 2.0F); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index 6470657e..f1e84cfd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -12,6 +12,7 @@ import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.NumeralHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -107,7 +108,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer playerIn, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java index 2a394754..4d746432 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java @@ -3,11 +3,13 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; +import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -32,10 +34,13 @@ public class ItemSlate extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override @@ -46,7 +51,7 @@ public class ItemSlate extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.slate.desc")))); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 1b781ac4..e141b65c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -48,10 +49,13 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override @@ -72,11 +76,11 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localize("tooltip.bloodmagic.telepositionFocus." + names[stack.getItemDamage()])))); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index 0ed7fdaa..f0de73dc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; @@ -88,8 +89,11 @@ public class ItemUpgradeTome extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { String key = entry.getKey(); @@ -114,9 +118,8 @@ public class ItemUpgradeTome extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + 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); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index 7f451541..6198c6f5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -7,11 +7,13 @@ import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; +import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -35,8 +37,11 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + list.add(new ItemStack(this)); for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { @@ -49,7 +54,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + 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()) diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index fbaede56..d7cc1ebf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -3,13 +3,13 @@ package WayofTime.bloodmagic.item.alchemy; import java.util.ArrayList; import java.util.List; -import lombok.Getter; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.NonNullList; +import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -25,7 +25,6 @@ import WayofTime.bloodmagic.util.helper.TextHelper; public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomAlchemyConsumable { - @Getter private static ArrayList names = new ArrayList(); public static final String BASIC = "basicCuttingFluid"; @@ -45,7 +44,7 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -67,10 +66,13 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.size(); i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } public static ItemStack getStack(String name) @@ -139,4 +141,8 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA return stack; } + + public static ArrayList getNames() { + return names; + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java index c701e1df..4bbd166c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import lombok.Getter; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -35,7 +35,6 @@ import com.google.common.collect.Iterables; public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvider { - @Getter private static ArrayList names = new ArrayList(); public static final String DRAFT_ANGELUS = "draftAngelus"; @@ -53,7 +52,7 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -128,10 +127,13 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.size(); i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } public static ItemStack getStack(String name) @@ -155,4 +157,8 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi return stack; } + + public static ArrayList getNames() { + return names; + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 1cca89be..9aa6c545 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -11,6 +11,7 @@ import java.util.UUID; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.attributes.AttributeModifier; @@ -281,7 +282,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -325,7 +326,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } } - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index 064389f8..dc11df71 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -129,9 +129,9 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public void onPlayerAttacked(ItemStack stack, DamageSource source, EntityPlayer attackedPlayer) { - if (source.getEntity() instanceof EntityLivingBase) + if (source.getTrueSource() instanceof EntityLivingBase) { - EntityLivingBase attacker = (EntityLivingBase) source.getEntity(); + EntityLivingBase attacker = (EntityLivingBase) source.getTrueSource(); EnumDemonWillType type = this.getCurrentType(stack); switch (type) { diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index f270cdda..8d3d0fb4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -4,6 +4,7 @@ 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.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -12,6 +13,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; 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.*; import net.minecraftforge.fluids.capability.templates.FluidHandlerItemStack; @@ -50,7 +52,7 @@ public class ItemBlockBloodTank extends ItemBlock } @Override - public void addInformation(ItemStack stack, EntityPlayer entityPlayer, List tooltip, boolean advanced) + 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))); @@ -68,10 +70,12 @@ public class ItemBlockBloodTank extends ItemBlock @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } public int getCapacity(ItemStack container) diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index ead9db6f..9bc0d2be 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -9,6 +9,7 @@ import WayofTime.bloodmagic.api.util.helper.ItemHelper.LPContainer; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemArmor; @@ -73,7 +74,7 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I } @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index 93368f20..35761c12 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -10,6 +10,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemArmor; @@ -100,7 +101,7 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato } @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index df290575..ab7347cd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -3,12 +3,14 @@ package WayofTime.bloodmagic.item.routing; import java.util.ArrayList; import java.util.List; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; 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; @@ -45,19 +47,22 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localize("tooltip.BloodMagic.fluidFilter." + names[stack.getItemDamage()])); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index 7e565530..9d7629bf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -8,6 +8,7 @@ import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.routing.IMasterRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -39,7 +40,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index be5eaef0..4c3c8b6a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -3,12 +3,14 @@ package WayofTime.bloodmagic.item.routing; import java.util.ArrayList; import java.util.List; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; 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; @@ -49,19 +51,22 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localize("tooltip.bloodmagic.itemFilter." + names[stack.getItemDamage()])); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index c924da7d..4b34e4e3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -17,7 +18,6 @@ import net.minecraft.world.World; import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.registry.ModPotions; public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectProvider { @@ -42,9 +42,9 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP double wantedVelocity = 1.7; // TODO - Revisit after potions - if (player.isPotionActive(ModPotions.boost)) + if (player.isPotionActive(RegistrarBloodMagic.BOOST)) { - int amplifier = player.getActivePotionEffect(ModPotions.boost).getAmplifier(); + int amplifier = player.getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); wantedVelocity += (1 + amplifier) * (0.35); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index 8bc97fda..7726a655 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -8,19 +8,17 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.ItemSigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import com.google.common.base.Strings; -import lombok.Getter; -import net.minecraft.entity.player.EntityPlayer; +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.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; -@Getter public class ItemSigilBase extends ItemSigil implements IVariantProvider { protected final String tooltipBase; @@ -44,7 +42,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (TextHelper.canTranslate(tooltipBase + "desc")) tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(tooltipBase + "desc")))); @@ -55,14 +53,18 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider if (!Strings.isNullOrEmpty(getOwnerName(stack))) tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override public List> getVariants() { List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=normal")); + ret.add(Pair.of(0, "type=normal")); return ret; } + + public String getName() { + return name; + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java index 997f79f1..eb6c17db 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.registry.ModPotions; public class ItemSigilBounce extends ItemSigilToggleableBase { @@ -20,6 +20,6 @@ public class ItemSigilBounce extends ItemSigilToggleableBase if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(ModPotions.bounce, 2, 0, true, false)); + player.addPotionEffect(new PotionEffect(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 index e2778691..2003d907 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.registry.ModPotions; public class ItemSigilClaw extends ItemSigilToggleableBase { @@ -20,6 +20,6 @@ public class ItemSigilClaw extends ItemSigilToggleableBase if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(ModPotions.cling, 2, 0, true, false)); + player.addPotionEffect(new PotionEffect(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 index 640a450c..72c97d11 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java @@ -20,6 +20,9 @@ public class ItemSigilCompression extends ItemSigilToggleableBase @Override public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + if (true) + return; // TODO - Rewrite compression system + if (PlayerHelper.isFakePlayer(player)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java index cad5d7f9..99c82aa4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java @@ -3,13 +3,13 @@ package WayofTime.bloodmagic.item.sigil; import java.util.List; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.registry.ModPotions; public class ItemSigilEnderSeverance extends ItemSigilToggleableBase { @@ -28,7 +28,7 @@ public class ItemSigilEnderSeverance extends ItemSigilToggleableBase for (Entity entity : entityList) { if (entity instanceof EntityEnderman) - ((EntityEnderman) entity).addPotionEffect(new PotionEffect(ModPotions.planarBinding, 40, 0)); + ((EntityEnderman) entity).addPotionEffect(new PotionEffect(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 index 6b99eb6d..a9add918 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -34,7 +34,7 @@ public class ItemSigilFastMiner extends ItemSigilToggleableBase int ticks = 600; int potionPotency = 2; - AxisAlignedBB bb = new AxisAlignedBB(pos).expandXyz(radius); + AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, bb); for (EntityPlayer player : playerList) { @@ -44,7 +44,7 @@ public class ItemSigilFastMiner extends ItemSigilToggleableBase if (!player.capabilities.isCreativeMode) { player.hurtResistantTime = 0; - player.attackEntityFrom(BloodMagicAPI.getDamageSource(), 1.0F); + player.attackEntityFrom(BloodMagicAPI.damageSource, 1.0F); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java index 4ad3fb96..b14742cd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.registry.ModPotions; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; @@ -20,6 +20,6 @@ public class ItemSigilHaste extends ItemSigilToggleableBase if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(ModPotions.boost, 2, 0, true, false)); + player.addPotionEffect(new PotionEffect(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 index a1318abc..63fdd009 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -6,6 +6,7 @@ import java.util.List; import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.key.KeyBindings; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -67,9 +68,9 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.press", KeyBindings.OPEN_HOLDING.getKey().getDisplayName())); if (!stack.hasTagCompound()) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 7b07b258..8230fd19 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -4,6 +4,7 @@ import java.util.List; import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -31,9 +32,9 @@ public class ItemSigilTeleposition extends ItemSigilBase @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 286ff886..859af83f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -10,9 +10,11 @@ import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.base.Strings; import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -39,9 +41,9 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); if (!stack.hasTagCompound()) return; tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated"))); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index 3e042a4a..f60574b5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -4,8 +4,10 @@ import java.util.List; import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -16,9 +18,7 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; @@ -32,9 +32,9 @@ public class ItemSigilTransposition extends ItemSigilBase @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); if (!stack.hasTagCompound()) return; @@ -80,19 +80,18 @@ public class ItemSigilTransposition extends ItemSigilBase IBlockState state = world.getBlockState(blockPos); if (!world.isRemote) { - BlockStack rightClickedBlock = BlockStack.getStackFromPos(world, blockPos); - if (BloodMagicAPI.getTranspositionBlacklist().contains(rightClickedBlock)) + if (BloodMagicAPI.INSTANCE.getBlacklist().getTransposition().contains(state)) return EnumActionResult.FAIL; - if (!ConfigHandler.transpositionBlacklist.contains(rightClickedBlock) && player.isSneaking() && (!stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) || !stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META))) + if (player.isSneaking() && (!stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) || !stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META))) { - if (rightClickedBlock.getState().getPlayerRelativeBlockHardness(player, world, blockPos) >= 0 && rightClickedBlock.getState().getBlockHardness(world, blockPos) >= 0) + if (state.getPlayerRelativeBlockHardness(player, world, blockPos) >= 0 && state.getBlockHardness(world, blockPos) >= 0) { int cost = getLpUsed(); NBTTagCompound tileNBTTag = new NBTTagCompound(); - String blockName = rightClickedBlock.getBlock().getRegistryName().toString(); - byte metadata = (byte) rightClickedBlock.getMeta(); + String blockName = state.getBlock().getRegistryName().toString(); + byte metadata = (byte) state.getBlock().getMetaFromState(state); if (world.getTileEntity(blockPos) != null) { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java index 9b051e70..fe06e950 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.registry.ModPotions; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; @@ -20,6 +20,6 @@ public class ItemSigilWhirlwind extends ItemSigilToggleableBase if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(ModPotions.whirlwind, 2, 0, true, false)); + player.addPotionEffect(new PotionEffect(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 index 117b3f17..ea1eb7fe 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -7,12 +7,14 @@ import WayofTime.bloodmagic.api.soul.IDemonWill; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.NonNullList; +import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -43,22 +45,24 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide } @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + 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, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 3eec1f87..77bc1027 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -6,6 +6,7 @@ import javax.annotation.Nullable; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; @@ -302,7 +303,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index a7e70b1d..2904fa35 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -6,6 +6,7 @@ import javax.annotation.Nullable; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; @@ -301,7 +302,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index b7caaec3..4c140cb8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -6,6 +6,7 @@ import javax.annotation.Nullable; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; @@ -302,7 +303,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index eb7e8a1a..80fc39ca 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -5,6 +5,7 @@ import java.util.*; import javax.annotation.Nullable; import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; @@ -273,7 +274,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index e065e8b2..8a9af1d8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -7,6 +7,7 @@ import java.util.Locale; import javax.annotation.Nullable; import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -93,9 +94,11 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) { ItemStack emptyStack = new ItemStack(this, 1, i); @@ -115,7 +118,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -125,7 +128,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I tooltip.add(TextHelper.localize("tooltip.bloodmagic.will", getWill(type, stack))); tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); - super.addInformation(stack, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index 4fa4a6af..d96f1973 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; @@ -64,19 +65,22 @@ public class ItemSoulSnare extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item id, CreativeTabs creativeTab, NonNullList list) + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + if (!isInCreativeTab(creativeTab)) + return; + for (int i = 0; i < names.length; i++) - list.add(new ItemStack(id, 1, i)); + list.add(new ItemStack(this, 1, i)); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + 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, player, tooltip, advanced); + super.addInformation(stack, world, tooltip, flag); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index 1986b435..da0a84b1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -21,8 +21,6 @@ import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.registry.ModPotions; -import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; @@ -39,13 +37,7 @@ public class LivingArmour implements ILivingArmour public StatTracker getTracker(String key) { - if (trackerMap.containsKey(key)) - { - return trackerMap.get(key); - } else - { - return null; - } + return trackerMap.get(key); } public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index d65d42cd..9b474376 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.proxy; import java.awt.Color; +import java.util.Map; import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.client.render.block.*; @@ -8,11 +9,9 @@ import WayofTime.bloodmagic.tile.*; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionUtils; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.ModelLoader; @@ -57,11 +56,8 @@ 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.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; -import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; import com.google.common.collect.ImmutableMap; @@ -69,34 +65,13 @@ public class ClientProxy extends CommonProxy { public static DemonWillHolder currentAura = new DemonWillHolder(); - private InventoryRenderHelper renderHelper; - private InventoryRenderHelperV2 renderHelperV2; - - @Override - public InventoryRenderHelper getRenderHelper() - { - return renderHelper; - } - - @Override - public InventoryRenderHelperV2 getRenderHelperV2() - { - return renderHelperV2; - } - @Override public void preInit() { super.preInit(); - renderHelper = new InventoryRenderHelper(Constants.Mod.DOMAIN); - renderHelperV2 = new InventoryRenderHelperV2(Constants.Mod.DOMAIN); - OBJLoader.INSTANCE.addDomain(BloodMagic.MODID); - RegistrarBloodMagicBlocks.initRenders(); - RegistrarBloodMagicItems.initRenders(); - ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() { @Override @@ -139,36 +114,26 @@ public class ClientProxy extends CommonProxy public void init() { super.init(); - Minecraft.getMinecraft().getItemColors().registerItemColorHandler(new IItemColor() - { - @Override - public int getColorFromItemstack(ItemStack stack, int tintIndex) + Minecraft.getMinecraft().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) { - 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; } + return -1; }, RegistrarBloodMagicItems.SIGIL_HOLDING); - Minecraft.getMinecraft().getItemColors().registerItemColorHandler(new IItemColor() - { - @Override - public int getColorFromItemstack(ItemStack stack, int tintIndex) - { - if (tintIndex != 0 && tintIndex != 2) - return -1; + Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> { + if (tintIndex != 0 && tintIndex != 2) + return -1; - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) - return -1; + if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) + return -1; - return PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromStack(stack)); - } + return PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromStack(stack)); }, RegistrarBloodMagicItems.POTION_FLASK); addElytraLayer(); @@ -217,8 +182,9 @@ public class ClientProxy extends CommonProxy RenderManager renderManager = Minecraft.getMinecraft().getRenderManager(); try { - RenderPlayer renderPlayer = ObfuscationReflectionHelper.getPrivateValue(RenderManager.class, renderManager, "playerRenderer", "field_178637_m"); - renderPlayer.addLayer(new LayerBloodElytra(renderPlayer)); + Map skinMap = ObfuscationReflectionHelper.getPrivateValue(RenderManager.class, renderManager, "skinMap", "field_178636_l"); + skinMap.get("default").addLayer(new LayerBloodElytra(skinMap.get("default"))); + skinMap.get("slim").addLayer(new LayerBloodElytra(skinMap.get("slim"))); BloodMagic.instance.logger.info("Elytra layer added"); } catch (Exception e) { diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java index c178e638..4449daeb 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -13,24 +13,11 @@ import WayofTime.bloodmagic.api.ritual.CapabilityRuneType; import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.api.teleport.TeleportQueue; import WayofTime.bloodmagic.fuel.FuelHandler; -import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; -import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; import com.google.common.collect.ImmutableMap; public class CommonProxy { - @Deprecated - public InventoryRenderHelper getRenderHelper() - { - return null; - } - - public InventoryRenderHelperV2 getRenderHelperV2() - { - return null; - } - public void preInit() { MinecraftForge.EVENT_BUS.register(TeleportQueue.getInstance()); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index ac80d534..446d1472 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -89,7 +89,7 @@ public class ModRecipes { initOreDict(); addFurnaceRecipes(); - addCraftingRecipes(); +// addCraftingRecipes(); addAltarRecipes(); addAlchemyArrayRecipes(); addSoulForgeRecipes(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index 6b7a905b..c765a6ca 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -287,10 +287,10 @@ public class RitualAltarBuilder extends Ritual for (int i = 0; i < itemHandler.getSlots(); i++) { - if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune) && itemHandler.extractItem(i, 1, true) != null) + if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune) && !itemHandler.extractItem(i, 1, true).isEmpty()) { Block block = Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()); - if (block != null && block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK && block != RegistrarBloodMagicBlocks.CRYSTAL) + 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); @@ -306,7 +306,7 @@ public class RitualAltarBuilder extends Ritual if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune)) { Block block = Block.getBlockFromItem(inv.getStackInSlot(i).getItem()); - if (block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK && block != RegistrarBloodMagicBlocks.CRYSTAL) + if (block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK) { BlockStack blockStack = new BlockStack(block, inv.getStackInSlot(i).getItemDamage()); inv.decrStackSize(i, 1); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java index f6c2b484..2cecd2b5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -22,7 +23,6 @@ import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.util.Utils; public class RitualAnimalGrowth extends Ritual @@ -126,9 +126,9 @@ public class RitualAnimalGrowth extends Ritual { if (destructiveWill >= destructiveWillDrain) { - if (!animal.isPotionActive(ModPotions.sacrificialLamb)) + if (!animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { - animal.addPotionEffect(new PotionEffect(ModPotions.sacrificialLamb, 1200)); + animal.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SACRIFICIAL_LAMB, 1200)); destructiveDrain += destructiveWillDrain; destructiveWill -= destructiveWillDrain; performedEffect = true; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index 774a77c7..82b330e3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; @@ -28,7 +29,6 @@ import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; -import WayofTime.bloodmagic.registry.ModPotions; public class RitualFeatheredKnife extends Ritual { @@ -135,7 +135,7 @@ public class RitualFeatheredKnife extends Ritual float sacrificedHealth = 1; double lpModifier = 1; - if ((health / player.getMaxHealth() > healthThreshold) && (!useIncense || !player.isPotionActive(ModPotions.soulFray))) + if ((health / player.getMaxHealth() > healthThreshold) && (!useIncense || !player.isPotionActive(RegistrarBloodMagic.SOUL_FRAY))) { if (useIncense) { @@ -145,7 +145,7 @@ public class RitualFeatheredKnife extends Ritual lpModifier *= PlayerSacrificeHelper.getModifier(incenseAmount); PlayerSacrificeHelper.setPlayerIncense(player, 0); - player.addPotionEffect(new PotionEffect(ModPotions.soulFray, PlayerSacrificeHelper.soulFrayDuration)); + player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, PlayerSacrificeHelper.soulFrayDuration)); } if (destructiveWill >= destructiveWillDrain * sacrificedHealth) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java index 2dbd107e..3a8e82e0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -29,7 +30,6 @@ import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.util.Utils; public class RitualLava extends Ritual @@ -166,9 +166,9 @@ public class RitualLava extends Ritual continue; } - if (!entity.isPotionActive(ModPotions.fireFuse)) + if (!entity.isPotionActive(RegistrarBloodMagic.FIRE_FUSE)) { - entity.addPotionEffect(new PotionEffect(ModPotions.fireFuse, 100, 0)); + entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FIRE_FUSE, 100, 0)); vengefulDrained += vengefulWillDrain; vengefulWill -= vengefulWillDrain; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index e5849e20..c0d9086e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.tile; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.api.orb.BloodOrb; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -307,7 +308,8 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, { if (orbStack.getItem() instanceof IBloodOrb) { - return ((IBloodOrb) orbStack.getItem()).getOrbLevel(orbStack.getMetadata()); + BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); + return orb == null ? 0 : orb.getTier(); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index e252640b..9c4dbd68 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -410,7 +410,7 @@ public class Utils case BLOODRUNE: return RegistrarBloodMagicBlocks.BLOOD_RUNE; case CRYSTAL: - return RegistrarBloodMagicBlocks.CRYSTAL; + return RegistrarBloodMagicBlocks.BLOOD_RUNE; case NOTAIR: return Blocks.STONEBRICK; default: diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java index 4f2de729..15bbf802 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java @@ -16,56 +16,57 @@ public class IMCHandler public static void handleIMC(FMLInterModComms.IMCEvent event) { - 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])); - } - } - } + // 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 index 348fbbd8..1ef6e22f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Set; import WayofTime.bloodmagic.client.key.KeyBindings; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.renderer.GlStateManager; @@ -53,7 +54,6 @@ import WayofTime.bloodmagic.item.ItemRitualDiviner; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.SigilHoldingPacketProcessor; -import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.util.GhostItemHelper; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -117,7 +117,7 @@ public class ClientHandler public void onSoundEvent(PlaySoundEvent event) { EntityPlayer player = Minecraft.getMinecraft().player; - if (player != null && player.isPotionActive(ModPotions.deafness)) + if (player != null && player.isPotionActive(RegistrarBloodMagic.DEAFNESS)) { event.setResultSound(null); } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index a6f32d17..059c840d 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -41,7 +42,6 @@ import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGrimReaperSp import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeJump; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSpeed; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeStepAssist; -import WayofTime.bloodmagic.registry.ModPotions; @Handler public class LivingArmourHandler @@ -246,7 +246,7 @@ public class LivingArmourHandler { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); boolean hasAssist = false; - if (event.getEntityLiving().isPotionActive(ModPotions.boost)) + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { hasAssist = true; player.stepHeight = Constants.Misc.ALTERED_STEP_HEIGHT; @@ -289,9 +289,9 @@ public class LivingArmourHandler } } - if (event.getEntityLiving().isPotionActive(ModPotions.boost)) + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { - int i = event.getEntityLiving().getActivePotionEffect(ModPotions.boost).getAmplifier(); + int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); { percentIncrease += (i + 1) * 0.05f; } 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 23da80b0..6c72690d 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; @@ -35,7 +36,6 @@ import WayofTime.bloodmagic.demonAura.WillChunk; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.registry.ModPotions; @Handler public class WillHandler @@ -84,9 +84,9 @@ public class WillHandler DamageSource source = event.getSource(); Entity entity = source.getTrueSource(); - if (attackedEntity.isPotionActive(ModPotions.soulSnare) && (attackedEntity instanceof EntityMob || attackedEntity.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL)) + if (attackedEntity.isPotionActive(RegistrarBloodMagic.SOUL_SNARE) && (attackedEntity instanceof EntityMob || attackedEntity.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL)) { - PotionEffect eff = attackedEntity.getActivePotionEffect(ModPotions.soulSnare); + PotionEffect eff = attackedEntity.getActivePotionEffect(RegistrarBloodMagic.SOUL_SNARE); int lvl = eff.getAmplifier(); double amountOfSouls = attackedEntity.getEntityWorld().rand.nextDouble() * (lvl + 1) * (lvl + 1) * 5; diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/InventoryRenderHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/InventoryRenderHelper.java deleted file mode 100644 index 28b769ad..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/InventoryRenderHelper.java +++ /dev/null @@ -1,181 +0,0 @@ -package WayofTime.bloodmagic.util.helper; - -import WayofTime.bloodmagic.api.Constants; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.ModelBakery; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.renderer.block.statemap.StateMapperBase; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.ModelLoader; - -/** - * @author TehNut - * - * The goal of this class is to make registering the inventory renders - * for your Items/Blocks a much simpler and easier process. - * - * You must call this at the post initialization stage on the clientside - * only. - * - * If you pass a Block through here that uses the default ItemBlock, you - * should specify a custom name. - * - * @deprecated in favor of {@link InventoryRenderHelperV2} - */ -@Deprecated -public class InventoryRenderHelper -{ - /** - * This is the base string for your resources. It will usually be your modid - * in all lowercase with a colon at the end. - */ - private final String domain; - - public InventoryRenderHelper(String domain) - { - this.domain = domain; - } - - /** - * Registers a Model for the given Item and meta. - * - * @param item - * - Item to register Model for - * @param meta - * - Meta of Item - * @param name - * - Name of the model JSON - */ - public void itemRender(Item item, int meta, String name) - { - ResourceLocation resName = new ResourceLocation(domain + name); - - ModelBakery.registerItemVariants(item, resName); - ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(resName, "inventory")); - } - - /** - * Registers a Model for the given Item and meta. This does not call - * setCustomModelResourceLocation, to allow the implementation of - * ItemMeshDefinition. - * - * @param item - * - Item to register Model for - * @param meta - * - Meta of Item - * @param name - * - Name of the model JSON - */ - public void customItemRender(Item item, int meta, String name) - { - ResourceLocation resName = new ResourceLocation(domain + name); - - ModelBakery.registerItemVariants(item, resName); - } - - /** - * Shorthand of {@code itemRender(Item, int, String)} - * - * @param item - * - Item to register Model for - * @param meta - * - Meta of Item - */ - public void itemRender(Item item, int meta) - { - itemRender(item, meta, getClassName(item) + meta); - } - - public void customItemRender(Item item, int meta) - { - customItemRender(item, meta, getClassName(item) + meta); - } - - public void itemRender(Item item, String name) - { - itemRender(item, 0, name); - } - - /** - * Shorthand of {@code itemRender(Item, int)} - * - * @param item - * - Item to register Model for - */ - public void itemRender(Item item) - { - itemRender(item, 0, getClassName(item)); - } - - /** - * Registers a model for the item across all Meta's that get used for the - * item - * - * @param item - * - Item to register Model for - */ - public void itemRenderAll(Item item) - { - final Item toRender = item; - - ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition() - { - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { - return new ModelResourceLocation(domain + getClassName(toRender), "inventory"); - } - }); - } - - public void fluidRender(Block block) - { - - final Block toRender = block; - - ModelBakery.registerItemVariants(InventoryRenderHelper.getItemFromBlock(block)); - ModelLoader.setCustomMeshDefinition(InventoryRenderHelper.getItemFromBlock(block), new ItemMeshDefinition() - { - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { - return new ModelResourceLocation(Constants.Mod.DOMAIN + toRender.getClass().getSimpleName(), "fluid"); - } - }); - ModelLoader.setCustomStateMapper(block, new StateMapperBase() - { - @Override - protected ModelResourceLocation getModelResourceLocation(IBlockState state) - { - return new ModelResourceLocation(domain + toRender.getClass().getSimpleName(), "fluid"); - } - }); - } - - /** - * @param block - * - Block to get Item of - * - * @return - The ItemBlock that corresponds to the Block. - */ - public static Item getItemFromBlock(Block block) - { - return Item.getItemFromBlock(block); - } - - /** - * Finds the class name of the given Item. If handed an ItemBlock, it will - * use the class name of the contained Block. - * - * @return The class name of the given Item - */ - public static String getClassName(Item item) - { - return item instanceof ItemBlock ? Block.getBlockFromItem(item).getClass().getSimpleName() : item.getClass().getSimpleName(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/InventoryRenderHelperV2.java b/src/main/java/WayofTime/bloodmagic/util/helper/InventoryRenderHelperV2.java deleted file mode 100644 index 2b8414b5..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/InventoryRenderHelperV2.java +++ /dev/null @@ -1,64 +0,0 @@ -package WayofTime.bloodmagic.util.helper; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.item.Item; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.ModelLoader; - -public class InventoryRenderHelperV2 -{ - - private final String domain; - - public InventoryRenderHelperV2(String domain) - { - this.domain = domain.endsWith(":") ? domain.replace(":", "") : domain; - } - - public void registerMesher(Item item, ItemMeshDefinition meshDefinition) - { - ModelLoader.setCustomMeshDefinition(item, meshDefinition); - } - - public void registerRender(Item item, int meta, String name, String variant) - { - ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(new ResourceLocation(domain, "item/" + name), "type=" + variant)); - } - - public void registerRender(Item item, int meta, String variant) - { - registerRender(item, meta, item.getRegistryName().getResourcePath(), variant); - } - - public void registerRender(Item item, String name, String variant) - { - registerRender(item, 0, name, variant); - } - - public void registerRender(Item item, String variant) - { - registerRender(item, item.getRegistryName().getResourcePath(), variant); - } - - public void registerRender(Block block, int meta, String name, String variant) - { - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), meta, new ModelResourceLocation(new ResourceLocation(domain, name), variant)); - } - - public void registerRender(Block block, int meta, String variant) - { - registerRender(block, meta, block.getRegistryName().getResourcePath(), variant); - } - - public void registerRender(Block block, String name, String variant) - { - registerRender(block, 0, name, variant); - } - - public void registerRender(Block block, String variant) - { - registerRender(block, block.getRegistryName().getResourcePath(), variant); - } -} diff --git a/src/main/resources/Guide-API-Version.info b/src/main/resources/Guide-API-Version.info deleted file mode 100644 index 27323dad..00000000 --- a/src/main/resources/Guide-API-Version.info +++ /dev/null @@ -1 +0,0 @@ -@VERSION@ \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index f531fc4a..53f9f649 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,13 +1,13 @@ [ { - "modid": "BloodMagic", + "modid": "bloodmagic", "name": "Blood Magic: Alchemical Wizardry", "description": "Rituals, spells, and more!", "version": "${version}", - "mcversion": "1.8.9", + "mcversion": "${mcversion}", "url": "http://www.minecraftforum.net/topic/1899223-bloodmagic", "updateUrl": "", - "authorList": [ "WayofTime" ], + "authorList": [ "WayofTime", "TehNut" ], "credits": "", "logoFile": "", "screenshots": [], diff --git a/src/main/resources/todo.txt b/src/main/resources/todo.txt deleted file mode 100644 index 8c06bf8c..00000000 --- a/src/main/resources/todo.txt +++ /dev/null @@ -1,2 +0,0 @@ --Create effect for the light ritual block. --Create effect for the fire ritual block. \ No newline at end of file From 61c44a831bcda61adac287741c6b285a51e9619b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 15 Aug 2017 21:24:59 -0700 Subject: [PATCH 125/595] Fix some things that went missing --- .../java/WayofTime/bloodmagic/BloodMagic.java | 2 +- .../bloodmagic/block/BlockAltar.java | 8 +- .../bloodmagic/block/BlockDemonCrucible.java | 8 +- .../block/BlockDemonCrystallizer.java | 8 +- .../bloodmagic/block/BlockIncenseAltar.java | 8 +- .../bloodmagic/block/BlockSoulForge.java | 8 +- .../bloodmagic/block/BlockTeleposer.java | 8 +- .../core/RegistrarBloodMagicItems.java | 64 +++++++------- .../core/recipe/IngredientBloodOrb.java | 82 ++++++++++++++++++ .../recipe/IngredientBloodOrbFactory.java | 21 +++++ .../ItemLivingArmourPointsUpgrade.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 12 +++ .../assets/bloodmagic/recipes/_factories.json | 5 ++ .../creative_inventory/tab_upgrade_tomes.png | Bin 1107 -> 0 bytes 14 files changed, 199 insertions(+), 37 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java create mode 100644 src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java create mode 100644 src/main/resources/assets/bloodmagic/recipes/_factories.json delete mode 100644 src/main/resources/assets/minecraft/textures/gui/container/creative_inventory/tab_upgrade_tomes.png diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 1ff629aa..25cb1a75 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -63,7 +63,7 @@ public class BloodMagic { return true; } - }.setNoTitle().setBackgroundImageName("items_search.png"); + }.setNoTitle().setBackgroundImageName("item_search.png"); public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); public static final List> PLUGINS = Lists.newArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 32106390..53907ba8 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -12,6 +12,7 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; @@ -41,7 +42,7 @@ import com.google.common.base.Strings; import javax.annotation.Nullable; -public class BlockAltar extends Block implements IVariantProvider, IDocumentedBlock +public class BlockAltar extends Block implements IVariantProvider, IDocumentedBlock, IBMBlock { public BlockAltar() { @@ -204,4 +205,9 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl return docs; } + + @Override + public ItemBlock getItem() { + return new ItemBlock(this); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 612c73d5..986aec2e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -7,6 +7,7 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; @@ -28,7 +29,7 @@ import WayofTime.bloodmagic.util.Utils; import javax.annotation.Nullable; -public class BlockDemonCrucible extends Block implements IVariantProvider +public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBlock { public BlockDemonCrucible() { @@ -118,4 +119,9 @@ public class BlockDemonCrucible extends Block implements IVariantProvider ret.add(new ImmutablePair(0, "normal")); return ret; } + + @Override + public ItemBlock getItem() { + return new ItemBlock(this); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java index f2251c90..b5b60903 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java @@ -6,6 +6,7 @@ import java.util.List; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; @@ -20,7 +21,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileDemonCrystallizer; -public class BlockDemonCrystallizer extends BlockContainer implements IVariantProvider +public class BlockDemonCrystallizer extends BlockContainer implements IVariantProvider, IBMBlock { public BlockDemonCrystallizer() { @@ -84,4 +85,9 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr ret.add(new ImmutablePair(0, "normal")); return ret; } + + @Override + public ItemBlock getItem() { + return new ItemBlock(this); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java index edc30df5..17d8693b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -6,6 +6,7 @@ import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.math.AxisAlignedBB; @@ -22,7 +23,7 @@ import WayofTime.bloodmagic.tile.TileIncenseAltar; import javax.annotation.Nullable; -public class BlockIncenseAltar extends Block implements IVariantProvider +public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlock { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); @@ -101,4 +102,9 @@ public class BlockIncenseAltar extends Block implements IVariantProvider ret.add(new ImmutablePair(0, "normal")); return ret; } + + @Override + public ItemBlock getItem() { + return new ItemBlock(this); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index 129edaaa..afece925 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -8,6 +8,7 @@ import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; @@ -27,7 +28,7 @@ import WayofTime.bloodmagic.tile.TileSoulForge; import javax.annotation.Nullable; -public class BlockSoulForge extends Block implements IVariantProvider +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); @@ -116,4 +117,9 @@ public class BlockSoulForge extends Block implements IVariantProvider ret.add(new ImmutablePair(0, "normal")); return ret; } + + @Override + public ItemBlock getItem() { + return new ItemBlock(this); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index 4c764482..0c374de0 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -7,6 +7,7 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; @@ -24,7 +25,7 @@ import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.tile.TileTeleposer; -public class BlockTeleposer extends BlockContainer implements IVariantProvider +public class BlockTeleposer extends BlockContainer implements IVariantProvider, IBMBlock { public BlockTeleposer() { @@ -78,4 +79,9 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider ret.add(new ImmutablePair(0, "normal")); return ret; } + + @Override + public ItemBlock getItem() { + return new ItemBlock(this); + } } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 8af50e57..644c7b1a 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -2,11 +2,13 @@ package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.block.IBMBlock; import WayofTime.bloodmagic.client.IVariantProvider; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.init.Items; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; @@ -32,6 +34,8 @@ import WayofTime.bloodmagic.item.sigil.*; import WayofTime.bloodmagic.item.soul.*; import org.apache.commons.lang3.tuple.Pair; +import java.util.Comparator; +import java.util.List; import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @@ -108,26 +112,33 @@ public class RegistrarBloodMagicItems 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 ITEM_POINTS_UPGRADE = 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 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); - private static Set items; + public static List items; @SubscribeEvent public static void registerItems(RegistryEvent.Register event) { - items = Sets.newHashSet( + 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("sacrificial_pack"), - new ItemPackSelfSacrifice().setRegistryName("pack_of_sacrifice"), + new ItemPackSacrifice().setRegistryName("pack_sacrifice"), + new ItemPackSelfSacrifice().setRegistryName("pack_self_sacrifice"), new ItemDaggerOfSacrifice().setRegistryName("dagger_of_sacrifice"), new ItemRitualDiviner().setRegistryName("ritual_diviner"), new ItemRitualReader().setRegistryName("ritual_reader"), @@ -141,18 +152,18 @@ public class RegistrarBloodMagicItems new ItemSigilWater().setRegistryName("sigil_water"), new ItemSigilLava().setRegistryName("sigil_lava"), new ItemSigilVoid().setRegistryName("sigil_void"), - new ItemSigilGreenGrove().setRegistryName("sigil_growth"), - new ItemSigilBloodLight().setRegistryName("sigil_light"), - new ItemSigilElementalAffinity().setRegistryName("sigil_elemental"), + 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 ItemSigilSeer().setRegistryName("sigil_seer"), - new ItemSigilPhantomBridge().setRegistryName("sigil_bridge"), + new ItemSigilPhantomBridge().setRegistryName("sigil_phantom_bridge"), new ItemSigilWhirlwind().setRegistryName("sigil_whirlwind"), new ItemSigilCompression().setRegistryName("sigil_compression"), - new ItemSigilEnderSeverance().setRegistryName("sigil_severance"), + new ItemSigilEnderSeverance().setRegistryName("sigil_ender_severance"), new ItemSigilHolding().setRegistryName("sigil_holding"), new ItemSigilTeleposition().setRegistryName("sigil_teleposition"), new ItemSigilTransposition().setRegistryName("sigil_transposition"), @@ -162,16 +173,16 @@ public class RegistrarBloodMagicItems new ItemComponent().setRegistryName("component"), new ItemDemonCrystal().setRegistryName("item_demon_crystal"), new ItemTelepositionFocus().setRegistryName("teleposition_focus"), - new ItemExperienceBook().setRegistryName("experience_book"), + new ItemExperienceBook().setRegistryName("experience_tome"), new ItemBloodShard().setRegistryName("blood_shard"), - new ItemLivingArmour(EntityEquipmentSlot.HEAD).setRegistryName("living_helm"), - new ItemLivingArmour(EntityEquipmentSlot.CHEST).setRegistryName("living_chest"), - new ItemLivingArmour(EntityEquipmentSlot.LEGS).setRegistryName("living_leggings"), - new ItemLivingArmour(EntityEquipmentSlot.FEET).setRegistryName("living_boots"), - new ItemSentientArmour(EntityEquipmentSlot.HEAD).setRegistryName("sentient_helm"), - new ItemSentientArmour(EntityEquipmentSlot.CHEST).setRegistryName("sentient_chest"), - new ItemSentientArmour(EntityEquipmentSlot.LEGS).setRegistryName("sentient_leggings"), - new ItemSentientArmour(EntityEquipmentSlot.FEET).setRegistryName("sentient_boots"), + new ItemLivingArmour(EntityEquipmentSlot.HEAD).setRegistryName("living_armour_helm"), + new ItemLivingArmour(EntityEquipmentSlot.CHEST).setRegistryName("living_armour_chest"), + new ItemLivingArmour(EntityEquipmentSlot.LEGS).setRegistryName("living_armour_leggings"), + new ItemLivingArmour(EntityEquipmentSlot.FEET).setRegistryName("living_armour_boots"), + new ItemSentientArmour(EntityEquipmentSlot.HEAD).setRegistryName("sentient_armour_helm"), + new ItemSentientArmour(EntityEquipmentSlot.CHEST).setRegistryName("sentient_armour_chest"), + new ItemSentientArmour(EntityEquipmentSlot.LEGS).setRegistryName("sentient_armour_leggings"), + new ItemSentientArmour(EntityEquipmentSlot.FEET).setRegistryName("sentient_armour_boots"), new ItemAltarMaker().setRegistryName("altar_maker"), new ItemUpgradeTome().setRegistryName("upgrade_tome"), new ItemUpgradeTrainer().setRegistryName("upgrade_trainer"), @@ -181,24 +192,19 @@ public class RegistrarBloodMagicItems new ItemSoulSnare().setRegistryName("soul_snare"), new ItemSentientSword().setRegistryName("sentient_sword"), new ItemSentientBow().setRegistryName("sentient_bow"), - new ItemSentientArmourGem().setRegistryName("armour_gem"), + 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("router_filter"), - new ItemFluidRouterFilter().setRegistryName("fluid_router_filter"), + 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("living_armor_point_upgrade"), + new ItemLivingArmourPointsUpgrade().setRegistryName("points_upgrade"), new ItemDemonWillGauge().setRegistryName("demon_will_gauge"), new ItemPotionFlask().setRegistryName("potion_flask") - ); - - 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())); - }); + )); event.getRegistry().registerAll(items.toArray(new Item[0])); } diff --git a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java new file mode 100644 index 00000000..99d8b83d --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java @@ -0,0 +1,82 @@ +package WayofTime.bloodmagic.core.recipe; + +import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.api.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.client.util.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 javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +public class IngredientBloodOrb extends Ingredient { + + private final BloodOrb orb; + private NonNullList orbs; + private IntList itemIds = null; + private ItemStack[] items; + + public IngredientBloodOrb(BloodOrb orb) { + super(); + + this.orb = orb; + + List orbGet = OrbRegistry.getOrbsDownToTier(orb.getTier()); + orbs = NonNullList.withSize(orbGet.size(), ItemStack.EMPTY); + + for (int i = 0; i < orbGet.size(); i++) + orbs.set(i, orbGet.get(i)); + } + + @Override + @Nonnull + public ItemStack[] getMatchingStacks() { + if (items == null) + items = orbs.toArray(new ItemStack[0]); + return items; + } + + @Override + @Nonnull + @SideOnly(Side.CLIENT) + public IntList getValidItemStacksPacked() { + if (this.itemIds == null || itemIds.size() != orbs.size()) { + this.itemIds = new IntArrayList(orbs.size()); + + for (ItemStack itemstack : orbs) + this.itemIds.add(RecipeItemHelper.pack(itemstack)); + + this.itemIds.sort(IntComparators.NATURAL_COMPARATOR); + } + + return this.itemIds; + } + + @Override + public boolean apply(@Nullable ItemStack input) { + if (input == null || input.isEmpty()) + return false; + + if (!input.hasTagCompound()) + return false; + + if (!(input.getItem() instanceof IBloodOrb)) + return false; + + 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 new file mode 100644 index 00000000..bd7060ee --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java @@ -0,0 +1,21 @@ +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/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java index 4bbd166c..7c366b96 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java @@ -138,7 +138,7 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi public static ItemStack getStack(String name) { - return new ItemStack(RegistrarBloodMagicItems.ITEM_POINTS_UPGRADE, 1, names.indexOf(name)); + return new ItemStack(RegistrarBloodMagicItems.POINTS_UPGRADE, 1, names.indexOf(name)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 446d1472..be432487 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -7,6 +7,8 @@ import java.util.*; import java.util.Map.Entry; import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api.orb.IBloodOrb; import WayofTime.bloodmagic.block.enums.EnumBloodRune; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; @@ -229,6 +231,8 @@ public class ModRecipes GameRegistry.addSmelting(baseStoneStack, polishedStoneStack, 0.15f); } + + generateConstants(); } public static void addAltarRecipes() @@ -718,6 +722,14 @@ public class ModRecipes } if (thing instanceof ItemStack) { ItemStack stack = (ItemStack) thing; + + if (stack.getItem() instanceof IBloodOrb) { + Map ret = new HashMap<>(); + BloodOrb orb = ((IBloodOrb) stack.getItem()).getOrb(stack); + ret.put("orb", orb == null ? RegistrarBloodMagic.ORB_WEAK.getRegistryName().toString() : orb.getRegistryName().toString()); + return ret; + } + Map ret = new HashMap<>(); ret.put("item", stack.getItem().getRegistryName().toString()); if (stack.getItem().getHasSubtypes() || stack.getItemDamage() != 0) { diff --git a/src/main/resources/assets/bloodmagic/recipes/_factories.json b/src/main/resources/assets/bloodmagic/recipes/_factories.json new file mode 100644 index 00000000..70d84b40 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/_factories.json @@ -0,0 +1,5 @@ +{ + "ingredients": { + "orb": "WayofTime.bloodmagic.core.recipe.IngredientBloodOrbFactory" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/textures/gui/container/creative_inventory/tab_upgrade_tomes.png b/src/main/resources/assets/minecraft/textures/gui/container/creative_inventory/tab_upgrade_tomes.png deleted file mode 100644 index 7cd035e025f7804e7db595a451c5b33cca9fe7b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1107 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;_UY8Fx&~ehU<2FY)wsWq-iU$iS|V&v7%Gfr0sfr;B4q#jUq@0`pb{h_GJp zzHInY@p6Ka%9-ZI6BaKvRLJW;`KY1Mw4&mg*RP9h@1nlut-CT$=kI0J4)xEcmtQHJ z`_=yd>x9&W-VaVcQs1;K*ZFtUk4A&##}xIzMNoM*jQ7(Da7k*V>B6Y1^J| zC};e_z1IFRpZMJ$Z*I$*m;U*1V`b0Bqc@fI_%$-_bdy`84e#cj(Jeb zo&M^_$BmDBcD|1<+P1&!&yFe2@_t{r?#Q^tf}5{@e$<2F`^I{W>GAmz_t{b#m}cD6 z>lZ(LN%qL4qkm5vHJ@raz5e_;X1iq!>*oHQrZ;Wr&Fp=3xr+CypUpe{{nvc|ulKDP z-~Wt$eJ9f3R?^DXw|+B}ZF~NkVUO^KgX{m#l~p`p%J6R=_l8wk`}p)Svl)lAUiob?kQUzVyP z4g$fA;&u$tGb)tRv->>l*5NP&YA)E8gEKf(o(ovMIqaff*?z)M@P(^&!#~CwhmJ^F zMi=|A6!Btn1>9j^XL1|^>rIqbV>)T+(%0#re~a-8{{b-YXjp+@z0YJ}! z{OMo-*30+X0O%XVA|IBji+l^}8MYaGbUSxVMz}GC87&-;4bXr%vB?mu_r~$Foem%R zd{{mSLB!vceO6kq@<7o&#dI6d8S0`A{~2-;U#*?9)>1E^niEf02S6f&C0T339OoxC z+U8Qhjhtsg5)POGqsL*#+xnFInoD&~Z(5fdUCzOBmoeq}=bL*SJp%O^{Qh2=yPWwN eD8~*2aR10|@iaGFYN@9-$a+s#KbLh*2~7a(j(;Zr From 08258fd6ef7fd97252a2955658c80dc021b6f23c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 15 Aug 2017 21:30:48 -0700 Subject: [PATCH 126/595] Run formatter --- .../java/WayofTime/bloodmagic/BloodMagic.java | 81 +- .../WayofTime/bloodmagic/ConfigHandler.java | 72 +- .../AlchemyArrayEffectAttractor.java | 298 +++----- .../AlchemyArrayEffectBinding.java | 39 +- .../AlchemyArrayEffectBounce.java | 34 +- .../AlchemyArrayEffectMovement.java | 72 +- .../alchemyArray/AlchemyArrayEffectSigil.java | 25 +- .../AlchemyArrayEffectSkeletonTurret.java | 121 ++- .../AlchemyArrayEffectUpdraft.java | 25 +- .../bloodmagic/altar/BloodAltar.java | 580 ++++++-------- .../WayofTime/bloodmagic/annot/Handler.java | 3 +- .../WayofTime/bloodmagic/api/BlockStack.java | 26 +- .../bloodmagic/api/BloodMagicAPI.java | 5 +- .../WayofTime/bloodmagic/api/Constants.java | 22 +- .../api/DamageSourceBloodMagic.java | 9 +- .../bloodmagic/api/ItemStackWrapper.java | 88 +-- .../alchemyCrafting/AlchemyArrayEffect.java | 8 +- .../AlchemyArrayEffectCrafting.java | 30 +- .../AlchemyCircleRenderer.java | 96 +-- .../bloodmagic/api/altar/AltarComponent.java | 27 +- .../bloodmagic/api/altar/AltarUpgrade.java | 33 +- .../api/altar/EnumAltarComponent.java | 6 +- .../bloodmagic/api/altar/EnumAltarTier.java | 57 +- .../bloodmagic/api/altar/IAltarComponent.java | 3 +- .../api/altar/IAltarManipulator.java | 3 +- .../bloodmagic/api/altar/IBloodAltar.java | 8 +- .../api/compress/CompressionHandler.java | 8 +- .../api/compress/CompressionRegistry.java | 80 +- .../api/event/AddToNetworkEvent.java | 17 +- .../api/event/AltarCraftedEvent.java | 14 +- .../bloodmagic/api/event/BoundToolEvent.java | 22 +- .../bloodmagic/api/event/ItemBindEvent.java | 21 +- .../bloodmagic/api/event/RitualEvent.java | 38 +- .../api/event/SacrificeKnifeUsedEvent.java | 28 +- .../api/event/SoulNetworkEvent.java | 44 +- .../bloodmagic/api/event/TeleposeEvent.java | 30 +- .../bloodmagic/api/iface/IActivatable.java | 3 +- .../bloodmagic/api/iface/IAlchemyArray.java | 3 +- .../bloodmagic/api/iface/IAltarReader.java | 3 +- .../bloodmagic/api/iface/IBindable.java | 28 +- .../api/iface/ICustomAlchemyConsumable.java | 3 +- .../api/iface/IDemonWillViewer.java | 3 +- .../api/iface/IDocumentedBlock.java | 22 +- .../bloodmagic/api/iface/IHarvestHandler.java | 17 +- .../api/iface/IItemLPContainer.java | 3 +- .../bloodmagic/api/iface/IMultiWillTool.java | 5 +- .../bloodmagic/api/iface/INodeRenderer.java | 3 +- .../api/iface/IPurificationAsh.java | 3 +- .../iface/ISentientSwordEffectProvider.java | 5 +- .../bloodmagic/api/iface/ISentientTool.java | 3 +- .../bloodmagic/api/iface/ISigil.java | 6 +- .../bloodmagic/api/iface/IUpgradeTrainer.java | 3 +- .../bloodmagic/api/impl/ItemBindable.java | 20 +- .../bloodmagic/api/impl/ItemSigil.java | 18 +- .../api/impl/ItemSigilToggleable.java | 42 +- .../api/incense/EnumTranquilityType.java | 3 +- .../bloodmagic/api/incense/IIncensePath.java | 3 +- .../api/incense/ITranquilityHandler.java | 3 +- .../incense/IncenseTranquilityRegistry.java | 15 +- .../api/incense/TranquilityStack.java | 6 +- .../api/livingArmour/ILivingArmour.java | 20 +- .../api/livingArmour/LivingArmourHandler.java | 41 +- .../api/livingArmour/LivingArmourUpgrade.java | 44 +- .../api/livingArmour/StatTracker.java | 39 +- .../bloodmagic/api/orb/BloodOrb.java | 31 +- .../bloodmagic/api/orb/IBloodOrb.java | 3 +- .../api/recipe/AlchemyTableCustomRecipe.java | 29 +- .../api/recipe/AlchemyTableRecipe.java | 99 +-- .../recipe/LivingArmourDowngradeRecipe.java | 108 +-- .../api/recipe/TartaricForgeRecipe.java | 71 +- .../registry/AlchemyArrayRecipeRegistry.java | 276 +++---- .../registry/AlchemyTableRecipeRegistry.java | 34 +- .../api/registry/AltarRecipeRegistry.java | 89 +-- .../api/registry/HarvestRegistry.java | 73 +- .../api/registry/ImperfectRitualRegistry.java | 68 +- .../LivingArmourDowngradeRecipeRegistry.java | 52 +- .../bloodmagic/api/registry/OrbRegistry.java | 23 +- .../api/registry/RitualRegistry.java | 80 +- .../registry/TartaricForgeRecipeRegistry.java | 24 +- .../bloodmagic/api/ritual/AreaDescriptor.java | 266 +++---- .../api/ritual/CapabilityRuneType.java | 30 +- .../api/ritual/EnumRitualReaderState.java | 3 +- .../bloodmagic/api/ritual/EnumRuneType.java | 40 +- .../api/ritual/IMasterRitualStone.java | 11 +- .../bloodmagic/api/ritual/IRitualStone.java | 8 +- .../bloodmagic/api/ritual/Ritual.java | 224 +++--- .../api/ritual/RitualComponent.java | 53 +- .../bloodmagic/api/ritual/RitualRenderer.java | 6 +- .../imperfect/IImperfectRitualStone.java | 5 +- .../api/ritual/imperfect/ImperfectRitual.java | 26 +- .../api/saving/BMWorldSavedData.java | 28 +- .../bloodmagic/api/saving/SoulNetwork.java | 105 +-- .../bloodmagic/api/soul/DemonWillHolder.java | 54 +- .../api/soul/EnumDemonWillType.java | 16 +- .../bloodmagic/api/soul/IDemonWill.java | 35 +- .../api/soul/IDemonWillConduit.java | 4 +- .../bloodmagic/api/soul/IDemonWillGem.java | 13 +- .../bloodmagic/api/soul/IDemonWillWeapon.java | 3 +- .../api/soul/IDiscreteDemonWill.java | 30 +- .../api/soul/PlayerDemonWillHandler.java | 135 ++-- .../bloodmagic/api/teleport/ITeleport.java | 3 +- .../api/teleport/PortalLocation.java | 39 +- .../bloodmagic/api/teleport/Teleport.java | 9 +- .../api/teleport/TeleportQueue.java | 27 +- .../api/teleport/TeleporterBloodMagic.java | 18 +- .../api/util/helper/BindableHelper.java | 106 +-- .../api/util/helper/IncenseHelper.java | 12 +- .../api/util/helper/ItemHelper.java | 90 +-- .../bloodmagic/api/util/helper/LogHelper.java | 21 +- .../bloodmagic/api/util/helper/NBTHelper.java | 6 +- .../api/util/helper/NetworkHelper.java | 90 +-- .../api/util/helper/PlayerHelper.java | 44 +- .../util/helper/PlayerSacrificeHelper.java | 87 +-- .../api/util/helper/PurificationHelper.java | 20 +- .../api/util/helper/RitualHelper.java | 69 +- .../bloodmagic/block/BlockAlchemyArray.java | 68 +- .../bloodmagic/block/BlockAlchemyTable.java | 72 +- .../bloodmagic/block/BlockAltar.java | 90 +-- .../bloodmagic/block/BlockBloodLight.java | 59 +- .../bloodmagic/block/BlockBloodRune.java | 33 +- .../bloodmagic/block/BlockBloodTank.java | 75 +- .../bloodmagic/block/BlockDecorative.java | 11 +- .../bloodmagic/block/BlockDemonBase.java | 18 +- .../bloodmagic/block/BlockDemonCrucible.java | 52 +- .../bloodmagic/block/BlockDemonCrystal.java | 129 ++-- .../block/BlockDemonCrystallizer.java | 42 +- .../bloodmagic/block/BlockDemonLight.java | 18 +- .../block/BlockDemonPillarBase.java | 19 +- .../block/BlockDemonPillarCapBase.java | 17 +- .../bloodmagic/block/BlockDemonPylon.java | 39 +- .../block/BlockDemonStairsBase.java | 20 +- .../bloodmagic/block/BlockDemonWallBase.java | 19 +- .../block/BlockDimensionalPortal.java | 125 ++- .../bloodmagic/block/BlockIncenseAltar.java | 43 +- .../block/BlockInputRoutingNode.java | 24 +- .../block/BlockInversionPillar.java | 50 +- .../block/BlockInversionPillarEnd.java | 38 +- .../block/BlockItemRoutingNode.java | 16 +- .../bloodmagic/block/BlockLifeEssence.java | 43 +- .../block/BlockMasterRoutingNode.java | 10 +- .../bloodmagic/block/BlockMimic.java | 168 ++--- .../block/BlockOutputRoutingNode.java | 24 +- .../WayofTime/bloodmagic/block/BlockPath.java | 68 +- .../bloodmagic/block/BlockPhantom.java | 48 +- .../block/BlockRitualController.java | 77 +- .../bloodmagic/block/BlockRitualStone.java | 37 +- .../bloodmagic/block/BlockRoutingNode.java | 66 +- .../bloodmagic/block/BlockSoulForge.java | 48 +- .../bloodmagic/block/BlockSpectral.java | 58 +- .../bloodmagic/block/BlockTeleposer.java | 37 +- .../bloodmagic/block/base/BlockEnum.java | 30 +- .../block/base/BlockEnumPillar.java | 112 ++- .../block/base/BlockEnumPillarCap.java | 37 +- .../block/base/BlockEnumStairs.java | 383 ++++------ .../bloodmagic/block/base/BlockEnumWall.java | 99 +-- .../bloodmagic/block/base/BlockInteger.java | 14 +- .../bloodmagic/block/base/BlockString.java | 35 +- .../bloodmagic/block/enums/EnumBloodRune.java | 13 +- .../block/enums/EnumDecorative.java | 16 +- .../block/enums/EnumDemonBlock1.java | 13 +- .../block/enums/EnumDemonBlock2.java | 13 +- .../block/enums/EnumDemonBlock3.java | 13 +- .../block/enums/EnumInversionCap.java | 13 +- .../bloodmagic/block/enums/EnumMimic.java | 13 +- .../bloodmagic/block/enums/EnumPath.java | 13 +- .../block/enums/EnumRitualController.java | 16 +- .../block/enums/EnumSubWillType.java | 13 +- .../block/enums/EnumSubWillType1.java | 13 +- .../block/enums/EnumSubWillType2.java | 13 +- .../block/enums/EnumSubWillType3.java | 13 +- .../bloodmagic/block/enums/EnumWillWall.java | 13 +- .../block/property/PropertyString.java | 30 +- .../bloodmagic/client/IMeshProvider.java | 11 +- .../bloodmagic/client/IVariantProvider.java | 3 +- .../client/gui/GuiAlchemyTable.java | 27 +- .../bloodmagic/client/gui/GuiHandler.java | 84 +-- .../bloodmagic/client/gui/GuiHolding.java | 17 +- .../client/gui/GuiItemRoutingNode.java | 103 +-- .../client/gui/GuiMasterRoutingNode.java | 12 +- .../bloodmagic/client/gui/GuiSoulForge.java | 15 +- .../bloodmagic/client/gui/GuiTeleposer.java | 12 +- .../client/gui/config/ConfigGui.java | 9 +- .../client/gui/config/ConfigGuiFactory.java | 3 +- .../client/helper/ShaderHelper.java | 79 +- .../bloodmagic/client/hud/HUDElement.java | 19 +- .../client/hud/HUDElementDemonWillAura.java | 33 +- .../client/hud/HUDElementHolding.java | 26 +- .../bloodmagic/client/key/IKeybindable.java | 3 +- .../client/key/KeyBindingBloodMagic.java | 6 +- .../bloodmagic/client/key/KeyBindings.java | 45 +- .../mesh/CustomMeshDefinitionActivatable.java | 9 +- .../mesh/CustomMeshDefinitionMultiWill.java | 16 +- .../mesh/CustomMeshDefinitionWillGem.java | 18 +- .../client/render/LayerBloodElytra.java | 18 +- .../AttractorAlchemyCircleRenderer.java | 87 +-- .../BindingAlchemyCircleRenderer.java | 219 +++--- .../DualAlchemyCircleRenderer.java | 77 +- .../SingleAlchemyCircleRenderer.java | 75 +- .../StaticAlchemyCircleRenderer.java | 78 +- .../render/block/RenderAlchemyArray.java | 6 +- .../client/render/block/RenderAltar.java | 83 +- .../client/render/block/RenderBloodTank.java | 9 +- .../render/block/RenderDemonCrucible.java | 12 +- .../client/render/block/RenderFakeBlocks.java | 6 +- .../render/block/RenderItemRoutingNode.java | 12 +- .../client/render/block/RenderMimic.java | 14 +- .../entity/BloodLightRenderFactory.java | 6 +- .../entity/CorruptedChickenRenderFactory.java | 8 +- .../entity/CorruptedSheepRenderFactory.java | 8 +- .../entity/CorruptedSpiderRenderFactory.java | 8 +- .../entity/CorruptedZombieRenderFactory.java | 8 +- .../render/entity/MeteorRenderFactory.java | 8 +- .../render/entity/MimicRenderFactory.java | 8 +- .../render/entity/RenderCorruptedChicken.java | 18 +- .../render/entity/RenderCorruptedSheep.java | 19 +- .../render/entity/RenderCorruptedSpider.java | 20 +- .../render/entity/RenderCorruptedZombie.java | 28 +- .../render/entity/RenderEntityBloodLight.java | 12 +- .../render/entity/RenderEntityMeteor.java | 18 +- .../render/entity/RenderEntityMimic.java | 54 +- .../entity/RenderEntitySentientArrow.java | 47 +- .../render/entity/RenderEntitySoulSnare.java | 14 +- .../render/entity/RenderSentientSpecter.java | 53 +- .../entity/SentientArrowRenderFactory.java | 6 +- .../entity/SentientSpecterRenderFactory.java | 8 +- .../render/entity/SoulSnareRenderFactory.java | 6 +- .../entity/layer/LayerAlchemyCircle.java | 17 +- .../entity/layer/LayerCorruptedSheepWool.java | 27 +- .../layer/LayerCorruptedSpiderEyes.java | 22 +- .../client/render/entity/layer/LayerWill.java | 17 +- .../render/model/ModelCorruptedChicken.java | 18 +- .../render/model/ModelCorruptedSheep.java | 14 +- .../render/model/ModelCorruptedSheep2.java | 14 +- .../render/model/ModelCorruptedSpider.java | 56 +- .../client/render/model/ModelMeteor.java | 16 +- .../client/render/model/ModelMimic.java | 44 +- .../bloodmagic/command/CommandBloodMagic.java | 24 +- .../command/sub/SubCommandBind.java | 50 +- .../command/sub/SubCommandNetwork.java | 140 ++-- .../bloodmagic/command/sub/SubCommandOrb.java | 99 +-- .../bloodmagic/compat/guideapi/BookUtils.java | 45 +- .../compat/guideapi/GuideBloodMagic.java | 5 +- .../compat/guideapi/book/CategoryAlchemy.java | 33 +- .../guideapi/book/CategoryArchitect.java | 247 +++--- .../compat/guideapi/book/CategoryDemon.java | 78 +- .../compat/guideapi/book/CategoryRitual.java | 54 +- .../compat/guideapi/book/CategorySpell.java | 7 +- .../compat/guideapi/entry/EntryText.java | 16 +- .../guideapi/page/PageAlchemyArray.java | 56 +- .../compat/guideapi/page/PageAltarRecipe.java | 21 +- .../page/PageTartaricForgeRecipe.java | 78 +- .../compat/jei/BloodMagicPlugin.java | 25 +- .../AlchemyArrayCraftingCategory.java | 36 +- .../AlchemyArrayCraftingRecipeHandler.java | 23 +- .../AlchemyArrayCraftingRecipeJEI.java | 18 +- .../AlchemyArrayCraftingRecipeMaker.java | 29 +- .../AlchemyTableRecipeCategory.java | 34 +- .../AlchemyTableRecipeHandler.java | 23 +- .../alchemyTable/AlchemyTableRecipeJEI.java | 22 +- .../alchemyTable/AlchemyTableRecipeMaker.java | 15 +- .../compat/jei/altar/AltarRecipeCategory.java | 35 +- .../compat/jei/altar/AltarRecipeHandler.java | 23 +- .../compat/jei/altar/AltarRecipeJEI.java | 30 +- .../compat/jei/altar/AltarRecipeMaker.java | 27 +- .../ArmourDowngradeRecipeCategory.java | 42 +- .../ArmourDowngradeRecipeHandler.java | 23 +- .../ArmourDowngradeRecipeJEI.java | 12 +- .../ArmourDowngradeRecipeMaker.java | 15 +- .../jei/binding/BindingRecipeCategory.java | 30 +- .../jei/binding/BindingRecipeHandler.java | 23 +- .../compat/jei/binding/BindingRecipeJEI.java | 13 +- .../jei/binding/BindingRecipeMaker.java | 29 +- .../forge/TartaricForgeRecipeCategory.java | 48 +- .../jei/forge/TartaricForgeRecipeHandler.java | 15 +- .../jei/forge/TartaricForgeRecipeJEI.java | 49 +- .../jei/forge/TartaricForgeRecipeMaker.java | 15 +- .../compat/waila/WailaPluginBloodMagic.java | 2 +- .../provider/DataProviderAlchemyArray.java | 41 +- .../provider/DataProviderBloodAltar.java | 102 ++- .../waila/provider/DataProviderBloodTank.java | 32 +- .../waila/provider/DataProviderMimic.java | 21 +- .../DataProviderRitualController.java | 69 +- .../waila/provider/DataProviderTeleposer.java | 44 +- .../compress/AdvancedCompressionHandler.java | 105 +-- .../compress/BaseCompressionHandler.java | 54 +- .../compress/StorageBlockCraftingManager.java | 180 ++--- ...StorageBlockCraftingRecipeAssimilator.java | 17 +- .../bloodmagic/core/RegistrarBloodMagic.java | 25 +- .../core/RegistrarBloodMagicBlocks.java | 46 +- .../core/RegistrarBloodMagicItems.java | 45 +- .../WayofTime/bloodmagic/demonAura/PosXY.java | 12 +- .../bloodmagic/demonAura/WillChunk.java | 9 +- .../bloodmagic/demonAura/WillWorld.java | 12 +- .../demonAura/WorldDemonWillHandler.java | 101 +-- .../entity/ai/EntityAIAttackRangedBow.java | 85 +-- .../entity/ai/EntityAIAttackStealthMelee.java | 87 +-- .../entity/ai/EntityAIEatAndCorruptBlock.java | 52 +- .../entity/ai/EntityAIFollowOwner.java | 74 +- .../ai/EntityAIGrabEffectsFromOwner.java | 78 +- .../ai/EntityAIHurtByTargetIgnoreTamed.java | 19 +- .../entity/ai/EntityAIMimicReform.java | 17 +- .../entity/ai/EntityAIOwnerHurtByTarget.java | 29 +- .../entity/ai/EntityAIOwnerHurtTarget.java | 29 +- .../entity/ai/EntityAIPickUpAlly.java | 81 +- .../entity/ai/EntityAIProtectAlly.java | 65 +- .../entity/ai/EntityAIRetreatToHeal.java | 88 +-- .../entity/ai/EntityAIStealthRetreat.java | 67 +- .../ai/EntityAIStealthTowardsTarget.java | 53 +- .../entity/mob/EntityAspectedDemonBase.java | 274 +++---- .../entity/mob/EntityCorruptedChicken.java | 106 +-- .../entity/mob/EntityCorruptedSheep.java | 244 +++--- .../entity/mob/EntityCorruptedSpider.java | 124 +-- .../entity/mob/EntityCorruptedZombie.java | 92 +-- .../entity/mob/EntityDemonBase.java | 185 ++--- .../bloodmagic/entity/mob/EntityMimic.java | 180 ++--- .../entity/mob/EntitySentientSpecter.java | 283 +++---- .../entity/projectile/EntityBloodLight.java | 84 +-- .../entity/projectile/EntityMeteor.java | 65 +- .../projectile/EntitySentientArrow.java | 36 +- .../entity/projectile/EntitySoulSnare.java | 30 +- .../fakePlayer/FakeNetHandlerPlayServer.java | 108 +-- .../bloodmagic/fakePlayer/FakePlayerBM.java | 23 +- .../bloodmagic/fuel/FuelHandler.java | 11 +- .../bloodmagic/gson/SerializerBase.java | 9 +- .../bloodmagic/gson/Serializers.java | 64 +- .../incense/IncenseAltarComponent.java | 56 +- .../incense/IncenseAltarHandler.java | 69 +- .../incense/TranquilityHandlers.java | 78 +- .../inversion/CorruptionHandler.java | 60 +- .../inversion/InversionPillarHandler.java | 118 +-- .../item/ItemActivationCrystal.java | 25 +- .../bloodmagic/item/ItemAltarMaker.java | 82 +- .../bloodmagic/item/ItemArcaneAshes.java | 40 +- .../bloodmagic/item/ItemBindableBase.java | 10 +- .../bloodmagic/item/ItemBloodOrb.java | 48 +- .../bloodmagic/item/ItemBloodShard.java | 17 +- .../bloodmagic/item/ItemBoundAxe.java | 74 +- .../bloodmagic/item/ItemBoundPickaxe.java | 80 +- .../bloodmagic/item/ItemBoundShovel.java | 72 +- .../bloodmagic/item/ItemBoundSword.java | 95 +-- .../bloodmagic/item/ItemBoundTool.java | 180 ++--- .../bloodmagic/item/ItemComponent.java | 45 +- .../item/ItemDaggerOfSacrifice.java | 36 +- .../bloodmagic/item/ItemDemonCrystal.java | 58 +- .../bloodmagic/item/ItemDemonWillGauge.java | 34 +- .../bloodmagic/item/ItemExperienceBook.java | 116 +-- .../bloodmagic/item/ItemInscriptionTool.java | 65 +- .../bloodmagic/item/ItemLavaCrystal.java | 25 +- .../bloodmagic/item/ItemPotionFlask.java | 57 +- .../bloodmagic/item/ItemRitualDiviner.java | 435 ++++------- .../bloodmagic/item/ItemRitualReader.java | 180 ++--- .../item/ItemSacrificialDagger.java | 97 +-- .../bloodmagic/item/ItemSanguineBook.java | 36 +- .../WayofTime/bloodmagic/item/ItemSlate.java | 21 +- .../item/ItemTelepositionFocus.java | 42 +- .../bloodmagic/item/ItemUpgradeTome.java | 66 +- .../bloodmagic/item/ItemUpgradeTrainer.java | 34 +- .../item/alchemy/ItemCuttingFluid.java | 87 +-- .../ItemLivingArmourPointsUpgrade.java | 86 +-- .../item/armour/ItemLivingArmour.java | 421 ++++------- .../item/armour/ItemSentientArmour.java | 714 ++++++++---------- .../item/block/ItemBlockAlchemyTable.java | 33 +- .../item/block/ItemBlockBloodTank.java | 46 +- .../item/block/ItemBlockDemonCrystal.java | 21 +- .../item/block/base/ItemBlockEnum.java | 15 +- .../item/block/base/ItemBlockString.java | 2 +- .../item/gear/ItemPackSacrifice.java | 39 +- .../item/gear/ItemPackSelfSacrifice.java | 42 +- .../item/inventory/ContainerHolding.java | 111 +-- .../item/inventory/InventoryHolding.java | 49 +- .../item/inventory/ItemInventory.java | 122 +-- .../item/routing/IFluidFilterProvider.java | 5 +- .../item/routing/IItemFilterProvider.java | 5 +- .../item/routing/IRoutingFilterProvider.java | 5 +- .../item/routing/ItemFluidRouterFilter.java | 103 ++- .../item/routing/ItemNodeRouter.java | 81 +- .../item/routing/ItemRouterFilter.java | 130 ++-- .../bloodmagic/item/sigil/ItemSigilAir.java | 30 +- .../bloodmagic/item/sigil/ItemSigilBase.java | 27 +- .../item/sigil/ItemSigilBloodLight.java | 46 +- .../item/sigil/ItemSigilBounce.java | 9 +- .../bloodmagic/item/sigil/ItemSigilClaw.java | 9 +- .../item/sigil/ItemSigilCompression.java | 12 +- .../item/sigil/ItemSigilDivination.java | 52 +- .../sigil/ItemSigilElementalAffinity.java | 9 +- .../item/sigil/ItemSigilEnderSeverance.java | 16 +- .../item/sigil/ItemSigilFastMiner.java | 28 +- .../item/sigil/ItemSigilFilledHand.java | 11 +- .../bloodmagic/item/sigil/ItemSigilFrost.java | 9 +- .../item/sigil/ItemSigilGreenGrove.java | 48 +- .../bloodmagic/item/sigil/ItemSigilHaste.java | 9 +- .../item/sigil/ItemSigilHolding.java | 160 ++-- .../bloodmagic/item/sigil/ItemSigilLava.java | 60 +- .../item/sigil/ItemSigilMagnetism.java | 25 +- .../item/sigil/ItemSigilPhantomBridge.java | 38 +- .../bloodmagic/item/sigil/ItemSigilSeer.java | 57 +- .../item/sigil/ItemSigilSuppression.java | 43 +- .../item/sigil/ItemSigilTeleposition.java | 52 +- .../item/sigil/ItemSigilToggleableBase.java | 27 +- .../item/sigil/ItemSigilTransposition.java | 68 +- .../bloodmagic/item/sigil/ItemSigilVoid.java | 54 +- .../bloodmagic/item/sigil/ItemSigilWater.java | 55 +- .../item/sigil/ItemSigilWhirlwind.java | 9 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 52 +- .../item/soul/ItemSentientArmourGem.java | 44 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 358 ++++----- .../bloodmagic/item/soul/ItemSentientBow.java | 237 +++--- .../item/soul/ItemSentientPickaxe.java | 358 ++++----- .../item/soul/ItemSentientShovel.java | 358 ++++----- .../item/soul/ItemSentientSword.java | 332 ++++---- .../bloodmagic/item/soul/ItemSoulGem.java | 177 ++--- .../bloodmagic/item/soul/ItemSoulSnare.java | 30 +- .../bloodmagic/livingArmour/LivingArmour.java | 239 +++--- .../LivingArmourUpgradeBattleHungry.java | 49 +- .../LivingArmourUpgradeCrippledArm.java | 36 +- .../LivingArmourUpgradeDigSlowdown.java | 47 +- .../LivingArmourUpgradeDisoriented.java | 44 +- .../LivingArmourUpgradeMeleeDecrease.java | 39 +- .../LivingArmourUpgradeQuenched.java | 36 +- .../LivingArmourUpgradeSlippery.java | 53 +- .../LivingArmourUpgradeSlowHeal.java | 41 +- .../LivingArmourUpgradeSlowness.java | 50 +- .../LivingArmourUpgradeStormTrooper.java | 41 +- .../tracker/StatTrackerArrowProtect.java | 88 +-- .../tracker/StatTrackerArrowShot.java | 82 +- .../tracker/StatTrackerCriticalStrike.java | 82 +- .../tracker/StatTrackerDigging.java | 82 +- .../tracker/StatTrackerExperience.java | 82 +- .../tracker/StatTrackerFallProtect.java | 82 +- .../tracker/StatTrackerFireResist.java | 63 +- .../livingArmour/tracker/StatTrackerFood.java | 76 +- .../tracker/StatTrackerGraveDigger.java | 82 +- .../tracker/StatTrackerGrimReaperSprint.java | 95 +-- .../tracker/StatTrackerHealthboost.java | 82 +- .../livingArmour/tracker/StatTrackerJump.java | 79 +- .../tracker/StatTrackerMeleeDamage.java | 82 +- .../tracker/StatTrackerMovement.java | 76 +- .../tracker/StatTrackerNightSight.java | 96 +-- .../tracker/StatTrackerPhysicalProtect.java | 82 +- .../tracker/StatTrackerPoison.java | 65 +- .../tracker/StatTrackerRepairing.java | 82 +- .../tracker/StatTrackerSelfSacrifice.java | 79 +- .../tracker/StatTrackerSolarPowered.java | 82 +- .../tracker/StatTrackerSprintAttack.java | 82 +- .../tracker/StatTrackerStepAssist.java | 66 +- .../LivingArmourUpgradeArrowProtect.java | 36 +- .../upgrade/LivingArmourUpgradeArrowShot.java | 34 +- .../LivingArmourUpgradeCriticalStrike.java | 39 +- .../upgrade/LivingArmourUpgradeDigging.java | 65 +- .../upgrade/LivingArmourUpgradeElytra.java | 29 +- .../LivingArmourUpgradeExperience.java | 31 +- .../LivingArmourUpgradeFallProtect.java | 34 +- .../LivingArmourUpgradeFireResist.java | 47 +- .../LivingArmourUpgradeGraveDigger.java | 39 +- .../LivingArmourUpgradeGrimReaperSprint.java | 62 +- .../LivingArmourUpgradeHealthboost.java | 34 +- .../upgrade/LivingArmourUpgradeJump.java | 46 +- .../LivingArmourUpgradeKnockbackResist.java | 36 +- .../LivingArmourUpgradeMeleeDamage.java | 34 +- .../LivingArmourUpgradeNightSight.java | 52 +- .../LivingArmourUpgradePhysicalProtect.java | 34 +- .../LivingArmourUpgradePoisonResist.java | 50 +- .../upgrade/LivingArmourUpgradeRepairing.java | 50 +- .../LivingArmourUpgradeSelfSacrifice.java | 31 +- .../LivingArmourUpgradeSolarPowered.java | 56 +- .../upgrade/LivingArmourUpgradeSpeed.java | 70 +- .../LivingArmourUpgradeSprintAttack.java | 50 +- .../LivingArmourUpgradeStepAssist.java | 31 +- .../WayofTime/bloodmagic/meteor/Meteor.java | 50 +- .../bloodmagic/meteor/MeteorComponent.java | 30 +- .../meteor/MeteorConfigHandler.java | 36 +- .../bloodmagic/meteor/MeteorRegistry.java | 36 +- .../network/BloodMagicPacketHandler.java | 17 +- .../network/DemonAuraPacketProcessor.java | 42 +- .../ItemRouterAmountPacketProcessor.java | 30 +- .../ItemRouterButtonPacketProcessor.java | 42 +- .../bloodmagic/network/KeyProcessor.java | 27 +- .../PlayerFallDistancePacketProcessor.java | 25 +- .../PlayerVelocityPacketProcessor.java | 24 +- .../network/SigilHoldingPacketProcessor.java | 24 +- .../bloodmagic/potion/BMPotionUtils.java | 84 +-- .../bloodmagic/potion/PotionBloodMagic.java | 27 +- .../potion/PotionEventHandlers.java | 36 +- .../bloodmagic/proxy/ClientProxy.java | 111 +-- .../bloodmagic/proxy/CommonProxy.java | 38 +- .../AlchemyTableDyeableRecipe.java | 79 +- .../AlchemyTablePotionAugmentRecipe.java | 40 +- .../AlchemyTablePotionRecipe.java | 63 +- .../registry/ModArmourTrackers.java | 62 +- .../registry/ModCorruptionBlocks.java | 13 +- .../bloodmagic/registry/ModRecipes.java | 240 +++--- .../bloodmagic/registry/ModRituals.java | 46 +- .../registry/ModTranquilityHandlers.java | 8 +- .../bloodmagic/ritual/RitualAltarBuilder.java | 201 ++--- .../bloodmagic/ritual/RitualAnimalGrowth.java | 128 ++-- .../bloodmagic/ritual/RitualArmourEvolve.java | 39 +- .../bloodmagic/ritual/RitualCobblestone.java | 63 +- .../bloodmagic/ritual/RitualContainment.java | 27 +- .../bloodmagic/ritual/RitualCrushing.java | 171 ++--- .../ritual/RitualCrystalHarvest.java | 48 +- .../bloodmagic/ritual/RitualExpulsion.java | 123 ++- .../ritual/RitualFeatheredKnife.java | 117 ++- .../bloodmagic/ritual/RitualFelling.java | 44 +- .../bloodmagic/ritual/RitualForsakenSoul.java | 100 +-- .../bloodmagic/ritual/RitualFullStomach.java | 41 +- .../bloodmagic/ritual/RitualGreenGrove.java | 171 ++--- .../bloodmagic/ritual/RitualHarvest.java | 37 +- .../bloodmagic/ritual/RitualInterdiction.java | 30 +- .../bloodmagic/ritual/RitualJumping.java | 36 +- .../bloodmagic/ritual/RitualLava.java | 174 ++--- .../ritual/RitualLivingArmourDowngrade.java | 119 ++- .../bloodmagic/ritual/RitualMagnetic.java | 163 ++-- .../bloodmagic/ritual/RitualMeteor.java | 77 +- .../bloodmagic/ritual/RitualPlacer.java | 38 +- .../bloodmagic/ritual/RitualPortal.java | 152 ++-- .../bloodmagic/ritual/RitualPump.java | 23 +- .../bloodmagic/ritual/RitualRegeneration.java | 94 +-- .../bloodmagic/ritual/RitualSpeed.java | 136 ++-- .../bloodmagic/ritual/RitualSuppression.java | 44 +- .../ritual/RitualUpgradeRemove.java | 83 +- .../bloodmagic/ritual/RitualWater.java | 33 +- .../ritual/RitualWellOfSuffering.java | 51 +- .../bloodmagic/ritual/RitualZephyr.java | 53 +- .../harvest/HarvestHandlerPlantable.java | 39 +- .../ritual/harvest/HarvestHandlerStem.java | 24 +- .../ritual/harvest/HarvestHandlerTall.java | 21 +- .../ritual/imperfect/ImperfectRitualDay.java | 9 +- .../imperfect/ImperfectRitualNight.java | 9 +- .../ritual/imperfect/ImperfectRitualRain.java | 15 +- .../imperfect/ImperfectRitualResistance.java | 9 +- .../imperfect/ImperfectRitualZombie.java | 9 +- .../ritual/portal/LocationsHandler.java | 133 ++-- .../bloodmagic/ritual/portal/Teleports.java | 63 +- .../bloodmagic/routing/DefaultItemFilter.java | 61 +- .../bloodmagic/routing/IFluidFilter.java | 15 +- .../bloodmagic/routing/IFluidRoutingNode.java | 3 +- .../routing/IInputFluidRoutingNode.java | 3 +- .../routing/IInputItemRoutingNode.java | 3 +- .../bloodmagic/routing/IItemFilter.java | 15 +- .../bloodmagic/routing/IItemRoutingNode.java | 3 +- .../routing/IMasterRoutingNode.java | 3 +- .../routing/IOutputFluidRoutingNode.java | 3 +- .../routing/IOutputItemRoutingNode.java | 3 +- .../bloodmagic/routing/IRoutingFilter.java | 3 +- .../bloodmagic/routing/IRoutingNode.java | 3 +- .../routing/IgnoreNBTItemFilter.java | 15 +- .../bloodmagic/routing/ModIdItemFilter.java | 12 +- .../bloodmagic/routing/NodeHelper.java | 12 +- .../bloodmagic/routing/OreDictItemFilter.java | 27 +- .../routing/RoutingFluidFilter.java | 130 ++-- .../bloodmagic/routing/TestItemFilter.java | 147 ++-- .../structures/BuildTestStructure.java | 13 +- .../bloodmagic/structures/Dungeon.java | 86 +-- .../bloodmagic/structures/DungeonRoom.java | 39 +- .../structures/DungeonRoomLoader.java | 64 +- .../structures/DungeonRoomRegistry.java | 15 +- .../structures/DungeonStructure.java | 19 +- .../bloodmagic/structures/DungeonTester.java | 13 +- .../bloodmagic/structures/DungeonUtil.java | 47 +- .../bloodmagic/structures/ModDungeons.java | 6 +- .../bloodmagic/tile/TileAlchemyArray.java | 80 +- .../bloodmagic/tile/TileAlchemyTable.java | 288 +++---- .../WayofTime/bloodmagic/tile/TileAltar.java | 114 +-- .../bloodmagic/tile/TileBloodTank.java | 39 +- .../bloodmagic/tile/TileDemonCrucible.java | 140 ++-- .../bloodmagic/tile/TileDemonCrystal.java | 96 +-- .../tile/TileDemonCrystallizer.java | 85 +-- .../bloodmagic/tile/TileDemonPylon.java | 62 +- .../tile/TileDimensionalPortal.java | 15 +- .../tile/TileImperfectRitualStone.java | 21 +- .../bloodmagic/tile/TileIncenseAltar.java | 93 +-- .../bloodmagic/tile/TileInventory.java | 167 ++-- .../bloodmagic/tile/TileInversionPillar.java | 425 +++++------ .../tile/TileMasterRitualStone.java | 232 +++--- .../WayofTime/bloodmagic/tile/TileMimic.java | 297 +++----- .../bloodmagic/tile/TilePhantomBlock.java | 18 +- .../tile/TilePurificationAltar.java | 49 +- .../bloodmagic/tile/TileSoulForge.java | 171 ++--- .../bloodmagic/tile/TileSpectralBlock.java | 36 +- .../bloodmagic/tile/TileTeleposer.java | 78 +- .../bloodmagic/tile/base/TileBase.java | 48 +- .../bloodmagic/tile/base/TileTicking.java | 24 +- .../tile/container/ContainerAlchemyTable.java | 82 +- .../container/ContainerItemRoutingNode.java | 141 ++-- .../container/ContainerMasterRoutingNode.java | 9 +- .../tile/container/ContainerSoulForge.java | 72 +- .../tile/container/ContainerTeleposer.java | 54 +- .../tile/routing/TileFilteredRoutingNode.java | 69 +- .../tile/routing/TileInputRoutingNode.java | 51 +- .../tile/routing/TileItemRoutingNode.java | 6 +- .../tile/routing/TileMasterRoutingNode.java | 291 +++---- .../tile/routing/TileOutputRoutingNode.java | 51 +- .../tile/routing/TileRoutingNode.java | 108 +-- .../WayofTime/bloodmagic/util/ChatUtil.java | 153 ++-- .../bloodmagic/util/GhostItemHelper.java | 27 +- .../java/WayofTime/bloodmagic/util/Utils.java | 686 ++++++----------- .../bloodmagic/util/handler/IMCHandler.java | 15 +- .../util/handler/event/ClientHandler.java | 279 +++---- .../util/handler/event/CraftingHandler.java | 80 +- .../util/handler/event/GenericHandler.java | 305 +++----- .../handler/event/LivingArmourHandler.java | 195 ++--- .../handler/event/StatTrackerHandler.java | 107 +-- .../util/handler/event/WillHandler.java | 98 +-- .../bloodmagic/util/helper/NumeralHelper.java | 9 +- .../bloodmagic/util/helper/RecipeHelper.java | 52 +- .../bloodmagic/util/helper/TextHelper.java | 33 +- 606 files changed, 13464 insertions(+), 22975 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 25cb1a75..39cc385d 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,15 +1,22 @@ package WayofTime.bloodmagic; -import java.io.File; -import java.util.List; - +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.registry.RitualRegistry; +import WayofTime.bloodmagic.api.util.helper.LogHelper; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; import WayofTime.bloodmagic.apiv2.IBloodMagicPlugin; +import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; -import WayofTime.bloodmagic.api.registry.RitualRegistry; +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.Utils; +import WayofTime.bloodmagic.util.handler.IMCHandler; import com.google.common.collect.Lists; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; @@ -19,70 +26,51 @@ 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 WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.util.helper.LogHelper; -import WayofTime.bloodmagic.client.gui.GuiHandler; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.proxy.CommonProxy; -import WayofTime.bloodmagic.registry.ModArmourTrackers; -import WayofTime.bloodmagic.registry.ModCorruptionBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.registry.ModRecipes; -import WayofTime.bloodmagic.registry.ModRituals; -import WayofTime.bloodmagic.registry.ModTranquilityHandlers; -import WayofTime.bloodmagic.structures.ModDungeons; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.handler.IMCHandler; import org.apache.commons.lang3.tuple.Pair; +import java.io.File; +import java.util.List; + @Mod(modid = BloodMagic.MODID, name = BloodMagic.NAME, version = BloodMagic.VERSION, dependencies = BloodMagic.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory") -public class BloodMagic -{ +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 CreativeTabs TAB_BM = new CreativeTabs(MODID + ".creativeTab") - { + public static final CreativeTabs TAB_BM = new CreativeTabs(MODID + ".creativeTab") { @Override - public ItemStack getTabIconItem() - { + public ItemStack getTabIconItem() { return new ItemStack(RegistrarBloodMagicItems.BLOOD_ORB); } }; - public static CreativeTabs TAB_TOMES = new CreativeTabs(MODID + ".creativeTabTome") - { + public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + public static final List> PLUGINS = Lists.newArrayList(); + public static CreativeTabs TAB_TOMES = new CreativeTabs(MODID + ".creativeTabTome") { @Override - public ItemStack getTabIconItem() - { + public ItemStack getTabIconItem() { return new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); } @Override - public boolean hasSearchBar() - { + public boolean hasSearchBar() { return true; } }.setNoTitle().setBackgroundImageName("item_search.png"); - public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); - public static final List> PLUGINS = Lists.newArrayList(); - - static - { - FluidRegistry.enableUniversalBucket(); - } @SidedProxy(serverSide = "WayofTime.bloodmagic.proxy.CommonProxy", clientSide = "WayofTime.bloodmagic.proxy.ClientProxy") public static CommonProxy proxy; @Mod.Instance(BloodMagic.MODID) public static BloodMagic instance; + static { + FluidRegistry.enableUniversalBucket(); + } + public LogHelper logger = new LogHelper(MODID); private File configDir; @Mod.EventHandler - public void preInit(FMLPreInitializationEvent event) - { + public void preInit(FMLPreInitializationEvent event) { configDir = new File(event.getModConfigurationDirectory(), "BloodMagic"); ConfigHandler.init(new File(configDir, "BloodMagic.cfg")); @@ -96,8 +84,7 @@ public class BloodMagic } @Mod.EventHandler - public void init(FMLInitializationEvent event) - { + public void init(FMLInitializationEvent event) { BloodMagicPacketHandler.init(); for (Pair plugin : PLUGINS) plugin.getLeft().register(BloodMagicAPI.INSTANCE); @@ -114,8 +101,7 @@ public class BloodMagic } @Mod.EventHandler - public void postInit(FMLPostInitializationEvent event) - { + public void postInit(FMLPostInitializationEvent event) { ModRecipes.addCompressionHandlers(); proxy.postInit(); @@ -127,20 +113,17 @@ public class BloodMagic } @Mod.EventHandler - public void modMapping(FMLModIdMappingEvent event) - { + public void modMapping(FMLModIdMappingEvent event) { } @Mod.EventHandler - public void serverStarting(FMLServerStartingEvent event) - { + public void serverStarting(FMLServerStartingEvent event) { event.registerServerCommand(new CommandBloodMagic()); } @Mod.EventHandler - public void onIMCRecieved(FMLInterModComms.IMCEvent event) - { + public void onIMCRecieved(FMLInterModComms.IMCEvent event) { IMCHandler.handleIMC(event); } } diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 8146e99d..4ec4c8c6 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -1,13 +1,11 @@ package WayofTime.bloodmagic; -import java.io.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.meteor.MeteorConfigHandler; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.config.Configuration; @@ -15,15 +13,12 @@ import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.util.Utils; + +import java.io.File; +import java.util.*; @Handler -public class ConfigHandler -{ +public class ConfigHandler { public static Configuration config; // Teleposer @@ -152,14 +147,20 @@ public class ConfigHandler public static boolean thaumcraftGogglesUpgrade; public static boolean ignoreCompressionSpamAddedByCompression; - public static void init(File file) - { + @SubscribeEvent + public void onConfigChanged(ConfigChangedEvent event) { + if (event.getModID().equals(BloodMagic.MODID)) { + syncConfig(); + MeteorConfigHandler.handleMeteors(false); + } + } + + public static void init(File file) { config = new Configuration(file); syncConfig(); } - public static void syncConfig() - { + public static void syncConfig() { String category; category = "Item/Block Blacklisting"; @@ -168,22 +169,22 @@ public class ConfigHandler category = "Teleposer Blacklist"; config.addCustomCategoryComment(category, "Block blacklisting"); - teleposerBlacklisting = config.getStringList("teleposerBlacklist", category, new String[] { "minecraft:bedrock", "minecraft:mob_spawner" }, "Stops specified blocks from being teleposed. Put entries on new lines. Valid syntax is:\nmodid:blockname:meta"); + teleposerBlacklisting = config.getStringList("teleposerBlacklist", category, new String[]{"minecraft:bedrock", "minecraft:mob_spawner"}, "Stops specified blocks from being teleposed. Put entries on new lines. Valid syntax is:\nmodid:blockname:meta"); buildBlacklist(teleposerBlacklisting, teleposerBlacklist); - teleposerBlacklistEntity = Arrays.asList(config.getStringList("teleposerBlacklistEntity", category, new String[] {}, "Entity class names listed here will not be able to be teleposed.")); + teleposerBlacklistEntity = Arrays.asList(config.getStringList("teleposerBlacklistEntity", category, new String[]{}, "Entity class names listed here will not be able to be teleposed.")); category = "Transposition Sigil Blacklist"; config.addCustomCategoryComment(category, "Block blacklisting"); - transpositionBlacklisting = config.getStringList("transpositionBlacklist", category, new String[] { "minecraft:bedrock", "minecraft:mob_spawner" }, "Stops specified blocks from being teleposed. Put entries on new lines. Valid syntax is:\nmodid:blockname:meta"); + transpositionBlacklisting = config.getStringList("transpositionBlacklist", category, new String[]{"minecraft:bedrock", "minecraft:mob_spawner"}, "Stops specified blocks from being teleposed. Put entries on new lines. Valid syntax is:\nmodid:blockname:meta"); buildBlacklist(transpositionBlacklisting, transpositionBlacklist); category = "Well of Suffering Blacklist"; config.addCustomCategoryComment(category, "Entity blacklisting from WoS"); - wellOfSufferingBlacklist = Arrays.asList(config.getStringList("wellOfSufferingBlacklist", category, new String[] { "EntityArmorStand", "EntitySentientSpecter" }, "Use the class name of the Entity to blacklist it from usage.\nIE: EntityWolf, EntityWitch, etc")); + wellOfSufferingBlacklist = Arrays.asList(config.getStringList("wellOfSufferingBlacklist", category, new String[]{"EntityArmorStand", "EntitySentientSpecter"}, "Use the class name of the Entity to blacklist it from usage.\nIE: EntityWolf, EntityWitch, etc")); category = "Blood Altar Sacrificial Values"; config.addCustomCategoryComment(category, "Entity Sacrificial Value Settings"); - entitySacrificeValuesList = config.getStringList("entitySacrificeLP:HPValues", category, new String[] { "EntityVillager;100", "EntitySlime;15", "EntityEnderman;10", "EntityCow;100", "EntityChicken;100", "EntityHorse;100", "EntitySheep;100", "EntityWolf;100", "EntityOcelot;100", "EntityPig;100", "EntityRabbit;100", "EntityArmorStand;0", "EntitySentientSpecter;0" }, "Used to edit the amount of LP gained per HP sacrificed for the given entity.\nSetting an entity to 0 effectively blacklists it.\nIf a mod modifies an entity via the API, it will take precedence over this config.\nSyntax: EntityClassName;LPPerHP"); + entitySacrificeValuesList = config.getStringList("entitySacrificeLP:HPValues", category, new String[]{"EntityVillager;100", "EntitySlime;15", "EntityEnderman;10", "EntityCow;100", "EntityChicken;100", "EntityHorse;100", "EntitySheep;100", "EntityWolf;100", "EntityOcelot;100", "EntityPig;100", "EntityRabbit;100", "EntityArmorStand;0", "EntitySentientSpecter;0"}, "Used to edit the amount of LP gained per HP sacrificed for the given entity.\nSetting an entity to 0 effectively blacklists it.\nIf a mod modifies an entity via the API, it will take precedence over this config.\nSyntax: EntityClassName;LPPerHP"); buildEntitySacrificeValues(); category = "Potions"; @@ -310,19 +311,16 @@ public class ConfigHandler config.save(); } - private static void buildBlacklist(String[] blacklisting, List blockBlacklist) - { + private static void buildBlacklist(String[] blacklisting, List blockBlacklist) { blockBlacklist.clear(); - for (String blockSet : blacklisting) - { + for (String blockSet : blacklisting) { String[] blockData = blockSet.split(":"); Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockData[0], blockData[1])); int meta = 0; - if (blockData.length == 3) - { + if (blockData.length == 3) { // Check if it's an int, if so, parse it. If not, set meta to 0 // to avoid crashing. if (Utils.isInteger(blockData[2])) @@ -337,12 +335,10 @@ public class ConfigHandler } } - private static void buildEntitySacrificeValues() - { + private static void buildEntitySacrificeValues() { entitySacrificeValues.clear(); - for (String entityData : entitySacrificeValuesList) - { + for (String entityData : entitySacrificeValuesList) { String[] split = entityData.split(";"); int amount = 500; @@ -353,14 +349,4 @@ public class ConfigHandler entitySacrificeValues.put(split[0], amount); } } - - @SubscribeEvent - public void onConfigChanged(ConfigChangedEvent event) - { - if (event.getModID().equals(BloodMagic.MODID)) - { - syncConfig(); - MeteorConfigHandler.handleMeteors(false); - } - } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java index 7ac8a57f..9a796c9c 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -1,24 +1,16 @@ package WayofTime.bloodmagic.alchemyArray; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.fakePlayer.FakePlayerBM; +import WayofTime.bloodmagic.tile.TileAlchemyArray; +import com.mojang.authlib.GameProfile; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.entity.ai.EntityAITasks; import net.minecraft.entity.ai.EntityAITasks.EntityAITaskEntry; -import net.minecraft.entity.monster.EntityBlaze; -import net.minecraft.entity.monster.EntityEnderman; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.monster.EntityPigZombie; -import net.minecraft.entity.monster.EntitySilverfish; -import net.minecraft.entity.monster.EntitySlime; -import net.minecraft.entity.monster.EntitySpider; +import net.minecraft.entity.monster.*; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.pathfinding.Path; import net.minecraft.pathfinding.PathFinder; @@ -29,17 +21,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.FakePlayer; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.fakePlayer.FakePlayerBM; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import com.mojang.authlib.GameProfile; +import java.util.*; /** * Credits for the initial code go to Crazy Pants of EIO. */ -public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { private FakePlayer target; private Set tracking = new HashSet(); @@ -48,26 +36,21 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect private int cooldown = 50; - public AlchemyArrayEffectAttractor(String key) - { + public AlchemyArrayEffectAttractor(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { - if (tile.getWorld().isRemote) - { + public boolean update(TileEntity tile, int ticksActive) { + if (tile.getWorld().isRemote) { return false; } BlockPos pos = tile.getPos(); counter++; - if (counter < 10) - { + if (counter < 10) { Iterator itr = tracking.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { EntityLiving ent = itr.next(); onEntityTick(pos, ent); } @@ -82,8 +65,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect Set trackingThisTick = new HashSet(); List entsInBounds = world.getEntitiesWithinAABB(EntityLiving.class, getBounds(pos)); - for (EntityLiving ent : entsInBounds) - { + for (EntityLiving ent : entsInBounds) { if (!ent.isDead)// && isMobInFilter(ent)) { double x = (pos.getX() + 0.5D - ent.posX); @@ -91,36 +73,30 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect double z = (pos.getZ() + 0.5D - ent.posZ); double distance = Math.sqrt(x * x + y * y + z * z); - if (distance < 2 && tracking.contains(ent)) - { + if (distance < 2 && tracking.contains(ent)) { setEntityCooldown(pos, ent, cooldown); removeAssignedAITask(pos, ent); continue; } - if (!canEntityBeTracked(pos, ent)) - { + if (!canEntityBeTracked(pos, ent)) { // System.out.println("Cooldown: " + getEntityCooldown(pos, ent)); decrementEntityCooldown(pos, ent); continue; } - if (tracking.contains(ent)) - { + if (tracking.contains(ent)) { trackingThisTick.add(ent); onEntityTick(pos, ent); - } else if (tracking.size() < maxMobsAttracted && trackMob(pos, ent)) - { + } else if (tracking.size() < maxMobsAttracted && trackMob(pos, ent)) { trackingThisTick.add(ent); onTracked(ent); } } } - for (EntityLiving e : tracking) - { - if (!trackingThisTick.contains(e)) - { + for (EntityLiving e : tracking) { + if (!trackingThisTick.contains(e)) { onUntracked(e); } } @@ -130,124 +106,98 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect return false; } - public boolean canEntityBeTracked(BlockPos pos, EntityLiving entity) - { + public boolean canEntityBeTracked(BlockPos pos, EntityLiving entity) { return getEntityCooldown(pos, entity) <= 0; } - private String getPosKey(BlockPos pos) - { + private String getPosKey(BlockPos pos) { return "BMAttractor:" + pos; } - public int getEntityCooldown(BlockPos pos, EntityLiving entity) - { + public int getEntityCooldown(BlockPos pos, EntityLiving entity) { return entity.getEntityData().getInteger(getPosKey(pos)); } - public void setEntityCooldown(BlockPos pos, EntityLiving entity, int cooldown) - { + public void setEntityCooldown(BlockPos pos, EntityLiving entity, int cooldown) { entity.getEntityData().setInteger(getPosKey(pos), cooldown); } - public void decrementEntityCooldown(BlockPos pos, EntityLiving entity) - { + public void decrementEntityCooldown(BlockPos pos, EntityLiving entity) { int cooldown = getEntityCooldown(pos, entity); - if (cooldown > 0) - { + if (cooldown > 0) { setEntityCooldown(pos, entity, cooldown - 1); } } - public AxisAlignedBB getBounds(BlockPos pos) - { + public AxisAlignedBB getBounds(BlockPos pos) { return new AxisAlignedBB(pos).expand(getRange(), getRange(), getRange()); } - public float getRange() - { + public float getRange() { return 10; } - private void onUntracked(EntityLiving e) - { - if (e instanceof EntityEnderman) - { + private void onUntracked(EntityLiving e) { + if (e instanceof EntityEnderman) { e.getEntityData().setBoolean("BM:tracked", false); } } - private void onTracked(EntityLiving e) - { - if (e instanceof EntityEnderman) - { + private void onTracked(EntityLiving e) { + if (e instanceof EntityEnderman) { e.getEntityData().setBoolean("BM:tracked", true); } } - private void onEntityTick(BlockPos pos, EntityLiving ent) - { - if (ent instanceof EntitySlime) - { + private void onEntityTick(BlockPos pos, EntityLiving ent) { + if (ent instanceof EntitySlime) { ent.faceEntity(getTarget(ent.getEntityWorld(), pos), 10.0F, 20.0F); - } else if (ent instanceof EntitySilverfish) - { - if (counter < 10) - { + } else if (ent instanceof EntitySilverfish) { + if (counter < 10) { return; } EntitySilverfish sf = (EntitySilverfish) ent; Path pathentity = getPathEntityToEntity(ent, getTarget(ent.getEntityWorld(), pos), getRange()); sf.getNavigator().setPath(pathentity, sf.getAIMoveSpeed()); - } else if (ent instanceof EntityBlaze) - { + } else if (ent instanceof EntityBlaze) { 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) - { + if (distance > 1.25) { double speed = 0.01; ent.motionX += x / distance * speed; - if (y > 0) - { + if (y > 0) { ent.motionY += (0.3 - ent.motionY) * 0.3; } ent.motionZ += z / distance * speed; } - } else if (ent instanceof EntityPigZombie || ent instanceof EntitySpider) - { + } else if (ent instanceof EntityPigZombie || ent instanceof EntitySpider) { forceMove(pos, ent); // ent.setAttackTarget(target); - } else if (ent instanceof EntityEnderman) - { + } else if (ent instanceof EntityEnderman) { ent.setAttackTarget(getTarget(ent.getEntityWorld(), pos)); } } - private void forceMove(BlockPos pos, EntityLiving ent) - { + private void forceMove(BlockPos pos, EntityLiving 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) - { + if (distance > 2) { EntityMob mod = (EntityMob) ent; mod.faceEntity(getTarget(ent.getEntityWorld(), pos), 180, 0); mod.getMoveHelper().strafe(0, 0.3f); - if (mod.posY < pos.getY()) - { + if (mod.posY < pos.getY()) { mod.setJumping(true); - } else - { + } else { mod.setJumping(false); } } } - public Path getPathEntityToEntity(Entity entity, Entity targetEntity, float range) - { + 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); @@ -256,74 +206,57 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect return pf.findPath(targetEntity.getEntityWorld(), (EntityLiving) entity, new BlockPos(targX, targY, targZ), range); } - private boolean trackMob(BlockPos pos, EntityLiving ent) - { + private boolean trackMob(BlockPos pos, EntityLiving ent) { //TODO: Figure out if this crud is needed - if (useSetTarget(ent)) - { + if (useSetTarget(ent)) { ent.setAttackTarget(getTarget(ent.getEntityWorld(), pos)); return true; - } else if (useSpecialCase(ent)) - { + } else if (useSpecialCase(ent)) { return applySpecialCase(pos, ent); - } else - { + } else { return attractUsingAITask(pos, ent); } } - private boolean useSetTarget(EntityLiving ent) - { + private boolean useSetTarget(EntityLiving ent) { return ent instanceof EntityPigZombie || ent instanceof EntitySpider || ent instanceof EntitySilverfish; } - public void removeAssignedAITask(BlockPos pos, EntityLiving ent) - { + public void removeAssignedAITask(BlockPos pos, EntityLiving ent) { Set entries = ent.tasks.taskEntries; EntityAIBase remove = null; - for (EntityAITaskEntry entry : entries) - { - if (entry.action instanceof AttractTask) - { + for (EntityAITaskEntry entry : entries) { + if (entry.action instanceof AttractTask) { AttractTask at = (AttractTask) entry.action; - if (at.coord.equals(pos)) - { + if (at.coord.equals(pos)) { remove = entry.action; - } else - { + } else { continue; } } } - if (remove != null) - { + if (remove != null) { ent.tasks.removeTask(remove); } } - private boolean attractUsingAITask(BlockPos pos, EntityLiving ent) - { + private boolean attractUsingAITask(BlockPos pos, EntityLiving ent) { tracking.add(ent); Set entries = ent.tasks.taskEntries; // boolean hasTask = false; EntityAIBase remove = null; // boolean isTracked; - for (EntityAITaskEntry entry : entries) - { - if (entry.action instanceof AttractTask) - { + for (EntityAITaskEntry entry : entries) { + if (entry.action instanceof AttractTask) { AttractTask at = (AttractTask) entry.action; - if (at.coord.equals(pos) || !at.shouldExecute()) - { + if (at.coord.equals(pos) || !at.shouldExecute()) { remove = entry.action; - } else - { + } else { return false; } } } - if (remove != null) - { + if (remove != null) { ent.tasks.removeTask(remove); } @@ -333,18 +266,14 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect return true; } - private void cancelCurrentTasks(EntityLiving ent) - { + private void cancelCurrentTasks(EntityLiving ent) { Iterator iterator = ent.tasks.taskEntries.iterator(); List currentTasks = new ArrayList(); - while (iterator.hasNext()) - { + while (iterator.hasNext()) { EntityAITaskEntry entityaitaskentry = iterator.next(); - if (entityaitaskentry != null) - { - if (entityaitaskentry.action instanceof AttractTask) - { + if (entityaitaskentry != null) { + if (entityaitaskentry.action instanceof AttractTask) { continue; } @@ -353,42 +282,34 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect } // Only available way to stop current execution is to remove all current // tasks, then re-add them - for (EntityAITaskEntry task : currentTasks) - { + for (EntityAITaskEntry task : currentTasks) { ent.tasks.removeTask(task.action); ent.tasks.addTask(task.priority, task.action); } } - private boolean applySpecialCase(BlockPos pos, EntityLiving ent) - { - if (ent instanceof EntitySlime) - { + private boolean applySpecialCase(BlockPos pos, EntityLiving ent) { + if (ent instanceof EntitySlime) { ent.faceEntity(getTarget(ent.getEntityWorld(), pos), 10.0F, 20.0F); // ent.setAttackTarget(getTarget(ent.worldObj, pos)); return true; - } else if (ent instanceof EntitySilverfish) - { + } else if (ent instanceof EntitySilverfish) { EntitySilverfish es = (EntitySilverfish) ent; Path pathentity = getPathEntityToEntity(ent, getTarget(ent.getEntityWorld(), pos), getRange()); es.getNavigator().setPath(pathentity, es.getAIMoveSpeed()); return true; - } else if (ent instanceof EntityBlaze) - { + } else if (ent instanceof EntityBlaze) { return true; } return false; } - private boolean useSpecialCase(EntityLiving ent) - { + private boolean useSpecialCase(EntityLiving ent) { return ent instanceof EntitySlime || ent instanceof EntitySilverfish || ent instanceof EntityBlaze; } - public FakePlayer getTarget(World world, BlockPos pos) - { - if (target == null) - { + public FakePlayer getTarget(World world, BlockPos pos) { + if (target == null) { // System.out.println("...Hi? " + pos); target = new Target(world, pos); } @@ -396,17 +317,22 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect return target; } - private class Target extends FakePlayerBM - { - public Target(World world, BlockPos pos) - { - super(world, pos, new GameProfile(null, BloodMagic.MODID + "ArrayAttractor" + ":" + pos)); - posY += 1; - } + @Override + public void writeToNBT(NBTTagCompound tag) { + } - private static class AttractTask extends EntityAIBase - { + @Override + public void readFromNBT(NBTTagCompound tag) { + + } + + @Override + public AlchemyArrayEffect getNewCopy() { + return new AlchemyArrayEffectAttractor(key); + } + + private static class AttractTask extends EntityAIBase { private EntityLiving mob; private BlockPos coord; private FakePlayer target; @@ -414,21 +340,18 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect private boolean started = false; - private AttractTask(EntityLiving mob, FakePlayer target, BlockPos coord) - { + private AttractTask(EntityLiving mob, FakePlayer target, BlockPos coord) { this.mob = mob; this.coord = coord; this.target = target; } @Override - public boolean shouldExecute() - { + public boolean shouldExecute() { boolean res = false; //TODO: TileEntity te = mob.getEntityWorld().getTileEntity(coord); - if (te instanceof TileAlchemyArray) - { + if (te instanceof TileAlchemyArray) { res = true; } @@ -436,55 +359,38 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect } @Override - public void resetTask() - { + public void resetTask() { started = false; updatesSincePathing = 0; } @Override - public boolean isInterruptible() - { + public boolean isInterruptible() { return true; } @Override - public void updateTask() - { - if (!started || updatesSincePathing > 20) - { + 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) - { + if (!res) { mob.getNavigator().tryMoveToXYZ(target.posX, target.posY + 1, target.posZ, speed); } updatesSincePathing = 0; - } else - { + } else { updatesSincePathing++; } } } - @Override - public void writeToNBT(NBTTagCompound tag) - { - - } - - @Override - public void readFromNBT(NBTTagCompound tag) - { - - } - - @Override - public AlchemyArrayEffect getNewCopy() - { - return new AlchemyArrayEffectAttractor(key); + 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 index 0f25ede0..8310f713 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java @@ -1,5 +1,8 @@ package WayofTime.bloodmagic.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; +import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; @@ -7,34 +10,25 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; -import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; -public class AlchemyArrayEffectBinding extends AlchemyArrayEffectCrafting -{ - public AlchemyArrayEffectBinding(String key, ItemStack outputStack) - { +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) - { + 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) - { + if (tile.getWorld().isRemote) { return false; } - if (ticksActive >= 300) - { + if (ticksActive >= 300) { BlockPos pos = tile.getPos(); ItemStack output = outputStack.copy(); @@ -48,10 +42,8 @@ public class AlchemyArrayEffectBinding extends AlchemyArrayEffectCrafting return false; } - public void spawnLightningOnCircle(World world, BlockPos pos, int ticksActive) - { - if (ticksActive % 50 == 0) - { + 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); @@ -65,20 +57,17 @@ public class AlchemyArrayEffectBinding extends AlchemyArrayEffectCrafting } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { //EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { //EMPTY } @Override - public AlchemyArrayEffect getNewCopy() - { + 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 index 3b42eed2..7b0211bd 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.api.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -7,34 +9,25 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; -public class AlchemyArrayEffectBounce extends AlchemyArrayEffect -{ - public AlchemyArrayEffectBounce(String key) - { +public class AlchemyArrayEffectBounce extends AlchemyArrayEffect { + public AlchemyArrayEffectBounce(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { return false; } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) - { - if (entity.isSneaking()) - { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { + if (entity.isSneaking()) { return; - } else if (entity.motionY < 0.0D) - { + } else if (entity.motionY < 0.0D) { entity.motionY = -entity.motionY; - if (!(entity instanceof EntityLivingBase)) - { + if (!(entity instanceof EntityLivingBase)) { entity.motionY *= 0.8D; } @@ -43,20 +36,17 @@ public class AlchemyArrayEffectBounce extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectBounce(key); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java index d1d981a6..f7425b3b 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.api.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; @@ -7,25 +9,19 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; -public class AlchemyArrayEffectMovement extends AlchemyArrayEffect -{ - public AlchemyArrayEffectMovement(String key) - { +public class AlchemyArrayEffectMovement extends AlchemyArrayEffect { + public AlchemyArrayEffectMovement(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { return false; } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) - { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { double motionY = 0.5; double speed = 3; EnumFacing direction = array.getRotation(); @@ -33,51 +29,47 @@ public class AlchemyArrayEffectMovement extends AlchemyArrayEffect entity.motionY = motionY; entity.fallDistance = 0; - switch (direction) - { - case NORTH: - entity.motionX = 0; - entity.motionY = motionY; - entity.motionZ = -speed; - break; + 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 SOUTH: + entity.motionX = 0; + entity.motionY = motionY; + entity.motionZ = speed; + break; - case WEST: - entity.motionX = -speed; - entity.motionY = motionY; - entity.motionZ = 0; - 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; + case EAST: + entity.motionX = speed; + entity.motionY = motionY; + entity.motionZ = 0; + break; + default: + break; } } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + 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 index 20d22c40..afa6ce77 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java @@ -1,26 +1,22 @@ package WayofTime.bloodmagic.alchemyArray; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; import WayofTime.bloodmagic.api.iface.ISigil; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; -public class AlchemyArrayEffectSigil extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectSigil extends AlchemyArrayEffect { private final ISigil sigil; - public AlchemyArrayEffectSigil(String key, ISigil sigil) - { + public AlchemyArrayEffectSigil(String key, ISigil sigil) { super(key); this.sigil = sigil; } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { //TODO: Need particles. - if (sigil.hasArrayEffect()) - { + if (sigil.hasArrayEffect()) { sigil.performArrayEffect(tile.getWorld(), tile.getPos()); } @@ -28,20 +24,17 @@ public class AlchemyArrayEffectSigil extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + 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 index 8396bec4..464cd6cd 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java @@ -1,9 +1,8 @@ package WayofTime.bloodmagic.alchemyArray; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.tile.TileAlchemyArray; +import com.google.common.base.Predicate; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIBase; @@ -18,35 +17,29 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.util.FakePlayer; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import com.google.common.base.Predicate; +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 -{ - private EntitySkeleton turret; - - public static Predicate checkSkeleton = new Predicate() - { +public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { + public static Predicate checkSkeleton = new Predicate() { @Override - public boolean apply(EntityMob input) - { + public boolean apply(EntityMob input) { return !(input instanceof EntitySkeleton); } }; + private EntitySkeleton turret; - public AlchemyArrayEffectSkeletonTurret(String key) - { + public AlchemyArrayEffectSkeletonTurret(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { // if (tile.getWorld().isRemote) // { // return false; @@ -54,15 +47,13 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect BlockPos pos = tile.getPos(); - if (turret != null && !turret.isDead) - { + 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) - { + if (distance < 2) { // turret.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 100, 100)); return false; } @@ -72,8 +63,7 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect List skeletonsInRange = world.getEntitiesWithinAABB(EntitySkeleton.class, getBounds(pos)); - for (EntitySkeleton entity : skeletonsInRange) - { + for (EntitySkeleton entity : skeletonsInRange) { if (!entity.isDead)// && isMobInFilter(ent)) { modifyAITargetTasks(entity); @@ -85,13 +75,11 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect return false; } - public AxisAlignedBB getBounds(BlockPos pos) - { + public AxisAlignedBB getBounds(BlockPos pos) { return new AxisAlignedBB(pos).expand(getRange(), getRange(), getRange()); } - public float getRange() - { + public float getRange() { return 0; } @@ -105,8 +93,7 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect // e.getEntityData().setBoolean("BM:tracked", true); // } - private boolean modifyAITargetTasks(EntitySkeleton entity) - { + private boolean modifyAITargetTasks(EntitySkeleton entity) { cancelCurrentTargetTasks(entity); // entity.setCombatTask(); @@ -116,13 +103,11 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect return true; } - private void cancelCurrentTargetTasks(EntityLiving entity) - { + private void cancelCurrentTargetTasks(EntityLiving entity) { Iterator iterator = entity.targetTasks.taskEntries.iterator(); List currentTasks = new ArrayList(); - while (iterator.hasNext()) - { + while (iterator.hasNext()) { EntityAITaskEntry entityaitaskentry = iterator.next(); if (entityaitaskentry != null)// && entityaitaskentry.action instanceof EntityAITarget) { @@ -130,14 +115,27 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect } } - for (EntityAITaskEntry task : currentTasks) - { + for (EntityAITaskEntry task : currentTasks) { entity.targetTasks.removeTask(task.action); } } - private static class AttractTask extends EntityAIBase - { + @Override + public void writeToNBT(NBTTagCompound tag) { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + + } + + @Override + public AlchemyArrayEffect getNewCopy() { + return new AlchemyArrayEffectSkeletonTurret(key); + } + + private static class AttractTask extends EntityAIBase { private EntityLiving mob; private BlockPos coord; private FakePlayer target; @@ -145,21 +143,18 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect private boolean started = false; - private AttractTask(EntityLiving mob, FakePlayer target, BlockPos coord) - { + private AttractTask(EntityLiving mob, FakePlayer target, BlockPos coord) { this.mob = mob; this.coord = coord; this.target = target; } @Override - public boolean shouldExecute() - { + public boolean shouldExecute() { boolean res = false; //TODO: TileEntity te = mob.getEntityWorld().getTileEntity(coord); - if (te instanceof TileAlchemyArray) - { + if (te instanceof TileAlchemyArray) { res = true; } @@ -167,55 +162,31 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect } @Override - public void resetTask() - { + public void resetTask() { started = false; updatesSincePathing = 0; } @Override - public boolean isInterruptible() - { + public boolean isInterruptible() { return true; } @Override - public void updateTask() - { - if (!started || updatesSincePathing > 20) - { + 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) - { + if (!res) { mob.getNavigator().tryMoveToXYZ(target.posX, target.posY + 1, target.posZ, speed); } updatesSincePathing = 0; - } else - { + } else { updatesSincePathing++; } } } - - @Override - public void writeToNBT(NBTTagCompound tag) - { - - } - - @Override - public void readFromNBT(NBTTagCompound tag) - { - - } - - @Override - public AlchemyArrayEffect getNewCopy() - { - return new AlchemyArrayEffectSkeletonTurret(key); - } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java index 6579a254..2b778e11 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java @@ -1,30 +1,26 @@ package WayofTime.bloodmagic.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.api.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; -public class AlchemyArrayEffectUpdraft extends AlchemyArrayEffect -{ - public AlchemyArrayEffectUpdraft(String key) - { +public class AlchemyArrayEffectUpdraft extends AlchemyArrayEffect { + public AlchemyArrayEffectUpdraft(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { return false; } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) - { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { double motionY = 1.5; entity.fallDistance = 0; @@ -33,20 +29,17 @@ public class AlchemyArrayEffectUpdraft extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectUpdraft(key); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 2f15c9b6..23cc695f 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -1,9 +1,21 @@ package WayofTime.bloodmagic.altar; -import java.util.List; - +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.altar.*; +import WayofTime.bloodmagic.api.event.AltarCraftedEvent; import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.block.BlockBloodRune; +import WayofTime.bloodmagic.block.BlockLifeEssence; +import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.util.Utils; +import com.google.common.base.Enums; +import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -19,38 +31,26 @@ import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.capability.FluidTankPropertiesWrapper; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.AltarComponent; -import WayofTime.bloodmagic.api.altar.AltarUpgrade; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.altar.IAltarComponent; -import WayofTime.bloodmagic.api.event.AltarCraftedEvent; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.block.BlockBloodRune; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.Utils; +import java.util.List; -import com.google.common.base.Enums; -import com.google.common.base.Strings; - -public class BloodAltar implements IFluidHandler -{ - private TileAltar tileAltar; - private int internalCounter = 0; +public class BloodAltar implements IFluidHandler { + static { + EnumAltarTier.ONE.buildComponents(); + EnumAltarTier.TWO.buildComponents(); + EnumAltarTier.THREE.buildComponents(); + EnumAltarTier.FOUR.buildComponents(); + EnumAltarTier.FIVE.buildComponents(); + EnumAltarTier.SIX.buildComponents(); + } 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 EnumAltarTier altarTier = EnumAltarTier.ONE; private AltarUpgrade upgrade; private int capacity = Fluid.BUCKET_VOLUME * 10; @@ -73,181 +73,21 @@ public class BloodAltar implements IFluidHandler 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 AltarRecipe recipe; private ItemStack result = ItemStack.EMPTY; - private EnumAltarTier currentTierDisplayed = EnumAltarTier.ONE; - public BloodAltar(TileAltar tileAltar) - { + public BloodAltar(TileAltar tileAltar) { this.tileAltar = tileAltar; } - static - { - EnumAltarTier.ONE.buildComponents(); - EnumAltarTier.TWO.buildComponents(); - EnumAltarTier.THREE.buildComponents(); - EnumAltarTier.FOUR.buildComponents(); - EnumAltarTier.FIVE.buildComponents(); - EnumAltarTier.SIX.buildComponents(); - } - - public static EnumAltarTier getAltarTier(World world, BlockPos pos) - { - for (int i = EnumAltarTier.MAXTIERS - 1; i >= 1; i--) - { - if (checkAltarIsValid(world, pos, i)) - { - return EnumAltarTier.values()[i]; - } - } - - return EnumAltarTier.ONE; - } - - public static boolean checkAltarIsValid(World world, BlockPos worldPos, int altarTier) - { - for (AltarComponent altarComponent : EnumAltarTier.values()[altarTier].getAltarComponents()) - { - BlockPos componentPos = worldPos.add(altarComponent.getOffset()); - IBlockState state = world.getBlockState(componentPos); - - if (altarComponent.getComponent() == EnumAltarComponent.NOTAIR && world.isAirBlock(componentPos)) - return false; - - if (state.getBlock() instanceof IAltarComponent) { - EnumAltarComponent component = ((IAltarComponent) state.getBlock()).getType(world, state, componentPos); - if (component == null || component != altarComponent.getComponent()) - return false; - } - - EnumAltarComponent component = BloodMagicAPI.INSTANCE.getAltarComponents().get(state); - if (component == null || component != altarComponent.getComponent()) - return false; - } - - return true; - } - - public static Pair getAltarMissingBlock(World world, BlockPos worldPos, int altarTier) - { - if (altarTier >= EnumAltarTier.MAXTIERS) - { - return null; - } - - for (AltarComponent altarComponent : EnumAltarTier.values()[altarTier].getAltarComponents()) - { - BlockPos componentPos = worldPos.add(altarComponent.getOffset()); - BlockStack worldBlock = new BlockStack(world.getBlockState(componentPos).getBlock(), world.getBlockState(componentPos).getBlock().getMetaFromState(world.getBlockState(componentPos))); - - if (altarComponent.getComponent() != EnumAltarComponent.NOTAIR) - { - if (worldBlock.getBlock() instanceof IAltarComponent) - { - EnumAltarComponent component = ((IAltarComponent) worldBlock.getBlock()).getType(world, worldBlock.getState(), componentPos); - if (component == null || component != altarComponent.getComponent()) - { - return Pair.of(componentPos, altarComponent.getComponent()); - } - } else if (worldBlock.getBlock() != Utils.getBlockForComponent(altarComponent.getComponent())) - { - return new ImmutablePair(componentPos, altarComponent.getComponent()); - } - } else - { - if (world.isAirBlock(componentPos)) - { - return Pair.of(componentPos, altarComponent.getComponent()); - } - } - } - - return null; - } - - public static AltarUpgrade getUpgrades(World world, BlockPos pos, EnumAltarTier altarTier) - { - if (world.isRemote) - { - return null; - } - - AltarUpgrade upgrades = new AltarUpgrade(); - List list = altarTier.getAltarComponents(); - - for (AltarComponent altarComponent : list) - { - BlockPos componentPos = pos.add(altarComponent.getOffset()); - - if (altarComponent.isUpgradeSlot()) - { - BlockStack worldBlock = new BlockStack(world.getBlockState(componentPos).getBlock(), world.getBlockState(componentPos).getBlock().getMetaFromState(world.getBlockState(componentPos))); - - if (worldBlock.getBlock() instanceof BlockBloodRune) - { - switch (((BlockBloodRune) worldBlock.getBlock()).getRuneEffect(worldBlock.getMeta())) - { - case 1: - upgrades.addSpeed(); - break; - - case 2: - upgrades.addEfficiency(); - break; - - case 3: - upgrades.addSacrifice(); - break; - - case 4: - upgrades.addSelfSacrifice(); - break; - - case 5: - upgrades.addDisplacement(); - break; - - case 6: - upgrades.addCapacity(); - break; - - case 7: - upgrades.addBetterCapacity(); - break; - - case 8: - upgrades.addOrbCapacity(); - break; - - case 9: - upgrades.addAcceleration(); - break; - - case 10: - upgrades.addCharging(); - break; - } - } - } - } - - return upgrades; - } - - public void readFromNBT(NBTTagCompound tagCompound) - { - if (!tagCompound.hasKey(Constants.NBT.EMPTY)) - { + public void readFromNBT(NBTTagCompound tagCompound) { + if (!tagCompound.hasKey(Constants.NBT.EMPTY)) { FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagCompound); if (fluid != null) @@ -290,8 +130,7 @@ public class BloodAltar implements IFluidHandler currentTierDisplayed = Enums.getIfPresent(EnumAltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(EnumAltarTier.ONE); } - public void writeToNBT(NBTTagCompound tagCompound) - { + public void writeToNBT(NBTTagCompound tagCompound) { if (fluid != null) fluid.writeToNBT(tagCompound); @@ -334,8 +173,7 @@ public class BloodAltar implements IFluidHandler tagCompound.setString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED, currentTierDisplayed.name()); } - public void startCycle() - { + public void startCycle() { if (tileAltar.getWorld() != null) tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); @@ -349,14 +187,11 @@ public class BloodAltar implements IFluidHandler ItemStack input = tileAltar.getStackInSlot(0); - if (!input.isEmpty()) - { + if (!input.isEmpty()) { // Do recipes AltarRecipe recipe = AltarRecipeRegistry.getRecipeForInput(input); - if (recipe != null) - { - if (recipe.doesRequiredItemMatch(input, altarTier)) - { + if (recipe != null) { + if (recipe.doesRequiredItemMatch(input, altarTier)) { this.isActive = true; this.recipe = recipe; this.result = recipe.getOutput().isEmpty() ? ItemStack.EMPTY : new ItemStack(recipe.getOutput().getItem(), 1, recipe.getOutput().getMetadata()); @@ -372,8 +207,7 @@ public class BloodAltar implements IFluidHandler isActive = false; } - public void update() - { + public void update() { World world = tileAltar.getWorld(); BlockPos pos = tileAltar.getPos(); @@ -386,17 +220,14 @@ public class BloodAltar implements IFluidHandler if (lockdownDuration > 0) lockdownDuration--; - if (internalCounter % 20 == 0) - { - for (EnumFacing facing : EnumFacing.VALUES) - { + if (internalCounter % 20 == 0) { + for (EnumFacing facing : EnumFacing.VALUES) { BlockPos newPos = pos.offset(facing); IBlockState block = world.getBlockState(newPos); block.getBlock().onNeighborChange(world, newPos, pos); } } - if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) - { + if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) { int syphonMax = (int) (20 * this.dislocationMultiplier); int fluidInputted; int fluidOutputted; @@ -411,8 +242,7 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) - { + if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) { int chargeInputted = Math.min(chargingRate, this.fluid.amount); chargeInputted = Math.min(chargeInputted, maxCharge - totalCharge); totalCharge += chargeInputted; @@ -426,10 +256,8 @@ public class BloodAltar implements IFluidHandler updateAltar(); } - private void updateAltar() - { - if (!isActive) - { + private void updateAltar() { + if (!isActive) { if (cooldownAfterCrafting > 0) cooldownAfterCrafting--; return; @@ -446,13 +274,11 @@ public class BloodAltar implements IFluidHandler if (world.isRemote) return; - if (!canBeFilled) - { + if (!canBeFilled) { boolean hasOperated = false; int stackSize = input.getCount(); - if (totalCharge > 0) - { + if (totalCharge > 0) { int chargeDrained = Math.min(liquidRequired * stackSize - progress, totalCharge); totalCharge -= chargeDrained; @@ -460,8 +286,7 @@ public class BloodAltar implements IFluidHandler hasOperated = true; } - if (fluid != null && fluid.amount >= 1) - { + 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)) @@ -472,27 +297,22 @@ public class BloodAltar implements IFluidHandler hasOperated = true; - if (internalCounter % 4 == 0 && world instanceof WorldServer) - { + if (internalCounter % 4 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) 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) - { + } else if (!hasOperated && progress > 0) { progress -= (int) (efficiencyMultiplier * drainRate); - if (internalCounter % 2 == 0 && world instanceof WorldServer) - { + if (internalCounter % 2 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) 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) - { + if (hasOperated) { + if (progress >= liquidRequired * stackSize) { ItemStack result = this.result; if (!result.isEmpty()) @@ -502,8 +322,7 @@ public class BloodAltar implements IFluidHandler tileAltar.setInventorySlotContents(0, result); progress = 0; - if (world instanceof WorldServer) - { + if (world instanceof WorldServer) { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 40, 0.3, 0, 0.3, 0); } @@ -512,8 +331,7 @@ public class BloodAltar implements IFluidHandler this.isActive = false; } } - } else - { + } else { ItemStack returnedItem = tileAltar.getStackInSlot(0); if (returnedItem.isEmpty() || !(returnedItem.getItem() instanceof IBloodOrb)) @@ -530,16 +348,14 @@ public class BloodAltar implements IFluidHandler if (Strings.isNullOrEmpty(ownerUUID)) return; - if (fluid != null && fluid.amount >= 1) - { + if (fluid != null && fluid.amount >= 1) { int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 ? consumptionRate * (1 + consumptionMultiplier) : consumptionRate), fluid.amount); BloodOrb orb = item.getOrb(returnedItem); int drain = orb == null ? 0 : NetworkHelper.getSoulNetwork(ownerUUID).add(liquidDrained, (int) (orb.getCapacity() * this.orbCapacityMultiplier)); fluid.amount = fluid.amount - drain; - if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) - { + if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.SPELL_WITCH, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0, 0, 0, 0.001); } @@ -549,8 +365,7 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - public void checkTier() - { + public void checkTier() { EnumAltarTier tier = BloodAltar.getAltarTier(tileAltar.getWorld(), tileAltar.getPos()); this.altarTier = tier; @@ -559,8 +374,7 @@ public class BloodAltar implements IFluidHandler if (tier.equals(currentTierDisplayed)) currentTierDisplayed = EnumAltarTier.ONE; - if (tier.equals(EnumAltarTier.ONE)) - { + if (tier.equals(EnumAltarTier.ONE)) { upgrade = null; isUpgraded = false; this.consumptionMultiplier = 0; @@ -576,8 +390,7 @@ public class BloodAltar implements IFluidHandler this.maxCharge = 0; this.totalCharge = 0; return; - } else if (!tier.equals(EnumAltarTier.ONE) && upgrade != null) - { + } else if (!tier.equals(EnumAltarTier.ONE) && upgrade != null) { this.isUpgraded = true; this.accelerationUpgrades = upgrade.getAccelerationCount(); this.consumptionMultiplier = (float) (0.20 * upgrade.getSpeedCount()); @@ -607,128 +420,103 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - public int fillMainTank(int amount) - { + 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) - { + 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 - { + } else { fluid.amount += Math.min(capacity - fluid.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount); } } - public void setMainFluid(FluidStack fluid) - { + public void setMainFluid(FluidStack fluid) { this.fluid = fluid; } - public void setOutputFluid(FluidStack fluid) - { + public void setOutputFluid(FluidStack fluid) { this.fluidOutput = fluid; } - public void setInputFluid(FluidStack fluid) - { + public void setInputFluid(FluidStack fluid) { this.fluidInput = fluid; } - public AltarUpgrade getUpgrade() - { + public AltarUpgrade getUpgrade() { return upgrade; } - public void setUpgrade(AltarUpgrade upgrade) - { + public void setUpgrade(AltarUpgrade upgrade) { this.upgrade = upgrade; } - public int getCapacity() - { + public int getCapacity() { return capacity; } - public FluidStack getFluid() - { + public FluidStack getFluid() { return fluid; } - public int getFluidAmount() - { + public int getFluidAmount() { return fluid.amount; } - public int getCurrentBlood() - { + public int getCurrentBlood() { return getFluidAmount(); } - public EnumAltarTier getTier() - { + public EnumAltarTier getTier() { return altarTier; } - public void setTier(EnumAltarTier tier) - { + public void setTier(EnumAltarTier tier) { this.altarTier = tier; } - public int getProgress() - { + public int getProgress() { return progress; } - public float getSacrificeMultiplier() - { + public float getSacrificeMultiplier() { return sacrificeEfficiencyMultiplier; } - public float getSelfSacrificeMultiplier() - { + public float getSelfSacrificeMultiplier() { return selfSacrificeEfficiencyMultiplier; } - public float getOrbMultiplier() - { + public float getOrbMultiplier() { return orbCapacityMultiplier; } - public float getDislocationMultiplier() - { + public float getDislocationMultiplier() { return dislocationMultiplier; } - public float getConsumptionMultiplier() - { + public float getConsumptionMultiplier() { return consumptionMultiplier; } - public float getConsumptionRate() - { + public float getConsumptionRate() { return consumptionRate; } - public int getLiquidRequired() - { + public int getLiquidRequired() { return liquidRequired; } - public int getBufferCapacity() - { + public int getBufferCapacity() { return bufferCapacity; } - public boolean setCurrentTierDisplayed(EnumAltarTier altarTier) - { + public boolean setCurrentTierDisplayed(EnumAltarTier altarTier) { if (currentTierDisplayed == altarTier) return false; else @@ -736,99 +524,79 @@ public class BloodAltar implements IFluidHandler return true; } - public void addToDemonBloodDuration(int dur) - { + public void addToDemonBloodDuration(int dur) { this.demonBloodDuration += dur; } - public boolean hasDemonBlood() - { + public boolean hasDemonBlood() { return this.demonBloodDuration > 0; } - public void decrementDemonBlood() - { + public void decrementDemonBlood() { this.demonBloodDuration = Math.max(0, this.demonBloodDuration - 1); } - public void setActive() - { - if (tileAltar.getStackInSlot(0).isEmpty()) - { + public void setActive() { + if (tileAltar.getStackInSlot(0).isEmpty()) { isActive = false; } } - public boolean isActive() - { + public boolean isActive() { return isActive; } - public void requestPauseAfterCrafting(int amount) - { - if (this.isActive) - { + public void requestPauseAfterCrafting(int amount) { + if (this.isActive) { this.cooldownAfterCrafting = amount; } } - public int getChargingRate() - { + public int getChargingRate() { return chargingRate; } - public int getTotalCharge() - { + public int getTotalCharge() { return totalCharge; } - public int getChargingFrequency() - { + public int getChargingFrequency() { return chargingFrequency == 0 ? 1 : chargingFrequency; } @Override - public int fill(FluidStack resource, boolean doFill) - { - if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) - { + public int fill(FluidStack resource, boolean doFill) { + if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) { return 0; } - if (!doFill) - { - if (fluidInput == null) - { + if (!doFill) { + if (fluidInput == null) { return Math.min(bufferCapacity, resource.amount); } - if (!fluidInput.isFluidEqual(resource)) - { + if (!fluidInput.isFluidEqual(resource)) { return 0; } return Math.min(bufferCapacity - fluidInput.amount, resource.amount); } - if (fluidInput == null) - { + if (fluidInput == null) { fluidInput = new FluidStack(resource, Math.min(bufferCapacity, resource.amount)); return fluidInput.amount; } - if (!fluidInput.isFluidEqual(resource)) - { + if (!fluidInput.isFluidEqual(resource)) { return 0; } int filled = bufferCapacity - fluidInput.amount; - if (resource.amount < filled) - { + if (resource.amount < filled) { fluidInput.amount += resource.amount; filled = resource.amount; - } else - { + } else { fluidInput.amount = bufferCapacity; } @@ -836,44 +604,160 @@ public class BloodAltar implements IFluidHandler } @Override - public FluidStack drain(FluidStack resource, boolean doDrain) - { - if (resource == null || !resource.isFluidEqual(fluidOutput)) - { + 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) - { + public FluidStack drain(int maxDrain, boolean doDrain) { + if (fluidOutput == null) { return null; } int drained = maxDrain; - if (fluidOutput.amount < drained) - { + if (fluidOutput.amount < drained) { drained = fluidOutput.amount; } FluidStack stack = new FluidStack(fluidOutput, drained); - if (doDrain) - { + if (doDrain) { fluidOutput.amount -= drained; } return stack; } @Override - public IFluidTankProperties[] getTankProperties() - { - return new IFluidTankProperties[] { new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity)) }; + public IFluidTankProperties[] getTankProperties() { + return new IFluidTankProperties[]{new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity))}; } public EnumAltarTier getCurrentTierDisplayed() { return currentTierDisplayed; } + + public static EnumAltarTier getAltarTier(World world, BlockPos pos) { + for (int i = EnumAltarTier.MAXTIERS - 1; i >= 1; i--) { + if (checkAltarIsValid(world, pos, i)) { + return EnumAltarTier.values()[i]; + } + } + + return EnumAltarTier.ONE; + } + + public static boolean checkAltarIsValid(World world, BlockPos worldPos, int altarTier) { + for (AltarComponent altarComponent : EnumAltarTier.values()[altarTier].getAltarComponents()) { + BlockPos componentPos = worldPos.add(altarComponent.getOffset()); + IBlockState state = world.getBlockState(componentPos); + + if (altarComponent.getComponent() == EnumAltarComponent.NOTAIR && world.isAirBlock(componentPos)) + return false; + + if (state.getBlock() instanceof IAltarComponent) { + EnumAltarComponent component = ((IAltarComponent) state.getBlock()).getType(world, state, componentPos); + if (component == null || component != altarComponent.getComponent()) + return false; + } + + EnumAltarComponent component = BloodMagicAPI.INSTANCE.getAltarComponents().get(state); + if (component == null || component != altarComponent.getComponent()) + return false; + } + + return true; + } + + public static Pair getAltarMissingBlock(World world, BlockPos worldPos, int altarTier) { + if (altarTier >= EnumAltarTier.MAXTIERS) { + return null; + } + + for (AltarComponent altarComponent : EnumAltarTier.values()[altarTier].getAltarComponents()) { + BlockPos componentPos = worldPos.add(altarComponent.getOffset()); + BlockStack worldBlock = new BlockStack(world.getBlockState(componentPos).getBlock(), world.getBlockState(componentPos).getBlock().getMetaFromState(world.getBlockState(componentPos))); + + if (altarComponent.getComponent() != EnumAltarComponent.NOTAIR) { + if (worldBlock.getBlock() instanceof IAltarComponent) { + EnumAltarComponent component = ((IAltarComponent) worldBlock.getBlock()).getType(world, worldBlock.getState(), componentPos); + if (component == null || component != altarComponent.getComponent()) { + return Pair.of(componentPos, altarComponent.getComponent()); + } + } else if (worldBlock.getBlock() != Utils.getBlockForComponent(altarComponent.getComponent())) { + return new ImmutablePair(componentPos, altarComponent.getComponent()); + } + } else { + if (world.isAirBlock(componentPos)) { + return Pair.of(componentPos, altarComponent.getComponent()); + } + } + } + + return null; + } + + public static AltarUpgrade getUpgrades(World world, BlockPos pos, EnumAltarTier altarTier) { + if (world.isRemote) { + return null; + } + + AltarUpgrade upgrades = new AltarUpgrade(); + List list = altarTier.getAltarComponents(); + + for (AltarComponent altarComponent : list) { + BlockPos componentPos = pos.add(altarComponent.getOffset()); + + if (altarComponent.isUpgradeSlot()) { + BlockStack worldBlock = new BlockStack(world.getBlockState(componentPos).getBlock(), world.getBlockState(componentPos).getBlock().getMetaFromState(world.getBlockState(componentPos))); + + if (worldBlock.getBlock() instanceof BlockBloodRune) { + switch (((BlockBloodRune) worldBlock.getBlock()).getRuneEffect(worldBlock.getMeta())) { + case 1: + upgrades.addSpeed(); + break; + + case 2: + upgrades.addEfficiency(); + break; + + case 3: + upgrades.addSacrifice(); + break; + + case 4: + upgrades.addSelfSacrifice(); + break; + + case 5: + upgrades.addDisplacement(); + break; + + case 6: + upgrades.addCapacity(); + break; + + case 7: + upgrades.addBetterCapacity(); + break; + + case 8: + upgrades.addOrbCapacity(); + break; + + case 9: + upgrades.addAcceleration(); + break; + + case 10: + upgrades.addCharging(); + break; + } + } + } + } + + return upgrades; + } } diff --git a/src/main/java/WayofTime/bloodmagic/annot/Handler.java b/src/main/java/WayofTime/bloodmagic/annot/Handler.java index 7ac96732..0e972824 100644 --- a/src/main/java/WayofTime/bloodmagic/annot/Handler.java +++ b/src/main/java/WayofTime/bloodmagic/annot/Handler.java @@ -11,6 +11,5 @@ import java.lang.annotation.Target; */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -public @interface Handler -{ +public @interface Handler { } diff --git a/src/main/java/WayofTime/bloodmagic/api/BlockStack.java b/src/main/java/WayofTime/bloodmagic/api/BlockStack.java index 264f348b..72752c81 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BlockStack.java +++ b/src/main/java/WayofTime/bloodmagic/api/BlockStack.java @@ -6,32 +6,22 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class BlockStack -{ +public class BlockStack { private final Block block; private final int meta; private final IBlockState state; - public BlockStack(Block block, int meta) - { + public BlockStack(Block block, int meta) { this.block = block; this.meta = meta; this.state = block.getStateFromMeta(meta); } - public BlockStack(Block block) - { + public BlockStack(Block block) { this(block, 0); } - public static BlockStack getStackFromPos(World world, BlockPos pos) - { - IBlockState state = world.getBlockState(pos); - return new BlockStack(state.getBlock(), state.getBlock().getMetaFromState(state)); - } - - public ItemStack getItemStack() - { + public ItemStack getItemStack() { return new ItemStack(block, 1, meta); } @@ -66,8 +56,12 @@ public class BlockStack } @Override - public String toString() - { + public String toString() { return getBlock().getRegistryName() + ":" + getMeta(); } + + public static BlockStack getStackFromPos(World world, BlockPos pos) { + IBlockState state = world.getBlockState(pos); + return new BlockStack(state.getBlock(), state.getBlock().getMetaFromState(state)); + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java index 01b09f14..e69115f3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java @@ -5,12 +5,11 @@ import net.minecraft.util.DamageSource; /** * The primary API class. Includes helper methods and blacklists. - * + *

        * Some API methods can be used via IMC instead. The supported methods are: */ // TODO - Nuke this class -public class BloodMagicAPI -{ +public class BloodMagicAPI { public static boolean loggingEnabled; public static LogHelper logger = new LogHelper("BloodMagic|API"); diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 92f8b7a6..4ead21b0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -1,16 +1,14 @@ package WayofTime.bloodmagic.api; -import java.util.Locale; - import WayofTime.bloodmagic.BloodMagic; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; -public class Constants -{ - public static class NBT - { +import java.util.Locale; + +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"; @@ -129,13 +127,11 @@ public class Constants public static final String TANK = "tank"; } - public static class Mod - { + public static class Mod { public static final String DOMAIN = BloodMagic.MODID.toLowerCase(Locale.ENGLISH) + ":"; } - public static final class Gui - { + 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; @@ -144,8 +140,7 @@ public class Constants public static final int SIGIL_HOLDING_GUI = 5; } - public static class Compat - { + 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"; @@ -163,8 +158,7 @@ public class Constants public static final Item THAUMCRAFT_GOGGLES = ForgeRegistries.ITEMS.getValue(new ResourceLocation("Thaumcraft", "goggles")); } - public static class Misc - { + 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 = 30002; diff --git a/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java b/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java index 6cd4140c..d9747ad3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java @@ -6,10 +6,8 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; -public class DamageSourceBloodMagic extends DamageSource -{ - public DamageSourceBloodMagic() - { +public class DamageSourceBloodMagic extends DamageSource { + public DamageSourceBloodMagic() { super("bloodMagic"); setDamageBypassesArmor(); @@ -17,8 +15,7 @@ public class DamageSourceBloodMagic extends DamageSource } @Override - public ITextComponent getDeathMessage(EntityLivingBase livingBase) - { + public ITextComponent getDeathMessage(EntityLivingBase livingBase) { return new TextComponentString(TextHelper.localizeEffect("chat.bloodmagic.damageSource", livingBase.getName())); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java index fc1258d3..d0949cbe 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java @@ -9,8 +9,7 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -public class ItemStackWrapper -{ +public class ItemStackWrapper { public final Item item; public final int stackSize; public final int meta; @@ -22,88 +21,49 @@ public class ItemStackWrapper this.meta = meta; } - public ItemStackWrapper(Item item, int stackSize) - { + public ItemStackWrapper(Item item, int stackSize) { this(item, stackSize, 0); } - public ItemStackWrapper(Item item) - { + public ItemStackWrapper(Item item) { this(item, 1, 0); } - public ItemStackWrapper(Block block, int stackSize, int meta) - { + public ItemStackWrapper(Block block, int stackSize, int meta) { this(Item.getItemFromBlock(block), stackSize, meta); } - public ItemStackWrapper(Block block, int stackSize) - { + public ItemStackWrapper(Block block, int stackSize) { this(block, stackSize, 0); } - public ItemStackWrapper(Block block) - { + public ItemStackWrapper(Block block) { this(block, 1, 0); } - public ItemStackWrapper(BlockStack blockStack) - { + public ItemStackWrapper(BlockStack blockStack) { this(blockStack.getBlock(), 1, blockStack.getMeta()); } - @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 ItemStack toStack() - { + public ItemStack toStack() { return new ItemStack(item, stackSize, meta); } - public String getDisplayName() - { + public String getDisplayName() { return toStack().getDisplayName(); } @Override - public String toString() - { + public String toString() { return stackSize + "x" + item.getUnlocalizedName() + "@" + this.meta; } - public ItemStack toStack(int count) - { + public ItemStack toStack(int count) { ItemStack result = new ItemStack(item, count, meta); result.setTagCompound(nbtTag); return result; } - 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; - } - public Item getItem() { return item; } @@ -123,4 +83,30 @@ public class ItemStackWrapper public void setNbtTag(NBTTagCompound 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/api/alchemyCrafting/AlchemyArrayEffect.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java index 37946018..7455ca08 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java @@ -1,15 +1,14 @@ package WayofTime.bloodmagic.api.alchemyCrafting; +import WayofTime.bloodmagic.api.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; -public abstract class AlchemyArrayEffect -{ +public abstract class AlchemyArrayEffect { public final String key; public AlchemyArrayEffect(String key) { @@ -24,8 +23,7 @@ public abstract class AlchemyArrayEffect public abstract AlchemyArrayEffect getNewCopy(); - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) - { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { } diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java index a3a17109..a15da577 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java @@ -6,39 +6,32 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; -public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect { public final ItemStack outputStack; public int tickLimit; - public AlchemyArrayEffectCrafting(ItemStack outputStack) - { + public AlchemyArrayEffectCrafting(ItemStack outputStack) { this(outputStack, 200); } - public AlchemyArrayEffectCrafting(ItemStack outputStack, int tickLimit) - { + public AlchemyArrayEffectCrafting(ItemStack outputStack, int tickLimit) { this(outputStack.toString() + tickLimit, outputStack, tickLimit); } - public AlchemyArrayEffectCrafting(String key, ItemStack outputStack, int 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) - { + public boolean update(TileEntity tile, int ticksActive) { // TODO: Add recipe rechecking to verify nothing screwy is going on. - if (tile.getWorld().isRemote) - { + if (tile.getWorld().isRemote) { return false; } - if (ticksActive >= tickLimit) - { + if (ticksActive >= tickLimit) { BlockPos pos = tile.getPos(); ItemStack output = outputStack.copy(); @@ -54,20 +47,17 @@ public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectCrafting(key, outputStack, tickLimit); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java index 37dd53d0..f6276316 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.api.alchemyCrafting; +import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; @@ -8,73 +9,57 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class AlchemyCircleRenderer -{ - public float offsetFromFace = -0.9f; +public class AlchemyCircleRenderer { public final ResourceLocation arrayResource; + public float offsetFromFace = -0.9f; - public AlchemyCircleRenderer() - { + public AlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); } - public AlchemyCircleRenderer(ResourceLocation arrayResource) - { + public AlchemyCircleRenderer(ResourceLocation arrayResource) { this.arrayResource = arrayResource; } - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 2; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (float) Math.pow(craftTime - offset, 1.5); return modifier * 1f; } return 0; } - public float getSecondaryRotation(float craftTime) - { + public float getSecondaryRotation(float craftTime) { float offset = 50; - if (craftTime >= offset) - { + 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) - { + 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) - { + public float getVerticalOffset(float craftTime) { + if (craftTime >= 5) { + if (craftTime <= 40) { return (float) ((-0.4) * Math.pow((craftTime - 5) / 35f, 3)); - } else - { + } else { return -0.4f; } } return 0; } - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) - { - if (!(tile instanceof TileAlchemyArray)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -106,30 +91,29 @@ public class AlchemyCircleRenderer GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * 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; + 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(); diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java b/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java index 1ff69871..470097e1 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java @@ -5,8 +5,7 @@ import net.minecraft.util.math.BlockPos; /** * Used for building the altar structure. */ -public class AltarComponent -{ +public class AltarComponent { private BlockPos offset; private boolean upgradeSlot; @@ -14,14 +13,11 @@ public class AltarComponent /** * 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 + * + * @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, EnumAltarComponent component) - { + public AltarComponent(BlockPos offset, EnumAltarComponent component) { this.offset = offset; this.component = component; } @@ -29,22 +25,19 @@ public class AltarComponent /** * 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 + * + * @param offset - Where the block should be in relation to the Altar */ - public AltarComponent(BlockPos offset) - { + public AltarComponent(BlockPos offset) { this(offset, EnumAltarComponent.NOTAIR); } /** * Sets the location to an upgrade slot. - * + * * @return the current instance for further use. */ - public AltarComponent setUpgradeSlot() - { + public AltarComponent setUpgradeSlot() { this.upgradeSlot = true; return this; } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java b/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java index d8b73f87..c18801eb 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.api.altar; -public class AltarUpgrade -{ +public class AltarUpgrade { private int speedCount; private int efficiencyCount; private int sacrificeCount; @@ -31,62 +30,52 @@ public class AltarUpgrade // Adders - public AltarUpgrade addSpeed() - { + public AltarUpgrade addSpeed() { speedCount++; return this; } - public AltarUpgrade addEfficiency() - { + public AltarUpgrade addEfficiency() { efficiencyCount++; return this; } - public AltarUpgrade addSacrifice() - { + public AltarUpgrade addSacrifice() { sacrificeCount++; return this; } - public AltarUpgrade addSelfSacrifice() - { + public AltarUpgrade addSelfSacrifice() { selfSacrificeCount++; return this; } - public AltarUpgrade addDisplacement() - { + public AltarUpgrade addDisplacement() { displacementCount++; return this; } - public AltarUpgrade addCapacity() - { + public AltarUpgrade addCapacity() { capacityCount++; return this; } - public AltarUpgrade addOrbCapacity() - { + public AltarUpgrade addOrbCapacity() { orbCapacityCount++; return this; } - public AltarUpgrade addBetterCapacity() - { + public AltarUpgrade addBetterCapacity() { betterCapacityCount++; return this; } - public AltarUpgrade addAcceleration() - { + public AltarUpgrade addAcceleration() { accelerationCount++; return this; } - public AltarUpgrade addCharging() - { + public AltarUpgrade addCharging() { chargingCount++; return this; } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java index 2afd90e8..8443bc1a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java @@ -5,8 +5,7 @@ import java.util.Locale; /** * List of different components used to construct different tiers of altars. */ -public enum EnumAltarComponent -{ +public enum EnumAltarComponent { GLOWSTONE, BLOODSTONE, BEACON, @@ -18,8 +17,7 @@ public enum EnumAltarComponent private static final String BASE = "chat.bloodmagic.altar.comp."; private String key; - EnumAltarComponent() - { + EnumAltarComponent() { this.key = BASE + name().toLowerCase(Locale.ENGLISH); } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java index ba1ec6ac..16a4e7e1 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java @@ -5,13 +5,10 @@ import net.minecraft.util.math.BlockPos; import java.util.ArrayList; //@formatter:off -public enum EnumAltarTier -{ - ONE(), TWO() - { +public enum EnumAltarTier { + ONE(), TWO() { @Override - public void buildComponents() - { + public void buildComponents() { altarComponents.add(new AltarComponent(new BlockPos(-1, -1, -1), EnumAltarComponent.BLOODRUNE)); altarComponents.add(new AltarComponent(new BlockPos(0, -1, -1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(1, -1, -1), EnumAltarComponent.BLOODRUNE)); @@ -22,11 +19,9 @@ public enum EnumAltarTier altarComponents.add(new AltarComponent(new BlockPos(1, -1, 1), EnumAltarComponent.BLOODRUNE)); } }, - THREE() - { + THREE() { @Override - public void buildComponents() - { + public void buildComponents() { altarComponents.add(new AltarComponent(new BlockPos(-1, -1, -1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(0, -1, -1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(1, -1, -1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); @@ -48,8 +43,7 @@ public enum EnumAltarTier altarComponents.add(new AltarComponent(new BlockPos(-3, 1, 3), EnumAltarComponent.GLOWSTONE)); altarComponents.add(new AltarComponent(new BlockPos(3, 1, 3), EnumAltarComponent.GLOWSTONE)); - for (int i = -2; i <= 2; i++) - { + for (int i = -2; i <= 2; i++) { altarComponents.add(new AltarComponent(new BlockPos(3, -2, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(-3, -2, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(i, -2, 3), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); @@ -57,23 +51,19 @@ public enum EnumAltarTier } } }, - FOUR() - { + FOUR() { @Override - public void buildComponents() - { + public void buildComponents() { altarComponents.addAll(THREE.getAltarComponents()); - for (int i = -3; i <= 3; i++) - { + for (int i = -3; i <= 3; i++) { altarComponents.add(new AltarComponent(new BlockPos(5, -3, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(-5, -3, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(i, -3, 5), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(i, -3, -5), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); } - for (int i = -2; i <= 1; i++) - { + for (int i = -2; i <= 1; i++) { altarComponents.add(new AltarComponent(new BlockPos(5, i, 5))); altarComponents.add(new AltarComponent(new BlockPos(5, i, -5))); altarComponents.add(new AltarComponent(new BlockPos(-5, i, -5))); @@ -86,19 +76,16 @@ public enum EnumAltarTier altarComponents.add(new AltarComponent(new BlockPos(-5, 2, 5), EnumAltarComponent.BLOODSTONE)); } }, - FIVE() - { + FIVE() { @Override - public void buildComponents() - { + public void buildComponents() { altarComponents.addAll(FOUR.getAltarComponents()); altarComponents.add(new AltarComponent(new BlockPos(-8, -3, 8), EnumAltarComponent.BEACON)); altarComponents.add(new AltarComponent(new BlockPos(-8, -3, -8), EnumAltarComponent.BEACON)); altarComponents.add(new AltarComponent(new BlockPos(8, -3, -8), EnumAltarComponent.BEACON)); altarComponents.add(new AltarComponent(new BlockPos(8, -3, 8), EnumAltarComponent.BEACON)); - for (int i = -6; i <= 6; i++) - { + for (int i = -6; i <= 6; i++) { altarComponents.add(new AltarComponent(new BlockPos(8, -4, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(-8, -4, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(i, -4, 8), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); @@ -106,15 +93,12 @@ public enum EnumAltarTier } } }, - SIX() - { + SIX() { @Override - public void buildComponents() - { + public void buildComponents() { altarComponents.addAll(FIVE.getAltarComponents()); - for (int i = -4; i <= 2; i++) - { + for (int i = -4; i <= 2; i++) { altarComponents.add(new AltarComponent(new BlockPos(11, i, 11))); altarComponents.add(new AltarComponent(new BlockPos(-11, i, -11))); altarComponents.add(new AltarComponent(new BlockPos(11, i, -11))); @@ -126,8 +110,7 @@ public enum EnumAltarTier altarComponents.add(new AltarComponent(new BlockPos(11, 3, -11), EnumAltarComponent.CRYSTAL)); altarComponents.add(new AltarComponent(new BlockPos(-11, 3, 11), EnumAltarComponent.CRYSTAL)); - for (int i = -9; i <= 9; i++) - { + for (int i = -9; i <= 9; i++) { altarComponents.add(new AltarComponent(new BlockPos(11, -5, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(-11, -5, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(i, -5, 11), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); @@ -141,13 +124,11 @@ public enum EnumAltarTier ArrayList altarComponents = new ArrayList(); - public void buildComponents() - { + public void buildComponents() { } - public int toInt() - { + public int toInt() { return ordinal() + 1; } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/IAltarComponent.java b/src/main/java/WayofTime/bloodmagic/api/altar/IAltarComponent.java index 9e711b00..52d1d763 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/IAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/IAltarComponent.java @@ -6,8 +6,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; -public interface IAltarComponent -{ +public interface IAltarComponent { @Nullable EnumAltarComponent getType(World world, IBlockState state, BlockPos pos); } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/IAltarManipulator.java b/src/main/java/WayofTime/bloodmagic/api/altar/IAltarManipulator.java index 1c846da3..57509bc0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/IAltarManipulator.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/IAltarManipulator.java @@ -4,6 +4,5 @@ package WayofTime.bloodmagic.api.altar; * Any item that implements this interface will not be pulled into the Altar on * right click. */ -public interface IAltarManipulator -{ +public interface IAltarManipulator { } diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/IBloodAltar.java b/src/main/java/WayofTime/bloodmagic/api/altar/IBloodAltar.java index 49749d85..843d2a0e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/IBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/api/altar/IBloodAltar.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.api.altar; -public interface IBloodAltar -{ +public interface IBloodAltar { int getCapacity(); int getCurrentBlood(); @@ -48,9 +47,8 @@ public interface IBloodAltar * 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 + * + * @param cooldown - How long the cooldown should last */ void requestPauseAfterCrafting(int cooldown); } diff --git a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionHandler.java b/src/main/java/WayofTime/bloodmagic/api/compress/CompressionHandler.java index 2e54883d..22a8fe9e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/compress/CompressionHandler.java @@ -3,14 +3,12 @@ package WayofTime.bloodmagic.api.compress; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public abstract class CompressionHandler -{ +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 + * + * @param inv The inventory iterated through * @return The result of the compression */ public abstract ItemStack compressInventory(ItemStack[] inv, World world); diff --git a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java b/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java index c7c708fb..7fc1bbae 100644 --- a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java @@ -1,54 +1,44 @@ package WayofTime.bloodmagic.api.compress; +import WayofTime.bloodmagic.util.Utils; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +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; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; - -import org.apache.commons.lang3.tuple.Pair; - -import WayofTime.bloodmagic.util.Utils; - /** * A registry aimed to help compress items in an inventory into its compressible * form. */ -public class CompressionRegistry -{ +public class CompressionRegistry { public static List compressionRegistry = new ArrayList(); public static Map thresholdMap = new HashMap(); - public static void registerHandler(CompressionHandler handler) - { + 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 + * + * @param stack item/block to be compressed + * @param threshold amount that is to be compressed */ - public static void registerItemThreshold(ItemStack stack, int threshold) - { + public static void registerItemThreshold(ItemStack stack, int threshold) { thresholdMap.put(stack, threshold); } - public static ItemStack compressInventory(ItemStack[] inv, World world) - { - for (CompressionHandler handler : compressionRegistry) - { + public static ItemStack compressInventory(ItemStack[] inv, World world) { + for (CompressionHandler handler : compressionRegistry) { ItemStack stack = handler.compressInventory(inv, world); - if (stack != null) - { + if (stack != null) { return stack; } } @@ -56,32 +46,24 @@ public class CompressionRegistry return null; } - public static Pair compressInventory(TileEntity tile, World world) - { - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, 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++) - { + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { inventory[slot] = itemHandler.extractItem(slot, 64, true); copyInventory[slot] = inventory[slot].copy(); } - for (CompressionHandler handler : compressionRegistry) - { + 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])) - { + 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) - { + if (copyInventory[slot] != null) { itemHandler.insertItem(slot, copyInventory[slot], false); } } @@ -95,12 +77,9 @@ public class CompressionRegistry return Pair.of(ItemStack.EMPTY, false); } - public static int getItemThreshold(ItemStack stack) - { - for (Map.Entry entry : thresholdMap.entrySet()) - { - if (areItemStacksEqual(entry.getKey(), stack)) - { + public static int getItemThreshold(ItemStack stack) { + for (Map.Entry entry : thresholdMap.entrySet()) { + if (areItemStacksEqual(entry.getKey(), stack)) { return entry.getValue(); } } @@ -108,8 +87,7 @@ public class CompressionRegistry return 0; } - public static boolean areItemStacksEqual(ItemStack stack, ItemStack compressedStack) - { + public static boolean areItemStacksEqual(ItemStack stack, ItemStack compressedStack) { return stack.isItemEqual(compressedStack) && (stack.getTagCompound() == null ? !compressedStack.hasTagCompound() : stack.getTagCompound().equals(compressedStack.getTagCompound())); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/event/AddToNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/AddToNetworkEvent.java index cc47880d..ddd5c637 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/AddToNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/AddToNetworkEvent.java @@ -4,8 +4,7 @@ import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; @Cancelable -public class AddToNetworkEvent extends Event -{ +public class AddToNetworkEvent extends Event { public final String ownerNetwork; public int addedAmount; public int maximum; @@ -14,16 +13,12 @@ public class AddToNetworkEvent extends Event * 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 + * + * @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) - { + 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/api/event/AltarCraftedEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java index 11891289..f20d0ec7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java @@ -6,23 +6,19 @@ 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 -{ +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 + * @param altarRecipe - The recipe that was crafted. + * @param output - The item obtained from the recipe */ - public AltarCraftedEvent(AltarRecipeRegistry.AltarRecipe altarRecipe, ItemStack output) - { + public AltarCraftedEvent(AltarRecipeRegistry.AltarRecipe altarRecipe, ItemStack output) { this.altarRecipe = altarRecipe; this.output = output; } diff --git a/src/main/java/WayofTime/bloodmagic/api/event/BoundToolEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/BoundToolEvent.java index deecdc44..ab2de72a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/BoundToolEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/BoundToolEvent.java @@ -5,29 +5,25 @@ 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 class BoundToolEvent extends Event { public EntityPlayer player; - public BoundToolEvent(EntityPlayer player) - { + public BoundToolEvent(EntityPlayer 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 static class Charge extends BoundToolEvent { public ItemStack result; - public Charge(EntityPlayer player, ItemStack result) - { + public Charge(EntityPlayer player, ItemStack result) { super(player); this.result = result; } @@ -36,18 +32,16 @@ public class BoundToolEvent extends Event /** * 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 static class Release extends BoundToolEvent { public final ItemStack boundTool; public int charge; - public Release(EntityPlayer player, ItemStack boundTool, int charge) - { + public Release(EntityPlayer player, ItemStack boundTool, int charge) { super(player); this.boundTool = boundTool; this.charge = charge; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/ItemBindEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/ItemBindEvent.java index 10b657ba..03348e02 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/ItemBindEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/ItemBindEvent.java @@ -6,8 +6,7 @@ import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; @Cancelable -public class ItemBindEvent extends Event -{ +public class ItemBindEvent extends Event { public final EntityPlayer player; public String key; public ItemStack itemStack; @@ -15,18 +14,14 @@ public class ItemBindEvent extends Event /** * This event is called whenever a player attempts to bind a * {@link WayofTime.bloodmagic.api.iface.IBindable} item. - * - * @param player - * The player doing the binding - * @param key - * The UUID of the player doing the binding - * @param itemStack - * The {@link ItemStack} that the player is binding - * - * This event is {@link Cancelable}.
        + * + * @param player The player doing the binding + * @param key The UUID of the player doing the binding + * @param itemStack The {@link ItemStack} that the player is binding + *

        + * This event is {@link Cancelable}.
        */ - public ItemBindEvent(EntityPlayer player, String key, ItemStack itemStack) - { + public ItemBindEvent(EntityPlayer player, String key, ItemStack itemStack) { super(); this.player = player; this.key = key; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/RitualEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/RitualEvent.java index 45813ab6..9036f4cb 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/RitualEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/RitualEvent.java @@ -10,14 +10,12 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; -public class RitualEvent extends Event -{ +public class RitualEvent extends Event { public final IMasterRitualStone mrs; public final String ownerName; public final Ritual ritual; - private RitualEvent(IMasterRitualStone mrs, String ownerName, Ritual ritual) - { + private RitualEvent(IMasterRitualStone mrs, String ownerName, Ritual ritual) { this.mrs = mrs; this.ownerName = ownerName; this.ritual = ritual; @@ -26,18 +24,16 @@ public class RitualEvent extends Event /** * This event is called when a ritual is activated. If cancelled, it will * not activate. - * + *

        * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#activateRitual(ItemStack, EntityPlayer, Ritual)} */ @Cancelable - public static class RitualActivatedEvent extends RitualEvent - { + public static class RitualActivatedEvent extends RitualEvent { public final EntityPlayer player; public final ItemStack crystalStack; public int crystalTier; - public RitualActivatedEvent(IMasterRitualStone mrs, String owner, Ritual ritual, EntityPlayer player, ItemStack activationCrystal, int crystalTier) - { + public RitualActivatedEvent(IMasterRitualStone mrs, String owner, Ritual ritual, EntityPlayer player, ItemStack activationCrystal, int crystalTier) { super(mrs, owner, ritual); this.player = player; @@ -49,14 +45,12 @@ public class RitualEvent extends Event /** * 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, String owner, Ritual ritual) - { + public static class RitualRunEvent extends RitualEvent { + public RitualRunEvent(IMasterRitualStone mrs, String owner, Ritual ritual) { super(mrs, owner, ritual); } } @@ -64,16 +58,14 @@ public class RitualEvent extends Event /** * 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 - { + */ + public static class RitualStopEvent extends RitualEvent { public final Ritual.BreakType method; - public RitualStopEvent(IMasterRitualStone mrs, String owner, Ritual ritual, Ritual.BreakType method) - { + public RitualStopEvent(IMasterRitualStone mrs, String owner, Ritual ritual, Ritual.BreakType method) { super(mrs, owner, ritual); this.method = method; @@ -81,15 +73,13 @@ public class RitualEvent extends Event } @Cancelable - public static class ImperfectRitualActivatedEvent extends Event - { + public static class ImperfectRitualActivatedEvent extends Event { public final IImperfectRitualStone ims; public final String ownerName; public final ImperfectRitual imperfectRitual; - public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, String ownerName, ImperfectRitual imperfectRitual) - { + public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, String ownerName, ImperfectRitual imperfectRitual) { this.ims = ims; this.ownerName = ownerName; this.imperfectRitual = imperfectRitual; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java index f3bccfe8..93f72b23 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java @@ -1,13 +1,11 @@ package WayofTime.bloodmagic.api.event; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; @Cancelable -public class SacrificeKnifeUsedEvent extends Event -{ +public class SacrificeKnifeUsedEvent extends Event { public final EntityPlayer player; public final int healthDrained; public int lpAdded; @@ -18,22 +16,16 @@ public class SacrificeKnifeUsedEvent extends Event * 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}.
        + * + * @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(EntityPlayer player, boolean shouldDrainHealth, boolean shouldFillAltar, int hp, int lpAdded) - { + public SacrificeKnifeUsedEvent(EntityPlayer player, boolean shouldDrainHealth, boolean shouldFillAltar, int hp, int lpAdded) { this.player = player; this.shouldDrainHealth = shouldDrainHealth; this.shouldFillAltar = shouldFillAltar; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/SoulNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/SoulNetworkEvent.java index 7b824964..06928b8a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/SoulNetworkEvent.java @@ -9,17 +9,15 @@ import javax.annotation.Nullable; /** * Base event class for Soul Network related events. - * + *

        * {@link #ownerUUID} contains the owner's UUID {@link #syphon} contains the * amount of LP to be drained */ -public class SoulNetworkEvent extends Event -{ +public class SoulNetworkEvent extends Event { public final String ownerUUID; public int syphon; - public SoulNetworkEvent(String ownerUUID, int syphon) - { + public SoulNetworkEvent(String ownerUUID, int syphon) { this.ownerUUID = ownerUUID; this.syphon = syphon; } @@ -28,16 +26,14 @@ public class SoulNetworkEvent extends Event * This event is called when an * {@link WayofTime.bloodmagic.api.impl.ItemBindable} is being drained * inside of a {@link net.minecraft.tileentity.TileEntity}. - * + *

        * If canceled, the drain will not be executed. */ @Cancelable - public static class ItemDrainInContainerEvent extends SoulNetworkEvent - { + public static class ItemDrainInContainerEvent extends SoulNetworkEvent { public ItemStack stack; - public ItemDrainInContainerEvent(ItemStack stack, String ownerName, int syphon) - { + public ItemDrainInContainerEvent(ItemStack stack, String ownerName, int syphon) { super(ownerName, syphon); this.stack = stack; } @@ -45,18 +41,16 @@ public class SoulNetworkEvent extends Event /** * This event is called when a {@link EntityPlayer} drains the Soul Network - * + *

        * If canceled, the drain will not be executed. */ @Cancelable - public static class PlayerDrainNetworkEvent extends SoulNetworkEvent - { + public static class PlayerDrainNetworkEvent extends SoulNetworkEvent { public final EntityPlayer player; // If true, will damage regardless of if the network had enough inside it public boolean shouldDamage; - public PlayerDrainNetworkEvent(EntityPlayer player, String ownerNetwork, int drainAmount) - { + public PlayerDrainNetworkEvent(EntityPlayer player, String ownerNetwork, int drainAmount) { super(ownerNetwork, drainAmount); this.shouldDamage = false; this.player = player; @@ -64,8 +58,7 @@ public class SoulNetworkEvent extends Event } @Cancelable - public static class ItemDrainNetworkEvent extends PlayerDrainNetworkEvent - { + public static class ItemDrainNetworkEvent extends PlayerDrainNetworkEvent { @Nullable public final ItemStack itemStack; /** @@ -77,18 +70,13 @@ public class SoulNetworkEvent extends Event /** * Set result to deny the action i.e. damage/drain anyways. Cancelling * event prevents action without penalties - * - * @param player - * Player using the item - * @param ownerNetwork - * Network that the item is tied to - * @param itemStack - * Item used - * @param drainAmount - * Original drain amount - change to alter cost + * + * @param player Player using the item + * @param ownerNetwork Network that the item is tied to + * @param itemStack Item used + * @param drainAmount Original drain amount - change to alter cost */ - public ItemDrainNetworkEvent(EntityPlayer player, String ownerNetwork, @Nullable ItemStack itemStack, int drainAmount) - { + public ItemDrainNetworkEvent(EntityPlayer player, String ownerNetwork, @Nullable ItemStack itemStack, int drainAmount) { super(player, ownerNetwork, drainAmount); this.itemStack = itemStack; this.damageAmount = (float) (drainAmount) / 100.0f; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java index 26ee25e2..d474e46b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java +++ b/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java @@ -14,8 +14,7 @@ import net.minecraftforge.fml.common.eventhandler.Event; * transposition. */ @Cancelable -public class TeleposeEvent extends Event -{ +public class TeleposeEvent extends Event { public final World initalWorld; public final BlockPos initialBlockPos; public final IBlockState initialState; @@ -24,8 +23,7 @@ public class TeleposeEvent extends Event public final BlockPos finalBlockPos; public final IBlockState finalState; - public TeleposeEvent(World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) - { + public TeleposeEvent(World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) { this.initalWorld = initialWorld; this.initialBlockPos = initialBlockPos; this.initialState = initialWorld.getBlockState(initialBlockPos); @@ -35,13 +33,11 @@ public class TeleposeEvent extends Event this.finalState = finalWorld.getBlockState(finalBlockPos); } - public TileEntity getInitialTile() - { + public TileEntity getInitialTile() { return initalWorld.getTileEntity(initialBlockPos); } - public TileEntity getFinalTile() - { + public TileEntity getFinalTile() { return finalWorld.getTileEntity(finalBlockPos); } @@ -50,37 +46,31 @@ public class TeleposeEvent extends Event * be cancelled to stop transposition. */ @Cancelable - public static class Ent extends TeleposeEvent - { + public static class Ent extends TeleposeEvent { public final Entity entity; - public Ent(Entity entity, World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) - { + 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 - { + public TileEntity getInitialTile() throws IllegalArgumentException { throw new IllegalArgumentException("Attempted to get a TileEntity from an Entity Telepose Event."); } @Override - public TileEntity getFinalTile() throws IllegalArgumentException - { + 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 static class Post extends Ent { - public Post(Entity entity, World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) - { + 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/api/iface/IActivatable.java b/src/main/java/WayofTime/bloodmagic/api/iface/IActivatable.java index 47cd7e6e..c760dd5c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IActivatable.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.api.iface; import net.minecraft.item.ItemStack; -public interface IActivatable -{ +public interface IActivatable { boolean getActivated(ItemStack stack); ItemStack setActivatedState(ItemStack stack, boolean activated); diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java index e06393b1..60d34f08 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.api.iface; import net.minecraft.util.EnumFacing; -public interface IAlchemyArray -{ +public interface IAlchemyArray { EnumFacing getRotation(); } diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IAltarReader.java b/src/main/java/WayofTime/bloodmagic/api/iface/IAltarReader.java index e17ae4e4..292e2e74 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IAltarReader.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IAltarReader.java @@ -4,7 +4,6 @@ package WayofTime.bloodmagic.api.iface; * Any item that implements this interface will not be pulled into the Altar on * right click. */ -public interface IAltarReader -{ +public interface IAltarReader { } diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IBindable.java b/src/main/java/WayofTime/bloodmagic/api/iface/IBindable.java index b75f0530..5b515342 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IBindable.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IBindable.java @@ -6,41 +6,33 @@ import net.minecraft.item.ItemStack; /** * Implement this interface on any Item that can be bound to a player. */ -public interface IBindable -{ +public interface IBindable { /** * Gets the username of the Item's owner. Usually for display, such as in * the tooltip. - * + *

        * If the item is not bound, this will be null. - * - * @param stack - * - The owned ItemStack - * + * + * @param stack - The owned ItemStack * @return - The username of the Item's owner */ String getOwnerName(ItemStack stack); /** * Gets the UUID of the Item's owner. - * + *

        * If the item is not bound, this will be null. - * - * @param stack - * - The owned ItemStack - * + * + * @param stack - The owned ItemStack * @return - The UUID of the Item's owner */ String getOwnerUUID(ItemStack stack); /** * 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 - * + * + * @param player - The Player attempting to bind the item + * @param stack - The ItemStack to attempt binding * @return If binding was successful. */ boolean onBind(EntityPlayer player, ItemStack stack); diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ICustomAlchemyConsumable.java b/src/main/java/WayofTime/bloodmagic/api/iface/ICustomAlchemyConsumable.java index 06d2af92..b7d6f034 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ICustomAlchemyConsumable.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/ICustomAlchemyConsumable.java @@ -6,7 +6,6 @@ import net.minecraft.item.ItemStack; * An interface for items that have custom drainage behaviour when used in * certain alchemy recipes. */ -public interface ICustomAlchemyConsumable -{ +public interface ICustomAlchemyConsumable { ItemStack drainUseOnAlchemyCraft(ItemStack stack); } diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IDemonWillViewer.java b/src/main/java/WayofTime/bloodmagic/api/iface/IDemonWillViewer.java index 86b6d0a8..cfcbd3d9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IDemonWillViewer.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IDemonWillViewer.java @@ -4,8 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public interface IDemonWillViewer -{ +public interface IDemonWillViewer { boolean canSeeDemonWillAura(World world, ItemStack stack, EntityPlayer player); int getDemonWillAuraResolution(World world, ItemStack stack, EntityPlayer player); diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java b/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java index 4c8430fe..fca40184 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java @@ -11,27 +11,21 @@ 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 -{ +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. - * + * + * @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. + * Provide an empty list if there is no available documentation. */ @Nonnull List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state); diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IHarvestHandler.java b/src/main/java/WayofTime/bloodmagic/api/iface/IHarvestHandler.java index 1ba46fd4..f25382f5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IHarvestHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IHarvestHandler.java @@ -7,23 +7,18 @@ import net.minecraft.world.World; /** * Used to define a HarvestHandler for the Harvest Ritual. */ -public interface IHarvestHandler -{ +public interface IHarvestHandler { /** * Called whenever the Harvest Ritual attempts to harvest a block.
        * Use this to break the block, plant a new one, and drop the produced * items.
        * Make sure to do checks so you are certain the blocks being handled are * the block types you want. - * - * @param world - * - The world the - * {@link WayofTime.bloodmagic.api.ritual.IMasterRitualStone} is in. - * @param pos - * - The position of the Block being checked - * @param blockStack - * - The Block being checked - * + * + * @param world - The world the + * {@link WayofTime.bloodmagic.api.ritual.IMasterRitualStone} is in. + * @param pos - The position of the Block being checked + * @param blockStack - The Block being checked * @return If the block was successfully harvested. */ boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack); diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IItemLPContainer.java b/src/main/java/WayofTime/bloodmagic/api/iface/IItemLPContainer.java index 0dedec7d..b909856d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IItemLPContainer.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IItemLPContainer.java @@ -5,8 +5,7 @@ import net.minecraft.item.ItemStack; /** * Interface used for any item that can store LP in itself */ -public interface IItemLPContainer -{ +public interface IItemLPContainer { int getCapacity(); void setStoredLP(ItemStack stack, int lp); diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IMultiWillTool.java b/src/main/java/WayofTime/bloodmagic/api/iface/IMultiWillTool.java index dfb2afa0..9ff0d689 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IMultiWillTool.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IMultiWillTool.java @@ -1,9 +1,8 @@ package WayofTime.bloodmagic.api.iface; -import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import net.minecraft.item.ItemStack; -public interface IMultiWillTool -{ +public interface IMultiWillTool { EnumDemonWillType getCurrentType(ItemStack stack); } diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/INodeRenderer.java b/src/main/java/WayofTime/bloodmagic/api/iface/INodeRenderer.java index 89701cf7..27b48335 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/INodeRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/INodeRenderer.java @@ -4,6 +4,5 @@ package WayofTime.bloodmagic.api.iface; * Held items that implement this will cause the beams between routing nodes to * render. */ -public interface INodeRenderer -{ +public interface INodeRenderer { } diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java b/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java index d96db141..b6b7940b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.api.iface; import net.minecraft.item.ItemStack; -public interface IPurificationAsh -{ +public interface IPurificationAsh { double getTotalPurity(ItemStack stack); double getMaxPurity(ItemStack stack); diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ISentientSwordEffectProvider.java b/src/main/java/WayofTime/bloodmagic/api/iface/ISentientSwordEffectProvider.java index cedfce53..69ed3b28 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ISentientSwordEffectProvider.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/ISentientSwordEffectProvider.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.api.iface; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -public interface ISentientSwordEffectProvider -{ +public interface ISentientSwordEffectProvider { boolean applyOnHitEffect(EnumDemonWillType type, ItemStack swordStack, ItemStack providerStack, EntityLivingBase attacker, EntityLivingBase target); boolean providesEffectForWill(EnumDemonWillType type); diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ISentientTool.java b/src/main/java/WayofTime/bloodmagic/api/iface/ISentientTool.java index e17789ff..979c1066 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ISentientTool.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/ISentientTool.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.api.iface; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -public interface ISentientTool -{ +public interface ISentientTool { boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player); } diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java b/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java index 2e318247..bc625ee5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java @@ -11,14 +11,12 @@ import javax.annotation.Nonnull; * Used for all {@link WayofTime.bloodmagic.api.impl.ItemSigil} EXCEPT * Sigils of Holdings. */ -public interface ISigil -{ +public interface ISigil { boolean performArrayEffect(World world, BlockPos pos); boolean hasArrayEffect(); - interface Holding - { + interface Holding { @Nonnull ItemStack getHeldItem(ItemStack holdingStack, EntityPlayer player); } diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/api/iface/IUpgradeTrainer.java index 892aefad..6d4300bb 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IUpgradeTrainer.java @@ -8,8 +8,7 @@ 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 -{ +public interface IUpgradeTrainer { List getTrainedUpgrades(ItemStack stack); boolean setTrainedUpgrades(ItemStack stack, List keys); diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java index 034655d1..11fe41a2 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java @@ -1,19 +1,16 @@ package WayofTime.bloodmagic.api.impl; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IBindable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; /** * Base class for all bindable items. */ -public class ItemBindable extends Item implements IBindable -{ - public ItemBindable() - { +public class ItemBindable extends Item implements IBindable { + public ItemBindable() { super(); setMaxStackSize(1); @@ -22,20 +19,17 @@ public class ItemBindable extends Item implements IBindable // IBindable @Override - public boolean onBind(EntityPlayer player, ItemStack stack) - { + public boolean onBind(EntityPlayer player, ItemStack stack) { return true; } @Override - public String getOwnerName(ItemStack stack) - { + public String getOwnerName(ItemStack stack) { return !stack.isEmpty() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; } @Override - public String getOwnerUUID(ItemStack stack) - { + public String getOwnerUUID(ItemStack stack) { return !stack.isEmpty() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java index fcf7b227..ff17b437 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java @@ -10,26 +10,22 @@ import net.minecraft.world.World; /** * Base class for all (static) sigils. */ -public class ItemSigil extends ItemBindable implements ISigil -{ +public class ItemSigil extends ItemBindable implements ISigil { private int lpUsed; - public ItemSigil(int lpUsed) - { + public ItemSigil(int lpUsed) { super(); this.lpUsed = lpUsed; } - public boolean isUnusable(ItemStack stack) - { + public boolean isUnusable(ItemStack stack) { NBTHelper.checkNBT(stack); return stack.getTagCompound().getBoolean(Constants.NBT.UNUSABLE); } - public ItemStack setUnusable(ItemStack stack, boolean unusable) - { + public ItemStack setUnusable(ItemStack stack, boolean unusable) { NBTHelper.checkNBT(stack); stack.getTagCompound().setBoolean(Constants.NBT.UNUSABLE, unusable); @@ -37,14 +33,12 @@ public class ItemSigil extends ItemBindable implements ISigil } @Override - public boolean performArrayEffect(World world, BlockPos pos) - { + public boolean performArrayEffect(World world, BlockPos pos) { return false; } @Override - public boolean hasArrayEffect() - { + public boolean hasArrayEffect() { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java index 0d4e75cd..bd243ec5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java @@ -21,24 +21,19 @@ import net.minecraft.world.World; /** * Base class for all toggleable sigils. */ -public class ItemSigilToggleable extends ItemSigil implements IActivatable -{ - public ItemSigilToggleable(int lpUsed) - { +public class ItemSigilToggleable extends ItemSigil implements IActivatable { + public ItemSigilToggleable(int lpUsed) { super(lpUsed); } @Override - public boolean getActivated(ItemStack stack) - { + 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()) - { + public ItemStack setActivatedState(ItemStack stack, boolean activated) { + if (!stack.isEmpty()) { NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); return stack; } @@ -47,16 +42,14 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); - if (!world.isRemote && !isUnusable(stack)) - { + if (!world.isRemote && !isUnusable(stack)) { if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); if (getActivated(stack) && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) @@ -67,8 +60,7 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing 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); @@ -78,20 +70,15 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable return (NetworkHelper.getSoulNetwork(getOwnerUUID(player.getHeldItem(hand))).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; } - public boolean onSigilUse(ItemStack itemStack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onSigilUse(ItemStack itemStack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing 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 EntityPlayerMP && getActivated(stack)) - { - if (entityIn.ticksExisted % 100 == 0) - { - if (!NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage((EntityPlayer) entityIn, getLpUsed())) - { + public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { + if (!worldIn.isRemote && entityIn instanceof EntityPlayerMP && getActivated(stack)) { + if (entityIn.ticksExisted % 100 == 0) { + if (!NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage((EntityPlayer) entityIn, getLpUsed())) { setActivatedState(stack, false); } } @@ -100,7 +87,6 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable } } - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { } } diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java b/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java index 70331efc..ba589df3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java +++ b/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.api.incense; -public enum EnumTranquilityType -{ +public enum EnumTranquilityType { PLANT(), CROP(), TREE(), diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java b/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java index 797f6a11..bb7bc0ad 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java +++ b/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java @@ -4,8 +4,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public interface IIncensePath -{ +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 diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/ITranquilityHandler.java b/src/main/java/WayofTime/bloodmagic/api/incense/ITranquilityHandler.java index 95eaa4b9..e6b88a4d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/ITranquilityHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/incense/ITranquilityHandler.java @@ -5,7 +5,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public interface ITranquilityHandler -{ +public interface ITranquilityHandler { TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state); } diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java b/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java index 28fb4754..165b80cf 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java @@ -8,22 +8,17 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.List; -public class IncenseTranquilityRegistry -{ +public class IncenseTranquilityRegistry { public static List handlerList = new ArrayList(); - public static void registerTranquilityHandler(ITranquilityHandler handler) - { + public static void registerTranquilityHandler(ITranquilityHandler handler) { handlerList.add(handler); } - public static TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) - { - for (ITranquilityHandler handler : handlerList) - { + public static TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + for (ITranquilityHandler handler : handlerList) { TranquilityStack tranq = handler.getTranquilityOfBlock(world, pos, block, state); - if (tranq != null) - { + if (tranq != null) { return tranq; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java b/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java index c2855f41..5852d488 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java +++ b/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java @@ -1,12 +1,10 @@ package WayofTime.bloodmagic.api.incense; -public class TranquilityStack -{ +public class TranquilityStack { public final EnumTranquilityType type; public double value; - public TranquilityStack(EnumTranquilityType type, double value) - { + public TranquilityStack(EnumTranquilityType type, double value) { this.type = type; this.value = value; } diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/ILivingArmour.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/ILivingArmour.java index c47b310d..3a487a6c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/ILivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/api/livingArmour/ILivingArmour.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.api.livingArmour; import com.google.common.collect.Multimap; - import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -9,12 +8,10 @@ import net.minecraft.world.World; /** * An interface this is used purely for internal implementation. - * + * * @author WayofTime - * */ -public interface ILivingArmour -{ +public interface ILivingArmour { Multimap getAttributeModifiers(); boolean canApplyUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade); @@ -28,11 +25,9 @@ public interface ILivingArmour /** * 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 + * + * @param world - The World + * @param player - The player wearing the Armour */ void onTick(World world, EntityPlayer player); @@ -43,9 +38,8 @@ public interface ILivingArmour /** * Writes the LivingArmour to the NBTTag. This will only write the trackers * that are dirty. - * - * @param tag - * - The NBT tag to write to + * + * @param tag - The NBT tag to write to */ void writeDirtyToNBT(NBTTagCompound tag); diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java index 0d3c652e..129ea2d8 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java @@ -8,66 +8,53 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public class LivingArmourHandler -{ +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) - { + 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) - { + public static void registerArmourUpgrade(LivingArmourUpgrade upgrade) { Class clazz = upgrade.getClass(); upgradeMap.put(upgrade.getUniqueIdentifier(), clazz); upgradeMaxLevelMap.put(upgrade.getUniqueIdentifier(), upgrade.getMaxTier()); - try - { + try { Constructor ctor = clazz.getConstructor(int.class); - if (ctor == null) - { + if (ctor == null) { BloodMagicAPI.logger.error("Error adding living armour upgrade {} as it doesn't have a valid constructor.", upgrade.getUniqueIdentifier()); - } else - { + } else { upgradeConstructorMap.put(upgrade.getUniqueIdentifier(), ctor); } - } catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } } - public static LivingArmourUpgrade generateUpgradeFromKey(String key, int level) - { + public static LivingArmourUpgrade generateUpgradeFromKey(String key, int level) { return generateUpgradeFromKey(key, level, null); } - public static LivingArmourUpgrade generateUpgradeFromKey(String key, int level, NBTTagCompound tag) - { + public static LivingArmourUpgrade generateUpgradeFromKey(String key, int level, NBTTagCompound tag) { Constructor ctor = upgradeConstructorMap.get(key); - if (ctor != null) - { - try - { + if (ctor != null) { + try { LivingArmourUpgrade upgrade = ctor.newInstance(level); - if (upgrade != null && tag != null) - { + if (upgrade != null && tag != null) { upgrade.readFromNBT(tag); } return upgrade; - } catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java index bebd8f30..703478fa 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.api.livingArmour; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; @@ -11,8 +10,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.world.World; -public abstract class LivingArmourUpgrade -{ +public abstract class LivingArmourUpgrade { public static String chatBase = "chat.bloodmagic.livingArmour.upgrade."; public static String tooltipBase = "tooltip.bloodmagic.livingArmour.upgrade."; @@ -26,38 +24,32 @@ public abstract class LivingArmourUpgrade * 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 + * + * @param level The level of the upgrade */ - public LivingArmourUpgrade(int level) - { + public LivingArmourUpgrade(int level) { this.level = Math.min(level, getMaxTier() - 1); } - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { + public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { return 0; } - public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { + public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase 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(EntityLivingBase wearer, DamageSource source) - { + public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { return 0; } - public int getUpgradeLevel() - { + public int getUpgradeLevel() { return this.level; } @@ -69,17 +61,14 @@ public abstract class LivingArmourUpgrade public abstract int getCostOfUpgrade(); - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } - public Multimap getAttributeModifiers() - { + public Multimap getAttributeModifiers() { return HashMultimap.create(); } - public double getMiningSpeedModifier(EntityPlayer player) - { + public double getMiningSpeedModifier(EntityPlayer player) { return 1; } @@ -87,18 +76,15 @@ public abstract class LivingArmourUpgrade public abstract void readFromNBT(NBTTagCompound tag); - public int getRunicShielding() - { + public int getRunicShielding() { return 0; } - public boolean runOnClient() - { + public boolean runOnClient() { return false; } - public boolean isDowngrade() - { + public boolean isDowngrade() { return false; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java index ee27a048..a43b7448 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java +++ b/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java @@ -1,14 +1,13 @@ package WayofTime.bloodmagic.api.livingArmour; -import java.util.List; - +import WayofTime.bloodmagic.livingArmour.LivingArmour; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -public abstract class StatTracker -{ +import java.util.List; + +public abstract class StatTracker { private boolean isDirty = false; public abstract String getUniqueIdentifier(); @@ -26,13 +25,10 @@ public abstract class StatTracker /** * 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 + * + * @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, EntityPlayer player, LivingArmour livingArmour); @@ -43,30 +39,25 @@ public abstract class StatTracker /** * 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 + * + * @param livingArmour The equipped LivingArmour * @return the progress from the current level to the next level. */ - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return 1.0D; } - public final boolean isDirty() - { + public final boolean isDirty() { return isDirty; } - public final void markDirty() - { + public final void markDirty() { this.isDirty = true; } - public final void resetDirty() - { + public final void resetDirty() { this.isDirty = false; } diff --git a/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java b/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java index a3c801ff..f5acc317 100644 --- a/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java @@ -8,11 +8,10 @@ import javax.annotation.Nullable; /** * 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} */ -public class BloodOrb extends IForgeRegistryEntry.Impl -{ +public class BloodOrb extends IForgeRegistryEntry.Impl { private final String name; private final int tier; private final int capacity; @@ -22,33 +21,26 @@ public class BloodOrb extends IForgeRegistryEntry.Impl /** * 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 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. */ - public BloodOrb(String name, int tier, int capacity) - { + public BloodOrb(String name, int tier, int capacity) { this.name = name; this.tier = tier; this.capacity = capacity; } - public String getName() - { + public String getName() { return name; } - public int getTier() - { + public int getTier() { return tier; } - public int getCapacity() - { + public int getCapacity() { return capacity; } @@ -63,8 +55,7 @@ public class BloodOrb extends IForgeRegistryEntry.Impl } @Override - public String toString() - { + public String toString() { return "BloodOrb{" + "name='" + name + '\'' + ", tier=" + tier + ", capacity=" + capacity + ", owner=" + getRegistryName() + '}'; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java b/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java index 230b8332..76f1161b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java @@ -4,8 +4,7 @@ import net.minecraft.item.ItemStack; import javax.annotation.Nullable; -public interface IBloodOrb -{ +public interface IBloodOrb { @Nullable BloodOrb getOrb(ItemStack stack); } diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java index a136525b..be9afea1 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java @@ -1,50 +1,41 @@ package WayofTime.bloodmagic.api.recipe; +import WayofTime.bloodmagic.api.iface.ICustomAlchemyConsumable; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.api.iface.ICustomAlchemyConsumable; -public class AlchemyTableCustomRecipe extends AlchemyTableRecipe -{ - public AlchemyTableCustomRecipe(Block result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) - { +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) - { + 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) - { + 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()) - { + protected ItemStack getContainerItem(ItemStack stack) { + if (stack.isEmpty()) { return ItemStack.EMPTY; } ItemStack copyStack = stack.copy(); - if (copyStack.getItem() instanceof ICustomAlchemyConsumable) - { + if (copyStack.getItem() instanceof ICustomAlchemyConsumable) { return ((ICustomAlchemyConsumable) copyStack.getItem()).drainUseOnAlchemyCraft(copyStack); } - if (copyStack.getItem().hasContainerItem(stack)) - { + if (copyStack.getItem().hasContainerItem(stack)) { return copyStack.getItem().getContainerItem(copyStack); } copyStack.shrink(1); - if (copyStack.isEmpty()) - { + if (copyStack.isEmpty()) { return ItemStack.EMPTY; } diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java index c677afb2..553cdb6d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java @@ -1,9 +1,5 @@ package WayofTime.bloodmagic.api.recipe; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -13,49 +9,42 @@ import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.builder.ToStringBuilder; -public class AlchemyTableRecipe -{ +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) - { + 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) - { + 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) - { + 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) - { + for (Object in : recipe) { + if (in instanceof ItemStack) { input.add(((ItemStack) in).copy()); - } else if (in instanceof Item) - { + } else if (in instanceof Item) { input.add(new ItemStack((Item) in)); - } else if (in instanceof Block) - { + } else if (in instanceof Block) { input.add(new ItemStack((Block) in)); - } else if (in instanceof String) - { + } else if (in instanceof String) { input.add(OreDictionary.getOres((String) in)); - } else - { + } else { String ret = "Invalid alchemy recipe: "; - for (Object tmp : recipe) - { + for (Object tmp : recipe) { ret += tmp + ", "; } ret += output; @@ -67,8 +56,7 @@ public class AlchemyTableRecipe /** * Returns the size of the recipe area */ - public int getRecipeSize() - { + public int getRecipeSize() { return input.size(); } @@ -76,12 +64,11 @@ public class AlchemyTableRecipe * 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) - { + public ItemStack getRecipeOutput(List inputList) { return output.copy(); } @@ -90,42 +77,33 @@ public class AlchemyTableRecipe * BlockPos are for future-proofing */ @SuppressWarnings("unchecked") - public boolean matches(List checkedList, World world, BlockPos pos) - { + public boolean matches(List checkedList, World world, BlockPos pos) { ArrayList required = new ArrayList(input); - for (ItemStack slot : checkedList) - { - if (!slot.isEmpty()) - { + for (ItemStack slot : checkedList) { + if (!slot.isEmpty()) { boolean inRecipe = false; - for (Object aRequired : required) - { + for (Object aRequired : required) { boolean match = false; - if (aRequired instanceof ItemStack) - { + if (aRequired instanceof ItemStack) { match = OreDictionary.itemMatches((ItemStack) aRequired, slot, false); - } else if (aRequired instanceof List) - { + } else if (aRequired instanceof List) { Iterator itr = ((List) aRequired).iterator(); - while (itr.hasNext() && !match) - { + while (itr.hasNext() && !match) { match = OreDictionary.itemMatches(itr.next(), slot, false); } } - if (match) - { + if (match) { inRecipe = true; required.remove(aRequired); break; } } - if (!inRecipe) - { + if (!inRecipe) { return false; } } @@ -138,42 +116,35 @@ public class AlchemyTableRecipe * 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() - { + public List getInput() { return ImmutableList.copyOf(input); } - public ItemStack[] getRemainingItems(ItemStack[] inventory) - { + public ItemStack[] getRemainingItems(ItemStack[] inventory) { ItemStack[] ret = inventory.clone(); - for (int i = 0; i < ret.length; i++) - { + for (int i = 0; i < ret.length; i++) { ret[i] = getContainerItem(inventory[i]); } return ret; } - protected ItemStack getContainerItem(ItemStack stack) - { - if (stack.isEmpty()) - { + protected ItemStack getContainerItem(ItemStack stack) { + if (stack.isEmpty()) { return ItemStack.EMPTY; } ItemStack copyStack = stack.copy(); - if (copyStack.getItem().hasContainerItem(stack)) - { + if (copyStack.getItem().hasContainerItem(stack)) { return copyStack.getItem().getContainerItem(copyStack); } copyStack.shrink(1); - if (copyStack.isEmpty()) - { + if (copyStack.isEmpty()) { return ItemStack.EMPTY; } diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java index 2cfe9666..65aa9c3a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java @@ -1,9 +1,6 @@ package WayofTime.bloodmagic.api.recipe; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -12,37 +9,31 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -public class LivingArmourDowngradeRecipe -{ +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) - { + public LivingArmourDowngradeRecipe(LivingArmourUpgrade upgrade, ItemStack keyStack, Object... recipe) { this.upgrade = upgrade; this.keyStack = keyStack; - for (Object in : recipe) - { - if (in instanceof ItemStack) - { + for (Object in : recipe) { + if (in instanceof ItemStack) { input.add(((ItemStack) in).copy()); - } else if (in instanceof Item) - { + } else if (in instanceof Item) { input.add(new ItemStack((Item) in)); - } else if (in instanceof Block) - { + } else if (in instanceof Block) { input.add(new ItemStack((Block) in)); - } else if (in instanceof String) - { + } else if (in instanceof String) { input.add(OreDictionary.getOres((String) in)); - } else - { + } else { String ret = "Invalid living armour downgrade recipe: "; - for (Object tmp : recipe) - { + for (Object tmp : recipe) { ret += tmp + ", "; } ret += upgrade.toString(); @@ -54,13 +45,11 @@ public class LivingArmourDowngradeRecipe /** * Returns the size of the recipe area */ - public int getRecipeSize() - { + public int getRecipeSize() { return input.size(); } - public LivingArmourUpgrade getRecipeOutput() - { + public LivingArmourUpgrade getRecipeOutput() { return upgrade; } @@ -69,49 +58,39 @@ public class LivingArmourDowngradeRecipe * BlockPos are for future-proofing */ @SuppressWarnings("unchecked") - public boolean matches(ItemStack key, List checkedList, World world, BlockPos pos) - { - if (!OreDictionary.itemMatches(keyStack, key, false)) - { + 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) - { + for (ItemStack slot : checkedList) { + if (slot != null) { boolean inRecipe = false; - for (Object aRequired : required) - { + for (Object aRequired : required) { boolean match = false; Object next = aRequired; - if (next instanceof ItemStack) - { + if (next instanceof ItemStack) { match = OreDictionary.itemMatches((ItemStack) next, slot, false); - } else if (next instanceof List) - { + } else if (next instanceof List) { Iterator itr = ((List) next).iterator(); - while (itr.hasNext() && !match) - { + while (itr.hasNext() && !match) { match = OreDictionary.itemMatches(itr.next(), slot, false); } } - if (match) - { + if (match) { inRecipe = true; required.remove(next); break; } } - if (!inRecipe) - { + if (!inRecipe) { return false; } } @@ -124,57 +103,46 @@ public class LivingArmourDowngradeRecipe * 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() - { + public List getInput() { return ImmutableList.copyOf(input); } - public ItemStack getKey() - { + public ItemStack getKey() { return this.keyStack; } - public void consumeInventory(IItemHandler inv) - { - for (int i = 0; i < inv.getSlots(); i++) - { + public void consumeInventory(IItemHandler inv) { + for (int i = 0; i < inv.getSlots(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } - if (stack.getItem().hasContainerItem(stack)) - { + if (stack.getItem().hasContainerItem(stack)) { inv.extractItem(i, stack.getCount(), false); inv.insertItem(i, stack.getItem().getContainerItem(stack), false); - } else - { + } else { inv.extractItem(i, 1, false); } } } - protected ItemStack getContainerItem(ItemStack stack) - { - if (stack.isEmpty()) - { + protected ItemStack getContainerItem(ItemStack stack) { + if (stack.isEmpty()) { return ItemStack.EMPTY; } ItemStack copyStack = stack.copy(); - if (copyStack.getItem().hasContainerItem(stack)) - { + if (copyStack.getItem().hasContainerItem(stack)) { return copyStack.getItem().getContainerItem(copyStack); } copyStack.shrink(1); - if (copyStack.isEmpty()) - { + if (copyStack.isEmpty()) { return ItemStack.EMPTY; } diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java index 813d4b04..d4becd01 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java @@ -12,47 +12,36 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -public class TartaricForgeRecipe -{ +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) - { + 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) - { + 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) - { + 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) - { + for (Object in : recipe) { + if (in instanceof ItemStack) { input.add(((ItemStack) in).copy()); - } else if (in instanceof Item) - { + } else if (in instanceof Item) { input.add(new ItemStack((Item) in)); - } else if (in instanceof Block) - { + } else if (in instanceof Block) { input.add(new ItemStack((Block) in)); - } else if (in instanceof String) - { + } else if (in instanceof String) { input.add(OreDictionary.getOres((String) in)); - } else - { + } else { String ret = "Invalid soul forge recipe: "; - for (Object tmp : recipe) - { + for (Object tmp : recipe) { ret += tmp + ", "; } ret += output; @@ -64,13 +53,11 @@ public class TartaricForgeRecipe /** * Returns the size of the recipe area */ - public int getRecipeSize() - { + public int getRecipeSize() { return input.size(); } - public ItemStack getRecipeOutput() - { + public ItemStack getRecipeOutput() { return output.copy(); } @@ -79,47 +66,38 @@ public class TartaricForgeRecipe * BlockPos are for future-proofing */ @SuppressWarnings("unchecked") - public boolean matches(List checkedList, World world, BlockPos pos) - { + public boolean matches(List checkedList, World world, BlockPos pos) { ArrayList required = new ArrayList(input); - for (int x = 0; x < checkedList.size(); x++) - { + for (int x = 0; x < checkedList.size(); x++) { ItemStack slot = checkedList.get(x); - if (slot != null) - { + if (slot != null) { boolean inRecipe = false; Iterator req = required.iterator(); - while (req.hasNext()) - { + while (req.hasNext()) { boolean match = false; Object next = req.next(); - if (next instanceof ItemStack) - { + if (next instanceof ItemStack) { match = OreDictionary.itemMatches((ItemStack) next, slot, false); - } else if (next instanceof List) - { + } else if (next instanceof List) { Iterator itr = ((List) next).iterator(); - while (itr.hasNext() && !match) - { + while (itr.hasNext() && !match) { match = OreDictionary.itemMatches(itr.next(), slot, false); } } - if (match) - { + if (match) { inRecipe = true; required.remove(next); break; } } - if (!inRecipe) - { + if (!inRecipe) { return false; } } @@ -132,11 +110,10 @@ public class TartaricForgeRecipe * 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() - { + public List getInput() { return this.input; } diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java index a94370cf..c4cf383e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java @@ -1,25 +1,22 @@ package WayofTime.bloodmagic.api.registry; +import WayofTime.bloodmagic.api.ItemStackWrapper; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; +import WayofTime.bloodmagic.api.alchemyCrafting.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; -import javax.annotation.Nullable; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; - -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; - -public class AlchemyArrayRecipeRegistry -{ +public class AlchemyArrayRecipeRegistry { public static final AlchemyCircleRenderer defaultRenderer = new AlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BaseArray.png")); private static BiMap, AlchemyArrayRecipe> recipes = HashBiMap.create(); @@ -27,42 +24,30 @@ public class AlchemyArrayRecipeRegistry /** * 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 + * + * @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) - { + public static void registerRecipe(List input, @Nullable ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer) { effectMap.put(arrayEffect.getKey(), arrayEffect); - for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) - { + for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { AlchemyArrayRecipe arrayRecipe = entry.getValue(); - if (arrayRecipe.doesInputMatchRecipe(input)) - { + if (arrayRecipe.doesInputMatchRecipe(input)) { AlchemyArrayEffect eff = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); - if (eff != null) - { + if (eff != null) { return; // Recipe already exists! - } else - { + } else { arrayRecipe.catalystMap.put(ItemStackWrapper.getHolder(catalystStack), arrayEffect); - if (circleRenderer != null) - { - if (arrayRecipe.defaultCircleRenderer == null) - { + if (circleRenderer != null) { + if (arrayRecipe.defaultCircleRenderer == null) { arrayRecipe.defaultCircleRenderer = circleRenderer; - } else - { + } else { arrayRecipe.circleMap.put(ItemStackWrapper.getHolder(catalystStack), circleRenderer); } } @@ -74,63 +59,48 @@ public class AlchemyArrayRecipeRegistry recipes.put(input, new AlchemyArrayRecipe(input, catalystStack, arrayEffect, circleRenderer == null ? defaultRenderer : circleRenderer)); } - public static AlchemyArrayEffect getAlchemyArrayEffect(String key) - { + 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. + * 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()) - { + 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() }; + 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 }; + return new ItemStack[]{null, null}; } /** - * @param stack - * of the recipe + * @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. + * 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()) - { + 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) - { + 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() }; + if (!resultStack.isEmpty()) { + if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { + return new ItemStack[]{entry.getKey().get(0), effectEntry.getKey().toStack()}; } } } @@ -138,123 +108,97 @@ public class AlchemyArrayRecipeRegistry } } - return new ItemStack[] { null, null }; + return new ItemStack[]{null, null}; } - public static void registerCraftingRecipe(ItemStack input, ItemStack catalystStack, ItemStack outputStack, ResourceLocation arrayResource) - { + 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) - { + 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) - { + 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) - { + 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) - { + 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) - { + 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) - { + public static void registerRecipe(ItemStack inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { AlchemyCircleRenderer circleRenderer = arrayResource == null ? defaultRenderer : new AlchemyCircleRenderer(arrayResource); registerRecipe(Collections.singletonList(inputStacks), catalystStack, arrayEffect, circleRenderer); } - public static void registerRecipe(ItemStack inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer 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) - { + public static void registerRecipe(List inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { AlchemyCircleRenderer circleRenderer = arrayResource == null ? defaultRenderer : new AlchemyCircleRenderer(arrayResource); registerRecipe(inputStacks, catalystStack, arrayEffect, circleRenderer); } - public static void registerRecipe(String inputOreDict, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) - { + public static void registerRecipe(String inputOreDict, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { AlchemyCircleRenderer circleRenderer = arrayResource == null ? defaultRenderer : 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) - { + 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) - { + 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) - { + 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) - { + public static void replaceAlchemyCircle(List input, AlchemyCircleRenderer circleRenderer) { if (circleRenderer == null) return; - for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) - { + for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { AlchemyArrayRecipe arrayRecipe = entry.getValue(); if (arrayRecipe.doesInputMatchRecipe(input)) arrayRecipe.defaultCircleRenderer = circleRenderer; } } - public static AlchemyArrayRecipe getRecipeForInput(List input) - { + 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()) - { + 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 (ItemStackWrapper.getHolder(arrayRecipe.getInput().get(0)).equals(ItemStackWrapper.getHolder(input.get(0)))) - { + if (input.size() == 1 && arrayRecipe.getInput().size() == 1) { + if (ItemStackWrapper.getHolder(arrayRecipe.getInput().get(0)).equals(ItemStackWrapper.getHolder(input.get(0)))) { AlchemyArrayEffect effect = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); - if (effect != null) - { + if (effect != null) { return effect.getNewCopy(); - } else - { + } else { return null; } } - } else - { - if (input.equals(arrayRecipe.getInput())) - { + } else { + if (input.equals(arrayRecipe.getInput())) { AlchemyArrayEffect effect = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); - if (effect != null) - { + if (effect != null) { return effect.getNewCopy(); - } else - { + } else { return null; } } @@ -264,18 +208,14 @@ public class AlchemyArrayRecipeRegistry return null; } - public static AlchemyArrayEffect getAlchemyArrayEffect(ItemStack input, @Nullable ItemStack catalystStack) - { + 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()) - { + public static AlchemyCircleRenderer getAlchemyCircleRenderer(List input, @Nullable ItemStack catalystStack) { + for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { AlchemyArrayRecipe arrayRecipe = entry.getValue(); - if (arrayRecipe.doesInputMatchRecipe(input)) - { + if (arrayRecipe.doesInputMatchRecipe(input)) { return arrayRecipe.getAlchemyArrayRendererForCatalyst(catalystStack); } } @@ -283,20 +223,21 @@ public class AlchemyArrayRecipeRegistry return defaultRenderer; } - public static AlchemyCircleRenderer getAlchemyCircleRenderer(ItemStack itemStack, @Nullable ItemStack catalystStack) - { + public static AlchemyCircleRenderer getAlchemyCircleRenderer(ItemStack itemStack, @Nullable ItemStack catalystStack) { return getAlchemyCircleRenderer(Collections.singletonList(itemStack), catalystStack); } - public static class AlchemyArrayRecipe - { - public AlchemyCircleRenderer defaultCircleRenderer; + 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) - { + private AlchemyArrayRecipe(List input, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer, boolean useless) { this.input = input; catalystMap.put(ItemStackWrapper.getHolder(catalystStack), arrayEffect); @@ -304,47 +245,37 @@ public class AlchemyArrayRecipeRegistry this.defaultCircleRenderer = circleRenderer; } - public AlchemyArrayRecipe(ItemStack inputStack, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer 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) - { + 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) - { + 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 - * + * + * @param comparedList - The list to compare with * @return - True if the ItemStack(s) is a compatible item */ - public boolean doesInputMatchRecipe(List comparedList) - { + 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 - * + * + * @param comparedStack The catalyst that is being checked * @return - The effect */ - public AlchemyArrayEffect getAlchemyArrayEffectForCatalyst(@Nullable ItemStack comparedStack) - { - for (Entry entry : catalystMap.entrySet()) - { + public AlchemyArrayEffect getAlchemyArrayEffectForCatalyst(@Nullable ItemStack comparedStack) { + for (Entry entry : catalystMap.entrySet()) { ItemStack catalystStack = entry.getKey().toStack(); if (comparedStack == null && catalystStack == null) @@ -360,10 +291,8 @@ public class AlchemyArrayRecipeRegistry return null; } - public AlchemyCircleRenderer getAlchemyArrayRendererForCatalyst(@Nullable ItemStack comparedStack) - { - for (Entry entry : circleMap.entrySet()) - { + public AlchemyCircleRenderer getAlchemyArrayRendererForCatalyst(@Nullable ItemStack comparedStack) { + for (Entry entry : circleMap.entrySet()) { ItemStack catalystStack = entry.getKey().toStack(); if (comparedStack == null && catalystStack == null) @@ -418,9 +347,4 @@ public class AlchemyArrayRecipeRegistry return result; } } - - public static BiMap, AlchemyArrayRecipe> getRecipes() - { - return HashBiMap.create(recipes); - } } diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java index cbc13263..daceba43 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java @@ -1,38 +1,31 @@ package WayofTime.bloodmagic.api.registry; +import WayofTime.bloodmagic.api.recipe.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; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; - -public class AlchemyTableRecipeRegistry -{ +public class AlchemyTableRecipeRegistry { private static List recipeList = new ArrayList(); - public static void registerRecipe(AlchemyTableRecipe recipe) - { + public static void registerRecipe(AlchemyTableRecipe recipe) { recipeList.add(recipe); } - public static void registerRecipe(ItemStack outputStack, int lpDrained, int ticksRequired, int tierRequired, Object... objects) - { + 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) - { + 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)) - { + public static AlchemyTableRecipe getMatchingRecipe(List itemList, World world, BlockPos pos) { + for (AlchemyTableRecipe recipe : recipeList) { + if (recipe.matches(itemList, world, pos)) { return recipe; } } @@ -40,8 +33,7 @@ public class AlchemyTableRecipeRegistry return null; } - public static List getRecipeList() - { + public static List getRecipeList() { return new ArrayList(recipeList); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java index 687813fd..64342bfa 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java @@ -12,48 +12,41 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.Collections; import java.util.List; -public class AltarRecipeRegistry -{ +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 + * + * @param altarRecipe - The AltarRecipe to register */ - public static void registerRecipe(AltarRecipe altarRecipe) - { + public static void registerRecipe(AltarRecipe altarRecipe) { if (!recipes.containsValue(altarRecipe) && altarRecipe.getInput().size() > 0) recipes.put(altarRecipe.getInput(), altarRecipe); else BloodMagicAPI.logger.error("Error adding altar recipe for input [{}].", altarRecipe.toString()); } - public static void registerFillRecipe(ItemStack orbStack, EnumAltarTier tier, int maxForOrb, int consumeRate, int drainRate) - { + public static void registerFillRecipe(ItemStack orbStack, EnumAltarTier tier, int maxForOrb, int consumeRate, int drainRate) { registerRecipe(new AltarRecipe(orbStack, orbStack, tier, maxForOrb, consumeRate, drainRate, true)); } - public static void removeRecipe(AltarRecipe altarRecipe) - { + 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 + * + * @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) - { + public static AltarRecipe getRecipeForInput(List input) { List wrapperList = ItemStackWrapper.toWrapperList(input); if (recipes.keySet().contains(wrapperList)) return recipes.get(wrapperList); @@ -62,12 +55,9 @@ public class AltarRecipeRegistry } //TODO: Determine a more time-effective method - public static AltarRecipe getRecipeForInput(ItemStack input) - { - for (AltarRecipe recipe : recipes.values()) - { - if (recipe.doesRequiredItemMatch(input, recipe.getMinTier())) - { + public static AltarRecipe getRecipeForInput(ItemStack input) { + for (AltarRecipe recipe : recipes.values()) { + if (recipe.doesRequiredItemMatch(input, recipe.getMinTier())) { return recipe; } } @@ -75,18 +65,15 @@ public class AltarRecipeRegistry return null; } - public static AltarRecipe getRecipeForInput(String input) - { + public static AltarRecipe getRecipeForInput(String input) { return getRecipeForInput(OreDictionary.getOres(input)); } - public static BiMap, AltarRecipe> getRecipes() - { + public static BiMap, AltarRecipe> getRecipes() { return HashBiMap.create(recipes); } - public static class AltarRecipe - { + public static class AltarRecipe { private final List input; private final ItemStack output; private final EnumAltarTier minTier; @@ -99,24 +86,16 @@ public class AltarRecipeRegistry * {@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 + * + * @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, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) - { + public AltarRecipe(List input, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) { this.input = ItemStackWrapper.toWrapperList(input); this.output = output; this.minTier = minTier; @@ -126,33 +105,27 @@ public class AltarRecipeRegistry this.fillable = fillable; } - public AltarRecipe(List input, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate) - { + public AltarRecipe(List input, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate) { this(input, output, minTier, syphon, consumeRate, drainRate, false); } - public AltarRecipe(ItemStack input, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) - { + public AltarRecipe(ItemStack input, ItemStack output, EnumAltarTier 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, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate) - { + public AltarRecipe(ItemStack input, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate) { this(Collections.singletonList(input), output, minTier, syphon, consumeRate, drainRate, false); } - public AltarRecipe(String inputEntry, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) - { + public AltarRecipe(String inputEntry, ItemStack output, EnumAltarTier 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, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate) - { + public AltarRecipe(String inputEntry, ItemStack output, EnumAltarTier 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, EnumAltarTier tierCheck) - { + public boolean doesRequiredItemMatch(ItemStack comparedStack, EnumAltarTier tierCheck) { if (comparedStack == null || this.input == null) return false; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/HarvestRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/HarvestRegistry.java index a12bf312..90b2fa42 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/HarvestRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/HarvestRegistry.java @@ -7,8 +7,7 @@ import net.minecraft.block.BlockStem; import java.util.*; -public class HarvestRegistry -{ +public class HarvestRegistry { private static List handlerList = new ArrayList(); private static Map standardCrops = new HashMap(); private static Set tallCrops = new HashSet(); @@ -17,12 +16,10 @@ public class HarvestRegistry /** * Registers a handler for the Harvest Ritual to call. - * - * @param handler - * - The custom handler to register + * + * @param handler - The custom handler to register */ - public static void registerHandler(IHarvestHandler handler) - { + public static void registerHandler(IHarvestHandler handler) { if (!handlerList.contains(handler)) handlerList.add(handler); } @@ -32,15 +29,12 @@ public class HarvestRegistry * 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. + * + * @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) - { + public static void registerStandardCrop(Block crop, int matureMeta) { if (!standardCrops.containsKey(crop)) standardCrops.put(crop, matureMeta); } @@ -49,12 +43,10 @@ public class HarvestRegistry * 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. + * + * @param crop - The crop block to handle. */ - public static void registerTallCrop(BlockStack crop) - { + public static void registerTallCrop(BlockStack crop) { if (!tallCrops.contains(crop)) tallCrops.add(crop); } @@ -63,59 +55,48 @@ public class HarvestRegistry * 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 BlockStem} - * - * @param crop - * - The crop block to handle. - * @param stem - * - The stem of the crop + * + * @param crop - The crop block to handle. + * @param stem - The stem of the crop */ - public static void registerStemCrop(BlockStack crop, BlockStack stem) - { + public static void registerStemCrop(BlockStack crop, BlockStack stem) { if (!stemCrops.containsKey(crop) && stem.getBlock() instanceof BlockStem) stemCrops.put(stem, crop); } /** * Registers a range amplifier for the Harvest Ritual. - * - * @param blockStack - * - The block for the amplifier. - * @param range - * - The range the amplifier provides. + * + * @param blockStack - The block for the amplifier. + * @param range - The range the amplifier provides. */ - public static void registerRangeAmplifier(BlockStack blockStack, int range) - { + public static void registerRangeAmplifier(BlockStack blockStack, int range) { if (!amplifierMap.containsKey(blockStack)) amplifierMap.put(blockStack, range); } - public static List getHandlerList() - { + public static List getHandlerList() { return new ArrayList(handlerList); } - public static Map getStandardCrops() - { + public static Map getStandardCrops() { return new HashMap(standardCrops); } - public static Set getTallCrops() - { + public static Set getTallCrops() { return new HashSet(tallCrops); } - public static Map getStemCrops() - { + public static Map getStemCrops() { return new HashMap(stemCrops); } - public static Map getAmplifierMap() - { + public static Map getAmplifierMap() { return new HashMap(amplifierMap); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java index 247a2f6e..feebf365 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java @@ -10,50 +10,40 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -public class ImperfectRitualRegistry -{ +public class ImperfectRitualRegistry { public static final Map enabledRituals = new HashMap(); private static final BiMap registry = HashBiMap.create(); /** * The safe way to register a new Ritual. - * - * @param imperfectRitual - * - The imperfect ritual to register. - * @param id - * - The ID for the imperfect ritual. Cannot be duplicated. + * + * @param imperfectRitual - The imperfect ritual to register. + * @param id - The ID for the imperfect ritual. Cannot be duplicated. */ - public static void registerRitual(ImperfectRitual imperfectRitual, String id, boolean enabled) - { - if (imperfectRitual != null) - { + public static void registerRitual(ImperfectRitual imperfectRitual, String id, boolean enabled) { + if (imperfectRitual != null) { if (registry.containsKey(id)) BloodMagicAPI.logger.error("Duplicate imperfect ritual id: %s", id); - else - { + else { registry.put(id, imperfectRitual); enabledRituals.put(imperfectRitual, enabled); } } } - public static void registerRitual(ImperfectRitual imperfectRitual, String id) - { + public static void registerRitual(ImperfectRitual imperfectRitual, String id) { registerRitual(imperfectRitual, id, true); } - public static void registerRitual(ImperfectRitual imperfectRitual, boolean enabled) - { + public static void registerRitual(ImperfectRitual imperfectRitual, boolean enabled) { registerRitual(imperfectRitual, imperfectRitual.getName(), enabled); } - public static void registerRitual(ImperfectRitual imperfectRitual) - { + public static void registerRitual(ImperfectRitual imperfectRitual) { registerRitual(imperfectRitual, imperfectRitual.getName()); } - public static ImperfectRitual getRitualForBlock(BlockStack blockStack) - { + public static ImperfectRitual getRitualForBlock(BlockStack blockStack) { for (ImperfectRitual imperfectRitual : getRegistry().values()) if (imperfectRitual.getRequiredBlock().equals(blockStack)) return imperfectRitual; @@ -61,60 +51,48 @@ public class ImperfectRitualRegistry return null; } - public static ImperfectRitual getRitualForId(String id) - { + public static ImperfectRitual getRitualForId(String id) { return registry.get(id); } - public static String getIdForRitual(ImperfectRitual imperfectRitual) - { + public static String getIdForRitual(ImperfectRitual imperfectRitual) { return registry.inverse().get(imperfectRitual); } - public static boolean isMapEmpty() - { + public static boolean isMapEmpty() { return registry.isEmpty(); } - public static int getMapSize() - { + public static int getMapSize() { return registry.size(); } - public static boolean ritualEnabled(ImperfectRitual imperfectRitual) - { - try - { + public static boolean ritualEnabled(ImperfectRitual imperfectRitual) { + try { return enabledRituals.get(imperfectRitual); - } catch (NullPointerException e) - { + } catch (NullPointerException e) { BloodMagicAPI.logger.error("Invalid Imperfect Ritual was called"); return false; } } - public static boolean ritualEnabled(String id) - { + public static boolean ritualEnabled(String id) { return ritualEnabled(getRitualForId(id)); } - public static BiMap getRegistry() - { + public static BiMap getRegistry() { return HashBiMap.create(registry); } - public static BiMap getEnabledMap() - { + public static BiMap getEnabledMap() { return HashBiMap.create(enabledRituals); } - public static ArrayList getIds() - { + public static ArrayList getIds() { return new ArrayList(registry.keySet()); } - public static ArrayList getRituals() - { + public static ArrayList getRituals() { return new ArrayList(registry.values()); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/LivingArmourDowngradeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/LivingArmourDowngradeRecipeRegistry.java index b6de0ce8..3f635ed3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/LivingArmourDowngradeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/LivingArmourDowngradeRecipeRegistry.java @@ -1,44 +1,37 @@ package WayofTime.bloodmagic.api.registry; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.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; -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 WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; - -public class LivingArmourDowngradeRecipeRegistry -{ +public class LivingArmourDowngradeRecipeRegistry { private static List recipeList = new ArrayList(); private static Map>> dialogueMap = new HashMap>>(); - public static void registerRecipe(LivingArmourDowngradeRecipe recipe) - { + public static void registerRecipe(LivingArmourDowngradeRecipe recipe) { recipeList.add(recipe); } - public static void registerDialog(ItemStack keyStack, Map> map) - { + 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()) - { + public static List getDialogForProcessTick(ItemStack keyStack, int tick) { + for (Entry>> entry : dialogueMap.entrySet()) { ItemStack key = entry.getKey(); - if (OreDictionary.itemMatches(key, keyStack, false)) - { + if (OreDictionary.itemMatches(key, keyStack, false)) { Map> map = entry.getValue(); - if (map.containsKey(tick)) - { + if (map.containsKey(tick)) { return map.get(tick); } } @@ -47,17 +40,13 @@ public class LivingArmourDowngradeRecipeRegistry return null; } - public static void registerRecipe(LivingArmourUpgrade upgrade, ItemStack keyStack, Object... recipe) - { + 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)) - { + 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; } } @@ -65,8 +54,7 @@ public class LivingArmourDowngradeRecipeRegistry return null; } - public static List getRecipeList() - { + public static List getRecipeList() { return new ArrayList(recipeList); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java index a0d2eebe..13cdde2b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java @@ -17,24 +17,20 @@ import java.util.List; * custom handling, you will need your own item class. */ @Deprecated -public class OrbRegistry -{ - private static List orbs = new ArrayList(); - public static ArrayListMultimap tierMap = ArrayListMultimap.create(); - +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 static List getOrbsForTier(int tier) - { + public static List getOrbsForTier(int tier) { if (getTierMap().containsKey(tier)) return getTierMap().get(tier); return Collections.emptyList(); } - public static List getOrbsUpToTier(int tier) - { + public static List getOrbsUpToTier(int tier) { List ret = new ArrayList(); for (int i = 1; i <= tier; i++) @@ -43,8 +39,7 @@ public class OrbRegistry return ret; } - public static List getOrbsDownToTier(int tier) - { + public static List getOrbsDownToTier(int tier) { List ret = new ArrayList(); for (int i = EnumAltarTier.MAXTIERS; i >= tier; i--) @@ -53,8 +48,7 @@ public class OrbRegistry return ret; } - public static ItemStack getOrbStack(BloodOrb orb) - { + public static ItemStack getOrbStack(BloodOrb orb) { ItemStack ret = new ItemStack(ORB_ITEM); NBTTagCompound tag = new NBTTagCompound(); tag.setString("orb", orb.getRegistryName().toString()); @@ -62,8 +56,7 @@ public class OrbRegistry return ret; } - public static ArrayListMultimap getTierMap() - { + public static ArrayListMultimap getTierMap() { return ArrayListMultimap.create(tierMap); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java index 4b090f4c..e62ece62 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java @@ -8,8 +8,7 @@ import com.google.common.collect.HashBiMap; import javax.annotation.Nullable; import java.util.*; -public class RitualRegistry -{ +public class RitualRegistry { public static final Map enabledRituals = new HashMap(); private static final BiMap registry = HashBiMap.create(); private static final List lookupList = new ArrayList(); @@ -23,27 +22,21 @@ public class RitualRegistry /** * The safe way to register a new Ritual. - * - * @param ritual - * - The ritual to register. - * @param id - * - The ID for the ritual. Cannot be duplicated. + * + * @param ritual - The ritual to register. + * @param id - The ID for the ritual. Cannot be duplicated. */ - public static void registerRitual(Ritual ritual, String id, boolean enabled) - { - if (locked) - { + public static void registerRitual(Ritual ritual, String id, boolean enabled) { + if (locked) { BloodMagicAPI.logger.error("This registry has been locked. Please register your ritual earlier."); BloodMagicAPI.logger.error("If you reflect this, I will hunt you down. - TehNut"); return; } - if (ritual != null) - { + if (ritual != null) { if (registry.containsKey(id)) BloodMagicAPI.logger.error("Duplicate ritual id: %s", id); - else - { + else { registry.put(id, ritual); enabledRituals.put(ritual, enabled); orderedIdList.add(id); @@ -51,95 +44,76 @@ public class RitualRegistry } } - public static void registerRitual(Ritual ritual, boolean enabled) - { + public static void registerRitual(Ritual ritual, boolean enabled) { registerRitual(ritual, ritual.getName(), enabled); } - public static void registerRitual(Ritual ritual, String id) - { + public static void registerRitual(Ritual ritual, String id) { registerRitual(ritual, id, true); } - public static void registerRitual(Ritual ritual) - { + public static void registerRitual(Ritual ritual) { registerRitual(ritual, ritual.getName()); } @Nullable - public static Ritual getRitualForId(String id) - { + public static Ritual getRitualForId(String id) { Ritual ritual = registry.get(id); return ritual != null ? ritual.getNewCopy() : null; } - public static String getIdForRitual(Ritual ritual) - { + public static String getIdForRitual(Ritual ritual) { return registry.inverse().get(ritual); } - public static boolean isMapEmpty() - { + public static boolean isMapEmpty() { return registry.isEmpty(); } - public static int getMapSize() - { + public static int getMapSize() { return registry.size(); } - public static boolean ritualEnabled(Ritual ritual) - { - try - { + public static boolean ritualEnabled(Ritual ritual) { + try { return enabledRituals.get(ritual); - } catch (NullPointerException e) - { + } catch (NullPointerException e) { BloodMagicAPI.logger.error("Invalid Ritual was called"); return false; } } - public static boolean ritualEnabled(String id) - { + public static boolean ritualEnabled(String id) { return ritualEnabled(getRitualForId(id)); } - public static BiMap getRegistry() - { + public static BiMap getRegistry() { return HashBiMap.create(registry); } - public static Map getEnabledMap() - { + public static Map getEnabledMap() { return new HashMap(enabledRituals); } - public static ArrayList getIds() - { + public static ArrayList getIds() { return new ArrayList(lookupList); } - public static ArrayList getOrderedIds() - { + public static ArrayList getOrderedIds() { return orderedIdList; } - public static ArrayList getRituals() - { + public static ArrayList getRituals() { return new ArrayList(registry.values()); } - public static void orderLookupList() - { + public static void orderLookupList() { locked = true; // Lock registry so no no rituals can be registered lookupList.clear(); // Make sure it's empty lookupList.addAll(registry.keySet()); - Collections.sort(lookupList, new Comparator() - { + Collections.sort(lookupList, new Comparator() { @Override - public int compare(String o1, String o2) - { + public int compare(String o1, String o2) { Ritual ritual1 = registry.get(o1); Ritual ritual2 = registry.get(o2); return ritual1.getComponents().size() > ritual2.getComponents().size() ? -1 : 0; // Put earlier if bigger diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java index 24ad8e39..f9df0ffd 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java @@ -8,31 +8,24 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.List; -public class TartaricForgeRecipeRegistry -{ +public class TartaricForgeRecipeRegistry { private static List recipeList = new ArrayList(); - public static void registerRecipe(TartaricForgeRecipe recipe) - { + public static void registerRecipe(TartaricForgeRecipe recipe) { recipeList.add(recipe); } - public static void registerRecipe(ItemStack outputStack, double minimulSouls, double drain, Object... objects) - { + 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) - { + 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)) - { + public static TartaricForgeRecipe getMatchingRecipe(List itemList, World world, BlockPos pos) { + for (TartaricForgeRecipe recipe : recipeList) { + if (recipe.matches(itemList, world, pos)) { return recipe; } } @@ -40,8 +33,7 @@ public class TartaricForgeRecipeRegistry return null; } - public static List getRecipeList() - { + public static List getRecipeList() { return new ArrayList(recipeList); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java index 059cf1df..521c9dca 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java @@ -1,26 +1,23 @@ package WayofTime.bloodmagic.api.ritual; +import WayofTime.bloodmagic.api.Constants; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; + import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import WayofTime.bloodmagic.api.Constants; - -public abstract class AreaDescriptor implements Iterator -{ - public List getContainedPositions(BlockPos pos) - { +public abstract class AreaDescriptor implements Iterator { + public List getContainedPositions(BlockPos pos) { return new ArrayList(); } - public AxisAlignedBB getAABB(BlockPos pos) - { + public AxisAlignedBB getAABB(BlockPos pos) { return null; } @@ -30,13 +27,11 @@ public abstract class AreaDescriptor implements Iterator public abstract void resetIterator(); - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @@ -52,7 +47,7 @@ public abstract class AreaDescriptor implements Iterator * 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 */ @@ -64,8 +59,7 @@ public abstract class AreaDescriptor implements Iterator public abstract AreaDescriptor rotateDescriptor(PlacementSettings settings); - public static class Rectangle extends AreaDescriptor - { + public static class Rectangle extends AreaDescriptor { protected BlockPos minimumOffset; protected BlockPos maximumOffset; // Non-inclusive maximum offset. private BlockPos currentPosition; @@ -79,40 +73,30 @@ public abstract class AreaDescriptor implements Iterator * 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 - * - + * + * @param minimumOffset - + * @param maximumOffset - */ - public Rectangle(BlockPos minimumOffset, BlockPos maximumOffset) - { + public Rectangle(BlockPos minimumOffset, BlockPos maximumOffset) { setOffsets(minimumOffset, maximumOffset); } - public Rectangle(BlockPos minimumOffset, int sizeX, int sizeY, int sizeZ) - { + public Rectangle(BlockPos minimumOffset, int sizeX, int sizeY, int sizeZ) { this(minimumOffset, minimumOffset.add(sizeX, sizeY, sizeZ)); } - public Rectangle(BlockPos minimumOffset, int size) - { + public Rectangle(BlockPos minimumOffset, int size) { this(minimumOffset, size, size, size); } @Override - public List getContainedPositions(BlockPos pos) - { - if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) - { + 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++) - { + 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)); } } @@ -126,8 +110,7 @@ public abstract class AreaDescriptor implements Iterator } @Override - public AxisAlignedBB getAABB(BlockPos pos) - { + public AxisAlignedBB getAABB(BlockPos pos) { AxisAlignedBB tempAABB = new AxisAlignedBB(minimumOffset, maximumOffset); return tempAABB.offset(pos.getX(), pos.getY(), pos.getZ()); } @@ -135,28 +118,23 @@ public abstract class AreaDescriptor implements Iterator /** * Sets the offsets of the AreaDescriptor in a safe way that will make * minimumOffset the lowest corner - * - * @param offset1 - * - - * @param offset2 - * - + * + * @param offset1 - + * @param offset2 - */ - public void setOffsets(BlockPos offset1, BlockPos 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() - { + public void resetCache() { this.blockPosCache = new ArrayList(); } @Override - public boolean isWithinArea(BlockPos pos) - { + public boolean isWithinArea(BlockPos pos) { int x = pos.getX(); int y = pos.getY(); int z = pos.getZ(); @@ -165,22 +143,18 @@ public abstract class AreaDescriptor implements Iterator } @Override - public boolean hasNext() - { + 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) - { + 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 - { + } else { currentPosition = minimumOffset; } @@ -188,20 +162,17 @@ public abstract class AreaDescriptor implements Iterator } @Override - public void remove() - { + public void remove() { } @Override - public void resetIterator() - { + public void resetIterator() { currentPosition = null; } @Override - public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) - { + public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) { setOffsets(pos1, pos2); maximumOffset = maximumOffset.add(1, 1, 1); resetIterator(); @@ -209,15 +180,13 @@ public abstract class AreaDescriptor implements Iterator } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { minimumOffset = new BlockPos(tag.getInteger(Constants.NBT.X_COORD + "min"), tag.getInteger(Constants.NBT.Y_COORD + "min"), tag.getInteger(Constants.NBT.Z_COORD + "min")); maximumOffset = new BlockPos(tag.getInteger(Constants.NBT.X_COORD + "max"), tag.getInteger(Constants.NBT.Y_COORD + "max"), tag.getInteger(Constants.NBT.Z_COORD + "max")); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(Constants.NBT.X_COORD + "min", minimumOffset.getX()); tag.setInteger(Constants.NBT.Y_COORD + "min", minimumOffset.getY()); tag.setInteger(Constants.NBT.Z_COORD + "min", minimumOffset.getZ()); @@ -227,8 +196,7 @@ public abstract class AreaDescriptor implements Iterator } @Override - public int getVolumeForOffsets(BlockPos offset1, BlockPos offset2) - { + 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())); @@ -238,8 +206,7 @@ public abstract class AreaDescriptor implements Iterator } @Override - public boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit) - { + 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())); @@ -247,22 +214,18 @@ public abstract class AreaDescriptor implements Iterator } @Override - public int getVolume() - { + public int getVolume() { return (maximumOffset.getX() - minimumOffset.getX()) * (maximumOffset.getY() - minimumOffset.getY()) * (maximumOffset.getZ() - minimumOffset.getZ()); } @Override - public boolean isWithinRange(int verticalLimit, int horizontalLimit) - { + 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) - { + 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()); @@ -272,14 +235,12 @@ public abstract class AreaDescriptor implements Iterator } @Override - public AreaDescriptor offset(BlockPos offset) - { + public AreaDescriptor offset(BlockPos offset) { return new AreaDescriptor.Rectangle(this.minimumOffset.add(offset), this.maximumOffset.add(offset)); } @Override - public AreaDescriptor rotateDescriptor(PlacementSettings settings) - { + 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! @@ -290,8 +251,7 @@ public abstract class AreaDescriptor implements Iterator } } - public static class HemiSphere extends AreaDescriptor - { + public static class HemiSphere extends AreaDescriptor { private BlockPos minimumOffset; private int radius; @@ -300,23 +260,19 @@ public abstract class AreaDescriptor implements Iterator private boolean cache = true; - public HemiSphere(BlockPos minimumOffset, int radius) - { + public HemiSphere(BlockPos minimumOffset, int radius) { setRadius(minimumOffset, radius); } - public void setRadius(BlockPos minimumOffset, int radius) - { + 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 List getContainedPositions(BlockPos pos) - { - if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) - { + public List getContainedPositions(BlockPos pos) { + if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { ArrayList posList = new ArrayList(); int i = -radius; @@ -325,14 +281,10 @@ public abstract class AreaDescriptor implements Iterator //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)) - { + while (i <= radius) { + while (j <= radius) { + while (k <= radius) { + if (i * i + j * j + k * k >= (radius + 0.5F) * (radius + 0.5F)) { k++; continue; } @@ -360,98 +312,82 @@ public abstract class AreaDescriptor implements Iterator * Since you can't make a box using a sphere, this returns null */ @Override - public AxisAlignedBB getAABB(BlockPos pos) - { + public AxisAlignedBB getAABB(BlockPos pos) { return null; } @Override - public void resetCache() - { + public void resetCache() { this.blockPosCache = new ArrayList(); } @Override - public boolean isWithinArea(BlockPos pos) - { + public boolean isWithinArea(BlockPos pos) { return blockPosCache.contains(pos); } @Override - public boolean hasNext() - { + public boolean hasNext() { return false; } @Override - public BlockPos next() - { + public BlockPos next() { return null; } @Override - public void remove() - { + public void remove() { } @Override - public void resetIterator() - { + public void resetIterator() { } @Override - public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) - { + public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) { } @Override - public int getVolumeForOffsets(BlockPos pos1, BlockPos pos2) - { + public int getVolumeForOffsets(BlockPos pos1, BlockPos pos2) { return 0; } @Override - public boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit) - { + public boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit) { return false; } @Override - public int getVolume() - { + public int getVolume() { return 0; } @Override - public boolean isWithinRange(int verticalLimit, int horizontalLimit) - { + public boolean isWithinRange(int verticalLimit, int horizontalLimit) { return false; } @Override - public boolean intersects(AreaDescriptor descriptor) - { + public boolean intersects(AreaDescriptor descriptor) { return false; } @Override - public AreaDescriptor offset(BlockPos offset) - { + public AreaDescriptor offset(BlockPos offset) { return new AreaDescriptor.HemiSphere(minimumOffset.add(offset), radius); } @Override - public AreaDescriptor rotateDescriptor(PlacementSettings settings) - { + public AreaDescriptor rotateDescriptor(PlacementSettings settings) { return this; } } - public static class Cross extends AreaDescriptor - { + public static class Cross extends AreaDescriptor { private ArrayList blockPosCache; private BlockPos cachedPosition; @@ -461,23 +397,19 @@ public abstract class AreaDescriptor implements Iterator private boolean cache = true; - public Cross(BlockPos center, int size) - { + public Cross(BlockPos center, int size) { this.centerPos = center; this.size = size; this.blockPosCache = new ArrayList(); } @Override - public List getContainedPositions(BlockPos pos) - { - if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) - { + 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++) - { + 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)); @@ -491,86 +423,72 @@ public abstract class AreaDescriptor implements Iterator } @Override - public void resetCache() - { + public void resetCache() { blockPosCache = new ArrayList(); } @Override - public boolean isWithinArea(BlockPos pos) - { + public boolean isWithinArea(BlockPos pos) { return blockPosCache.contains(pos); } @Override - public boolean hasNext() - { + public boolean hasNext() { return false; } @Override - public BlockPos next() - { + public BlockPos next() { return null; } @Override - public void remove() - { + public void remove() { } @Override - public void resetIterator() - { + public void resetIterator() { } @Override - public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) - { + public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) { } @Override - public int getVolumeForOffsets(BlockPos pos1, BlockPos pos2) - { + public int getVolumeForOffsets(BlockPos pos1, BlockPos pos2) { return 0; } @Override - public boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit) - { + public boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit) { return false; } @Override - public int getVolume() - { + public int getVolume() { return 0; } @Override - public boolean isWithinRange(int verticalLimit, int horizontalLimit) - { + public boolean isWithinRange(int verticalLimit, int horizontalLimit) { return false; } @Override - public boolean intersects(AreaDescriptor descriptor) - { + public boolean intersects(AreaDescriptor descriptor) { return false; } @Override - public AreaDescriptor offset(BlockPos offset) - { + public AreaDescriptor offset(BlockPos offset) { return new AreaDescriptor.Cross(centerPos.add(offset), size); } @Override - public AreaDescriptor rotateDescriptor(PlacementSettings settings) - { + public AreaDescriptor rotateDescriptor(PlacementSettings settings) { return this; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java b/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java index d166dc4d..af658b4f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java @@ -7,50 +7,40 @@ import net.minecraftforge.common.capabilities.Capability; import java.util.concurrent.Callable; -public final class CapabilityRuneType -{ - public static class RuneTypeStorage implements Capability.IStorage - { +public final class CapabilityRuneType { + public static class RuneTypeStorage implements Capability.IStorage { @Override - public NBTBase writeNBT(Capability capability, IRitualStone.Tile instance, EnumFacing side) - { + public NBTBase writeNBT(Capability capability, IRitualStone.Tile instance, EnumFacing side) { return new NBTTagByte((byte) instance.getRuneType().ordinal()); } @Override - public void readNBT(Capability capability, IRitualStone.Tile instance, EnumFacing side, NBTBase nbt) - { + public void readNBT(Capability capability, IRitualStone.Tile instance, EnumFacing side, NBTBase nbt) { instance.setRuneType(EnumRuneType.byMetadata(((NBTTagByte) nbt).getByte())); } } - public static class RuneTypeWrapper implements IRitualStone.Tile - { + public static class RuneTypeWrapper implements IRitualStone.Tile { private EnumRuneType type = EnumRuneType.BLANK; @Override - public boolean isRuneType(EnumRuneType runeType) - { + public boolean isRuneType(EnumRuneType runeType) { return type == runeType; } @Override - public EnumRuneType getRuneType() - { + public EnumRuneType getRuneType() { return type; } - public void setRuneType(EnumRuneType runeType) - { + public void setRuneType(EnumRuneType runeType) { type = runeType; } } - public static class Factory implements Callable - { + public static class Factory implements Callable { @Override - public IRitualStone.Tile call() throws Exception - { + public IRitualStone.Tile call() throws Exception { return new RuneTypeWrapper(); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRitualReaderState.java b/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRitualReaderState.java index 82a4f446..b1b9597f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRitualReaderState.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRitualReaderState.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.api.ritual; -public enum EnumRitualReaderState -{ +public enum EnumRitualReaderState { SET_AREA, INFORMATION, SET_WILL_TYPES; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java index eceeb97f..74c7aeb4 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java @@ -9,8 +9,7 @@ import net.minecraftforge.fml.common.registry.GameRegistry; import java.util.Locale; -public enum EnumRuneType implements IStringSerializable -{ +public enum EnumRuneType implements IStringSerializable { BLANK(TextFormatting.GRAY), WATER(TextFormatting.AQUA), FIRE(TextFormatting.RED), @@ -24,34 +23,29 @@ public enum EnumRuneType implements IStringSerializable public final TextFormatting colorCode; - EnumRuneType(TextFormatting colorCode) - { + EnumRuneType(TextFormatting colorCode) { this.colorCode = colorCode; } - public static EnumRuneType byMetadata(int meta) - { + public ItemStack getScribeStack() { + return new ItemStack(INSCRIPTION_TOOL, 1, ordinal()); + } + + @Override + public String toString() { + return name().toLowerCase(Locale.ENGLISH); + } + + @Override + public String getName() { + return this.toString(); + } + + public static EnumRuneType byMetadata(int meta) { if (meta < 0 || meta >= values().length) meta = 0; return values()[meta]; } - public ItemStack getScribeStack() - { - return new ItemStack(INSCRIPTION_TOOL, 1, ordinal()); - } - - @Override - public String toString() - { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() - { - return this.toString(); - } - } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java index 7ffecdb9..6fb8544e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java @@ -1,22 +1,21 @@ package WayofTime.bloodmagic.api.ritual; -import java.util.List; - import WayofTime.bloodmagic.api.saving.SoulNetwork; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; + +import java.util.List; /** * This interface is for internal implementation only. - * + *

        * It is provided via the API for easy obtaining of basic data. */ -public interface IMasterRitualStone -{ +public interface IMasterRitualStone { String getOwner(); SoulNetwork getOwnerNetwork(); diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java b/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java index 3c623ce2..846d6267 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java @@ -5,17 +5,15 @@ 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 -{ +public interface IRitualStone { boolean isRuneType(World world, BlockPos pos, EnumRuneType runeType); void setRuneType(World world, BlockPos pos, EnumRuneType runeType); - interface Tile - { + interface Tile { boolean isRuneType(EnumRuneType runeType); EnumRuneType getRuneType(); diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java index bec8ef1c..35763652 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java @@ -1,11 +1,8 @@ package WayofTime.bloodmagic.api.ritual; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - +import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -14,29 +11,30 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import org.apache.commons.lang3.builder.ToStringBuilder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + /** * Abstract class for creating new rituals. Rituals need be registered with * {@link WayofTime.bloodmagic.api.registry.RitualRegistry#registerRitual(Ritual, String)} */ -public abstract class Ritual -{ +public abstract class Ritual { public final ArrayList ritualComponents = new ArrayList(); + 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; - protected final Map modableRangeMap = new HashMap(); - protected final Map volumeRangeMap = new HashMap(); - protected final Map horizontalRangeMap = new HashMap(); - protected final Map verticalRangeMap = new HashMap(); - public Ritual(String name, int crystalLevel, int activationCost, RitualRenderer renderer, String unlocalizedName) { this.name = name; this.crystalLevel = crystalLevel; @@ -46,46 +44,36 @@ public abstract class Ritual } /** - * @param name - * - The name of the ritual - * @param crystalLevel - * - Required Activation Crystal tier - * @param activationCost - * - Base LP cost for activating the ritual + * @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) - { + public Ritual(String name, int crystalLevel, int activationCost, String unlocalizedName) { this(name, crystalLevel, activationCost, null, unlocalizedName); } - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { NBTTagList tags = tag.getTagList("areas", 10); - if (tags.hasNoTags()) - { + if (tags.hasNoTags()) { return; } - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound newTag = tags.getCompoundTagAt(i); String rangeKey = newTag.getString("key"); NBTTagCompound storedTag = newTag.getCompoundTag("area"); AreaDescriptor desc = this.getBlockRange(rangeKey); - if (desc != null) - { + if (desc != null) { desc.readFromNBT(storedTag); } } } - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { NBTTagList tags = new NBTTagList(); - for (Entry entry : modableRangeMap.entrySet()) - { + for (Entry entry : modableRangeMap.entrySet()) { NBTTagCompound newTag = new NBTTagCompound(); newTag.setString("key", entry.getKey()); NBTTagCompound storedTag = new NBTTagCompound(); @@ -102,52 +90,44 @@ public abstract class Ritual /** * Called when the player attempts to activate the ritual. - * + *

        * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#activateRitual(ItemStack, EntityPlayer, 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. + * + * @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, EntityPlayer player, String owner) - { + public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, String 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 + * + * @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. + * + * @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) - { + 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(); @@ -155,64 +135,52 @@ public abstract class Ritual /** * 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() - { + public int getRefreshTime() { return 20; } - public void addBlockRange(String range, AreaDescriptor defaultRange) - { + 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. + * + * @param range - Range that needs to be pulled. * @return - */ - public AreaDescriptor getBlockRange(String range) - { - if (modableRangeMap.containsKey(range)) - { + public AreaDescriptor getBlockRange(String range) { + if (modableRangeMap.containsKey(range)) { return modableRangeMap.get(range); } return null; } - public List getListOfRanges() - { + public List getListOfRanges() { return new ArrayList(modableRangeMap.keySet()); } - public String getNextBlockRange(String range) - { + public String getNextBlockRange(String range) { List rangeList = getListOfRanges(); - if (rangeList.isEmpty()) - { + if (rangeList.isEmpty()) { return ""; } - if (!rangeList.contains(range)) - { + if (!rangeList.contains(range)) { return rangeList.get(0); } boolean hasMatch = false; - for (String rangeCheck : rangeList) - { - if (hasMatch) - { + for (String rangeCheck : rangeList) { + if (hasMatch) { return rangeCheck; - } else if (rangeCheck.equals(range)) - { + } else if (rangeCheck.equals(range)) { hasMatch = true; } } @@ -220,14 +188,12 @@ public abstract class Ritual return rangeList.get(0); } - public boolean setBlockRangeByBounds(String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2) - { + public boolean setBlockRangeByBounds(String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2) { AreaDescriptor descriptor = this.getBlockRange(range); World world = master.getWorldObj(); BlockPos masterPos = master.getBlockPos(); DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, masterPos); - if (canBlockRangeBeModified(range, descriptor, master, offset1, offset2, holder)) - { + if (canBlockRangeBeModified(range, descriptor, master, offset1, offset2, holder)) { descriptor.modifyAreaByBlockPositions(offset1, offset2); return true; } @@ -235,8 +201,7 @@ public abstract class Ritual return false; } - protected boolean canBlockRangeBeModified(String range, AreaDescriptor descriptor, IMasterRitualStone master, BlockPos offset1, BlockPos offset2, DemonWillHolder holder) - { + protected boolean 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); @@ -245,38 +210,31 @@ public abstract class Ritual return (maxVolume <= 0 || descriptor.getVolumeForOffsets(offset1, offset2) <= maxVolume) && descriptor.isWithinRange(offset1, offset2, maxVertical, maxHorizontal); } - protected void setMaximumVolumeAndDistanceOfRange(String range, int volume, int horizontalRadius, int verticalRadius) - { + 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) - { + 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) - { + public int getMaxVolumeForRange(String range, List activeTypes, DemonWillHolder holder) { return volumeRangeMap.get(range); } - public int getMaxVerticalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) - { + public int getMaxVerticalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) { return verticalRangeMap.get(range); } - public int getMaxHorizontalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) - { + public int getMaxHorizontalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) { return horizontalRangeMap.get(range); } - public ITextComponent getErrorForBlockRangeOnFail(EntityPlayer player, String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2) - { + public ITextComponent getErrorForBlockRangeOnFail(EntityPlayer player, String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2) { AreaDescriptor descriptor = this.getBlockRange(range); - if (descriptor == null) - { + if (descriptor == null) { return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooBig", "?"); } @@ -287,27 +245,21 @@ public abstract class Ritual int maxVertical = this.getMaxVerticalRadiusForRange(range, willConfig, holder); int maxHorizontal = this.getMaxHorizontalRadiusForRange(range, willConfig, holder); - if (maxVolume > 0 && descriptor.getVolumeForOffsets(offset1, offset2) > maxVolume) - { + if (maxVolume > 0 && descriptor.getVolumeForOffsets(offset1, offset2) > maxVolume) { return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooBig", maxVolume); - } else - { + } else { return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooFar", maxVertical, maxHorizontal); } } - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info") }; + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info")}; } - public ITextComponent provideInformationOfRangeToPlayer(EntityPlayer player, String range) - { - if (getListOfRanges().contains(range)) - { + public ITextComponent provideInformationOfRangeToPlayer(EntityPlayer player, String range) { + if (getListOfRanges().contains(range)) { return new TextComponentTranslation(this.getUnlocalizedName() + "." + range + ".info"); - } else - { + } else { return new TextComponentTranslation("ritual.bloodmagic.blockRange.noRange"); } } @@ -317,13 +269,11 @@ public abstract class Ritual */ public abstract ArrayList getComponents(); - public void addRune(ArrayList components, int offset1, int y, int offset2, EnumRuneType rune) - { + public void addRune(ArrayList components, int offset1, int y, int offset2, EnumRuneType rune) { components.add(new RitualComponent(new BlockPos(offset1, y, offset2), rune)); } - public void addOffsetRunes(ArrayList components, int offset1, int offset2, int y, EnumRuneType rune) - { + public void addOffsetRunes(ArrayList 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); @@ -334,34 +284,21 @@ public abstract class Ritual addRune(components, -offset2, y, -offset1, rune); } - public void addCornerRunes(ArrayList components, int offset, int y, EnumRuneType rune) - { + public void addCornerRunes(ArrayList 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); } - public void addParallelRunes(ArrayList components, int offset, int y, EnumRuneType rune) - { + public void addParallelRunes(ArrayList 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 enum BreakType - { - REDSTONE, - BREAK_MRS, - BREAK_STONE, - ACTIVATE, - DEACTIVATE, - EXPLOSION, - } - - public double getWillRespectingConfig(World world, BlockPos pos, EnumDemonWillType type, List willConfig) - { + public double getWillRespectingConfig(World world, BlockPos pos, EnumDemonWillType type, List willConfig) { return willConfig.contains(type) ? WorldDemonWillHandler.getCurrentWill(world, pos, type) : 0; } @@ -446,4 +383,13 @@ public abstract class Ritual 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/api/ritual/RitualComponent.java b/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java index 2bfd071f..97d8893d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java @@ -7,8 +7,7 @@ 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 -{ +public class RitualComponent { private final BlockPos offset; private final EnumRuneType runeType; @@ -17,43 +16,37 @@ public class RitualComponent this.runeType = runeType; } - public int getX(EnumFacing 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 getX(EnumFacing 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() - { + public int getY() { return this.getOffset().getY(); } - public int getZ(EnumFacing 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 int getZ(EnumFacing 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(EnumFacing direction) - { + public BlockPos getOffset(EnumFacing direction) { return new BlockPos(getX(direction), offset.getY(), getZ(direction)); } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualRenderer.java b/src/main/java/WayofTime/bloodmagic/api/ritual/RitualRenderer.java index 5c50dc52..57251f8d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/RitualRenderer.java @@ -3,12 +3,10 @@ package WayofTime.bloodmagic.api.ritual; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; -public abstract class RitualRenderer -{ +public abstract class RitualRenderer { public abstract void renderAt(IMasterRitualStone masterRitualStone, double x, double y, double z); - protected void bindTexture(ResourceLocation resourceLocation) - { + protected void bindTexture(ResourceLocation resourceLocation) { Minecraft.getMinecraft().getTextureManager().bindTexture(resourceLocation); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/IImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/IImperfectRitualStone.java index fbdcd02a..6c8620db 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/IImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/IImperfectRitualStone.java @@ -6,11 +6,10 @@ 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 -{ +public interface IImperfectRitualStone { boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, EntityPlayer player); diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java index 28b92f67..d19ef961 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java @@ -9,8 +9,7 @@ import net.minecraft.world.World; * registered with * {@link WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry#registerRitual(ImperfectRitual)} */ -public abstract class ImperfectRitual -{ +public abstract class ImperfectRitual { private final String name; private final BlockStack requiredBlock; @@ -27,26 +26,20 @@ public abstract class ImperfectRitual } /** - * @param name - * - The name of the ritual - * @param requiredBlock - * - The block required above the ImperfectRitualStone - * @param activationCost - * - Base LP cost for activating the ritual + * @param name - The name of the ritual + * @param requiredBlock - The block required above the ImperfectRitualStone + * @param activationCost - Base LP cost for activating the ritual */ - public ImperfectRitual(String name, BlockStack requiredBlock, int activationCost, String unlocalizedName) - { + public ImperfectRitual(String name, BlockStack requiredBlock, int activationCost, String unlocalizedName) { this(name, requiredBlock, activationCost, false, unlocalizedName); } /** * Called when the player activates the ritual * {@link WayofTime.bloodmagic.tile.TileImperfectRitualStone#performRitual(World, net.minecraft.util.math.BlockPos, ImperfectRitual, EntityPlayer)} - * - * @param imperfectRitualStone - * - The {@link IImperfectRitualStone} that the ritual is bound to - * @param player - * - The player activating the ritual + * + * @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, EntityPlayer player); @@ -72,8 +65,7 @@ public abstract class ImperfectRitual } @Override - public String toString() - { + public String toString() { return getName() + ":" + getRequiredBlock().toString() + "@" + getActivationCost(); } diff --git a/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java b/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java index eae38187..16470fa5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java +++ b/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java @@ -6,43 +6,38 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.storage.WorldSavedData; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; -public class BMWorldSavedData extends WorldSavedData -{ +public class BMWorldSavedData extends WorldSavedData { public static final String ID = "BloodMagic-SoulNetworks"; private Map soulNetworks = new HashMap(); - public BMWorldSavedData(String id) - { + public BMWorldSavedData(String id) { super(id); } - public BMWorldSavedData() - { + public BMWorldSavedData() { this(ID); } - public SoulNetwork getNetwork(EntityPlayer player) - { + public SoulNetwork getNetwork(EntityPlayer player) { return getNetwork(PlayerHelper.getUUIDFromPlayer(player)); } - public SoulNetwork getNetwork(UUID playerId) - { + public SoulNetwork getNetwork(UUID playerId) { if (!soulNetworks.containsKey(playerId)) soulNetworks.put(playerId, SoulNetwork.newEmpty(playerId).setParent(this)); return soulNetworks.get(playerId); } @Override - public void readFromNBT(NBTTagCompound tagCompound) - { + public void readFromNBT(NBTTagCompound tagCompound) { NBTTagList networkData = tagCompound.getTagList("networkData", 10); - for (int i = 0; i < networkData.tagCount(); i++) - { + for (int i = 0; i < networkData.tagCount(); i++) { NBTTagCompound data = networkData.getCompoundTagAt(i); SoulNetwork network = SoulNetwork.fromNBT(data); network.setParent(this); @@ -51,8 +46,7 @@ public class BMWorldSavedData extends WorldSavedData } @Override - public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) - { + public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) { NBTTagList networkData = new NBTTagList(); for (SoulNetwork soulNetwork : soulNetworks.values()) networkData.appendTag(soulNetwork.serializeNBT()); diff --git a/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java index 57048184..4fdb465b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java @@ -17,21 +17,18 @@ import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nullable; import java.util.UUID; -public class SoulNetwork implements INBTSerializable -{ +public class SoulNetwork implements INBTSerializable { private BMWorldSavedData parent; private EntityPlayer cachedPlayer; private UUID playerId; private int currentEssence; private int orbTier; - private SoulNetwork() - { + private SoulNetwork() { // No-op - For creation via NBT only } - public int add(int toAdd, int maximum) - { + public int add(int toAdd, int maximum) { AddToNetworkEvent event = new AddToNetworkEvent(playerId.toString(), toAdd, maximum); if (MinecraftForge.EVENT_BUS.post(event)) @@ -56,15 +53,12 @@ public class SoulNetwork implements INBTSerializable * @deprecated - Please use {@link #add(int, int)} */ @Deprecated - public int addLifeEssence(int toAdd, int maximum) - { + public int addLifeEssence(int toAdd, int maximum) { return add(toAdd, maximum); } - public int syphon(int syphon) - { - if (getCurrentEssence() >= syphon) - { + public int syphon(int syphon) { + if (getCurrentEssence() >= syphon) { setCurrentEssence(getCurrentEssence() - syphon); return syphon; } @@ -72,15 +66,12 @@ public class SoulNetwork implements INBTSerializable return 0; } - public boolean syphonAndDamage(EntityPlayer user, int toSyphon) - { - if (user != null) - { + public boolean syphonAndDamage(EntityPlayer user, int toSyphon) { + if (user != null) { if (user.getEntityWorld().isRemote) return false; - if (!Strings.isNullOrEmpty(playerId.toString())) - { + if (!Strings.isNullOrEmpty(playerId.toString())) { SoulNetworkEvent.ItemDrainNetworkEvent event = new SoulNetworkEvent.ItemDrainNetworkEvent(user, playerId.toString(), null, toSyphon); if (MinecraftForge.EVENT_BUS.post(event)) @@ -103,8 +94,7 @@ public class SoulNetwork implements INBTSerializable return false; } - public void causeNausea() - { + public void causeNausea() { if (getPlayer() != null) getPlayer().addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 99)); } @@ -113,29 +103,21 @@ public class SoulNetwork implements INBTSerializable * @deprecated - Please use {@link #causeNausea()} */ @Deprecated - public void causeNauseaToPlayer() - { + public void causeNauseaToPlayer() { causeNausea(); } - public void hurtPlayer(EntityPlayer user, float syphon) - { - if (user != null) - { - if (syphon < 100 && syphon > 0) - { - if (!user.capabilities.isCreativeMode) - { + public void hurtPlayer(EntityPlayer user, float syphon) { + if (user != null) { + if (syphon < 100 && syphon > 0) { + if (!user.capabilities.isCreativeMode) { user.hurtResistantTime = 0; user.attackEntityFrom(BloodMagicAPI.damageSource, 1.0F); } - } else if (syphon >= 100) - { - if (!user.capabilities.isCreativeMode) - { - for (int i = 0; i < ((syphon + 99) / 100); i++) - { + } else if (syphon >= 100) { + if (!user.capabilities.isCreativeMode) { + for (int i = 0; i < ((syphon + 99) / 100); i++) { user.hurtResistantTime = 0; user.attackEntityFrom(BloodMagicAPI.damageSource, 1.0F); } @@ -144,8 +126,7 @@ public class SoulNetwork implements INBTSerializable } } - private void markDirty() - { + private void markDirty() { if (getParent() != null) getParent().markDirty(); else @@ -153,39 +134,23 @@ public class SoulNetwork implements INBTSerializable } @Nullable - public EntityPlayer getPlayer() - { + public EntityPlayer getPlayer() { if (cachedPlayer == null) cachedPlayer = PlayerHelper.getPlayerFromUUID(playerId); return cachedPlayer; } - public SoulNetwork setCurrentEssence(int currentEssence) - { - this.currentEssence = currentEssence; - markDirty(); - return this; + public BMWorldSavedData getParent() { + return parent; } - public SoulNetwork setOrbTier(int orbTier) - { - this.orbTier = orbTier; - markDirty(); - return this; - } - - public SoulNetwork setParent(BMWorldSavedData parent) - { + public SoulNetwork setParent(BMWorldSavedData parent) { this.parent = parent; markDirty(); return this; } - public BMWorldSavedData getParent() { - return parent; - } - public EntityPlayer getCachedPlayer() { return cachedPlayer; } @@ -198,15 +163,26 @@ public class SoulNetwork implements INBTSerializable return currentEssence; } + public SoulNetwork setCurrentEssence(int currentEssence) { + this.currentEssence = currentEssence; + markDirty(); + return this; + } + public int getOrbTier() { return orbTier; } + public SoulNetwork setOrbTier(int orbTier) { + this.orbTier = orbTier; + markDirty(); + return this; + } + // INBTSerializable @Override - public NBTTagCompound serializeNBT() - { + public NBTTagCompound serializeNBT() { NBTTagCompound tagCompound = new NBTTagCompound(); tagCompound.setString("playerId", getPlayerId().toString()); tagCompound.setInteger("currentEssence", getCurrentEssence()); @@ -215,22 +191,19 @@ public class SoulNetwork implements INBTSerializable } @Override - public void deserializeNBT(NBTTagCompound nbt) - { + public void deserializeNBT(NBTTagCompound nbt) { this.playerId = UUID.fromString(nbt.getString("playerId")); this.currentEssence = nbt.getInteger("currentEssence"); this.orbTier = nbt.getInteger("orbTier"); } - public static SoulNetwork fromNBT(NBTTagCompound tagCompound) - { + public static SoulNetwork fromNBT(NBTTagCompound tagCompound) { SoulNetwork soulNetwork = new SoulNetwork(); soulNetwork.deserializeNBT(tagCompound); return soulNetwork; } - public static SoulNetwork newEmpty(UUID uuid) - { + public static SoulNetwork newEmpty(UUID uuid) { SoulNetwork network = new SoulNetwork(); network.playerId = uuid; return network; diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/DemonWillHolder.java b/src/main/java/WayofTime/bloodmagic/api/soul/DemonWillHolder.java index 792381d6..8ec0283e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/DemonWillHolder.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/DemonWillHolder.java @@ -5,15 +5,12 @@ import net.minecraft.nbt.NBTTagCompound; import java.util.HashMap; import java.util.Map.Entry; -public class DemonWillHolder -{ +public class DemonWillHolder { public HashMap willMap = new HashMap(); - public double addWill(EnumDemonWillType type, double amount, double max) - { + public double addWill(EnumDemonWillType type, double amount, double max) { double current = 0; - if (willMap.containsKey(type)) - { + if (willMap.containsKey(type)) { current = willMap.get(type); } @@ -23,29 +20,22 @@ public class DemonWillHolder return added; } - public void addWill(EnumDemonWillType type, double amount) - { - if (willMap.containsKey(type)) - { + public void addWill(EnumDemonWillType type, double amount) { + if (willMap.containsKey(type)) { willMap.put(type, amount + willMap.get(type)); - } else - { + } else { willMap.put(type, amount); } } - public double drainWill(EnumDemonWillType type, double amount) - { - if (willMap.containsKey(type)) - { + 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) - { + if (reduced >= current) { willMap.remove(type); - } else - { + } else { willMap.put(type, current - reduced); } @@ -55,45 +45,37 @@ public class DemonWillHolder return 0; } - public double getWill(EnumDemonWillType type) - { - if (willMap.containsKey(type)) - { + public double getWill(EnumDemonWillType type) { + if (willMap.containsKey(type)) { return willMap.get(type); } return 0; } - public void readFromNBT(NBTTagCompound tag, String key) - { + public void readFromNBT(NBTTagCompound tag, String key) { NBTTagCompound willTag = tag.getCompoundTag(key); willMap.clear(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { double amount = willTag.getDouble("EnumWill" + type.getName()); - if (amount > 0) - { + if (amount > 0) { willMap.put(type, amount); } } } - public void writeToNBT(NBTTagCompound tag, String key) - { + public void writeToNBT(NBTTagCompound tag, String key) { NBTTagCompound willTag = new NBTTagCompound(); - for (Entry entry : willMap.entrySet()) - { + for (Entry entry : willMap.entrySet()) { willTag.setDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); } tag.setTag(key, willTag); } - public void clearWill() - { + public void clearWill() { willMap.clear(); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/EnumDemonWillType.java b/src/main/java/WayofTime/bloodmagic/api/soul/EnumDemonWillType.java index df58f660..445697f7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/EnumDemonWillType.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/EnumDemonWillType.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.api.soul; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumDemonWillType implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumDemonWillType implements IStringSerializable { DEFAULT("default"), CORROSIVE("corrosive"), DESTRUCTIVE("destructive"), @@ -14,20 +13,17 @@ public enum EnumDemonWillType implements IStringSerializable public final String name; - EnumDemonWillType(String name) - { + EnumDemonWillType(String name) { this.name = name; } @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + public String getName() { return this.toString(); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWill.java b/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWill.java index ea1a3717..7ef8c777 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWill.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWill.java @@ -2,14 +2,11 @@ package WayofTime.bloodmagic.api.soul; import net.minecraft.item.ItemStack; -public interface IDemonWill -{ +public interface IDemonWill { /** * Obtains the amount of Will an ItemStack contains. - * - * @param willStack - * - The stack to retrieve the Will from - * + * + * @param willStack - The stack to retrieve the Will from * @return - The amount of Will an ItemStack contains */ double getWill(EnumDemonWillType type, ItemStack willStack); @@ -19,11 +16,9 @@ public interface IDemonWill /** * 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 + * + * @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); @@ -33,12 +28,9 @@ public interface IDemonWill /** * 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 - * + * + * @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); @@ -49,12 +41,9 @@ public interface IDemonWill /** * 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. - * + * + * @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); diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillConduit.java b/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillConduit.java index 3527af42..bfa3a253 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillConduit.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillConduit.java @@ -2,10 +2,8 @@ package WayofTime.bloodmagic.api.soul; /** * Implement this interface on a block that can accept and store Demonic Will. - * */ -public interface IDemonWillConduit -{ +public interface IDemonWillConduit { int getWeight(); double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill); diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillGem.java b/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillGem.java index cebfe039..26c90de5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillGem.java @@ -2,23 +2,18 @@ package WayofTime.bloodmagic.api.soul; import net.minecraft.item.ItemStack; -public interface IDemonWillGem -{ +public interface IDemonWillGem { /** - * - * @param willGemStack - * - The ItemStack for this demon will gem. - * @param willStack - * - The ItemStack for the will. Item should extend IDemonWill + * @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. + * 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); diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillWeapon.java b/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillWeapon.java index 1b3699b0..a24d804f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillWeapon.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillWeapon.java @@ -5,7 +5,6 @@ import net.minecraft.item.ItemStack; import java.util.List; -public interface IDemonWillWeapon -{ +public interface IDemonWillWeapon { List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting); } diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDiscreteDemonWill.java b/src/main/java/WayofTime/bloodmagic/api/soul/IDiscreteDemonWill.java index 7712cea6..d9ae26d6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDiscreteDemonWill.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/IDiscreteDemonWill.java @@ -2,14 +2,11 @@ package WayofTime.bloodmagic.api.soul; import net.minecraft.item.ItemStack; -public interface IDiscreteDemonWill -{ +public interface IDiscreteDemonWill { /** * Obtains the amount of Will an ItemStack contains. - * - * @param soulStack - * - The stack to retrieve the Will from - * + * + * @param soulStack - The stack to retrieve the Will from * @return - The amount of Will an ItemStack contains */ double getWill(ItemStack soulStack); @@ -18,32 +15,25 @@ public interface IDiscreteDemonWill * 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 - * + * + * @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 - * + * + * @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 - * + * + * @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/api/soul/PlayerDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java index 34c2cfa9..464245f5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java @@ -10,30 +10,22 @@ import net.minecraft.util.NonNullList; * Monster Souls and Soul Gems, etc. The Soul Network's helper methods are found * in {@link WayofTime.bloodmagic.api.util.helper.NetworkHelper} */ -public class PlayerDemonWillHandler -{ +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 - * + * + * @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, EntityPlayer player) - { + public static double getTotalDemonWill(EnumDemonWillType type, EntityPlayer player) { NonNullList inventory = player.inventory.mainInventory; double souls = 0; - for (ItemStack stack : inventory) - { - if (stack.getItem() instanceof IDemonWill && ((IDemonWill) stack.getItem()).getType(stack) == type) - { + 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) - { + } else if (stack.getItem() instanceof IDemonWillGem) { souls += ((IDemonWillGem) stack.getItem()).getWill(type, stack); } } @@ -41,16 +33,13 @@ public class PlayerDemonWillHandler return souls; } - public static EnumDemonWillType getLargestWillType(EntityPlayer player) - { + public static EnumDemonWillType getLargestWillType(EntityPlayer player) { EnumDemonWillType type = EnumDemonWillType.DEFAULT; double max = getTotalDemonWill(type, player); - for (EnumDemonWillType testType : EnumDemonWillType.values()) - { + for (EnumDemonWillType testType : EnumDemonWillType.values()) { double value = getTotalDemonWill(testType, player); - if (value > max) - { + if (value > max) { type = testType; } } @@ -60,23 +49,17 @@ public class PlayerDemonWillHandler /** * 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 - * + * + * @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, EntityPlayer player) - { + public static boolean isDemonWillFull(EnumDemonWillType type, EntityPlayer player) { NonNullList inventory = player.inventory.mainInventory; boolean hasGem = false; - for (ItemStack stack : inventory) - { - if (stack.getItem() instanceof IDemonWillGem) - { + 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; @@ -88,33 +71,26 @@ public class PlayerDemonWillHandler /** * 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 - * + * + * @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, EntityPlayer player, double amount) - { + public static double consumeDemonWill(EnumDemonWillType type, EntityPlayer player, double amount) { double consumed = 0; NonNullList inventory = player.inventory.mainInventory; - for (int i = 0; i < inventory.size(); i++) - { + 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) - { + 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) - { + } else if (stack.getItem() instanceof IDemonWillGem) { consumed += ((IDemonWillGem) stack.getItem()).drainWill(type, stack, amount - consumed, true); } } @@ -125,25 +101,19 @@ public class PlayerDemonWillHandler /** * 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 - * + * + * @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(EntityPlayer player, ItemStack willStack) - { + public static ItemStack addDemonWill(EntityPlayer player, ItemStack willStack) { if (willStack.isEmpty()) return ItemStack.EMPTY; NonNullList inventory = player.inventory.mainInventory; - for (ItemStack stack : inventory) - { - if (stack.getItem() instanceof IDemonWillGem) - { + for (ItemStack stack : inventory) { + if (stack.getItem() instanceof IDemonWillGem) { ItemStack newStack = ((IDemonWillGem) stack.getItem()).fillDemonWillGem(stack, willStack); if (newStack.isEmpty()) return ItemStack.EMPTY; @@ -156,25 +126,18 @@ public class PlayerDemonWillHandler /** * 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 - * + * + * @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, EntityPlayer player, double amount) - { + public static double addDemonWill(EnumDemonWillType type, EntityPlayer player, double amount) { NonNullList inventory = player.inventory.mainInventory; double remaining = amount; - for (ItemStack stack : inventory) - { - if (stack.getItem() instanceof IDemonWillGem) - { + for (ItemStack stack : inventory) { + if (stack.getItem() instanceof IDemonWillGem) { remaining -= ((IDemonWillGem) stack.getItem()).fillWill(type, stack, remaining, true); if (remaining <= 0) break; @@ -187,27 +150,19 @@ public class PlayerDemonWillHandler /** * 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 - * + * + * @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, EntityPlayer player, double amount, ItemStack ignored) - { + public static double addDemonWill(EnumDemonWillType type, EntityPlayer 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) - { + for (ItemStack stack : inventory) { + if (!stack.equals(ignored) && stack.getItem() instanceof IDemonWillGem) { remaining -= ((IDemonWillGem) stack.getItem()).fillWill(type, stack, remaining, true); if (remaining <= 0) diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/ITeleport.java b/src/main/java/WayofTime/bloodmagic/api/teleport/ITeleport.java index f9e48986..567b9052 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/ITeleport.java +++ b/src/main/java/WayofTime/bloodmagic/api/teleport/ITeleport.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.api.teleport; -public interface ITeleport -{ +public interface ITeleport { void teleport(); int getTeleportCost(); diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java b/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java index d4c2e9ce..094c195d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java +++ b/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java @@ -6,38 +6,24 @@ import net.minecraft.util.math.BlockPos; import java.io.Serializable; -public class PortalLocation implements 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) - { + 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) - { + public PortalLocation(BlockPos blockPos, int dimension) { this(blockPos.getX(), blockPos.getY(), blockPos.getZ(), dimension); } - public static PortalLocation readFromNBT(NBTTagCompound tag) - { - if (tag.hasKey(Constants.NBT.PORTAL_LOCATION)) - { - NBTTagCompound locationTag = tag.getCompoundTag(Constants.NBT.PORTAL_LOCATION); - return new PortalLocation(locationTag.getInteger(Constants.NBT.X_COORD), locationTag.getInteger(Constants.NBT.Y_COORD), locationTag.getInteger(Constants.NBT.Z_COORD), locationTag.getInteger(Constants.NBT.DIMENSION_ID)); - } - return null; - } - - public NBTTagCompound writeToNBT(NBTTagCompound tag) - { + public NBTTagCompound writeToNBT(NBTTagCompound tag) { NBTTagCompound locationTag = new NBTTagCompound(); locationTag.setInteger(Constants.NBT.X_COORD, x); @@ -49,14 +35,12 @@ public class PortalLocation implements Serializable return tag; } - public BlockPos getBlockPos() - { + public BlockPos getBlockPos() { return new BlockPos(x, y, z); } @Override - public boolean equals(Object o) - { + public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) @@ -73,8 +57,7 @@ public class PortalLocation implements Serializable } @Override - public int hashCode() - { + public int hashCode() { int result = x; result = 31 * result + y; result = 31 * result + z; @@ -96,4 +79,12 @@ public class PortalLocation implements Serializable public int getDimension() { return dimension; } + + public static PortalLocation readFromNBT(NBTTagCompound tag) { + if (tag.hasKey(Constants.NBT.PORTAL_LOCATION)) { + NBTTagCompound locationTag = tag.getCompoundTag(Constants.NBT.PORTAL_LOCATION); + return new PortalLocation(locationTag.getInteger(Constants.NBT.X_COORD), locationTag.getInteger(Constants.NBT.Y_COORD), locationTag.getInteger(Constants.NBT.Z_COORD), locationTag.getInteger(Constants.NBT.DIMENSION_ID)); + } + return null; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java b/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java index d2535574..72f64bf3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java +++ b/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java @@ -3,16 +3,14 @@ package WayofTime.bloodmagic.api.teleport; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; -public abstract class Teleport implements ITeleport -{ +public abstract class Teleport implements ITeleport { protected int x; protected int y; protected int z; protected Entity entity; protected String networkToDrain; - public Teleport(int x, int y, int z, Entity entity, String networkToDrain) - { + public Teleport(int x, int y, int z, Entity entity, String networkToDrain) { this.x = x; this.y = y; this.z = z; @@ -20,8 +18,7 @@ public abstract class Teleport implements ITeleport this.networkToDrain = networkToDrain; } - public Teleport(BlockPos blockPos, Entity entity, String networkToDrain) - { + public Teleport(BlockPos blockPos, Entity entity, String networkToDrain) { this(blockPos.getX(), blockPos.getY(), blockPos.getZ(), entity, networkToDrain); } diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleportQueue.java b/src/main/java/WayofTime/bloodmagic/api/teleport/TeleportQueue.java index d4a374cd..941afa9d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleportQueue.java +++ b/src/main/java/WayofTime/bloodmagic/api/teleport/TeleportQueue.java @@ -6,39 +6,32 @@ import net.minecraftforge.fml.common.gameevent.TickEvent; import java.util.ArrayList; import java.util.List; -public class TeleportQueue -{ +public class TeleportQueue { private static TeleportQueue INSTANCE = new TeleportQueue(); private static List queue; - public static TeleportQueue getInstance() - { - return INSTANCE; - } - - private TeleportQueue() - { + private TeleportQueue() { queue = new ArrayList(); } - public void addITeleport(ITeleport iTeleport) - { + public void addITeleport(ITeleport iTeleport) { queue.add(iTeleport); } @SubscribeEvent - public void serverTick(TickEvent.ServerTickEvent event) - { - if (event.phase != TickEvent.Phase.END) - { + public void serverTick(TickEvent.ServerTickEvent event) { + if (event.phase != TickEvent.Phase.END) { return; } - for (ITeleport iTeleport : queue) - { + for (ITeleport iTeleport : queue) { iTeleport.teleport(); } queue.clear(); } + + public static TeleportQueue getInstance() { + return INSTANCE; + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java b/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java index e24c0da2..148eab4a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java @@ -5,34 +5,28 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.Teleporter; import net.minecraft.world.WorldServer; -public class TeleporterBloodMagic extends Teleporter -{ - public TeleporterBloodMagic(WorldServer worldServer) - { +public class TeleporterBloodMagic extends Teleporter { + public TeleporterBloodMagic(WorldServer worldServer) { super(worldServer); } @Override - public boolean makePortal(Entity entity) - { + public boolean makePortal(Entity entity) { return true; } @Override - public void removeStalePortalLocations(long worldTime) - { + public void removeStalePortalLocations(long worldTime) { ; } @Override - public boolean placeInExistingPortal(Entity entityIn, float rotationYaw) - { + public boolean placeInExistingPortal(Entity entityIn, float rotationYaw) { return true; } @Override - public void placeInPortal(Entity entity, float rotationYaw) - { + 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/api/util/helper/BindableHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java index 7ebf7eaa..e21b2d92 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java @@ -11,19 +11,15 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import java.util.UUID; -public class BindableHelper -{ +public class BindableHelper { /** * 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 + * + * @param stack - The ItemStack to bind + * @param ownerName - The username to bind the ItemStack to */ - public static void setItemOwnerName(ItemStack stack, String ownerName) - { + public static void setItemOwnerName(ItemStack stack, String ownerName) { stack = NBTHelper.checkNBT(stack); stack.getTagCompound().setString(Constants.NBT.OWNER_NAME, ownerName); @@ -32,14 +28,11 @@ public class BindableHelper /** * 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 + * + * @param stack - The ItemStack to bind + * @param ownerUUID - The UUID to bind the ItemStack to */ - public static void setItemOwnerUUID(ItemStack stack, String ownerUUID) - { + public static void setItemOwnerUUID(ItemStack stack, String ownerUUID) { stack = NBTHelper.checkNBT(stack); stack.getTagCompound().setString(Constants.NBT.OWNER_UUID, ownerUUID); @@ -49,17 +42,14 @@ public class BindableHelper /** * Deprecated. - * + *

        * Built into {@link IBindable} now. - * - * @param stack - * - The ItemStack to check the owner of - * + * + * @param stack - The ItemStack to check the owner of * @return - The username of the ItemStack's owner */ @Deprecated - public static String getOwnerName(ItemStack stack) - { + public static String getOwnerName(ItemStack stack) { stack = NBTHelper.checkNBT(stack); return PlayerHelper.getUsernameFromStack(stack); @@ -67,17 +57,14 @@ public class BindableHelper /** * Deprecated. - * + *

        * Built into {@link IBindable} now. - * - * @param stack - * - The ItemStack to check the owner of - * + * + * @param stack - The ItemStack to check the owner of * @return - The UUID of the ItemStack's owner */ @Deprecated - public static String getOwnerUUID(ItemStack stack) - { + public static String getOwnerUUID(ItemStack stack) { stack = NBTHelper.checkNBT(stack); return stack.getTagCompound().getString(Constants.NBT.OWNER_UUID); @@ -85,41 +72,32 @@ public class BindableHelper /** * Deprecated. - * + *

        * Now handled automatically with * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} - * - * @param stack - * - The ItemStack to bind - * @param player - * - The Player to bind the ItemStack to - * + * + * @param stack - The ItemStack to bind + * @param player - The Player to bind the ItemStack to * @return - Whether binding was successful */ @Deprecated - public static boolean checkAndSetItemOwner(ItemStack stack, EntityPlayer player) - { + public static boolean checkAndSetItemOwner(ItemStack stack, EntityPlayer player) { return !PlayerHelper.isFakePlayer(player) && checkAndSetItemOwner(stack, PlayerHelper.getUUIDFromPlayer(player), player.getName()); } /** * Deprecated. - * + *

        * Now handled automatically with * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} - * - * @param stack - * - The ItemStack to bind - * @param uuid - * - The username to bind the ItemStack to - * @param currentUsername - * - The current name of the player. - * + * + * @param stack - The ItemStack to bind + * @param uuid - The username to bind the ItemStack to + * @param currentUsername - The current name of the player. * @return - Whether the binding was successful */ @Deprecated - public static boolean checkAndSetItemOwner(ItemStack stack, String uuid, String currentUsername) - { + public static boolean checkAndSetItemOwner(ItemStack stack, String uuid, String currentUsername) { stack = NBTHelper.checkNBT(stack); if (!(stack.getItem() instanceof IBindable)) @@ -144,36 +122,28 @@ public class BindableHelper /** * Deprecated. - * + *

        * Now handled automatically with * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} - * - * @param stack - * - ItemStack to check - * @param uuid - * - UUID of the Player - * @param currentUsername - * - The current name of the player. + * + * @param stack - ItemStack to check + * @param uuid - UUID of the Player + * @param currentUsername - The current name of the player. */ @Deprecated - public static boolean checkAndSetItemOwner(ItemStack stack, UUID uuid, String currentUsername) - { + public static boolean checkAndSetItemOwner(ItemStack stack, UUID uuid, String currentUsername) { return checkAndSetItemOwner(stack, uuid.toString(), currentUsername); } /** * Deprecated. - * + * + * @param stack - The ItemStack to bind + * @param ownerName - The username to bind the ItemStack to * @see #setItemOwnerName(ItemStack, String) - * - * @param stack - * - The ItemStack to bind - * @param ownerName - * - The username to bind the ItemStack to */ @Deprecated - public static void setItemOwner(ItemStack stack, String ownerName) - { + public static void setItemOwner(ItemStack stack, String ownerName) { setItemOwnerName(stack, ownerName); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/IncenseHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/IncenseHelper.java index 4fd64661..8e835696 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/IncenseHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/IncenseHelper.java @@ -4,21 +4,17 @@ import WayofTime.bloodmagic.api.Constants; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -public class IncenseHelper -{ - public static double getCurrentIncense(EntityPlayer player) - { +public class IncenseHelper { + public static double getCurrentIncense(EntityPlayer player) { NBTTagCompound data = player.getEntityData(); - if (data.hasKey(Constants.NBT.CURRENT_INCENSE)) - { + if (data.hasKey(Constants.NBT.CURRENT_INCENSE)) { return data.getDouble(Constants.NBT.CURRENT_INCENSE); } return 0; } - public static void setCurrentIncense(EntityPlayer player, double amount) - { + public static void setCurrentIncense(EntityPlayer player, double amount) { NBTTagCompound data = player.getEntityData(); data.setDouble(Constants.NBT.CURRENT_INCENSE, amount); } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/ItemHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/ItemHelper.java index 9657a11f..35a27909 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/ItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/ItemHelper.java @@ -11,36 +11,25 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class ItemHelper -{ +public class ItemHelper { // IItemLPContainer - public static class LPContainer - { + 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 - * + * + * @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()) - { + 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) - { + if (amount > 0) { int filledAmount = altar.fillMainTank(amount); amount -= filledAmount; fillable.setStoredLP(itemStack, amount); @@ -55,20 +44,14 @@ public class ItemHelper /** * 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 - * + * + * @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) - { + public static boolean addLPToItem(ItemStack stack, int toAdd, int maxCapacity) { + if (stack.getItem() instanceof IItemLPContainer) { IItemLPContainer fillable = (IItemLPContainer) stack.getItem(); stack = NBTHelper.checkNBT(stack); @@ -86,12 +69,9 @@ public class ItemHelper } } - public static class LivingUpgrades - { - public static LivingArmourUpgrade getUpgrade(ItemStack stack) - { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) - { + 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); @@ -101,19 +81,15 @@ public class ItemHelper return null; } - public static void setUpgrade(ItemStack stack, LivingArmourUpgrade upgrade) - { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) - { + 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) - { + public static void setKey(ItemStack stack, String key) { + if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -121,10 +97,8 @@ public class ItemHelper } } - public static String getKey(ItemStack stack) - { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) - { + public static String getKey(ItemStack stack) { + if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -134,10 +108,8 @@ public class ItemHelper return ""; } - public static void setLevel(ItemStack stack, int level) - { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) - { + public static void setLevel(ItemStack stack, int level) { + if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -145,10 +117,8 @@ public class ItemHelper } } - public static int getLevel(ItemStack stack) - { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) - { + public static int getLevel(ItemStack stack) { + if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java index a7fe7f78..bc10f82e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java @@ -4,40 +4,33 @@ import WayofTime.bloodmagic.api.BloodMagicAPI; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public class LogHelper -{ +public class LogHelper { private Logger logger; - public LogHelper(String logger) - { + public LogHelper(String logger) { this.logger = LogManager.getLogger(logger); } - public void info(String info, Object... format) - { + public void info(String info, Object... format) { if (BloodMagicAPI.loggingEnabled) logger.info(info, format); } - public void error(String error, Object... format) - { + public void error(String error, Object... format) { if (BloodMagicAPI.loggingEnabled) logger.error(error, format); } - public void debug(String debug, Object... format) - { + public void debug(String debug, Object... format) { if (BloodMagicAPI.loggingEnabled) logger.debug(debug, format); } - public void fatal(String fatal, Object... format) - { + public void fatal(String fatal, Object... format) { logger.error(fatal, format); } - public Logger getLogger() - { + public Logger getLogger() { return logger; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/NBTHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/NBTHelper.java index f189483b..6c1985da 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/NBTHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/NBTHelper.java @@ -3,10 +3,8 @@ package WayofTime.bloodmagic.api.util.helper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -public class NBTHelper -{ - public static ItemStack checkNBT(ItemStack stack) - { +public class NBTHelper { + public static ItemStack checkNBT(ItemStack stack) { if (stack.getTagCompound() == null) stack.setTagCompound(new NBTTagCompound()); diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java index 8b1396d6..6e4ae4fe 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java @@ -17,28 +17,23 @@ import net.minecraftforge.fml.common.eventhandler.Event; import java.util.UUID; -public class NetworkHelper -{ +public class NetworkHelper { // Get /** * Gets the SoulNetwork for the player. - * - * @param uuid - * - The UUID of the SoulNetwork owner - this is UUID.toString(). - * + * + * @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) - { + 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)); BMWorldSavedData saveData = (BMWorldSavedData) world.getMapStorage().getOrLoadData(BMWorldSavedData.class, BMWorldSavedData.ID); - if (saveData == null) - { + if (saveData == null) { saveData = new BMWorldSavedData(); world.getMapStorage().setData(BMWorldSavedData.ID, saveData); } @@ -47,42 +42,32 @@ public class NetworkHelper } /** + * @param uuid - The Player's Mojang UUID * @see NetworkHelper#getSoulNetwork(String) - * - * @param uuid - * - The Player's Mojang UUID */ - public static SoulNetwork getSoulNetwork(UUID uuid) - { + public static SoulNetwork getSoulNetwork(UUID uuid) { return getSoulNetwork(uuid.toString()); } /** + * @param player - The Player * @see NetworkHelper#getSoulNetwork(String) - * - * @param player - * - The Player */ - public static SoulNetwork getSoulNetwork(EntityPlayer player) - { + public static SoulNetwork getSoulNetwork(EntityPlayer player) { return getSoulNetwork(PlayerHelper.getUUIDFromPlayer(player)); } /** * Gets the current orb tier of the SoulNetwork. - * - * @param soulNetwork - * - SoulNetwork to get the tier of. - * + * + * @param soulNetwork - SoulNetwork to get the tier of. * @return - The Orb tier of the given SoulNetwork */ - public static int getCurrentMaxOrb(SoulNetwork soulNetwork) - { + public static int getCurrentMaxOrb(SoulNetwork soulNetwork) { return soulNetwork.getOrbTier(); } - public static int getMaximumForTier(int tier) - { + public static int getMaximumForTier(int tier) { int ret = 0; if (tier > OrbRegistry.getTierMap().size() || tier < 0) @@ -102,22 +87,17 @@ public class NetworkHelper /** * 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 - * + * + * @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(EntityPlayer)} and {@link SoulNetwork#syphonAndDamage(EntityPlayer, int)} */ @Deprecated - public static boolean syphonAndDamage(SoulNetwork soulNetwork, EntityPlayer user, int toSyphon) - { + public static boolean syphonAndDamage(SoulNetwork soulNetwork, EntityPlayer user, int toSyphon) { // if (soulNetwork.getPlayer() == null) // { @@ -130,12 +110,9 @@ public class NetworkHelper /** * Syphons a player from within a container. - * - * @param stack - * - ItemStack in the Container. - * @param toSyphon - * - Amount of LP to syphon - * + * + * @param stack - ItemStack in the Container. + * @param toSyphon - Amount of LP to syphon * @return - If the syphon was successful. */ public static boolean syphonFromContainer(ItemStack stack, int toSyphon) //TODO: Change to a String, int? @@ -155,16 +132,12 @@ public class NetworkHelper /** * Checks if the ItemStack has a user to be syphoned from. - * - * @param stack - * - ItemStack to check - * @param toSyphon - * - Amount of LP to syphon - * + * + * @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) - { + public static boolean canSyphonFromContainer(ItemStack stack, int toSyphon) { stack = NBTHelper.checkNBT(stack); String ownerName = stack.getTagCompound().getString(Constants.NBT.OWNER_UUID); @@ -180,14 +153,11 @@ public class NetworkHelper /** * 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 + * + * @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) - { + public static void setMaxOrb(SoulNetwork soulNetwork, int maxOrb) { soulNetwork.setOrbTier(Math.max(maxOrb, soulNetwork.getOrbTier())); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java index 75b5f6f9..348dc3d8 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java @@ -15,55 +15,46 @@ import net.minecraftforge.fml.relauncher.Side; import java.util.ArrayList; import java.util.UUID; -public class PlayerHelper -{ +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 String getUsernameFromPlayer(EntityPlayer player) - { + public static String getUsernameFromPlayer(EntityPlayer player) { return player.getEntityWorld().isRemote ? "" : UsernameCache.getLastKnownUsername(getUUIDFromPlayer(player)); } - public static EntityPlayer getPlayerFromUsername(String username) - { + public static EntityPlayer getPlayerFromUsername(String username) { if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) return null; return FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayerByUsername(username); } - public static EntityPlayer getPlayerFromUUID(String uuid) - { + public static EntityPlayer getPlayerFromUUID(String uuid) { return getPlayerFromUsername(getUsernameFromUUID(uuid)); } - public static EntityPlayer getPlayerFromUUID(UUID uuid) - { + public static EntityPlayer getPlayerFromUUID(UUID uuid) { return getPlayerFromUsername(getUsernameFromUUID(uuid)); } - public static UUID getUUIDFromPlayer(EntityPlayer player) - { + public static UUID getUUIDFromPlayer(EntityPlayer player) { return player.getGameProfile().getId(); } - public static String getUsernameFromUUID(String uuid) - { + public static String getUsernameFromUUID(String uuid) { return UsernameCache.getLastKnownUsername(UUID.fromString(uuid)); } - public static String getUsernameFromUUID(UUID uuid) - { + public static String getUsernameFromUUID(UUID uuid) { return UsernameCache.getLastKnownUsername(uuid); } - public static String getUsernameFromStack(ItemStack stack) - { + public static String getUsernameFromStack(ItemStack stack) { stack = NBTHelper.checkNBT(stack); return stack.getTagCompound().getString(Constants.NBT.OWNER_NAME); @@ -71,19 +62,15 @@ public class PlayerHelper /** * Checks whether or not the given player is an "actual" player - * - * @param player - * - The player in question - * + * + * @param player - The player in question * @return If the player is fake or not */ - public static boolean isFakePlayer(EntityPlayer player) - { + public static boolean isFakePlayer(EntityPlayer player) { return player instanceof FakePlayer || (player != null && knownFakePlayers.contains(player.getClass().getCanonicalName())); } - public static void causeNauseaToPlayer(ItemStack stack) - { + public static void causeNauseaToPlayer(ItemStack stack) { if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) return; @@ -93,8 +80,7 @@ public class PlayerHelper causeNauseaToPlayer(stack.getTagCompound().getString(Constants.NBT.OWNER_UUID)); } - public static void causeNauseaToPlayer(String ownerName) - { + public static void causeNauseaToPlayer(String ownerName) { EntityPlayer player = getPlayerFromUsername(ownerName); if (player == null) diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java index aa0702b7..4691fadc 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java @@ -13,27 +13,22 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; -public class PlayerSacrificeHelper -{ +public class PlayerSacrificeHelper { public static float scalingOfSacrifice = 1f; public static int soulFrayDuration = 400; public static Potion soulFrayId; - public static double getPlayerIncense(EntityPlayer player) - { + public static double getPlayerIncense(EntityPlayer player) { return IncenseHelper.getCurrentIncense(player); } - public static void setPlayerIncense(EntityPlayer player, double amount) - { + public static void setPlayerIncense(EntityPlayer player, double amount) { IncenseHelper.setCurrentIncense(player, amount); } - public static boolean incrementIncense(EntityPlayer player, double min, double incenseAddition, double increment) - { + public static boolean incrementIncense(EntityPlayer player, double min, double incenseAddition, double increment) { double amount = getPlayerIncense(player); - if (amount < min || amount >= incenseAddition) - { + if (amount < min || amount >= incenseAddition) { return false; } @@ -49,28 +44,22 @@ public class PlayerSacrificeHelper /** * Sacrifices a player's health while the player is under the influence of * incense - * - * @param player - * - The player sacrificing - * + * + * @param player - The player sacrificing * @return Whether or not the health sacrificing succeeded */ - public static boolean sacrificePlayerHealth(EntityPlayer player) - { - if (player.isPotionActive(soulFrayId)) - { + public static boolean sacrificePlayerHealth(EntityPlayer player) { + if (player.isPotionActive(soulFrayId)) { return false; } double amount = getPlayerIncense(player); - if (amount >= 0) - { + if (amount >= 0) { float health = player.getHealth(); float maxHealth = player.getMaxHealth(); - if (health > maxHealth / 10.0) - { + if (health > maxHealth / 10.0) { float sacrificedHealth = health - maxHealth / 10.0f; int lpAdded = (int) (sacrificedHealth * ConfigHandler.sacrificialDaggerConversion * getModifier(amount)); @@ -78,8 +67,7 @@ public class PlayerSacrificeHelper if (MinecraftForge.EVENT_BUS.post(evt)) return false; - if (findAndFillAltar(player.getEntityWorld(), player, evt.lpAdded, false)) - { + if (findAndFillAltar(player.getEntityWorld(), player, evt.lpAdded, false)) { player.setHealth(maxHealth / 10.0f); setPlayerIncense(player, 0); player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, soulFrayDuration)); @@ -92,28 +80,21 @@ public class PlayerSacrificeHelper return false; } - public static double getModifier(double amount) - { + public static double getModifier(double amount) { return 1 + amount * scalingOfSacrifice; } /** * 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 EntityPlayer} 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 - * + * + * @param world - The world + * @param sacrificingEntity - The entity having the sacrifice done on (can be + * {@link EntityPlayer} 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, EntityLivingBase sacrificingEntity, int amount, boolean isSacrifice) - { + public static boolean findAndFillAltar(World world, EntityLivingBase sacrificingEntity, int amount, boolean isSacrifice) { IBloodAltar altarEntity = getAltar(world, sacrificingEntity.getPosition()); if (altarEntity == null) @@ -127,30 +108,22 @@ public class PlayerSacrificeHelper /** * 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) - * + * + * @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 + * null */ - public static IBloodAltar getAltar(World world, BlockPos blockPos) - { + 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++) - { + 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) - { + if (tileEntity instanceof IBloodAltar) { return (IBloodAltar) tileEntity; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java index 4bf13551..60e8bda7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java @@ -1,35 +1,29 @@ package WayofTime.bloodmagic.api.util.helper; +import WayofTime.bloodmagic.api.Constants; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.nbt.NBTTagCompound; -import WayofTime.bloodmagic.api.Constants; -public class PurificationHelper -{ - public static double getCurrentPurity(EntityAnimal animal) - { +public class PurificationHelper { + public static double getCurrentPurity(EntityAnimal animal) { NBTTagCompound data = animal.getEntityData(); - if (data.hasKey(Constants.NBT.CURRENT_PURITY)) - { + if (data.hasKey(Constants.NBT.CURRENT_PURITY)) { return data.getDouble(Constants.NBT.CURRENT_PURITY); } return 0; } - public static void setCurrentPurity(EntityAnimal animal, double amount) - { + public static void setCurrentPurity(EntityAnimal animal, double amount) { NBTTagCompound data = animal.getEntityData(); data.setDouble(Constants.NBT.CURRENT_PURITY, amount); } - public static double addPurity(EntityAnimal animal, double added, double max) - { + public static double addPurity(EntityAnimal animal, double added, double max) { double currentPurity = getCurrentPurity(animal); double newAmount = Math.min(max, currentPurity + added); - if (newAmount < max) - { + if (newAmount < max) { setCurrentPurity(animal, newAmount); return newAmount - currentPurity; } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java index ac74a042..9597d969 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java @@ -16,26 +16,22 @@ import net.minecraftforge.common.capabilities.CapabilityInject; import java.util.ArrayList; -public class RitualHelper -{ +public class RitualHelper { @CapabilityInject(IRitualStone.Tile.class) static Capability RUNE_CAPABILITY = null; - public static boolean canCrystalActivate(Ritual ritual, int crystalLevel) - { + public static boolean canCrystalActivate(Ritual ritual, int crystalLevel) { return ritual.getCrystalLevel() <= crystalLevel && RitualRegistry.ritualEnabled(ritual); } - public static String getNextRitualKey(String currentKey) - { + public static String getNextRitualKey(String currentKey) { int currentIndex = RitualRegistry.getIds().indexOf(currentKey); int nextIndex = RitualRegistry.getRituals().listIterator(currentIndex).nextIndex(); return RitualRegistry.getIds().get(nextIndex); } - public static String getPrevRitualKey(String currentKey) - { + public static String getPrevRitualKey(String currentKey) { int currentIndex = RitualRegistry.getIds().indexOf(currentKey); int previousIndex = RitualRegistry.getIds().listIterator(currentIndex).previousIndex(); @@ -45,23 +41,16 @@ public class RitualHelper /** * 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 - * + * + * @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 (String key : RitualRegistry.getIds()) - { - for (EnumFacing direction : EnumFacing.HORIZONTALS) - { + public static String getValidRitual(World world, BlockPos pos) { + for (String key : RitualRegistry.getIds()) { + for (EnumFacing direction : EnumFacing.HORIZONTALS) { boolean test = checkValidRitual(world, pos, key, direction); - if (test) - { + if (test) { return key; } } @@ -70,13 +59,10 @@ public class RitualHelper return ""; } - public static EnumFacing getDirectionOfRitual(World world, BlockPos pos, String key) - { - for (EnumFacing direction : EnumFacing.HORIZONTALS) - { + public static EnumFacing getDirectionOfRitual(World world, BlockPos pos, String key) { + for (EnumFacing direction : EnumFacing.HORIZONTALS) { boolean test = checkValidRitual(world, pos, key, direction); - if (test) - { + if (test) { return direction; } } @@ -84,11 +70,9 @@ public class RitualHelper return null; } - public static boolean checkValidRitual(World world, BlockPos pos, String ritualId, EnumFacing direction) - { + public static boolean checkValidRitual(World world, BlockPos pos, String ritualId, EnumFacing direction) { Ritual ritual = RitualRegistry.getRitualForId(ritualId); - if (ritual == null) - { + if (ritual == null) { return false; } @@ -97,14 +81,11 @@ public class RitualHelper if (components == null) return false; - for (RitualComponent component : components) - { + for (RitualComponent component : components) { BlockPos newPos = pos.add(component.getOffset(direction)); - if (isRuneType(world, newPos, component.getRuneType())) - { + if (isRuneType(world, newPos, component.getRuneType())) { continue; - } else - { + } else { return false; } } @@ -112,8 +93,7 @@ public class RitualHelper return true; } - public static boolean isRuneType(World world, BlockPos pos, EnumRuneType type) - { + public static boolean isRuneType(World world, BlockPos pos, EnumRuneType type) { if (world == null) return false; Block block = world.getBlockState(pos).getBlock(); @@ -129,8 +109,7 @@ public class RitualHelper return false; } - public static boolean isRune(World world, BlockPos pos) - { + public static boolean isRune(World world, BlockPos pos) { if (world == null) return false; Block block = world.getBlockState(pos).getBlock(); @@ -146,8 +125,7 @@ public class RitualHelper return false; } - public static void setRuneType(World world, BlockPos pos, EnumRuneType type) - { + public static void setRuneType(World world, BlockPos pos, EnumRuneType type) { if (world == null) return; IBlockState state = world.getBlockState(pos); @@ -157,8 +135,7 @@ public class RitualHelper ((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)) - { + else if (tile != null && tile.hasCapability(RUNE_CAPABILITY, null)) { tile.getCapability(RUNE_CAPABILITY, null).setRuneType(type); world.notifyBlockUpdate(pos, state, state, 3); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java index 589703ee..1e02ef13 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.block; -import java.util.List; -import java.util.Random; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.tile.TileAlchemyArray; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -22,18 +22,15 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import WayofTime.bloodmagic.util.Utils; import javax.annotation.Nullable; +import java.util.List; +import java.util.Random; -public class BlockAlchemyArray extends Block -{ +public class BlockAlchemyArray extends Block { protected static final AxisAlignedBB ARRAY_AABB = new AxisAlignedBB(0, 0, 0, 1, 0.1, 1); - public BlockAlchemyArray() - { + public BlockAlchemyArray() { super(Material.CLOTH); setUnlocalizedName(BloodMagic.MODID + ".alchemyArray"); @@ -46,61 +43,51 @@ public class BlockAlchemyArray extends Block } @Override - public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) - { + public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAlchemyArray) - { + if (tile instanceof TileAlchemyArray) { ((TileAlchemyArray) tile).onEntityCollidedWithBlock(state, entity); } } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) - { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return ARRAY_AABB; } @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() - { + public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.CUTOUT; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.INVISIBLE; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { //TODO: Right click should rotate it TileAlchemyArray array = (TileAlchemyArray) world.getTileEntity(pos); @@ -109,17 +96,13 @@ public class BlockAlchemyArray extends Block ItemStack playerItem = player.getHeldItem(hand); - if (!playerItem.isEmpty()) - { - if (array.getStackInSlot(0).isEmpty()) - { + if (!playerItem.isEmpty()) { + if (array.getStackInSlot(0).isEmpty()) { Utils.insertItemToTile(array, player, 0); - } else if (!array.getStackInSlot(0).isEmpty()) - { + } else if (!array.getStackInSlot(0).isEmpty()) { Utils.insertItemToTile(array, player, 1); array.attemptCraft(); - } else - { + } else { return true; } } @@ -129,20 +112,17 @@ public class BlockAlchemyArray extends Block } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) - { + public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES); } @Override - public int quantityDropped(Random random) - { + public int quantityDropped(Random random) { return 0; } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileAlchemyArray alchemyArray = (TileAlchemyArray) world.getTileEntity(blockPos); if (alchemyArray != null) alchemyArray.dropItems(); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java index ce4bc9d0..16380c15 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -1,6 +1,9 @@ package WayofTime.bloodmagic.block; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.item.block.ItemBlockAlchemyTable; +import WayofTime.bloodmagic.tile.TileAlchemyTable; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyBool; @@ -17,19 +20,14 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.tile.TileAlchemyTable; import javax.annotation.Nullable; -public class BlockAlchemyTable extends Block implements IBMBlock -{ +public class BlockAlchemyTable extends Block implements IBMBlock { public static final PropertyBool INVISIBLE = PropertyBool.create("invisible"); public static final PropertyEnum DIRECTION = PropertyEnum.create("direction", EnumFacing.class); - public BlockAlchemyTable() - { + public BlockAlchemyTable() { super(Material.ROCK); // this.setDefaultState(this.blockState.getBaseState().withProperty(DIRECTION, EnumFacing.DOWN).withProperty(INVISIBLE, false)); @@ -43,44 +41,37 @@ public class BlockAlchemyTable extends Block implements IBMBlock } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) - { + public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.TRANSLUCENT; } @Override - public IBlockState getStateFromMeta(int meta) - { + public IBlockState getStateFromMeta(int meta) { return this.getDefaultState(); } @@ -88,17 +79,14 @@ public class BlockAlchemyTable extends Block implements IBMBlock * Convert the BlockState into the correct metadata value */ @Override - public int getMetaFromState(IBlockState state) - { + public int getMetaFromState(IBlockState state) { return 0; } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) - { + public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAlchemyTable) - { + if (tile instanceof TileAlchemyTable) { return state.withProperty(INVISIBLE, ((TileAlchemyTable) tile).isInvisible()).withProperty(DIRECTION, ((TileAlchemyTable) tile).getDirection()); } @@ -106,24 +94,19 @@ public class BlockAlchemyTable extends Block implements IBMBlock } @Override - protected BlockStateContainer createBlockState() - { + protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, DIRECTION, INVISIBLE); } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { BlockPos position = pos; TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAlchemyTable) - { - if (((TileAlchemyTable) tile).isSlave()) - { + if (tile instanceof TileAlchemyTable) { + if (((TileAlchemyTable) tile).isSlave()) { position = ((TileAlchemyTable) tile).getConnectedPos(); tile = world.getTileEntity(position); - if (!(tile instanceof TileAlchemyTable)) - { + if (!(tile instanceof TileAlchemyTable)) { return false; } } @@ -135,11 +118,9 @@ public class BlockAlchemyTable extends Block implements IBMBlock } @Override - public void breakBlock(World world, BlockPos pos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos pos, IBlockState blockState) { TileAlchemyTable tile = (TileAlchemyTable) world.getTileEntity(pos); - if (tile != null && !tile.isSlave()) - { + if (tile != null && !tile.isSlave()) { tile.dropItems(); } @@ -158,15 +139,12 @@ public class BlockAlchemyTable extends Block implements IBMBlock } @Override - public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) - { + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { TileAlchemyTable tile = (TileAlchemyTable) world.getTileEntity(pos); - if (tile != null) - { + if (tile != null) { BlockPos connectedPos = tile.getConnectedPos(); TileEntity connectedTile = world.getTileEntity(connectedPos); - if (!(connectedTile instanceof TileAlchemyTable && ((TileAlchemyTable) connectedTile).getConnectedPos().equals(pos))) - { + if (!(connectedTile instanceof TileAlchemyTable && ((TileAlchemyTable) connectedTile).getConnectedPos().equals(pos))) { this.breakBlock(world, pos, state); world.setBlockToAir(pos); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 53907ba8..886bbe25 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -1,13 +1,21 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; +import WayofTime.bloodmagic.api.altar.IAltarManipulator; import WayofTime.bloodmagic.api.altar.IBloodAltar; +import WayofTime.bloodmagic.api.iface.IAltarReader; +import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.iface.IDocumentedBlock; import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.api.saving.SoulNetwork; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.util.Utils; +import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -23,29 +31,15 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.altar.IAltarManipulator; -import WayofTime.bloodmagic.api.iface.IAltarReader; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.Utils; - -import com.google.common.base.Strings; - import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; -public class BlockAltar extends Block implements IVariantProvider, IDocumentedBlock, IBMBlock -{ - public BlockAltar() - { +public class BlockAltar extends Block implements IVariantProvider, IDocumentedBlock, IBMBlock { + public BlockAltar() { super(Material.ROCK); setUnlocalizedName(BloodMagic.MODID + ".altar"); @@ -56,32 +50,26 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl } @Override - public boolean hasComparatorInputOverride(IBlockState state) - { + public boolean hasComparatorInputOverride(IBlockState state) { return true; } @Override - public int getComparatorInputOverride(IBlockState state, World world, BlockPos pos) - { + public int getComparatorInputOverride(IBlockState state, World world, BlockPos pos) { if (world.isRemote) return 0; TileEntity tile = world.getTileEntity(pos); - if (tile != null && tile instanceof TileAltar) - { + if (tile != null && 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) - { + if (world.getBlockState(pos.down()).getBlock() instanceof BlockDecorative) { + if (orbStack.getItem() instanceof IBloodOrb && orbStack.getItem() instanceof IBindable) { BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); IBindable bindable = (IBindable) orbStack.getItem(); - if (orb != null && !Strings.isNullOrEmpty(bindable.getOwnerUUID(orbStack))) - { + if (orb != null && !Strings.isNullOrEmpty(bindable.getOwnerUUID(orbStack))) { SoulNetwork soulNetwork = NetworkHelper.getSoulNetwork(bindable.getOwnerUUID(orbStack)); int maxEssence = orb.getCapacity(); @@ -90,8 +78,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl return Math.min(15, level) % 16; } } - } else - { + } else { int maxEssence = altar.getCapacity(); int currentEssence = altar.getCurrentBlood(); int level = currentEssence * 15 / maxEssence; @@ -103,38 +90,32 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return true; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { TileAltar altar = (TileAltar) world.getTileEntity(pos); if (altar == null || player.isSneaking()) @@ -142,8 +123,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl ItemStack playerItem = player.inventory.getCurrentItem(); - if (playerItem.getItem() instanceof IAltarReader || playerItem.getItem() instanceof IAltarManipulator) - { + if (playerItem.getItem() instanceof IAltarReader || playerItem.getItem() instanceof IAltarManipulator) { playerItem.getItem().onItemRightClick(world, player, hand); return true; } @@ -158,11 +138,9 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileAltar) - { + if (tile instanceof TileAltar) { TileAltar tileAltar = (TileAltar) world.getTileEntity(blockPos); if (tileAltar != null) tileAltar.dropItems(); @@ -185,8 +163,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl // IVariantProvider @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; @@ -195,8 +172,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl // IDocumentedBlock @Override - public List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state) - { + public List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state) { List docs = new ArrayList(); IBloodAltar altar = ((IBloodAltar) world.getTileEntity(pos)); Pair missingBlock = BloodAltar.getAltarMissingBlock(world, pos, altar.getTier().toInt()); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java index 3b395958..71f9d92e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -1,8 +1,7 @@ package WayofTime.bloodmagic.block; -import java.util.Random; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -17,16 +16,14 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import javax.annotation.Nullable; +import java.util.Random; -public class BlockBloodLight extends Block -{ +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() - { + public BlockBloodLight() { super(Material.CLOTH); setUnlocalizedName(BloodMagic.MODID + ".bloodLight"); @@ -34,66 +31,55 @@ public class BlockBloodLight extends Block @Nullable @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) - { + public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { return null; } @Override - public boolean isCollidable() - { + public boolean isCollidable() { return false; } @Override - public boolean isReplaceable(IBlockAccess world, BlockPos pos) - { + public boolean isReplaceable(IBlockAccess world, BlockPos pos) { return true; } @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() - { + public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.CUTOUT; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public int getLightValue(IBlockState state) - { + public int getLightValue(IBlockState state) { return 15; } @Override @SideOnly(Side.CLIENT) - public boolean addDestroyEffects(World world, BlockPos pos, ParticleManager particleManager) - { - if (world.getBlockState(pos).getBlock() == this) - { + 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); } @@ -102,15 +88,12 @@ public class BlockBloodLight extends Block @Override @SideOnly(Side.CLIENT) - public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) - { + public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) { EntityPlayerSP playerSP = Minecraft.getMinecraft().player; - if (rand.nextInt(3) != 0) - { + 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); - if (!playerSP.getActiveItemStack().isEmpty() && playerSP.getActiveItemStack().getItem() == RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT) - { + if (!playerSP.getActiveItemStack().isEmpty() && playerSP.getActiveItemStack().getItem() == RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT) { 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); 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); 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); @@ -119,14 +102,12 @@ public class BlockBloodLight extends Block } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) - { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public int quantityDropped(Random par1Random) - { + 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 index 30e399f4..bd440dd3 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java @@ -1,28 +1,19 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumBloodRune; -import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +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.world.World; -public class BlockBloodRune extends BlockEnum -{ - public BlockBloodRune() - { +import java.util.List; + +public class BlockBloodRune extends BlockEnum { + public BlockBloodRune() { super(Material.ROCK, EnumBloodRune.class); setUnlocalizedName(BloodMagic.MODID + ".rune."); @@ -33,14 +24,12 @@ public class BlockBloodRune extends BlockEnum setHarvestLevel("pickaxe", 2); } - public int getRuneEffect(int meta) - { + public int getRuneEffect(int meta) { return meta; } @Override - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) - { + 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 index f08e8135..6637e06d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -24,24 +24,19 @@ 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.FluidActionResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; -import java.util.ArrayList; import java.util.List; -public class BlockBloodTank extends BlockInteger implements IVariantProvider, IBMBlock -{ +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() - { + public BlockBloodTank() { super(Material.IRON, TileBloodTank.CAPACITIES.length - 1, "tier"); setUnlocalizedName(BloodMagic.MODID + ".bloodTank"); @@ -55,39 +50,33 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB @Nullable @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) - { + public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { return BOX; } @Override - public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) - { + public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) { return BOX; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() - { + public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.CUTOUT_MIPPED; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @@ -103,11 +92,9 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public boolean onBlockActivated(World world, BlockPos blockPos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos blockPos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { boolean success = FluidUtil.interactWithFluidHandler(player, hand, world, blockPos, side); - if (success) - { + if (success) { world.checkLight(blockPos); world.updateComparatorOutputLevel(blockPos, this); world.markAndNotifyBlock(blockPos, world.getChunkFromBlockCoords(blockPos), state, state, 3); @@ -118,21 +105,18 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) - { + public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) { if (!player.capabilities.isCreativeMode) this.dropBlockAsItem(worldIn, pos, state, 0); super.onBlockHarvested(worldIn, pos, state, player); } @Override - public List getDrops(IBlockAccess world, BlockPos pos, IBlockState blockState, int fortune) - { + public List getDrops(IBlockAccess world, BlockPos pos, IBlockState blockState, int fortune) { List list = Lists.newArrayList(); TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileBloodTank) - { + if (tile instanceof TileBloodTank) { TileBloodTank bloodTank = (TileBloodTank) tile; ItemStack drop = new ItemStack(this, 1, bloodTank.getBlockMetadata()); NBTTagCompound tag = new NBTTagCompound(); @@ -148,15 +132,12 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public void onBlockPlacedBy(World world, BlockPos pos, IBlockState blockState, EntityLivingBase placer, ItemStack stack) - { + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState blockState, EntityLivingBase placer, ItemStack stack) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileBloodTank) - { + if (tile instanceof TileBloodTank) { TileBloodTank bloodTank = (TileBloodTank) tile; NBTTagCompound tag = stack.getTagCompound(); - if (tag != null) - { + if (tag != null) { FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); bloodTank.getTank().setFluid(fluidStack); } @@ -168,11 +149,9 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) - { + public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileBloodTank) - { + if (tile instanceof TileBloodTank) { FluidStack fluidStack = ((TileBloodTank) tile).getTank().getFluid(); return fluidStack == null || fluidStack.amount <= 0 ? 0 : fluidStack.getFluid().getLuminosity(fluidStack); } @@ -181,20 +160,17 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) - { + public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { return new ItemStack(this, 1, getMetaFromState(state)); } @Override - public boolean hasComparatorInputOverride(IBlockState state) - { + public boolean hasComparatorInputOverride(IBlockState state) { return true; } @Override - public int getComparatorInputOverride(IBlockState state, World world, BlockPos pos) - { + public int getComparatorInputOverride(IBlockState state, World world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBloodTank) return ((TileBloodTank) tile).getComparatorOutput(); @@ -202,14 +178,12 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public TileEntity createTileEntity(World worldIn, IBlockState blockState) - { + public TileEntity createTileEntity(World worldIn, IBlockState blockState) { return new TileBloodTank(getMetaFromState(blockState)); } @Override - public boolean hasTileEntity(IBlockState state) - { + public boolean hasTileEntity(IBlockState state) { return true; } @@ -221,8 +195,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB // IVariantProvider @Override - public List> getVariants() - { + public List> getVariants() { List> ret = Lists.newArrayList(); for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) ret.add(Pair.of(i, "inventory")); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java index a22fd8a8..281b4fb5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java @@ -1,16 +1,13 @@ package WayofTime.bloodmagic.block; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumDecorative; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; -public class BlockDecorative extends BlockEnum -{ - public BlockDecorative() - { +public class BlockDecorative extends BlockEnum { + public BlockDecorative() { super(Material.ROCK, EnumDecorative.class); setUnlocalizedName(BloodMagic.MODID + "."); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java index e093621a..782758fa 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java @@ -1,22 +1,14 @@ package WayofTime.bloodmagic.block; -import java.util.List; - -import com.google.common.collect.Lists; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.util.IStringSerializable; - -import org.apache.commons.lang3.tuple.Pair; - 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) - { +public class BlockDemonBase & IStringSerializable> extends BlockEnum implements IVariantProvider { + public BlockDemonBase(String baseName, Class enumClass) { super(Material.ROCK, enumClass); setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 986aec2e..b0bfcfb1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -1,8 +1,11 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.soul.IDemonWillGem; +import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.tile.TileDemonCrucible; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -16,23 +19,15 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.IDemonWillGem; -import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileDemonCrucible; -import WayofTime.bloodmagic.util.Utils; - import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; -public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBlock -{ - public BlockDemonCrucible() - { +public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBlock { + public BlockDemonCrucible() { super(Material.ROCK); setUnlocalizedName(BloodMagic.MODID + ".demonCrucible"); @@ -45,42 +40,35 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing 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)) - { + if (!heldItem.isEmpty()) { + if (!(heldItem.getItem() instanceof IDiscreteDemonWill) && !(heldItem.getItem() instanceof IDemonWillGem)) { return true; } } @@ -92,8 +80,7 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileDemonCrucible tile = (TileDemonCrucible) world.getTileEntity(blockPos); if (tile != null) tile.dropItems(); @@ -113,8 +100,7 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 7f9e6a24..a6964776 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -1,8 +1,11 @@ package WayofTime.bloodmagic.block; -import java.util.Random; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.item.ItemDemonCrystal; import WayofTime.bloodmagic.item.block.ItemBlockDemonCrystal; +import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyEnum; @@ -11,7 +14,6 @@ import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -22,24 +24,16 @@ import net.minecraft.util.NonNullList; 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 WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.item.ItemDemonCrystal; -import WayofTime.bloodmagic.tile.TileDemonCrystal; import javax.annotation.Nullable; +import java.util.Random; -public class BlockDemonCrystal extends Block implements IBMBlock -{ +public class BlockDemonCrystal extends Block implements IBMBlock { 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", EnumFacing.class); - public BlockDemonCrystal() - { + public BlockDemonCrystal() { super(Material.ROCK); this.setDefaultState(this.blockState.getBaseState().withProperty(TYPE, EnumDemonWillType.DEFAULT).withProperty(ATTACHED, EnumFacing.UP)); @@ -51,8 +45,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock } @Override - public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side) - { + public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side) { BlockPos offsetPos = pos.offset(side.getOpposite()); IBlockState offsetState = world.getBlockState(offsetPos); Block offsetBlock = offsetState.getBlock(); @@ -61,25 +54,21 @@ public class BlockDemonCrystal extends Block implements IBMBlock } @Override - public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) - { + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); EnumFacing placement = tile.getPlacement(); BlockPos offsetPos = pos.offset(placement.getOpposite()); IBlockState offsetState = world.getBlockState(offsetPos); Block offsetBlock = offsetState.getBlock(); - if (!offsetBlock.isSideSolid(offsetState, world, offsetPos, placement)) - { + if (!offsetBlock.isSideSolid(offsetState, world, offsetPos, placement)) { world.setBlockToAir(pos); } } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) - { - if (world.getTileEntity(pos) == null) - { + public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { + if (world.getTileEntity(pos) == null) { return state; } TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); @@ -87,39 +76,33 @@ public class BlockDemonCrystal extends Block implements IBMBlock } @Override - public void getSubBlocks(CreativeTabs creativeTabs, NonNullList list) - { + public void getSubBlocks(CreativeTabs creativeTabs, NonNullList list) { for (int i = 0; i < EnumDemonWillType.values().length; i++) list.add(new ItemStack(this, 1, i)); } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @@ -132,8 +115,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock * Convert the given metadata into a BlockState for this Block */ @Override - public IBlockState getStateFromMeta(int meta) - { + public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(TYPE, EnumDemonWillType.values()[meta]); } @@ -141,20 +123,17 @@ public class BlockDemonCrystal extends Block implements IBMBlock * Convert the BlockState into the correct metadata value */ @Override - public int getMetaFromState(IBlockState state) - { + public int getMetaFromState(IBlockState state) { return state.getValue(TYPE).ordinal(); } @Override - protected BlockStateContainer createBlockState() - { + protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, TYPE, AGE, ATTACHED); } @Override - public void breakBlock(World world, BlockPos pos, IBlockState state) - { + public void breakBlock(World world, BlockPos pos, IBlockState state) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileDemonCrystal) { EnumDemonWillType type = state.getValue(TYPE); @@ -167,50 +146,20 @@ public class BlockDemonCrystal extends Block implements IBMBlock super.breakBlock(world, pos, state); } - public static ItemStack getItemStackDropped(EnumDemonWillType type, int crystalNumber) - { - ItemStack stack = null; - switch (type) - { - case CORROSIVE: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE); - break; - case DEFAULT: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT); - break; - case DESTRUCTIVE: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE); - break; - case STEADFAST: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST); - break; - case VENGEFUL: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL); - break; - } - - stack.setCount(crystalNumber); - return stack; - } - @Override - public int quantityDropped(Random random) - { + public int quantityDropped(Random random) { return 0; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { - if (world.isRemote) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + if (world.isRemote) { return true; } TileDemonCrystal crystal = (TileDemonCrystal) world.getTileEntity(pos); - if (PlayerDemonWillHandler.getTotalDemonWill(EnumDemonWillType.DEFAULT, player) > 1024) - { + if (PlayerDemonWillHandler.getTotalDemonWill(EnumDemonWillType.DEFAULT, player) > 1024) { crystal.dropSingleCrystal(); world.notifyBlockUpdate(pos, state, state, 3); @@ -235,6 +184,30 @@ public class BlockDemonCrystal extends Block implements IBMBlock return new ItemBlockDemonCrystal(this); } + public static ItemStack getItemStackDropped(EnumDemonWillType type, int crystalNumber) { + ItemStack stack = null; + switch (type) { + case CORROSIVE: + stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE); + break; + case DEFAULT: + stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT); + break; + case DESTRUCTIVE: + stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE); + break; + case STEADFAST: + stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST); + break; + case VENGEFUL: + stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL); + break; + } + + stack.setCount(crystalNumber); + return stack; + } + // @Override // public java.util.List getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune) // { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java index b5b60903..0b255c05 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.tile.TileDemonCrystallizer; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -13,18 +13,14 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileDemonCrystallizer; +import java.util.ArrayList; +import java.util.List; -public class BlockDemonCrystallizer extends BlockContainer implements IVariantProvider, IBMBlock -{ - public BlockDemonCrystallizer() - { +public class BlockDemonCrystallizer extends BlockContainer implements IVariantProvider, IBMBlock { + public BlockDemonCrystallizer() { super(Material.ROCK); setUnlocalizedName(BloodMagic.MODID + ".demonCrystallizer"); @@ -37,50 +33,42 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr } @Override - public boolean isSideSolid(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) - { + public boolean isSideSolid(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { return side == EnumFacing.UP; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileDemonCrystallizer(); } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java index 6d776883..f78e7266 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java @@ -1,23 +1,13 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumSubWillType; -import WayofTime.bloodmagic.client.IVariantProvider; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; -public class BlockDemonLight extends BlockEnum -{ - public BlockDemonLight() - { +public class BlockDemonLight extends BlockEnum { + public BlockDemonLight() { super(Material.ROCK, EnumSubWillType.class); setUnlocalizedName(BloodMagic.MODID + ".demonlight."); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java index 53c2c495..44c7f95f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java @@ -1,22 +1,18 @@ package WayofTime.bloodmagic.block; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.base.BlockEnumPillar; import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnumPillar; +import java.util.List; -public class BlockDemonPillarBase & IStringSerializable> extends BlockEnumPillar -{ - public BlockDemonPillarBase(String baseName, Material materialIn, Class enumClass) - { +public class BlockDemonPillarBase & IStringSerializable> extends BlockEnumPillar { + public BlockDemonPillarBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); @@ -28,12 +24,11 @@ public class BlockDemonPillarBase & IStringSerializable> exten } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = Lists.newArrayList(); //This is done to make the ItemBlocks have the proper model - EnumFacing.Axis[] axis = new EnumFacing.Axis[] { EnumFacing.Axis.Y, EnumFacing.Axis.X, EnumFacing.Axis.Z }; + EnumFacing.Axis[] axis = new EnumFacing.Axis[]{EnumFacing.Axis.Y, EnumFacing.Axis.X, EnumFacing.Axis.Z}; for (int i = 0; i < 3; i++) for (int j = 0; j < this.getTypes().length; j++) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java index 865b89ca..51ef6dbb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java @@ -1,22 +1,18 @@ package WayofTime.bloodmagic.block; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.base.BlockEnumPillarCap; import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnumPillarCap; +import java.util.List; -public class BlockDemonPillarCapBase & IStringSerializable> extends BlockEnumPillarCap -{ - public BlockDemonPillarCapBase(String baseName, Material materialIn, Class enumClass) - { +public class BlockDemonPillarCapBase & IStringSerializable> extends BlockEnumPillarCap { + public BlockDemonPillarCapBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); @@ -28,8 +24,7 @@ public class BlockDemonPillarCapBase & IStringSerializable> ex } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = Lists.newArrayList(); //This is done to make the ItemBlocks have the proper model diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java index 1eda088e..28abe0f5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.tile.TileDemonPylon; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -11,18 +11,14 @@ import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileDemonPylon; +import java.util.ArrayList; +import java.util.List; -public class BlockDemonPylon extends BlockContainer implements IVariantProvider -{ - public BlockDemonPylon() - { +public class BlockDemonPylon extends BlockContainer implements IVariantProvider { + public BlockDemonPylon() { super(Material.ROCK); setUnlocalizedName(BloodMagic.MODID + ".demonPylon"); @@ -35,44 +31,37 @@ public class BlockDemonPylon extends BlockContainer implements IVariantProvider } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileDemonPylon(); } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java index 26ae4b4e..30166d16 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java @@ -1,24 +1,17 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.base.BlockEnumStairs; import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.IStringSerializable; - -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnumStairs; -import WayofTime.bloodmagic.client.IVariantProvider; +import java.util.List; -public class BlockDemonStairsBase & IStringSerializable> extends BlockEnumStairs -{ - public BlockDemonStairsBase(String baseName, Material materialIn, Class enumClass) - { +public class BlockDemonStairsBase & IStringSerializable> extends BlockEnumStairs { + public BlockDemonStairsBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); @@ -30,8 +23,7 @@ public class BlockDemonStairsBase & IStringSerializable> exten } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = Lists.newArrayList(); for (int i = 0; i < this.getTypes().length; i++) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java index 3bd4be9f..2ad6bfe1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java @@ -1,23 +1,17 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.base.BlockEnumWall; import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.IStringSerializable; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnumWall; -import WayofTime.bloodmagic.client.IVariantProvider; +import java.util.List; -public class BlockDemonWallBase & IStringSerializable> extends BlockEnumWall -{ - public BlockDemonWallBase(String baseName, Material materialIn, Class enumClass) - { +public class BlockDemonWallBase & IStringSerializable> extends BlockEnumWall { + public BlockDemonWallBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); @@ -29,8 +23,7 @@ public class BlockDemonWallBase & IStringSerializable> extends } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = Lists.newArrayList(); for (int i = 0; i < this.getTypes().length; i++) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 1fe90938..31361c34 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -1,10 +1,13 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.Random; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.api.teleport.PortalLocation; +import WayofTime.bloodmagic.api.teleport.TeleportQueue; import WayofTime.bloodmagic.block.base.BlockInteger; +import WayofTime.bloodmagic.ritual.portal.LocationsHandler; +import WayofTime.bloodmagic.ritual.portal.Teleports; +import WayofTime.bloodmagic.tile.TileDimensionalPortal; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; @@ -17,23 +20,17 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.teleport.PortalLocation; -import WayofTime.bloodmagic.api.teleport.TeleportQueue; -import WayofTime.bloodmagic.ritual.portal.LocationsHandler; -import WayofTime.bloodmagic.ritual.portal.Teleports; -import WayofTime.bloodmagic.tile.TileDimensionalPortal; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Random; -public class BlockDimensionalPortal extends BlockInteger -{ +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() - { + public BlockDimensionalPortal() { super(Material.PORTAL, 2); setUnlocalizedName(BloodMagic.MODID + ".dimensionalPortal"); setBlockUnbreakable(); @@ -42,79 +39,61 @@ public class BlockDimensionalPortal extends BlockInteger } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) - { + public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { return null; } - public boolean isOpaqueCube() - { + public boolean isOpaqueCube() { return false; } - public boolean isFullCube() - { + public boolean isFullCube() { return false; } @Override - public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) - { + public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) { return 12; } @Override - public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState blockState, Entity entity) - { - if (!world.isRemote && world.getTileEntity(pos) instanceof TileDimensionalPortal) - { + public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState blockState, Entity entity) { + if (!world.isRemote && world.getTileEntity(pos) instanceof TileDimensionalPortal) { TileDimensionalPortal tile = (TileDimensionalPortal) world.getTileEntity(pos); - if (LocationsHandler.getLocationsHandler() != null) - { + 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) - { + 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()))) - { + if (linkedLocations.get(0).equals(new PortalLocation(masterRitualStone.getBlockPos().up(), world.provider.getDimension()))) { PortalLocation portal = linkedLocations.get(1); - if (portal.getDimension() == world.provider.getDimension()) - { + if (portal.getDimension() == world.provider.getDimension()) { TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(portal.getX(), portal.getY(), portal.getZ(), entity, masterRitualStone.getOwner(), false)); - } else - { + } 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()))) - { + } 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()) - { + if (portal.getDimension() == world.provider.getDimension()) { TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(portal.getX(), portal.getY(), portal.getZ(), entity, masterRitualStone.getOwner(), false)); - } else - { + } else { TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(portal.getX(), portal.getY(), portal.getZ(), entity, masterRitualStone.getOwner(), world, portal.getDimension(), false)); } } @@ -125,23 +104,18 @@ public class BlockDimensionalPortal extends BlockInteger } @Override - public int quantityDropped(Random par1Random) - { + public int quantityDropped(Random par1Random) { return 0; } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) - { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { int meta = state.getBlock().getMetaFromState(state); - if (meta == 0) - { + if (meta == 0) { return AABB_0; - } else if (meta == 1) - { + } else if (meta == 1) { return AABB_1; - } else - { + } else { return AABB_DEFAULT; } } @@ -155,15 +129,13 @@ public class BlockDimensionalPortal extends BlockInteger @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() - { + public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.TRANSLUCENT; } @Override @SideOnly(Side.CLIENT) - public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) - { + public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) { this.spawnParticles(world, pos.getX(), pos.getY(), pos.getZ()); } @@ -178,41 +150,32 @@ public class BlockDimensionalPortal extends BlockInteger return new TileDimensionalPortal(); } - private void spawnParticles(World world, int x, int y, int z) - { + 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) - { + 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()) - { + 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()) - { + 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()) - { + 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()) - { + 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()) - { + 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()) - { + 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)) - { + 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 index 17d8693b..af051063 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.tile.TileIncenseAltar; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -13,22 +13,17 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileIncenseAltar; - import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; -public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlock -{ +public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlock { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); - public BlockIncenseAltar() - { + public BlockIncenseAltar() { super(Material.ROCK); setUnlocalizedName(BloodMagic.MODID + ".incenseAltar"); @@ -39,44 +34,37 @@ public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlo } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) - { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileIncenseAltar TileIncenseAltar = (TileIncenseAltar) world.getTileEntity(blockPos); if (TileIncenseAltar != null) TileIncenseAltar.dropItems(); @@ -96,8 +84,7 @@ public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlo } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java index 8fdf5607..848afb35 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -1,5 +1,8 @@ package WayofTime.bloodmagic.block; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -7,16 +10,11 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; import javax.annotation.Nullable; -public class BlockInputRoutingNode extends BlockRoutingNode -{ - public BlockInputRoutingNode() - { +public class BlockInputRoutingNode extends BlockRoutingNode { + public BlockInputRoutingNode() { super(); setUnlocalizedName(BloodMagic.MODID + ".inputRouting"); @@ -24,11 +22,9 @@ public class BlockInputRoutingNode extends BlockRoutingNode @Override //TODO: Combine BlockInputRoutingNode and BlockInputRoutingNode so they have the same superclass - public void breakBlock(World world, BlockPos pos, IBlockState state) - { + public void breakBlock(World world, BlockPos pos, IBlockState state) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileInputRoutingNode) - { + if (tile instanceof TileInputRoutingNode) { ((TileInputRoutingNode) tile).removeAllConnections(); ((TileInputRoutingNode) tile).dropItems(); } @@ -36,10 +32,8 @@ public class BlockInputRoutingNode extends BlockRoutingNode } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { - if (world.getTileEntity(pos) instanceof TileInputRoutingNode) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing 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()); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java index 396c320d..03040157 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnum; +import WayofTime.bloodmagic.block.enums.EnumSubWillType; +import WayofTime.bloodmagic.tile.TileInversionPillar; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.BlockStateContainer; @@ -14,19 +14,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.property.Properties; - -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.enums.EnumSubWillType; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileInversionPillar; +import java.util.ArrayList; +import java.util.List; -public class BlockInversionPillar extends BlockEnum -{ - public BlockInversionPillar() - { +public class BlockInversionPillar extends BlockEnum { + public BlockInversionPillar() { super(Material.ROCK, EnumSubWillType.class); setUnlocalizedName(BloodMagic.MODID + ".inversionpillar."); @@ -38,11 +32,9 @@ public class BlockInversionPillar extends BlockEnum } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileInversionPillar) - { + if (tile instanceof TileInversionPillar) { TileInversionPillar tilePillar = (TileInversionPillar) world.getTileEntity(blockPos); tilePillar.removePillarFromMap(); } @@ -51,44 +43,37 @@ public class BlockInversionPillar extends BlockEnum } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) - { + public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { return super.getActualState(state, world, pos).withProperty(Properties.StaticProperty, true); } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); for (int i = 0; i < this.getTypes().length; i++) ret.add(Pair.of(i, "static=false,type=" + this.getTypes()[i])); @@ -105,8 +90,7 @@ public class BlockInversionPillar extends BlockEnum return new TileInversionPillar(state.getValue(getProperty()).getType()); } - protected BlockStateContainer createStateContainer() - { + 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 index 873e466a..9b0e3067 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java @@ -1,27 +1,23 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.base.BlockEnum; +import WayofTime.bloodmagic.block.enums.EnumInversionCap; +import WayofTime.bloodmagic.client.IVariantProvider; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumInversionCap; -import WayofTime.bloodmagic.client.IVariantProvider; +import java.util.ArrayList; +import java.util.List; -public class BlockInversionPillarEnd extends BlockEnum implements IVariantProvider -{ - public BlockInversionPillarEnd() - { +public class BlockInversionPillarEnd extends BlockEnum implements IVariantProvider { + public BlockInversionPillarEnd() { super(Material.ROCK, EnumInversionCap.class); setUnlocalizedName(BloodMagic.MODID + ".inversionpillarend."); @@ -33,38 +29,32 @@ public class BlockInversionPillarEnd extends BlockEnum impleme } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); for (int i = 0; i < this.getTypes().length; i++) ret.add(new ImmutablePair(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 index 32dc9d79..1bb62034 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java @@ -1,30 +1,26 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.tile.routing.TileItemRoutingNode; +import WayofTime.bloodmagic.tile.routing.TileRoutingNode; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.tile.routing.TileItemRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileRoutingNode; import javax.annotation.Nullable; -public class BlockItemRoutingNode extends BlockRoutingNode -{ - public BlockItemRoutingNode() - { +public class BlockItemRoutingNode extends BlockRoutingNode { + public BlockItemRoutingNode() { super(); setUnlocalizedName(BloodMagic.MODID + ".itemRouting"); } @Override - public void breakBlock(World world, BlockPos pos, IBlockState state) - { + public void breakBlock(World world, BlockPos pos, IBlockState state) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileRoutingNode) - { + if (tile instanceof TileRoutingNode) { ((TileRoutingNode) tile).removeAllConnections(); } super.breakBlock(world, pos, state); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java index 51f7cb2b..44c1766c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; -import java.awt.Color; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.material.Material; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.ResourceLocation; @@ -12,15 +12,13 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class BlockLifeEssence extends BlockFluidClassic -{ +import java.awt.Color; + +public class BlockLifeEssence extends BlockFluidClassic { private static final Fluid LIFE_ESSENCE = new FluidLifeEssence(); - public BlockLifeEssence() - { + public BlockLifeEssence() { super(LIFE_ESSENCE, Material.WATER); setUnlocalizedName(BloodMagic.MODID + ".fluid.lifeEssence"); @@ -28,32 +26,27 @@ public class BlockLifeEssence extends BlockFluidClassic } @Override - public boolean canDisplace(IBlockAccess world, BlockPos blockPos) - { + 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) - { + public boolean displaceIfPossible(World world, BlockPos blockPos) { return !world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isLiquid() && super.displaceIfPossible(world, blockPos); } + @Override + public BlockRenderLayer getBlockLayer() { + return BlockRenderLayer.SOLID; + } + public static Fluid getLifeEssence() { return LIFE_ESSENCE; } - @Override - public BlockRenderLayer getBlockLayer() - { - return BlockRenderLayer.SOLID; - } + public static class FluidLifeEssence extends Fluid { - public static class FluidLifeEssence extends Fluid - { - - public FluidLifeEssence() - { + public FluidLifeEssence() { super("lifeEssence", new ResourceLocation(Constants.Mod.DOMAIN + "blocks/lifeEssenceStill"), new ResourceLocation(Constants.Mod.DOMAIN + "blocks/lifeEssenceFlowing")); setDensity(2000); @@ -61,14 +54,12 @@ public class BlockLifeEssence extends BlockFluidClassic } @Override - public int getColor() - { + public int getColor() { return Color.RED.getRGB(); } @Override - public String getLocalizedName(FluidStack fluidStack) - { + 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 index eec3d1e4..d04ab3f2 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java @@ -1,17 +1,15 @@ package WayofTime.bloodmagic.block; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; import javax.annotation.Nullable; -public class BlockMasterRoutingNode extends BlockRoutingNode -{ - public BlockMasterRoutingNode() - { +public class BlockMasterRoutingNode extends BlockRoutingNode { + public BlockMasterRoutingNode() { super(); setUnlocalizedName(BloodMagic.MODID + ".masterRouting"); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 19b6c3b2..a93df99e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -1,8 +1,13 @@ package WayofTime.bloodmagic.block; -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.altar.EnumAltarComponent; +import WayofTime.bloodmagic.api.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 net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -23,20 +28,12 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.api.altar.IAltarComponent; -import WayofTime.bloodmagic.block.enums.EnumMimic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.tile.TileMimic; -import WayofTime.bloodmagic.util.Utils; +import javax.annotation.Nullable; -public class BlockMimic extends BlockEnum implements IAltarComponent -{ +public class BlockMimic extends BlockEnum implements IAltarComponent { public static final int sentientMimicMeta = 4; - public BlockMimic() - { + public BlockMimic() { super(Material.ROCK, EnumMimic.class); setUnlocalizedName(BloodMagic.MODID + ".mimic."); @@ -50,53 +47,43 @@ public class BlockMimic extends BlockEnum implements IAltarComponent @Nullable @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState 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) - { + public AxisAlignedBB getCollisionBoundingBox(IBlockState 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; + } + IBlockState mimicState = mimicBlock.getStateFromMeta(tileMimic.metaOfReplacedBlock); + if (mimicBlock != this) { + return mimicState.getCollisionBoundingBox(world, pos); + } + } else { return FULL_BLOCK_AABB; } - IBlockState mimicState = mimicBlock.getStateFromMeta(tileMimic.metaOfReplacedBlock); - if (mimicBlock != this) - { - return mimicState.getCollisionBoundingBox(world, pos); - } - } else - { - return FULL_BLOCK_AABB; - } - case 0: - default: - return NULL_AABB; + case 0: + default: + return NULL_AABB; } } @Override @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World world, BlockPos pos) - { + public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World world, BlockPos pos) { TileMimic tileMimic = (TileMimic) world.getTileEntity(pos); - if (tileMimic != null && !tileMimic.getStackInSlot(0).isEmpty()) - { + if (tileMimic != null && !tileMimic.getStackInSlot(0).isEmpty()) { Block mimicBlock = Block.getBlockFromItem(tileMimic.getStackInSlot(0).getItem()); - if (mimicBlock == Blocks.AIR) - { + if (mimicBlock == Blocks.AIR) { return FULL_BLOCK_AABB; } IBlockState mimicState = mimicBlock.getStateFromMeta(tileMimic.getStackInSlot(0).getItemDamage()); - if (mimicBlock != this) - { + if (mimicBlock != this) { return mimicState.getSelectedBoundingBox(world, pos); } } @@ -105,35 +92,29 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public int getLightOpacity(IBlockState state) - { - switch (this.getMetaFromState(state)) - { - case 2: - case 4: - return 0; - default: - return this.lightOpacity; + public int getLightOpacity(IBlockState state) { + switch (this.getMetaFromState(state)) { + case 2: + case 4: + return 0; + default: + return this.lightOpacity; } } @Override - public int getLightValue(IBlockState state) - { - switch (this.getMetaFromState(state)) - { - case 3: - return 15; - default: - return this.lightValue; + public int getLightValue(IBlockState state) { + switch (this.getMetaFromState(state)) { + case 3: + return 15; + default: + return this.lightValue; } } @Override - public int getMetaFromState(IBlockState state) - { - if (state.getBlock() == this) - { + public int getMetaFromState(IBlockState state) { + if (state.getBlock() == this) { return super.getMetaFromState(state); } @@ -148,21 +129,16 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) - { + public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMimic) - { + if (tile instanceof TileMimic) { TileMimic mimic = (TileMimic) tile; ItemStack stack = mimic.getStackInSlot(0); - if (stack.getItem() instanceof ItemBlock) - { + if (stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); IBlockState mimicState = block.getStateFromMeta(stack.getItemDamage()); - if (block != this) - { - if (block.getRenderType(mimicState) == EnumBlockRenderType.ENTITYBLOCK_ANIMATED) - { + if (block != this) { + if (block.getRenderType(mimicState) == EnumBlockRenderType.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) } @@ -174,41 +150,34 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) - { + public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.CUTOUT; } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileMimic) - { + if (tile instanceof TileMimic) { TileMimic TileMimic = (TileMimic) world.getTileEntity(blockPos); if (TileMimic != null) TileMimic.dropItems(); @@ -231,21 +200,16 @@ public class BlockMimic extends BlockEnum implements IAltarComponent @Nullable @Override - public EnumAltarComponent getType(World world, IBlockState state, BlockPos pos) - { + public EnumAltarComponent getType(World world, IBlockState state, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMimic) - { + if (tile instanceof TileMimic) { TileMimic mimic = (TileMimic) tile; ItemStack stack = mimic.getStackInSlot(0); - if (stack.getItem() instanceof ItemBlock) - { + if (stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); - if (block instanceof IAltarComponent) - { + if (block instanceof IAltarComponent) { return ((IAltarComponent) block).getType(world, block.getStateFromMeta(mimic.metaOfReplacedBlock), pos); - } else - { + } else { for (EnumAltarComponent altarComponent : EnumAltarComponent.values()) if (block == Utils.getBlockForComponent(altarComponent)) return altarComponent; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java index 3b65f42d..d3335a6f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -1,5 +1,8 @@ package WayofTime.bloodmagic.block; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -7,16 +10,11 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; import javax.annotation.Nullable; -public class BlockOutputRoutingNode extends BlockRoutingNode -{ - public BlockOutputRoutingNode() - { +public class BlockOutputRoutingNode extends BlockRoutingNode { + public BlockOutputRoutingNode() { super(); setUnlocalizedName(BloodMagic.MODID + ".outputRouting"); @@ -24,11 +22,9 @@ public class BlockOutputRoutingNode extends BlockRoutingNode @Override //TODO: Combine BlockOutputRoutingNode and BlockInputRoutingNode so they have the same superclass - public void breakBlock(World world, BlockPos pos, IBlockState state) - { + public void breakBlock(World world, BlockPos pos, IBlockState state) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileOutputRoutingNode) - { + if (tile instanceof TileOutputRoutingNode) { ((TileOutputRoutingNode) tile).removeAllConnections(); ((TileOutputRoutingNode) tile).dropItems(); } @@ -36,10 +32,8 @@ public class BlockOutputRoutingNode extends BlockRoutingNode } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { - if (world.getTileEntity(pos) instanceof TileOutputRoutingNode) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing 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()); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 4e5099f1..69333f47 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -1,32 +1,23 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.incense.IIncensePath; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumPath; -import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; -public class BlockPath extends BlockEnum implements IIncensePath -{ +import java.util.List; - public BlockPath() - { +public class BlockPath extends BlockEnum implements IIncensePath { + + public BlockPath() { super(Material.ROCK, EnumPath.class); setUnlocalizedName(BloodMagic.MODID + ".path."); @@ -46,31 +37,28 @@ public class BlockPath extends BlockEnum implements IIncensePath } @Override - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) - { + 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 getLevelOfPath(World world, BlockPos pos, IBlockState 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; + public int getLevelOfPath(World world, BlockPos pos, IBlockState 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 index 257d417e..b488e046 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java @@ -1,9 +1,8 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.tile.TilePhantomBlock; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -16,20 +15,16 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TilePhantomBlock; - import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; -public class BlockPhantom extends Block implements IVariantProvider -{ - public BlockPhantom() - { +public class BlockPhantom extends Block implements IVariantProvider { + public BlockPhantom() { super(Material.CLOTH); setUnlocalizedName(BloodMagic.MODID + ".phantom"); @@ -37,52 +32,44 @@ public class BlockPhantom extends Block implements IVariantProvider } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() - { + public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.TRANSLUCENT; } @Override @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) - { + public boolean shouldSideBeRendered(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { return world.getBlockState(pos.offset(side)) != state || state.getBlock() != this && super.shouldSideBeRendered(state, world, pos, side); } @Override - public int quantityDropped(Random par1Random) - { + public int quantityDropped(Random par1Random) { return 0; } @@ -98,8 +85,7 @@ public class BlockPhantom extends Block implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 16c12687..0449705c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -1,10 +1,20 @@ package WayofTime.bloodmagic.block; -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.iface.IBindable; -import com.google.common.base.Strings; +import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.api.registry.RitualRegistry; +import WayofTime.bloodmagic.api.ritual.Ritual; +import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.api.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 com.google.common.base.Strings; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -19,23 +29,10 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.Explosion; import net.minecraft.world.World; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.api.util.helper.RitualHelper; -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 javax.annotation.Nullable; -public class BlockRitualController extends BlockEnum implements IGuideLinked -{ - public BlockRitualController() - { +public class BlockRitualController extends BlockEnum implements IGuideLinked { + public BlockRitualController() { super(Material.ROCK, EnumRitualController.class); setUnlocalizedName(BloodMagic.MODID + ".stone.ritual."); @@ -47,15 +44,12 @@ public class BlockRitualController extends BlockEnum imple } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing 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 (state.getValue(getProperty()) != EnumRitualController.IMPERFECT && tile instanceof TileMasterRitualStone) { + if (heldItem.getItem() == RegistrarBloodMagicItems.ACTIVATION_CRYSTAL) { IBindable bindable = (IBindable) heldItem.getItem(); if (Strings.isNullOrEmpty(bindable.getOwnerName(heldItem))) return false; @@ -63,21 +57,17 @@ public class BlockRitualController extends BlockEnum imple String key = RitualHelper.getValidRitual(world, pos); EnumFacing direction = RitualHelper.getDirectionOfRitual(world, pos, key); // TODO: Give a message stating that this ritual is not a valid ritual. - if (!key.isEmpty() && direction != null && RitualHelper.checkValidRitual(world, pos, key, direction)) - { - if (((TileMasterRitualStone) tile).activateRitual(heldItem, player, RitualRegistry.getRitualForId(key))) - { + if (!key.isEmpty() && direction != null && RitualHelper.checkValidRitual(world, pos, key, direction)) { + if (((TileMasterRitualStone) tile).activateRitual(heldItem, player, RitualRegistry.getRitualForId(key))) { ((TileMasterRitualStone) tile).setDirection(direction); if (state.getValue(getProperty()) == EnumRitualController.INVERTED) ((TileMasterRitualStone) tile).setInverted(true); } - } else - { + } else { player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); } } - } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) - { + } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) { IBlockState determinerState = world.getBlockState(pos.up()); BlockStack determiner = new BlockStack(determinerState.getBlock(), determinerState.getBlock().getMetaFromState(determinerState)); @@ -89,8 +79,7 @@ public class BlockRitualController extends BlockEnum imple } @Override - public void onBlockHarvested(World world, BlockPos pos, IBlockState state, EntityPlayer player) - { + public void onBlockHarvested(World world, BlockPos pos, IBlockState state, EntityPlayer player) { TileEntity tile = world.getTileEntity(pos); if (getMetaFromState(state) == 0 && tile instanceof TileMasterRitualStone) @@ -98,8 +87,7 @@ public class BlockRitualController extends BlockEnum imple } @Override - public void onBlockDestroyedByExplosion(World world, BlockPos pos, Explosion explosion) - { + public void onBlockDestroyedByExplosion(World world, BlockPos pos, Explosion explosion) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileMasterRitualStone) @@ -107,14 +95,12 @@ public class BlockRitualController extends BlockEnum imple } @Override - public boolean hasTileEntity(IBlockState state) - { + public boolean hasTileEntity(IBlockState state) { return true; } @Override - public TileEntity createTileEntity(World world, IBlockState state) - { + public TileEntity createTileEntity(World world, IBlockState state) { return state.getValue(getProperty()) != EnumRitualController.IMPERFECT ? new TileMasterRitualStone() : new TileImperfectRitualStone(); } @@ -122,18 +108,15 @@ public class BlockRitualController extends BlockEnum imple @Override @Nullable - public ResourceLocation getLinkedEntry(World world, BlockPos pos, EntityPlayer player, ItemStack stack) - { + public ResourceLocation getLinkedEntry(World world, BlockPos pos, EntityPlayer player, ItemStack stack) { IBlockState state = world.getBlockState(pos); - if (state.getValue(getProperty()).equals(EnumRitualController.MASTER)) - { + 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)) - { + } else if (state.getValue(getProperty()).equals(EnumRitualController.IMPERFECT)) { ImperfectRitual imperfectRitual = ImperfectRitualRegistry.getRitualForBlock(BlockStack.getStackFromPos(world, pos.up())); if (imperfectRitual != null) return new ResourceLocation("bloodmagic", "ritual_" + imperfectRitual.getName()); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 6bb21812..1a573969 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -1,7 +1,11 @@ package WayofTime.bloodmagic.block; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.EnumRuneType; +import WayofTime.bloodmagic.api.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.state.IBlockState; @@ -10,21 +14,13 @@ import net.minecraft.entity.player.EntityPlayer; 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 WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IRitualStone; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.List; -public class BlockRitualStone extends BlockEnum implements IRitualStone -{ - public BlockRitualStone() - { +public class BlockRitualStone extends BlockEnum implements IRitualStone { + public BlockRitualStone() { super(Material.IRON, EnumRuneType.class); setUnlocalizedName(BloodMagic.MODID + ".ritualStone."); @@ -37,33 +33,28 @@ public class BlockRitualStone extends BlockEnum implements IRitual @SideOnly(Side.CLIENT) @Override - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) - { + 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(IBlockState state) - { + public int damageDropped(IBlockState state) { return 0; } @Override - public boolean canSilkHarvest(World world, BlockPos pos, IBlockState state, EntityPlayer player) - { + public boolean canSilkHarvest(World world, BlockPos pos, IBlockState state, EntityPlayer player) { return false; } @Override - public boolean isRuneType(World world, BlockPos pos, EnumRuneType runeType) - { + 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) - { + public void setRuneType(World world, BlockPos pos, EnumRuneType runeType) { int meta = runeType.ordinal(); IBlockState 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 index 1234bab3..30426072 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java @@ -1,5 +1,8 @@ package WayofTime.bloodmagic.block; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; +import WayofTime.bloodmagic.tile.routing.TileRoutingNode; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyBool; @@ -14,23 +17,17 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileRoutingNode; - -public class BlockRoutingNode extends Block implements IBMBlock -{ - protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.378F, 0.378F, 0.378F, 0.625F, 0.625F, 0.625F); +public class BlockRoutingNode extends Block implements IBMBlock { 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() - { + public BlockRoutingNode() { super(Material.ROCK); setCreativeTab(BloodMagic.TAB_BM); @@ -42,56 +39,47 @@ public class BlockRoutingNode extends Block implements IBMBlock } @Override - public boolean canConnectRedstone(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) - { + public boolean canConnectRedstone(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { return true; } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) - { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) - { + public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.TRANSLUCENT; } @Override - public IBlockState getStateFromMeta(int meta) - { + public IBlockState getStateFromMeta(int meta) { return this.getDefaultState(); } @@ -99,41 +87,33 @@ public class BlockRoutingNode extends Block implements IBMBlock * Convert the BlockState into the correct metadata value */ @Override - public int getMetaFromState(IBlockState state) - { + public int getMetaFromState(IBlockState state) { return 0; } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) - { + public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { return state.withProperty(UP, this.shouldConnect(state, worldIn, pos.up(), EnumFacing.DOWN)).withProperty(DOWN, this.shouldConnect(state, worldIn, pos.down(), EnumFacing.UP)).withProperty(NORTH, this.shouldConnect(state, worldIn, pos.north(), EnumFacing.SOUTH)).withProperty(EAST, this.shouldConnect(state, worldIn, pos.east(), EnumFacing.WEST)).withProperty(SOUTH, this.shouldConnect(state, worldIn, pos.south(), EnumFacing.NORTH)).withProperty(WEST, this.shouldConnect(state, worldIn, pos.west(), EnumFacing.EAST)); } @Override - protected BlockStateContainer createBlockState() - { + protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, UP, DOWN, NORTH, EAST, WEST, SOUTH); } - public boolean shouldConnect(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing attachedSide) - { + public boolean shouldConnect(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing attachedSide) { IBlockState blockState = world.getBlockState(pos); Block block = blockState.getBlock(); return block.getMaterial(blockState).isOpaque() && blockState.isFullCube(); } @Override - public void breakBlock(World world, BlockPos pos, IBlockState blockState) - { - if (!world.isRemote) - { + public void breakBlock(World world, BlockPos pos, IBlockState blockState) { + if (!world.isRemote) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileRoutingNode) - { + if (tile instanceof TileRoutingNode) { ((TileRoutingNode) tile).removeAllConnections(); - } else if (tile instanceof TileMasterRoutingNode) - { + } else if (tile instanceof TileMasterRoutingNode) { ((TileMasterRoutingNode) tile).removeAllConnections(); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index afece925..2c200c2c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -1,8 +1,9 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.tile.TileSoulForge; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -17,23 +18,17 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileSoulForge; - import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; -public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock -{ +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() - { + public BlockSoulForge() { super(Material.IRON); setUnlocalizedName(BloodMagic.MODID + ".soulForge"); @@ -45,44 +40,37 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) - { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing 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()); @@ -90,8 +78,7 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileSoulForge tileSoulForge = (TileSoulForge) world.getTileEntity(blockPos); if (tileSoulForge != null) tileSoulForge.dropItems(); @@ -111,8 +98,7 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java index 6f70bee1..7a001100 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -1,11 +1,9 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.tile.TileSpectralBlock; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -18,98 +16,83 @@ 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 org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileSpectralBlock; - import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; -public class BlockSpectral extends Block implements IVariantProvider -{ +public class BlockSpectral extends Block implements IVariantProvider { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0, 0, 0, 0, 0, 0); - public BlockSpectral() - { + public BlockSpectral() { super(Material.CLOTH); setUnlocalizedName(BloodMagic.MODID + ".spectral"); } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) - { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) - { + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) - { + public boolean causesSuffocation(IBlockState state) { return false; } @SideOnly(Side.CLIENT) @Override - public BlockRenderLayer getBlockLayer() - { + public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.TRANSLUCENT; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return ConfigHandler.invisibleSpectralBlocks ? EnumBlockRenderType.INVISIBLE : EnumBlockRenderType.MODEL; } @Override @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) - { + public boolean shouldSideBeRendered(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { return world.getBlockState(pos.offset(side)) != state || state.getBlock() != this && super.shouldSideBeRendered(state, world, pos, side); } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity, boolean bool) - { + public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity, boolean bool) { } @Override - public int quantityDropped(Random par1Random) - { + public int quantityDropped(Random par1Random) { return 0; } @Override - public boolean isReplaceable(IBlockAccess worldIn, BlockPos pos) - { + public boolean isReplaceable(IBlockAccess worldIn, BlockPos pos) { return true; } @Override - public boolean isAir(IBlockState state, IBlockAccess world, BlockPos blockPos) - { + public boolean isAir(IBlockState state, IBlockAccess world, BlockPos blockPos) { return true; } @@ -125,8 +108,7 @@ public class BlockSpectral extends Block implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index 0c374de0..6ac92d99 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -1,8 +1,10 @@ package WayofTime.bloodmagic.block; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.item.ItemTelepositionFocus; +import WayofTime.bloodmagic.tile.TileTeleposer; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -15,20 +17,14 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.tile.TileTeleposer; +import java.util.ArrayList; +import java.util.List; -public class BlockTeleposer extends BlockContainer implements IVariantProvider, IBMBlock -{ - public BlockTeleposer() - { +public class BlockTeleposer extends BlockContainer implements IVariantProvider, IBMBlock { + public BlockTeleposer() { super(Material.ROCK); setCreativeTab(BloodMagic.TAB_BM); @@ -38,14 +34,12 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, } @Override - public EnumBlockRenderType getRenderType(IBlockState state) - { + public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { ItemStack playerItem = player.getHeldItem(hand); if (playerItem.getItem() instanceof ItemTelepositionFocus) @@ -57,8 +51,7 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) - { + public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileTeleposer tileTeleposer = (TileTeleposer) world.getTileEntity(blockPos); if (tileTeleposer != null) tileTeleposer.dropItems(); @@ -67,14 +60,12 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, } @Override - public TileEntity createNewTileEntity(World worldIn, int meta) - { + public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileTeleposer(); } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java index 451ec2a8..2691f724 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java @@ -18,14 +18,12 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.List; -public class BlockEnum & IStringSerializable> extends Block implements IBMBlock, IVariantProvider -{ +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) - { + public BlockEnum(Material material, Class enumClass, String propName) { super(material); this.types = enumClass.getEnumConstants(); @@ -34,50 +32,42 @@ public class BlockEnum & IStringSerializable> extends Block im setDefaultState(getBlockState().getBaseState()); } - public BlockEnum(Material material, Class enumClass) - { + public BlockEnum(Material material, Class enumClass) { this(material, enumClass, "type"); } @Override - protected final BlockStateContainer createBlockState() - { + protected final BlockStateContainer createBlockState() { return new BlockStateContainer.Builder(this).build(); // Blank to avoid crashes } @Override - public final BlockStateContainer getBlockState() - { + public final BlockStateContainer getBlockState() { return realStateContainer; } @Override - public IBlockState getStateFromMeta(int meta) - { + public IBlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(property, types[meta]); } @Override - public int getMetaFromState(IBlockState state) - { + public int getMetaFromState(IBlockState state) { return state.getValue(property).ordinal(); } @Override - public int damageDropped(IBlockState state) - { + public int damageDropped(IBlockState state) { return getMetaFromState(state); } @Override - public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) - { + public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { for (E type : types) subBlocks.add(new ItemStack(this, 1, type.ordinal())); } - protected BlockStateContainer createStateContainer() - { + protected BlockStateContainer createStateContainer() { return new BlockStateContainer.Builder(this).add(property).build(); } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java index 3b8cc9a6..418c8de7 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java @@ -15,84 +15,71 @@ 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) - { +public class BlockEnumPillar & IStringSerializable> extends BlockEnum { + public BlockEnumPillar(Material material, Class enumClass, String propName) { super(material, enumClass, propName); } - public BlockEnumPillar(Material material, Class enumClass) - { + public BlockEnumPillar(Material material, Class enumClass) { this(material, enumClass, "type"); } @Override - protected BlockStateContainer createStateContainer() - { + protected BlockStateContainer createStateContainer() { return new BlockStateContainer.Builder(this).add(getProperty(), BlockRotatedPillar.AXIS).build(); } @Override - public IBlockState getStateFromMeta(int meta) - { + public IBlockState getStateFromMeta(int meta) { IBlockState state = getBlockState().getBaseState().withProperty(this.getProperty(), getTypes()[meta % 5]); - switch (meta / 5) - { - case 0: - state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Y); - break; - case 1: - state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.X); - break; - case 2: - state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Z); - break; - default: - state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Y); - break; + switch (meta / 5) { + case 0: + state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Y); + break; + case 1: + state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.X); + break; + case 2: + state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Z); + break; + default: + state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Y); + break; } return state; } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) - { + public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { return new ItemStack(this, 1, damageDropped(state)); } @SuppressWarnings("incomplete-switch") @Override - public int getMetaFromState(IBlockState state) - { + public int getMetaFromState(IBlockState state) { int i = ArrayUtils.indexOf(getTypes(), state.getValue(getProperty())); - switch (state.getValue(BlockRotatedPillar.AXIS)) - { - case X: - i = i + 5; - break; - case Z: - i = i + 10; - break; + switch (state.getValue(BlockRotatedPillar.AXIS)) { + case X: + i = i + 5; + break; + case Z: + i = i + 10; + break; } return i; } @Override - public boolean rotateBlock(World world, BlockPos pos, EnumFacing axis) - { + public boolean rotateBlock(World world, BlockPos pos, EnumFacing axis) { IBlockState state = world.getBlockState(pos); - for (IProperty prop : state.getProperties().keySet()) - { - if (prop == BlockRotatedPillar.AXIS) - { + for (IProperty prop : state.getProperties().keySet()) { + if (prop == BlockRotatedPillar.AXIS) { world.setBlockState(pos, state.cycleProperty(prop)); return true; } @@ -101,44 +88,37 @@ public class BlockEnumPillar & IStringSerializable> extends Bl } @Override - public IBlockState withRotation(IBlockState state, Rotation rot) - { - switch (rot) - { - case COUNTERCLOCKWISE_90: - case CLOCKWISE_90: - switch (state.getValue(BlockRotatedPillar.AXIS)) - { - case X: - return state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Z); - case Z: - return state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.X); + public IBlockState withRotation(IBlockState state, Rotation rot) { + switch (rot) { + case COUNTERCLOCKWISE_90: + case CLOCKWISE_90: + switch (state.getValue(BlockRotatedPillar.AXIS)) { + case X: + return state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Z); + case Z: + return state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.X); + default: + return state; + } + default: return state; - } - - default: - return state; } } @Override - protected ItemStack getSilkTouchDrop(IBlockState state) - { + protected ItemStack getSilkTouchDrop(IBlockState state) { return new ItemStack(this, 1, damageDropped(state)); } - @Override - public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) - { + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(BlockRotatedPillar.AXIS, facing.getAxis()); } @Override - public int damageDropped(IBlockState state) - { + public int damageDropped(IBlockState 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 index e9b1b736..365dd875 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java @@ -11,76 +11,63 @@ 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 class BlockEnumPillarCap & IStringSerializable> extends BlockEnum { public static final PropertyDirection FACING = PropertyDirection.create("facing"); - public BlockEnumPillarCap(Material material, Class enumClass, String propName) - { + public BlockEnumPillarCap(Material material, Class enumClass, String propName) { super(material, enumClass, propName); } - public BlockEnumPillarCap(Material material, Class enumClass) - { + public BlockEnumPillarCap(Material material, Class enumClass) { this(material, enumClass, "type"); } @Override - protected BlockStateContainer createStateContainer() - { + protected BlockStateContainer createStateContainer() { return new BlockStateContainer.Builder(this).add(getProperty(), FACING).build(); } @Override - public IBlockState getStateFromMeta(int meta) - { + public IBlockState getStateFromMeta(int meta) { IBlockState state = getBlockState().getBaseState().withProperty(this.getProperty(), getTypes()[meta % 2]); return state.withProperty(FACING, EnumFacing.getFront(meta / 2)); } @Override - public int getMetaFromState(IBlockState state) - { + public int getMetaFromState(IBlockState state) { int i = ArrayUtils.indexOf(getTypes(), state.getValue(getProperty())); return i + 2 * state.getValue(FACING).getIndex(); } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) - { + public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public IBlockState withRotation(IBlockState state, Rotation rot) - { + public IBlockState withRotation(IBlockState state, Rotation rot) { return state.withProperty(FACING, rot.rotate(state.getValue(FACING))); } @Override - public IBlockState withMirror(IBlockState state, Mirror mirrorIn) - { + public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { return state.withRotation(mirrorIn.toRotation(state.getValue(FACING))); } @Override - protected ItemStack getSilkTouchDrop(IBlockState state) - { + protected ItemStack getSilkTouchDrop(IBlockState state) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) - { + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(FACING, facing); } @Override - public int damageDropped(IBlockState state) - { + public int damageDropped(IBlockState 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 index 271c5b76..7a0203c4 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java @@ -1,9 +1,6 @@ package WayofTime.bloodmagic.block.base; -import java.util.List; - -import javax.annotation.Nullable; - +import com.google.common.collect.Lists; import net.minecraft.block.BlockHorizontal; import net.minecraft.block.BlockStairs; import net.minecraft.block.BlockStairs.EnumHalf; @@ -23,16 +20,13 @@ 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 WayofTime.bloodmagic.BloodMagic; +import javax.annotation.Nullable; +import java.util.List; -import com.google.common.collect.Lists; - -public class BlockEnumStairs & IStringSerializable> extends BlockEnum -{ +public class BlockEnumStairs & IStringSerializable> extends BlockEnum { public static final PropertyDirection FACING = BlockHorizontal.FACING; protected static final AxisAlignedBB AABB_SLAB_TOP = new AxisAlignedBB(0.0D, 0.5D, 0.0D, 1.0D, 1.0D, 1.0D); @@ -54,149 +48,61 @@ public class BlockEnumStairs & IStringSerializable> extends Bl 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) - { + public BlockEnumStairs(Material material, Class enumClass, String propName) { super(material, enumClass, propName); } - public BlockEnumStairs(Material material, Class enumClass) - { + public BlockEnumStairs(Material material, Class enumClass) { this(material, enumClass, "type"); } @Override - protected BlockStateContainer createStateContainer() - { + protected BlockStateContainer createStateContainer() { return new BlockStateContainer.Builder(this).add(getProperty(), FACING, BlockStairs.HALF, BlockStairs.SHAPE).build(); } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) - { + public void addCollisionBoxToList(IBlockState 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)) - { + for (AxisAlignedBB axisalignedbb : getCollisionBoxList(state)) { addCollisionBoxToList(pos, entityBox, collidingBoxes, axisalignedbb); } } - private static List getCollisionBoxList(IBlockState state) - { - List list = Lists.newArrayList(); - boolean flag = state.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.TOP; - list.add(flag ? AABB_SLAB_TOP : AABB_SLAB_BOTTOM); - BlockStairs.EnumShape stairShape = state.getValue(BlockStairs.SHAPE); - - if (stairShape == BlockStairs.EnumShape.STRAIGHT || stairShape == BlockStairs.EnumShape.INNER_LEFT || stairShape == BlockStairs.EnumShape.INNER_RIGHT) - { - list.add(getCollQuarterBlock(state)); - } - - if (stairShape != BlockStairs.EnumShape.STRAIGHT) - { - list.add(getCollEighthBlock(state)); - } - - return list; - } - - private static AxisAlignedBB getCollQuarterBlock(IBlockState state) - { - boolean flag = state.getValue(BlockStairs.HALF) == BlockStairs.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(IBlockState state) - { - EnumFacing facing = state.getValue(FACING); - EnumFacing newFacing; - - switch (state.getValue(BlockStairs.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(BlockStairs.HALF) == BlockStairs.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; - } - } - @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } @Override - public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) - { + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { IBlockState state = super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand); state = state.withProperty(FACING, placer.getHorizontalFacing()).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.STRAIGHT); return facing != EnumFacing.DOWN && (facing == EnumFacing.UP || (double) hitY <= 0.5D) ? state.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.BOTTOM) : state.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.TOP); } @Override - public RayTraceResult collisionRayTrace(IBlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) - { + public RayTraceResult collisionRayTrace(IBlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { List list = Lists.newArrayList(); - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(this.getActualState(blockState, worldIn, pos))) - { + 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) - { + for (RayTraceResult raytraceresult : list) { + if (raytraceresult != null) { double d0 = raytraceresult.hitVec.squareDistanceTo(end); - if (d0 > d1) - { + if (d0 > d1) { rayTrace = raytraceresult; d1 = d0; } @@ -208,8 +114,7 @@ public class BlockEnumStairs & IStringSerializable> extends Bl // Meta looks like: {1|11|1} = {HALF|FACING|TYPE} @Override - public IBlockState getStateFromMeta(int meta) - { + public IBlockState getStateFromMeta(int meta) { IBlockState state = getBlockState().getBaseState().withProperty(BlockStairs.HALF, (meta & 8) > 0 ? BlockStairs.EnumHalf.TOP : BlockStairs.EnumHalf.BOTTOM); state = state.withProperty(FACING, EnumFacing.getFront(5 - (meta & 6) / 2)).withProperty(this.getProperty(), getTypes()[meta % 2]); return state; @@ -217,12 +122,10 @@ public class BlockEnumStairs & IStringSerializable> extends Bl // Meta looks like: {1|11|1} = {HALF|FACING|TYPE} @Override - public int getMetaFromState(IBlockState state) - { + public int getMetaFromState(IBlockState state) { int i = 0; - if (state.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.TOP) - { + if (state.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.TOP) { i |= 4; } @@ -231,141 +134,78 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) - { + public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { return state.withProperty(BlockStairs.SHAPE, getStairsShape(state, worldIn, pos)); } - private static BlockStairs.EnumShape getStairsShape(IBlockState state, IBlockAccess world, BlockPos pos) - { - EnumFacing facing = state.getValue(FACING); - IBlockState offsetState = world.getBlockState(pos.offset(facing)); - - if (isBlockStairs(offsetState) && state.getValue(BlockStairs.HALF) == offsetState.getValue(BlockStairs.HALF)) - { - EnumFacing offsetFacing = offsetState.getValue(FACING); - - if (offsetFacing.getAxis() != state.getValue(FACING).getAxis() && isDifferentStairs(state, world, pos, offsetFacing.getOpposite())) - { - if (offsetFacing == facing.rotateYCCW()) - { - return BlockStairs.EnumShape.OUTER_LEFT; - } - - return BlockStairs.EnumShape.OUTER_RIGHT; - } - } - - IBlockState oppositeOffsetState = world.getBlockState(pos.offset(facing.getOpposite())); - - if (isBlockStairs(oppositeOffsetState) && state.getValue(BlockStairs.HALF) == oppositeOffsetState.getValue(BlockStairs.HALF)) - { - EnumFacing oppositeOffsetFacing = oppositeOffsetState.getValue(FACING); - - if (oppositeOffsetFacing.getAxis() != (state.getValue(FACING)).getAxis() && isDifferentStairs(state, world, pos, oppositeOffsetFacing)) - { - if (oppositeOffsetFacing == facing.rotateYCCW()) - { - return BlockStairs.EnumShape.INNER_LEFT; - } - - return BlockStairs.EnumShape.INNER_RIGHT; - } - } - - return BlockStairs.EnumShape.STRAIGHT; - } - - private static boolean isDifferentStairs(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing facing) - { - IBlockState offsetState = world.getBlockState(pos.offset(facing)); - return !isBlockStairs(offsetState) || offsetState.getValue(FACING) != state.getValue(FACING) || offsetState.getValue(BlockStairs.HALF) != state.getValue(BlockStairs.HALF); - } - - public static boolean isBlockStairs(IBlockState state) - { - return state.getBlock() instanceof BlockStairs || state.getBlock() instanceof BlockEnumStairs; - } - @Override - public IBlockState withRotation(IBlockState state, Rotation rot) - { + public IBlockState withRotation(IBlockState state, Rotation rot) { return state.withProperty(FACING, rot.rotate(state.getValue(FACING))); } @SuppressWarnings("incomplete-switch") @Override - public IBlockState withMirror(IBlockState state, Mirror mirrorIn) - { + public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { EnumFacing facing = state.getValue(FACING); BlockStairs.EnumShape stairShape = state.getValue(BlockStairs.SHAPE); - switch (mirrorIn) - { - case LEFT_RIGHT: + switch (mirrorIn) { + case LEFT_RIGHT: - if (facing.getAxis() == EnumFacing.Axis.Z) - { - switch (stairShape) - { - case OUTER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_RIGHT); - case OUTER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_LEFT); - case INNER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_LEFT); - case INNER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_RIGHT); - default: - return state.withRotation(Rotation.CLOCKWISE_180); + if (facing.getAxis() == EnumFacing.Axis.Z) { + switch (stairShape) { + case OUTER_LEFT: + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_RIGHT); + case OUTER_RIGHT: + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_LEFT); + case INNER_RIGHT: + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_LEFT); + case INNER_LEFT: + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_RIGHT); + default: + return state.withRotation(Rotation.CLOCKWISE_180); + } } - } - break; - case FRONT_BACK: + break; + case FRONT_BACK: - if (facing.getAxis() == EnumFacing.Axis.X) - { - switch (stairShape) - { - case OUTER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_RIGHT); - case OUTER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_LEFT); - case INNER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_RIGHT); - case INNER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_LEFT); - case STRAIGHT: - return state.withRotation(Rotation.CLOCKWISE_180); + if (facing.getAxis() == EnumFacing.Axis.X) { + switch (stairShape) { + case OUTER_LEFT: + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_RIGHT); + case OUTER_RIGHT: + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_LEFT); + case INNER_RIGHT: + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_RIGHT); + case INNER_LEFT: + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_LEFT); + case STRAIGHT: + return state.withRotation(Rotation.CLOCKWISE_180); + } } - } } return super.withMirror(state, mirrorIn); } @Override - protected ItemStack getSilkTouchDrop(IBlockState state) - { + protected ItemStack getSilkTouchDrop(IBlockState state) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public int damageDropped(IBlockState state) - { + public int damageDropped(IBlockState state) { return super.getMetaFromState(state); } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) - { + public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) - { + public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) { if (ForgeModContainer.disableStairSlabCulling) return super.doesSideBlockRendering(state, world, pos, face); @@ -391,4 +231,113 @@ public class BlockEnumStairs & IStringSerializable> extends Bl return true; return false; } + + private static List getCollisionBoxList(IBlockState state) { + List list = Lists.newArrayList(); + boolean flag = state.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.TOP; + list.add(flag ? AABB_SLAB_TOP : AABB_SLAB_BOTTOM); + BlockStairs.EnumShape stairShape = state.getValue(BlockStairs.SHAPE); + + if (stairShape == BlockStairs.EnumShape.STRAIGHT || stairShape == BlockStairs.EnumShape.INNER_LEFT || stairShape == BlockStairs.EnumShape.INNER_RIGHT) { + list.add(getCollQuarterBlock(state)); + } + + if (stairShape != BlockStairs.EnumShape.STRAIGHT) { + list.add(getCollEighthBlock(state)); + } + + return list; + } + + private static AxisAlignedBB getCollQuarterBlock(IBlockState state) { + boolean flag = state.getValue(BlockStairs.HALF) == BlockStairs.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(IBlockState state) { + EnumFacing facing = state.getValue(FACING); + EnumFacing newFacing; + + switch (state.getValue(BlockStairs.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(BlockStairs.HALF) == BlockStairs.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 BlockStairs.EnumShape getStairsShape(IBlockState state, IBlockAccess world, BlockPos pos) { + EnumFacing facing = state.getValue(FACING); + IBlockState offsetState = world.getBlockState(pos.offset(facing)); + + if (isBlockStairs(offsetState) && state.getValue(BlockStairs.HALF) == offsetState.getValue(BlockStairs.HALF)) { + EnumFacing offsetFacing = offsetState.getValue(FACING); + + if (offsetFacing.getAxis() != state.getValue(FACING).getAxis() && isDifferentStairs(state, world, pos, offsetFacing.getOpposite())) { + if (offsetFacing == facing.rotateYCCW()) { + return BlockStairs.EnumShape.OUTER_LEFT; + } + + return BlockStairs.EnumShape.OUTER_RIGHT; + } + } + + IBlockState oppositeOffsetState = world.getBlockState(pos.offset(facing.getOpposite())); + + if (isBlockStairs(oppositeOffsetState) && state.getValue(BlockStairs.HALF) == oppositeOffsetState.getValue(BlockStairs.HALF)) { + EnumFacing oppositeOffsetFacing = oppositeOffsetState.getValue(FACING); + + if (oppositeOffsetFacing.getAxis() != (state.getValue(FACING)).getAxis() && isDifferentStairs(state, world, pos, oppositeOffsetFacing)) { + if (oppositeOffsetFacing == facing.rotateYCCW()) { + return BlockStairs.EnumShape.INNER_LEFT; + } + + return BlockStairs.EnumShape.INNER_RIGHT; + } + } + + return BlockStairs.EnumShape.STRAIGHT; + } + + private static boolean isDifferentStairs(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing facing) { + IBlockState offsetState = world.getBlockState(pos.offset(facing)); + return !isBlockStairs(offsetState) || offsetState.getValue(FACING) != state.getValue(FACING) || offsetState.getValue(BlockStairs.HALF) != state.getValue(BlockStairs.HALF); + } + + public static boolean isBlockStairs(IBlockState state) { + return state.getBlock() instanceof BlockStairs || 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 index 321d75c5..325689e6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java @@ -16,94 +16,57 @@ import net.minecraft.world.IBlockAccess; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -public class BlockEnumWall & IStringSerializable> extends BlockEnum -{ +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) }; + 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) - { + public BlockEnumWall(Material material, Class enumClass, String propName) { super(material, enumClass, propName); } - public BlockEnumWall(Material material, Class enumClass) - { + public BlockEnumWall(Material material, Class enumClass) { this(material, enumClass, "type"); } @Override - protected BlockStateContainer createStateContainer() - { + protected BlockStateContainer createStateContainer() { return new BlockStateContainer.Builder(this).add(getProperty(), UP, NORTH, EAST, SOUTH, WEST).build(); } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) - { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { state = state.getActualState(source, pos); return AABB_BY_INDEX[getAABBIndex(state)]; } @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) - { + public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { blockState = blockState.getActualState(worldIn, pos); return CLIP_AABB_BY_INDEX[getAABBIndex(blockState)]; } - private static int getAABBIndex(IBlockState state) - { - int i = 0; - - if (state.getValue(NORTH)) - { - i |= 1 << EnumFacing.NORTH.getHorizontalIndex(); - } - - if (state.getValue(EAST)) - { - i |= 1 << EnumFacing.EAST.getHorizontalIndex(); - } - - if (state.getValue(SOUTH)) - { - i |= 1 << EnumFacing.SOUTH.getHorizontalIndex(); - } - - if (state.getValue(WEST)) - { - i |= 1 << EnumFacing.WEST.getHorizontalIndex(); - } - - return i; - } - - public boolean isFullCube(IBlockState state) - { + public boolean isFullCube(IBlockState state) { return false; } - public boolean isPassable(IBlockAccess worldIn, BlockPos pos) - { + public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) - { + public boolean isOpaqueCube(IBlockState state) { return false; } - private boolean canConnectTo(IBlockAccess worldIn, BlockPos pos) - { + private boolean canConnectTo(IBlockAccess worldIn, BlockPos pos) { IBlockState worldState = worldIn.getBlockState(pos); Block block = worldState.getBlock(); return block != Blocks.BARRIER && (!(block != this && !(block instanceof BlockFenceGate)) || ((worldState.getMaterial().isOpaque() && worldState.isFullCube()) && worldState.getMaterial() != Material.GOURD)); @@ -111,14 +74,12 @@ public class BlockEnumWall & IStringSerializable> extends Bloc @SideOnly(Side.CLIENT) @Override - public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) - { + public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { return side != EnumFacing.DOWN || super.shouldSideBeRendered(blockState, blockAccess, pos, side); } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) - { + public IBlockState getActualState(IBlockState 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()); @@ -128,14 +89,34 @@ public class BlockEnumWall & IStringSerializable> extends Bloc } @Override - protected ItemStack getSilkTouchDrop(IBlockState state) - { + protected ItemStack getSilkTouchDrop(IBlockState state) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public int damageDropped(IBlockState state) - { + public int damageDropped(IBlockState state) { return super.getMetaFromState(state); } + + private static int getAABBIndex(IBlockState state) { + int i = 0; + + if (state.getValue(NORTH)) { + i |= 1 << EnumFacing.NORTH.getHorizontalIndex(); + } + + if (state.getValue(EAST)) { + i |= 1 << EnumFacing.EAST.getHorizontalIndex(); + } + + if (state.getValue(SOUTH)) { + i |= 1 << EnumFacing.SOUTH.getHorizontalIndex(); + } + + if (state.getValue(WEST)) { + i |= 1 << EnumFacing.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 index 1e3fcd0e..3e2a13f9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java @@ -6,25 +6,20 @@ import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; /** * Creates a block that has multiple meta-based states. - * + *

        * These states will be numbered 0 through {@code maxMeta}. */ -public class BlockInteger extends Block -{ +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) - { + public BlockInteger(Material material, int maxMeta, String propName) { super(material); this.maxMeta = maxMeta; @@ -33,8 +28,7 @@ public class BlockInteger extends Block setDefaultState(getBlockState().getBaseState()); } - public BlockInteger(Material material, int maxMeta) - { + public BlockInteger(Material material, int maxMeta) { this(material, maxMeta, "meta"); } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java index 9b989e9a..7afab9bd 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java @@ -1,13 +1,12 @@ package WayofTime.bloodmagic.block.base; +import WayofTime.bloodmagic.block.property.PropertyString; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.block.property.PropertyString; import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -15,20 +14,18 @@ import org.apache.commons.lang3.ArrayUtils; /** * Creates a block that has multiple meta-based states. - * + *

        * These states will be named after the given string array. Somewhere along the * way, each value is {@code toLowerCase()}'ed, so the blockstate JSON needs all * values to be lowercase. */ -public class BlockString extends Block -{ +public class BlockString extends Block { private final int maxMeta; private final String[] types; private final PropertyString property; private final BlockStateContainer realStateContainer; - public BlockString(Material material, String[] values, String propName) - { + public BlockString(Material material, String[] values, String propName) { super(material); this.maxMeta = values.length; @@ -39,51 +36,43 @@ public class BlockString extends Block setDefaultState(getBlockState().getBaseState()); } - public BlockString(Material material, String[] values) - { + public BlockString(Material material, String[] values) { this(material, values, "type"); } @Override - protected final BlockStateContainer createBlockState() - { + protected final BlockStateContainer createBlockState() { return new BlockStateContainer.Builder(this).build(); // Blank to avoid crashes } @Override - public final BlockStateContainer getBlockState() - { + public final BlockStateContainer getBlockState() { return realStateContainer; } @Override - public IBlockState getStateFromMeta(int meta) - { + public IBlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(property, types[meta]); } @Override - public int getMetaFromState(IBlockState state) - { + public int getMetaFromState(IBlockState state) { return ArrayUtils.indexOf(types, state.getValue(property)); } @Override - public int damageDropped(IBlockState state) - { + public int damageDropped(IBlockState state) { return getMetaFromState(state); } @SideOnly(Side.CLIENT) @Override - public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) - { + public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { for (int i = 0; i < maxMeta; i++) subBlocks.add(new ItemStack(this, 1, i)); } - protected BlockStateContainer createStateContainer() - { + protected BlockStateContainer createStateContainer() { System.out.println(""); BlockStateContainer ctn = new BlockStateContainer.Builder(this).add(property).build(); System.out.println("Number of states: " + ctn.getValidStates().size()); diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumBloodRune.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumBloodRune.java index 41221936..a9c04bd1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumBloodRune.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumBloodRune implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumBloodRune implements IStringSerializable { BLANK, SPEED, EFFICIENCY, @@ -19,14 +18,12 @@ public enum EnumBloodRune implements IStringSerializable CHARGING; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + public String getName() { return this.toString(); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java index c9ae8947..d9cdcdff 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java @@ -1,26 +1,22 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumDecorative implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumDecorative implements IStringSerializable { BLOODSTONE_TILE, BLOODSTONE_BRICK, CRYSTAL_TILE, - CRYSTAL_BRICK, - ; + CRYSTAL_BRICK,; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ROOT); } @Override - public String getName() - { + 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 index 5d532c2c..84b42602 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock1.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock1.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumDemonBlock1 implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumDemonBlock1 implements IStringSerializable { BRICK1_RAW, BRICK1_CORROSIVE, BRICK1_DESTRUCTIVE, @@ -13,14 +12,12 @@ public enum EnumDemonBlock1 implements IStringSerializable BRICK1_STEADFAST; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index bd3407dc..b9a35aab 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock2.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock2.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumDemonBlock2 implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumDemonBlock2 implements IStringSerializable { SMALLBRICK_RAW, SMALLBRICK_CORROSIVE, SMALLBRICK_DESTRUCTIVE, @@ -23,14 +22,12 @@ public enum EnumDemonBlock2 implements IStringSerializable TILESPECIAL_STEADFAST; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index b76c9363..c7a54ac6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock3.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock3.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumDemonBlock3 implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumDemonBlock3 implements IStringSerializable { STONE_RAW, STONE_CORROSIVE, STONE_DESTRUCTIVE, @@ -23,14 +22,12 @@ public enum EnumDemonBlock3 implements IStringSerializable METAL_STEADFAST; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index 3f13bf45..b760a46b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumInversionCap.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumInversionCap.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumInversionCap implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumInversionCap implements IStringSerializable { RAW_BOTTOM, RAW_TOP, CORROSIVE_BOTTOM, @@ -18,14 +17,12 @@ public enum EnumInversionCap implements IStringSerializable STEADFAST_TOP; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index b933ff88..18e2053e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumMimic.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumMimic implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumMimic implements IStringSerializable { NOHITBOX, SOLIDOPAQUE, SOLIDCLEAR, @@ -13,14 +12,12 @@ public enum EnumMimic implements IStringSerializable SENTIENT; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index 787bfc42..79c768bb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumPath.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumPath implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumPath implements IStringSerializable { WOOD, WOODTILE, STONE, @@ -16,14 +15,12 @@ public enum EnumPath implements IStringSerializable OBSIDIANTILE; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index 46250f3a..531ab6a2 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java @@ -1,25 +1,21 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumRitualController implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumRitualController implements IStringSerializable { MASTER, IMPERFECT, - INVERTED, - ; + INVERTED,; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index d42e974c..9f5f9c52 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java @@ -1,12 +1,11 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import net.minecraft.util.IStringSerializable; -public enum EnumSubWillType implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumSubWillType implements IStringSerializable { RAW, CORROSIVE, DESTRUCTIVE, @@ -14,14 +13,12 @@ public enum EnumSubWillType implements IStringSerializable STEADFAST; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + public String getName() { return this.toString(); } diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType1.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType1.java index ede1ec40..4f51f8e8 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType1.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType1.java @@ -1,23 +1,20 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumSubWillType1 implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumSubWillType1 implements IStringSerializable { RAW, CORROSIVE; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index ab1e7d10..5f1a6aca 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType2.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType2.java @@ -1,23 +1,20 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumSubWillType2 implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumSubWillType2 implements IStringSerializable { DESTRUCTIVE, VENGEFUL; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index 63c17562..963704e8 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType3.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType3.java @@ -1,22 +1,19 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumSubWillType3 implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumSubWillType3 implements IStringSerializable { STEADFAST; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + 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 index 7d20db59..172c6d2b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumWillWall.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumWillWall.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.block.enums; -import java.util.Locale; - import net.minecraft.util.IStringSerializable; -public enum EnumWillWall implements IStringSerializable -{ +import java.util.Locale; + +public enum EnumWillWall implements IStringSerializable { BRICK_RAW, BRICK_CORROSIVE, BRICK_DESTRUCTIVE, @@ -23,14 +22,12 @@ public enum EnumWillWall implements IStringSerializable LARGE_STEADFAST; @Override - public String toString() - { + public String toString() { return name().toLowerCase(Locale.ENGLISH); } @Override - public String getName() - { + public String getName() { return this.toString(); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/property/PropertyString.java b/src/main/java/WayofTime/bloodmagic/block/property/PropertyString.java index 1fa570bc..1706dcb4 100644 --- a/src/main/java/WayofTime/bloodmagic/block/property/PropertyString.java +++ b/src/main/java/WayofTime/bloodmagic/block/property/PropertyString.java @@ -2,50 +2,40 @@ package WayofTime.bloodmagic.block.property; import com.google.common.base.Optional; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; import net.minecraft.block.properties.PropertyHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.Arrays; import java.util.Collection; -import java.util.HashSet; -public class PropertyString extends PropertyHelper -{ +public class PropertyString extends PropertyHelper { private final ImmutableSet allowedValues; - protected PropertyString(String name, String[] values) - { + protected PropertyString(String name, String[] values) { super(name, String.class); allowedValues = ImmutableSet.copyOf(values); } @SideOnly(Side.CLIENT) - public Optional parseValue(String value) - { + public Optional parseValue(String value) { return allowedValues.contains(value) ? Optional.of(value) : Optional.absent(); } - public static PropertyString create(String name, String[] values) - { - return new PropertyString(name, values); - } - @Override - public Collection getAllowedValues() - { + public Collection getAllowedValues() { return allowedValues; } - public String getName0(String value) - { + public String getName0(String value) { return value; } @Override - public String getName(String value) - { + public String getName(String value) { return this.getName0(value); } + + public static PropertyString create(String name, String[] values) { + return new PropertyString(name, values); + } } diff --git a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java index ac10d288..d697da6f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java +++ b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java @@ -12,11 +12,10 @@ import java.util.List; * Provides a custom {@link ItemMeshDefinition} for automatic registration of * renders. */ -public interface IMeshProvider -{ +public interface IMeshProvider { /** * Gets the custom ItemMeshDefinition to use for the item. - * + * * @return - the custom ItemMeshDefinition to use for the item. */ @SideOnly(Side.CLIENT) @@ -24,16 +23,16 @@ public interface IMeshProvider /** * Gets all possible variants for this item - * + * * @return - All possible variants for this item */ List getVariants(); /** * If a custom ResourceLocation is required, return it here. - * + *

        * Can be null if unneeded. - * + * * @return - The custom ResourceLocation */ @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java b/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java index 18ba5fd0..c37d9958 100644 --- a/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java +++ b/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java @@ -4,7 +4,6 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.List; -public interface IVariantProvider -{ +public interface IVariantProvider { List> getVariants(); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java index 4c0d214f..8fe326dc 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java @@ -1,6 +1,9 @@ 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.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.InventoryPlayer; @@ -9,17 +12,12 @@ import net.minecraft.inventory.Slot; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import WayofTime.bloodmagic.tile.container.ContainerAlchemyTable; -import WayofTime.bloodmagic.util.helper.TextHelper; @SideOnly(Side.CLIENT) -public class GuiAlchemyTable extends GuiContainer -{ +public class GuiAlchemyTable extends GuiContainer { public IInventory tileTable; - public GuiAlchemyTable(InventoryPlayer playerInventory, IInventory tileTable) - { + public GuiAlchemyTable(InventoryPlayer playerInventory, IInventory tileTable) { super(new ContainerAlchemyTable(playerInventory, tileTable)); this.tileTable = tileTable; this.xSize = 176; @@ -27,15 +25,13 @@ public class GuiAlchemyTable extends GuiContainer } @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) - { + 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) - { + 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); @@ -46,10 +42,8 @@ public class GuiAlchemyTable extends GuiContainer 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)) - { + 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); @@ -57,8 +51,7 @@ public class GuiAlchemyTable extends GuiContainer } } - public int getCookProgressScaled(int scale) - { + public int getCookProgressScaled(int scale) { double progress = ((TileAlchemyTable) tileTable).getProgressForGui(); return (int) (progress * scale); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java index e2ed6ef1..e2b95ea5 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java @@ -1,71 +1,61 @@ package WayofTime.bloodmagic.client.gui; +import WayofTime.bloodmagic.api.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.multiplayer.WorldClient; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.network.IGuiHandler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import WayofTime.bloodmagic.tile.TileSoulForge; -import WayofTime.bloodmagic.tile.TileTeleposer; -import WayofTime.bloodmagic.tile.container.ContainerAlchemyTable; -import WayofTime.bloodmagic.tile.container.ContainerItemRoutingNode; -import WayofTime.bloodmagic.tile.container.ContainerMasterRoutingNode; -import WayofTime.bloodmagic.tile.container.ContainerSoulForge; -import WayofTime.bloodmagic.tile.container.ContainerTeleposer; -import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; -public class GuiHandler implements IGuiHandler -{ +public class GuiHandler implements IGuiHandler { @Override - public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) - { + public Object getServerGuiElement(int id, EntityPlayer 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())); + 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, EntityPlayer player, World world, int x, int y, int z) - { - if (world instanceof WorldClient) - { + public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { + if (world instanceof WorldClient) { 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())); + 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())); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java index f68ef440..04ddecb4 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java @@ -1,10 +1,10 @@ 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.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; @@ -14,13 +14,11 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class GuiHolding extends GuiContainer -{ +public class GuiHolding extends GuiContainer { private ResourceLocation texture = new ResourceLocation(BloodMagic.MODID, "gui/SigilHolding.png"); private EntityPlayer player; - public GuiHolding(EntityPlayer player, InventoryHolding inventoryHolding) - { + public GuiHolding(EntityPlayer player, InventoryHolding inventoryHolding) { super(new ContainerHolding(player, inventoryHolding)); xSize = 176; ySize = 121; @@ -28,23 +26,20 @@ public class GuiHolding extends GuiContainer } @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) - { + 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) - { + 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); - if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING) - { + if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().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 index 1f4d9a13..8c0a2bc2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -1,8 +1,12 @@ package WayofTime.bloodmagic.client.gui; -import java.io.IOException; - 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.GuiButton; import net.minecraft.client.gui.GuiTextField; @@ -16,16 +20,11 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -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 java.io.IOException; @SideOnly(Side.CLIENT) -public class GuiItemRoutingNode extends GuiContainer -{ +public class GuiItemRoutingNode extends GuiContainer { private GuiButton downButton; private GuiButton upButton; private GuiButton northButton; @@ -42,8 +41,7 @@ public class GuiItemRoutingNode extends GuiContainer private int left, top; - public GuiItemRoutingNode(InventoryPlayer playerInventory, IInventory tileRoutingNode) - { + public GuiItemRoutingNode(InventoryPlayer playerInventory, IInventory tileRoutingNode) { super(new ContainerItemRoutingNode(playerInventory, tileRoutingNode)); this.xSize = 201; this.ySize = 169; @@ -51,11 +49,9 @@ public class GuiItemRoutingNode extends GuiContainer container = (ContainerItemRoutingNode) this.inventorySlots; } - private int getCurrentActiveSlotPriority() - { + private int getCurrentActiveSlotPriority() { EnumFacing direction = EnumFacing.getFront(inventory.currentActiveSlot); - if (direction != null) - { + if (direction != null) { return inventory.getPriority(direction); } @@ -63,8 +59,7 @@ public class GuiItemRoutingNode extends GuiContainer } @Override - public void initGui() - { + public void initGui() { super.initGui(); left = (this.width - this.xSize) / 2; top = (this.height - this.ySize) / 2; @@ -86,41 +81,32 @@ public class GuiItemRoutingNode extends GuiContainer } @Override - protected void keyTyped(char typedChar, int keyCode) throws IOException - { - if (this.textBox.textboxKeyTyped(typedChar, keyCode)) - { - if (container.lastGhostSlotClicked != -1) - { + 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 - { + if (!str.isEmpty()) { + try { Integer testVal = Integer.decode(str); - if (testVal != null) - { + if (testVal != null) { amount = testVal.intValue(); } - } catch (NumberFormatException d) - { + } catch (NumberFormatException d) { } } // inventory.setGhostItemAmount(container.lastGhostSlotClicked, amount); setValueOfGhostItemInSlot(container.lastGhostSlotClicked, amount); } - } else - { + } else { super.keyTyped(typedChar, keyCode); } } - private void setValueOfGhostItemInSlot(int ghostItemSlot, int amount) - { + private void setValueOfGhostItemInSlot(int ghostItemSlot, int amount) { BloodMagicPacketHandler.INSTANCE.sendToServer(new ItemRouterAmountPacketProcessor(ghostItemSlot, amount, inventory.getPos(), inventory.getWorld())); } @@ -128,20 +114,16 @@ public class GuiItemRoutingNode extends GuiContainer * Called when the mouse is clicked. Args : mouseX, mouseY, clickedButton */ @Override - protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException - { + 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) - { + if (container.lastGhostSlotClicked != -1) { Slot slot = container.getSlot(container.lastGhostSlotClicked + 1); ItemStack stack = slot.getStack(); - if (stack != null) - { + if (stack != null) { int amount = GhostItemHelper.getItemGhostAmount(stack); this.textBox.setText("" + amount); - } else - { + } else { this.textBox.setText(""); } } @@ -151,8 +133,7 @@ public class GuiItemRoutingNode extends GuiContainer * Draws the screen and all the components in it. */ @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) - { + public void drawScreen(int mouseX, int mouseY, float partialTicks) { super.drawScreen(mouseX, mouseY, partialTicks); Minecraft.getMinecraft().fontRenderer.drawString(inventory.getName(), xSize, ySize / 4, 4210752); @@ -163,13 +144,10 @@ public class GuiItemRoutingNode extends GuiContainer * for buttons) */ @Override - protected void actionPerformed(GuiButton button) throws IOException - { - if (button.enabled) - { + protected void actionPerformed(GuiButton button) throws IOException { + if (button.enabled) { BloodMagicPacketHandler.INSTANCE.sendToServer(new ItemRouterButtonPacketProcessor(button.id, inventory.getPos(), inventory.getWorld())); - if (button.id < 6) - { + if (button.id < 6) { inventory.currentActiveSlot = button.id; enableAllDirectionalButtons(); button.enabled = false; @@ -177,29 +155,23 @@ public class GuiItemRoutingNode extends GuiContainer } } - private void enableAllDirectionalButtons() - { - for (GuiButton button : this.buttonList) - { + private void enableAllDirectionalButtons() { + for (GuiButton button : this.buttonList) { button.enabled = true; } } - private void disableDirectionalButton(int id) - { + private void disableDirectionalButton(int id) { this.buttonList.get(id).enabled = false; } @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) - { + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { this.fontRenderer.drawString("" + getCurrentActiveSlotPriority(), 143 + 5, 51 + 4, 0xFFFFFF); String s = ""; - if (container.lastGhostSlotClicked != -1) - { + if (container.lastGhostSlotClicked != -1) { ItemStack clickedStack = inventorySlots.getSlot(1 + container.lastGhostSlotClicked).getStack(); - if (clickedStack != null) - { + if (clickedStack != null) { s = clickedStack.getDisplayName(); } } @@ -208,8 +180,7 @@ public class GuiItemRoutingNode extends GuiContainer } @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) - { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java index d8f0c3bb..dd49555e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java @@ -12,12 +12,10 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class GuiMasterRoutingNode extends GuiContainer -{ +public class GuiMasterRoutingNode extends GuiContainer { private TileEntity inventory; - public GuiMasterRoutingNode(InventoryPlayer playerInventory, IInventory tileRoutingNode) - { + public GuiMasterRoutingNode(InventoryPlayer playerInventory, IInventory tileRoutingNode) { super(new ContainerMasterRoutingNode(playerInventory, tileRoutingNode)); this.xSize = 216; this.ySize = 216; @@ -25,15 +23,13 @@ public class GuiMasterRoutingNode extends GuiContainer } @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) - { + 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) - { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java index a383f96d..1d5ddf05 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java @@ -13,12 +13,10 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class GuiSoulForge extends GuiContainer -{ +public class GuiSoulForge extends GuiContainer { public IInventory tileSoulForge; - public GuiSoulForge(InventoryPlayer playerInventory, IInventory tileSoulForge) - { + public GuiSoulForge(InventoryPlayer playerInventory, IInventory tileSoulForge) { super(new ContainerSoulForge(playerInventory, tileSoulForge)); this.tileSoulForge = tileSoulForge; this.xSize = 176; @@ -26,15 +24,13 @@ public class GuiSoulForge extends GuiContainer } @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) - { + 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) - { + 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); @@ -46,8 +42,7 @@ public class GuiSoulForge extends GuiContainer this.drawTexturedModalRect(i + 115, j + 14 + 90 - l, 176, 90 - l, 18, l); } - public int getCookProgressScaled(int scale) - { + 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 index 2220e04b..828a0805 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java @@ -12,23 +12,19 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class GuiTeleposer extends GuiContainer -{ - public GuiTeleposer(InventoryPlayer playerInventory, IInventory tileTeleposer) - { +public class GuiTeleposer extends GuiContainer { + public GuiTeleposer(InventoryPlayer playerInventory, IInventory tileTeleposer) { super(new ContainerTeleposer(playerInventory, tileTeleposer)); } @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) - { + 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) - { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java index c535ebd0..9013d8ea 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java @@ -10,17 +10,14 @@ import net.minecraftforge.fml.client.config.IConfigElement; import java.util.ArrayList; import java.util.List; -public class ConfigGui extends GuiConfig -{ +public class ConfigGui extends GuiConfig { - public ConfigGui(GuiScreen parentScreen) - { + public ConfigGui(GuiScreen parentScreen) { super(parentScreen, getConfigElements(parentScreen), BloodMagic.MODID, false, false, "BloodMagic Configuration"); } @SuppressWarnings("rawtypes") - private static List getConfigElements(GuiScreen parent) - { + private static List getConfigElements(GuiScreen parent) { List list = new ArrayList(); // adds sections declared in ConfigHandler. toLowerCase() is used diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java index 8b2e4598..2f968574 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java @@ -6,8 +6,7 @@ import net.minecraftforge.fml.client.IModGuiFactory; import java.util.Set; -public class ConfigGuiFactory implements IModGuiFactory -{ +public class ConfigGuiFactory implements IModGuiFactory { @Override public void initialize(Minecraft minecraftInstance) { diff --git a/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java b/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java index 501958a6..a268d9f9 100644 --- a/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java +++ b/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java @@ -2,10 +2,10 @@ * 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)] */ package WayofTime.bloodmagic.client.helper; @@ -22,8 +22,7 @@ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; -public final class ShaderHelper -{ +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; @@ -35,40 +34,34 @@ public final class ShaderHelper public static int psiBar; - public static void init() - { + public static void init() { if (!useShaders()) return; psiBar = createProgram("/assets/bloodmagic/shaders/beam", FRAG); } - public static void useShader(int shader, int ticks) - { + public static void useShader(int shader, int ticks) { if (!useShaders()) return; ARBShaderObjects.glUseProgramObjectARB(shader); - if (shader != 0) - { + if (shader != 0) { int time = ARBShaderObjects.glGetUniformLocationARB(shader, "time"); ARBShaderObjects.glUniform1iARB(time, ticks); } } - public static void releaseShader() - { + public static void releaseShader() { useShader(0, 0); } - public static boolean useShaders() - { + public static boolean useShaders() { return OpenGlHelper.shadersSupported; } - private static int createProgram(String s, int sides) - { + private static int createProgram(String s, int sides) { boolean vert = (sides & VERT) != 0; boolean frag = (sides & FRAG) != 0; @@ -78,8 +71,7 @@ public final class ShaderHelper // 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) - { + private static int createProgram(String vert, String frag) { int vertId = 0, fragId = 0, program = 0; if (vert != null) vertId = createShader(vert, VERT_ST); @@ -96,15 +88,13 @@ public final class ShaderHelper ARBShaderObjects.glAttachObjectARB(program, fragId); ARBShaderObjects.glLinkProgramARB(program); - if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB) == GL11.GL_FALSE) - { + 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) - { + if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB) == GL11.GL_FALSE) { FMLLog.log(Level.ERROR, getLogInfo(program)); return 0; } @@ -112,11 +102,9 @@ public final class ShaderHelper return program; } - private static int createShader(String filename, int shaderType) - { + private static int createShader(String filename, int shaderType) { int shader = 0; - try - { + try { shader = ARBShaderObjects.glCreateShaderObjectARB(shaderType); if (shader == 0) @@ -129,21 +117,18 @@ public final class ShaderHelper throw new RuntimeException("Error creating shader: " + getLogInfo(shader)); return shader; - } catch (Exception e) - { + } catch (Exception e) { ARBShaderObjects.glDeleteObjectARB(shader); e.printStackTrace(); return -1; } } - private static String getLogInfo(int obj) - { + 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 - { + private static String readFileAsString(String filename) throws Exception { StringBuilder source = new StringBuilder(); InputStream in = ShaderHelper.class.getResourceAsStream(filename); Exception exception = null; @@ -152,26 +137,20 @@ public final class ShaderHelper if (in == null) return ""; - try - { + try { reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); Exception innerExc = null; - try - { + try { String line; while ((line = reader.readLine()) != null) source.append(line).append('\n'); - } catch (Exception exc) - { + } catch (Exception exc) { exception = exc; - } finally - { - try - { + } finally { + try { reader.close(); - } catch (Exception exc) - { + } catch (Exception exc) { if (innerExc == null) innerExc = exc; else @@ -181,16 +160,12 @@ public final class ShaderHelper if (innerExc != null) throw innerExc; - } catch (Exception exc) - { + } catch (Exception exc) { exception = exc; - } finally - { - try - { + } finally { + try { in.close(); - } catch (Exception exc) - { + } catch (Exception exc) { if (exception == null) exception = exc; else diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java index 7aea273b..c9a605a5 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java @@ -8,16 +8,14 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraftforge.client.event.RenderGameOverlayEvent; -public abstract class HUDElement -{ - private int xOffset; - private int yOffset; +public abstract class HUDElement { private final int xOffsetDefault; private final int yOffsetDefault; private final RenderGameOverlayEvent.ElementType elementType; + private int xOffset; + private int yOffset; - public HUDElement(int xOffset, int yOffset, RenderGameOverlayEvent.ElementType elementType) - { + public HUDElement(int xOffset, int yOffset, RenderGameOverlayEvent.ElementType elementType) { this.xOffset = xOffset; this.xOffsetDefault = xOffset; this.yOffset = yOffset; @@ -31,19 +29,16 @@ public abstract class HUDElement public abstract boolean shouldRender(Minecraft minecraft); - public void onPositionChanged() - { + public void onPositionChanged() { } - public void resetToDefault() - { + public void resetToDefault() { this.xOffset = xOffsetDefault; this.yOffset = yOffsetDefault; } - public void drawTexturedModalRect(double x, double y, double textureX, double textureY, double width, double height) - { + public 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(); diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java index f7f195e0..946b2ca0 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java @@ -1,25 +1,23 @@ package WayofTime.bloodmagic.client.hud; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.proxy.ClientProxy; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderGameOverlayEvent; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.proxy.ClientProxy; -import WayofTime.bloodmagic.util.Utils; -public class HUDElementDemonWillAura extends HUDElement -{ +import java.util.ArrayList; +import java.util.List; + +public class HUDElementDemonWillAura extends HUDElement { protected List barOrder = new ArrayList(); - public HUDElementDemonWillAura() - { + public HUDElementDemonWillAura() { super(5, 5, RenderGameOverlayEvent.ElementType.HOTBAR); barOrder.add(EnumDemonWillType.DEFAULT); @@ -30,12 +28,10 @@ public class HUDElementDemonWillAura extends HUDElement } @Override - public void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) - { + public void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) { EntityPlayer player = minecraft.player; - if (!Utils.canPlayerSeeDemonWill(player)) - { + if (!Utils.canPlayerSeeDemonWill(player)) { return; } @@ -46,8 +42,7 @@ public class HUDElementDemonWillAura extends HUDElement double maxAmount = Utils.getDemonWillResolution(player); int i = 0; - for (EnumDemonWillType type : barOrder) - { + for (EnumDemonWillType type : barOrder) { i++; GlStateManager.color(1.0F, 1.0F, 1.0F); minecraft.getTextureManager().bindTexture(new ResourceLocation(BloodMagic.MODID, "textures/hud/bars.png")); @@ -67,8 +62,7 @@ public class HUDElementDemonWillAura extends HUDElement this.drawTexturedModalRect(x, y, textureX, textureY, width, height); - if (player.isSneaking()) - { + if (player.isSneaking()) { GlStateManager.pushMatrix(); String value = "" + (int) amount; GlStateManager.translate(x - 2 * textureXOffset - value.length() * 0 + 70, (y - 1), 0); @@ -80,8 +74,7 @@ public class HUDElementDemonWillAura extends HUDElement } @Override - public boolean shouldRender(Minecraft minecraft) - { + public boolean shouldRender(Minecraft minecraft) { return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java index 9914bbf1..5524e074 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.client.hud; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; @@ -15,17 +15,14 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent; import java.util.List; -public class HUDElementHolding extends HUDElement -{ +public class HUDElementHolding extends HUDElement { - public HUDElementHolding() - { + public HUDElementHolding() { super(0, 0, RenderGameOverlayEvent.ElementType.HOTBAR); } @Override - public void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) - { + public void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) { ItemStack sigilHolding = minecraft.player.getHeldItemMainhand(); // Check mainhand for Sigil of Holding if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) @@ -45,8 +42,7 @@ public class HUDElementHolding extends HUDElement RenderHelper.enableGUIStandardItemLighting(); List holdingInv = ItemSigilHolding.getInternalInventory(sigilHolding); int xOffset = 0; - for (ItemStack sigil : holdingInv) - { + for (ItemStack sigil : holdingInv) { renderHotbarItem(resolution.getScaledWidth() / 2 + 103 + xOffset + getXOffset(), resolution.getScaledHeight() - 18 + getYOffset(), partialTicks, minecraft.player, sigil); xOffset += 20; } @@ -55,19 +51,15 @@ public class HUDElementHolding extends HUDElement } @Override - public boolean shouldRender(Minecraft minecraft) - { + public boolean shouldRender(Minecraft minecraft) { return true; } - protected void renderHotbarItem(int x, int y, float partialTicks, EntityPlayer player, ItemStack stack) - { - if (!stack.isEmpty()) - { + protected void renderHotbarItem(int x, int y, float partialTicks, EntityPlayer player, ItemStack stack) { + if (!stack.isEmpty()) { float animation = (float) stack.getAnimationsToGo() - partialTicks; - if (animation > 0.0F) - { + if (animation > 0.0F) { GlStateManager.pushMatrix(); float f1 = 1.0F + animation / 5.0F; GlStateManager.translate((float) (x + 8), (float) (y + 12), 0.0F); diff --git a/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java b/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java index f2b99fbc..c325019f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.client.key; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -public interface IKeybindable -{ +public interface IKeybindable { void onKeyPressed(ItemStack stack, EntityPlayer 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 index 6d2ba73b..b1b18335 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java @@ -7,10 +7,8 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class KeyBindingBloodMagic extends KeyBinding -{ - public KeyBindingBloodMagic(KeyBindings key) - { +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 index d10e0897..a9d8a8af 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java @@ -18,43 +18,35 @@ import org.lwjgl.input.Keyboard; import java.util.Locale; -public enum KeyBindings -{ +public enum KeyBindings { // @formatter:off - OPEN_HOLDING(KeyConflictContext.IN_GAME, KeyModifier.NONE, Keyboard.KEY_H) - { + OPEN_HOLDING(KeyConflictContext.IN_GAME, KeyModifier.NONE, Keyboard.KEY_H) { @SideOnly(Side.CLIENT) @Override - public void handleKeybind() - { + 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) - { + CYCLE_HOLDING_POS(KeyConflictContext.IN_GAME, KeyModifier.SHIFT, Keyboard.KEY_EQUALS) { @SideOnly(Side.CLIENT) @Override - public void handleKeybind() - { + public void handleKeybind() { EntityPlayerSP player = Minecraft.getMinecraft().player; if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, -1); } }, - CYCLE_HOLDING_NEG(KeyConflictContext.IN_GAME, KeyModifier.SHIFT, Keyboard.KEY_MINUS) - { + CYCLE_HOLDING_NEG(KeyConflictContext.IN_GAME, KeyModifier.SHIFT, Keyboard.KEY_MINUS) { @SideOnly(Side.CLIENT) @Override - public void handleKeybind() - { + public void handleKeybind() { EntityPlayerSP player = Minecraft.getMinecraft().player; if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, 1); } - }, - ; + },; // @formatter:on private final IKeyConflictContext keyConflictContext; @@ -64,8 +56,7 @@ public enum KeyBindings @SideOnly(Side.CLIENT) private KeyBinding key; - KeyBindings(IKeyConflictContext keyConflictContext, KeyModifier keyModifier, int keyCode) - { + KeyBindings(IKeyConflictContext keyConflictContext, KeyModifier keyModifier, int keyCode) { this.keyConflictContext = keyConflictContext; this.keyModifier = keyModifier; this.keyCode = keyCode; @@ -74,24 +65,20 @@ public enum KeyBindings @SideOnly(Side.CLIENT) public abstract void handleKeybind(); - public IKeyConflictContext getKeyConflictContext() - { + public IKeyConflictContext getKeyConflictContext() { return keyConflictContext; } - public KeyModifier getKeyModifier() - { + public KeyModifier getKeyModifier() { return keyModifier; } - public int getKeyCode() - { + public int getKeyCode() { return keyCode; } @SideOnly(Side.CLIENT) - public KeyBinding getKey() - { + public KeyBinding getKey() { if (key == null) key = new KeyBindingBloodMagic(this); @@ -99,13 +86,11 @@ public enum KeyBindings } @SideOnly(Side.CLIENT) - public void setKey(KeyBinding key) - { + public void setKey(KeyBinding key) { this.key = key; } - public String getDescription() - { + 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 index add94841..f7576cd2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java @@ -7,18 +7,15 @@ import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -public class CustomMeshDefinitionActivatable implements ItemMeshDefinition -{ +public class CustomMeshDefinitionActivatable implements ItemMeshDefinition { private final String name; - public CustomMeshDefinitionActivatable(String name) - { + public CustomMeshDefinitionActivatable(String name) { this.name = name; } @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { + 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, "item/" + name), "active=true"); diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java index 283f5358..57c5cd8f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java @@ -1,27 +1,23 @@ package WayofTime.bloodmagic.client.mesh; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.iface.IMultiWillTool; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -public class CustomMeshDefinitionMultiWill implements ItemMeshDefinition -{ +public class CustomMeshDefinitionMultiWill implements ItemMeshDefinition { private final String name; - public CustomMeshDefinitionMultiWill(String name) - { + public CustomMeshDefinitionMultiWill(String name) { this.name = name; } @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { - if (!stack.isEmpty() && stack.getItem() instanceof IMultiWillTool) - { + 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, "item/" + name), "type=" + type.getName().toLowerCase()); } diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java index 45e4af99..907a6cea 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java @@ -1,28 +1,24 @@ package WayofTime.bloodmagic.client.mesh; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.soul.ItemSoulGem; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.item.soul.ItemSoulGem; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -public class CustomMeshDefinitionWillGem implements ItemMeshDefinition -{ +public class CustomMeshDefinitionWillGem implements ItemMeshDefinition { private final String name; - public CustomMeshDefinitionWillGem(String name) - { + public CustomMeshDefinitionWillGem(String name) { this.name = name; } @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { - if (!stack.isEmpty() && stack.getItem() == RegistrarBloodMagicItems.SOUL_GEM) - { + 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, "item/" + name), "type=" + ItemSoulGem.names[stack.getItemDamage()] + "_" + type.getName().toLowerCase()); } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java b/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java index 08186d3b..25a9d228 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java @@ -13,26 +13,21 @@ import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -public class LayerBloodElytra implements LayerRenderer -{ +public class LayerBloodElytra implements LayerRenderer { private static final ResourceLocation TEXTURE_BLOOD_ELYTRA = new ResourceLocation("bloodmagic", "textures/entities/bloodElytra.png"); private final RenderPlayer renderPlayer; private final ModelElytra modelElytra = new ModelElytra(); - public LayerBloodElytra(RenderPlayer renderPlayer) - { + public LayerBloodElytra(RenderPlayer renderPlayer) { this.renderPlayer = renderPlayer; } @Override - public void doRenderLayer(AbstractClientPlayer clientPlayer, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) - { - if (LivingArmour.hasFullSet(clientPlayer)) - { + public void doRenderLayer(AbstractClientPlayer clientPlayer, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { + if (LivingArmour.hasFullSet(clientPlayer)) { ItemStack chestStack = clientPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (ItemLivingArmour.hasUpgrade(BloodMagic.MODID + ".upgrade.elytra", chestStack)) - { + if (ItemLivingArmour.hasUpgrade(BloodMagic.MODID + ".upgrade.elytra", chestStack)) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.enableBlend(); @@ -52,8 +47,7 @@ public class LayerBloodElytra implements LayerRenderer } @Override - public boolean shouldCombineTextures() - { + 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 index b8af70c5..41fdcf94 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.client.render.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; @@ -8,33 +10,25 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer -{ - public AttractorAlchemyCircleRenderer() - { +public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer { + public AttractorAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ZombieBeacon.png")); } - public AttractorAlchemyCircleRenderer(ResourceLocation resourceLocation) - { + public AttractorAlchemyCircleRenderer(ResourceLocation resourceLocation) { super(resourceLocation); } @Override - public float getSizeModifier(float craftTime) - { + public float getSizeModifier(float craftTime) { return 1; } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 2; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (craftTime - offset) * 5f; return modifier * 1f; } @@ -42,18 +36,14 @@ public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public float getSecondaryRotation(float craftTime) - { + public float getSecondaryRotation(float craftTime) { float offset = 50; float secondaryOffset = 150; - if (craftTime >= offset) - { - if (craftTime < secondaryOffset) - { + if (craftTime >= offset) { + if (craftTime < secondaryOffset) { float modifier = 90 * (craftTime - offset) / (secondaryOffset - offset); return modifier; - } else - { + } else { return 90; } } @@ -61,10 +51,8 @@ public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) - { - if (!(tile instanceof TileAlchemyArray)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -95,30 +83,29 @@ public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * 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; + 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(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index 208ca594..2df29bc5 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; @@ -8,26 +9,19 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; - -public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer -{ - public float offsetFromFace = -0.9f; - public final ResourceLocation[] arraysResources; +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() - { + 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"); @@ -37,97 +31,33 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer arraysResources[4] = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BindingLightningArray.png"); } - 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; - } - - public float getRotation(int circle, float craftTime) - { + public float getRotation(int circle, float craftTime) { float offset = 2; - if (circle == -1) - { + if (circle == -1) { return craftTime * 360 * 2 / 5 / sweepTime; } - if (craftTime >= offset) - { + 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) - { + public float getSecondaryRotation(int circle, float craftTime) { float offset = 50; - if (craftTime >= offset) - { + 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) - { + 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 - { + } else { return -0.4f; } } @@ -135,29 +65,22 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer return 0; } - if (craftTime >= 5) - { - if (craftTime <= 40) - { + if (craftTime >= 5) { + if (craftTime <= 40) { return (float) ((-0.4) * Math.pow((craftTime - 5) / 35f, 3)); - } else - { + } else { return -0.4f; } } return 0; } - public float getInwardRotation(int circle, float craftTime) - { + public float getInwardRotation(int circle, float craftTime) { float offset = startTime + numberOfSweeps * sweepTime; - if (craftTime >= offset) - { - if (craftTime <= offset + inwardRotationTime) - { + if (craftTime >= offset) { + if (craftTime <= offset + inwardRotationTime) { return 90f / inwardRotationTime * (craftTime - offset); - } else - { + } else { return 90; } } @@ -165,8 +88,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer return 0; } - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { Tessellator tessellator = Tessellator.getInstance(); BufferBuilder wr = tessellator.getBuffer(); @@ -189,30 +111,29 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer EnumFacing sideHit = EnumFacing.UP; GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * 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; + 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(); @@ -236,8 +157,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer tessellator.draw(); GlStateManager.popMatrix(); - for (int i = 0; i < 5; i++) - { + for (int i = 0; i < 5; i++) { GlStateManager.pushMatrix(); Minecraft.getMinecraft().renderEngine.bindTexture(arraysResources[i]); float newSize = 1; @@ -268,4 +188,49 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer 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 index f9d62120..4e334205 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.client.render.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; @@ -8,37 +10,29 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer -{ - public float offsetFromFace = -0.9f; +public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer { public final ResourceLocation secondaryArrayResource; + public float offsetFromFace = -0.9f; - public DualAlchemyCircleRenderer() - { + 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) - { + public DualAlchemyCircleRenderer(ResourceLocation arrayResource, ResourceLocation secondaryArrayResource) { super(arrayResource); this.secondaryArrayResource = secondaryArrayResource; } @Override - public float getSizeModifier(float craftTime) - { + public float getSizeModifier(float craftTime) { return 1; } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 2; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (craftTime - offset) * 2f; return modifier * 1f; } @@ -46,10 +40,8 @@ public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) - { - if (!(tile instanceof TileAlchemyArray)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -77,30 +69,29 @@ public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * 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; + 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(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java index b4c2059c..3bd566f0 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.client.render.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; @@ -8,35 +10,27 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer -{ +public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer { public float offsetFromFace = -0.9f; - public SingleAlchemyCircleRenderer() - { + public SingleAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png")); } - public SingleAlchemyCircleRenderer(ResourceLocation arrayResource) - { + public SingleAlchemyCircleRenderer(ResourceLocation arrayResource) { super(arrayResource); } @Override - public float getSizeModifier(float craftTime) - { + public float getSizeModifier(float craftTime) { return 1; } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 2; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (craftTime - offset) * 2f; return modifier * 1f; } @@ -44,10 +38,8 @@ public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) - { - if (!(tile instanceof TileAlchemyArray)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -75,30 +67,29 @@ public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * 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; + 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(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java index ea243639..5e3e3ff5 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.client.render.alchemyArray; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; @@ -8,33 +10,25 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer -{ - public StaticAlchemyCircleRenderer(ResourceLocation location) - { +public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer { + public StaticAlchemyCircleRenderer(ResourceLocation location) { super(location); } - public StaticAlchemyCircleRenderer() - { + public StaticAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png")); } @Override - public float getSizeModifier(float craftTime) - { + public float getSizeModifier(float craftTime) { return 1; } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 50; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (craftTime - offset) * 5f; return modifier * 1f; } @@ -42,16 +36,13 @@ public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public float getSecondaryRotation(float craftTime) - { + 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)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -81,30 +72,29 @@ public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * 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; + 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(); 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 61e4d563..13700c19 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java @@ -6,11 +6,9 @@ import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.ItemStack; -public class RenderAlchemyArray extends TileEntitySpecialRenderer -{ +public class RenderAlchemyArray extends TileEntitySpecialRenderer { @Override - public void render(TileAlchemyArray alchemyArray, double x, double y, double z, float partialTicks, int destroyStage, float alpha) - { + 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; 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 e51545d7..b471e4f4 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -22,16 +22,14 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import org.lwjgl.opengl.GL11; -public class RenderAltar extends TileEntitySpecialRenderer -{ +public class RenderAltar extends TileEntitySpecialRenderer { public static Minecraft mc = Minecraft.getMinecraft(); public static ResourceLocation resource = new ResourceLocation("bloodmagic", "textures/blocks/lifeEssenceStill.png"); public static float minHeight = 0.499f; public static float maxHeight = 0.745f; @Override - public void render(TileAltar tileAltar, double x, double y, double z, float partialTicks, int destroyStage, float alpha) - { + public void render(TileAltar tileAltar, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { ItemStack inputStack = tileAltar.getStackInSlot(0); float level = ((float) tileAltar.getCurrentBlood()) / (float) tileAltar.getCapacity(); @@ -43,14 +41,12 @@ public class RenderAltar extends TileEntitySpecialRenderer this.renderItem(tileAltar.getWorld(), inputStack); GlStateManager.popMatrix(); - if (tileAltar.getCurrentTierDisplayed() != EnumAltarTier.ONE) - { + if (tileAltar.getCurrentTierDisplayed() != EnumAltarTier.ONE) { renderHologram(tileAltar, tileAltar.getCurrentTierDisplayed(), partialTicks); } } - private void renderFluid(World world, float fluidLevel) - { + private void renderFluid(World world, float fluidLevel) { GlStateManager.pushMatrix(); Fluid fluid = BlockLifeEssence.getLifeEssence(); @@ -86,20 +82,9 @@ public class RenderAltar extends TileEntitySpecialRenderer 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); - } - - private void renderItem(World world, ItemStack stack) - { + private void renderItem(World world, ItemStack stack) { RenderItem itemRenderer = mc.getRenderItem(); - if (!stack.isEmpty()) - { + if (!stack.isEmpty()) { GlStateManager.translate(0.5, 1, 0.5); EntityItem entityitem = new EntityItem(world, 0.0D, 0.0D, 0.0D, stack); entityitem.getItem().setCount(1); @@ -122,8 +107,7 @@ public class RenderAltar extends TileEntitySpecialRenderer } } - private void renderHologram(TileAltar altar, EnumAltarTier tier, float partialTicks) - { + private void renderHologram(TileAltar altar, EnumAltarTier tier, float partialTicks) { EntityPlayerSP player = mc.player; World world = player.world; @@ -141,37 +125,34 @@ public class RenderAltar extends TileEntitySpecialRenderer double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; - for (AltarComponent altarComponent : tier.getAltarComponents()) - { + 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()) - { + 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; + 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); @@ -180,4 +161,12 @@ public class RenderAltar extends TileEntitySpecialRenderer 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 index 844d41ce..235fb836 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java @@ -16,13 +16,11 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) -public class RenderBloodTank extends TileEntitySpecialRenderer -{ +public class RenderBloodTank extends TileEntitySpecialRenderer { private static final Minecraft mc = Minecraft.getMinecraft(); @Override - public void render(TileBloodTank bloodTank, double x, double y, double z, float partialTicks, int destroyStage, float alpha) - { + public void render(TileBloodTank bloodTank, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { if (bloodTank == null) return; @@ -39,8 +37,7 @@ public class RenderBloodTank extends TileEntitySpecialRenderer GlStateManager.popMatrix(); } - public void renderFluid(float maxHeight, Fluid renderFluid, double x, double y, double z) - { + public void renderFluid(float maxHeight, Fluid renderFluid, double x, double y, double z) { maxHeight = maxHeight * 0.575F; GlStateManager.translate(x, y, z); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java index 9b7ed869..439b9618 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java @@ -12,16 +12,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; -public class RenderDemonCrucible extends TileEntitySpecialRenderer -{ +public class RenderDemonCrucible extends TileEntitySpecialRenderer { public static Minecraft mc = Minecraft.getMinecraft(); 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) - { + public void render(TileDemonCrucible tile, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { ItemStack inputStack = tile.getStackInSlot(0); GlStateManager.pushMatrix(); @@ -30,11 +28,9 @@ public class RenderDemonCrucible extends TileEntitySpecialRenderer -{ +public class RenderItemRoutingNode extends TileEntitySpecialRenderer { private static final ResourceLocation beamTexture = new ResourceLocation(BloodMagic.MODID, "textures/entities/nodeBeam.png"); private static final Minecraft mc = Minecraft.getMinecraft(); @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.alwaysRenderRoutingLines) - { + 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.alwaysRenderRoutingLines) { List connectionList = tileNode.getConnected(); - for (BlockPos wantedPos : connectionList) - { + for (BlockPos wantedPos : connectionList) { BlockPos offsetPos = wantedPos.subtract(tileNode.getPos()); //The beam renders towards the east by default. diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java index b96e6ee4..8909df07 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java @@ -1,22 +1,18 @@ package WayofTime.bloodmagic.client.render.block; +import WayofTime.bloodmagic.tile.TileMimic; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.tile.TileMimic; @SideOnly(Side.CLIENT) -public class RenderMimic extends TileEntitySpecialRenderer -{ - public void render(TileMimic mimic, double x, double y, double z, float partialTicks, int destroyStage, float alpha) - { - if (mimic.getStackInSlot(0) != null) - { +public class RenderMimic extends TileEntitySpecialRenderer { + 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) - { + if (mimic != null) { TileEntityRendererDispatcher.instance.render(testTile, x, y, z, partialTicks, destroyStage); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java index 3c064e44..1237c0c7 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java @@ -5,11 +5,9 @@ import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -public class BloodLightRenderFactory implements IRenderFactory -{ +public class BloodLightRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index 0705375f..6429a137 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedChickenRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedChickenRenderFactory.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -public class CorruptedChickenRenderFactory implements IRenderFactory -{ +public class CorruptedChickenRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index 42986d10..20c9c2c9 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSheepRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSheepRenderFactory.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -public class CorruptedSheepRenderFactory implements IRenderFactory -{ +public class CorruptedSheepRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index eb0d211f..95debc39 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSpiderRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSpiderRenderFactory.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; -public class CorruptedSpiderRenderFactory implements IRenderFactory -{ +public class CorruptedSpiderRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index 9626ee9a..2e29c50e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedZombieRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedZombieRenderFactory.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; -public class CorruptedZombieRenderFactory implements IRenderFactory -{ +public class CorruptedZombieRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index a55f4559..5b57d12d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/MeteorRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/MeteorRenderFactory.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; +import WayofTime.bloodmagic.entity.projectile.EntityMeteor; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -import WayofTime.bloodmagic.entity.projectile.EntityMeteor; -public class MeteorRenderFactory implements IRenderFactory -{ +public class MeteorRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index 00d5f642..bc015688 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/MimicRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/MimicRenderFactory.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; +import WayofTime.bloodmagic.entity.mob.EntityMimic; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -import WayofTime.bloodmagic.entity.mob.EntityMimic; -public class MimicRenderFactory implements IRenderFactory -{ +public class MimicRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index e919f5cc..44db0152 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java @@ -1,35 +1,31 @@ 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.RenderLiving; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.client.render.entity.layer.LayerWill; -import WayofTime.bloodmagic.client.render.model.ModelCorruptedChicken; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; @SideOnly(Side.CLIENT) -public class RenderCorruptedChicken extends RenderLiving -{ +public class RenderCorruptedChicken extends RenderLiving { private static final ResourceLocation CHICKEN_TEXTURES = new ResourceLocation("textures/entity/chicken.png"); - public RenderCorruptedChicken(RenderManager renderManagerIn) - { + public RenderCorruptedChicken(RenderManager renderManagerIn) { super(renderManagerIn, new ModelCorruptedChicken(0), 0.3f); this.addLayer(new LayerWill(this, new ModelCorruptedChicken(1.1f))); } @Override - protected ResourceLocation getEntityTexture(EntityCorruptedChicken entity) - { + protected ResourceLocation getEntityTexture(EntityCorruptedChicken entity) { return CHICKEN_TEXTURES; } @Override - protected float handleRotationFloat(EntityCorruptedChicken livingBase, float partialTicks) - { + 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; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java index 111d222b..11529425 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java @@ -1,24 +1,22 @@ package WayofTime.bloodmagic.client.render.entity; -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; 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.RenderLiving; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class RenderCorruptedSheep extends RenderLiving -{ +public class RenderCorruptedSheep extends RenderLiving { private static final ResourceLocation SHEARED_SHEEP_TEXTURES = new ResourceLocation("textures/entity/sheep/sheep.png"); - public RenderCorruptedSheep(RenderManager renderManagerIn) - { + public RenderCorruptedSheep(RenderManager renderManagerIn) { super(renderManagerIn, new ModelCorruptedSheep2(0), 0.7F); this.addLayer(new LayerCorruptedSheepWool(this)); this.addLayer(new LayerWill(this, new ModelCorruptedSheep(1.1f))); @@ -27,8 +25,7 @@ public class RenderCorruptedSheep extends RenderLiving } @Override - protected ResourceLocation getEntityTexture(EntityCorruptedSheep entity) - { + 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 index e118403b..343a459c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java @@ -1,30 +1,27 @@ 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.RenderLiving; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -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; @SideOnly(Side.CLIENT) -public class RenderCorruptedSpider extends RenderLiving -{ +public class RenderCorruptedSpider extends RenderLiving { private static final ResourceLocation SPIDER_TEXTURES = new ResourceLocation("textures/entity/spider/spider.png"); - public RenderCorruptedSpider(RenderManager renderManagerIn) - { + public RenderCorruptedSpider(RenderManager 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) - { + protected float getDeathMaxRotation(EntityCorruptedSpider entityLivingBaseIn) { return 180.0F; } @@ -32,8 +29,7 @@ public class RenderCorruptedSpider extends RenderLiving * Returns the location of an entity's texture. Doesn't seem to be called * unless you call Render.bindEntityTexture. */ - protected ResourceLocation getEntityTexture(EntityCorruptedSpider entity) - { + 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 index 70c94eaa..57475a5f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java @@ -1,5 +1,7 @@ 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.RenderBiped; @@ -11,33 +13,26 @@ 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; -import WayofTime.bloodmagic.client.render.entity.layer.LayerWill; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; @SideOnly(Side.CLIENT) -public class RenderCorruptedZombie extends RenderBiped -{ +public class RenderCorruptedZombie extends RenderBiped { private static final ResourceLocation ZOMBIE_TEXTURES = new ResourceLocation("textures/entity/zombie/zombie.png"); private final ModelZombieVillager zombieVillagerModel; - public RenderCorruptedZombie(RenderManager renderManagerIn) - { + public RenderCorruptedZombie(RenderManager renderManagerIn) { super(renderManagerIn, new ModelZombie(), 0.5F); LayerRenderer layerrenderer = this.layerRenderers.get(0); this.zombieVillagerModel = new ModelZombieVillager(); this.addLayer(new LayerHeldItem(this)); - LayerBipedArmor layerbipedarmor = new LayerBipedArmor(this) - { - protected void initArmor() - { + LayerBipedArmor layerbipedarmor = new LayerBipedArmor(this) { + protected void initArmor() { this.modelLeggings = new ModelZombie(0.5F, true); this.modelArmor = new ModelZombie(1.0F, true); } }; this.addLayer(layerbipedarmor); - if (layerrenderer instanceof LayerCustomHead) - { + if (layerrenderer instanceof LayerCustomHead) { layerRenderers.remove(layerrenderer); this.addLayer(new LayerCustomHead(this.zombieVillagerModel.bipedHead)); } @@ -50,16 +45,14 @@ public class RenderCorruptedZombie extends RenderBiped * Allows the render to do state modifications necessary before the model is * rendered. */ - protected void preRenderCallback(EntityCorruptedZombie entitylivingbaseIn, float partialTickTime) - { + 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) - { + public void doRender(EntityCorruptedZombie entity, double x, double y, double z, float entityYaw, float partialTicks) { super.doRender(entity, x, y, z, entityYaw, partialTicks); } @@ -67,8 +60,7 @@ public class RenderCorruptedZombie extends RenderBiped * Returns the location of an entity's texture. Doesn't seem to be called * unless you call Render.bindEntityTexture. */ - protected ResourceLocation getEntityTexture(EntityCorruptedZombie entity) - { + 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 index ba8f3131..5d74c644 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java @@ -11,17 +11,14 @@ import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.util.ResourceLocation; -public class RenderEntityBloodLight extends Render -{ +public class RenderEntityBloodLight extends Render { private final RenderItem renderItem = Minecraft.getMinecraft().getRenderItem(); - public RenderEntityBloodLight(RenderManager renderManagerIn) - { + public RenderEntityBloodLight(RenderManager renderManagerIn) { super(renderManagerIn); } - public void doRender(EntityBloodLight entity, double x, double y, double z, float entityYaw, float partialTicks) - { + 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(); @@ -35,8 +32,7 @@ public class RenderEntityBloodLight extends Render super.doRender(entity, x, y, z, entityYaw, partialTicks); } - protected ResourceLocation getEntityTexture(EntityBloodLight entity) - { + protected ResourceLocation getEntityTexture(EntityBloodLight entity) { return TextureMap.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 index 6aa13082..f1cf5f9f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java @@ -1,28 +1,25 @@ 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.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.client.render.model.ModelMeteor; -import WayofTime.bloodmagic.entity.projectile.EntityMeteor; -public class RenderEntityMeteor extends Render -{ +public class RenderEntityMeteor extends Render { + private static final ResourceLocation resource = new ResourceLocation(BloodMagic.MODID, "textures/models/Meteor.png"); public ModelBase model = new ModelMeteor(); private float scale = 1; - private static final ResourceLocation resource = new ResourceLocation(BloodMagic.MODID, "textures/models/Meteor.png"); - public RenderEntityMeteor(RenderManager renderManagerIn) - { + public RenderEntityMeteor(RenderManager renderManagerIn) { super(renderManagerIn); } @Override - public void doRender(EntityMeteor entity, double x, double y, double z, float entityYaw, float partialTicks) - { + 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(); @@ -49,8 +46,7 @@ public class RenderEntityMeteor extends Render } @Override - protected ResourceLocation getEntityTexture(EntityMeteor entity) - { + protected ResourceLocation getEntityTexture(EntityMeteor entity) { return resource; } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java index 08e6f26f..27a39056 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java @@ -1,7 +1,8 @@ package WayofTime.bloodmagic.client.render.entity; -import java.util.UUID; - +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.block.model.ItemCameraTransforms; @@ -21,34 +22,25 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.StringUtils; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.client.render.model.ModelMimic; -import WayofTime.bloodmagic.entity.mob.EntityMimic; - -import com.mojang.authlib.GameProfile; @SideOnly(Side.CLIENT) -public class RenderEntityMimic extends RenderLiving -{ +public class RenderEntityMimic extends RenderLiving { private static final ResourceLocation SPIDER_TEXTURES = new ResourceLocation("textures/entity/spider/spider.png"); Minecraft minecraft = Minecraft.getMinecraft(); - public RenderEntityMimic(RenderManager renderManagerIn) - { + public RenderEntityMimic(RenderManager renderManagerIn) { super(renderManagerIn, new ModelMimic(), 1.0F); } @Override - public void doRender(EntityMimic mimic, double x, double y, double z, float entityYaw, float partialTicks) - { + 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) - { + if (mimic.getMimicItemStack() != null) { GlStateManager.pushMatrix(); - if (this.renderOutlines) - { + if (this.renderOutlines) { GlStateManager.enableColorMaterial(); GlStateManager.enableOutlineMode(this.getTeamColor(mimic)); } @@ -62,26 +54,21 @@ public class RenderEntityMimic extends RenderLiving GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - if (item == Items.SKULL) - { + if (item == Items.SKULL) { float f2 = 1.1875F; GlStateManager.scale(1.1875F, -1.1875F, -1.1875F); GameProfile gameprofile = null; - if (itemstack.hasTagCompound()) - { + if (itemstack.hasTagCompound()) { NBTTagCompound nbttagcompound = itemstack.getTagCompound(); - if (nbttagcompound.hasKey("SkullOwner", 10)) - { + if (nbttagcompound.hasKey("SkullOwner", 10)) { gameprofile = NBTUtil.readGameProfileFromNBT(nbttagcompound.getCompoundTag("SkullOwner")); - } else if (nbttagcompound.hasKey("SkullOwner", 8)) - { + } else if (nbttagcompound.hasKey("SkullOwner", 8)) { String s = nbttagcompound.getString("SkullOwner"); - if (!StringUtils.isNullOrEmpty(s)) - { + if (!StringUtils.isNullOrEmpty(s)) { gameprofile = TileEntitySkull.updateGameprofile(new GameProfile(null, s)); nbttagcompound.setTag("SkullOwner", NBTUtil.writeGameProfile(new NBTTagCompound(), gameprofile)); } @@ -89,8 +76,7 @@ public class RenderEntityMimic extends RenderLiving } TileEntitySkullRenderer.instance.renderSkull(-0.5F, 0.0F, -0.5F, EnumFacing.UP, 180.0F, itemstack.getMetadata(), gameprofile, -1, 0); - } else if (!(item instanceof ItemArmor) || ((ItemArmor) item).getEquipmentSlot() != EntityEquipmentSlot.HEAD) - { + } else if (!(item instanceof ItemArmor) || ((ItemArmor) item).getEquipmentSlot() != EntityEquipmentSlot.HEAD) { GlStateManager.translate(0, 0.5f, 0); GlStateManager.rotate(-(mimic.prevRotationYawHead + partialTicks * (mimic.rotationYawHead - mimic.prevRotationYawHead)) - 180, 0, 1, 0); @@ -99,8 +85,7 @@ public class RenderEntityMimic extends RenderLiving GlStateManager.popMatrix(); - if (this.renderOutlines) - { + if (this.renderOutlines) { GlStateManager.disableOutlineMode(); GlStateManager.disableColorMaterial(); } @@ -111,15 +96,13 @@ public class RenderEntityMimic extends RenderLiving } GlStateManager.popMatrix(); - if (!this.renderOutlines) - { + if (!this.renderOutlines) { this.renderLeash(mimic, x, y, z, entityYaw, partialTicks); } } @Override - protected float getDeathMaxRotation(EntityMimic mimic) - { + protected float getDeathMaxRotation(EntityMimic mimic) { return 180.0F; } @@ -128,8 +111,7 @@ public class RenderEntityMimic extends RenderLiving * unless you call Render.bindEntityTexture. */ @Override - protected ResourceLocation getEntityTexture(EntityMimic mimic) - { + 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 index 7667e9f5..c0a2a618 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java @@ -1,5 +1,6 @@ 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; @@ -10,27 +11,21 @@ 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; -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; - @SideOnly(Side.CLIENT) -public class RenderEntitySentientArrow extends Render -{ +public class RenderEntitySentientArrow extends Render { 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(RenderManager renderManagerIn) - { + public RenderEntitySentientArrow(RenderManager renderManagerIn) { super(renderManagerIn); } - public void doRender(EntitySentientArrow entity, double x, double y, double z, float entityYaw, float partialTicks) - { + 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(); @@ -52,8 +47,7 @@ public class RenderEntitySentientArrow extends Render GlStateManager.enableRescaleNormal(); float f9 = (float) entity.arrowShake - partialTicks; - if (f9 > 0.0F) - { + if (f9 > 0.0F) { float f10 = -MathHelper.sin(f9 * 3.0F) * f9; GlStateManager.rotate(f10, 0.0F, 0.0F, 1.0F); } @@ -76,8 +70,7 @@ public class RenderEntitySentientArrow extends Render worldrenderer.pos(-7.0D, -2.0D, -2.0D).tex((double) f4, (double) f7).endVertex(); tessellator.draw(); - for (int j = 0; j < 4; ++j) - { + 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); @@ -97,21 +90,19 @@ public class RenderEntitySentientArrow extends Render * 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; + 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 index 9e42137d..cfe46aed 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.entity; -import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; 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.RenderItem; @@ -12,17 +12,14 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -public class RenderEntitySoulSnare extends Render -{ +public class RenderEntitySoulSnare extends Render { private final RenderItem renderItem = Minecraft.getMinecraft().getRenderItem(); - public RenderEntitySoulSnare(RenderManager renderManagerIn) - { + public RenderEntitySoulSnare(RenderManager renderManagerIn) { super(renderManagerIn); } - public void doRender(EntitySoulSnare entity, double x, double y, double z, float entityYaw, float partialTicks) - { + 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(); @@ -36,8 +33,7 @@ public class RenderEntitySoulSnare extends Render super.doRender(entity, x, y, z, entityYaw, partialTicks); } - protected ResourceLocation getEntityTexture(EntitySoulSnare entity) - { + protected ResourceLocation getEntityTexture(EntitySoulSnare entity) { return TextureMap.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 index 2dc7df63..4c8ab7fe 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java @@ -1,5 +1,6 @@ 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.RenderBiped; @@ -14,15 +15,12 @@ import net.minecraft.util.EnumHandSide; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; @SideOnly(Side.CLIENT) -public class RenderSentientSpecter extends RenderBiped -{ +public class RenderSentientSpecter extends RenderBiped { public static final ResourceLocation texture = new ResourceLocation("bloodmagic", "textures/entities/specter.png"); - public RenderSentientSpecter(RenderManager renderManager) - { + public RenderSentientSpecter(RenderManager renderManager) { super(renderManager, new ModelBiped(0.0F), 0); this.addLayer(new LayerBipedArmor(this)); this.addLayer(new LayerHeldItem(this)); @@ -30,22 +28,19 @@ public class RenderSentientSpecter extends RenderBiped this.addLayer(new LayerCustomHead(this.getMainModel().bipedHead)); } - public ModelBiped getMainModel() - { + 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) - { + 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) - { + private void setModelVisibilities(EntitySentientSpecter clientPlayer) { ModelBiped modelplayer = this.getMainModel(); ItemStack itemstack = clientPlayer.getHeldItemMainhand(); @@ -56,45 +51,36 @@ public class RenderSentientSpecter extends RenderBiped ModelBiped.ArmPose modelbiped$armpose = ModelBiped.ArmPose.EMPTY; ModelBiped.ArmPose modelbiped$armpose1 = ModelBiped.ArmPose.EMPTY; - if (!itemstack.isEmpty()) - { + if (!itemstack.isEmpty()) { modelbiped$armpose = ModelBiped.ArmPose.ITEM; - if (clientPlayer.getItemInUseCount() > 0) - { + if (clientPlayer.getItemInUseCount() > 0) { EnumAction enumaction = itemstack.getItemUseAction(); - if (enumaction == EnumAction.BLOCK) - { + if (enumaction == EnumAction.BLOCK) { modelbiped$armpose = ModelBiped.ArmPose.BLOCK; - } else if (enumaction == EnumAction.BOW) - { + } else if (enumaction == EnumAction.BOW) { modelbiped$armpose = ModelBiped.ArmPose.BOW_AND_ARROW; } } } - if (!itemstack1.isEmpty()) - { + if (!itemstack1.isEmpty()) { modelbiped$armpose1 = ModelBiped.ArmPose.ITEM; - if (clientPlayer.getItemInUseCount() > 0) - { + if (clientPlayer.getItemInUseCount() > 0) { EnumAction enumaction1 = itemstack1.getItemUseAction(); - if (enumaction1 == EnumAction.BLOCK) - { + if (enumaction1 == EnumAction.BLOCK) { modelbiped$armpose1 = ModelBiped.ArmPose.BLOCK; } } } - if (clientPlayer.getPrimaryHand() == EnumHandSide.RIGHT) - { + if (clientPlayer.getPrimaryHand() == EnumHandSide.RIGHT) { modelplayer.rightArmPose = modelbiped$armpose; modelplayer.leftArmPose = modelbiped$armpose1; - } else - { + } else { modelplayer.rightArmPose = modelbiped$armpose1; modelplayer.leftArmPose = modelbiped$armpose; } @@ -105,13 +91,11 @@ public class RenderSentientSpecter extends RenderBiped * Returns the location of an entity's texture. Doesn't seem to be called * unless you call Render.bindEntityTexture. */ - protected ResourceLocation getEntityTexture(EntitySentientSpecter entity) - { + protected ResourceLocation getEntityTexture(EntitySentientSpecter entity) { return texture; } - public void transformHeldFull3DItemLayer() - { + public void transformHeldFull3DItemLayer() { GlStateManager.translate(0.0F, 0.1875F, 0.0F); } @@ -119,8 +103,7 @@ public class RenderSentientSpecter extends RenderBiped * Allows the render to do state modifications necessary before the model is * rendered. */ - protected void preRenderCallback(EntitySentientSpecter entitylivingbaseIn, float partialTickTime) - { + protected void preRenderCallback(EntitySentientSpecter entitylivingbaseIn, float partialTickTime) { float f = 0.9375F; GlStateManager.scale(0.9375F, 0.9375F, 0.9375F); } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java index 1d821634..49ec7093 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java @@ -5,11 +5,9 @@ import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -public class SentientArrowRenderFactory implements IRenderFactory -{ +public class SentientArrowRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index e06af0c2..8e92253c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -public class SentientSpecterRenderFactory implements IRenderFactory -{ +public class SentientSpecterRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index cb755a27..0ced4e40 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SoulSnareRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/SoulSnareRenderFactory.java @@ -5,11 +5,9 @@ import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; -public class SoulSnareRenderFactory implements IRenderFactory -{ +public class SoulSnareRenderFactory implements IRenderFactory { @Override - public Render createRenderFor(RenderManager manager) - { + public Render createRenderFor(RenderManager 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 index 26d3fdc9..5e5da140 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java @@ -1,5 +1,6 @@ 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; @@ -9,25 +10,20 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; @SideOnly(Side.CLIENT) -public class LayerAlchemyCircle implements LayerRenderer -{ +public class LayerAlchemyCircle implements LayerRenderer { private static final ResourceLocation ARRAY_TEXTURE = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png"); float rotationspeed = 10; - public LayerAlchemyCircle() - { + 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) - { + public void doRenderLayer(EntityCorruptedSheep demon, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { + if (demon.getCastTimer() <= 0) { return; } @@ -80,8 +76,7 @@ public class LayerAlchemyCircle implements Layer } @Override - public boolean shouldCombineTextures() - { + 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 index d66c2ea3..92c55940 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSheepWool.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSheepWool.java @@ -1,35 +1,30 @@ 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.EnumDyeColor; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.client.render.entity.RenderCorruptedSheep; -import WayofTime.bloodmagic.client.render.model.ModelCorruptedSheep; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; @SideOnly(Side.CLIENT) -public class LayerCorruptedSheepWool implements LayerRenderer -{ +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) - { + 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()) - { + 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())) - { + if (entitylivingbaseIn.hasCustomName() && "jeb_".equals(entitylivingbaseIn.getCustomNameTag())) { int i1 = 25; int i = entitylivingbaseIn.ticksExisted / 25 + entitylivingbaseIn.getEntityId(); int j = EnumDyeColor.values().length; @@ -39,8 +34,7 @@ public class LayerCorruptedSheepWool implements LayerRenderer -{ +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) - { + 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) - { + 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()) - { + if (entitylivingbaseIn.isInvisible()) { GlStateManager.depthMask(false); - } else - { + } else { GlStateManager.depthMask(true); } @@ -50,8 +45,7 @@ public class LayerCorruptedSpiderEyes implements LayerRenderer implements LayerRenderer -{ +public class LayerWill implements LayerRenderer { private static final ResourceLocation RAW_TEXTURE = new ResourceLocation("bloodmagic", "textures/entities/overlay/overlay_raw.png"); private final RenderLiving renderer; private final ModelBase model; - public LayerWill(RenderLiving rendererIn, ModelBase model) - { + public LayerWill(RenderLiving 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) - { + 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()) - { + if (demon.isInvisible()) { return; //TODO: Make this also check if the demon wants the Will layer } @@ -56,8 +52,7 @@ public class LayerWill implements LayerRenderer } @Override - public boolean shouldCombineTextures() - { + 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 index 8b498781..578cac99 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedChicken.java @@ -9,8 +9,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class ModelCorruptedChicken extends ModelBase -{ +public class ModelCorruptedChicken extends ModelBase { public ModelRenderer head; public ModelRenderer body; public ModelRenderer rightLeg; @@ -20,8 +19,7 @@ public class ModelCorruptedChicken extends ModelBase public ModelRenderer bill; public ModelRenderer chin; - public ModelCorruptedChicken(float scale) - { + 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); @@ -51,12 +49,10 @@ public class ModelCorruptedChicken extends ModelBase /** * 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) - { + 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) - { + if (this.isChild) { GlStateManager.pushMatrix(); GlStateManager.translate(0.0F, 5.0F * scale, 2.0F * scale); this.head.render(scale); @@ -72,8 +68,7 @@ public class ModelCorruptedChicken extends ModelBase this.rightWing.render(scale); this.leftWing.render(scale); GlStateManager.popMatrix(); - } else - { + } else { this.head.render(scale); this.bill.render(scale); this.chin.render(scale); @@ -91,8 +86,7 @@ public class ModelCorruptedChicken extends ModelBase * 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) - { + 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; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java index 6e631c50..a1c27e01 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java @@ -1,20 +1,18 @@ 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.EntityLivingBase; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; @SideOnly(Side.CLIENT) -public class ModelCorruptedSheep extends ModelQuadruped -{ +public class ModelCorruptedSheep extends ModelQuadruped { private float headRotationAngleX; - public ModelCorruptedSheep(float scale) - { + 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); @@ -42,8 +40,7 @@ public class ModelCorruptedSheep extends ModelQuadruped * float params here are the same second and third as in the * setRotationAngles method. */ - public void setLivingAnimations(EntityLivingBase entitylivingbaseIn, float p_78086_2_, float p_78086_3_, float partialTickTime) - { + public void setLivingAnimations(EntityLivingBase 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); @@ -55,8 +52,7 @@ public class ModelCorruptedSheep extends ModelQuadruped * 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) - { + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java index f9f5ec19..fb5d5497 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java @@ -1,20 +1,18 @@ 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.EntityLivingBase; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; @SideOnly(Side.CLIENT) -public class ModelCorruptedSheep2 extends ModelQuadruped -{ +public class ModelCorruptedSheep2 extends ModelQuadruped { private float headRotationAngleX; - public ModelCorruptedSheep2(float scale) - { + 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); @@ -29,8 +27,7 @@ public class ModelCorruptedSheep2 extends ModelQuadruped * float params here are the same second and third as in the * setRotationAngles method. */ - public void setLivingAnimations(EntityLivingBase entitylivingbaseIn, float p_78086_2_, float p_78086_3_, float partialTickTime) - { + public void setLivingAnimations(EntityLivingBase 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); @@ -42,8 +39,7 @@ public class ModelCorruptedSheep2 extends ModelQuadruped * 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) - { + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSpider.java index 4c000ba8..3f92fad3 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSpider.java @@ -8,33 +8,53 @@ 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 class ModelCorruptedSpider extends ModelBase { + /** + * The spider's head box + */ public ModelRenderer spiderHead; - /** The spider's neck box */ + /** + * The spider's neck box + */ public ModelRenderer spiderNeck; - /** The spider's body box */ + /** + * The spider's body box + */ public ModelRenderer spiderBody; - /** Spider's first leg */ + /** + * Spider's first leg + */ public ModelRenderer spiderLeg1; - /** Spider's second leg */ + /** + * Spider's second leg + */ public ModelRenderer spiderLeg2; - /** Spider's third leg */ + /** + * Spider's third leg + */ public ModelRenderer spiderLeg3; - /** Spider's fourth leg */ + /** + * Spider's fourth leg + */ public ModelRenderer spiderLeg4; - /** Spider's fifth leg */ + /** + * Spider's fifth leg + */ public ModelRenderer spiderLeg5; - /** Spider's sixth leg */ + /** + * Spider's sixth leg + */ public ModelRenderer spiderLeg6; - /** Spider's seventh leg */ + /** + * Spider's seventh leg + */ public ModelRenderer spiderLeg7; - /** Spider's eight leg */ + /** + * Spider's eight leg + */ public ModelRenderer spiderLeg8; - public ModelCorruptedSpider(float scale) - { + public ModelCorruptedSpider(float scale) { float f = 0.0F; int i = 15; this.spiderHead = new ModelRenderer(this, 32, 4); @@ -75,8 +95,7 @@ public class ModelCorruptedSpider extends ModelBase /** * 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) - { + 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); @@ -97,8 +116,7 @@ public class ModelCorruptedSpider extends ModelBase * 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) - { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMeteor.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMeteor.java index 3e62353c..8e75b6c8 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMeteor.java @@ -7,10 +7,8 @@ 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 -{ +public class ModelMeteor extends ModelBase { //fields ModelRenderer Shape1; ModelRenderer Shape2; @@ -20,8 +18,7 @@ public class ModelMeteor extends ModelBase ModelRenderer Shape6; ModelRenderer Shape7; - public ModelMeteor() - { + public ModelMeteor() { textureWidth = 64; textureHeight = 64; Shape1 = new ModelRenderer(this, 0, 0); @@ -68,8 +65,7 @@ public class ModelMeteor extends ModelBase setRotation(Shape7, 0F, 0F, 0F); } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { + 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); @@ -81,15 +77,13 @@ public class ModelMeteor extends ModelBase Shape7.render(f5); } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + 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) - { + 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 index cc1d3914..e06c1220 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMimic.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMimic.java @@ -8,27 +8,41 @@ 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 class ModelMimic extends ModelBase { + /** + * Spider's first leg + */ public ModelRenderer mimicLeg1; - /** Spider's second leg */ + /** + * Spider's second leg + */ public ModelRenderer mimicLeg2; - /** Spider's third leg */ + /** + * Spider's third leg + */ public ModelRenderer mimicLeg3; - /** Spider's fourth leg */ + /** + * Spider's fourth leg + */ public ModelRenderer mimicLeg4; - /** Spider's fifth leg */ + /** + * Spider's fifth leg + */ public ModelRenderer mimicLeg5; - /** Spider's sixth leg */ + /** + * Spider's sixth leg + */ public ModelRenderer mimicLeg6; - /** Spider's seventh leg */ + /** + * Spider's seventh leg + */ public ModelRenderer mimicLeg7; - /** Spider's eight leg */ + /** + * Spider's eight leg + */ public ModelRenderer mimicLeg8; - public ModelMimic() - { + 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); @@ -58,8 +72,7 @@ public class ModelMimic extends ModelBase /** * 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) - { + 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); @@ -77,8 +90,7 @@ public class ModelMimic extends ModelBase * 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) - { + 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; diff --git a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java index dd92000e..81eb9063 100644 --- a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java @@ -8,45 +8,37 @@ import net.minecraft.command.ICommandSender; import net.minecraft.util.text.TextComponentString; import net.minecraftforge.server.command.CommandTreeBase; -public class CommandBloodMagic extends CommandTreeBase -{ - public CommandBloodMagic() - { +public class CommandBloodMagic extends CommandTreeBase { + public CommandBloodMagic() { addSubcommand(new SubCommandBind()); addSubcommand(new SubCommandNetwork()); addSubcommand(new SubCommandOrb()); } @Override - public String getName() - { + public String getName() { return "bloodmagic"; } @Override - public String getUsage(ICommandSender sender) - { + public String getUsage(ICommandSender sender) { return "/bloodmagic help"; } @Override - public int getRequiredPermissionLevel() - { + public int getRequiredPermissionLevel() { return 2; } - public static void displayHelpString(ICommandSender commandSender, String display, Object... info) - { + public static void displayHelpString(ICommandSender commandSender, String display, Object... info) { commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); } - public static void displayErrorString(ICommandSender commandSender, String display, Object... info) - { + public static void displayErrorString(ICommandSender commandSender, String display, Object... info) { commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); } - public static void displaySuccessString(ICommandSender commandSender, String display, Object... info) - { + public static void displaySuccessString(ICommandSender commandSender, String display, Object... info) { commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index 0798f3fe..3e5cbb48 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -6,90 +6,78 @@ import WayofTime.bloodmagic.api.util.helper.BindableHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; -import net.minecraft.command.*; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.PlayerNotFoundException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentTranslation; -public class SubCommandBind extends CommandBase -{ +public class SubCommandBind extends CommandBase { @Override - public String getName() - { + public String getName() { return "bind"; } @Override - public String getUsage(ICommandSender commandSender) - { + public String getUsage(ICommandSender commandSender) { return TextHelper.localizeEffect("commands.bind.usage"); } @Override - public int getRequiredPermissionLevel() - { + public int getRequiredPermissionLevel() { return 2; } @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException - { + public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { if (commandSender.getEntityWorld().isRemote) return; - try - { + try { EntityPlayer player = CommandBase.getCommandSenderAsPlayer(commandSender); String playerName = player.getName(); String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); ItemStack held = player.getHeldItemMainhand(); boolean bind = true; - if (held.getItem() instanceof IBindable) - { - if (args.length > 0) - { + if (held.getItem() instanceof IBindable) { + if (args.length > 0) { if (args[0].equalsIgnoreCase("help")) return; - if (isBoolean(args[0])) - { + if (isBoolean(args[0])) { bind = Boolean.parseBoolean(args[0]); if (args.length > 2) playerName = args[1]; - } else - { + } else { playerName = args[0]; uuid = PlayerHelper.getUUIDFromPlayer(CommandBase.getPlayer(server, commandSender, playerName)).toString(); } } - if (bind) - { + if (bind) { BindableHelper.setItemOwnerName(held, playerName); BindableHelper.setItemOwnerUUID(held, uuid); commandSender.sendMessage(new TextComponentTranslation("commands.bind.success")); - } else - { - if (!Strings.isNullOrEmpty(((IBindable) held.getItem()).getOwnerUUID(held))) - { + } else { + if (!Strings.isNullOrEmpty(((IBindable) held.getItem()).getOwnerUUID(held))) { held.getTagCompound().removeTag(Constants.NBT.OWNER_UUID); held.getTagCompound().removeTag(Constants.NBT.OWNER_NAME); commandSender.sendMessage(new TextComponentTranslation("commands.bind.remove.success")); } } } - } catch (PlayerNotFoundException e) - { + } catch (PlayerNotFoundException e) { commandSender.sendMessage(new TextComponentTranslation(TextHelper.localizeEffect("commands.error.404"))); } } - private boolean isBoolean(String string) - { + private boolean isBoolean(String string) { return string.equalsIgnoreCase("true") || string.equalsIgnoreCase("false"); } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index f874d954..21717206 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -5,159 +5,127 @@ import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.*; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.PlayerNotFoundException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentString; import java.util.Locale; -public class SubCommandNetwork extends CommandBase -{ +public class SubCommandNetwork extends CommandBase { @Override public String getName() { return "network"; } @Override - public String getUsage(ICommandSender commandSender) - { + public String getUsage(ICommandSender commandSender) { return TextHelper.localizeEffect("commands.network.usage"); } @Override - public int getRequiredPermissionLevel() - { + public int getRequiredPermissionLevel() { return 2; } @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException - { - if (args.length > 1) - { + public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { + if (args.length > 1) { if (args[0].equalsIgnoreCase("help")) return; - try - { + try { EntityPlayer player = CommandBase.getPlayer(server, commandSender, args[1]); - try - { + try { ValidCommands command = ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH)); command.run(player, commandSender, args.length > 0 && args.length < 2, args); - } catch (IllegalArgumentException e) - { + } catch (IllegalArgumentException e) { } - } catch (PlayerNotFoundException e) - { + } catch (PlayerNotFoundException e) { CommandBloodMagic.displayErrorString(commandSender, e.getLocalizedMessage()); } - } else - { + } else { CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.missing"); } } - private enum ValidCommands - { - SYPHON("commands.network.syphon.help") - { + private enum ValidCommands { + SYPHON("commands.network.syphon.help") { @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) - { - if (displayHelp) - { + public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { + if (displayHelp) { CommandBloodMagic.displayHelpString(sender, this.help); return; } - if (args.length == 3) - { - if (Utils.isInteger(args[2])) - { + if (args.length == 3) { + if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, amount); CommandBloodMagic.displaySuccessString(sender, "commands.network.syphon.success", amount, player.getDisplayName().getFormattedText()); - } else - { + } else { CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); } - } else - { + } else { CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); } } }, - ADD("commands.network.add.help") - { + ADD("commands.network.add.help") { @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) - { - if (displayHelp) - { + public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { + if (displayHelp) { CommandBloodMagic.displayHelpString(sender, this.help); return; } SoulNetwork network = NetworkHelper.getSoulNetwork(player); - if (args.length == 3) - { - if (Utils.isInteger(args[2])) - { + if (args.length == 3) { + if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); CommandBloodMagic.displaySuccessString(sender, "commands.network.add.success", network.add(amount, maxOrb), player.getDisplayName().getFormattedText()); - } else - { + } else { CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); } - } else - { + } else { CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); } } }, - SET("commands.network.set.help") - { + SET("commands.network.set.help") { @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) - { - if (displayHelp) - { + public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { + if (displayHelp) { CommandBloodMagic.displayHelpString(sender, this.help); return; } SoulNetwork network = NetworkHelper.getSoulNetwork(player); - if (args.length == 3) - { - if (Utils.isInteger(args[2])) - { + if (args.length == 3) { + if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); network.setCurrentEssence(amount); CommandBloodMagic.displaySuccessString(sender, "commands.network.set.success", player.getDisplayName().getFormattedText(), amount); - } else - { + } else { CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); } - } else - { + } else { CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); } } }, - GET("commands.network.get.help") - { + GET("commands.network.get.help") { @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) - { - if (displayHelp) - { + public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { + if (displayHelp) { CommandBloodMagic.displayHelpString(sender, this.help); return; } @@ -169,53 +137,43 @@ public class SubCommandNetwork extends CommandBase } }, - FILL("commands.network.fill.help") - { + FILL("commands.network.fill.help") { @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) - { - if (displayHelp) - { + public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { + if (displayHelp) { CommandBloodMagic.displayHelpString(sender, this.help, Integer.MAX_VALUE); return; } SoulNetwork network = NetworkHelper.getSoulNetwork(player); - if (args.length > 1) - { + if (args.length > 1) { network.setCurrentEssence(Integer.MAX_VALUE); CommandBloodMagic.displaySuccessString(sender, "commands.network.fill.success", player.getDisplayName().getFormattedText()); } } }, - CAP("commands.network.cap.help") - { + CAP("commands.network.cap.help") { @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) - { - if (displayHelp) - { + public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { + if (displayHelp) { CommandBloodMagic.displayHelpString(sender, this.help); return; } SoulNetwork network = NetworkHelper.getSoulNetwork(player); - if (args.length > 1) - { + if (args.length > 1) { int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); network.setCurrentEssence(maxOrb); CommandBloodMagic.displaySuccessString(sender, "commands.network.cap.success", player.getDisplayName().getFormattedText()); } } - }, - ; + },; public String help; - ValidCommands(String help) - { + ValidCommands(String help) { this.help = help; } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java index 58c5396c..6fac129d 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -6,43 +6,40 @@ import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.*; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.PlayerNotFoundException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentString; import java.util.Locale; -public class SubCommandOrb extends CommandBase -{ +public class SubCommandOrb extends CommandBase { @Override public String getName() { return "orb"; } @Override - public String getUsage(ICommandSender commandSender) - { + public String getUsage(ICommandSender commandSender) { return TextHelper.localizeEffect("commands.orb.usage"); } @Override - public int getRequiredPermissionLevel() - { + public int getRequiredPermissionLevel() { return 2; } @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException - { - if (args.length > 0) - { + public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { + if (args.length > 0) { if (args[0].equalsIgnoreCase("help")) return; - try - { + try { String givenName = commandSender.getName(); if (args.length > 1) @@ -54,70 +51,56 @@ public class SubCommandOrb extends CommandBase boolean displayHelp = args.length > 0 && args.length < 2; - try - { - switch (ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH))) - { - case SET: - { - if (displayHelp) - { - CommandBloodMagic.displayHelpString(commandSender, ValidCommands.SET.help); - break; - } - - if (args.length == 3) - { - if (Utils.isInteger(args[2])) - { - int amount = Integer.parseInt(args[2]); - network.setOrbTier(amount); - CommandBloodMagic.displaySuccessString(commandSender, "commands.success"); - } else - { - CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.invalid"); + try { + switch (ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH))) { + case SET: { + if (displayHelp) { + CommandBloodMagic.displayHelpString(commandSender, ValidCommands.SET.help); + break; + } + + if (args.length == 3) { + if (Utils.isInteger(args[2])) { + int amount = Integer.parseInt(args[2]); + network.setOrbTier(amount); + CommandBloodMagic.displaySuccessString(commandSender, "commands.success"); + } else { + CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.invalid"); + } + } else { + CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.missing"); } - } else - { - CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.missing"); - } - break; - } - case GET: - { - if (displayHelp) - { - CommandBloodMagic.displayHelpString(commandSender, ValidCommands.GET.help); break; } + case GET: { + if (displayHelp) { + CommandBloodMagic.displayHelpString(commandSender, ValidCommands.GET.help); + break; + } - if (args.length > 1) - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect("message.orb.currenttier", network.getOrbTier()))); + if (args.length > 1) + commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect("message.orb.currenttier", network.getOrbTier()))); - break; + break; + } } - } - } catch (IllegalArgumentException e) - { + } catch (IllegalArgumentException e) { CommandBloodMagic.displayErrorString(commandSender, "commands.error.404"); } - } catch (PlayerNotFoundException e) - { + } catch (PlayerNotFoundException e) { CommandBloodMagic.displayErrorString(commandSender, "commands.error.404"); } } } - private enum ValidCommands - { + private enum ValidCommands { SET("commands.orb.set.help"), GET("commands.orb.get.help"); public String help; - ValidCommands(String help) - { + ValidCommands(String help) { this.help = help; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java index 2b87114b..0c70656d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java @@ -1,37 +1,32 @@ package WayofTime.bloodmagic.compat.guideapi; -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; import WayofTime.bloodmagic.api.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; -public class BookUtils -{ +import java.util.ArrayList; +import java.util.List; - public static PageAlchemyArray getAlchemyPage(String key) - { +public class BookUtils { + + public static PageAlchemyArray getAlchemyPage(String key) { ItemStack[] recipe = AlchemyArrayRecipeRegistry.getRecipeForArrayEffect(key); - if (recipe[0] != null) - { + if (recipe[0] != null) { ItemStack inputStack = recipe[0]; ItemStack catalystStack = recipe[1]; AlchemyCircleRenderer renderer = AlchemyArrayRecipeRegistry.getAlchemyCircleRenderer(inputStack, catalystStack); - if (renderer instanceof DualAlchemyCircleRenderer) - { + 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 - { + } else { return new PageAlchemyArray(renderer.arrayResource, inputStack, catalystStack); } } @@ -39,25 +34,20 @@ public class BookUtils return null; } - public static PageAlchemyArray getAlchemyPage(ItemStack outputStack) - { + public static PageAlchemyArray getAlchemyPage(ItemStack outputStack) { ItemStack[] recipe = AlchemyArrayRecipeRegistry.getRecipeForOutputStack(outputStack); - if (recipe[0] != null) - { + 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) - { + 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 - { + } else { return new PageAlchemyArray(renderer.arrayResource, inputStack, catalystStack, outputStack); } } @@ -66,8 +56,7 @@ public class BookUtils return null; } - public static PageIRecipe getPageForRecipe(IRecipe recipe) - { + 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 index a3ee7f1a..39319de7 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.compat.guideapi; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.compat.guideapi.book.*; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index 3e6f6549..a161cb2c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -22,10 +22,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -public class CategoryAlchemy -{ - public static Map buildCategory() - { +public class CategoryAlchemy { + public static Map buildCategory() { Map entries = new LinkedHashMap(); String keyBase = "guide." + BloodMagic.MODID + ".entry.alchemy."; @@ -36,8 +34,7 @@ public class CategoryAlchemy List ashPages = new ArrayList(); TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); - if (ashRecipe != null) - { + if (ashRecipe != null) { ashPages.add(new PageTartaricForgeRecipe(ashRecipe)); } ashPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "ash" + ".info"), 370)); @@ -46,8 +43,7 @@ public class CategoryAlchemy List speedPages = new ArrayList(); PageAlchemyArray speedRecipePage = BookUtils.getAlchemyPage("movement"); - if (speedRecipePage != null) - { + if (speedRecipePage != null) { speedPages.add(speedRecipePage); } speedPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "speed" + ".info"), 370)); @@ -56,8 +52,7 @@ public class CategoryAlchemy List updraftPages = new ArrayList(); PageAlchemyArray updraftRecipePage = BookUtils.getAlchemyPage("updraft"); - if (updraftRecipePage != null) - { + if (updraftRecipePage != null) { updraftPages.add(updraftRecipePage); } updraftPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "updraft" + ".info"), 370)); @@ -66,8 +61,7 @@ public class CategoryAlchemy List turretPages = new ArrayList(); PageAlchemyArray turretRecipePage = BookUtils.getAlchemyPage("skeletonTurret"); - if (turretRecipePage != null) - { + if (turretRecipePage != null) { turretPages.add(turretRecipePage); } turretPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "turret" + ".info"), 370)); @@ -76,8 +70,7 @@ public class CategoryAlchemy List bouncePages = new ArrayList(); PageAlchemyArray bounceRecipePage = BookUtils.getAlchemyPage("bounce"); - if (bounceRecipePage != null) - { + if (bounceRecipePage != null) { bouncePages.add(bounceRecipePage); } bouncePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bounce" + ".info"), 370)); @@ -91,19 +84,15 @@ public class CategoryAlchemy List fastMinerPages = new ArrayList(); PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage("fastMiner"); - if (fastMinerRecipePage != null) - { + 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)); - for (Entry entry : entries.entrySet()) - { - for (IPage page : entry.getValue().pageList) - { - if (page instanceof PageText) - { + for (Entry entry : entries.entrySet()) { + for (IPage page : entry.getValue().pageList) { + if (page instanceof PageText) { ((PageText) page).setUnicodeFlag(true); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index a3c6f9e8..25ce9177 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -1,16 +1,6 @@ package WayofTime.bloodmagic.compat.guideapi.book; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; import WayofTime.bloodmagic.api.registry.OrbRegistry; @@ -19,20 +9,28 @@ 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.item.ItemComponent; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.ItemComponent; 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; -public class CategoryArchitect -{ - public static Map buildCategory() - { +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."; @@ -44,16 +42,14 @@ public class CategoryArchitect List altarPages = new ArrayList(); IRecipe altarRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ALTAR)); - if (altarRecipe != null) - { + 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) - { + if (daggerRecipe != null) { altarPages.add(BookUtils.getPageForRecipe(daggerRecipe)); } @@ -63,8 +59,7 @@ public class CategoryArchitect List ashPages = new ArrayList(); TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); - if (ashRecipe != null) - { + if (ashRecipe != null) { ashPages.add(new PageTartaricForgeRecipe(ashRecipe)); } ashPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "ash" + ".info"), 370)); @@ -73,8 +68,7 @@ public class CategoryArchitect List divinationPages = new ArrayList(); PageAlchemyArray divinationRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION)); - if (divinationRecipePage != null) - { + if (divinationRecipePage != null) { divinationPages.add(divinationRecipePage); } @@ -90,8 +84,7 @@ public class CategoryArchitect weakorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakorb" + ".info.1"), 370)); AltarRecipe weakorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK)); - if (weakorbRecipe != null) - { + if (weakorbRecipe != null) { weakorbPages.add(new PageAltarRecipe(weakorbRecipe)); } @@ -101,16 +94,14 @@ public class CategoryArchitect List incensePages = new ArrayList(); IRecipe incenseRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.INCENSE_ALTAR)); - if (incenseRecipe != null) - { + 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) - { + if (woodPathRecipe != null) { incensePages.add(BookUtils.getPageForRecipe(woodPathRecipe)); } @@ -120,8 +111,7 @@ public class CategoryArchitect List runePages = new ArrayList(); IRecipe runeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 0)); - if (runeRecipe != null) - { + if (runeRecipe != null) { runePages.add(BookUtils.getPageForRecipe(runeRecipe)); } @@ -131,8 +121,7 @@ public class CategoryArchitect List inspectPages = new ArrayList(); AltarRecipe inspectRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK)); - if (inspectRecipe != null) - { + if (inspectRecipe != null) { inspectPages.add(new PageAltarRecipe(inspectRecipe)); } @@ -142,8 +131,7 @@ public class CategoryArchitect List speedRunePages = new ArrayList(); IRecipe speedRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1)); - if (speedRecipe != null) - { + if (speedRecipe != null) { speedRunePages.add(BookUtils.getPageForRecipe(speedRecipe)); } @@ -153,14 +141,12 @@ public class CategoryArchitect List waterPages = new ArrayList(); TartaricForgeRecipe waterRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_WATER)); - if (waterRecipe != null) - { + if (waterRecipe != null) { waterPages.add(new PageTartaricForgeRecipe(waterRecipe)); } PageAlchemyArray waterRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER)); - if (waterRecipePage != null) - { + if (waterRecipePage != null) { waterPages.add(waterRecipePage); } @@ -170,14 +156,12 @@ public class CategoryArchitect List lavaPages = new ArrayList(); TartaricForgeRecipe lavaRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_LAVA)); - if (lavaRecipe != null) - { + if (lavaRecipe != null) { lavaPages.add(new PageTartaricForgeRecipe(lavaRecipe)); } PageAlchemyArray lavaRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA)); - if (lavaRecipePage != null) - { + if (lavaRecipePage != null) { lavaPages.add(lavaRecipePage); } @@ -187,8 +171,7 @@ public class CategoryArchitect List lavaCrystalPages = new ArrayList(); IRecipe lavaCrystalRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL)); - if (lavaCrystalRecipe != null) - { + if (lavaCrystalRecipe != null) { lavaCrystalPages.add(BookUtils.getPageForRecipe(lavaCrystalRecipe)); } @@ -198,8 +181,7 @@ public class CategoryArchitect List apprenticeorbPages = new ArrayList(); AltarRecipe apprenticeorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE)); - if (apprenticeorbRecipe != null) - { + if (apprenticeorbRecipe != null) { apprenticeorbPages.add(new PageAltarRecipe(apprenticeorbRecipe)); } @@ -209,8 +191,7 @@ public class CategoryArchitect List daggerPages = new ArrayList(); AltarRecipe daggerOfSacrificeRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE)); - if (daggerOfSacrificeRecipe != null) - { + if (daggerOfSacrificeRecipe != null) { daggerPages.add(new PageAltarRecipe(daggerOfSacrificeRecipe)); } @@ -220,8 +201,7 @@ public class CategoryArchitect List runeSacrificePages = new ArrayList(); IRecipe runeSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3)); - if (runeSacrificeRecipe != null) - { + if (runeSacrificeRecipe != null) { runeSacrificePages.add(BookUtils.getPageForRecipe(runeSacrificeRecipe)); } @@ -231,8 +211,7 @@ public class CategoryArchitect List runeSelfSacrificePages = new ArrayList(); IRecipe runeSelfSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); - if (runeSelfSacrificeRecipe != null) - { + if (runeSelfSacrificeRecipe != null) { runeSelfSacrificePages.add(BookUtils.getPageForRecipe(runeSelfSacrificeRecipe)); } @@ -242,14 +221,12 @@ public class CategoryArchitect List holdingPages = new ArrayList(); TartaricForgeRecipe holdingRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING)); - if (holdingRecipe != null) - { + if (holdingRecipe != null) { holdingPages.add(new PageTartaricForgeRecipe(holdingRecipe)); } PageAlchemyArray holdingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING)); - if (holdingRecipePage != null) - { + if (holdingRecipePage != null) { holdingPages.add(holdingRecipePage); } @@ -259,14 +236,12 @@ public class CategoryArchitect List airPages = new ArrayList(); TartaricForgeRecipe airRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_AIR)); - if (airRecipe != null) - { + if (airRecipe != null) { airPages.add(new PageTartaricForgeRecipe(airRecipe)); } PageAlchemyArray airRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR)); - if (airRecipePage != null) - { + if (airRecipePage != null) { airPages.add(airRecipePage); } @@ -276,14 +251,12 @@ public class CategoryArchitect List voidPages = new ArrayList(); TartaricForgeRecipe voidRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_VOID)); - if (voidRecipe != null) - { + if (voidRecipe != null) { voidPages.add(new PageTartaricForgeRecipe(voidRecipe)); } PageAlchemyArray voidRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID)); - if (voidRecipePage != null) - { + if (voidRecipePage != null) { voidPages.add(voidRecipePage); } @@ -293,14 +266,12 @@ public class CategoryArchitect List greenGrovePages = new ArrayList(); TartaricForgeRecipe greenGroveRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH)); - if (greenGroveRecipe != null) - { + if (greenGroveRecipe != null) { greenGrovePages.add(new PageTartaricForgeRecipe(greenGroveRecipe)); } PageAlchemyArray greenGroveRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE)); - if (greenGroveRecipePage != null) - { + if (greenGroveRecipePage != null) { greenGrovePages.add(greenGroveRecipePage); } @@ -310,14 +281,12 @@ public class CategoryArchitect List fastMinerPages = new ArrayList(); TartaricForgeRecipe fastMinerRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER)); - if (fastMinerRecipe != null) - { + if (fastMinerRecipe != null) { fastMinerPages.add(new PageTartaricForgeRecipe(fastMinerRecipe)); } PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER)); - if (fastMinerRecipePage != null) - { + if (fastMinerRecipePage != null) { fastMinerPages.add(fastMinerRecipePage); } @@ -327,14 +296,12 @@ public class CategoryArchitect List seerPages = new ArrayList(); TartaricForgeRecipe seerRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT)); - if (seerRecipe != null) - { + if (seerRecipe != null) { seerPages.add(new PageTartaricForgeRecipe(seerRecipe)); } PageAlchemyArray seerRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER)); - if (seerRecipePage != null) - { + if (seerRecipePage != null) { seerPages.add(seerRecipePage); } @@ -344,8 +311,7 @@ public class CategoryArchitect List magicianOrbPages = new ArrayList(); AltarRecipe magicianOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN)); - if (magicianOrbRecipe != null) - { + if (magicianOrbRecipe != null) { magicianOrbPages.add(new PageAltarRecipe(magicianOrbRecipe)); } @@ -355,8 +321,7 @@ public class CategoryArchitect List capacityPages = new ArrayList(); IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); - if (capacityRecipe != null) - { + if (capacityRecipe != null) { capacityPages.add(BookUtils.getPageForRecipe(capacityRecipe)); } @@ -366,8 +331,7 @@ public class CategoryArchitect List displacementPages = new ArrayList(); IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); - if (displacementRecipe != null) - { + if (displacementRecipe != null) { displacementPages.add(BookUtils.getPageForRecipe(displacementRecipe)); } @@ -377,14 +341,12 @@ public class CategoryArchitect List affinityPages = new ArrayList(); TartaricForgeRecipe affinityRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY)); - if (affinityRecipe != null) - { + if (affinityRecipe != null) { affinityPages.add(new PageTartaricForgeRecipe(affinityRecipe)); } PageAlchemyArray affinityRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY)); - if (affinityRecipePage != null) - { + if (affinityRecipePage != null) { affinityPages.add(affinityRecipePage); } @@ -394,14 +356,12 @@ public class CategoryArchitect List lampPages = new ArrayList(); TartaricForgeRecipe lampRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT)); - if (lampRecipe != null) - { + if (lampRecipe != null) { lampPages.add(new PageTartaricForgeRecipe(lampRecipe)); } PageAlchemyArray lampRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT)); - if (lampRecipePage != null) - { + if (lampRecipePage != null) { lampPages.add(lampRecipePage); } @@ -411,14 +371,12 @@ public class CategoryArchitect List magnetismPages = new ArrayList(); TartaricForgeRecipe magnetismRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM)); - if (magnetismRecipe != null) - { + if (magnetismRecipe != null) { magnetismPages.add(new PageTartaricForgeRecipe(magnetismRecipe)); } PageAlchemyArray magnetismRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM)); - if (magnetismRecipePage != null) - { + if (magnetismRecipePage != null) { magnetismPages.add(magnetismRecipePage); } @@ -428,8 +386,7 @@ public class CategoryArchitect List peritiaPages = new ArrayList(); IRecipe peritiaRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.EXPERIENCE_TOME)); - if (peritiaRecipe != null) - { + if (peritiaRecipe != null) { peritiaPages.add(BookUtils.getPageForRecipe(peritiaRecipe)); } @@ -439,32 +396,27 @@ public class CategoryArchitect List livingArmourPages = new ArrayList(); TartaricForgeRecipe bindingRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_BINDING)); - if (bindingRecipe != null) - { + if (bindingRecipe != null) { livingArmourPages.add(new PageTartaricForgeRecipe(bindingRecipe)); } PageAlchemyArray bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST)); - if (bindingRecipePage != null) - { + if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); } bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET)); - if (bindingRecipePage != null) - { + if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); } bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS)); - if (bindingRecipePage != null) - { + if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); } bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS)); - if (bindingRecipePage != null) - { + if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); } @@ -484,14 +436,12 @@ public class CategoryArchitect List teleposerPages = new ArrayList(); AltarRecipe teleposerFocusRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)); - if (teleposerFocusRecipe != null) - { + if (teleposerFocusRecipe != null) { teleposerPages.add(new PageAltarRecipe(teleposerFocusRecipe)); } IRecipe teleposerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER)); - if (teleposerRecipe != null) - { + if (teleposerRecipe != null) { teleposerPages.add(BookUtils.getPageForRecipe(teleposerRecipe)); } @@ -501,8 +451,7 @@ public class CategoryArchitect List boundBladePages = new ArrayList(); PageAlchemyArray boundBladePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD)); - if (boundBladePage != null) - { + if (boundBladePage != null) { boundBladePages.add(boundBladePage); } @@ -512,20 +461,17 @@ public class CategoryArchitect List boundToolPages = new ArrayList(); PageAlchemyArray boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)); - if (boundToolPage != null) - { + if (boundToolPage != null) { boundToolPages.add(boundToolPage); } boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)); - if (boundToolPage != null) - { + if (boundToolPage != null) { boundToolPages.add(boundToolPage); } boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)); - if (boundToolPage != null) - { + if (boundToolPage != null) { boundToolPages.add(boundToolPage); } @@ -540,8 +486,7 @@ public class CategoryArchitect List masterOrbPages = new ArrayList(); AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER)); - if (magicianOrbRecipe != null) - { + if (magicianOrbRecipe != null) { masterOrbPages.add(new PageAltarRecipe(masterOrbRecipe)); } @@ -551,8 +496,7 @@ public class CategoryArchitect List orbRunePages = new ArrayList(); IRecipe orbRuneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 8)); - if (orbRuneRecipe != null) - { + if (orbRuneRecipe != null) { orbRunePages.add(BookUtils.getPageForRecipe(orbRuneRecipe)); } @@ -562,8 +506,7 @@ public class CategoryArchitect List augmentedCapacityPages = new ArrayList(); IRecipe augmentedCapacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 7)); - if (orbRuneRecipe != null) - { + if (orbRuneRecipe != null) { augmentedCapacityPages.add(BookUtils.getPageForRecipe(augmentedCapacityRecipe)); } @@ -573,8 +516,7 @@ public class CategoryArchitect List chargingPages = new ArrayList(); IRecipe chargingRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 10)); - if (orbRuneRecipe != null) - { + if (orbRuneRecipe != null) { chargingPages.add(BookUtils.getPageForRecipe(chargingRecipe)); } @@ -584,8 +526,7 @@ public class CategoryArchitect List accelerationPages = new ArrayList(); IRecipe accelerationRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 9)); - if (orbRuneRecipe != null) - { + if (orbRuneRecipe != null) { accelerationPages.add(BookUtils.getPageForRecipe(accelerationRecipe)); } @@ -595,14 +536,12 @@ public class CategoryArchitect List suppressionPages = new ArrayList(); TartaricForgeRecipe suppressionRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION)); - if (suppressionRecipe != null) - { + if (suppressionRecipe != null) { suppressionPages.add(new PageTartaricForgeRecipe(suppressionRecipe)); } PageAlchemyArray suppressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION)); - if (suppressionRecipePage != null) - { + if (suppressionRecipePage != null) { suppressionPages.add(suppressionRecipePage); } @@ -612,14 +551,12 @@ public class CategoryArchitect List hastePages = new ArrayList(); TartaricForgeRecipe hasteRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_HASTE)); - if (hasteRecipe != null) - { + if (hasteRecipe != null) { hastePages.add(new PageTartaricForgeRecipe(hasteRecipe)); } PageAlchemyArray hasteRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE)); - if (hasteRecipePage != null) - { + if (hasteRecipePage != null) { hastePages.add(hasteRecipePage); } @@ -629,14 +566,12 @@ public class CategoryArchitect List severancePages = new ArrayList(); TartaricForgeRecipe severanceRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE)); - if (severanceRecipe != null) - { + if (severanceRecipe != null) { severancePages.add(new PageTartaricForgeRecipe(severanceRecipe)); } PageAlchemyArray severanceRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE)); - if (severanceRecipePage != null) - { + if (severanceRecipePage != null) { severancePages.add(severanceRecipePage); } @@ -646,14 +581,12 @@ public class CategoryArchitect List telepositionPages = new ArrayList(); TartaricForgeRecipe telepositionRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION)); - if (telepositionRecipe != null) - { + if (telepositionRecipe != null) { telepositionPages.add(new PageTartaricForgeRecipe(telepositionRecipe)); } PageAlchemyArray telepositionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION)); - if (telepositionRecipePage != null) - { + if (telepositionRecipePage != null) { telepositionPages.add(telepositionRecipePage); } @@ -663,14 +596,12 @@ public class CategoryArchitect List compressionPages = new ArrayList(); TartaricForgeRecipe compressionRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION)); - if (compressionRecipe != null) - { + if (compressionRecipe != null) { compressionPages.add(new PageTartaricForgeRecipe(compressionRecipe)); } PageAlchemyArray compressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION)); - if (compressionRecipePage != null) - { + if (compressionRecipePage != null) { compressionPages.add(compressionRecipePage); } @@ -680,14 +611,12 @@ public class CategoryArchitect List bridgePages = new ArrayList(); TartaricForgeRecipe bridgeRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE)); - if (bridgeRecipe != null) - { + if (bridgeRecipe != null) { bridgePages.add(new PageTartaricForgeRecipe(bridgeRecipe)); } PageAlchemyArray bridgeRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE)); - if (bridgeRecipePage != null) - { + if (bridgeRecipePage != null) { bridgePages.add(bridgeRecipePage); } @@ -697,20 +626,16 @@ public class CategoryArchitect List mimicPages = new ArrayList(); IRecipe mimicRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 1, 1)); - if (mimicRecipe != null) - { + 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) - { + for (Entry entry : entries.entrySet()) { + for (IPage page : entry.getValue().pageList) { + if (page instanceof PageText) { ((PageText) page).setUnicodeFlag(true); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java index c64ca7fc..3c5c338d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java @@ -1,15 +1,6 @@ package WayofTime.bloodmagic.compat.guideapi.book; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; @@ -22,12 +13,19 @@ 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; -public class CategoryDemon -{ +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() - { + public static Map buildCategory() { Map entries = new LinkedHashMap(); String keyBase = "guide." + BloodMagic.MODID + ".entry.demon."; @@ -40,8 +38,7 @@ public class CategoryDemon snarePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "snare" + ".info.1"), 370)); IRecipe snareRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE)); - if (snareRecipe != null) - { + if (snareRecipe != null) { snarePages.add(BookUtils.getPageForRecipe(snareRecipe)); } @@ -52,8 +49,7 @@ public class CategoryDemon forgePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "forge" + ".info.1"), 370)); IRecipe forgeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE)); - if (forgeRecipe != null) - { + if (forgeRecipe != null) { forgePages.add(BookUtils.getPageForRecipe(forgeRecipe)); } @@ -63,8 +59,7 @@ public class CategoryDemon 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) - { + if (pettyRecipe != null) { pettyPages.add(new PageTartaricForgeRecipe(pettyRecipe)); } pettyPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "petty" + ".info.2"), 370)); @@ -73,8 +68,7 @@ public class CategoryDemon 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) - { + if (swordRecipe != null) { swordPages.add(new PageTartaricForgeRecipe(swordRecipe)); } swordPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "sword" + ".info.2"), 370)); @@ -83,8 +77,7 @@ public class CategoryDemon 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) - { + if (lesserRecipe != null) { lesserPages.add(new PageTartaricForgeRecipe(lesserRecipe)); } lesserPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lesser" + ".info.2"), 370)); @@ -101,29 +94,24 @@ public class CategoryDemon List routingPages = new ArrayList(); TartaricForgeRecipe nodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); - if (nodeRecipe != null) - { + if (nodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(nodeRecipe)); } TartaricForgeRecipe inputNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE)); - if (inputNodeRecipe != null) - { + if (inputNodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(inputNodeRecipe)); } TartaricForgeRecipe outputNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE)); - if (outputNodeRecipe != null) - { + if (outputNodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(outputNodeRecipe)); } TartaricForgeRecipe masterNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE)); - if (masterNodeRecipe != null) - { + if (masterNodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(masterNodeRecipe)); } TartaricForgeRecipe nodeRouterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER)); - if (nodeRouterRecipe != null) - { + if (nodeRouterRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(nodeRouterRecipe)); } @@ -143,8 +131,7 @@ public class CategoryDemon List cruciblePages = new ArrayList(); TartaricForgeRecipe crucibleRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRUCIBLE)); - if (crucibleRecipe != null) - { + if (crucibleRecipe != null) { cruciblePages.add(new PageTartaricForgeRecipe(crucibleRecipe)); } @@ -154,8 +141,7 @@ public class CategoryDemon List crystallizerPages = new ArrayList(); TartaricForgeRecipe crystallizerRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTALLIZER)); - if (crystallizerRecipe != null) - { + if (crystallizerRecipe != null) { crystallizerPages.add(new PageTartaricForgeRecipe(crystallizerRecipe)); } @@ -165,8 +151,7 @@ public class CategoryDemon List clusterPages = new ArrayList(); TartaricForgeRecipe clusterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL)); - if (clusterRecipe != null) - { + if (clusterRecipe != null) { clusterPages.add(new PageTartaricForgeRecipe(clusterRecipe)); } @@ -176,8 +161,7 @@ public class CategoryDemon List pylonPages = new ArrayList(); TartaricForgeRecipe pylonRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PYLON)); - if (pylonRecipe != null) - { + if (pylonRecipe != null) { pylonPages.add(new PageTartaricForgeRecipe(pylonRecipe)); } @@ -187,20 +171,16 @@ public class CategoryDemon List gaugePages = new ArrayList(); TartaricForgeRecipe gaugeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE)); - if (gaugeRecipe != null) - { + 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) - { + for (Entry entry : entries.entrySet()) { + for (IPage page : entry.getValue().pageList) { + if (page instanceof PageText) { ((PageText) page).setUnicodeFlag(true); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index 62b1cf94..a294a615 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -1,15 +1,6 @@ package WayofTime.bloodmagic.compat.guideapi.book; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.compat.guideapi.BookUtils; @@ -23,13 +14,20 @@ 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; -public class CategoryRitual -{ +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() - { + public static Map buildCategory() { Map entries = new LinkedHashMap(); addRitualPagesToEntries("intro", entries); @@ -38,19 +36,16 @@ public class CategoryRitual List ritualStonePages = new ArrayList(); IRecipe ritualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE)); - if (ritualStoneRecipe != null) - { + 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++) - { + for (int i = 1; i < 5; i++) { EnumRuneType type = EnumRuneType.values()[i]; AltarRecipe scribeRecipe = RecipeHelper.getAltarRecipeForOutput(type.getScribeStack()); - if (scribeRecipe != null) - { + if (scribeRecipe != null) { ritualStonePages.add(new PageAltarRecipe(scribeRecipe)); } } @@ -61,8 +56,7 @@ public class CategoryRitual List masterRitualStonePages = new ArrayList(); IRecipe masterRitualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 0)); - if (masterRitualStoneRecipe != null) - { + if (masterRitualStoneRecipe != null) { masterRitualStonePages.add(BookUtils.getPageForRecipe(masterRitualStoneRecipe)); } @@ -74,8 +68,7 @@ public class CategoryRitual activationCrystalPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "activationCrystal" + ".info.1"), 370)); AltarRecipe crystalRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL)); - if (crystalRecipe != null) - { + if (crystalRecipe != null) { activationCrystalPages.add(new PageAltarRecipe(crystalRecipe)); } @@ -87,8 +80,7 @@ public class CategoryRitual divinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "diviner" + ".info.1"), 370)); IRecipe divinerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER)); - if (divinerRecipe != null) - { + if (divinerRecipe != null) { divinerPages.add(BookUtils.getPageForRecipe(divinerRecipe)); } @@ -116,12 +108,9 @@ public class CategoryRitual addRitualPagesToEntries("meteor", entries); addRitualPagesToEntries("downgrade", entries); - for (Entry entry : entries.entrySet()) - { - for (IPage page : entry.getValue().pageList) - { - if (page instanceof PageText) - { + for (Entry entry : entries.entrySet()) { + for (IPage page : entry.getValue().pageList) { + if (page instanceof PageText) { ((PageText) page).setUnicodeFlag(true); } } @@ -130,8 +119,7 @@ public class CategoryRitual return entries; } - public static void addRitualPagesToEntries(String name, Map 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 index 52aaa64d..765791a1 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java @@ -4,14 +4,11 @@ import WayofTime.bloodmagic.api.Constants; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import net.minecraft.util.ResourceLocation; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -public class CategorySpell -{ - public static Map buildCategory() - { +public class CategorySpell { + public static Map buildCategory() { Map entries = new LinkedHashMap(); String keyBase = Constants.Mod.DOMAIN + "spell_"; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java index f14b372f..577e4f85 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java @@ -8,7 +8,6 @@ import amerifrance.guideapi.entry.EntryResourceLocation; 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.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -16,23 +15,19 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.Collections; import java.util.List; -public class EntryText extends EntryResourceLocation -{ +public class EntryText extends EntryResourceLocation { - public EntryText(List pageList, String unlocEntryName, boolean unicode) - { + 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) - { + 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) - { + public void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { Minecraft.getMinecraft().getTextureManager().bindTexture(image); GuiHelper.drawSizedIconWithoutColor(entryX + 4, entryY + 2, 8, 8, 1F); @@ -46,8 +41,7 @@ public class EntryText extends EntryResourceLocation if (strWidth > guiBase.xSize - 80 && strWidth > fontRendererObj.getStringWidth("...")) cutString = true; - if (GuiHelper.isMouseBetween(mouseX, mouseY, entryX, entryY, entryWidth, entryHeight) && cutString) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, entryX, entryY, entryWidth, entryHeight) && cutString) { guiBase.drawHoveringText(Collections.singletonList(getLocalizedName()), entryX, entryY + 12); fontRendererObj.setUnicodeFlag(unicode); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java index 3c5479de..8529425f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java @@ -1,17 +1,5 @@ package WayofTime.bloodmagic.compat.guideapi.page; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -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 WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.Page; @@ -19,15 +7,24 @@ 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; -public class PageAlchemyArray extends Page -{ +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 List arrayResources = new ArrayList(); 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; @@ -36,25 +33,21 @@ public class PageAlchemyArray extends Page this.outputStack = outputStack; } - public PageAlchemyArray(List resources, ItemStack inputStack, ItemStack catalystStack) - { + public PageAlchemyArray(List resources, ItemStack inputStack, ItemStack catalystStack) { this(resources, inputStack, catalystStack, ItemStack.EMPTY); } - public PageAlchemyArray(ResourceLocation resource, ItemStack inputStack, ItemStack catalystStack, ItemStack outputStack) - { + 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) - { + 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) - { + 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; @@ -63,8 +56,7 @@ public class PageAlchemyArray extends Page guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.alchemyArray"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); - for (ResourceLocation arrayResource : arrayResources) - { + for (ResourceLocation arrayResource : arrayResources) { Minecraft.getMinecraft().getTextureManager().bindTexture(arrayResource); GlStateManager.pushMatrix(); GlStateManager.translate(x + 2, y + 28, 0); @@ -81,24 +73,20 @@ public class PageAlchemyArray extends Page int catalystY = y + 3; GuiHelper.drawItemStack(catalystStack, catalystX, catalystY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, inputX, inputY, 15, 15)) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, inputX, inputY, 15, 15)) { guiBase.renderToolTip(inputStack, mouseX, mouseY); } - if (GuiHelper.isMouseBetween(mouseX, mouseY, catalystX, catalystY, 15, 15)) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, catalystX, catalystY, 15, 15)) { guiBase.renderToolTip(catalystStack, mouseX, mouseY); } - if (!outputStack.isEmpty()) - { + 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)) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) { guiBase.renderToolTip(outputStack, mouseX, mouseY); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java index a8402b0a..6117a981 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java @@ -20,16 +20,14 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; -public class PageAltarRecipe extends Page -{ +public class PageAltarRecipe extends Page { public List input; public ItemStack output; public int tier; public int bloodRequired; - public PageAltarRecipe(AltarRecipeRegistry.AltarRecipe recipe) - { + public PageAltarRecipe(AltarRecipeRegistry.AltarRecipe recipe) { this.input = ItemStackWrapper.toStackList(recipe.getInput()); this.output = recipe.getOutput(); this.tier = recipe.getMinTier().toInt(); @@ -38,8 +36,7 @@ public class PageAltarRecipe extends Page @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) - { + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRenderer) { Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/altar.png")); guiBase.drawTexturedModalRect(guiLeft + 42, guiTop + 53, 0, 0, 146, 104); @@ -48,25 +45,21 @@ public class PageAltarRecipe extends Page 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)) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, inputX, inputY, 15, 15)) { guiBase.renderToolTip(input.get(0), mouseX, mouseY); } - if (output.isEmpty()) - { + 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)) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) { guiBase.renderToolTip(output, outputX, outputY); } - if (output.getItem() == Item.getItemFromBlock(Blocks.BARRIER)) - { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java index 51021663..7f52af4a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java @@ -1,17 +1,5 @@ package WayofTime.bloodmagic.compat.guideapi.page; -import java.util.List; -import java.util.Random; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.init.Blocks; -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 WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -21,9 +9,20 @@ 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.init.Blocks; +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; -public class PageTartaricForgeRecipe extends Page -{ +import java.util.List; +import java.util.Random; + +public class PageTartaricForgeRecipe extends Page { public List input; public ItemStack output; public int tier; @@ -33,8 +32,7 @@ public class PageTartaricForgeRecipe extends Page private int cycleIdx = 0; private Random rand = new Random(); - public PageTartaricForgeRecipe(TartaricForgeRecipe recipe) - { + public PageTartaricForgeRecipe(TartaricForgeRecipe recipe) { this.input = recipe.getInput(); this.output = recipe.getRecipeOutput(); this.tier = 0; @@ -45,8 +43,7 @@ public class PageTartaricForgeRecipe extends Page @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) - { + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRenderer) { Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/soulForge.png")); guiBase.drawTexturedModalRect(guiLeft + 42, guiTop + 53, 0, 0, 146, 104); @@ -55,49 +52,38 @@ public class PageTartaricForgeRecipe extends Page // 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++) - { + 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) - { + 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)) - { + 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) - { + } else if (component instanceof Integer) { List list = OrbRegistry.getOrbsDownToTier((Integer) component); - if (!list.isEmpty()) - { + 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)) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) { // tooltips = GuiHelper.getTooltip(stack); guiBase.renderToolTip(stack, mouseX, mouseY); } } - } else - { + } else { List list = (List) component; - if (!list.isEmpty()) - { + 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)) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) { // tooltips = GuiHelper.getTooltip(stack); guiBase.renderToolTip(stack, mouseX, mouseY); } @@ -113,20 +99,17 @@ public class PageTartaricForgeRecipe extends Page // guiBase.renderToolTip(input.get(0), mouseX, mouseY); // } - if (output == null) - { + 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)) - { + if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) { guiBase.renderToolTip(output, outputX, outputY); } - if (output.getItem() == Item.getItemFromBlock(Blocks.BARRIER)) - { + 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); @@ -135,8 +118,7 @@ public class PageTartaricForgeRecipe extends Page 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) - { + 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/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index 1a1de334..11c3f80a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -1,12 +1,5 @@ package WayofTime.bloodmagic.compat.jei; -import java.util.Map; - -import javax.annotation.Nonnull; - -import mezz.jei.api.*; -import mezz.jei.api.recipe.IRecipeCategoryRegistration; -import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; @@ -31,15 +24,19 @@ import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeHandler; import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeMaker; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import mezz.jei.api.*; +import mezz.jei.api.recipe.IRecipeCategoryRegistration; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nonnull; +import java.util.Map; @JEIPlugin -public class BloodMagicPlugin extends BlankModPlugin -{ +public class BloodMagicPlugin extends BlankModPlugin { public static IJeiHelpers jeiHelper; @Override - public void register(@Nonnull IModRegistry registry) - { + public void register(@Nonnull IModRegistry registry) { jeiHelper = registry.getJeiHelpers(); registry.addRecipeHandlers( @@ -61,12 +58,10 @@ public class BloodMagicPlugin extends BlankModPlugin 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()) - { + for (Map.Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { String key = entry.getKey(); int maxLevel = entry.getValue(); - for (int i = 0; i < maxLevel - 1; i++) - { + for (int i = 0; i < maxLevel - 1; i++) { ItemStack stack = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); LivingUpgrades.setKey(stack, key); LivingUpgrades.setLevel(stack, i); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java index dbafede6..5b9b8e22 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.ingredients.IIngredients; @@ -12,12 +12,11 @@ import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class AlchemyArrayCraftingCategory implements IRecipeCategory -{ +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; @@ -29,47 +28,40 @@ public class AlchemyArrayCraftingCategory implements IRecipeCategory @Nonnull @Override - public String getUid() - { + public String getUid() { return Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY; } @Nonnull @Override - public String getTitle() - { + public String getTitle() { return localizedName; } @Nonnull @Override - public IDrawable getBackground() - { + public IDrawable getBackground() { return background; } @Override - public void drawExtras(Minecraft minecraft) - { + public void drawExtras(Minecraft minecraft) { } @Nullable @Override - public IDrawable getIcon() - { + public IDrawable getIcon() { return null; } @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) - { + 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) - { + 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(ingredients.getInputs(ItemStack.class).size() - 1)); recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java index 61eb4548..4a0168a5 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java @@ -1,36 +1,31 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; +import WayofTime.bloodmagic.api.Constants; +import mezz.jei.api.recipe.IRecipeHandler; +import mezz.jei.api.recipe.IRecipeWrapper; + import javax.annotation.Nonnull; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; -import WayofTime.bloodmagic.api.Constants; - -public class AlchemyArrayCraftingRecipeHandler implements IRecipeHandler -{ +public class AlchemyArrayCraftingRecipeHandler implements IRecipeHandler { @Nonnull @Override - public Class getRecipeClass() - { + public Class getRecipeClass() { return AlchemyArrayCraftingRecipeJEI.class; } @Override - public String getRecipeCategoryUid(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) - { + public String getRecipeCategoryUid(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) { return Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY; } @Nonnull @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) - { + public IRecipeWrapper getRecipeWrapper(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) { return recipe; } @Override - public boolean isRecipeValid(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) - { + public boolean isRecipeValid(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) { return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java index 1dbb5f98..9cd323b9 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java @@ -1,17 +1,15 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import com.google.common.collect.Lists; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; -public class AlchemyArrayCraftingRecipeJEI extends BlankRecipeWrapper -{ +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +public class AlchemyArrayCraftingRecipeJEI extends BlankRecipeWrapper { @Nonnull private final List inputs; @Nullable @@ -19,15 +17,13 @@ public class AlchemyArrayCraftingRecipeJEI extends BlankRecipeWrapper @Nonnull private final ItemStack output; - public AlchemyArrayCraftingRecipeJEI(@Nonnull List input, @Nullable ItemStack catalyst, @Nonnull ItemStack output) - { + public AlchemyArrayCraftingRecipeJEI(@Nonnull List input, @Nullable ItemStack catalyst, @Nonnull ItemStack output) { this.inputs = input; this.catalyst = catalyst; this.output = output; } - public ItemStack getCatalyst() - { + public ItemStack getCatalyst() { return catalyst; } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java index 80490fc7..23fc84db 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java @@ -1,38 +1,31 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.ItemStackWrapper; import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; - import com.google.common.collect.BiMap; +import net.minecraft.item.ItemStack; -public class AlchemyArrayCraftingRecipeMaker -{ +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class AlchemyArrayCraftingRecipeMaker { @Nonnull - public static List getRecipes() - { + public static List getRecipes() { Map, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> alchemyArrayRecipeMap = AlchemyArrayRecipeRegistry.getRecipes(); ArrayList recipes = new ArrayList(); - for (Map.Entry, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> itemStackAlchemyArrayRecipeEntry : alchemyArrayRecipeMap.entrySet()) - { + for (Map.Entry, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> itemStackAlchemyArrayRecipeEntry : alchemyArrayRecipeMap.entrySet()) { List input = itemStackAlchemyArrayRecipeEntry.getValue().getInput(); BiMap catalystMap = itemStackAlchemyArrayRecipeEntry.getValue().catalystMap; - for (Map.Entry entry : catalystMap.entrySet()) - { + for (Map.Entry entry : catalystMap.entrySet()) { ItemStack catalyst = entry.getKey().toStack(); - if (AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(input, catalyst) instanceof AlchemyArrayEffectCrafting) - { + if (AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(input, catalyst) instanceof AlchemyArrayEffectCrafting) { ItemStack output = ((AlchemyArrayEffectCrafting) itemStackAlchemyArrayRecipeEntry.getValue().getAlchemyArrayEffectForCatalyst(catalyst)).outputStack; AlchemyArrayCraftingRecipeJEI recipe = new AlchemyArrayCraftingRecipeJEI(input, catalyst, 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 index de1ceca0..4ade8678 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -1,9 +1,10 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import javax.annotation.Nonnull; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.registry.OrbRegistry; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IGuiItemStackGroup; @@ -12,12 +13,10 @@ import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeCategory; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class AlchemyTableRecipeCategory extends BlankRecipeCategory -{ +import javax.annotation.Nonnull; + +public class AlchemyTableRecipeCategory extends BlankRecipeCategory { private static final int OUTPUT_SLOT = 0; private static final int ORB_SLOT = 1; private static final int INPUT_SLOT = 2; @@ -29,44 +28,37 @@ public class AlchemyTableRecipeCategory extends BlankRecipeCategory -{ +public class AlchemyTableRecipeHandler implements IRecipeHandler { @Nonnull @Override - public Class getRecipeClass() - { + public Class getRecipeClass() { return AlchemyTableRecipeJEI.class; } @Override - public String getRecipeCategoryUid(@Nonnull AlchemyTableRecipeJEI recipe) - { + public String getRecipeCategoryUid(@Nonnull AlchemyTableRecipeJEI recipe) { return Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE; } @Nonnull @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull AlchemyTableRecipeJEI recipe) - { + public IRecipeWrapper getRecipeWrapper(@Nonnull AlchemyTableRecipeJEI recipe) { return recipe; } @Override - public boolean isRecipeValid(@Nonnull AlchemyTableRecipeJEI recipe) - { + public boolean isRecipeValid(@Nonnull AlchemyTableRecipeJEI recipe) { return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java index 18709a97..0079d60a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java @@ -1,22 +1,20 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.Lists; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class AlchemyTableRecipeJEI extends BlankRecipeWrapper -{ +import java.util.ArrayList; +import java.util.List; + +public class AlchemyTableRecipeJEI extends BlankRecipeWrapper { private AlchemyTableRecipe recipe; - public AlchemyTableRecipeJEI(AlchemyTableRecipe recipe) - { + public AlchemyTableRecipeJEI(AlchemyTableRecipe recipe) { this.recipe = recipe; } @@ -28,11 +26,9 @@ public class AlchemyTableRecipeJEI extends BlankRecipeWrapper } @Override - public List getTooltipStrings(int mouseX, int mouseY) - { + public List getTooltipStrings(int mouseX, int mouseY) { ArrayList ret = new ArrayList(); - if (mouseX >= 58 && mouseX <= 78 && mouseY >= 21 && mouseY <= 34) - { + if (mouseX >= 58 && mouseX <= 78 && mouseY >= 21 && mouseY <= 34) { ret.add(TextHelper.localize("tooltip.bloodmagic.tier", recipe.getTierRequired())); ret.add(TextHelper.localize("jei.bloodmagic.recipe.lpDrained", recipe.getLpDrained())); ret.add(TextHelper.localize("jei.bloodmagic.recipe.ticksRequired", recipe.getTicksRequired())); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java index 8dae28f8..e526d182 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java @@ -1,18 +1,15 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; -public class AlchemyTableRecipeMaker -{ +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; + +public class AlchemyTableRecipeMaker { @Nonnull - public static List getRecipes() - { + public static List getRecipes() { List recipeList = AlchemyTableRecipeRegistry.getRecipeList(); ArrayList recipes = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java index e69d8427..482b98ab 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java @@ -1,11 +1,9 @@ package WayofTime.bloodmagic.compat.jei.altar; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.ingredients.IIngredients; @@ -14,12 +12,11 @@ import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class AltarRecipeCategory implements IRecipeCategory -{ +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; @@ -30,28 +27,24 @@ public class AltarRecipeCategory implements IRecipeCategory @Nonnull @Override - public String getUid() - { + public String getUid() { return Constants.Compat.JEI_CATEGORY_ALTAR; } @Nonnull @Override - public String getTitle() - { + public String getTitle() { return localizedName; } @Nonnull @Override - public IDrawable getBackground() - { + public IDrawable getBackground() { return background; } @Override - public void drawExtras(Minecraft minecraft) - { + public void drawExtras(Minecraft minecraft) { } @@ -62,13 +55,11 @@ public class AltarRecipeCategory implements IRecipeCategory } @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) - { + public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { recipeLayout.getItemStacks().init(INPUT_SLOT, true, 31, 0); recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 125, 30); - if (recipeWrapper instanceof AltarRecipeJEI) - { + if (recipeWrapper instanceof AltarRecipeJEI) { recipeLayout.getItemStacks().set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java index bb421437..efd8c457 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java @@ -1,36 +1,31 @@ package WayofTime.bloodmagic.compat.jei.altar; +import WayofTime.bloodmagic.api.Constants; +import mezz.jei.api.recipe.IRecipeHandler; +import mezz.jei.api.recipe.IRecipeWrapper; + import javax.annotation.Nonnull; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; -import WayofTime.bloodmagic.api.Constants; - -public class AltarRecipeHandler implements IRecipeHandler -{ +public class AltarRecipeHandler implements IRecipeHandler { @Nonnull @Override - public Class getRecipeClass() - { + public Class getRecipeClass() { return AltarRecipeJEI.class; } @Override - public String getRecipeCategoryUid(@Nonnull AltarRecipeJEI recipe) - { + public String getRecipeCategoryUid(@Nonnull AltarRecipeJEI recipe) { return Constants.Compat.JEI_CATEGORY_ALTAR; } @Nonnull @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull AltarRecipeJEI recipe) - { + public IRecipeWrapper getRecipeWrapper(@Nonnull AltarRecipeJEI recipe) { return recipe; } @Override - public boolean isRecipeValid(@Nonnull AltarRecipeJEI recipe) - { + public boolean isRecipeValid(@Nonnull AltarRecipeJEI recipe) { return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java index dbf9808d..d7de9b3d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java @@ -1,20 +1,18 @@ package WayofTime.bloodmagic.compat.jei.altar; -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - import WayofTime.bloodmagic.util.helper.NumeralHelper; +import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class AltarRecipeJEI extends BlankRecipeWrapper -{ +import javax.annotation.Nonnull; +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +public class AltarRecipeJEI extends BlankRecipeWrapper { @Nonnull private final List input; @Nonnull @@ -24,12 +22,11 @@ public class AltarRecipeJEI extends BlankRecipeWrapper private final int consumptionRate; private final int drainRate; - public AltarRecipeJEI(@Nonnull List input, @Nonnull ItemStack output, int tier, int requiredLP, int consumptionRate, int drainRate) - { + public AltarRecipeJEI(@Nonnull List input, @Nonnull ItemStack output, int tier, int requiredLP, int consumptionRate, int drainRate) { this.input = input; this.output = output; - this.infoString = new String[] { TextHelper.localize("jei.bloodmagic.recipe.requiredTier", NumeralHelper.toRoman(tier)), TextHelper.localize("jei.bloodmagic.recipe.requiredLP", requiredLP) }; + this.infoString = new String[]{TextHelper.localize("jei.bloodmagic.recipe.requiredTier", NumeralHelper.toRoman(tier)), TextHelper.localize("jei.bloodmagic.recipe.requiredLP", requiredLP)}; this.consumptionRate = consumptionRate; this.drainRate = drainRate; } @@ -41,11 +38,9 @@ public class AltarRecipeJEI extends BlankRecipeWrapper } @Override - public List getTooltipStrings(int mouseX, int mouseY) - { + public List getTooltipStrings(int mouseX, int mouseY) { ArrayList ret = new ArrayList(); - if (mouseX >= 13 && mouseX <= 64 && mouseY >= 27 && mouseY <= 58) - { + if (mouseX >= 13 && mouseX <= 64 && mouseY >= 27 && mouseY <= 58) { ret.add(TextHelper.localize("jei.bloodmagic.recipe.consumptionRate", consumptionRate)); ret.add(TextHelper.localize("jei.bloodmagic.recipe.drainRate", drainRate)); } @@ -53,8 +48,7 @@ public class AltarRecipeJEI extends BlankRecipeWrapper } @Override - public void drawInfo(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) - { + 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/altar/AltarRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java index 0d9b3b92..760852b2 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java @@ -1,35 +1,30 @@ package WayofTime.bloodmagic.compat.jei.altar; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.api.orb.IBloodOrb; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.block.BlockLifeEssence; +import net.minecraft.item.ItemStack; import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; -public class AltarRecipeMaker -{ +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class AltarRecipeMaker { @Nonnull - public static List getRecipes() - { + public static List getRecipes() { Map, AltarRecipeRegistry.AltarRecipe> altarMap = AltarRecipeRegistry.getRecipes(); ArrayList recipes = new ArrayList(); - for (Map.Entry, AltarRecipeRegistry.AltarRecipe> itemStackAltarRecipeEntry : altarMap.entrySet()) - { + for (Map.Entry, AltarRecipeRegistry.AltarRecipe> itemStackAltarRecipeEntry : altarMap.entrySet()) { // Make sure input is not a Blood Orb. If it is, the recipe is for a filling orb, and we don't want that. - if (!(itemStackAltarRecipeEntry.getKey().get(0).toStack().getItem() instanceof IBloodOrb)) - { + if (!(itemStackAltarRecipeEntry.getKey().get(0).toStack().getItem() instanceof IBloodOrb)) { List input = ItemStackWrapper.toStackList(itemStackAltarRecipeEntry.getValue().getInput()); ItemStack output = itemStackAltarRecipeEntry.getValue().getOutput(); int requiredTier = itemStackAltarRecipeEntry.getValue().getMinTier().toInt(); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java index c914208a..f8a93172 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IGuiItemStackGroup; @@ -14,12 +14,11 @@ import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class ArmourDowngradeRecipeCategory implements IRecipeCategory -{ +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; @@ -31,35 +30,30 @@ public class ArmourDowngradeRecipeCategory implements IRecipeCategory @Nonnull private final ICraftingGridHelper craftingGridHelper; - public ArmourDowngradeRecipeCategory() - { + public ArmourDowngradeRecipeCategory() { craftingGridHelper = BloodMagicPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); } @Nonnull @Override - public String getUid() - { + public String getUid() { return Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE; } @Nonnull @Override - public String getTitle() - { + public String getTitle() { return localizedName; } @Nonnull @Override - public IDrawable getBackground() - { + public IDrawable getBackground() { return background; } @Override - public void drawExtras(Minecraft minecraft) - { + public void drawExtras(Minecraft minecraft) { } @@ -71,24 +65,20 @@ public class ArmourDowngradeRecipeCategory implements IRecipeCategory @Override @SuppressWarnings("unchecked") - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper, IIngredients ingredients) - { + 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) - { + 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) - { + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java index b532e9ea..233f7ee5 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java @@ -1,37 +1,32 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; +import WayofTime.bloodmagic.api.Constants; +import mezz.jei.api.recipe.IRecipeHandler; +import mezz.jei.api.recipe.IRecipeWrapper; + import javax.annotation.Nonnull; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; -import WayofTime.bloodmagic.api.Constants; - -public class ArmourDowngradeRecipeHandler implements IRecipeHandler -{ +public class ArmourDowngradeRecipeHandler implements IRecipeHandler { @Nonnull @Override - public Class getRecipeClass() - { + public Class getRecipeClass() { return ArmourDowngradeRecipeJEI.class; } @Nonnull @Override - public String getRecipeCategoryUid(ArmourDowngradeRecipeJEI recipe) - { + public String getRecipeCategoryUid(ArmourDowngradeRecipeJEI recipe) { return Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE; } @Nonnull @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull ArmourDowngradeRecipeJEI recipe) - { + public IRecipeWrapper getRecipeWrapper(@Nonnull ArmourDowngradeRecipeJEI recipe) { return recipe; } @Override - public boolean isRecipeValid(@Nonnull ArmourDowngradeRecipeJEI recipe) - { + 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 index e3d5835f..d8155ace 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java @@ -1,22 +1,20 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; +import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; +import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +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 WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import java.util.List; -public class ArmourDowngradeRecipeJEI extends BlankRecipeWrapper -{ +public class ArmourDowngradeRecipeJEI extends BlankRecipeWrapper { private LivingArmourDowngradeRecipe recipe; - public ArmourDowngradeRecipeJEI(LivingArmourDowngradeRecipe recipe) - { + public ArmourDowngradeRecipeJEI(LivingArmourDowngradeRecipe recipe) { this.recipe = 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 index 5f28f6c3..4aeafbef 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java @@ -1,18 +1,15 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.api.registry.LivingArmourDowngradeRecipeRegistry; -public class ArmourDowngradeRecipeMaker -{ +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; + +public class ArmourDowngradeRecipeMaker { @Nonnull - public static List getRecipes() - { + public static List getRecipes() { List recipeList = LivingArmourDowngradeRecipeRegistry.getRecipeList(); ArrayList recipes = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java index efb7019a..c511fa04 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compat.jei.binding; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.ingredients.IIngredients; @@ -12,12 +12,11 @@ import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class BindingRecipeCategory implements IRecipeCategory -{ +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; @@ -29,28 +28,24 @@ public class BindingRecipeCategory implements IRecipeCategory @Nonnull @Override - public String getUid() - { + public String getUid() { return Constants.Compat.JEI_CATEGORY_BINDING; } @Nonnull @Override - public String getTitle() - { + public String getTitle() { return localizedName; } @Nonnull @Override - public IDrawable getBackground() - { + public IDrawable getBackground() { return background; } @Override - public void drawExtras(Minecraft minecraft) - { + public void drawExtras(Minecraft minecraft) { } @@ -66,8 +61,7 @@ public class BindingRecipeCategory implements IRecipeCategory recipeLayout.getItemStacks().init(CATALYST_SLOT, true, 29, 3); recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 73, 5); - if (recipeWrapper instanceof BindingRecipeJEI) - { + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java index c8703a1e..ce2fad06 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java @@ -1,36 +1,31 @@ package WayofTime.bloodmagic.compat.jei.binding; +import WayofTime.bloodmagic.api.Constants; +import mezz.jei.api.recipe.IRecipeHandler; +import mezz.jei.api.recipe.IRecipeWrapper; + import javax.annotation.Nonnull; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; -import WayofTime.bloodmagic.api.Constants; - -public class BindingRecipeHandler implements IRecipeHandler -{ +public class BindingRecipeHandler implements IRecipeHandler { @Nonnull @Override - public Class getRecipeClass() - { + public Class getRecipeClass() { return BindingRecipeJEI.class; } @Override - public String getRecipeCategoryUid(@Nonnull BindingRecipeJEI recipe) - { + public String getRecipeCategoryUid(@Nonnull BindingRecipeJEI recipe) { return Constants.Compat.JEI_CATEGORY_BINDING; } @Nonnull @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull BindingRecipeJEI recipe) - { + public IRecipeWrapper getRecipeWrapper(@Nonnull BindingRecipeJEI recipe) { return recipe; } @Override - public boolean isRecipeValid(@Nonnull BindingRecipeJEI recipe) - { + 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 index b73dce1b..8a4adb82 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeJEI.java @@ -1,16 +1,14 @@ package WayofTime.bloodmagic.compat.jei.binding; -import java.util.List; - -import javax.annotation.Nonnull; - import com.google.common.collect.Lists; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; -public class BindingRecipeJEI extends BlankRecipeWrapper -{ +import javax.annotation.Nonnull; +import java.util.List; + +public class BindingRecipeJEI extends BlankRecipeWrapper { @Nonnull private final List inputs; @@ -21,8 +19,7 @@ public class BindingRecipeJEI extends BlankRecipeWrapper private final ItemStack output; @SuppressWarnings("unchecked") - public BindingRecipeJEI(@Nonnull List input, @Nonnull ItemStack catalyst, @Nonnull ItemStack output) - { + public BindingRecipeJEI(@Nonnull List input, @Nonnull ItemStack catalyst, @Nonnull ItemStack output) { this.inputs = input; this.catalyst = catalyst; this.output = 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 index b3aa8747..561f6b21 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java @@ -1,38 +1,31 @@ package WayofTime.bloodmagic.compat.jei.binding; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; import WayofTime.bloodmagic.api.ItemStackWrapper; import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; - import com.google.common.collect.BiMap; +import net.minecraft.item.ItemStack; -public class BindingRecipeMaker -{ +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class BindingRecipeMaker { @Nonnull - public static List getRecipes() - { + public static List getRecipes() { Map, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> alchemyArrayRecipeMap = AlchemyArrayRecipeRegistry.getRecipes(); ArrayList recipes = new ArrayList(); - for (Map.Entry, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> itemStackAlchemyArrayRecipeEntry : alchemyArrayRecipeMap.entrySet()) - { + for (Map.Entry, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> itemStackAlchemyArrayRecipeEntry : alchemyArrayRecipeMap.entrySet()) { List input = itemStackAlchemyArrayRecipeEntry.getValue().getInput(); BiMap catalystMap = itemStackAlchemyArrayRecipeEntry.getValue().catalystMap; - for (Map.Entry entry : catalystMap.entrySet()) - { + for (Map.Entry entry : catalystMap.entrySet()) { ItemStack catalyst = entry.getKey().toStack(); - if (AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(input, catalyst) instanceof AlchemyArrayEffectBinding) - { + if (AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(input, catalyst) instanceof AlchemyArrayEffectBinding) { ItemStack output = ((AlchemyArrayEffectBinding) itemStackAlchemyArrayRecipeEntry.getValue().getAlchemyArrayEffectForCatalyst(catalyst)).outputStack; BindingRecipeJEI recipe = new BindingRecipeJEI(input, catalyst, output); 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 df8f2d17..ceee68d8 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java @@ -1,11 +1,9 @@ package WayofTime.bloodmagic.compat.jei.forge; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IGuiItemStackGroup; @@ -16,12 +14,12 @@ import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class TartaricForgeRecipeCategory implements IRecipeCategory -{ +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; @@ -33,57 +31,48 @@ public class TartaricForgeRecipeCategory implements IRecipeCategory @Nonnull private final ICraftingGridHelper craftingGridHelper; - public TartaricForgeRecipeCategory() - { + public TartaricForgeRecipeCategory() { craftingGridHelper = BloodMagicPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); } @Nonnull @Override - public String getUid() - { + public String getUid() { return Constants.Compat.JEI_CATEGORY_SOULFORGE; } @Nonnull @Override - public String getTitle() - { + public String getTitle() { return localizedName; } @Nonnull @Override - public IDrawable getBackground() - { + public IDrawable getBackground() { return background; } @Override - public void drawExtras(Minecraft minecraft) - { + public void drawExtras(Minecraft minecraft) { } @Nullable @Override - public IDrawable getIcon() - { + public IDrawable getIcon() { return null; } @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) - { + public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); guiItemStacks.init(OUTPUT_SLOT, false, 73, 13); guiItemStacks.init(GEM_SLOT, true, 42, 0); - for (int y = 0; y < 3; ++y) - { - for (int x = 0; x < 3; ++x) - { + 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); } @@ -92,8 +81,7 @@ public class TartaricForgeRecipeCategory implements IRecipeCategory List> inputs = ingredients.getInputs(ItemStack.class); List> outputs = ingredients.getOutputs(ItemStack.class); - if (recipeWrapper instanceof TartaricForgeRecipeJEI) - { + if (recipeWrapper instanceof TartaricForgeRecipeJEI) { TartaricForgeRecipeJEI recipe = (TartaricForgeRecipeJEI) recipeWrapper; guiItemStacks.set(GEM_SLOT, ingredients.getInputs(ItemStack.class).get(ingredients.getInputs(ItemStack.class).size() - 1)); inputs.remove(ingredients.getInputs(ItemStack.class).size() - 1); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java index d435eee9..608d97be 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java @@ -6,31 +6,26 @@ import mezz.jei.api.recipe.IRecipeWrapper; import javax.annotation.Nonnull; -public class TartaricForgeRecipeHandler implements IRecipeHandler -{ +public class TartaricForgeRecipeHandler implements IRecipeHandler { @Nonnull @Override - public Class getRecipeClass() - { + public Class getRecipeClass() { return TartaricForgeRecipeJEI.class; } @Override - public String getRecipeCategoryUid(@Nonnull TartaricForgeRecipeJEI recipe) - { + public String getRecipeCategoryUid(@Nonnull TartaricForgeRecipeJEI recipe) { return Constants.Compat.JEI_CATEGORY_SOULFORGE; } @Nonnull @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull TartaricForgeRecipeJEI recipe) - { + public IRecipeWrapper getRecipeWrapper(@Nonnull TartaricForgeRecipeJEI recipe) { return recipe; } @Override - public boolean isRecipeValid(@Nonnull TartaricForgeRecipeJEI recipe) - { + public boolean isRecipeValid(@Nonnull TartaricForgeRecipeJEI recipe) { return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java index fb222d2f..9919a733 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java @@ -1,25 +1,22 @@ package WayofTime.bloodmagic.compat.jei.forge; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class TartaricForgeRecipeJEI extends BlankRecipeWrapper -{ +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + +public class TartaricForgeRecipeJEI extends BlankRecipeWrapper { private TartaricForgeRecipe recipe; private List validGems = new ArrayList(); - public TartaricForgeRecipeJEI(TartaricForgeRecipe recipe) - { + public TartaricForgeRecipeJEI(TartaricForgeRecipe recipe) { this.recipe = recipe; for (DefaultWill will : DefaultWill.values()) @@ -37,11 +34,9 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper @Nullable @Override - public List getTooltipStrings(int mouseX, int mouseY) - { + public List getTooltipStrings(int mouseX, int mouseY) { ArrayList ret = new ArrayList(); - if (mouseX >= 40 && mouseX <= 60 && mouseY >= 21 && mouseY <= 34) - { + if (mouseX >= 40 && mouseX <= 60 && mouseY >= 21 && mouseY <= 34) { ret.add(TextHelper.localize("jei.bloodmagic.recipe.minimumSouls", recipe.getMinimumSouls())); ret.add(TextHelper.localize("jei.bloodmagic.recipe.soulsDrained", recipe.getSoulsDrained())); return ret; @@ -49,8 +44,15 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper return null; } - public enum DefaultWill - { + public TartaricForgeRecipe getRecipe() { + return recipe; + } + + public List getValidGems() { + return validGems; + } + + 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), @@ -61,18 +63,9 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper public final ItemStack willStack; public final double minSouls; - DefaultWill(ItemStack willStack, double minSouls) - { + DefaultWill(ItemStack willStack, double minSouls) { this.willStack = willStack; this.minSouls = minSouls; } } - - public TartaricForgeRecipe getRecipe() { - return recipe; - } - - public List getValidGems() { - return validGems; - } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java index f8577cc8..9f66cc27 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java @@ -1,18 +1,15 @@ package WayofTime.bloodmagic.compat.jei.forge; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; -public class TartaricForgeRecipeMaker -{ +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; + +public class TartaricForgeRecipeMaker { @Nonnull - public static List getRecipes() - { + public static List getRecipes() { List recipeList = TartaricForgeRecipeRegistry.getRecipeList(); ArrayList recipes = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java index 07b7226a..5cfd9622 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.compat.waila; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.*; import WayofTime.bloodmagic.compat.waila.provider.*; import mcp.mobius.waila.api.IWailaPlugin; import mcp.mobius.waila.api.IWailaRegistrar; -import WayofTime.bloodmagic.api.Constants; import mcp.mobius.waila.api.WailaPlugin; @WailaPlugin diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index 01f993dd..a11aae07 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.compat.waila.provider; -import java.util.List; - +import WayofTime.bloodmagic.api.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; @@ -11,37 +14,28 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class DataProviderAlchemyArray implements IWailaDataProvider -{ +import java.util.List; + +public class DataProviderAlchemyArray implements IWailaDataProvider { @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES).setStackDisplayName(TextHelper.getFormattedText(RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getLocalizedName())); } @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { if (!config.getConfig(Constants.Compat.WAILA_CONFIG_ARRAY)) return currenttip; - if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) - { + if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { TileEntity tile = accessor.getTileEntity(); - if (tile instanceof TileAlchemyArray) - { + if (tile instanceof TileAlchemyArray) { TileAlchemyArray tileArray = (TileAlchemyArray) tile; if (!tileArray.getStackInSlot(0).isEmpty()) currenttip.add(TextHelper.localize("waila.bloodmagic.array.reagent", tileArray.getStackInSlot(0).getDisplayName())); @@ -49,8 +43,7 @@ public class DataProviderAlchemyArray implements IWailaDataProvider if (!tileArray.getStackInSlot(1).isEmpty()) currenttip.add(TextHelper.localize("waila.bloodmagic.array.catalyst", tileArray.getStackInSlot(1).getDisplayName())); } - } else - { + } else { currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } @@ -58,14 +51,12 @@ public class DataProviderAlchemyArray implements IWailaDataProvider } @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) - { + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index 22960cf1..8affc801 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -1,7 +1,13 @@ package WayofTime.bloodmagic.compat.waila.provider; -import java.util.List; - +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.block.BlockAltar; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; +import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; +import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.util.helper.TextHelper; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; @@ -12,94 +18,75 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.block.BlockAltar; -import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; -import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.helper.TextHelper; + +import java.util.List; /** * Integrated from WailaPlugins by tterrag1098. Originally implemented * in ImLookingAtBlood by Pokefenn. */ -public class DataProviderBloodAltar implements IWailaDataProvider -{ +public class DataProviderBloodAltar implements IWailaDataProvider { @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { if (!config.getConfig(Constants.Compat.WAILA_CONFIG_ALTAR)) return currenttip; boolean hasSigil = false; boolean hasSeer = false; - switch (ConfigHandler.wailaAltarDisplayMode) - { - case 0: - { - hasSigil = hasSeer = true; - break; - } - case 1: - { - hasSeer = holdingSeerSigil(accessor.getPlayer()); - hasSigil = hasSeer || holdingDivinationSigil(accessor.getPlayer()); - break; - } - case 2: - { - hasSeer = hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), accessor.getPlayer()); - hasSigil = hasSeer || hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), accessor.getPlayer()); - break; - } - default: - { - break; - } + switch (ConfigHandler.wailaAltarDisplayMode) { + case 0: { + hasSigil = hasSeer = true; + break; + } + case 1: { + hasSeer = holdingSeerSigil(accessor.getPlayer()); + hasSigil = hasSeer || holdingDivinationSigil(accessor.getPlayer()); + break; + } + case 2: { + hasSeer = hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), accessor.getPlayer()); + hasSigil = hasSeer || hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), accessor.getPlayer()); + break; + } + default: { + break; + } } if (!hasSeer && !hasSigil) return currenttip; - if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) - { - if (accessor.getBlock() instanceof BlockAltar && accessor.getTileEntity() instanceof TileAltar) - { + if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { + if (accessor.getBlock() instanceof BlockAltar && accessor.getTileEntity() instanceof TileAltar) { TileAltar altar = (TileAltar) accessor.getTileEntity(); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarTier", altar.getTier().toInt())); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarCapacity", altar.getCapacity())); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentEssence", altar.getCurrentBlood())); - if (hasSeer) - { + if (hasSeer) { int charge = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_TOTAL_CHARGE); int progress = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_PROGRESS); int liquidRequired = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_LIQUID_REQ); int craftAmount = 1; if (accessor.getNBTData().getTagList("Items", 10).get(0).getId() == 10) - craftAmount = ((NBTTagCompound)accessor.getNBTData().getTagList("Items", 10).get(0)).getByte("Count"); + craftAmount = ((NBTTagCompound) accessor.getNBTData().getTagList("Items", 10).get(0)).getByte("Count"); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent", (int) (((double) progress / (double) liquidRequired * 100) / craftAmount) + "%")); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentCharge", charge)); } } - } else - { + } else { currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } @@ -107,21 +94,18 @@ public class DataProviderBloodAltar implements IWailaDataProvider } @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) - { + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { if (te != null) te.writeToNBT(tag); return tag; } - public static boolean hasStack(ItemStack stack, EntityPlayer player) - { + public static boolean hasStack(ItemStack stack, EntityPlayer player) { for (ItemStack inventoryStack : player.inventory.mainInventory) if (inventoryStack != null && inventoryStack.isItemEqual(stack)) return true; @@ -129,8 +113,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider return false; } - private static boolean holdingSeerSigil(EntityPlayer player) - { + private static boolean holdingSeerSigil(EntityPlayer player) { if (player.getHeldItemMainhand().getItem() instanceof ItemSigilSeer) return true; @@ -140,8 +123,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider return false; } - private static boolean holdingDivinationSigil(EntityPlayer player) - { + private static boolean holdingDivinationSigil(EntityPlayer player) { if (player.getHeldItemMainhand().getItem() instanceof ItemSigilDivination) return true; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index 81c2891d..7bd19ddd 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -4,7 +4,6 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.BlockBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; @@ -18,30 +17,24 @@ import net.minecraftforge.fluids.FluidStack; import java.util.List; -public class DataProviderBloodTank implements IWailaDataProvider -{ +public class DataProviderBloodTank implements IWailaDataProvider { @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + 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; - if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) - { - if (accessor.getBlock() instanceof BlockBloodTank && accessor.getTileEntity() instanceof TileBloodTank) - { + if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { + if (accessor.getBlock() instanceof BlockBloodTank && accessor.getTileEntity() instanceof TileBloodTank) { TileBloodTank bloodTank = (TileBloodTank) accessor.getTileEntity(); NBTTagCompound tag = accessor.getNBTData(); int capacity = accessor.getNBTData().getInteger(Constants.NBT.ALTAR_CAPACITY); @@ -49,15 +42,12 @@ public class DataProviderBloodTank implements IWailaDataProvider currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity", capacity)); FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag(Constants.NBT.TANK)); - if (fluidStack != null) - { + if (fluidStack != null) { currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type", fluidStack.getLocalizedName())); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount", fluidStack.amount, capacity)); } } - } - else - { + } else { currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } @@ -65,14 +55,12 @@ public class DataProviderBloodTank implements IWailaDataProvider } @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) - { + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { if (te != null) te.writeToNBT(tag); 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 index 1ce57020..96594bde 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java @@ -13,12 +13,10 @@ import net.minecraft.world.World; import java.util.List; -public class DataProviderMimic implements IWailaDataProvider -{ +public class DataProviderMimic implements IWailaDataProvider { @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { if (accessor.getNBTData().getBoolean("hasItem")) return new ItemStack(accessor.getNBTData()); @@ -26,28 +24,23 @@ public class DataProviderMimic implements IWailaDataProvider } @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) - { - if (te instanceof TileMimic && ((TileMimic) te).getStackInSlot(0) != null) - { + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + if (te instanceof TileMimic && ((TileMimic) te).getStackInSlot(0) != null) { tag.setBoolean("hasItem", true); ((TileMimic) te).getStackInSlot(0).writeToNBT(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 index 60100dad..8e1c8868 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -1,17 +1,5 @@ package WayofTime.bloodmagic.compat.waila.provider; -import java.util.List; - -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; @@ -22,60 +10,60 @@ import WayofTime.bloodmagic.block.BlockRitualController; import WayofTime.bloodmagic.tile.TileImperfectRitualStone; 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.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; -public class DataProviderRitualController implements IWailaDataProvider -{ +import java.util.List; + +public class DataProviderRitualController implements IWailaDataProvider { @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { if (!config.getConfig(Constants.Compat.WAILA_CONFIG_RITUAL)) return currenttip; - if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) - { - if (accessor.getBlock() instanceof BlockRitualController) - { + if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { + if (accessor.getBlock() instanceof BlockRitualController) { int controllerMeta = accessor.getBlock().getMetaFromState(accessor.getBlockState()); - if ((controllerMeta == 0 || controllerMeta == 2) && accessor.getTileEntity() instanceof TileMasterRitualStone) - { + if ((controllerMeta == 0 || controllerMeta == 2) && accessor.getTileEntity() instanceof TileMasterRitualStone) { TileMasterRitualStone mrs = (TileMasterRitualStone) accessor.getTileEntity(); - if (mrs.getCurrentRitual() != null && mrs.isActive()) - { + if (mrs.getCurrentRitual() != null && mrs.isActive()) { currenttip.add(TextHelper.localizeEffect(mrs.getCurrentRitual().getUnlocalizedName())); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromUUID(mrs.getOwner()))); if (!RitualRegistry.ritualEnabled(mrs.getCurrentRitual())) currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.config.disabled")); - } else - { + } else { currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.deactivated")); } } - if (controllerMeta == 1 && accessor.getTileEntity() instanceof TileImperfectRitualStone) - { - if (accessor.getWorld().isAirBlock(accessor.getPosition().up())) - { + if (controllerMeta == 1 && accessor.getTileEntity() instanceof TileImperfectRitualStone) { + if (accessor.getWorld().isAirBlock(accessor.getPosition().up())) { Block up = accessor.getWorld().getBlockState(accessor.getPosition().up()).getBlock(); int meta = up.getMetaFromState(accessor.getWorld().getBlockState(accessor.getPosition().up())); BlockStack blockStack = new BlockStack(up, meta); ImperfectRitual ritual = ImperfectRitualRegistry.getRitualForBlock(blockStack); - if (ritual != null) - { + if (ritual != null) { currenttip.add(TextHelper.localizeEffect(ritual.getUnlocalizedName())); if (!ImperfectRitualRegistry.ritualEnabled(ritual)) currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.config.disabled")); @@ -83,8 +71,7 @@ public class DataProviderRitualController implements IWailaDataProvider } } } - } else - { + } else { currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } @@ -92,14 +79,12 @@ public class DataProviderRitualController implements IWailaDataProvider } @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) - { + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java index 1b5b9078..d76f0043 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.compat.waila.provider; -import java.util.List; - +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.block.BlockTeleposer; +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; @@ -11,39 +14,29 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.block.BlockTeleposer; -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.tile.TileTeleposer; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class DataProviderTeleposer implements IWailaDataProvider -{ +import java.util.List; + +public class DataProviderTeleposer implements IWailaDataProvider { @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { if (!config.getConfig(Constants.Compat.WAILA_CONFIG_TELEPOSER)) return currenttip; - if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) - { - if (accessor.getBlock() instanceof BlockTeleposer && accessor.getTileEntity() instanceof TileTeleposer) - { + if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { + if (accessor.getBlock() instanceof BlockTeleposer && accessor.getTileEntity() instanceof TileTeleposer) { TileTeleposer teleposer = (TileTeleposer) accessor.getTileEntity(); - if (!teleposer.getStackInSlot(0).isEmpty()) - { + if (!teleposer.getStackInSlot(0).isEmpty()) { ItemStack contained = teleposer.getStackInSlot(0); BlockPos toPos = ((ItemTelepositionFocus) contained.getItem()).getBlockPos(contained); int dimensionID = contained.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID); @@ -52,8 +45,7 @@ public class DataProviderTeleposer implements IWailaDataProvider currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", dimensionID)); } } - } else - { + } else { currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); } @@ -61,14 +53,12 @@ public class DataProviderTeleposer implements IWailaDataProvider } @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) - { + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) - { + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java index 9c681f00..fc018d59 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java @@ -8,34 +8,26 @@ import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class AdvancedCompressionHandler extends CompressionHandler -{ +public class AdvancedCompressionHandler extends CompressionHandler { @Override - public ItemStack compressInventory(ItemStack[] inv, World world) - { + public ItemStack compressInventory(ItemStack[] inv, World world) { return test(inv, true, world); } - public ItemStack test(ItemStack[] inv, boolean doDrain, World world) - { - for (ItemStack invStack : inv) - { - if (invStack.isEmpty()) - { + public ItemStack test(ItemStack[] inv, boolean doDrain, World world) { + for (ItemStack invStack : inv) { + if (invStack.isEmpty()) { continue; } - for (int i = 2; i <= 3; i++) - { + for (int i = 2; i <= 3; i++) { ItemStack stack = getRecipe(invStack, world, i); - if (!stack.isEmpty()) - { + if (!stack.isEmpty()) { int threshold = CompressionRegistry.getItemThreshold(invStack); int needed = i * i; int neededLeft = iterateThroughInventory(invStack, threshold + invStack.getMaxStackSize() - needed, inv, needed, false); - if (neededLeft <= 0) - { + if (neededLeft <= 0) { iterateThroughInventory(invStack, 0, inv, needed, true); return stack; } @@ -46,39 +38,31 @@ public class AdvancedCompressionHandler extends CompressionHandler return ItemStack.EMPTY; } - public int iterateThroughInventory(ItemStack required, int kept, ItemStack[] inv, int needed, boolean doDrain) - { + public int iterateThroughInventory(ItemStack required, int kept, ItemStack[] inv, int needed, boolean doDrain) { int i = -1; - for (ItemStack invStack : inv) - { + for (ItemStack invStack : inv) { i++; - if (invStack.isEmpty()) - { + if (invStack.isEmpty()) { continue; } - if (invStack.isItemEqual(required) && (invStack.getTagCompound() == null ? required.getTagCompound() == null : invStack.getTagCompound().equals(required.getTagCompound()))) - { + 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) - { + if (kept > 0) { int remainingFromStack = Math.max(stackSize - kept, 0); used += stackSize - remainingFromStack; } kept -= used; - if (kept <= 0 && needed > 0) - { + if (kept <= 0 && needed > 0) { int remainingFromStack = Math.max(stackSize - used - needed, 0); - if (doDrain) - { + if (doDrain) { invStack.setCount(remainingFromStack + used); - if (invStack.isEmpty()) - { + if (invStack.isEmpty()) { inv[i] = ItemStack.EMPTY; } } @@ -86,8 +70,7 @@ public class AdvancedCompressionHandler extends CompressionHandler needed -= (stackSize - used - remainingFromStack); } - if (needed <= 0) - { + if (needed <= 0) { return 0; } } @@ -96,16 +79,12 @@ public class AdvancedCompressionHandler extends CompressionHandler return needed; } - public static boolean isResultStackReversible(ItemStack stack, int gridSize, World world) - { - if (stack.isEmpty()) - { + public static boolean isResultStackReversible(ItemStack stack, int gridSize, World world) { + if (stack.isEmpty()) { return false; } - InventoryCrafting inventory = new InventoryCrafting(new Container() - { - public boolean canInteractWith(EntityPlayer player) - { + InventoryCrafting inventory = new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { return false; } }, 2, 2); @@ -113,59 +92,49 @@ public class AdvancedCompressionHandler extends CompressionHandler inventory.setInventorySlotContents(0, stack); ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world); - if (returnStack.isEmpty()) - { + if (returnStack.isEmpty()) { return false; } ItemStack compressedStack = ItemStack.EMPTY; - switch (gridSize) - { - case 2: - compressedStack = get22Recipe(returnStack, world); - break; - case 3: - compressedStack = get33Recipe(returnStack, world); - break; + switch (gridSize) { + case 2: + compressedStack = get22Recipe(returnStack, world); + break; + case 3: + compressedStack = get33Recipe(returnStack, world); + break; } return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); } - public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) - { - InventoryCrafting inventory = new InventoryCrafting(new Container() - { - public boolean canInteractWith(EntityPlayer player) - { + public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) { + InventoryCrafting inventory = new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { return false; } }, gridSize, gridSize); - for (int i = 0; i < inventory.getSizeInventory(); i++) - { + for (int i = 0; i < inventory.getSizeInventory(); i++) { inventory.setInventorySlotContents(i, stack); } return StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world); } - public static boolean has22Recipe(ItemStack stack, World world) - { + public static boolean has22Recipe(ItemStack stack, World world) { return !get22Recipe(stack, world).isEmpty(); } - public static ItemStack get22Recipe(ItemStack stack, World world) - { + public static ItemStack get22Recipe(ItemStack stack, World world) { return getRecipe(stack, world, 2); } - public static boolean has33Recipe(ItemStack stack, World world) - { + public static boolean has33Recipe(ItemStack stack, World world) { return !get33Recipe(stack, world).isEmpty(); } - public static ItemStack get33Recipe(ItemStack stack, World world) - { + public static ItemStack get33Recipe(ItemStack stack, World world) { return getRecipe(stack, world, 3); } } diff --git a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java index 4573bde1..00dd6361 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java @@ -4,36 +4,30 @@ import WayofTime.bloodmagic.api.compress.CompressionHandler; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class BaseCompressionHandler extends CompressionHandler -{ +public class BaseCompressionHandler extends CompressionHandler { private final ItemStack required; private final ItemStack result; private final int leftover; - public BaseCompressionHandler(ItemStack requested, ItemStack result, int leftover) - { + public BaseCompressionHandler(ItemStack requested, ItemStack result, int leftover) { super(); this.required = requested; this.result = result; this.leftover = leftover; } - public ItemStack getResultStack() - { + public ItemStack getResultStack() { return this.result.copy(); } - public ItemStack getRequiredStack() - { + public ItemStack getRequiredStack() { return this.required.copy(); } @Override - public ItemStack compressInventory(ItemStack[] inv, World world) - { + public ItemStack compressInventory(ItemStack[] inv, World world) { int remaining = this.getRemainingNeeded(inv); - if (remaining <= 0) - { + if (remaining <= 0) { this.drainInventory(inv); return this.getResultStack(); } @@ -41,51 +35,41 @@ public class BaseCompressionHandler extends CompressionHandler return ItemStack.EMPTY; } - public int getRemainingNeeded(ItemStack[] inv) - { + public int getRemainingNeeded(ItemStack[] inv) { return iterateThroughInventory(inv, false); } - public int drainInventory(ItemStack[] inv) - { + public int drainInventory(ItemStack[] inv) { return iterateThroughInventory(inv, true); } - public int iterateThroughInventory(ItemStack[] inv, boolean doDrain) - { + public int iterateThroughInventory(ItemStack[] inv, boolean doDrain) { int needed = this.required.getCount(); int kept = this.getLeftover(); int i = -1; - for (ItemStack invStack : inv) - { + for (ItemStack invStack : inv) { i++; - if (invStack == null) - { + if (invStack == null) { continue; } - if (invStack.isItemEqual(this.required) && (invStack.getTagCompound() == null ? this.required.getTagCompound() == null : invStack.getTagCompound().equals(this.required.getTagCompound()))) - { + if (invStack.isItemEqual(this.required) && (invStack.getTagCompound() == null ? this.required.getTagCompound() == null : invStack.getTagCompound().equals(this.required.getTagCompound()))) { int stackSize = invStack.getCount(); int used = 0; - if (kept > 0) - { + if (kept > 0) { int remainingFromStack = Math.max(stackSize - kept, 0); used += stackSize - remainingFromStack; } kept -= used; - if (kept <= 0 && needed > 0) - { + if (kept <= 0 && needed > 0) { int remainingFromStack = Math.max(stackSize - used - needed, 0); - if (doDrain) - { + if (doDrain) { invStack.setCount(remainingFromStack + used); - if (invStack.isEmpty()) - { + if (invStack.isEmpty()) { inv[i] = ItemStack.EMPTY; } } @@ -93,8 +77,7 @@ public class BaseCompressionHandler extends CompressionHandler needed -= (stackSize - used - remainingFromStack); } - if (needed <= 0) - { + if (needed <= 0) { return 0; } } @@ -103,8 +86,7 @@ public class BaseCompressionHandler extends CompressionHandler return needed; } - public int getLeftover() - { + public int getLeftover() { return this.leftover; } } diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 46730d7b..093dbff0 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -13,121 +13,35 @@ import net.minecraft.world.World; import java.util.LinkedList; import java.util.List; -public class StorageBlockCraftingManager -{ +public class StorageBlockCraftingManager { private static final StorageBlockCraftingManager instance = new StorageBlockCraftingManager(); private List recipes = new LinkedList(); - public static StorageBlockCraftingManager getInstance() - { - return instance; - } - - public void addStorageBlockRecipes() - { + public void addStorageBlockRecipes() { // this.recipes = new StorageBlockCraftingRecipeAssimilator().getPackingRecipes(); BloodMagic.instance.logger.info("Total number of compression recipes: " + this.recipes.size()); } - private static boolean isResultStackReversible(ItemStack stack, int gridSize, World world, List list) - { - if (stack.isEmpty()) - { - return false; - } - InventoryCrafting inventory = new InventoryCrafting(new Container() - { - public boolean canInteractWith(EntityPlayer player) - { - return false; - } - }, 2, 2); - - inventory.setInventorySlotContents(0, stack); - - ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); - if (returnStack.isEmpty()) - { - return false; - } - - ItemStack compressedStack = ItemStack.EMPTY; - switch (gridSize) - { - case 2: - compressedStack = get22Recipe(returnStack, world, list); - break; - case 3: - compressedStack = get33Recipe(returnStack, world, list); - break; - } - - return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); - } - - private static ItemStack getRecipe(ItemStack stack, World world, int gridSize, List list) - { - InventoryCrafting inventory = new InventoryCrafting(new Container() - { - public boolean canInteractWith(EntityPlayer player) - { - return false; - } - }, gridSize, gridSize); - for (int i = 0; i < inventory.getSizeInventory(); i++) - { - inventory.setInventorySlotContents(i, stack); - } - - return StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); - } - - private static boolean has22Recipe(ItemStack stack, World world, List list) - { - return !get22Recipe(stack, world, list).isEmpty(); - } - - private static ItemStack get22Recipe(ItemStack stack, World world, List list) - { - return getRecipe(stack, world, 2, list); - } - - private static boolean has33Recipe(ItemStack stack, World world, List list) - { - return !get33Recipe(stack, world, list).isEmpty(); - } - - private static ItemStack get33Recipe(ItemStack stack, World world, List list) - { - return getRecipe(stack, world, 3, list); - } - - public ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world) - { + public ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world) { return this.findMatchingRecipe(craftingInventory, world, this.recipes); } - private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, List list) - { + private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, List list) { int i = 0; ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack1 = ItemStack.EMPTY; int j; - for (j = 0; j < craftingInventory.getSizeInventory(); ++j) - { + for (j = 0; j < craftingInventory.getSizeInventory(); ++j) { ItemStack itemstack2 = craftingInventory.getStackInSlot(j); - if (!itemstack2.isEmpty()) - { - if (i == 0) - { + if (!itemstack2.isEmpty()) { + if (i == 0) { itemstack = itemstack2; } - if (i == 1) - { + if (i == 1) { itemstack1 = itemstack2; } @@ -135,28 +49,23 @@ public class StorageBlockCraftingManager } } - if (i == 2 && itemstack.getItem() == itemstack1.getItem() && itemstack.getCount() == 1 && itemstack1.getCount() == 1 && itemstack.getItem().isRepairable()) - { + 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) - { + if (i1 < 0) { i1 = 0; } return new ItemStack(itemstack.getItem(), 1, i1); - } else - { - for (j = 0; j < list.size(); ++j) - { + } else { + for (j = 0; j < list.size(); ++j) { IRecipe irecipe = (IRecipe) list.get(j); - if (irecipe.matches(craftingInventory, world)) - { + if (irecipe.matches(craftingInventory, world)) { return irecipe.getCraftingResult(craftingInventory); } } @@ -164,4 +73,67 @@ public class StorageBlockCraftingManager return ItemStack.EMPTY; } } + + public static StorageBlockCraftingManager getInstance() { + return instance; + } + + private static boolean isResultStackReversible(ItemStack stack, int gridSize, World world, List list) { + if (stack.isEmpty()) { + return false; + } + InventoryCrafting inventory = new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, 2, 2); + + inventory.setInventorySlotContents(0, stack); + + ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); + if (returnStack.isEmpty()) { + return false; + } + + ItemStack compressedStack = ItemStack.EMPTY; + switch (gridSize) { + case 2: + compressedStack = get22Recipe(returnStack, world, list); + break; + case 3: + compressedStack = get33Recipe(returnStack, world, list); + break; + } + + return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); + } + + private static ItemStack getRecipe(ItemStack stack, World world, int gridSize, List list) { + InventoryCrafting inventory = new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, gridSize, gridSize); + for (int i = 0; i < inventory.getSizeInventory(); i++) { + inventory.setInventorySlotContents(i, stack); + } + + return StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); + } + + private static boolean has22Recipe(ItemStack stack, World world, List list) { + return !get22Recipe(stack, world, list).isEmpty(); + } + + private static ItemStack get22Recipe(ItemStack stack, World world, List list) { + return getRecipe(stack, world, 2, list); + } + + private static boolean has33Recipe(ItemStack stack, World world, List list) { + return !get33Recipe(stack, world, list).isEmpty(); + } + + private static ItemStack get33Recipe(ItemStack stack, World world, List list) { + return getRecipe(stack, world, 3, list); + } } diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java index f119e102..b5870b6d 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java @@ -1,21 +1,6 @@ package WayofTime.bloodmagic.compress; -import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.*; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.ForgeRegistries; -import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -import java.util.*; - -public class StorageBlockCraftingRecipeAssimilator -{ +public class StorageBlockCraftingRecipeAssimilator { // public static final List ignore = new ArrayList(); // // public List getPackingRecipes() diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 074f188a..a3184496 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -4,7 +4,10 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.orb.BloodOrb; import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.entity.mob.*; -import WayofTime.bloodmagic.entity.projectile.*; +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.potion.PotionBloodMagic; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.init.MobEffects; @@ -87,16 +90,16 @@ public class RegistrarBloodMagic { @SubscribeEvent public static void registerEntities(RegistryEvent.Register event) { int entities = 0; - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "blood_light"), EntityBloodLight.class, "BloodLight", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "soul_snare"), EntitySoulSnare.class, "SoulSnare", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "soul_arrow"), EntitySentientArrow.class, "SoulArrow", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "meteor"), EntityMeteor.class, "Meteor", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "sentient_specter"), EntitySentientSpecter.class, "SentientSpecter", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "mimic"), EntityMimic.class, "Mimic", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_zombie"), EntityCorruptedZombie.class, "CorruptedZombie", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_sheep"), EntityCorruptedSheep.class, "CorruptedSheep", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_chicken"), EntityCorruptedChicken.class, "CorruptedChicken", ++entities, BloodMagic.instance, 16*4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_spider"), EntityCorruptedSpider.class, "CorruptedSpider", ++entities, BloodMagic.instance, 16*4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "blood_light"), EntityBloodLight.class, "BloodLight", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "soul_snare"), EntitySoulSnare.class, "SoulSnare", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "soul_arrow"), EntitySentientArrow.class, "SoulArrow", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "meteor"), EntityMeteor.class, "Meteor", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "sentient_specter"), EntitySentientSpecter.class, "SentientSpecter", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "mimic"), EntityMimic.class, "Mimic", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_zombie"), EntityCorruptedZombie.class, "CorruptedZombie", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_sheep"), EntityCorruptedSheep.class, "CorruptedSheep", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_chicken"), EntityCorruptedChicken.class, "CorruptedChicken", ++entities, BloodMagic.instance, 16 * 4, 3, true); + EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_spider"), EntityCorruptedSpider.class, "CorruptedSpider", ++entities, BloodMagic.instance, 16 * 4, 3, true); } @SubscribeEvent diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java index 0f2d063d..58e11bc8 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java @@ -1,6 +1,13 @@ 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.Sets; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -10,45 +17,13 @@ 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 WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.enums.EnumDemonBlock1; -import WayofTime.bloodmagic.block.enums.EnumDemonBlock2; -import WayofTime.bloodmagic.block.enums.EnumDemonBlock3; -import WayofTime.bloodmagic.block.enums.EnumSubWillType; -import WayofTime.bloodmagic.block.enums.EnumSubWillType1; -import WayofTime.bloodmagic.block.enums.EnumSubWillType2; -import WayofTime.bloodmagic.block.enums.EnumSubWillType3; -import WayofTime.bloodmagic.block.enums.EnumWillWall; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.tile.TileBloodTank; -import WayofTime.bloodmagic.tile.TileDemonCrucible; -import WayofTime.bloodmagic.tile.TileDemonCrystal; -import WayofTime.bloodmagic.tile.TileDemonCrystallizer; -import WayofTime.bloodmagic.tile.TileDemonPylon; -import WayofTime.bloodmagic.tile.TileDimensionalPortal; -import WayofTime.bloodmagic.tile.TileImperfectRitualStone; -import WayofTime.bloodmagic.tile.TileIncenseAltar; -import WayofTime.bloodmagic.tile.TileInversionPillar; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.tile.TileMimic; -import WayofTime.bloodmagic.tile.TilePhantomBlock; -import WayofTime.bloodmagic.tile.TileSoulForge; -import WayofTime.bloodmagic.tile.TileSpectralBlock; -import WayofTime.bloodmagic.tile.TileTeleposer; -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 java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @SuppressWarnings("unused") -public class RegistrarBloodMagicBlocks -{ +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; @@ -94,11 +69,10 @@ public class RegistrarBloodMagicBlocks static Set blocks; @SubscribeEvent - public static void registerBlocks(RegistryEvent.Register event) - { + public static void registerBlocks(RegistryEvent.Register event) { FluidRegistry.registerFluid(BlockLifeEssence.getLifeEssence()); FluidRegistry.addBucketForFluid(BlockLifeEssence.getLifeEssence()); - + blocks = Sets.newHashSet( new BlockAltar().setRegistryName("altar"), new BlockBloodRune().setRegistryName("blood_rune"), diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 644c7b1a..1cc3cd7c 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -1,25 +1,8 @@ package WayofTime.bloodmagic.core; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.IBMBlock; import WayofTime.bloodmagic.client.IVariantProvider; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.init.Items; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -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 WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.item.*; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; @@ -32,17 +15,29 @@ import WayofTime.bloodmagic.item.routing.ItemNodeRouter; import WayofTime.bloodmagic.item.routing.ItemRouterFilter; import WayofTime.bloodmagic.item.sigil.*; import WayofTime.bloodmagic.item.soul.*; +import com.google.common.collect.Lists; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.init.Items; +import net.minecraft.inventory.EntityEquipmentSlot; +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 org.apache.commons.lang3.tuple.Pair; -import java.util.Comparator; import java.util.List; -import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @SuppressWarnings("unchecked") -public class RegistrarBloodMagicItems -{ +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; @@ -122,8 +117,7 @@ public class RegistrarBloodMagicItems public static List items; @SubscribeEvent - public static void registerItems(RegistryEvent.Register event) - { + public static void registerItems(RegistryEvent.Register event) { items = Lists.newArrayList(); RegistrarBloodMagicBlocks.blocks.stream().filter(block -> block instanceof IBMBlock && ((IBMBlock) block).getItem() != null).forEach(block -> { @@ -211,8 +205,7 @@ public class RegistrarBloodMagicItems @SideOnly(Side.CLIENT) @SubscribeEvent - public static void registerRenders(ModelRegistryEvent event) - { + public static void registerRenders(ModelRegistryEvent event) { items.stream().filter(i -> i instanceof IVariantProvider).forEach(item -> { IVariantProvider variantProvider = (IVariantProvider) item; for (Pair variant : variantProvider.getVariants()) diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java b/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java index 8a478e7d..f2b3f4c3 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.demonAura; import org.apache.commons.lang3.builder.ToStringBuilder; -public class PosXY implements Comparable -{ +public class PosXY implements Comparable { public int x; public int y; @@ -16,20 +15,17 @@ public class PosXY implements Comparable } @Override - public int compareTo(PosXY c) - { + 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) - { + 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) - { + public float getDistanceSquaredToChunkCoordinates(PosXY c) { return getDistanceSquared(c.x, c.y); } diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java index bf0c4f6e..01547e6f 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java @@ -5,20 +5,17 @@ import net.minecraft.world.chunk.Chunk; import java.lang.ref.WeakReference; -public class WillChunk -{ +public class WillChunk { PosXY loc; private short base; private DemonWillHolder currentWill = new DemonWillHolder(); private WeakReference chunkRef; - public WillChunk(PosXY loc) - { + public WillChunk(PosXY loc) { this.loc = loc; } - public WillChunk(Chunk chunk, short base, DemonWillHolder currentWill) - { + public WillChunk(Chunk chunk, short base, DemonWillHolder currentWill) { this.loc = new PosXY(chunk.x, chunk.z); this.chunkRef = new WeakReference(chunk); this.base = base; diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java b/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java index 3d3f0164..bf587940 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java @@ -2,25 +2,21 @@ package WayofTime.bloodmagic.demonAura; import java.util.concurrent.ConcurrentHashMap; -public class WillWorld -{ +public class WillWorld { int dim; ConcurrentHashMap willChunks = new ConcurrentHashMap(); // private static ConcurrentHashMap nodeTickets = new ConcurrentHashMap(); - public WillWorld(int dim) - { + public WillWorld(int dim) { this.dim = dim; } - public WillChunk getWillChunkAt(int x, int y) - { + public WillChunk getWillChunkAt(int x, int y) { return getWillChunkAt(new PosXY(x, y)); } - public WillChunk getWillChunkAt(PosXY loc) - { + public WillChunk getWillChunkAt(PosXY loc) { return this.willChunks.get(loc); } diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index 65f783ab..98201ee6 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -11,64 +11,52 @@ import javax.annotation.Nullable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; -public class WorldDemonWillHandler -{ - static ConcurrentHashMap containedWills = new ConcurrentHashMap(); +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) - { + public static DemonWillHolder getWillHolder(int dim, int x, int y) { WillChunk chunk = getWillChunk(dim, x, y); - if (chunk != null) - { + if (chunk != null) { return chunk.getCurrentWill(); } return null; } - public static DemonWillHolder getWillHolder(World world, BlockPos pos) - { + 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) - { + 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)) - { + 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)) - { + public static void addWillWorld(int dim) { + if (!containedWills.containsKey(dim)) { containedWills.put(dim, new WillWorld(dim)); BloodMagicAPI.logger.info("Creating demon will cache for world " + dim); } } - public static void removeWillWorld(int dim) - { + public static void removeWillWorld(int dim) { containedWills.remove(dim); BloodMagicAPI.logger.info("Removing demon will cache for world " + dim); } - public static void addWillChunk(int dim, Chunk chunk, short base, DemonWillHolder currentWill) - { + public static void addWillChunk(int dim, Chunk chunk, short base, DemonWillHolder currentWill) { WillWorld aw = containedWills.get(dim); - if (aw == null) - { + if (aw == null) { aw = new WillWorld(dim); } aw.getWillChunks().put(new PosXY(chunk.x, chunk.z), new WillChunk(chunk, base, currentWill)); @@ -76,31 +64,25 @@ public class WorldDemonWillHandler containedWills.put(dim, aw); } - public static void removeWillChunk(int dim, int x, int y) - { + public static void removeWillChunk(int dim, int x, int y) { WillWorld aw = containedWills.get(dim); - if (aw != null) - { + if (aw != null) { WillChunk chunk = aw.getWillChunks().remove(new PosXY(x, y)); - if (chunk != null) - { + if (chunk != null) { markChunkAsDirty(chunk, dim); } } } - public static EnumDemonWillType getHighestDemonWillType(World world, BlockPos pos) - { + 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) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { + if (currentWill.getWill(type) > currentMax) { currentMax = currentWill.getWill(type); currentHighest = type; } @@ -109,14 +91,12 @@ public class WorldDemonWillHandler return currentHighest; } - public static double drainWill(World world, BlockPos pos, EnumDemonWillType type, double amount, boolean doDrain) - { + 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) - { + if (!doDrain) { return drain; } @@ -126,14 +106,12 @@ public class WorldDemonWillHandler return drain; } - public static double fillWillToMaximum(World world, BlockPos pos, EnumDemonWillType type, double amount, double max, boolean doFill) - { + 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) - { + if (!doFill || fill <= 0) { return fill > 0 ? fill : 0; } @@ -143,13 +121,11 @@ public class WorldDemonWillHandler return fill; } - public static double fillWill(World world, BlockPos pos, EnumDemonWillType type, double amount, boolean doFill) - { + 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) - { + if (!doFill) { return amount; } @@ -159,11 +135,9 @@ public class WorldDemonWillHandler return amount; } - public static WillChunk getWillChunk(World world, BlockPos pos) - { + public static WillChunk getWillChunk(World world, BlockPos pos) { WillChunk willChunk = getWillChunk(world.provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); - if (willChunk == null) - { + if (willChunk == null) { Chunk chunk = world.getChunkFromBlockCoords(pos); generateWill(chunk); @@ -173,12 +147,10 @@ public class WorldDemonWillHandler return willChunk; } - public static double getCurrentWill(World world, BlockPos pos, EnumDemonWillType type) - { + public static double getCurrentWill(World world, BlockPos pos, EnumDemonWillType type) { WillChunk willChunk = getWillChunk(world, pos); - if (willChunk == null) - { + if (willChunk == null) { return 0; } @@ -186,26 +158,21 @@ public class WorldDemonWillHandler return currentWill.getWill(type); } - private static void markChunkAsDirty(WillChunk chunk, int dim) - { - if (chunk.isModified()) - { + 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)) - { + if (!dirtyChunks.containsKey(dim)) { dirtyChunks.put(dim, new CopyOnWriteArrayList()); } CopyOnWriteArrayList dc = dirtyChunks.get(dim); - if (!dc.contains(pos)) - { + if (!dc.contains(pos)) { dc.add(pos); } } - public static void generateWill(Chunk chunk) - { + 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 index deb2f90c..21416e37 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java @@ -1,25 +1,23 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntityDemonBase; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.item.ItemBow; import net.minecraft.util.EnumHand; -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -public class EntityAIAttackRangedBow extends EntityAIBase -{ +public class EntityAIAttackRangedBow extends EntityAIBase { private final EntityDemonBase entity; private final double moveSpeedAmp; - private int attackCooldown; 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) - { + public EntityAIAttackRangedBow(EntityDemonBase entityDemonBase, double speedAmplifier, int delay, float maxDistance) { this.entity = entityDemonBase; this.moveSpeedAmp = speedAmplifier; this.attackCooldown = delay; @@ -27,45 +25,39 @@ public class EntityAIAttackRangedBow extends EntityAIBase this.setMutexBits(3); } - public void setAttackCooldown(int p_189428_1_) - { + public void setAttackCooldown(int p_189428_1_) { this.attackCooldown = p_189428_1_; } /** * Returns whether the EntityAIBase should begin execution. */ - public boolean shouldExecute() - { + public boolean shouldExecute() { return this.entity.getAttackTarget() != null && this.isBowInMainhand(); } - protected boolean isBowInMainhand() - { + protected boolean isBowInMainhand() { return this.entity.getHeldItemMainhand().getItem() instanceof ItemBow; } /** * Returns whether an in-progress EntityAIBase should continue executing */ - public boolean continueExecuting() - { + 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() - { + public void startExecuting() { super.startExecuting(); } /** * Resets the task */ - public void resetTask() - { + public void resetTask() { super.startExecuting(); this.seeTime = 0; this.attackTime = -1; @@ -75,89 +67,70 @@ public class EntityAIAttackRangedBow extends EntityAIBase /** * Updates the task */ - public void updateTask() - { + public void updateTask() { EntityLivingBase entitylivingbase = this.entity.getAttackTarget(); - if (entitylivingbase != null) - { + 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) - { + if (flag != flag1) { this.seeTime = 0; } - if (flag) - { + if (flag) { ++this.seeTime; - } else - { + } else { --this.seeTime; } - if (d0 <= (double) this.maxAttackDistance && this.seeTime >= 20) - { + if (d0 <= (double) this.maxAttackDistance && this.seeTime >= 20) { this.entity.getNavigator().clearPathEntity(); ++this.strafingTime; - } else - { + } else { this.entity.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.moveSpeedAmp); this.strafingTime = -1; } - if (this.strafingTime >= 20) - { - if ((double) this.entity.getRNG().nextFloat() < 0.3D) - { + if (this.strafingTime >= 20) { + if ((double) this.entity.getRNG().nextFloat() < 0.3D) { this.strafingClockwise = !this.strafingClockwise; } - if ((double) this.entity.getRNG().nextFloat() < 0.3D) - { + 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)) - { + if (this.strafingTime > -1) { + if (d0 > (double) (this.maxAttackDistance * 0.75F)) { this.strafingBackwards = false; - } else if (d0 < (double) (this.maxAttackDistance * 0.25F)) - { + } 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 - { + } else { this.entity.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F); } - if (this.entity.isHandActive()) - { - if (!flag && this.seeTime < -60) - { + if (this.entity.isHandActive()) { + if (!flag && this.seeTime < -60) { this.entity.resetActiveHand(); - } else if (flag) - { + } else if (flag) { int i = this.entity.getItemInUseMaxCount(); - if (i >= 20) - { + if (i >= 20) { this.entity.resetActiveHand(); this.entity.attackEntityWithRangedAttack(entitylivingbase, ItemBow.getArrowVelocity(i)); this.attackTime = this.attackCooldown; } } - } else if (--this.attackTime <= 0 && this.seeTime >= -60) - { + } else if (--this.attackTime <= 0 && this.seeTime >= -60) { this.entity.setActiveHand(EnumHand.MAIN_HAND); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java index 066033ac..0a2df18c 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java @@ -1,41 +1,42 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.pathfinding.Path; import net.minecraft.util.EnumHand; import net.minecraft.world.World; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -public class EntityAIAttackStealthMelee extends EntityAIBase -{ +public class EntityAIAttackStealthMelee extends EntityAIBase { + protected final int attackInterval = 20; protected EntityCorruptedChicken chicken; - - World worldObj; /** * An amount of decrementing ticks that allows the entity to attack once the * tick reaches 0. */ protected int attackTick; - /** The speed with which the mob will approach the target */ + 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. */ + /** + * The PathEntity of our entity. + */ Path entityPathEntity; private int delayCounter; private double targetX; private double targetY; private double targetZ; - protected final int attackInterval = 20; private int failedPathFindingPenalty = 0; private boolean canPenalize = false; - public EntityAIAttackStealthMelee(EntityCorruptedChicken creature, double speedIn, boolean useLongMemory) - { + public EntityAIAttackStealthMelee(EntityCorruptedChicken creature, double speedIn, boolean useLongMemory) { this.chicken = creature; this.worldObj = creature.getEntityWorld(); this.speedTowardsTarget = speedIn; @@ -44,32 +45,24 @@ public class EntityAIAttackStealthMelee extends EntityAIBase } @Override - public boolean shouldExecute() - { - if (chicken.attackStateMachine != 1) - { + public boolean shouldExecute() { + if (chicken.attackStateMachine != 1) { return false; } EntityLivingBase entitylivingbase = this.chicken.getAttackTarget(); - if (entitylivingbase == null) - { + if (entitylivingbase == null) { return false; - } else if (!entitylivingbase.isEntityAlive()) - { + } else if (!entitylivingbase.isEntityAlive()) { return false; - } else - { - if (canPenalize) - { - if (--this.delayCounter <= 0) - { + } 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 - { + } else { return true; } } @@ -79,61 +72,50 @@ public class EntityAIAttackStealthMelee extends EntityAIBase } @Override - public boolean shouldContinueExecuting() - { + public boolean shouldContinueExecuting() { return chicken.attackStateMachine == 1 && super.shouldContinueExecuting(); } @Override - public void resetTask() - { - if (chicken.attackStateMachine == 1) - { + public void resetTask() { + if (chicken.attackStateMachine == 1) { chicken.attackStateMachine = 0; } } @Override - public void updateTask() - { + public void updateTask() { EntityLivingBase 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)) - { + 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) - { + if (this.canPenalize) { this.delayCounter += failedPathFindingPenalty; - if (this.chicken.getNavigator().getPath() != null) - { + 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 - { + } else { failedPathFindingPenalty += 10; } } - if (d0 > 1024.0D) - { + if (d0 > 1024.0D) { this.delayCounter += 10; - } else if (d0 > 256.0D) - { + } else if (d0 > 256.0D) { this.delayCounter += 5; } - if (!this.chicken.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget)) - { + if (!this.chicken.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget)) { this.delayCounter += 15; } } @@ -142,12 +124,10 @@ public class EntityAIAttackStealthMelee extends EntityAIBase this.attackEntity(entitylivingbase, d0); } - protected void attackEntity(EntityLivingBase attacked, double distance) - { + protected void attackEntity(EntityLivingBase attacked, double distance) { double d0 = this.getAttackReachSqr(attacked); - if (distance <= d0 && this.attackTick <= 0) - { + if (distance <= d0 && this.attackTick <= 0) { this.attackTick = 20; this.chicken.swingArm(EnumHand.MAIN_HAND); this.chicken.attackEntityAsMob(attacked); @@ -156,8 +136,7 @@ public class EntityAIAttackStealthMelee extends EntityAIBase } } - protected double getAttackReachSqr(EntityLivingBase attackTarget) - { + protected double getAttackReachSqr(EntityLivingBase 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 index 288fc685..44337f13 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java @@ -1,24 +1,28 @@ 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.state.IBlockState; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; -import WayofTime.bloodmagic.inversion.CorruptionHandler; -public class EntityAIEatAndCorruptBlock extends EntityAIBase -{ - /** The entity owner of this AITask */ +public class EntityAIEatAndCorruptBlock extends EntityAIBase { + /** + * The entity owner of this AITask + */ private final EntityAspectedDemonBase grassEaterEntity; - /** The world the grass eater entity is eating from */ + /** + * The world the grass eater entity is eating from + */ private final World world; - /** Number of ticks since the entity started to eat grass */ + /** + * Number of ticks since the entity started to eat grass + */ int eatingGrassTimer; - public EntityAIEatAndCorruptBlock(EntityAspectedDemonBase entity) - { + public EntityAIEatAndCorruptBlock(EntityAspectedDemonBase entity) { this.grassEaterEntity = entity; this.world = entity.getEntityWorld(); this.setMutexBits(7); @@ -27,13 +31,10 @@ public class EntityAIEatAndCorruptBlock extends EntityAIBase /** * Returns whether the EntityAIBase should begin execution. */ - public boolean shouldExecute() - { - if (this.grassEaterEntity.getRNG().nextInt(50) != 0) - { + public boolean shouldExecute() { + if (this.grassEaterEntity.getRNG().nextInt(50) != 0) { return false; - } else - { + } else { BlockPos pos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ).down(); IBlockState offsetState = world.getBlockState(pos); Block offsetBlock = offsetState.getBlock(); @@ -44,8 +45,7 @@ public class EntityAIEatAndCorruptBlock extends EntityAIBase /** * Execute a one shot task or start executing a continuous task */ - public void startExecuting() - { + public void startExecuting() { this.eatingGrassTimer = 40; this.world.setEntityState(this.grassEaterEntity, (byte) 10); this.grassEaterEntity.getNavigator().clearPathEntity(); @@ -54,44 +54,38 @@ public class EntityAIEatAndCorruptBlock extends EntityAIBase /** * Resets the task */ - public void resetTask() - { + public void resetTask() { this.eatingGrassTimer = 0; } /** * Returns whether an in-progress EntityAIBase should continue executing */ - public boolean continueExecuting() - { + public boolean continueExecuting() { return this.eatingGrassTimer > 0; } /** * Number of ticks since the entity started to eat grass */ - public int getEatingGrassTimer() - { + public int getEatingGrassTimer() { return this.eatingGrassTimer; } /** * Updates the task */ - public void updateTask() - { + public void updateTask() { this.eatingGrassTimer = Math.max(0, this.eatingGrassTimer - 1); - if (this.eatingGrassTimer == 4) - { + if (this.eatingGrassTimer == 4) { BlockPos blockpos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ); BlockPos offsetPos = blockpos.down(); IBlockState offsetState = world.getBlockState(offsetPos); Block offsetBlock = offsetState.getBlock(); - if (CorruptionHandler.isBlockCorruptible(world, grassEaterEntity.getType(), offsetPos, offsetState, offsetBlock)) - { + if (CorruptionHandler.isBlockCorruptible(world, grassEaterEntity.getType(), offsetPos, offsetState, offsetBlock)) { // if (this.world.getGameRules().getBoolean("mobGriefing")) { this.world.playEvent(2001, offsetPos, Block.getIdFromBlock(offsetBlock)); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java index 92e7bebb..73d08ea2 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntityDemonBase; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; @@ -12,22 +13,19 @@ import net.minecraft.pathfinding.PathNodeType; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -public class EntityAIFollowOwner extends EntityAIBase -{ +public class EntityAIFollowOwner extends EntityAIBase { + World theWorld; + float maxDist; + float minDist; private EntityDemonBase thePet; private EntityLivingBase theOwner; - World theWorld; private double followSpeed; private PathNavigate petPathfinder; private int timeToRecalcPath; - float maxDist; - float minDist; private float oldWaterCost; - public EntityAIFollowOwner(EntityDemonBase thePetIn, double followSpeedIn, float minDistIn, float maxDistIn) - { + public EntityAIFollowOwner(EntityDemonBase thePetIn, double followSpeedIn, float minDistIn, float maxDistIn) { this.thePet = thePetIn; this.theWorld = thePetIn.getEntityWorld(); this.followSpeed = followSpeedIn; @@ -36,8 +34,7 @@ public class EntityAIFollowOwner extends EntityAIBase this.maxDist = maxDistIn; this.setMutexBits(3); - if (!(thePetIn.getNavigator() instanceof PathNavigateGround)) - { + if (!(thePetIn.getNavigator() instanceof PathNavigateGround)) { throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); } } @@ -45,24 +42,18 @@ public class EntityAIFollowOwner extends EntityAIBase /** * Returns whether the EntityAIBase should begin execution. */ - public boolean shouldExecute() - { + public boolean shouldExecute() { EntityLivingBase entitylivingbase = this.thePet.getOwner(); - if (entitylivingbase == null) - { + if (entitylivingbase == null) { return false; - } else if (entitylivingbase instanceof EntityPlayer && ((EntityPlayer) entitylivingbase).isSpectator()) - { + } else if (entitylivingbase instanceof EntityPlayer && ((EntityPlayer) entitylivingbase).isSpectator()) { return false; - } else if (this.thePet.isStationary()) - { + } else if (this.thePet.isStationary()) { return false; - } else if (this.thePet.getDistanceSqToEntity(entitylivingbase) < (double) (this.minDist * this.minDist)) - { + } else if (this.thePet.getDistanceSqToEntity(entitylivingbase) < (double) (this.minDist * this.minDist)) { return false; - } else - { + } else { this.theOwner = entitylivingbase; return true; } @@ -71,16 +62,14 @@ public class EntityAIFollowOwner extends EntityAIBase /** * Returns whether an in-progress EntityAIBase should continue executing */ - public boolean continueExecuting() - { + public boolean continueExecuting() { return !this.petPathfinder.noPath() && this.thePet.getDistanceSqToEntity(this.theOwner) > (double) (this.maxDist * this.maxDist) && !this.thePet.isStationary(); } /** * Execute a one shot task or start executing a continuous task */ - public void startExecuting() - { + public void startExecuting() { this.timeToRecalcPath = 0; this.oldWaterCost = this.thePet.getPathPriority(PathNodeType.WATER); this.thePet.setPathPriority(PathNodeType.WATER, 0.0F); @@ -89,15 +78,13 @@ public class EntityAIFollowOwner extends EntityAIBase /** * Resets the task */ - public void resetTask() - { + public void resetTask() { this.theOwner = null; this.petPathfinder.clearPathEntity(); this.thePet.setPathPriority(PathNodeType.WATER, this.oldWaterCost); } - private boolean isEmptyBlock(BlockPos pos) - { + private boolean isEmptyBlock(BlockPos pos) { IBlockState iblockstate = this.theWorld.getBlockState(pos); Block block = iblockstate.getBlock(); return block == Blocks.AIR || !iblockstate.isFullCube(); @@ -106,32 +93,23 @@ public class EntityAIFollowOwner extends EntityAIBase /** * Updates the task */ - public void updateTask() - { + public void updateTask() { this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, (float) this.thePet.getVerticalFaceSpeed()); - if (!this.thePet.isStationary()) - { - if (--this.timeToRecalcPath <= 0) - { + 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.getDistanceSqToEntity(this.theOwner) >= 144.0D) - { + if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.followSpeed)) { + if (!this.thePet.getLeashed()) { + if (this.thePet.getDistanceSqToEntity(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))) - { + 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.clearPathEntity(); return; diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java index 364506fc..3ff28996 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; @@ -12,25 +13,22 @@ import net.minecraft.pathfinding.PathNodeType; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -public class EntityAIGrabEffectsFromOwner extends EntityAIBase -{ +public class EntityAIGrabEffectsFromOwner extends EntityAIBase { + World theWorld; + float minDist; private EntitySentientSpecter thePet; private EntityLivingBase theOwner; - World theWorld; private double followSpeed; private PathNavigate petPathfinder; private int timeToRecalcPath; - float minDist; 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) - { + public EntityAIGrabEffectsFromOwner(EntitySentientSpecter thePetIn, double followSpeedIn, float minDistIn) { this.thePet = thePetIn; this.theWorld = thePetIn.getEntityWorld(); this.followSpeed = followSpeedIn; @@ -38,8 +36,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase this.minDist = minDistIn; this.setMutexBits(3); - if (!(thePetIn.getNavigator() instanceof PathNavigateGround)) - { + if (!(thePetIn.getNavigator() instanceof PathNavigateGround)) { throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); } } @@ -47,27 +44,21 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase /** * Returns whether the EntityAIBase should begin execution. */ - public boolean shouldExecute() - { + public boolean shouldExecute() { EntityLivingBase entitylivingbase = this.thePet.getOwner(); - if (entitylivingbase == null) - { + if (entitylivingbase == null) { return false; - } else if (entitylivingbase instanceof EntityPlayer && ((EntityPlayer) entitylivingbase).isSpectator()) - { + } else if (entitylivingbase instanceof EntityPlayer && ((EntityPlayer) entitylivingbase).isSpectator()) { return false; - } else if (this.thePet.isStationary()) - { + } 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)) - { + } else if (!this.thePet.canStealEffectFromOwner(entitylivingbase)) { return false; - } else - { + } else { this.theOwner = entitylivingbase; return true; } @@ -76,16 +67,14 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase /** * Returns whether an in-progress EntityAIBase should continue executing */ - public boolean continueExecuting() - { + 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() - { + public void startExecuting() { this.timeToRecalcPath = 0; this.oldWaterCost = this.thePet.getPathPriority(PathNodeType.WATER); this.thePet.setPathPriority(PathNodeType.WATER, 0.0F); @@ -94,15 +83,13 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase /** * Resets the task */ - public void resetTask() - { + public void resetTask() { this.theOwner = null; this.petPathfinder.clearPathEntity(); this.thePet.setPathPriority(PathNodeType.WATER, this.oldWaterCost); } - private boolean isEmptyBlock(BlockPos pos) - { + private boolean isEmptyBlock(BlockPos pos) { IBlockState iblockstate = this.theWorld.getBlockState(pos); Block block = iblockstate.getBlock(); return block == Blocks.AIR || !iblockstate.isFullCube(); @@ -111,40 +98,29 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase /** * Updates the task */ - public void updateTask() - { + public void updateTask() { this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, (float) this.thePet.getVerticalFaceSpeed()); - if (this.thePet.getDistanceSqToEntity(theOwner) < this.minDist * this.minDist) - { - if (this.thePet.stealEffectsFromOwner(theOwner)) - { + if (this.thePet.getDistanceSqToEntity(theOwner) < this.minDist * this.minDist) { + if (this.thePet.stealEffectsFromOwner(theOwner)) { return; } } - if (!this.thePet.isStationary()) - { - if (--this.timeToRecalcPath <= 0) - { + 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.getDistanceSqToEntity(this.theOwner) >= 144.0D) - { + if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.followSpeed)) { + if (!this.thePet.getLeashed()) { + if (this.thePet.getDistanceSqToEntity(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))) - { + 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.clearPathEntity(); return; diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java index 061d0bf9..371ed1be 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java @@ -1,28 +1,23 @@ package WayofTime.bloodmagic.entity.ai; -import java.util.UUID; - import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IEntityOwnable; import net.minecraft.entity.ai.EntityAIHurtByTarget; -public class EntityAIHurtByTargetIgnoreTamed extends EntityAIHurtByTarget -{ - public EntityAIHurtByTargetIgnoreTamed(EntityCreature creatureIn, boolean entityCallsForHelpIn, Class... targetClassesIn) - { +import java.util.UUID; + +public class EntityAIHurtByTargetIgnoreTamed extends EntityAIHurtByTarget { + public EntityAIHurtByTargetIgnoreTamed(EntityCreature creatureIn, boolean entityCallsForHelpIn, Class... targetClassesIn) { super(creatureIn, true, targetClassesIn); } @Override - public boolean isSuitableTarget(EntityLivingBase target, boolean includeInvincibles) - { - if (this.taskOwner instanceof IEntityOwnable && target instanceof IEntityOwnable) - { + public boolean isSuitableTarget(EntityLivingBase 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)) - { + if (thisId != null && targetId != null && thisId.equals(targetId)) { return false; } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java index b7e63c30..cf35ee3b 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java @@ -1,31 +1,26 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntityMimic; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.util.math.BlockPos; -import WayofTime.bloodmagic.entity.mob.EntityMimic; -public class EntityAIMimicReform extends EntityAIBase -{ +public class EntityAIMimicReform extends EntityAIBase { private final EntityMimic theEntity; - public EntityAIMimicReform(EntityMimic creatureIn) - { + public EntityAIMimicReform(EntityMimic creatureIn) { this.theEntity = creatureIn; this.setMutexBits(2); } @Override - public boolean shouldExecute() - { + public boolean shouldExecute() { return this.theEntity.ticksExisted > 100 && this.theEntity.hasHome() && this.theEntity.isWithinHomeDistanceCurrentPosition(); } @Override - public void startExecuting() - { + public void startExecuting() { BlockPos homePos = this.theEntity.getHomePosition(); - if (theEntity.reformIntoMimicBlock(homePos)) - { + if (theEntity.reformIntoMimicBlock(homePos)) { this.theEntity.setDead(); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java index 37213741..42bfb5fa 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java @@ -1,17 +1,15 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntityDemonBase; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAITarget; -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -public class EntityAIOwnerHurtByTarget extends EntityAITarget -{ +public class EntityAIOwnerHurtByTarget extends EntityAITarget { EntityDemonBase theDefendingTameable; EntityLivingBase theOwnerAttacker; private int timestamp; - public EntityAIOwnerHurtByTarget(EntityDemonBase theDefendingTameableIn) - { + public EntityAIOwnerHurtByTarget(EntityDemonBase theDefendingTameableIn) { super(theDefendingTameableIn, false); this.theDefendingTameable = theDefendingTameableIn; this.setMutexBits(1); @@ -20,20 +18,15 @@ public class EntityAIOwnerHurtByTarget extends EntityAITarget /** * Returns whether the EntityAIBase should begin execution. */ - public boolean shouldExecute() - { - if (!this.theDefendingTameable.isTamed()) - { + public boolean shouldExecute() { + if (!this.theDefendingTameable.isTamed()) { return false; - } else - { + } else { EntityLivingBase owner = this.theDefendingTameable.getOwner(); - if (owner == null) - { + if (owner == null) { return false; - } else - { + } else { this.theOwnerAttacker = owner.getRevengeTarget(); int i = owner.getRevengeTimer(); return i != this.timestamp && this.isSuitableTarget(this.theOwnerAttacker, false) && this.theDefendingTameable.shouldAttackEntity(this.theOwnerAttacker, owner); @@ -44,13 +37,11 @@ public class EntityAIOwnerHurtByTarget extends EntityAITarget /** * Execute a one shot task or start executing a continuous task */ - public void startExecuting() - { + public void startExecuting() { this.taskOwner.setAttackTarget(this.theOwnerAttacker); EntityLivingBase owner = this.theDefendingTameable.getOwner(); - if (owner != null) - { + if (owner != null) { this.timestamp = owner.getRevengeTimer(); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java index 70980372..20ee7204 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java @@ -1,17 +1,15 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntityDemonBase; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAITarget; -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -public class EntityAIOwnerHurtTarget extends EntityAITarget -{ +public class EntityAIOwnerHurtTarget extends EntityAITarget { EntityDemonBase theEntityDemonBase; EntityLivingBase theTarget; private int timestamp; - public EntityAIOwnerHurtTarget(EntityDemonBase theEntityDemonBaseIn) - { + public EntityAIOwnerHurtTarget(EntityDemonBase theEntityDemonBaseIn) { super(theEntityDemonBaseIn, false); this.theEntityDemonBase = theEntityDemonBaseIn; this.setMutexBits(1); @@ -20,20 +18,15 @@ public class EntityAIOwnerHurtTarget extends EntityAITarget /** * Returns whether the EntityAIBase should begin execution. */ - public boolean shouldExecute() - { - if (!this.theEntityDemonBase.isTamed()) - { + public boolean shouldExecute() { + if (!this.theEntityDemonBase.isTamed()) { return false; - } else - { + } else { EntityLivingBase entitylivingbase = this.theEntityDemonBase.getOwner(); - if (entitylivingbase == null) - { + if (entitylivingbase == null) { return false; - } else - { + } else { this.theTarget = entitylivingbase.getLastAttackedEntity(); int i = entitylivingbase.getLastAttackedEntityTime(); return i != this.timestamp && this.isSuitableTarget(this.theTarget, false) && this.theEntityDemonBase.shouldAttackEntity(this.theTarget, entitylivingbase); @@ -44,13 +37,11 @@ public class EntityAIOwnerHurtTarget extends EntityAITarget /** * Execute a one shot task or start executing a continuous task */ - public void startExecuting() - { + public void startExecuting() { this.taskOwner.setAttackTarget(this.theTarget); EntityLivingBase entitylivingbase = this.theEntityDemonBase.getOwner(); - if (entitylivingbase != null) - { + if (entitylivingbase != null) { this.timestamp = entitylivingbase.getLastAttackedEntityTime(); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java index 427f4ae3..b7e370b4 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java @@ -1,44 +1,46 @@ package WayofTime.bloodmagic.entity.ai; -import java.util.List; - +import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.pathfinding.Path; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.World; -import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; -public class EntityAIPickUpAlly extends EntityAIBase -{ - World worldObj; +import java.util.List; + +public class EntityAIPickUpAlly extends EntityAIBase { + 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; - /** The speed with which the mob will approach the target */ + 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. */ + /** + * The PathEntity of our entity. + */ Path entityPathEntity; private int delayCounter; private double targetX; private double targetY; private double targetZ; - protected final int attackInterval = 20; private int failedPathFindingPenalty = 0; private boolean canPenalize = false; private EntityLivingBase pickupTarget = null; - public EntityAIPickUpAlly(EntityAspectedDemonBase creature, double speedIn, boolean useLongMemory) - { + public EntityAIPickUpAlly(EntityAspectedDemonBase creature, double speedIn, boolean useLongMemory) { this.entity = creature; this.worldObj = creature.getEntityWorld(); this.speedTowardsTarget = speedIn; @@ -49,22 +51,17 @@ public class EntityAIPickUpAlly extends EntityAIBase /** * Returns whether the EntityAIBase should begin execution. */ - public boolean shouldExecute() - { - if (this.entity.getRidingEntity() != null) - { + 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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (EntityLivingBase testEntity : list) - { - if (testEntity != this.entity) - { + for (EntityLivingBase testEntity : list) { + if (testEntity != this.entity) { Path path = this.entity.getNavigator().getPathToEntityLiving(testEntity); - if (path != null) - { + if (path != null) { this.entityPathEntity = path; this.pickupTarget = testEntity; return true; @@ -78,16 +75,14 @@ public class EntityAIPickUpAlly extends EntityAIBase /** * Returns whether an in-progress EntityAIBase should continue executing */ - public boolean continueExecuting() - { + public boolean continueExecuting() { return this.entity.getRidingEntity() != null; } /** * Execute a one shot task or start executing a continuous task */ - public void startExecuting() - { + public void startExecuting() { this.entity.getNavigator().setPath(this.entityPathEntity, this.speedTowardsTarget); this.delayCounter = 0; } @@ -95,8 +90,7 @@ public class EntityAIPickUpAlly extends EntityAIBase /** * Resets the task */ - public void resetTask() - { + public void resetTask() { this.entity.getNavigator().clearPathEntity(); this.pickupTarget = null; } @@ -104,46 +98,38 @@ public class EntityAIPickUpAlly extends EntityAIBase /** * Updates the task */ - public void updateTask() - { + public void updateTask() { EntityLivingBase 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)) - { + 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) - { + if (this.canPenalize) { this.delayCounter += failedPathFindingPenalty; - if (this.entity.getNavigator().getPath() != null) - { + 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 - { + } else { failedPathFindingPenalty += 10; } } - if (d0 > 1024.0D) - { + if (d0 > 1024.0D) { this.delayCounter += 10; - } else if (d0 > 256.0D) - { + } else if (d0 > 256.0D) { this.delayCounter += 5; } - if (!this.entity.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget)) - { + if (!this.entity.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget)) { this.delayCounter += 15; } } @@ -152,19 +138,16 @@ public class EntityAIPickUpAlly extends EntityAIBase this.pickUpEntity(entitylivingbase, d0); } - protected void pickUpEntity(EntityLivingBase potentialPickup, double distance) - { + protected void pickUpEntity(EntityLivingBase potentialPickup, double distance) { double d0 = this.getAttackReachSqr(potentialPickup); - if (distance <= d0 && this.attackTick <= 0 && !potentialPickup.isRiding()) - { + if (distance <= d0 && this.attackTick <= 0 && !potentialPickup.isRiding()) { System.out.println("Hai!"); potentialPickup.startRiding(this.entity, true); } } - protected double getAttackReachSqr(EntityLivingBase attackTarget) - { + protected double getAttackReachSqr(EntityLivingBase 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 index 93e64955..b4012277 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java @@ -1,32 +1,35 @@ package WayofTime.bloodmagic.entity.ai; -import java.util.List; - +import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.World; -import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -public class EntityAIProtectAlly extends EntityAIBase -{ - /** The entity owner of this AITask */ +import java.util.List; + +public class EntityAIProtectAlly extends EntityAIBase { + /** + * The entity owner of this AITask + */ private final EntityCorruptedSheep entity; - /** The world the grass eater entity is eating from */ + /** + * The world the grass eater entity is eating from + */ private final World world; - /** Number of ticks since the entity started to eat grass */ + /** + * Number of ticks since the entity started to eat grass + */ int castTimer; - public EntityAIProtectAlly(EntityCorruptedSheep entity) - { + public EntityAIProtectAlly(EntityCorruptedSheep entity) { this.entity = entity; this.world = entity.getEntityWorld(); this.setMutexBits(7); } - public int getCastTimer() - { + public int getCastTimer() { return this.castTimer; } @@ -34,16 +37,12 @@ public class EntityAIProtectAlly extends EntityAIBase * Returns whether the EntityAIBase should begin execution. */ @Override - public boolean shouldExecute() - { + 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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (EntityLivingBase testEntity : list) - { - if (testEntity != this.entity) - { - if (this.entity.canProtectAlly(testEntity)) - { + for (EntityLivingBase testEntity : list) { + if (testEntity != this.entity) { + if (this.entity.canProtectAlly(testEntity)) { return true; } } @@ -56,8 +55,7 @@ public class EntityAIProtectAlly extends EntityAIBase * Execute a one shot task or start executing a continuous task */ @Override - public void startExecuting() - { + public void startExecuting() { this.castTimer = 100; this.world.setEntityState(this.entity, (byte) 53); this.entity.getNavigator().clearPathEntity(); @@ -67,8 +65,7 @@ public class EntityAIProtectAlly extends EntityAIBase * Resets the task */ @Override - public void resetTask() - { + public void resetTask() { this.castTimer = 0; } @@ -76,8 +73,7 @@ public class EntityAIProtectAlly extends EntityAIBase * Returns whether an in-progress EntityAIBase should continue executing */ @Override - public boolean shouldContinueExecuting() - { + public boolean shouldContinueExecuting() { return castTimer > 0; } @@ -85,19 +81,14 @@ public class EntityAIProtectAlly extends EntityAIBase * Updates the task */ @Override - public void updateTask() - { + public void updateTask() { this.castTimer = Math.max(0, this.castTimer - 1); - if (castTimer == 0) - { + 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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (EntityLivingBase testEntity : list) - { - if (testEntity != this.entity) - { - if (this.entity.applyProtectionToAlly(testEntity)) - { + for (EntityLivingBase testEntity : list) { + if (testEntity != this.entity) { + if (this.entity.applyProtectionToAlly(testEntity)) { return; } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java index 69b30960..f077ac20 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java @@ -1,9 +1,8 @@ package WayofTime.bloodmagic.entity.ai; -import java.util.List; - -import javax.annotation.Nullable; - +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.EntityAIBase; import net.minecraft.entity.ai.RandomPositionGenerator; @@ -11,35 +10,36 @@ import net.minecraft.pathfinding.Path; import net.minecraft.pathfinding.PathNavigate; import net.minecraft.util.EntitySelectors; import net.minecraft.util.math.Vec3d; -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; +import java.util.List; -public class EntityAIRetreatToHeal extends EntityAIBase -{ +public class EntityAIRetreatToHeal extends EntityAIBase { private final Predicate canBeSeenSelector; - /** The entity we are attached to */ + /** + * The entity we are attached to + */ protected EntityDemonBase theEntity; + protected T closestLivingEntity; private double farSpeed; private double nearSpeed; private double safeHealDistance = 3; - protected T closestLivingEntity; private float avoidDistance; - /** The PathEntity of our entity */ + /** + * The PathEntity of our entity + */ private Path entityPathEntity; - /** The PathNavigate of our entity */ + /** + * The PathNavigate of our entity + */ private PathNavigate entityPathNavigate; private Class classToAvoid; private Predicate avoidTargetSelector; - public EntityAIRetreatToHeal(EntityDemonBase theEntityIn, Class classToAvoidIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) - { + 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) - { + 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; @@ -55,32 +55,25 @@ public class EntityAIRetreatToHeal extends EntityAIBase * Returns whether the EntityAIBase should begin execution. */ @Override - public boolean shouldExecute() - { - if (!this.theEntity.shouldEmergencyHeal()) - { + 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(EntitySelectors.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector)); - if (list.isEmpty()) - { + if (list.isEmpty()) { return true; //No entities nearby, so I can freely heal - } else - { + } 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) - { + if (vec3d == null) { return false; //Nowhere to run, gotta fight! - } else if (this.closestLivingEntity.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < this.closestLivingEntity.getDistanceSqToEntity(this.theEntity)) - { + } else if (this.closestLivingEntity.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < this.closestLivingEntity.getDistanceSqToEntity(this.theEntity)) { return false; //I'll be headed off if I choose this direction. - } else - { + } else { this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.x, vec3d.y, vec3d.z); return this.entityPathEntity != null; } @@ -91,8 +84,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase * Returns whether an in-progress EntityAIBase should continue executing */ @Override - public boolean shouldContinueExecuting() - { + public boolean shouldContinueExecuting() { return this.theEntity.shouldEmergencyHeal();//!this.entityPathNavigate.noPath(); } @@ -100,10 +92,8 @@ public class EntityAIRetreatToHeal extends EntityAIBase * Execute a one shot task or start executing a continuous task */ @Override - public void startExecuting() - { - if (this.entityPathEntity != null) - { + public void startExecuting() { + if (this.entityPathEntity != null) { this.entityPathNavigate.setPath(this.entityPathEntity, this.farSpeed); } } @@ -112,8 +102,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase * Resets the task */ @Override - public void resetTask() - { + public void resetTask() { this.closestLivingEntity = null; } @@ -121,33 +110,26 @@ public class EntityAIRetreatToHeal extends EntityAIBase * Updates the task */ @Override - public void updateTask() - { - if (this.closestLivingEntity != null) - { - if (this.theEntity.getDistanceSqToEntity(this.closestLivingEntity) < 49.0D) - { + public void updateTask() { + if (this.closestLivingEntity != null) { + if (this.theEntity.getDistanceSqToEntity(this.closestLivingEntity) < 49.0D) { this.theEntity.getNavigator().setSpeed(this.nearSpeed); - } else - { + } else { this.theEntity.getNavigator().setSpeed(this.farSpeed); } - if (this.theEntity.ticksExisted % 20 == 0 && this.theEntity.getDistanceSqToEntity(this.closestLivingEntity) >= safeHealDistance * safeHealDistance) - { + if (this.theEntity.ticksExisted % 20 == 0 && this.theEntity.getDistanceSqToEntity(this.closestLivingEntity) >= safeHealDistance * safeHealDistance) { healEntity(); return; } } - if (this.theEntity.ticksExisted % 20 == 0) - { + if (this.theEntity.ticksExisted % 20 == 0) { healEntity(); } } - public void 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 index 5f8b5e33..bf7e5540 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java @@ -1,29 +1,32 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.entity.ai.RandomPositionGenerator; import net.minecraft.pathfinding.Path; import net.minecraft.pathfinding.PathNavigate; import net.minecraft.util.math.Vec3d; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -public class EntityAIStealthRetreat extends EntityAIBase -{ - /** The entity we are attached to */ - protected EntityCorruptedChicken entity; +public class EntityAIStealthRetreat extends EntityAIBase { private final double farSpeed; private final double nearSpeed; private final float avoidDistance; - /** The PathEntity of our entity */ - private Path entityPathEntity; - /** The PathNavigate of our entity */ + /** + * The PathNavigate of our entity + */ private final PathNavigate 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) - { + public EntityAIStealthRetreat(EntityCorruptedChicken theEntityIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) { this.entity = theEntityIn; this.avoidDistance = avoidDistanceIn; this.farSpeed = farSpeedIn; @@ -33,26 +36,20 @@ public class EntityAIStealthRetreat extends EntityAIBase } @Override - public boolean shouldExecute() - { - if (this.entity.attackStateMachine == 2) - { + public boolean shouldExecute() { + if (this.entity.attackStateMachine == 2) { EntityLivingBase attacked = this.entity.getAttackTarget(); - if (attacked == null) - { + if (attacked == null) { return false; } Vec3d vec3d = RandomPositionGenerator.findRandomTargetBlockAwayFrom(this.entity, 16, 7, new Vec3d(attacked.posX, attacked.posY, attacked.posZ)); - if (vec3d == null) - { + if (vec3d == null) { return false; - } else if (attacked.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < attacked.getDistanceSqToEntity(this.entity)) - { + } else if (attacked.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < attacked.getDistanceSqToEntity(this.entity)) { return false; - } else - { + } else { this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.x, vec3d.y, vec3d.z); return this.entityPathEntity != null; } @@ -62,10 +59,8 @@ public class EntityAIStealthRetreat extends EntityAIBase } @Override - public boolean shouldContinueExecuting() - { - if (this.entityPathNavigate.noPath()) - { + public boolean shouldContinueExecuting() { + if (this.entityPathNavigate.noPath()) { this.entity.attackStateMachine = 0; return false; } @@ -74,33 +69,27 @@ public class EntityAIStealthRetreat extends EntityAIBase } @Override - public void resetTask() - { + public void resetTask() { ticksLeft = 0; } @Override - public void startExecuting() - { + public void startExecuting() { ticksLeft = this.entity.getEntityWorld().rand.nextInt(100) + 100; this.entityPathNavigate.setPath(this.entityPathEntity, this.farSpeed); } @Override - public void updateTask() - { + public void updateTask() { ticksLeft--; - if (ticksLeft <= 0 || this.entity.getAttackTarget() == null) - { + if (ticksLeft <= 0 || this.entity.getAttackTarget() == null) { this.entity.attackStateMachine = 0; return; } - if (this.entity.getDistanceSqToEntity(this.entity.getAttackTarget()) < 49.0D) - { + if (this.entity.getDistanceSqToEntity(this.entity.getAttackTarget()) < 49.0D) { this.entity.getNavigator().setSpeed(this.nearSpeed); - } else - { + } else { this.entity.getNavigator().setSpeed(this.farSpeed); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java index 11ac1534..74dd9ba6 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java @@ -1,52 +1,43 @@ package WayofTime.bloodmagic.entity.ai; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.entity.ai.RandomPositionGenerator; import net.minecraft.util.math.Vec3d; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -public class EntityAIStealthTowardsTarget extends EntityAIBase -{ +public class EntityAIStealthTowardsTarget extends EntityAIBase { private final EntityCorruptedChicken entity; + private final double speed; private double xPosition; private double yPosition; private double zPosition; - private final double speed; - private int ticksLeft = 0; - public EntityAIStealthTowardsTarget(EntityCorruptedChicken creatureIn, double speedIn) - { + 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) - { + public boolean shouldExecute() { + if (this.entity.attackStateMachine != 0 || this.entity.getAttackTarget() == null) { return false; } EntityLivingBase target = this.entity.getAttackTarget(); Vec3d vec3d = null; - if (target instanceof EntityCreature) - { + if (target instanceof EntityCreature) { vec3d = RandomPositionGenerator.findRandomTarget((EntityCreature) target, 10, 7); - } else - { + } else { vec3d = RandomPositionGenerator.findRandomTarget(this.entity, 10, 7); } - if (vec3d == null) - { + if (vec3d == null) { return false; - } else - { + } else { ticksLeft = this.entity.getEntityWorld().rand.nextInt(200) + 100; this.xPosition = vec3d.x; this.yPosition = vec3d.y; @@ -56,36 +47,29 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase } @Override - public void resetTask() - { + public void resetTask() { ticksLeft = 0; } @Override - public boolean shouldContinueExecuting() - { + public boolean shouldContinueExecuting() { ticksLeft--; - if (ticksLeft <= 0) - { + if (ticksLeft <= 0) { this.entity.attackStateMachine = 1; } this.entity.cloak(); - if (this.entity.getNavigator().noPath()) - { + if (this.entity.getNavigator().noPath()) { EntityLivingBase target = this.entity.getAttackTarget(); Vec3d vec3d; - if (target instanceof EntityCreature) - { + if (target instanceof EntityCreature) { vec3d = RandomPositionGenerator.findRandomTarget((EntityCreature) target, 10, 7); - } else - { + } else { vec3d = RandomPositionGenerator.findRandomTarget(this.entity, 10, 7); } - if (vec3d != null) - { + if (vec3d != null) { this.xPosition = vec3d.x; this.yPosition = vec3d.y; this.zPosition = vec3d.z; @@ -97,8 +81,7 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase } @Override - public void startExecuting() - { + 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 index caeedfd3..69b5ceac 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java @@ -1,5 +1,9 @@ package WayofTime.bloodmagic.entity.mob; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.gson.Serializers; +import com.google.common.base.Predicate; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.nbt.NBTTagCompound; @@ -8,161 +12,139 @@ import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.util.DamageSource; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.gson.Serializers; - -import com.google.common.base.Predicate; import java.util.Locale; -public abstract class EntityAspectedDemonBase extends EntityDemonBase -{ +public abstract class EntityAspectedDemonBase extends EntityDemonBase { protected static final DataParameter TYPE = EntityDataManager.createKey(EntityAspectedDemonBase.class, Serializers.WILL_TYPE_SERIALIZER); - public EntityAspectedDemonBase(World worldIn) - { + public EntityAspectedDemonBase(World worldIn) { super(worldIn); } @Override - protected void entityInit() - { + protected void entityInit() { super.entityInit(); this.dataManager.register(TYPE, EnumDemonWillType.DEFAULT); } - public double getMeleeResist() - { + public double getMeleeResist() { return 0; } - public double getProjectileResist() - { + public double getProjectileResist() { return 0; } - public double getMagicResist() - { + public double getMagicResist() { return 0; } - public double getBaseHP(EnumDemonWillType type) - { + 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; + 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) - { + 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; + 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) - { + 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; + 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) - { + 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; + 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) - { + 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; + 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) - { + 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)); @@ -170,24 +152,18 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase } @Override - public boolean attackEntityFrom(DamageSource source, float amount) - { - if (this.isEntityInvulnerable(source)) - { + public boolean attackEntityFrom(DamageSource source, float amount) { + if (this.isEntityInvulnerable(source)) { return false; - } else - { + } else { float newAmount = amount; - if (source.isProjectile()) - { + if (source.isProjectile()) { newAmount *= MathHelper.clamp(1 - getProjectileResist(), 0, 1); - } else - { + } else { newAmount *= MathHelper.clamp(1 - getMeleeResist(), 0, 1); } - if (source.isMagicDamage()) - { + if (source.isMagicDamage()) { newAmount *= MathHelper.clamp(1 - getMagicResist(), 0, 1); } @@ -195,83 +171,47 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase } } - public EnumDemonWillType getType() - { + public EnumDemonWillType getType() { return this.dataManager.get(TYPE); } - public void setType(EnumDemonWillType type) - { + public void setType(EnumDemonWillType type) { this.dataManager.set(TYPE, type); this.applyEntityAttributes(type); this.setCombatTask(); } @Override - public void writeEntityToNBT(NBTTagCompound tag) - { + public void writeEntityToNBT(NBTTagCompound tag) { super.writeEntityToNBT(tag); tag.setString(Constants.NBT.WILL_TYPE, this.getType().toString()); } @Override - public void readEntityFromNBT(NBTTagCompound tag) - { + public void readEntityFromNBT(NBTTagCompound tag) { super.readEntityFromNBT(tag); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { setType(EnumDemonWillType.DEFAULT); - } else - { + } else { setType(EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH))); } } - 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(EntityLivingBase input) - { - if (input instanceof EntityAspectedDemonBase) - { - if (((EntityAspectedDemonBase) input).getType() == demon.getType()) - { - return false; - } - } - - return input != null; - } - } - //Returns true if the inputted mob is on the same team. - public static class WillTypePredicate implements Predicate - { + public static class WillTypePredicate implements Predicate { private final EnumDemonWillType type; - public WillTypePredicate(EnumDemonWillType type) - { + public WillTypePredicate(EnumDemonWillType type) { this.type = type; } //Returns true if this mob is the same type. @Override - public boolean apply(EntityLivingBase input) - { - if (input instanceof EntityAspectedDemonBase) - { - if (((EntityAspectedDemonBase) input).getType() == type) - { + public boolean apply(EntityLivingBase input) { + if (input instanceof EntityAspectedDemonBase) { + if (((EntityAspectedDemonBase) input).getType() == type) { return true; } } @@ -279,4 +219,24 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase 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(EntityLivingBase 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 index 77058576..ca6ec8be 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.entity.mob; +import WayofTime.bloodmagic.api.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.EntityLivingBase; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.ai.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.init.MobEffects; @@ -19,24 +19,18 @@ import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.entity.ai.EntityAIAttackStealthMelee; -import WayofTime.bloodmagic.entity.ai.EntityAIStealthRetreat; -import WayofTime.bloodmagic.entity.ai.EntityAIStealthTowardsTarget; -public class EntityCorruptedChicken extends EntityAspectedDemonBase -{ - private EntityAIAttackStealthMelee aiAttackOnCollide; +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. */ + /** + * 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 @@ -45,14 +39,13 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase * state 0. */ public int attackStateMachine = 0; + private EntityAIAttackStealthMelee aiAttackOnCollide; - public EntityCorruptedChicken(World world) - { + public EntityCorruptedChicken(World world) { this(world, EnumDemonWillType.DEFAULT); } - public EntityCorruptedChicken(World world, EnumDemonWillType type) - { + public EntityCorruptedChicken(World world, EnumDemonWillType type) { super(world); this.setSize(0.4F, 0.7F); this.timeUntilNextEgg = this.rand.nextInt(600) + 600; @@ -61,8 +54,7 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase this.setType(type); } - protected void initEntityAI() - { + protected void initEntityAI() { this.tasks.addTask(0, new EntityAISwimming(this)); // this.tasks.addTask(1, new EntityAIPanic(this, 1.4D)); this.tasks.addTask(attackPriority, new EntityAIStealthTowardsTarget(this, 1)); @@ -76,10 +68,8 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase } @Override - public void setCombatTask() - { - if (aiAttackOnCollide != null) - { + public void setCombatTask() { + if (aiAttackOnCollide != null) { this.tasks.removeTask(aiAttackOnCollide); } @@ -87,50 +77,42 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase this.tasks.addTask(attackPriority, aiAttackOnCollide); } - public void cloak() - { + public void cloak() { this.addPotionEffect(new PotionEffect(MobEffects.INVISIBILITY, 50, 0, false, false)); } @Override - public double getBaseHP(EnumDemonWillType type) - { + public double getBaseHP(EnumDemonWillType type) { return super.getBaseHP(type) * 0.5; } @Override - public double getBaseMeleeDamage(EnumDemonWillType type) - { + public double getBaseMeleeDamage(EnumDemonWillType type) { return super.getBaseMeleeDamage(type) * 2.5; } @Override - public double getBaseSpeed(EnumDemonWillType type) - { + public double getBaseSpeed(EnumDemonWillType type) { return super.getBaseSpeed(type); } @Override - public double getBaseSprintModifier(EnumDemonWillType type) - { + public double getBaseSprintModifier(EnumDemonWillType type) { return super.getBaseSprintModifier(type); } @Override - public double getBaseKnockbackResist(EnumDemonWillType type) - { + public double getBaseKnockbackResist(EnumDemonWillType type) { return super.getBaseKnockbackResist(type); } @Override - public float getEyeHeight() - { + public float getEyeHeight() { return this.height; } @Override - public void onLivingUpdate() - { + public void onLivingUpdate() { super.onLivingUpdate(); // if (!worldObj.isRemote) @@ -141,22 +123,19 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase 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) - { + 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) - { + 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) - { + 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; @@ -164,61 +143,51 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase } @Override - public void fall(float distance, float damageMultiplier) - { + public void fall(float distance, float damageMultiplier) { } @Override - protected SoundEvent getAmbientSound() - { + protected SoundEvent getAmbientSound() { return SoundEvents.ENTITY_CHICKEN_AMBIENT; } @Override - protected SoundEvent getHurtSound() - { + protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_CHICKEN_HURT; } @Override - protected SoundEvent getDeathSound() - { + protected SoundEvent getDeathSound() { return SoundEvents.ENTITY_CHICKEN_DEATH; } @Override - protected float getSoundPitch() - { + protected float getSoundPitch() { return super.getSoundPitch() * 0.5f; } @Override - protected void playStepSound(BlockPos pos, Block blockIn) - { + protected void playStepSound(BlockPos pos, Block blockIn) { this.playSound(SoundEvents.ENTITY_CHICKEN_STEP, 0.15F, 1.0F); } @Override - public void readEntityFromNBT(NBTTagCompound compound) - { + public void readEntityFromNBT(NBTTagCompound compound) { super.readEntityFromNBT(compound); - if (compound.hasKey("EggLayTime")) - { + if (compound.hasKey("EggLayTime")) { this.timeUntilNextEgg = compound.getInteger("EggLayTime"); } } @Override - public void writeEntityToNBT(NBTTagCompound compound) - { + public void writeEntityToNBT(NBTTagCompound compound) { super.writeEntityToNBT(compound); compound.setInteger("EggLayTime", this.timeUntilNextEgg); } @Override - public void updatePassenger(Entity passenger) - { + public void updatePassenger(Entity passenger) { super.updatePassenger(passenger); float f = MathHelper.sin(this.renderYawOffset * 0.017453292F); float f1 = MathHelper.cos(this.renderYawOffset * 0.017453292F); @@ -226,8 +195,7 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase 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 EntityLivingBase) - { + if (passenger instanceof EntityLivingBase) { ((EntityLivingBase) 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 index b9e3e3c0..cf128414 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java @@ -1,20 +1,13 @@ package WayofTime.bloodmagic.entity.mob; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.api.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.EntityLivingBase; import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.ai.EntityAIAttackMelee; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.ai.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; @@ -35,53 +28,61 @@ import net.minecraft.world.World; import net.minecraftforge.common.IShearable; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.entity.ai.EntityAIEatAndCorruptBlock; -import WayofTime.bloodmagic.entity.ai.EntityAIProtectAlly; -import com.google.common.collect.Maps; +import javax.annotation.Nullable; +import java.util.List; +import java.util.Map; +import java.util.Random; -public class EntityCorruptedSheep extends EntityAspectedDemonBase implements IShearable -{ +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(EnumDyeColor.class); + public static int maxProtectionCooldown = 90 * 20; //90 second cooldown + + static { + DYE_TO_RGB.put(EnumDyeColor.WHITE, new float[]{1.0F, 1.0F, 1.0F}); + DYE_TO_RGB.put(EnumDyeColor.ORANGE, new float[]{0.85F, 0.5F, 0.2F}); + DYE_TO_RGB.put(EnumDyeColor.MAGENTA, new float[]{0.7F, 0.3F, 0.85F}); + DYE_TO_RGB.put(EnumDyeColor.LIGHT_BLUE, new float[]{0.4F, 0.6F, 0.85F}); + DYE_TO_RGB.put(EnumDyeColor.YELLOW, new float[]{0.9F, 0.9F, 0.2F}); + DYE_TO_RGB.put(EnumDyeColor.LIME, new float[]{0.5F, 0.8F, 0.1F}); + DYE_TO_RGB.put(EnumDyeColor.PINK, new float[]{0.95F, 0.5F, 0.65F}); + DYE_TO_RGB.put(EnumDyeColor.GRAY, new float[]{0.3F, 0.3F, 0.3F}); + DYE_TO_RGB.put(EnumDyeColor.SILVER, new float[]{0.6F, 0.6F, 0.6F}); + DYE_TO_RGB.put(EnumDyeColor.CYAN, new float[]{0.3F, 0.5F, 0.6F}); + DYE_TO_RGB.put(EnumDyeColor.PURPLE, new float[]{0.5F, 0.25F, 0.7F}); + DYE_TO_RGB.put(EnumDyeColor.BLUE, new float[]{0.2F, 0.3F, 0.7F}); + DYE_TO_RGB.put(EnumDyeColor.BROWN, new float[]{0.4F, 0.3F, 0.2F}); + DYE_TO_RGB.put(EnumDyeColor.GREEN, new float[]{0.4F, 0.5F, 0.2F}); + DYE_TO_RGB.put(EnumDyeColor.RED, new float[]{0.6F, 0.2F, 0.2F}); + DYE_TO_RGB.put(EnumDyeColor.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 EntityAIAttackMelee aiAttackOnCollide; - private final int attackPriority = 3; - - public int protectionCooldown = 0; - public static int maxProtectionCooldown = 90 * 20; //90 second cooldown - - public static float[] getDyeRgb(EnumDyeColor dyeColor) - { - return DYE_TO_RGB.get(dyeColor); - } - - public EntityCorruptedSheep(World world) - { + public EntityCorruptedSheep(World world) { this(world, EnumDemonWillType.DEFAULT); } - public EntityCorruptedSheep(World world, EnumDemonWillType type) - { + public EntityCorruptedSheep(World world, EnumDemonWillType type) { super(world); this.setSize(0.9F, 1.3F); this.setType(type); } - protected void initEntityAI() - { + protected void initEntityAI() { this.entityAIEatGrass = new EntityAIEatAndCorruptBlock(this); this.entityAIProtectAlly = new EntityAIProtectAlly(this); @@ -97,10 +98,8 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh } @Override - public void setCombatTask() - { - if (aiAttackOnCollide != null) - { + public void setCombatTask() { + if (aiAttackOnCollide != null) { this.tasks.removeTask(aiAttackOnCollide); } @@ -109,22 +108,18 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh } @Override - protected void updateAITasks() - { + protected void updateAITasks() { this.sheepTimer = this.entityAIEatGrass.getEatingGrassTimer(); this.castTimer = this.entityAIProtectAlly.getCastTimer(); super.updateAITasks(); } @Override - public void onLivingUpdate() - { - if (this.getEntityWorld().isRemote) - { + 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) - { + if (this.castTimer == 70) { this.playSound(this.getHurtSound(), this.getSoundVolume() * 2, this.getSoundPitch()); } } @@ -134,15 +129,12 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh super.onLivingUpdate(); } - public boolean canProtectAlly(EntityLivingBase entity) - { + public boolean canProtectAlly(EntityLivingBase entity) { return this.protectionCooldown <= 0 && entity.getHealth() < entity.getMaxHealth() && !entity.isPotionActive(MobEffects.RESISTANCE); } - public boolean applyProtectionToAlly(EntityLivingBase entity) - { - if (canProtectAlly(entity)) - { + public boolean applyProtectionToAlly(EntityLivingBase entity) { + if (canProtectAlly(entity)) { entity.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, 20 * 20, 3)); this.protectionCooldown = maxProtectionCooldown; } @@ -151,92 +143,75 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh } @Override - public double getBaseHP(EnumDemonWillType type) - { + public double getBaseHP(EnumDemonWillType type) { return super.getBaseHP(type) * 0.75; } @Override - public double getBaseMeleeDamage(EnumDemonWillType type) - { + public double getBaseMeleeDamage(EnumDemonWillType type) { return super.getBaseMeleeDamage(type) * 0.75; } @Override - public double getBaseSpeed(EnumDemonWillType type) - { + public double getBaseSpeed(EnumDemonWillType type) { return super.getBaseSpeed(type); } @Override - public double getBaseSprintModifier(EnumDemonWillType type) - { + public double getBaseSprintModifier(EnumDemonWillType type) { return super.getBaseSprintModifier(type); } @Override - public double getBaseKnockbackResist(EnumDemonWillType type) - { + public double getBaseKnockbackResist(EnumDemonWillType type) { return super.getBaseKnockbackResist(type) + 0.2; } @Override - public double getMeleeResist() - { + public double getMeleeResist() { return 0.2; } @Override - public double getProjectileResist() - { + public double getProjectileResist() { return 0.6; } @Override - protected void entityInit() - { + protected void entityInit() { super.entityInit(); this.dataManager.register(DYE_COLOR, Byte.valueOf((byte) 0)); } @Override @SideOnly(Side.CLIENT) - public void handleStatusUpdate(byte id) - { - if (id == 10) - { + public void handleStatusUpdate(byte id) { + if (id == 10) { this.sheepTimer = 40; - } else if (id == 53) - { + } else if (id == 53) { this.castTimer = 100; - } else - { + } else { super.handleStatusUpdate(id); } } @SideOnly(Side.CLIENT) - public float getHeadRotationPointY(float partialTick) - { + 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) - { + 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 - { + } else { return this.sheepTimer > 0 ? ((float) Math.PI / 5F) : this.rotationPitch * 0.017453292F; } } @Override - public void writeEntityToNBT(NBTTagCompound tag) - { + public void writeEntityToNBT(NBTTagCompound tag) { super.writeEntityToNBT(tag); tag.setBoolean("Sheared", this.getSheared()); tag.setByte("Color", (byte) this.getFleeceColor().getMetadata()); @@ -244,8 +219,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh } @Override - public void readEntityFromNBT(NBTTagCompound tag) - { + public void readEntityFromNBT(NBTTagCompound tag) { super.readEntityFromNBT(tag); this.setSheared(tag.getBoolean("Sheared")); this.setFleeceColor(EnumDyeColor.byMetadata(tag.getByte("Color"))); @@ -253,48 +227,41 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh } @Override - protected SoundEvent getAmbientSound() - { + protected SoundEvent getAmbientSound() { return SoundEvents.ENTITY_SHEEP_AMBIENT; } @Override - protected SoundEvent getHurtSound() - { + protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_SHEEP_HURT; } @Override - protected SoundEvent getDeathSound() - { + protected SoundEvent getDeathSound() { return SoundEvents.ENTITY_SHEEP_DEATH; } @Override - protected float getSoundPitch() - { + protected float getSoundPitch() { return super.getSoundPitch() * 0.5f; } @Override - protected void playStepSound(BlockPos pos, Block blockIn) - { + 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 EnumDyeColor getFleeceColor() - { + public EnumDyeColor getFleeceColor() { return EnumDyeColor.byMetadata(this.dataManager.get(DYE_COLOR).byteValue() & 15); } /** * Sets the wool color of this sheep */ - public void setFleeceColor(EnumDyeColor color) - { + public void setFleeceColor(EnumDyeColor color) { byte b0 = this.dataManager.get(DYE_COLOR).byteValue(); this.dataManager.set(DYE_COLOR, Byte.valueOf((byte) (b0 & 240 | color.getMetadata() & 15))); } @@ -302,48 +269,33 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh /** * returns true if a sheeps wool has been sheared */ - public boolean getSheared() - { + public boolean getSheared() { return (this.dataManager.get(DYE_COLOR).byteValue() & 16) != 0; } /** * make a sheep sheared if set to true */ - public void setSheared(boolean sheared) - { + public void setSheared(boolean sheared) { byte b0 = this.dataManager.get(DYE_COLOR).byteValue(); - if (sheared) - { + if (sheared) { this.dataManager.set(DYE_COLOR, Byte.valueOf((byte) (b0 | 16))); - } else - { + } else { this.dataManager.set(DYE_COLOR, Byte.valueOf((byte) (b0 & -17))); } } - /** - * Chooses a "vanilla" sheep color based on the provided random. - */ - public static EnumDyeColor getRandomSheepColor(Random random) - { - int i = random.nextInt(100); - return i < 5 ? EnumDyeColor.BLACK : (i < 10 ? EnumDyeColor.GRAY : (i < 15 ? EnumDyeColor.SILVER : (i < 18 ? EnumDyeColor.BROWN : (random.nextInt(500) == 0 ? EnumDyeColor.PINK : EnumDyeColor.WHITE)))); - } - /** * 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() - { + public void eatGrassBonus() { this.setSheared(false); - if (this.isChild()) - { + if (this.isChild()) { this.heal(3); } } @@ -354,48 +306,24 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh * from nbt. Mainly used for initializing attributes and inventory */ @Override - public IEntityLivingData onInitialSpawn(DifficultyInstance difficulty, @Nullable IEntityLivingData livingdata) - { + public IEntityLivingData onInitialSpawn(DifficultyInstance difficulty, @Nullable IEntityLivingData livingdata) { livingdata = super.onInitialSpawn(difficulty, livingdata); this.setFleeceColor(getRandomSheepColor(this.getEntityWorld().rand)); return livingdata; } @Override - public float getEyeHeight() - { + public float getEyeHeight() { return 0.95F * this.height; } - static - { - DYE_TO_RGB.put(EnumDyeColor.WHITE, new float[] { 1.0F, 1.0F, 1.0F }); - DYE_TO_RGB.put(EnumDyeColor.ORANGE, new float[] { 0.85F, 0.5F, 0.2F }); - DYE_TO_RGB.put(EnumDyeColor.MAGENTA, new float[] { 0.7F, 0.3F, 0.85F }); - DYE_TO_RGB.put(EnumDyeColor.LIGHT_BLUE, new float[] { 0.4F, 0.6F, 0.85F }); - DYE_TO_RGB.put(EnumDyeColor.YELLOW, new float[] { 0.9F, 0.9F, 0.2F }); - DYE_TO_RGB.put(EnumDyeColor.LIME, new float[] { 0.5F, 0.8F, 0.1F }); - DYE_TO_RGB.put(EnumDyeColor.PINK, new float[] { 0.95F, 0.5F, 0.65F }); - DYE_TO_RGB.put(EnumDyeColor.GRAY, new float[] { 0.3F, 0.3F, 0.3F }); - DYE_TO_RGB.put(EnumDyeColor.SILVER, new float[] { 0.6F, 0.6F, 0.6F }); - DYE_TO_RGB.put(EnumDyeColor.CYAN, new float[] { 0.3F, 0.5F, 0.6F }); - DYE_TO_RGB.put(EnumDyeColor.PURPLE, new float[] { 0.5F, 0.25F, 0.7F }); - DYE_TO_RGB.put(EnumDyeColor.BLUE, new float[] { 0.2F, 0.3F, 0.7F }); - DYE_TO_RGB.put(EnumDyeColor.BROWN, new float[] { 0.4F, 0.3F, 0.2F }); - DYE_TO_RGB.put(EnumDyeColor.GREEN, new float[] { 0.4F, 0.5F, 0.2F }); - DYE_TO_RGB.put(EnumDyeColor.RED, new float[] { 0.6F, 0.2F, 0.2F }); - DYE_TO_RGB.put(EnumDyeColor.BLACK, new float[] { 0.1F, 0.1F, 0.1F }); - } - @Override - public boolean isShearable(ItemStack item, net.minecraft.world.IBlockAccess world, BlockPos pos) - { + 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) - { + public List onSheared(ItemStack item, net.minecraft.world.IBlockAccess world, BlockPos pos, int fortune) { this.setSheared(true); int i = 1 + this.rand.nextInt(3); @@ -410,4 +338,16 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh public int getCastTimer() { return castTimer; } + + public static float[] getDyeRgb(EnumDyeColor dyeColor) { + return DYE_TO_RGB.get(dyeColor); + } + + /** + * Chooses a "vanilla" sheep color based on the provided random. + */ + public static EnumDyeColor getRandomSheepColor(Random random) { + int i = random.nextInt(100); + return i < 5 ? EnumDyeColor.BLACK : (i < 10 ? EnumDyeColor.GRAY : (i < 15 ? EnumDyeColor.SILVER : (i < 18 ? EnumDyeColor.BROWN : (random.nextInt(500) == 0 ? EnumDyeColor.PINK : EnumDyeColor.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 index 05957123..5e8c75b0 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java @@ -1,16 +1,11 @@ package WayofTime.bloodmagic.entity.mob; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.entity.ai.EntityAIPickUpAlly; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.ai.EntityAIAttackMelee; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILeapAtTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.ai.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.init.SoundEvents; @@ -23,28 +18,22 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.entity.ai.EntityAIPickUpAlly; -public class EntityCorruptedSpider extends EntityAspectedDemonBase -{ +public class EntityCorruptedSpider extends EntityAspectedDemonBase { private static final DataParameter CLIMBING = EntityDataManager.createKey(EntityCorruptedSpider.class, DataSerializers.BYTE); - public EntityCorruptedSpider(World world) - { + public EntityCorruptedSpider(World world) { this(world, EnumDemonWillType.DEFAULT); } - public EntityCorruptedSpider(World world, EnumDemonWillType type) - { + public EntityCorruptedSpider(World world, EnumDemonWillType type) { super(world); this.setSize(1.4F, 0.9F); this.setType(type); } - protected void initEntityAI() - { + protected void initEntityAI() { this.tasks.addTask(1, new EntityAISwimming(this)); this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); this.tasks.addTask(3, new EntityAIPickUpAlly(this, 1, true)); @@ -59,132 +48,109 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase } @Override - public double getBaseHP(EnumDemonWillType type) - { + public double getBaseHP(EnumDemonWillType type) { return super.getBaseHP(type); } @Override - public double getBaseMeleeDamage(EnumDemonWillType type) - { + public double getBaseMeleeDamage(EnumDemonWillType type) { return super.getBaseMeleeDamage(type); } @Override - public double getBaseSpeed(EnumDemonWillType type) - { + public double getBaseSpeed(EnumDemonWillType type) { return super.getBaseSpeed(type); } @Override - public double getBaseSprintModifier(EnumDemonWillType type) - { + public double getBaseSprintModifier(EnumDemonWillType type) { return super.getBaseSprintModifier(type); } @Override - public double getBaseKnockbackResist(EnumDemonWillType type) - { + public double getBaseKnockbackResist(EnumDemonWillType type) { return super.getBaseKnockbackResist(type); } @Override - public double getMountedYOffset() - { + public double getMountedYOffset() { return (double) (this.height * 0.5F); } @Override - protected PathNavigate createNavigator(World worldIn) - { + protected PathNavigate createNavigator(World worldIn) { return new PathNavigateClimber(this, worldIn); } @Override - protected void entityInit() - { + protected void entityInit() { super.entityInit(); this.dataManager.register(CLIMBING, (byte) 0); } @Override - public void onUpdate() - { + public void onUpdate() { super.onUpdate(); - if (!this.getEntityWorld().isRemote) - { + if (!this.getEntityWorld().isRemote) { this.setBesideClimbableBlock(this.isCollidedHorizontally); } } @Override - protected SoundEvent getAmbientSound() - { + protected SoundEvent getAmbientSound() { return SoundEvents.ENTITY_SPIDER_AMBIENT; } @Override - protected SoundEvent getHurtSound() - { + protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_SPIDER_HURT; } @Override - protected SoundEvent getDeathSound() - { + protected SoundEvent getDeathSound() { return SoundEvents.ENTITY_SPIDER_DEATH; } @Override - protected float getSoundPitch() - { + protected float getSoundPitch() { return super.getSoundPitch() * 0.5f; } @Override - protected void playStepSound(BlockPos pos, Block blockIn) - { + protected void playStepSound(BlockPos pos, Block blockIn) { this.playSound(SoundEvents.ENTITY_SPIDER_STEP, 0.15F, 1.0F); } @Override - public boolean isOnLadder() - { + public boolean isOnLadder() { return this.isBesideClimbableBlock(); } @Override - public void setInWeb() - { + public void setInWeb() { } @Override - public EnumCreatureAttribute getCreatureAttribute() - { + public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.ARTHROPOD; } @Override - public boolean isPotionApplicable(PotionEffect potioneffectIn) - { + public boolean isPotionApplicable(PotionEffect potioneffectIn) { return potioneffectIn.getPotion() != MobEffects.POISON && super.isPotionApplicable(potioneffectIn); } - public boolean isBesideClimbableBlock() - { + public boolean isBesideClimbableBlock() { return (this.dataManager.get(CLIMBING) & 1) != 0; } - public void setBesideClimbableBlock(boolean climbing) - { + public void setBesideClimbableBlock(boolean climbing) { byte b0 = this.dataManager.get(CLIMBING); - if (climbing) - { + if (climbing) { b0 = (byte) (b0 | 1); - } else - { + } else { b0 = (byte) (b0 & -2); } @@ -192,53 +158,43 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase } @Override - public float getEyeHeight() - { + public float getEyeHeight() { return 0.65F; } - static class AISpiderAttack extends EntityAIAttackMelee - { - public AISpiderAttack(EntityCorruptedSpider spider) - { + static class AISpiderAttack extends EntityAIAttackMelee { + public AISpiderAttack(EntityCorruptedSpider spider) { super(spider, 1.0D, true); } /** * Returns whether an in-progress EntityAIBase should continue executing */ - public boolean shouldContinueExecuting() - { + public boolean shouldContinueExecuting() { float f = this.attacker.getBrightness(); - if (f >= 0.5F && this.attacker.getRNG().nextInt(100) == 0) - { + if (f >= 0.5F && this.attacker.getRNG().nextInt(100) == 0) { this.attacker.setAttackTarget(null); return false; - } else - { + } else { return super.shouldContinueExecuting(); } } - protected double getAttackReachSqr(EntityLivingBase attackTarget) - { + protected double getAttackReachSqr(EntityLivingBase attackTarget) { return (double) (4.0F + attackTarget.width); } } - static class AISpiderTarget extends EntityAINearestAttackableTarget - { - public AISpiderTarget(EntityCorruptedSpider spider, Class classTarget) - { + static class AISpiderTarget extends EntityAINearestAttackableTarget { + public AISpiderTarget(EntityCorruptedSpider spider, Class classTarget) { super(spider, classTarget, true); } /** * Returns whether the EntityAIBase should begin execution. */ - public boolean shouldExecute() - { + public boolean shouldExecute() { float f = this.taskOwner.getBrightness(); return !(f >= 0.5F) && super.shouldExecute(); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java index 3e96d17b..f9927f48 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java @@ -1,18 +1,12 @@ 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.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackMelee; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIMoveThroughVillage; -import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.ai.*; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntityGhast; import net.minecraft.entity.monster.EntityIronGolem; @@ -27,18 +21,14 @@ import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.ai.EntityAIAttackRangedBow; -public class EntityCorruptedZombie extends EntityAspectedDemonBase -{ +public class EntityCorruptedZombie extends EntityAspectedDemonBase { private final EntityAIAttackRangedBow aiArrowAttack = new EntityAIAttackRangedBow(this, 1.0D, 20, 15.0F); private final EntityAIAttackMelee aiAttackOnCollide = new EntityAIAttackMelee(this, 1.0D, false); private final int attackPriority = 3; - public EntityCorruptedZombie(World worldIn) - { + public EntityCorruptedZombie(World worldIn) { super(worldIn); this.setSize(0.6F, 1.95F); // ((PathNavigateGround) getNavigator()).setCanSwim(false); @@ -60,8 +50,7 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase } @Override - protected void applyEntityAttributes() - { + protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.FOLLOW_RANGE).setBaseValue(35.0D); getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(40.0D); @@ -71,35 +60,29 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase } @Override - public void setCombatTask() - { - if (!this.getEntityWorld().isRemote) - { + 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 ItemBow) - { + if (!itemstack.isEmpty() && itemstack.getItem() instanceof ItemBow) { int i = 20; - if (this.getEntityWorld().getDifficulty() != EnumDifficulty.HARD) - { + if (this.getEntityWorld().getDifficulty() != EnumDifficulty.HARD) { i = 40; } this.aiArrowAttack.setAttackCooldown(i); this.tasks.addTask(attackPriority, this.aiArrowAttack); - } else - { + } else { this.tasks.addTask(attackPriority, this.aiAttackOnCollide); } } } @Override - public boolean attackEntityFrom(DamageSource source, float amount) - { + public boolean attackEntityFrom(DamageSource source, float amount) { return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); } @@ -107,17 +90,14 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase * Redone from EntityMob to prevent despawning on peaceful. */ @Override - public boolean attackEntityAsMob(Entity attackedEntity) - { + public boolean attackEntityAsMob(Entity attackedEntity) { boolean flag = super.attackEntityAsMob(attackedEntity); - if (flag) - { + if (flag) { //EMPTY return true; - } else - { + } else { return false; } } @@ -126,24 +106,20 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase * @param toHeal * @return Amount of Will consumed from the Aura to heal */ - public double absorbWillFromAuraToHeal(double toHeal) - { - if (getEntityWorld().isRemote) - { + public double absorbWillFromAuraToHeal(double toHeal) { + if (getEntityWorld().isRemote) { return 0; } double healthMissing = this.getMaxHealth() - this.getHealth(); - if (healthMissing <= 0) - { + if (healthMissing <= 0) { return 0; } double will = WorldDemonWillHandler.getCurrentWill(getEntityWorld(), getPosition(), getType()); toHeal = Math.min(healthMissing, Math.min(toHeal, will / getWillToHealth())); - if (toHeal > 0) - { + if (toHeal > 0) { this.heal((float) toHeal); return WorldDemonWillHandler.drainWill(getEntityWorld(), getPosition(), getType(), toHeal * getWillToHealth(), true); } @@ -151,21 +127,17 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase return 0; } - public double getWillToHealth() - { + public double getWillToHealth() { return 2; } @Override - protected boolean canDespawn() - { + protected boolean canDespawn() { return !this.isTamed() && super.canDespawn(); } - public void onUpdate() - { - if (!this.getEntityWorld().isRemote && this.ticksExisted % 20 == 0) - { + public void onUpdate() { + if (!this.getEntityWorld().isRemote && this.ticksExisted % 20 == 0) { absorbWillFromAuraToHeal(2); } @@ -179,32 +151,27 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase } @Override - protected float getSoundPitch() - { + protected float getSoundPitch() { return super.getSoundPitch() * 0.5f; } @Override - protected SoundEvent getAmbientSound() - { + protected SoundEvent getAmbientSound() { return SoundEvents.ENTITY_ZOMBIE_AMBIENT; } @Override - protected SoundEvent getHurtSound() - { + protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_ZOMBIE_HURT; } @Override - protected SoundEvent getDeathSound() - { + protected SoundEvent getDeathSound() { return SoundEvents.ENTITY_ZOMBIE_DEATH; } @Override - protected void playStepSound(BlockPos pos, Block block) - { + protected void playStepSound(BlockPos pos, Block block) { this.playSound(SoundEvents.ENTITY_ZOMBIE_STEP, 0.15F, 1.0F); } @@ -212,8 +179,7 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase * Returns the volume for the sounds this mob makes. */ @Override - protected float getSoundVolume() - { + 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 index 0aad0e12..2df10d5e 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java @@ -1,14 +1,10 @@ package WayofTime.bloodmagic.entity.mob; -import java.util.UUID; - +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.Entity; -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityOwnable; -import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.*; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntityGhast; import net.minecraft.entity.monster.EntityMob; @@ -34,58 +30,48 @@ import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraft.world.WorldServer; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; - import javax.annotation.Nullable; +import java.util.UUID; -public class EntityDemonBase extends EntityCreature implements IEntityOwnable -{ +public class EntityDemonBase extends EntityCreature 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) - { + public EntityDemonBase(World worldIn) { super(worldIn); } @Override - protected void entityInit() - { + protected void entityInit() { super.entityInit(); this.dataManager.register(TAMED, (byte) 0); this.dataManager.register(OWNER_UNIQUE_ID, Optional.absent()); } @Override - protected void applyEntityAttributes() - { + protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getAttributeMap().registerAttribute(SharedMonsterAttributes.ATTACK_DAMAGE); } - public void setCombatTask() - { + public void setCombatTask() { } @Override - public boolean isPotionApplicable(PotionEffect effect) - { + public boolean isPotionApplicable(PotionEffect effect) { return super.isPotionApplicable(effect); } @Override - public void onLivingUpdate() - { + public void onLivingUpdate() { this.updateArmSwingProgress(); super.onLivingUpdate(); } @Override - public boolean attackEntityFrom(DamageSource source, float amount) - { + public boolean attackEntityFrom(DamageSource source, float amount) { return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); } @@ -93,23 +79,19 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable * Redone from EntityMob to prevent despawning on peaceful. */ @Override - public boolean attackEntityAsMob(Entity attackedEntity) - { + public boolean attackEntityAsMob(Entity attackedEntity) { float f = (float) this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getAttributeValue(); int i = 0; - if (attackedEntity instanceof EntityLivingBase) - { + if (attackedEntity instanceof EntityLivingBase) { f += EnchantmentHelper.getModifierForCreature(this.getHeldItemMainhand(), ((EntityLivingBase) attackedEntity).getCreatureAttribute()); i += EnchantmentHelper.getKnockbackModifier(this); } boolean flag = attackedEntity.attackEntityFrom(DamageSource.causeMobDamage(this), f); - if (flag) - { - if (i > 0) - { + if (flag) { + if (i > 0) { ((EntityLivingBase) 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; @@ -117,23 +99,19 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable int j = EnchantmentHelper.getFireAspectModifier(this); - if (j > 0) - { + if (j > 0) { attackedEntity.setFire(j * 4); } - if (attackedEntity instanceof EntityPlayer) - { + if (attackedEntity instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer) attackedEntity; ItemStack itemstack = this.getHeldItemMainhand(); ItemStack itemstack1 = entityplayer.isHandActive() ? entityplayer.getActiveItemStack() : ItemStack.EMPTY; - if (!itemstack.isEmpty() && !itemstack1.isEmpty() && itemstack.getItem() instanceof ItemAxe && itemstack1.getItem() == Items.SHIELD) - { + if (!itemstack.isEmpty() && !itemstack1.isEmpty() && itemstack.getItem() instanceof ItemAxe && itemstack1.getItem() == Items.SHIELD) { float f1 = 0.25F + (float) EnchantmentHelper.getEfficiencyModifier(this) * 0.05F; - if (this.rand.nextFloat() < f1) - { + if (this.rand.nextFloat() < f1) { entityplayer.getCooldownTracker().setCooldown(Items.SHIELD, 100); this.getEntityWorld().setEntityState(entityplayer, (byte) 30); } @@ -147,87 +125,70 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable } @Override - public void setItemStackToSlot(EntityEquipmentSlot slotIn, ItemStack stack) - { + public void setItemStackToSlot(EntityEquipmentSlot slotIn, ItemStack stack) { super.setItemStackToSlot(slotIn, stack); - if (!this.getEntityWorld().isRemote && slotIn == EntityEquipmentSlot.MAINHAND) - { + if (!this.getEntityWorld().isRemote && slotIn == EntityEquipmentSlot.MAINHAND) { this.setCombatTask(); } } - public boolean isStationary() - { + public boolean isStationary() { return false; } - public boolean absorbExplosion(Explosion explosion) - { + public boolean absorbExplosion(Explosion explosion) { return false; } - public void performEmergencyHeal(double toHeal) - { + public void performEmergencyHeal(double toHeal) { this.heal((float) toHeal); - if (getEntityWorld() instanceof WorldServer) - { + if (getEntityWorld() instanceof WorldServer) { WorldServer server = (WorldServer) 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() - { + public boolean shouldEmergencyHeal() { return this.getHealth() < this.getMaxHealth() * 0.5; } @Override - protected boolean canDespawn() - { + protected boolean canDespawn() { return !this.isTamed() && super.canDespawn(); } @Override - public void writeEntityToNBT(NBTTagCompound tag) - { + public void writeEntityToNBT(NBTTagCompound tag) { super.writeEntityToNBT(tag); - if (this.getOwnerId() == null) - { + if (this.getOwnerId() == null) { tag.setString("OwnerUUID", ""); - } else - { + } else { tag.setString("OwnerUUID", this.getOwnerId().toString()); } } @Override - public void readEntityFromNBT(NBTTagCompound tag) - { + public void readEntityFromNBT(NBTTagCompound tag) { super.readEntityFromNBT(tag); String s; - if (tag.hasKey("OwnerUUID", 8)) - { + if (tag.hasKey("OwnerUUID", 8)) { s = tag.getString("OwnerUUID"); - } else - { + } else { String s1 = tag.getString("Owner"); s = PreYggdrasilConverter.convertMobOwnerIfNeeded(this.getServer(), s1); } - if (!s.isEmpty()) - { - try - { + if (!s.isEmpty()) { + try { this.setOwnerId(UUID.fromString(s)); this.setTamed(true); - } catch (Throwable var4) - { + } catch (Throwable var4) { this.setTamed(false); } } @@ -236,46 +197,36 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable } //TODO: Change to fit the given AI - public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) - { - if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) - { - if (attacker instanceof IEntityOwnable) - { + public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { + if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) { + if (attacker instanceof IEntityOwnable) { IEntityOwnable entityOwnable = (IEntityOwnable) attacker; - if (entityOwnable.getOwner() == owner) - { + if (entityOwnable.getOwner() == owner) { return false; } } return !(attacker instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) attacker)) && (!(attacker instanceof EntityHorse) || !((EntityHorse) attacker).isTame()); - } else - { + } else { return false; } } - public void attackEntityWithRangedAttack(EntityLivingBase target, float velocity) - { + public void attackEntityWithRangedAttack(EntityLivingBase target, float velocity) { } - public boolean isTamed() - { + public boolean isTamed() { return (this.dataManager.get(TAMED) & 4) != 0; } - public void setTamed(boolean tamed) - { + public void setTamed(boolean tamed) { byte b0 = this.dataManager.get(TAMED); - if (tamed) - { + if (tamed) { this.dataManager.set(TAMED, (byte) (b0 | 4)); - } else - { + } else { this.dataManager.set(TAMED, (byte) (b0 & -5)); } @@ -283,8 +234,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable } @Override - protected SoundEvent getAmbientSound() - { + protected SoundEvent getAmbientSound() { return SoundEvents.ENTITY_COW_AMBIENT; } @@ -294,20 +244,17 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable return getHurtSound(); } - protected SoundEvent getHurtSound() - { + protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_COW_HURT; } @Override - protected SoundEvent getDeathSound() - { + protected SoundEvent getDeathSound() { return SoundEvents.ENTITY_COW_DEATH; } @Override - protected void playStepSound(BlockPos pos, Block block) - { + protected void playStepSound(BlockPos pos, Block block) { this.playSound(SoundEvents.ENTITY_COW_STEP, 0.15F, 1.0F); } @@ -315,52 +262,42 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable * Returns the volume for the sounds this mob makes. */ @Override - protected float getSoundVolume() - { + protected float getSoundVolume() { return 0.4F; } @Override - public UUID getOwnerId() - { + public UUID getOwnerId() { return (this.dataManager.get(OWNER_UNIQUE_ID)).orNull(); } - public void setOwnerId(UUID uuid) - { + public void setOwnerId(UUID uuid) { this.dataManager.set(OWNER_UNIQUE_ID, Optional.fromNullable(uuid)); } @Override - public EntityLivingBase getOwner() - { - try - { + public EntityLivingBase getOwner() { + try { UUID uuid = this.getOwnerId(); return uuid == null ? null : this.getEntityWorld().getPlayerEntityByUUID(uuid); - } catch (IllegalArgumentException var2) - { + } catch (IllegalArgumentException var2) { return null; } } - public void setOwner(EntityPlayer player) - { + public void setOwner(EntityPlayer player) { setOwnerId(player.getUniqueID()); } - public class TargetPredicate implements Predicate - { + public class TargetPredicate implements Predicate { EntityDemonBase entity; - public TargetPredicate(EntityDemonBase entity) - { + public TargetPredicate(EntityDemonBase entity) { this.entity = entity; } @Override - public boolean apply(EntityMob input) - { + public boolean apply(EntityMob input) { return entity.shouldAttackEntity(input, this.entity.getOwner()); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index 890c3392..2fdb7dd0 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -1,19 +1,15 @@ 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 net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackMelee; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILeapAtTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.ai.*; import net.minecraft.entity.monster.EntityIronGolem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -33,13 +29,8 @@ import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; -import WayofTime.bloodmagic.block.BlockMimic; -import WayofTime.bloodmagic.entity.ai.EntityAIMimicReform; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.tile.TileMimic; -public class EntityMimic extends EntityDemonBase -{ +public class EntityMimic extends EntityDemonBase { /** * Copy of EntitySpider's AI (should be pretty evident...) */ @@ -50,8 +41,7 @@ public class EntityMimic extends EntityDemonBase public int metaOfReplacedBlock = 0; public int playerCheckRadius = 5; - public EntityMimic(World worldIn) - { + public EntityMimic(World worldIn) { super(worldIn); this.setSize(0.9F, 0.9F); @@ -70,8 +60,7 @@ public class EntityMimic extends EntityDemonBase } @Override - public void writeEntityToNBT(NBTTagCompound tag) - { + public void writeEntityToNBT(NBTTagCompound tag) { super.writeEntityToNBT(tag); tag.setBoolean("dropItemsOnBreak", dropItemsOnBreak); @@ -81,8 +70,7 @@ public class EntityMimic extends EntityDemonBase } @Override - public void readEntityFromNBT(NBTTagCompound tag) - { + public void readEntityFromNBT(NBTTagCompound tag) { super.readEntityFromNBT(tag); dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); @@ -91,30 +79,24 @@ public class EntityMimic extends EntityDemonBase playerCheckRadius = tag.getInteger("playerCheckRadius"); } - public ItemStack getMimicItemStack() - { + public ItemStack getMimicItemStack() { return this.getItemStackFromSlot(EntityEquipmentSlot.CHEST); } - public void setMimicItemStack(ItemStack stack) - { + public void setMimicItemStack(ItemStack stack) { this.setItemStackToSlot(EntityEquipmentSlot.CHEST, stack); } - public boolean spawnHeldBlockOnDeath(World world, BlockPos pos) - { + public boolean spawnHeldBlockOnDeath(World world, BlockPos pos) { return world.isAirBlock(pos) && TileMimic.replaceMimicWithBlockActual(world, pos, getMimicItemStack(), tileTag, metaOfReplacedBlock); } - public boolean spawnMimicBlockAtPosition(World world, BlockPos pos) - { - if (world.isAirBlock(pos)) - { + public boolean spawnMimicBlockAtPosition(World world, BlockPos pos) { + if (world.isAirBlock(pos)) { IBlockState mimicState = RegistrarBloodMagicBlocks.MIMIC.getStateFromMeta(BlockMimic.sentientMimicMeta); world.setBlockState(pos, mimicState, 3); TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMimic) - { + if (tile instanceof TileMimic) { TileMimic mimic = (TileMimic) tile; mimic.metaOfReplacedBlock = metaOfReplacedBlock; mimic.tileTag = tileTag; @@ -129,8 +111,7 @@ public class EntityMimic extends EntityDemonBase return false; } - public void initializeMimic(ItemStack heldStack, NBTTagCompound tileTag, boolean dropItemsOnBreak, int metaOfReplacedBlock, int playerCheckRadius, BlockPos homePosition) - { + public void initializeMimic(ItemStack heldStack, NBTTagCompound tileTag, boolean dropItemsOnBreak, int metaOfReplacedBlock, int playerCheckRadius, BlockPos homePosition) { this.setMimicItemStack(heldStack); this.tileTag = tileTag; this.dropItemsOnBreak = dropItemsOnBreak; @@ -139,29 +120,21 @@ public class EntityMimic extends EntityDemonBase this.setHomePosAndDistance(homePosition, 2); //TODO: Save this. } - public boolean reformIntoMimicBlock(BlockPos centerPos) - { + 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)) - { + 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)) - { + if (spawnMimicBlockAtPosition(getEntityWorld(), newPos)) { return true; } } @@ -174,35 +147,26 @@ public class EntityMimic extends EntityDemonBase } @Override - public void onDeath(DamageSource cause) - { + public void onDeath(DamageSource cause) { super.onDeath(cause); - if (!getEntityWorld().isRemote) - { + 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)) - { + 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)) - { + if (spawnHeldBlockOnDeath(getEntityWorld(), newPos)) { return; } } @@ -218,8 +182,7 @@ public class EntityMimic extends EntityDemonBase * this one. */ @Override - public double getMountedYOffset() - { + public double getMountedYOffset() { return (double) (this.height * 0.5F); } @@ -227,14 +190,12 @@ public class EntityMimic extends EntityDemonBase * Returns new PathNavigateGround instance */ @Override - protected PathNavigate createNavigator(World worldIn) - { + protected PathNavigate createNavigator(World worldIn) { return new PathNavigateClimber(this, worldIn); } @Override - protected void entityInit() - { + protected void entityInit() { super.entityInit(); this.dataManager.register(CLIMBING, (byte) 0); // this.dataManager.register(ITEMSTACK, null); @@ -244,53 +205,44 @@ public class EntityMimic extends EntityDemonBase * Called to update the entity's position/logic. */ @Override - public void onUpdate() - { - if (!this.getEntityWorld().isRemote && this.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL) - { - if (reformIntoMimicBlock(this.getPosition())) - { + public void onUpdate() { + if (!this.getEntityWorld().isRemote && this.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL) { + if (reformIntoMimicBlock(this.getPosition())) { this.setDead(); } } super.onUpdate(); - if (!this.getEntityWorld().isRemote) - { + if (!this.getEntityWorld().isRemote) { this.setBesideClimbableBlock(this.isCollidedHorizontally); } } @Override - protected void applyEntityAttributes() - { + 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() - { + protected SoundEvent getAmbientSound() { return SoundEvents.ENTITY_SPIDER_AMBIENT; } @Override - protected SoundEvent getHurtSound() - { + protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_SPIDER_HURT; } @Override - protected SoundEvent getDeathSound() - { + protected SoundEvent getDeathSound() { return SoundEvents.ENTITY_SPIDER_DEATH; } @Override - protected void playStepSound(BlockPos pos, Block blockIn) - { + protected void playStepSound(BlockPos pos, Block blockIn) { this.playSound(SoundEvents.ENTITY_SPIDER_STEP, 0.15F, 1.0F); } @@ -298,8 +250,7 @@ public class EntityMimic extends EntityDemonBase * returns true if this entity is by a ladder, false otherwise */ @Override - public boolean isOnLadder() - { + public boolean isOnLadder() { return this.isBesideClimbableBlock(); } @@ -307,8 +258,7 @@ public class EntityMimic extends EntityDemonBase * Sets the Entity inside a web block. */ @Override - public void setInWeb() - { + public void setInWeb() { } @@ -316,14 +266,12 @@ public class EntityMimic extends EntityDemonBase * Get this Entity's EnumCreatureAttribute */ @Override - public EnumCreatureAttribute getCreatureAttribute() - { + public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.ARTHROPOD; } @Override - public boolean isPotionApplicable(PotionEffect potioneffectIn) - { + public boolean isPotionApplicable(PotionEffect potioneffectIn) { return potioneffectIn.getPotion() != MobEffects.POISON && super.isPotionApplicable(potioneffectIn); } @@ -331,8 +279,7 @@ public class EntityMimic extends EntityDemonBase * Returns true if the WatchableObject (Byte) is 0x01 otherwise returns * false. The WatchableObject is updated using setBesideClimableBlock. */ - public boolean isBesideClimbableBlock() - { + public boolean isBesideClimbableBlock() { return (this.dataManager.get(CLIMBING) & 1) != 0; } @@ -340,44 +287,35 @@ public class EntityMimic extends EntityDemonBase * 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) - { + public void setBesideClimbableBlock(boolean climbing) { byte b0 = this.dataManager.get(CLIMBING); - if (climbing) - { + if (climbing) { b0 = (byte) (b0 | 1); - } else - { + } else { b0 = (byte) (b0 & -2); } this.dataManager.set(CLIMBING, b0); } - public float getEyeHeight() - { + public float getEyeHeight() { return 0.65F; } - static class AISpiderAttack extends EntityAIAttackMelee - { - public AISpiderAttack(EntityMimic spider) - { + static class AISpiderAttack extends EntityAIAttackMelee { + public AISpiderAttack(EntityMimic spider) { super(spider, 1.0D, true); } @Override - protected double getAttackReachSqr(EntityLivingBase attackTarget) - { + protected double getAttackReachSqr(EntityLivingBase attackTarget) { return (double) (4.0F + attackTarget.width); } } - static class AISpiderTarget extends EntityAINearestAttackableTarget - { - public AISpiderTarget(EntityMimic spider, Class classTarget) - { + static class AISpiderTarget extends EntityAINearestAttackableTarget { + 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 index 670addf3..95557f14 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -1,21 +1,22 @@ package WayofTime.bloodmagic.entity.mob; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.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.Entity; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackMelee; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.ai.*; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntityGhast; import net.minecraft.entity.player.EntityPlayer; @@ -39,31 +40,19 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraft.world.WorldServer; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.ai.EntityAIAttackRangedBow; -import WayofTime.bloodmagic.entity.ai.EntityAIFollowOwner; -import WayofTime.bloodmagic.entity.ai.EntityAIGrabEffectsFromOwner; -import WayofTime.bloodmagic.entity.ai.EntityAIHurtByTargetIgnoreTamed; -import WayofTime.bloodmagic.entity.ai.EntityAIOwnerHurtByTarget; -import WayofTime.bloodmagic.entity.ai.EntityAIOwnerHurtTarget; -import WayofTime.bloodmagic.entity.ai.EntityAIRetreatToHeal; -import WayofTime.bloodmagic.item.soul.ItemSentientBow; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -public class EntitySentientSpecter extends EntityDemonBase -{ +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 EntityAIAttackMelee aiAttackOnCollide = new EntityAIAttackMelee(this, 1.0D, false); + private final int attackPriority = 3; protected EnumDemonWillType type = EnumDemonWillType.DESTRUCTIVE; protected boolean wasGivenSentientArmour = false; - private final EntityAIAttackRangedBow aiArrowAttack = new EntityAIAttackRangedBow(this, 1.0D, 20, 15.0F); - private final EntityAIAttackMelee aiAttackOnCollide = new EntityAIAttackMelee(this, 1.0D, false); - - private final int attackPriority = 3; - - public EntitySentientSpecter(World worldIn) - { + public EntitySentientSpecter(World worldIn) { super(worldIn); this.setSize(0.6F, 1.95F); // ((PathNavigateGround) getNavigator()).setCanSwim(false); @@ -87,8 +76,7 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - protected void applyEntityAttributes() - { + protected void applyEntityAttributes() { super.applyEntityAttributes(); getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(40.0D); getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(6.0D); @@ -96,27 +84,22 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - public void setCombatTask() - { - if (!this.getEntityWorld().isRemote) - { + 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 ItemBow) - { + if (!itemstack.isEmpty() && itemstack.getItem() instanceof ItemBow) { int i = 20; - if (this.getEntityWorld().getDifficulty() != EnumDifficulty.HARD) - { + if (this.getEntityWorld().getDifficulty() != EnumDifficulty.HARD) { i = 40; } this.aiArrowAttack.setAttackCooldown(i); this.tasks.addTask(attackPriority, this.aiArrowAttack); - } else - { + } else { this.tasks.addTask(attackPriority, this.aiAttackOnCollide); } } @@ -130,22 +113,17 @@ public class EntitySentientSpecter extends EntityDemonBase return !(potion == MobEffects.REGENERATION || potion == MobEffects.INSTANT_HEALTH) && super.isPotionApplicable(effect); } - public boolean canStealEffectFromOwner(EntityLivingBase owner, PotionEffect effect) - { + public boolean canStealEffectFromOwner(EntityLivingBase owner, PotionEffect effect) { return effect.getPotion().isBadEffect() && this.type == EnumDemonWillType.CORROSIVE; } - public boolean canStealEffectFromOwner(EntityLivingBase owner) - { - if (this.type != EnumDemonWillType.CORROSIVE) - { + public boolean canStealEffectFromOwner(EntityLivingBase owner) { + if (this.type != EnumDemonWillType.CORROSIVE) { return false; } - for (PotionEffect eff : owner.getActivePotionEffects()) - { - if (canStealEffectFromOwner(owner, eff)) - { + for (PotionEffect eff : owner.getActivePotionEffects()) { + if (canStealEffectFromOwner(owner, eff)) { return true; } } @@ -153,10 +131,8 @@ public class EntitySentientSpecter extends EntityDemonBase return false; } - public boolean stealEffectsFromOwner(EntityLivingBase owner) - { - if (this.type != EnumDemonWillType.CORROSIVE) - { + public boolean stealEffectsFromOwner(EntityLivingBase owner) { + if (this.type != EnumDemonWillType.CORROSIVE) { return false; } @@ -164,17 +140,14 @@ public class EntitySentientSpecter extends EntityDemonBase List removedEffects = new ArrayList(); - for (PotionEffect eff : owner.getActivePotionEffects()) - { - if (canStealEffectFromOwner(owner, eff)) - { + for (PotionEffect eff : owner.getActivePotionEffects()) { + if (canStealEffectFromOwner(owner, eff)) { removedEffects.add(eff); hasStolenEffect = true; } } - for (PotionEffect eff : removedEffects) - { + for (PotionEffect eff : removedEffects) { owner.removePotionEffect(eff.getPotion()); this.addPotionEffect(eff); } @@ -182,23 +155,17 @@ public class EntitySentientSpecter extends EntityDemonBase return hasStolenEffect; } - public boolean applyNegativeEffectsToAttacked(EntityLivingBase attackedEntity, float percentTransmitted) - { + public boolean applyNegativeEffectsToAttacked(EntityLivingBase attackedEntity, float percentTransmitted) { boolean hasProvidedEffect = false; List removedEffects = new ArrayList(); - for (PotionEffect eff : this.getActivePotionEffects()) - { - if (eff.getPotion().isBadEffect() && attackedEntity.isPotionApplicable(eff)) - { - if (!attackedEntity.isPotionActive(eff.getPotion())) - { + for (PotionEffect eff : this.getActivePotionEffects()) { + if (eff.getPotion().isBadEffect() && attackedEntity.isPotionApplicable(eff)) { + if (!attackedEntity.isPotionActive(eff.getPotion())) { removedEffects.add(eff); hasProvidedEffect = true; - } else - { + } else { PotionEffect activeEffect = attackedEntity.getActivePotionEffect(eff.getPotion()); - if (activeEffect.getAmplifier() < eff.getAmplifier() || activeEffect.getDuration() < eff.getDuration() * percentTransmitted) - { + if (activeEffect.getAmplifier() < eff.getAmplifier() || activeEffect.getDuration() < eff.getDuration() * percentTransmitted) { removedEffects.add(eff); hasProvidedEffect = true; } @@ -206,18 +173,15 @@ public class EntitySentientSpecter extends EntityDemonBase } } - for (PotionEffect eff : removedEffects) - { - if (!attackedEntity.isPotionActive(eff.getPotion())) - { + for (PotionEffect eff : removedEffects) { + if (!attackedEntity.isPotionActive(eff.getPotion())) { PotionEffect newEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); attackedEntity.addPotionEffect(newEffect); PotionEffect newSentientEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); this.removePotionEffect(eff.getPotion()); this.addPotionEffect(newSentientEffect); - } else - { + } else { PotionEffect activeEffect = attackedEntity.getActivePotionEffect(eff.getPotion()); PotionEffect newEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), activeEffect.getIsAmbient(), activeEffect.doesShowParticles()); @@ -232,26 +196,21 @@ public class EntitySentientSpecter extends EntityDemonBase return hasProvidedEffect; } - public List getPotionEffectsForArrowRemovingDuration(float percentTransmitted) - { + public List getPotionEffectsForArrowRemovingDuration(float percentTransmitted) { List arrowEffects = new ArrayList(); - if (type != EnumDemonWillType.CORROSIVE) - { + if (type != EnumDemonWillType.CORROSIVE) { return arrowEffects; } List removedEffects = new ArrayList(); - for (PotionEffect eff : this.getActivePotionEffects()) - { - if (eff.getPotion().isBadEffect()) - { + for (PotionEffect eff : this.getActivePotionEffects()) { + if (eff.getPotion().isBadEffect()) { removedEffects.add(eff); } } - for (PotionEffect eff : removedEffects) - { + for (PotionEffect eff : removedEffects) { PotionEffect newEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); arrowEffects.add(newEffect); @@ -264,8 +223,7 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - public boolean attackEntityFrom(DamageSource source, float amount) - { + public boolean attackEntityFrom(DamageSource source, float amount) { return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); } @@ -273,47 +231,38 @@ public class EntitySentientSpecter extends EntityDemonBase * Redone from EntityMob to prevent despawning on peaceful. */ @Override - public boolean attackEntityAsMob(Entity attackedEntity) - { + public boolean attackEntityAsMob(Entity attackedEntity) { boolean flag = super.attackEntityAsMob(attackedEntity); - if (flag) - { - if (this.type == EnumDemonWillType.CORROSIVE && attackedEntity instanceof EntityLivingBase) - { + if (flag) { + if (this.type == EnumDemonWillType.CORROSIVE && attackedEntity instanceof EntityLivingBase) { // ((EntityLivingBase) attackedEntity).addPotionEffect(new PotionEffect(MobEffects.WITHER, 200)); applyNegativeEffectsToAttacked((EntityLivingBase) attackedEntity, 1); } return true; - } else - { + } else { return false; } } @Override - public void onDeath(DamageSource cause) - { + public void onDeath(DamageSource cause) { super.onDeath(cause); - if (!getEntityWorld().isRemote && !getHeldItemMainhand().isEmpty()) - { + if (!getEntityWorld().isRemote && !getHeldItemMainhand().isEmpty()) { this.entityDropItem(getHeldItemMainhand(), 0); } } @Override - public boolean isStationary() - { + public boolean isStationary() { return false; } @Override - public boolean absorbExplosion(Explosion explosion) - { - if (this.type == EnumDemonWillType.DESTRUCTIVE) - { + public boolean absorbExplosion(Explosion explosion) { + if (this.type == EnumDemonWillType.DESTRUCTIVE) { this.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, 600, 1)); explosion.doExplosionB(true); @@ -325,27 +274,21 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - public boolean processInteract(EntityPlayer player, EnumHand hand) - { + public boolean processInteract(EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); - if (this.isTamed() && player.equals(this.getOwner()) && hand == EnumHand.MAIN_HAND) - { + if (this.isTamed() && player.equals(this.getOwner()) && hand == EnumHand.MAIN_HAND) { if (stack.isEmpty() && player.isSneaking()) //Should return to the entity { - if (!getEntityWorld().isRemote) - { - if (!getHeldItemMainhand().isEmpty()) - { + if (!getEntityWorld().isRemote) { + if (!getHeldItemMainhand().isEmpty()) { this.entityDropItem(getHeldItemMainhand(), 0); } - if (!getHeldItemOffhand().isEmpty()) - { + if (!getHeldItemOffhand().isEmpty()) { this.entityDropItem(getHeldItemOffhand(), 0); } - if (wasGivenSentientArmour) - { + if (wasGivenSentientArmour) { this.entityDropItem(new ItemStack(RegistrarBloodMagicItems.SENTIENT_ARMOUR_GEM), 0); } @@ -357,46 +300,38 @@ public class EntitySentientSpecter extends EntityDemonBase return super.processInteract(player, hand); } - public boolean isEntityInvulnerable(DamageSource source) - { + public boolean isEntityInvulnerable(DamageSource source) { return super.isEntityInvulnerable(source) && (this.type == EnumDemonWillType.DESTRUCTIVE && source.isExplosion()); } @Override - public void performEmergencyHeal(double toHeal) - { + public void performEmergencyHeal(double toHeal) { this.heal((float) toHeal); - if (getEntityWorld() instanceof WorldServer) - { + if (getEntityWorld() instanceof WorldServer) { WorldServer server = (WorldServer) 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, new int[0]); } } /** - * * @param toHeal * @return Amount of Will consumed from the Aura to heal */ - public double absorbWillFromAuraToHeal(double toHeal) - { - if (getEntityWorld().isRemote) - { + public double absorbWillFromAuraToHeal(double toHeal) { + if (getEntityWorld().isRemote) { return 0; } double healthMissing = this.getMaxHealth() - this.getHealth(); - if (healthMissing <= 0) - { + if (healthMissing <= 0) { return 0; } double will = WorldDemonWillHandler.getCurrentWill(getEntityWorld(), getPosition(), getType()); toHeal = Math.min(healthMissing, Math.min(toHeal, will / getWillToHealth())); - if (toHeal > 0) - { + if (toHeal > 0) { this.heal((float) toHeal); return WorldDemonWillHandler.drainWill(getEntityWorld(), getPosition(), getType(), toHeal * getWillToHealth(), true); } @@ -404,21 +339,17 @@ public class EntitySentientSpecter extends EntityDemonBase return 0; } - public double getWillToHealth() - { + public double getWillToHealth() { return 2; } @Override - protected boolean canDespawn() - { + protected boolean canDespawn() { return !this.isTamed() && super.canDespawn(); } - public void onUpdate() - { - if (!this.getEntityWorld().isRemote && this.ticksExisted % 20 == 0) - { + public void onUpdate() { + if (!this.getEntityWorld().isRemote && this.ticksExisted % 20 == 0) { absorbWillFromAuraToHeal(2); } @@ -426,8 +357,7 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - public void writeEntityToNBT(NBTTagCompound tag) - { + public void writeEntityToNBT(NBTTagCompound tag) { super.writeEntityToNBT(tag); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); @@ -436,15 +366,12 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - public void readEntityFromNBT(NBTTagCompound tag) - { + public void readEntityFromNBT(NBTTagCompound tag) { super.readEntityFromNBT(tag); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { type = EnumDemonWillType.DEFAULT; - } else - { + } else { type = EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); } @@ -455,37 +382,29 @@ public class EntitySentientSpecter extends EntityDemonBase //TODO: Change to fit the given AI @Override - public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) - { - if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) - { + public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { + if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) { return super.shouldAttackEntity(attacker, owner); - } else - { + } else { return false; } } @Override - public void attackEntityWithRangedAttack(EntityLivingBase target, float velocity) - { + public void attackEntityWithRangedAttack(EntityLivingBase target, float velocity) { ItemStack heldStack = this.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); - if (!heldStack.isEmpty() && heldStack.getItem() == RegistrarBloodMagicItems.SENTIENT_BOW) - { + if (!heldStack.isEmpty() && heldStack.getItem() == RegistrarBloodMagicItems.SENTIENT_BOW) { EntityTippedArrow arrowEntity = ((ItemSentientBow) heldStack.getItem()).getArrowEntity(getEntityWorld(), heldStack, target, this, velocity); - if (arrowEntity != null) - { + if (arrowEntity != null) { List effects = getPotionEffectsForArrowRemovingDuration(0.2f); - for (PotionEffect eff : effects) - { + for (PotionEffect 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 - { + } else { EntityTippedArrow entitytippedarrow = new EntityTippedArrow(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; @@ -496,21 +415,18 @@ public class EntitySentientSpecter extends EntityDemonBase int j = EnchantmentHelper.getMaxEnchantmentLevel(Enchantments.PUNCH, this); entitytippedarrow.setDamage((double) (velocity * 2.0F) + this.rand.nextGaussian() * 0.25D + (double) ((float) this.getEntityWorld().getDifficulty().getDifficultyId() * 0.11F)); - if (i > 0) - { + if (i > 0) { entitytippedarrow.setDamage(entitytippedarrow.getDamage() + (double) i * 0.5D + 0.5D); } - if (j > 0) - { + if (j > 0) { entitytippedarrow.setKnockbackStrength(j); } boolean burning = this.isBurning(); burning = burning || EnchantmentHelper.getMaxEnchantmentLevel(Enchantments.FLAME, this) > 0; - if (burning) - { + if (burning) { entitytippedarrow.setFire(100); } @@ -525,26 +441,22 @@ public class EntitySentientSpecter extends EntityDemonBase } @Override - protected SoundEvent getAmbientSound() - { + protected SoundEvent getAmbientSound() { return SoundEvents.ENTITY_COW_AMBIENT; } @Override - protected SoundEvent getHurtSound() - { + protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_COW_HURT; } @Override - protected SoundEvent getDeathSound() - { + protected SoundEvent getDeathSound() { return SoundEvents.ENTITY_COW_DEATH; } @Override - protected void playStepSound(BlockPos pos, Block block) - { + protected void playStepSound(BlockPos pos, Block block) { this.playSound(SoundEvents.ENTITY_COW_STEP, 0.15F, 1.0F); } @@ -552,8 +464,7 @@ public class EntitySentientSpecter extends EntityDemonBase * Returns the volume for the sounds this mob makes. */ @Override - protected float getSoundVolume() - { + protected float getSoundVolume() { return 0.4F; } diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index 534f94dc..712a9f98 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -8,7 +8,8 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.*; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; @@ -16,27 +17,23 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.common.registry.IThrowableEntity; -public class EntityBloodLight extends EntityThrowable implements IThrowableEntity, IEntityAdditionalSpawnData -{ +public class EntityBloodLight extends EntityThrowable implements IThrowableEntity, IEntityAdditionalSpawnData { public EntityLivingBase shootingEntity; protected int ticksInAir = 0; protected int maxTicksInAir = 600; - public EntityBloodLight(World world) - { + public EntityBloodLight(World world) { super(world); this.setSize(0.5F, 0.5F); } - public EntityBloodLight(World world, double x, double y, double z) - { + 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 world, EntityLivingBase player) - { + public EntityBloodLight(World world, EntityLivingBase player) { super(world, player); shootingEntity = player; float par3 = 0.8F; @@ -53,14 +50,12 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit } @Override - protected float getGravityVelocity() - { + protected float getGravityVelocity() { return 0F; } @Override - public void setThrowableHeading(double var1, double var3, double var5, float var7, float var8) - { + public void setThrowableHeading(double var1, double var3, double var5, float var7, float var8) { float var9 = MathHelper.sqrt(var1 * var1 + var3 * var3 + var5 * var5); var1 /= var9; var3 /= var9; @@ -80,33 +75,26 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit } @Override - public void onUpdate() - { + public void onUpdate() { super.onUpdate(); - if (this.ticksExisted > this.maxTicksInAir) - { + if (this.ticksExisted > this.maxTicksInAir) { setDead(); } } @Override - protected void onImpact(RayTraceResult mop) - { - if (mop.typeOfHit == RayTraceResult.Type.ENTITY && mop.entityHit != null) - { - if (mop.entityHit == shootingEntity) - { + protected void onImpact(RayTraceResult mop) { + if (mop.typeOfHit == RayTraceResult.Type.ENTITY && mop.entityHit != null) { + if (mop.entityHit == shootingEntity) { return; } this.onImpact(mop.entityHit); - } else if (mop.typeOfHit == RayTraceResult.Type.BLOCK) - { + } else if (mop.typeOfHit == RayTraceResult.Type.BLOCK) { EnumFacing sideHit = mop.sideHit; BlockPos blockPos = mop.getBlockPos().offset(sideHit); - if (getEntityWorld().isAirBlock(blockPos)) - { + if (getEntityWorld().isAirBlock(blockPos)) { getEntityWorld().setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); } } @@ -114,23 +102,18 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit this.setDead(); } - protected void onImpact(Entity mop) - { - if (mop == shootingEntity && ticksInAir > 3) - { + protected void onImpact(Entity mop) { + if (mop == shootingEntity && ticksInAir > 3) { shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); this.setDead(); - } else - { - if (mop instanceof EntityLivingBase) - { + } else { + if (mop instanceof EntityLivingBase) { ((EntityLivingBase) mop).setRevengeTarget(shootingEntity); doDamage(1, mop); } } - if (getEntityWorld().isAirBlock(new BlockPos((int) this.posX, (int) this.posY, (int) this.posZ))) - { + 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()); } @@ -138,59 +121,50 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit this.setDead(); } - protected void doDamage(int i, Entity mop) - { + protected void doDamage(int i, Entity mop) { mop.attackEntityFrom(this.getDamageSource(), i); } - public DamageSource getDamageSource() - { + public DamageSource getDamageSource() { return DamageSource.causeMobDamage(shootingEntity); } @Override - public void writeSpawnData(ByteBuf data) - { + public void writeSpawnData(ByteBuf data) { data.writeByte(this.ticksInAir); } @Override - public void readSpawnData(ByteBuf data) - { + public void readSpawnData(ByteBuf data) { this.ticksInAir = data.readByte(); } @Override - public void writeEntityToNBT(NBTTagCompound nbt) - { + public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); nbt.setInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir); nbt.setInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir); } @Override - public void readEntityFromNBT(NBTTagCompound nbt) - { + public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); ticksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR); maxTicksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); } @Override - protected boolean canTriggerWalking() - { + protected boolean canTriggerWalking() { return false; } @Override - public boolean canBeCollidedWith() - { + public boolean canBeCollidedWith() { return false; } @Override - public void setThrower(Entity entity) - { + public void setThrower(Entity entity) { if (entity instanceof EntityLivingBase) this.shootingEntity = (EntityLivingBase) entity; } diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index 51e4aee6..bfbbe0e8 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.entity.projectile; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.meteor.MeteorRegistry; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityThrowable; @@ -11,27 +13,20 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.IThrowableEntity; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.meteor.MeteorRegistry; -public class EntityMeteor extends EntityThrowable implements IThrowableEntity -{ +public class EntityMeteor extends EntityThrowable 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 ItemStack meteorStack = ItemStack.EMPTY; - - public EntityMeteor(World world) - { + 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) - { + 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); @@ -44,39 +39,31 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity } @Override - protected float getGravityVelocity() - { + protected float getGravityVelocity() { return 0.03F; } @Override - public void onUpdate() - { + public void onUpdate() { super.onUpdate(); - if (this.ticksExisted > this.maxTicksInAir) - { + if (this.ticksExisted > this.maxTicksInAir) { setDead(); } } @Override - protected void onImpact(RayTraceResult mop) - { - if (mop.typeOfHit == RayTraceResult.Type.ENTITY && mop.entityHit != null) - { + 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) - { + } else if (mop.typeOfHit == RayTraceResult.Type.BLOCK) { generateMeteor(mop.getBlockPos()); } this.setDead(); } - protected void onImpact(Entity mop) - { - if (mop instanceof EntityLivingBase) - { + protected void onImpact(Entity mop) { + if (mop instanceof EntityLivingBase) { doDamage(100, mop); } @@ -86,24 +73,20 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity this.setDead(); } - protected void doDamage(int i, Entity mop) - { + protected void doDamage(int i, Entity mop) { mop.attackEntityFrom(this.getDamageSource(), i); } - public void generateMeteor(BlockPos pos) - { + public void generateMeteor(BlockPos pos) { MeteorRegistry.generateMeteorForItem(meteorStack, getEntityWorld(), pos, Blocks.STONE.getDefaultState(), radiusModifier, explosionModifier, fillerChance); } - public DamageSource getDamageSource() - { + public DamageSource getDamageSource() { return DamageSource.ANVIL; } @Override - public void writeEntityToNBT(NBTTagCompound nbt) - { + public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); nbt.setInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir); nbt.setInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir); @@ -117,8 +100,7 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity } @Override - public void readEntityFromNBT(NBTTagCompound nbt) - { + public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); ticksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR); maxTicksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); @@ -132,20 +114,17 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity } @Override - protected boolean canTriggerWalking() - { + protected boolean canTriggerWalking() { return false; } @Override - public boolean canBeCollidedWith() - { + public boolean canBeCollidedWith() { return false; } @Override - public void setThrower(Entity entity) - { + public void setThrower(Entity entity) { } diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index c6cf622f..8946d035 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -1,5 +1,8 @@ package WayofTime.bloodmagic.entity.projectile; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; @@ -9,40 +12,30 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import java.util.Locale; -public class EntitySentientArrow extends EntityTippedArrow -{ +public class EntitySentientArrow extends EntityTippedArrow { public double reimbursedAmountOnHit = 0; public EnumDemonWillType type = EnumDemonWillType.DEFAULT; - public EntitySentientArrow(World worldIn) - { + public EntitySentientArrow(World worldIn) { super(worldIn); } - public EntitySentientArrow(World worldIn, double x, double y, double z) - { + public EntitySentientArrow(World worldIn, double x, double y, double z) { super(worldIn, x, y, z); } - public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reinburseAmount) - { + public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reinburseAmount) { super(worldIn, shooter); this.reimbursedAmountOnHit = reinburseAmount; this.type = type; } - public void reimbursePlayer(EntityLivingBase hitEntity, float damage) - { - if (this.shootingEntity instanceof EntityPlayer) - { - if (hitEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) - { + public void reimbursePlayer(EntityLivingBase hitEntity, float damage) { + if (this.shootingEntity instanceof EntityPlayer) { + if (hitEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) { return; } @@ -51,8 +44,7 @@ public class EntitySentientArrow extends EntityTippedArrow } @Override - public void writeEntityToNBT(NBTTagCompound tag) - { + public void writeEntityToNBT(NBTTagCompound tag) { super.writeEntityToNBT(tag); tag.setDouble("reimbursement", reimbursedAmountOnHit); @@ -60,8 +52,7 @@ public class EntitySentientArrow extends EntityTippedArrow } @Override - public void readEntityFromNBT(NBTTagCompound tag) - { + public void readEntityFromNBT(NBTTagCompound tag) { super.readEntityFromNBT(tag); reimbursedAmountOnHit = tag.getDouble("reimbursement"); @@ -69,8 +60,7 @@ public class EntitySentientArrow extends EntityTippedArrow } @Override - protected ItemStack getArrowStack() - { + protected ItemStack getArrowStack() { return new ItemStack(Items.ARROW); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java index efbfb5c4..2be580f8 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java @@ -9,20 +9,16 @@ import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -public class EntitySoulSnare extends EntityThrowable -{ - public EntitySoulSnare(World worldIn) - { +public class EntitySoulSnare extends EntityThrowable { + public EntitySoulSnare(World worldIn) { super(worldIn); } - public EntitySoulSnare(World worldIn, EntityLivingBase throwerIn) - { + public EntitySoulSnare(World worldIn, EntityLivingBase throwerIn) { super(worldIn, throwerIn); } - public EntitySoulSnare(World worldIn, double x, double y, double z) - { + public EntitySoulSnare(World worldIn, double x, double y, double z) { super(worldIn, x, y, z); } @@ -30,30 +26,24 @@ public class EntitySoulSnare extends EntityThrowable * Called when this EntityThrowable hits a block or entity. */ @Override - protected void onImpact(RayTraceResult result) - { - if (result.entityHit == this.getThrower() && this.ticksExisted < 20) - { + protected void onImpact(RayTraceResult result) { + if (result.entityHit == this.getThrower() && this.ticksExisted < 20) { return; } - if (result.entityHit != null && result.entityHit != this.getThrower()) - { - if (result.entityHit instanceof EntityLivingBase && result.entityHit.getEntityWorld().rand.nextDouble() < 0.25) - { + if (result.entityHit != null && result.entityHit != this.getThrower()) { + if (result.entityHit instanceof EntityLivingBase && result.entityHit.getEntityWorld().rand.nextDouble() < 0.25) { ((EntityLivingBase) result.entityHit).addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_SNARE, 300, 0)); } result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), (float) 0); } - for (int j = 0; j < 8; ++j) - { + for (int j = 0; j < 8; ++j) { this.getEntityWorld().spawnParticle(EnumParticleTypes.SNOWBALL, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D); } - if (!this.getEntityWorld().isRemote) - { + if (!this.getEntityWorld().isRemote) { this.setDead(); } } diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java index 7fba5008..eb33e3fe 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java @@ -15,182 +15,146 @@ import java.util.Set; /** * All credits for this go to CrazyPants, from EIO */ -public class FakeNetHandlerPlayServer extends NetHandlerPlayServer -{ - public FakeNetHandlerPlayServer(EntityPlayerMP p_i1530_3_) - { +public class FakeNetHandlerPlayServer extends NetHandlerPlayServer { + public FakeNetHandlerPlayServer(EntityPlayerMP p_i1530_3_) { super(FMLCommonHandler.instance().getMinecraftServerInstance(), new net.minecraft.network.NetworkManager(EnumPacketDirection.CLIENTBOUND), p_i1530_3_); } @Override - public NetworkManager getNetworkManager() - { + public NetworkManager getNetworkManager() { return null; } @Override - public void update() - { + public void update() { } @Override - public void disconnect(final ITextComponent textComponent) - { + public void disconnect(final ITextComponent textComponent) { } @Override - public void processVehicleMove(CPacketVehicleMove packetIn) - { + public void processVehicleMove(CPacketVehicleMove packetIn) { } @Override - public void processConfirmTeleport(CPacketConfirmTeleport packetIn) - { + public void processConfirmTeleport(CPacketConfirmTeleport packetIn) { } @Override - public void setPlayerLocation(double x, double y, double z, float yaw, float pitch, Set relativeSet) - { + public void setPlayerLocation(double x, double y, double z, float yaw, float pitch, Set relativeSet) { } @Override - public void processTryUseItemOnBlock(CPacketPlayerTryUseItemOnBlock packetIn) - { + public void processTryUseItemOnBlock(CPacketPlayerTryUseItemOnBlock packetIn) { } @Override - public void processTryUseItem(CPacketPlayerTryUseItem packetIn) - { + public void processTryUseItem(CPacketPlayerTryUseItem packetIn) { } @Override - public void processSteerBoat(CPacketSteerBoat packetIn) - { + public void processSteerBoat(CPacketSteerBoat packetIn) { } @Override - public void processCustomPayload(CPacketCustomPayload packetIn) - { + public void processCustomPayload(CPacketCustomPayload packetIn) { } @Override - public void processInput(CPacketInput p_147358_1_) - { + public void processInput(CPacketInput p_147358_1_) { } @Override - public void processPlayer(CPacketPlayer p_147347_1_) - { + public void processPlayer(CPacketPlayer 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_) - { + 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(CPacketPlayerDigging p_147345_1_) - { + public void processPlayerDigging(CPacketPlayerDigging p_147345_1_) { } @Override - public void onDisconnect(ITextComponent p_147231_1_) - { + public void onDisconnect(ITextComponent p_147231_1_) { } @Override - public void sendPacket(Packet p_147359_1_) - { + public void sendPacket(Packet p_147359_1_) { } @Override - public void processHeldItemChange(CPacketHeldItemChange p_147355_1_) - { + public void processHeldItemChange(CPacketHeldItemChange p_147355_1_) { } @Override - public void processChatMessage(CPacketChatMessage p_147354_1_) - { + public void processChatMessage(CPacketChatMessage p_147354_1_) { } @Override - public void handleAnimation(CPacketAnimation packetIn) - { + public void handleAnimation(CPacketAnimation packetIn) { } @Override - public void processEntityAction(CPacketEntityAction p_147357_1_) - { + public void processEntityAction(CPacketEntityAction p_147357_1_) { } @Override - public void processUseEntity(CPacketUseEntity p_147340_1_) - { + public void processUseEntity(CPacketUseEntity p_147340_1_) { } @Override - public void processClientStatus(CPacketClientStatus p_147342_1_) - { + public void processClientStatus(CPacketClientStatus p_147342_1_) { } @Override - public void processCloseWindow(CPacketCloseWindow p_147356_1_) - { + public void processCloseWindow(CPacketCloseWindow p_147356_1_) { } @Override - public void processClickWindow(CPacketClickWindow p_147351_1_) - { + public void processClickWindow(CPacketClickWindow p_147351_1_) { } @Override - public void processEnchantItem(CPacketEnchantItem p_147338_1_) - { + public void processEnchantItem(CPacketEnchantItem p_147338_1_) { } @Override - public void processCreativeInventoryAction(CPacketCreativeInventoryAction p_147344_1_) - { + public void processCreativeInventoryAction(CPacketCreativeInventoryAction p_147344_1_) { } @Override - public void processConfirmTransaction(CPacketConfirmTransaction p_147339_1_) - { + public void processConfirmTransaction(CPacketConfirmTransaction p_147339_1_) { } @Override - public void processUpdateSign(CPacketUpdateSign p_147343_1_) - { + public void processUpdateSign(CPacketUpdateSign p_147343_1_) { } @Override - public void processKeepAlive(CPacketKeepAlive p_147353_1_) - { + public void processKeepAlive(CPacketKeepAlive p_147353_1_) { } @Override - public void processPlayerAbilities(CPacketPlayerAbilities p_147348_1_) - { + public void processPlayerAbilities(CPacketPlayerAbilities p_147348_1_) { } @Override - public void processTabComplete(CPacketTabComplete p_147341_1_) - { + public void processTabComplete(CPacketTabComplete p_147341_1_) { } @Override - public void processClientSettings(CPacketClientSettings p_147352_1_) - { + public void processClientSettings(CPacketClientSettings p_147352_1_) { } @Override - public void handleSpectate(CPacketSpectate packetIn) - { + public void handleSpectate(CPacketSpectate packetIn) { } @Override - public void handleResourcePackStatus(CPacketResourcePackStatus packetIn) - { + public void handleResourcePackStatus(CPacketResourcePackStatus 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 index dfe50f3c..03fc7b83 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.fakePlayer; -import javax.annotation.Nullable; - +import com.mojang.authlib.GameProfile; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.BlockPos; @@ -10,21 +9,19 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.common.FMLCommonHandler; -import com.mojang.authlib.GameProfile; +import javax.annotation.Nullable; /** * All credits for this go to CrazyPants, from EIO */ @SuppressWarnings("EntityConstructor") -public class FakePlayerBM extends FakePlayer -{ +public class FakePlayerBM extends FakePlayer { public FakePlayerBM(WorldServer world, GameProfile name) { super(world, name); } - public FakePlayerBM(World world, BlockPos pos, GameProfile profile) - { + 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; @@ -33,21 +30,17 @@ public class FakePlayerBM extends FakePlayer } @Override - protected void onNewPotionEffect(PotionEffect p_70670_1_) - { + protected void onNewPotionEffect(PotionEffect p_70670_1_) { } @Override - protected void onChangedPotionEffect(PotionEffect effect, boolean p_70695_2_) - { + protected void onChangedPotionEffect(PotionEffect effect, boolean p_70695_2_) { } @Override - protected void onFinishedPotionEffect(PotionEffect effect) - { + protected void onFinishedPotionEffect(PotionEffect effect) { } - protected void playEquipSound(@Nullable ItemStack stack) - { + protected void playEquipSound(@Nullable ItemStack stack) { } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java index feca5d39..aae512d7 100644 --- a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java +++ b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java @@ -1,17 +1,14 @@ package WayofTime.bloodmagic.fuel; -import WayofTime.bloodmagic.item.ItemComponent; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.ItemComponent; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.IFuelHandler; -public class FuelHandler implements IFuelHandler -{ +public class FuelHandler implements IFuelHandler { @Override - public int getBurnTime(ItemStack fuel) - { - if (fuel != null && fuel.getItem() == RegistrarBloodMagicItems.COMPONENT && fuel.getMetadata() == ItemComponent.getStack(ItemComponent.SAND_COAL).getMetadata()) - { + public int getBurnTime(ItemStack fuel) { + if (fuel != null && fuel.getItem() == RegistrarBloodMagicItems.COMPONENT && fuel.getMetadata() == ItemComponent.getStack(ItemComponent.SAND_COAL).getMetadata()) { return 1600; } diff --git a/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java b/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java index 089ea4f1..9b67708b 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java +++ b/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java @@ -4,17 +4,14 @@ import com.google.gson.*; import java.lang.reflect.Type; -public abstract class SerializerBase implements JsonDeserializer, JsonSerializer -{ +public abstract class SerializerBase implements JsonDeserializer, JsonSerializer { @Override - public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException - { + 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) - { + public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { return context.serialize(src); } diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java index 709c66a8..1f947941 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.gson; -import java.lang.reflect.Type; - +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import com.google.gson.*; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.network.datasync.DataParameter; @@ -10,36 +10,24 @@ import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; +import java.lang.reflect.Type; -public class Serializers -{ +public class Serializers { // Data serializers - public static final DataSerializer WILL_TYPE_SERIALIZER = new DataSerializer() - { + public static final DataSerializer WILL_TYPE_SERIALIZER = new DataSerializer() { @Override - public void write(PacketBuffer buf, EnumDemonWillType value) - { + public void write(PacketBuffer buf, EnumDemonWillType value) { buf.writeEnumValue(value); } @Override - public EnumDemonWillType read(PacketBuffer buf) - { + public EnumDemonWillType read(PacketBuffer buf) { return buf.readEnumValue(EnumDemonWillType.class); } @Override - public DataParameter createKey(int id) - { + public DataParameter createKey(int id) { return new DataParameter<>(id, this); } @@ -50,64 +38,53 @@ public class Serializers }; // Serializers - public static final SerializerBase FACING_SERIALIZER = new SerializerBase() - { + public static final SerializerBase FACING_SERIALIZER = new SerializerBase() { @Override - public Class getType() - { + public Class getType() { return EnumFacing.class; } @Override - public EnumFacing deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException - { + public EnumFacing deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { return EnumFacing.byName(json.getAsString()); } }; - public static final SerializerBase RESOURCELOCATION_SERIALIZER = new SerializerBase() - { + public static final SerializerBase RESOURCELOCATION_SERIALIZER = new SerializerBase() { @Override - public Class getType() - { + public Class getType() { return ResourceLocation.class; } @Override - public ResourceLocation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException - { + 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) - { + public JsonElement serialize(ResourceLocation src, Type typeOfSrc, JsonSerializationContext context) { JsonObject object = new JsonObject(); object.addProperty("domain", src.getResourceDomain()); object.addProperty("path", src.getResourcePath()); return object; } }; - public static final SerializerBase ITEMMETA_SERIALIZER = new SerializerBase() - { + public static final SerializerBase ITEMMETA_SERIALIZER = new SerializerBase() { @Override - public Class getType() - { + public Class getType() { return ItemStack.class; } @Override - public ItemStack deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException - { + 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) - { + 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()); @@ -117,8 +94,7 @@ public class Serializers 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 - { + static { DataSerializers.registerSerializer(WILL_TYPE_SERIALIZER); } } diff --git a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java index 9c72bff4..b9ef76f0 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java @@ -5,59 +5,51 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; -public class IncenseAltarComponent -{ +public class IncenseAltarComponent { public final BlockPos offsetPos; public final Block block; public final IBlockState state; - public IncenseAltarComponent(BlockPos offsetPos, Block block, IBlockState state) - { + public IncenseAltarComponent(BlockPos offsetPos, Block block, IBlockState state) { this.offsetPos = offsetPos; this.block = block; this.state = state; } - public boolean doesBlockMatch(Block block, IBlockState state) - { + public boolean doesBlockMatch(Block block, IBlockState state) { return this.block == block && block.getMetaFromState(state) == this.block.getMetaFromState(this.state); } /** * Base rotation is north. */ - public BlockPos getOffset(EnumFacing rotation) - { + public BlockPos getOffset(EnumFacing rotation) { return new BlockPos(this.getX(rotation), offsetPos.getY(), this.getZ(rotation)); } - public int getX(EnumFacing 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 getX(EnumFacing 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(EnumFacing 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(); + public int getZ(EnumFacing 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 index ca874d2b..9f01f968 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java @@ -11,61 +11,48 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -public class IncenseAltarHandler -{ +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 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)) - { + public static void registerIncenseComponent(int altarLevel, IncenseAltarComponent component) { + if (incenseComponentMap.containsKey(altarLevel)) { incenseComponentMap.get(altarLevel).add(component); - } else - { + } else { List list = new ArrayList(); list.add(component); incenseComponentMap.put(altarLevel, list); } } - public static void registerIncenseComponent(int altarLevel, BlockPos offsetPos, Block block, IBlockState state) - { + public static void registerIncenseComponent(int altarLevel, BlockPos offsetPos, Block block, IBlockState state) { registerIncenseComponent(altarLevel, new IncenseAltarComponent(offsetPos, block, state)); } - public static double getMaxIncenseBonusFromComponents(World world, BlockPos pos) - { + public static double getMaxIncenseBonusFromComponents(World world, BlockPos pos) { double accumulatedBonus = 0; - for (int i = 0; i < incenseBonuses.length; i++) - { + for (int i = 0; i < incenseBonuses.length; i++) { double previousBonus = (i <= 0 ? 0 : incenseBonuses[i - 1]); double nextBonus = incenseBonuses[i]; - if (!incenseComponentMap.containsKey(i)) - { + if (!incenseComponentMap.containsKey(i)) { accumulatedBonus += (nextBonus - previousBonus); - } else - { + } else { boolean hasAllComponentsThisTier = true; - for (IncenseAltarComponent component : incenseComponentMap.get(i)) - { + for (IncenseAltarComponent component : incenseComponentMap.get(i)) { BlockPos offsetPos = pos.add(component.getOffset(EnumFacing.NORTH)); IBlockState state = world.getBlockState(offsetPos); Block block = state.getBlock(); - if (component.doesBlockMatch(block, state)) - { + if (component.doesBlockMatch(block, state)) { hasAllComponentsThisTier = false; - } else - { + } else { accumulatedBonus += (nextBonus - previousBonus) / incenseComponentMap.get(i).size(); } } - if (!hasAllComponentsThisTier) - { + if (!hasAllComponentsThisTier) { break; } } @@ -74,16 +61,12 @@ public class IncenseAltarHandler return accumulatedBonus; } - public static double getMaxIncenseBonusFromRoads(int roads) - { + public static double getMaxIncenseBonusFromRoads(int roads) { double previousBonus = 0; - for (int i = 0; i < incenseBonuses.length; i++) - { - if (roads >= roadsRequired[i]) - { + for (int i = 0; i < incenseBonuses.length; i++) { + if (roads >= roadsRequired[i]) { previousBonus = incenseBonuses[i]; - } else - { + } else { return previousBonus; } } @@ -91,18 +74,14 @@ public class IncenseAltarHandler return previousBonus; } - public static double getIncenseBonusFromComponents(World world, BlockPos pos, double tranquility, int roads) - { + 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]) - { + for (int i = 0; i < incenseBonuses.length; i++) { + if (tranquility >= tranquilityRequired[i]) { possibleBonus = incenseBonuses[i]; - } else if (i >= 1) - { + } else if (i >= 1) { possibleBonus += (incenseBonuses[i] - possibleBonus) * (tranquility - tranquilityRequired[i - 1]) / (tranquilityRequired[i] - tranquilityRequired[i - 1]); break; } diff --git a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java index b5d6b14d..f6b01f98 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java @@ -10,16 +10,12 @@ import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class TranquilityHandlers -{ +public class TranquilityHandlers { - public static class Plant implements ITranquilityHandler - { + public static class Plant implements ITranquilityHandler { @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) - { - if (block instanceof BlockLeaves) - { + public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + if (block instanceof BlockLeaves) { return new TranquilityStack(EnumTranquilityType.PLANT, 1); } @@ -27,13 +23,10 @@ public class TranquilityHandlers } } - public static class Lava implements ITranquilityHandler - { + public static class Lava implements ITranquilityHandler { @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) - { - if (block == Blocks.LAVA || block == Blocks.FLOWING_LAVA) - { + public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + if (block == Blocks.LAVA || block == Blocks.FLOWING_LAVA) { return new TranquilityStack(EnumTranquilityType.LAVA, 1.2); } @@ -41,18 +34,14 @@ public class TranquilityHandlers } } - public static class Fire implements ITranquilityHandler - { + public static class Fire implements ITranquilityHandler { @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) - { - if (block instanceof BlockFire) - { + public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + if (block instanceof BlockFire) { return new TranquilityStack(EnumTranquilityType.FIRE, 1); } - if (block == Blocks.NETHERRACK) - { + if (block == Blocks.NETHERRACK) { return new TranquilityStack(EnumTranquilityType.FIRE, 0.5); } @@ -60,23 +49,18 @@ public class TranquilityHandlers } } - public static class Earth implements ITranquilityHandler - { + public static class Earth implements ITranquilityHandler { @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) - { - if (block == Blocks.DIRT) - { + public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + if (block == Blocks.DIRT) { return new TranquilityStack(EnumTranquilityType.EARTHEN, 0.25); } - if (block instanceof BlockGrass) - { + if (block instanceof BlockGrass) { return new TranquilityStack(EnumTranquilityType.EARTHEN, 0.5); } - if (block == Blocks.FARMLAND) - { + if (block == Blocks.FARMLAND) { return new TranquilityStack(EnumTranquilityType.EARTHEN, 1); } @@ -84,13 +68,10 @@ public class TranquilityHandlers } } - public static class Crop implements ITranquilityHandler - { + public static class Crop implements ITranquilityHandler { @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) - { - if (block == Blocks.POTATOES || block == Blocks.CARROTS || block == Blocks.WHEAT || block == Blocks.NETHER_WART || block == Blocks.BEETROOTS) - { + public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + if (block == Blocks.POTATOES || block == Blocks.CARROTS || block == Blocks.WHEAT || block == Blocks.NETHER_WART || block == Blocks.BEETROOTS) { return new TranquilityStack(EnumTranquilityType.CROP, 1); } @@ -98,13 +79,10 @@ public class TranquilityHandlers } } - public static class Tree implements ITranquilityHandler - { + public static class Tree implements ITranquilityHandler { @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) - { - if (block instanceof BlockLog) - { + public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + if (block instanceof BlockLog) { return new TranquilityStack(EnumTranquilityType.TREE, 1); } @@ -112,18 +90,14 @@ public class TranquilityHandlers } } - public static class Water implements ITranquilityHandler - { + public static class Water implements ITranquilityHandler { @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) - { - if (block == Blocks.WATER || block == Blocks.FLOWING_WATER) - { + public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + if (block == Blocks.WATER || block == Blocks.FLOWING_WATER) { return new TranquilityStack(EnumTranquilityType.WATER, 1); } - if (block == RegistrarBloodMagicBlocks.LIFE_ESSENCE) - { + if (block == RegistrarBloodMagicBlocks.LIFE_ESSENCE) { return new TranquilityStack(EnumTranquilityType.WATER, 1.5); } diff --git a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java index 44b3af7e..c7b0abc7 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java @@ -1,42 +1,34 @@ package WayofTime.bloodmagic.inversion; -import java.util.HashMap; -import java.util.Map; - +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import java.util.HashMap; +import java.util.Map; -public class CorruptionHandler -{ +public class CorruptionHandler { public static Map, Map> corruptBlockMap = new HashMap, Map>(); - public static void registerBlockCorruption(EnumDemonWillType type, Block block, int meta, IBlockState corruptedState) - { + public static void registerBlockCorruption(EnumDemonWillType type, Block block, int meta, IBlockState corruptedState) { Pair pair = Pair.of(block, meta); - if (corruptBlockMap.containsKey(pair)) - { + if (corruptBlockMap.containsKey(pair)) { Map stateMap = corruptBlockMap.get(pair); stateMap.put(type, corruptedState); - } else - { + } else { Map stateMap = new HashMap(); stateMap.put(type, corruptedState); corruptBlockMap.put(pair, stateMap); } } - public static boolean isBlockCorruptible(World world, EnumDemonWillType type, BlockPos pos, IBlockState state, Block block) - { + public static boolean isBlockCorruptible(World world, EnumDemonWillType type, BlockPos pos, IBlockState state, Block block) { int meta = block.getMetaFromState(state); Pair pair = Pair.of(block, meta); - if (corruptBlockMap.containsKey(pair)) - { + if (corruptBlockMap.containsKey(pair)) { Map stateMap = corruptBlockMap.get(pair); return stateMap.containsKey(type); } @@ -44,15 +36,12 @@ public class CorruptionHandler return false; } - public static boolean corruptBlock(World world, EnumDemonWillType type, BlockPos pos, IBlockState state, Block block) - { + public static boolean corruptBlock(World world, EnumDemonWillType type, BlockPos pos, IBlockState state, Block block) { int meta = block.getMetaFromState(state); Pair pair = Pair.of(block, meta); - if (corruptBlockMap.containsKey(pair)) - { + if (corruptBlockMap.containsKey(pair)) { Map stateMap = corruptBlockMap.get(pair); - if (stateMap.containsKey(type)) - { + if (stateMap.containsKey(type)) { return world.setBlockState(pos, stateMap.get(type)); } } @@ -61,36 +50,27 @@ public class CorruptionHandler } /** - * * @param world * @param type * @param centerPos * @param radius - * @param featheringChance - * Chance that the block within the featheringDepth is NOT altered. + * @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)) - { + 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) - { + 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)) - { + if (world.isAirBlock(centerPos)) { continue; } diff --git a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java index 1a13c8f5..d1a1e9aa 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java @@ -1,48 +1,36 @@ package WayofTime.bloodmagic.inversion; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -public class InversionPillarHandler -{ +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) - { + public static boolean addPillarToMap(World world, EnumDemonWillType type, BlockPos pos) { int dim = world.provider.getDimension(); - if (pillarMap.containsKey(dim)) - { + if (pillarMap.containsKey(dim)) { Map> willMap = pillarMap.get(dim); - if (willMap.containsKey(type)) - { - if (!willMap.get(type).contains(pos)) - { + if (willMap.containsKey(type)) { + if (!willMap.get(type).contains(pos)) { willMap.get(type).add(pos); onPillarAdded(world, type, pos); return true; - } else - { + } else { return false; } - } else - { + } else { List posList = new ArrayList(); posList.add(pos); willMap.put(type, posList); onPillarAdded(world, type, pos); return true; } - } else - { + } else { Map> willMap = new HashMap>(); List posList = new ArrayList(); posList.add(pos); @@ -54,44 +42,34 @@ public class InversionPillarHandler } } - public static boolean removePillarFromMap(World world, EnumDemonWillType type, BlockPos pos) - { + public static boolean removePillarFromMap(World world, EnumDemonWillType type, BlockPos pos) { int dim = world.provider.getDimension(); - if (pillarMap.containsKey(dim)) - { + if (pillarMap.containsKey(dim)) { Map> willMap = pillarMap.get(dim); - if (willMap.containsKey(type)) - { - if (willMap.get(type).contains(pos)) - { + if (willMap.containsKey(type)) { + if (willMap.get(type).contains(pos)) { onPillarRemoved(world, type, pos); return willMap.get(type).remove(pos); - } else - { + } else { return false; } - } else - { + } else { return false; } - } else - { + } else { return false; } } //Assume that it has been added already. - private static void onPillarAdded(World world, EnumDemonWillType type, BlockPos pos) - { + private static void onPillarAdded(World world, EnumDemonWillType type, BlockPos pos) { System.out.println("Adding..."); List closePosList = new ArrayList(); int dim = world.provider.getDimension(); - if (pillarMap.containsKey(dim)) - { + if (pillarMap.containsKey(dim)) { Map> willMap = pillarMap.get(dim); - if (willMap.containsKey(type)) - { + if (willMap.containsKey(type)) { List otherPosList = willMap.get(type); for (BlockPos closePos : otherPosList) { @@ -102,11 +80,9 @@ public class InversionPillarHandler } } - if (nearPillarMap.containsKey(dim)) - { + if (nearPillarMap.containsKey(dim)) { Map>> willMap = nearPillarMap.get(dim); - if (willMap.containsKey(type)) - { + if (willMap.containsKey(type)) { Map> posMap = willMap.get(type); for (BlockPos closePos : closePosList) { @@ -121,15 +97,13 @@ public class InversionPillarHandler } posMap.put(pos, closePosList); - } else - { + } else { Map> posMap = new HashMap>(); posMap.put(pos, closePosList); willMap.put(type, posMap); } - } else - { + } else { Map>> willMap = new HashMap>>(); Map> posMap = new HashMap>(); @@ -139,26 +113,20 @@ public class InversionPillarHandler } } - private static void onPillarRemoved(World world, EnumDemonWillType type, BlockPos pos) - { + private static void onPillarRemoved(World world, EnumDemonWillType type, BlockPos pos) { System.out.println("Removing..."); int dim = world.provider.getDimension(); - if (nearPillarMap.containsKey(dim)) - { + if (nearPillarMap.containsKey(dim)) { Map>> willMap = nearPillarMap.get(dim); - if (willMap.containsKey(type)) - { + if (willMap.containsKey(type)) { Map> posMap = willMap.get(type); List posList = posMap.get(pos); - if (posList != null) - { + if (posList != null) { Iterator itr = posList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { BlockPos checkPos = itr.next(); List checkPosList = posMap.get(checkPos); - if (checkPosList != null) - { + if (checkPosList != null) { checkPosList.remove(pos); } } @@ -170,18 +138,14 @@ public class InversionPillarHandler } //TODO: Change to use the nearPillarMap. - public static List getNearbyPillars(World world, EnumDemonWillType type, BlockPos pos) - { + public static List getNearbyPillars(World world, EnumDemonWillType type, BlockPos pos) { int dim = world.provider.getDimension(); - if (nearPillarMap.containsKey(dim)) - { + if (nearPillarMap.containsKey(dim)) { Map>> willMap = nearPillarMap.get(dim); - if (willMap.containsKey(type)) - { + if (willMap.containsKey(type)) { Map> posMap = willMap.get(type); List posList = posMap.get(pos); - if (posList != null) - { + if (posList != null) { return posList; } } @@ -190,24 +154,20 @@ public class InversionPillarHandler return new ArrayList(); } - public static List getAllConnectedPillars(World world, EnumDemonWillType type, BlockPos pos) - { + 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)) - { + if (nearPillarMap.containsKey(dim)) { Map>> willMap = nearPillarMap.get(dim); - if (willMap.containsKey(type)) - { + if (willMap.containsKey(type)) { Map> posMap = willMap.get(type); // This is where the magic happens. - while (!uncheckedPosList.isEmpty()) - { + while (!uncheckedPosList.isEmpty()) { //Positions that are new this iteration and need to be dumped into uncheckedPosList next iteration. List newPosList = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index 2bb80bde..c0560ec7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -5,8 +5,6 @@ import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; import net.minecraft.world.World; @@ -18,12 +16,10 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.List; -public class ItemActivationCrystal extends ItemBindableBase implements IVariantProvider -{ - public static String[] names = { "weak", "awakened", "creative" }; +public class ItemActivationCrystal extends ItemBindableBase implements IVariantProvider { + public static String[] names = {"weak", "awakened", "creative"}; - public ItemActivationCrystal() - { + public ItemActivationCrystal() { super(); setUnlocalizedName(BloodMagic.MODID + ".activationCrystal."); @@ -31,15 +27,13 @@ public class ItemActivationCrystal extends ItemBindableBase implements IVariantP } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -49,16 +43,14 @@ public class ItemActivationCrystal extends ItemBindableBase implements IVariantP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localize("tooltip.bloodmagic.activationCrystal." + names[stack.getItemDamage()])); super.addInformation(stack, world, tooltip, flag); } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=weak")); ret.add(new ImmutablePair(1, "type=demonic")); @@ -66,8 +58,7 @@ public class ItemActivationCrystal extends ItemBindableBase implements IVariantP return ret; } - public int getCrystalLevel(ItemStack stack) - { + public int getCrystalLevel(ItemStack stack) { return stack.getItemDamage() > 1 ? Integer.MAX_VALUE : stack.getItemDamage() + 1; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index ebbc7239..123f06f1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -1,26 +1,5 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; - -import WayofTime.bloodmagic.util.helper.NumeralHelper; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; -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 org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.api.Constants; @@ -33,14 +12,31 @@ import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; +import WayofTime.bloodmagic.util.helper.NumeralHelper; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumHand; +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 org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; -public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantProvider -{ +import java.util.ArrayList; +import java.util.List; + +public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantProvider { private EnumAltarTier tierToBuild = EnumAltarTier.ONE; - public ItemAltarMaker() - { + public ItemAltarMaker() { super(); setUnlocalizedName(BloodMagic.MODID + ".altarMaker"); setCreativeTab(BloodMagic.TAB_BM); @@ -50,30 +46,26 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote) return super.onItemRightClick(world, player, hand); - if (!player.capabilities.isCreativeMode) - { + if (!player.capabilities.isCreativeMode) { ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.creativeOnly")); return super.onItemRightClick(world, player, hand); } stack = NBTHelper.checkNBT(stack); - if (player.isSneaking()) - { + if (player.isSneaking()) { if (stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) >= EnumAltarTier.MAXTIERS - 1) stack.getTagCompound().setInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER, 0); else @@ -88,8 +80,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP if (rayTrace == null || rayTrace.typeOfHit == RayTraceResult.Type.MISS || rayTrace.typeOfHit == RayTraceResult.Type.ENTITY) return super.onItemRightClick(world, player, hand); - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK && world.getBlockState(rayTrace.getBlockPos()).getBlock() instanceof BlockAltar) - { + if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK && world.getBlockState(rayTrace.getBlockPos()).getBlock() instanceof BlockAltar) { ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.building", NumeralHelper.toRoman(tierToBuild.toInt()))); buildAltar(world, rayTrace.getBlockPos()); IBlockState state = world.getBlockState(rayTrace.getBlockPos()); @@ -101,28 +92,24 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=altarmaker")); return ret; } - public void setTierToBuild(EnumAltarTier tierToBuild) - { + public void setTierToBuild(EnumAltarTier tierToBuild) { this.tierToBuild = tierToBuild; } - public void buildAltar(World world, BlockPos pos) - { + public void buildAltar(World world, BlockPos pos) { if (world.isRemote) return; if (tierToBuild == EnumAltarTier.ONE) return; - for (AltarComponent altarComponent : tierToBuild.getAltarComponents()) - { + for (AltarComponent altarComponent : tierToBuild.getAltarComponents()) { BlockPos componentPos = pos.add(altarComponent.getOffset()); Block blockForComponent = Utils.getBlockForComponent(altarComponent.getComponent()); @@ -132,8 +119,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP ((IBloodAltar) world.getTileEntity(pos)).checkTier(); } - public String destroyAltar(EntityPlayer player) - { + public String destroyAltar(EntityPlayer player) { World world = player.getEntityWorld(); if (world.isRemote) return ""; @@ -145,10 +131,8 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP if (altarTier.equals(EnumAltarTier.ONE)) return "" + altarTier.toInt(); - else - { - for (AltarComponent altarComponent : altarTier.getAltarComponents()) - { + else { + for (AltarComponent altarComponent : altarTier.getAltarComponents()) { BlockPos componentPos = pos.add(altarComponent.getOffset()); IBlockState componentState = world.getBlockState(pos); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index c83f0634..4734f6f9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -1,8 +1,10 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; - +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 net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -15,20 +17,14 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -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 java.util.ArrayList; +import java.util.List; -public class ItemArcaneAshes extends Item implements IVariantProvider -{ - public ItemArcaneAshes() - { +public class ItemArcaneAshes extends Item implements IVariantProvider { + public ItemArcaneAshes() { setUnlocalizedName(BloodMagic.MODID + ".arcaneAshes"); setMaxStackSize(1); setMaxDamage(19); //Allows for 20 uses @@ -37,26 +33,21 @@ public class ItemArcaneAshes extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.arcaneAshes")); } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); BlockPos newPos = blockPos.offset(side); - if (world.isAirBlock(newPos)) - { - if (!world.isRemote) - { + if (world.isAirBlock(newPos)) { + if (!world.isRemote) { EnumFacing rotation = EnumFacing.fromAngle(player.getRotationYawHead()); world.setBlockState(newPos, RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getDefaultState()); TileEntity tile = world.getTileEntity(newPos); - if (tile instanceof TileAlchemyArray) - { + if (tile instanceof TileAlchemyArray) { ((TileAlchemyArray) tile).setRotation(rotation); } @@ -70,8 +61,7 @@ public class ItemArcaneAshes extends Item implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=arcaneashes")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index 1aa5d370..195be959 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -6,7 +6,6 @@ import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -14,10 +13,8 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; -public class ItemBindableBase extends ItemBindable -{ - public ItemBindableBase() - { +public class ItemBindableBase extends ItemBindable { + public ItemBindableBase() { super(); setCreativeTab(BloodMagic.TAB_BM); @@ -25,8 +22,7 @@ public class ItemBindableBase extends ItemBindable @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index d071fbc4..46f441da 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -1,9 +1,14 @@ package WayofTime.bloodmagic.item; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.util.helper.TextHelper; +import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -14,29 +19,19 @@ import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; - -import com.google.common.base.Strings; import javax.annotation.Nullable; +import java.util.List; -public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindable -{ - public ItemBloodOrb() - { +public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindable { + public ItemBloodOrb() { setUnlocalizedName(BloodMagic.MODID + ".orb"); this.setMaxDamage(0); setHasSubtypes(true); } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { BloodOrb orb = getOrb(stack); if (orb == null) return super.getUnlocalizedName(stack); @@ -45,8 +40,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab } @Override - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -60,8 +54,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); BloodOrb orb = getOrb(stack); @@ -76,8 +69,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab if (PlayerHelper.isFakePlayer(player)) return super.onItemRightClick(world, player, hand); - if (!stack.hasTagCompound()) - { + if (!stack.hasTagCompound()) { return super.onItemRightClick(world, player, hand); } @@ -97,8 +89,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.desc")); BloodOrb orb = getOrb(stack); @@ -109,22 +100,19 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab } @Override - public ItemStack getContainerItem(ItemStack stack) - { + public ItemStack getContainerItem(ItemStack stack) { return stack.copy(); } @Override - public boolean hasContainerItem(ItemStack stack) - { + public boolean hasContainerItem(ItemStack stack) { return true; } // IBindable @Override - public boolean onBind(EntityPlayer player, ItemStack stack) - { + public boolean onBind(EntityPlayer player, ItemStack stack) { return true; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java index bf9f9f78..acbf2214 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java @@ -14,12 +14,10 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.List; -public class ItemBloodShard extends Item implements IVariantProvider -{ - public String[] names = { "weak", "demon" }; +public class ItemBloodShard extends Item implements IVariantProvider { + public String[] names = {"weak", "demon"}; - public ItemBloodShard() - { + public ItemBloodShard() { super(); setCreativeTab(BloodMagic.TAB_BM); @@ -29,8 +27,7 @@ public class ItemBloodShard extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -39,14 +36,12 @@ public class ItemBloodShard extends Item implements IVariantProvider } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=weak")); ret.add(new ImmutablePair(1, "type=demonic")); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index b76723ca..47d13a14 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -1,11 +1,13 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.ItemStackWrapper; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; +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.BlockLeaves; import net.minecraft.block.material.Material; @@ -28,40 +30,31 @@ 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 WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import com.google.common.collect.HashMultiset; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; -public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider -{ +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() - { + public ItemBoundAxe() { super("axe", 7, EFFECTIVE_ON); } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { return true; } @Override - public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) - { + public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) { return true; } @Override - protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) - { + protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { if (world.isRemote) return; @@ -73,12 +66,9 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider 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++) - { + 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); BlockStack blockStack = BlockStack.getStackFromPos(world, blockPos); @@ -92,16 +82,13 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) continue; - if (blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1.0F) - { + if (blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1.0F) { float strengthVsBlock = getStrVsBlock(stack, blockStack.getState()); - if (strengthVsBlock > 1.1F || blockStack.getBlock() instanceof BlockLeaves && world.canMineBlockBody(player, blockPos)) - { + if (strengthVsBlock > 1.1F || blockStack.getBlock() instanceof BlockLeaves && world.canMineBlockBody(player, blockPos)) { if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) drops.add(new ItemStackWrapper(blockStack)); - else - { + else { List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); for (ItemStack stacks : itemDrops) @@ -121,11 +108,9 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EntityEquipmentSlot.MAINHAND) - { + if (equipmentSlot == EntityEquipmentSlot.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)); } @@ -134,21 +119,18 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionActivatable("ItemBoundAxe"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); ret.add("active=true"); ret.add("active=false"); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index c5587491..bb1a1ccf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -1,9 +1,13 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.ItemStackWrapper; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; +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.material.Material; import net.minecraft.block.state.IBlockState; @@ -25,50 +29,38 @@ 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 WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; - -import com.google.common.collect.HashMultiset; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; -public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider -{ +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() - { + public ItemBoundPickaxe() { super("pickaxe", 5, EFFECTIVE_ON); } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { return true; } @Override - public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) - { + public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) { return true; } @Override - public boolean canHarvestBlock(IBlockState blockIn) - { + public boolean canHarvestBlock(IBlockState 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); + : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2); } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) - { + public float getStrVsBlock(ItemStack stack, IBlockState state) { if (!getActivated(stack)) return 1.0F; @@ -76,8 +68,7 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider } @Override - protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) - { + protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { if (world.isRemote) return; @@ -89,12 +80,9 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider 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++) - { + 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); BlockStack blockStack = BlockStack.getStackFromPos(world, blockPos); @@ -108,16 +96,13 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) continue; - if (blockStack.getBlock() != null && blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1) - { + if (blockStack.getBlock() != null && blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1) { float strengthVsBlock = getStrVsBlock(stack, blockStack.getState()); - if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) - { + if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) drops.add(new ItemStackWrapper(blockStack)); - else - { + else { List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); for (ItemStack stacks : itemDrops) drops.add(ItemStackWrapper.getHolder(stacks)); @@ -136,11 +121,9 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EntityEquipmentSlot.MAINHAND) - { + if (equipmentSlot == EntityEquipmentSlot.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)); } @@ -149,21 +132,18 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionActivatable("ItemBoundPickaxe"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); ret.add("active=true"); ret.add("active=false"); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index 16e3d7ac..1f621468 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -1,9 +1,13 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.ItemStackWrapper; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; +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.material.Material; import net.minecraft.block.state.IBlockState; @@ -25,42 +29,31 @@ 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 WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; - -import com.google.common.collect.HashMultiset; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; -public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider -{ +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() - { + public ItemBoundShovel() { super("shovel", 1, EFFECTIVE_ON); } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { return true; } @Override - public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) - { + public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) { return true; } @Override - protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) - { + protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { if (world.isRemote) return; @@ -72,12 +65,9 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider 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++) - { + 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); BlockStack blockStack = BlockStack.getStackFromPos(world, blockPos); @@ -92,16 +82,13 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) continue; - if (blockStack.getBlock() != null && blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1) - { + if (blockStack.getBlock() != null && blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1) { float strengthVsBlock = getStrVsBlock(stack, blockStack.getState()); - if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) - { + if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) drops.add(new ItemStackWrapper(blockStack)); - else - { + else { List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); for (ItemStack stacks : itemDrops) drops.add(ItemStackWrapper.getHolder(stacks)); @@ -120,11 +107,9 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider } @Override - public Multimap getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot) - { + public Multimap getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot) { Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EntityEquipmentSlot.MAINHAND) - { + if (equipmentSlot == EntityEquipmentSlot.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)); } @@ -133,21 +118,18 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionActivatable("ItemBoundShovel"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); ret.add("active=true"); ret.add("active=false"); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 056afef8..339d6d9b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -1,12 +1,20 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IActivatable; +import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.Utils; +import WayofTime.bloodmagic.util.helper.TextHelper; +import com.google.common.base.Strings; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; @@ -17,7 +25,6 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.util.ActionResult; @@ -28,25 +35,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IActivatable; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; -public class ItemBoundSword extends ItemSword implements IBindable, IActivatable, IMeshProvider -{ - public ItemBoundSword() - { +public class ItemBoundSword extends ItemSword implements IBindable, IActivatable, IMeshProvider { + public ItemBoundSword() { super(RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL); setUnlocalizedName(BloodMagic.MODID + ".bound.sword"); @@ -54,8 +49,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); @@ -74,8 +68,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable } @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) - { + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { if (Strings.isNullOrEmpty(getOwnerUUID(stack))) { setActivatedState(stack, false); return; @@ -86,27 +79,23 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { return true; } @Override - public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) - { + public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) { return true; } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return oldStack.getItem() != newStack.getItem(); } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs tab, NonNullList subItems) - { + public void getSubItems(CreativeTabs tab, NonNullList subItems) { if (!isInCreativeTab(tab)) return; @@ -115,8 +104,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -130,11 +118,9 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (equipmentSlot == EntityEquipmentSlot.MAINHAND) - { + if (equipmentSlot == EntityEquipmentSlot.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)); } @@ -143,21 +129,18 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionActivatable("ItemBoundSword"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); ret.add("active=true"); ret.add("active=false"); @@ -167,36 +150,30 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable // IBindable @Override - public boolean onBind(EntityPlayer player, ItemStack stack) - { + public boolean onBind(EntityPlayer player, ItemStack stack) { return true; } @Override - public String getOwnerName(ItemStack stack) - { + public String getOwnerName(ItemStack stack) { return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; } @Override - public String getOwnerUUID(ItemStack stack) - { + public String getOwnerUUID(ItemStack stack) { return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; } // IActivatable @Override - public boolean getActivated(ItemStack stack) - { + public boolean getActivated(ItemStack stack) { return stack != null && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); } @Override - public ItemStack setActivatedState(ItemStack stack, boolean activated) - { - if (stack != null) - { + public ItemStack setActivatedState(ItemStack stack, boolean activated) { + if (stack != null) { NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); return stack; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index d5ea23b5..3ce61755 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -1,17 +1,22 @@ package WayofTime.bloodmagic.item; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.ItemStackWrapper; +import WayofTime.bloodmagic.api.event.BoundToolEvent; +import WayofTime.bloodmagic.api.iface.IActivatable; +import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.Utils; +import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; +import com.google.common.collect.Multiset; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; @@ -23,7 +28,6 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import net.minecraft.util.ActionResult; @@ -35,30 +39,20 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.event.BoundToolEvent; -import WayofTime.bloodmagic.api.iface.IActivatable; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multiset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; -public class ItemBoundTool extends ItemTool implements IBindable, IActivatable -{ +public class ItemBoundTool extends ItemTool 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 final int chargeTime = 30; - - public ItemBoundTool(String name, float damage, Set effectiveBlocks) - { + public ItemBoundTool(String name, float damage, Set effectiveBlocks) { super(damage, 1, RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL, effectiveBlocks); setUnlocalizedName(BloodMagic.MODID + ".bound." + name); setCreativeTab(BloodMagic.TAB_BM); @@ -69,20 +63,17 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) - { + public float getStrVsBlock(ItemStack stack, IBlockState state) { return getActivated(stack) ? toolMaterial.getEfficiencyOnProperMaterial() : 1.0F; } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return slotChanged; } @Override - public void getSubItems(CreativeTabs tab, NonNullList subItems) - { + public void getSubItems(CreativeTabs tab, NonNullList subItems) { if (isInCreativeTab(tab)) return; @@ -90,19 +81,16 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable } @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) - { + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { if (Strings.isNullOrEmpty(getOwnerUUID(stack))) { setActivatedState(stack, false); return; } - if (entity instanceof EntityPlayer && getActivated(stack) && isSelected && getBeingHeldDown(stack) && stack == ((EntityPlayer) entity).getActiveItemStack()) - { + if (entity instanceof EntityPlayer && getActivated(stack) && isSelected && getBeingHeldDown(stack) && stack == ((EntityPlayer) entity).getActiveItemStack()) { EntityPlayer player = (EntityPlayer) entity; setHeldDownCount(stack, Math.min(player.getItemInUseCount(), chargeTime)); - } else if (!isSelected) - { + } else if (!isSelected) { setBeingHeldDown(stack, false); } @@ -110,41 +98,35 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage((EntityPlayer) entity, 20); } - protected int getHeldDownCount(ItemStack stack) - { + protected int getHeldDownCount(ItemStack stack) { if (!heldDownCountMap.containsKey(stack)) return 0; return heldDownCountMap.get(stack); } - protected void setHeldDownCount(ItemStack stack, int count) - { + protected void setHeldDownCount(ItemStack stack, int count) { heldDownCountMap.put(stack, count); } - protected boolean getBeingHeldDown(ItemStack stack) - { + protected boolean getBeingHeldDown(ItemStack stack) { if (!heldDownMap.containsKey(stack)) return false; return heldDownMap.get(stack); } - protected void setBeingHeldDown(ItemStack stack, boolean heldDown) - { + protected void setBeingHeldDown(ItemStack stack, boolean heldDown) { heldDownMap.put(stack, heldDown); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); - if (!player.isSneaking() && 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); @@ -157,13 +139,10 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable } @Override - public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft) - { - if (entityLiving instanceof EntityPlayer) - { + public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft) { + if (entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entityLiving; - if (!player.isSneaking() && getActivated(stack)) - { + 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)) @@ -177,39 +156,33 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable } } - protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) - { + protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { } @Override - public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entityLiving) - { + public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entityLiving) { return stack; } @Override - public int getMaxItemUseDuration(ItemStack stack) - { + public int getMaxItemUseDuration(ItemStack stack) { return 72000; } @Override - public EnumAction getItemUseAction(ItemStack stack) - { + public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.BOW; } @Override - public int getItemEnchantability() - { + public int getItemEnchantability() { return 50; } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (TextHelper.canTranslate(tooltipBase + "desc")) tooltip.add(TextHelper.localizeEffect(tooltipBase + "desc")); @@ -225,80 +198,51 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable } @Override - public Set getToolClasses(ItemStack stack) - { + public Set getToolClasses(ItemStack stack) { return ImmutableSet.of(name); } - public Multimap getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot) - { + public Multimap getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot) { return ArrayListMultimap.create(); // No-op } @Override - public boolean showDurabilityBar(ItemStack stack) - { + public boolean showDurabilityBar(ItemStack stack) { return getActivated(stack) && getBeingHeldDown(stack); } @Override - public double getDurabilityForDisplay(ItemStack stack) - { + public double getDurabilityForDisplay(ItemStack stack) { return ((double) -Math.min(getHeldDownCount(stack), chargeTime) / chargeTime) + 1; } - protected static void dropStacks(Multiset drops, World world, BlockPos posToDrop) - { - for (Multiset.Entry entry : drops.entrySet()) - { - int count = entry.getCount(); - ItemStackWrapper stack = entry.getElement(); - int maxStackSize = stack.item.getItemStackLimit(stack.toStack(1)); - - while (count >= maxStackSize) - { - world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(maxStackSize))); - count -= maxStackSize; - } - - if (count > 0) - world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(count))); - } + @Override + public String getOwnerName(ItemStack stack) { + return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; } // IBindable @Override - public String getOwnerName(ItemStack stack) - { - return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; - } - - @Override - public String getOwnerUUID(ItemStack stack) - { + public String getOwnerUUID(ItemStack stack) { return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; } @Override - public boolean onBind(EntityPlayer player, ItemStack stack) - { + public boolean onBind(EntityPlayer player, ItemStack stack) { return true; } + @Override + public boolean getActivated(ItemStack stack) { + return stack != null && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); + } + // IActivatable @Override - public boolean getActivated(ItemStack stack) - { - return stack != null && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); - } - - @Override - public ItemStack setActivatedState(ItemStack stack, boolean activated) - { - if (stack != null) - { + public ItemStack setActivatedState(ItemStack stack, boolean activated) { + if (stack != null) { NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); return stack; } @@ -325,4 +269,20 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable public int getChargeTime() { return chargeTime; } + + protected static void dropStacks(Multiset drops, World world, BlockPos posToDrop) { + for (Multiset.Entry entry : drops.entrySet()) { + int count = entry.getCount(); + ItemStackWrapper stack = entry.getElement(); + int maxStackSize = stack.item.getItemStackLimit(stack.toStack(1)); + + while (count >= maxStackSize) { + world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(maxStackSize))); + count -= maxStackSize; + } + + if (count > 0) + world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(count))); + } + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java index eee18546..4363715e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java @@ -1,26 +1,21 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; - -public class ItemComponent extends Item implements IVariantProvider -{ - private static ArrayList names = new ArrayList(); +import java.util.ArrayList; +import java.util.List; +public class ItemComponent extends Item implements IVariantProvider { public static final String REAGENT_WATER = "reagentWater"; public static final String REAGENT_LAVA = "reagentLava"; public static final String REAGENT_AIR = "reagentAir"; @@ -54,9 +49,9 @@ public class ItemComponent extends Item implements IVariantProvider public static final String REAGENT_CLAW = "reagentClaw"; public static final String REAGENT_BOUNCE = "reagentBounce"; public static final String REAGENT_FROST = "reagentFrost"; + private static ArrayList names = new ArrayList(); - public ItemComponent() - { + public ItemComponent() { super(); setUnlocalizedName(BloodMagic.MODID + ".baseComponent."); @@ -66,8 +61,7 @@ public class ItemComponent extends Item implements IVariantProvider buildItemList(); } - private void buildItemList() - { + private void buildItemList() { names.add(0, REAGENT_WATER); names.add(1, REAGENT_LAVA); names.add(2, REAGENT_AIR); @@ -104,15 +98,13 @@ public class ItemComponent extends Item implements IVariantProvider } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names.get(stack.getItemDamage()); } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -120,22 +112,19 @@ public class ItemComponent extends Item implements IVariantProvider list.add(new ItemStack(this, 1, i)); } - public static ItemStack getStack(String name) - { - return new ItemStack(RegistrarBloodMagicItems.COMPONENT, 1, names.indexOf(name)); - } - @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); for (String name : names) ret.add(new ImmutablePair(names.indexOf(name), "type=" + name)); return ret; } - public static ItemStack getStack(String key, int stackSize) - { + public static ItemStack getStack(String name) { + return new ItemStack(RegistrarBloodMagicItems.COMPONENT, 1, names.indexOf(name)); + } + + public static ItemStack getStack(String key, int stackSize) { ItemStack stack = getStack(key); stack.setCount(stackSize); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index eeca6902..b5cdb49c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -1,9 +1,10 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.api.util.helper.PurificationHelper; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.client.IVariantProvider; import com.google.common.collect.Lists; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.IMob; @@ -14,23 +15,15 @@ import net.minecraft.init.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 org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.api.util.helper.PurificationHelper; -import WayofTime.bloodmagic.client.IVariantProvider; +import java.util.List; -public class ItemDaggerOfSacrifice extends Item implements IVariantProvider -{ - public ItemDaggerOfSacrifice() - { +public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { + public ItemDaggerOfSacrifice() { super(); setUnlocalizedName(BloodMagic.MODID + ".daggerOfSacrifice"); setCreativeTab(BloodMagic.TAB_BM); @@ -39,8 +32,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { if (attacker instanceof FakePlayer) return false; @@ -66,18 +58,15 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider return false; int lifeEssence = (int) (lifeEssenceRatio * target.getHealth()); - if (target instanceof EntityAnimal) - { + if (target instanceof EntityAnimal) { lifeEssence = (int) (lifeEssence * (1 + PurificationHelper.getCurrentPurity((EntityAnimal) target))); } - if (target.isChild()) - { + if (target.isChild()) { lifeEssence *= 0.5F; } - if (PlayerSacrificeHelper.findAndFillAltar(attacker.getEntityWorld(), target, lifeEssence, true)) - { + 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(WayofTime.bloodmagic.api.BloodMagicAPI.damageSource); @@ -87,8 +76,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = Lists.newArrayList(); ret.add(Pair.of(0, "type=normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java index ee9c01a8..bd8143dc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java @@ -1,8 +1,10 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import com.google.common.collect.Lists; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -11,18 +13,13 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import java.util.ArrayList; +import java.util.List; -public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVariantProvider -{ +public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVariantProvider { public static final ArrayList NAMES = Lists.newArrayList(); public static final String CRYSTAL_DEFAULT = "crystalDefault"; @@ -31,8 +28,7 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria public static final String CRYSTAL_DESTRUCTIVE = "crystalDestructive"; public static final String CRYSTAL_STEADFAST = "crystalSteadfast"; - public ItemDemonCrystal() - { + public ItemDemonCrystal() { super(); setUnlocalizedName(BloodMagic.MODID + ".demonCrystal."); @@ -42,8 +38,7 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria buildItemList(); } - private void buildItemList() - { + private void buildItemList() { NAMES.add(0, CRYSTAL_DEFAULT); NAMES.add(1, CRYSTAL_CORROSIVE); NAMES.add(2, CRYSTAL_DESTRUCTIVE); @@ -52,15 +47,13 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + NAMES.get(stack.getItemDamage()); } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -68,25 +61,17 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria list.add(new ItemStack(this, 1, i)); } - public static ItemStack getStack(String name) - { - return new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, NAMES.indexOf(name)); - } - @Override - public double getWill(ItemStack willStack) - { + public double getWill(ItemStack willStack) { return getDiscretization(willStack) * willStack.getCount(); } @Override - public double drainWill(ItemStack willStack, double drainAmount) - { + 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) - { + if (drainedNumber > 0) { willStack.shrink(drainedNumber); return drainedNumber * discretization; } @@ -95,23 +80,24 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria } @Override - public double getDiscretization(ItemStack willStack) - { + public double getDiscretization(ItemStack willStack) { return 50; } @Override - public EnumDemonWillType getType(ItemStack willStack) - { + public EnumDemonWillType getType(ItemStack willStack) { return EnumDemonWillType.values()[MathHelper.clamp(willStack.getMetadata(), 0, EnumDemonWillType.values().length - 1)]; } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); for (String name : NAMES) ret.add(new ImmutablePair(NAMES.indexOf(name), "type=" + name)); return ret; } + + public static ItemStack getStack(String name) { + return new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, NAMES.indexOf(name)); + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index c46debd1..68dcc7cf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.iface.IDemonWillViewer; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -11,19 +11,15 @@ 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.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.IDemonWillViewer; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemonWillViewer -{ - public ItemDemonWillGauge() - { +public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemonWillViewer { + public ItemDemonWillGauge() { setUnlocalizedName(BloodMagic.MODID + ".willGauge"); setMaxStackSize(1); setCreativeTab(BloodMagic.TAB_BM); @@ -31,28 +27,24 @@ public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemon @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.willGauge")))); } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=willgauge")); return ret; } @Override - public boolean canSeeDemonWillAura(World world, ItemStack stack, EntityPlayer player) - { + public boolean canSeeDemonWillAura(World world, ItemStack stack, EntityPlayer player) { return true; } @Override - public int getDemonWillAuraResolution(World world, ItemStack stack, EntityPlayer player) - { + public int getDemonWillAuraResolution(World world, ItemStack stack, EntityPlayer player) { return 100; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 17282fd5..45fad002 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -1,8 +1,9 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; @@ -15,19 +16,14 @@ import net.minecraft.util.EnumHand; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.ArrayList; +import java.util.List; -public class ItemExperienceBook extends Item implements IVariantProvider -{ - public ItemExperienceBook() - { +public class ItemExperienceBook extends Item implements IVariantProvider { + public ItemExperienceBook() { setUnlocalizedName(BloodMagic.MODID + ".experienceTome"); setMaxStackSize(1); setCreativeTab(BloodMagic.TAB_BM); @@ -35,15 +31,13 @@ public class ItemExperienceBook extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public boolean hasEffect(ItemStack stack) - { + public boolean hasEffect(ItemStack stack) { return true; } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.experienceTome")); if (!stack.hasTagCompound()) @@ -56,11 +50,9 @@ public class ItemExperienceBook extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); - if (!world.isRemote) - { + if (!world.isRemote) { if (player.isSneaking()) absorbOneLevelExpFromPlayer(stack, player); else @@ -71,15 +63,13 @@ public class ItemExperienceBook extends Item implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=experiencetome")); return ret; } - public void giveOneLevelExpToPlayer(ItemStack stack, EntityPlayer player) - { + public void giveOneLevelExpToPlayer(ItemStack stack, EntityPlayer player) { float progress = player.experience; int expToNext = getExperienceForNextLevel(player.experienceLevel); @@ -88,37 +78,30 @@ public class ItemExperienceBook extends Item implements IVariantProvider System.out.println("Needed: " + neededExp + ", contained: " + containedExp + ", exp to next: " + expToNext); - if (containedExp >= neededExp) - { + if (containedExp >= neededExp) { setStoredExperience(stack, containedExp - neededExp); addPlayerXP(player, neededExp); - if (player.experienceLevel % 5 == 0) - { + 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 - { + } else { setStoredExperience(stack, 0); addPlayerXP(player, (int) containedExp); } } - public void absorbOneLevelExpFromPlayer(ItemStack stack, EntityPlayer player) - { + public void absorbOneLevelExpFromPlayer(ItemStack stack, EntityPlayer player) { float progress = player.experience; - if (progress > 0) - { + if (progress > 0) { int expDeduction = (int) getExperienceAcquiredToNext(player); - if (expDeduction > 0) - { + if (expDeduction > 0) { addPlayerXP(player, -expDeduction); addExperience(stack, expDeduction); } - } else if (progress == 0 && player.experienceLevel > 0) - { + } else if (progress == 0 && player.experienceLevel > 0) { int expDeduction = getExperienceForNextLevel(player.experienceLevel - 1); addPlayerXP(player, -expDeduction); addExperience(stack, expDeduction); @@ -126,13 +109,11 @@ public class ItemExperienceBook extends Item implements IVariantProvider } // Credits to Ender IO for some of the experience code, although now modified slightly for my convenience. - public static int getPlayerXP(EntityPlayer player) - { + public static int getPlayerXP(EntityPlayer player) { return (int) (getExperienceForLevel(player.experienceLevel) + (player.experience * player.xpBarCap())); } - public static void addPlayerXP(EntityPlayer player, int amount) - { + public static void addPlayerXP(EntityPlayer player, int amount) { int experience = Math.max(0, getPlayerXP(player) + amount); player.experienceTotal = experience; player.experienceLevel = getLevelForExperience(experience); @@ -140,8 +121,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider player.experience = (float) (experience - expForLevel) / (float) player.xpBarCap(); } - public static void setStoredExperience(ItemStack stack, double exp) - { + public static void setStoredExperience(ItemStack stack, double exp) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -149,8 +129,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider tag.setDouble("experience", exp); } - public static double getStoredExperience(ItemStack stack) - { + public static double getStoredExperience(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -158,65 +137,50 @@ public class ItemExperienceBook extends Item implements IVariantProvider return tag.getDouble("experience"); } - public static void addExperience(ItemStack stack, double exp) - { + public static void addExperience(ItemStack stack, double exp) { setStoredExperience(stack, getStoredExperience(stack) + exp); } - public static int getExperienceForNextLevel(int currentLevel) - { - if (currentLevel < 16) - { + public static int getExperienceForNextLevel(int currentLevel) { + if (currentLevel < 16) { return 2 * currentLevel + 7; - } else if (currentLevel < 31) - { + } else if (currentLevel < 31) { return 5 * currentLevel - 38; - } else - { + } else { return 9 * currentLevel - 158; } } //TODO: Change to calculation form. - public static int getExperienceForLevel(int level) - { - if (level >= 21863) - { + public static int getExperienceForLevel(int level) { + if (level >= 21863) { return Integer.MAX_VALUE; } - if (level == 0) - { + if (level == 0) { return 0; } int res = 0; - for (int i = 0; i < level; i++) - { + for (int i = 0; i < level; i++) { res += getExperienceForNextLevel(i); } return res; } - public static double getExperienceAcquiredToNext(EntityPlayer player) - { + public static double getExperienceAcquiredToNext(EntityPlayer player) { return player.experience * player.xpBarCap(); } - public static int getLevelForExperience(double exp) - { - if (exp <= 352) - { + public static int getLevelForExperience(double exp) { + if (exp <= 352) { return (int) Math.floor(solveParabola(1, 6, -exp)); - } else if (exp <= 1507) - { + } else if (exp <= 1507) { return (int) Math.floor(solveParabola(2.5, -40.5, 360 - exp)); - } else - { + } else { return (int) Math.floor(solveParabola(4.5, -162.5, 2220 - exp)); } } - public static double solveParabola(double a, double b, double c) - { + 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 index b39f8814..4481c2a2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -1,15 +1,16 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.ritual.EnumRuneType; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.block.BlockRitualStone; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; @@ -20,21 +21,15 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.block.BlockRitualStone; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -public class ItemInscriptionTool extends ItemBindableBase implements IVariantProvider -{ - public ItemInscriptionTool() - { +public class ItemInscriptionTool extends ItemBindableBase implements IVariantProvider { + public ItemInscriptionTool() { super(); setUnlocalizedName(BloodMagic.MODID + ".scribe."); @@ -42,20 +37,17 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + EnumRuneType.values()[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; - for (int i = 1; i < EnumRuneType.values().length; i++) - { + for (int i = 1; i < EnumRuneType.values().length; i++) { ItemStack stack = NBTHelper.checkNBT(new ItemStack(this, 1, i)); stack.getTagCompound().setInteger(Constants.NBT.USES, 10); list.add(stack); @@ -63,19 +55,16 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); IBlockState state = world.getBlockState(pos); - if (state.getBlock() instanceof BlockRitualStone && !((BlockRitualStone) state.getBlock()).isRuneType(world, pos, getType(stack))) - { + if (state.getBlock() instanceof BlockRitualStone && !((BlockRitualStone) state.getBlock()).isRuneType(world, pos, getType(stack))) { stack = NBTHelper.checkNBT(stack); int uses = stack.getTagCompound().getInteger(Constants.NBT.USES); world.setBlockState(pos, state.withProperty(((BlockRitualStone) state.getBlock()).getProperty(), getType(stack))); - if (!player.capabilities.isCreativeMode) - { + if (!player.capabilities.isCreativeMode) { stack.getTagCompound().setInteger(Constants.NBT.USES, --uses); if (uses <= 0) player.inventory.setInventorySlotContents(player.inventory.currentItem, ItemStack.EMPTY); @@ -87,46 +76,40 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro } @Override - public boolean showDurabilityBar(ItemStack stack) - { + public boolean showDurabilityBar(ItemStack stack) { return stack.hasTagCompound(); } @Override - public double getDurabilityForDisplay(ItemStack stack) - { + 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) - { + 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); + 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 list, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.inscriber.desc")))); super.addInformation(stack, world, list, flag); } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); for (int i = 1; i < EnumRuneType.values().length; i++) ret.add(new ImmutablePair(i, "type=" + EnumRuneType.values()[i].name())); return ret; } - public EnumRuneType getType(ItemStack stack) - { + public EnumRuneType getType(ItemStack stack) { return EnumRuneType.values()[stack.getItemDamage()]; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index f31b92e2..c224ea7d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -1,31 +1,26 @@ package WayofTime.bloodmagic.item; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.client.IVariantProvider; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.client.IVariantProvider; +import java.util.List; -public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvider -{ - public ItemLavaCrystal() - { +public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvider { + public ItemLavaCrystal() { super(); setUnlocalizedName(BloodMagic.MODID + ".lavaCrystal"); } @Override - public ItemStack getContainerItem(ItemStack itemStack) - { + public ItemStack getContainerItem(ItemStack itemStack) { NetworkHelper.getSoulNetwork(this.getOwnerUUID(itemStack)).syphon(25); ItemStack copiedStack = itemStack.copy(); copiedStack.setItemDamage(copiedStack.getItemDamage()); @@ -34,8 +29,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide } @Override - public boolean hasContainerItem(ItemStack itemStack) - { + public boolean hasContainerItem(ItemStack itemStack) { return true; } @@ -59,8 +53,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = Lists.newArrayList(); ret.add(Pair.of(0, "type=normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index 7e14e342..4cd45ea4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.item; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -25,14 +24,11 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; - import javax.annotation.Nullable; +import java.util.List; -public class ItemPotionFlask extends Item implements IMeshProvider -{ - public ItemPotionFlask() - { +public class ItemPotionFlask extends Item implements IMeshProvider { + public ItemPotionFlask() { setUnlocalizedName(BloodMagic.MODID + ".potionFlask"); setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); @@ -41,27 +37,22 @@ public class ItemPotionFlask extends Item implements IMeshProvider } @Override - public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entityLiving) - { + public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entityLiving) { EntityPlayer player = entityLiving instanceof EntityPlayer ? (EntityPlayer) entityLiving : null; int remainingUses = stack.getMaxDamage() - stack.getItemDamage(); - if (remainingUses <= 0) - { + if (remainingUses <= 0) { NBTHelper.checkNBT(stack); stack.getTagCompound().setBoolean("empty", true); return stack; } - if (player == null || !player.capabilities.isCreativeMode) - { + if (player == null || !player.capabilities.isCreativeMode) { stack.setItemDamage(stack.getItemDamage() + 1); } - if (!world.isRemote) - { - for (PotionEffect potioneffect : PotionUtils.getEffectsFromStack(stack)) - { + if (!world.isRemote) { + for (PotionEffect potioneffect : PotionUtils.getEffectsFromStack(stack)) { entityLiving.addPotionEffect(new PotionEffect(potioneffect)); } } @@ -70,20 +61,17 @@ public class ItemPotionFlask extends Item implements IMeshProvider } @Override - public int getMaxItemUseDuration(ItemStack stack) - { + public int getMaxItemUseDuration(ItemStack stack) { return 32; } @Override - public EnumAction getItemUseAction(ItemStack stack) - { + public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.DRINK; } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing 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")) @@ -91,8 +79,7 @@ public class ItemPotionFlask extends Item implements IMeshProvider RayTraceResult trace = rayTrace(world, player, true); - if (trace.typeOfHit == RayTraceResult.Type.BLOCK && world.getBlockState(trace.getBlockPos()).getMaterial() == Material.WATER) - { + 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 EnumActionResult.SUCCESS; @@ -102,12 +89,10 @@ public class ItemPotionFlask extends Item implements IMeshProvider } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); int remainingUses = stack.getMaxDamage() - stack.getItemDamage(); - if (remainingUses <= 0) - { + if (remainingUses <= 0) { NBTHelper.checkNBT(stack); stack.getTagCompound().setBoolean("empty", true); return new ActionResult(EnumActionResult.PASS, stack); @@ -118,8 +103,7 @@ public class ItemPotionFlask extends Item implements IMeshProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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())); @@ -138,8 +122,7 @@ public class ItemPotionFlask extends Item implements IMeshProvider @SideOnly(Side.CLIENT) @Override - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return stack -> { boolean full = true; if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) @@ -150,14 +133,12 @@ public class ItemPotionFlask extends Item implements IMeshProvider @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { return Lists.newArrayList("full=true", "full=false"); } } \ 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 index 5417cf22..616b01a2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -1,9 +1,20 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.registry.RitualRegistry; +import WayofTime.bloodmagic.api.ritual.EnumRuneType; +import WayofTime.bloodmagic.api.ritual.Ritual; +import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.util.helper.RitualHelper; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.tile.TileMasterRitualStone; +import WayofTime.bloodmagic.util.ChatUtil; +import WayofTime.bloodmagic.util.Utils; +import WayofTime.bloodmagic.util.handler.event.ClientHandler; +import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -23,35 +34,19 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.input.Keyboard; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.RitualHelper; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.handler.event.ClientHandler; -import WayofTime.bloodmagic.util.helper.TextHelper; - -public class ItemRitualDiviner extends Item implements IVariantProvider -{ - public static String[] names = { "normal", "dusk", "dawn" }; +import java.util.ArrayList; +import java.util.Arrays; +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() - { + public ItemRitualDiviner() { setUnlocalizedName(BloodMagic.MODID + ".ritualDiviner"); setCreativeTab(BloodMagic.TAB_BM); setHasSubtypes(true); @@ -59,14 +54,12 @@ public class ItemRitualDiviner extends Item implements IVariantProvider } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override - public String getHighlightTip(ItemStack stack, String displayName) - { + public String getHighlightTip(ItemStack stack, String displayName) { if (Strings.isNullOrEmpty(getCurrentRitual(stack))) return displayName; @@ -79,8 +72,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -89,21 +81,16 @@ public class ItemRitualDiviner extends Item implements IVariantProvider } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); - if (player.isSneaking()) - { - if (world.isRemote) - { + if (player.isSneaking()) { + if (world.isRemote) { trySetDisplayedRitual(stack, world, pos); } return EnumActionResult.SUCCESS; - } else if (addRuneToRitual(stack, world, pos, player)) - { - if (world.isRemote) - { + } else if (addRuneToRitual(stack, world, pos, player)) { + if (world.isRemote) { spawnParticles(world, pos.up(), 15); } @@ -116,64 +103,47 @@ public class ItemRitualDiviner extends Item implements IVariantProvider /** * 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 - * + * + * @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, EntityPlayer player) - { + public boolean addRuneToRitual(ItemStack stack, World world, BlockPos pos, EntityPlayer player) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMasterRitualStone) - { + if (tile instanceof TileMasterRitualStone) { Ritual ritual = RitualRegistry.getRitualForId(this.getCurrentRitual(stack)); - if (ritual != null) - { + if (ritual != null) { EnumFacing direction = getDirection(stack); - for (RitualComponent component : ritual.getComponents()) - { - if (!canPlaceRitualStone(component.getRuneType(), stack)) - { + for (RitualComponent component : ritual.getComponents()) { + if (!canPlaceRitualStone(component.getRuneType(), stack)) { return false; } BlockPos offset = component.getOffset(direction); BlockPos newPos = pos.add(offset); IBlockState state = world.getBlockState(newPos); Block block = state.getBlock(); - if (RitualHelper.isRune(world, newPos)) - { - if (RitualHelper.isRuneType(world, newPos, component.getRuneType())) - { - if (world.isRemote) - { + if (RitualHelper.isRune(world, newPos)) { + if (RitualHelper.isRuneType(world, newPos, component.getRuneType())) { + if (world.isRemote) { undisplayHologram(); } - } else - { + } 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)) - { + } else if (block.isAir(state, world, newPos) || block.isReplaceable(world, newPos)) { + if (!consumeStone(stack, world, player)) { return false; } int meta = component.getRuneType().ordinal(); IBlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); world.setBlockState(newPos, newState); return true; - } else - { + } else { return false; // TODO: Possibly replace the block with a // ritual stone } @@ -185,17 +155,14 @@ public class ItemRitualDiviner extends Item implements IVariantProvider } @SideOnly(Side.CLIENT) - public void trySetDisplayedRitual(ItemStack itemStack, World world, BlockPos pos) - { + public void trySetDisplayedRitual(ItemStack itemStack, World world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMasterRitualStone) - { + if (tile instanceof TileMasterRitualStone) { Ritual ritual = RitualRegistry.getRitualForId(this.getCurrentRitual(itemStack)); TileMasterRitualStone masterRitualStone = (TileMasterRitualStone) tile; - if (ritual != null) - { + if (ritual != null) { EnumFacing direction = getDirection(itemStack); ClientHandler.setRitualHolo(masterRitualStone, ritual, direction, true); } @@ -203,32 +170,26 @@ public class ItemRitualDiviner extends Item implements IVariantProvider } @SideOnly(Side.CLIENT) - public void undisplayHologram() - { + public void undisplayHologram() { ClientHandler.setRitualHoloToNull(); } // TODO: Make this work for any IRitualStone - public boolean consumeStone(ItemStack stack, World world, EntityPlayer player) - { - if (player.capabilities.isCreativeMode) - { + public boolean consumeStone(ItemStack stack, World world, EntityPlayer player) { + if (player.capabilities.isCreativeMode) { return true; } NonNullList inventory = player.inventory.mainInventory; - for (ItemStack newStack : inventory) - { + for (ItemStack newStack : inventory) { if (newStack.isEmpty()) { continue; } Item item = newStack.getItem(); - if (item instanceof ItemBlock) - { + if (item instanceof ItemBlock) { Block block = ((ItemBlock) item).getBlock(); - if (block == RegistrarBloodMagicBlocks.RITUAL_STONE) - { + if (block == RegistrarBloodMagicBlocks.RITUAL_STONE) { newStack.shrink(1); return true; } @@ -240,32 +201,26 @@ public class ItemRitualDiviner extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; Ritual ritual = RitualRegistry.getRitualForId(this.getCurrentRitual(stack)); - if (ritual != null) - { + if (ritual != null) { tooltip.add(TextHelper.localize("tooltip.bloodmagic.diviner.currentRitual") + TextHelper.localize(ritual.getUnlocalizedName())); boolean sneaking = Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); boolean extraInfo = sneaking && Keyboard.isKeyDown(Keyboard.KEY_M); - if (extraInfo) - { + if (extraInfo) { tooltip.add(""); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { - if (TextHelper.canTranslate(ritual.getUnlocalizedName() + "." + type.getName().toLowerCase() + ".info")) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { + if (TextHelper.canTranslate(ritual.getUnlocalizedName() + "." + type.getName().toLowerCase() + ".info")) { tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(ritual.getUnlocalizedName() + "." + type.getName().toLowerCase() + ".info")))); } } - } else if (sneaking) - { + } else if (sneaking) { tooltip.add(TextHelper.localize(tooltipBase + "currentDirection", Utils.toFancyCasing(getDirection(stack).getName()))); tooltip.add(""); ArrayList componentList = ritual.getComponents(); @@ -279,31 +234,29 @@ public class ItemRitualDiviner extends Item implements IVariantProvider int dawnRunes = 0; int totalRunes = componentList.size(); - for (RitualComponent component : componentList) - { - 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; + for (RitualComponent component : componentList) { + 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; } } @@ -324,11 +277,9 @@ public class ItemRitualDiviner extends Item implements IVariantProvider tooltip.add(""); tooltip.add(TextHelper.localize(tooltipBase + "totalRune", totalRunes)); - } else - { + } else { tooltip.add(""); - if (TextHelper.canTranslate(ritual.getUnlocalizedName() + ".info")) - { + if (TextHelper.canTranslate(ritual.getUnlocalizedName() + ".info")) { tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(ritual.getUnlocalizedName() + ".info")))); tooltip.add(""); } @@ -340,19 +291,15 @@ public class ItemRitualDiviner extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); RayTraceResult ray = this.rayTrace(world, player, false); - if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { return new ActionResult(EnumActionResult.PASS, stack); } - if (player.isSneaking()) - { - if (!world.isRemote) - { + if (player.isSneaking()) { + if (!world.isRemote) { cycleRitual(stack, player); } @@ -363,25 +310,19 @@ public class ItemRitualDiviner extends Item implements IVariantProvider } @Override - public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) - { - if (entityLiving instanceof EntityPlayer) - { + public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { + if (entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entityLiving; RayTraceResult ray = this.rayTrace(player.getEntityWorld(), player, false); - if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { return false; } - if (!player.isSwingInProgress) - { - if (player.isSneaking()) - { + if (!player.isSwingInProgress) { + if (player.isSneaking()) { cycleRitualBackwards(stack, player); - } else - { + } else { cycleDirection(stack, player); } } @@ -391,8 +332,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=basic")); ret.add(new ImmutablePair(1, "type=dusk")); @@ -400,41 +340,36 @@ public class ItemRitualDiviner extends Item implements IVariantProvider return ret; } - public void cycleDirection(ItemStack stack, EntityPlayer player) - { + public void cycleDirection(ItemStack stack, EntityPlayer player) { EnumFacing direction = getDirection(stack); EnumFacing newDirection; - switch (direction) - { - case NORTH: - newDirection = EnumFacing.EAST; - break; - case EAST: - newDirection = EnumFacing.SOUTH; - break; - case SOUTH: - newDirection = EnumFacing.WEST; - break; - case WEST: - newDirection = EnumFacing.NORTH; - break; - default: - newDirection = EnumFacing.NORTH; + switch (direction) { + case NORTH: + newDirection = EnumFacing.EAST; + break; + case EAST: + newDirection = EnumFacing.SOUTH; + break; + case SOUTH: + newDirection = EnumFacing.WEST; + break; + case WEST: + newDirection = EnumFacing.NORTH; + break; + default: + newDirection = EnumFacing.NORTH; } setDirection(stack, newDirection); notifyDirectionChange(newDirection, player); } - public void notifyDirectionChange(EnumFacing direction, EntityPlayer player) - { + public void notifyDirectionChange(EnumFacing direction, EntityPlayer player) { ChatUtil.sendNoSpam(player, TextHelper.localize(tooltipBase + "currentDirection", Utils.toFancyCasing(direction.getName()))); } - public void setDirection(ItemStack stack, EnumFacing direction) - { - if (!stack.hasTagCompound()) - { + public void setDirection(ItemStack stack, EnumFacing direction) { + if (!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } @@ -443,10 +378,8 @@ public class ItemRitualDiviner extends Item implements IVariantProvider tag.setInteger(Constants.NBT.DIRECTION, direction.getIndex()); } - public EnumFacing getDirection(ItemStack stack) - { - if (!stack.hasTagCompound()) - { + public EnumFacing getDirection(ItemStack stack) { + if (!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); return EnumFacing.NORTH; } @@ -454,8 +387,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider NBTTagCompound tag = stack.getTagCompound(); int dir = tag.getInteger(Constants.NBT.DIRECTION); - if (dir == 0) - { + if (dir == 0) { return EnumFacing.NORTH; } @@ -464,52 +396,42 @@ public class ItemRitualDiviner extends Item implements IVariantProvider /** * Cycles the selected ritual to the next available ritual that is enabled. - * - * @param stack - * - The ItemStack of the ritual diviner - * @param player - * - The player using the ritual diviner + * + * @param stack - The ItemStack of the ritual diviner + * @param player - The player using the ritual diviner */ - public void cycleRitual(ItemStack stack, EntityPlayer player) - { + public void cycleRitual(ItemStack stack, EntityPlayer player) { String key = getCurrentRitual(stack); List idList = RitualRegistry.getOrderedIds(); String firstId = ""; boolean foundId = false; boolean foundFirst = false; - for (String str : idList) - { + for (String str : idList) { Ritual ritual = RitualRegistry.getRitualForId(str); - if (!RitualRegistry.ritualEnabled(ritual) || !canDivinerPerformRitual(stack, ritual)) - { + if (!RitualRegistry.ritualEnabled(ritual) || !canDivinerPerformRitual(stack, ritual)) { continue; } - if (!foundFirst) - { + if (!foundFirst) { firstId = str; foundFirst = true; } - if (foundId) - { + if (foundId) { setCurrentRitual(stack, str); notifyRitualChange(str, player); return; - } else - { - if (str.equals(key)) - { + } else { + if (str.equals(key)) { foundId = true; continue; } } } - if (foundFirst) - { + if (foundFirst) { setCurrentRitual(stack, firstId); notifyRitualChange(firstId, player); } @@ -517,68 +439,56 @@ public class ItemRitualDiviner extends Item implements IVariantProvider /** * Does the same as cycleRitual but instead cycles backwards. - * + * * @param stack * @param player */ - public void cycleRitualBackwards(ItemStack stack, EntityPlayer player) - { + public void cycleRitualBackwards(ItemStack stack, EntityPlayer player) { String key = getCurrentRitual(stack); List idList = RitualRegistry.getOrderedIds(); String firstId = ""; boolean foundId = false; boolean foundFirst = false; - for (int i = idList.size() - 1; i >= 0; i--) - { + for (int i = idList.size() - 1; i >= 0; i--) { String str = idList.get(i); Ritual ritual = RitualRegistry.getRitualForId(str); - if (!RitualRegistry.ritualEnabled(ritual) || !canDivinerPerformRitual(stack, ritual)) - { + if (!RitualRegistry.ritualEnabled(ritual) || !canDivinerPerformRitual(stack, ritual)) { continue; } - if (!foundFirst) - { + if (!foundFirst) { firstId = str; foundFirst = true; } - if (foundId) - { + if (foundId) { setCurrentRitual(stack, str); notifyRitualChange(str, player); return; - } else - { - if (str.equals(key)) - { + } else { + if (str.equals(key)) { foundId = true; continue; } } } - if (foundFirst) - { + if (foundFirst) { setCurrentRitual(stack, firstId); notifyRitualChange(firstId, player); } } - public boolean canDivinerPerformRitual(ItemStack stack, Ritual ritual) - { - if (ritual == null) - { + public boolean canDivinerPerformRitual(ItemStack stack, Ritual ritual) { + if (ritual == null) { return false; } ArrayList components = ritual.getComponents(); - for (RitualComponent component : components) - { - if (!canPlaceRitualStone(component.getRuneType(), stack)) - { + for (RitualComponent component : components) { + if (!canPlaceRitualStone(component.getRuneType(), stack)) { return false; } } @@ -586,19 +496,15 @@ public class ItemRitualDiviner extends Item implements IVariantProvider return true; } - public void notifyRitualChange(String key, EntityPlayer player) - { + public void notifyRitualChange(String key, EntityPlayer player) { Ritual ritual = RitualRegistry.getRitualForId(key); - if (ritual != null) - { + if (ritual != null) { player.sendStatusMessage(new TextComponentTranslation(ritual.getUnlocalizedName()), true); } } - public void setCurrentRitual(ItemStack stack, String key) - { - if (!stack.hasTagCompound()) - { + public void setCurrentRitual(ItemStack stack, String key) { + if (!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } @@ -607,10 +513,8 @@ public class ItemRitualDiviner extends Item implements IVariantProvider tag.setString(Constants.NBT.CURRENT_RITUAL, key); } - public String getCurrentRitual(ItemStack stack) - { - if (!stack.hasTagCompound()) - { + public String getCurrentRitual(ItemStack stack) { + if (!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } @@ -618,44 +522,37 @@ public class ItemRitualDiviner extends Item implements IVariantProvider return tag.getString(Constants.NBT.CURRENT_RITUAL); } - public boolean canPlaceRitualStone(EnumRuneType rune, ItemStack stack) - { + 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; + 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) - { + public static void spawnParticles(World worldIn, BlockPos pos, int amount) { IBlockState state = worldIn.getBlockState(pos); Block block = worldIn.getBlockState(pos).getBlock(); - if (block.isAir(state, worldIn, pos)) - { - for (int i = 0; i < amount; ++i) - { + 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, new int[0]); } - } else - { - for (int i1 = 0; i1 < amount; ++i1) - { + } 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; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 17f457dd..455e3f1c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -1,10 +1,15 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.ritual.EnumRitualReaderState; +import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.util.ChatUtil; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -18,27 +23,18 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.input.Keyboard; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.ritual.EnumRitualReaderState; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -public class ItemRitualReader extends Item implements IVariantProvider -{ +public class ItemRitualReader extends Item implements IVariantProvider { public static final String tooltipBase = "tooltip.bloodmagic.ritualReader."; - public ItemRitualReader() - { + public ItemRitualReader() { super(); setUnlocalizedName(BloodMagic.MODID + ".ritualReader"); setMaxStackSize(1); @@ -46,8 +42,7 @@ public class ItemRitualReader extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { if (!stack.hasTagCompound()) return; @@ -58,11 +53,9 @@ public class ItemRitualReader extends Item implements IVariantProvider boolean sneaking = Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); - if (sneaking) - { + if (sneaking) { tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(tooltipBase + "desc." + state.toString().toLowerCase())))); - } else - { + } else { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.extraInfo")); } @@ -70,19 +63,15 @@ public class ItemRitualReader extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); RayTraceResult ray = this.rayTrace(world, player, false); - if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { return new ActionResult(EnumActionResult.PASS, stack); } - if (player.isSneaking()) - { - if (!world.isRemote) - { + if (player.isSneaking()) { + if (!world.isRemote) { cycleReader(stack, player); } @@ -93,80 +82,65 @@ public class ItemRitualReader extends Item implements IVariantProvider } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); - if (!world.isRemote) - { + if (!world.isRemote) { EnumRitualReaderState state = this.getState(stack); TileEntity tile = world.getTileEntity(pos); - if (tile instanceof IMasterRitualStone) - { + if (tile instanceof IMasterRitualStone) { IMasterRitualStone master = (IMasterRitualStone) tile; this.setMasterBlockPos(stack, pos); this.setBlockPos(stack, BlockPos.ORIGIN); - switch (state) - { - case INFORMATION: - master.provideInformationOfRitualToPlayer(player); - break; - case SET_AREA: - String range = this.getCurrentBlockRange(stack); - if (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; + switch (state) { + case INFORMATION: + master.provideInformationOfRitualToPlayer(player); + break; + case SET_AREA: + String range = this.getCurrentBlockRange(stack); + if (player.isSneaking()) { + String newRange = master.getNextBlockRange(range); + range = newRange; + this.setCurrentBlockRange(stack, newRange); } - if (testStack.getItem() instanceof IDiscreteDemonWill) - { - EnumDemonWillType type = ((IDiscreteDemonWill) testStack.getItem()).getType(testStack); - if (!typeList.contains(type)) - { - typeList.add(type); + 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; + master.setActiveWillConfig(player, typeList); + master.provideInformationOfWillConfigToPlayer(player, typeList); + break; } return EnumActionResult.FAIL; - } else - { - if (state == EnumRitualReaderState.SET_AREA) - { + } else { + if (state == EnumRitualReaderState.SET_AREA) { BlockPos masterPos = this.getMasterBlockPos(stack); - if (!masterPos.equals(BlockPos.ORIGIN)) - { + if (!masterPos.equals(BlockPos.ORIGIN)) { BlockPos containedPos = getBlockPos(stack); - if (containedPos.equals(BlockPos.ORIGIN)) - { + if (containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, pos.subtract(masterPos)); ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.firstBlock")); //TODO: Notify player. - } else - { + } else { tile = world.getTileEntity(masterPos); - if (tile instanceof IMasterRitualStone) - { + if (tile instanceof IMasterRitualStone) { IMasterRitualStone master = (IMasterRitualStone) tile; master.setBlockRangeByBounds(player, this.getCurrentBlockRange(stack), containedPos, pos.subtract(masterPos)); } @@ -181,14 +155,12 @@ public class ItemRitualReader extends Item implements IVariantProvider return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); } - public BlockPos getBlockPos(ItemStack stack) - { + 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) - { + public ItemStack setBlockPos(ItemStack stack, BlockPos pos) { stack = NBTHelper.checkNBT(stack); NBTTagCompound itemTag = stack.getTagCompound(); itemTag.setInteger(Constants.NBT.X_COORD, pos.getX()); @@ -197,14 +169,12 @@ public class ItemRitualReader extends Item implements IVariantProvider return stack; } - public BlockPos getMasterBlockPos(ItemStack 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) - { + public ItemStack setMasterBlockPos(ItemStack stack, BlockPos pos) { stack = NBTHelper.checkNBT(stack); NBTTagCompound itemTag = stack.getTagCompound(); itemTag.setInteger(Constants.NBT.X_COORD + "master", pos.getX()); @@ -213,8 +183,7 @@ public class ItemRitualReader extends Item implements IVariantProvider return stack; } - public String getCurrentBlockRange(ItemStack stack) - { + public String getCurrentBlockRange(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -222,8 +191,7 @@ public class ItemRitualReader extends Item implements IVariantProvider return tag.getString("range"); } - public void setCurrentBlockRange(ItemStack stack, String range) - { + public void setCurrentBlockRange(ItemStack stack, String range) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -231,8 +199,7 @@ public class ItemRitualReader extends Item implements IVariantProvider tag.setString("range", range); } - public void cycleReader(ItemStack stack, EntityPlayer player) - { + public void cycleReader(ItemStack stack, EntityPlayer player) { EnumRitualReaderState prevState = getState(stack); int val = prevState.ordinal(); int nextVal = val + 1 >= EnumRitualReaderState.values().length ? 0 : val + 1; @@ -242,13 +209,11 @@ public class ItemRitualReader extends Item implements IVariantProvider notifyPlayerOfStateChange(nextState, player); } - public void notifyPlayerOfStateChange(EnumRitualReaderState state, EntityPlayer player) - { + public void notifyPlayerOfStateChange(EnumRitualReaderState state, EntityPlayer player) { ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentState", new TextComponentTranslation(tooltipBase + state.toString().toLowerCase()))); } - public void setState(ItemStack stack, EnumRitualReaderState state) - { + public void setState(ItemStack stack, EnumRitualReaderState state) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -256,10 +221,8 @@ public class ItemRitualReader extends Item implements IVariantProvider tag.setInteger(Constants.NBT.RITUAL_READER, state.ordinal()); } - public EnumRitualReaderState getState(ItemStack stack) - { - if (!stack.hasTagCompound()) - { + public EnumRitualReaderState getState(ItemStack stack) { + if (!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); return EnumRitualReaderState.INFORMATION; } @@ -270,8 +233,7 @@ public class ItemRitualReader extends Item implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 72991095..e8c841ca 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -1,11 +1,16 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.util.ITooltipFlag; @@ -25,24 +30,15 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.helper.TextHelper; - import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -public class ItemSacrificialDagger extends Item implements IMeshProvider -{ - public static String[] names = { "normal", "creative" }; +public class ItemSacrificialDagger extends Item implements IMeshProvider { + public static String[] names = {"normal", "creative"}; - public ItemSacrificialDagger() - { + public ItemSacrificialDagger() { super(); setUnlocalizedName(BloodMagic.MODID + ".sacrificialDagger."); @@ -53,15 +49,13 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -70,8 +64,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider } @Override - public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) - { + 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) @@ -79,33 +72,28 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider } @Override - public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft) - { + public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft) { if (entityLiving instanceof EntityPlayer && !entityLiving.getEntityWorld().isRemote) PlayerSacrificeHelper.sacrificePlayerHealth((EntityPlayer) entityLiving); } @Override - public int getMaxItemUseDuration(ItemStack stack) - { + public int getMaxItemUseDuration(ItemStack stack) { return 72000; } @Override - public EnumAction getItemUseAction(ItemStack stack) - { + public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.BOW; } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return super.onItemRightClick(world, player, hand); - if (this.canUseForSacrifice(stack)) - { + if (this.canUseForSacrifice(stack)) { player.setActiveHand(hand); return new ActionResult(EnumActionResult.SUCCESS, stack); } @@ -113,27 +101,23 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider int lpAdded = ConfigHandler.sacrificialDaggerConversion * ConfigHandler.sacrificialDaggerDamage; RayTraceResult rayTrace = rayTrace(world, player, false); - if (rayTrace != null && rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) - { + 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) - { + if (!player.capabilities.isCreativeMode) { SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, ConfigHandler.sacrificialDaggerDamage, lpAdded); if (MinecraftForge.EVENT_BUS.post(evt)) return super.onItemRightClick(world, player, hand); - if (evt.shouldDrainHealth) - { + if (evt.shouldDrainHealth) { player.hurtResistantTime = 0; player.attackEntityFrom(BloodMagicAPI.damageSource, 0.001F); player.setHealth(Math.max(player.getHealth() - ConfigHandler.sacrificialDaggerDamage, 0.0001f)); - if (player.getHealth() <= 0.001f) - { + if (player.getHealth() <= 0.001f) { player.onDeath(BloodMagicAPI.damageSource); player.setHealth(0); } @@ -164,38 +148,31 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider } @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) - { + public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) { if (!world.isRemote && entity instanceof EntityPlayer) this.setUseForSacrifice(stack, this.isPlayerPreparedForSacrifice(world, (EntityPlayer) entity)); } - public boolean isPlayerPreparedForSacrifice(World world, EntityPlayer player) - { + public boolean isPlayerPreparedForSacrifice(World world, EntityPlayer player) { return !world.isRemote && (PlayerSacrificeHelper.getPlayerIncense(player) > 0); } - public boolean canUseForSacrifice(ItemStack stack) - { + public boolean canUseForSacrifice(ItemStack stack) { stack = NBTHelper.checkNBT(stack); return stack.getTagCompound().getBoolean(Constants.NBT.SACRIFICE); } - public void setUseForSacrifice(ItemStack stack, boolean 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 new ItemMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { + return new ItemMeshDefinition() { @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { + public ModelResourceLocation getModelLocation(ItemStack stack) { String variant = "type=normal"; if (stack.getItemDamage() != 0) variant = "type=creative"; @@ -209,8 +186,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider } @Override - public List getVariants() - { + public List getVariants() { List variants = new ArrayList(); variants.add("type=normal"); variants.add("type=creative"); @@ -220,8 +196,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } } \ 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 index f1e84cfd..f17328f6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -33,33 +33,27 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.Collections; import java.util.List; -public class ItemSanguineBook extends Item implements IVariantProvider, IAltarManipulator -{ +public class ItemSanguineBook extends Item implements IVariantProvider, IAltarManipulator { private EnumAltarTier currentDisplayedTier = EnumAltarTier.ONE; - public ItemSanguineBook() - { + public ItemSanguineBook() { setUnlocalizedName(BloodMagic.MODID + ".sanguineBook"); setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (world.isRemote) return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); IBlockState hitState = world.getBlockState(pos); - if (player.isSneaking()) - { - if (hitState.getBlock() instanceof IDocumentedBlock) - { + 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()) - { + if (!docs.isEmpty()) { ChatUtil.sendNoSpam(player, docs.toArray(new ITextComponent[docs.size()])); return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); } @@ -70,8 +64,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote) return super.onItemRightClick(world, player, hand); @@ -79,8 +72,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa stack = NBTHelper.checkNBT(stack); RayTraceResult rayTrace = rayTrace(world, player, false); - if (rayTrace == null || rayTrace.typeOfHit == RayTraceResult.Type.MISS || rayTrace.typeOfHit == RayTraceResult.Type.ENTITY) - { + if (rayTrace == null || rayTrace.typeOfHit == RayTraceResult.Type.MISS || rayTrace.typeOfHit == RayTraceResult.Type.ENTITY) { if (stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) >= EnumAltarTier.MAXTIERS - 1) stack.getTagCompound().setInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER, 0); else @@ -95,11 +87,9 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa return super.onItemRightClick(world, player, hand); } - public boolean trySetDisplayedTier(World world, BlockPos pos) - { + public boolean trySetDisplayedTier(World world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAltar) - { + if (tile instanceof TileAltar) { return !((TileAltar) tile).setCurrentTierDisplayed(currentDisplayedTier); } @@ -108,8 +98,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.book.shifting")); @@ -120,8 +109,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa // IVariantProvider @Override - public List> getVariants() - { + public List> getVariants() { return Collections.singletonList(Pair.of(0, "type=normal")); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java index 4d746432..b2564ffb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java @@ -5,7 +5,6 @@ import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; @@ -19,12 +18,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class ItemSlate extends Item implements IVariantProvider -{ - public String[] names = { "blank", "reinforced", "imbued", "demonic", "ethereal" }; +public class ItemSlate extends Item implements IVariantProvider { + public String[] names = {"blank", "reinforced", "imbued", "demonic", "ethereal"}; - public ItemSlate() - { + public ItemSlate() { super(); setCreativeTab(BloodMagic.TAB_BM); @@ -34,8 +31,7 @@ public class ItemSlate extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -44,21 +40,18 @@ public class ItemSlate extends Item implements IVariantProvider } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.slate.desc")))); } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=blank")); ret.add(new ImmutablePair(1, "type=reinforced")); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index e141b65c..64895638 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -8,7 +8,6 @@ import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; @@ -27,12 +26,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class ItemTelepositionFocus extends ItemBindableBase implements IVariantProvider -{ - public static String[] names = { "weak", "enhanced", "reinforced", "demonic" }; +public class ItemTelepositionFocus extends ItemBindableBase implements IVariantProvider { + public static String[] names = {"weak", "enhanced", "reinforced", "demonic"}; - public ItemTelepositionFocus() - { + public ItemTelepositionFocus() { super(); setUnlocalizedName(BloodMagic.MODID + ".focus."); @@ -42,15 +39,13 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -59,14 +54,11 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { - if (player.isSneaking()) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + if (player.isSneaking()) { RayTraceResult mop = rayTrace(world, player, false); - if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { setBlockPos(player.getHeldItem(hand), world, mop.getBlockPos()); } } @@ -76,8 +68,7 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localize("tooltip.bloodmagic.telepositionFocus." + names[stack.getItemDamage()])))); super.addInformation(stack, world, tooltip, flag); @@ -89,16 +80,14 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP NBTTagCompound tag = stack.getTagCompound(); BlockPos coords = getBlockPos(stack); - if (coords != null && tag != null) - { + 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.getInteger(Constants.NBT.DIMENSION_ID))); } } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=weak")); ret.add(new ImmutablePair(1, "type=enhanced")); @@ -107,20 +96,17 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP return ret; } - public World getWorld(ItemStack stack) - { + public World getWorld(ItemStack stack) { stack = NBTHelper.checkNBT(stack); return DimensionManager.getWorld(stack.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID)); } - public BlockPos getBlockPos(ItemStack stack) - { + 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) - { + public ItemStack setBlockPos(ItemStack stack, World world, BlockPos pos) { stack = NBTHelper.checkNBT(stack); NBTTagCompound itemTag = stack.getTagCompound(); itemTag.setInteger(Constants.NBT.X_COORD, pos.getX()); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index f0de73dc..c7bd3f2c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -1,9 +1,13 @@ package WayofTime.bloodmagic.item; -import java.util.ArrayList; -import java.util.List; -import java.util.Map.Entry; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -16,23 +20,15 @@ import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; -public class ItemUpgradeTome extends Item implements IVariantProvider -{ - public ItemUpgradeTome() - { +public class ItemUpgradeTome extends Item implements IVariantProvider { + public ItemUpgradeTome() { super(); setCreativeTab(BloodMagic.TAB_TOMES); @@ -42,31 +38,25 @@ public class ItemUpgradeTome extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); - if (world.isRemote) - { + if (world.isRemote) { return super.onItemRightClick(world, player, hand); } LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); - if (upgrade == null) - { + if (upgrade == null) { return super.onItemRightClick(world, player, hand); } ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (chestStack.getItem() instanceof ItemLivingArmour) - { + if (chestStack.getItem() instanceof ItemLivingArmour) { LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour == null) - { + if (armour == null) { return super.onItemRightClick(world, player, hand); } - if (armour.upgradeArmour(player, upgrade)) - { + if (armour.upgradeArmour(player, upgrade)) { ItemLivingArmour.setLivingArmour(chestStack, armour); // ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(stack, armour, false); stack.shrink(1); @@ -89,17 +79,14 @@ public class ItemUpgradeTome extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; - for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) - { + for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { String key = entry.getKey(); int maxLevel = entry.getValue(); - for (int i = 0; i < maxLevel; i++) - { + for (int i = 0; i < maxLevel; i++) { ItemStack stack = new ItemStack(this); LivingUpgrades.setKey(stack, key); LivingUpgrades.setLevel(stack, i); @@ -109,8 +96,7 @@ public class ItemUpgradeTome extends Item implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=upgradetome")); return ret; @@ -118,13 +104,11 @@ public class ItemUpgradeTome extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); - if (upgrade != null) - { + if (upgrade != null) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getUnlocalizedName()), upgrade.getUpgradeLevel() + 1)); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index 6198c6f5..f22ac3c0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -9,7 +9,6 @@ import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; @@ -23,10 +22,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; -public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVariantProvider -{ - public ItemUpgradeTrainer() - { +public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVariantProvider { + public ItemUpgradeTrainer() { super(); setCreativeTab(BloodMagic.TAB_TOMES); @@ -37,14 +34,12 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; list.add(new ItemStack(this)); - for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) - { + for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { String key = entry.getKey(); ItemStack stack = new ItemStack(this); LivingUpgrades.setKey(stack, key); @@ -54,26 +49,22 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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) - { + if (upgrade != null) { tooltip.add(TextHelper.localize(upgrade.getUnlocalizedName())); } } @Override - public List getTrainedUpgrades(ItemStack stack) - { + public List getTrainedUpgrades(ItemStack stack) { List keyList = new ArrayList(); String key = LivingUpgrades.getKey(stack); - if (!key.isEmpty()) - { + if (!key.isEmpty()) { keyList.add(key); } @@ -81,10 +72,8 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian } @Override - public boolean setTrainedUpgrades(ItemStack stack, List keys) - { - if (keys.isEmpty()) - { + public boolean setTrainedUpgrades(ItemStack stack, List keys) { + if (keys.isEmpty()) { return false; } @@ -93,8 +82,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=upgradetrainer")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index d7cc1ebf..f65f891c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -1,8 +1,11 @@ package WayofTime.bloodmagic.item.alchemy; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.iface.ICustomAlchemyConsumable; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -12,26 +15,18 @@ import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.ICustomAlchemyConsumable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; - -public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomAlchemyConsumable -{ - private static ArrayList names = new ArrayList(); +import java.util.ArrayList; +import java.util.List; +public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomAlchemyConsumable { public static final String BASIC = "basicCuttingFluid"; public static final String EXPLOSIVE = "explosive"; + private static ArrayList names = new ArrayList(); - public ItemCuttingFluid() - { + public ItemCuttingFluid() { super(); setUnlocalizedName(BloodMagic.MODID + ".cuttingFluid."); @@ -44,30 +39,26 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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)); } - private void buildItemList() - { + private void buildItemList() { names.add(0, BASIC); names.add(1, EXPLOSIVE); } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names.get(stack.getItemDamage()); } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -75,73 +66,63 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA list.add(new ItemStack(this, 1, i)); } - public static ItemStack getStack(String name) - { - return new ItemStack(RegistrarBloodMagicItems.CUTTING_FLUID, 1, names.indexOf(name)); - } - @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); for (String name : names) ret.add(new ImmutablePair(names.indexOf(name), "type=" + name)); return ret; } - public int getDamageOfFluid(ItemStack stack) - { + public int getDamageOfFluid(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getInteger("used"); } - public void applyDamageToFluid(ItemStack stack) - { + public void applyDamageToFluid(ItemStack stack) { int damage = Math.min(getDamageOfFluid(stack) + 1, getMaxUsesForFluid(stack)); NBTTagCompound tag = stack.getTagCompound(); tag.setInteger("used", damage); } - public int getMaxUsesForFluid(ItemStack stack) - { - switch (stack.getMetadata()) - { - case 0: - return 16; - case 1: - return 64; - default: - return 1; + 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) - { + public double getDurabilityForDisplay(ItemStack stack) { return (double) (getDamageOfFluid(stack)) / (double) (getMaxUsesForFluid(stack)); } @Override - public boolean showDurabilityBar(ItemStack stack) - { + public boolean showDurabilityBar(ItemStack stack) { return getDamageOfFluid(stack) > 0; } @Override - public ItemStack drainUseOnAlchemyCraft(ItemStack stack) - { + public ItemStack drainUseOnAlchemyCraft(ItemStack stack) { applyDamageToFluid(stack); - if (getDamageOfFluid(stack) >= getMaxUsesForFluid(stack)) - { + if (getDamageOfFluid(stack) >= getMaxUsesForFluid(stack)) { return ItemStack.EMPTY; } return stack; } + public static ItemStack getStack(String name) { + return new ItemStack(RegistrarBloodMagicItems.CUTTING_FLUID, 1, names.indexOf(name)); + } + public static ArrayList getNames() { return names; } diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java index 7c366b96..30e35efd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java @@ -1,9 +1,12 @@ package WayofTime.bloodmagic.item.alchemy; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +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.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; @@ -20,27 +23,18 @@ import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -import com.google.common.collect.Iterables; - -public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvider -{ +public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvider { + public static final String DRAFT_ANGELUS = "draftAngelus"; private static ArrayList names = new ArrayList(); - public static final String DRAFT_ANGELUS = "draftAngelus"; - - public ItemLivingArmourPointsUpgrade() - { + public ItemLivingArmourPointsUpgrade() { super(); setUnlocalizedName(BloodMagic.MODID + ".livingPointUpgrade."); @@ -52,8 +46,7 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -61,29 +54,23 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi } @Override - public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityLivingBase entityLiving) - { + public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityLivingBase entityLiving) { EntityPlayer player = entityLiving instanceof EntityPlayer ? (EntityPlayer) entityLiving : null; - if (player == null || !player.capabilities.isCreativeMode) - { + if (player == null || !player.capabilities.isCreativeMode) { stack.shrink(1); } - if (!worldIn.isRemote) - { + if (!worldIn.isRemote) { player.addPotionEffect(new PotionEffect(MobEffects.WITHER, 300, 5)); player.addPotionEffect(new PotionEffect(MobEffects.POISON, 300, 5)); player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 400, 1)); - if (LivingArmour.hasFullSet(player)) - { + 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) - { + if (armour != null) { + if (armour.maxUpgradePoints < 200) { armour.maxUpgradePoints = 200; ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(chestStack, armour, true); ItemLivingArmour.setLivingArmour(chestStack, armour); @@ -96,39 +83,33 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi } @Override - public int getMaxItemUseDuration(ItemStack stack) - { + public int getMaxItemUseDuration(ItemStack stack) { return 32; } @Override - public EnumAction getItemUseAction(ItemStack stack) - { + public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.DRINK; } @Override - public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) - { + public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { playerIn.setActiveHand(hand); return new ActionResult(EnumActionResult.SUCCESS, playerIn.getHeldItem(hand)); } - private void buildItemList() - { + private void buildItemList() { names.add(0, DRAFT_ANGELUS); } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names.get(stack.getItemDamage()); } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -136,22 +117,19 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi list.add(new ItemStack(this, 1, i)); } - public static ItemStack getStack(String name) - { - return new ItemStack(RegistrarBloodMagicItems.POINTS_UPGRADE, 1, names.indexOf(name)); - } - @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); for (String name : names) ret.add(new ImmutablePair(names.indexOf(name), "type=" + name)); return ret; } - public static ItemStack getStack(String key, int stackSize) - { + public static ItemStack getStack(String name) { + return new ItemStack(RegistrarBloodMagicItems.POINTS_UPGRADE, 1, names.indexOf(name)); + } + + public static ItemStack getStack(String key, int stackSize) { ItemStack stack = getStack(key); stack.setCount(stackSize); diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 9aa6c545..a7af1f03 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -1,13 +1,24 @@ package WayofTime.bloodmagic.item.armour; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.api.saving.SoulNetwork; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.ItemComponent; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +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.Utils; +import WayofTime.bloodmagic.util.helper.TextHelper; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; @@ -29,46 +40,22 @@ 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 WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.item.ItemComponent; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -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.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.TextHelper; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - import javax.annotation.Nullable; +import java.lang.reflect.Field; +import java.util.*; +import java.util.Map.Entry; -public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshProvider -{ - private static Field _FLAGS = ReflectionHelper.findField(Entity.class, "FLAGS", "field_184240_ax"); - - private static DataParameter FLAGS = null; - public static String[] names = { "helmet", "chest", "legs", "boots" }; - +public class ItemLivingArmour extends ItemArmor 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(EntityEquipmentSlot armorType) - { + public ItemLivingArmour(EntityEquipmentSlot armorType) { super(ItemArmor.ArmorMaterial.IRON, 0, armorType); setUnlocalizedName(BloodMagic.MODID + ".livingArmour."); // setMaxDamage(250); @@ -77,27 +64,21 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public void onCreated(ItemStack stack, World world, EntityPlayer player) - { - if (stack != null && !world.isRemote && stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - { + public void onCreated(ItemStack stack, World world, EntityPlayer player) { + if (stack != null && !world.isRemote && stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { Utils.setUUID(stack); } } @Override - public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) - { - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST || this == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET || this == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS) - { + public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot 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_LEGS) - { + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { return "bloodmagic:models/armor/livingArmour_layer_2.png"; - } else - { + } else { return null; } } @@ -115,25 +96,20 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP // } @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) - { + public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { return ItemStack.areItemsEqual(repair, ItemComponent.getStack(ItemComponent.REAGENT_BINDING)); } @Override - public ArmorProperties getProperties(EntityLivingBase player, ItemStack stack, DamageSource source, double damage, int slot) - { + public ArmorProperties getProperties(EntityLivingBase 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) - { + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS || this == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) { damageAmount = 3d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) - { + } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { damageAmount = 6d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - { + } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { damageAmount = 0.64; } @@ -141,42 +117,34 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP int maxAbsorption = 100000; - if (source.equals(DamageSource.DROWN)) - { + if (source.equals(DamageSource.DROWN)) { return new ArmorProperties(-1, 0, 0); } - if (source.equals(DamageSource.OUT_OF_WORLD)) - { + if (source.equals(DamageSource.OUT_OF_WORLD)) { return new ArmorProperties(-1, 0, 0); } - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - { + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { armourReduction = 0.24 / 0.64; // This values puts it at iron level ItemStack helmet = player.getItemStackFromSlot(EntityEquipmentSlot.HEAD); ItemStack leggings = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); ItemStack boots = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); - if (helmet.isEmpty() || leggings.isEmpty() || boots.isEmpty()) - { + 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) - { + 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)) - { + if (hasLivingArmour(stack)) { LivingArmour armour = getLivingArmour(stack); - if (armour != null && isEnabled(stack)) - { - for (Entry entry : armour.upgradeMap.entrySet()) - { + if (armour != null && isEnabled(stack)) { + for (Entry entry : armour.upgradeMap.entrySet()) { LivingArmourUpgrade upgrade = entry.getValue(); remainder *= (1 - upgrade.getArmourProtection(player, source)); } @@ -193,10 +161,8 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return new ArmorProperties(-1, source.isUnblockable() ? 1 - remainder : damageAmount, maxAbsorption); } - } else - { - if (source.isUnblockable()) - { + } else { + if (source.isUnblockable()) { return new ArmorProperties(-1, damageAmount * armourPenetrationReduction, maxAbsorption); } @@ -207,25 +173,20 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) - { - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) - { + public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) { return 3; } - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - { + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { return 8; } - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) - { + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { return 6; } - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS) - { + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS) { return 3; } @@ -233,21 +194,16 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) - { - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - { + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { int preDamage = stack.getItemDamage(); - if (source.isUnblockable()) - { + if (source.isUnblockable()) { return; } - if (damage > this.getMaxDamage(stack) - this.getDamage(stack)) - { + if (damage > this.getMaxDamage(stack) - this.getDamage(stack)) { //TODO: Syphon a load of LP. - if (entity.getEntityWorld().isRemote && entity instanceof EntityPlayer) - { + if (entity.getEntityWorld().isRemote && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; SoulNetwork network = NetworkHelper.getSoulNetwork(player); network.syphonAndDamage(player, damage * 100); @@ -259,21 +215,17 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP stack.damageItem(damage, entity); int receivedDamage = stack.getItemDamage() - preDamage; - if (entity instanceof EntityPlayer) - { + if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { LivingArmour armour = ItemLivingArmour.getLivingArmour(stack); - if (armour != null) - { + if (armour != null) { StatTrackerRepairing.incrementCounter(armour, receivedDamage); } } } - } else - { + } else { stack.damageItem(damage, entity); } @@ -282,46 +234,36 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - { + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { LivingArmour armour = getLivingArmourFromStack(stack); - for (Entry entry : armour.upgradeMap.entrySet()) - { + for (Entry entry : armour.upgradeMap.entrySet()) { LivingArmourUpgrade upgrade = entry.getValue(); - if (upgrade != null) - { - if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Keyboard.isKeyDown(Keyboard.KEY_M)) - { + 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())) - { + for (StatTracker searchTracker : armour.trackerMap.values()) { + if (searchTracker != null && searchTracker.providesUpgrade(upgrade.getUniqueIdentifier())) { tracker = searchTracker; break; } } - if (tracker != null) - { + if (tracker != null) { double progress = tracker.getProgress(armour, upgrade.getUpgradeLevel()); tooltip.add(TextHelper.localize("tooltip.bloodmagic.livingArmour.upgrade.progress", TextHelper.localize(upgrade.getUnlocalizedName()), MathHelper.clamp((int) (progress * 100D), 0, 100))); } - } else - { + } else { tooltip.add(TextHelper.localize("tooltip.bloodmagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getUnlocalizedName()), 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))) - { + if (!(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Keyboard.isKeyDown(Keyboard.KEY_M))) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour.extraExtraInfo")); } } @@ -330,52 +272,39 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack stack) - { + public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { super.onArmorTick(world, player, stack); - if (world.isRemote && this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - { + if (world.isRemote && this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { if (player instanceof EntityPlayerSP) //Sanity check { EntityPlayerSP spPlayer = (EntityPlayerSP) player; - if (FLAGS == null) - { - try - { + if (FLAGS == null) { + try { FLAGS = (DataParameter) _FLAGS.get(null); - } catch (IllegalArgumentException e) - { + } catch (IllegalArgumentException e) { e.printStackTrace(); - } catch (IllegalAccessException e) - { + } catch (IllegalAccessException e) { e.printStackTrace(); } } - if (FLAGS != null) - { - if (LivingArmour.hasFullSet(player)) - { + if (FLAGS != null) { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.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) - { + 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()) - { + 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) - { + } else if (spPlayer.isElytraFlying() && !spPlayer.movementInput.jump && !spPlayer.onGround) { byte b0 = player.getDataManager().get(FLAGS); player.getDataManager().set(FLAGS, (byte) (b0 & ~(1 << 7))); } @@ -385,16 +314,13 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } } - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - { - if (!hasLivingArmour(stack)) - { + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { + if (!hasLivingArmour(stack)) { setLivingArmour(stack, getLivingArmourFromStack(stack)); } LivingArmour armour = getLivingArmour(stack); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { this.setIsEnabled(stack, true); armour.onTick(world, player); } @@ -404,10 +330,8 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) - { - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST && isEnabled(stack) && slot == EntityEquipmentSlot.CHEST) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST && isEnabled(stack) && slot == EntityEquipmentSlot.CHEST) { LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(stack); return armour.getAttributeModifiers(); @@ -417,20 +341,16 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[3 - armorType.getIndex()]; } @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { - return new ItemMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { + return new ItemMeshDefinition() { @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { + public ModelResourceLocation getModelLocation(ItemStack stack) { assert getCustomLocation() != null; if (stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) return new ModelResourceLocation(getCustomLocation(), "armour=head"); @@ -445,14 +365,12 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return new ResourceLocation(BloodMagic.MODID, "item/ItemLivingArmour"); } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); ret.add("armour=head"); ret.add("armour=body"); @@ -461,48 +379,21 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return ret; } - @Nullable - public static LivingArmour getLivingArmourFromStack(ItemStack stack) - { - NBTTagCompound livingTag = getArmourTag(stack); - - LivingArmour livingArmour = new LivingArmour(); - livingArmour.readFromNBT(livingTag); - - return livingArmour; - } - - public void setLivingArmour(ItemStack stack, LivingArmour armour, boolean forceWrite) - { + public void setLivingArmour(ItemStack stack, LivingArmour armour, boolean forceWrite) { NBTTagCompound livingTag = new NBTTagCompound(); - if (!forceWrite) - { + if (!forceWrite) { livingTag = getArmourTag(stack); armour.writeDirtyToNBT(livingTag); - } else - { + } else { armour.writeToNBT(livingTag); } setArmourTag(stack, livingTag); } - public static NBTTagCompound getArmourTag(ItemStack stack) - { - if (!stack.hasTagCompound()) - { - stack.setTagCompound(new NBTTagCompound()); - } - - NBTTagCompound tag = stack.getTagCompound(); - return tag.getCompoundTag(Constants.NBT.LIVING_ARMOUR); - } - - public void setArmourTag(ItemStack stack, NBTTagCompound livingTag) - { - if (!stack.hasTagCompound()) - { + public void setArmourTag(ItemStack stack, NBTTagCompound livingTag) { + if (!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } @@ -511,20 +402,59 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP tag.setTag(Constants.NBT.LIVING_ARMOUR, livingTag); } + public void setIsEnabled(ItemStack stack, boolean bool) { + NBTHelper.checkNBT(stack); + NBTTagCompound tag = stack.getTagCompound(); + tag.setBoolean("enabled", bool); + } + + public boolean isEnabled(ItemStack stack) { + NBTHelper.checkNBT(stack); + NBTTagCompound tag = stack.getTagCompound(); + return tag.getBoolean("enabled"); + } + + public void setIsElytra(ItemStack stack, boolean bool) { + NBTHelper.checkNBT(stack); + NBTTagCompound tag = stack.getTagCompound(); + tag.setBoolean("elytra", bool); + } + + public boolean isElytra(ItemStack stack) { + NBTHelper.checkNBT(stack); + NBTTagCompound tag = stack.getTagCompound(); + return tag.getBoolean("elytra"); + } + + @Nullable + public static LivingArmour getLivingArmourFromStack(ItemStack stack) { + NBTTagCompound livingTag = getArmourTag(stack); + + LivingArmour livingArmour = new LivingArmour(); + livingArmour.readFromNBT(livingTag); + + return livingArmour; + } + + public static NBTTagCompound getArmourTag(ItemStack stack) { + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.getTagCompound(); + return tag.getCompoundTag(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)) - { + 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)) - { + for (Entry entry : armour.upgradeMap.entrySet()) { + if (entry.getKey().equals(uniqueIdentifier)) { return entry.getValue(); } } @@ -532,14 +462,11 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return null; } - public static LivingArmourUpgrade getUpgradeFromNBT(String uniqueIdentifier, ItemStack stack) - { + public static LivingArmourUpgrade getUpgradeFromNBT(String uniqueIdentifier, ItemStack stack) { LivingArmour armour = getLivingArmourFromStack(stack); - for (Entry entry : armour.upgradeMap.entrySet()) - { - if (entry.getKey().equals(uniqueIdentifier)) - { + for (Entry entry : armour.upgradeMap.entrySet()) { + if (entry.getKey().equals(uniqueIdentifier)) { return entry.getValue(); } } @@ -547,24 +474,20 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return null; } - public static boolean hasLivingArmour(ItemStack stack) - { + public static boolean hasLivingArmour(ItemStack stack) { UUID uuid = Utils.getUUID(stack); return uuid != null && armourMap.containsKey(uuid); } @Nullable - public static LivingArmour getLivingArmour(ItemStack stack) - { + 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)) - { + public static void setLivingArmour(ItemStack stack, LivingArmour armour) { + if (!Utils.hasUUID(stack)) { Utils.setUUID(stack); } @@ -573,10 +496,8 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP armourMap.put(uuid, armour); } - public static boolean hasUpgrade(String id, ItemStack stack) - { - if (!hasLivingArmour(stack)) - { + public static boolean hasUpgrade(String id, ItemStack stack) { + if (!hasLivingArmour(stack)) { setLivingArmour(stack, getLivingArmourFromStack(stack)); } @@ -584,32 +505,4 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return armour.upgradeMap.containsKey(id); } - - public void setIsEnabled(ItemStack stack, boolean bool) - { - NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); - tag.setBoolean("enabled", bool); - } - - public boolean isEnabled(ItemStack stack) - { - NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); - return tag.getBoolean("enabled"); - } - - public void setIsElytra(ItemStack stack, boolean bool) - { - NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); - tag.setBoolean("elytra", bool); - } - - public boolean isElytra(ItemStack stack) - { - NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); - return tag.getBoolean("elytra"); - } } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index dc11df71..7933de3a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -1,7 +1,15 @@ package WayofTime.bloodmagic.item.armour; -import java.util.*; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IMultiWillTool; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.enchantment.Enchantment; @@ -24,37 +32,26 @@ import net.minecraft.world.World; import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; +import java.util.*; -public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMeshProvider, IMultiWillTool -{ - public static String[] names = { "helmet", "chest", "legs", "boots" }; +public class ItemSentientArmour extends ItemArmor 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[] 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[] 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[] 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 static double[] speedBonus = new double[]{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4}; - public ItemSentientArmour(EntityEquipmentSlot armorType) - { + public ItemSentientArmour(EntityEquipmentSlot armorType) { super(ItemArmor.ArmorMaterial.IRON, 0, armorType); setUnlocalizedName(BloodMagic.MODID + ".sentientArmour."); setMaxDamage(250); @@ -62,111 +59,92 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot 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"; + public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot 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_LEGS) - { - 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"; + if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { + 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 - { + } else { return null; } } @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack stack) - { - if (this.armorType == EntityEquipmentSlot.CHEST) - { + public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { + if (this.armorType == EntityEquipmentSlot.CHEST) { EnumDemonWillType type = this.getCurrentType(stack); - switch (type) - { - case CORROSIVE: - if (player.isPotionActive(MobEffects.POISON)) - { - player.removeActivePotionEffect(MobEffects.POISON); - } - if (player.isPotionActive(MobEffects.WITHER)) - { - player.removeActivePotionEffect(MobEffects.WITHER); - } - break; - default: + switch (type) { + case CORROSIVE: + if (player.isPotionActive(MobEffects.POISON)) { + player.removeActivePotionEffect(MobEffects.POISON); + } + if (player.isPotionActive(MobEffects.WITHER)) { + player.removeActivePotionEffect(MobEffects.WITHER); + } + break; + default: } } } - public void onPlayerAttacked(ItemStack stack, DamageSource source, EntityPlayer attackedPlayer) - { - if (source.getTrueSource() instanceof EntityLivingBase) - { + public void onPlayerAttacked(ItemStack stack, DamageSource source, EntityPlayer attackedPlayer) { + if (source.getTrueSource() instanceof EntityLivingBase) { EntityLivingBase attacker = (EntityLivingBase) source.getTrueSource(); EnumDemonWillType type = this.getCurrentType(stack); - switch (type) - { - case CORROSIVE: - if (!source.isProjectile()) - { - attacker.addPotionEffect(new PotionEffect(MobEffects.POISON, 100)); //TODO: customize duration - } - break; - case DEFAULT: - break; - case DESTRUCTIVE: - break; - case STEADFAST: - break; - case VENGEFUL: - break; + switch (type) { + case CORROSIVE: + if (!source.isProjectile()) { + attacker.addPotionEffect(new PotionEffect(MobEffects.POISON, 100)); //TODO: customize duration + } + break; + case DEFAULT: + break; + case DESTRUCTIVE: + break; + case STEADFAST: + break; + case VENGEFUL: + break; } } } @Override - public ArmorProperties getProperties(EntityLivingBase player, ItemStack stack, DamageSource source, double damage, int slot) - { + public ArmorProperties getProperties(EntityLivingBase 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) - { + if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS || this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) { damageAmount = 3d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) - { + } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { damageAmount = 6d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) - { + } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { damageAmount = 0.64; } @@ -174,50 +152,42 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes int maxAbsorption = 100000; - if (source.equals(DamageSource.DROWN)) - { + if (source.equals(DamageSource.DROWN)) { return new ArmorProperties(-1, 0, 0); } - if (source.equals(DamageSource.OUT_OF_WORLD)) - { + if (source.equals(DamageSource.OUT_OF_WORLD)) { return new ArmorProperties(-1, 0, 0); } - if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) - { + if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { armourReduction = 0.24 / 0.64; // This values puts it at iron level ItemStack helmet = player.getItemStackFromSlot(EntityEquipmentSlot.HEAD); ItemStack leggings = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); ItemStack boots = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); - if (helmet.isEmpty() || leggings.isEmpty() || boots.isEmpty()) - { + 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) - { + 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()) - { + if (source.isUnblockable()) { return new ArmorProperties(-1, damageAmount * armourPenetrationReduction, maxAbsorption); } return new ArmorProperties(-1, damageAmount, maxAbsorption); } - } else - { - if (source.isUnblockable()) - { + } else { + if (source.isUnblockable()) { return new ArmorProperties(-1, damageAmount * armourPenetrationReduction, maxAbsorption); } @@ -228,25 +198,20 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) - { - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) - { + public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) { return 3; } - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) - { + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { return 8; } - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) - { + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { return 6; } - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS) - { + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS) { return 3; } @@ -254,53 +219,45 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) - { - if (entity instanceof EntityPlayer) - { + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; EnumDemonWillType type = getCurrentType(stack); double willRequired = this.getCostModifier(stack) * damage; double willLeft = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (willLeft >= willRequired && canSustainArmour(type, willLeft)) - { + if (willLeft >= willRequired && canSustainArmour(type, willLeft)) { this.setAbilitiesOfArmour(type, willLeft - willRequired, stack); PlayerDemonWillHandler.consumeDemonWill(type, player, willRequired); - } else - { + } else { this.revertArmour(player, stack); } } } - public double getCostModifier(ItemStack stack) - { + public double getCostModifier(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble("costModifier"); } - public void setCostModifier(ItemStack stack, double modifier) - { + public void setCostModifier(ItemStack stack, double modifier) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); tag.setDouble("costModifier", modifier); } - public double getArmourModifier(ItemStack stack) - { + public double getArmourModifier(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble("armourModifier"); } - public void setArmourModifier(ItemStack stack, double modifier) - { + public void setArmourModifier(ItemStack stack, double modifier) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -308,26 +265,21 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[3 - armorType.getIndex()]; } - public void revertArmour(EntityPlayer player, ItemStack itemStack) - { + public void revertArmour(EntityPlayer player, ItemStack itemStack) { ItemStack stack = this.getContainedArmourStack(itemStack); player.setItemStackToSlot(armorType, stack); } @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { - return new ItemMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { + return new ItemMeshDefinition() { @Override - public ModelResourceLocation getModelLocation(ItemStack stack) - { + public ModelResourceLocation getModelLocation(ItemStack stack) { assert getCustomLocation() != null; EnumDemonWillType type = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET).getCurrentType(stack); String additional = "_" + type.getName().toLowerCase(); @@ -344,17 +296,14 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return new ResourceLocation(BloodMagic.MODID, "item/ItemSentientArmour"); } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { String additional = "_" + type.getName().toLowerCase(); ret.add("armour=head" + additional); @@ -367,11 +316,9 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.CHEST) - { + if (slot == EntityEquipmentSlot.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)); @@ -381,22 +328,8 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes return multimap; } - public static void revertAllArmour(EntityPlayer player) - { - NonNullList armourInventory = player.inventory.armorInventory; - for (ItemStack stack : armourInventory) - { - if (stack != null && stack.getItem() instanceof ItemSentientArmour) - { - ((ItemSentientArmour) stack.getItem()).revertArmour(player, stack); - } - } - } - - public void setContainedArmourStack(ItemStack newArmour, ItemStack previousArmour) - { - if (newArmour == null || previousArmour == null) - { + public void setContainedArmourStack(ItemStack newArmour, ItemStack previousArmour) { + if (newArmour == null || previousArmour == null) { return; } @@ -404,8 +337,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes previousArmour.writeToNBT(tag); NBTTagCompound omegaTag = newArmour.getTagCompound(); - if (omegaTag == null) - { + if (omegaTag == null) { omegaTag = new NBTTagCompound(); newArmour.setTagCompound(omegaTag); } @@ -415,11 +347,9 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes EnchantmentHelper.setEnchantments(enchantmentMap, newArmour); } - public ItemStack getContainedArmourStack(ItemStack newArmour) - { + public ItemStack getContainedArmourStack(ItemStack newArmour) { NBTTagCompound omegaTag = newArmour.getTagCompound(); - if (omegaTag == null) - { + if (omegaTag == null) { return null; } @@ -427,10 +357,195 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes return new ItemStack(tag); } - public static boolean convertPlayerArmour(EnumDemonWillType type, double will, EntityPlayer player) - { - if (!canSustainArmour(type, will)) - { + 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); + + NBTTagCompound 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); + + NBTTagCompound tag = stack.getTagCompound(); + + tag.setString(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 == EntityEquipmentSlot.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); + + NBTTagCompound tag = stack.getTagCompound(); + return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); + } + + public void setHealthBonus(ItemStack stack, double hp) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + + tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); + } + + public double getKnockbackResistance(ItemStack stack) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + return tag.getDouble("knockback"); + } + + public void setKnockbackResistance(ItemStack stack, double kb) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + + tag.setDouble("knockback", kb); + } + + public double getSpeedBoost(ItemStack stack) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + return tag.getDouble("speed"); + } + + public void setSpeedBoost(ItemStack stack, double speed) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + + tag.setDouble("speed", speed); + } + + public double getDamageBoost(ItemStack stack) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + return tag.getDouble("damage"); + } + + public void setDamageBoost(ItemStack stack, double damage) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + + tag.setDouble("damage", damage); + } + + public double getAttackSpeedBoost(ItemStack stack) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + return tag.getDouble("attackSpeed"); + } + + public void setAttackSpeedBoost(ItemStack stack, double attackSpeed) { + NBTHelper.checkNBT(stack); + + NBTTagCompound tag = stack.getTagCompound(); + + tag.setDouble("attackSpeed", attackSpeed); + } + + public static void revertAllArmour(EntityPlayer 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, EntityPlayer player) { + if (!canSustainArmour(type, will)) { return false; } @@ -454,230 +569,19 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } } - 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); - - NBTTagCompound 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); - - NBTTagCompound tag = stack.getTagCompound(); - - tag.setString(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 == EntityEquipmentSlot.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 static boolean canSustainArmour(EnumDemonWillType type, double willValue) - { + public static boolean canSustainArmour(EnumDemonWillType type, double willValue) { return getWillBracket(willValue) >= 0; } - public static int getWillBracket(double will) - { + public static int getWillBracket(double will) { int bracket = -1; - for (int i = 0; i < willBracket.length; i++) - { - if (will >= willBracket[i]) - { + for (int i = 0; i < willBracket.length; i++) { + if (will >= willBracket[i]) { bracket = i; } } return bracket; } - - public double getHealthBonus(ItemStack stack) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); - } - - public void setHealthBonus(ItemStack stack, double hp) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - - tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); - } - - public double getKnockbackResistance(ItemStack stack) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - return tag.getDouble("knockback"); - } - - public void setKnockbackResistance(ItemStack stack, double kb) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - - tag.setDouble("knockback", kb); - } - - public double getSpeedBoost(ItemStack stack) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - return tag.getDouble("speed"); - } - - public void setSpeedBoost(ItemStack stack, double speed) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - - tag.setDouble("speed", speed); - } - - public double getDamageBoost(ItemStack stack) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - return tag.getDouble("damage"); - } - - public void setDamageBoost(ItemStack stack, double damage) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - - tag.setDouble("damage", damage); - } - - public double getAttackSpeedBoost(ItemStack stack) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - return tag.getDouble("attackSpeed"); - } - - public void setAttackSpeedBoost(ItemStack stack, double attackSpeed) - { - NBTHelper.checkNBT(stack); - - NBTTagCompound tag = stack.getTagCompound(); - - tag.setDouble("attackSpeed", attackSpeed); - } } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java index d92b04e1..c82c92e8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java @@ -1,64 +1,53 @@ package WayofTime.bloodmagic.item.block; +import WayofTime.bloodmagic.tile.TileAlchemyTable; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -public class ItemBlockAlchemyTable extends ItemBlock -{ - public ItemBlockAlchemyTable(Block block) - { +public class ItemBlockAlchemyTable extends ItemBlock { + public ItemBlockAlchemyTable(Block block) { super(block); } @Override - public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) - { + public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) { float yaw = player.rotationYaw; EnumFacing direction = EnumFacing.fromAngle(yaw); - if (direction.getFrontOffsetY() != 0) - { + if (direction.getFrontOffsetY() != 0) { return false; } - if (!world.isAirBlock(pos.offset(direction))) - { + 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)) - { + if (!world.setBlockState(pos, newState, 3)) { return false; } - if (!world.setBlockState(pos.offset(direction), newState, 3)) - { + if (!world.setBlockState(pos.offset(direction), newState, 3)) { return false; } IBlockState state = world.getBlockState(pos); - if (state.getBlock() == this.block) - { + if (state.getBlock() == this.block) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAlchemyTable) - { + if (tile instanceof TileAlchemyTable) { ((TileAlchemyTable) tile).setInitialTableParameters(direction, false, pos.offset(direction)); } TileEntity slaveTile = world.getTileEntity(pos.offset(direction)); - if (slaveTile instanceof TileAlchemyTable) - { + if (slaveTile instanceof TileAlchemyTable) { ((TileAlchemyTable) slaveTile).setInitialTableParameters(direction, true, pos); } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index 8d3d0fb4..81a701a3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -6,8 +6,6 @@ import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.Block; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -15,53 +13,44 @@ 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.*; +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 ItemBlock -{ - public ItemBlockBloodTank(Block block) - { +public class ItemBlockBloodTank extends ItemBlock { + public ItemBlockBloodTank(Block block) { super(block); setHasSubtypes(true); } @Override - public int getMetadata(int meta) - { + public int getMetadata(int meta) { return meta; } @Override - public String getItemStackDisplayName(ItemStack stack) - { + public String getItemStackDisplayName(ItemStack stack) { FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(stack.getTagCompound()); - if (fluidStack != null) - { + if (fluidStack != null) { return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1) + " (" + fluidStack.getLocalizedName() + ")"; - } - else - { + } 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) - { + 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()) - { + if (stack.hasTagCompound()) { NBTTagCompound tag = stack.getTagCompound(); FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); - if (fluidStack != null) - { + 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))); } @@ -70,23 +59,20 @@ public class ItemBlockBloodTank extends ItemBlock @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) - for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) - list.add(new ItemStack(this, 1, i)); + for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) + list.add(new ItemStack(this, 1, i)); } - public int getCapacity(ItemStack container) - { + 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, NBTTagCompound nbt) - { + public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound 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 index 51f523e5..611c8150 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java @@ -14,34 +14,27 @@ import net.minecraft.world.World; import java.util.Locale; -public class ItemBlockDemonCrystal extends ItemBlock -{ - public ItemBlockDemonCrystal(Block block) - { +public class ItemBlockDemonCrystal extends ItemBlock { + public ItemBlockDemonCrystal(Block block) { super(block); setHasSubtypes(true); } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + EnumDemonWillType.values()[stack.getItemDamage()].toString().toLowerCase(Locale.ENGLISH); } @Override - public int getMetadata(int meta) - { + public int getMetadata(int meta) { return meta; } @Override - public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) - { - if (super.placeBlockAt(stack, player, world, pos, side, hitX, hitY, hitZ, newState)) - { + public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) { + if (super.placeBlockAt(stack, player, world, pos, side, hitX, hitY, hitZ, newState)) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileDemonCrystal) - { + if (tile instanceof TileDemonCrystal) { ((TileDemonCrystal) tile).setPlacement(side); } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java index 9efd5ff4..a241c1c9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java @@ -6,11 +6,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.MathHelper; -public class ItemBlockEnum & IStringSerializable> extends ItemBlock -{ +public class ItemBlockEnum & IStringSerializable> extends ItemBlock { - public ItemBlockEnum(BlockEnum block) - { + public ItemBlockEnum(BlockEnum block) { super(block); if (block.getTypes().length > 1) @@ -19,20 +17,17 @@ public class ItemBlockEnum & IStringSerializable> extends Item @SuppressWarnings("unchecked") @Override - public BlockEnum getBlock() - { + public BlockEnum getBlock() { return (BlockEnum) super.getBlock(); } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return getBlock().getUnlocalizedName() + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, 15)].getName(); } @Override - public int getMetadata(int damage) - { + public int getMetadata(int damage) { return damage; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java index 37e51279..895b40c8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java @@ -10,7 +10,7 @@ public class ItemBlockString extends ItemBlock { public ItemBlockString(BlockString block) { super(block); - if (block.getTypes().length> 1) + if (block.getTypes().length > 1) setHasSubtypes(true); } diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index 9bc0d2be..3abdfdce 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -26,12 +26,10 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.List; -public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, IItemLPContainer, IVariantProvider -{ +public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, IItemLPContainer, IVariantProvider { public final int CAPACITY = 10000; // Max LP storage - public ItemPackSacrifice() - { + public ItemPackSacrifice() { super(ArmorMaterial.CHAIN, 0, EntityEquipmentSlot.CHEST); setUnlocalizedName(BloodMagic.MODID + ".pack.sacrifice"); @@ -39,21 +37,17 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote) return ActionResult.newResult(EnumActionResult.FAIL, stack); RayTraceResult rayTrace = this.rayTrace(world, player, false); - if (rayTrace == null) - { + if (rayTrace == null) { return super.onItemRightClick(world, player, EnumHand.MAIN_HAND); - } else - { - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) - { + } else { + if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { TileEntity tile = world.getTileEntity(rayTrace.getBlockPos()); if (!(tile instanceof IBloodAltar)) @@ -67,15 +61,13 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I } @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack stack) - { + public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { if (getStoredLP(stack) > CAPACITY) setStoredLP(stack, CAPACITY); } @Override - public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -84,8 +76,7 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=normal")); return ret; @@ -94,22 +85,18 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I // IFillable @Override - public int getCapacity() - { + public int getCapacity() { return this.CAPACITY; } @Override - public int getStoredLP(ItemStack stack) - { + 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) - { + 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 index 35761c12..1dd19a4b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -27,8 +27,7 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.List; -public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulator, IItemLPContainer, IVariantProvider -{ +public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulator, IItemLPContainer, IVariantProvider { /** * How much LP per half heart */ @@ -46,8 +45,7 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato */ public final float HEALTHREQ = 0.5f; - public ItemPackSelfSacrifice() - { + public ItemPackSelfSacrifice() { super(ArmorMaterial.CHAIN, 0, EntityEquipmentSlot.CHEST); setUnlocalizedName(BloodMagic.MODID + ".pack.selfSacrifice"); @@ -55,21 +53,17 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote) return ActionResult.newResult(EnumActionResult.FAIL, stack); RayTraceResult position = this.rayTrace(world, player, false); - if (position == null) - { + if (position == null) { return super.onItemRightClick(world, player, EnumHand.MAIN_HAND); - } else - { - if (position.typeOfHit == RayTraceResult.Type.BLOCK) - { + } else { + if (position.typeOfHit == RayTraceResult.Type.BLOCK) { TileEntity tile = world.getTileEntity(position.getBlockPos()); if (!(tile instanceof IBloodAltar)) @@ -83,15 +77,13 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato } @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack stack) - { + public void onArmorTick(World world, EntityPlayer 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) - { + if (shouldSyphon & world.getTotalWorldTime() % INTERVAL == 0) { NetworkHelper.getSoulNetwork(player).hurtPlayer(player, 1.0F); LPContainer.addLPToItem(stack, CONVERSION, CAPACITY); } @@ -101,8 +93,7 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato } @Override - public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; list.add(TextHelper.localize("tooltip.bloodmagic.pack.selfSacrifice.desc")); @@ -110,8 +101,7 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=normal")); return ret; @@ -120,22 +110,18 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato // IFillable @Override - public int getCapacity() - { + public int getCapacity() { return this.CAPACITY; } @Override - public int getStoredLP(ItemStack stack) - { + 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) - { + 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 index 16d205d6..09508f3f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java @@ -9,121 +9,94 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.FMLCommonHandler; -public class ContainerHolding extends Container -{ +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 EntityPlayer player; - public final InventoryHolding inventoryHolding; - public ContainerHolding(EntityPlayer player, InventoryHolding inventoryHolding) - { + public ContainerHolding(EntityPlayer player, InventoryHolding inventoryHolding) { this.player = player; this.inventoryHolding = inventoryHolding; int currentSlotHeldIn = player.inventory.currentItem; - for (int columnIndex = 0; columnIndex < ItemSigilHolding.inventorySize; ++columnIndex) - { + 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) - { + 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) - { + for (int actionBarIndex = 0; actionBarIndex < PLAYER_INVENTORY_COLUMNS; ++actionBarIndex) { + if (actionBarIndex == currentSlotHeldIn) { this.addSlotToContainer(new SlotDisabled(player.inventory, actionBarIndex, 8 + actionBarIndex * 18, 99)); - } else - { + } else { this.addSlotToContainer(new Slot(player.inventory, actionBarIndex, 8 + actionBarIndex * 18, 99)); } } } @Override - public boolean canInteractWith(EntityPlayer entityPlayer) - { + public boolean canInteractWith(EntityPlayer entityPlayer) { return true; } @Override - public void onContainerClosed(EntityPlayer entityPlayer) - { + public void onContainerClosed(EntityPlayer entityPlayer) { super.onContainerClosed(entityPlayer); - if (!entityPlayer.getEntityWorld().isRemote) - { + if (!entityPlayer.getEntityWorld().isRemote) { saveInventory(entityPlayer); } } @Override - public void detectAndSendChanges() - { + public void detectAndSendChanges() { super.detectAndSendChanges(); - if (!player.getEntityWorld().isRemote) - { + if (!player.getEntityWorld().isRemote) { saveInventory(player); } } @Override - public ItemStack transferStackInSlot(EntityPlayer entityPlayer, int slotIndex) - { + public ItemStack transferStackInSlot(EntityPlayer entityPlayer, int slotIndex) { ItemStack stack = ItemStack.EMPTY; Slot slotObject = inventorySlots.get(slotIndex); int slots = inventorySlots.size(); - if (slotObject != null && slotObject.getHasStack()) - { + 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)) - { + 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)) - { + } 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)) - { + } 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)) - { + } else if (!this.mergeItemStack(stackInSlot, ItemSigilHolding.inventorySize, ItemSigilHolding.inventorySize + (PLAYER_INVENTORY_ROWS * PLAYER_INVENTORY_COLUMNS), false)) { return ItemStack.EMPTY; } } - if (stackInSlot.isEmpty()) - { + if (stackInSlot.isEmpty()) { slotObject.putStack(ItemStack.EMPTY); - } else - { + } else { slotObject.onSlotChanged(); } - if (stackInSlot.getCount() == stack.getCount()) - { + if (stackInSlot.getCount() == stack.getCount()) { return ItemStack.EMPTY; } @@ -133,57 +106,47 @@ public class ContainerHolding extends Container return stack; } - public void saveInventory(EntityPlayer entityPlayer) - { + public void saveInventory(EntityPlayer entityPlayer) { inventoryHolding.onGuiSaved(entityPlayer); } - private class SlotHolding extends Slot - { + private class SlotHolding extends Slot { private final EntityPlayer player; private ContainerHolding containerHolding; - public SlotHolding(ContainerHolding containerHolding, IInventory inventory, EntityPlayer player, int slotIndex, int x, int y) - { + public SlotHolding(ContainerHolding containerHolding, IInventory inventory, EntityPlayer player, int slotIndex, int x, int y) { super(inventory, slotIndex, x, y); this.player = player; this.containerHolding = containerHolding; } @Override - public void onSlotChanged() - { + public void onSlotChanged() { super.onSlotChanged(); - if (FMLCommonHandler.instance().getEffectiveSide().isServer()) - { + if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { containerHolding.saveInventory(player); } } @Override - public boolean isItemValid(ItemStack itemStack) - { + 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) - { + 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) - { + public boolean isItemValid(ItemStack itemStack) { return false; } @Override - public boolean canTakeStack(EntityPlayer player) - { + public boolean canTakeStack(EntityPlayer 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 index c0030d76..83440993 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java @@ -1,47 +1,38 @@ package WayofTime.bloodmagic.item.inventory; -import java.util.UUID; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; -public class InventoryHolding extends ItemInventory -{ +import java.util.UUID; + +public class InventoryHolding extends ItemInventory { protected ItemStack[] inventory; - public InventoryHolding(ItemStack itemStack) - { + public InventoryHolding(ItemStack itemStack) { super(itemStack, ItemSigilHolding.inventorySize, "SigilOfHolding"); } - public void onGuiSaved(EntityPlayer entityPlayer) - { + public void onGuiSaved(EntityPlayer entityPlayer) { masterStack = findParentStack(entityPlayer); - if (!masterStack.isEmpty()) - { + if (!masterStack.isEmpty()) { save(); } } - public ItemStack findParentStack(EntityPlayer entityPlayer) - { - if (Utils.hasUUID(masterStack)) - { + public ItemStack findParentStack(EntityPlayer 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++) - { + 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()) - { + 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; } } @@ -51,12 +42,10 @@ public class InventoryHolding extends ItemInventory return ItemStack.EMPTY; } - public void save() - { + public void save() { NBTTagCompound nbtTagCompound = masterStack.getTagCompound(); - if (nbtTagCompound == null) - { + if (nbtTagCompound == null) { nbtTagCompound = new NBTTagCompound(); UUID uuid = UUID.randomUUID(); @@ -69,14 +58,12 @@ public class InventoryHolding extends ItemInventory } @Override - public boolean isItemValidForSlot(int slotIndex, ItemStack itemStack) - { + public boolean isItemValidForSlot(int slotIndex, ItemStack itemStack) { return itemStack.getItem() instanceof ISigil && !(itemStack.getItem() instanceof ItemSigilHolding); } @Override - public int getInventoryStackLimit() - { + 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 index 36e7af47..78c49062 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java @@ -11,16 +11,14 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; -public class ItemInventory implements IInventory -{ +public class ItemInventory implements IInventory { protected int[] syncedSlots = new int[0]; + protected ItemStack masterStack; private NonNullList inventory; private int size; private String name; - protected ItemStack masterStack; - public ItemInventory(ItemStack masterStack, int size, String name) - { + public ItemInventory(ItemStack masterStack, int size, String name) { this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); this.size = size; this.name = name; @@ -30,53 +28,42 @@ public class ItemInventory implements IInventory this.readFromStack(masterStack); } - public void initializeInventory(ItemStack 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) - { + private boolean isSyncedSlot(int slot) { + for (int s : this.syncedSlots) { + if (s == slot) { return true; } } return false; } - public void readFromNBT(NBTTagCompound tagCompound) - { + public void readFromNBT(NBTTagCompound tagCompound) { NBTTagList tags = tagCompound.getTagList(Constants.NBT.ITEMS, 10); inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); - for (int i = 0; i < tags.tagCount(); i++) - { - if (!isSyncedSlot(i)) - { + for (int i = 0; i < tags.tagCount(); i++) { + if (!isSyncedSlot(i)) { NBTTagCompound data = tags.getCompoundTagAt(i); byte j = data.getByte(Constants.NBT.SLOT); - if (j >= 0 && j < inventory.size()) - { + if (j >= 0 && j < inventory.size()) { inventory.set(i, new ItemStack(data)); } } } } - public void writeToNBT(NBTTagCompound tagCompound) - { + public void writeToNBT(NBTTagCompound tagCompound) { NBTTagList tags = new NBTTagList(); - for (int i = 0; i < inventory.size(); i++) - { - if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) - { + for (int i = 0; i < inventory.size(); i++) { + if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) { NBTTagCompound data = new NBTTagCompound(); data.setByte(Constants.NBT.SLOT, (byte) i); inventory.get(i).writeToNBT(data); @@ -87,20 +74,16 @@ public class ItemInventory implements IInventory tagCompound.setTag(Constants.NBT.ITEMS, tags); } - public void readFromStack(ItemStack masterStack) - { - if (masterStack != null) - { + public void readFromStack(ItemStack masterStack) { + if (masterStack != null) { NBTHelper.checkNBT(masterStack); NBTTagCompound tag = masterStack.getTagCompound(); readFromNBT(tag.getCompoundTag(Constants.NBT.ITEM_INVENTORY)); } } - public void writeToStack(ItemStack masterStack) - { - if (masterStack != null) - { + public void writeToStack(ItemStack masterStack) { + if (masterStack != null) { NBTHelper.checkNBT(masterStack); NBTTagCompound tag = masterStack.getTagCompound(); NBTTagCompound invTag = new NBTTagCompound(); @@ -110,27 +93,22 @@ public class ItemInventory implements IInventory } @Override - public int getSizeInventory() - { + public int getSizeInventory() { return size; } @Override - public ItemStack getStackInSlot(int index) - { + public ItemStack getStackInSlot(int index) { return inventory.get(index); } @Override - public ItemStack decrStackSize(int index, int count) - { - if (!inventory.get(index).isEmpty()) - { + 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) - { + if (inventory.get(index).getCount() <= count) { ItemStack itemStack = inventory.get(index); inventory.set(index, ItemStack.EMPTY); markDirty(); @@ -149,10 +127,8 @@ public class ItemInventory implements IInventory } @Override - public ItemStack removeStackFromSlot(int slot) - { - if (!inventory.get(slot).isEmpty()) - { + public ItemStack removeStackFromSlot(int slot) { + if (!inventory.get(slot).isEmpty()) { ItemStack itemStack = inventory.get(slot); setInventorySlotContents(slot, ItemStack.EMPTY); return itemStack; @@ -161,8 +137,7 @@ public class ItemInventory implements IInventory } @Override - public void setInventorySlotContents(int slot, ItemStack stack) - { + public void setInventorySlotContents(int slot, ItemStack stack) { inventory.set(slot, stack); if (stack.getCount() > getInventoryStackLimit()) stack.setCount(getInventoryStackLimit()); @@ -172,82 +147,68 @@ public class ItemInventory implements IInventory } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUsableByPlayer(EntityPlayer player) - { + public boolean isUsableByPlayer(EntityPlayer player) { return true; } @Override - public void openInventory(EntityPlayer player) - { + public void openInventory(EntityPlayer player) { } @Override - public void closeInventory(EntityPlayer player) - { + public void closeInventory(EntityPlayer player) { } @Override - public boolean isItemValidForSlot(int index, ItemStack stack) - { + public boolean isItemValidForSlot(int index, ItemStack stack) { return true; } @Override - public int getField(int id) - { + public int getField(int id) { return 0; } @Override - public void setField(int id, int value) - { + public void setField(int id, int value) { } @Override - public int getFieldCount() - { + public int getFieldCount() { return 0; } @Override - public void clear() - { + public void clear() { this.inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); } @Override - public String getName() - { + public String getName() { return name; } @Override - public boolean hasCustomName() - { + public boolean hasCustomName() { return false; } @Override - public ITextComponent getDisplayName() - { + public ITextComponent getDisplayName() { return new TextComponentString(getName()); } @Override - public void markDirty() - { - if (masterStack != null) - { + public void markDirty() { + if (masterStack != null) { this.writeToStack(masterStack); } } @@ -257,8 +218,7 @@ public class ItemInventory implements IInventory return false; } - public boolean canInventoryBeManipulated() - { + 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 index 7f107ba3..66342e9c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java @@ -1,12 +1,11 @@ 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; -import WayofTime.bloodmagic.routing.IFluidFilter; -public interface IFluidFilterProvider extends IRoutingFilterProvider -{ +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 index 9fc55d4b..2f0cfe61 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java @@ -1,12 +1,11 @@ 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; -import WayofTime.bloodmagic.routing.IItemFilter; -public interface IItemFilterProvider extends IRoutingFilterProvider -{ +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 index 05093ff1..2ae42343 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java @@ -2,11 +2,10 @@ package WayofTime.bloodmagic.item.routing; import net.minecraft.item.ItemStack; -public interface IRoutingFilterProvider -{ +public interface IRoutingFilterProvider { /** * Translates the inputed keyStack into the proper filtered key - * + * * @param filterStack * @param keyStack * @return A new ItemStack which modifies the keyStack diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index ab7347cd..455c44c4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -1,23 +1,5 @@ package WayofTime.bloodmagic.item.routing; -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -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 org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.inventory.ItemInventory; @@ -25,13 +7,26 @@ import WayofTime.bloodmagic.routing.IFluidFilter; import WayofTime.bloodmagic.routing.RoutingFluidFilter; import WayofTime.bloodmagic.util.GhostItemHelper; import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.creativetab.CreativeTabs; +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 org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; -public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, IVariantProvider -{ - public static String[] names = { "exact" }; +import java.util.ArrayList; +import java.util.List; - public ItemFluidRouterFilter() - { +public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, IVariantProvider { + public static String[] names = {"exact"}; + + public ItemFluidRouterFilter() { super(); setUnlocalizedName(BloodMagic.MODID + ".fluidFilter."); @@ -40,15 +35,13 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -58,35 +51,30 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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) - { + public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { IFluidFilter testFilter; - switch (filterStack.getMetadata()) - { - case 0: - testFilter = new RoutingFluidFilter(); - break; + switch (filterStack.getMetadata()) { + case 0: + testFilter = new RoutingFluidFilter(); + break; - default: - testFilter = new RoutingFluidFilter(); + default: + testFilter = new RoutingFluidFilter(); } List filteredList = new ArrayList(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack == null) - { + if (stack == null) { continue; } @@ -100,33 +88,28 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) - { + public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { IFluidFilter testFilter = new RoutingFluidFilter(); - switch (filterStack.getMetadata()) - { - case 0: - testFilter = new RoutingFluidFilter(); - break; + switch (filterStack.getMetadata()) { + case 0: + testFilter = new RoutingFluidFilter(); + break; - default: - testFilter = new RoutingFluidFilter(); + 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++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack == null) - { + if (stack == null) { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) - { + if (ghostStack.isEmpty()) { ghostStack.setCount(Integer.MAX_VALUE); } @@ -138,16 +121,14 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=exact")); return ret; } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) - { + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index 9d7629bf..3cdb1aa0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -29,10 +29,8 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvider -{ - public ItemNodeRouter() - { +public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvider { + public ItemNodeRouter() { setUnlocalizedName(BloodMagic.MODID + ".nodeRouter"); setMaxStackSize(1); setCreativeTab(BloodMagic.TAB_BM); @@ -40,36 +38,30 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; NBTTagCompound tag = stack.getTagCompound(); BlockPos coords = getBlockPos(stack); - if (coords != null && tag != null) - { + if (coords != null && tag != null) { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", coords.getX(), coords.getY(), coords.getZ())); } } @Override - public EnumActionResult onItemUseFirst(EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand) - { + public EnumActionResult onItemUseFirst(EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); - if (world.isRemote) - { + if (world.isRemote) { return EnumActionResult.PASS; } TileEntity tileHit = world.getTileEntity(pos); - if (!(tileHit instanceof IRoutingNode)) - { + if (!(tileHit instanceof IRoutingNode)) { // TODO: Remove contained position? BlockPos containedPos = getBlockPos(stack); - if (!containedPos.equals(BlockPos.ORIGIN)) - { + if (!containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, BlockPos.ORIGIN); player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.remove"), true); return EnumActionResult.FAIL; @@ -78,23 +70,18 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } IRoutingNode node = (IRoutingNode) tileHit; BlockPos containedPos = getBlockPos(stack); - if (containedPos.equals(BlockPos.ORIGIN)) - { + if (containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, pos); player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.set"), true); return EnumActionResult.SUCCESS; - } else - { + } else { TileEntity pastTile = world.getTileEntity(containedPos); - if (pastTile instanceof IRoutingNode) - { + if (pastTile instanceof IRoutingNode) { IRoutingNode pastNode = (IRoutingNode) pastTile; - if (pastNode instanceof IMasterRoutingNode) - { + if (pastNode instanceof IMasterRoutingNode) { IMasterRoutingNode master = (IMasterRoutingNode) pastNode; - if (!node.isMaster(master)) - { + 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); @@ -105,8 +92,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } - } else - { + } else { master.addConnection(pos, containedPos); node.addConnection(containedPos); player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); @@ -114,12 +100,10 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi return EnumActionResult.SUCCESS; } - } else if (node instanceof IMasterRoutingNode) - { + } else if (node instanceof IMasterRoutingNode) { IMasterRoutingNode master = (IMasterRoutingNode) node; - if (!pastNode.isMaster(master)) - { + if (!pastNode.isMaster(master)) { if (pastNode.getMasterPos().equals(BlockPos.ORIGIN)) //TODO: This is where the issue is { pastNode.connectMasterToRemainingNode(world, new LinkedList(), master); @@ -130,24 +114,19 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } - } else - { + } else { master.addConnection(pos, containedPos); pastNode.addConnection(pos); player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } - } else - { + } else { //Both nodes are not master nodes, so normal linking - if (pastNode.getMasterPos().equals(node.getMasterPos())) - { - if (!pastNode.getMasterPos().equals(BlockPos.ORIGIN)) - { + if (pastNode.getMasterPos().equals(node.getMasterPos())) { + if (!pastNode.getMasterPos().equals(BlockPos.ORIGIN)) { TileEntity testTile = world.getTileEntity(pastNode.getMasterPos()); - if (testTile instanceof IMasterRoutingNode) - { + if (testTile instanceof IMasterRoutingNode) { IMasterRoutingNode master = (IMasterRoutingNode) testTile; master.addConnection(pos, containedPos); } @@ -160,8 +139,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } 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) - { + if (tile instanceof IMasterRoutingNode) { IMasterRoutingNode master = (IMasterRoutingNode) tile; master.addConnection(pos, containedPos); master.addNodeToList(pastNode); @@ -175,8 +153,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } 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) - { + if (tile instanceof IMasterRoutingNode) { IMasterRoutingNode master = (IMasterRoutingNode) tile; master.addConnection(pos, containedPos); master.addNodeToList(node); @@ -187,8 +164,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link"), true); this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; - } else - { + } else { this.setBlockPos(stack, BlockPos.ORIGIN); return EnumActionResult.SUCCESS; } @@ -200,21 +176,18 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=normal")); return ret; } - public BlockPos getBlockPos(ItemStack stack) - { + 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) - { + public ItemStack setBlockPos(ItemStack stack, BlockPos pos) { NBTHelper.checkNBT(stack); NBTTagCompound itemTag = stack.getTagCompound(); itemTag.setInteger(Constants.NBT.X_COORD, pos.getX()); diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 4c3c8b6a..76cc2b48 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -1,11 +1,13 @@ package WayofTime.bloodmagic.item.routing; -import java.util.ArrayList; -import java.util.List; - +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 net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -14,28 +16,16 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandler; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.routing.DefaultItemFilter; -import WayofTime.bloodmagic.routing.IItemFilter; -import WayofTime.bloodmagic.routing.IgnoreNBTItemFilter; -import WayofTime.bloodmagic.routing.ModIdItemFilter; -import WayofTime.bloodmagic.routing.OreDictItemFilter; -import WayofTime.bloodmagic.routing.TestItemFilter; -import WayofTime.bloodmagic.util.GhostItemHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; +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 class ItemRouterFilter extends Item implements IItemFilterProvider, IVariantProvider { + public static String[] names = {"exact", "ignoreNBT", "modItems", "oreDict"}; - public ItemRouterFilter() - { + public ItemRouterFilter() { super(); setUnlocalizedName(BloodMagic.MODID + ".itemFilter."); @@ -44,15 +34,13 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -62,44 +50,39 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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) - { + 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; + 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(); + default: + testFilter = new DefaultItemFilter(); } List filteredList = new ArrayList(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack == null) - { + if (stack == null) { continue; } @@ -113,42 +96,37 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) - { + 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; + 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(); + 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++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack == null) - { + if (stack == null) { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) - { + if (ghostStack.isEmpty()) { ghostStack.setCount(Integer.MAX_VALUE); } @@ -160,8 +138,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=exact")); ret.add(new ImmutablePair(1, "type=ignorenbt")); @@ -171,8 +148,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) - { + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index 4b34e4e3..885f02b5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -1,6 +1,9 @@ package WayofTime.bloodmagic.item.sigil; +import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.EntityLivingBase; @@ -15,20 +18,14 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectProvider -{ - public ItemSigilAir() - { +public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectProvider { + public ItemSigilAir() { super("air", 50); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (stack.getItem() instanceof ISigil.Holding) stack = ((Holding) stack.getItem()).getHeldItem(stack, player); @@ -36,14 +33,12 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP return ActionResult.newResult(EnumActionResult.FAIL, stack); boolean unusable = isUnusable(stack); - if (world.isRemote && !unusable) - { + if (world.isRemote && !unusable) { Vec3d vec = player.getLookVec(); double wantedVelocity = 1.7; // TODO - Revisit after potions - if (player.isPotionActive(RegistrarBloodMagic.BOOST)) - { + if (player.isPotionActive(RegistrarBloodMagic.BOOST)) { int amplifier = player.getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); wantedVelocity += (1 + amplifier) * (0.35); } @@ -54,8 +49,7 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP 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 (!world.isRemote) { if (!player.capabilities.isCreativeMode) this.setUnusable(stack, !NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())); @@ -67,15 +61,13 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP } @Override - public boolean applyOnHitEffect(EnumDemonWillType type, ItemStack swordStack, ItemStack providerStack, EntityLivingBase attacker, EntityLivingBase target) - { + public boolean applyOnHitEffect(EnumDemonWillType type, ItemStack swordStack, ItemStack providerStack, EntityLivingBase attacker, EntityLivingBase target) { target.addPotionEffect(new PotionEffect(MobEffects.LEVITATION, 200, 0)); return true; } @Override - public boolean providesEffectForWill(EnumDemonWillType type) - { + 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 index 7726a655..7de088ff 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -1,31 +1,27 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.ItemSigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; 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.tuple.Pair; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -public class ItemSigilBase extends ItemSigil implements IVariantProvider -{ +public class ItemSigilBase extends ItemSigil implements IVariantProvider { protected final String tooltipBase; private final String name; - public ItemSigilBase(String name, int lpUsed) - { + public ItemSigilBase(String name, int lpUsed) { super(lpUsed); setUnlocalizedName(BloodMagic.MODID + ".sigil." + name); @@ -35,15 +31,13 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; } - public ItemSigilBase(String name) - { + public ItemSigilBase(String name) { this(name, 0); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (TextHelper.canTranslate(tooltipBase + "desc")) tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(tooltipBase + "desc")))); @@ -57,8 +51,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(Pair.of(0, "type=normal")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 03e54516..8dc2d99f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -1,7 +1,12 @@ package WayofTime.bloodmagic.item.sigil; +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -11,29 +16,20 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -public class ItemSigilBloodLight extends ItemSigilBase -{ - public ItemSigilBloodLight() - { +public class ItemSigilBloodLight extends ItemSigilBase { + public ItemSigilBloodLight() { super("bloodLight", 10); } @Override - public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) - { + 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, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (stack.getItem() instanceof ISigil.Holding) stack = ((Holding) stack.getItem()).getHeldItem(stack, player); @@ -45,12 +41,10 @@ public class ItemSigilBloodLight extends ItemSigilBase if (getCooldownRemainder(stack) > 0) return super.onItemRightClick(world, player, hand); - if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { BlockPos blockPos = mop.getBlockPos().offset(mop.sideHit); - if (world.isAirBlock(blockPos)) - { + if (world.isAirBlock(blockPos)) { world.setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); if (!world.isRemote) NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()); @@ -58,10 +52,8 @@ public class ItemSigilBloodLight extends ItemSigilBase player.swingArm(hand); return super.onItemRightClick(world, player, hand); } - } else - { - if (!world.isRemote) - { + } else { + if (!world.isRemote) { world.spawnEntity(new EntityBloodLight(world, player)); NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()); } @@ -72,23 +64,19 @@ public class ItemSigilBloodLight extends ItemSigilBase } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return oldStack.getItem() != newStack.getItem(); } - public int getCooldownRemainder(ItemStack stack) - { + public int getCooldownRemainder(ItemStack stack) { return NBTHelper.checkNBT(stack).getTagCompound().getInteger(Constants.NBT.TICKS_REMAINING); } - public void reduceCooldown(ItemStack stack) - { + public void reduceCooldown(ItemStack stack) { NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.TICKS_REMAINING, getCooldownRemainder(stack) - 1); } - public void resetCooldown(ItemStack stack) - { + 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 index eb6c17db..37a6eccb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java @@ -7,16 +7,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -public class ItemSigilBounce extends ItemSigilToggleableBase -{ - public ItemSigilBounce() - { +public class ItemSigilBounce extends ItemSigilToggleableBase { + public ItemSigilBounce() { super("bounce", 100); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java index 2003d907..44753b5b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java @@ -7,16 +7,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -public class ItemSigilClaw extends ItemSigilToggleableBase -{ - public ItemSigilClaw() - { +public class ItemSigilClaw extends ItemSigilToggleableBase { + public ItemSigilClaw() { super("claw", 100); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java index 72c97d11..34e2d061 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java @@ -7,10 +7,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class ItemSigilCompression extends ItemSigilToggleableBase -{ - public ItemSigilCompression() - { +public class ItemSigilCompression extends ItemSigilToggleableBase { + public ItemSigilCompression() { super("compression", 200); } @@ -18,8 +16,7 @@ public class ItemSigilCompression extends ItemSigilToggleableBase // TODO for now, there is a semi-working system in place @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (true) return; // TODO - Rewrite compression system @@ -28,8 +25,7 @@ public class ItemSigilCompression extends ItemSigilToggleableBase ItemStack compressedStack = CompressionRegistry.compressInventory(player.inventory.mainInventory.toArray(new ItemStack[player.inventory.mainInventory.size()]), world); - if (compressedStack != null) - { + if (compressedStack != null) { EntityItem entityItem = new EntityItem(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 index 31e610ae..bc77fa24 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -1,9 +1,14 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.api.altar.IBloodAltar; +import WayofTime.bloodmagic.api.iface.IAltarReader; import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.tile.TileIncenseAltar; +import WayofTime.bloodmagic.tile.TileInversionPillar; +import WayofTime.bloodmagic.util.ChatUtil; +import WayofTime.bloodmagic.util.helper.NumeralHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -14,25 +19,17 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.iface.IAltarReader; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.tile.TileIncenseAltar; -import WayofTime.bloodmagic.tile.TileInversionPillar; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.helper.NumeralHelper; -public class ItemSigilDivination extends ItemSigilBase implements IAltarReader -{ - public ItemSigilDivination() - { +import java.util.ArrayList; +import java.util.List; + +public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { + public ItemSigilDivination() { super("divination"); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { // if (world instanceof WorldServer) // { // System.out.println("Testing..."); @@ -54,42 +51,35 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); - if (!world.isRemote) - { + if (!world.isRemote) { super.onItemRightClick(world, player, hand); RayTraceResult position = rayTrace(world, player, false); - if (position == null) - { + if (position == null) { int currentEssence = NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).getCurrentEssence(); List toSend = new ArrayList(); if (!getOwnerName(stack).equals(PlayerHelper.getUsernameFromPlayer(player))) toSend.add(new TextComponentTranslation(tooltipBase + "otherNetwork", getOwnerName(stack))); toSend.add(new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); - } else - { - if (position.typeOfHit == RayTraceResult.Type.BLOCK) - { + } else { + if (position.typeOfHit == RayTraceResult.Type.BLOCK) { TileEntity tile = world.getTileEntity(position.getBlockPos()); - if (tile != null && tile instanceof IBloodAltar) - { + 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 TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity)); - } else if (tile != null && tile instanceof TileIncenseAltar) - { + } 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) - { + } 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)); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java index 45d0f5bf..8a08ec4f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java @@ -7,16 +7,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -public class ItemSigilElementalAffinity extends ItemSigilToggleableBase -{ - public ItemSigilElementalAffinity() - { +public class ItemSigilElementalAffinity extends ItemSigilToggleableBase { + public ItemSigilElementalAffinity() { super("elementalAffinity", 200); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java index 99c82aa4..7a7def1a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.List; - import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.Entity; @@ -11,22 +9,20 @@ import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -public class ItemSigilEnderSeverance extends ItemSigilToggleableBase -{ - public ItemSigilEnderSeverance() - { +import java.util.List; + +public class ItemSigilEnderSeverance extends ItemSigilToggleableBase { + public ItemSigilEnderSeverance() { super("enderSeverance", 200); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer 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) - { + for (Entity entity : entityList) { if (entity instanceof EntityEnderman) ((EntityEnderman) entity).addPotionEffect(new PotionEffect(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 index a9add918..ad8be9f3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.List; - import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; @@ -12,37 +10,32 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class ItemSigilFastMiner extends ItemSigilToggleableBase -{ - public ItemSigilFastMiner() - { +import java.util.List; + +public class ItemSigilFastMiner extends ItemSigilToggleableBase { + public ItemSigilFastMiner() { super("fastMiner", 100); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; player.addPotionEffect(new PotionEffect(MobEffects.HASTE, 2, 0, true, false)); } @Override - public boolean performArrayEffect(World world, BlockPos pos) - { + 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(EntityPlayer.class, bb); - for (EntityPlayer player : playerList) - { - if (!player.isPotionActive(MobEffects.HASTE) || (player.isPotionActive(MobEffects.HASTE) && player.getActivePotionEffect(MobEffects.HASTE).getAmplifier() < potionPotency)) - { + for (EntityPlayer player : playerList) { + if (!player.isPotionActive(MobEffects.HASTE) || (player.isPotionActive(MobEffects.HASTE) && player.getActivePotionEffect(MobEffects.HASTE).getAmplifier() < potionPotency)) { player.addPotionEffect(new PotionEffect(MobEffects.HASTE, ticks, potionPotency)); - if (!player.capabilities.isCreativeMode) - { + if (!player.capabilities.isCreativeMode) { player.hurtResistantTime = 0; player.attackEntityFrom(BloodMagicAPI.damageSource, 1.0F); } @@ -53,8 +46,7 @@ public class ItemSigilFastMiner extends ItemSigilToggleableBase } @Override - public boolean hasArrayEffect() - { + 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 index 3f99aa2c..9ef7189e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java @@ -1,21 +1,18 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.handler.event.GenericHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -import WayofTime.bloodmagic.util.handler.event.GenericHandler; -public class ItemSigilFilledHand extends ItemSigilToggleableBase -{ - public ItemSigilFilledHand() - { +public class ItemSigilFilledHand extends ItemSigilToggleableBase { + public ItemSigilFilledHand() { super("hand", 100); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; GenericHandler.filledHandMap.put(player, 4); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java index 990b0040..dfaab6cd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java @@ -6,16 +6,13 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class ItemSigilFrost extends ItemSigilToggleableBase -{ - public ItemSigilFrost() - { +public class ItemSigilFrost extends ItemSigilToggleableBase { + public ItemSigilFrost() { super("frost", 100); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java index 279460ca..e5d05dcc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java @@ -14,23 +14,18 @@ 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() - { +public class ItemSigilGreenGrove extends ItemSigilToggleableBase { + public ItemSigilGreenGrove() { super("greenGrove", 150); } @Override - public boolean onSigilUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) - { + public boolean onSigilUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) { if (PlayerHelper.isFakePlayer(player)) return false; - if (applyBonemeal(world, blockPos, player, stack)) - { - if (!world.isRemote) - { + if (applyBonemeal(world, blockPos, player, stack)) { + if (!world.isRemote) { world.playEvent(2005, blockPos, 0); } return true; @@ -40,8 +35,7 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase } @Override - public void onSigilUpdate(ItemStack stack, World worldIn, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World worldIn, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; @@ -51,21 +45,15 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase 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++) - { + 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); IBlockState state = worldIn.getBlockState(blockPos); - if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) - { - if (state.getBlock() instanceof IGrowable) - { - if (worldIn.rand.nextInt(50) == 0) - { + if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { + if (state.getBlock() instanceof IGrowable) { + if (worldIn.rand.nextInt(50) == 0) { IBlockState preBlockState = worldIn.getBlockState(blockPos); state.getBlock().updateTick(worldIn, blockPos, state, worldIn.rand); @@ -80,8 +68,7 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase } } - private boolean applyBonemeal(World worldIn, BlockPos target, EntityPlayer player, ItemStack sigilStack) - { + private boolean applyBonemeal(World worldIn, BlockPos target, EntityPlayer player, ItemStack sigilStack) { IBlockState iblockstate = worldIn.getBlockState(target); BonemealEvent event = new BonemealEvent(player, worldIn, target, iblockstate, EnumHand.MAIN_HAND, sigilStack); @@ -90,14 +77,11 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase else if (event.getResult() == Result.ALLOW) return true; - if (iblockstate.getBlock() instanceof IGrowable) - { + if (iblockstate.getBlock() instanceof IGrowable) { IGrowable igrowable = (IGrowable) iblockstate.getBlock(); - if (igrowable.canGrow(worldIn, target, iblockstate, worldIn.isRemote)) - { - if (!worldIn.isRemote) - { + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java index b14742cd..02559204 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java @@ -7,16 +7,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -public class ItemSigilHaste extends ItemSigilToggleableBase -{ - public ItemSigilHaste() - { +public class ItemSigilHaste extends ItemSigilToggleableBase { + public ItemSigilHaste() { super("haste", 250); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index 63fdd009..da59eee5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -1,11 +1,17 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.Collections; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IAltarReader; +import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.client.key.IKeybindable; import WayofTime.bloodmagic.client.key.KeyBindings; +import WayofTime.bloodmagic.util.Utils; +import WayofTime.bloodmagic.util.helper.TextHelper; +import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -18,44 +24,29 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IAltarReader; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.client.key.IKeybindable; -import WayofTime.bloodmagic.util.helper.TextHelper; - -import com.google.common.base.Strings; - import javax.annotation.Nonnull; +import java.util.Collections; +import java.util.List; -public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAltarReader, ISigil.Holding -{ +public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAltarReader, ISigil.Holding { public static final int inventorySize = 5; - public ItemSigilHolding() - { + public ItemSigilHolding() { super("holding"); } @Override - public void onKeyPressed(ItemStack stack, EntityPlayer player, KeyBindings key, boolean showInChat) - { - if (stack == player.getHeldItemMainhand() && stack.getItem() instanceof ItemSigilHolding && key.equals(KeyBindings.OPEN_HOLDING)) - { + public void onKeyPressed(ItemStack stack, EntityPlayer 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) - { + public String getHighlightTip(ItemStack stack, String displayName) { List inv = getInternalInventory(stack); int currentSlot = getCurrentItemOrdinal(stack); ItemStack item = inv.get(currentSlot); @@ -68,8 +59,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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())); @@ -80,8 +70,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl int currentSlot = getCurrentItemOrdinal(stack); ItemStack item = inv.get(currentSlot); - for (int i = 0; i < inventorySize; i++) - { + for (int i = 0; i < inventorySize; i++) { ItemStack invStack = inv.get(i); if (!invStack.isEmpty()) if (!item.isEmpty() && invStack == item) @@ -92,8 +81,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return EnumActionResult.FAIL; @@ -112,8 +100,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); @@ -134,26 +121,21 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl @Nonnull @Override - public ItemStack getHeldItem(ItemStack holdingStack, EntityPlayer player) - { + public ItemStack getHeldItem(ItemStack holdingStack, EntityPlayer player) { return getInternalInventory(holdingStack).get(getCurrentItemOrdinal(holdingStack)); } - public void saveInventory(ItemStack itemStack, List inventory) - { + public void saveInventory(ItemStack itemStack, List inventory) { NBTTagCompound itemTag = itemStack.getTagCompound(); - if (itemTag == null) - { + if (itemTag == null) { itemStack.setTagCompound(new NBTTagCompound()); } NBTTagList itemList = new NBTTagList(); - for (int i = 0; i < inventorySize; i++) - { - if (!inventory.get(i).isEmpty()) - { + for (int i = 0; i < inventorySize; i++) { + if (!inventory.get(i).isEmpty()) { NBTTagCompound tag = new NBTTagCompound(); tag.setByte(Constants.NBT.SLOT, (byte) i); inventory.get(i).writeToNBT(tag); @@ -165,23 +147,18 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } @Override - public void onUpdate(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected) - { - if (itemStack.getTagCompound() != null) - { + public void onUpdate(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected) { + if (itemStack.getTagCompound() != null) { this.tickInternalInventory(itemStack, world, entity, itemSlot, isSelected); } } - public void tickInternalInventory(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected) - { + public void tickInternalInventory(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected) { List inv = getInternalInventory(itemStack); - for (int i = 0; i < inventorySize; i++) - { + for (int i = 0; i < inventorySize; i++) { ItemStack stack = inv.get(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } @@ -189,43 +166,40 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } } - public static int next(int mode) - { + @Override + public List> getVariants() { + return Collections.emptyList(); + } + + public static int next(int mode) { int index = mode + 1; - if (index >= inventorySize) - { + if (index >= inventorySize) { index = 0; } return index; } - public static int prev(int mode) - { + public static int prev(int mode) { int index = mode - 1; - if (index < 0) - { + if (index < 0) { index = inventorySize; } return index; } - private static void initModeTag(ItemStack stack) - { - if (!stack.hasTagCompound()) - { + 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) - { + 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); @@ -236,10 +210,8 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return ItemStack.EMPTY; } - public static int getCurrentItemOrdinal(ItemStack stack) - { - if (stack.getItem() instanceof ItemSigilHolding) - { + 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); @@ -249,32 +221,27 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return 0; } - public static List getInternalInventory(ItemStack stack) - { + public static List getInternalInventory(ItemStack stack) { initModeTag(stack); NBTTagCompound tagCompound = stack.getTagCompound(); - if (tagCompound == null) - { + if (tagCompound == null) { return NonNullList.withSize(inventorySize, ItemStack.EMPTY); } NBTTagList tagList = tagCompound.getTagList(Constants.NBT.ITEMS, 10); - if (tagList.hasNoTags()) - { + if (tagList.hasNoTags()) { return NonNullList.withSize(inventorySize, ItemStack.EMPTY); } List inv = NonNullList.withSize(inventorySize, ItemStack.EMPTY); - for (int i = 0; i < tagList.tagCount(); i++) - { + for (int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound data = tagList.getCompoundTagAt(i); byte j = data.getByte(Constants.NBT.SLOT); - if (j >= 0 && j < inv.size()) - { + if (j >= 0 && j < inv.size()) { inv.set(j, new ItemStack(data)); } } @@ -282,36 +249,29 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return inv; } - public static void cycleToNextSigil(ItemStack itemStack, int mode) - { - if (itemStack.getItem() instanceof ItemSigilHolding) - { + public static void cycleToNextSigil(ItemStack itemStack, int mode) { + if (itemStack.getItem() instanceof ItemSigilHolding) { initModeTag(itemStack); int index = mode; - if (mode == 120 || mode == -120) - { + if (mode == 120 || mode == -120) { int currentIndex = getCurrentItemOrdinal(itemStack); ItemStack currentItemStack = getItemStackInSlot(itemStack, currentIndex); if (currentItemStack.isEmpty()) return; - if (mode < 0) - { + if (mode < 0) { index = next(currentIndex); currentItemStack = getItemStackInSlot(itemStack, index); - while (currentItemStack.isEmpty()) - { + while (currentItemStack.isEmpty()) { index = next(index); currentItemStack = getItemStackInSlot(itemStack, index); } - } else - { + } else { index = prev(currentIndex); currentItemStack = getItemStackInSlot(itemStack, index); - while (currentItemStack.isEmpty()) - { + while (currentItemStack.isEmpty()) { index = prev(index); currentItemStack = getItemStackInSlot(itemStack, index); } @@ -321,10 +281,4 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl itemStack.getTagCompound().setInteger(Constants.NBT.CURRENT_SIGIL, index); } } - - @Override - public List> getVariants() - { - return Collections.emptyList(); - } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index 387928f6..919b2dab 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -21,55 +21,45 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -public class ItemSigilLava extends ItemSigilBase -{ - public ItemSigilLava() - { +public class ItemSigilLava extends ItemSigilBase { + public ItemSigilLava() { super("lava", 1000); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); - if (!world.isRemote && !isUnusable(stack)) - { + if (!world.isRemote && !isUnusable(stack)) { RayTraceResult rayTrace = this.rayTrace(world, player, false); - if (rayTrace != null) - { + if (rayTrace != null) { ActionResult ret = ForgeEventFactory.onBucketUse(player, world, stack, rayTrace); if (ret != null) return ret; - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { BlockPos blockpos = rayTrace.getBlockPos(); - if (!world.isBlockModifiable(player, blockpos)) - { + if (!world.isBlockModifiable(player, blockpos)) { return super.onItemRightClick(world, player, hand); } - if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) - { + if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) { return super.onItemRightClick(world, player, hand); } BlockPos blockpos1 = blockpos.offset(rayTrace.sideHit); - if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) - { + if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) { return super.onItemRightClick(world, player, hand); } - if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) - { + if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) { return super.onItemRightClick(world, player, hand); } } @@ -80,27 +70,22 @@ public class ItemSigilLava extends ItemSigilBase } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); - if (world.isRemote || player.isSneaking() || isUnusable(stack)) - { + if (world.isRemote || player.isSneaking() || isUnusable(stack)) { return EnumActionResult.FAIL; } - if (!world.canMineBlockBody(player, blockPos)) - { + if (!world.canMineBlockBody(player, blockPos)) { return EnumActionResult.FAIL; } TileEntity tile = world.getTileEntity(blockPos); - if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) - { + if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000); int amount = handler.fill(fluid, false); - if (amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) - { + if (amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { handler.fill(fluid, true); return EnumActionResult.SUCCESS; } @@ -111,23 +96,18 @@ public class ItemSigilLava extends ItemSigilBase return EnumActionResult.FAIL; } - public boolean canPlaceLava(World world, BlockPos blockPos) - { - if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isSolid()) - { + public boolean canPlaceLava(World world, BlockPos blockPos) { + if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isSolid()) { return false; - } else if ((world.getBlockState(blockPos).getBlock() == Blocks.LAVA || world.getBlockState(blockPos).getBlock() == Blocks.FLOWING_LAVA) && world.getBlockState(blockPos).getBlock().getMetaFromState(world.getBlockState(blockPos)) == 0) - { + } else if ((world.getBlockState(blockPos).getBlock() == Blocks.LAVA || world.getBlockState(blockPos).getBlock() == Blocks.FLOWING_LAVA) && world.getBlockState(blockPos).getBlock().getMetaFromState(world.getBlockState(blockPos)) == 0) { return false; - } else - { + } else { world.setBlockState(blockPos, Blocks.FLOWING_LAVA.getBlockState().getBaseState(), 3); return true; } } - public boolean tryPlaceLava(World world, BlockPos pos) - { + public boolean tryPlaceLava(World world, BlockPos pos) { Material material = world.getBlockState(pos).getBlock().getMaterial(world.getBlockState(pos)); return world.isAirBlock(pos) && !material.isSolid(); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java index 3c5aec7a..f4b7e412 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.List; - import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityXPOrb; @@ -10,16 +8,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.World; -public class ItemSigilMagnetism extends ItemSigilToggleableBase -{ - public ItemSigilMagnetism() - { +import java.util.List; + +public class ItemSigilMagnetism extends ItemSigilToggleableBase { + public ItemSigilMagnetism() { super("magnetism", 50); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; @@ -31,18 +28,14 @@ public class ItemSigilMagnetism extends ItemSigilToggleableBase List entities = player.getEntityWorld().getEntitiesWithinAABB(EntityItem.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(EntityXPOrb.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 (EntityItem entity : entities) - { - if (entity != null && !world.isRemote && !entity.isDead) - { + for (EntityItem entity : entities) { + if (entity != null && !world.isRemote && !entity.isDead) { entity.onCollideWithPlayer(player); } } - for (EntityXPOrb xpOrb : xpOrbs) - { - if (xpOrb != null && !world.isRemote) - { + for (EntityXPOrb 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 index e391c276..53a6cedd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java @@ -1,42 +1,35 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.HashMap; -import java.util.Map; - import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import java.util.HashMap; +import java.util.Map; -public class ItemSigilPhantomBridge extends ItemSigilToggleableBase -{ +public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { private Map> prevPositionMap = new HashMap>(); private double expansionFactor = 2; private int range = 3; - public ItemSigilPhantomBridge() - { + public ItemSigilPhantomBridge() { super("phantomBridge", 100); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - if (!prevPositionMap.containsKey(player)) - { + if (!prevPositionMap.containsKey(player)) { prevPositionMap.put(player, Pair.of(player.posX, player.posZ)); } - if ((!player.onGround && !player.isRiding()) && !player.isSneaking()) - { + if ((!player.onGround && !player.isRiding()) && !player.isSneaking()) { prevPositionMap.put(player, Pair.of(player.posX, player.posZ)); return; } @@ -52,8 +45,7 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase double playerVelZ = player.posZ - prevPosition.getRight(); double totalVel = Math.sqrt(playerVelX * playerVelX + playerVelZ * playerVelZ); - if (totalVel > 2) - { + if (totalVel > 2) { //I am SURE you are teleporting! playerVelX = 0; playerVelZ = 0; @@ -74,12 +66,9 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase int truncC = (int) C; //TODO: Make this for-loop better. - for (int ix = -truncC; ix <= truncC; ix++) - { - for (int iz = -truncC; iz <= truncC; iz++) - { - if (computeEllipse(ix + avgX, iz + avgZ, posX, posZ, offsetPosX, offsetPosZ) > C) - { + for (int ix = -truncC; ix <= truncC; ix++) { + for (int iz = -truncC; iz <= truncC; iz++) { + if (computeEllipse(ix + avgX, iz + avgZ, posX, posZ, offsetPosX, offsetPosZ) > C) { continue; } @@ -93,8 +82,7 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase prevPositionMap.put(player, Pair.of(player.posX, player.posZ)); } - public static double computeEllipse(double x, double z, double focusX1, double focusZ1, double focusX2, double focusZ2) - { + public static double computeEllipse(double x, double z, double focusX1, double focusZ1, double focusX2, double focusZ2) { return Math.sqrt((x - focusX1) * (x - focusX1) + (z - focusZ1) * (z - focusZ1)) + Math.sqrt((x - focusX2) * (x - focusX2) + (z - focusZ2) * (z - focusZ2)); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java index 11025a9a..d05a105b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java @@ -1,9 +1,12 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.api.altar.IBloodAltar; +import WayofTime.bloodmagic.api.iface.IAltarReader; import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.tile.TileIncenseAltar; +import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.NumeralHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -16,36 +19,28 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.iface.IAltarReader; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.tile.TileIncenseAltar; -import WayofTime.bloodmagic.util.ChatUtil; -public class ItemSigilSeer extends ItemSigilBase implements IAltarReader -{ - public ItemSigilSeer() - { +import java.util.ArrayList; +import java.util.List; + +public class ItemSigilSeer extends ItemSigilBase implements IAltarReader { + public ItemSigilSeer() { super("seer"); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); - if (!world.isRemote) - { + if (!world.isRemote) { super.onItemRightClick(world, player, hand); RayTraceResult rayTrace = rayTrace(world, player, false); - if (rayTrace == null) - { + if (rayTrace == null) { int currentEssence = NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).getCurrentEssence(); List toSend = new ArrayList(); @@ -53,42 +48,34 @@ public class ItemSigilSeer extends ItemSigilBase implements IAltarReader toSend.add(new TextComponentTranslation(tooltipBase + "otherNetwork", getOwnerName(stack))); toSend.add(new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); - } else - { - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) - { + } else { + if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { TileEntity tile = world.getTileEntity(rayTrace.getBlockPos()); - if (tile != null && tile instanceof IBloodAltar) - { + if (tile != null && tile instanceof IBloodAltar) { IBloodAltar altar = (IBloodAltar) tile; int tier = altar.getTier().ordinal() + 1; int currentEssence = altar.getCurrentBlood(); int capacity = altar.getCapacity(); int charge = altar.getTotalCharge(); altar.checkTier(); - if (tile instanceof IInventory) - { - if (!((IInventory) tile).getStackInSlot(0).isEmpty()) - { + if (tile instanceof IInventory) { + if (!((IInventory) tile).getStackInSlot(0).isEmpty()) { int progress = altar.getProgress(); int totalLiquidRequired = altar.getLiquidRequired() * ((IInventory) tile).getStackInSlot(0).getCount(); int consumptionRate = (int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1)); ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarProgress", progress, totalLiquidRequired), new TextComponentTranslation(tooltipBase + "currentAltarConsumptionRate", consumptionRate), new TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity), new TextComponentTranslation(tooltipBase + "currentCharge", charge)); - } else - { + } else { ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity), new TextComponentTranslation(tooltipBase + "currentCharge", charge)); } } - } else if (tile != null && tile instanceof TileIncenseAltar) - { + } 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 - { + } else { int currentEssence = NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).getCurrentEssence(); ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java index 237d0cb9..57064bf5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java @@ -1,30 +1,22 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.TileSpectralBlock; import WayofTime.bloodmagic.util.Utils; -import net.minecraftforge.fluids.BlockFluidBase; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +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() - { +public class ItemSigilSuppression extends ItemSigilToggleableBase { + public ItemSigilSuppression() { super("suppression", 400); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; @@ -34,14 +26,10 @@ public class ItemSigilSuppression extends ItemSigilToggleableBase 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)) - { + 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; } @@ -49,9 +37,8 @@ public class ItemSigilSuppression extends ItemSigilToggleableBase IBlockState state = world.getBlockState(blockPos); if (Utils.isBlockLiquid(state) && world.getTileEntity(blockPos) == null) - TileSpectralBlock.createSpectralBlock(world, blockPos, refresh); - else - { + 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 index 8230fd19..e4fd869f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -1,9 +1,13 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.List; - +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.api.teleport.TeleportQueue; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.ritual.portal.Teleports; +import WayofTime.bloodmagic.tile.TileTeleposer; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -16,32 +20,24 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.teleport.TeleportQueue; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.ritual.portal.Teleports; -import WayofTime.bloodmagic.tile.TileTeleposer; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class ItemSigilTeleposition extends ItemSigilBase -{ - public ItemSigilTeleposition() - { +import java.util.List; + +public class ItemSigilTeleposition extends ItemSigilBase { + public ItemSigilTeleposition() { super("teleposition"); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { super.addInformation(stack, world, tooltip, flag); if (!stack.hasTagCompound()) return; NBTTagCompound tag = stack.getTagCompound(); - if (tag != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) - { + if (tag != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) { tooltip.add(" "); tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", getValue(tag, Constants.NBT.X_COORD), getValue(tag, Constants.NBT.Y_COORD), getValue(tag, Constants.NBT.Z_COORD))); tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", getValue(tag, Constants.NBT.DIMENSION_ID))); @@ -49,22 +45,18 @@ public class ItemSigilTeleposition extends ItemSigilBase } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); - if (!world.isRemote && NBTHelper.checkNBT(stack) != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) - { + if (!world.isRemote && NBTHelper.checkNBT(stack) != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) { BlockPos blockPos = new BlockPos(getValue(stack.getTagCompound(), Constants.NBT.X_COORD), getValue(stack.getTagCompound(), Constants.NBT.Y_COORD), getValue(stack.getTagCompound(), Constants.NBT.Z_COORD)).up(); - if (world.provider.getDimension() == getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID)) - { + if (world.provider.getDimension() == getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID)) { TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(blockPos, player, getOwnerUUID(stack), true)); - } else - { + } else { TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, getOwnerUUID(stack), world, getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID), true)); } } @@ -72,18 +64,15 @@ public class ItemSigilTeleposition extends ItemSigilBase } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing 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 EnumActionResult.FAIL; - if (!world.isRemote && player.isSneaking() && NBTHelper.checkNBT(stack) != null) - { - if (world.getTileEntity(pos) != null && world.getTileEntity(pos) instanceof TileTeleposer) - { + if (!world.isRemote && player.isSneaking() && NBTHelper.checkNBT(stack) != null) { + if (world.getTileEntity(pos) != null && world.getTileEntity(pos) instanceof TileTeleposer) { stack.getTagCompound().setInteger(Constants.NBT.DIMENSION_ID, world.provider.getDimension()); stack.getTagCompound().setInteger(Constants.NBT.X_COORD, pos.getX()); stack.getTagCompound().setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -95,8 +84,7 @@ public class ItemSigilTeleposition extends ItemSigilBase return EnumActionResult.FAIL; } - public int getValue(NBTTagCompound tag, String key) - { + public int getValue(NBTTagCompound tag, String key) { return tag.getInteger(key); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 859af83f..d151c19c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -1,35 +1,30 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.ItemSigilToggleable; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; +import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; 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.Nullable; -import WayofTime.bloodmagic.util.helper.TextHelper; +import java.util.ArrayList; +import java.util.List; -public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMeshProvider -{ +public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMeshProvider { protected final String tooltipBase; private final String name; - public ItemSigilToggleableBase(String name, int lpUsed) - { + public ItemSigilToggleableBase(String name, int lpUsed) { super(lpUsed); setUnlocalizedName(BloodMagic.MODID + ".sigil." + name); @@ -41,8 +36,7 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { super.addInformation(stack, world, tooltip, flag); if (!stack.hasTagCompound()) return; @@ -54,21 +48,18 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionActivatable("ItemSigil" + WordUtils.capitalize(name)); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); ret.add("active=false"); ret.add("active=true"); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index f60574b5..ac8429f4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -1,8 +1,10 @@ package WayofTime.bloodmagic.item.sigil; -import java.util.List; - +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import net.minecraft.block.Block; @@ -12,36 +14,33 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntityMobSpawner; -import net.minecraft.util.*; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -public class ItemSigilTransposition extends ItemSigilBase -{ - public ItemSigilTransposition() - { +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) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { super.addInformation(stack, world, tooltip, flag); if (!stack.hasTagCompound()) return; NBTTagCompound tag = stack.getTagCompound(); - if (tag.hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && tag.hasKey(Constants.NBT.CONTAINED_BLOCK_META)) - { + if (tag.hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && tag.hasKey(Constants.NBT.CONTAINED_BLOCK_META)) { tooltip.add(" "); BlockStack blockStack = new BlockStack(Block.getBlockFromName(tag.getString(Constants.NBT.CONTAINED_BLOCK_NAME)), tag.getByte(Constants.NBT.CONTAINED_BLOCK_META)); tooltip.add(blockStack.getItemStack().getDisplayName()); @@ -49,13 +48,11 @@ public class ItemSigilTransposition extends ItemSigilBase } @Override - public String getItemStackDisplayName(ItemStack stack) - { + public String getItemStackDisplayName(ItemStack stack) { stack = NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (tag.hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && tag.hasKey(Constants.NBT.CONTAINED_BLOCK_META)) - { + if (tag.hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && tag.hasKey(Constants.NBT.CONTAINED_BLOCK_META)) { BlockStack blockStack = new BlockStack(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(tag.getString(Constants.NBT.CONTAINED_BLOCK_NAME))), tag.getByte(Constants.NBT.CONTAINED_BLOCK_META)); if (blockStack.getItemStack() != null && blockStack.getItemStack().getItem() != null) //TODO: Figure out why it's a null item. This is a patchwork solution. { @@ -67,8 +64,7 @@ public class ItemSigilTransposition extends ItemSigilBase } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing 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); @@ -78,28 +74,23 @@ public class ItemSigilTransposition extends ItemSigilBase stack = NBTHelper.checkNBT(stack); IBlockState state = world.getBlockState(blockPos); - if (!world.isRemote) - { + if (!world.isRemote) { if (BloodMagicAPI.INSTANCE.getBlacklist().getTransposition().contains(state)) return EnumActionResult.FAIL; - if (player.isSneaking() && (!stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) || !stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META))) - { - if (state.getPlayerRelativeBlockHardness(player, world, blockPos) >= 0 && state.getBlockHardness(world, blockPos) >= 0) - { + if (player.isSneaking() && (!stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) || !stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META))) { + if (state.getPlayerRelativeBlockHardness(player, world, blockPos) >= 0 && state.getBlockHardness(world, blockPos) >= 0) { int cost = getLpUsed(); NBTTagCompound tileNBTTag = new NBTTagCompound(); String blockName = state.getBlock().getRegistryName().toString(); byte metadata = (byte) state.getBlock().getMetaFromState(state); - if (world.getTileEntity(blockPos) != null) - { + if (world.getTileEntity(blockPos) != null) { cost *= 5; world.getTileEntity(blockPos).writeToNBT(tileNBTTag); - if (world.getTileEntity(blockPos) instanceof TileEntityMobSpawner) - { + if (world.getTileEntity(blockPos) instanceof TileEntityMobSpawner) { cost *= 6; } } @@ -115,26 +106,21 @@ public class ItemSigilTransposition extends ItemSigilBase return EnumActionResult.SUCCESS; } - } else if (stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META)) - { + } else if (stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META)) { IBlockState iblockstate = world.getBlockState(blockPos); Block block = iblockstate.getBlock(); BlockStack blockToPlace = new BlockStack(Block.getBlockFromName(stack.getTagCompound().getString(Constants.NBT.CONTAINED_BLOCK_NAME)), stack.getTagCompound().getByte(Constants.NBT.CONTAINED_BLOCK_META)); - if (!block.isReplaceable(world, blockPos)) - { + if (!block.isReplaceable(world, blockPos)) { blockPos = blockPos.offset(side); } - if (!stack.isEmpty() && player.canPlayerEdit(blockPos, side, stack) && world.mayPlace(blockToPlace.getBlock(), blockPos, false, side, player)) - { - if (world.setBlockState(blockPos, blockToPlace.getState(), 3)) - { + if (!stack.isEmpty() && player.canPlayerEdit(blockPos, side, stack) && world.mayPlace(blockToPlace.getBlock(), blockPos, false, side, player)) { + if (world.setBlockState(blockPos, blockToPlace.getState(), 3)) { blockToPlace.getBlock().onBlockPlacedBy(world, blockPos, blockToPlace.getState(), player, blockToPlace.getItemStack()); // world.playSound((double) ((float) blockPos.getX() + 0.5F), (double) ((float) blockPos.getY() + 0.5F), (double) ((float) blockPos.getZ() + 0.5F), blockToPlace.getBlock().getStepSound().getPlaceSound(), (blockToPlace.getBlock().getStepSound().getVolume() + 1.0F) / 2.0F, blockToPlace.getBlock().getStepSound().getPitch() * 0.8F); - if (stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_TILE_ENTITY) && blockToPlace.getBlock().hasTileEntity(blockToPlace.getState())) - { + if (stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_TILE_ENTITY) && blockToPlace.getBlock().hasTileEntity(blockToPlace.getState())) { NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.CONTAINED_TILE_ENTITY); tag.setInteger("x", blockPos.getX()); tag.setInteger("y", blockPos.getY()); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 0e27f2be..1dca46ef 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -19,59 +19,48 @@ import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -public class ItemSigilVoid extends ItemSigilBase -{ - public ItemSigilVoid() - { +public class ItemSigilVoid extends ItemSigilBase { + public ItemSigilVoid() { super("void", 50); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); - if (!world.isRemote && !isUnusable(stack)) - { + if (!world.isRemote && !isUnusable(stack)) { RayTraceResult rayTrace = this.rayTrace(world, player, true); - if (rayTrace != null) - { + if (rayTrace != null) { ActionResult ret = ForgeEventFactory.onBucketUse(player, world, stack, rayTrace); if (ret != null) return ret; - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { BlockPos blockpos = rayTrace.getBlockPos(); - if (!world.isBlockModifiable(player, blockpos)) - { + if (!world.isBlockModifiable(player, blockpos)) { return super.onItemRightClick(world, player, hand); } - if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) - { + if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) { return super.onItemRightClick(world, player, hand); } - if (!player.canPlayerEdit(blockpos, rayTrace.sideHit, stack)) - { + if (!player.canPlayerEdit(blockpos, rayTrace.sideHit, stack)) { return super.onItemRightClick(world, player, hand); } - if (world.getBlockState(blockpos).getBlock().getMaterial(world.getBlockState(blockpos)).isLiquid() && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) - { + if (world.getBlockState(blockpos).getBlock().getMaterial(world.getBlockState(blockpos)).isLiquid() && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { world.setBlockToAir(blockpos); return super.onItemRightClick(world, player, hand); } } - } else - { + } else { return super.onItemRightClick(world, player, hand); } @@ -83,30 +72,25 @@ public class ItemSigilVoid extends ItemSigilBase } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) return EnumActionResult.FAIL; - if (world.isRemote || player.isSneaking() || isUnusable(stack)) - { + if (world.isRemote || player.isSneaking() || isUnusable(stack)) { return EnumActionResult.FAIL; } - if (!world.canMineBlockBody(player, blockPos)) - { + if (!world.canMineBlockBody(player, blockPos)) { return EnumActionResult.FAIL; } TileEntity tile = world.getTileEntity(blockPos); - if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) - { + if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack amount = handler.drain(1000, false); - if (amount != null && amount.amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) - { + if (amount != null && amount.amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { handler.drain(1000, true); return EnumActionResult.SUCCESS; } @@ -116,13 +100,11 @@ public class ItemSigilVoid extends ItemSigilBase BlockPos newPos = blockPos.offset(side); - if (!player.canPlayerEdit(newPos, side, stack)) - { + if (!player.canPlayerEdit(newPos, side, stack)) { return EnumActionResult.FAIL; } - if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) - { + if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { world.setBlockToAir(newPos); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index 2de40557..8fa03754 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -10,12 +10,7 @@ import net.minecraft.init.Blocks; import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.SoundCategory; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -24,34 +19,28 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -public class ItemSigilWater extends ItemSigilBase -{ - public ItemSigilWater() - { +public class ItemSigilWater extends ItemSigilBase { + public ItemSigilWater() { super("water", 100); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); - if (!world.isRemote && !isUnusable(stack)) - { + if (!world.isRemote && !isUnusable(stack)) { RayTraceResult rayTrace = this.rayTrace(world, player, false); - if (rayTrace != null) - { + if (rayTrace != null) { ActionResult ret = net.minecraftforge.event.ForgeEventFactory.onBucketUse(player, world, stack, rayTrace); if (ret != null) return ret; - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { BlockPos blockpos = rayTrace.getBlockPos(); if (!world.isBlockModifiable(player, blockpos)) @@ -75,8 +64,7 @@ public class ItemSigilWater extends ItemSigilBase } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote || player.isSneaking() || isUnusable(stack)) return EnumActionResult.FAIL; @@ -85,14 +73,12 @@ public class ItemSigilWater extends ItemSigilBase return EnumActionResult.FAIL; TileEntity tile = world.getTileEntity(blockPos); - if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) - { + if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack fluid = new FluidStack(FluidRegistry.WATER, 1000); int amount = handler.fill(fluid, false); - if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) - { + if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { handler.fill(fluid, true); return EnumActionResult.SUCCESS; } @@ -100,8 +86,7 @@ public class ItemSigilWater extends ItemSigilBase return EnumActionResult.FAIL; } - if (world.getBlockState(blockPos).getBlock() == Blocks.CAULDRON && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) - { + if (world.getBlockState(blockPos).getBlock() == Blocks.CAULDRON && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { world.setBlockState(blockPos, Blocks.CAULDRON.getDefaultState().withProperty(BlockCauldron.LEVEL, 3)); return EnumActionResult.SUCCESS; } @@ -109,8 +94,7 @@ public class ItemSigilWater extends ItemSigilBase return EnumActionResult.FAIL; } - public boolean canPlaceWater(World world, BlockPos blockPos) - { + public boolean canPlaceWater(World world, BlockPos blockPos) { if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isSolid()) return false; else if ((world.getBlockState(blockPos).getBlock() == Blocks.WATER || world.getBlockState(blockPos).getBlock() == Blocks.FLOWING_WATER) && world.getBlockState(blockPos).getBlock().getMetaFromState(world.getBlockState(blockPos)) == 0) @@ -119,19 +103,15 @@ public class ItemSigilWater extends ItemSigilBase return true; } - public boolean tryPlaceWater(World worldIn, BlockPos pos) - { + public boolean tryPlaceWater(World worldIn, BlockPos pos) { Material material = worldIn.getBlockState(pos).getBlock().getMaterial(worldIn.getBlockState(pos)); boolean notSolid = !material.isSolid(); - if (!worldIn.isAirBlock(pos) && !notSolid) - { + if (!worldIn.isAirBlock(pos) && !notSolid) { return false; - } else - { - if (worldIn.provider.doesWaterVaporize()) - { + } else { + if (worldIn.provider.doesWaterVaporize()) { int i = pos.getX(); int j = pos.getY(); int k = pos.getZ(); @@ -139,8 +119,7 @@ public class ItemSigilWater extends ItemSigilBase for (int l = 0; l < 8; ++l) worldIn.spawnParticle(EnumParticleTypes.SMOKE_LARGE, (double) i + Math.random(), (double) j + Math.random(), (double) k + Math.random(), 0.0D, 0.0D, 0.0D, 0); - } else - { + } else { if (!worldIn.isRemote && notSolid && !material.isLiquid()) worldIn.destroyBlock(pos, true); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java index fe06e950..05bb2c43 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java @@ -7,16 +7,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -public class ItemSigilWhirlwind extends ItemSigilToggleableBase -{ - public ItemSigilWhirlwind() - { +public class ItemSigilWhirlwind extends ItemSigilToggleableBase { + public ItemSigilWhirlwind() { super("whirlwind", 250); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index ea1eb7fe..3be9b4be 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -9,7 +9,6 @@ import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -17,19 +16,16 @@ import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.List; -public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvider -{ - public static String[] names = { "base", "corrosive", "destructive", "vengeful", "steadfast" }; +public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvider { + public static String[] names = {"base", "corrosive", "destructive", "vengeful", "steadfast"}; - public ItemMonsterSoul() - { + public ItemMonsterSoul() { super(); setUnlocalizedName(BloodMagic.MODID + ".monsterSoul."); @@ -39,14 +35,12 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -56,8 +50,7 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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))); @@ -66,16 +59,13 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide } @Override - public EnumDemonWillType getType(ItemStack stack) - { + public EnumDemonWillType getType(ItemStack stack) { return EnumDemonWillType.values()[stack.getItemDamage() % 5]; } @Override - public double getWill(EnumDemonWillType type, ItemStack soulStack) - { - if (type != this.getType(soulStack)) - { + public double getWill(EnumDemonWillType type, ItemStack soulStack) { + if (type != this.getType(soulStack)) { return 0; } @@ -87,8 +77,7 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide } @Override - public void setWill(EnumDemonWillType type, ItemStack soulStack, double souls) - { + public void setWill(EnumDemonWillType type, ItemStack soulStack, double souls) { NBTHelper.checkNBT(soulStack); NBTTagCompound tag = soulStack.getTagCompound(); @@ -99,8 +88,7 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide } @Override - public double drainWill(EnumDemonWillType type, ItemStack soulStack, double drainAmount) - { + public double drainWill(EnumDemonWillType type, ItemStack soulStack, double drainAmount) { double souls = getWill(type, soulStack); double soulsDrained = Math.min(drainAmount, souls); @@ -110,19 +98,16 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide } @Override - public ItemStack createWill(int meta, double number) - { + public ItemStack createWill(int meta, double number) { ItemStack soulStack = new ItemStack(this, 1, meta % 5); setWill(getType(soulStack), soulStack, number); return soulStack; } @Override - public List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); - for (int i = 0; i < names.length; i++) - { + for (int i = 0; i < names.length; i++) { String name = names[i]; ret.add(new ImmutablePair(i, "type=" + name)); } @@ -130,20 +115,17 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide } @Override - public double getWill(ItemStack willStack) - { + public double getWill(ItemStack willStack) { return this.getWill(EnumDemonWillType.DEFAULT, willStack); } @Override - public void setWill(ItemStack willStack, double will) - { + public void setWill(ItemStack willStack, double will) { this.setWill(EnumDemonWillType.DEFAULT, willStack, will); } @Override - public double drainWill(ItemStack willStack, double drainAmount) - { + public double drainWill(ItemStack willStack, double drainAmount) { return this.drainWill(EnumDemonWillType.DEFAULT, willStack, drainAmount); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index 1a7c9e7c..9c9ca878 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -1,5 +1,9 @@ package WayofTime.bloodmagic.item.soul; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.item.armour.ItemSentientArmour; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -11,15 +15,9 @@ import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.item.armour.ItemSentientArmour; -public class ItemSentientArmourGem extends Item -{ - public ItemSentientArmourGem() - { +public class ItemSentientArmourGem extends Item { + public ItemSentientArmourGem() { super(); setCreativeTab(BloodMagic.TAB_BM); @@ -27,29 +25,23 @@ public class ItemSentientArmourGem extends Item setMaxStackSize(1); } - public EnumDemonWillType getCurrentType(ItemStack stack) - { + public EnumDemonWillType getCurrentType(ItemStack stack) { return EnumDemonWillType.DEFAULT; } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { boolean hasSentientArmour = false; NonNullList armourInventory = player.inventory.armorInventory; - for (ItemStack armourStack : armourInventory) - { - if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) - { + for (ItemStack armourStack : armourInventory) { + if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) { hasSentientArmour = true; } } - if (hasSentientArmour) - { + if (hasSentientArmour) { ItemSentientArmour.revertAllArmour(player); - } else - { + } else { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double will = PlayerDemonWillHandler.getTotalDemonWill(type, player); @@ -61,20 +53,16 @@ public class ItemSentientArmourGem extends Item } @SideOnly(Side.CLIENT) - public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) - { + public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) { boolean hasSentientArmour = false; NonNullList armourInventory = player.inventory.armorInventory; - for (ItemStack armourStack : armourInventory) - { - if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) - { + for (ItemStack armourStack : armourInventory) { + if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) { hasSentientArmour = true; } } - if (hasSentientArmour) - { + if (hasSentientArmour) { return new ModelResourceLocation("bloodmagic:ItemSentientArmourGem1", "inventory"); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 77bc1027..13f9d254 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -1,9 +1,22 @@ package WayofTime.bloodmagic.item.soul; -import java.util.*; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IMultiWillTool; +import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.api.iface.ISentientTool; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.IDemonWill; +import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +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.util.helper.TextHelper; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; @@ -28,55 +41,38 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; +import javax.annotation.Nullable; +import java.util.*; -public class ItemSentientAxe extends ItemAxe 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 class ItemSentientAxe extends ItemAxe 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 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 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 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 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() - { + public ItemSentientAxe() { super(Item.ToolMaterial.IRON); setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); @@ -86,26 +82,21 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) - { + public float getStrVsBlock(ItemStack stack, IBlockState state) { float value = super.getStrVsBlock(stack, state); - if (value > 1) - { + if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); - } else - { + } else { return value; } } @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) - { + 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, EntityPlayer player) - { + public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); this.setCurrentType(stack, soulsRemaining > 0 ? type : EnumDemonWillType.DEFAULT); @@ -124,106 +115,89 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP setDigSpeedOfSword(stack, level >= 0 ? getDigSpeed(type, level) : 0); } - public double getExtraDamage(EnumDemonWillType type, int willBracket) - { - if (willBracket < 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]; + 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 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 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 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: + public double getDigSpeed(EnumDemonWillType type, int willBracket) { + switch (type) { + case VENGEFUL: // return movementSpeed[willBracket]; - default: - return defaultDigSpeedAdded[willBracket]; + default: + return defaultDigSpeedAdded[willBracket]; } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer 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; + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer 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, EntityLivingBase target, EntityLivingBase attacker) - { - if (super.hitEntity(stack, target, attacker)) - { - if (attacker instanceof EntityPlayer) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + if (super.hitEntity(stack, target, attacker)) { + if (attacker instanceof EntityPlayer) { EntityPlayer attackerPlayer = (EntityPlayer) attacker; this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); EnumDemonWillType type = this.getCurrentType(stack); @@ -233,11 +207,9 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP applyEffectToEntity(type, willBracket, target, attackerPlayer); ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - if (offStack.getItem() instanceof ISentientSwordEffectProvider) - { + if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); - if (provider.providesEffectForWill(type)) - { + if (provider.providesEffectForWill(type)) { provider.applyOnHitEffect(type, stack, offStack, attacker, target); } } @@ -250,22 +222,19 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public EnumDemonWillType getCurrentType(ItemStack stack) - { + public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + 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) - { + public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -274,26 +243,21 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { recalculatePowers(player.getHeldItem(hand), world, player); return super.onItemRightClick(world, player, hand); } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return oldStack.getItem() != newStack.getItem(); } - private int getLevel(ItemStack stack, double soulsRemaining) - { + private int getLevel(ItemStack stack, double soulsRemaining) { int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) - { - if (soulsRemaining >= soulBracket[i]) - { + for (int i = 0; i < soulBracket.length; i++) { + if (soulsRemaining >= soulBracket[i]) { lvl = i; } } @@ -303,8 +267,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -313,21 +276,17 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); - if (drain > 0) - { + if (drain > 0) { EnumDemonWillType type = getCurrentType(stack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (drain > soulsRemaining) - { + if (drain > soulsRemaining) { return false; - } else - { + } else { PlayerDemonWillHandler.consumeDemonWill(type, player, drain); } } @@ -337,24 +296,20 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionMultiWill("ItemSentientAxe"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=" + type.getName().toLowerCase()); } @@ -362,12 +317,10 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) - { + public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { List soulList = new ArrayList(); - if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) - { + if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } @@ -377,10 +330,8 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP EnumDemonWillType type = this.getCurrentType(stack); - for (int i = 0; i <= looting; i++) - { - if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) - { + 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); } @@ -391,11 +342,9 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP //TODO: Change attack speed. @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.MAINHAND) - { + if (slot == EntityEquipmentSlot.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)); @@ -405,16 +354,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP return multimap; } - public double getDamageOfActivatedSword(ItemStack stack) - { + public double getDamageOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); } - public void setDamageOfActivatedSword(ItemStack stack, double damage) - { + public void setDamageOfActivatedSword(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -422,16 +369,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } - public double getDrainOfActivatedSword(ItemStack stack) - { + public double getDrainOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } - public void setDrainOfActivatedSword(ItemStack stack, double drain) - { + public void setDrainOfActivatedSword(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -439,16 +384,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } - public double getStaticDropOfActivatedSword(ItemStack stack) - { + public double getStaticDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } - public void setStaticDropOfActivatedSword(ItemStack stack, double drop) - { + public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -456,16 +399,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } - public double getDropOfActivatedSword(ItemStack stack) - { + public double getDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } - public void setDropOfActivatedSword(ItemStack stack, double drop) - { + public void setDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -473,16 +414,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } - public double getHealthBonusOfSword(ItemStack stack) - { + public double getHealthBonusOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } - public void setHealthBonusOfSword(ItemStack stack, double hp) - { + public void setHealthBonusOfSword(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -490,16 +429,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } - public double getAttackSpeedOfSword(ItemStack stack) - { + public double getAttackSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); } - public void setAttackSpeedOfSword(ItemStack stack, double speed) - { + public void setAttackSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -507,16 +444,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } - public double getSpeedOfSword(ItemStack stack) - { + public double getSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); } - public void setSpeedOfSword(ItemStack stack, double speed) - { + public void setSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -524,16 +459,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } - public double getDigSpeedOfSword(ItemStack stack) - { + public double getDigSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); } - public void setDigSpeedOfSword(ItemStack stack, double speed) - { + public void setDigSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -542,17 +475,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) - { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { World world = player.getEntityWorld(); - if (!world.isRemote) - { + if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); EnumDemonWillType type = this.getCurrentType(droppedStack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) - { + if (soulsRemaining < 1024) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 0a06e2e4..93591ef5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -1,5 +1,15 @@ package WayofTime.bloodmagic.item.soul; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IMultiWillTool; +import WayofTime.bloodmagic.api.iface.ISentientTool; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; +import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -22,81 +32,59 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import java.util.Locale; public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentientTool//, IMeshProvider { - public static int[] soulBracket = new int[] { 16, 60, 200, 400, 1000 }; - public static double[] defaultDamageAdded = new double[] { 0.25, 0.5, 0.75, 1, 1.25 }; - public static float[] velocityAdded = new float[] { 0.25f, 0.5f, 0.75f, 1, 1.25f }; - public static double[] soulDrainPerSwing = new double[] { 0.05, 0.1, 0.2, 0.4, 0.75 }; //TODO - public static double[] soulDrop = new double[] { 2, 4, 7, 10, 13 }; - public static double[] staticDrop = new double[] { 1, 1, 2, 3, 3 }; + public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; + public static double[] defaultDamageAdded = new double[]{0.25, 0.5, 0.75, 1, 1.25}; + public static float[] velocityAdded = new float[]{0.25f, 0.5f, 0.75f, 1, 1.25f}; + public static double[] soulDrainPerSwing = new double[]{0.05, 0.1, 0.2, 0.4, 0.75}; //TODO + public static double[] soulDrop = new double[]{2, 4, 7, 10, 13}; + public static double[] staticDrop = new double[]{1, 1, 2, 3, 3}; - public ItemSentientBow() - { + public ItemSentientBow() { super(); setUnlocalizedName(BloodMagic.MODID + ".sentientBow"); setCreativeTab(BloodMagic.TAB_BM); - this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() - { + this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) - { - if (entityIn == null) - { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { + if (entityIn == null) { return 0.0F; - } else - { + } 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() - { + this.addPropertyOverride(new ResourceLocation("pulling"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) - { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { return entityIn != null && entityIn.isHandActive() && entityIn.getActiveItemStack() == stack ? 1.0F : 0.0F; } }); - this.addPropertyOverride(new ResourceLocation("type"), new IItemPropertyGetter() - { + this.addPropertyOverride(new ResourceLocation("type"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) - { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { return ((ItemSentientBow) RegistrarBloodMagicItems.SENTIENT_BOW).getCurrentType(stack).ordinal(); } }); } @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) - { + 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, EntityPlayer player) - { + public void recalculatePowers(ItemStack stack, World world, EntityPlayer 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) - { + public void recalculatePowers(ItemStack stack, EnumDemonWillType type, double will) { this.setCurrentType(stack, will > 0 ? type : EnumDemonWillType.DEFAULT); int level = getLevel(stack, will); // @@ -117,13 +105,10 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien setDamageAdded(stack, level >= 0 ? getDamageModifier(type, level) : 0); } - private int getLevel(ItemStack stack, double soulsRemaining) - { + private int getLevel(ItemStack stack, double soulsRemaining) { int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) - { - if (soulsRemaining >= soulBracket[i]) - { + for (int i = 0; i < soulBracket.length; i++) { + if (soulsRemaining >= soulBracket[i]) { lvl = i; } } @@ -132,49 +117,42 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public EnumDemonWillType getCurrentType(ItemStack stack) - { + public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + 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]; + 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 float getVelocityModifier(EnumDemonWillType type, int willBracket) { + switch (type) { + case VENGEFUL: + return velocityAdded[willBracket]; + default: + return 0; } } - public void setDamageAdded(ItemStack stack, double damage) - { + public void setDamageAdded(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -182,8 +160,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble("damage", damage); } - public double getDamageAdded(ItemStack stack) - { + public double getDamageAdded(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -191,8 +168,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien return tag.getDouble("damage"); } - public void setVelocityOfArrow(ItemStack stack, float velocity) - { + public void setVelocityOfArrow(ItemStack stack, float velocity) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -200,22 +176,19 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setFloat("velocity", velocity); } - public float getVelocityOfArrow(ItemStack stack) - { + public float getVelocityOfArrow(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (tag.hasKey("velocity")) - { + if (tag.hasKey("velocity")) { return tag.getFloat("velocity"); } return 3; } - public void setCurrentType(ItemStack stack, EnumDemonWillType type) - { + public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -223,16 +196,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } - public double getDrainOfActivatedBow(ItemStack stack) - { + public double getDrainOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } - public void setDrainOfActivatedBow(ItemStack stack, double drain) - { + public void setDrainOfActivatedBow(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -240,16 +211,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } - public double getStaticDropOfActivatedBow(ItemStack stack) - { + public double getStaticDropOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } - public void setStaticDropOfActivatedBow(ItemStack stack, double drop) - { + public void setStaticDropOfActivatedBow(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -257,16 +226,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } - public double getDropOfActivatedBow(ItemStack stack) - { + public double getDropOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } - public void setDropOfActivatedBow(ItemStack stack, double drop) - { + public void setDropOfActivatedBow(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -275,15 +242,13 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); this.recalculatePowers(stack, world, player); return super.onItemRightClick(world, player, hand); } - public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) - { + public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) { EnumDemonWillType type = this.getCurrentType(stack); double amount = user instanceof EntityPlayer ? (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)) : 0; @@ -298,14 +263,12 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); entityArrow.setThrowableHeading(d0, d1 + d3 * 0.05, d2, newArrowVelocity, 0); - if (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) - { + if (velocity == 1.0F) { entityArrow.setIsCritical(true); } @@ -315,13 +278,11 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - if (k > 0) - { + if (k > 0) { entityArrow.setKnockbackStrength(k); } - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) - { + if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) { entityArrow.setFire(100); } @@ -331,10 +292,8 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) - { - if (entityLiving instanceof EntityPlayer) - { + public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) { + if (entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entityLiving; boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0; ItemStack itemstack = this.getFiredArrow(player); @@ -344,21 +303,17 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien if (i < 0) return; - if (itemstack != null || flag) - { - if (itemstack == null) - { + if (itemstack != null || flag) { + if (itemstack == null) { itemstack = new ItemStack(Items.ARROW); } float arrowVelocity = getArrowVelocity(i); - if ((double) arrowVelocity >= 0.1D) - { + if ((double) arrowVelocity >= 0.1D) { boolean flag1 = flag && itemstack.getItem() == Items.ARROW; //Forge: Fix consuming custom arrows. - if (!world.isRemote) - { + if (!world.isRemote) { this.recalculatePowers(stack, world, player); EnumDemonWillType type = this.getCurrentType(stack); @@ -372,14 +327,12 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien EntitySentientArrow entityArrow = new EntitySentientArrow(world, entityLiving, type, amount); entityArrow.setAim(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); - if (newArrowVelocity == 0) - { + if (newArrowVelocity == 0) { world.playSound(null, player.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); return; } - if (arrowVelocity == 1.0F) - { + if (arrowVelocity == 1.0F) { entityArrow.setIsCritical(true); } @@ -389,20 +342,17 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - if (k > 0) - { + if (k > 0) { entityArrow.setKnockbackStrength(k); } - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) - { + if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) { entityArrow.setFire(100); } stack.damageItem(1, player); - if (flag1) - { + if (flag1) { entityArrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; } @@ -411,12 +361,10 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien 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) - { + if (!flag1) { itemstack.shrink(1); - if (itemstack.isEmpty()) - { + if (itemstack.isEmpty()) { player.inventory.deleteStack(itemstack); } } @@ -427,22 +375,16 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } } - protected ItemStack getFiredArrow(EntityPlayer player) - { - if (this.isArrow(player.getHeldItem(EnumHand.OFF_HAND))) - { + protected ItemStack getFiredArrow(EntityPlayer player) { + if (this.isArrow(player.getHeldItem(EnumHand.OFF_HAND))) { return player.getHeldItem(EnumHand.OFF_HAND); - } else if (this.isArrow(player.getHeldItem(EnumHand.MAIN_HAND))) - { + } else if (this.isArrow(player.getHeldItem(EnumHand.MAIN_HAND))) { return player.getHeldItem(EnumHand.MAIN_HAND); - } else - { - for (int i = 0; i < player.inventory.getSizeInventory(); ++i) - { + } else { + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { ItemStack itemstack = player.inventory.getStackInSlot(i); - if (this.isArrow(itemstack)) - { + if (this.isArrow(itemstack)) { return itemstack; } } @@ -452,17 +394,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) - { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { World world = player.getEntityWorld(); - if (!world.isRemote) - { + if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); EnumDemonWillType type = this.getCurrentType(droppedStack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) - { + if (soulsRemaining < 1024) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 2904fa35..75e2ee13 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -1,9 +1,22 @@ package WayofTime.bloodmagic.item.soul; -import java.util.*; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IMultiWillTool; +import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.api.iface.ISentientTool; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.IDemonWill; +import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +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.util.helper.TextHelper; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; @@ -28,55 +41,38 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; +import javax.annotation.Nullable; +import java.util.*; -public class ItemSentientPickaxe extends ItemPickaxe 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 class ItemSentientPickaxe extends ItemPickaxe 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 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 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 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 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() - { + public ItemSentientPickaxe() { super(Item.ToolMaterial.IRON); setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); @@ -86,26 +82,21 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) - { + public float getStrVsBlock(ItemStack stack, IBlockState state) { float value = super.getStrVsBlock(stack, state); - if (value > 1) - { + if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); - } else - { + } else { return value; } } @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) - { + public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); } - public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) - { + public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); this.setCurrentType(stack, soulsRemaining > 0 ? type : EnumDemonWillType.DEFAULT); @@ -124,106 +115,89 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon setDigSpeedOfSword(stack, level >= 0 ? getDigSpeed(type, level) : 0); } - public double getExtraDamage(EnumDemonWillType type, int willBracket) - { - if (willBracket < 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]; + 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 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 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 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: + public double getDigSpeed(EnumDemonWillType type, int willBracket) { + switch (type) { + case VENGEFUL: // return movementSpeed[willBracket]; - default: - return defaultDigSpeedAdded[willBracket]; + default: + return defaultDigSpeedAdded[willBracket]; } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer 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; + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer 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, EntityLivingBase target, EntityLivingBase attacker) - { - if (super.hitEntity(stack, target, attacker)) - { - if (attacker instanceof EntityPlayer) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + if (super.hitEntity(stack, target, attacker)) { + if (attacker instanceof EntityPlayer) { EntityPlayer attackerPlayer = (EntityPlayer) attacker; this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); EnumDemonWillType type = this.getCurrentType(stack); @@ -233,11 +207,9 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon applyEffectToEntity(type, willBracket, target, attackerPlayer); ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - if (offStack.getItem() instanceof ISentientSwordEffectProvider) - { + if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); - if (provider.providesEffectForWill(type)) - { + if (provider.providesEffectForWill(type)) { provider.applyOnHitEffect(type, stack, offStack, attacker, target); } } @@ -250,22 +222,19 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public EnumDemonWillType getCurrentType(ItemStack stack) - { + public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + 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) - { + public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -274,25 +243,20 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { recalculatePowers(player.getHeldItem(hand), world, player); return super.onItemRightClick(world, player, hand); } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return oldStack.getItem() != newStack.getItem(); } - private int getLevel(ItemStack stack, double soulsRemaining) - { + private int getLevel(ItemStack stack, double soulsRemaining) { int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) - { - if (soulsRemaining >= soulBracket[i]) - { + for (int i = 0; i < soulBracket.length; i++) { + if (soulsRemaining >= soulBracket[i]) { lvl = i; } } @@ -302,8 +266,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -312,21 +275,17 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); - if (drain > 0) - { + if (drain > 0) { EnumDemonWillType type = getCurrentType(stack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (drain > soulsRemaining) - { + if (drain > soulsRemaining) { return false; - } else - { + } else { PlayerDemonWillHandler.consumeDemonWill(type, player, drain); } } @@ -336,24 +295,20 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionMultiWill("ItemSentientPickaxe"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=" + type.getName().toLowerCase()); } @@ -361,12 +316,10 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) - { + public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { List soulList = new ArrayList(); - if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) - { + if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } @@ -376,10 +329,8 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon EnumDemonWillType type = this.getCurrentType(stack); - for (int i = 0; i <= looting; i++) - { - if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) - { + 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); } @@ -390,11 +341,9 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon //TODO: Change attack speed. @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.MAINHAND) - { + if (slot == EntityEquipmentSlot.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)); @@ -404,16 +353,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon return multimap; } - public double getDamageOfActivatedSword(ItemStack stack) - { + public double getDamageOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); } - public void setDamageOfActivatedSword(ItemStack stack, double damage) - { + public void setDamageOfActivatedSword(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -421,16 +368,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } - public double getDrainOfActivatedSword(ItemStack stack) - { + public double getDrainOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } - public void setDrainOfActivatedSword(ItemStack stack, double drain) - { + public void setDrainOfActivatedSword(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -438,16 +383,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } - public double getStaticDropOfActivatedSword(ItemStack stack) - { + public double getStaticDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } - public void setStaticDropOfActivatedSword(ItemStack stack, double drop) - { + public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -455,16 +398,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } - public double getDropOfActivatedSword(ItemStack stack) - { + public double getDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } - public void setDropOfActivatedSword(ItemStack stack, double drop) - { + public void setDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -472,16 +413,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } - public double getHealthBonusOfSword(ItemStack stack) - { + public double getHealthBonusOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } - public void setHealthBonusOfSword(ItemStack stack, double hp) - { + public void setHealthBonusOfSword(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -489,16 +428,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } - public double getAttackSpeedOfSword(ItemStack stack) - { + public double getAttackSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); } - public void setAttackSpeedOfSword(ItemStack stack, double speed) - { + public void setAttackSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -506,16 +443,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } - public double getSpeedOfSword(ItemStack stack) - { + public double getSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); } - public void setSpeedOfSword(ItemStack stack, double speed) - { + public void setSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -523,16 +458,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } - public double getDigSpeedOfSword(ItemStack stack) - { + public double getDigSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); } - public void setDigSpeedOfSword(ItemStack stack, double speed) - { + public void setDigSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -541,17 +474,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) - { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { World world = player.getEntityWorld(); - if (!world.isRemote) - { + if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); EnumDemonWillType type = this.getCurrentType(droppedStack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) - { + if (soulsRemaining < 1024) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index 4c140cb8..6a99d001 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -1,9 +1,22 @@ package WayofTime.bloodmagic.item.soul; -import java.util.*; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IMultiWillTool; +import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.api.iface.ISentientTool; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.IDemonWill; +import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +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.util.helper.TextHelper; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; @@ -28,55 +41,38 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; +import javax.annotation.Nullable; +import java.util.*; -public class ItemSentientShovel extends ItemSpade 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 class ItemSentientShovel extends ItemSpade 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 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 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 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 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() - { + public ItemSentientShovel() { super(Item.ToolMaterial.IRON); setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); @@ -86,26 +82,21 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) - { + public float getStrVsBlock(ItemStack stack, IBlockState state) { float value = super.getStrVsBlock(stack, state); - if (value > 1) - { + if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); - } else - { + } else { return value; } } @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) - { + 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, EntityPlayer player) - { + public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); this.setCurrentType(stack, soulsRemaining > 0 ? type : EnumDemonWillType.DEFAULT); @@ -124,106 +115,89 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I setDigSpeedOfSword(stack, level >= 0 ? getDigSpeed(type, level) : 0); } - public double getExtraDamage(EnumDemonWillType type, int willBracket) - { - if (willBracket < 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]; + 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 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 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 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: + public double getDigSpeed(EnumDemonWillType type, int willBracket) { + switch (type) { + case VENGEFUL: // return movementSpeed[willBracket]; - default: - return defaultDigSpeedAdded[willBracket]; + default: + return defaultDigSpeedAdded[willBracket]; } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer 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; + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer 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, EntityLivingBase target, EntityLivingBase attacker) - { - if (super.hitEntity(stack, target, attacker)) - { - if (attacker instanceof EntityPlayer) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + if (super.hitEntity(stack, target, attacker)) { + if (attacker instanceof EntityPlayer) { EntityPlayer attackerPlayer = (EntityPlayer) attacker; this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); EnumDemonWillType type = this.getCurrentType(stack); @@ -233,11 +207,9 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I applyEffectToEntity(type, willBracket, target, attackerPlayer); ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - if (offStack.getItem() instanceof ISentientSwordEffectProvider) - { + if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); - if (provider.providesEffectForWill(type)) - { + if (provider.providesEffectForWill(type)) { provider.applyOnHitEffect(type, stack, offStack, attacker, target); } } @@ -250,22 +222,19 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public EnumDemonWillType getCurrentType(ItemStack stack) - { + public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + 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) - { + public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -274,26 +243,21 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { recalculatePowers(player.getHeldItem(hand), world, player); return super.onItemRightClick(world, player, hand); } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return oldStack.getItem() != newStack.getItem(); } - private int getLevel(ItemStack stack, double soulsRemaining) - { + private int getLevel(ItemStack stack, double soulsRemaining) { int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) - { - if (soulsRemaining >= soulBracket[i]) - { + for (int i = 0; i < soulBracket.length; i++) { + if (soulsRemaining >= soulBracket[i]) { lvl = i; } } @@ -303,8 +267,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -313,21 +276,17 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); - if (drain > 0) - { + if (drain > 0) { EnumDemonWillType type = getCurrentType(stack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (drain > soulsRemaining) - { + if (drain > soulsRemaining) { return false; - } else - { + } else { PlayerDemonWillHandler.consumeDemonWill(type, player, drain); } } @@ -337,24 +296,20 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionMultiWill("ItemSentientShovel"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=" + type.getName().toLowerCase()); } @@ -362,12 +317,10 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) - { + public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { List soulList = new ArrayList(); - if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) - { + if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } @@ -377,10 +330,8 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I EnumDemonWillType type = this.getCurrentType(stack); - for (int i = 0; i <= looting; i++) - { - if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) - { + 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); } @@ -391,11 +342,9 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I //TODO: Change attack speed. @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.MAINHAND) - { + if (slot == EntityEquipmentSlot.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)); @@ -405,16 +354,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I return multimap; } - public double getDamageOfActivatedSword(ItemStack stack) - { + public double getDamageOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); } - public void setDamageOfActivatedSword(ItemStack stack, double damage) - { + public void setDamageOfActivatedSword(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -422,16 +369,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } - public double getDrainOfActivatedSword(ItemStack stack) - { + public double getDrainOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } - public void setDrainOfActivatedSword(ItemStack stack, double drain) - { + public void setDrainOfActivatedSword(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -439,16 +384,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } - public double getStaticDropOfActivatedSword(ItemStack stack) - { + public double getStaticDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } - public void setStaticDropOfActivatedSword(ItemStack stack, double drop) - { + public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -456,16 +399,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } - public double getDropOfActivatedSword(ItemStack stack) - { + public double getDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } - public void setDropOfActivatedSword(ItemStack stack, double drop) - { + public void setDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -473,16 +414,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } - public double getHealthBonusOfSword(ItemStack stack) - { + public double getHealthBonusOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } - public void setHealthBonusOfSword(ItemStack stack, double hp) - { + public void setHealthBonusOfSword(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -490,16 +429,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } - public double getAttackSpeedOfSword(ItemStack stack) - { + public double getAttackSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); } - public void setAttackSpeedOfSword(ItemStack stack, double speed) - { + public void setAttackSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -507,16 +444,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } - public double getSpeedOfSword(ItemStack stack) - { + public double getSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); } - public void setSpeedOfSword(ItemStack stack, double speed) - { + public void setSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -524,16 +459,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } - public double getDigSpeedOfSword(ItemStack stack) - { + public double getDigSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); } - public void setDigSpeedOfSword(ItemStack stack, double speed) - { + public void setDigSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -542,17 +475,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) - { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { World world = player.getEntityWorld(); - if (!world.isRemote) - { + if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); EnumDemonWillType type = this.getCurrentType(droppedStack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) - { + if (soulsRemaining < 1024) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 80fc39ca..63f6f0bd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -1,9 +1,22 @@ package WayofTime.bloodmagic.item.soul; -import java.util.*; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IMultiWillTool; +import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.api.iface.ISentientTool; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.IDemonWill; +import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +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.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; @@ -26,51 +39,34 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; +import javax.annotation.Nullable; +import java.util.*; -public class ItemSentientSword extends ItemSword 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 class ItemSentientSword extends ItemSword 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 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 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 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 static double[] movementSpeed = new double[]{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4}; - public ItemSentientSword() - { + public ItemSentientSword() { super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); setUnlocalizedName(BloodMagic.MODID + ".sentientSword"); @@ -78,20 +74,17 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) - { + 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, EntityPlayer player) - { + public void recalculatePowers(ItemStack stack, World world, EntityPlayer 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) - { + public void recalculatePowers(ItemStack stack, EnumDemonWillType type, double will) { this.setCurrentType(stack, will > 0 ? type : EnumDemonWillType.DEFAULT); int level = getLevel(stack, will); @@ -107,95 +100,80 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM setSpeedOfSword(stack, level >= 0 ? getMovementSpeed(type, level) : 0); } - public double getExtraDamage(EnumDemonWillType type, int willBracket) - { - if (willBracket < 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]; + 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 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 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 getMovementSpeed(EnumDemonWillType type, int willBracket) { + switch (type) { + case VENGEFUL: + return movementSpeed[willBracket]; + default: + return 0; } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityLivingBase 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; + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityLivingBase 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, EntityLivingBase target, EntityLivingBase attacker) - { - if (super.hitEntity(stack, target, attacker)) - { - if (attacker instanceof EntityPlayer) - { + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + if (super.hitEntity(stack, target, attacker)) { + if (attacker instanceof EntityPlayer) { EntityPlayer attackerPlayer = (EntityPlayer) attacker; this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); EnumDemonWillType type = this.getCurrentType(stack); @@ -205,11 +183,9 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM applyEffectToEntity(type, willBracket, target, attackerPlayer); ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - if (offStack.getItem() instanceof ISentientSwordEffectProvider) - { + if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); - if (provider.providesEffectForWill(type)) - { + if (provider.providesEffectForWill(type)) { provider.applyOnHitEffect(type, stack, offStack, attacker, target); } } @@ -222,22 +198,19 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public EnumDemonWillType getCurrentType(ItemStack stack) - { + public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + 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) - { + public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -246,25 +219,20 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { recalculatePowers(player.getHeldItem(hand), world, player); return super.onItemRightClick(world, player, hand); } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return oldStack.getItem() != newStack.getItem(); } - private int getLevel(ItemStack stack, double soulsRemaining) - { + private int getLevel(ItemStack stack, double soulsRemaining) { int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) - { - if (soulsRemaining >= soulBracket[i]) - { + for (int i = 0; i < soulBracket.length; i++) { + if (soulsRemaining >= soulBracket[i]) { lvl = i; } } @@ -274,8 +242,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -284,21 +251,17 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); - if (drain > 0) - { + if (drain > 0) { EnumDemonWillType type = getCurrentType(stack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (drain > soulsRemaining) - { + if (drain > soulsRemaining) { return false; - } else - { + } else { PlayerDemonWillHandler.consumeDemonWill(type, player, drain); } } @@ -308,24 +271,20 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionMultiWill("ItemSentientSword"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=" + type.getName().toLowerCase()); } @@ -333,12 +292,10 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) - { + public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { List soulList = new ArrayList(); - if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) - { + if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } @@ -348,10 +305,8 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM EnumDemonWillType type = this.getCurrentType(stack); - for (int i = 0; i <= looting; i++) - { - if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) - { + 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); } @@ -362,11 +317,9 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM //TODO: Change attack speed. @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) - { + public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.MAINHAND) - { + if (slot == EntityEquipmentSlot.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)); @@ -376,16 +329,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM return multimap; } - public double getDamageOfActivatedSword(ItemStack stack) - { + public double getDamageOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); } - public void setDamageOfActivatedSword(ItemStack stack, double damage) - { + public void setDamageOfActivatedSword(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -393,16 +344,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } - public double getDrainOfActivatedSword(ItemStack stack) - { + public double getDrainOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } - public void setDrainOfActivatedSword(ItemStack stack, double drain) - { + public void setDrainOfActivatedSword(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -410,16 +359,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } - public double getStaticDropOfActivatedSword(ItemStack stack) - { + public double getStaticDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } - public void setStaticDropOfActivatedSword(ItemStack stack, double drop) - { + public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -427,16 +374,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } - public double getDropOfActivatedSword(ItemStack stack) - { + public double getDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } - public void setDropOfActivatedSword(ItemStack stack, double drop) - { + public void setDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -444,16 +389,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } - public double getHealthBonusOfSword(ItemStack stack) - { + public double getHealthBonusOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } - public void setHealthBonusOfSword(ItemStack stack, double hp) - { + public void setHealthBonusOfSword(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -461,16 +404,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } - public double getAttackSpeedOfSword(ItemStack stack) - { + public double getAttackSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); } - public void setAttackSpeedOfSword(ItemStack stack, double speed) - { + public void setAttackSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -478,16 +419,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } - public double getSpeedOfSword(ItemStack stack) - { + public double getSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); } - public void setSpeedOfSword(ItemStack stack, double speed) - { + public void setSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -496,17 +435,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) - { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { World world = player.getEntityWorld(); - if (!world.isRemote) - { + if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); EnumDemonWillType type = this.getCurrentType(droppedStack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) - { + if (soulsRemaining < 1024) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index 8a9af1d8..b7150d83 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -1,11 +1,16 @@ package WayofTime.bloodmagic.item.soul; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IMultiWillTool; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.soul.IDemonWill; +import WayofTime.bloodmagic.api.soul.IDemonWillGem; +import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionWillGem; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; @@ -18,24 +23,16 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillGem; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionWillGem; -import WayofTime.bloodmagic.util.helper.TextHelper; -public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, IMultiWillTool -{ - public static String[] names = { "petty", "lesser", "common", "greater", "grand" }; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; - public ItemSoulGem() - { +public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, IMultiWillTool { + public static String[] names = {"petty", "lesser", "common", "greater", "grand"}; + + public ItemSoulGem() { super(); setUnlocalizedName(BloodMagic.MODID + ".soulGem."); @@ -45,14 +42,12 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); EnumDemonWillType type = this.getCurrentType(stack); double drain = Math.min(this.getWill(type, stack), this.getMaxWill(type, stack) / 10); @@ -65,24 +60,20 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionWillGem("ItemSoulGem"); } @Nullable @Override - public ResourceLocation getCustomLocation() - { + public ResourceLocation getCustomLocation() { return null; } @Override - public List getVariants() - { + public List getVariants() { List ret = new ArrayList(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=petty_" + type.getName().toLowerCase()); ret.add("type=lesser_" + type.getName().toLowerCase()); ret.add("type=common_" + type.getName().toLowerCase()); @@ -94,21 +85,17 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; - for (int i = 0; i < names.length; i++) - { + 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++) - { + 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); @@ -118,8 +105,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; @@ -132,57 +118,47 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public boolean showDurabilityBar(ItemStack stack) - { + public boolean showDurabilityBar(ItemStack stack) { return true; } @Override - public double getDurabilityForDisplay(ItemStack stack) - { + public double getDurabilityForDisplay(ItemStack stack) { EnumDemonWillType type = this.getCurrentType(stack); double maxWill = getMaxWill(type, stack); - if (maxWill <= 0) - { + if (maxWill <= 0) { return 1; } return 1.0 - (getWill(type, stack) / maxWill); } @Override - public int getRGBDurabilityForDisplay(ItemStack stack) - { + public int getRGBDurabilityForDisplay(ItemStack stack) { EnumDemonWillType type = this.getCurrentType(stack); double maxWill = getMaxWill(type, stack); - if (maxWill <= 0) - { + if (maxWill <= 0) { return 1; } - return MathHelper.hsvToRGB(Math.max(0.0F, (float)(getWill(type, stack)) / (float) maxWill) / 3.0F, 1.0F, 1.0F); + 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) - { + 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)) - { + if (thisType != ((IDemonWill) soulStack.getItem()).getType(soulStack)) { return soulStack; } IDemonWill soul = (IDemonWill) soulStack.getItem(); double soulsLeft = getWill(thisType, soulGemStack); - if (soulsLeft < getMaxWill(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) - { + if (soul.getWill(thisType, soulStack) <= 0) { return ItemStack.EMPTY; } } @@ -192,10 +168,8 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public double getWill(EnumDemonWillType type, ItemStack soulGemStack) - { - if (!type.equals(getCurrentType(soulGemStack))) - { + public double getWill(EnumDemonWillType type, ItemStack soulGemStack) { + if (!type.equals(getCurrentType(soulGemStack))) { return 0; } @@ -205,8 +179,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public void setWill(EnumDemonWillType type, ItemStack soulGemStack, double souls) - { + public void setWill(EnumDemonWillType type, ItemStack soulGemStack, double souls) { setCurrentType(type, soulGemStack); NBTTagCompound tag = soulGemStack.getTagCompound(); @@ -215,19 +188,16 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public double drainWill(EnumDemonWillType type, ItemStack soulGemStack, double drainAmount, boolean doDrain) - { + public double drainWill(EnumDemonWillType type, ItemStack soulGemStack, double drainAmount, boolean doDrain) { EnumDemonWillType currentType = this.getCurrentType(soulGemStack); - if (currentType != type) - { + if (currentType != type) { return 0; } double souls = getWill(type, soulGemStack); double soulsDrained = Math.min(drainAmount, souls); - if (doDrain) - { + if (doDrain) { setWill(type, soulGemStack, souls - soulsDrained); } @@ -235,55 +205,47 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public int getMaxWill(EnumDemonWillType type, ItemStack soulGemStack) - { + public int getMaxWill(EnumDemonWillType type, ItemStack soulGemStack) { EnumDemonWillType currentType = getCurrentType(soulGemStack); - if (!type.equals(currentType) && currentType != EnumDemonWillType.DEFAULT) - { + 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; + 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) - { + public EnumDemonWillType getCurrentType(ItemStack soulGemStack) { NBTHelper.checkNBT(soulGemStack); NBTTagCompound tag = soulGemStack.getTagCompound(); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + 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) - { + public void setCurrentType(EnumDemonWillType type, ItemStack soulGemStack) { NBTHelper.checkNBT(soulGemStack); NBTTagCompound tag = soulGemStack.getTagCompound(); - if (type == EnumDemonWillType.DEFAULT) - { - if (tag.hasKey(Constants.NBT.WILL_TYPE)) - { + if (type == EnumDemonWillType.DEFAULT) { + if (tag.hasKey(Constants.NBT.WILL_TYPE)) { tag.removeTag(Constants.NBT.WILL_TYPE); } @@ -294,10 +256,8 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public double fillWill(EnumDemonWillType type, ItemStack stack, double fillAmount, boolean doFill) - { - if (!type.equals(getCurrentType(stack)) && this.getWill(getCurrentType(stack), stack) > 0) - { + public double fillWill(EnumDemonWillType type, ItemStack stack, double fillAmount, boolean doFill) { + if (!type.equals(getCurrentType(stack)) && this.getWill(getCurrentType(stack), stack) > 0) { return 0; } @@ -306,8 +266,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I double filled = Math.min(fillAmount, maxWill - current); - if (doFill) - { + if (doFill) { this.setWill(type, stack, filled + current); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index d96f1973..e6d76d8c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -14,7 +14,6 @@ import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; - import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -22,12 +21,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class ItemSoulSnare extends Item implements IVariantProvider -{ - public static String[] names = { "base" }; +public class ItemSoulSnare extends Item implements IVariantProvider { + public static String[] names = {"base"}; - public ItemSoulSnare() - { + public ItemSoulSnare() { super(); setUnlocalizedName(BloodMagic.MODID + ".soulSnare."); @@ -37,18 +34,15 @@ public class ItemSoulSnare extends Item implements IVariantProvider } @Override - public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) - { + public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { ItemStack stack = playerIn.getHeldItem(hand); - if (!playerIn.capabilities.isCreativeMode) - { + 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) - { + if (!worldIn.isRemote) { EntitySoulSnare snare = new EntitySoulSnare(worldIn, playerIn); snare.setHeadingFromThrower(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); worldIn.spawnEntity(snare); @@ -58,15 +52,13 @@ public class ItemSoulSnare extends Item implements IVariantProvider } @Override - public String getUnlocalizedName(ItemStack stack) - { + public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -76,16 +68,14 @@ public class ItemSoulSnare extends Item implements IVariantProvider @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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 List> getVariants() - { + public List> getVariants() { List> ret = new ArrayList>(); ret.add(new ImmutablePair(0, "type=soulsnare")); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index da0a84b1..e9e3edfb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -1,11 +1,14 @@ package WayofTime.bloodmagic.livingArmour; -import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; - +import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.livingArmour.StatTracker; +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.EntityLivingBase; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; @@ -15,19 +18,14 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -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 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 class LivingArmour implements ILivingArmour { public static String chatBase = "chat.bloodmagic.livingArmour."; public HashMap trackerMap = new HashMap(); public HashMap upgradeMap = new HashMap(); @@ -35,52 +33,42 @@ public class LivingArmour implements ILivingArmour public int maxUpgradePoints = 100; public int totalUpgradePoints = 0; - public StatTracker getTracker(String key) - { + public StatTracker getTracker(String key) { return trackerMap.get(key); } - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { + public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { double total = 0; - for (Entry entry : upgradeMap.entrySet()) - { + for (Entry entry : upgradeMap.entrySet()) { total += entry.getValue().getAdditionalDamageOnHit(damage, wearer, hitEntity, weapon); } return total; } - public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { + public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { double total = 0; - for (Entry entry : upgradeMap.entrySet()) - { + for (Entry entry : upgradeMap.entrySet()) { total += entry.getValue().getKnockbackOnHit(wearer, hitEntity, weapon); } return total; } - public void recalculateUpgradePoints() - { + public void recalculateUpgradePoints() { totalUpgradePoints = 0; - for (LivingArmourUpgrade upgrade : upgradeMap.values()) - { + for (LivingArmourUpgrade upgrade : upgradeMap.values()) { totalUpgradePoints += upgrade.getCostOfUpgrade(); } } @Override - public Multimap getAttributeModifiers() - { + public Multimap getAttributeModifiers() { HashMultimap modifierMap = HashMultimap.create(); - for (Entry entry : upgradeMap.entrySet()) - { + for (Entry entry : upgradeMap.entrySet()) { LivingArmourUpgrade upgrade = entry.getValue(); - if (upgrade == null) - { + if (upgrade == null) { continue; } modifierMap.putAll(upgrade.getAttributeModifiers()); @@ -90,41 +78,33 @@ public class LivingArmour implements ILivingArmour } @Override - public boolean upgradeArmour(EntityPlayer user, LivingArmourUpgrade upgrade) - { + public boolean upgradeArmour(EntityPlayer user, LivingArmourUpgrade upgrade) { String key = upgrade.getUniqueIdentifier(); - if (upgradeMap.containsKey(key)) - { + 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) - { + if (nextLevel > currentLevel) { int upgradePointDifference = upgrade.getCostOfUpgrade() - upgradeMap.get(key).getCostOfUpgrade(); - if (totalUpgradePoints + upgradePointDifference <= maxUpgradePoints) - { + if (totalUpgradePoints + upgradePointDifference <= maxUpgradePoints) { upgradeMap.put(key, upgrade); totalUpgradePoints += upgradePointDifference; notifyPlayerOfUpgrade(user, upgrade); - for (StatTracker tracker : trackerMap.values()) - { + for (StatTracker tracker : trackerMap.values()) { tracker.onArmourUpgradeAdded(upgrade); } return true; } } - } else - { + } else { int upgradePoints = upgrade.getCostOfUpgrade(); - if (totalUpgradePoints + upgradePoints <= maxUpgradePoints) - { + if (totalUpgradePoints + upgradePoints <= maxUpgradePoints) { upgradeMap.put(key, upgrade); totalUpgradePoints += upgradePoints; notifyPlayerOfUpgrade(user, upgrade); - for (StatTracker tracker : trackerMap.values()) - { + for (StatTracker tracker : trackerMap.values()) { tracker.onArmourUpgradeAdded(upgrade); } @@ -136,28 +116,22 @@ public class LivingArmour implements ILivingArmour } @Override - public boolean canApplyUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) - { + public boolean canApplyUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) { String key = upgrade.getUniqueIdentifier(); - if (upgradeMap.containsKey(key)) - { + 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) - { + if (nextLevel > currentLevel) { int upgradePointDifference = upgrade.getCostOfUpgrade() - upgradeMap.get(key).getCostOfUpgrade(); - if (totalUpgradePoints + upgradePointDifference <= maxUpgradePoints) - { + if (totalUpgradePoints + upgradePointDifference <= maxUpgradePoints) { return true; } } - } else - { + } else { int upgradePoints = upgrade.getCostOfUpgrade(); - if (totalUpgradePoints + upgradePoints <= maxUpgradePoints) - { + if (totalUpgradePoints + upgradePoints <= maxUpgradePoints) { return true; } } @@ -166,85 +140,69 @@ public class LivingArmour implements ILivingArmour } @Override - public void notifyPlayerOfUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) - { + public void notifyPlayerOfUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) { user.sendStatusMessage(new TextComponentString(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, EntityPlayer player) - { - for (Entry entry : upgradeMap.entrySet()) - { + public void onTick(World world, EntityPlayer player) { + for (Entry entry : upgradeMap.entrySet()) { LivingArmourUpgrade upgrade = entry.getValue(); - if (upgrade == null) - { + if (upgrade == null) { continue; } - if (!world.isRemote || upgrade.runOnClient()) - { + if (!world.isRemote || upgrade.runOnClient()) { upgrade.onTick(world, player, this); } } - if (world.isRemote) - { + if (world.isRemote) { return; } List allowedUpgradesList = new ArrayList(); - for (ItemStack stack : player.inventory.mainInventory) - { - if (stack != null && stack.getItem() instanceof IUpgradeTrainer) - { + for (ItemStack stack : player.inventory.mainInventory) { + if (stack != null && stack.getItem() instanceof IUpgradeTrainer) { List keyList = ((IUpgradeTrainer) stack.getItem()).getTrainedUpgrades(stack); - if (!keyList.isEmpty()) - { + if (!keyList.isEmpty()) { allowedUpgradesList.addAll(keyList); } } } - for (Entry entry : trackerMap.entrySet()) - { + for (Entry entry : trackerMap.entrySet()) { StatTracker tracker = entry.getValue(); - if (tracker == null) - { + if (tracker == null) { continue; } - if (!allowedUpgradesList.isEmpty()) - { + if (!allowedUpgradesList.isEmpty()) { boolean allowed = false; - for (String key : allowedUpgradesList) - { - if (tracker.providesUpgrade(key)) - { + for (String key : allowedUpgradesList) { + if (tracker.providesUpgrade(key)) { allowed = true; break; } } - if (!allowed) - { + if (!allowed) { tracker.onDeactivatedTick(world, player, this); continue; } } - if (tracker.onTick(world, player, this)) - { + if (tracker.onTick(world, player, this)) { List upgradeList = tracker.getUpgrades(); for (LivingArmourUpgrade upgrade : upgradeList) //TODO: make a getNextUpgrade? @@ -257,62 +215,51 @@ public class LivingArmour implements ILivingArmour } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { maxUpgradePoints = Math.max(100, tag.getInteger("maxUpgradePoints")); NBTTagList upgradeTags = tag.getTagList("upgrades", 10); - if (upgradeTags != null) - { - for (int i = 0; i < upgradeTags.tagCount(); i++) - { + if (upgradeTags != null) { + for (int i = 0; i < upgradeTags.tagCount(); i++) { NBTTagCompound upgradeTag = upgradeTags.getCompoundTagAt(i); String key = upgradeTag.getString("key"); int level = upgradeTag.getInteger("level"); NBTTagCompound nbtTag = upgradeTag.getCompoundTag("upgrade"); LivingArmourUpgrade upgrade = LivingArmourHandler.generateUpgradeFromKey(key, level, nbtTag); - if (upgrade != null) - { + if (upgrade != null) { upgradeMap.put(key, upgrade); totalUpgradePoints += upgrade.getCostOfUpgrade(); } } } - for (Class clazz : LivingArmourHandler.trackers) - { - try - { + for (Class clazz : LivingArmourHandler.trackers) { + try { Constructor ctor = clazz.getConstructor(); Object obj = ctor.newInstance(); - if (!(obj instanceof StatTracker)) - { + if (!(obj instanceof StatTracker)) { // ????? } StatTracker tracker = (StatTracker) obj; String key = tracker.getUniqueIdentifier(); NBTTagCompound trackerTag = tag.getCompoundTag(key); - if (!trackerTag.hasNoTags()) - { + if (!trackerTag.hasNoTags()) { tracker.readFromNBT(trackerTag); } trackerMap.put(key, tracker); - } catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } } } @Override - public void writeToNBT(NBTTagCompound tag, boolean forceWrite) - { + public void writeToNBT(NBTTagCompound tag, boolean forceWrite) { tag.setInteger("maxUpgradePoints", maxUpgradePoints); NBTTagList tags = new NBTTagList(); - for (Entry entry : upgradeMap.entrySet()) - { + for (Entry entry : upgradeMap.entrySet()) { NBTTagCompound upgradeTag = new NBTTagCompound(); LivingArmourUpgrade upgrade = entry.getValue(); @@ -328,19 +275,16 @@ public class LivingArmour implements ILivingArmour tag.setTag("upgrades", tags); - for (Entry entry : trackerMap.entrySet()) - { + for (Entry entry : trackerMap.entrySet()) { StatTracker tracker = entry.getValue(); - if (tracker == null) - { + if (tracker == null) { continue; } String key = tracker.getUniqueIdentifier(); - if (forceWrite || tracker.isDirty()) - { + if (forceWrite || tracker.isDirty()) { NBTTagCompound trackerTag = new NBTTagCompound(); tracker.writeToNBT(trackerTag); @@ -354,27 +298,34 @@ public class LivingArmour implements ILivingArmour /** * Writes the LivingArmour to the NBTTag. This will only write the trackers * that are dirty. - * + * * @param tag */ @Override - public void writeDirtyToNBT(NBTTagCompound tag) - { + public void writeDirtyToNBT(NBTTagCompound tag) { writeToNBT(tag, false); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { writeToNBT(tag, true); } - public static boolean hasFullSet(EntityPlayer player) - { - for (EntityEquipmentSlot slot : EntityEquipmentSlot.values()) - { - if (slot.getSlotType() != EntityEquipmentSlot.Type.ARMOR) - { + @Override + public boolean removeUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) { + String key = upgrade.getUniqueIdentifier(); + if (upgradeMap.containsKey(key)) { + upgradeMap.remove(key); + + return true; + } + + return false; + } + + public static boolean hasFullSet(EntityPlayer player) { + for (EntityEquipmentSlot slot : EntityEquipmentSlot.values()) { + if (slot.getSlotType() != EntityEquipmentSlot.Type.ARMOR) { continue; } ItemStack slotStack = player.getItemStackFromSlot(slot); @@ -384,18 +335,4 @@ public class LivingArmour implements ILivingArmour return true; } - - @Override - public boolean removeUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) - { - String key = upgrade.getUniqueIdentifier(); - if (upgradeMap.containsKey(key)) - { - upgradeMap.remove(key); - - return true; - } - - return false; - } } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java index 51bac32a..2de24a51 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java @@ -1,84 +1,71 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeBattleHungry(int level) { super(level); } - public void resetTimer() - { + public void resetTimer() { this.timer = delay[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (timer > 0) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (timer > 0) { timer--; return; } - if (player.ticksExisted % 20 == 0) - { + if (player.ticksExisted % 20 == 0) { player.addExhaustion(exhaustionAdded[this.level]); //TODO: Change exhaustion added per level. } } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.battleHunger"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger("timer", timer); } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { timer = tag.getInteger("timer"); } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "battleHunger"; } @Override - public boolean isDowngrade() - { + 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 index 489dfd4d..a187eacd 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java @@ -1,64 +1,54 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -public class LivingArmourUpgradeCrippledArm extends LivingArmourUpgrade -{ - public static final int[] costs = new int[] { -150 }; +public class LivingArmourUpgradeCrippledArm extends LivingArmourUpgrade { + public static final int[] costs = new int[]{-150}; - public LivingArmourUpgradeCrippledArm(int level) - { + public LivingArmourUpgradeCrippledArm(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.crippledArm"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 1; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "crippledArm"; } @Override - public boolean isDowngrade() - { + 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 index 22c7f835..50655a92 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java @@ -1,78 +1,65 @@ package WayofTime.bloodmagic.livingArmour.downgrade; -import java.util.HashMap; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -public class LivingArmourUpgradeDigSlowdown extends LivingArmourUpgrade -{ +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 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 LivingArmourUpgradeDigSlowdown(int level) - { + public LivingArmourUpgradeDigSlowdown(int level) { super(level); } @Override - public double getMiningSpeedModifier(EntityPlayer player) - { + public double getMiningSpeedModifier(EntityPlayer player) { return digSpeedModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.digSlowdown"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "digSlowdown"; } @Override - public boolean isDowngrade() - { + 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 index 748e46c5..90dcf8a7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java @@ -1,75 +1,63 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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.0010, 0.0012, 0.014 }; +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.0010, 0.0012, 0.014}; - public LivingArmourUpgradeDisoriented(int level) - { + public LivingArmourUpgradeDisoriented(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (world.isRemote && player.ticksExisted % 20 == 0 && world.rand.nextDouble() <= chance[this.level]) - { + public void onTick(World world, EntityPlayer 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() - { + public boolean runOnClient() { return true; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.disoriented"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "disoriented"; } @Override - public boolean isDowngrade() - { + 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 index 7bf7d5b7..f5648b37 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -3,10 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; import WayofTime.bloodmagic.api.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.EntityPlayer; @@ -16,25 +14,21 @@ 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 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) - { + public LivingArmourUpgradeMeleeDecrease(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public Multimap getAttributeModifiers() - { + public Multimap getAttributeModifiers() { Multimap modifierMap = HashMultimap.create(); String name = getUniqueIdentifier() + "-DamageModifier1"; @@ -44,44 +38,37 @@ public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.meleeDecrease"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "meleeDecrease"; } @Override - public boolean isDowngrade() - { + 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 index 57af0b42..394b308a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java @@ -1,64 +1,54 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -public class LivingArmourUpgradeQuenched extends LivingArmourUpgrade -{ - public static final int[] costs = new int[] { -100 }; +public class LivingArmourUpgradeQuenched extends LivingArmourUpgrade { + public static final int[] costs = new int[]{-100}; - public LivingArmourUpgradeQuenched(int level) - { + public LivingArmourUpgradeQuenched(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.quenched"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 1; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "quenched"; } @Override - public boolean isDowngrade() - { + 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 index aded04f5..31ddcfcc 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java @@ -1,36 +1,31 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade -{ - public static final int[] costs = new int[] { -50 }; - public static final int[] slipperyDuration = new int[] { 30 * 20 }; +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) - { + public LivingArmourUpgradeSlippery(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (world.isRemote && player.onGround) - { + public void onTick(World world, EntityPlayer 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) - { + if (player.onGround) { f6 = world.getBlockState(blockpos$pooledmutableblockpos).getBlock().slipperiness * 0.91F; } @@ -40,11 +35,9 @@ public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade float f7 = 0.16277136F / (f6 * f6 * f6); float f8; - if (player.onGround) - { + if (player.onGround) { f8 = player.getAIMoveSpeed() * f7; - } else - { + } else { f8 = player.jumpMovementFactor; } @@ -59,48 +52,40 @@ public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade } @Override - public boolean runOnClient() - { + public boolean runOnClient() { return true; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.slippery"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 1; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "slippery"; } @Override - public boolean isDowngrade() - { + 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 index 97100bee..57118a87 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java @@ -1,73 +1,62 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -public class LivingArmourUpgradeSlowHeal extends LivingArmourUpgrade -{ - public static final int[] costs = new int[] { -10, -17, -28, -42, -60, -80, -100, -125, -160, -200 }; +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 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) - { + public LivingArmourUpgradeSlowHeal(int level) { super(level); } - public double getHealingModifier() - { + public double getHealingModifier() { return healModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.slowHeal"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "slowHeal"; } @Override - public boolean isDowngrade() - { + 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 index bd1c9898..4a8827cc 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -1,33 +1,29 @@ package WayofTime.bloodmagic.livingArmour.downgrade; -import java.util.UUID; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.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.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; import org.apache.commons.codec.binary.StringUtils; -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 }; +import java.util.UUID; - public LivingArmourUpgradeSlowness(int level) - { +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() - { + public Multimap getAttributeModifiers() { Multimap modifierMap = HashMultimap.create(); String name = getUniqueIdentifier() + "-SpeedModifier1"; @@ -37,48 +33,40 @@ public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.slowness"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "slowness"; } @Override - public boolean isDowngrade() - { + 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 index 33f589b4..0b8f7788 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java @@ -1,70 +1,59 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeStormTrooper(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } - public float getArrowJiggle(EntityPlayer player) - { + public float getArrowJiggle(EntityPlayer player) { return inaccuracy[this.level]; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.stormTrooper"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "stormTrooper"; } @Override - public boolean isDowngrade() - { + 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 index a0dff362..bcb98f2a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowProtect; +import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowProtect; - -public class StatTrackerArrowProtect extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] damageRequired = new int[] { 30, 200, 400, 800, 1500, 2500, 3500, 5000, 7000, 15000 }; - - public static void incrementCounter(LivingArmour armour, double damage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.arrowProtect"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamage = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.arrowProtect"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.arrowProtect", totalDamage); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamage += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerArrowProtect extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalDamage >= damageRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalDamage >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradeArrowProtect(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerArrowProtect extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamage, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.arrowProtect"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeArrowProtect) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeArrowProtect) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index edbac486..1a408791 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowShot; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerArrowShot extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] shotsRequired = new int[] { 50, 200, 700, 1500, 3000 }; - - public static void incrementCounter(LivingArmour armour) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.trickShot"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalShots = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalShots = tag.getInteger(BloodMagic.MODID + ".tracker.trickShot"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.trickShot", totalShots); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { int change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalShots += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0); @@ -72,23 +58,18 @@ public class StatTrackerArrowShot extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 5; i++) - { - if (totalShots >= shotsRequired[i]) - { + for (int i = 0; i < 5; i++) { + if (totalShots >= shotsRequired[i]) { upgradeList.add(new LivingArmourUpgradeArrowShot(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerArrowShot extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalShots, shotsRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.arrowShot"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeArrowShot) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeArrowShot) { int level = upgrade.getUpgradeLevel(); - if (level < shotsRequired.length) - { + 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 index 2dfb8b41..4fb581c8 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeCriticalStrike; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerCriticalStrike extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] damageRequired = new int[] { 200, 800, 1300, 2500, 3800 }; - - public static void incrementCounter(LivingArmour armour, double damage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.criticalStrike"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamageDealt = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.criticalStrike"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.criticalStrike", totalDamageDealt); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamageDealt += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerCriticalStrike extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 5; i++) - { - if (totalDamageDealt >= damageRequired[i]) - { + for (int i = 0; i < 5; i++) { + if (totalDamageDealt >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradeCriticalStrike(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerCriticalStrike extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.criticalStrike"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeCriticalStrike) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeCriticalStrike) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index 5979d7c9..8d5cafe3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeDigging; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerDigging extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] blocksRequired = new int[] { 128, 512, 1024, 2048, 8192, 16000, 32000, 50000, 80000, 150000 }; - - public static void incrementCounter(LivingArmour armour) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.digging"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalBlocksDug = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalBlocksDug = tag.getInteger(BloodMagic.MODID + ".tracker.digging"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.digging", totalBlocksDug); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { int change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalBlocksDug += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0); @@ -72,23 +58,18 @@ public class StatTrackerDigging extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalBlocksDug >= blocksRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalBlocksDug >= blocksRequired[i]) { upgradeList.add(new LivingArmourUpgradeDigging(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerDigging extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalBlocksDug, blocksRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.digging"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeDigging) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeDigging) { int level = upgrade.getUpgradeLevel(); - if (level < blocksRequired.length) - { + 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 index 5a602e47..459d947a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeExperience; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerExperience extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] experienceRequired = new int[] { 100, 400, 1000, 1600, 3200, 5000, 7000, 9200, 11500, 140000 }; - - public static void incrementCounter(LivingArmour armour, int exp) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + exp : exp); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.experienced"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalExperienceGained = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalExperienceGained = tag.getDouble(BloodMagic.MODID + ".tracker.experienced"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.experienced", totalExperienceGained); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalExperienceGained += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0); @@ -72,23 +58,18 @@ public class StatTrackerExperience extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalExperienceGained >= experienceRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalExperienceGained >= experienceRequired[i]) { upgradeList.add(new LivingArmourUpgradeExperience(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerExperience extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalExperienceGained, experienceRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.experienced"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeExperience) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeExperience) { int level = upgrade.getUpgradeLevel(); - if (level < experienceRequired.length) - { + 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 index 3170af53..64440c23 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeFallProtect; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerFallProtect extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] damageRequired = new int[] { 30, 200, 400, 800, 1500 }; - - public static void incrementCounter(LivingArmour armour, double damage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.fallProtect"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamage = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.fallProtect"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.fallProtect", totalDamage); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamage += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerFallProtect extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 5; i++) - { - if (totalDamage >= damageRequired[i]) - { + for (int i = 0; i < 5; i++) { + if (totalDamage >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradeFallProtect(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerFallProtect extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamage, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.fallProtect"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeFallProtect) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeFallProtect) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index 4b37e65a..3be711ab 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java @@ -1,53 +1,45 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeFireResist; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerFireResist extends StatTracker -{ +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; - public static int[] fireTicksRequired = new int[] { 60 * 20, 3 * 60 * 20, 10 * 60 * 20, 20 * 60 * 20, 25 * 60 * 20 }; - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.fire"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalFireTicks = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalFireTicks = tag.getInteger(BloodMagic.MODID + ".tracker.fire"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.fire", totalFireTicks); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (player.isBurning()) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (player.isBurning()) { totalFireTicks++; this.markDirty(); return true; @@ -57,20 +49,16 @@ public class StatTrackerFireResist extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 5; i++) - { - if (totalFireTicks >= fireTicksRequired[i]) - { + for (int i = 0; i < 5; i++) { + if (totalFireTicks >= fireTicksRequired[i]) { upgradeList.add(new LivingArmourUpgradeFireResist(i)); } } @@ -79,25 +67,20 @@ public class StatTrackerFireResist extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalFireTicks, fireTicksRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.fireResist"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeFireResist) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeFireResist) { int level = upgrade.getUpgradeLevel(); - if (level < fireTicksRequired.length) - { + 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 index 4227f9ab..e3b35918 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java @@ -1,58 +1,51 @@ package WayofTime.bloodmagic.livingArmour.tracker; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeKnockbackResist; +import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeKnockbackResist; -import WayofTime.bloodmagic.util.Utils; - -public class StatTrackerFood extends StatTracker -{ +public class StatTrackerFood extends StatTracker { public static Map lastFoodEatenMap = new HashMap(); - public static int[] foodRequired = new int[] { 100, 200, 300, 500, 1000 }; + public static int[] foodRequired = new int[]{100, 200, 300, 500, 1000}; public int foodEaten = 0; @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.foodEaten"; } @Override - public void resetTracker() - { + public void resetTracker() { this.foodEaten = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { foodEaten = tag.getInteger(BloodMagic.MODID + ".tracker.foodEaten"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.foodEaten", foodEaten); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (!lastFoodEatenMap.containsKey(player)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (!lastFoodEatenMap.containsKey(player)) { lastFoodEatenMap.put(player, 20); return false; } @@ -61,8 +54,7 @@ public class StatTrackerFood extends StatTracker int prevFood = lastFoodEatenMap.get(player); lastFoodEatenMap.put(player, currentFood); - if (currentFood > prevFood) - { + if (currentFood > prevFood) { foodEaten += (currentFood - prevFood); markDirty(); @@ -74,23 +66,18 @@ public class StatTrackerFood extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (lastFoodEatenMap.containsKey(player)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (lastFoodEatenMap.containsKey(player)) { lastFoodEatenMap.remove(player); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < foodRequired.length; i++) - { - if (foodEaten >= foodRequired[i]) - { + for (int i = 0; i < foodRequired.length; i++) { + if (foodEaten >= foodRequired[i]) { upgradeList.add(new LivingArmourUpgradeKnockbackResist(i)); } } @@ -99,25 +86,20 @@ public class StatTrackerFood extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(foodEaten, foodRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.knockback"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeKnockbackResist) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeKnockbackResist) { int level = upgrade.getUpgradeLevel(); - if (level < foodRequired.length) - { + 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 index b0a7ffd4..e7069b4e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGraveDigger; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerGraveDigger extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] damageRequired = new int[] { 200, 800, 1300, 2500, 3800, 5000, 7000, 9200, 11500, 140000 }; - - public static void incrementCounter(LivingArmour armour, double damage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.graveDigger"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamageDealt = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.graveDigger"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.graveDigger", totalDamageDealt); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamageDealt += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerGraveDigger extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalDamageDealt >= damageRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalDamageDealt >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradeGraveDigger(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerGraveDigger extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.graveDigger"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeGraveDigger) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeGraveDigger) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index fb32dfe2..21670c1f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java @@ -1,70 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGrimReaperSprint; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerGrimReaperSprint extends StatTracker -{ +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; - 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 static void incrementCounter(LivingArmour armour) - { - StatTracker tracker = armour.getTracker(BloodMagic.MODID + ".tracker.grimReaper"); - if (tracker instanceof StatTrackerGrimReaperSprint) - { - ((StatTrackerGrimReaperSprint) tracker).totalDeaths++; - System.out.println(((StatTrackerGrimReaperSprint) tracker).totalDeaths); - tracker.markDirty(); - } -// changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.grimReaper"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDeaths = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDeaths = tag.getInteger(BloodMagic.MODID + ".tracker.grimReaper"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.grimReaper", totalDeaths); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDeaths += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0); @@ -79,23 +58,18 @@ public class StatTrackerGrimReaperSprint extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalDeaths >= deathsRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalDeaths >= deathsRequired[i]) { upgradeList.add(new LivingArmourUpgradeGrimReaperSprint(i)); } } @@ -104,28 +78,33 @@ public class StatTrackerGrimReaperSprint extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDeaths, deathsRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.grimReaper"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint) { int level = upgrade.getUpgradeLevel(); - if (level < deathsRequired.length) - { + 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++; + System.out.println(((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 index a17414aa..a5375402 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeHealthboost; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerHealthboost extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] healthedRequired = new int[] { 80, 200, 340, 540, 800, 1600, 2800, 5000, 7600, 10000 }; - - public static void incrementCounter(LivingArmour armour, double health) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + health : health); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.health"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalHealthGenned = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalHealthGenned = tag.getDouble(BloodMagic.MODID + ".tracker.health"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.health", totalHealthGenned); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalHealthGenned += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerHealthboost extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalHealthGenned >= healthedRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalHealthGenned >= healthedRequired[i]) { upgradeList.add(new LivingArmourUpgradeHealthboost(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerHealthboost extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalHealthGenned, healthedRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.health"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeHealthboost) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeHealthboost) { int level = upgrade.getUpgradeLevel(); - if (level < healthedRequired.length) - { + 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 index 4a789d1c..9d26e3c8 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java @@ -1,64 +1,51 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeJump; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerJump extends StatTracker -{ +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 static int[] jumpsRequired = new int[]{30, 200, 400, 700, 1100, 1500, 2000, 2800, 3600, 5000}; //testing public int totalJumps = 0; - public static void incrementCounter(LivingArmour armour) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.jump"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalJumps = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalJumps = tag.getInteger(BloodMagic.MODID + ".tracker.jump"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.jump", totalJumps); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { int change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalJumps += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0); @@ -73,23 +60,18 @@ public class StatTrackerJump extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalJumps >= jumpsRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalJumps >= jumpsRequired[i]) { upgradeList.add(new LivingArmourUpgradeJump(i)); } } @@ -98,28 +80,27 @@ public class StatTrackerJump extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalJumps, jumpsRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.jump"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeJump) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeJump) { int level = upgrade.getUpgradeLevel(); - if (level < jumpsRequired.length) - { + 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 index 7ecc77d2..e2ee5927 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeMeleeDamage; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerMeleeDamage extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] damageRequired = new int[] { 200, 800, 1300, 2500, 3800, 5000, 7000, 9200, 11500, 140000 }; - - public static void incrementCounter(LivingArmour armour, double damage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.meleeDamage"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamageDealt = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.meleeDamage"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.meleeDamage", totalDamageDealt); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamageDealt += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerMeleeDamage extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalDamageDealt >= damageRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalDamageDealt >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradeMeleeDamage(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerMeleeDamage extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.meleeDamage"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeMeleeDamage) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeMeleeDamage) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index fcf3b000..26ebe64b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java @@ -1,73 +1,64 @@ package WayofTime.bloodmagic.livingArmour.tracker; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSpeed; +import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSpeed; -import WayofTime.bloodmagic.util.Utils; - -public class StatTrackerMovement extends StatTracker -{ +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 static int[] blocksRequired = new int[]{200, 1000, 2000, 4000, 7000, 15000, 25000, 35000, 50000, 70000}; public double totalMovement = 0; @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.movement"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalMovement = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalMovement = tag.getDouble(BloodMagic.MODID + ".tracker.movement"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.movement", totalMovement); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (!lastPosX.containsKey(player)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (!lastPosX.containsKey(player)) { lastPosX.put(player, player.posX); lastPosZ.put(player, player.posZ); return false; } - if (!player.onGround) - { + 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) - { + if (distanceTravelled > 0.0001 && distanceTravelled < 2) { totalMovement += distanceTravelled; lastPosX.put(player, player.posX); @@ -85,20 +76,16 @@ public class StatTrackerMovement extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalMovement >= blocksRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalMovement >= blocksRequired[i]) { upgradeList.add(new LivingArmourUpgradeSpeed(i)); } } @@ -107,25 +94,20 @@ public class StatTrackerMovement extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalMovement, blocksRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.movement"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeSpeed) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeSpeed) { int level = upgrade.getUpgradeLevel(); - if (level < blocksRequired.length) - { + 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 index fdd9ad6b..1cd463bd 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java @@ -1,72 +1,57 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeNightSight; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.MobEffects; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerNightSight extends StatTracker -{ +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; - 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 static void incrementCounter(LivingArmour armour, double damage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.nightSight"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamageDealt = 0; this.totalNightVision = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.nightSight"); totalNightVision = tag.getInteger(BloodMagic.MODID + ".tracker.nightSightVision"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.nightSight", totalDamageDealt); tag.setInteger(BloodMagic.MODID + ".tracker.nightSightVision", totalNightVision); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { boolean test = false; - if (changeMap.containsKey(livingArmour)) - { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamageDealt += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -75,14 +60,12 @@ public class StatTrackerNightSight extends StatTracker } } - if (world.getLight(player.getPosition()) <= 9 && player.isPotionActive(MobEffects.NIGHT_VISION)) - { + if (world.getLight(player.getPosition()) <= 9 && player.isPotionActive(MobEffects.NIGHT_VISION)) { totalNightVision++; test = true; } - if (test) - { + if (test) { this.markDirty(); } @@ -90,28 +73,22 @@ public class StatTrackerNightSight extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - if (totalNightVision < neededNightVision) - { + if (totalNightVision < neededNightVision) { return upgradeList; } - for (int i = 0; i < 10; i++) - { - if (totalDamageDealt >= damageRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalDamageDealt >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradeNightSight(i)); } } @@ -120,29 +97,28 @@ public class StatTrackerNightSight extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.nightSight"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeNightSight) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeNightSight) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index a4f06f95..11580b8f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradePhysicalProtect; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerPhysicalProtect extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] damageRequired = new int[] { 30, 50, 80, 140, 200, 300, 400, 500, 650, 800 }; - - public static void incrementCounter(LivingArmour armour, double damage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.physicalProtect"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamage = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.physicalProtect"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.physicalProtect", totalDamage); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamage += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerPhysicalProtect extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalDamage >= damageRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalDamage >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradePhysicalProtect(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerPhysicalProtect extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamage, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.physicalProtect"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradePhysicalProtect) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradePhysicalProtect) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index 528f2eef..dd76abe2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java @@ -1,54 +1,46 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradePoisonResist; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.MobEffects; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerPoison extends StatTracker -{ +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; - public static int[] poisonTicksRequired = new int[] { 60 * 20, 3 * 60 * 20, 10 * 60 * 20, 20 * 60 * 20, 25 * 60 * 20 }; - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.poison"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalPoisonTicks = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalPoisonTicks = tag.getInteger(BloodMagic.MODID + ".tracker.poison"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.poison", totalPoisonTicks); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (player.isPotionActive(MobEffects.POISON)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (player.isPotionActive(MobEffects.POISON)) { totalPoisonTicks++; this.markDirty(); return true; @@ -58,20 +50,16 @@ public class StatTrackerPoison extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 5; i++) - { - if (totalPoisonTicks >= poisonTicksRequired[i]) - { + for (int i = 0; i < 5; i++) { + if (totalPoisonTicks >= poisonTicksRequired[i]) { upgradeList.add(new LivingArmourUpgradePoisonResist(i)); } } @@ -80,25 +68,20 @@ public class StatTrackerPoison extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalPoisonTicks, poisonTicksRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.poisonResist"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradePoisonResist) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradePoisonResist) { int level = upgrade.getUpgradeLevel(); - if (level < poisonTicksRequired.length) - { + 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 index c8457c24..d3929d36 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeRepairing; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerRepairing extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] damageRequired = new int[] { 500 }; - - public static void incrementCounter(LivingArmour armour, int receivedDamage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + receivedDamage : receivedDamage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.repair"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamage = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamage = tag.getDouble(BloodMagic.MODID + ".tracker.repair"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.repair", totalDamage); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamage += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0); @@ -72,23 +58,18 @@ public class StatTrackerRepairing extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 1; i++) - { - if (totalDamage >= damageRequired[i]) - { + for (int i = 0; i < 1; i++) { + if (totalDamage >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradeRepairing(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerRepairing extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamage, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.repair"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeRepairing) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeRepairing) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index 26448f93..fe7b7258 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java @@ -1,64 +1,51 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerSelfSacrifice extends StatTracker -{ +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 static int[] sacrificesRequired = new int[]{30, 200, 400, 700, 1100, 1500, 2000, 2800, 3600, 5000}; //testing public int totalSacrifices = 0; - public static void incrementCounter(LivingArmour armour, int hearts) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + hearts : hearts); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.selfSacrifice"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalSacrifices = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalSacrifices = tag.getInteger(BloodMagic.MODID + ".tracker.selfSacrifice"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.selfSacrifice", totalSacrifices); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { int change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalSacrifices += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0); @@ -73,23 +60,18 @@ public class StatTrackerSelfSacrifice extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalSacrifices >= sacrificesRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalSacrifices >= sacrificesRequired[i]) { upgradeList.add(new LivingArmourUpgradeSelfSacrifice(i)); } } @@ -98,28 +80,27 @@ public class StatTrackerSelfSacrifice extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalSacrifices, sacrificesRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.selfSacrifice"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) { int level = upgrade.getUpgradeLevel(); - if (level < sacrificesRequired.length) - { + 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 index 7ff2a4d7..8e2ecb20 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSolarPowered; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerSolarPowered extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] healthedRequired = new int[] { 70, 150, 300, 500, 700, 1400, 2400, 4000, 7000, 9000 }; - - public static void incrementCounter(LivingArmour armour, double health) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + health : health); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.solarPowered"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalHealthGenned = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalHealthGenned = tag.getDouble(BloodMagic.MODID + ".tracker.solarPowered"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.solarPowered", totalHealthGenned); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalHealthGenned += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerSolarPowered extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 10; i++) - { - if (totalHealthGenned >= healthedRequired[i]) - { + for (int i = 0; i < 10; i++) { + if (totalHealthGenned >= healthedRequired[i]) { upgradeList.add(new LivingArmourUpgradeSolarPowered(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerSolarPowered extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalHealthGenned, healthedRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.solarPowered"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeSolarPowered) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeSolarPowered) { int level = upgrade.getUpgradeLevel(); - if (level < healthedRequired.length) - { + 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 index a587a494..ae0451e9 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java @@ -1,63 +1,49 @@ package WayofTime.bloodmagic.livingArmour.tracker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSprintAttack; import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; -public class StatTrackerSprintAttack extends StatTracker -{ +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; - public static HashMap changeMap = new HashMap(); - public static int[] damageRequired = new int[] { 200, 800, 1300, 2500, 3800 }; - - public static void incrementCounter(LivingArmour armour, double damage) - { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } - @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.sprintAttack"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalDamageDealt = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.sprintAttack"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.sprintAttack", totalDamageDealt); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) - { + if (change > 0) { totalDamageDealt += Math.abs(changeMap.get(livingArmour)); changeMap.put(livingArmour, 0d); @@ -72,23 +58,18 @@ public class StatTrackerSprintAttack extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour)) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - for (int i = 0; i < 5; i++) - { - if (totalDamageDealt >= damageRequired[i]) - { + for (int i = 0; i < 5; i++) { + if (totalDamageDealt >= damageRequired[i]) { upgradeList.add(new LivingArmourUpgradeSprintAttack(i)); } } @@ -97,28 +78,27 @@ public class StatTrackerSprintAttack extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.sprintAttack"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeSprintAttack) - { + public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { + if (upgrade instanceof LivingArmourUpgradeSprintAttack) { int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) - { + 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 index d102438f..438f5d59 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java @@ -1,21 +1,20 @@ package WayofTime.bloodmagic.livingArmour.tracker; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeStepAssist; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeStepAssist; - -public class StatTrackerStepAssist extends StatTracker -{ +public class StatTrackerStepAssist extends StatTracker { public static Map lastPosX = new HashMap(); public static Map lastPosZ = new HashMap(); @@ -24,49 +23,41 @@ public class StatTrackerStepAssist extends StatTracker public double totalMovement = 0; @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".tracker.stepAssist"; } @Override - public void resetTracker() - { + public void resetTracker() { this.totalMovement = 0; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { totalMovement = tag.getDouble(BloodMagic.MODID + ".tracker.stepAssist"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setDouble(BloodMagic.MODID + ".tracker.stepAssist", totalMovement); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) - { - if (!lastPosX.containsKey(player)) - { + public boolean onTick(World world, EntityPlayer 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) - { + 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) - { + if (distanceTravelled > 0.0001 && distanceTravelled < 2) { double previousMovement = totalMovement; totalMovement += distanceTravelled; @@ -85,18 +76,15 @@ public class StatTrackerStepAssist extends StatTracker } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) - { + public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { } @Override - public List getUpgrades() - { + public List getUpgrades() { List upgradeList = new ArrayList(); - if (totalMovement >= blocksRequired) - { + if (totalMovement >= blocksRequired) { upgradeList.add(new LivingArmourUpgradeStepAssist(0)); } @@ -104,8 +92,7 @@ public class StatTrackerStepAssist extends StatTracker } @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) - { + public double getProgress(LivingArmour livingArmour, int currentLevel) { if (currentLevel == 1) return 1.0D; @@ -113,16 +100,13 @@ public class StatTrackerStepAssist extends StatTracker } @Override - public boolean providesUpgrade(String key) - { + public boolean providesUpgrade(String key) { return key.equals(BloodMagic.MODID + ".upgrade.stepAssist"); } @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) - { - if (upgrade instanceof LivingArmourUpgradeStepAssist) - { + 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 index b5567bea..48d96ee4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java @@ -1,26 +1,22 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeArrowProtect(int level) { super(level); } @Override - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) - { - if (source.isProjectile()) - { + public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { + if (source.isProjectile()) { return protectionLevel[this.level]; } @@ -28,38 +24,32 @@ public class LivingArmourUpgradeArrowProtect extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.arrowProtect"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index bb447592..95f9c7b4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java @@ -7,60 +7,50 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; 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 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) - { + public LivingArmourUpgradeArrowShot(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.arrowShot"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "arrowShot"; } - public int getExtraArrows() - { + 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 index 039b85a1..75ffd6b0 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java @@ -1,74 +1,63 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeCriticalStrike(int level) { super(level); } @Override - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { + public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { boolean flag = wearer.fallDistance > 0.0F && !wearer.onGround && !wearer.isOnLadder() && !wearer.isInWater() && !wearer.isPotionActive(MobEffects.BLINDNESS) && !wearer.isRiding() && !wearer.isSprinting(); - if (flag) - { + if (flag) { return getDamageModifier() * damage; } return 0; } - public double getDamageModifier() - { + public double getDamageModifier() { return damageBoost[this.level]; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.criticalStrike"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 059f6bd0..1ba86bcb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java @@ -1,90 +1,75 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import java.util.HashMap; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmour; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -public class LivingArmourUpgradeDigging extends LivingArmourUpgrade -{ +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 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 void hasDug(LivingArmour armour) - { - changeMap.put(armour, true); - } - - public LivingArmourUpgradeDigging(int level) - { + public LivingArmourUpgradeDigging(int level) { super(level); } @Override - public double getMiningSpeedModifier(EntityPlayer player) - { + public double getMiningSpeedModifier(EntityPlayer player) { return digSpeedModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (changeMap.containsKey(livingArmour) && changeMap.get(livingArmour)) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (changeMap.containsKey(livingArmour) && changeMap.get(livingArmour)) { changeMap.put(livingArmour, false); - if (digSpeedTime[this.level] > 0) - { + if (digSpeedTime[this.level] > 0) { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, digSpeedTime[this.level], digSpeedLevel[this.level], false, false)); } } } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.digging"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 2cd24cb8..7908f9d8 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java @@ -7,54 +7,45 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class LivingArmourUpgradeElytra extends LivingArmourUpgrade -{ - public static final int[] costs = new int[] { 20 }; +public class LivingArmourUpgradeElytra extends LivingArmourUpgrade { + public static final int[] costs = new int[]{20}; - public LivingArmourUpgradeElytra(int level) - { + public LivingArmourUpgradeElytra(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.elytra"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 1; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 0bf1fd38..83a98ede 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java @@ -4,54 +4,45 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; -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 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) - { + public LivingArmourUpgradeExperience(int level) { super(level); } - public double getExperienceModifier() - { + public double getExperienceModifier() { return experienceModifier[this.level]; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.experienced"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index d5da14a8..d00394dd 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -6,21 +6,17 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; -public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade -{ - public static final int[] costs = new int[] { 2, 5, 9, 15, 25 }; - public static final double[] protectionLevel = new double[] { 0.2, 0.4, 0.6, 0.8, 1 }; +public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade { + public static final int[] costs = new int[]{2, 5, 9, 15, 25}; + public static final double[] protectionLevel = new double[]{0.2, 0.4, 0.6, 0.8, 1}; - public LivingArmourUpgradeFallProtect(int level) - { + public LivingArmourUpgradeFallProtect(int level) { super(level); } @Override - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) - { - if (source.equals(DamageSource.FALL)) - { + public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { + if (source.equals(DamageSource.FALL)) { return protectionLevel[this.level]; } @@ -28,38 +24,32 @@ public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.fallProtect"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 05f94c2e..e76812e1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java @@ -1,80 +1,69 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.TextHelper; -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 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) - { + public LivingArmourUpgradeFireResist(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (player.isBurning() && fireCooldown <= 0) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (player.isBurning() && fireCooldown <= 0) { player.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, fireResistDuration[this.level])); fireCooldown = fireCooldownTime[this.level]; player.sendStatusMessage(new TextComponentString(TextHelper.localizeEffect(chatBase + "fireRemove")), true); - } else if (fireCooldown > 0) - { + } else if (fireCooldown > 0) { fireCooldown--; } } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.fireResist"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(Constants.NBT.UPGRADE_FIRE_TIMER, fireCooldown); } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { fireCooldown = tag.getInteger(Constants.NBT.UPGRADE_FIRE_TIMER); } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 34fcbc24..e7c285e9 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java @@ -1,72 +1,61 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeGraveDigger(int level) { super(level); } @Override - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { - if (!weapon.isEmpty() && weapon.getItem() instanceof ItemSpade) - { + public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + if (!weapon.isEmpty() && weapon.getItem() instanceof ItemSpade) { return getDamageModifier(); } return 0; } - public double getDamageModifier() - { + public double getDamageModifier() { return damageBoost[this.level]; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.graveDigger"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 1dde6181..e6dc11ad 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java @@ -1,91 +1,78 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.TextHelper; -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 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) - { + public LivingArmourUpgradeGrimReaperSprint(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (deathTimer > 0) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (deathTimer > 0) { deathTimer--; } } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.grimReaper"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { deathTimer = tag.getInteger(BloodMagic.MODID + ".tracker.grimReaper"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.grimReaper", deathTimer); } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "grimReaper"; } - public void applyEffectOnRebirth(EntityPlayer player) - { + public void applyEffectOnRebirth(EntityPlayer player) { player.setHealth(player.getMaxHealth() * healthOnRevive[this.level]); int strDur = strengthDuration[this.level]; - if (strDur > 0) - { + if (strDur > 0) { player.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, strDur, strengthValue[this.level])); } int resDur = resistanceDuration[this.level]; - if (resDur > 0) - { + if (resDur > 0) { player.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, resDur, resistanceValue[this.level])); } @@ -93,8 +80,7 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade player.sendStatusMessage(new TextComponentString(TextHelper.localizeEffect(chatBase + "grimReaper")), true); } - public boolean canSavePlayer(EntityPlayer player) - { + public boolean canSavePlayer(EntityPlayer 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 index ee231a07..19181cda 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -14,25 +14,21 @@ 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 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) - { + public LivingArmourUpgradeHealthboost(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public Multimap getAttributeModifiers() - { + public Multimap getAttributeModifiers() { Multimap modifierMap = HashMultimap.create(); String name = getUniqueIdentifier() + "-HealthModifier1"; @@ -42,38 +38,32 @@ public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.health"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 876a94f3..dd831b75 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java @@ -1,75 +1,63 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeJump(int level) { super(level); } - public double getJumpModifier() - { + public double getJumpModifier() { return jumpModifier[this.level]; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.jump"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (!world.isRemote) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (!world.isRemote) { double motionY = player.motionY; - if (motionY < 0) - { + if (motionY < 0) { player.fallDistance = (float) Math.max(0, player.fallDistance + motionY * fallModifier[this.level]); } } } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 461b7e04..84363286 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -11,27 +11,23 @@ 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 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) - { + public LivingArmourUpgradeKnockbackResist(int level) { super(level); } @Override - public Multimap getAttributeModifiers() - { + 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) - { + 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)); } @@ -40,38 +36,32 @@ public class LivingArmourUpgradeKnockbackResist extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.knockback"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 44ed0210..5b59193e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -14,25 +14,21 @@ 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 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) - { + public LivingArmourUpgradeMeleeDamage(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { } @Override - public Multimap getAttributeModifiers() - { + public Multimap getAttributeModifiers() { Multimap modifierMap = HashMultimap.create(); String name = getUniqueIdentifier() + "-DamageModifier1"; @@ -42,38 +38,32 @@ public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.meleeDamage"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 662c78fb..6a39ff37 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java @@ -1,6 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -8,84 +11,67 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeNightSight(int level) { super(level); } @Override - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { + public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { return isActive ? meleeDamage[this.level] : 0; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (world.getLight(player.getPosition()) <= 9) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (world.getLight(player.getPosition()) <= 9) { isActive = true; - if (player.isPotionActive(MobEffects.NIGHT_VISION)) - { + if (player.isPotionActive(MobEffects.NIGHT_VISION)) { int dur = player.getActivePotionEffect(MobEffects.NIGHT_VISION).getDuration(); - if (dur > 100 && dur < 20 * 60 * 20) - { + if (dur > 100 && dur < 20 * 60 * 20) { //Don't override the potion effect if the other potion effect is sufficiently long. return; } } player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, Constants.Misc.NIGHT_VISION_CONSTANT_BEGIN, 0, false, false)); - } else - { + } else { isActive = false; } } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.nightSight"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 44fc26a9..0cb14b98 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java @@ -6,21 +6,17 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; 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 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) - { + public LivingArmourUpgradePhysicalProtect(int level) { super(level); } @Override - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) - { - if (source.getTrueSource() != null && !source.isMagicDamage() && !source.isProjectile()) - { + public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { + if (source.getTrueSource() != null && !source.isMagicDamage() && !source.isProjectile()) { return protectionLevel[this.level]; } @@ -28,38 +24,32 @@ public class LivingArmourUpgradePhysicalProtect extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.physicalProtect"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index fb4f7af1..d5ed775f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java @@ -1,82 +1,70 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.TextHelper; -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 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) - { + public LivingArmourUpgradePoisonResist(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (player.isPotionActive(MobEffects.POISON) && poisonCooldown <= 0) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (player.isPotionActive(MobEffects.POISON) && poisonCooldown <= 0) { PotionEffect eff = player.getActivePotionEffect(MobEffects.POISON); - if (eff.getAmplifier() <= poisonMaxCure[this.level]) - { + if (eff.getAmplifier() <= poisonMaxCure[this.level]) { player.removePotionEffect(MobEffects.POISON); poisonCooldown = poisonCooldownTime[this.level]; player.sendStatusMessage(new TextComponentString(TextHelper.localize(chatBase + "poisonRemove")), true); } - } else if (poisonCooldown > 0) - { + } else if (poisonCooldown > 0) { poisonCooldown--; } } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.poisonResist"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(Constants.NBT.UPGRADE_POISON_TIMER, poisonCooldown); } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { poisonCooldown = tag.getInteger(Constants.NBT.UPGRADE_POISON_TIMER); } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index ac5469fc..8f8ec4d2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java @@ -1,87 +1,73 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade -{ - public static final int[] costs = new int[] { 15 }; - public static final int[] repairDelay = new int[] { 200 }; +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) - { + public LivingArmourUpgradeRepairing(int level) { super(level); } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (delay <= 0) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (delay <= 0) { delay = repairDelay[this.level]; EntityEquipmentSlot randomSlot = EntityEquipmentSlot.values()[2 + world.rand.nextInt(4)]; ItemStack repairStack = player.getItemStackFromSlot(randomSlot); - if (!repairStack.isEmpty()) - { - if (repairStack.isItemStackDamageable() && repairStack.isItemDamaged()) - { + if (!repairStack.isEmpty()) { + if (repairStack.isItemStackDamageable() && repairStack.isItemDamaged()) { int toRepair = Math.min(maxRepair, repairStack.getItemDamage()); - if (toRepair > 0) - { + if (toRepair > 0) { repairStack.setItemDamage(repairStack.getItemDamage() - toRepair); } } } - } else - { + } else { delay--; } } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.repair"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 1; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger("repairingDelay", delay); } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { delay = tag.getInteger("repairingDelay"); } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 7bb7c94e..acc05450 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java @@ -4,55 +4,46 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; -public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade -{ +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 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) - { + public LivingArmourUpgradeSelfSacrifice(int level) { super(level); } - public double getSacrificeModifier() - { + public double getSacrificeModifier() { return sacrificeModifier[this.level]; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.selfSacrifice"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 73787d8c..34291867 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -1,6 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -8,29 +10,23 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeSolarPowered(int level) { super(level); } @Override - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) - { - if (wearer.getEntityWorld().canSeeSky(wearer.getPosition()) || wearer.getEntityWorld().provider.isDaytime()) - { + public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { + if (wearer.getEntityWorld().canSeeSky(wearer.getPosition()) || wearer.getEntityWorld().provider.isDaytime()) { return protectionLevel[this.level]; } @@ -38,56 +34,46 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { counter++; - if (world.canSeeSky(player.getPosition()) || world.provider.isDaytime()) - { - if (counter % regenCooldown[this.level] == 0 && player.getHealth() < player.getMaxHealth()) - { + 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) - { + if (fireResistTime[this.level] != 0 && counter % fireResistCooldown[this.level] == 0) { player.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, fireResistTime[this.level], 0, false, false)); } } } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.solarPowered"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; // Set to here until I can add more upgrades to it. } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger(BloodMagic.MODID + ".tracker.solarPowered", counter); } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { counter = tag.getInteger(BloodMagic.MODID + ".tracker.solarPowered"); } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 3a2a61f5..2677eaba 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -1,8 +1,10 @@ package WayofTime.bloodmagic.livingArmour.upgrade; -import java.util.UUID; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.api.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.EntityPlayer; @@ -10,58 +12,46 @@ import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; import org.apache.commons.codec.binary.StringUtils; -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 }; +import java.util.UUID; - public LivingArmourUpgradeSpeed(int level) - { +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() - { + public double getSpeedModifier() { return speedModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (player.isSprinting()) - { - if (sprintSpeedTime[this.level] > 0) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (player.isSprinting()) { + if (sprintSpeedTime[this.level] > 0) { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, sprintSpeedTime[this.level], sprintSpeedLevel[this.level], false, false)); } - if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) - { + if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) { player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, sprintRegenTime[this.level], 0, false, false)); } } } @Override - public Multimap getAttributeModifiers() - { + 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) - { + 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)); } @@ -70,38 +60,32 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.movement"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index eae1a291..22d175b6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java @@ -1,28 +1,24 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -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 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) - { + public LivingArmourUpgradeSprintAttack(int level) { super(level); } @Override - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { - if (wearer.isSprinting()) - { + public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + if (wearer.isSprinting()) { return getDamageModifier(); } @@ -30,59 +26,49 @@ public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade } @Override - public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) - { - if (wearer.isSprinting()) - { + public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + if (wearer.isSprinting()) { return getKnockbackModifier(); } return 0; } - public double getDamageModifier() - { + public double getDamageModifier() { return damageBoost[this.level]; } - public double getKnockbackModifier() - { + public double getKnockbackModifier() { return knockbackModifier[this.level]; } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.sprintAttack"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 5; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { 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 index 3b43023c..48c8d7c6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java @@ -5,10 +5,9 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; -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 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 }; @@ -16,49 +15,41 @@ public class LivingArmourUpgradeStepAssist extends LivingArmourUpgrade // 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) - { + public LivingArmourUpgradeStepAssist(int level) { super(level); } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.stepAssist"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 1; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getUnlocalizedName() - { + public String getUnlocalizedName() { return tooltipBase + "stepAssist"; } - public float getStepAssist() - { + 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 index 9e929db6..f547c205 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java @@ -1,16 +1,15 @@ package WayofTime.bloodmagic.meteor; -import java.util.List; -import java.util.Random; - +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.util.Utils; -public class Meteor -{ +import java.util.List; +import java.util.Random; + +public class Meteor { private static final Random RAND = new Random(); private final ItemStack catalystStack; @@ -20,8 +19,7 @@ public class Meteor private final int maxWeight; public int version; - public Meteor(ItemStack catalystStack, List components, float explosionStrength, int radius) - { + public Meteor(ItemStack catalystStack, List components, float explosionStrength, int radius) { this.catalystStack = catalystStack; this.components = components; this.explosionStrength = explosionStrength; @@ -33,31 +31,24 @@ public class Meteor this.maxWeight = weight; } - public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) - { + public void generateMeteor(World world, BlockPos pos, IBlockState 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)) - { + 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); IBlockState state = world.getBlockState(newPos); - if (world.isAirBlock(newPos) || Utils.isBlockLiquid(state)) - { + if (world.isAirBlock(newPos) || Utils.isBlockLiquid(state)) { IBlockState placedState = getRandomOreFromComponents(fillerBlock, fillerChance); - if (placedState != null) - { + if (placedState != null) { world.setBlockState(newPos, placedState); } } @@ -67,21 +58,16 @@ public class Meteor } //fillerChance is the chance that the filler block will NOT be placed - public IBlockState getRandomOreFromComponents(IBlockState fillerBlock, double fillerChance) - { + public IBlockState getRandomOreFromComponents(IBlockState fillerBlock, double fillerChance) { int goal = RAND.nextInt(getMaxWeight()); - for (MeteorComponent component : getComponents()) - { + for (MeteorComponent component : getComponents()) { goal -= component.getWeight(); - if (goal < 0) - { + if (goal < 0) { IBlockState state = component.getStateFromOre(); - if (state != null) - { + if (state != null) { return state; - } else - { + } else { return RAND.nextDouble() > fillerChance ? fillerBlock : null; } } diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java index 3c4d7e5f..df810fe5 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.meteor; -import java.util.List; - +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; @@ -10,10 +9,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.util.Utils; -public class MeteorComponent -{ +import java.util.List; + +public class MeteorComponent { public int weight; public String oreName; @@ -22,33 +21,26 @@ public class MeteorComponent this.oreName = oreName; } - public IBlockState getStateFromOre() - { - if (oreName.contains(":")) - { + public IBlockState 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])) - { + 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) - { + 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 ItemBlock) - { + if (list != null && !list.isEmpty()) { + for (ItemStack stack : list) { + if (stack != null && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); IBlockState state = block.getStateFromMeta(stack.getItemDamage()); diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index b755ff3c..1c482c0d 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -17,20 +17,17 @@ import java.util.List; import java.util.Map; import java.util.Set; -public class MeteorConfigHandler -{ +public class MeteorConfigHandler { private static final Map DEFAULT_METEORS = Maps.newHashMap(); private static File meteorDir; - public static void init(File meteorDirectory) - { + public static void init(File meteorDirectory) { meteorDir = meteorDirectory; handleMeteors(true); } - public static void handleMeteors(boolean checkNewVersion) - { + public static void handleMeteors(boolean checkNewVersion) { if (meteorDir == null) { BloodMagic.instance.logger.error("Attempted to handle meteor config but the folder has not been initialized. Was this run too early?"); return; @@ -40,13 +37,10 @@ public class MeteorConfigHandler MeteorRegistry.meteorMap.clear(); List> defaultMeteors = getDefaultMeteors(); - try - { + try { // Create defaults if the folder doesn't exist - if (!meteorDir.exists() && meteorDir.mkdir()) - { - for (Pair meteor : defaultMeteors) - { + 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); @@ -62,24 +56,20 @@ public class MeteorConfigHandler List> meteors = Lists.newArrayList(); // Filter names so we can compare to defaults - for (File meteorFile : meteorFiles) - { + 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.config.getBoolean("resyncOnVersionChange", "Meteors", true, "Should the default meteors be regenerated if the mod has updated them")) - { + if (checkNewVersion && ConfigHandler.config.getBoolean("resyncOnVersionChange", "Meteors", true, "Should the default meteors be regenerated if the mod has updated them")) { Set discoveredDefaults = Sets.newHashSet(); // Check existing defaults for new version - for (Pair meteor : meteors) - { + for (Pair meteor : meteors) { Meteor defaultMeteor = DEFAULT_METEORS.get(meteor.getLeft()); - if (defaultMeteor != null) - { + if (defaultMeteor != null) { discoveredDefaults.add(meteor.getLeft()); if (defaultMeteor.version > meteor.getRight().version) { writeMeteor(meteor.getLeft(), defaultMeteor); @@ -100,16 +90,14 @@ public class MeteorConfigHandler // Finally, register all of our meteors for (Pair meteor : meteors) MeteorRegistry.registerMeteor(meteor.getRight().getCatalystStack(), meteor.getRight()); - } catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } ConfigHandler.config.save(); } - private static List> getDefaultMeteors() - { + private static List> getDefaultMeteors() { List> holders = Lists.newArrayList(); // Iron diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java index 9e7fd9aa..4550aca7 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java @@ -1,51 +1,43 @@ package WayofTime.bloodmagic.meteor; +import WayofTime.bloodmagic.api.ItemStackWrapper; +import net.minecraft.block.state.IBlockState; +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; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import WayofTime.bloodmagic.api.ItemStackWrapper; - -public class MeteorRegistry -{ +public class MeteorRegistry { public static Map meteorMap = new HashMap(); - public static void registerMeteor(ItemStack stack, Meteor holder) - { + public static void registerMeteor(ItemStack stack, Meteor holder) { ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack); - if (wrapper != null) - { + if (wrapper != null) { meteorMap.put(wrapper, holder); } } - public static void registerMeteor(ItemStack stack, List componentList, float explosionStrength, int radius) - { + public static void registerMeteor(ItemStack stack, List componentList, float explosionStrength, int radius) { Meteor holder = new Meteor(stack, componentList, explosionStrength, radius); registerMeteor(stack, holder); } - public static boolean hasMeteorForItem(ItemStack stack) - { + public static boolean hasMeteorForItem(ItemStack stack) { ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack); return wrapper != null && meteorMap.containsKey(wrapper); } - public static Meteor getMeteorForItem(ItemStack stack) - { + public static Meteor getMeteorForItem(ItemStack stack) { ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack); return wrapper != null ? meteorMap.get(wrapper) : null; } - public static void generateMeteorForItem(ItemStack stack, World world, BlockPos pos, IBlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) - { + public static void generateMeteorForItem(ItemStack stack, World world, BlockPos pos, IBlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) { Meteor holder = getMeteorForItem(stack); - if (holder != null) - { + if (holder != null) { holder.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 e0847590..98856381 100644 --- a/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java +++ b/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java @@ -1,20 +1,18 @@ package WayofTime.bloodmagic.network; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.util.ChatUtil; import net.minecraft.entity.player.EntityPlayerMP; 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 WayofTime.bloodmagic.util.ChatUtil; -public class BloodMagicPacketHandler -{ +public class BloodMagicPacketHandler { public static final SimpleNetworkWrapper INSTANCE = new SimpleNetworkWrapper(BloodMagic.MODID); - public static void init() - { + 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); @@ -25,18 +23,15 @@ public class BloodMagicPacketHandler INSTANCE.registerMessage(ItemRouterAmountPacketProcessor.class, ItemRouterAmountPacketProcessor.class, 7, Side.SERVER); } - public static void sendToAllAround(IMessage message, TileEntity te, int range) - { + 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) - { + public static void sendToAllAround(IMessage message, TileEntity te) { sendToAllAround(message, te, 64); } - public static void sendTo(IMessage message, EntityPlayerMP player) - { + public static void sendTo(IMessage message, EntityPlayerMP player) { INSTANCE.sendTo(message, player); } } diff --git a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java index 69659502..eb8b9724 100644 --- a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java @@ -1,5 +1,8 @@ package WayofTime.bloodmagic.network; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.api.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; @@ -7,63 +10,48 @@ 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; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.proxy.ClientProxy; -public class DemonAuraPacketProcessor implements IMessage, IMessageHandler -{ +public class DemonAuraPacketProcessor implements IMessage, IMessageHandler { public DemonWillHolder currentWill = new DemonWillHolder(); - public DemonAuraPacketProcessor() - { + public DemonAuraPacketProcessor() { } - public DemonAuraPacketProcessor(DemonWillHolder holder) - { + public DemonAuraPacketProcessor(DemonWillHolder holder) { this.currentWill = holder; } @Override - public void fromBytes(ByteBuf buffer) - { + public void fromBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { currentWill.willMap.put(type, buff.readDouble()); } } @Override - public void toBytes(ByteBuf buffer) - { + public void toBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { - if (currentWill.willMap.containsKey(type)) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { + if (currentWill.willMap.containsKey(type)) { buff.writeDouble(currentWill.willMap.get(type)); - } else - { + } else { buff.writeDouble(0); } } } @Override - public IMessage onMessage(DemonAuraPacketProcessor message, MessageContext ctx) - { - if (ctx.side == Side.CLIENT) - { + public IMessage onMessage(DemonAuraPacketProcessor message, MessageContext ctx) { + if (ctx.side == Side.CLIENT) { message.onMessageFromServer(); } return null; } @SideOnly(Side.CLIENT) - public void onMessageFromServer() - { + 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 index d6cc57b8..de84fd3d 100644 --- a/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java @@ -12,20 +12,17 @@ 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 -{ +public class ItemRouterAmountPacketProcessor implements IMessage, IMessageHandler { private int ghostItemSlot; private int amount; private int dimension; private BlockPos pos; - public ItemRouterAmountPacketProcessor() - { + public ItemRouterAmountPacketProcessor() { } - public ItemRouterAmountPacketProcessor(int ghostItemSlot, int amount, BlockPos pos, World world) - { + public ItemRouterAmountPacketProcessor(int ghostItemSlot, int amount, BlockPos pos, World world) { this.ghostItemSlot = ghostItemSlot; this.amount = amount; this.pos = pos; @@ -33,8 +30,7 @@ public class ItemRouterAmountPacketProcessor implements IMessage, IMessageHandle } @Override - public void fromBytes(ByteBuf buffer) - { + public void fromBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); dimension = buff.readInt(); pos = buff.readBlockPos(); @@ -43,8 +39,7 @@ public class ItemRouterAmountPacketProcessor implements IMessage, IMessageHandle } @Override - public void toBytes(ByteBuf buffer) - { + public void toBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); buff.writeInt(dimension); buff.writeBlockPos(pos); @@ -53,26 +48,21 @@ public class ItemRouterAmountPacketProcessor implements IMessage, IMessageHandle } @Override - public IMessage onMessage(ItemRouterAmountPacketProcessor message, MessageContext ctx) - { - if (ctx.side == Side.SERVER) - { + public IMessage onMessage(ItemRouterAmountPacketProcessor message, MessageContext ctx) { + if (ctx.side == Side.SERVER) { message.onMessageFromClient(); } return null; } - public void onMessageFromClient() - { + public void onMessageFromClient() { World world = DimensionManager.getWorld(dimension); - if (world != null) - { + if (world != null) { if (!world.isBlockLoaded(pos)) return; TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileFilteredRoutingNode) - { + 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 index 905af75a..e8aafad7 100644 --- a/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java @@ -12,27 +12,23 @@ 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 -{ +public class ItemRouterButtonPacketProcessor implements IMessage, IMessageHandler { private int buttonPress; private int dimension; private BlockPos pos; - public ItemRouterButtonPacketProcessor() - { + public ItemRouterButtonPacketProcessor() { } - public ItemRouterButtonPacketProcessor(int buttonPress, BlockPos pos, World world) - { + 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) - { + public void fromBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); dimension = buff.readInt(); pos = buff.readBlockPos(); @@ -40,8 +36,7 @@ public class ItemRouterButtonPacketProcessor implements IMessage, IMessageHandle } @Override - public void toBytes(ByteBuf buffer) - { + public void toBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); buff.writeInt(dimension); buff.writeBlockPos(pos); @@ -49,37 +44,28 @@ public class ItemRouterButtonPacketProcessor implements IMessage, IMessageHandle } @Override - public IMessage onMessage(ItemRouterButtonPacketProcessor message, MessageContext ctx) - { - if (ctx.side == Side.SERVER) - { + public IMessage onMessage(ItemRouterButtonPacketProcessor message, MessageContext ctx) { + if (ctx.side == Side.SERVER) { message.onMessageFromClient(); } return null; } - public void onMessageFromClient() - { + public void onMessageFromClient() { World world = DimensionManager.getWorld(dimension); - if (world != null) - { + if (world != null) { if (!world.isBlockLoaded(pos)) return; TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileFilteredRoutingNode) - { - if (buttonPress >= 6) - { - if (buttonPress == 6) - { + if (tile instanceof TileFilteredRoutingNode) { + if (buttonPress >= 6) { + if (buttonPress == 6) { ((TileFilteredRoutingNode) tile).incrementCurrentPriotiryToMaximum(9); - } else if (buttonPress == 7) - { + } else if (buttonPress == 7) { ((TileFilteredRoutingNode) tile).decrementCurrentPriority(); } - } else - { + } 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 index a41c5c70..d3620782 100644 --- a/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java @@ -9,47 +9,38 @@ 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 class KeyProcessor implements IMessage, IMessageHandler { public int keyId; public boolean showInChat; - public KeyProcessor() - { + public KeyProcessor() { } - public KeyProcessor(KeyBindings key, boolean showInChat) - { + public KeyProcessor(KeyBindings key, boolean showInChat) { this.keyId = key.ordinal(); this.showInChat = showInChat; } @Override - public void fromBytes(ByteBuf buf) - { + public void fromBytes(ByteBuf buf) { this.keyId = buf.readInt(); this.showInChat = buf.readBoolean(); } @Override - public void toBytes(ByteBuf buf) - { + public void toBytes(ByteBuf buf) { buf.writeInt(this.keyId); buf.writeBoolean(this.showInChat); } @Override - public IMessage onMessage(KeyProcessor msg, MessageContext ctx) - { + public IMessage onMessage(KeyProcessor msg, MessageContext ctx) { EntityPlayer entityPlayer = ctx.getServerHandler().player; - if (entityPlayer != null) - { + if (entityPlayer != null) { ItemStack heldStack = entityPlayer.getHeldItemMainhand(); - if (heldStack.getItem() instanceof IKeybindable) - { - if (msg.keyId < 0 || msg.keyId >= KeyBindings.values().length) - { + if (heldStack.getItem() instanceof IKeybindable) { + if (msg.keyId < 0 || msg.keyId >= KeyBindings.values().length) { return null; } KeyBindings key = KeyBindings.values()[msg.keyId]; diff --git a/src/main/java/WayofTime/bloodmagic/network/PlayerFallDistancePacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/PlayerFallDistancePacketProcessor.java index 9011f034..89dd5980 100644 --- a/src/main/java/WayofTime/bloodmagic/network/PlayerFallDistancePacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/PlayerFallDistancePacketProcessor.java @@ -7,48 +7,39 @@ 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 PlayerFallDistancePacketProcessor implements IMessage, IMessageHandler -{ +public class PlayerFallDistancePacketProcessor implements IMessage, IMessageHandler { private float fallDistance; - public PlayerFallDistancePacketProcessor() - { + public PlayerFallDistancePacketProcessor() { } - public PlayerFallDistancePacketProcessor(float fallDistance) - { + public PlayerFallDistancePacketProcessor(float fallDistance) { this.fallDistance = fallDistance; } @Override - public void fromBytes(ByteBuf buffer) - { + public void fromBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); fallDistance = buff.readFloat(); } @Override - public void toBytes(ByteBuf buffer) - { + 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) - { + public IMessage onMessage(PlayerFallDistancePacketProcessor message, MessageContext ctx) { + if (ctx.side == Side.SERVER) { message.onMessageFromClient(ctx.getServerHandler().player); } return null; } - public void onMessageFromClient(EntityPlayer player) - { + public void onMessageFromClient(EntityPlayer player) { player.fallDistance = fallDistance; } } diff --git a/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java index e9a6f608..39f1ad82 100644 --- a/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java @@ -10,27 +10,23 @@ 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 -{ +public class PlayerVelocityPacketProcessor implements IMessage, IMessageHandler { private double motionX; private double motionY; private double motionZ; - public PlayerVelocityPacketProcessor() - { + public PlayerVelocityPacketProcessor() { } - public PlayerVelocityPacketProcessor(double motionX, double motionY, double motionZ) - { + public PlayerVelocityPacketProcessor(double motionX, double motionY, double motionZ) { this.motionX = motionX; this.motionY = motionY; this.motionZ = motionZ; } @Override - public void fromBytes(ByteBuf buffer) - { + public void fromBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); motionX = buff.readDouble(); motionY = buff.readDouble(); @@ -38,8 +34,7 @@ public class PlayerVelocityPacketProcessor implements IMessage, IMessageHandler< } @Override - public void toBytes(ByteBuf buffer) - { + public void toBytes(ByteBuf buffer) { PacketBuffer buff = new PacketBuffer(buffer); buff.writeDouble(motionX); buff.writeDouble(motionY); @@ -47,18 +42,15 @@ public class PlayerVelocityPacketProcessor implements IMessage, IMessageHandler< } @Override - public IMessage onMessage(PlayerVelocityPacketProcessor message, MessageContext ctx) - { - if (ctx.side == Side.CLIENT) - { + public IMessage onMessage(PlayerVelocityPacketProcessor message, MessageContext ctx) { + if (ctx.side == Side.CLIENT) { message.onMessageFromServer(); } return null; } @SideOnly(Side.CLIENT) - public void onMessageFromServer() - { + public void onMessageFromServer() { EntityPlayer player = Minecraft.getMinecraft().player; player.motionX = motionX; player.motionY = motionY; diff --git a/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java index 909573a0..9cd7631f 100644 --- a/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java @@ -7,47 +7,39 @@ 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 -{ +public class SigilHoldingPacketProcessor implements IMessage, IMessageHandler { private int slot; private int mode; - public SigilHoldingPacketProcessor() - { + public SigilHoldingPacketProcessor() { } - public SigilHoldingPacketProcessor(int slot, int mode) - { + public SigilHoldingPacketProcessor(int slot, int mode) { this.slot = slot; this.mode = mode; } @Override - public void toBytes(ByteBuf buffer) - { + public void toBytes(ByteBuf buffer) { buffer.writeInt(slot); buffer.writeInt(mode); } @Override - public void fromBytes(ByteBuf buffer) - { + public void fromBytes(ByteBuf buffer) { slot = buffer.readInt(); mode = buffer.readInt(); } @Override - public IMessage onMessage(SigilHoldingPacketProcessor message, MessageContext ctx) - { + public IMessage onMessage(SigilHoldingPacketProcessor message, MessageContext ctx) { ItemStack itemStack = ItemStack.EMPTY; - if (message.slot > -1 && message.slot < 9) - { + if (message.slot > -1 && message.slot < 9) { itemStack = ctx.getServerHandler().player.inventory.getStackInSlot(message.slot); } - if (!itemStack.isEmpty()) - { + if (!itemStack.isEmpty()) { ItemSigilHolding.cycleToNextSigil(itemStack, message.mode); } diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index 7751ab33..cb0ea468 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -1,11 +1,9 @@ package WayofTime.bloodmagic.potion; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Random; - +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionAugmentRecipe; import net.minecraft.block.Block; import net.minecraft.block.IGrowable; import net.minecraft.block.state.IBlockState; @@ -17,24 +15,22 @@ import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionAugmentRecipe; -public class BMPotionUtils -{ +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(EntityLivingBase entity, int horizontalRadius, int verticalRadius, double damageRatio, int maxPlantsGrown) - { + public static double damageMobAndGrowSurroundingPlants(EntityLivingBase entity, int horizontalRadius, int verticalRadius, double damageRatio, int maxPlantsGrown) { World world = entity.getEntityWorld(); - if (world.isRemote) - { + if (world.isRemote) { return 0; } - if (entity.isDead) - { + if (entity.isDead) { return 0; } @@ -42,22 +38,18 @@ public class BMPotionUtils List growList = new ArrayList(); - for (int i = 0; i < maxPlantsGrown; i++) - { + 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); IBlockState state = world.getBlockState(blockPos); - if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) - { - if (state.getBlock() instanceof IGrowable) - { + if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { + if (state.getBlock() instanceof IGrowable) { growList.add(blockPos); } } } - for (BlockPos blockPos : growList) - { + for (BlockPos blockPos : growList) { Block block = world.getBlockState(blockPos).getBlock(); // if (world.rand.nextInt(50) == 0) { @@ -66,34 +58,29 @@ public class BMPotionUtils block.updateTick(world, blockPos, world.getBlockState(blockPos), world.rand); IBlockState newState = world.getBlockState(blockPos); - if (!newState.equals(preBlockState)) - { + if (!newState.equals(preBlockState)) { world.playEvent(2001, blockPos, Block.getIdFromBlock(newState.getBlock()) + (newState.getBlock().getMetaFromState(newState) << 12)); incurredDamage += damageRatio; } } } - if (incurredDamage > 0) - { + if (incurredDamage > 0) { entity.attackEntityFrom(WayofTime.bloodmagic.api.BloodMagicAPI.damageSource, (float) incurredDamage); } return incurredDamage; } - public static double getLengthAugment(ItemStack flaskStack, Potion potion) - { + public static double getLengthAugment(ItemStack flaskStack, Potion potion) { NBTHelper.checkNBT(flaskStack); NBTTagCompound tag = flaskStack.getTagCompound(); return tag.getDouble(Constants.NBT.POTION_AUGMENT_LENGHT + potion.getName()); } - public static void setLengthAugment(ItemStack flaskStack, Potion potion, double value) - { - if (value < 0) - { + public static void setLengthAugment(ItemStack flaskStack, Potion potion, double value) { + if (value < 0) { value = 0; } @@ -103,30 +90,25 @@ public class BMPotionUtils tag.setDouble(Constants.NBT.POTION_AUGMENT_LENGHT + potion.getName(), value); } - public static int getAugmentedLength(int originalLength, double lengthAugment, double powerAugment) - { + 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()) - { + public static ItemStack setEffects(ItemStack stack, Collection effects) { + if (effects.isEmpty()) { return stack; - } else - { + } else { NBTTagCompound nbttagcompound = stack.hasTagCompound() ? stack.getTagCompound() : new NBTTagCompound(); NBTTagList nbttaglist = new NBTTagList(); - for (PotionEffect potioneffect : effects) - { + for (PotionEffect potioneffect : effects) { nbttaglist.appendTag(potioneffect.writeCustomPotionEffectToNBT(new NBTTagCompound())); } @@ -136,23 +118,19 @@ public class BMPotionUtils } } - public static AlchemyTablePotionAugmentRecipe getLengthAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect, double lengthAugment) - { + public static AlchemyTablePotionAugmentRecipe getLengthAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect 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, PotionEffect baseEffect, int powerAugment) - { + public static AlchemyTablePotionAugmentRecipe getPowerAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect 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, PotionEffect baseEffect, double lengthAugment) - { + public static AlchemyTablePotionAugmentRecipe getLengthAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect 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, PotionEffect baseEffect, int powerAugment) - { + public static AlchemyTablePotionAugmentRecipe getPowerAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect 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 892ea5de..d9d552b5 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java @@ -9,55 +9,46 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -public class PotionBloodMagic extends Potion -{ +public class PotionBloodMagic extends Potion { public static ResourceLocation texture = new ResourceLocation(BloodMagic.MODID, "textures/misc/potions.png"); - public PotionBloodMagic(String name, boolean badEffect, int potionColor, int iconIndexX, int iconIndexY) - { + 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(PotionEffect effect) - { + public boolean shouldRenderInvText(PotionEffect effect) { return true; } - public PotionEffect apply(EntityLivingBase entity, int duration) - { + public PotionEffect apply(EntityLivingBase entity, int duration) { return apply(entity, duration, 0); } - public PotionEffect apply(EntityLivingBase entity, int duration, int level) - { + public PotionEffect apply(EntityLivingBase entity, int duration, int level) { PotionEffect effect = new PotionEffect(this, duration, level, false, false); entity.addPotionEffect(effect); return effect; } - public int getLevel(EntityLivingBase entity) - { + public int getLevel(EntityLivingBase entity) { PotionEffect effect = entity.getActivePotionEffect(this); - if (effect != null) - { + if (effect != null) { return effect.getAmplifier(); } return 0; } @Override - public boolean shouldRender(PotionEffect effect) - { + public boolean shouldRender(PotionEffect effect) { return true; } @Override @SideOnly(Side.CLIENT) - public int getStatusIconIndex() - { + public int getStatusIconIndex() { Minecraft.getMinecraft().renderEngine.bindTexture(texture); return super.getStatusIconIndex(); diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index fa7c6237..27911f00 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -19,14 +19,11 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.util.List; @Mod.EventBusSubscriber -public class PotionEventHandlers -{ +public class PotionEventHandlers { @SubscribeEvent - public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) - { - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) - { + public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); event.getEntityLiving().motionY += (0.1f) * (2 + i); } @@ -37,8 +34,7 @@ public class PotionEventHandlers } @SubscribeEvent - public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) - { + public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { // if (event.getEntityLiving().isPotionActive(ModPotions.boost)) // { // int i = event.getEntityLiving().getActivePotionEffect(ModPotions.boost).getAmplifier(); @@ -55,14 +51,12 @@ public class PotionEventHandlers // } // } - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.WHIRLWIND)) - { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.WHIRLWIND)) { int d0 = 3; AxisAlignedBB axisAlignedBB = new AxisAlignedBB(event.getEntityLiving().posX - 0.5, event.getEntityLiving().posY - 0.5, event.getEntityLiving().posZ - 0.5, event.getEntityLiving().posX + 0.5, event.getEntityLiving().posY + 0.5, event.getEntityLiving().posZ + 0.5).expand(d0, d0, d0); List entityList = event.getEntityLiving().getEntityWorld().getEntitiesWithinAABB(Entity.class, axisAlignedBB); - for (Entity projectile : entityList) - { + for (Entity projectile : entityList) { if (projectile == null) continue; if (!(projectile instanceof IProjectile)) @@ -89,8 +83,7 @@ public class PotionEventHandlers if (angle < 3 * (Math.PI / 4)) continue; // angle is < 135 degrees - if (throwingEntity != null) - { + if (throwingEntity != null) { delX = -projectile.posX + throwingEntity.posX; delY = -projectile.posY + (throwingEntity.posY + throwingEntity.getEyeHeight()); delZ = -projectile.posZ + throwingEntity.posZ; @@ -110,31 +103,26 @@ public class PotionEventHandlers } @SubscribeEvent - public static void onPlayerRespawn(PlayerEvent.Clone event) - { + public static void onPlayerRespawn(PlayerEvent.Clone event) { if (event.isWasDeath()) event.getEntityPlayer().addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, 400)); } @SubscribeEvent - public static void onSacrificeKnifeUsed(SacrificeKnifeUsedEvent event) - { + 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) - { + 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()) - { + public static void onEndermanTeleportEvent(EnderTeleportEvent event) { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.PLANAR_BINDING) && event.isCancelable()) { event.setCanceled(true); } } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 9b474376..3d9d0233 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,11 +1,26 @@ package WayofTime.bloodmagic.proxy; -import java.awt.Color; -import java.util.Map; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.client.helper.ShaderHelper; +import WayofTime.bloodmagic.client.hud.HUDElementDemonWillAura; +import WayofTime.bloodmagic.client.hud.HUDElementHolding; 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.tile.*; +import WayofTime.bloodmagic.tile.routing.TileRoutingNode; +import com.google.common.collect.ImmutableMap; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; @@ -24,59 +39,23 @@ 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 org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.client.helper.ShaderHelper; -import WayofTime.bloodmagic.client.hud.HUDElementDemonWillAura; -import WayofTime.bloodmagic.client.hud.HUDElementHolding; -import WayofTime.bloodmagic.client.render.LayerBloodElytra; -import WayofTime.bloodmagic.client.render.entity.BloodLightRenderFactory; -import WayofTime.bloodmagic.client.render.entity.CorruptedChickenRenderFactory; -import WayofTime.bloodmagic.client.render.entity.CorruptedSheepRenderFactory; -import WayofTime.bloodmagic.client.render.entity.CorruptedSpiderRenderFactory; -import WayofTime.bloodmagic.client.render.entity.CorruptedZombieRenderFactory; -import WayofTime.bloodmagic.client.render.entity.MeteorRenderFactory; -import WayofTime.bloodmagic.client.render.entity.MimicRenderFactory; -import WayofTime.bloodmagic.client.render.entity.SentientArrowRenderFactory; -import WayofTime.bloodmagic.client.render.entity.SentientSpecterRenderFactory; -import WayofTime.bloodmagic.client.render.entity.SoulSnareRenderFactory; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; -import WayofTime.bloodmagic.entity.mob.EntityMimic; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -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.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.tile.routing.TileRoutingNode; +import java.awt.Color; +import java.util.Map; -import com.google.common.collect.ImmutableMap; - -public class ClientProxy extends CommonProxy -{ +public class ClientProxy extends CommonProxy { public static DemonWillHolder currentAura = new DemonWillHolder(); @Override - public void preInit() - { + public void preInit() { super.preInit(); OBJLoader.INSTANCE.addDomain(BloodMagic.MODID); - ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() - { + ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() { @Override - public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) - { + public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) { chest.handleEvents(time, pastEvents); } }); @@ -94,8 +73,7 @@ public class ClientProxy extends CommonProxy } @Override - public void registerRenderers() - { + public void registerRenderers() { RenderingRegistry.registerEntityRenderingHandler(EntitySoulSnare.class, new SoulSnareRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntitySentientArrow.class, new SentientArrowRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntityBloodLight.class, new BloodLightRenderFactory()); @@ -111,17 +89,14 @@ public class ClientProxy extends CommonProxy } @Override - public void init() - { + public void init() { super.init(); Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> { - try - { + 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) - { + } catch (NumberFormatException e) { return -1; } return -1; @@ -140,17 +115,14 @@ public class ClientProxy extends CommonProxy } @Override - public void postInit() - { + public void postInit() { new HUDElementHolding(); new HUDElementDemonWillAura(); } @Override - public void tryHandleBlockModel(Block block, String name) - { - if (block instanceof IVariantProvider) - { + public void tryHandleBlockModel(Block block, String name) { + if (block instanceof IVariantProvider) { IVariantProvider variantProvider = (IVariantProvider) block; for (Pair variant : variantProvider.getVariants()) ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), variant.getLeft(), new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), variant.getRight())); @@ -158,10 +130,8 @@ public class ClientProxy extends CommonProxy } @Override - public void tryHandleItemModel(Item item, String name) - { - if (item instanceof IMeshProvider) - { + public void tryHandleItemModel(Item item, String name) { + if (item instanceof IMeshProvider) { IMeshProvider meshProvider = (IMeshProvider) item; ModelLoader.setCustomMeshDefinition(item, meshProvider.getMeshDefinition()); ResourceLocation resourceLocation = meshProvider.getCustomLocation(); @@ -169,33 +139,28 @@ public class ClientProxy extends CommonProxy resourceLocation = new ResourceLocation(BloodMagic.MODID, "item/" + name); for (String variant : meshProvider.getVariants()) ModelLoader.registerItemVariants(item, new ModelResourceLocation(resourceLocation, variant)); - } else if (item instanceof IVariantProvider) - { + } else if (item instanceof IVariantProvider) { IVariantProvider variantProvider = (IVariantProvider) item; for (Pair variant : variantProvider.getVariants()) ModelLoader.setCustomModelResourceLocation(item, variant.getLeft(), new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), variant.getRight())); } } - private void addElytraLayer() - { + private void addElytraLayer() { RenderManager renderManager = Minecraft.getMinecraft().getRenderManager(); - try - { + try { Map skinMap = ObfuscationReflectionHelper.getPrivateValue(RenderManager.class, renderManager, "skinMap", "field_178636_l"); skinMap.get("default").addLayer(new LayerBloodElytra(skinMap.get("default"))); skinMap.get("slim").addLayer(new LayerBloodElytra(skinMap.get("slim"))); BloodMagic.instance.logger.info("Elytra layer added"); - } catch (Exception e) - { + } catch (Exception e) { BloodMagic.instance.logger.error("Failed to set custom Elytra Layer for Elytra Living Armour Upgrade."); BloodMagic.instance.logger.error(e.getLocalizedMessage()); } } @Override - public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) - { + 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 index 4449daeb..636310a4 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -1,5 +1,10 @@ package WayofTime.bloodmagic.proxy; +import WayofTime.bloodmagic.api.ritual.CapabilityRuneType; +import WayofTime.bloodmagic.api.ritual.IRitualStone; +import WayofTime.bloodmagic.api.teleport.TeleportQueue; +import WayofTime.bloodmagic.fuel.FuelHandler; +import com.google.common.collect.ImmutableMap; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; @@ -9,55 +14,40 @@ import net.minecraftforge.common.animation.ITimeValue; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.model.animation.IAnimationStateMachine; import net.minecraftforge.fml.common.registry.GameRegistry; -import WayofTime.bloodmagic.api.ritual.CapabilityRuneType; -import WayofTime.bloodmagic.api.ritual.IRitualStone; -import WayofTime.bloodmagic.api.teleport.TeleportQueue; -import WayofTime.bloodmagic.fuel.FuelHandler; -import com.google.common.collect.ImmutableMap; - -public class CommonProxy -{ - public void preInit() - { +public class CommonProxy { + public void preInit() { MinecraftForge.EVENT_BUS.register(TeleportQueue.getInstance()); GameRegistry.registerFuelHandler(new FuelHandler()); registerRenderers(); } - public void init() - { + public void init() { CapabilityManager.INSTANCE.register(IRitualStone.Tile.class, new CapabilityRuneType.RuneTypeStorage(), new CapabilityRuneType.Factory()); } - public void postInit() - { + public void postInit() { } - public void registerRenderers() - { + 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) - { + 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 void tryHandleBlockModel(Block block, String name) - { + public void tryHandleBlockModel(Block block, String name) { // NO-OP } - public void tryHandleItemModel(Item item, String name) - { + public void tryHandleItemModel(Item item, String name) { // NO-OP } - public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) - { + public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) { return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index bc8e601b..971e44cb 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -1,8 +1,7 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; @@ -11,15 +10,14 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe -{ +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) - { + public AlchemyTableDyeableRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem) { super(inputItem, lpDrained, ticksRequired, tierRequired); ArrayList validDyes = new ArrayList(); @@ -36,58 +34,46 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe } @Override - public ItemStack getRecipeOutput(List inputList) - { + public ItemStack getRecipeOutput(List inputList) { int nameTagOrDyeLocation = -1; int inputItemLocation = -1; - for (int x = 0; x < inputList.size(); x++) - { + for (int x = 0; x < inputList.size(); x++) { ItemStack slot = inputList.get(x); - if (slot != null) - { + if (slot != null) { boolean match = OreDictionary.itemMatches(inputItem, slot, false); - if (match) - { + if (match) { inputItemLocation = x; - } else - { - if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) - { + } else { + if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) { nameTagOrDyeLocation = x; } } } } - if (nameTagOrDyeLocation != -1 && inputItemLocation != -1) - { + if (nameTagOrDyeLocation != -1 && inputItemLocation != -1) { ItemStack tagOrDyeStack = inputList.get(nameTagOrDyeLocation); ItemStack inputStack = inputList.get(inputItemLocation); - if (inputStack.isEmpty() || tagOrDyeStack.isEmpty()) - { + if (inputStack.isEmpty() || tagOrDyeStack.isEmpty()) { return output.copy(); } ItemStack outputStack = inputStack.copy(); - if (tagOrDyeStack.getItem() == Items.NAME_TAG) - { - if (!outputStack.hasTagCompound()) - { + if (tagOrDyeStack.getItem() == Items.NAME_TAG) { + if (!outputStack.hasTagCompound()) { outputStack.setTagCompound(new NBTTagCompound()); } outputStack.getTagCompound().setString(Constants.NBT.COLOR, tagOrDyeStack.getDisplayName()); return outputStack; - } else - { + } else { EnumDyeColor dyeColor = ItemBanner.getBaseColor(tagOrDyeStack); - if (!outputStack.hasTagCompound()) - { + if (!outputStack.hasTagCompound()) { outputStack.setTagCompound(new NBTTagCompound()); } @@ -101,32 +87,23 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe } @Override - public boolean matches(List checkedList, World world, BlockPos pos) - { + public boolean matches(List checkedList, World world, BlockPos pos) { boolean hasNameTagOrDye = false; boolean hasInputItem = false; - for (ItemStack slot : checkedList) - { - if (!slot.isEmpty()) - { + for (ItemStack slot : checkedList) { + if (!slot.isEmpty()) { boolean match = OreDictionary.itemMatches(inputItem, slot, false); - if (match && hasInputItem) - { + if (match && hasInputItem) { return false; - } else if (match) - { + } else if (match) { hasInputItem = true; - } else - { - if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) - { - if (hasNameTagOrDye) - { + } else { + if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) { + if (hasNameTagOrDye) { return false; - } else - { + } else { hasNameTagOrDye = true; } } diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java index 4b9811cb..ebd06887 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java @@ -1,27 +1,26 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import java.util.*; - +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.potion.BMPotionUtils; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionUtils; -import WayofTime.bloodmagic.potion.BMPotionUtils; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe -{ +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 Potion wantedPotion; - public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect, double lengthAugment, int powerAugment) - { + public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect, double lengthAugment, int powerAugment) { super(lpDrained, ticksRequired, tierRequired, inputItems, baseEffect); ArrayList recipe = new ArrayList(); - for (ItemStack stack : inputItems) - { + for (ItemStack stack : inputItems) { recipe.add(stack); } recipe.add(getAugmentedPotionFlask(baseEffect)); @@ -33,19 +32,15 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe this.powerAugment = powerAugment; } - public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect baseEffect, double lengthAugment, int powerAugment) - { + public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect baseEffect, double lengthAugment, int powerAugment) { this(lpDrained, ticksRequired, tierRequired, Collections.singletonList(inputItem), baseEffect, lengthAugment, powerAugment); } @Override - public boolean isPotionFlaskValidInput(ItemStack stack) - { + public boolean isPotionFlaskValidInput(ItemStack stack) { List effectList = PotionUtils.getEffectsFromStack(stack); - for (PotionEffect eff : effectList) - { - if (eff.getPotion() == wantedPotion) - { + for (PotionEffect eff : effectList) { + if (eff.getPotion() == wantedPotion) { double currentAugment = BMPotionUtils.getLengthAugment(stack, wantedPotion); return currentAugment < lengthAugment || eff.getAmplifier() < powerAugment; @@ -56,10 +51,8 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe } @Override - public ItemStack getModifiedFlaskForInput(ItemStack inputStack) - { - if (inputStack == null) - { + public ItemStack getModifiedFlaskForInput(ItemStack inputStack) { + if (inputStack == null) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); List effectList = new ArrayList(); @@ -93,8 +86,7 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe return outputStack; } - public static ItemStack getAugmentedPotionFlask(PotionEffect baseEffect) - { + public static ItemStack getAugmentedPotionFlask(PotionEffect baseEffect) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); List effectList = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index 032bff2f..bd97772c 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -1,32 +1,30 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import java.util.*; - +import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionUtils; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -public class AlchemyTablePotionRecipe extends AlchemyTableRecipe -{ +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); - protected PotionEffect baseEffect; - public static final int temporaryMaximumEffectsOnThePotionFlaskYesThisIsALongFieldItIsJustSoIRemember = 3; - + protected PotionEffect baseEffect; protected double baseAddedImpurity = 5; - public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect) - { + public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect) { super(basePotionFlaskStack, lpDrained, ticksRequired, tierRequired); ArrayList recipe = new ArrayList(); - for (ItemStack stack : inputItems) - { + for (ItemStack stack : inputItems) { recipe.add(stack); } recipe.add(basePotionFlaskStack); @@ -35,32 +33,26 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe this.baseEffect = baseEffect; } - public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect baseEffect) - { + public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect baseEffect) { this(lpDrained, ticksRequired, tierRequired, Collections.singletonList(inputItem), baseEffect); } @Override - public ItemStack getRecipeOutput(List inputList) - { + public ItemStack getRecipeOutput(List inputList) { int flaskLocation = -1; - for (int x = 0; x < inputList.size(); x++) - { + for (int x = 0; x < inputList.size(); x++) { ItemStack slot = inputList.get(x); - if (slot != null) - { + if (slot != null) { boolean match = slot.getItem() == RegistrarBloodMagicItems.POTION_FLASK; - if (match) - { + if (match) { flaskLocation = x; } } } - if (flaskLocation != -1) - { + if (flaskLocation != -1) { return getModifiedFlaskForInput(inputList.get(flaskLocation)); } @@ -68,8 +60,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe } @Override - public boolean matches(List checkedList, World world, BlockPos pos) - { + public boolean matches(List checkedList, World world, BlockPos pos) { ArrayList required = new ArrayList(input); for (ItemStack slot : checkedList) { @@ -112,18 +103,14 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe return required.isEmpty(); } - public boolean isPotionFlaskValidInput(ItemStack stack) - { + public boolean isPotionFlaskValidInput(ItemStack stack) { List effectList = PotionUtils.getEffectsFromStack(stack); - if (effectList.size() >= temporaryMaximumEffectsOnThePotionFlaskYesThisIsALongFieldItIsJustSoIRemember) - { + if (effectList.size() >= temporaryMaximumEffectsOnThePotionFlaskYesThisIsALongFieldItIsJustSoIRemember) { return false; } - for (PotionEffect eff : effectList) - { - if (eff.getPotion() == baseEffect.getPotion()) - { + for (PotionEffect eff : effectList) { + if (eff.getPotion() == baseEffect.getPotion()) { return false; } } @@ -131,10 +118,8 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe return true; } - public ItemStack getModifiedFlaskForInput(ItemStack inputStack) - { - if (inputStack.isEmpty()) - { + public ItemStack getModifiedFlaskForInput(ItemStack inputStack) { + if (inputStack.isEmpty()) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); List effectList = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java index ca58b1b7..4e0e9d18 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java @@ -1,64 +1,12 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; -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.LivingArmourUpgradeSlippery; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeSlowHeal; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeSlowness; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeStormTrooper; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerArrowShot; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerCriticalStrike; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerDigging; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerExperience; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerFallProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerFireResist; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerFood; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerGraveDigger; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerGrimReaperSprint; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerHealthboost; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerJump; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerMeleeDamage; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerMovement; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerNightSight; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerPhysicalProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerPoison; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerRepairing; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSelfSacrifice; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSolarPowered; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSprintAttack; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerStepAssist; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowShot; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeCriticalStrike; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeDigging; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeElytra; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeExperience; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeFallProtect; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeFireResist; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGraveDigger; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGrimReaperSprint; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeHealthboost; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeJump; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeKnockbackResist; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeMeleeDamage; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeNightSight; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradePhysicalProtect; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradePoisonResist; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeRepairing; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSolarPowered; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSpeed; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSprintAttack; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeStepAssist; +import WayofTime.bloodmagic.livingArmour.downgrade.*; +import WayofTime.bloodmagic.livingArmour.tracker.*; +import WayofTime.bloodmagic.livingArmour.upgrade.*; -public class ModArmourTrackers -{ - public static void init() - { +public class ModArmourTrackers { + public static void init() { LivingArmourHandler.registerStatTracker(StatTrackerMovement.class); LivingArmourHandler.registerStatTracker(StatTrackerDigging.class); LivingArmourHandler.registerStatTracker(StatTrackerPoison.class); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java index c425cfd9..fff4f109 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java @@ -1,16 +1,13 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import net.minecraft.init.Blocks; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.inversion.CorruptionHandler; +import net.minecraft.init.Blocks; -public class ModCorruptionBlocks -{ - public static void init() - { - for (EnumDemonWillType type : EnumDemonWillType.values()) - { +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 index be432487..f88962e2 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -1,20 +1,37 @@ package WayofTime.bloodmagic.registry; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.*; -import java.util.Map.Entry; - +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.alchemyArray.*; +import WayofTime.bloodmagic.api.altar.EnumAltarTier; +import WayofTime.bloodmagic.api.compress.CompressionRegistry; +import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.orb.BloodOrb; import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.api.recipe.AlchemyTableCustomRecipe; +import WayofTime.bloodmagic.api.registry.*; +import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.block.enums.EnumBloodRune; +import WayofTime.bloodmagic.client.render.alchemyArray.*; +import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; +import WayofTime.bloodmagic.compress.BaseCompressionHandler; +import WayofTime.bloodmagic.compress.StorageBlockCraftingManager; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.ItemComponent; +import WayofTime.bloodmagic.item.ItemDemonCrystal; +import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; +import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; import WayofTime.bloodmagic.item.soul.ItemSoulGem; +import WayofTime.bloodmagic.livingArmour.downgrade.*; +import WayofTime.bloodmagic.potion.BMPotionUtils; +import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableDyeableRecipe; +import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionRecipe; import WayofTime.bloodmagic.tile.TileBloodTank; +import WayofTime.bloodmagic.util.Utils; +import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableMap; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -32,63 +49,23 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.OreDictionary; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectAttractor; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBounce; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectMovement; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSigil; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSkeletonTurret; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectUpdraft; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.compress.CompressionRegistry; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.recipe.AlchemyTableCustomRecipe; -import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; -import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.api.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.api.registry.OrbRegistry; -import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -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.SingleAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.StaticAlchemyCircleRenderer; -import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; -import WayofTime.bloodmagic.compress.BaseCompressionHandler; -import WayofTime.bloodmagic.compress.StorageBlockCraftingManager; -import WayofTime.bloodmagic.item.ItemComponent; -import WayofTime.bloodmagic.item.ItemDemonCrystal; -import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; -import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; -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.Utils; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.*; +import java.util.Map.Entry; -import com.google.common.base.Stopwatch; - -public class ModRecipes -{ +public class ModRecipes { + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static final Set USED_OD_NAMES = new TreeSet<>(); public static ArrayList addedOreRecipeList = new ArrayList(); + static ItemStack mundaneLengtheningStack = ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1); + static ItemStack mundanePowerStack = ItemComponent.getStack(ItemComponent.CATALYST_POWER_1); + private static File RECIPE_DIR = null; - public static void init() - { + public static void init() { initOreDict(); addFurnaceRecipes(); // addCraftingRecipes(); @@ -101,21 +78,18 @@ public class ModRecipes addLivingArmourDowngradeRecipes(); } - public static void initOreDict() - { + public static void initOreDict() { OreDictionary.registerOre("dustIron", ItemComponent.getStack(ItemComponent.SAND_IRON)); OreDictionary.registerOre("dustGold", ItemComponent.getStack(ItemComponent.SAND_GOLD)); OreDictionary.registerOre("dustCoal", ItemComponent.getStack(ItemComponent.SAND_COAL)); } - public static void addFurnaceRecipes() - { + public static void addFurnaceRecipes() { FurnaceRecipes.instance().addSmeltingRecipe(ItemComponent.getStack(ItemComponent.SAND_IRON), new ItemStack(Items.IRON_INGOT), (float) 0.15); FurnaceRecipes.instance().addSmeltingRecipe(ItemComponent.getStack(ItemComponent.SAND_GOLD), new ItemStack(Items.GOLD_INGOT), (float) 0.15); } - public static void addCraftingRecipes() - { + public static void addCraftingRecipes() { addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE), "i i", "sgs", "sos", 'i', "ingotIron", 's', "stone", 'g', "ingotGold", 'o', "blockIron"); addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.SACRIFICIAL_DAGGER), "aaa", " ba", "c a", 'a', "blockGlass", 'b', "ingotGold", 'c', "ingotIron"); addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.ALTAR), "a a", "aba", "cdc", 'a', "stone", 'b', Blocks.FURNACE, 'c', "ingotGold", 'd', new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL)); @@ -179,10 +153,8 @@ public class ModRecipes for (int i = 1; i < EnumBloodRune.values().length; i++) addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, i)); - for (int i = 0; i < ItemSoulGem.names.length; i++) - { - for (int j = 0; j < ItemDemonCrystal.NAMES.size(); j++) - { + for (int i = 0; i < ItemSoulGem.names.length; i++) { + for (int j = 0; j < ItemDemonCrystal.NAMES.size(); j++) { ItemStack baseGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); ItemStack newGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); @@ -198,8 +170,7 @@ public class ModRecipes // GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 4, 2), "bsb", "srs", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 's', "blockGlass", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); // GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 2, 3), "bnb", "trt", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'n', "glowstone", 't', "torch", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); - for (int i = 0; i < 5; i++) - { + for (int i = 0; i < 5; i++) { ItemStack crystalStack = new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, i); ItemStack baseStoneStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_EXTRAS, 1, i); ItemStack baseStoneStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_EXTRAS, 16, i); @@ -235,8 +206,7 @@ public class ModRecipes generateConstants(); } - public static void addAltarRecipes() - { + public static void addAltarRecipes() { // ONE AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE, RegistrarBloodMagic.ORB_WEAK.getCapacity(), 2, 1); AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.DIAMOND), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE, 2000, 2, 1)); @@ -279,8 +249,7 @@ public class ModRecipes AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.GLOWSTONE), EnumRuneType.DAWN.getScribeStack(), EnumAltarTier.SIX, 200000, 100, 200)); } - public static void addAlchemyArrayRecipes() - { + public static void addAlchemyArrayRecipes() { AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_SWORD), new AlchemyArrayEffectBinding("boundSword", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD))), new BindingAlchemyCircleRenderer()); AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_AXE), new AlchemyArrayEffectBinding("boundAxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)))); AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_PICKAXE), new AlchemyArrayEffectBinding("boundPickaxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)))); @@ -325,8 +294,7 @@ public class ModRecipes } - public static void addCompressionHandlers() - { + 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)); @@ -339,8 +307,7 @@ public class ModRecipes BloodMagic.instance.logger.info("Added compression recipes in {}", stopwatch); } - public static void addSoulForgeRecipes() - { + public static void addSoulForgeRecipes() { TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), 1, 1, "dustRedstone", "ingotGold", "blockGlass", "dyeBlue"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), 60, 20, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), "gemDiamond", "blockRedstone", "blockLapis"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), 240, 50, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "gemDiamond", "blockGold", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); @@ -396,8 +363,7 @@ public class ModRecipes TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE), 400, 50, "ingotGold", "dustRedstone", "blockGlass", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); } - public static void addAlchemyTableRecipes() - { + public static void addAlchemyTableRecipes() { AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.STRING, 4), 0, 100, 0, Blocks.WOOL, Items.FLINT); AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.FLINT, 2), 0, 20, 0, Blocks.GRAVEL, Items.FLINT); AlchemyTableRecipeRegistry.registerRecipe(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); @@ -448,19 +414,15 @@ public class ModRecipes AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_POWER_1), 1000, 100, 2, "gunpowder", "cropNetherWart", "dustRedstone"); } - public static void addOreDoublingAlchemyRecipes() - { + public static void addOreDoublingAlchemyRecipes() { String[] oreList = OreDictionary.getOreNames().clone(); - for (String ore : oreList) - { - if (ore.startsWith("ore") && !addedOreRecipeList.contains(ore)) - { + 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()) - { + if (dustList != null && !dustList.isEmpty() && discoveredOres != null && !discoveredOres.isEmpty()) { ItemStack dustStack = dustList.get(0).copy(); dustStack.setCount(2); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(dustStack, 400, 200, 1, ore, ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); @@ -470,8 +432,7 @@ public class ModRecipes } } - public static void addPotionRecipes() - { + public static void addPotionRecipes() { addPotionRecipe(1000, 1, new ItemStack(Items.GHAST_TEAR), new PotionEffect(MobEffects.REGENERATION, 450)); addPotionRecipe(1000, 1, new ItemStack(Items.GOLDEN_CARROT), new PotionEffect(MobEffects.NIGHT_VISION, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.MAGMA_CREAM), new PotionEffect(MobEffects.FIRE_RESISTANCE, 2 * 60 * 20)); @@ -497,11 +458,7 @@ public class ModRecipes // AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(5000, 100, 4, new ItemStack("string"), new PotionEffect(ModPotions.bounce, 15 * 60 * 20))); } - static ItemStack mundaneLengtheningStack = ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1); - static ItemStack mundanePowerStack = ItemComponent.getStack(ItemComponent.CATALYST_POWER_1); - - public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) - { + public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(lpDrained, 100, tier, inputStack, baseEffect)); List lengtheningList = new ArrayList(); @@ -515,8 +472,7 @@ public class ModRecipes AlchemyTableRecipeRegistry.registerRecipe(BMPotionUtils.getPowerAugmentRecipe(lpDrained, 100, tier, powerList, baseEffect, 1)); } - public static void addLivingArmourDowngradeRecipes() - { + public static void addLivingArmourDowngradeRecipes() { String messageBase = "ritual.bloodmagic.downgradeRitual.dialogue."; ItemStack bowStack = new ItemStack(Items.BOW); @@ -530,18 +486,16 @@ public class ModRecipes 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 })); + 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()) - { + for (Entry> entry : dialogueMap.entrySet()) { ItemStack keyStack = entry.getKey(); String str = entry.getValue().getKey(); Map> textMap = new HashMap>(); - for (int tick : entry.getValue().getValue()) - { + for (int tick : entry.getValue().getValue()) { List textList = new ArrayList(); textList.add(new TextComponentTranslation("\u00A74%s", new TextComponentTranslation(messageBase + str + "." + tick))); textMap.put(tick, textList); @@ -559,8 +513,7 @@ public class ModRecipes LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeQuenched(0), bottleStack, Items.DRAGON_BREATH); LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeCrippledArm(0), shieldStack, "gemDiamond"); - for (int i = 0; i < 10; i++) - { + 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); @@ -570,46 +523,40 @@ public class ModRecipes } } - 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)); + 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)); } } - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - private static File RECIPE_DIR = null; - private static final Set USED_OD_NAMES = new TreeSet<>(); - private static void setupDir() { if (RECIPE_DIR == null) { RECIPE_DIR = ConfigHandler.config.getConfigFile().toPath().resolve("../recipes/").toFile(); @@ -675,8 +622,7 @@ public class ModRecipes } } - private static void addShapelessRecipe(ItemStack result, Object... components) - { + private static void addShapelessRecipe(ItemStack result, Object... components) { setupDir(); // addShapelessRecipe(result, components); @@ -768,7 +714,7 @@ public class ModRecipes GSON.toJson(json, w); } catch (IOException e) { e.printStackTrace(); - + } } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index b03ccce2..ad026e23 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.registry; -import net.minecraft.init.Blocks; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.registry.HarvestRegistry; @@ -9,35 +8,7 @@ import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; -import WayofTime.bloodmagic.ritual.RitualAltarBuilder; -import WayofTime.bloodmagic.ritual.RitualAnimalGrowth; -import WayofTime.bloodmagic.ritual.RitualArmourEvolve; -import WayofTime.bloodmagic.ritual.RitualContainment; -import WayofTime.bloodmagic.ritual.RitualCrushing; -import WayofTime.bloodmagic.ritual.RitualCrystalHarvest; -import WayofTime.bloodmagic.ritual.RitualExpulsion; -import WayofTime.bloodmagic.ritual.RitualFeatheredKnife; -import WayofTime.bloodmagic.ritual.RitualFelling; -import WayofTime.bloodmagic.ritual.RitualForsakenSoul; -import WayofTime.bloodmagic.ritual.RitualFullStomach; -import WayofTime.bloodmagic.ritual.RitualGreenGrove; -import WayofTime.bloodmagic.ritual.RitualHarvest; -import WayofTime.bloodmagic.ritual.RitualInterdiction; -import WayofTime.bloodmagic.ritual.RitualJumping; -import WayofTime.bloodmagic.ritual.RitualLava; -import WayofTime.bloodmagic.ritual.RitualLivingArmourDowngrade; -import WayofTime.bloodmagic.ritual.RitualMagnetic; -import WayofTime.bloodmagic.ritual.RitualMeteor; -import WayofTime.bloodmagic.ritual.RitualPlacer; -import WayofTime.bloodmagic.ritual.RitualPortal; -import WayofTime.bloodmagic.ritual.RitualPump; -import WayofTime.bloodmagic.ritual.RitualRegeneration; -import WayofTime.bloodmagic.ritual.RitualSpeed; -import WayofTime.bloodmagic.ritual.RitualSuppression; -import WayofTime.bloodmagic.ritual.RitualUpgradeRemove; -import WayofTime.bloodmagic.ritual.RitualWater; -import WayofTime.bloodmagic.ritual.RitualWellOfSuffering; -import WayofTime.bloodmagic.ritual.RitualZephyr; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerPlantable; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerStem; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerTall; @@ -45,9 +16,9 @@ import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualNight; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRain; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualResistance; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualZombie; +import net.minecraft.init.Blocks; -public class ModRituals -{ +public class ModRituals { public static Ritual waterRitual; public static Ritual lavaRitual; public static Ritual greenGroveRitual; @@ -71,7 +42,7 @@ public class ModRituals public static Ritual forsakenSoulRitual; public static Ritual crystalHarvestRitual; -// public static Ritual cobblestoneRitual; + // public static Ritual cobblestoneRitual; public static Ritual placerRitual; public static Ritual fellingRitual; public static Ritual pumpRitual; @@ -87,8 +58,7 @@ public class ModRituals public static ImperfectRitual imperfectResistance; public static ImperfectRitual imperfectZombie; - public static void initRituals() - { + public static void initRituals() { waterRitual = new RitualWater(); RitualRegistry.registerRitual(waterRitual, ConfigHandler.ritualWater); lavaRitual = new RitualLava(); @@ -157,8 +127,7 @@ public class ModRituals RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE), 25, 0.05); } - public static void initImperfectRituals() - { + public static void initImperfectRituals() { imperfectNight = new ImperfectRitualNight(); ImperfectRitualRegistry.registerRitual(imperfectNight, ConfigHandler.imperfectRitualNight); imperfectRain = new ImperfectRitualRain(); @@ -169,8 +138,7 @@ public class ModRituals ImperfectRitualRegistry.registerRitual(imperfectZombie, ConfigHandler.imperfectRitualZombie); } - public static void initHarvestHandlers() - { + public static void initHarvestHandlers() { HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.DIAMOND_BLOCK), 15); HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.GOLD_BLOCK), 10); HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.IRON_BLOCK), 6); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java index 0c7c8c4b..69834f08 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java @@ -1,12 +1,10 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.api.incense.IncenseTranquilityRegistry; -import WayofTime.bloodmagic.incense.*; +import WayofTime.bloodmagic.incense.TranquilityHandlers; -public class ModTranquilityHandlers -{ - public static void init() - { +public class ModTranquilityHandlers { + public static void init() { IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Plant()); IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Crop()); IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Water()); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index c765a6ca..69ccc38a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -28,115 +28,95 @@ import net.minecraftforge.items.IItemHandler; import java.util.ArrayList; import java.util.Iterator; -public class RitualAltarBuilder extends Ritual -{ +public class RitualAltarBuilder extends Ritual { private Iterator altarComponentsIterator = new ArrayList(EnumAltarTier.SIX.getAltarComponents()).iterator(); private boolean cycleDone = false; private AltarComponent currentComponent; private BlockPos currentPos; - public RitualAltarBuilder() - { + public RitualAltarBuilder() { super("ritualAltarBuilder", 0, 450, "ritual." + BloodMagic.MODID + ".altarBuilderRitual"); } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + 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()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } - if (cycleDone) - { + if (cycleDone) { altarComponentsIterator = new ArrayList(EnumAltarTier.SIX.getAltarComponents()).iterator(); } - if (world.getBlockState(altarPos).getBlock().isReplaceable(world, altarPos) && hasItem(tileEntity, Item.getItemFromBlock(RegistrarBloodMagicBlocks.ALTAR), 0, true)) - { + 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(getRefreshCost()); } - if (altarComponentsIterator.hasNext()) - { + 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(getRefreshCost()); + 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(getRefreshCost()); + } + break; } - break; - } - case BLOODRUNE: - { - BlockStack blockStack = getBloodRune(tileEntity); - if (blockStack != null) - { - world.setBlockState(currentPos, blockStack.getState(), 3); - lightning(world, currentPos); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + case BLOODRUNE: { + BlockStack blockStack = getBloodRune(tileEntity); + if (blockStack != null) { + world.setBlockState(currentPos, blockStack.getState(), 3); + lightning(world, currentPos); + masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + } + break; } - 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(getRefreshCost()); + 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(getRefreshCost()); + } + break; } - break; - } } } - } else - { + } else { cycleDone = true; } } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 75; } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 12; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); - for (int i = -12; i <= -8; i++) - { + for (int i = -12; i <= -8; i++) { addRune(components, i, -6, 13, EnumRuneType.AIR); addRune(components, i, -6, -13, EnumRuneType.FIRE); @@ -150,8 +130,7 @@ public class RitualAltarBuilder extends Ritual addRune(components, -13, 5, i, EnumRuneType.WATER); } - for (int i = 8; i <= 12; i++) - { + for (int i = 8; i <= 12; i++) { addRune(components, i, -6, 13, EnumRuneType.AIR); addRune(components, i, -6, -13, EnumRuneType.FIRE); @@ -165,13 +144,11 @@ public class RitualAltarBuilder extends Ritual addRune(components, -13, 5, i, EnumRuneType.WATER); } - for (int i = -6; i <= -4; i++) - { + for (int i = -6; i <= -4; i++) { addCornerRunes(components, 13, i, EnumRuneType.DUSK); } - for (int i = 3; i <= 5; i++) - { + for (int i = 3; i <= 5; i++) { addCornerRunes(components, 13, i, EnumRuneType.DUSK); } @@ -179,13 +156,11 @@ public class RitualAltarBuilder extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualAltarBuilder(); } - public void lightning(World world, BlockPos blockPos) - { + public void lightning(World world, BlockPos blockPos) { world.addWeatherEffect(new EntityLightningBolt(world, blockPos.getX(), blockPos.getY(), blockPos.getZ(), true)); } @@ -194,35 +169,25 @@ public class RitualAltarBuilder extends Ritual * 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, EnumFacing.DOWN)) - { + public boolean hasItem(TileEntity tileEntity, Item item, int damage, boolean consumeItem) { + if (tileEntity != null) { + if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (itemHandler.getSlots() <= 0) - { + 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()) - { + 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) - { + } 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) - { + 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; @@ -233,35 +198,26 @@ public class RitualAltarBuilder extends Ritual return false; } - public BlockStack getBloodRune(TileEntity tileEntity) - { - if (tileEntity != null) - { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) - { + public BlockStack getBloodRune(TileEntity tileEntity) { + if (tileEntity != null) { + if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (itemHandler.getSlots() <= 0) - { + if (itemHandler.getSlots() <= 0) { return null; } - for (int i = 0; i < itemHandler.getSlots(); i++) - { - if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune && itemHandler.extractItem(i, 1, true) != null) - { + for (int i = 0; i < itemHandler.getSlots(); i++) { + if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune && itemHandler.extractItem(i, 1, true) != null) { BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(EnumAltarComponent.BLOODRUNE), itemHandler.getStackInSlot(i).getItemDamage()); itemHandler.extractItem(i, 1, false); return blockStack; } } - } else if (tileEntity instanceof IInventory) - { + } 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 ItemBlock && Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { + if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune) { BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(EnumAltarComponent.BLOODRUNE), inv.getStackInSlot(i).getItemDamage()); inv.decrStackSize(i, 1); return blockStack; @@ -272,42 +228,31 @@ public class RitualAltarBuilder extends Ritual return null; } - public BlockStack getMundaneBlock(TileEntity tileEntity) - { - if (tileEntity != null) - { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) - { + public BlockStack getMundaneBlock(TileEntity tileEntity) { + if (tileEntity != null) { + if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (itemHandler.getSlots() <= 0) - { + if (itemHandler.getSlots() <= 0) { return null; } - for (int i = 0; i < itemHandler.getSlots(); i++) - { - if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune) && !itemHandler.extractItem(i, 1, true).isEmpty()) - { + for (int i = 0; i < itemHandler.getSlots(); i++) { + if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && !(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) - { + 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) - { + } 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 ItemBlock && !(Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune)) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { + if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof ItemBlock && !(Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune)) { Block block = Block.getBlockFromItem(inv.getStackInSlot(i).getItem()); - if (block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK) - { + if (block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK) { BlockStack blockStack = new BlockStack(block, inv.getStackInSlot(i).getItemDamage()); inv.decrStackSize(i, 1); return blockStack; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java index 2cecd2b5..d5671333 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java @@ -1,10 +1,11 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -16,17 +17,11 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -public class RitualAnimalGrowth extends Ritual -{ +import java.util.ArrayList; +import java.util.List; + +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; @@ -34,12 +29,10 @@ public class RitualAnimalGrowth extends Ritual public static final String GROWTH_RANGE = "growing"; public static final String CHEST_RANGE = "chest"; - - public int refreshTime = 20; public static int defaultRefreshTime = 20; + public int refreshTime = 20; - public RitualAnimalGrowth() - { + 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)); @@ -49,13 +42,11 @@ public class RitualAnimalGrowth extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -67,8 +58,7 @@ public class RitualAnimalGrowth extends Ritual AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity chest = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); IItemHandler itemHandler = null; - if (chest != null) - { + if (chest != null) { itemHandler = Utils.getInventory(chest, null); } @@ -98,58 +88,42 @@ public class RitualAnimalGrowth extends Ritual boolean performedEffect = false; - for (EntityAnimal animal : animalList) - { - if (animal.getGrowingAge() < 0) - { + for (EntityAnimal animal : animalList) { + if (animal.getGrowingAge() < 0) { animal.addGrowth(5); totalGrowths++; performedEffect = true; - } else if (animal.getGrowingAge() > 0) - { - if (decreaseBreedTimer) - { - if (vengefulWill >= vengefulWillDrain) - { + } 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 - { + } else { decreaseBreedTimer = false; } } - } else - { - if (kamikaze) - { - if (destructiveWill >= destructiveWillDrain) - { - if (!animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) - { + } else { + if (kamikaze) { + if (destructiveWill >= destructiveWillDrain) { + if (!animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { animal.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SACRIFICIAL_LAMB, 1200)); destructiveDrain += destructiveWillDrain; destructiveWill -= destructiveWillDrain; performedEffect = true; } - } else - { + } else { kamikaze = false; } } - if (breedAnimals) - { - if (steadfastWill >= steadfastWillDrain) - { - if (!animal.isInLove()) - { - for (int slot = 0; slot < itemHandler.getSlots(); slot++) - { + 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) - { + if (foodStack != null && animal.isBreedingItem(foodStack) && itemHandler.extractItem(slot, 1, true) != null) { animal.setInLove(null); itemHandler.extractItem(slot, 1, false); steadfastDrain += steadfastWillDrain; @@ -159,36 +133,30 @@ public class RitualAnimalGrowth extends Ritual } } } - } else - { + } else { breedAnimals = false; } } } - if (totalGrowths >= maxGrowths) - { + if (totalGrowths >= maxGrowths) { break; } } - if (performedEffect && consumeRawWill) - { + if (performedEffect && consumeRawWill) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawWillDrain, true); } - if (vengefulDrain > 0) - { + if (vengefulDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrain, true); } - if (steadfastDrain > 0) - { + if (steadfastDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastDrain, true); } - if (destructiveDrain > 0) - { + if (destructiveDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveDrain, true); } @@ -196,14 +164,12 @@ public class RitualAnimalGrowth extends Ritual } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 2; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addParallelRunes(components, 2, 0, EnumRuneType.DUSK); @@ -221,15 +187,13 @@ public class RitualAnimalGrowth extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualAnimalGrowth(); } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{ new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), @@ -239,15 +203,12 @@ public class RitualAnimalGrowth extends Ritual }; } - public int getBreedingDecreaseForWill(double vengefulWill) - { + public int getBreedingDecreaseForWill(double vengefulWill) { return (int) (10 + vengefulWill / 5); } - public int getRefreshTimeForRawWill(double rawWill) - { - if (rawWill >= rawWillDrain) - { + public int getRefreshTimeForRawWill(double rawWill) { + if (rawWill >= rawWillDrain) { return (int) Math.max(defaultRefreshTime - rawWill / 10, 1); } @@ -255,8 +216,7 @@ public class RitualAnimalGrowth extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return refreshTime; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java index 0872e9bc..8db309d0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java @@ -14,23 +14,19 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.List; -public class RitualArmourEvolve extends Ritual -{ +public class RitualArmourEvolve extends Ritual { public static final String CHECK_RANGE = "fillRange"; - public RitualArmourEvolve() - { + public RitualArmourEvolve() { super("ritualArmourEvolve", 0, 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - if (world.isRemote) - { + if (world.isRemote) { return; } @@ -40,16 +36,12 @@ public class RitualArmourEvolve extends Ritual List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, checkRange.getAABB(pos)); - for (EntityPlayer player : playerList) - { - if (LivingArmour.hasFullSet(player)) - { + for (EntityPlayer 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) - { + if (armour != null) { + if (armour.maxUpgradePoints < 300) { armour.maxUpgradePoints = 300; ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(chestStack, armour, true); @@ -63,20 +55,17 @@ public class RitualArmourEvolve extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 0; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.DUSK); @@ -87,8 +76,7 @@ public class RitualArmourEvolve extends Ritual this.addCornerRunes(components, 1, 3, EnumRuneType.DUSK); this.addParallelRunes(components, 1, 4, EnumRuneType.EARTH); - for (int i = 0; i < 4; i++) - { + for (int i = 0; i < 4; i++) { this.addCornerRunes(components, 3, i, EnumRuneType.EARTH); } @@ -96,8 +84,7 @@ public class RitualArmourEvolve extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualArmourEvolve(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java index 0977427b..2a8be8aa 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java @@ -12,27 +12,23 @@ import net.minecraft.world.World; import java.util.ArrayList; -public class RitualCobblestone extends Ritual -{ +public class RitualCobblestone extends Ritual { public static final String COBBLESTONE_RANGE = "cobblestoneRange"; - public RitualCobblestone() - { + 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) - { + 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()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -42,44 +38,38 @@ public class RitualCobblestone extends Ritual AreaDescriptor cobblestoneRange = getBlockRange(COBBLESTONE_RANGE); - if (tileEntity != null && tileEntity instanceof TileAlchemyArray) - { + if (tileEntity != null && tileEntity instanceof TileAlchemyArray) { TileAlchemyArray alchemyArray = (TileAlchemyArray) tileEntity; - if (!alchemyArray.getStackInSlot(0).isEmpty() && alchemyArray.getStackInSlot(0).getItem() instanceof ItemComponent) - { - 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; + if (!alchemyArray.getStackInSlot(0).isEmpty() && alchemyArray.getStackInSlot(0).getItem() instanceof ItemComponent) { + 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; + default: + break; } } } - for (BlockPos blockPos : cobblestoneRange.getContainedPositions(masterRitualStone.getBlockPos())) - { - if (world.isAirBlock(blockPos)) - { + for (BlockPos blockPos : cobblestoneRange.getContainedPositions(masterRitualStone.getBlockPos())) { + if (world.isAirBlock(blockPos)) { world.setBlockState(blockPos, block.getDefaultState()); totalEffects++; } - if (totalEffects >= maxEffects) - { + if (totalEffects >= maxEffects) { break; } } @@ -88,14 +78,12 @@ public class RitualCobblestone extends Ritual } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 25; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 1, EnumRuneType.FIRE); @@ -105,8 +93,7 @@ public class RitualCobblestone extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualCobblestone(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java index 250439a2..b5a4953e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java @@ -10,33 +10,28 @@ import net.minecraft.world.World; import java.util.ArrayList; -public class RitualContainment extends Ritual -{ +public class RitualContainment extends Ritual { public static final String CONTAINMENT_RANGE = "containmentRange"; - public RitualContainment() - { + 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } AreaDescriptor containmentRange = getBlockRange(CONTAINMENT_RANGE); - for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, containmentRange.getAABB(masterRitualStone.getBlockPos()))) - { + for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, containmentRange.getAABB(masterRitualStone.getBlockPos()))) { if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || PlayerHelper.getUUIDFromPlayer((EntityPlayer) entity).toString().equals(masterRitualStone.getOwner()))) continue; @@ -52,20 +47,17 @@ public class RitualContainment extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 1; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addParallelRunes(components, 1, 0, EnumRuneType.EARTH); @@ -77,8 +69,7 @@ public class RitualContainment extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualContainment(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index 515bf11a..ea01a579 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -1,12 +1,14 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.compress.CompressionRegistry; +import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -17,24 +19,15 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.compress.CompressionRegistry; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.util.Utils; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; -public class RitualCrushing extends Ritual -{ +public class RitualCrushing extends Ritual { public static final String CRUSHING_RANGE = "crushingRange"; public static final String CHEST_RANGE = "chest"; @@ -45,12 +38,10 @@ public class RitualCrushing extends Ritual public static Map cuttingFluidLPMap = new HashMap(); public static Map cuttingFluidWillMap = new HashMap(); - - public int refreshTime = 40; public static int defaultRefreshTime = 40; + public int refreshTime = 40; - public RitualCrushing() - { + 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)); @@ -59,20 +50,12 @@ public class RitualCrushing extends Ritual setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); } - public static void registerCuttingFluid(ItemStack stack, int lpDrain, double willDrain) - { - cuttingFluidLPMap.put(stack, lpDrain); - cuttingFluidWillMap.put(stack, willDrain); - } - @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -81,8 +64,7 @@ public class RitualCrushing extends Ritual AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); - if (tile != null && Utils.getNumberOfFreeSlots(tile, EnumFacing.DOWN) < 1) - { + if (tile != null && Utils.getNumberOfFreeSlots(tile, EnumFacing.DOWN) < 1) { return; } @@ -108,39 +90,32 @@ public class RitualCrushing extends Ritual double rawDrain = 0; - for (BlockPos newPos : crushingRange.getContainedPositions(pos)) - { - if (world.isAirBlock(newPos)) - { + for (BlockPos newPos : crushingRange.getContainedPositions(pos)) { + if (world.isAirBlock(newPos)) { continue; } IBlockState 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)) - { + 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) - { + if (useCuttingFluid) { ItemStack checkStack = block.getItem(world, newPos, state); - if (checkStack.isEmpty()) - { + if (checkStack.isEmpty()) { continue; } ItemStack copyStack = checkStack.copy(); - for (Entry entry : cuttingFluidLPMap.entrySet()) - { + for (Entry entry : cuttingFluidLPMap.entrySet()) { ItemStack cuttingStack = entry.getKey(); int lpDrain = entry.getValue(); double willDrain = cuttingFluidWillMap.containsKey(cuttingStack) ? cuttingFluidWillMap.get(cuttingStack) : 0; - if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) - { + if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) { continue; } @@ -150,26 +125,21 @@ public class RitualCrushing extends Ritual input.add(copyStack); AlchemyTableRecipe recipe = AlchemyTableRecipeRegistry.getMatchingRecipe(input, world, pos); - if (recipe == null) - { + if (recipe == null) { continue; } ItemStack result = recipe.getRecipeOutput(input); - if (result.isEmpty()) - { + if (result.isEmpty()) { continue; } - if (tile != null) - { + if (tile != null) { result = Utils.insertStackIntoTile(result, tile, EnumFacing.DOWN); - if (!result.isEmpty()) - { + if (!result.isEmpty()) { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, result); } - } else - { + } else { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, result); } @@ -183,22 +153,18 @@ public class RitualCrushing extends Ritual } } - if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, null)) - { + if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, null)) { ItemStack checkStack = block.getItem(world, newPos, state); - if (checkStack.isEmpty()) - { + if (checkStack.isEmpty()) { continue; } ItemStack copyStack = checkStack.copy(); - if (steadfastWill >= steadfastWillDrain) - { + if (steadfastWill >= steadfastWillDrain) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastWillDrain, true); steadfastWill -= steadfastWillDrain; - } else - { + } else { continue; } @@ -207,39 +173,31 @@ public class RitualCrushing extends Ritual else Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); - if (!copyStack.isEmpty()) - { + if (!copyStack.isEmpty()) { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); } - } else if (!isBlockClaimed) - { - if (fortune > 0 && destructiveWill < destructiveWillDrain) - { + } else if (!isBlockClaimed) { + if (fortune > 0 && destructiveWill < destructiveWillDrain) { fortune = 0; } List stackList = block.getDrops(world, newPos, state, fortune); - for (ItemStack item : stackList) - { + for (ItemStack item : stackList) { ItemStack copyStack = item.copy(); - if (tile != null) - { + if (tile != null) { copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); - } else - { + } else { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); continue; } - if (!copyStack.isEmpty()) - { + if (!copyStack.isEmpty()) { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); } } - if (fortune > 0) - { + if (fortune > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveWillDrain, true); destructiveWill -= destructiveWillDrain; } @@ -249,8 +207,7 @@ public class RitualCrushing extends Ritual masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); hasOperated = true; - if (consumeRawWill) - { + if (consumeRawWill) { rawDrain += rawWillDrain; rawWill -= rawWillDrain; } @@ -258,14 +215,11 @@ public class RitualCrushing extends Ritual break; } - if (hasOperated && tile != null && vengefulWill >= vengefulWillDrain) - { + if (hasOperated && tile != null && vengefulWill >= vengefulWillDrain) { Pair pair = CompressionRegistry.compressInventory(tile, world); - if (pair.getRight()) - { + if (pair.getRight()) { ItemStack returned = pair.getLeft(); - if (returned != null) - { + if (returned != null) { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, returned); } @@ -273,16 +227,13 @@ public class RitualCrushing extends Ritual } } - if (rawDrain > 0) - { + if (rawDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrain, true); } } - public int getRefreshTimeForRawWill(double rawWill) - { - if (rawWill >= rawWillDrain) - { + public int getRefreshTimeForRawWill(double rawWill) { + if (rawWill >= rawWillDrain) { return Math.max(1, (int) (40 - rawWill / 5)); } @@ -290,20 +241,17 @@ public class RitualCrushing extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return refreshTime; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 7; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addParallelRunes(components, 1, 0, EnumRuneType.EARTH); @@ -315,9 +263,8 @@ public class RitualCrushing extends Ritual } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{ new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), @@ -328,8 +275,12 @@ public class RitualCrushing extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualCrushing(); } + + public static void registerCuttingFluid(ItemStack stack, int lpDrain, double willDrain) { + cuttingFluidLPMap.put(stack, lpDrain); + cuttingFluidWillMap.put(stack, willDrain); + } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java index 797f5eed..00e1b34f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java @@ -1,25 +1,19 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.tile.TileDemonCrystal; -public class RitualCrystalHarvest extends Ritual -{ +import java.util.ArrayList; + +public class RitualCrystalHarvest extends Ritual { public static final String CRYSTAL_RANGE = "crystal"; - public RitualCrystalHarvest() - { + public RitualCrystalHarvest() { super("ritualCrystalHarvest", 0, 40000, "ritual." + BloodMagic.MODID + ".crystalHarvestRitual"); addBlockRange(CRYSTAL_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-3, 2, -3), 7, 5, 7)); @@ -27,14 +21,12 @@ public class RitualCrystalHarvest extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos pos = masterRitualStone.getBlockPos(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -45,20 +37,16 @@ public class RitualCrystalHarvest extends Ritual AreaDescriptor crystalRange = getBlockRange(CRYSTAL_RANGE); crystalRange.resetIterator(); - while (crystalRange.hasNext()) - { + while (crystalRange.hasNext()) { BlockPos nextPos = crystalRange.next().add(pos); TileEntity tile = world.getTileEntity(nextPos); - if (tile instanceof TileDemonCrystal) - { + if (tile instanceof TileDemonCrystal) { TileDemonCrystal demonCrystal = (TileDemonCrystal) tile; - if (demonCrystal.dropSingleCrystal()) - { + if (demonCrystal.dropSingleCrystal()) { IBlockState state = world.getBlockState(nextPos); world.notifyBlockUpdate(nextPos, state, state, 3); totalEffects++; - if (totalEffects >= maxEffects) - { + if (totalEffects >= maxEffects) { break; } } @@ -69,20 +57,17 @@ public class RitualCrystalHarvest extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 25; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 50; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); @@ -99,8 +84,7 @@ public class RitualCrystalHarvest extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualCrystalHarvest(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index e0e30068..9cc17048 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -1,10 +1,11 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.Utils; +import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -18,36 +19,26 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.util.Utils; -import com.google.common.base.Strings; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; -public class RitualExpulsion extends Ritual -{ +public class RitualExpulsion extends Ritual { public static final String EXPULSION_RANGE = "expulsionRange"; - public RitualExpulsion() - { + 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -61,16 +52,12 @@ public class RitualExpulsion extends Ritual BlockPos masterPos = masterRitualStone.getBlockPos(); TileEntity tile = world.getTileEntity(masterPos.up()); - if (tile != null) - { + if (tile != null) { IItemHandler handler = Utils.getInventory(tile, null); - if (handler != null) - { - for (int i = 0; i < handler.getSlots(); i++) - { + if (handler != null) { + for (int i = 0; i < handler.getSlots(); i++) { ItemStack itemStack = handler.getStackInSlot(i); - if (itemStack != null && itemStack.getItem() instanceof IBindable) - { + if (itemStack != null && itemStack.getItem() instanceof IBindable) { IBindable bindable = (IBindable) itemStack.getItem(); if (!Strings.isNullOrEmpty(bindable.getOwnerName(itemStack)) && !allowedNames.contains(bindable.getOwnerName(itemStack))) allowedNames.add(bindable.getOwnerUUID(itemStack)); @@ -81,8 +68,7 @@ public class RitualExpulsion extends Ritual final int teleportDistance = 100; - for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, expulsionRange.getAABB(masterRitualStone.getBlockPos()))) - { + for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, expulsionRange.getAABB(masterRitualStone.getBlockPos()))) { if (player.capabilities.isCreativeMode || PlayerHelper.getUUIDFromPlayer(player).toString().equals(masterRitualStone.getOwner()) || allowedNames.contains(PlayerHelper.getUUIDFromPlayer(player).toString())) continue; @@ -93,10 +79,8 @@ public class RitualExpulsion extends Ritual allowedNames.clear(); } - public boolean teleportRandomly(EntityLivingBase entityLiving, double distance) - { - if (entityLiving instanceof EntityPlayer) - { + public boolean teleportRandomly(EntityLivingBase entityLiving, double distance) { + if (entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entityLiving; if (player.capabilities.isCreativeMode) return false; @@ -111,8 +95,7 @@ public class RitualExpulsion extends Ritual double randZ = z + (rand.nextDouble() - 0.5D) * distance; int i = 0; - while (!teleportTo(entityLiving, randX, randY, randZ, x, y, z) && i < 100) - { + 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; @@ -122,12 +105,10 @@ public class RitualExpulsion extends Ritual return i >= 100; } - public boolean teleportTo(EntityLivingBase entityLiving, double par1, double par3, double par5, double lastX, double lastY, double lastZ) - { + public boolean teleportTo(EntityLivingBase entityLiving, double par1, double par3, double par5, double lastX, double lastY, double lastZ) { EnderTeleportEvent event = new EnderTeleportEvent(entityLiving, par1, par3, par5, 0); - if (MinecraftForge.EVENT_BUS.post(event)) - { + if (MinecraftForge.EVENT_BUS.post(event)) { return false; } @@ -138,43 +119,34 @@ public class RitualExpulsion extends Ritual int k = MathHelper.floor(entityLiving.posZ); int l; - if (!entityLiving.getEntityWorld().isAirBlock(new BlockPos(i, j, k))) - { + if (!entityLiving.getEntityWorld().isAirBlock(new BlockPos(i, j, k))) { boolean flag1 = false; - while (!flag1 && j > 0) - { + while (!flag1 && j > 0) { IBlockState state = entityLiving.getEntityWorld().getBlockState(new BlockPos(i, j - 1, k)); - if (state.getMaterial().blocksMovement()) - { + if (state.getMaterial().blocksMovement()) { flag1 = true; - } else - { + } else { --entityLiving.posY; --j; } } - if (flag1) - { + if (flag1) { moveEntityViaTeleport(entityLiving, entityLiving.posX, entityLiving.posY, entityLiving.posZ); - if (!entityLiving.isCollided && !entityLiving.getEntityWorld().containsAnyLiquid(entityLiving.getEntityBoundingBox())) - { + if (!entityLiving.isCollided && !entityLiving.getEntityWorld().containsAnyLiquid(entityLiving.getEntityBoundingBox())) { flag = true; } } } - if (!flag) - { + if (!flag) { moveEntityViaTeleport(entityLiving, lastX, lastY, lastZ); return false; - } else - { - for (l = 0; l < 128; ++l) - { + } 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; @@ -189,49 +161,39 @@ public class RitualExpulsion extends Ritual } } - public void moveEntityViaTeleport(EntityLivingBase entityLiving, double x, double y, double z) - { - if (entityLiving != null && entityLiving instanceof EntityPlayer) - { - if (entityLiving instanceof EntityPlayerMP) - { + public void moveEntityViaTeleport(EntityLivingBase entityLiving, double x, double y, double z) { + if (entityLiving != null && entityLiving instanceof EntityPlayer) { + if (entityLiving instanceof EntityPlayerMP) { EntityPlayerMP entityplayermp = (EntityPlayerMP) entityLiving; - if (entityplayermp.getEntityWorld() == entityLiving.getEntityWorld()) - { + if (entityplayermp.getEntityWorld() == entityLiving.getEntityWorld()) { EnderTeleportEvent event = new EnderTeleportEvent(entityplayermp, x, y, z, 5.0F); - if (!MinecraftForge.EVENT_BUS.post(event)) - { - if (entityLiving.isRiding()) - { + if (!MinecraftForge.EVENT_BUS.post(event)) { + if (entityLiving.isRiding()) { entityplayermp.mountEntityAndWakeUp(); } entityLiving.setPositionAndUpdate(event.getTargetX(), event.getTargetY(), event.getTargetZ()); } } } - } else if (entityLiving != null) - { + } else if (entityLiving != null) { entityLiving.setPosition(x, y, z); } } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 2; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 2, 0, EnumRuneType.EARTH); @@ -275,8 +237,7 @@ public class RitualExpulsion extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualExpulsion(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index 82b330e3..60dce160 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -1,10 +1,17 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.api.altar.IBloodAltar; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.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.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; @@ -15,23 +22,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; -public class RitualFeatheredKnife extends Ritual -{ +import java.util.ArrayList; +import java.util.List; + +public class RitualFeatheredKnife extends Ritual { public static final String ALTAR_RANGE = "altar"; public static final String DAMAGE_RANGE = "damage"; @@ -40,14 +35,11 @@ public class RitualFeatheredKnife extends Ritual public static double corrosiveWillThreshold = 10; public static double steadfastWillThreshold = 10; public static double vengefulWillThreshold = 10; - - public int refreshTime = 20; public static int defaultRefreshTime = 20; - + public int refreshTime = 20; public BlockPos altarOffsetPos = new BlockPos(0, 0, 0); //TODO: Save! - public RitualFeatheredKnife() - { + 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)); @@ -57,13 +49,11 @@ public class RitualFeatheredKnife extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -91,13 +81,10 @@ public class RitualFeatheredKnife extends Ritual AreaDescriptor altarRange = getBlockRange(ALTAR_RANGE); - if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof IBloodAltar)) - { - for (BlockPos newPos : altarRange.getContainedPositions(pos)) - { + if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof IBloodAltar)) { + for (BlockPos newPos : altarRange.getContainedPositions(pos)) { TileEntity nextTile = world.getTileEntity(newPos); - if (nextTile instanceof IBloodAltar) - { + if (nextTile instanceof IBloodAltar) { tile = nextTile; altarOffsetPos = newPos.subtract(pos); @@ -109,8 +96,7 @@ public class RitualFeatheredKnife extends Ritual boolean useIncense = corrosiveWill >= corrosiveWillThreshold; - if (tile instanceof IBloodAltar) - { + if (tile instanceof IBloodAltar) { IBloodAltar tileAltar = (IBloodAltar) tile; AreaDescriptor damageRange = getBlockRange(DAMAGE_RANGE); @@ -120,12 +106,10 @@ public class RitualFeatheredKnife extends Ritual List entities = world.getEntitiesWithinAABB(EntityPlayer.class, range); - for (EntityPlayer player : entities) - { + for (EntityPlayer player : entities) { float healthThreshold = steadfastWill >= steadfastWillThreshold ? 0.7f : 0.3f; - if (vengefulWill >= vengefulWillThreshold && !player.getUniqueID().toString().equals(masterRitualStone.getOwner())) - { + if (vengefulWill >= vengefulWillThreshold && !player.getUniqueID().toString().equals(masterRitualStone.getOwner())) { healthThreshold = 0.1f; } @@ -135,10 +119,8 @@ public class RitualFeatheredKnife extends Ritual float sacrificedHealth = 1; double lpModifier = 1; - if ((health / player.getMaxHealth() > healthThreshold) && (!useIncense || !player.isPotionActive(RegistrarBloodMagic.SOUL_FRAY))) - { - if (useIncense) - { + if ((health / player.getMaxHealth() > healthThreshold) && (!useIncense || !player.isPotionActive(RegistrarBloodMagic.SOUL_FRAY))) { + if (useIncense) { double incenseAmount = PlayerSacrificeHelper.getPlayerIncense(player); sacrificedHealth = health - maxHealth * healthThreshold; @@ -148,23 +130,19 @@ public class RitualFeatheredKnife extends Ritual player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, PlayerSacrificeHelper.soulFrayDuration)); } - if (destructiveWill >= destructiveWillDrain * sacrificedHealth) - { + if (destructiveWill >= destructiveWillDrain * sacrificedHealth) { lpModifier *= getLPModifierForWill(destructiveWill); destructiveWill -= destructiveWillDrain * sacrificedHealth; destructiveDrain += destructiveWillDrain * sacrificedHealth; } - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.selfSacrifice", chestStack); - if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) - { + if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) { double modifier = ((LivingArmourUpgradeSelfSacrifice) upgrade).getSacrificeModifier(); lpModifier *= (1 + modifier); @@ -178,42 +156,36 @@ public class RitualFeatheredKnife extends Ritual totalEffects++; - if (totalEffects >= maxEffects) - { + if (totalEffects >= maxEffects) { break; } } } - if (destructiveDrain > 0) - { + if (destructiveDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, destructiveDrain, true); } } masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); - if (totalEffects > 0 && consumeRawWill) - { + if (totalEffects > 0 && consumeRawWill) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawWillDrain, true); } } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return refreshTime; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 20; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addParallelRunes(components, 1, 0, EnumRuneType.DUSK); @@ -228,26 +200,21 @@ public class RitualFeatheredKnife extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualFeatheredKnife(); } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") }; + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info")}; } - public double getLPModifierForWill(double destructiveWill) - { + public double getLPModifierForWill(double destructiveWill) { return 1 + destructiveWill * 0.2 / 100; } - public int getRefreshTimeForRawWill(double rawWill) - { - if (rawWill >= rawWillDrain) - { + public int getRefreshTimeForRawWill(double rawWill) { + if (rawWill >= rawWillDrain) { return 10; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java index fd8a1e74..52c22bf5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java @@ -7,8 +7,8 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; @@ -17,8 +17,7 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Iterator; -public class RitualFelling extends Ritual -{ +public class RitualFelling extends Ritual { public static final String FELLING_RANGE = "fellingRange"; public static final String CHEST_RANGE = "chest"; @@ -28,8 +27,7 @@ public class RitualFelling extends Ritual private boolean cached = false; private BlockPos currentPos; - public RitualFelling() - { + 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)); @@ -41,8 +39,7 @@ public class RitualFelling extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); @@ -50,19 +47,15 @@ public class RitualFelling extends Ritual AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } - if (!cached || treePartsCache.isEmpty()) - { - for (BlockPos blockPos : getBlockRange(FELLING_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) - { + if (!cached || treePartsCache.isEmpty()) { + for (BlockPos blockPos : 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))) - { + if (!world.isAirBlock(blockPos) && (world.getBlockState(blockPos).getBlock().isWood(world, blockPos) || world.getBlockState(blockPos).getBlock().isLeaves(world.getBlockState(blockPos), world, blockPos))) { treePartsCache.add(blockPos); } } @@ -71,8 +64,7 @@ public class RitualFelling extends Ritual blockPosIterator = treePartsCache.iterator(); } - if (blockPosIterator.hasNext() && tileInventory != null) - { + if (blockPosIterator.hasNext() && tileInventory != null) { masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); currentPos = blockPosIterator.next(); IItemHandler inventory = Utils.getInventory(tileInventory, EnumFacing.DOWN); @@ -83,20 +75,17 @@ public class RitualFelling extends Ritual } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 10; } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); addCornerRunes(components, 1, 0, EnumRuneType.EARTH); @@ -106,18 +95,15 @@ public class RitualFelling extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualFelling(); } - private void placeInInventory(IBlockState choppedState, World world, BlockPos choppedPos, @Nullable IItemHandler inventory) - { + private void placeInInventory(IBlockState choppedState, World world, BlockPos choppedPos, @Nullable IItemHandler inventory) { if (inventory == null) return; - for (ItemStack stack : choppedState.getBlock().getDrops(world, choppedPos, world.getBlockState(choppedPos), 0)) - { + 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 EntityItem(world, choppedPos.getX() + 0.4, choppedPos.getY() + 2, choppedPos.getZ() + 0.4, remainder)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index ae60ee22..6f704b07 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -1,10 +1,9 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; @@ -14,18 +13,13 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; -public class RitualForsakenSoul extends Ritual -{ +import java.util.ArrayList; +import java.util.List; + +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; @@ -37,8 +31,7 @@ public class RitualForsakenSoul extends Ritual public List keyList = new ArrayList(); - public RitualForsakenSoul() - { + 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)); @@ -48,48 +41,41 @@ public class RitualForsakenSoul extends Ritual } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); willBuffer = tag.getDouble("willBuffer"); crystalBuffer = tag.getDouble("crystalBuffer"); keyList.clear(); - for (int i = 0; i < MAX_UNIQUENESS; i++) - { + for (int i = 0; i < MAX_UNIQUENESS; i++) { String key = "uniq" + i; - if (tag.hasKey(key)) - { + if (tag.hasKey(key)) { keyList.add(tag.getInteger(key)); } } } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); tag.setDouble("willBuffer", willBuffer); tag.setDouble("crystalBuffer", crystalBuffer); - for (int i = 0; i < Math.min(MAX_UNIQUENESS, keyList.size()); i++) - { + for (int i = 0; i < Math.min(MAX_UNIQUENESS, keyList.size()); i++) { String key = "uniq" + i; tag.setInteger(key, keyList.get(i)); } } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos pos = masterRitualStone.getBlockPos(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -102,12 +88,10 @@ public class RitualForsakenSoul extends Ritual AreaDescriptor crystalRange = getBlockRange(CRYSTAL_RANGE); crystalRange.resetIterator(); - while (crystalRange.hasNext()) - { + while (crystalRange.hasNext()) { BlockPos nextPos = crystalRange.next().add(pos); TileEntity tile = world.getTileEntity(nextPos); - if (tile instanceof TileDemonCrystal) - { + if (tile instanceof TileDemonCrystal) { crystalList.add((TileDemonCrystal) tile); } } @@ -117,23 +101,18 @@ public class RitualForsakenSoul extends Ritual List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, range); - for (EntityLivingBase entity : entities) - { + for (EntityLivingBase entity : entities) { EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); if (BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) continue; - if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) - { - if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) - { - if (!entity.isEntityAlive()) - { + if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { + if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) { + if (!entity.isEntityAlive()) { int uniqueness = calculateUniqueness(entity); double modifier = 1; - if (entity instanceof EntityAnimal && !entity.isCollided) - { + if (entity instanceof EntityAnimal && !entity.isCollided) { modifier = 4; } @@ -141,8 +120,7 @@ public class RitualForsakenSoul extends Ritual crystalBuffer += modifier * entity.getMaxHealth() / HEALTH_THRESHOLD; totalEffects++; - if (totalEffects >= maxEffects) - { + if (totalEffects >= maxEffects) { break; } } @@ -150,14 +128,12 @@ public class RitualForsakenSoul extends Ritual } } - if (crystalList.size() > 0 && crystalBuffer > 0) - { + 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) - { + if (percentageGrowth > 0) { crystalBuffer -= percentageGrowth; willBuffer -= percentageGrowth * willSyphonAmount; } @@ -167,24 +143,19 @@ public class RitualForsakenSoul extends Ritual } /** - * * @param mob * @return The amount of uniqueness to the last 10 mobs killed */ - public int calculateUniqueness(EntityLivingBase mob) - { + public int calculateUniqueness(EntityLivingBase mob) { int key = mob.getClass().hashCode(); keyList.add(key); - if (keyList.size() > MAX_UNIQUENESS) - { + if (keyList.size() > MAX_UNIQUENESS) { keyList.remove(0); } List uniquenessList = new ArrayList(); - for (int value : keyList) - { - if (!uniquenessList.contains(value)) - { + for (int value : keyList) { + if (!uniquenessList.contains(value)) { uniquenessList.add(value); } } @@ -192,26 +163,22 @@ public class RitualForsakenSoul extends Ritual return Math.min(uniquenessList.size(), MAX_UNIQUENESS); } - public double getWillForUniqueness(int uniqueness) - { + public double getWillForUniqueness(int uniqueness) { return Math.max(50 - 15 * Math.sqrt(uniqueness), 0); } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 25; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 2; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); @@ -228,8 +195,7 @@ public class RitualForsakenSoul extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualForsakenSoul(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java index 00d72cb5..37e6c56b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java @@ -8,20 +8,18 @@ import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.FoodStats; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.ArrayList; import java.util.List; -public class RitualFullStomach extends Ritual -{ +public class RitualFullStomach extends Ritual { public static final String FILL_RANGE = "fillRange"; public static final String CHEST_RANGE = "chest"; - public RitualFullStomach() - { + 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)); @@ -31,8 +29,7 @@ public class RitualFullStomach extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); @@ -43,8 +40,7 @@ public class RitualFullStomach extends Ritual AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); - if (!(tile instanceof IInventory)) - { + if (!(tile instanceof IInventory)) { return; } @@ -56,23 +52,19 @@ public class RitualFullStomach extends Ritual List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, fillingRange.getAABB(pos)); - for (EntityPlayer player : playerList) - { + for (EntityPlayer player : playerList) { FoodStats foodStats = player.getFoodStats(); float satLevel = foodStats.getSaturationLevel(); - for (int i = lastSlot; i < inventory.getSizeInventory(); i++) - { + for (int i = lastSlot; i < inventory.getSizeInventory(); i++) { ItemStack stack = inventory.getStackInSlot(i); - if (!stack.isEmpty() && stack.getItem() instanceof ItemFood) - { + 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; - if (saturationAmount + satLevel <= 20) - { + if (saturationAmount + satLevel <= 20) { NBTTagCompound nbt = new NBTTagCompound(); foodStats.writeNBT(nbt); nbt.setFloat("foodSaturationLevel", saturationAmount + satLevel); @@ -86,8 +78,7 @@ public class RitualFullStomach extends Ritual } } - if (totalEffects >= maxEffects) - { + if (totalEffects >= maxEffects) { masterRitualStone.getOwnerNetwork().causeNausea(); break; } @@ -97,20 +88,17 @@ public class RitualFullStomach extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 20; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 100; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addParallelRunes(components, 3, 0, EnumRuneType.FIRE); @@ -123,8 +111,7 @@ public class RitualFullStomach extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualFullStomach(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 996c7656..9f2af4fa 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -1,12 +1,13 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.BlockFarmland; import net.minecraft.block.IGrowable; @@ -20,19 +21,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import net.minecraftforge.common.IPlantable; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -public class RitualGreenGrove extends Ritual -{ +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +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"; @@ -41,16 +35,12 @@ public class RitualGreenGrove extends Ritual public static double rawWillDrain = 0.05; public static double vengefulWillDrain = 0.05; public static double steadfastWillDrain = 0.05; - - public int refreshTime = 20; public static int defaultRefreshTime = 20; - public static double defaultGrowthChance = 0.3; - public static IBlockState farmlandState = Blocks.FARMLAND.getDefaultState().withProperty(BlockFarmland.MOISTURE, 7); + public int refreshTime = 20; - public RitualGreenGrove() - { + 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)); @@ -61,14 +51,12 @@ public class RitualGreenGrove extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); BlockPos pos = masterRitualStone.getBlockPos(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -96,34 +84,26 @@ public class RitualGreenGrove extends Ritual AreaDescriptor growingRange = 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)) - { + 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)) - { + for (BlockPos newPos : growingRange.getContainedPositions(pos)) { IBlockState state = world.getBlockState(newPos); - if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) - { - if (state.getBlock() instanceof IGrowable) - { - if (world.rand.nextDouble() < growthChance) - { + if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { + if (state.getBlock() instanceof IGrowable) { + if (world.rand.nextDouble() < growthChance) { state.getBlock().updateTick(world, newPos, state, new Random()); IBlockState newState = world.getBlockState(newPos); - if (!newState.equals(state)) - { + if (!newState.equals(state)) { totalGrowths++; - if (consumeRawWill) - { + if (consumeRawWill) { rawWill -= rawWillDrain; rawDrain += rawWillDrain; } - if (consumeVengefulWill) - { + if (consumeVengefulWill) { vengefulWill -= vengefulWillDrain; vengefulDrain += vengefulWillDrain; } @@ -132,35 +112,29 @@ public class RitualGreenGrove extends Ritual } } - if (totalGrowths >= maxGrowths || (consumeRawWill && rawWill < rawWillDrain) || (consumeVengefulWill && vengefulWill < vengefulWillDrain)) - { + if (totalGrowths >= maxGrowths || (consumeRawWill && rawWill < rawWillDrain) || (consumeVengefulWill && vengefulWill < vengefulWillDrain)) { break; } } - if (rawDrain > 0) - { + if (rawDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrain, true); } - if (vengefulDrain > 0) - { + if (vengefulDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrain, true); } AreaDescriptor hydrateRange = getBlockRange(HYDRATE_RANGE); double steadfastDrain = 0; - if (steadfastWill > steadfastWillDrain) - { + 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) - { + for (BlockPos newPos : hydrateRange.getContainedPositions(pos)) { + if (steadfastWill < steadfastWillDrain) { break; } @@ -168,53 +142,43 @@ public class RitualGreenGrove extends Ritual Block block = state.getBlock(); boolean hydratedBlock = false; - if (block == Blocks.DIRT || block == Blocks.GRASS) - { + if (block == Blocks.DIRT || block == Blocks.GRASS) { world.setBlockState(newPos, farmlandState); hydratedBlock = true; - } else if (block == Blocks.FARMLAND) - { + } else if (block == Blocks.FARMLAND) { int meta = block.getMetaFromState(state); - if (meta < 7) - { + if (meta < 7) { world.setBlockState(newPos, farmlandState); hydratedBlock = true; } } - if (hydratedBlock) - { + if (hydratedBlock) { steadfastWill -= steadfastWillDrain; steadfastDrain += steadfastWillDrain; } } } - if (steadfastDrain > 0) - { + if (steadfastDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastDrain, true); } double corrosiveDrain = 0; - if (corrosiveWill > corrosiveWillDrain) - { + if (corrosiveWill > corrosiveWillDrain) { AreaDescriptor leechRange = getBlockRange(LEECH_RANGE); AxisAlignedBB mobArea = leechRange.getAABB(pos); List entityList = world.getEntitiesWithinAABB(EntityLivingBase.class, mobArea); - for (EntityLivingBase entityLiving : entityList) - { - if (corrosiveWill < corrosiveWillDrain) - { + for (EntityLivingBase entityLiving : entityList) { + if (corrosiveWill < corrosiveWillDrain) { break; } - if (entityLiving instanceof EntityPlayer) - { + if (entityLiving instanceof EntityPlayer) { continue; } - if (entityLiving.isPotionActive(RegistrarBloodMagic.PLANT_LEECH) || !entityLiving.isPotionApplicable(new PotionEffect(RegistrarBloodMagic.PLANT_LEECH))) - { + if (entityLiving.isPotionActive(RegistrarBloodMagic.PLANT_LEECH) || !entityLiving.isPotionApplicable(new PotionEffect(RegistrarBloodMagic.PLANT_LEECH))) { continue; } @@ -224,8 +188,7 @@ public class RitualGreenGrove extends Ritual corrosiveDrain += corrosiveWillDrain; } - if (corrosiveDrain > 0) - { + if (corrosiveDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrain, true); } } @@ -233,20 +196,16 @@ public class RitualGreenGrove extends Ritual masterRitualStone.getOwnerNetwork().syphon(totalGrowths * getRefreshCost()); } - public double getPlantGrowthChanceForWill(double will) - { - if (will > 0) - { + public double getPlantGrowthChanceForWill(double will) { + if (will > 0) { return 0.3 + will / 200; } return defaultGrowthChance; } - public int getRefreshTimeForRawWill(double rawWill) - { - if (rawWill > 0) - { + public int getRefreshTimeForRawWill(double rawWill) { + if (rawWill > 0) { return 10; } @@ -254,19 +213,15 @@ public class RitualGreenGrove extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return refreshTime; } @Override - public int getMaxVolumeForRange(String range, List activeTypes, DemonWillHolder holder) - { - if (GROW_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) - { + 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) - { + if (destructiveWill > 0) { return 81 + (int) Math.pow(destructiveWill / 4, 1.5); } } @@ -275,13 +230,10 @@ public class RitualGreenGrove extends Ritual } @Override - public int getMaxVerticalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) - { - if (GROW_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) - { + 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) - { + if (destructiveWill > 0) { return (int) (4 + destructiveWill / 10d); } } @@ -290,13 +242,10 @@ public class RitualGreenGrove extends Ritual } @Override - public int getMaxHorizontalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) - { - if (GROW_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) - { + 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) - { + if (destructiveWill > 0) { return (int) (4 + destructiveWill / 10d); } } @@ -305,14 +254,12 @@ public class RitualGreenGrove extends Ritual } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 20; //TODO: Need to find a way to balance this } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.EARTH); @@ -322,14 +269,12 @@ public class RitualGreenGrove extends Ritual } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") }; + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info")}; } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualGreenGrove(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java index abc6dea5..e48c6b36 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java @@ -12,34 +12,30 @@ import java.util.ArrayList; /** * 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(BlockStack, int)} to register a * new amplifier. */ -public class RitualHarvest extends Ritual -{ +public class RitualHarvest extends Ritual { public static final String HARVEST_RANGE = "harvestRange"; - public RitualHarvest() - { + 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); BlockPos pos = masterRitualStone.getBlockPos(); - if (masterRitualStone.getOwnerNetwork().getCurrentEssence() < getRefreshCost()) - { + if (masterRitualStone.getOwnerNetwork().getCurrentEssence() < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -49,11 +45,9 @@ public class RitualHarvest extends Ritual AreaDescriptor harvestArea = getBlockRange(HARVEST_RANGE); harvestArea.resetIterator(); - while (harvestArea.hasNext()) - { + while (harvestArea.hasNext()) { BlockPos nextPos = harvestArea.next().add(pos); - if (harvestBlock(world, nextPos)) - { + if (harvestBlock(world, nextPos)) { harvested++; } } @@ -62,20 +56,17 @@ public class RitualHarvest extends Ritual } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 20; } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 5; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); components.add(new RitualComponent(new BlockPos(1, 0, 1), EnumRuneType.DUSK)); @@ -107,13 +98,11 @@ public class RitualHarvest extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualHarvest(); } - public static boolean harvestBlock(World world, BlockPos pos) - { + public static boolean harvestBlock(World world, BlockPos pos) { BlockStack harvestStack = BlockStack.getStackFromPos(world, pos); for (IHarvestHandler handler : HarvestRegistry.getHandlerList()) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java index 57255109..69e6c61d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java @@ -10,33 +10,28 @@ import net.minecraft.world.World; import java.util.ArrayList; -public class RitualInterdiction extends Ritual -{ +public class RitualInterdiction extends Ritual { public static final String INTERDICTION_RANGE = "interdictionRange"; - public RitualInterdiction() - { + 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } AreaDescriptor interdictionRange = getBlockRange(INTERDICTION_RANGE); - for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, interdictionRange.getAABB(masterRitualStone.getBlockPos()))) - { + for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, interdictionRange.getAABB(masterRitualStone.getBlockPos()))) { if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || PlayerHelper.getUUIDFromPlayer((EntityPlayer) entity).toString().equals(masterRitualStone.getOwner()))) continue; @@ -49,28 +44,24 @@ public class RitualInterdiction extends Ritual entity.motionZ = 0.1 * zDif; entity.fallDistance = 0; - if (entity instanceof EntityPlayer) - { + if (entity instanceof EntityPlayer) { entity.velocityChanged = true; } } } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 1; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); @@ -80,8 +71,7 @@ public class RitualInterdiction extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualInterdiction(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java index 5cc64b52..45ab5d5c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java @@ -11,25 +11,21 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.List; -public class RitualJumping extends Ritual -{ +public class RitualJumping extends Ritual { public static final String JUMP_RANGE = "jumpRange"; - public RitualJumping() - { + 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); } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -39,26 +35,22 @@ public class RitualJumping extends Ritual AreaDescriptor jumpRange = getBlockRange(JUMP_RANGE); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, jumpRange.getAABB(masterRitualStone.getBlockPos())); - for (EntityLivingBase entity : entities) - { - if (totalEffects >= maxEffects) - { + for (EntityLivingBase entity : entities) { + if (totalEffects >= maxEffects) { break; } double motionY = 1.5; entity.fallDistance = 0; - if (entity.isSneaking()) - { + if (entity.isSneaking()) { continue; } entity.motionY = motionY; totalEffects++; - if (entity instanceof EntityPlayer) - { + if (entity instanceof EntityPlayer) { Utils.setPlayerSpeedFromServer((EntityPlayer) entity, entity.motionX, entity.motionY, entity.motionZ); } } @@ -67,20 +59,17 @@ public class RitualJumping extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 5; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); for (int i = -1; i <= 1; i++) @@ -90,8 +79,7 @@ public class RitualJumping extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualJumping(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java index 3a8e82e0..1b6d15c1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java @@ -1,10 +1,13 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -21,19 +24,11 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -public class RitualLava extends Ritual -{ +import java.util.ArrayList; +import java.util.List; + +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"; @@ -43,12 +38,10 @@ public class RitualLava extends Ritual public static final double vengefulWillDrain = 1; public static final double steadfastWillDrain = 0.5; public static final double corrosiveWillDrain = 0.2; - - public int timer = 0; public static final int corrosiveRefreshTime = 20; + public int timer = 0; - public RitualLava() - { + 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)); @@ -64,15 +57,13 @@ public class RitualLava extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { timer++; World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); int lpDrain = 0; - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -87,26 +78,21 @@ public class RitualLava extends Ritual AreaDescriptor lavaRange = 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)) - { + 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)) - { + for (BlockPos newPos : lavaRange.getContainedPositions(pos)) { IBlockState state = world.getBlockState(newPos); - if (world.isAirBlock(newPos) || Utils.isFlowingLiquid(world, newPos, state)) - { + if (world.isAirBlock(newPos) || Utils.isFlowingLiquid(world, newPos, state)) { int lpCost = getLPCostForRawWill(rawWill); - if (currentEssence < lpCost) - { + if (currentEssence < lpCost) { break; } world.setBlockState(newPos, Blocks.FLOWING_LAVA.getDefaultState()); currentEssence -= lpCost; lpDrain += lpCost; - if (rawWill > 0) - { + if (rawWill > 0) { double drain = getWillCostForRawWill(rawWill); rawWill -= drain; rawDrained += drain; @@ -114,19 +100,15 @@ public class RitualLava extends Ritual } } - if (rawWill > 0) - { + if (rawWill > 0) { AreaDescriptor chestRange = 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)) - { + 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); @@ -146,28 +128,23 @@ public class RitualLava extends Ritual double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - if (vengefulWill >= vengefulWillDrain) - { + if (vengefulWill >= vengefulWillDrain) { double vengefulDrained = 0; AreaDescriptor fuseRange = getBlockRange(FIRE_FUSE_RANGE); AxisAlignedBB fuseArea = fuseRange.getAABB(pos); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, fuseArea); - for (EntityLivingBase entity : entities) - { - if (vengefulWill < vengefulWillDrain) - { + for (EntityLivingBase entity : entities) { + if (vengefulWill < vengefulWillDrain) { break; } - if (entity instanceof EntityPlayer) - { + if (entity instanceof EntityPlayer) { continue; } - if (!entity.isPotionActive(RegistrarBloodMagic.FIRE_FUSE)) - { + if (!entity.isPotionActive(RegistrarBloodMagic.FIRE_FUSE)) { entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FIRE_FUSE, 100, 0)); vengefulDrained += vengefulWillDrain; @@ -175,14 +152,12 @@ public class RitualLava extends Ritual } } - if (vengefulDrained > 0) - { + if (vengefulDrained > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrained, true); } } - if (steadfastWill >= steadfastWillDrain) - { + if (steadfastWill >= steadfastWillDrain) { double steadfastDrained = 0; AreaDescriptor resistRange = getBlockRange(FIRE_RESIST_RANGE); @@ -191,14 +166,11 @@ public class RitualLava extends Ritual AxisAlignedBB resistArea = resistRange.getAABB(pos); List entities = world.getEntitiesWithinAABB(EntityPlayer.class, resistArea); - for (EntityPlayer entity : entities) - { - if (steadfastWill < steadfastWillDrain) - { + for (EntityPlayer entity : entities) { + if (steadfastWill < steadfastWillDrain) { break; } - if (!entity.isPotionActive(MobEffects.FIRE_RESISTANCE) || (entity.getActivePotionEffect(MobEffects.FIRE_RESISTANCE).getDuration() < 2)) - { + if (!entity.isPotionActive(MobEffects.FIRE_RESISTANCE) || (entity.getActivePotionEffect(MobEffects.FIRE_RESISTANCE).getDuration() < 2)) { entity.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, 100, 0)); steadfastDrained += steadfastWillDrain; @@ -206,14 +178,12 @@ public class RitualLava extends Ritual } } - if (steadfastDrained > 0) - { + if (steadfastDrained > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastDrained, true); } } - if (timer % corrosiveRefreshTime == 0 && corrosiveWill >= corrosiveWillDrain) - { + if (timer % corrosiveRefreshTime == 0 && corrosiveWill >= corrosiveWillDrain) { double corrosiveDrained = 0; AreaDescriptor resistRange = getBlockRange(FIRE_DAMAGE_RANGE); @@ -222,31 +192,25 @@ public class RitualLava extends Ritual AxisAlignedBB damageArea = resistRange.getAABB(pos); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, damageArea); - for (EntityLivingBase entity : entities) - { - if (corrosiveWill < corrosiveWillDrain) - { + for (EntityLivingBase entity : entities) { + if (corrosiveWill < corrosiveWillDrain) { break; } - if (!entity.isDead && entity.hurtTime <= 0 && Utils.isImmuneToFireDamage(entity)) - { - if (entity.attackEntityFrom(BloodMagicAPI.damageSource, damage)) - { + if (!entity.isDead && entity.hurtTime <= 0 && Utils.isImmuneToFireDamage(entity)) { + if (entity.attackEntityFrom(BloodMagicAPI.damageSource, damage)) { corrosiveDrained += corrosiveWillDrain; corrosiveWill -= corrosiveWillDrain; } } } - if (corrosiveDrained > 0) - { + if (corrosiveDrained > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrained, true); } } - if (rawDrained > 0) - { + if (rawDrained > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrained, true); } @@ -254,26 +218,22 @@ public class RitualLava extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 500; } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") }; + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info")}; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addParallelRunes(components, 1, 0, EnumRuneType.FIRE); @@ -282,19 +242,15 @@ public class RitualLava extends Ritual } @Override - public Ritual getNewCopy() - { + 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)) - { + 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) - { + if (destructiveWill > 0) { return 9 + (int) Math.pow(destructiveWill / 10, 1.5); } } @@ -303,13 +259,10 @@ public class RitualLava extends Ritual } @Override - public int getMaxVerticalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) - { - if (LAVA_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) - { + 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) - { + if (destructiveWill > 0) { return (int) (3 + destructiveWill / 10d); } } @@ -318,13 +271,10 @@ public class RitualLava extends Ritual } @Override - public int getMaxHorizontalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) - { - if (LAVA_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) - { + 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) - { + if (destructiveWill > 0) { return (int) (3 + destructiveWill / 10d); } } @@ -332,23 +282,19 @@ public class RitualLava extends Ritual return horizontalRangeMap.get(range); } - public int getFireResistForWill(double steadfastWill) - { + public int getFireResistForWill(double steadfastWill) { return (int) (200 + steadfastWill * 3); } - public float getCorrosiveDamageForWill(double corrosiveWill) - { + public float getCorrosiveDamageForWill(double corrosiveWill) { return (float) (1 + corrosiveWill * 0.05); } - public int getLPCostForRawWill(double raw) - { + public int getLPCostForRawWill(double raw) { return Math.max((int) (500 - raw), 0); } - public double getWillCostForRawWill(double raw) - { + public double getWillCostForRawWill(double raw) { return Math.min(1, raw / 500); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java index c6e26ab9..70d01e55 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java @@ -1,9 +1,14 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; +import WayofTime.bloodmagic.api.registry.LivingArmourDowngradeRecipeRegistry; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.util.ChatUtil; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; @@ -17,38 +22,25 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.api.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Utils; -public class RitualLivingArmourDowngrade extends Ritual -{ +import java.util.ArrayList; +import java.util.List; + +public class RitualLivingArmourDowngrade extends Ritual { public static final String DOWNGRADE_RANGE = "containmentRange"; private int internalTimer = 0; - public RitualLivingArmourDowngrade() - { + public RitualLivingArmourDowngrade() { super("ritualDowngrade", 0, 10000, "ritual." + BloodMagic.MODID + ".downgradeRitual"); addBlockRange(DOWNGRADE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-3, 0, -3), 7)); } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -58,65 +50,50 @@ public class RitualLivingArmourDowngrade extends Ritual AreaDescriptor downgradeRange = getBlockRange(DOWNGRADE_RANGE); boolean isActivatorPresent = false; - for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, downgradeRange.getAABB(masterRitualStone.getBlockPos()))) - { - if (player.getUniqueID().toString().equals(masterRitualStone.getOwner())) - { + for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, downgradeRange.getAABB(masterRitualStone.getBlockPos()))) { + if (player.getUniqueID().toString().equals(masterRitualStone.getOwner())) { ItemStack keyStack = getStackFromItemFrame(world, masterPos, masterRitualStone.getDirection()); - if (keyStack.isEmpty()) - { + if (keyStack.isEmpty()) { return; } List textList = LivingArmourDowngradeRecipeRegistry.getDialogForProcessTick(keyStack, internalTimer); - if (textList != null) - { + if (textList != null) { ChatUtil.sendChat(player, textList.toArray(new ITextComponent[textList.size()])); } internalTimer++; - if (player.isSneaking()) - { + if (player.isSneaking()) { double distance2 = masterPos.offset(EnumFacing.UP).distanceSqToCenter(player.posX, player.posY, player.posZ); - if (distance2 > 1) - { + if (distance2 > 1) { return; } BlockPos chestPos = masterPos.offset(masterRitualStone.getDirection(), 2).offset(EnumFacing.UP); TileEntity tile = world.getTileEntity(chestPos); - if (tile == null) - { + if (tile == null) { return; } IItemHandler inv = Utils.getInventory(tile, null); - if (inv != null) - { + if (inv != null) { List recipeList = new ArrayList(); - for (int i = 0; i < inv.getSlots(); i++) - { + for (int i = 0; i < inv.getSlots(); i++) { ItemStack invStack = inv.getStackInSlot(i); - if (!invStack.isEmpty()) - { + if (!invStack.isEmpty()) { recipeList.add(invStack); } } LivingArmourDowngradeRecipe recipe = LivingArmourDowngradeRecipeRegistry.getMatchingRecipe(keyStack, recipeList, world, masterPos); - if (recipe != null) - { + if (recipe != null) { LivingArmourUpgrade upgrade = recipe.getRecipeOutput(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { - if (armour.canApplyUpgrade(player, upgrade)) - { - if (armour.upgradeArmour(player, upgrade)) - { + if (armour != null) { + if (armour.canApplyUpgrade(player, upgrade)) { + if (armour.upgradeArmour(player, upgrade)) { ItemLivingArmour.setLivingArmour(chestStack, armour); recipe.consumeInventory(inv); @@ -126,8 +103,7 @@ public class RitualLivingArmourDowngrade extends Ritual masterRitualStone.setActive(false); } - } else - { + } else { //TODO: You are not able to receive my blessing... //TODO: Need to add a timer that will stop it from working. } @@ -141,39 +117,33 @@ public class RitualLivingArmourDowngrade extends Ritual } } - if (!isActivatorPresent) - { + if (!isActivatorPresent) { internalTimer = 0; } } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); this.internalTimer = tag.getInteger("internalTimer"); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); tag.setInteger("internalTimer", internalTimer); } - public ItemStack getStackFromItemFrame(World world, BlockPos masterPos, EnumFacing direction) - { + public ItemStack getStackFromItemFrame(World world, BlockPos masterPos, EnumFacing direction) { BlockPos offsetPos = new BlockPos(0, 3, 0); offsetPos = offsetPos.offset(direction, 2); AxisAlignedBB bb = new AxisAlignedBB(masterPos.add(offsetPos)); List frames = world.getEntitiesWithinAABB(EntityItemFrame.class, bb); - for (EntityItemFrame frame : frames) - { - if (!frame.getDisplayedItem().isEmpty()) - { + for (EntityItemFrame frame : frames) { + if (!frame.getDisplayedItem().isEmpty()) { return frame.getDisplayedItem(); } } @@ -182,20 +152,17 @@ public class RitualLivingArmourDowngrade extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 0; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addRune(components, 0, 0, -1, EnumRuneType.AIR); @@ -208,8 +175,7 @@ public class RitualLivingArmourDowngrade extends Ritual for (int i = 1; i <= 3; i++) this.addRune(components, 0, 0, i, EnumRuneType.AIR); - for (int sgn = -1; sgn <= 1; sgn += 2) - { + for (int sgn = -1; sgn <= 1; sgn += 2) { this.addRune(components, sgn, 0, 4, EnumRuneType.AIR); this.addRune(components, sgn * 2, 0, 2, EnumRuneType.AIR); this.addRune(components, sgn * 3, 0, 2, EnumRuneType.AIR); @@ -239,8 +205,7 @@ public class RitualLivingArmourDowngrade extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualLivingArmourDowngrade(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java index ab176dc3..948ce689 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java @@ -1,10 +1,9 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.BlockOre; import net.minecraft.block.BlockRedstoneOre; @@ -16,81 +15,29 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.util.Utils; -public class RitualMagnetic extends Ritual -{ - private static final Map oreBlockCache = new HashMap(); +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +public class RitualMagnetic extends Ritual { public static final String PLACEMENT_RANGE = "placementRange"; + private static final Map oreBlockCache = new HashMap(); // public static final String SEARCH_RANGE = "searchRange"; - public BlockPos lastPos; // An offset - public RitualMagnetic() - { + 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); } - public static boolean isBlockOre(Block block, int meta) - { - if (block == null) - return false; - - if (block instanceof BlockOre || block instanceof BlockRedstoneOre) - return true; - - if (Item.getItemFromBlock(block) == Items.AIR) - return false; - - BlockStack type = new BlockStack(block, meta); - Boolean result = oreBlockCache.get(type); - if (result == null) - { - result = computeIsItemOre(type); - oreBlockCache.put(type, result); - } - return result; - } - - private static boolean computeIsItemOre(BlockStack type) - { - ItemStack stack = new ItemStack(type.getBlock(), type.getMeta()); - return isBlockOre(stack); - } - - 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; - } - @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -102,10 +49,8 @@ public class RitualMagnetic extends Ritual BlockPos replacement = pos; boolean replace = false; - for (BlockPos offset : placementRange.getContainedPositions(pos)) - { - if (world.isAirBlock(offset)) - { + for (BlockPos offset : placementRange.getContainedPositions(pos)) { + if (world.isAirBlock(offset)) { replacement = offset; replace = true; break; @@ -117,40 +62,33 @@ public class RitualMagnetic extends Ritual int radius = getRadius(downBlock); - if (replace) - { + if (replace) { int j = -1; int i = -radius; int k = -radius; - if (lastPos != null) - { + if (lastPos != null) { j = lastPos.getY(); i = Math.min(radius, Math.max(-radius, lastPos.getX())); k = Math.min(radius, Math.max(-radius, lastPos.getZ())); } - while (j + pos.getY() >= 0) - { - while (i <= radius) - { - while (k <= radius) - { + while (j + pos.getY() >= 0) { + while (i <= radius) { + while (k <= radius) { BlockPos newPos = pos.add(i, j, k); IBlockState state = world.getBlockState(newPos); Block block = state.getBlock(); ItemStack checkStack = block.getItem(world, newPos, state); // int meta = block.getMetaFromState(state); - if (isBlockOre(checkStack)) - { + if (isBlockOre(checkStack)) { Utils.swapLocations(world, newPos, world, replacement); masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); k++; this.lastPos = new BlockPos(i, j, k); return; - } else - { + } else { k++; } } @@ -170,20 +108,16 @@ public class RitualMagnetic extends Ritual } - public int getRadius(Block block) - { - if (block == Blocks.IRON_BLOCK) - { + public int getRadius(Block block) { + if (block == Blocks.IRON_BLOCK) { return 7; } - if (block == Blocks.GOLD_BLOCK) - { + if (block == Blocks.GOLD_BLOCK) { return 15; } - if (block == Blocks.DIAMOND_BLOCK) - { + if (block == Blocks.DIAMOND_BLOCK) { return 31; } @@ -191,20 +125,17 @@ public class RitualMagnetic extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 40; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 50; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.EARTH); @@ -216,8 +147,44 @@ public class RitualMagnetic extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualMagnetic(); } + + public static boolean isBlockOre(Block block, int meta) { + if (block == null) + return false; + + if (block instanceof BlockOre || block instanceof BlockRedstoneOre) + return true; + + if (Item.getItemFromBlock(block) == Items.AIR) + return false; + + BlockStack type = new BlockStack(block, meta); + Boolean result = oreBlockCache.get(type); + if (result == null) { + result = computeIsItemOre(type); + oreBlockCache.put(type, result); + } + return result; + } + + private static boolean computeIsItemOre(BlockStack type) { + ItemStack stack = new ItemStack(type.getBlock(), type.getMeta()); + return isBlockOre(stack); + } + + 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/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index 72090b53..90a9412f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -1,38 +1,31 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; import WayofTime.bloodmagic.meteor.MeteorRegistry; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; -public class RitualMeteor extends Ritual -{ +import java.util.ArrayList; +import java.util.List; + +public class RitualMeteor extends Ritual { public static final String ITEM_RANGE = "itemRange"; public static final double destructiveWillDrain = 50; - public RitualMeteor() - { + public RitualMeteor() { super("ritualMeteor", 0, 1000000, "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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); @@ -55,22 +48,18 @@ public class RitualMeteor extends Ritual boolean successful = false; - for (EntityItem entityItem : itemList) - { + for (EntityItem entityItem : itemList) { ItemStack stack = entityItem.getItem(); - if (MeteorRegistry.hasMeteorForItem(stack)) - { + if (MeteorRegistry.hasMeteorForItem(stack)) { EntityMeteor meteor = new EntityMeteor(world, pos.getX(), 260, pos.getZ(), 0, -0.1, 0, radiusModifier, explosionModifier, fillerChance); meteor.setMeteorStack(stack.copy()); world.spawnEntity(meteor); entityItem.setDead(); - if (destructiveWill >= destructiveWillDrain && currentEssence >= 1000000000) - { + if (destructiveWill >= destructiveWillDrain && currentEssence >= 1000000000) { masterRitualStone.getOwnerNetwork().syphon(1000000); - } else - { + } else { masterRitualStone.setActive(false); } successful = true; @@ -78,40 +67,33 @@ public class RitualMeteor extends Ritual } } - if (successful) - { - if (rawWill > 0) - { + if (successful) { + if (rawWill > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawWill, true); } - if (corrosiveWill > 0) - { + if (corrosiveWill > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveWill, true); } - if (steadfastWill > 0) - { + if (steadfastWill > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastWill, true); } } } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 0; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addParallelRunes(components, 2, 0, EnumRuneType.FIRE); @@ -120,8 +102,7 @@ public class RitualMeteor extends Ritual this.addOffsetRunes(components, 5, 3, 0, EnumRuneType.DUSK); this.addCornerRunes(components, 4, 0, EnumRuneType.DUSK); - for (int i = 4; i <= 6; i++) - { + for (int i = 4; i <= 6; i++) { this.addParallelRunes(components, 4, 0, EnumRuneType.EARTH); } @@ -145,23 +126,19 @@ public class RitualMeteor extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualMeteor(); } - public double getRadiusModifier(double rawWill) - { + public double getRadiusModifier(double rawWill) { return Math.pow(1 + rawWill / 100, 1 / 3); } - public double getFillerChance(double corrosiveWill) - { + public double getFillerChance(double corrosiveWill) { return corrosiveWill / 200; } - public double getExplosionModifier(double steadfastWill) - { + public double getExplosionModifier(double steadfastWill) { return Math.max(Math.pow(0.4, steadfastWill / 100), 1); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java index 28abcbb3..938a3fab 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java @@ -7,21 +7,19 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; +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; -public class RitualPlacer extends Ritual -{ +public class RitualPlacer extends Ritual { public static final String PLACER_RANGE = "placerRange"; public static final String CHEST_RANGE = "chest"; - public RitualPlacer() - { + 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)); @@ -31,8 +29,7 @@ public class RitualPlacer extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); BlockPos masterPos = masterRitualStone.getBlockPos(); AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); @@ -40,33 +37,27 @@ public class RitualPlacer extends Ritual int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } AreaDescriptor areaDescriptor = getBlockRange(PLACER_RANGE); - if (tileEntity != null) - { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) - { + if (tileEntity != null) { + if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (itemHandler.getSlots() <= 0) - { + if (itemHandler.getSlots() <= 0) { return; } posLoop: - for (BlockPos blockPos : areaDescriptor.getContainedPositions(masterRitualStone.getBlockPos())) - { + for (BlockPos blockPos : areaDescriptor.getContainedPositions(masterRitualStone.getBlockPos())) { if (!world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos)) continue; - for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) - { + for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) { ItemStack stack = itemHandler.extractItem(invSlot, 1, true); if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) continue; @@ -84,14 +75,12 @@ public class RitualPlacer extends Ritual } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 50; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); addRune(components, 3, 0, 3, EnumRuneType.EARTH); @@ -112,8 +101,7 @@ public class RitualPlacer extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualPlacer(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java index 171c068e..4732b101 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java @@ -12,30 +12,26 @@ import WayofTime.bloodmagic.tile.TileDimensionalPortal; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.ForgeRegistries; import java.util.ArrayList; -public class RitualPortal extends Ritual -{ - - private NBTTagCompound portalRitualTag; +public class RitualPortal extends Ritual { public static final String PORTAL_NBT_TAG = "PortalRitualTag"; public static final String PORTAL_ID_TAG = "PortalRitualID"; + private NBTTagCompound portalRitualTag; - public RitualPortal() - { + public RitualPortal() { super("ritualPortal", 0, 50000, "ritual." + BloodMagic.MODID + ".portalRitual"); portalRitualTag = new NBTTagCompound(); } @Override - public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, String owner) - { + public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, String owner) { World world = masterRitualStone.getWorldObj(); int x = masterRitualStone.getBlockPos().getX(); int y = masterRitualStone.getBlockPos().getY(); @@ -45,72 +41,54 @@ public class RitualPortal extends Ritual String name = owner; IBlockState blockState; - if (!world.isRemote) - { + if (!world.isRemote) { portalRitualTag.removeTag(PORTAL_ID_TAG); - if (direction == EnumFacing.NORTH || direction == EnumFacing.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)) - { + if (direction == EnumFacing.NORTH || direction == EnumFacing.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)) - { + 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)) - { + 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 == EnumFacing.EAST || direction == EnumFacing.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)) - { + } else if (direction == EnumFacing.EAST || direction == EnumFacing.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)) - { + 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)) - { + 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()))) - { + if (LocationsHandler.getLocationsHandler().addLocation(name, new PortalLocation(x, y + 1, z, world.provider.getDimension()))) { portalRitualTag.setString(PORTAL_ID_TAG, name); return true; } @@ -119,11 +97,9 @@ public class RitualPortal extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - if (world.isRemote) - { + if (world.isRemote) { return; } @@ -132,21 +108,16 @@ public class RitualPortal extends Ritual int z = masterRitualStone.getBlockPos().getZ(); EnumFacing direction = masterRitualStone.getDirection(); - if (direction == EnumFacing.NORTH || direction == EnumFacing.SOUTH) - { - for (int i = x - 1; i <= x + 1; i++) - { - for (int j = y + 1; j <= y + 3; j++) - { + if (direction == EnumFacing.NORTH || direction == EnumFacing.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)) - { + if (world.isAirBlock(tempPos)) { IBlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(0); world.setBlockState(tempPos, blockState, 3); - if (world.getTileEntity(tempPos) != null && world.getTileEntity(tempPos) instanceof TileDimensionalPortal) - { + 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); @@ -154,20 +125,15 @@ public class RitualPortal extends Ritual } } } - } else if (direction == EnumFacing.EAST || direction == EnumFacing.WEST) - { - for (int k = z - 1; k <= z + 1; k++) - { - for (int j = y + 1; j <= y + 3; j++) - { + } else if (direction == EnumFacing.EAST || direction == EnumFacing.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)) - { + if (world.isAirBlock(tempPos)) { IBlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(1); world.setBlockState(tempPos, blockState, 3); - if (world.getTileEntity(tempPos) != null && world.getTileEntity(tempPos) instanceof TileDimensionalPortal) - { + 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); @@ -180,8 +146,7 @@ public class RitualPortal extends Ritual } @Override - public void stopRitual(IMasterRitualStone masterRitualStone, BreakType breakType) - { + public void stopRitual(IMasterRitualStone masterRitualStone, BreakType breakType) { World world = masterRitualStone.getWorldObj(); int x = masterRitualStone.getBlockPos().getX(); int y = masterRitualStone.getBlockPos().getY(); @@ -190,26 +155,18 @@ public class RitualPortal extends Ritual LocationsHandler.getLocationsHandler().removeLocation(portalRitualTag.getString(PORTAL_ID_TAG), new PortalLocation(x, y + 1, z, world.provider.getDimension())); - if (direction == EnumFacing.NORTH || direction == EnumFacing.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) - { + if (direction == EnumFacing.NORTH || direction == EnumFacing.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 == EnumFacing.EAST || direction == EnumFacing.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) - { + } else if (direction == EnumFacing.EAST || direction == EnumFacing.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)); } } @@ -220,14 +177,12 @@ public class RitualPortal extends Ritual } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 0; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); addRune(components, 1, 0, 0, EnumRuneType.AIR); @@ -252,34 +207,29 @@ public class RitualPortal extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualPortal(); } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); portalRitualTag = tag.getCompoundTag(PORTAL_NBT_TAG); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); tag.setTag(PORTAL_NBT_TAG, portalRitualTag); } - public IBlockState getBlockState(World world, int x, int y, int z) - { + public IBlockState getBlockState(World world, int x, int y, int z) { return world.getBlockState(new BlockPos(x, y, z)); } - public String addStringToEnd(String input, String toAdd) - { + public String addStringToEnd(String input, String toAdd) { return input + toAdd; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index ca63f12a..0158e15c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -7,8 +7,8 @@ import net.minecraft.block.BlockLiquid; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidBlock; @@ -22,15 +22,13 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -public class RitualPump extends Ritual -{ +public class RitualPump extends Ritual { public static final String PUMP_RANGE = "pumpRange"; private List> liquidsCache; private Iterator> blockPosIterator; - public RitualPump() - { + 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))); @@ -39,14 +37,12 @@ public class RitualPump extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); TileEntity tileEntity = world.getTileEntity(masterRitualStone.getBlockPos().up()); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -90,14 +86,12 @@ public class RitualPump extends Ritual } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 25; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); addRune(components, 1, 0, 1, EnumRuneType.WATER); @@ -111,8 +105,7 @@ public class RitualPump extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualPump(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java index 5e7fd81d..64537627 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java @@ -1,10 +1,11 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -12,18 +13,12 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -public class RitualRegeneration extends Ritual -{ +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class RitualRegeneration extends Ritual { public static final String HEAL_RANGE = "heal"; public static final String VAMPIRE_RANGE = "vampire"; @@ -31,8 +26,7 @@ public class RitualRegeneration extends Ritual public static final double corrosiveWillDrain = 0.04; - public RitualRegeneration() - { + 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)); @@ -42,13 +36,11 @@ public class RitualRegeneration extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -88,18 +80,13 @@ public class RitualRegeneration extends Ritual List players = world.getEntitiesWithinAABB(EntityPlayer.class, healRange); List damagedEntities = world.getEntitiesWithinAABB(EntityLivingBase.class, damageRange); - if (syphonHealth) - { - for (EntityPlayer player : players) - { - if (player.getHealth() <= player.getMaxHealth() - 1) - { + if (syphonHealth) { + for (EntityPlayer player : players) { + if (player.getHealth() <= player.getMaxHealth() - 1) { float syphonedHealthAmount = getSyphonAmountForWill(corrosiveWill); Collections.shuffle(damagedEntities); - for (EntityLivingBase damagedEntity : damagedEntities) - { - if (damagedEntity instanceof EntityPlayer) - { + for (EntityLivingBase damagedEntity : damagedEntities) { + if (damagedEntity instanceof EntityPlayer) { continue; } @@ -108,8 +95,7 @@ public class RitualRegeneration extends Ritual damagedEntity.attackEntityFrom(BloodMagicAPI.damageSource, Math.min(player.getMaxHealth() - player.getHealth(), syphonedHealthAmount)); float healthDifference = currentHealth - damagedEntity.getHealth(); - if (healthDifference > 0) - { + if (healthDifference > 0) { corrosiveDrain += corrosiveWillDrain; corrosiveWill -= corrosiveWillDrain; player.heal(healthDifference); @@ -121,19 +107,14 @@ public class RitualRegeneration extends Ritual } } - for (EntityLivingBase entity : entities) - { + for (EntityLivingBase entity : entities) { float health = entity.getHealth(); - if (health <= entity.getMaxHealth() - 1) - { - if (entity.isPotionApplicable(new PotionEffect(MobEffects.REGENERATION))) - { - if (entity instanceof EntityPlayer) - { + if (health <= entity.getMaxHealth() - 1) { + if (entity.isPotionApplicable(new PotionEffect(MobEffects.REGENERATION))) { + if (entity instanceof EntityPlayer) { totalCost += getRefreshCost(); currentEssence -= getRefreshCost(); - } else - { + } else { totalCost += getRefreshCost() / 10; currentEssence -= getRefreshCost() / 10; } @@ -142,23 +123,19 @@ public class RitualRegeneration extends Ritual totalEffects++; - if (totalEffects >= maxEffects) - { + if (totalEffects >= maxEffects) { break; } } } - if (applyAbsorption && entity instanceof EntityPlayer) - { - if (applyAbsorption) - { + if (applyAbsorption && entity instanceof EntityPlayer) { + if (applyAbsorption) { float added = Utils.addAbsorptionToMaximum(entity, absorptionRate, maxAbsorption, 1000); } } } - if (corrosiveDrain > 0) - { + if (corrosiveDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrain, true); } @@ -166,20 +143,17 @@ public class RitualRegeneration extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 50; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return SACRIFICE_AMOUNT; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); components.add(new RitualComponent(new BlockPos(4, 0, 0), EnumRuneType.AIR)); @@ -204,13 +178,11 @@ public class RitualRegeneration extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualRegeneration(); } - public float getSyphonAmountForWill(double corrosiveWill) - { + public float getSyphonAmountForWill(double corrosiveWill) { return 1; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java index a2de3a23..4cc59843 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java @@ -1,9 +1,10 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.EnumFacing; @@ -11,38 +12,29 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -public class RitualSpeed extends Ritual -{ +import java.util.ArrayList; +import java.util.List; + +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() - { + 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -63,37 +55,31 @@ public class RitualSpeed extends Ritual double destructiveDrain = 0; double rawDrain = 0; - if (rawWill < rawWillDrain) - { + if (rawWill < rawWillDrain) { rawWill = 0; //Simplifies later calculations } - for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, speedRange.getAABB(masterRitualStone.getBlockPos()))) - { + for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, speedRange.getAABB(masterRitualStone.getBlockPos()))) { if (entity.isSneaking()) continue; boolean transportChildren = destructiveWill < destructiveWillDrain; boolean transportAdults = vengefulWill < vengefulWillDrain; - if ((entity.isChild() && !transportChildren) || (!entity.isChild() && !transportAdults)) - { + if ((entity.isChild() && !transportChildren) || (!entity.isChild() && !transportAdults)) { continue; } - if (entity instanceof EntityPlayer && (transportChildren ^ transportAdults)) - { + if (entity instanceof EntityPlayer && (transportChildren ^ transportAdults)) { continue; } - if (!transportChildren) - { + if (!transportChildren) { destructiveWill -= destructiveWillDrain; destructiveDrain += destructiveWillDrain; } - if (!transportAdults) - { + if (!transportAdults) { vengefulWill -= vengefulWillDrain; vengefulDrain += vengefulWillDrain; } @@ -102,8 +88,7 @@ public class RitualSpeed extends Ritual double speed = getHorizontalSpeedForWill(rawWill); EnumFacing direction = masterRitualStone.getDirection(); - if (rawWill >= rawWillDrain) - { + if (rawWill >= rawWillDrain) { rawWill -= rawWillDrain; rawDrain += rawWillDrain; } @@ -111,79 +96,70 @@ public class RitualSpeed extends Ritual entity.motionY = motionY; entity.fallDistance = 0; - switch (direction) - { - case NORTH: - entity.motionX = 0; - entity.motionY = motionY; - entity.motionZ = -speed; - break; + 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 SOUTH: + entity.motionX = 0; + entity.motionY = motionY; + entity.motionZ = speed; + break; - case WEST: - entity.motionX = -speed; - entity.motionY = motionY; - entity.motionZ = 0; - 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; + case EAST: + entity.motionX = speed; + entity.motionY = motionY; + entity.motionZ = 0; + break; + default: + break; } - if (entity instanceof EntityPlayer) - { + if (entity instanceof EntityPlayer) { Utils.setPlayerSpeedFromServer((EntityPlayer) entity, entity.motionX, entity.motionY, entity.motionZ); } } - if (rawDrain > 0) - { + if (rawDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrain, true); } - if (vengefulDrain > 0) - { + if (vengefulDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrain, true); } - if (destructiveDrain > 0) - { + if (destructiveDrain > 0) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveDrain, true); } } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 5; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addRune(components, 0, 0, -2, EnumRuneType.DUSK); this.addRune(components, 1, 0, -1, EnumRuneType.AIR); this.addRune(components, -1, 0, -1, EnumRuneType.AIR); - for (int i = 0; i < 3; i++) - { + for (int i = 0; i < 3; i++) { this.addRune(components, 2, 0, i, EnumRuneType.AIR); this.addRune(components, -2, 0, i, EnumRuneType.AIR); } @@ -192,24 +168,20 @@ public class RitualSpeed extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualSpeed(); } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") }; + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info")}; } - public double getVerticalSpeedForWill(double rawWill) - { + public double getVerticalSpeedForWill(double rawWill) { return 1.2 + rawWill / 200; } - public double getHorizontalSpeedForWill(double rawWill) - { + public double getHorizontalSpeedForWill(double rawWill) { return 3 + rawWill / 40; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java index 9c593771..967ca362 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java @@ -1,38 +1,30 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.tile.TileSpectralBlock; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.tile.TileSpectralBlock; -import WayofTime.bloodmagic.util.Utils; -public class RitualSuppression extends Ritual -{ +import java.util.ArrayList; + +public class RitualSuppression extends Ritual { public static final String SUPPRESSION_RANGE = "suppressionRange"; - public RitualSuppression() - { + 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -40,14 +32,12 @@ public class RitualSuppression extends Ritual final int refresh = 100; AreaDescriptor suppressionRange = getBlockRange(SUPPRESSION_RANGE); - for (BlockPos blockPos : suppressionRange.getContainedPositions(masterRitualStone.getBlockPos())) - { + for (BlockPos blockPos : suppressionRange.getContainedPositions(masterRitualStone.getBlockPos())) { IBlockState state = world.getBlockState(blockPos); if (Utils.isBlockLiquid(state) && world.getTileEntity(blockPos) == null) TileSpectralBlock.createSpectralBlock(world, blockPos, refresh); - else - { + else { TileEntity tile = world.getTileEntity(blockPos); if (tile instanceof TileSpectralBlock) ((TileSpectralBlock) tile).resetDuration(refresh); @@ -56,20 +46,17 @@ public class RitualSuppression extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 2; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 2, 0, EnumRuneType.WATER); @@ -86,8 +73,7 @@ public class RitualSuppression extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualSuppression(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java index c7dce0df..f1c12561 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java @@ -1,48 +1,39 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import com.google.common.collect.Iterables; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import com.google.common.collect.Iterables; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; -public class RitualUpgradeRemove extends Ritual -{ +public class RitualUpgradeRemove extends Ritual { public static final String CHECK_RANGE = "fillRange"; - public RitualUpgradeRemove() - { + public RitualUpgradeRemove() { super("ritualUpgradeRemove", 0, 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); - if (world.isRemote) - { + if (world.isRemote) { return; } @@ -52,21 +43,17 @@ public class RitualUpgradeRemove extends Ritual List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, checkRange.getAABB(pos)); - for (EntityPlayer player : playerList) - { - if (LivingArmour.hasFullSet(player)) - { + for (EntityPlayer 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) - { + if (armour != null) { @SuppressWarnings("unchecked") HashMap upgradeMap = (HashMap) armour.upgradeMap.clone(); - for (Entry entry : upgradeMap.entrySet()) - { + for (Entry entry : upgradeMap.entrySet()) { LivingArmourUpgrade upgrade = entry.getValue(); String upgradeKey = entry.getKey(); @@ -76,17 +63,13 @@ public class RitualUpgradeRemove extends Ritual boolean successful = armour.removeUpgrade(player, upgrade); - if (successful) - { + if (successful) { removedUpgrade = true; world.spawnEntity(new EntityItem(world, player.posX, player.posY, player.posZ, upgradeStack)); - for (Entry trackerEntry : armour.trackerMap.entrySet()) - { + for (Entry trackerEntry : armour.trackerMap.entrySet()) { StatTracker tracker = trackerEntry.getValue(); - if (tracker != null) - { - if (tracker.providesUpgrade(upgradeKey)) - { + if (tracker != null) { + if (tracker.providesUpgrade(upgradeKey)) { tracker.resetTracker(); //Resets the tracker if the upgrade corresponding to it was removed. } } @@ -94,8 +77,7 @@ public class RitualUpgradeRemove extends Ritual } } - if (removedUpgrade) - { + if (removedUpgrade) { ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(chestStack, armour, true); ItemLivingArmour.setLivingArmour(chestStack, armour); armour.recalculateUpgradePoints(); @@ -111,20 +93,17 @@ public class RitualUpgradeRemove extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 0; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.DUSK); @@ -135,8 +114,7 @@ public class RitualUpgradeRemove extends Ritual this.addCornerRunes(components, 1, 3, EnumRuneType.WATER); this.addParallelRunes(components, 1, 4, EnumRuneType.AIR); - for (int i = 0; i < 4; i++) - { + for (int i = 0; i < 4; i++) { this.addCornerRunes(components, 3, i, EnumRuneType.EARTH); } @@ -144,8 +122,7 @@ public class RitualUpgradeRemove extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualUpgradeRemove(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java index 9d4dcbc6..c8291570 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java @@ -8,25 +8,21 @@ import net.minecraft.world.World; import java.util.ArrayList; -public class RitualWater extends Ritual -{ +public class RitualWater extends Ritual { public static final String WATER_RANGE = "waterRange"; - public RitualWater() - { + 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) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -36,16 +32,13 @@ public class RitualWater extends Ritual AreaDescriptor waterRange = getBlockRange(WATER_RANGE); - for (BlockPos newPos : waterRange.getContainedPositions(masterRitualStone.getBlockPos())) - { - if (world.isAirBlock(newPos)) - { + for (BlockPos newPos : waterRange.getContainedPositions(masterRitualStone.getBlockPos())) { + if (world.isAirBlock(newPos)) { world.setBlockState(newPos, Blocks.FLOWING_WATER.getDefaultState()); totalEffects++; } - if (totalEffects >= maxEffects) - { + if (totalEffects >= maxEffects) { break; } } @@ -54,20 +47,17 @@ public class RitualWater extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 25; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.WATER); @@ -76,8 +66,7 @@ public class RitualWater extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualWater(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index 69651ce0..e16184bd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -1,16 +1,15 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.DamageSource; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; @@ -18,8 +17,7 @@ import net.minecraftforge.fml.common.registry.EntityRegistry; import java.util.ArrayList; import java.util.List; -public class RitualWellOfSuffering extends Ritual -{ +public class RitualWellOfSuffering extends Ritual { public static final String ALTAR_RANGE = "altar"; public static final String DAMAGE_RANGE = "damage"; @@ -27,8 +25,7 @@ public class RitualWellOfSuffering extends Ritual public BlockPos altarOffsetPos = new BlockPos(0, 0, 0); //TODO: Save! - public RitualWellOfSuffering() - { + 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)); @@ -38,13 +35,11 @@ public class RitualWellOfSuffering extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -60,13 +55,10 @@ public class RitualWellOfSuffering extends Ritual AreaDescriptor altarRange = getBlockRange(ALTAR_RANGE); - if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof TileAltar)) - { - for (BlockPos newPos : altarRange.getContainedPositions(pos)) - { + if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof TileAltar)) { + for (BlockPos newPos : altarRange.getContainedPositions(pos)) { TileEntity nextTile = world.getTileEntity(newPos); - if (nextTile instanceof TileAltar) - { + if (nextTile instanceof TileAltar) { tile = nextTile; altarOffsetPos = newPos.subtract(pos); @@ -76,8 +68,7 @@ public class RitualWellOfSuffering extends Ritual } } - if (tile instanceof TileAltar) - { + if (tile instanceof TileAltar) { TileAltar tileAltar = (TileAltar) tile; AreaDescriptor damageRange = getBlockRange(DAMAGE_RANGE); @@ -85,8 +76,7 @@ public class RitualWellOfSuffering extends Ritual List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, range); - for (EntityLivingBase entity : entities) - { + for (EntityLivingBase entity : entities) { EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); if (BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) @@ -97,10 +87,8 @@ public class RitualWellOfSuffering extends Ritual if (lifeEssenceRatio <= 0) continue; - if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) - { - if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) - { + if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { + if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) { if (entity.isChild()) lifeEssenceRatio *= 0.5F; @@ -108,8 +96,7 @@ public class RitualWellOfSuffering extends Ritual totalEffects++; - if (totalEffects >= maxEffects) - { + if (totalEffects >= maxEffects) { break; } } @@ -121,20 +108,17 @@ public class RitualWellOfSuffering extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 25; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 2; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addCornerRunes(components, 1, 0, EnumRuneType.FIRE); @@ -149,8 +133,7 @@ public class RitualWellOfSuffering extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualWellOfSuffering(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java index 30a252f1..7db7ffea 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java @@ -1,29 +1,23 @@ package WayofTime.bloodmagic.ritual; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.util.Utils; -public class RitualZephyr extends Ritual -{ +import java.util.ArrayList; +import java.util.List; + +public class RitualZephyr extends Ritual { public static final String ZEPHYR_RANGE = "zephyrRange"; public static final String CHEST_RANGE = "chest"; - public RitualZephyr() - { + 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)); @@ -33,17 +27,14 @@ public class RitualZephyr extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos masterPos = masterRitualStone.getBlockPos(); AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - if (!masterRitualStone.getWorldObj().isRemote && tileInventory != null) - { - if (currentEssence < getRefreshCost()) - { + if (!masterRitualStone.getWorldObj().isRemote && tileInventory != null) { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -53,10 +44,8 @@ public class RitualZephyr extends Ritual List itemList = world.getEntitiesWithinAABB(EntityItem.class, zephyrRange.getAABB(masterRitualStone.getBlockPos())); int count = 0; - for (EntityItem entityItem : itemList) - { - if (entityItem.isDead) - { + for (EntityItem entityItem : itemList) { + if (entityItem.isDead) { continue; } @@ -64,8 +53,7 @@ public class RitualZephyr extends Ritual int originalAmount = copyStack.getCount(); ItemStack newStack = Utils.insertStackIntoTile(copyStack, tileInventory, EnumFacing.DOWN); - if (!newStack.isEmpty() && newStack.getCount() < originalAmount) - { + if (!newStack.isEmpty() && newStack.getCount() < originalAmount) { count++; if (newStack.isEmpty()) entityItem.setDead(); @@ -73,8 +61,7 @@ public class RitualZephyr extends Ritual entityItem.getItem().setCount(newStack.getCount()); } - if (newStack.isEmpty()) - { + if (newStack.isEmpty()) { entityItem.setDead(); } } @@ -84,20 +71,17 @@ public class RitualZephyr extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 1; } @Override - public ArrayList getComponents() - { + public ArrayList getComponents() { ArrayList components = new ArrayList(); this.addParallelRunes(components, 2, 0, EnumRuneType.AIR); @@ -108,8 +92,7 @@ public class RitualZephyr extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualZephyr(); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index acef5d0a..55512361 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -1,9 +1,5 @@ package WayofTime.bloodmagic.ritual.harvest; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.InvocationTargetException; - import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.iface.IHarvestHandler; @@ -21,6 +17,9 @@ import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.relauncher.ReflectionHelper; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.List; /** @@ -29,10 +28,8 @@ import java.util.List; * Register a new crop for this handler with * {@link HarvestRegistry#registerStandardCrop(Block, int)} */ -public class HarvestHandlerPlantable implements IHarvestHandler -{ - public HarvestHandlerPlantable() - { +public class HarvestHandlerPlantable implements IHarvestHandler { + public HarvestHandlerPlantable() { HarvestRegistry.registerStandardCrop(Blocks.CARROTS, 7); HarvestRegistry.registerStandardCrop(Blocks.WHEAT, 7); HarvestRegistry.registerStandardCrop(Blocks.POTATOES, 7); @@ -57,8 +54,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler } @Override - public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) - { + public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) { if (!HarvestRegistry.getStandardCrops().containsKey(blockStack.getBlock())) return false; @@ -70,30 +66,25 @@ public class HarvestHandlerPlantable implements IHarvestHandler List drops = blockStack.getBlock().getDrops(world, pos, blockStack.getState(), 0); boolean foundSeed = false; - for (ItemStack stack : drops) - { + for (ItemStack stack : drops) { if (stack.isEmpty()) continue; - if (stack.getItem() instanceof IPlantable) - { + if (stack.getItem() instanceof IPlantable) { stack.shrink(1); foundSeed = true; break; } } - if (foundSeed) - { + if (foundSeed) { world.setBlockState(pos, blockStack.getBlock().getDefaultState()); world.playEvent(2001, pos, Block.getStateId(blockStack.getState())); - for (ItemStack stack : drops) - { + for (ItemStack stack : drops) { if (stack.isEmpty()) continue; - if (!world.isRemote) - { + if (!world.isRemote) { EntityItem toDrop = new EntityItem(world, pos.getX(), pos.getY() + 0.5, pos.getZ(), stack); world.spawnEntity(toDrop); } @@ -105,8 +96,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler return false; } - private static void addThirdPartyCrop(String modid, String regName, int matureMeta) - { + private static void addThirdPartyCrop(String modid, String regName, int matureMeta) { if (!Loader.isModLoaded(modid)) return; @@ -115,8 +105,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler HarvestRegistry.registerStandardCrop(block, matureMeta); } - private static void addPamCrops() - { + private static void addPamCrops() { if (!Loader.isModLoaded("harvestcraft")) return; @@ -126,7 +115,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler Class registry = ReflectionHelper.getClass(loader, className); Field names = ReflectionHelper.findField(registry, "cropNames"); Method getCrop = registry.getMethod("getCrop", String.class); - for (String name : (String[])names.get(null)) { + for (String name : (String[]) names.get(null)) { BlockCrops crop = (BlockCrops) getCrop.invoke(null, name); HarvestRegistry.registerStandardCrop(crop, crop.getMaxAge()); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java index 86ebcffe..5454ca0b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -23,32 +23,26 @@ import java.util.List; * Register a new crop for this handler with * {@link HarvestRegistry#registerStemCrop(BlockStack, BlockStack)} */ -public class HarvestHandlerStem implements IHarvestHandler -{ - public HarvestHandlerStem() - { +public class HarvestHandlerStem implements IHarvestHandler { + public HarvestHandlerStem() { HarvestRegistry.registerStemCrop(new BlockStack(Blocks.PUMPKIN, OreDictionary.WILDCARD_VALUE), new BlockStack(Blocks.PUMPKIN_STEM, 7)); HarvestRegistry.registerStemCrop(new BlockStack(Blocks.MELON_BLOCK), new BlockStack(Blocks.MELON_STEM, 7)); } @Override - public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) - { + public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) { boolean retFlag = false; List drops = new ArrayList(); BlockPos cropPos = pos; - if (HarvestRegistry.getStemCrops().containsKey(blockStack)) - { + if (HarvestRegistry.getStemCrops().containsKey(blockStack)) { EnumFacing cropDir = blockStack.getBlock().getActualState(blockStack.getState(), world, pos).getValue(BlockStem.FACING); - if (cropDir != EnumFacing.UP) - { + if (cropDir != EnumFacing.UP) { cropPos = pos.offset(cropDir); BlockStack probableCrop = BlockStack.getStackFromPos(world, cropPos); BlockStack regCrop = HarvestRegistry.getStemCrops().get(blockStack); - if ((regCrop.getMeta() == OreDictionary.WILDCARD_VALUE && regCrop.getBlock() == probableCrop.getBlock()) || regCrop.equals(probableCrop)) - { + if ((regCrop.getMeta() == OreDictionary.WILDCARD_VALUE && regCrop.getBlock() == probableCrop.getBlock()) || regCrop.equals(probableCrop)) { drops = probableCrop.getBlock().getDrops(world, cropPos, probableCrop.getState(), 0); world.destroyBlock(cropPos, false); retFlag = true; @@ -56,10 +50,8 @@ public class HarvestHandlerStem implements IHarvestHandler } } - if (!world.isRemote) - { - for (ItemStack drop : drops) - { + if (!world.isRemote) { + for (ItemStack drop : drops) { EntityItem item = new EntityItem(world, cropPos.getX(), cropPos.getY() + 0.5, cropPos.getZ(), drop); world.spawnEntity(item); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java index 4325a79b..19f045b3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java @@ -17,35 +17,28 @@ import java.util.List; * Register a new crop for this handler with * {@link HarvestRegistry#registerTallCrop(BlockStack)} */ -public class HarvestHandlerTall implements IHarvestHandler -{ - public HarvestHandlerTall() - { +public class HarvestHandlerTall implements IHarvestHandler { + public HarvestHandlerTall() { HarvestRegistry.registerTallCrop(new BlockStack(Blocks.REEDS)); HarvestRegistry.registerTallCrop(new BlockStack(Blocks.CACTUS)); } @Override - public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) - { + public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) { boolean retFlag = false; List drops = new ArrayList(); - if (HarvestRegistry.getTallCrops().contains(blockStack)) - { + if (HarvestRegistry.getTallCrops().contains(blockStack)) { BlockStack up = BlockStack.getStackFromPos(world, pos.up()); - if (up.equals(blockStack)) - { + if (up.equals(blockStack)) { drops = up.getBlock().getDrops(world, pos.up(), up.getState(), 0); world.destroyBlock(pos.up(), false); retFlag = true; } } - if (!world.isRemote) - { - for (ItemStack drop : drops) - { + if (!world.isRemote) { + for (ItemStack drop : drops) { EntityItem item = new EntityItem(world, pos.getX(), pos.getY() + 0.5, pos.getZ(), drop); world.spawnEntity(item); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java index 810c5d33..ef7523fa 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java @@ -7,16 +7,13 @@ import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -public class ImperfectRitualDay extends ImperfectRitual -{ - public ImperfectRitualDay() - { +public class ImperfectRitualDay extends ImperfectRitual { + public ImperfectRitualDay() { super("day", new BlockStack(Blocks.GOLD_BLOCK), 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.day"); } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) - { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { if (!imperfectRitualStone.getRitualWorld().isRemote) imperfectRitualStone.getRitualWorld().setWorldTime((imperfectRitualStone.getRitualWorld().getWorldTime() / 24000) * 24000); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java index 6c06d69f..d8d9093c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java @@ -7,16 +7,13 @@ import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -public class ImperfectRitualNight extends ImperfectRitual -{ - public ImperfectRitualNight() - { +public class ImperfectRitualNight extends ImperfectRitual { + public ImperfectRitualNight() { super("night", new BlockStack(Blocks.LAPIS_BLOCK), 100, true, "ritual." + BloodMagic.MODID + ".imperfect.night"); } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) - { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { if (!imperfectRitualStone.getRitualWorld().isRemote) imperfectRitualStone.getRitualWorld().setWorldTime((imperfectRitualStone.getRitualWorld().getWorldTime() / 24000) * 24000 + 13800); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java index 92a858bc..243bd5e3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java @@ -7,23 +7,18 @@ import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -public class ImperfectRitualRain extends ImperfectRitual -{ - public ImperfectRitualRain() - { +public class ImperfectRitualRain extends ImperfectRitual { + public ImperfectRitualRain() { super("rain", new BlockStack(Blocks.WATER), 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.rain"); } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) - { - if (!imperfectRitualStone.getRitualWorld().isRemote) - { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { + if (!imperfectRitualStone.getRitualWorld().isRemote) { imperfectRitualStone.getRitualWorld().getWorldInfo().setRaining(true); } - if (imperfectRitualStone.getRitualWorld().isRemote) - { + if (imperfectRitualStone.getRitualWorld().isRemote) { imperfectRitualStone.getRitualWorld().setRainStrength(1.0F); imperfectRitualStone.getRitualWorld().setThunderStrength(1.0F); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java index 521cf385..871769f2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java @@ -9,16 +9,13 @@ import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; import net.minecraft.potion.PotionEffect; -public class ImperfectRitualResistance extends ImperfectRitual -{ - public ImperfectRitualResistance() - { +public class ImperfectRitualResistance extends ImperfectRitual { + public ImperfectRitualResistance() { super("resistance", new BlockStack(Blocks.BEDROCK), 5000, "ritual." + BloodMagic.MODID + ".imperfect.resistance"); } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) - { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { player.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, 1200, 1)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java index c18a5f17..39bec8d2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java @@ -10,16 +10,13 @@ import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; import net.minecraft.potion.PotionEffect; -public class ImperfectRitualZombie extends ImperfectRitual -{ - public ImperfectRitualZombie() - { +public class ImperfectRitualZombie extends ImperfectRitual { + public ImperfectRitualZombie() { super("zombie", new BlockStack(Blocks.COAL_BLOCK), 5000, "ritual." + BloodMagic.MODID + ".imperfect.zombie"); } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) - { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { EntityZombie zombie = new EntityZombie(imperfectRitualStone.getRitualWorld()); zombie.setPosition(imperfectRitualStone.getRitualPos().getX() + 0.5, imperfectRitualStone.getRitualPos().getY() + 2.1, imperfectRitualStone.getRitualPos().getZ() + 0.5); zombie.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, 2000)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java index 7001a118..1a1c0555 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java @@ -9,48 +9,75 @@ import java.io.*; import java.util.ArrayList; import java.util.HashMap; -public class LocationsHandler implements Serializable -{ +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() - { + private LocationsHandler() { portals = new HashMap>(); } - public static LocationsHandler getLocationsHandler() - { - if (locationsHandler == null || loadFile() == null) - { + 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) { + BloodMagicAPI.logger.info("Location " + name + " already exists."); + updateFile(fileName, portals); + return false; + } else { + portals.get(name).add(location); + BloodMagicAPI.logger.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); + BloodMagicAPI.logger.info("Removing " + name); + updateFile(fileName, portals); + return true; + } else { + BloodMagicAPI.logger.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 - { + } else { portals = loadFile(); return locationsHandler; } } - private static HashMap> loadFile() - { + private static HashMap> loadFile() { HashMap> map; File file = new File(fileName); - try - { - if (!file.exists()) - { - if (file.getParentFile().mkdir()) - { - if (file.createNewFile()) - { + try { + if (!file.exists()) { + if (file.getParentFile().mkdir()) { + if (file.createNewFile()) { BloodMagicAPI.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); } - } else if (file.createNewFile()) - { + } else if (file.createNewFile()) { BloodMagicAPI.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); } } @@ -60,74 +87,22 @@ public class LocationsHandler implements Serializable in.close(); fileIn.close(); return map; - } catch (IOException e) - { + } catch (IOException e) { return null; - } catch (ClassNotFoundException e) - { + } catch (ClassNotFoundException e) { BloodMagicAPI.logger.error(String.valueOf(file) + " was not found in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); return null; } } - private static void updateFile(String file, HashMap> object) - { - try - { + 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) - { + } catch (IOException e) { e.printStackTrace(); } } - - 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) - { - BloodMagicAPI.logger.info("Location " + name + " already exists."); - updateFile(fileName, portals); - return false; - } else - { - portals.get(name).add(location); - BloodMagicAPI.logger.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); - BloodMagicAPI.logger.info("Removing " + name); - updateFile(fileName, portals); - return true; - } else - { - BloodMagicAPI.logger.info("No location matching " + name); - updateFile(fileName, portals); - return false; - } - } - return false; - } - - public ArrayList getLinkedLocations(String name) - { - return portals.get(name); - } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index 8d7ecfe3..b005e751 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -20,33 +20,25 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; -public class Teleports -{ +public class Teleports { - public static class TeleportSameDim extends Teleport - { + public static class TeleportSameDim extends Teleport { private final boolean teleposer; - public TeleportSameDim(int x, int y, int z, Entity entity, String networkToDrain, boolean teleposer) - { + public TeleportSameDim(int x, int y, int z, Entity entity, String networkToDrain, boolean teleposer) { this(new BlockPos(x, y, z), entity, networkToDrain, teleposer); } - public TeleportSameDim(BlockPos blockPos, Entity entity, String networkToDrain, boolean teleposer) - { + public TeleportSameDim(BlockPos blockPos, Entity entity, String networkToDrain, boolean teleposer) { super(blockPos, entity, networkToDrain); this.teleposer = teleposer; } @Override - public void teleport() - { - if (entity != null) - { - if (entity.timeUntilPortal <= 0) - { - if (entity instanceof EntityPlayer) - { + public void teleport() { + if (entity != null) { + if (entity.timeUntilPortal <= 0) { + if (entity instanceof EntityPlayer) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); if (network.getCurrentEssence() < getTeleportCost()) return; @@ -67,8 +59,7 @@ public class Teleports 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(), new BlockPos(x, y, z))); - } else - { + } else { SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); if (network.getCurrentEssence() < (getTeleportCost() / 10)) return; @@ -94,25 +85,21 @@ public class Teleports } @Override - public int getTeleportCost() - { + public int getTeleportCost() { return 1000; } } - public static class TeleportToDim extends Teleport - { + 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, String networkToDrain, World oldWorld, int newWorld, boolean teleposer) - { + public TeleportToDim(int x, int y, int z, Entity entity, String networkToDrain, World oldWorld, int newWorld, boolean teleposer) { this(new BlockPos(x, y, z), entity, networkToDrain, oldWorld, newWorld, teleposer); } - public TeleportToDim(BlockPos blockPos, Entity entity, String networkToDrain, World oldWorld, int newWorldID, boolean teleposer) - { + public TeleportToDim(BlockPos blockPos, Entity entity, String networkToDrain, World oldWorld, int newWorldID, boolean teleposer) { super(blockPos, entity, networkToDrain); this.oldWorld = oldWorld; this.newWorldID = newWorldID; @@ -120,22 +107,17 @@ public class Teleports } @Override - public void teleport() - { - if (entity != null) - { - if (entity.timeUntilPortal <= 0) - { + public void teleport() { + if (entity != null) { + if (entity.timeUntilPortal <= 0) { MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); WorldServer oldWorldServer = server.getWorld(entity.dimension); WorldServer newWorldServer = server.getWorld(newWorldID); - if (entity instanceof EntityPlayer) - { + if (entity instanceof EntityPlayer) { EntityPlayerMP player = (EntityPlayerMP) entity; - if (!player.getEntityWorld().isRemote) - { + if (!player.getEntityWorld().isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); if (network.getCurrentEssence() < getTeleportCost()) return; @@ -155,8 +137,7 @@ public class Teleports MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z))); } - } else if (!entity.getEntityWorld().isRemote) - { + } else if (!entity.getEntityWorld().isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); if (network.getCurrentEssence() < (getTeleportCost() / 10)) return; @@ -174,8 +155,7 @@ public class Teleports 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) - { + if (teleportedEntity != null) { teleportedEntity.setLocationAndAngles(x + 0.5, y + 0.5, z + 0.5, entity.rotationYaw, entity.rotationPitch); teleportedEntity.forceSpawn = true; newWorldServer.spawnEntity(teleportedEntity); @@ -195,8 +175,7 @@ public class Teleports } @Override - public int getTeleportCost() - { + public int getTeleportCost() { return 10000; } diff --git a/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java index b436f7e6..c33f19c9 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java @@ -1,43 +1,37 @@ package WayofTime.bloodmagic.routing; -import java.util.List; - +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 WayofTime.bloodmagic.util.Utils; + +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 -{ +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. + * + * @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) - { + public void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput) { this.accessedTile = tile; this.itemHandler = itemHandler; } @@ -46,20 +40,16 @@ public class DefaultItemFilter implements IItemFilter * 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 - * + * + * @param inputStack - The stack to transfer * @return - The remainder of the stack after it has been absorbed into the - * inventory. + * inventory. */ @Override - public ItemStack transferStackThroughOutputFilter(ItemStack inputStack) - { + 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) - { + if (allowedAmount <= 0) { return inputStack; } @@ -83,10 +73,8 @@ public class DefaultItemFilter implements IItemFilter * the input inventory to the output inventory. */ @Override - public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) - { - for (int slot = 0; slot < itemHandler.getSlots(); slot++) - { + 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))) { @@ -100,8 +88,7 @@ public class DefaultItemFilter implements IItemFilter ItemStack remainderStack = outputFilter.transferStackThroughOutputFilter(testStack); int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); - if (!remainderStack.isEmpty() && remainderStack.getCount() == allowedAmount) - { + if (!remainderStack.isEmpty() && remainderStack.getCount() == allowedAmount) { //Nothing has changed. Moving on! continue; } @@ -119,14 +106,12 @@ public class DefaultItemFilter implements IItemFilter } @Override - public boolean doesStackMatchFilter(ItemStack testStack) - { + public boolean doesStackMatchFilter(ItemStack testStack) { return true; } @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) - { + 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 index 8d5f138b..d4851334 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java @@ -1,26 +1,23 @@ package WayofTime.bloodmagic.routing; -import java.util.List; - import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; -public interface IFluidFilter extends IRoutingFilter -{ +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 - * + * + * @param fluidStack - The stack to filter * @return - The remainder of the stack after it has been absorbed into the - * tank. + * tank. */ FluidStack transferStackThroughOutputFilter(FluidStack fluidStack); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java index 4b109eac..97bfdb01 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.routing; import net.minecraft.util.EnumFacing; -public interface IFluidRoutingNode extends IRoutingNode -{ +public interface IFluidRoutingNode extends IRoutingNode { boolean isTankConnectedToSide(EnumFacing side); int getPriority(EnumFacing side); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java index bd01f34f..8f8e7a6d 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.routing; import net.minecraft.util.EnumFacing; -public interface IInputFluidRoutingNode extends IFluidRoutingNode -{ +public interface IInputFluidRoutingNode extends IFluidRoutingNode { boolean isFluidInput(EnumFacing side); IFluidFilter getInputFluidFilterForSide(EnumFacing side); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java index b61db904..6e833a54 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.routing; import net.minecraft.util.EnumFacing; -public interface IInputItemRoutingNode extends IItemRoutingNode -{ +public interface IInputItemRoutingNode extends IItemRoutingNode { boolean isInput(EnumFacing side); IItemFilter getInputFilterForSide(EnumFacing side); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java index da01785c..443b0d69 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java @@ -1,25 +1,22 @@ package WayofTime.bloodmagic.routing; -import java.util.List; - import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.IItemHandler; -public interface IItemFilter extends IRoutingFilter -{ +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 - * + * + * @param inputStack - The stack to filter * @return - The remainder of the stack after it has been absorbed into the - * inventory. + * inventory. */ ItemStack transferStackThroughOutputFilter(ItemStack inputStack); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java index ed56109b..d52126a0 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.routing; import net.minecraft.util.EnumFacing; -public interface IItemRoutingNode extends IRoutingNode -{ +public interface IItemRoutingNode extends IRoutingNode { boolean isInventoryConnectedToSide(EnumFacing side); int getPriority(EnumFacing side); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java index d3f825b1..dba8ba08 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java @@ -4,8 +4,7 @@ import net.minecraft.util.math.BlockPos; import java.util.List; -public interface IMasterRoutingNode extends IRoutingNode -{ +public interface IMasterRoutingNode extends IRoutingNode { boolean isConnected(List path, BlockPos nodePos); void addNodeToList(IRoutingNode node); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java index 85f49736..08c3ce67 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.routing; import net.minecraft.util.EnumFacing; -public interface IOutputFluidRoutingNode extends IFluidRoutingNode -{ +public interface IOutputFluidRoutingNode extends IFluidRoutingNode { boolean isFluidOutput(EnumFacing side); IFluidFilter getOutputFluidFilterForSide(EnumFacing side); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java index 091cebd2..819e2813 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.routing; import net.minecraft.util.EnumFacing; -public interface IOutputItemRoutingNode extends IItemRoutingNode -{ +public interface IOutputItemRoutingNode extends IItemRoutingNode { boolean isOutput(EnumFacing side); IItemFilter getOutputFilterForSide(EnumFacing side); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java index 4de55c21..d7413770 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.routing; -public interface IRoutingFilter -{ +public interface IRoutingFilter { } diff --git a/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java index 4fe9e038..3498c570 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java @@ -5,8 +5,7 @@ import net.minecraft.world.World; import java.util.List; -public interface IRoutingNode -{ +public interface IRoutingNode { void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master); BlockPos getBlockPos(); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java index 334959b6..b7ef367d 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java @@ -2,15 +2,11 @@ package WayofTime.bloodmagic.routing; import net.minecraft.item.ItemStack; -public class IgnoreNBTItemFilter extends TestItemFilter -{ +public class IgnoreNBTItemFilter extends TestItemFilter { @Override - public boolean doesStackMatchFilter(ItemStack testStack) - { - for (ItemStack filterStack : requestList) - { - if (doStacksMatch(filterStack, testStack)) - { + public boolean doesStackMatchFilter(ItemStack testStack) { + for (ItemStack filterStack : requestList) { + if (doStacksMatch(filterStack, testStack)) { return true; } } @@ -19,8 +15,7 @@ public class IgnoreNBTItemFilter extends TestItemFilter } @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) - { + 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 index 56eb3644..c414770a 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java @@ -5,13 +5,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; -public class ModIdItemFilter extends TestItemFilter -{ +public class ModIdItemFilter extends TestItemFilter { @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) - { - if (ItemStack.areItemsEqualIgnoreDurability(filterStack, testStack)) - { + public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { + if (ItemStack.areItemsEqualIgnoreDurability(filterStack, testStack)) { String keyId = getModID(filterStack.getItem()); String checkedId = getModID(testStack.getItem()); return keyId.equals(checkedId); @@ -20,8 +17,7 @@ public class ModIdItemFilter extends TestItemFilter return false; } - public String getModID(Item item) - { + public String getModID(Item item) { ResourceLocation resource = ForgeRegistries.ITEMS.getKey(item); return resource.getResourceDomain(); } diff --git a/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java b/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java index 82bbc283..bd9ff18a 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java @@ -4,17 +4,13 @@ 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)) - { +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)) - { + if (!(tile instanceof IRoutingNode)) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java index 2cde4909..812c4cc3 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java @@ -3,15 +3,11 @@ package WayofTime.bloodmagic.routing; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class OreDictItemFilter extends TestItemFilter -{ +public class OreDictItemFilter extends TestItemFilter { @Override - public boolean doesStackMatchFilter(ItemStack testStack) - { - for (ItemStack filterStack : requestList) - { - if (doStacksMatch(filterStack, testStack)) - { + public boolean doesStackMatchFilter(ItemStack testStack) { + for (ItemStack filterStack : requestList) { + if (doStacksMatch(filterStack, testStack)) { return true; } } @@ -20,22 +16,17 @@ public class OreDictItemFilter extends TestItemFilter } @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) - { + public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { int[] filterIds = OreDictionary.getOreIDs(filterStack); int[] testIds = OreDictionary.getOreIDs(testStack); - if (filterIds.length <= 0 || testIds.length <= 0) - { + if (filterIds.length <= 0 || testIds.length <= 0) { return false; } - for (int filterId : filterIds) - { - for (int testId : testIds) - { - if (filterId == testId) - { + for (int filterId : filterIds) { + for (int testId : testIds) { + if (filterId == testId) { return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java index b5132798..81c51625 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -1,9 +1,5 @@ package WayofTime.bloodmagic.routing; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -14,55 +10,46 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; -public class RoutingFluidFilter implements IFluidFilter -{ +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) - { + public void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput) { this.accessedTile = tile; this.fluidHandler = fluidHandler; - if (isFilterOutput) - { + if (isFilterOutput) { //The requestList contains a list of how much can be extracted. requestList = new ArrayList(); - for (ItemStack filterStack : filteredList) - { + for (ItemStack filterStack : filteredList) { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) - { + if (fluidFilterStack != null) { requestList.add(fluidFilterStack); } } IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - for (IFluidTankProperties property : properties) - { + for (IFluidTankProperties property : properties) { FluidStack containedStack = property.getContents(); - if (containedStack != null) - { - for (FluidStack fluidFilterStack : requestList) - { - if (doStacksMatch(fluidFilterStack, containedStack)) - { + if (containedStack != null) { + for (FluidStack fluidFilterStack : requestList) { + if (doStacksMatch(fluidFilterStack, containedStack)) { fluidFilterStack.amount = Math.max(fluidFilterStack.amount - containedStack.amount, 0); } } } } - } else - { + } else { requestList = new ArrayList(); - for (ItemStack filterStack : filteredList) - { + for (ItemStack filterStack : filteredList) { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) - { + if (fluidFilterStack != null) { fluidFilterStack.amount *= -1; requestList.add(fluidFilterStack); } @@ -70,15 +57,11 @@ public class RoutingFluidFilter implements IFluidFilter IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - for (IFluidTankProperties property : properties) - { + for (IFluidTankProperties property : properties) { FluidStack containedStack = property.getContents(); - if (containedStack != null) - { - for (FluidStack fluidFilterStack : requestList) - { - if (doStacksMatch(fluidFilterStack, containedStack)) - { + if (containedStack != null) { + for (FluidStack fluidFilterStack : requestList) { + if (doStacksMatch(fluidFilterStack, containedStack)) { fluidFilterStack.amount += containedStack.amount; } } @@ -87,35 +70,20 @@ public class RoutingFluidFilter implements IFluidFilter } } - @Nullable - public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) - { - FluidStack fluidStack = FluidUtil.getFluidContained(inputStack); - if (fluidStack == null) - return null; - - fluidStack.amount = inputStack.getCount(); - return fluidStack; - } - /** * Gives the remainder~ */ @Override - public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) - { + public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) { int allowedAmount = 0; - for (FluidStack filterStack : requestList) - { - if (doStacksMatch(filterStack, fluidStack)) - { + for (FluidStack filterStack : requestList) { + if (doStacksMatch(filterStack, fluidStack)) { allowedAmount = Math.min(filterStack.amount, fluidStack.amount); break; } } - if (allowedAmount <= 0) - { + if (allowedAmount <= 0) { return fluidStack; } @@ -124,14 +92,11 @@ public class RoutingFluidFilter implements IFluidFilter copyStack.amount = fluidStack.amount - filledAmount; Iterator itr = requestList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) - { + if (doStacksMatch(filterStack, copyStack)) { filterStack.amount -= filledAmount; - if (filterStack.amount <= 0) - { + if (filterStack.amount <= 0) { itr.remove(); } } @@ -145,13 +110,10 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) - { - for (FluidStack filterFluidStack : requestList) - { + public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) { + for (FluidStack filterFluidStack : requestList) { int allowedAmount = Math.min(filterFluidStack.amount, maxTransfer); - if (allowedAmount <= 0) - { + if (allowedAmount <= 0) { continue; } @@ -163,8 +125,7 @@ public class RoutingFluidFilter implements IFluidFilter FluidStack remainderStack = outputFilter.transferStackThroughOutputFilter(drainStack); int drained = remainderStack == null ? copyStack.amount : (copyStack.amount - remainderStack.amount); - if (drained > 0) - { + if (drained > 0) { drainStack.amount = drained; fluidHandler.drain(drainStack, true); @@ -172,14 +133,11 @@ public class RoutingFluidFilter implements IFluidFilter } Iterator itr = requestList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) - { + if (doStacksMatch(filterStack, copyStack)) { filterStack.amount -= drained; - if (filterStack.amount <= 0) - { + if (filterStack.amount <= 0) { itr.remove(); } } @@ -197,12 +155,9 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public boolean doesStackMatchFilter(FluidStack testStack) - { - for (FluidStack filterStack : requestList) - { - if (doStacksMatch(filterStack, testStack)) - { + public boolean doesStackMatchFilter(FluidStack testStack) { + for (FluidStack filterStack : requestList) { + if (doStacksMatch(filterStack, testStack)) { return true; } } @@ -211,8 +166,17 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) - { + public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) { return testStack != null && filterStack.getFluid() == testStack.getFluid(); } + + @Nullable + public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) { + FluidStack fluidStack = FluidUtil.getFluidContained(inputStack); + if (fluidStack == null) + return null; + + fluidStack.amount = inputStack.getCount(); + return fluidStack; + } } diff --git a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java index 4ebd6109..ecf423d7 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java @@ -1,26 +1,23 @@ package WayofTime.bloodmagic.routing; -import java.util.Iterator; -import java.util.List; - +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 WayofTime.bloodmagic.util.GhostItemHelper; -import WayofTime.bloodmagic.util.Utils; + +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 -{ +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 @@ -33,73 +30,56 @@ public class TestItemFilter implements IItemFilter /** * 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. + * + * @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) - { + public void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput) { this.accessedTile = tile; this.itemHandler = itemHandler; - if (isFilterOutput) - { + if (isFilterOutput) { requestList = filteredList; - for (int slot = 0; slot < itemHandler.getSlots(); slot++) - { + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { ItemStack checkedStack = itemHandler.getStackInSlot(slot); - if (checkedStack.isEmpty()) - { + if (checkedStack.isEmpty()) { continue; } int stackSize = checkedStack.getCount(); - for (ItemStack filterStack : requestList) - { - if (filterStack.getCount() == 0) - { + for (ItemStack filterStack : requestList) { + if (filterStack.getCount() == 0) { continue; } - if (doStacksMatch(filterStack, checkedStack)) - { + if (doStacksMatch(filterStack, checkedStack)) { filterStack.setCount(Math.max(filterStack.getCount() - stackSize, 0)); } } } - } else - { + } else { requestList = filteredList; - for (ItemStack filterStack : requestList) - { + for (ItemStack filterStack : requestList) { filterStack.setCount(filterStack.getCount() * -1); //Invert the stack size so that } - for (int slot = 0; slot < itemHandler.getSlots(); slot++) - { + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { ItemStack checkedStack = itemHandler.getStackInSlot(slot); - if (checkedStack.isEmpty()) - { + if (checkedStack.isEmpty()) { continue; } int stackSize = checkedStack.getCount(); - for (ItemStack filterStack : filteredList) - { - if (doStacksMatch(filterStack, checkedStack)) - { + for (ItemStack filterStack : filteredList) { + if (doStacksMatch(filterStack, checkedStack)) { filterStack.grow(stackSize); } } @@ -107,11 +87,9 @@ public class TestItemFilter implements IItemFilter } Iterator iterator = requestList.iterator(); - while (iterator.hasNext()) - { + while (iterator.hasNext()) { ItemStack filterStack = iterator.next(); - if (filterStack.isEmpty()) - { + if (filterStack.isEmpty()) { iterator.remove(); } } @@ -121,27 +99,22 @@ public class TestItemFilter implements IItemFilter * 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 + * + * @param inputStack - The stack to transfer * @return - The remainder of the stack after it has been absorbed into the - * inventory. + * inventory. */ @Override - public ItemStack transferStackThroughOutputFilter(ItemStack inputStack) - { + public ItemStack transferStackThroughOutputFilter(ItemStack inputStack) { int allowedAmount = 0; - for (ItemStack filterStack : requestList) - { - if (doStacksMatch(filterStack, inputStack)) - { + for (ItemStack filterStack : requestList) { + if (doStacksMatch(filterStack, inputStack)) { allowedAmount = Math.min(filterStack.getCount(), inputStack.getCount()); break; } } - if (allowedAmount <= 0) - { + if (allowedAmount <= 0) { return inputStack; } @@ -154,14 +127,11 @@ public class TestItemFilter implements IItemFilter testStack.shrink(changeAmount); Iterator itr = requestList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { ItemStack filterStack = itr.next(); - if (doStacksMatch(filterStack, inputStack)) - { + if (doStacksMatch(filterStack, inputStack)) { filterStack.shrink(changeAmount); - if (filterStack.isEmpty()) - { + if (filterStack.isEmpty()) { itr.remove(); } } @@ -179,10 +149,8 @@ public class TestItemFilter implements IItemFilter * the input inventory to the output inventory. */ @Override - public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) - { - for (int slot = 0; slot < itemHandler.getSlots(); slot++) - { + 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))) { @@ -190,17 +158,14 @@ public class TestItemFilter implements IItemFilter } int allowedAmount = 0; - for (ItemStack filterStack : requestList) - { - if (doStacksMatch(filterStack, inputStack)) - { + 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) - { + if (allowedAmount <= 0) { continue; } @@ -209,8 +174,7 @@ public class TestItemFilter implements IItemFilter ItemStack remainderStack = outputFilter.transferStackThroughOutputFilter(testStack); int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); - if (!remainderStack.isEmpty() && remainderStack.getCount() == allowedAmount) - { + if (!remainderStack.isEmpty() && remainderStack.getCount() == allowedAmount) { //Nothing has changed. Moving on! continue; } @@ -218,14 +182,11 @@ public class TestItemFilter implements IItemFilter itemHandler.extractItem(slot, changeAmount, false); Iterator itr = requestList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { ItemStack filterStack = itr.next(); - if (doStacksMatch(filterStack, inputStack)) - { + if (doStacksMatch(filterStack, inputStack)) { filterStack.shrink(changeAmount); - if (filterStack.isEmpty()) - { + if (filterStack.isEmpty()) { itr.remove(); } } @@ -242,12 +203,9 @@ public class TestItemFilter implements IItemFilter } @Override - public boolean doesStackMatchFilter(ItemStack testStack) - { - for (ItemStack filterStack : requestList) - { - if (doStacksMatch(filterStack, testStack)) - { + public boolean doesStackMatchFilter(ItemStack testStack) { + for (ItemStack filterStack : requestList) { + if (doStacksMatch(filterStack, testStack)) { return true; } } @@ -256,8 +214,7 @@ public class TestItemFilter implements IItemFilter } @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) - { + public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { return Utils.canCombine(filterStack, testStack); } } diff --git a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java index 2b18479e..58b52194 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.structures; -import java.util.Random; - import WayofTime.bloodmagic.BloodMagic; import net.minecraft.server.MinecraftServer; import net.minecraft.util.Mirror; @@ -13,10 +11,10 @@ import net.minecraft.world.gen.structure.template.PlacementSettings; import net.minecraft.world.gen.structure.template.Template; import net.minecraft.world.gen.structure.template.TemplateManager; -public class BuildTestStructure -{ - public boolean placeStructureAtPosition(Random rand, Rotation baseRotation, WorldServer world, BlockPos pos, int iteration) - { +import java.util.Random; + +public class BuildTestStructure { + public boolean placeStructureAtPosition(Random rand, Rotation baseRotation, WorldServer world, BlockPos pos, int iteration) { if (pos == null) return false; @@ -26,8 +24,7 @@ public class BuildTestStructure ResourceLocation resource = new ResourceLocation(BloodMagic.MODID, "Corridor1"); Template template = templatemanager.getTemplate(minecraftserver, resource); - if (template == null) - { + if (template == null) { System.out.println("Invalid template for location: " + resource); return false; } diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index 4a00f85c..11209c0c 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -1,30 +1,19 @@ package WayofTime.bloodmagic.structures; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Random; - -import net.minecraft.block.Block; +import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import net.minecraft.util.EnumFacing; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; import net.minecraft.world.WorldServer; import net.minecraft.world.gen.structure.template.PlacementSettings; - import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; +import java.util.*; +import java.util.Map.Entry; -public class Dungeon -{ - public static boolean placeStructureAtPosition(Random rand, WorldServer world, BlockPos pos) - { +public class Dungeon { + public static boolean placeStructureAtPosition(Random rand, WorldServer world, BlockPos pos) { long startTime = System.nanoTime(); Map> availableDoorMap = new HashMap>(); //Map of doors. The EnumFacing indicates what way this door faces. @@ -47,27 +36,21 @@ public class Dungeon DungeonRoom room = getRandomRoom(rand); roomMap.put(pos, Pair.of(room, settings.copy())); descriptorList.addAll(room.getAreaDescriptors(settings, pos)); - for (EnumFacing facing : EnumFacing.VALUES) - { - if (availableDoorMap.containsKey(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (availableDoorMap.containsKey(facing)) { List doorList = availableDoorMap.get(facing); doorList.addAll(room.getDoorOffsetsForFacing(settings, facing, pos)); - } else - { + } 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++) - { + for (int i = 0; i < 100; i++) { List facingList = new ArrayList(); - for (Entry> entry : availableDoorMap.entrySet()) - { - if (entry.getValue() != null && !entry.getValue().isEmpty()) - { + for (Entry> entry : availableDoorMap.entrySet()) { + if (entry.getValue() != null && !entry.getValue().isEmpty()) { facingList.add(entry.getKey()); } } @@ -78,8 +61,8 @@ public class Dungeon Pair removedDoor2 = null; BlockPos roomLocation = null; - roomPlacement: for (EnumFacing doorFacing : facingList) - { + roomPlacement: + for (EnumFacing doorFacing : facingList) { EnumFacing oppositeDoorFacing = doorFacing.getOpposite(); List availableDoorList = availableDoorMap.get(doorFacing); //May need to copy here Collections.shuffle(availableDoorList); @@ -88,23 +71,19 @@ public class Dungeon DungeonRoom testingRoom = getRandomRoom(rand); List otherDoorList = testingRoom.getDoorOffsetsForFacing(settings, oppositeDoorFacing, BlockPos.ORIGIN); - if (otherDoorList != null && !otherDoorList.isEmpty()) - { + 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) - { + 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)) - { + for (AreaDescriptor testDesc : descriptors) { + for (AreaDescriptor currentDesc : descriptorList) { + if (testDesc.intersects(currentDesc)) { break testDoor; } } @@ -124,33 +103,26 @@ public class Dungeon // Collections.shuffle(otherDoorList); } - if (removedDoor1 != null) - { - for (EnumFacing facing : EnumFacing.VALUES) - { - if (availableDoorMap.containsKey(facing)) - { + if (removedDoor1 != null) { + for (EnumFacing facing : EnumFacing.VALUES) { + if (availableDoorMap.containsKey(facing)) { List doorList = availableDoorMap.get(facing); doorList.addAll(room.getDoorOffsetsForFacing(settings, facing, roomLocation)); - } else - { + } else { List doorList = room.getDoorOffsetsForFacing(settings, facing, roomLocation); availableDoorMap.put(facing, doorList); } } EnumFacing face = removedDoor1.getKey(); - if (availableDoorMap.containsKey(face)) - { + if (availableDoorMap.containsKey(face)) { availableDoorMap.get(face).remove(removedDoor1.getRight()); } } - if (removedDoor2 != null) - { + if (removedDoor2 != null) { EnumFacing face = removedDoor2.getKey(); - if (availableDoorMap.containsKey(face)) - { + if (availableDoorMap.containsKey(face)) { availableDoorMap.get(face).remove(removedDoor2.getRight()); } } @@ -162,8 +134,7 @@ public class Dungeon System.out.println("Duration: " + duration + "(ns), " + duration / 1000000 + "(ms)"); //Building what I've got - for (Entry> entry : roomMap.entrySet()) - { + for (Entry> entry : roomMap.entrySet()) { BlockPos placementPos = entry.getKey(); DungeonRoom placedRoom = entry.getValue().getKey(); PlacementSettings placementSettings = entry.getValue().getValue(); @@ -174,8 +145,7 @@ public class Dungeon return false; } - public static DungeonRoom getRandomRoom(Random rand) - { + 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 index ed72b577..d9ab71a6 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java @@ -1,57 +1,46 @@ package WayofTime.bloodmagic.structures; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Random; - +import WayofTime.bloodmagic.api.ritual.AreaDescriptor; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; import net.minecraft.world.gen.structure.template.PlacementSettings; import net.minecraft.world.gen.structure.template.Template; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -public class DungeonRoom -{ +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) - { + public DungeonRoom(Map structureMap, Map> doorMap, List descriptorList) { this.structureMap = structureMap; this.doorMap = doorMap; this.descriptorList = descriptorList; } - public List getAreaDescriptors(PlacementSettings settings, BlockPos offset) - { + public List getAreaDescriptors(PlacementSettings settings, BlockPos offset) { List newList = new ArrayList(); - for (AreaDescriptor desc : descriptorList) - { + for (AreaDescriptor desc : descriptorList) { newList.add(desc.rotateDescriptor(settings).offset(offset)); } return newList; } - public List getDoorOffsetsForFacing(PlacementSettings settings, EnumFacing facing, BlockPos offset) - { + public List getDoorOffsetsForFacing(PlacementSettings settings, EnumFacing facing, BlockPos offset) { List offsetList = new ArrayList(); EnumFacing originalFacing = DungeonUtil.reverseRotate(settings.getMirror(), settings.getRotation(), facing); - if (doorMap.containsKey(originalFacing)) - { + if (doorMap.containsKey(originalFacing)) { List doorList = doorMap.get(originalFacing); - for (BlockPos doorPos : doorList) - { + for (BlockPos doorPos : doorList) { offsetList.add(Template.transformedBlockPos(settings, doorPos).add(offset)); } } @@ -59,10 +48,8 @@ public class DungeonRoom return offsetList; } - public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, WorldServer world, BlockPos pos) - { - for (Entry entry : structureMap.entrySet()) - { + public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, WorldServer 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()); diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java index 05ee3546..a8b3038f 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java @@ -1,95 +1,75 @@ package WayofTime.bloodmagic.structures; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.Writer; -import java.net.URL; -import java.util.List; -import java.util.Random; - 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 WayofTime.bloodmagic.gson.Serializers; +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()) - { +public class DungeonRoomLoader { + public static void saveDungeons() { + for (DungeonRoom room : DungeonRoomRegistry.dungeonWeightMap.keySet()) { saveSingleDungeon(room); } } - public static void saveSingleDungeon(DungeonRoom room) - { + public static void saveSingleDungeon(DungeonRoom room) { String json = Serializers.GSON.toJson(room); Writer writer; - try - { + 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) - { + } catch (IOException e) { e.printStackTrace(); } } - public static void loadDungeons() - { - try - { + 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) - { + 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) - { + } catch (Exception e) { e.printStackTrace(); } } - public static void test() - { + public static void test() { ResourceLocation id = new ResourceLocation(BloodMagic.MODID, "testGson"); String s = id.getResourceDomain(); String s1 = id.getResourcePath(); InputStream inputstream = null; - try - { + try { inputstream = DungeonRoomLoader.class.getResourceAsStream("/assets/" + s + "/schematics/" + s1 + ".nbt"); // this.readTemplateFromStream(s1, inputstream); return; - } catch (Throwable var10) - { + } catch (Throwable var10) { - } finally - { + } finally { IOUtils.closeQuietly(inputstream); } } - public static String resLocToResourcePath(ResourceLocation resourceLocation) - { + public static String resLocToResourcePath(ResourceLocation resourceLocation) { return "/assets/" + resourceLocation.getResourceDomain() + "/schematics/" + resourceLocation.getResourcePath() + ".json"; } } diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java index bfd47d8b..3bd4ab75 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java @@ -5,25 +5,20 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Random; -public class DungeonRoomRegistry -{ +public class DungeonRoomRegistry { public static Map dungeonWeightMap = new HashMap(); private static int totalWeight = 0; - public static void registerDungeonRoom(DungeonRoom room, int weight) - { + public static void registerDungeonRoom(DungeonRoom room, int weight) { dungeonWeightMap.put(room, weight); totalWeight += weight; } - public static DungeonRoom getRandomDungeonRoom(Random rand) - { + public static DungeonRoom getRandomDungeonRoom(Random rand) { int wantedWeight = rand.nextInt(totalWeight); - for (Entry entry : dungeonWeightMap.entrySet()) - { + for (Entry entry : dungeonWeightMap.entrySet()) { wantedWeight -= entry.getValue(); - if (wantedWeight < 0) - { + if (wantedWeight < 0) { return entry.getKey(); } } diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java index 2c3aeeb8..8e06624f 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.structures; -import java.util.Random; - import net.minecraft.server.MinecraftServer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -10,17 +8,16 @@ import net.minecraft.world.gen.structure.template.PlacementSettings; import net.minecraft.world.gen.structure.template.Template; import net.minecraft.world.gen.structure.template.TemplateManager; -public class DungeonStructure -{ +import java.util.Random; + +public class DungeonStructure { public ResourceLocation resource; - public DungeonStructure(ResourceLocation resource) - { + public DungeonStructure(ResourceLocation resource) { this.resource = resource; } - public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, WorldServer world, BlockPos pos) - { + public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, WorldServer world, BlockPos pos) { if (pos == null) return false; @@ -29,8 +26,7 @@ public class DungeonStructure Template template = templatemanager.getTemplate(minecraftserver, resource); - if (template == null) - { + if (template == null) { System.out.println("Invalid template for location: " + resource); return false; } @@ -44,8 +40,7 @@ public class DungeonStructure return true; } - public DungeonStructure copy() - { + 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 index 2cfcd8f3..70bc4aaf 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java @@ -1,19 +1,16 @@ package WayofTime.bloodmagic.structures; -import java.util.Random; - import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; -public class DungeonTester -{ - public static void testDungeonGeneration(WorldServer world, BlockPos pos) - { +import java.util.Random; + +public class DungeonTester { + public static void testDungeonGeneration(WorldServer world, BlockPos pos) { } - public static void testDungeonElementWithOutput(WorldServer world, BlockPos pos) - { + public static void testDungeonElementWithOutput(WorldServer world, BlockPos pos) { Dungeon.placeStructureAtPosition(new Random(), world, pos); // ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "Corridor1"); // diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java index a6acf178..9534787e 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java @@ -1,52 +1,43 @@ package WayofTime.bloodmagic.structures; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - import net.minecraft.util.EnumFacing; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.structure.template.PlacementSettings; -public class DungeonUtil -{ - public static EnumFacing rotate(Mirror mirror, Rotation rotation, EnumFacing original) - { +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class DungeonUtil { + public static EnumFacing rotate(Mirror mirror, Rotation rotation, EnumFacing original) { return rotation.rotate(mirror.mirror(original)); } - public static EnumFacing reverseRotate(Mirror mirror, Rotation rotation, EnumFacing original) - { + public static EnumFacing reverseRotate(Mirror mirror, Rotation rotation, EnumFacing original) { return mirror.mirror(getOppositeRotation(rotation).rotate(original)); } - public static EnumFacing getFacingForSettings(PlacementSettings settings, EnumFacing original) - { + public static EnumFacing getFacingForSettings(PlacementSettings settings, EnumFacing 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 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, EnumFacing facing, BlockPos offsetPos) - { - if (doorMap.containsKey(facing)) - { + public static void addRoom(Map> doorMap, EnumFacing facing, BlockPos offsetPos) { + if (doorMap.containsKey(facing)) { doorMap.get(facing).add(offsetPos); - } else - { + } 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 index d7d493b2..469e3abe 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java +++ b/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.structures; -public class ModDungeons -{ - public static void init() - { +public class ModDungeons { + public static void init() { // ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "HallChest1"); // // Map structureMap = new HashMap(); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 70f11cc8..6905948d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,40 +1,36 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.api.iface.IAlchemyArray; +import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; -import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; -public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray -{ +public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray { public boolean isActive = false; public int activeCounter = 0; - public EnumFacing rotation = EnumFacing.HORIZONTALS[0];; + public EnumFacing rotation = EnumFacing.HORIZONTALS[0]; + ; private String key = "empty"; private AlchemyArrayEffect arrayEffect; - public TileAlchemyArray() - { + public TileAlchemyArray() { super(2, "alchemyArray"); } - public void onEntityCollidedWithBlock(IBlockState state, Entity entity) - { - if (arrayEffect != null) - { + public void onEntityCollidedWithBlock(IBlockState state, Entity entity) { + if (arrayEffect != null) { arrayEffect.onEntityCollidedWithBlock(this, getWorld(), pos, state, entity); } } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { super.deserialize(tagCompound); this.isActive = tagCompound.getBoolean("isActive"); this.activeCounter = tagCompound.getInteger("activeCounter"); @@ -43,15 +39,13 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche NBTTagCompound arrayTag = tagCompound.getCompoundTag("arrayTag"); arrayEffect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(key); - if (arrayEffect != null) - { + if (arrayEffect != null) { arrayEffect.readFromNBT(arrayTag); } } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { super.serialize(tagCompound); tagCompound.setBoolean("isActive", isActive); tagCompound.setInteger("activeCounter", activeCounter); @@ -59,8 +53,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche tagCompound.setInteger(Constants.NBT.DIRECTION, rotation.getHorizontalIndex()); NBTTagCompound arrayTag = new NBTTagCompound(); - if (arrayEffect != null) - { + if (arrayEffect != null) { arrayEffect.writeToNBT(arrayTag); } tagCompound.setTag("arrayTag", arrayTag); @@ -69,19 +62,15 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 1; } @Override - public void update() - { - if (isActive && attemptCraft()) - { + public void update() { + if (isActive && attemptCraft()) { activeCounter++; - } else - { + } else { isActive = false; activeCounter = 0; arrayEffect = null; @@ -93,49 +82,38 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche * This occurs when the block is destroyed. */ @Override - public void dropItems() - { + public void dropItems() { super.dropItems(); - if (arrayEffect != null) - { + if (arrayEffect != null) { } } - public boolean attemptCraft() - { + public boolean attemptCraft() { AlchemyArrayEffect effect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(this.getStackInSlot(0), this.getStackInSlot(1)); - if (effect != null) - { - if (arrayEffect == null) - { + if (effect != null) { + if (arrayEffect == null) { arrayEffect = effect; key = effect.getKey(); - } else - { + } else { String effectKey = effect.getKey(); - if (effectKey.equals(key)) - { + if (effectKey.equals(key)) { //Good! Moving on. - } else - { + } else { //Something has changed, therefore we have to move our stuffs. //TODO: Add an AlchemyArrayEffect.onBreak(); ? arrayEffect = effect; key = effect.getKey(); } } - } else - { + } else { return false; } - if (arrayEffect != null) - { + if (arrayEffect != null) { isActive = true; - if (arrayEffect.update(this, this.activeCounter)) - { + if (arrayEffect.update(this, this.activeCounter)) { this.decrStackSize(0, 1); this.decrStackSize(1, 1); this.getWorld().setBlockToAir(getPos()); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index c0d9086e..0290cf78 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -1,9 +1,13 @@ package WayofTime.bloodmagic.tile; -import java.util.ArrayList; -import java.util.List; - +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.api.saving.SoulNetwork; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -16,17 +20,11 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.SidedInvWrapper; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import com.google.common.base.Strings; +import java.util.ArrayList; +import java.util.List; -public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable -{ +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; @@ -37,26 +35,22 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public int ticksRequired = 1; public BlockPos connectedPos = BlockPos.ORIGIN; - public boolean[] blockedSlots = new boolean[] { false, false, false, false, false, false }; + public boolean[] blockedSlots = new boolean[]{false, false, false, false, false, false}; - public TileAlchemyTable() - { + public TileAlchemyTable() { super(9, "alchemyTable"); } - public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) - { + public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) { this.isSlave = isSlave; this.connectedPos = connectedPos; - if (!isSlave) - { + if (!isSlave) { this.direction = direction; } } - public boolean isInvisible() - { + public boolean isInvisible() { return isSlave(); } @@ -64,15 +58,13 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return !(slot < 6 && slot >= 0) || !blockedSlots[slot]; } - public void toggleInputSlotAccessible(int slot) - { + public void toggleInputSlotAccessible(int slot) { if (slot < 6 && slot >= 0) blockedSlots[slot] = !blockedSlots[slot]; } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); isSlave = tag.getBoolean("isSlave"); @@ -88,8 +80,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setBoolean("isSlave", isSlave); @@ -111,19 +102,14 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, @SuppressWarnings("unchecked") @Override - public T getCapability(Capability capability, EnumFacing facing) - { - if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) - { - if (this.isSlave()) - { + public T getCapability(Capability capability, EnumFacing facing) { + if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + if (this.isSlave()) { TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable) - { + if (tile instanceof TileAlchemyTable) { return (T) new SidedInvWrapper((TileAlchemyTable) tile, facing); } - } else - { + } else { return (T) new SidedInvWrapper(this, facing); } } @@ -132,73 +118,58 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public int[] getSlotsForFace(EnumFacing 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 }; + public int[] getSlotsForFace(EnumFacing 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, EnumFacing 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: - return getAccessibleInputSlots(direction).contains(index); + public boolean canInsertItem(int index, ItemStack stack, EnumFacing 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: + return getAccessibleInputSlots(direction).contains(index); } } @Override - public boolean canExtractItem(int index, ItemStack stack, EnumFacing 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: - return getAccessibleInputSlots(direction).contains(index); + public boolean canExtractItem(int index, ItemStack stack, EnumFacing 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: + return getAccessibleInputSlots(direction).contains(index); } } - public List getAccessibleInputSlots(EnumFacing direction) - { + public List getAccessibleInputSlots(EnumFacing direction) { List list = new ArrayList(); - for (int i = 0; i < 6; i++) - { - if (isInputSlotAccessible(i)) - { + for (int i = 0; i < 6; i++) { + if (isInputSlotAccessible(i)) { list.add(i); } } @@ -207,19 +178,15 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public void update() - { - if (isSlave()) - { + public void update() { + if (isSlave()) { return; } List inputList = new ArrayList(); - for (int i = 0; i < 6; i++) - { - if (!getStackInSlot(i).isEmpty()) - { + for (int i = 0; i < 6; i++) { + if (!getStackInSlot(i).isEmpty()) { inputList.add(getStackInSlot(i)); } } @@ -227,34 +194,26 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, int tier = getTierOfOrb(); AlchemyTableRecipe recipe = AlchemyTableRecipeRegistry.getMatchingRecipe(inputList, getWorld(), getPos()); - if (recipe != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) - { - if (burnTime == 1) - { + if (recipe != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) { + if (burnTime == 1) { IBlockState state = getWorld().getBlockState(pos); getWorld().notifyBlockUpdate(getPos(), state, state, 3); } - if (canCraft(inputList, recipe)) - { + if (canCraft(inputList, recipe)) { ticksRequired = recipe.getTicksRequired(); burnTime++; - if (burnTime == ticksRequired) - { - if (!getWorld().isRemote) - { + if (burnTime == ticksRequired) { + if (!getWorld().isRemote) { int requiredLp = recipe.getLpDrained(); - if (requiredLp > 0) - { - if (!getWorld().isRemote) - { + if (requiredLp > 0) { + if (!getWorld().isRemote) { consumeLp(requiredLp); } } - if (!getWorld().isRemote) - { + if (!getWorld().isRemote) { craftItem(inputList, recipe); } } @@ -263,29 +222,23 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, IBlockState state = getWorld().getBlockState(pos); getWorld().notifyBlockUpdate(getPos(), state, state, 3); - } else if (burnTime > ticksRequired + 10) - { + } else if (burnTime > ticksRequired + 10) { burnTime = 0; } - } else - { + } else { burnTime = 0; } - } else - { + } else { burnTime = 0; } } - public double getProgressForGui() - { + public double getProgressForGui() { return ((double) burnTime) / ticksRequired; } - private boolean canCraft(List inputList, AlchemyTableRecipe recipe) - { - if (recipe == null) - { + private boolean canCraft(List inputList, AlchemyTableRecipe recipe) { + if (recipe == null) { return false; } @@ -301,13 +254,10 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); } - public int getTierOfOrb() - { + public int getTierOfOrb() { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) - { - if (orbStack.getItem() instanceof IBloodOrb) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); return orb == null ? 0 : orb.getTier(); } @@ -316,24 +266,19 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public int getContainedLp() - { + public int getContainedLp() { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) - { - if (orbStack.getItem() instanceof IBloodOrb) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { NBTTagCompound itemTag = orbStack.getTagCompound(); - if (itemTag == null) - { + if (itemTag == null) { return 0; } String ownerUUID = itemTag.getString(Constants.NBT.OWNER_UUID); - if (Strings.isNullOrEmpty(ownerUUID)) - { + if (Strings.isNullOrEmpty(ownerUUID)) { return 0; } @@ -346,18 +291,14 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void craftItem(List inputList, AlchemyTableRecipe recipe) - { - if (this.canCraft(inputList, recipe)) - { + public void craftItem(List inputList, AlchemyTableRecipe recipe) { + if (this.canCraft(inputList, recipe)) { ItemStack outputStack = recipe.getRecipeOutput(inputList); ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (currentOutputStack.isEmpty()) - { + if (currentOutputStack.isEmpty()) { setInventorySlotContents(outputSlot, outputStack); - } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) - { + } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) { currentOutputStack.grow(outputStack.getCount()); } @@ -365,16 +306,12 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } - public int consumeLp(int requested) - { + public int consumeLp(int requested) { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) - { - if (orbStack.getItem() instanceof IBloodOrb) - { - if (NetworkHelper.syphonFromContainer(orbStack, requested)) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { + if (NetworkHelper.syphonFromContainer(orbStack, requested)) { return requested; } } @@ -383,34 +320,19 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void consumeInventory(AlchemyTableRecipe recipe) - { + public void consumeInventory(AlchemyTableRecipe recipe) { ItemStack[] input = new ItemStack[6]; - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { input[i] = getStackInSlot(i); } ItemStack[] result = recipe.getRemainingItems(input); - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { setInventorySlotContents(i, result[i]); } } - public static int getOrbSlot() { - return orbSlot; - } - - public static int getToolSlot() { - return toolSlot; - } - - public static int getOutputSlot() { - return outputSlot; - } - public EnumFacing getDirection() { return direction; } @@ -434,4 +356,16 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, 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 d1892d27..945c7918 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java @@ -1,31 +1,28 @@ package WayofTime.bloodmagic.tile; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.altar.BloodAltar; +import WayofTime.bloodmagic.api.altar.EnumAltarTier; +import WayofTime.bloodmagic.api.altar.IBloodAltar; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -public class TileAltar extends TileInventory implements IBloodAltar, ITickable -{ +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class TileAltar extends TileInventory implements IBloodAltar, ITickable { private BloodAltar bloodAltar; - public TileAltar() - { + public TileAltar() { super(1, "altar"); this.bloodAltar = new BloodAltar(this); } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { super.deserialize(tagCompound); NBTTagCompound altarTag = tagCompound.getCompoundTag("bloodAltar"); @@ -34,8 +31,7 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { super.serialize(tagCompound); NBTTagCompound altarTag = new NBTTagCompound(); @@ -46,164 +42,136 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable } @Override - public void update() - { + public void update() { bloodAltar.update(); } @Override - public void sacrificialDaggerCall(int amount, boolean isSacrifice) - { + public void sacrificialDaggerCall(int amount, boolean isSacrifice) { bloodAltar.sacrificialDaggerCall(amount, isSacrifice); } @Override - public boolean isItemValidForSlot(int slot, ItemStack itemstack) - { + public boolean isItemValidForSlot(int slot, ItemStack itemstack) { return slot == 0; } @Override - public int getCapacity() - { + public int getCapacity() { return bloodAltar.getCapacity(); } @Override - public int getCurrentBlood() - { + public int getCurrentBlood() { return bloodAltar.getCurrentBlood(); } @Override - public EnumAltarTier getTier() - { + public EnumAltarTier getTier() { return bloodAltar.getTier(); } @Override - public int getProgress() - { + public int getProgress() { return bloodAltar.getProgress(); } @Override - public float getSacrificeMultiplier() - { + public float getSacrificeMultiplier() { return bloodAltar.getSacrificeMultiplier(); } @Override - public float getSelfSacrificeMultiplier() - { + public float getSelfSacrificeMultiplier() { return bloodAltar.getSelfSacrificeMultiplier(); } @Override - public float getOrbMultiplier() - { + public float getOrbMultiplier() { return bloodAltar.getOrbMultiplier(); } @Override - public float getDislocationMultiplier() - { + public float getDislocationMultiplier() { return bloodAltar.getDislocationMultiplier(); } @Override - public float getConsumptionMultiplier() - { + public float getConsumptionMultiplier() { return bloodAltar.getConsumptionMultiplier(); } @Override - public float getConsumptionRate() - { + public float getConsumptionRate() { return bloodAltar.getConsumptionRate(); } @Override - public int getLiquidRequired() - { + public int getLiquidRequired() { return bloodAltar.getLiquidRequired(); } @Override - public int getBufferCapacity() - { + public int getBufferCapacity() { return bloodAltar.getBufferCapacity(); } @Override - public void startCycle() - { + public void startCycle() { bloodAltar.startCycle(); } @Override - public void checkTier() - { + public void checkTier() { bloodAltar.checkTier(); } @Override - public void requestPauseAfterCrafting(int cooldown) - { + public void requestPauseAfterCrafting(int cooldown) { bloodAltar.requestPauseAfterCrafting(cooldown); } @Override - public boolean isActive() - { + public boolean isActive() { return bloodAltar.isActive(); } @Override - public int fillMainTank(int amount) - { + public int fillMainTank(int amount) { return bloodAltar.fillMainTank(amount); } @Override - public void setActive() - { + public void setActive() { bloodAltar.setActive(); } @Override - public int getChargingRate() - { + public int getChargingRate() { return bloodAltar.getChargingRate(); } @Override - public int getTotalCharge() - { + public int getTotalCharge() { return bloodAltar.getTotalCharge(); } @Override - public int getChargingFrequency() - { + public int getChargingFrequency() { return bloodAltar.getChargingFrequency(); } - public EnumAltarTier getCurrentTierDisplayed() - { + public EnumAltarTier getCurrentTierDisplayed() { return bloodAltar.getCurrentTierDisplayed(); } - public boolean setCurrentTierDisplayed(EnumAltarTier altarTier) - { + public boolean setCurrentTierDisplayed(EnumAltarTier altarTier) { return bloodAltar.setCurrentTierDisplayed(altarTier); } @Override - public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) - { - if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) - { + public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { return true; } @@ -212,10 +180,8 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable @SuppressWarnings("unchecked") @Override - public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) - { - if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) - { + public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { return (T) bloodAltar; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java index 0df38b4a..2bf3e98e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java @@ -9,28 +9,23 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -public class TileBloodTank extends TileBase -{ +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 static final int[] CAPACITIES = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65336, 131072, 262144, 524288 }; - - public TileBloodTank(int meta) - { + public TileBloodTank(int meta) { capacity = CAPACITIES[meta] * Fluid.BUCKET_VOLUME; tank = new FluidTank(capacity); } - public TileBloodTank() - { + public TileBloodTank() { capacity = CAPACITIES[0] * Fluid.BUCKET_VOLUME; tank = new FluidTank(capacity); } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { super.deserialize(tagCompound); tank.readFromNBT(tagCompound.getCompoundTag(Constants.NBT.TANK)); capacity = tagCompound.getInteger(Constants.NBT.ALTAR_CAPACITY); @@ -38,8 +33,7 @@ public class TileBloodTank extends TileBase } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { super.serialize(tagCompound); if (tank.getFluidAmount() != 0) tagCompound.setTag(Constants.NBT.TANK, tank.writeToNBT(new NBTTagCompound())); @@ -47,45 +41,38 @@ public class TileBloodTank extends TileBase return tagCompound; } - public int getCapacity() - { + public int getCapacity() { return capacity; } - public FluidTank getTank() - { + public FluidTank getTank() { return tank; } - public Fluid getClientRenderFluid() - { + public Fluid getClientRenderFluid() { if (tank != null && tank.getFluid() != null) return tank.getFluid().getFluid(); return null; } - public float getRenderHeight() - { + public float getRenderHeight() { if (tank != null && tank.getFluidAmount() > 0) return (float) tank.getFluidAmount() / (float) getCapacity(); return 0F; } - public int getComparatorOutput() - { + public int getComparatorOutput() { return tank.getFluidAmount() > 0 ? (int) (1 + ((double) tank.getFluidAmount() / (double) tank.getCapacity()) * 14) : 0; } @Override - public boolean hasCapability(Capability capability, EnumFacing facing) - { + public boolean hasCapability(Capability capability, EnumFacing facing) { return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY || super.hasCapability(capability, facing); } @SuppressWarnings("unchecked") @Override - public T getCapability(Capability capability, EnumFacing facing) - { + public T getCapability(Capability capability, EnumFacing 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 index 0308178f..ac4a0e7b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -14,72 +14,55 @@ import net.minecraft.util.ITickable; import java.util.HashMap; import java.util.Map.Entry; -public class TileDemonCrucible extends TileInventory implements ITickable, IDemonWillConduit, ISidedInventory -{ - public HashMap willMap = new HashMap(); //TODO: Change to DemonWillHolder +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() - { + public TileDemonCrucible() { super(1, "demonCrucible"); } @Override - public void update() - { - if (getWorld().isRemote) - { + public void update() { + if (getWorld().isRemote) { return; } internalCounter++; - if (getWorld().isBlockPowered(getPos())) - { + if (getWorld().isBlockPowered(getPos())) { //TODO: Fill the contained gem if it is there. ItemStack stack = this.getStackInSlot(0); - if (stack.getItem() instanceof IDemonWillGem) - { + if (stack.getItem() instanceof IDemonWillGem) { IDemonWillGem gemItem = (IDemonWillGem) stack.getItem(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { - if (willMap.containsKey(type)) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { + if (willMap.containsKey(type)) { double current = willMap.get(type); double fillAmount = Math.min(gemDrainRate, current); - if (fillAmount > 0) - { + if (fillAmount > 0) { fillAmount = gemItem.fillWill(type, stack, fillAmount, true); - if (willMap.get(type) - fillAmount <= 0) - { + if (willMap.get(type) - fillAmount <= 0) { willMap.remove(type); - } else - { + } else { willMap.put(type, willMap.get(type) - fillAmount); } } } } } - } else - { + } else { ItemStack stack = this.getStackInSlot(0); - if (!stack.isEmpty()) - { - if (stack.getItem() instanceof IDemonWillGem) - { + if (!stack.isEmpty()) { + if (stack.getItem() instanceof IDemonWillGem) { IDemonWillGem gemItem = (IDemonWillGem) stack.getItem(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + 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) - { + if (filled > 0) { filled = gemItem.drainWill(type, stack, filled, true); WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, filled, maxWill, true); } @@ -91,14 +74,11 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double needed = maxWill - currentAmount; double discreteAmount = willItem.getDiscretization(stack); - if (needed >= discreteAmount) - { + if (needed >= discreteAmount) { double filled = willItem.drainWill(stack, discreteAmount); - if (filled > 0) - { + if (filled > 0) { WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, filled, maxWill, true); - if (stack.getCount() <= 0) - { + if (stack.getCount() <= 0) { this.setInventorySlotContents(0, ItemStack.EMPTY); } } @@ -109,29 +89,24 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); willMap.clear(); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { double amount = tag.getDouble("EnumWill" + type.getName()); - if (amount > 0) - { + if (amount > 0) { willMap.put(type, amount); } } } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); - for (Entry entry : willMap.entrySet()) - { + for (Entry entry : willMap.entrySet()) { tag.setDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); } return tag; @@ -140,36 +115,29 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo // IDemonWillConduit @Override - public int getWeight() - { + public int getWeight() { return 10; } @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) - { - if (amount <= 0) - { + public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { + if (amount <= 0) { return 0; } - if (!canFill(type)) - { + if (!canFill(type)) { return 0; } - if (!doFill) - { - if (!willMap.containsKey(type)) - { + if (!doFill) { + if (!willMap.containsKey(type)) { return Math.min(maxWill, amount); } return Math.min(maxWill - willMap.get(type), amount); } - if (!willMap.containsKey(type)) - { + if (!willMap.containsKey(type)) { double max = Math.min(maxWill, amount); willMap.put(type, max); @@ -180,12 +148,10 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo double current = willMap.get(type); double filled = maxWill - current; - if (amount < filled) - { + if (amount < filled) { willMap.put(type, current + amount); filled = amount; - } else - { + } else { willMap.put(type, (double) maxWill); } @@ -193,28 +159,22 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo } @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) - { - if (!willMap.containsKey(type)) - { + 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) - { + if (current < drained) { drained = current; } - if (doDrain) - { + if (doDrain) { current -= drained; - if (current <= 0) - { + if (current <= 0) { willMap.remove(type); - } else - { + } else { willMap.put(type, current); } } @@ -223,38 +183,32 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo } @Override - public boolean canFill(EnumDemonWillType type) - { + public boolean canFill(EnumDemonWillType type) { return true; } @Override - public boolean canDrain(EnumDemonWillType type) - { + public boolean canDrain(EnumDemonWillType type) { return true; } @Override - public double getCurrentWill(EnumDemonWillType type) - { + public double getCurrentWill(EnumDemonWillType type) { return willMap.containsKey(type) ? willMap.get(type) : 0; } @Override - public int[] getSlotsForFace(EnumFacing side) - { - return new int[] { 0 }; + public int[] getSlotsForFace(EnumFacing side) { + return new int[]{0}; } @Override - public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) - { + public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) { return !stack.isEmpty() && (stack.getItem() instanceof IDemonWillGem || stack.getItem() instanceof IDiscreteDemonWill); } @Override - public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) - { + public boolean canExtractItem(int index, ItemStack stack, EnumFacing 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 index d442fa49..2cfda269 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -1,5 +1,9 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.block.BlockDemonCrystal; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; @@ -7,64 +11,48 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.MathHelper; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.block.BlockDemonCrystal; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -public class TileDemonCrystal extends TileTicking -{ - public DemonWillHolder holder = new DemonWillHolder(); - public final int maxWill = 100; - public final double drainRate = 1; +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 EnumFacing placement = EnumFacing.UP; //Side that this crystal is placed on. - public TileDemonCrystal() - { + public TileDemonCrystal() { this.crystalCount = 1; } @Override - public void onUpdate() - { - if (getWorld().isRemote) - { + public void onUpdate() { + if (getWorld().isRemote) { return; } internalCounter++; - if (internalCounter % 20 == 0 && crystalCount < 7) - { + if (internalCounter % 20 == 0 && crystalCount < 7) { EnumDemonWillType type = EnumDemonWillType.values()[this.getBlockMetadata()]; double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (type != EnumDemonWillType.DEFAULT) - { - if (value >= 100) - { + if (type != EnumDemonWillType.DEFAULT) { + if (value >= 100) { double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; - } else - { + } else { value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT); - if (value > 0.5) - { + 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) - { + } else { + if (value > 0.5) { double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; } @@ -83,18 +71,15 @@ public class TileDemonCrystal extends TileTicking /** * 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 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) - { + public double growCrystalWithWillAmount(double willDrain, double progressPercentage) { + if (crystalCount >= 7) { return 0; } @@ -104,8 +89,7 @@ public class TileDemonCrystal extends TileTicking double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double percentDrain = willDrain <= 0 ? 1 : Math.min(1, value / willDrain); - if (percentDrain <= 0) - { + if (percentDrain <= 0) { return 0; } @@ -118,10 +102,8 @@ public class TileDemonCrystal extends TileTicking return percentDrain * progressPercentage; } - public void checkAndGrowCrystal() - { - if (progressToNextCrystal >= 1) - { + public void checkAndGrowCrystal() { + if (progressToNextCrystal >= 1) { progressToNextCrystal--; crystalCount++; IBlockState thisState = getWorld().getBlockState(pos); @@ -130,20 +112,16 @@ public class TileDemonCrystal extends TileTicking } } - public double getMaxWillForCrystal() - { + public double getMaxWillForCrystal() { return 50; } - public boolean dropSingleCrystal() - { - if (!getWorld().isRemote && crystalCount > 1) - { + public boolean dropSingleCrystal() { + if (!getWorld().isRemote && crystalCount > 1) { IBlockState state = getWorld().getBlockState(pos); EnumDemonWillType type = state.getValue(BlockDemonCrystal.TYPE); ItemStack stack = BlockDemonCrystal.getItemStackDropped(type, 1); - if (stack != null) - { + if (stack != null) { crystalCount--; getWorld().spawnEntity(new EntityItem(getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, stack)); return true; @@ -153,19 +131,16 @@ public class TileDemonCrystal extends TileTicking return false; } - public double getCrystalGrowthPerSecond(double will) - { + public double getCrystalGrowthPerSecond(double will) { return 1.0 / 800 * Math.sqrt(will / 200); } - public int getCrystalCountForRender() - { + public int getCrystalCountForRender() { return MathHelper.clamp(crystalCount - 1, 0, 6); } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { holder.readFromNBT(tag, "Will"); crystalCount = tag.getInteger("crystalCount"); placement = EnumFacing.getFront(tag.getInteger("placement")); @@ -173,8 +148,7 @@ public class TileDemonCrystal extends TileTicking } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { holder.writeToNBT(tag, "Will"); tag.setInteger("crystalCount", crystalCount); tag.setInteger("placement", placement.getIndex()); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index c153f800..78d2424e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -3,35 +3,30 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.IDemonWillConduit; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; -public class TileDemonCrystallizer extends TileTicking implements IDemonWillConduit -{ - //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 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() - { + public TileDemonCrystallizer() { } @Override - public void onUpdate() - { - if (getWorld().isRemote) - { + public void onUpdate() { + if (getWorld().isRemote) { return; } @@ -40,15 +35,11 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond { EnumDemonWillType highestType = WorldDemonWillHandler.getHighestDemonWillType(getWorld(), pos); double amount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, highestType); - if (amount >= willToFormCrystal) - { + if (amount >= willToFormCrystal) { internalCounter += getCrystalFormationRate(amount); - if (internalCounter >= totalFormationTime) - { - if (WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) - { - if (highestType == EnumDemonWillType.DEFAULT && formRandomSpecialCrystal(offsetPos) || formCrystal(highestType, offsetPos)) - { + if (internalCounter >= totalFormationTime) { + if (WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) { + if (highestType == EnumDemonWillType.DEFAULT && formRandomSpecialCrystal(offsetPos) || formCrystal(highestType, offsetPos)) { WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, true); internalCounter = 0; } @@ -58,12 +49,10 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } } - public boolean formCrystal(EnumDemonWillType type, BlockPos position) - { + 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) - { + if (tile instanceof TileDemonCrystal) { ((TileDemonCrystal) tile).setPlacement(EnumFacing.UP); return true; } @@ -71,31 +60,26 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond return false; } - public boolean formRandomSpecialCrystal(BlockPos position) - { - if (getWorld().rand.nextDouble() > 0.1) - { + public boolean formRandomSpecialCrystal(BlockPos position) { + if (getWorld().rand.nextDouble() > 0.1) { return formCrystal(EnumDemonWillType.DEFAULT, position); } EnumDemonWillType crystalType = EnumDemonWillType.values()[getWorld().rand.nextInt(EnumDemonWillType.values().length - 1) + 1]; return formCrystal(crystalType, position); } - public double getCrystalFormationRate(double currentWill) - { + public double getCrystalFormationRate(double currentWill) { return 1; } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { holder.readFromNBT(tag, "Will"); internalCounter = tag.getDouble("internalCounter"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { holder.writeToNBT(tag, "Will"); tag.setDouble("internalCounter", internalCounter); return tag; @@ -104,26 +88,21 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond // IDemonWillConduit @Override - public int getWeight() - { + public int getWeight() { return 10; } @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) - { - if (amount <= 0) - { + public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { + if (amount <= 0) { return 0; } - if (!canFill(type)) - { + if (!canFill(type)) { return 0; } - if (!doFill) - { + if (!doFill) { return Math.min(maxWill - holder.getWill(type), amount); } @@ -131,17 +110,14 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) - { + public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { double drained = amount; double current = holder.getWill(type); - if (current < drained) - { + if (current < drained) { drained = current; } - if (doDrain) - { + if (doDrain) { return holder.drainWill(type, amount); } @@ -149,20 +125,17 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public boolean canFill(EnumDemonWillType type) - { + public boolean canFill(EnumDemonWillType type) { return true; } @Override - public boolean canDrain(EnumDemonWillType type) - { + public boolean canDrain(EnumDemonWillType type) { return true; } @Override - public double getCurrentWill(EnumDemonWillType type) - { + 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 index 475f73c8..e1e73718 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java @@ -9,35 +9,28 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; -public class TileDemonPylon extends TileTicking implements IDemonWillConduit -{ - public DemonWillHolder holder = new DemonWillHolder(); +public class TileDemonPylon extends TileTicking implements IDemonWillConduit { public final int maxWill = 100; public final double drainRate = 1; + public DemonWillHolder holder = new DemonWillHolder(); - public TileDemonPylon() - { + public TileDemonPylon() { } @Override - public void onUpdate() - { - if (getWorld().isRemote) - { + public void onUpdate() { + if (getWorld().isRemote) { return; } - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - for (EnumFacing side : EnumFacing.HORIZONTALS) - { + for (EnumFacing side : EnumFacing.HORIZONTALS) { BlockPos offsetPos = pos.offset(side, 16); double sideAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), offsetPos, type); - if (sideAmount > currentAmount) - { + 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); @@ -47,14 +40,12 @@ public class TileDemonPylon extends TileTicking implements IDemonWillConduit } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { holder.readFromNBT(tag, "Will"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { holder.writeToNBT(tag, "Will"); return tag; } @@ -62,26 +53,21 @@ public class TileDemonPylon extends TileTicking implements IDemonWillConduit // IDemonWillConduit @Override - public int getWeight() - { + public int getWeight() { return 10; } @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) - { - if (amount <= 0) - { + public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { + if (amount <= 0) { return 0; } - if (!canFill(type)) - { + if (!canFill(type)) { return 0; } - if (!doFill) - { + if (!doFill) { return Math.min(maxWill - holder.getWill(type), amount); } @@ -89,17 +75,14 @@ public class TileDemonPylon extends TileTicking implements IDemonWillConduit } @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) - { + public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { double drained = amount; double current = holder.getWill(type); - if (current < drained) - { + if (current < drained) { drained = current; } - if (doDrain) - { + if (doDrain) { return holder.drainWill(type, amount); } @@ -107,20 +90,17 @@ public class TileDemonPylon extends TileTicking implements IDemonWillConduit } @Override - public boolean canFill(EnumDemonWillType type) - { + public boolean canFill(EnumDemonWillType type) { return true; } @Override - public boolean canDrain(EnumDemonWillType type) - { + public boolean canDrain(EnumDemonWillType type) { return true; } @Override - public double getCurrentWill(EnumDemonWillType type) - { + 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 index 83db6385..8fe0d65c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java @@ -6,15 +6,13 @@ import com.google.common.base.Strings; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; -public class TileDimensionalPortal extends TileBase -{ +public class TileDimensionalPortal extends TileBase { public String portalID = ""; public int masterStoneX; public int masterStoneY; public int masterStoneZ; - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { portalID = tagCompound.getString(RitualPortal.PORTAL_ID_TAG); masterStoneX = tagCompound.getInteger("masterStoneX"); @@ -22,8 +20,7 @@ public class TileDimensionalPortal extends TileBase masterStoneZ = tagCompound.getInteger("masterStoneZ"); } - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { tagCompound.setString(RitualPortal.PORTAL_ID_TAG, Strings.isNullOrEmpty(portalID) ? "" : portalID); tagCompound.setInteger("masterStoneX", masterStoneX); @@ -32,13 +29,11 @@ public class TileDimensionalPortal extends TileBase return tagCompound; } - public BlockPos getMasterStonePos() - { + public BlockPos getMasterStonePos() { return new BlockPos(masterStoneX, masterStoneY, masterStoneZ); } - public void setMasterStonePos(BlockPos blockPos) - { + 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 index 4d6784cd..ec1fc4b8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java @@ -11,20 +11,15 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class TileImperfectRitualStone extends TileBase implements IImperfectRitualStone -{ +public class TileImperfectRitualStone extends TileBase implements IImperfectRitualStone { // IImperfectRitualStone @Override - public boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, EntityPlayer player) - { - if (imperfectRitual != null && ImperfectRitualRegistry.ritualEnabled(imperfectRitual)) - { - if (!PlayerHelper.isFakePlayer(player) && !world.isRemote) - { + public boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, EntityPlayer player) { + if (imperfectRitual != null && ImperfectRitualRegistry.ritualEnabled(imperfectRitual)) { + if (!PlayerHelper.isFakePlayer(player) && !world.isRemote) { NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, imperfectRitual.getActivationCost()); - if (imperfectRitual.onActivate(this, player)) - { + if (imperfectRitual.onActivate(this, player)) { if (imperfectRitual.isLightshow()) getWorld().addWeatherEffect(new EntityLightningBolt(getWorld(), getPos().getX(), getPos().getY() + 2, getPos().getZ(), true)); return true; @@ -38,14 +33,12 @@ public class TileImperfectRitualStone extends TileBase implements IImperfectRitu } @Override - public World getRitualWorld() - { + public World getRitualWorld() { return getWorld(); } @Override - public BlockPos getRitualPos() - { + 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 index 6ebf9778..8f90b289 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -23,50 +23,41 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -public class TileIncenseAltar extends TileInventory implements ITickable -{ - public AreaDescriptor incenseArea = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11); +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() - { + public TileIncenseAltar() { super(1, "incenseAltar"); } @Override - public void update() - { + public void update() { AxisAlignedBB aabb = incenseArea.getAABB(getPos()); List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, aabb); - if (playerList.isEmpty()) - { + if (playerList.isEmpty()) { return; } - if (getWorld().getTotalWorldTime() % 100 == 0) - { + if (getWorld().getTotalWorldTime() % 100 == 0) { recheckConstruction(); } boolean hasPerformed = false; - for (EntityPlayer player : playerList) - { - if (PlayerSacrificeHelper.incrementIncense(player, 0, incenseAddition, incenseAddition / 100)) - { + for (EntityPlayer player : playerList) { + if (PlayerSacrificeHelper.incrementIncense(player, 0, incenseAddition, incenseAddition / 100)) { hasPerformed = true; } } - if (hasPerformed) - { - if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) - { + if (hasPerformed) { + if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) { WorldServer server = (WorldServer) 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, new int[0]); } @@ -74,94 +65,77 @@ public class TileIncenseAltar extends TileInventory implements ITickable } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); tranquility = tag.getDouble("tranquility"); incenseAddition = tag.getDouble("incenseAddition"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setDouble("tranquility", tranquility); tag.setDouble("incenseAddition", incenseAddition); return tag; } - public void recheckConstruction() - { + 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++) - { + for (int currentDistance = 2; currentDistance < currentDistance + maxLength; currentDistance++) { boolean canFormRoad = false; - for (int i = -maxCheckRange + yOffset; i <= maxCheckRange + yOffset; i++) - { + for (int i = -maxCheckRange + yOffset; i <= maxCheckRange + yOffset; i++) { BlockPos verticalPos = pos.add(0, i, 0); canFormRoad = true; - level: for (EnumFacing horizontalFacing : EnumFacing.HORIZONTALS) - { + level: + for (EnumFacing horizontalFacing : EnumFacing.HORIZONTALS) { BlockPos facingOffsetPos = verticalPos.offset(horizontalFacing, currentDistance); - for (int j = -1; j <= 1; j++) - { + for (int j = -1; j <= 1; j++) { BlockPos offsetPos = facingOffsetPos.offset(horizontalFacing.rotateY(), j); IBlockState state = getWorld().getBlockState(offsetPos); Block block = state.getBlock(); - if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(getWorld(), offsetPos, state) >= currentDistance - 2)) - { + if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(getWorld(), offsetPos, state) >= currentDistance - 2)) { canFormRoad = false; break level; } } } - if (canFormRoad) - { + 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) - { + 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 = 0 + yOffset; y <= 2 + yOffset; y++) - { + for (int y = 0 + yOffset; y <= 2 + yOffset; y++) { BlockPos offsetPos = pos.add(i, y, j); IBlockState state = getWorld().getBlockState(offsetPos); Block block = state.getBlock(); TranquilityStack stack = IncenseTranquilityRegistry.getTranquilityOfBlock(getWorld(), offsetPos, block, state); - if (stack != null) - { - if (!tranquilityMap.containsKey(stack.type)) - { + if (stack != null) { + if (!tranquilityMap.containsKey(stack.type)) { tranquilityMap.put(stack.type, stack.value); - } else - { + } else { tranquilityMap.put(stack.type, tranquilityMap.get(stack.type) + stack.value); } } } } } - } else - { + } else { roadDistance = currentDistance - 2; break; } @@ -170,19 +144,16 @@ public class TileIncenseAltar extends TileInventory implements ITickable this.tranquilityMap = tranquilityMap; double totalTranquility = 0; - for (Entry entry : tranquilityMap.entrySet()) - { + for (Entry entry : tranquilityMap.entrySet()) { totalTranquility += entry.getValue(); } - if (totalTranquility < 0) - { + if (totalTranquility < 0) { return; } double appliedTranquility = 0; - for (Entry entry : tranquilityMap.entrySet()) - { + for (Entry entry : tranquilityMap.entrySet()) { appliedTranquility += Math.sqrt(entry.getValue()); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index acf47041..11e2edf3 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.tile.base.TileBase; +import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; @@ -17,29 +18,31 @@ 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.util.helper.TextHelper; -public class TileInventory extends TileBase implements IInventory -{ +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; + + // IInventory private String name; - public TileInventory(int size, String name) - { + public TileInventory(int size, String name) { 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) - { + protected boolean isSyncedSlot(int slot) { + for (int s : this.syncedSlots) { + if (s == slot) { return true; } } @@ -47,21 +50,17 @@ public class TileInventory extends TileBase implements IInventory } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { super.deserialize(tagCompound); NBTTagList tags = tagCompound.getTagList("Items", 10); inventory = NonNullList.withSize(size, ItemStack.EMPTY); - for (int i = 0; i < tags.tagCount(); i++) - { - if (!isSyncedSlot(i)) - { + for (int i = 0; i < tags.tagCount(); i++) { + if (!isSyncedSlot(i)) { NBTTagCompound data = tags.getCompoundTagAt(i); byte j = data.getByte("Slot"); - if (j >= 0 && j < inventory.size()) - { + 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 } } @@ -69,15 +68,12 @@ public class TileInventory extends TileBase implements IInventory } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { super.serialize(tagCompound); NBTTagList tags = new NBTTagList(); - for (int i = 0; i < inventory.size(); i++) - { - if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) - { + for (int i = 0; i < inventory.size(); i++) { + if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) { NBTTagCompound data = new NBTTagCompound(); data.setByte("Slot", (byte) i); inventory.get(i).writeToNBT(data); @@ -89,35 +85,27 @@ public class TileInventory extends TileBase implements IInventory return tagCompound; } - public void dropItems() - { + public void dropItems() { InventoryHelper.dropInventoryItems(getWorld(), getPos(), this); } - // IInventory - @Override - public int getSizeInventory() - { + public int getSizeInventory() { return size; } @Override - public ItemStack getStackInSlot(int index) - { + public ItemStack getStackInSlot(int index) { return inventory.get(index); } @Override - public ItemStack decrStackSize(int index, int count) - { - if (!getStackInSlot(index).isEmpty()) - { + 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) - { + if (getStackInSlot(index).getCount() <= count) { ItemStack itemStack = inventory.get(index); inventory.set(index, ItemStack.EMPTY); markDirty(); @@ -133,10 +121,8 @@ public class TileInventory extends TileBase implements IInventory } @Override - public ItemStack removeStackFromSlot(int slot) - { - if (!inventory.get(slot).isEmpty()) - { + public ItemStack removeStackFromSlot(int slot) { + if (!inventory.get(slot).isEmpty()) { ItemStack itemStack = inventory.get(slot); setInventorySlotContents(slot, ItemStack.EMPTY); return itemStack; @@ -145,8 +131,7 @@ public class TileInventory extends TileBase implements IInventory } @Override - public void setInventorySlotContents(int slot, ItemStack stack) - { + public void setInventorySlotContents(int slot, ItemStack stack) { inventory.set(slot, stack); if (!stack.isEmpty() && stack.getCount() > getInventoryStackLimit()) stack.setCount(getInventoryStackLimit()); @@ -156,50 +141,44 @@ public class TileInventory extends TileBase implements IInventory } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public void openInventory(EntityPlayer player) - { + public void openInventory(EntityPlayer player) { } @Override - public void closeInventory(EntityPlayer player) - { + public void closeInventory(EntityPlayer player) { } @Override - public boolean isItemValidForSlot(int index, ItemStack stack) - { + public boolean isItemValidForSlot(int index, ItemStack stack) { return true; } + // IWorldNameable + @Override - public int getField(int id) - { + public int getField(int id) { return 0; } @Override - public void setField(int id, int value) - { + public void setField(int id, int value) { } @Override - public int getFieldCount() - { + public int getFieldCount() { return 0; } @Override - public void clear() - { + public void clear() { this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); } @@ -217,38 +196,30 @@ public class TileInventory extends TileBase implements IInventory return true; } - // IWorldNameable - @Override - public String getName() - { + public String getName() { return TextHelper.localize("tile.bloodmagic." + name + ".name"); } @Override - public boolean hasCustomName() - { + public boolean hasCustomName() { return true; } @Override - public ITextComponent getDisplayName() - { + public ITextComponent getDisplayName() { return new TextComponentString(getName()); } - protected void initializeItemHandlers() - { - if (this instanceof ISidedInventory) - { + protected void initializeItemHandlers() { + if (this instanceof ISidedInventory) { handlerDown = new SidedInvWrapper((ISidedInventory) this, EnumFacing.DOWN); handlerUp = new SidedInvWrapper((ISidedInventory) this, EnumFacing.UP); handlerNorth = new SidedInvWrapper((ISidedInventory) this, EnumFacing.NORTH); handlerSouth = new SidedInvWrapper((ISidedInventory) this, EnumFacing.SOUTH); handlerWest = new SidedInvWrapper((ISidedInventory) this, EnumFacing.WEST); handlerEast = new SidedInvWrapper((ISidedInventory) this, EnumFacing.EAST); - } else - { + } else { handlerDown = new InvWrapper(this); handlerUp = handlerDown; handlerNorth = handlerDown; @@ -258,36 +229,25 @@ public class TileInventory extends TileBase implements IInventory } } - IItemHandler handlerDown; - IItemHandler handlerUp; - IItemHandler handlerNorth; - IItemHandler handlerSouth; - IItemHandler handlerWest; - IItemHandler handlerEast; - @SuppressWarnings("unchecked") @Override - public T getCapability(Capability capability, EnumFacing 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; + public T getCapability(Capability capability, EnumFacing 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) - { + } else if (facing == null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return (T) handlerDown; } @@ -295,8 +255,7 @@ public class TileInventory extends TileBase implements IInventory } @Override - public boolean hasCapability(Capability capability, EnumFacing facing) - { + public boolean hasCapability(Capability capability, EnumFacing facing) { return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index fb578023..7ba2a285 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -1,9 +1,13 @@ package WayofTime.bloodmagic.tile; -import java.util.Collections; -import java.util.List; -import java.util.Locale; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.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.state.IBlockState; import net.minecraft.init.Blocks; @@ -19,18 +23,13 @@ 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 WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.inversion.InversionPillarHandler; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.tile.base.TileTicking; -import com.google.common.collect.ImmutableMap; +import java.util.Collections; +import java.util.List; +import java.util.Locale; -public class TileInversionPillar extends TileTicking -{ +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; @@ -41,9 +40,7 @@ public class TileInversionPillar extends TileTicking public static double willPushRate = 1; public static double inversionCostPerWillSpread = 4; public static double minimumWillForChunkWhenSpreading = 100; - private final IAnimationStateMachine asm; - private float animationOffsetValue = 0; private final VariableValue animationOffset = new VariableValue(0); private final VariableValue cycleLength = new VariableValue(4); @@ -58,45 +55,37 @@ public class TileInversionPillar extends TileTicking public int counter = 0; public boolean isRegistered = false; + private float animationOffsetValue = 0; - public static final double maxWillForChunk = 1000; - - public TileInversionPillar() - { + public TileInversionPillar() { this(EnumDemonWillType.DEFAULT); } - public TileInversionPillar(EnumDemonWillType type) - { + 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) - { + public void onUpdate() { + if (animationOffsetValue < 0) { animationOffsetValue = getWorld().getTotalWorldTime() * getWorld().rand.nextFloat(); animationOffset.setValue(animationOffsetValue); } - if (getWorld().isRemote) - { + if (getWorld().isRemote) { return; } - if (!isRegistered) - { + if (!isRegistered) { isRegistered = InversionPillarHandler.addPillarToMap(getWorld(), getType(), getPos()); } counter++; double currentWill = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (counter % 1 == 0) - { + if (counter % 1 == 0) { List pillarList = getNearbyPillarsExcludingThis(); // if (type == EnumDemonWillType.VENGEFUL) // { @@ -105,33 +94,27 @@ public class TileInversionPillar extends TileTicking generateWillForNearbyPillars(currentWill, pillarList); generateInversionForNearbyPillars(currentWill, pillarList); int pollute = polluteNearbyBlocks(currentWill); - if (pollute == 1) - { + if (pollute == 1) { currentInversion += addedInversionPerFailedCheck; consecutiveFailedChecks++; - } else if (pollute == 3) - { + } else if (pollute == 3) { currentInversion += addedInversionPerFailedCheck; consecutiveFailedAirChecks++; - } else if (pollute == 0) - { + } else if (pollute == 0) { //We successfully found a block to replace! consecutiveFailedChecks = 0; consecutiveFailedAirChecks = 0; } - if (consecutiveFailedAirChecks > 100) - { + if (consecutiveFailedAirChecks > 100) { createObstructionsInAir(); } - if (currentInversion >= inversionToSpreadWill) - { + if (currentInversion >= inversionToSpreadWill) { spreadWillToSurroundingChunks(); } - if (consecutiveFailedChecks > 5 * currentInfectionRadius && currentInversion >= inversionToIncreaseRadius) - { + if (consecutiveFailedChecks > 5 * currentInfectionRadius && currentInversion >= inversionToIncreaseRadius) { currentInfectionRadius++; consecutiveFailedChecks = 0; currentInversion -= inversionToIncreaseRadius; @@ -144,13 +127,11 @@ public class TileInversionPillar extends TileTicking System.out.println("Increasing radius due to being in the air!"); } - if (currentInfectionRadius >= 8 && currentInversion >= inversionToAddPillar) - { + 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)) - { + if (!candidatePos.equals(BlockPos.ORIGIN)) { currentInversion = 0; IBlockState pillarState = RegistrarBloodMagicBlocks.INVERSION_PILLAR.getStateFromMeta(type.ordinal()); IBlockState bottomState = RegistrarBloodMagicBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2); @@ -168,10 +149,8 @@ public class TileInversionPillar extends TileTicking // return 0; // } - public void createObstructionsInAir() - { - if (currentInversion > 1000) - { + 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); @@ -181,72 +160,18 @@ public class TileInversionPillar extends TileTicking } } - 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 void spreadWillToSurroundingChunks() - { + public void spreadWillToSurroundingChunks() { double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (currentAmount <= minimumWillForChunkWhenSpreading) - { + if (currentAmount <= minimumWillForChunkWhenSpreading) { return; } - for (EnumFacing side : EnumFacing.HORIZONTALS) - { + for (EnumFacing side : EnumFacing.HORIZONTALS) { BlockPos offsetPos = pos.offset(side, 16); double sideAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), offsetPos, type); - if (currentAmount > sideAmount) - { + if (currentAmount > sideAmount) { double drainAmount = Math.min((currentAmount - sideAmount) / 2, willPushRate); - if (drainAmount < willPushRate / 2) - { + if (drainAmount < willPushRate / 2) { continue; } @@ -258,26 +183,21 @@ public class TileInversionPillar extends TileTicking } } - public void removePillarFromMap() - { - if (!getWorld().isRemote) - { + public void removePillarFromMap() { + if (!getWorld().isRemote) { InversionPillarHandler.removePillarFromMap(getWorld(), type, pos); } } - public List getNearbyPillarsExcludingThis() - { + public List getNearbyPillarsExcludingThis() { return InversionPillarHandler.getNearbyPillars(getWorld(), type, pos); } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { type = EnumDemonWillType.DEFAULT; } @@ -291,8 +211,7 @@ public class TileInversionPillar extends TileTicking } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); @@ -304,31 +223,26 @@ public class TileInversionPillar extends TileTicking return tag; } - public void generateWillForNearbyPillars(double currentWillInChunk, List offsetPositions) - { + public void generateWillForNearbyPillars(double currentWillInChunk, List offsetPositions) { double totalGeneratedWill = 0; double willFactor = currentWillInChunk / 1000; - for (BlockPos offsetPos : offsetPositions) - { + for (BlockPos offsetPos : offsetPositions) { double distanceSquared = offsetPos.distanceSq(pos); totalGeneratedWill += willFactor * 343 / (343 + Math.pow(distanceSquared, 3 / 2)); } - if (totalGeneratedWill > 0) - { + if (totalGeneratedWill > 0) { WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, totalGeneratedWill, maxWillForChunk, true); } } - public void generateInversionForNearbyPillars(double currentWillInChunk, List offsetPositions) - { + public void generateInversionForNearbyPillars(double currentWillInChunk, List offsetPositions) { double willFactor = currentWillInChunk / 400; double totalGeneratedInversion = willFactor; - for (BlockPos offsetPos : offsetPositions) - { + for (BlockPos offsetPos : offsetPositions) { double distanceSquared = offsetPos.distanceSq(pos); totalGeneratedInversion += 3125 / (3125 + Math.pow(distanceSquared, 5 / 2)); @@ -338,30 +252,25 @@ public class TileInversionPillar extends TileTicking } /** - * * @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. + * 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) - { + public int polluteNearbyBlocks(double currentWillInChunk) { // System.out.println("Hai! :D Current Inversion: " + currentInversion + ", Current Will: " + currentWillInChunk); - if (currentWillInChunk < operationThreshold || currentInversion < inversionPerOperation) - { + if (currentWillInChunk < operationThreshold || currentInversion < inversionPerOperation) { return 2; //Not enough Will or Inversion available } - for (int i = 0; i < currentInfectionRadius; i++) - { + 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) - { + if (r2 > maxInfectionRadius2) { double factor = Math.sqrt(maxInfectionRadius2 / r2); xOff *= factor; yOff *= factor; @@ -369,20 +278,16 @@ public class TileInversionPillar extends TileTicking } BlockPos offsetPos = pos.add(xOff + 0.5, yOff + 0.5, zOff + 0.5); - if (offsetPos.equals(pos)) - { + if (offsetPos.equals(pos)) { return 1; //Invalid block (itself!) } IBlockState state = getWorld().getBlockState(offsetPos); - if (!state.getBlock().isAir(state, getWorld(), 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))) - { + 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; @@ -397,40 +302,150 @@ public class TileInversionPillar extends TileTicking return 3; //The block was air } - public void handleEvents(float time, Iterable pastEvents) - { - for (Event event : pastEvents) - { + public void handleEvents(float time, Iterable pastEvents) { + for (Event event : pastEvents) { System.out.println("Event: " + event.event() + " " + event.offset() + " " + getPos() + " " + time); } } @Override - public boolean hasFastRenderer() - { + public boolean hasFastRenderer() { return true; } @Override - public boolean hasCapability(Capability capability, EnumFacing side) - { - if (capability == CapabilityAnimation.ANIMATION_CAPABILITY) - { + public boolean hasCapability(Capability capability, EnumFacing side) { + if (capability == CapabilityAnimation.ANIMATION_CAPABILITY) { return true; } return super.hasCapability(capability, side); } @Override - public T getCapability(Capability capability, EnumFacing side) - { - if (capability == CapabilityAnimation.ANIMATION_CAPABILITY) - { + public T getCapability(Capability capability, EnumFacing 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; } @@ -511,82 +526,6 @@ public class TileInversionPillar extends TileTicking TileInversionPillar.minimumWillForChunkWhenSpreading = minimumWillForChunkWhenSpreading; } - 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 double getMaxWillForChunk() { return maxWillForChunk; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 2faf553d..c812f552 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -1,18 +1,5 @@ package WayofTime.bloodmagic.tile; -import java.util.ArrayList; -import java.util.List; - -import WayofTime.bloodmagic.tile.base.TileTicking; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.Event; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.event.RitualEvent; import WayofTime.bloodmagic.api.registry.RitualRegistry; @@ -24,16 +11,26 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.api.util.helper.RitualHelper; -import WayofTime.bloodmagic.item.ItemActivationCrystal; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.ItemActivationCrystal; +import WayofTime.bloodmagic.tile.base.TileTicking; import WayofTime.bloodmagic.util.ChatUtil; - import com.google.common.base.Strings; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; -public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone -{ +public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone { private String owner; private SoulNetwork cachedNetwork; private boolean active; @@ -46,21 +43,18 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS private List currentActiveWillConfig = new ArrayList(); @Override - public void onUpdate() - { + public void onUpdate() { if (getWorld().isRemote) return; - if (isPowered() && isActive()) - { + if (isPowered() && isActive()) { active = false; redstoned = true; stopRitual(Ritual.BreakType.REDSTONE); return; } - if (!isActive() && !isPowered() && isRedstoned() && getCurrentRitual() != null) - { + if (!isActive() && !isPowered() && isRedstoned() && getCurrentRitual() != null) { active = true; ItemStack crystalStack = NBTHelper.checkNBT(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL, 1, getCurrentRitual().getCrystalLevel())); crystalStack.getTagCompound().setString(Constants.NBT.OWNER_UUID, getOwner()); @@ -68,8 +62,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS redstoned = false; } - if (getCurrentRitual() != null && isActive()) - { + if (getCurrentRitual() != null && isActive()) { if (activeTime % getCurrentRitual().getRefreshTime() == 0) performRitual(getWorld(), getPos()); @@ -78,17 +71,14 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { owner = tag.getString(Constants.NBT.OWNER_UUID); if (!Strings.isNullOrEmpty(owner)) cachedNetwork = NetworkHelper.getSoulNetwork(owner); currentRitual = RitualRegistry.getRitualForId(tag.getString(Constants.NBT.CURRENT_RITUAL)); - if (currentRitual != null) - { + if (currentRitual != null) { NBTTagCompound ritualTag = tag.getCompoundTag(Constants.NBT.CURRENT_RITUAL_TAG); - if (!ritualTag.hasNoTags()) - { + if (!ritualTag.hasNoTags()) { currentRitual.readFromNBT(ritualTag); } } @@ -97,23 +87,19 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS direction = EnumFacing.VALUES[tag.getInteger(Constants.NBT.DIRECTION)]; redstoned = tag.getBoolean(Constants.NBT.IS_REDSTONED); - for (EnumDemonWillType type : EnumDemonWillType.values()) - { - if (tag.getBoolean("EnumWill" + type)) - { + for (EnumDemonWillType type : EnumDemonWillType.values()) { + if (tag.getBoolean("EnumWill" + type)) { currentActiveWillConfig.add(type); } } } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { String ritualId = RitualRegistry.getIdForRitual(getCurrentRitual()); tag.setString(Constants.NBT.OWNER_UUID, Strings.isNullOrEmpty(getOwner()) ? "" : getOwner()); tag.setString(Constants.NBT.CURRENT_RITUAL, Strings.isNullOrEmpty(ritualId) ? "" : ritualId); - if (currentRitual != null) - { + if (currentRitual != null) { NBTTagCompound ritualTag = new NBTTagCompound(); currentRitual.writeToNBT(ritualTag); tag.setTag(Constants.NBT.CURRENT_RITUAL_TAG, ritualTag); @@ -123,8 +109,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS tag.setInteger(Constants.NBT.DIRECTION, direction.getIndex()); tag.setBoolean(Constants.NBT.IS_REDSTONED, redstoned); - for (EnumDemonWillType type : currentActiveWillConfig) - { + for (EnumDemonWillType type : currentActiveWillConfig) { tag.setBoolean("EnumWill" + type, true); } @@ -132,27 +117,21 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public boolean activateRitual(ItemStack activationCrystal, @Nullable EntityPlayer activator, Ritual ritual) - { + public boolean activateRitual(ItemStack activationCrystal, @Nullable EntityPlayer activator, Ritual ritual) { if (PlayerHelper.isFakePlayer(activator)) return false; activationCrystal = NBTHelper.checkNBT(activationCrystal); String crystalOwner = activationCrystal.getTagCompound().getString(Constants.NBT.OWNER_UUID); - if (!Strings.isNullOrEmpty(crystalOwner) && ritual != null) - { - if (activationCrystal.getItem() instanceof ItemActivationCrystal) - { + if (!Strings.isNullOrEmpty(crystalOwner) && ritual != null) { + if (activationCrystal.getItem() instanceof ItemActivationCrystal) { int crystalLevel = ((ItemActivationCrystal) activationCrystal.getItem()).getCrystalLevel(activationCrystal); - if (RitualHelper.canCrystalActivate(ritual, crystalLevel)) - { - if (!getWorld().isRemote) - { + if (RitualHelper.canCrystalActivate(ritual, crystalLevel)) { + if (!getWorld().isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(crystalOwner); - if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && (activator != null && !activator.capabilities.isCreativeMode)) - { + if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && (activator != null && !activator.capabilities.isCreativeMode)) { activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.weak"), true); return false; } @@ -162,15 +141,13 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS RitualEvent.RitualActivatedEvent event = new RitualEvent.RitualActivatedEvent(this, crystalOwner, ritual, activator, activationCrystal, crystalLevel); - if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) - { + if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) { if (activator != null) activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.prevent"), true); return false; } - if (ritual.activateRitual(this, activator, crystalOwner)) - { + if (ritual.activateRitual(this, activator, crystalOwner)) { if (!isRedstoned() && (activator != null && !activator.capabilities.isCreativeMode)) network.syphon(ritual.getActivationCost()); @@ -191,8 +168,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS return true; } } - } else - { + } else { if (activator != null) activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); } @@ -201,38 +177,31 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public void performRitual(World world, BlockPos pos) - { - if (!world.isRemote && getCurrentRitual() != null && RitualRegistry.ritualEnabled(getCurrentRitual())) - { - if (RitualHelper.checkValidRitual(getWorld(), getPos(), RitualRegistry.getIdForRitual(currentRitual), getDirection())) - { + public void performRitual(World world, BlockPos pos) { + if (!world.isRemote && getCurrentRitual() != null && RitualRegistry.ritualEnabled(getCurrentRitual())) { + if (RitualHelper.checkValidRitual(getWorld(), getPos(), RitualRegistry.getIdForRitual(currentRitual), getDirection())) { RitualEvent.RitualRunEvent event = new RitualEvent.RitualRunEvent(this, getOwner(), getCurrentRitual()); if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) return; getCurrentRitual().performRitual(this); - } else - { + } else { stopRitual(Ritual.BreakType.BREAK_STONE); } } } @Override - public void stopRitual(Ritual.BreakType breakType) - { - if (!getWorld().isRemote && getCurrentRitual() != null) - { + 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) || event.getResult() == Event.Result.DENY) return; getCurrentRitual().stopRitual(this, breakType); - if (breakType != Ritual.BreakType.REDSTONE) - { + if (breakType != Ritual.BreakType.REDSTONE) { this.currentRitual = null; this.active = false; this.activeTime = 0; @@ -242,82 +211,71 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public int getCooldown() - { + public int getCooldown() { return cooldown; } @Override - public void setCooldown(int cooldown) - { + public void setCooldown(int cooldown) { this.cooldown = cooldown; } @Override - public void setActive(boolean active) - { - this.active = active; - } - - @Override - public EnumFacing getDirection() - { + public EnumFacing getDirection() { return direction; } + public void setDirection(EnumFacing direction) { + this.direction = direction; + } + @Override - public boolean areTanksEmpty() - { + public boolean areTanksEmpty() { return false; } @Override - public int getRunningTime() - { + public int getRunningTime() { return activeTime; } @Override - public String getOwner() - { + public String getOwner() { return owner; } + public void setOwner(String owner) { + this.owner = owner; + } + @Override - public SoulNetwork getOwnerNetwork() - { + public SoulNetwork getOwnerNetwork() { return cachedNetwork; } @Override - public World getWorld() - { + public World getWorld() { return super.getWorld(); } @Override - public BlockPos getPos() - { + public BlockPos getPos() { return super.getPos(); } @Override - public World getWorldObj() - { + public World getWorldObj() { return getWorld(); } @Override - public BlockPos getBlockPos() - { + public BlockPos getBlockPos() { return getPos(); } @Override - public String getNextBlockRange(String range) - { - if (this.currentRitual != null) - { + public String getNextBlockRange(String range) { + if (this.currentRitual != null) { return this.currentRitual.getNextBlockRange(range); } @@ -325,48 +283,38 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public void provideInformationOfRitualToPlayer(EntityPlayer player) - { - if (this.currentRitual != null) - { + public void provideInformationOfRitualToPlayer(EntityPlayer player) { + if (this.currentRitual != null) { ChatUtil.sendNoSpam(player, this.currentRitual.provideInformationOfRitualToPlayer(player)); } } @Override - public void provideInformationOfRangeToPlayer(EntityPlayer player, String range) - { - if (this.currentRitual != null && this.currentRitual.getListOfRanges().contains(range)) - { + public void provideInformationOfRangeToPlayer(EntityPlayer player, String range) { + if (this.currentRitual != null && this.currentRitual.getListOfRanges().contains(range)) { ChatUtil.sendNoSpam(player, this.currentRitual.provideInformationOfRangeToPlayer(player, range)); } } @Override - public void setActiveWillConfig(EntityPlayer player, List typeList) - { + public void setActiveWillConfig(EntityPlayer player, List typeList) { this.currentActiveWillConfig = typeList; } @Override - public boolean setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2) - { - if (this.currentRitual != null) - { + public boolean setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2) { + if (this.currentRitual != null) { boolean allowed = this.currentRitual.setBlockRangeByBounds(range, this, offset1, offset2); - if (player != null && !allowed) - { + if (player != null && !allowed) { ChatUtil.sendNoSpam(player, this.currentRitual.getErrorForBlockRangeOnFail(player, range, this, offset1, offset2)); - } else - { + } else { ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.success")); } return allowed; } - if (player != null) - { + if (player != null) { ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.inactive")); } @@ -374,49 +322,38 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public List getActiveWillConfig() - { + public List getActiveWillConfig() { return new ArrayList(currentActiveWillConfig); } @Override - public void provideInformationOfWillConfigToPlayer(EntityPlayer player, List typeList) - { + public void provideInformationOfWillConfigToPlayer(EntityPlayer player, List typeList) { //There is probably an easier way to make expanded chat messages - if (typeList.size() >= 1) - { + if (typeList.size() >= 1) { Object[] translations = new TextComponentTranslation[typeList.size()]; String constructedString = "%s"; - for (int i = 1; i < typeList.size(); i++) - { + for (int i = 1; i < typeList.size(); i++) { constructedString = constructedString + ", %s"; } - for (int i = 0; i < typeList.size(); i++) - { + for (int i = 0; i < typeList.size(); i++) { translations[i] = new TextComponentTranslation("tooltip.bloodmagic.currentBaseType." + typeList.get(i).name.toLowerCase()); } ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.set", new TextComponentTranslation(constructedString, translations))); - } else - { + } else { ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.void")); } } - public boolean isPowered() - { + public boolean isPowered() { if (inverted) return !getWorld().isBlockPowered(getPos()); return getWorld().isBlockPowered(getPos()); } - public void setOwner(String owner) { - this.owner = owner; - } - public SoulNetwork getCachedNetwork() { return cachedNetwork; } @@ -429,6 +366,11 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS return active; } + @Override + public void setActive(boolean active) { + this.active = active; + } + public boolean isRedstoned() { return redstoned; } @@ -453,10 +395,6 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS this.currentRitual = currentRitual; } - public void setDirection(EnumFacing direction) { - this.direction = direction; - } - public boolean isInverted() { return inverted; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index 71669907..46ed0004 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -1,8 +1,11 @@ package WayofTime.bloodmagic.tile; -import java.lang.reflect.Field; -import java.util.List; - +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 net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -25,17 +28,12 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.ReflectionHelper; -import WayofTime.bloodmagic.block.BlockMimic; -import WayofTime.bloodmagic.entity.mob.EntityMimic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Utils; import javax.annotation.Nullable; +import java.lang.reflect.Field; +import java.util.List; -public class TileMimic extends TileInventory implements ITickable -{ +public class TileMimic extends TileInventory implements ITickable { private static Field _blockMetadata = ReflectionHelper.findField(TileEntity.class, "blockMetadata", "field_145847_g"); public boolean dropItemsOnBreak = true; @@ -49,32 +47,25 @@ public class TileMimic extends TileInventory implements ITickable private int internalCounter = 0; - public TileMimic() - { + public TileMimic() { super(2, "mimic"); } @Override - public void update() - { - if (getWorld().isRemote) - { + public void update() { + if (getWorld().isRemote) { return; } internalCounter++; - if (internalCounter % potionSpawnInterval == 0 && this.getBlockMetadata() == BlockMimic.sentientMimicMeta) - { + if (internalCounter % potionSpawnInterval == 0 && this.getBlockMetadata() == BlockMimic.sentientMimicMeta) { ItemStack potionStack = this.getStackInSlot(1); - if (!potionStack.isEmpty()) - { + if (!potionStack.isEmpty()) { AxisAlignedBB bb = new AxisAlignedBB(this.getPos()).expand(playerCheckRadius, playerCheckRadius, playerCheckRadius); List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, bb); - for (EntityPlayer player : playerList) - { - if (!player.capabilities.isCreativeMode) - { + for (EntityPlayer 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; @@ -91,15 +82,12 @@ public class TileMimic extends TileInventory implements ITickable } } - if (this.getBlockMetadata() == BlockMimic.sentientMimicMeta && getWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(mimicedTile instanceof IInventory)) - { + if (this.getBlockMetadata() == BlockMimic.sentientMimicMeta && getWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(mimicedTile instanceof IInventory)) { AxisAlignedBB bb = new AxisAlignedBB(this.getPos()).expand(playerCheckRadius, playerCheckRadius, playerCheckRadius); List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, bb); - for (EntityPlayer player : playerList) - { - if (!player.capabilities.isCreativeMode && Utils.canEntitySeeBlock(getWorld(), player, getPos())) - { + for (EntityPlayer player : playerList) { + if (!player.capabilities.isCreativeMode && Utils.canEntitySeeBlock(getWorld(), player, getPos())) { spawnMimicEntity(player); break; } @@ -108,25 +96,19 @@ public class TileMimic extends TileInventory implements ITickable } - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side) - { - if (!heldItem.isEmpty() && player.capabilities.isCreativeMode) - { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side) { + if (!heldItem.isEmpty() && player.capabilities.isCreativeMode) { List list = PotionUtils.getEffectsFromStack(heldItem); - if (!list.isEmpty()) - { - if (!world.isRemote) - { + if (!list.isEmpty()) { + if (!world.isRemote) { setInventorySlotContents(1, heldItem.copy()); world.notifyBlockUpdate(pos, state, state, 3); ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionSet")); } return true; - } else if (heldItem.getItem() == RegistrarBloodMagicItems.POTION_FLASK) - { + } else if (heldItem.getItem() == RegistrarBloodMagicItems.POTION_FLASK) { //The potion flask is empty, therefore we have to reset the stored potion. - if (!world.isRemote) - { + if (!world.isRemote) { setInventorySlotContents(1, ItemStack.EMPTY); world.notifyBlockUpdate(pos, state, state, 3); ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionRemove")); @@ -135,8 +117,7 @@ public class TileMimic extends TileInventory implements ITickable } } - if (performSpecialAbility(player, side)) - { + if (performSpecialAbility(player, side)) { return true; } @@ -155,8 +136,7 @@ public class TileMimic extends TileInventory implements ITickable Utils.insertItemToTile(this, player, 0); this.refreshTileEntity(); - if (player.capabilities.isCreativeMode) - { + if (player.capabilities.isCreativeMode) { dropItemsOnBreak = getStackInSlot(0).isEmpty(); } @@ -164,93 +144,76 @@ public class TileMimic extends TileInventory implements ITickable return true; } - public boolean performSpecialAbility(EntityPlayer player, EnumFacing sideHit) - { - switch (this.getBlockMetadata()) - { - case BlockMimic.sentientMimicMeta: - if (player.capabilities.isCreativeMode) - { - if (player.isSneaking()) - { - playerCheckRadius = Math.max(playerCheckRadius - 1, 0); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); - } else - { - playerCheckRadius++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("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 TextComponentTranslation("chat.bloodmagic.mimic.potionSpawnRadius.down", potionSpawnRadius)); - } else - { - potionSpawnRadius++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("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()) - { + public boolean performSpecialAbility(EntityPlayer player, EnumFacing sideHit) { + switch (this.getBlockMetadata()) { + case BlockMimic.sentientMimicMeta: + if (player.capabilities.isCreativeMode) { + if (player.isSneaking()) { playerCheckRadius = Math.max(playerCheckRadius - 1, 0); ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); - } else - { + } else { playerCheckRadius++; ChatUtil.sendNoSpam(player, new TextComponentTranslation("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 TextComponentTranslation("chat.bloodmagic.mimic.potionInterval.down", potionSpawnInterval)); - } else - { - potionSpawnInterval++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionInterval.up", potionSpawnInterval)); - } - break; - default: - break; + return false; } - return true; - } + 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 TextComponentTranslation("chat.bloodmagic.mimic.potionSpawnRadius.down", potionSpawnRadius)); + } else { + potionSpawnRadius++; + ChatUtil.sendNoSpam(player, new TextComponentTranslation("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 TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); + } else { + playerCheckRadius++; + ChatUtil.sendNoSpam(player, new TextComponentTranslation("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 TextComponentTranslation("chat.bloodmagic.mimic.potionInterval.down", potionSpawnInterval)); + } else { + potionSpawnInterval++; + ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionInterval.up", potionSpawnInterval)); + } + break; + default: + break; + + } + + return true; + } } return false; } - public boolean spawnMimicEntity(EntityPlayer target) - { - if (this.getWorld().getDifficulty() == EnumDifficulty.PEACEFUL) - { + public boolean spawnMimicEntity(EntityPlayer target) { + if (this.getWorld().getDifficulty() == EnumDifficulty.PEACEFUL) { return false; } - if (this.getStackInSlot(0).isEmpty() || getWorld().isRemote) - { + if (this.getStackInSlot(0).isEmpty() || getWorld().isRemote) { return false; } @@ -263,8 +226,7 @@ public class TileMimic extends TileInventory implements ITickable this.setInventorySlotContents(0, ItemStack.EMPTY); getWorld().spawnEntity(mimicEntity); - if (target != null) - { + if (target != null) { mimicEntity.setAttackTarget(target); } @@ -273,18 +235,15 @@ public class TileMimic extends TileInventory implements ITickable return true; } - public void refreshTileEntity() - { - if (mimicedTile != null) - { + public void refreshTileEntity() { + if (mimicedTile != null) { dropMimicedTileInventory(); } mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, metaOfReplacedBlock); } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); @@ -297,8 +256,7 @@ public class TileMimic extends TileInventory implements ITickable } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setBoolean("dropItemsOnBreak", dropItemsOnBreak); @@ -311,25 +269,40 @@ public class TileMimic extends TileInventory implements ITickable return tag; } - public static void replaceMimicWithBlockActual(TileMimic mimic) - { + @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); + } + } + + @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.metaOfReplacedBlock); } - public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, int replacedMeta) - { - if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) - { + public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, int replacedMeta) { + if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); IBlockState state = block.getStateFromMeta(replacedMeta); - if (world.setBlockState(pos, state, 3)) - { + if (world.setBlockState(pos, state, 3)) { TileEntity tile = world.getTileEntity(pos); - if (tile != null) - { + if (tile != null) { tileTag.setInteger("x", pos.getX()); tileTag.setInteger("y", pos.getY()); tileTag.setInteger("z", pos.getZ()); @@ -344,21 +317,17 @@ public class TileMimic extends TileInventory implements ITickable } @Nullable - public static TileEntity getTileFromStackWithTag(World world, BlockPos pos, ItemStack stack, @Nullable NBTTagCompound tag, int replacementMeta) - { - if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) - { + public static TileEntity getTileFromStackWithTag(World world, BlockPos pos, ItemStack stack, @Nullable NBTTagCompound tag, int replacementMeta) { + if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); IBlockState state = block.getStateFromMeta(stack.getItemDamage()); - if (block.hasTileEntity(state)) - { + if (block.hasTileEntity(state)) { TileEntity tile = block.createTileEntity(world, state); if (tile == null) return null; - if (tag != null) - { + if (tag != null) { NBTTagCompound copyTag = tag.copy(); copyTag.setInteger("x", pos.getX()); copyTag.setInteger("y", pos.getY()); @@ -368,14 +337,11 @@ public class TileMimic extends TileInventory implements ITickable tile.setWorld(world); - try - { + try { _blockMetadata.setInt(tile, replacementMeta); - } catch (IllegalArgumentException e) - { + } catch (IllegalArgumentException e) { e.printStackTrace(); - } catch (IllegalAccessException e) - { + } catch (IllegalAccessException e) { e.printStackTrace(); } @@ -385,29 +351,4 @@ public class TileMimic extends TileInventory implements ITickable return null; } - - @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); - } - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack itemstack) - { - return slot == 0 && dropItemsOnBreak; - } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index 0b8435e0..e9cbe72a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -4,38 +4,32 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.nbt.NBTTagCompound; -public class TilePhantomBlock extends TileTicking -{ +public class TilePhantomBlock extends TileTicking { private int ticksRemaining = 10; public TilePhantomBlock() { } - public TilePhantomBlock(int ticksRemaining) - { + public TilePhantomBlock(int ticksRemaining) { this.ticksRemaining = ticksRemaining; } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { this.ticksRemaining = tagCompound.getInteger(Constants.NBT.TICKS_REMAINING); } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { tagCompound.setInteger(Constants.NBT.TICKS_REMAINING, ticksRemaining); return tagCompound; } @Override - public void onUpdate() - { + public void onUpdate() { ticksRemaining--; - if (ticksRemaining <= 0) - { + if (ticksRemaining <= 0) { getWorld().setBlockToAir(getPos()); getWorld().removeTileEntity(getPos()); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java index f393ee0b..4e0f8872 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -1,7 +1,8 @@ package WayofTime.bloodmagic.tile; -import java.util.List; - +import WayofTime.bloodmagic.api.iface.IPurificationAsh; +import WayofTime.bloodmagic.api.ritual.AreaDescriptor; +import WayofTime.bloodmagic.api.util.helper.PurificationHelper; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -10,63 +11,51 @@ import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; -import WayofTime.bloodmagic.api.iface.IPurificationAsh; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.util.helper.PurificationHelper; -public class TilePurificationAltar extends TileInventory implements ITickable -{ +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() - { + public TilePurificationAltar() { super(1, "purificationAltar"); } @Override - public void update() - { - if (totalPurity <= 0) - { + public void update() { + if (totalPurity <= 0) { ItemStack stack = this.getStackInSlot(0); - if (!stack.isEmpty() && stack.getItem() instanceof IPurificationAsh) - { + 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 - { + } else { return; } AxisAlignedBB aabb = purityArea.getAABB(getPos()); List animalList = getWorld().getEntitiesWithinAABB(EntityAnimal.class, aabb); - if (animalList.isEmpty()) - { + if (animalList.isEmpty()) { return; } boolean hasPerformed = false; - for (EntityAnimal animal : animalList) - { + for (EntityAnimal animal : animalList) { double added = PurificationHelper.addPurity(animal, Math.min(purityRate, totalPurity), maxPurity); - if (added > 0) - { + if (added > 0) { totalPurity -= purityRate; hasPerformed = true; } } - if (hasPerformed) - { - if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) - { + if (hasPerformed) { + if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) { WorldServer server = (WorldServer) 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, new int[0]); } @@ -74,8 +63,7 @@ public class TilePurificationAltar extends TileInventory implements ITickable } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); totalPurity = tag.getDouble("totalPurity"); maxPurity = tag.getDouble("maxPurity"); @@ -83,8 +71,7 @@ public class TilePurificationAltar extends TileInventory implements ITickable } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setDouble("totalPurity", totalPurity); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 1aa3cc29..7bdf5b3e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -15,8 +15,7 @@ import net.minecraft.util.ITickable; import java.util.ArrayList; import java.util.List; -public class TileSoulForge extends TileInventory implements ITickable, IDemonWillConduit -{ +public class TileSoulForge extends TileInventory implements ITickable, IDemonWillConduit { public static final int ticksRequired = 100; public static final double worldWillTransferRate = 1; @@ -27,22 +26,19 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil public int burnTime = 0; - public TileSoulForge() - { + public TileSoulForge() { super(6, "soulForge"); } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); burnTime = tag.getInteger(Constants.NBT.SOUL_FORGE_BURN); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setInteger(Constants.NBT.SOUL_FORGE_BURN, burnTime); @@ -50,22 +46,17 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } @Override - public void update() - { - if (!getWorld().isRemote) - { - for (EnumDemonWillType type : EnumDemonWillType.values()) - { + public void update() { + if (!getWorld().isRemote) { + for (EnumDemonWillType type : EnumDemonWillType.values()) { double willInWorld = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double filled = Math.min(willInWorld, worldWillTransferRate); - if (filled > 0) - { + if (filled > 0) { filled = this.fillDemonWill(type, filled, false); filled = WorldDemonWillHandler.drainWill(getWorld(), pos, type, filled, false); - if (filled > 0) - { + if (filled > 0) { this.fillDemonWill(type, filled, true); WorldDemonWillHandler.drainWill(getWorld(), pos, type, filled, true); } @@ -73,8 +64,7 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } } - if (!hasSoulGemOrSoul()) - { + if (!hasSoulGemOrSoul()) { burnTime = 0; return; } @@ -83,30 +73,22 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil List inputList = new ArrayList(); - for (int i = 0; i < 4; i++) - { - if (!getStackInSlot(i).isEmpty()) - { + for (int i = 0; i < 4; i++) { + if (!getStackInSlot(i).isEmpty()) { inputList.add(getStackInSlot(i)); } } TartaricForgeRecipe recipe = TartaricForgeRecipeRegistry.getMatchingRecipe(inputList, getWorld(), getPos()); - if (recipe != null && (soulsInGem >= recipe.getMinimumSouls() || burnTime > 0)) - { - if (canCraft(recipe)) - { + if (recipe != null && (soulsInGem >= recipe.getMinimumSouls() || burnTime > 0)) { + if (canCraft(recipe)) { burnTime++; - if (burnTime == ticksRequired) - { - if (!getWorld().isRemote) - { + if (burnTime == ticksRequired) { + if (!getWorld().isRemote) { double requiredSouls = recipe.getSoulsDrained(); - if (requiredSouls > 0) - { - if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) - { + if (requiredSouls > 0) { + if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) { consumeSouls(EnumDemonWillType.DEFAULT, requiredSouls); } } @@ -116,29 +98,23 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } burnTime = 0; - } else if (burnTime > ticksRequired + 10) - { + } else if (burnTime > ticksRequired + 10) { burnTime = 0; } - } else - { + } else { burnTime = 0; } - } else - { + } else { burnTime = 0; } } - public double getProgressForGui() - { + public double getProgressForGui() { return ((double) burnTime) / ticksRequired; } - private boolean canCraft(TartaricForgeRecipe recipe) - { - if (recipe == null) - { + private boolean canCraft(TartaricForgeRecipe recipe) { + if (recipe == null) { return false; } @@ -155,18 +131,14 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } - public void craftItem(TartaricForgeRecipe recipe) - { - if (this.canCraft(recipe)) - { + public void craftItem(TartaricForgeRecipe recipe) { + if (this.canCraft(recipe)) { ItemStack outputStack = recipe.getRecipeOutput(); ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (currentOutputStack.isEmpty()) - { + if (currentOutputStack.isEmpty()) { setInventorySlotContents(outputSlot, outputStack); - } else if (currentOutputStack.getItem() == currentOutputStack.getItem()) - { + } else if (currentOutputStack.getItem() == currentOutputStack.getItem()) { currentOutputStack.grow(outputStack.getCount()); } @@ -174,14 +146,11 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } } - public boolean hasSoulGemOrSoul() - { + public boolean hasSoulGemOrSoul() { ItemStack soulStack = getStackInSlot(soulSlot); - if (!soulStack.isEmpty()) - { - if (soulStack.getItem() instanceof IDemonWill || soulStack.getItem() instanceof IDemonWillGem) - { + if (!soulStack.isEmpty()) { + if (soulStack.getItem() instanceof IDemonWill || soulStack.getItem() instanceof IDemonWillGem) { return true; } } @@ -189,20 +158,16 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil return false; } - public double getWill(EnumDemonWillType type) - { + public double getWill(EnumDemonWillType type) { ItemStack soulStack = getStackInSlot(soulSlot); - if (soulStack != null) - { - if (soulStack.getItem() instanceof IDemonWill && ((IDemonWill) soulStack.getItem()).getType(soulStack) == type) - { + if (soulStack != null) { + if (soulStack.getItem() instanceof IDemonWill && ((IDemonWill) soulStack.getItem()).getType(soulStack) == type) { IDemonWill soul = (IDemonWill) soulStack.getItem(); return soul.getWill(type, soulStack); } - if (soulStack.getItem() instanceof IDemonWillGem) - { + if (soulStack.getItem() instanceof IDemonWillGem) { IDemonWillGem soul = (IDemonWillGem) soulStack.getItem(); return soul.getWill(type, soulStack); } @@ -211,25 +176,20 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil return 0; } - public double consumeSouls(EnumDemonWillType type, double requested) - { + public double consumeSouls(EnumDemonWillType type, double requested) { ItemStack soulStack = getStackInSlot(soulSlot); - if (soulStack != null) - { - if (soulStack.getItem() instanceof IDemonWill && ((IDemonWill) soulStack.getItem()).getType(soulStack) == type) - { + 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) - { + if (soul.getWill(type, soulStack) <= 0) { setInventorySlotContents(soulSlot, ItemStack.EMPTY); } return souls; } - if (soulStack.getItem() instanceof IDemonWillGem) - { + if (soulStack.getItem() instanceof IDemonWillGem) { IDemonWillGem soul = (IDemonWillGem) soulStack.getItem(); return soul.drainWill(type, soulStack, requested, true); } @@ -238,22 +198,17 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil return 0; } - public void consumeInventory() - { - for (int i = 0; i < 4; i++) - { + public void consumeInventory() { + for (int i = 0; i < 4; i++) { ItemStack inputStack = getStackInSlot(i); - if (!inputStack.isEmpty()) - { - if (inputStack.getItem().hasContainerItem(inputStack)) - { + if (!inputStack.isEmpty()) { + if (inputStack.getItem().hasContainerItem(inputStack)) { setInventorySlotContents(i, inputStack.getItem().getContainerItem(inputStack)); continue; } inputStack.shrink(1); - if (inputStack.isEmpty()) - { + if (inputStack.isEmpty()) { setInventorySlotContents(i, ItemStack.EMPTY); } } @@ -261,27 +216,22 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } @Override - public int getWeight() - { + public int getWeight() { return 50; } @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) - { - if (amount <= 0) - { + public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { + if (amount <= 0) { return 0; } - if (!canFill(type)) - { + if (!canFill(type)) { return 0; } ItemStack stack = this.getStackInSlot(soulSlot); - if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) - { + if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) { return 0; } @@ -290,11 +240,9 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) - { + public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { ItemStack stack = this.getStackInSlot(soulSlot); - if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) - { + if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) { return 0; } @@ -302,13 +250,11 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil double drained = amount; double current = willGem.getWill(type, stack); - if (current < drained) - { + if (current < drained) { drained = current; } - if (doDrain) - { + if (doDrain) { drained = willGem.drainWill(type, stack, drained, true); } @@ -316,20 +262,17 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } @Override - public boolean canFill(EnumDemonWillType type) - { + public boolean canFill(EnumDemonWillType type) { return true; } @Override - public boolean canDrain(EnumDemonWillType type) - { + public boolean canDrain(EnumDemonWillType type) { return true; } @Override - public double getCurrentWill(EnumDemonWillType type) - { + 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 index d55faece..44696136 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java @@ -12,27 +12,23 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.ForgeRegistries; -public class TileSpectralBlock extends TileTicking -{ +public class TileSpectralBlock extends TileTicking { private int ticksRemaining; private String containedBlockName; private int containedBlockMeta; - public TileSpectralBlock() - { + public TileSpectralBlock() { } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { ticksRemaining = tagCompound.getInteger(Constants.NBT.TICKS_REMAINING); containedBlockName = tagCompound.getString(Constants.NBT.CONTAINED_BLOCK_NAME); containedBlockMeta = tagCompound.getInteger(Constants.NBT.CONTAINED_BLOCK_META); } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { tagCompound.setInteger(Constants.NBT.TICKS_REMAINING, ticksRemaining); tagCompound.setString(Constants.NBT.CONTAINED_BLOCK_NAME, Strings.isNullOrEmpty(containedBlockName) ? "" : containedBlockName); tagCompound.setInteger(Constants.NBT.CONTAINED_BLOCK_META, containedBlockMeta); @@ -40,40 +36,33 @@ public class TileSpectralBlock extends TileTicking } @Override - public void onUpdate() - { - if (getWorld().isRemote) - { + public void onUpdate() { + if (getWorld().isRemote) { return; } ticksRemaining--; - if (ticksRemaining <= 0) - { + if (ticksRemaining <= 0) { returnContainedBlock(); } } - private void setContainedBlockInfo(IBlockState blockState) - { + private void setContainedBlockInfo(IBlockState blockState) { containedBlockName = blockState.getBlock().getRegistryName().toString(); containedBlockMeta = blockState.getBlock().getMetaFromState(blockState); } - private void setDuration(int duration) - { + private void setDuration(int duration) { ticksRemaining = duration; } - public void resetDuration(int reset) - { + public void resetDuration(int reset) { if (ticksRemaining < reset) ticksRemaining = reset; } - public void returnContainedBlock() - { + public void returnContainedBlock() { Block block = null; if (!Strings.isNullOrEmpty(containedBlockName)) @@ -83,8 +72,7 @@ public class TileSpectralBlock extends TileTicking getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); } - public static void createSpectralBlock(World world, BlockPos blockPos, int duration) - { + public static void createSpectralBlock(World world, BlockPos blockPos, int duration) { if (world.isAirBlock(blockPos)) return; IBlockState cachedState = world.getBlockState(blockPos); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index 625eeb8e..97c51571 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -22,42 +22,35 @@ import net.minecraftforge.common.MinecraftForge; import java.util.List; -public class TileTeleposer extends TileInventory implements ITickable -{ +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() - { + public TileTeleposer() { super(1, "teleposer"); } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { super.deserialize(tagCompound); previousInput = tagCompound.getInteger(Constants.NBT.PREVIOUS_INPUT); } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { super.serialize(tagCompound); tagCompound.setInteger(Constants.NBT.PREVIOUS_INPUT, previousInput); return tagCompound; } @Override - public void update() - { - if (!getWorld().isRemote) - { + public void update() { + if (!getWorld().isRemote) { int currentInput = getWorld().getStrongPower(pos); - if (previousInput == 0 && currentInput != 0) - { + if (previousInput == 0 && currentInput != 0) { initiateTeleport(); } @@ -65,33 +58,25 @@ public class TileTeleposer extends TileInventory implements ITickable } } - public void initiateTeleport() - { - if (!getWorld().isRemote && canInitiateTeleport(this) && getBlockType() instanceof BlockTeleposer) - { + public void initiateTeleport() { + if (!getWorld().isRemote && canInitiateTeleport(this) && getBlockType() instanceof BlockTeleposer) { ItemStack focusStack = NBTHelper.checkNBT(getStackInSlot(0)); ItemTelepositionFocus focus = (ItemTelepositionFocus) focusStack.getItem(); BlockPos focusPos = focus.getBlockPos(getStackInSlot(0)); World focusWorld = focus.getWorld(getStackInSlot(0)); - if (focusWorld != null && focusWorld.getTileEntity(focusPos) instanceof TileTeleposer && !focusWorld.getTileEntity(focusPos).equals(this)) - { + if (focusWorld != null && focusWorld.getTileEntity(focusPos) instanceof TileTeleposer && !focusWorld.getTileEntity(focusPos).equals(this)) { final int focusLevel = (getStackInSlot(0).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.getSoulNetwork(focus.getOwnerUUID(focusStack)).syphonAndDamage(PlayerHelper.getPlayerFromUUID(focus.getOwnerUUID(focusStack)), lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1))) - { + if (NetworkHelper.getSoulNetwork(focus.getOwnerUUID(focusStack)).syphonAndDamage(PlayerHelper.getPlayerFromUUID(focus.getOwnerUUID(focusStack)), 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++) - { + 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 (Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos) && !MinecraftForge.EVENT_BUS.post(event)) - { + if (Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos) && !MinecraftForge.EVENT_BUS.post(event)) { blocksTransported++; } } @@ -107,37 +92,27 @@ public class TileTeleposer extends TileInventory implements ITickable 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); - if (focusWorld.equals(getWorld())) - { - if (!originalWorldEntities.isEmpty()) - { - for (Entity entity : originalWorldEntities) - { + 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), true)); } } - if (!focusWorldEntities.isEmpty()) - { - for (Entity entity : focusWorldEntities) - { + 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), true)); } } - } else - { - if (!originalWorldEntities.isEmpty()) - { - for (Entity entity : originalWorldEntities) - { + } 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), getWorld(), focusWorld.provider.getDimension(), true)); } } - if (!focusWorldEntities.isEmpty()) - { - for (Entity entity : focusWorldEntities) - { + 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), focusWorld, getWorld().provider.getDimension(), true)); } } @@ -147,8 +122,7 @@ public class TileTeleposer extends TileInventory implements ITickable } } - private boolean canInitiateTeleport(TileTeleposer teleposer) - { + private boolean canInitiateTeleport(TileTeleposer teleposer) { return !teleposer.getStackInSlot(0).isEmpty() && teleposer.getStackInSlot(0).getItem() instanceof ItemTelepositionFocus && !Strings.isNullOrEmpty(((ItemTelepositionFocus) teleposer.getStackInSlot(0).getItem()).getOwnerName(teleposer.getStackInSlot(0))); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java index 138d4719..56498ae8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java @@ -12,22 +12,19 @@ import net.minecraftforge.fml.relauncher.SideOnly; /** * Base tile class. - * + *

        * Handles data syncing and core data writing/reading. */ -public class TileBase extends TileEntity -{ +public class TileBase extends TileEntity { @Override - public final void readFromNBT(NBTTagCompound compound) - { + public final void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); deserializeBase(compound); deserialize(compound); } @Override - public final NBTTagCompound writeToNBT(NBTTagCompound compound) - { + public final NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); serializeBase(compound); return serialize(compound); @@ -35,38 +32,34 @@ public class TileBase extends TileEntity /** * Called by {@link #readFromNBT(NBTTagCompound)} - * + *

        * 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(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { } /** * Package private method for reading base data from the tag compound. * - * @see TileTicking - * * @param tagCompound - The tag compound to read from + * @see TileTicking */ - void deserializeBase(NBTTagCompound tagCompound) - { + void deserializeBase(NBTTagCompound tagCompound) { } /** * Called by {@link #writeToNBT(NBTTagCompound)} - * + *

        * 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 NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { return tagCompound; } @@ -74,13 +67,11 @@ public class TileBase extends TileEntity /** * Package private method for writing base data to the tag compound. * - * @see TileTicking - * * @param tagCompound - The tag compound to write to. * @return the modified tag compound + * @see TileTicking */ - NBTTagCompound serializeBase(NBTTagCompound tagCompound) - { + NBTTagCompound serializeBase(NBTTagCompound tagCompound) { return tagCompound; } @@ -91,34 +82,29 @@ public class TileBase extends TileEntity // Data syncing @Override - public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newState) - { + public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newState) { return oldState.getBlock() != newState.getBlock(); } @Override - public final SPacketUpdateTileEntity getUpdatePacket() - { + public final SPacketUpdateTileEntity getUpdatePacket() { return new SPacketUpdateTileEntity(getPos(), -999, writeToNBT(new NBTTagCompound())); } @Override @SideOnly(Side.CLIENT) - public final void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) - { + public final void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { super.onDataPacket(net, pkt); readFromNBT(pkt.getNbtCompound()); } @Override - public final NBTTagCompound getUpdateTag() - { + public final NBTTagCompound getUpdateTag() { return writeToNBT(new NBTTagCompound()); } @Override - public final void handleUpdateTag(NBTTagCompound tag) - { + public final void handleUpdateTag(NBTTagCompound tag) { readFromNBT(tag); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java index 83ccaab6..f0a532ad 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java @@ -7,14 +7,12 @@ import net.minecraft.util.ITickable; * 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 ITickable -{ +public abstract class TileTicking extends TileBase implements ITickable { private int ticksExisted; private boolean shouldTick = true; @Override - public final void update() - { + public final void update() { if (shouldTick()) { ticksExisted++; onUpdate(); @@ -22,15 +20,13 @@ public abstract class TileTicking extends TileBase implements ITickable } @Override - void deserializeBase(NBTTagCompound tagCompound) - { + void deserializeBase(NBTTagCompound tagCompound) { this.ticksExisted = tagCompound.getInteger("ticksExisted"); this.shouldTick = tagCompound.getBoolean("shouldTick"); } @Override - NBTTagCompound serializeBase(NBTTagCompound tagCompound) - { + NBTTagCompound serializeBase(NBTTagCompound tagCompound) { tagCompound.setInteger("ticksExisted", getTicksExisted()); tagCompound.setBoolean("shouldTick", shouldTick()); return tagCompound; @@ -41,23 +37,19 @@ public abstract class TileTicking extends TileBase implements ITickable */ public abstract void onUpdate(); - public int getTicksExisted() - { + public int getTicksExisted() { return ticksExisted; } - public void resetLifetime() - { + public void resetLifetime() { ticksExisted = 0; } - public boolean shouldTick() - { + public boolean shouldTick() { return shouldTick; } - public void setShouldTick(boolean 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 index 4cf8c221..9ba7f05a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.tile.container; +import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.tile.TileAlchemyTable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.ClickType; @@ -7,15 +9,11 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -public class ContainerAlchemyTable extends Container -{ +public class ContainerAlchemyTable extends Container { private final IInventory tileTable; - public ContainerAlchemyTable(InventoryPlayer inventoryPlayer, IInventory tileTable) - { + public ContainerAlchemyTable(InventoryPlayer inventoryPlayer, IInventory tileTable) { this.tileTable = tileTable; this.addSlotToContainer(new Slot(tileTable, 0, 62, 15)); this.addSlotToContainer(new Slot(tileTable, 1, 80, 51)); @@ -27,30 +25,24 @@ public class ContainerAlchemyTable extends Container 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++) - { + 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++) - { + 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, EntityPlayer player) - { + public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) { InventoryPlayer inventoryPlayer = player.inventory; - if (slotId < 6 && slotId >= 0) - { + if (slotId < 6 && slotId >= 0) { Slot slot = this.getSlot(slotId); - if (!slot.getHasStack() && inventoryPlayer.getItemStack().isEmpty()) - { + if (!slot.getHasStack() && inventoryPlayer.getItemStack().isEmpty()) { ((TileAlchemyTable) tileTable).toggleInputSlotAccessible(slotId); } } @@ -59,51 +51,40 @@ public class ContainerAlchemyTable extends Container } @Override - public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) - { + public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); - if (slot != null && slot.getHasStack()) - { + if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); - if (index == 8) - { - if (!this.mergeItemStack(itemstack1, 9, 9 + 36, true)) - { + 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) - { + } 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)) - { + } else if (!this.mergeItemStack(itemstack1, 0, 6, false)) { return ItemStack.EMPTY; } - } else if (!this.mergeItemStack(itemstack1, 9, 9 + 36, false)) - { + } else if (!this.mergeItemStack(itemstack1, 9, 9 + 36, false)) { return ItemStack.EMPTY; } - if (itemstack1.getCount() == 0) - { + if (itemstack1.getCount() == 0) { slot.putStack(ItemStack.EMPTY); - } else - { + } else { slot.onSlotChanged(); } - if (itemstack1.getCount() == itemstack.getCount()) - { + if (itemstack1.getCount() == itemstack.getCount()) { return ItemStack.EMPTY; } @@ -114,35 +95,28 @@ public class ContainerAlchemyTable extends Container } @Override - public boolean canInteractWith(EntityPlayer playerIn) - { + public boolean canInteractWith(EntityPlayer playerIn) { return this.tileTable.isUsableByPlayer(playerIn); } - private class SlotOrb extends Slot - { - public SlotOrb(IInventory inventory, int slotIndex, int x, int y) - { + 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) - { + 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) - { + 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) - { + 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 index e2ec3eee..fa230b5a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java @@ -1,7 +1,8 @@ package WayofTime.bloodmagic.tile.container; -import javax.annotation.Nullable; - +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.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; @@ -10,54 +11,43 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.item.routing.IRoutingFilterProvider; -import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -public class ContainerItemRoutingNode extends Container -{ +import javax.annotation.Nullable; + +public class ContainerItemRoutingNode extends Container { private final IInventory tileItemRoutingNode; -// private final ItemInventory itemInventory; + private final TileFilteredRoutingNode inventory; + public int lastGhostSlotClicked = -1; + // private final ItemInventory itemInventory; private int slotsOccupied; - private final TileFilteredRoutingNode inventory; - - public int lastGhostSlotClicked = -1; - - public ContainerItemRoutingNode(InventoryPlayer inventoryPlayer, IInventory tileItemRoutingNode) - { + public ContainerItemRoutingNode(InventoryPlayer 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++) - { + 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++) - { + 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++) - { + for (int i = 0; i < 9; i++) { addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 145)); } } - public void resetItemInventory(ItemStack masterStack) - { + public void resetItemInventory(ItemStack masterStack) { inventory.itemInventory.initializeInventory(masterStack); } @@ -65,34 +55,28 @@ public class ContainerItemRoutingNode extends Container * Overridden in order to handle ghost item slots. */ @Override - public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) - { + public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) { InventoryPlayer inventoryPlayer = player.inventory; // if (!player.worldObj.isRemote) { - if (slotId >= 0) - { + 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)) - { + 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()) - { + 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()) - { + } else if (!heldStack.isEmpty() && slotStack.isEmpty()) { + if (!((SlotGhostItem) slot).canBeAccessed()) { return super.slotClick(slotId, dragType, clickTypeIn, player); } @@ -102,8 +86,7 @@ public class ContainerItemRoutingNode extends Container slot.putStack(copyStack); ItemStack filterStack = this.inventorySlots.get(0).getStack(); - if (filterStack.getItem() instanceof IRoutingFilterProvider) - { + if (filterStack.getItem() instanceof IRoutingFilterProvider) { ItemStack filterCopy = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForItem(filterStack, heldStack); slot.putStack(filterCopy); } @@ -123,55 +106,44 @@ public class ContainerItemRoutingNode extends Container } @Override - public void detectAndSendChanges() - { + public void detectAndSendChanges() { super.detectAndSendChanges(); } @Override - public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) - { + public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); - if (slot != null && slot.getHasStack()) - { + if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); - if (index == 0) - { - if (!this.mergeItemStack(itemstack1, slotsOccupied, slotsOccupied + 36, true)) - { + if (index == 0) { + if (!this.mergeItemStack(itemstack1, slotsOccupied, slotsOccupied + 36, true)) { return null; } slot.onSlotChange(itemstack1, itemstack); - } else if (index > 0) - { + } 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)) - { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { return ItemStack.EMPTY; } } - } else if (!this.mergeItemStack(itemstack1, slotsOccupied, 36 + slotsOccupied, false)) - { + } else if (!this.mergeItemStack(itemstack1, slotsOccupied, 36 + slotsOccupied, false)) { return ItemStack.EMPTY; } - if (itemstack1.isEmpty()) - { + if (itemstack1.isEmpty()) { slot.putStack(ItemStack.EMPTY); - } else - { + } else { slot.onSlotChanged(); } - if (itemstack1.getCount() == itemstack.getCount()) - { + if (itemstack1.getCount() == itemstack.getCount()) { return ItemStack.EMPTY; } @@ -182,85 +154,71 @@ public class ContainerItemRoutingNode extends Container } @Override - public boolean canInteractWith(EntityPlayer playerIn) - { + public boolean canInteractWith(EntityPlayer playerIn) { return this.tileItemRoutingNode.isUsableByPlayer(playerIn); } - private class SlotItemFilter extends Slot - { + private class SlotItemFilter extends Slot { public ContainerItemRoutingNode container; public TileFilteredRoutingNode inventory; - public SlotItemFilter(ContainerItemRoutingNode container, IInventory inventory, int slotIndex, int x, int y) - { + 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) - { + public boolean isItemValid(ItemStack itemStack) { return itemStack.getItem() instanceof IRoutingFilterProvider; //TODO: Create a new Item that holds the filter. } @Override - public void onSlotChanged() - { + public void onSlotChanged() { super.onSlotChanged(); container.resetItemInventory(getStack()); - for (int i = 1; i <= 9; i++) - { + for (int i = 1; i <= 9; i++) { Slot slot = container.getSlot(i); slot.onSlotChanged(); } } @Override - public ItemStack getStack() - { + public ItemStack getStack() { return this.inventory.getStackInSlot(getActiveSlot()); } @Override - public void putStack(@Nullable ItemStack stack) - { + public void putStack(@Nullable ItemStack stack) { this.inventory.setInventorySlotContents(getActiveSlot(), stack); this.onSlotChanged(); } @Override - public ItemStack decrStackSize(int amount) - { + public ItemStack decrStackSize(int amount) { return this.inventory.decrStackSize(getActiveSlot(), amount); } - public int getActiveSlot() - { + public int getActiveSlot() { return inventory.currentActiveSlot; } } - private class SlotGhostItem extends Slot - { + private class SlotGhostItem extends Slot { private ItemInventory itemInv; - public SlotGhostItem(ItemInventory inventory, int slotIndex, int x, int y) - { + public SlotGhostItem(ItemInventory inventory, int slotIndex, int x, int y) { super(inventory, slotIndex, x, y); itemInv = inventory; } @Override - public boolean isItemValid(ItemStack stack) - { + public boolean isItemValid(ItemStack stack) { return false; } @Override - public boolean canTakeStack(EntityPlayer playerIn) - { + public boolean canTakeStack(EntityPlayer playerIn) { return false; } @@ -270,8 +228,7 @@ public class ContainerItemRoutingNode extends Container // return itemInv.canInventoryBeManipulated() && super.isHere(inv, slotIn); // } - public boolean canBeAccessed() - { + 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 index 64cd4de9..a9959c27 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java @@ -5,19 +5,16 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; -public class ContainerMasterRoutingNode extends Container -{ +public class ContainerMasterRoutingNode extends Container { private final IInventory tileMasterRoutingNode; - public ContainerMasterRoutingNode(InventoryPlayer inventoryPlayer, IInventory tileMasterRoutingNode) - { + public ContainerMasterRoutingNode(InventoryPlayer inventoryPlayer, IInventory tileMasterRoutingNode) { this.tileMasterRoutingNode = tileMasterRoutingNode; } @Override - public boolean canInteractWith(EntityPlayer playerIn) - { + public boolean canInteractWith(EntityPlayer 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 index ecf995d3..ced03f85 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java @@ -10,12 +10,10 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerSoulForge extends Container -{ +public class ContainerSoulForge extends Container { private final IInventory tileForge; - public ContainerSoulForge(InventoryPlayer inventoryPlayer, IInventory tileForge) - { + public ContainerSoulForge(InventoryPlayer inventoryPlayer, IInventory tileForge) { this.tileForge = tileForge; this.addSlotToContainer(new Slot(tileForge, 0, 8, 15)); this.addSlotToContainer(new Slot(tileForge, 1, 80, 15)); @@ -24,66 +22,51 @@ public class ContainerSoulForge extends Container 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++) - { + 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++) - { + for (int i = 0; i < 9; i++) { addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 181)); } } @Override - public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) - { + public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); - if (slot != null && slot.getHasStack()) - { + if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); - if (index == 5) - { - if (!this.mergeItemStack(itemstack1, 6, 6 + 36, true)) - { + 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)) - { + } 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)) - { + } else if (!this.mergeItemStack(itemstack1, 0, 4, false)) { return ItemStack.EMPTY; } - } else if (!this.mergeItemStack(itemstack1, 6, 42, false)) - { + } else if (!this.mergeItemStack(itemstack1, 6, 42, false)) { return ItemStack.EMPTY; } - if (itemstack1.getCount() == 0) - { + if (itemstack1.getCount() == 0) { slot.putStack(ItemStack.EMPTY); - } else - { + } else { slot.onSlotChanged(); } - if (itemstack1.getCount() == itemstack.getCount()) - { + if (itemstack1.getCount() == itemstack.getCount()) { return ItemStack.EMPTY; } @@ -94,35 +77,28 @@ public class ContainerSoulForge extends Container } @Override - public boolean canInteractWith(EntityPlayer playerIn) - { + public boolean canInteractWith(EntityPlayer playerIn) { return this.tileForge.isUsableByPlayer(playerIn); } - private class SlotSoul extends Slot - { - public SlotSoul(IInventory inventory, int slotIndex, int x, int y) - { + 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) - { + 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) - { + 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) - { + 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 index 163361a0..82588b45 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java @@ -8,65 +8,51 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerTeleposer extends Container -{ +public class ContainerTeleposer extends Container { private final IInventory tileTeleposer; - public ContainerTeleposer(InventoryPlayer inventoryPlayer, IInventory tileTeleposer) - { + public ContainerTeleposer(InventoryPlayer 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++) - { + 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++) - { + for (int i = 0; i < 9; i++) { addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 115)); } } @Override - public ItemStack transferStackInSlot(EntityPlayer player, int slot) - { + public ItemStack transferStackInSlot(EntityPlayer player, int slot) { ItemStack stack = ItemStack.EMPTY; Slot slotObject = inventorySlots.get(slot); int slots = inventorySlots.size(); - if (slotObject != null && slotObject.getHasStack()) - { + 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)) - { + 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)) - { + } else if (!this.mergeItemStack(stackInSlot, slots, 36 + slots, false)) { return ItemStack.EMPTY; } } - if (stackInSlot.getCount() == 0) - { + if (stackInSlot.getCount() == 0) { slotObject.putStack(ItemStack.EMPTY); - } else - { + } else { slotObject.onSlotChanged(); } - if (stackInSlot.getCount() == stack.getCount()) - { + if (stackInSlot.getCount() == stack.getCount()) { return ItemStack.EMPTY; } @@ -77,21 +63,17 @@ public class ContainerTeleposer extends Container } @Override - public boolean canInteractWith(EntityPlayer playerIn) - { + public boolean canInteractWith(EntityPlayer playerIn) { return this.tileTeleposer.isUsableByPlayer(playerIn); } - private class SlotTeleposer extends Slot - { - public SlotTeleposer(IInventory inventory, int slotIndex, int x, int y) - { + 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) - { + 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 index d63884c2..83a22f14 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java @@ -1,40 +1,35 @@ package WayofTime.bloodmagic.tile.routing; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.item.inventory.ItemInventory; +import WayofTime.bloodmagic.util.GhostItemHelper; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumFacing; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.util.GhostItemHelper; import net.minecraft.util.NonNullList; -public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedInventory -{ +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) - { + public TileFilteredRoutingNode(int size, String name) { super(size, name); } - public ItemStack getFilterStack(EnumFacing side) - { + public ItemStack getFilterStack(EnumFacing side) { int index = side.getIndex(); return getStackInSlot(index); } - public void setGhostItemAmount(int ghostItemSlot, int amount) - { + public void setGhostItemAmount(int ghostItemSlot, int amount) { ItemStack stack = itemInventory.getStackInSlot(ghostItemSlot); - if (!stack.isEmpty()) - { + if (!stack.isEmpty()) { GhostItemHelper.setItemGhostAmount(stack, amount); } @@ -42,38 +37,30 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn } @Override - public boolean isInventoryConnectedToSide(EnumFacing side) - { + public boolean isInventoryConnectedToSide(EnumFacing side) { return true; } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); currentActiveSlot = tag.getInteger("currentSlot"); priorities = tag.getIntArray(Constants.NBT.ROUTING_PRIORITY); - if (priorities.length != 6) - { + if (priorities.length != 6) { priorities = new int[6]; } - if (!tag.getBoolean("updated")) - { + if (!tag.getBoolean("updated")) { NBTTagList tags = tag.getTagList("Items", 10); inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); - for (int i = 0; i < tags.tagCount(); i++) - { - if (!isSyncedSlot(i)) - { + for (int i = 0; i < tags.tagCount(); i++) { + if (!isSyncedSlot(i)) { NBTTagCompound data = tags.getCompoundTagAt(i); byte j = data.getByte("Slot"); - if (j == 0) - { + if (j == 0) { inventory.set(i, new ItemStack(data)); - } else if (j >= 1 && j < inventory.size() + 1) - { + } else if (j >= 1 && j < inventory.size() + 1) { inventory.set(j - 1, new ItemStack(data)); } } @@ -84,8 +71,7 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setInteger("currentSlot", currentActiveSlot); tag.setIntArray(Constants.NBT.ROUTING_PRIORITY, priorities); @@ -93,46 +79,39 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn return tag; } - public void swapFilters(int requestedSlot) - { + public void swapFilters(int requestedSlot) { currentActiveSlot = requestedSlot; itemInventory.initializeInventory(getStackInSlot(currentActiveSlot)); this.markDirty(); } @Override - public int[] getSlotsForFace(EnumFacing side) - { + public int[] getSlotsForFace(EnumFacing side) { return new int[0]; } @Override - public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction) - { + public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction) { return false; } @Override - public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) - { + public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) { return false; } @Override - public int getPriority(EnumFacing side) - { + public int getPriority(EnumFacing side) { return priorities[side.getIndex()]; } - public void incrementCurrentPriotiryToMaximum(int max) - { + public void incrementCurrentPriotiryToMaximum(int max) { priorities[currentActiveSlot] = Math.min(priorities[currentActiveSlot] + 1, max); IBlockState state = getWorld().getBlockState(pos); getWorld().notifyBlockUpdate(pos, state, state, 3); } - public void decrementCurrentPriority() - { + public void decrementCurrentPriority() { priorities[currentActiveSlot] = Math.max(priorities[currentActiveSlot] - 1, 0); IBlockState 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 index 1717445f..d758f2b5 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java @@ -1,51 +1,39 @@ 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.EnumFacing; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.item.routing.IFluidFilterProvider; -import WayofTime.bloodmagic.item.routing.IItemFilterProvider; -import WayofTime.bloodmagic.routing.DefaultItemFilter; -import WayofTime.bloodmagic.routing.IFluidFilter; -import WayofTime.bloodmagic.routing.IInputFluidRoutingNode; -import WayofTime.bloodmagic.routing.IInputItemRoutingNode; -import WayofTime.bloodmagic.routing.IItemFilter; -import WayofTime.bloodmagic.util.Utils; -public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode, IInputFluidRoutingNode -{ - public TileInputRoutingNode() - { +public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode, IInputFluidRoutingNode { + public TileInputRoutingNode() { super(6, "inputNode"); } @Override - public boolean isInput(EnumFacing side) - { + public boolean isInput(EnumFacing side) { return true; } @Override - public IItemFilter getInputFilterForSide(EnumFacing side) - { + public IItemFilter getInputFilterForSide(EnumFacing side) { TileEntity tile = getWorld().getTileEntity(pos.offset(side)); - if (tile != null) - { + if (tile != null) { IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); - if (handler != null) - { + if (handler != null) { ItemStack filterStack = this.getFilterStack(side); - if (filterStack.isEmpty()) - { + if (filterStack.isEmpty()) { IItemFilter filter = new DefaultItemFilter(); filter.initializeFilter(null, tile, handler, false); return filter; - } else if (!(filterStack.getItem() instanceof IItemFilterProvider)) - { + } else if (!(filterStack.getItem() instanceof IItemFilterProvider)) { return null; } @@ -58,21 +46,17 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn } @Override - public boolean isFluidInput(EnumFacing side) - { + public boolean isFluidInput(EnumFacing side) { return true; } @Override - public IFluidFilter getInputFluidFilterForSide(EnumFacing side) - { + public IFluidFilter getInputFluidFilterForSide(EnumFacing side) { TileEntity tile = getWorld().getTileEntity(pos.offset(side)); - if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, 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)) - { + if (filterStack == null || !(filterStack.getItem() instanceof IFluidFilterProvider)) { return null; } @@ -83,8 +67,7 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn } @Override - public boolean isTankConnectedToSide(EnumFacing side) - { + public boolean isTankConnectedToSide(EnumFacing 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 index 01ef2372..6c598390 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileItemRoutingNode.java @@ -1,9 +1,7 @@ package WayofTime.bloodmagic.tile.routing; -public class TileItemRoutingNode extends TileRoutingNode -{ - public TileItemRoutingNode() - { +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 index 2344057c..cbe898e4 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -1,12 +1,10 @@ package WayofTime.bloodmagic.tile.routing; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.TreeMap; - +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.routing.*; +import WayofTime.bloodmagic.tile.TileInventory; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; @@ -14,42 +12,26 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.routing.IFluidFilter; -import WayofTime.bloodmagic.routing.IInputFluidRoutingNode; -import WayofTime.bloodmagic.routing.IInputItemRoutingNode; -import WayofTime.bloodmagic.routing.IItemFilter; -import WayofTime.bloodmagic.routing.IMasterRoutingNode; -import WayofTime.bloodmagic.routing.IOutputFluidRoutingNode; -import WayofTime.bloodmagic.routing.IOutputItemRoutingNode; -import WayofTime.bloodmagic.routing.IRoutingNode; -import WayofTime.bloodmagic.routing.NodeHelper; -import WayofTime.bloodmagic.tile.TileInventory; -public class TileMasterRoutingNode extends TileInventory implements IMasterRoutingNode, ITickable -{ +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; - - public TileMasterRoutingNode() - { - super(0, "masterRoutingNode"); - } - // 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 static final int tickRate = 20; + public TileMasterRoutingNode() { + super(0, "masterRoutingNode"); + } @Override - public void update() - { - if (!getWorld().isRemote) - { + public void update() { + if (!getWorld().isRemote) { // currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); currentInput = getWorld().getStrongPower(pos); @@ -64,31 +46,23 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti Map> outputMap = new TreeMap>(); Map> outputFluidMap = new TreeMap>(); - for (BlockPos outputPos : outputNodeList) - { + for (BlockPos outputPos : outputNodeList) { TileEntity outputTile = getWorld().getTileEntity(outputPos); - if (this.isConnected(new LinkedList(), outputPos)) - { - if (outputTile instanceof IOutputItemRoutingNode) - { + if (this.isConnected(new LinkedList(), outputPos)) { + if (outputTile instanceof IOutputItemRoutingNode) { IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) { continue; } IItemFilter filter = outputNode.getOutputFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) - { + if (outputMap.containsKey(priority)) { outputMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList(); filterList.add(filter); outputMap.put(priority, filterList); @@ -97,26 +71,20 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - if (outputTile instanceof IOutputFluidRoutingNode) - { + if (outputTile instanceof IOutputFluidRoutingNode) { IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) { continue; } IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) - { + if (outputMap.containsKey(priority)) { outputFluidMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList(); filterList.add(filter); outputFluidMap.put(priority, filterList); @@ -130,31 +98,23 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti Map> inputMap = new TreeMap>(); Map> inputFluidMap = new TreeMap>(); - for (BlockPos inputPos : inputNodeList) - { + for (BlockPos inputPos : inputNodeList) { TileEntity inputTile = getWorld().getTileEntity(inputPos); - if (this.isConnected(new LinkedList(), inputPos)) - { - if (inputTile instanceof IInputItemRoutingNode) - { + if (this.isConnected(new LinkedList(), inputPos)) { + if (inputTile instanceof IInputItemRoutingNode) { IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) { continue; } IItemFilter filter = inputNode.getInputFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) - { + if (inputMap.containsKey(priority)) { inputMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList(); filterList.add(filter); inputMap.put(priority, filterList); @@ -163,26 +123,20 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - if (inputTile instanceof IInputFluidRoutingNode) - { + if (inputTile instanceof IInputFluidRoutingNode) { IInputFluidRoutingNode inputNode = (IInputFluidRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) { continue; } IFluidFilter filter = inputNode.getInputFluidFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) - { + if (inputMap.containsKey(priority)) { inputFluidMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList(); filterList.add(filter); inputFluidMap.put(priority, filterList); @@ -196,19 +150,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT)); int maxFluidTransfer = 1000; - for (Entry> outputEntry : outputMap.entrySet()) - { + for (Entry> outputEntry : outputMap.entrySet()) { List outputList = outputEntry.getValue(); - for (IItemFilter outputFilter : outputList) - { - for (Entry> inputEntry : inputMap.entrySet()) - { + for (IItemFilter outputFilter : outputList) { + for (Entry> inputEntry : inputMap.entrySet()) { List inputList = inputEntry.getValue(); - for (IItemFilter inputFilter : inputList) - { + for (IItemFilter inputFilter : inputList) { maxTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxTransfer); - if (maxTransfer <= 0) - { + if (maxTransfer <= 0) { return; } } @@ -216,19 +165,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - for (Entry> outputEntry : outputFluidMap.entrySet()) - { + for (Entry> outputEntry : outputFluidMap.entrySet()) { List outputList = outputEntry.getValue(); - for (IFluidFilter outputFilter : outputList) - { - for (Entry> inputEntry : inputFluidMap.entrySet()) - { + for (IFluidFilter outputFilter : outputList) { + for (Entry> inputEntry : inputFluidMap.entrySet()) { List inputList = inputEntry.getValue(); - for (IFluidFilter inputFilter : inputList) - { + for (IFluidFilter inputFilter : inputList) { maxFluidTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxFluidTransfer); - if (maxFluidTransfer <= 0) - { + if (maxFluidTransfer <= 0) { return; } } @@ -237,18 +181,15 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - public int getMaxTransferForDemonWill(double will) - { + public int getMaxTransferForDemonWill(double will) { return 8; } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); NBTTagList tags = new NBTTagList(); - for (BlockPos pos : generalNodeList) - { + for (BlockPos pos : generalNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -258,8 +199,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti tag.setTag(Constants.NBT.ROUTING_MASTER_GENERAL, tags); tags = new NBTTagList(); - for (BlockPos pos : inputNodeList) - { + for (BlockPos pos : inputNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -269,8 +209,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti tag.setTag(Constants.NBT.ROUTING_MASTER_INPUT, tags); tags = new NBTTagList(); - for (BlockPos pos : outputNodeList) - { + for (BlockPos pos : outputNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -282,29 +221,25 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); generalNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_INPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); inputNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); outputNodeList.add(newPos); @@ -312,16 +247,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public boolean isConnected(List path, BlockPos nodePos) - { + 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)) - { + if (!(tile instanceof IRoutingNode)) { // connectionMap.remove(nodePos); return false; } @@ -330,22 +263,17 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti List connectionList = node.getConnected(); // List testPath = path.subList(0, path.size()); path.add(nodePos); - for (BlockPos testPos : connectionList) - { - if (path.contains(testPos)) - { + for (BlockPos testPos : connectionList) { + if (path.contains(testPos)) { continue; } - if (testPos.equals(this.getPos()) && node.isConnectionEnabled(testPos)) - { + 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)) - { + } else if (NodeHelper.isNodeConnectionEnabled(getWorld(), node, testPos)) { + if (isConnected(path, testPos)) { // path.clear(); // path.addAll(testPath); return true; @@ -357,56 +285,44 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public boolean isConnectionEnabled(BlockPos testPos) - { + public boolean isConnectionEnabled(BlockPos testPos) { return currentInput <= 0; } @Override - public void addNodeToList(IRoutingNode node) - { + public void addNodeToList(IRoutingNode node) { BlockPos newPos = node.getBlockPos(); - if (!generalNodeList.contains(newPos)) - { + if (!generalNodeList.contains(newPos)) { generalNodeList.add(newPos); } - if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) - { + if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) { inputNodeList.add(newPos); } - if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) - { + if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) { outputNodeList.add(newPos); } } @Override - public void addConnections(BlockPos pos, List connectionList) - { - for (BlockPos testPos : connectionList) - { + 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)) - { + public void addConnection(BlockPos pos1, BlockPos pos2) { + if (connectionMap.containsKey(pos1) && !connectionMap.get(pos1).contains(pos2)) { connectionMap.get(pos1).add(pos2); - } else - { + } else { List list = new LinkedList(); list.add(pos2); connectionMap.put(pos1, list); } - if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) - { + if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) { connectionMap.get(pos2).add(pos1); - } else - { + } else { List list = new LinkedList(); list.add(pos1); connectionMap.put(pos2, list); @@ -414,84 +330,69 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void removeConnection(BlockPos pos1, BlockPos pos2) - { - if (connectionMap.containsKey(pos1)) - { + public void removeConnection(BlockPos pos1, BlockPos pos2) { + if (connectionMap.containsKey(pos1)) { List posList = connectionMap.get(pos1); posList.remove(pos2); - if (posList.isEmpty()) - { + if (posList.isEmpty()) { connectionMap.remove(pos1); } } - if (connectionMap.containsKey(pos2)) - { + if (connectionMap.containsKey(pos2)) { List posList = connectionMap.get(pos2); posList.remove(pos1); - if (posList.isEmpty()) - { + if (posList.isEmpty()) { connectionMap.remove(pos2); } } } @Override - public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) - { + public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) { return; } @Override - public BlockPos getBlockPos() - { + public BlockPos getBlockPos() { return this.getPos(); } @Override - public List getConnected() - { + public List getConnected() { return new LinkedList(); } @Override - public BlockPos getMasterPos() - { + public BlockPos getMasterPos() { return this.getPos(); } @Override - public boolean isMaster(IMasterRoutingNode master) - { + public boolean isMaster(IMasterRoutingNode master) { return false; } @Override - public void addConnection(BlockPos pos1) - { + public void addConnection(BlockPos pos1) { // Empty } @Override - public void removeConnection(BlockPos pos1) - { + public void removeConnection(BlockPos pos1) { generalNodeList.remove(pos1); inputNodeList.remove(pos1); outputNodeList.remove(pos1); } @Override - public void removeAllConnections() - { + public void removeAllConnections() { List list = generalNodeList.subList(0, generalNodeList.size()); Iterator itr = list.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { BlockPos testPos = itr.next(); TileEntity tile = getWorld().getTileEntity(testPos); - if (tile instanceof IRoutingNode) - { + if (tile instanceof IRoutingNode) { ((IRoutingNode) tile).removeConnection(pos); getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(testPos), getWorld().getBlockState(testPos), 3); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java index 3a98ed33..9c57f30c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java @@ -1,51 +1,39 @@ 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.EnumFacing; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.item.routing.IFluidFilterProvider; -import WayofTime.bloodmagic.item.routing.IItemFilterProvider; -import WayofTime.bloodmagic.routing.DefaultItemFilter; -import WayofTime.bloodmagic.routing.IFluidFilter; -import WayofTime.bloodmagic.routing.IItemFilter; -import WayofTime.bloodmagic.routing.IOutputFluidRoutingNode; -import WayofTime.bloodmagic.routing.IOutputItemRoutingNode; -import WayofTime.bloodmagic.util.Utils; -public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode, IOutputFluidRoutingNode -{ - public TileOutputRoutingNode() - { +public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode, IOutputFluidRoutingNode { + public TileOutputRoutingNode() { super(6, "outputNode"); } @Override - public boolean isOutput(EnumFacing side) - { + public boolean isOutput(EnumFacing side) { return true; } @Override - public IItemFilter getOutputFilterForSide(EnumFacing side) - { + public IItemFilter getOutputFilterForSide(EnumFacing side) { TileEntity tile = getWorld().getTileEntity(pos.offset(side)); - if (tile != null) - { + if (tile != null) { IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); - if (handler != null) - { + if (handler != null) { ItemStack filterStack = this.getFilterStack(side); - if (filterStack.isEmpty()) - { + if (filterStack.isEmpty()) { IItemFilter filter = new DefaultItemFilter(); filter.initializeFilter(null, tile, handler, true); return filter; - } else if (!(filterStack.getItem() instanceof IItemFilterProvider)) - { + } else if (!(filterStack.getItem() instanceof IItemFilterProvider)) { return null; } @@ -58,21 +46,17 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO } @Override - public boolean isFluidOutput(EnumFacing side) - { + public boolean isFluidOutput(EnumFacing side) { return true; } @Override - public IFluidFilter getOutputFluidFilterForSide(EnumFacing side) - { + public IFluidFilter getOutputFluidFilterForSide(EnumFacing side) { TileEntity tile = getWorld().getTileEntity(pos.offset(side)); - if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, 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)) - { + if (filterStack == null || !(filterStack.getItem() instanceof IFluidFilterProvider)) { return null; } @@ -83,8 +67,7 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO } @Override - public boolean isTankConnectedToSide(EnumFacing side) - { + public boolean isTankConnectedToSide(EnumFacing 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 index ac00e276..a8b7aa2c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -1,8 +1,10 @@ package WayofTime.bloodmagic.tile.routing; -import java.util.LinkedList; -import java.util.List; - +import WayofTime.bloodmagic.api.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.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; @@ -12,37 +14,29 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.routing.IItemRoutingNode; -import WayofTime.bloodmagic.routing.IMasterRoutingNode; -import WayofTime.bloodmagic.routing.IRoutingNode; -import WayofTime.bloodmagic.tile.TileInventory; -public class TileRoutingNode extends TileInventory implements IRoutingNode, IItemRoutingNode, ITickable -{ +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) - { + public TileRoutingNode(int size, String name) { super(size, name); } @Override - public void update() - { - if (!getWorld().isRemote) - { + public void update() { + if (!getWorld().isRemote) { currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); // currentInput = getWorld().getStrongPower(pos); } } - private BlockPos masterPos = BlockPos.ORIGIN; - private List connectionList = new LinkedList(); - @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); NBTTagCompound masterTag = new NBTTagCompound(); masterTag.setInteger(Constants.NBT.X_COORD, masterPos.getX()); @@ -51,8 +45,7 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte tag.setTag(Constants.NBT.ROUTING_MASTER, masterTag); NBTTagList tags = new NBTTagList(); - for (BlockPos pos : connectionList) - { + for (BlockPos pos : connectionList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -64,16 +57,14 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); connectionList.clear(); NBTTagCompound masterTag = tag.getCompoundTag(Constants.NBT.ROUTING_MASTER); masterPos = new BlockPos(masterTag.getInteger(Constants.NBT.X_COORD), masterTag.getInteger(Constants.NBT.Y_COORD), masterTag.getInteger(Constants.NBT.Z_COORD)); NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_CONNECTION, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); connectionList.add(newPos); @@ -81,18 +72,14 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte } @Override - public void removeAllConnections() - { + public void removeAllConnections() { TileEntity testTile = getWorld().getTileEntity(getMasterPos()); - if (testTile instanceof IMasterRoutingNode) - { + if (testTile instanceof IMasterRoutingNode) { ((IMasterRoutingNode) testTile).removeConnection(pos); // Remove this node from the master } - for (BlockPos testPos : connectionList) - { + for (BlockPos testPos : connectionList) { TileEntity tile = getWorld().getTileEntity(testPos); - if (tile instanceof IRoutingNode) - { + if (tile instanceof IRoutingNode) { ((IRoutingNode) tile).removeConnection(pos); getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(testPos), getWorld().getBlockState(testPos), 3); } @@ -102,20 +89,16 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte } @Override - public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) - { + 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)) - { + for (BlockPos testPos : connectedList) { + if (alreadyChecked.contains(testPos)) { continue; } alreadyChecked.add(testPos); TileEntity tile = world.getTileEntity(testPos); - if (!(tile instanceof IRoutingNode)) - { + if (!(tile instanceof IRoutingNode)) { continue; } IRoutingNode node = (IRoutingNode) tile; @@ -130,77 +113,64 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte } @Override - public BlockPos getBlockPos() - { + public BlockPos getBlockPos() { return this.getPos(); } @Override - public List getConnected() - { + public List getConnected() { return connectionList; } @Override - public BlockPos getMasterPos() - { + public BlockPos getMasterPos() { return masterPos; } @Override - public boolean isMaster(IMasterRoutingNode master) - { + public boolean isMaster(IMasterRoutingNode master) { BlockPos checkPos = master.getBlockPos(); return checkPos.equals(getMasterPos()); } @Override - public boolean isConnectionEnabled(BlockPos testPos) - { + public boolean isConnectionEnabled(BlockPos testPos) { return currentInput <= 0; } @Override - public void addConnection(BlockPos pos1) - { - if (!connectionList.contains(pos1)) - { + 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)) - { + 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)) - { + if (pos1.equals(masterPos)) { this.masterPos = BlockPos.ORIGIN; } } @Override - public boolean isInventoryConnectedToSide(EnumFacing side) - { + public boolean isInventoryConnectedToSide(EnumFacing side) { return false; } @Override - public int getPriority(EnumFacing side) - { + public int getPriority(EnumFacing side) { return 0; } @Override @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() - { + public double getMaxRenderDistanceSquared() { return 10000; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java index ba5ff465..5ff4bd36 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java @@ -15,20 +15,16 @@ 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 ChatUtil -{ +public class ChatUtil { private static final int DELETION_ID = 2525277; private static int lastAdded; - private static void sendNoSpamMessages(ITextComponent[] messages) - { + private static void sendNoSpamMessages(ITextComponent[] messages) { GuiNewChat chat = Minecraft.getMinecraft().ingameGUI.getChatGUI(); - for (int i = DELETION_ID + messages.length - 1; i <= lastAdded; i++) - { + for (int i = DELETION_ID + messages.length - 1; i <= lastAdded; i++) { chat.deleteChatLine(i); } - for (int i = 0; i < messages.length; i++) - { + for (int i = 0; i < messages.length; i++) { chat.printChatMessageWithOptionalDeletion(messages[i], DELETION_ID + i); } lastAdded = DELETION_ID + messages.length - 1; @@ -37,25 +33,20 @@ public class ChatUtil /** * Returns a standard {@link TextComponentString} for the given * {@link String} . - * - * @param s - * The string to wrap. - * + * + * @param s The string to wrap. * @return An {@link ITextComponent} containing the string. */ - public static ITextComponent wrap(String s) - { + public static ITextComponent wrap(String s) { return new TextComponentString(s); } /** * @see #wrap(String) */ - public static ITextComponent[] wrap(String... s) - { + public static ITextComponent[] wrap(String... s) { ITextComponent[] ret = new ITextComponent[s.length]; - for (int i = 0; i < ret.length; i++) - { + for (int i = 0; i < ret.length; i++) { ret[i] = wrap(s[i]); } return ret; @@ -64,97 +55,80 @@ public class ChatUtil /** * 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 + * + * @param s The string to format + * @param args The args to apply to the format */ - public static ITextComponent wrapFormatted(String s, Object... args) - { + public static ITextComponent wrapFormatted(String s, Object... args) { return new TextComponentTranslation(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 + * + * @param player The player to send the chat to + * @param lines The lines to send */ - public static void sendChat(EntityPlayer player, String... lines) - { + public static void sendChat(EntityPlayer player, String... lines) { sendChat(player, wrap(lines)); } /** * Localizes the lines before sending them. - * + * * @see #sendChat(EntityPlayer, String...) */ - public static void sendChatUnloc(EntityPlayer player, String... unlocLines) - { + public static void sendChatUnloc(EntityPlayer 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 + * + * @param player The player to send the chat lines to. + * @param lines The {@link ITextComponent chat components} to send.yes */ - public static void sendChat(EntityPlayer player, ITextComponent... lines) - { - for (ITextComponent c : lines) - { + public static void sendChat(EntityPlayer player, ITextComponent... lines) { + for (ITextComponent c : lines) { player.sendMessage(c); } } /** * Localizes the strings before sending them. - * + * * @see #sendNoSpamClient(String...) */ - public static void sendNoSpamClientUnloc(String... unlocLines) - { + 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 - * + * + * @param lines The chat lines to send * @see #wrap(String) */ - public static void sendNoSpamClient(String... lines) - { + public static void sendNoSpamClient(String... lines) { sendNoSpamClient(wrap(lines)); } /** * Skips the packet sending, unsafe to call on servers. - * + * * @see #sendNoSpam(EntityPlayerMP, ITextComponent...) */ - public static void sendNoSpamClient(ITextComponent... lines) - { + public static void sendNoSpamClient(ITextComponent... lines) { sendNoSpamMessages(lines); } /** * Localizes the strings before sending them. - * + * * @see #sendNoSpam(EntityPlayer, String...) */ - public static void sendNoSpamUnloc(EntityPlayer player, String... unlocLines) - { + public static void sendNoSpamUnloc(EntityPlayer player, String... unlocLines) { sendNoSpam(player, TextHelper.localizeAll(unlocLines)); } @@ -162,32 +136,28 @@ public class ChatUtil * @see #wrap(String) * @see #sendNoSpam(EntityPlayer, ITextComponent...) */ - public static void sendNoSpam(EntityPlayer player, String... lines) - { + public static void sendNoSpam(EntityPlayer player, String... lines) { sendNoSpam(player, wrap(lines)); } /** * First checks if the player is instanceof {@link EntityPlayerMP} before * casting. - * + * * @see #sendNoSpam(EntityPlayerMP, ITextComponent...) */ - public static void sendNoSpam(EntityPlayer player, ITextComponent... lines) - { - if (player instanceof EntityPlayerMP) - { + public static void sendNoSpam(EntityPlayer player, ITextComponent... lines) { + if (player instanceof EntityPlayerMP) { sendNoSpam((EntityPlayerMP) player, lines); } } /** * Localizes the strings before sending them. - * + * * @see #sendNoSpam(EntityPlayerMP, String...) */ - public static void sendNoSpamUnloc(EntityPlayerMP player, String... unlocLines) - { + public static void sendNoSpamUnloc(EntityPlayerMP player, String... unlocLines) { sendNoSpam(player, TextHelper.localizeAll(unlocLines)); } @@ -195,73 +165,60 @@ public class ChatUtil * @see #wrap(String) * @see #sendNoSpam(EntityPlayerMP, ITextComponent...) */ - public static void sendNoSpam(EntityPlayerMP player, String... lines) - { + public static void sendNoSpam(EntityPlayerMP 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. + * + * @param player The player to send the chat message to + * @param lines The chat lines to send. */ - public static void sendNoSpam(EntityPlayerMP player, ITextComponent... lines) - { + public static void sendNoSpam(EntityPlayerMP player, ITextComponent... lines) { if (lines.length > 0) BloodMagicPacketHandler.INSTANCE.sendTo(new PacketNoSpamChat(lines), player); } /** * @author tterrag1098 - * + *

        * Ripped from EnderCore (and slightly altered) */ - public static class PacketNoSpamChat implements IMessage - { + public static class PacketNoSpamChat implements IMessage { private ITextComponent[] chatLines; - public PacketNoSpamChat() - { + public PacketNoSpamChat() { chatLines = new ITextComponent[0]; } - private PacketNoSpamChat(ITextComponent... lines) - { + private PacketNoSpamChat(ITextComponent... lines) { // this is guaranteed to be >1 length by accessing methods this.chatLines = lines; } @Override - public void toBytes(ByteBuf buf) - { + public void toBytes(ByteBuf buf) { buf.writeInt(chatLines.length); - for (ITextComponent c : chatLines) - { + for (ITextComponent c : chatLines) { ByteBufUtils.writeUTF8String(buf, ITextComponent.Serializer.componentToJson(c)); } } @Override - public void fromBytes(ByteBuf buf) - { + public void fromBytes(ByteBuf buf) { chatLines = new ITextComponent[buf.readInt()]; - for (int i = 0; i < chatLines.length; i++) - { + for (int i = 0; i < chatLines.length; i++) { chatLines[i] = ITextComponent.Serializer.jsonToComponent(ByteBufUtils.readUTF8String(buf)); } } - public static class Handler implements IMessageHandler - { + public static class Handler implements IMessageHandler { @Override - public IMessage onMessage(final PacketNoSpamChat message, MessageContext ctx) - { + public IMessage onMessage(final PacketNoSpamChat message, MessageContext ctx) { Minecraft.getMinecraft().addScheduledTask(new Runnable() { @Override public void run() { diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java index f70598e6..36b29da4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java @@ -5,28 +5,23 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -public class GhostItemHelper -{ - public static void setItemGhostAmount(ItemStack stack, int amount) - { +public class GhostItemHelper { + public static void setItemGhostAmount(ItemStack stack, int amount) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); tag.setInteger(Constants.NBT.GHOST_STACK_SIZE, amount); } - public static int getItemGhostAmount(ItemStack stack) - { + public static int getItemGhostAmount(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getInteger(Constants.NBT.GHOST_STACK_SIZE); } - public static boolean hasGhostAmount(ItemStack stack) - { - if (!stack.hasTagCompound()) - { + public static boolean hasGhostAmount(ItemStack stack) { + if (!stack.hasTagCompound()) { return false; } @@ -34,29 +29,25 @@ public class GhostItemHelper return tag.hasKey(Constants.NBT.GHOST_STACK_SIZE); } - public static void incrementGhostAmout(ItemStack stack, int value) - { + 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) - { + public static void decrementGhostAmount(ItemStack stack, int value) { int amount = getItemGhostAmount(stack); amount -= value; setItemGhostAmount(stack, amount); } - public static ItemStack getStackFromGhost(ItemStack ghostStack) - { + public static ItemStack getStackFromGhost(ItemStack ghostStack) { ItemStack newStack = ghostStack.copy(); NBTHelper.checkNBT(newStack); NBTTagCompound tag = newStack.getTagCompound(); int amount = getItemGhostAmount(ghostStack); tag.removeTag(Constants.NBT.GHOST_STACK_SIZE); - if (tag.hasNoTags()) - { + if (tag.hasNoTags()) { newStack.setTagCompound(null); } newStack.setCount(amount); diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 9c4dbd68..b30a0ab0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,13 +1,16 @@ package WayofTime.bloodmagic.util; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Set; -import java.util.UUID; - -import javax.annotation.Nullable; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.altar.EnumAltarComponent; +import WayofTime.bloodmagic.api.iface.IDemonWillViewer; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.network.BloodMagicPacketHandler; +import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; +import WayofTime.bloodmagic.tile.TileInventory; +import com.google.common.collect.Iterables; import net.minecraft.block.Block; import net.minecraft.block.BlockLiquid; import net.minecraft.block.BlockPortal; @@ -50,33 +53,20 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; import net.minecraftforge.items.wrapper.SidedInvWrapper; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.api.iface.IDemonWillViewer; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.tile.TileInventory; -import com.google.common.collect.Iterables; +import javax.annotation.Nullable; +import java.util.*; -public class Utils -{ - public static float addAbsorptionToMaximum(EntityLivingBase entity, float added, int maximum, int duration) - { +public class Utils { + public static float addAbsorptionToMaximum(EntityLivingBase entity, float added, int maximum, int duration) { float currentAmount = entity.getAbsorptionAmount(); added = Math.min(maximum - currentAmount, added); - if (added <= 0) - { + if (added <= 0) { return 0; } - if (duration > 0) - { + if (duration > 0) { int potionLevel = (int) ((currentAmount + added) / 4); entity.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, duration, potionLevel, true, false)); } @@ -86,27 +76,22 @@ public class Utils return added; } - public static boolean isImmuneToFireDamage(EntityLivingBase entity) - { + public static boolean isImmuneToFireDamage(EntityLivingBase entity) { return entity.isImmuneToFire() || entity.isPotionActive(MobEffects.FIRE_RESISTANCE); } - public static boolean isPlayerBesideSolidBlockFace(EntityPlayer player) - { + public static boolean isPlayerBesideSolidBlockFace(EntityPlayer player) { World world = player.getEntityWorld(); double minimumDistanceFromAxis = 0.7; BlockPos centralPos = player.getPosition(); - for (EnumFacing facing : EnumFacing.HORIZONTALS) - { + for (EnumFacing facing : EnumFacing.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) - { + if (distance > minimumDistanceFromAxis) { continue; } IBlockState state = world.getBlockState(offsetPos); - if (state.isSideSolid(world, offsetPos, facing.getOpposite())) - { + if (state.isSideSolid(world, offsetPos, facing.getOpposite())) { return true; } } @@ -114,20 +99,16 @@ public class Utils return false; } - public static boolean canPlayerSeeDemonWill(EntityPlayer player) - { + public static boolean canPlayerSeeDemonWill(EntityPlayer player) { IItemHandler inventory = new PlayerMainInvWrapper(player.inventory); - for (int i = 0; i < inventory.getSlots(); i++) - { + for (int i = 0; i < inventory.getSlots(); i++) { ItemStack stack = inventory.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } - if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.getEntityWorld(), stack, player)) - { + if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.getEntityWorld(), stack, player)) { return true; } } @@ -135,71 +116,56 @@ public class Utils return false; } - public static boolean canEntitySeeBlock(World world, Entity entity, BlockPos pos) - { + 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); EnumFacing dir = EnumFacing.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.getFrontOffsetX() * 0.4, pos.getY() + 0.5 + dir.getFrontOffsetY() * 0.4, pos.getZ() + 0.5 + dir.getFrontOffsetZ() * 0.4), false, true, true); return result == null || pos.equals(result.getBlockPos()); } - public static int plantSeedsInArea(World world, AxisAlignedBB aabb, int horizontalRadius, int verticalRadius) - { + public static int plantSeedsInArea(World world, AxisAlignedBB aabb, int horizontalRadius, int verticalRadius) { int placedBlocks = 0; List itemEntities = world.getEntitiesWithinAABB(EntityItem.class, aabb); - for (EntityItem itemEntity : itemEntities) - { + for (EntityItem 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()) - { + 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)) - { + 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)) - { + 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)) - { + if (world.isAirBlock(newPos)) { BlockPos offsetPos = newPos.offset(EnumFacing.DOWN); IBlockState state = world.getBlockState(offsetPos); - if (state.getBlock().canSustainPlant(state, world, offsetPos, EnumFacing.UP, (IPlantable) item)) - { + if (state.getBlock().canSustainPlant(state, world, offsetPos, EnumFacing.UP, (IPlantable) item)) { IBlockState 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) - { + if (stack.isEmpty() || stack.getCount() <= 0) { return planted; } } @@ -213,10 +179,8 @@ public class Utils return planted; } - public static int plantEntityItem(EntityItem itemEntity, int horizontalRadius, int verticalRadius) - { - if (itemEntity == null || itemEntity.isDead) - { + public static int plantEntityItem(EntityItem itemEntity, int horizontalRadius, int verticalRadius) { + if (itemEntity == null || itemEntity.isDead) { return 0; } @@ -226,28 +190,23 @@ public class Utils int planted = plantItemStack(world, pos, stack, horizontalRadius, verticalRadius); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { itemEntity.setDead(); } return planted; } - public static int getDemonWillResolution(EntityPlayer player) - { + public static int getDemonWillResolution(EntityPlayer player) { IItemHandler inventory = new PlayerMainInvWrapper(player.inventory); - for (int i = 0; i < inventory.getSlots(); i++) - { + for (int i = 0; i < inventory.getSlots(); i++) { ItemStack stack = inventory.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } - if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.getEntityWorld(), stack, player)) - { + if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.getEntityWorld(), stack, player)) { return ((IDemonWillViewer) stack.getItem()).getDemonWillAuraResolution(player.getEntityWorld(), stack, player); } } @@ -255,8 +214,7 @@ public class Utils return 1; } - public static NBTTagCompound getPersistentDataTag(EntityPlayer player) - { + public static NBTTagCompound getPersistentDataTag(EntityPlayer player) { NBTTagCompound forgeData = player.getEntityData().getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG); NBTTagCompound beaconData = forgeData.getCompoundTag("BloodMagic"); @@ -269,51 +227,40 @@ public class Utils return beaconData; } - public static void setPlayerSpeedFromServer(EntityPlayer player, double motionX, double motionY, double motionZ) - { - if (!player.getEntityWorld().isRemote && player instanceof EntityPlayerMP) - { + public static void setPlayerSpeedFromServer(EntityPlayer player, double motionX, double motionY, double motionZ) { + if (!player.getEntityWorld().isRemote && player instanceof EntityPlayerMP) { BloodMagicPacketHandler.sendTo(new PlayerVelocityPacketProcessor(motionX, motionY, motionZ), (EntityPlayerMP) player); } } - public static boolean isInteger(String integer) - { - try - { + public static boolean isInteger(String integer) { + try { Integer.parseInt(integer); - } catch (NumberFormatException e) - { + } catch (NumberFormatException e) { return false; - } catch (NullPointerException e) - { + } catch (NullPointerException e) { return false; } // only got here if we didn't return false return true; } - public static String toFancyCasing(String input) - { + public static String toFancyCasing(String input) { return String.valueOf(input.charAt(0)).toUpperCase(Locale.ENGLISH) + input.substring(1); } - public static String prettifyBlockPosString(BlockPos pos) - { + 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. + * @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 + * otherwise * @see #insertItemToTile(TileInventory, EntityPlayer, int) */ - public static boolean insertItemToTile(TileInventory tile, EntityPlayer player) - { + public static boolean insertItemToTile(TileInventory tile, EntityPlayer player) { return insertItemToTile(tile, player, 0); } @@ -322,29 +269,22 @@ public class Utils * 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 + * + * @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 + * otherwise */ - public static boolean insertItemToTile(TileInventory tile, EntityPlayer player, int slot) - { - if (tile.getStackInSlot(slot).isEmpty() && !player.getHeldItemMainhand().isEmpty()) - { + public static boolean insertItemToTile(TileInventory tile, EntityPlayer player, int slot) { + if (tile.getStackInSlot(slot).isEmpty() && !player.getHeldItemMainhand().isEmpty()) { ItemStack input = player.getHeldItemMainhand().copy(); input.setCount(1); player.getHeldItemMainhand().shrink(1); tile.setInventorySlotContents(slot, input); return true; - } else if (!tile.getStackInSlot(slot).isEmpty() && player.getHeldItemMainhand().isEmpty()) - { - if (!tile.getWorld().isRemote) - { + } else if (!tile.getStackInSlot(slot).isEmpty() && player.getHeldItemMainhand().isEmpty()) { + if (!tile.getWorld().isRemote) { EntityItem invItem = new EntityItem(tile.getWorld(), player.posX, player.posY + 0.25, player.posZ, tile.getStackInSlot(slot)); tile.getWorld().spawnEntity(invItem); } @@ -355,8 +295,7 @@ public class Utils return false; } - public static double calculateStandardProgress(Number currentValue, int[] requiredValues, int currentLevel) - { + public static double calculateStandardProgress(Number currentValue, int[] requiredValues, int currentLevel) { int nextLevel = currentLevel + 1; if (nextLevel >= requiredValues.length) return 1.0D; @@ -366,8 +305,7 @@ public class Utils } @Nullable - public static IItemHandler getInventory(TileEntity tile, @Nullable EnumFacing facing) - { + public static IItemHandler getInventory(TileEntity tile, @Nullable EnumFacing facing) { if (facing == null) facing = EnumFacing.DOWN; @@ -383,8 +321,7 @@ public class Utils return itemHandler; } - public static ItemStack setUnbreakable(ItemStack stack) - { + public static ItemStack setUnbreakable(ItemStack stack) { NBTHelper.checkNBT(stack); stack.getTagCompound().setBoolean("Unbreakable", true); return stack; @@ -392,36 +329,31 @@ public class Utils /** * Gets a default block for each type of {@link EnumAltarComponent} - * - * @param component - * - The Component to provide a block for. + * + * @param component - The Component to provide a block for. * @return The default Block for the EnumAltarComponent */ - public static Block getBlockForComponent(EnumAltarComponent 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 Block getBlockForComponent(EnumAltarComponent 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(EntityLivingBase attackedEntity, DamageSource source, float amount) - { - if (!attackedEntity.isEntityInvulnerable(source)) - { + public static float getModifiedDamage(EntityLivingBase attackedEntity, DamageSource source, float amount) { + if (!attackedEntity.isEntityInvulnerable(source)) { if (amount <= 0) return 0; @@ -436,42 +368,33 @@ public class Utils return 0; } - public static float applyArmor(EntityLivingBase entity, ItemStack[] inventory, DamageSource source, double damage) - { + public static float applyArmor(EntityLivingBase entity, ItemStack[] inventory, DamageSource source, double damage) { damage *= 25; ArrayList dmgVals = new ArrayList(); - for (int x = 0; x < inventory.length; x++) - { + for (int x = 0; x < inventory.length; x++) { ItemStack stack = inventory[x]; - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } ArmorProperties prop = null; - if (stack.getItem() instanceof ISpecialArmor) - { + 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 ItemArmor && !source.isUnblockable()) - { + } else if (stack.getItem() instanceof ItemArmor && !source.isUnblockable()) { ItemArmor armor = (ItemArmor) stack.getItem(); prop = new ArmorProperties(0, armor.damageReduceAmount / 25D, Integer.MAX_VALUE); } - if (prop != null) - { + if (prop != null) { prop.Slot = x; dmgVals.add(prop); } } - if (dmgVals.size() > 0) - { + 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) - { + for (ArmorProperties prop : props) { + if (level != prop.Priority) { damage -= (damage * ratio); ratio = 0; level = prop.Priority; @@ -485,37 +408,29 @@ public class Utils return (float) (damage / 25.0F); } - public static float applyPotionDamageCalculations(EntityLivingBase attackedEntity, DamageSource source, float damage) - { + public static float applyPotionDamageCalculations(EntityLivingBase attackedEntity, DamageSource source, float damage) { Potion resistance = MobEffects.RESISTANCE; - if (source.isDamageAbsolute()) - { + if (source.isDamageAbsolute()) { return damage; - } else - { - if (attackedEntity.isPotionActive(resistance) && source != DamageSource.OUT_OF_WORLD) - { + } 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) - { + if (damage <= 0.0F) { return 0.0F; - } else - { + } else { int k = EnchantmentHelper.getEnchantmentModifierDamage(attackedEntity.getArmorInventoryList(), source); - if (k > 20) - { + if (k > 20) { k = 20; } - if (k > 0 && k <= 20) - { + if (k > 0 && k <= 20) { int l = 25 - k; float f1 = damage * (float) l; damage = f1 / 25.0F; @@ -529,42 +444,32 @@ public class Utils /** * 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 + * + * @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) - { + 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 + * @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) - { + public static ItemStack[] combineStacks(ItemStack stack1, ItemStack stack2, int transferMax) { ItemStack[] returned = new ItemStack[2]; - if (ItemHandlerHelper.canItemStacksStack(stack1, stack2)) - { + 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) - { + if (transferedAmount > 0) { ItemStack copyStack = stack1.splitStack(transferedAmount); - if (stack2.isEmpty()) - { + if (stack2.isEmpty()) { stack2 = copyStack; - } else - { + } else { stack2.grow(transferedAmount); } } @@ -577,27 +482,20 @@ public class Utils } /** - * @param stack1 - * Stack that is placed into a slot - * @param stack2 - * Slot content that stack1 is placed into + * @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) - { + public static ItemStack[] combineStacks(ItemStack stack1, ItemStack stack2) { ItemStack[] returned = new ItemStack[2]; - if (ItemHandlerHelper.canItemStacksStack(stack1, stack2)) - { + if (ItemHandlerHelper.canItemStacksStack(stack1, stack2)) { int transferedAmount = stack2.isEmpty() ? stack1.getCount() : Math.min(stack2.getMaxStackSize() - stack2.getCount(), stack1.getCount()); - if (transferedAmount > 0) - { + if (transferedAmount > 0) { ItemStack copyStack = stack1.splitStack(transferedAmount); - if (stack2.isEmpty()) - { + if (stack2.isEmpty()) { stack2 = copyStack; - } else - { + } else { stack2.grow(transferedAmount); } } @@ -609,42 +507,32 @@ public class Utils return returned; } - public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, EnumFacing dir) - { - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) - { + public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, EnumFacing 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) - { + } else if (tile instanceof IInventory) { return insertStackIntoInventory(stack, (IInventory) tile, dir); } return stack; } - public static int getNumberOfFreeSlots(TileEntity tile, EnumFacing dir) - { + public static int getNumberOfFreeSlots(TileEntity tile, EnumFacing dir) { int slots = 0; - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) - { + 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()) - { + 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()) - { + } else if (tile instanceof IInventory) { + for (int i = 0; i < ((IInventory) tile).getSizeInventory(); i++) { + if (((IInventory) tile).getStackInSlot(i).isEmpty()) { slots++; } } @@ -653,17 +541,14 @@ public class Utils return slots; } - public static ItemStack insertStackIntoTile(ItemStack stack, IItemHandler handler) - { + public static ItemStack insertStackIntoTile(ItemStack stack, IItemHandler handler) { int numberOfSlots = handler.getSlots(); ItemStack copyStack = stack.copy(); - for (int slot = 0; slot < numberOfSlots; slot++) - { + for (int slot = 0; slot < numberOfSlots; slot++) { copyStack = handler.insertItem(slot, copyStack, false); - if (copyStack.isEmpty()) - { + if (copyStack.isEmpty()) { return ItemStack.EMPTY; } } @@ -674,17 +559,15 @@ public class Utils /** * 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, EnumFacing dir, int limit) - { - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) - { + public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, EnumFacing dir, int limit) { + if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) { IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); int numberOfSlots = handler.getSlots(); @@ -692,39 +575,33 @@ public class Utils int numberMatching = 0; - for (int slot = 0; slot < numberOfSlots; slot++) - { + for (int slot = 0; slot < numberOfSlots; slot++) { ItemStack invStack = handler.getStackInSlot(slot); - if (!invStack.isEmpty() && ItemHandlerHelper.canItemStacksStack(stack, invStack)) - { + if (!invStack.isEmpty() && ItemHandlerHelper.canItemStacksStack(stack, invStack)) { numberMatching += invStack.getCount(); } } - if (numberMatching >= limit) - { + if (numberMatching >= limit) { return stack; } int newLimit = limit - numberMatching; - for (int slot = 0; slot < numberOfSlots; slot++) - { + 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()) - { + if (newCopyStack.isEmpty()) { return ItemStack.EMPTY; } newLimit -= (copyStack.getCount() - newCopyStack.getCount()); - if (newLimit <= 0) - { + if (newLimit <= 0) { return ItemStack.EMPTY; //TODO } @@ -732,42 +609,33 @@ public class Utils } return copyStack; - } else if (tile instanceof IInventory) - { + } else if (tile instanceof IInventory) { return insertStackIntoInventory(stack, (IInventory) tile, dir, limit); } return stack; } - public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir) - { - if (stack.isEmpty()) - { + public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir) { + if (stack.isEmpty()) { return ItemStack.EMPTY; } boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; - if (inventory instanceof ISidedInventory) - { + if (inventory instanceof ISidedInventory) { int[] array = ((ISidedInventory) inventory).getSlotsForFace(dir); - for (int in : array) - { + 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++) - { + } 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]) - { + for (int i = 0; i < inventory.getSizeInventory(); i++) { + if (!canBeInserted[i]) { continue; } @@ -775,8 +643,7 @@ public class Utils stack = combinedStacks[0]; inventory.setInventorySlotContents(i, combinedStacks[1]); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { return ItemStack.EMPTY; } } @@ -784,15 +651,12 @@ public class Utils return stack; } - public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir) - { + public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir) { return canInsertStackFullyIntoInventory(stack, inventory, dir, false, 0); } - public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir, boolean fillToLimit, int limit) - { - if (stack.isEmpty()) - { + public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir, boolean fillToLimit, int limit) { + if (stack.isEmpty()) { return true; } @@ -800,68 +664,53 @@ public class Utils boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; - if (inventory instanceof ISidedInventory) - { + if (inventory instanceof ISidedInventory) { int[] array = ((ISidedInventory) inventory).getSlotsForFace(dir); - for (int in : array) - { + 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++) - { + } 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]) - { + 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)) - { + if (!invStack.isEmpty() && ItemHandlerHelper.canItemStacksStack(stack, invStack)) { numberMatching += invStack.getCount(); } } } - if (fillToLimit && limit < stack.getCount() + numberMatching) - { + if (fillToLimit && limit < stack.getCount() + numberMatching) { return false; } - for (int i = 0; i < inventory.getSizeInventory(); i++) - { - if (!canBeInserted[i]) - { + 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()) - { + if (canCombine) { + if (invStack.isEmpty()) { itemsLeft = 0; - } else - { + } else { itemsLeft -= (invStack.getMaxStackSize() - invStack.getCount()); } } - if (itemsLeft <= 0) - { + if (itemsLeft <= 0) { return true; } } @@ -872,65 +721,53 @@ public class Utils /** * 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, EnumFacing dir, int limit) - { - if (stack.isEmpty()) - { + public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir, int limit) { + if (stack.isEmpty()) { return ItemStack.EMPTY; } boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; - if (inventory instanceof ISidedInventory) - { + if (inventory instanceof ISidedInventory) { int[] array = ((ISidedInventory) inventory).getSlotsForFace(dir); - for (int in : array) - { + for (int in : array) { canBeInserted[in] = ((ISidedInventory) inventory).canInsertItem(in, stack, dir); } - } else - { - for (int i = 0; i < canBeInserted.length; i++) - { + } 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]) - { + for (int i = 0; i < inventory.getSizeInventory(); i++) { + if (!canBeInserted[i]) { continue; } ItemStack invStack = inventory.getStackInSlot(i); - if (!invStack.isEmpty() && canCombine(stack, invStack)) - { + if (!invStack.isEmpty() && canCombine(stack, invStack)) { numberMatching += invStack.getCount(); } } - if (numberMatching >= limit) - { + if (numberMatching >= limit) { return stack; } int newLimit = limit - numberMatching; - for (int i = 0; i < inventory.getSizeInventory(); i++) - { - if (!canBeInserted[i]) - { + for (int i = 0; i < inventory.getSizeInventory(); i++) { + if (!canBeInserted[i]) { continue; } @@ -942,8 +779,7 @@ public class Utils newLimit -= (prevStackSize - stack.getCount()); - if (newLimit <= 0 || stack.isEmpty()) - { + if (newLimit <= 0 || stack.isEmpty()) { return stack; } } @@ -951,64 +787,53 @@ public class Utils return stack; } - public static boolean isBlockLiquid(IBlockState state) - { + public static boolean isBlockLiquid(IBlockState state) { return (state instanceof IFluidBlock || state.getMaterial().isLiquid()); } - public static boolean isFlowingLiquid(World world, BlockPos pos, IBlockState state) - { + public static boolean isFlowingLiquid(World world, BlockPos pos, IBlockState state) { Block block = state.getBlock(); return ((block instanceof IFluidBlock && Math.abs(((IFluidBlock) block).getFilledPercentage(world, pos)) == 1) || (block instanceof BlockLiquid && block.getMetaFromState(state) != 0)); } - public static boolean spawnStackAtBlock(World world, BlockPos pos, @Nullable EnumFacing pushDirection, ItemStack stack) - { + public static boolean spawnStackAtBlock(World world, BlockPos pos, @Nullable EnumFacing pushDirection, ItemStack stack) { EntityItem entityItem = new EntityItem(world); BlockPos spawnPos = new BlockPos(pos); double velocity = 0.15D; - if (pushDirection != null) - { + 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; - } + 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; + } } } @@ -1016,13 +841,11 @@ public class Utils return world.spawnEntity(entityItem); } - public static boolean swapLocations(World initialWorld, BlockPos initialPos, World finalWorld, BlockPos finalPos) - { + 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) - { + public static boolean swapLocations(World initialWorld, BlockPos initialPos, World finalWorld, BlockPos finalPos, boolean playSound) { TileEntity initialTile = initialWorld.getTileEntity(initialPos); TileEntity finalTile = finalWorld.getTileEntity(finalPos); NBTTagCompound initialTag = new NBTTagCompound(); @@ -1038,8 +861,7 @@ public class Utils if ((initialStack.getBlock().equals(Blocks.AIR) && finalStack.getBlock().equals(Blocks.AIR)) || initialStack.getBlock() instanceof BlockPortal || finalStack.getBlock() instanceof BlockPortal) return false; - if (playSound) - { + 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); } @@ -1055,8 +877,7 @@ public class Utils IBlockState finalBlockState = finalWorld.getBlockState(finalPos); finalWorld.setBlockState(finalPos, initialBlockState, 3); - if (initialTile != null) - { + if (initialTile != null) { TileEntity newTileInitial = TileEntity.create(finalWorld, initialTag); @@ -1067,8 +888,7 @@ public class Utils initialWorld.setBlockState(initialPos, finalBlockState, 3); - if (finalTile != null) - { + if (finalTile != null) { TileEntity newTileFinal = TileEntity.create(initialWorld, finalTag); initialWorld.setTileEntity(initialPos, newTileFinal); @@ -1083,23 +903,18 @@ public class Utils } //Shamelessly ripped off of CoFH Lib - public static ItemStack consumeItem(ItemStack stack) - { + public static ItemStack consumeItem(ItemStack stack) { Item item = stack.getItem(); boolean largerStack = stack.getCount() > 1; - if (largerStack) - { + if (largerStack) { stack.shrink(1); } - if (item.hasContainerItem(stack)) - { + if (item.hasContainerItem(stack)) { ItemStack ret = item.getContainerItem(stack); - if (ret.isEmpty()) - { + if (ret.isEmpty()) { return ItemStack.EMPTY; } - if (ret.isItemStackDamageable() && ret.getItemDamage() > ret.getMaxDamage()) - { + if (ret.isItemStackDamageable() && ret.getItemDamage() > ret.getMaxDamage()) { ret = ItemStack.EMPTY; } return ret; @@ -1107,44 +922,35 @@ public class Utils return largerStack ? stack : ItemStack.EMPTY; } - public static void registerHandlers(Set eventHandlers) - { - for (ASMDataTable.ASMData data : eventHandlers) - { - try - { + public static void registerHandlers(Set eventHandlers) { + for (ASMDataTable.ASMData data : eventHandlers) { + try { Class handlerClass = Class.forName(data.getClassName()); Object handlerImpl = handlerClass.newInstance(); MinecraftForge.EVENT_BUS.register(handlerImpl); BloodMagic.instance.logger.debug("Registering event handler for class {}", data.getClassName()); - } catch (Exception e) - { + } catch (Exception e) { // No-op } } } - public static boolean hasUUID(ItemStack stack) - { + 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)) - { + 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) - { + 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)) - { + 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()); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java index 15bbf802..251a0a1b 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java @@ -1,21 +1,10 @@ package WayofTime.bloodmagic.util.handler; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.Block; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.event.FMLInterModComms; -import net.minecraftforge.fml.common.registry.ForgeRegistries; -import net.minecraftforge.fml.common.registry.GameRegistry; -public class IMCHandler -{ +public class IMCHandler { - public static void handleIMC(FMLInterModComms.IMCEvent event) - { + public static void handleIMC(FMLInterModComms.IMCEvent event) { // TODO // for (FMLInterModComms.IMCMessage message : event.getMessages()) // { diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 1ef6e22f..c92e1267 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -1,17 +1,29 @@ package WayofTime.bloodmagic.util.handler.event; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.registry.RitualRegistry; +import WayofTime.bloodmagic.api.ritual.Ritual; +import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.client.hud.HUDElement; 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.SetMultimap; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.block.model.*; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.player.EntityPlayer; @@ -24,11 +36,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.client.event.MouseEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.client.event.TextureStitchEvent; +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; @@ -38,36 +46,16 @@ 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 WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.client.hud.HUDElement; -import WayofTime.bloodmagic.client.render.block.RenderFakeBlocks; -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.SetMultimap; +import java.util.*; @Handler @SideOnly(Side.CLIENT) -public class ClientHandler -{ +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 final List hudElements = new ArrayList(); public static TextureAtlasSprite ritualStoneBlank; public static TextureAtlasSprite ritualStoneWater; public static TextureAtlasSprite ritualStoneFire; @@ -75,57 +63,45 @@ public class ClientHandler 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.getMinecraft(); - public static final List hudElements = new ArrayList(); - private static TileMasterRitualStone mrsHoloTile; private static Ritual mrsHoloRitual; private static EnumFacing mrsHoloDirection; private static boolean mrsHoloDisplay; @SubscribeEvent - public void onTooltipEvent(ItemTooltipEvent event) - { + public void onTooltipEvent(ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { return; } - if (GhostItemHelper.hasGhostAmount(stack)) - { + if (GhostItemHelper.hasGhostAmount(stack)) { int amount = GhostItemHelper.getItemGhostAmount(stack); - if (amount == 0) - { + if (amount == 0) { event.getToolTip().add(TextHelper.localize("tooltip.bloodmagic.ghost.everything")); - } else - { + } else { event.getToolTip().add(TextHelper.localize("tooltip.bloodmagic.ghost.amount", amount)); } } } @SubscribeEvent - public void onSoundEvent(PlaySoundEvent event) - { + public void onSoundEvent(PlaySoundEvent event) { EntityPlayer player = Minecraft.getMinecraft().player; - if (player != null && player.isPotionActive(RegistrarBloodMagic.DEAFNESS)) - { + if (player != null && player.isPotionActive(RegistrarBloodMagic.DEAFNESS)) { event.setResultSound(null); } } @SubscribeEvent - public void onTextureStitch(TextureStitchEvent.Pre event) - { + public void onTextureStitch(TextureStitchEvent.Pre event) { final String BLOCKS = "blocks"; ritualStoneBlank = forName(event.getMap(), "RitualStone", BLOCKS); @@ -145,21 +121,17 @@ public class ClientHandler } @SubscribeEvent - public void render(RenderWorldLastEvent event) - { + public void render(RenderWorldLastEvent event) { EntityPlayerSP player = minecraft.player; World world = player.getEntityWorld(); - if (mrsHoloTile != null) - { - if (world.getTileEntity(mrsHoloTile.getPos()) instanceof TileMasterRitualStone) - { + if (mrsHoloTile != null) { + if (world.getTileEntity(mrsHoloTile.getPos()) instanceof TileMasterRitualStone) { if (mrsHoloDisplay) renderRitualStones(mrsHoloTile, event.getPartialTicks()); else ClientHandler.setRitualHoloToNull(); - } else - { + } else { ClientHandler.setRitualHoloToNull(); } } @@ -174,20 +146,16 @@ public class ClientHandler } @SubscribeEvent - public void onMouseEvent(MouseEvent event) - { + public void onMouseEvent(MouseEvent event) { EntityPlayerSP player = Minecraft.getMinecraft().player; - if (event.getDwheel() != 0 && player != null && player.isSneaking()) - { + if (event.getDwheel() != 0 && player != null && player.isSneaking()) { ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty()) - { + if (!stack.isEmpty()) { Item item = stack.getItem(); - if (item instanceof ItemSigilHolding) - { + if (item instanceof ItemSigilHolding) { cycleSigil(stack, player, event.getDwheel()); event.setCanceled(true); } @@ -196,8 +164,7 @@ public class ClientHandler } @SubscribeEvent - public void onKey(InputEvent event) - { + public void onKey(InputEvent event) { if (!minecraft.inGameHasFocus) return; @@ -207,8 +174,7 @@ public class ClientHandler } @SubscribeEvent - public void onHudRender(RenderGameOverlayEvent.Pre event) - { + public void onHudRender(RenderGameOverlayEvent.Pre event) { for (HUDElement element : hudElements) if (element.getElementType() == event.getType() && element.shouldRender(minecraft)) element.render(minecraft, event.getResolution(), event.getPartialTicks()); @@ -216,8 +182,7 @@ public class ClientHandler // Stolen from Chisel @SubscribeEvent - public void onModelBake(ModelBakeEvent event) - { + public void onModelBake(ModelBakeEvent event) { if (BloodMagic.IS_DEV && SUPPRESS_ASSET_ERRORS) return; @@ -253,8 +218,7 @@ public class ClientHandler // 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 void onTextureStitch(TextureStitchEvent.Post event) - { + public void onTextureStitch(TextureStitchEvent.Post event) { if (BloodMagic.IS_DEV && SUPPRESS_ASSET_ERRORS) return; @@ -267,8 +231,7 @@ public class ClientHandler 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)) - { + if (missingTextures.containsKey(mc)) { Set missingMCTextures = missingTextures.get(mc); for (ResourceLocation texture : missingMCTextures) if (texture.getResourcePath().equalsIgnoreCase(String.format(format, "node")) || texture.getResourcePath().equalsIgnoreCase(String.format(format, "crystal"))) @@ -279,36 +242,14 @@ public class ClientHandler 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()) - { + if (missingTextures.get(mc).isEmpty()) { missingTextures.keySet().remove(mc); badTextureDomains.remove(mc); } BloodMagic.instance.logger.debug("Suppressed required texture errors in {}", stopwatch.stop()); } - public static void cycleSigil(ItemStack stack, EntityPlayer player, int dWheel) - { - int mode = dWheel; - if (!ConfigHandler.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 TextComponentString("") : newStack.getTextComponent(), true); - } - - private static TextureAtlasSprite forName(TextureMap textureMap, String name, String dir) - { - return textureMap.registerSprite(new ResourceLocation(Constants.Mod.DOMAIN + dir + "/" + name)); - } - - private void renderRitualStones(EntityPlayerSP player, float partialTicks) - { + private void renderRitualStones(EntityPlayerSP player, float partialTicks) { World world = player.getEntityWorld(); ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); EnumFacing direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); @@ -328,40 +269,37 @@ public class ClientHandler double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; - for (RitualComponent ritualComponent : ritual.getComponents()) - { + for (RitualComponent ritualComponent : ritual.getComponents()) { 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()) - { + 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; + 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); @@ -371,8 +309,24 @@ public class ClientHandler GlStateManager.popMatrix(); } - public static void renderRitualStones(TileMasterRitualStone masterRitualStone, float partialTicks) - { + public static void cycleSigil(ItemStack stack, EntityPlayer player, int dWheel) { + int mode = dWheel; + if (!ConfigHandler.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 TextComponentString("") : newStack.getTextComponent(), true); + } + + private static TextureAtlasSprite forName(TextureMap textureMap, String name, String dir) { + return textureMap.registerSprite(new ResourceLocation(Constants.Mod.DOMAIN + dir + "/" + name)); + } + + public static void renderRitualStones(TileMasterRitualStone masterRitualStone, float partialTicks) { EntityPlayerSP player = minecraft.player; World world = player.getEntityWorld(); EnumFacing direction = mrsHoloDirection; @@ -392,40 +346,37 @@ public class ClientHandler double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; - for (RitualComponent ritualComponent : ritual.getComponents()) - { + for (RitualComponent ritualComponent : ritual.getComponents()) { 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()) - { + 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; + 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); @@ -435,16 +386,14 @@ public class ClientHandler GlStateManager.popMatrix(); } - public static void setRitualHolo(TileMasterRitualStone masterRitualStone, Ritual ritual, EnumFacing direction, boolean displayed) - { + public static void setRitualHolo(TileMasterRitualStone masterRitualStone, Ritual ritual, EnumFacing direction, boolean displayed) { mrsHoloDisplay = displayed; mrsHoloTile = masterRitualStone; mrsHoloRitual = ritual; mrsHoloDirection = direction; } - public static void setRitualHoloToNull() - { + public static void setRitualHoloToNull() { mrsHoloDisplay = false; mrsHoloTile = null; mrsHoloRitual = null; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index ebebde12..366c9c1f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -1,10 +1,17 @@ package WayofTime.bloodmagic.util.handler.event; -import java.util.ArrayList; -import java.util.List; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.event.AltarCraftedEvent; +import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.util.helper.ItemHelper; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockLifeEssence; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.ItemInscriptionTool; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; @@ -16,38 +23,26 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.AltarCraftedEvent; -import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.util.helper.ItemHelper; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.item.ItemInscriptionTool; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; + +import java.util.ArrayList; +import java.util.List; @Handler -public class CraftingHandler -{ +public class CraftingHandler { // Sets the uses of crafted Inscription Tools to 10 @SubscribeEvent - public void onAltarCrafted(AltarCraftedEvent event) - { - if (event.getOutput() == null) - { + public void onAltarCrafted(AltarCraftedEvent event) { + if (event.getOutput() == null) { return; } - if (event.getOutput().getItem() instanceof ItemInscriptionTool) - { + 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) - { + if (event.getOutput().getItem() == ForgeModContainer.getInstance().universalBucket && event.getAltarRecipe().getSyphon() == 1000) { NBTTagCompound bucketTags = FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)).getTagCompound(); event.getOutput().setTagCompound(bucketTags); } @@ -55,12 +50,9 @@ public class CraftingHandler // Handles crafting of: Revealing Upgrade Tome, Elytra Upgrade Tome, Combining Upgrade Tomes, Setting Upgrade for Trainer @SubscribeEvent - public void onAnvil(AnvilUpdateEvent event) - { - if (ConfigHandler.thaumcraftGogglesUpgrade) - { - if (event.getLeft().getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET && event.getRight().getItem() == Constants.Compat.THAUMCRAFT_GOGGLES && !event.getRight().isItemDamaged()) - { + public void onAnvil(AnvilUpdateEvent event) { + 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"); @@ -73,10 +65,8 @@ public class CraftingHandler } } - if (event.getLeft().getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING) - { - if (event.getRight().getItem() == Items.NAME_TAG) - { + 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 NBTTagCompound()); @@ -88,8 +78,7 @@ public class CraftingHandler return; } - if (event.getRight().getItem() == Items.DYE) - { + if (event.getRight().getItem() == Items.DYE) { EnumDyeColor dyeColor = ItemBanner.getBaseColor(event.getRight()); ItemStack output = event.getLeft().copy(); if (!output.hasTagCompound()) @@ -103,8 +92,7 @@ public class CraftingHandler } } - if (event.getLeft().getItem() == Items.BOOK && event.getRight().getItem() == Items.ELYTRA && !event.getRight().isItemDamaged()) - { + 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"); @@ -116,16 +104,13 @@ public class CraftingHandler return; } - if (event.getLeft().getItem() == RegistrarBloodMagicItems.UPGRADE_TOME && event.getRight().getItem() == RegistrarBloodMagicItems.UPGRADE_TOME) - { + 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()))) - { + 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) - { + if (leftLevel == rightLevel && leftLevel < leftUpgrade.getMaxTier() - 1) { ItemStack outputStack = event.getLeft().copy(); ItemHelper.LivingUpgrades.setLevel(outputStack, leftLevel + 1); event.setCost(leftLevel + 2); @@ -137,17 +122,14 @@ public class CraftingHandler } } - if (event.getLeft().getItem() instanceof IUpgradeTrainer && event.getRight().getItem() == RegistrarBloodMagicItems.UPGRADE_TOME) - { + if (event.getLeft().getItem() instanceof IUpgradeTrainer && event.getRight().getItem() == RegistrarBloodMagicItems.UPGRADE_TOME) { LivingArmourUpgrade rightUpgrade = ItemHelper.LivingUpgrades.getUpgrade(event.getRight()); - if (rightUpgrade != null) - { + 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)) - { + if (((IUpgradeTrainer) event.getLeft().getItem()).setTrainedUpgrades(outputStack, keyList)) { event.setCost(1); event.setOutput(outputStack); 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 41c63451..74d75c62 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -1,14 +1,41 @@ package WayofTime.bloodmagic.util.handler.event; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; - import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.event.ItemBindEvent; +import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.api.event.TeleposeEvent; +import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.api.iface.ISentientTool; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.api.saving.SoulNetwork; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.api.util.helper.*; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; +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.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.potion.BMPotionUtils; +import WayofTime.bloodmagic.util.ChatUtil; +import WayofTime.bloodmagic.util.Utils; +import WayofTime.bloodmagic.util.helper.TextHelper; +import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; @@ -50,69 +77,33 @@ 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 WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.ItemBindEvent; -import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.api.event.TeleposeEvent; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.util.helper.BindableHelper; -import WayofTime.bloodmagic.api.util.helper.ItemHelper; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.block.BlockAltar; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -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.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.potion.BMPotionUtils; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.TextHelper; - -import com.google.common.base.Strings; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + @Handler -public class GenericHandler -{ +public class GenericHandler { public static Map bounceMap = new HashMap(); public static Map filledHandMap = new HashMap(); + private static Map targetTaskMap = new HashMap(); + private static Map attackTaskMap = new HashMap(); @SubscribeEvent - public void onEntityFall(LivingFallEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public void onEntityFall(LivingFallEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (player.isPotionActive(RegistrarBloodMagic.BOUNCE) && !player.isSneaking() && event.getDistance() > 2) - { + if (player.isPotionActive(RegistrarBloodMagic.BOUNCE) && !player.isSneaking() && event.getDistance() > 2) { event.setDamageMultiplier(0); - if (player.getEntityWorld().isRemote) - { + if (player.getEntityWorld().isRemote) { player.motionY *= -0.9; player.fallDistance = 0; bounceMap.put(player, player.motionY); - } else - { + } else { player.fallDistance = 0; event.setCanceled(true); } @@ -121,23 +112,17 @@ public class GenericHandler } @SubscribeEvent - public void playerTickPost(TickEvent.PlayerTickEvent event) - { - if (event.phase == TickEvent.Phase.END && bounceMap.containsKey(event.player)) - { + public void playerTickPost(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END && bounceMap.containsKey(event.player)) { event.player.motionY = bounceMap.remove(event.player); } - if (event.phase == TickEvent.Phase.END) - { - if (filledHandMap.containsKey(event.player)) - { + if (event.phase == TickEvent.Phase.END) { + if (filledHandMap.containsKey(event.player)) { int value = filledHandMap.get(event.player) - 1; - if (value <= 0) - { + if (value <= 0) { filledHandMap.remove(event.player); - } else - { + } else { filledHandMap.put(event.player, value); } } @@ -145,31 +130,24 @@ public class GenericHandler } @SubscribeEvent - public void onPlayerClick(PlayerInteractEvent event) - { - if (event.isCancelable() && event.getEntityPlayer().isPotionActive(RegistrarBloodMagic.CONSTRICT)) - { + public void onPlayerClick(PlayerInteractEvent event) { + if (event.isCancelable() && event.getEntityPlayer().isPotionActive(RegistrarBloodMagic.CONSTRICT)) { EntityPlayer player = event.getEntityPlayer(); int level = player.getActivePotionEffect(RegistrarBloodMagic.CONSTRICT).getAmplifier(); - if (event.getHand() == EnumHand.OFF_HAND || level > 1) - { + if (event.getHand() == EnumHand.OFF_HAND || level > 1) { event.setCanceled(true); } } } @SubscribeEvent - public void onPlayerDropItem(ItemTossEvent event) - { + public void onPlayerDropItem(ItemTossEvent event) { EntityItem itemEntity = event.getEntityItem(); - if (itemEntity != null) - { + if (itemEntity != null) { ItemStack stack = itemEntity.getItem(); Item item = stack.getItem(); - if (stack.hasTagCompound() && item instanceof ISentientTool) - { - if (((ISentientTool) item).spawnSentientEntityOnDrop(stack, event.getPlayer())) - { + if (stack.hasTagCompound() && item instanceof ISentientTool) { + if (((ISentientTool) item).spawnSentientEntityOnDrop(stack, event.getPlayer())) { event.setCanceled(true); } } @@ -177,8 +155,7 @@ public class GenericHandler } @SubscribeEvent - public void onExplosion(ExplosionEvent.Start event) - { + public void onExplosion(ExplosionEvent.Start event) { World world = event.getWorld(); Explosion exp = event.getExplosion(); Vec3d position = exp.getPosition(); @@ -186,12 +163,9 @@ public class GenericHandler 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)) - { + if (!specterList.isEmpty()) { + for (EntitySentientSpecter specter : specterList) { + if (specter.absorbExplosion(exp)) { event.setCanceled(true); return; } @@ -200,17 +174,14 @@ public class GenericHandler } @SubscribeEvent - public void onEntityHurt(LivingHurtEvent event) - { + public void onEntityHurt(LivingHurtEvent event) { if (event.getEntity().getEntityWorld().isRemote) return; - if (event.getSource().getTrueSource() instanceof EntityPlayer && !PlayerHelper.isFakePlayer((EntityPlayer) event.getSource().getTrueSource())) - { + if (event.getSource().getTrueSource() instanceof EntityPlayer && !PlayerHelper.isFakePlayer((EntityPlayer) event.getSource().getTrueSource())) { EntityPlayer player = (EntityPlayer) event.getSource().getTrueSource(); - if (!player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).isEmpty() && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() instanceof ItemPackSacrifice) - { + if (!player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).isEmpty() && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() instanceof ItemPackSacrifice) { ItemPackSacrifice pack = (ItemPackSacrifice) player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem(); boolean shouldSyphon = pack.getStoredLP(player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) < pack.CAPACITY; @@ -221,16 +192,13 @@ public class GenericHandler ItemHelper.LPContainer.addLPToItem(player.getItemStackFromSlot(EntityEquipmentSlot.CHEST), totalLP, pack.CAPACITY); } - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.battleHunger", chestStack); - if (upgrade instanceof LivingArmourUpgradeBattleHungry) - { + if (upgrade instanceof LivingArmourUpgradeBattleHungry) { ((LivingArmourUpgradeBattleHungry) upgrade).resetTimer(); } } @@ -238,28 +206,20 @@ public class GenericHandler } } - private static Map targetTaskMap = new HashMap(); - private static Map attackTaskMap = new HashMap(); - // Handles sending the client the Demon Will Aura updates @SubscribeEvent - public void onLivingUpdate(LivingUpdateEvent event) - { - if (!event.getEntityLiving().getEntityWorld().isRemote) - { + public void onLivingUpdate(LivingUpdateEvent event) { + if (!event.getEntityLiving().getEntityWorld().isRemote) { EntityLivingBase entity = event.getEntityLiving(); if (entity instanceof EntityPlayer && entity.ticksExisted % 50 == 0) //TODO: Change to an incremental counter { sendPlayerDemonWillAura((EntityPlayer) entity); } - if (event.getEntityLiving() instanceof EntityAnimal) - { + if (event.getEntityLiving() instanceof EntityAnimal) { EntityAnimal animal = (EntityAnimal) event.getEntityLiving(); - if (animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) - { - if (!targetTaskMap.containsKey(animal)) - { + if (animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { + if (!targetTaskMap.containsKey(animal)) { EntityAITarget task = new EntityAINearestAttackableTarget(animal, EntityMob.class, false); EntityAIBase attackTask = new EntityAIAttackMelee(animal, 1.0D, false); animal.targetTasks.addTask(1, task); @@ -268,14 +228,12 @@ public class GenericHandler attackTaskMap.put(animal, attackTask); } - if (animal.getAttackTarget() != null && animal.getDistanceSqToEntity(animal.getAttackTarget()) < 4) - { + if (animal.getAttackTarget() != null && animal.getDistanceSqToEntity(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)) - { + } else if (targetTaskMap.containsKey(animal)) { targetTaskMap.remove(animal); attackTaskMap.remove(animal); } @@ -284,69 +242,55 @@ public class GenericHandler EntityLivingBase entity = event.getEntityLiving(); - if (entity instanceof EntityPlayer) - { + if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; - if (player.isSneaking() && player.isPotionActive(RegistrarBloodMagic.CLING) && Utils.isPlayerBesideSolidBlockFace(player) && !player.onGround) - { - if (player.getEntityWorld().isRemote) - { + 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 - { + } else { player.fallDistance = 0; } } } - if (entity.isPotionActive(MobEffects.NIGHT_VISION)) - { + if (entity.isPotionActive(MobEffects.NIGHT_VISION)) { int duration = entity.getActivePotionEffect(MobEffects.NIGHT_VISION).getDuration(); - if (duration == Constants.Misc.NIGHT_VISION_CONSTANT_END) - { + if (duration == Constants.Misc.NIGHT_VISION_CONSTANT_END) { entity.removePotionEffect(MobEffects.NIGHT_VISION); } } - if (entity.isPotionActive(RegistrarBloodMagic.FIRE_FUSE)) - { + 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) - { + 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)) - { + 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) - { + if (timeRemaining % 10 == 0) { BMPotionUtils.damageMobAndGrowSurroundingPlants(entity, 2 + amplifier, 1, 0.5 * 3 / (amplifier + 3), 25 * (1 + amplifier)); } } } -// @SideOnly(Side.SERVER) - public void sendPlayerDemonWillAura(EntityPlayer player) - { - if (player instanceof EntityPlayerMP) - { + // @SideOnly(Side.SERVER) + public void sendPlayerDemonWillAura(EntityPlayer player) { + if (player instanceof EntityPlayerMP) { BlockPos pos = player.getPosition(); DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(player.getEntityWorld().provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); - if (holder != null) - { + if (holder != null) { BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(holder), (EntityPlayerMP) player); - } else - { + } else { BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(new DemonWillHolder()), (EntityPlayerMP) player); } } @@ -354,12 +298,10 @@ public class GenericHandler // Handles destroying altar @SubscribeEvent - public void harvestEvent(PlayerEvent.HarvestCheck event) - { + public void harvestEvent(PlayerEvent.HarvestCheck event) { IBlockState state = event.getTargetBlock(); Block block = state.getBlock(); - if (block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && !event.getEntityPlayer().getHeldItemMainhand().isEmpty() && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) - { + if (block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && !event.getEntityPlayer().getHeldItemMainhand().isEmpty() && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) { ItemAltarMaker altarMaker = (ItemAltarMaker) event.getEntityPlayer().getHeldItemMainhand().getItem(); ChatUtil.sendNoSpam(event.getEntityPlayer(), TextHelper.localizeEffect("chat.bloodmagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer()))); } @@ -367,16 +309,14 @@ public class GenericHandler // Handle Teleposer block blacklist @SubscribeEvent - public void onTelepose(TeleposeEvent event) - { + public 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 void onTeleposeEntity(TeleposeEvent.Ent event) - { + public void onTeleposeEntity(TeleposeEvent.Ent event) { EntityEntry entry = EntityRegistry.getEntry(event.entity.getClass()); if (BloodMagicAPI.INSTANCE.getBlacklist().getTeleposerEntities().contains(entry.getRegistryName())) event.setCanceled(true); @@ -384,15 +324,13 @@ public class GenericHandler // Sets teleport cooldown for Teleposed entities to 5 ticks (1/4 second) instead of 150 (7.5 seconds) @SubscribeEvent - public void onTeleposeEntityPost(TeleposeEvent.Ent.Post event) - { + public 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 void onInteract(PlayerInteractEvent.RightClickItem event) - { + public void onInteract(PlayerInteractEvent.RightClickItem event) { if (event.getWorld().isRemote) return; @@ -402,14 +340,11 @@ public class GenericHandler return; ItemStack held = event.getItemStack(); - if (!held.isEmpty() && held.getItem() instanceof IBindable) - { + if (!held.isEmpty() && held.getItem() instanceof IBindable) { held = NBTHelper.checkNBT(held); IBindable bindable = (IBindable) held.getItem(); - if (Strings.isNullOrEmpty(bindable.getOwnerUUID(held))) - { - if (bindable.onBind(player, held)) - { + if (Strings.isNullOrEmpty(bindable.getOwnerUUID(held))) { + if (bindable.onBind(player, held)) { String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); ItemBindEvent toPost = new ItemBindEvent(player, uuid, held); if (MinecraftForge.EVENT_BUS.post(toPost) || toPost.getResult() == Result.DENY) @@ -422,8 +357,7 @@ public class GenericHandler BindableHelper.setItemOwnerName(held, player.getDisplayNameString()); } - if (!held.isEmpty() && held.getItem() instanceof IBloodOrb) - { + if (!held.isEmpty() && held.getItem() instanceof IBloodOrb) { held = NBTHelper.checkNBT(held); IBloodOrb bloodOrb = (IBloodOrb) held.getItem(); SoulNetwork network = NetworkHelper.getSoulNetwork(player); @@ -438,21 +372,17 @@ public class GenericHandler } @SubscribeEvent - public void selfSacrificeEvent(SacrificeKnifeUsedEvent event) - { + public void selfSacrificeEvent(SacrificeKnifeUsedEvent event) { EntityPlayer player = event.player; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerSelfSacrifice.incrementCounter(armour, event.healthDrained / 2); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.selfSacrifice", chestStack); - if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) - { + if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) { double modifier = ((LivingArmourUpgradeSelfSacrifice) upgrade).getSacrificeModifier(); event.lpAdded = (int) (event.lpAdded * (1 + modifier)); @@ -463,14 +393,12 @@ public class GenericHandler // Drop Blood Shards @SubscribeEvent - public void onLivingDrops(LivingDropsEvent event) - { + public void onLivingDrops(LivingDropsEvent event) { EntityLivingBase attackedEntity = event.getEntityLiving(); DamageSource source = event.getSource(); Entity entity = source.getTrueSource(); - if (entity != null && entity instanceof EntityPlayer) - { + if (entity != null && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; ItemStack heldStack = player.getHeldItemMainhand(); @@ -483,24 +411,19 @@ public class GenericHandler // Experience Tome @SubscribeEvent(priority = EventPriority.LOWEST) - public void onExperiencePickup(PlayerPickupXpEvent event) - { + public void onExperiencePickup(PlayerPickupXpEvent event) { EntityPlayer player = event.getEntityPlayer(); ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); - if (!itemstack.isEmpty() && itemstack.isItemDamaged()) - { + 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) - { + 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; @@ -509,13 +432,11 @@ public class GenericHandler } } - private int xpToDurability(int xp) - { + private int xpToDurability(int xp) { return xp * 2; } - private int durabilityToXp(int durability) - { + private int durabilityToXp(int durability) { return durability / 2; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 059c840d..903d77e9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -1,7 +1,20 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +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.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.EntityPlayer; @@ -25,49 +38,25 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -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.StatTrackerGrimReaperSprint; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerJump; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowShot; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGrimReaperSprint; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeJump; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSpeed; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeStepAssist; @Handler -public class LivingArmourHandler -{ +public class LivingArmourHandler { @SubscribeEvent - public void onEntityHealed(LivingHealEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public void onEntityHealed(LivingHealEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntity(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { double modifier = 1; LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.slowHeal", chestStack); - if (upgrade instanceof LivingArmourUpgradeSlowHeal) - { + if (upgrade instanceof LivingArmourUpgradeSlowHeal) { modifier *= ((LivingArmourUpgradeSlowHeal) upgrade).getHealingModifier(); } - if (modifier != 1) - { + if (modifier != 1) { event.setAmount((float) (event.getAmount() * modifier)); } } @@ -76,23 +65,18 @@ public class LivingArmourHandler } @SubscribeEvent - public void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) - { + public void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { double modifier = 1; - for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) - { + for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) { modifier *= upgrade.getMiningSpeedModifier(player); } - if (modifier != 1) - { + if (modifier != 1) { event.setNewSpeed((float) (event.getOriginalSpeed() * modifier)); } } @@ -101,31 +85,24 @@ public class LivingArmourHandler // Applies: Storm Trooper @SubscribeEvent - public void onEntityJoinedWorld(EntityJoinWorldEvent event) - { + public void onEntityJoinedWorld(EntityJoinWorldEvent event) { Entity owner = null; - if (event.getEntity() instanceof EntityArrow) - { + if (event.getEntity() instanceof EntityArrow) { owner = ((EntityArrow) event.getEntity()).shootingEntity; - } else if (event.getEntity() instanceof EntityThrowable) - { + } else if (event.getEntity() instanceof EntityThrowable) { owner = ((EntityThrowable) event.getEntity()).getThrower(); } - if (owner instanceof EntityPlayer) - { + if (owner instanceof EntityPlayer) { Entity projectile = event.getEntity(); EntityPlayer player = (EntityPlayer) owner; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stormTrooper", chestStack); - if (upgrade instanceof LivingArmourUpgradeStormTrooper) - { + 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; @@ -138,37 +115,29 @@ public class LivingArmourHandler } @SubscribeEvent - public void onPlayerClick(PlayerInteractEvent event) - { - if (event.isCancelable()) - { + public void onPlayerClick(PlayerInteractEvent event) { + if (event.isCancelable()) { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { - if (event.getHand() == EnumHand.OFF_HAND) - { + if (armour != null) { + if (event.getHand() == EnumHand.OFF_HAND) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.crippledArm", chestStack); - if (upgrade instanceof LivingArmourUpgradeCrippledArm) - { + if (upgrade instanceof LivingArmourUpgradeCrippledArm) { event.setCanceled(true); } } - if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) - { + if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) { ItemStack drinkStack = event.getItemStack(); //TODO: See if the item is a splash potion? Those should be usable. LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); - if (upgrade instanceof LivingArmourUpgradeQuenched) - { + if (upgrade instanceof LivingArmourUpgradeQuenched) { event.setCanceled(true); } } @@ -179,24 +148,19 @@ public class LivingArmourHandler // Applies: Grim Reaper @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onEntityDeath(LivingDeathEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public void onEntityDeath(LivingDeathEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerGrimReaperSprint.incrementCounter(armour); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.grimReaper", chestStack); - if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) - { + if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) { ((LivingArmourUpgradeGrimReaperSprint) upgrade).applyEffectOnRebirth(player); event.setCanceled(true); event.setResult(Event.Result.DENY); @@ -210,26 +174,20 @@ public class LivingArmourHandler // Applies: Jump @SubscribeEvent - public void onJumpEvent(LivingEvent.LivingJumpEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public void onJumpEvent(LivingEvent.LivingJumpEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerJump.incrementCounter(armour); - if (!player.isSneaking()) - { + if (!player.isSneaking()) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.jump", chestStack); - if (upgrade instanceof LivingArmourUpgradeJump) - { + if (upgrade instanceof LivingArmourUpgradeJump) { player.motionY += ((LivingArmourUpgradeJump) upgrade).getJumpModifier(); } } @@ -240,28 +198,21 @@ public class LivingArmourHandler // Applies: Step Assist, Speed Boost @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onEntityUpdate(LivingEvent.LivingUpdateEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); boolean hasAssist = false; - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) - { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { hasAssist = true; player.stepHeight = Constants.Misc.ALTERED_STEP_HEIGHT; - } else - { - if (LivingArmour.hasFullSet(player)) - { + } else { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stepAssist", chestStack); - if (upgrade instanceof LivingArmourUpgradeStepAssist) - { + if (upgrade instanceof LivingArmourUpgradeStepAssist) { player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); hasAssist = true; } @@ -274,31 +225,26 @@ public class LivingArmourHandler float percentIncrease = 0; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.movement", chestStack); - if (upgrade instanceof LivingArmourUpgradeSpeed) - { + if (upgrade instanceof LivingArmourUpgradeSpeed) { percentIncrease += 0.1f * ((LivingArmourUpgradeSpeed) upgrade).getSpeedModifier(); } } } - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) - { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); { percentIncrease += (i + 1) * 0.05f; } } - if (percentIncrease > 0 && (player.onGround || player.capabilities.isFlying) && (Math.abs(player.moveForward) > 0 || Math.abs(player.moveStrafing) > 0)) - { + if (percentIncrease > 0 && (player.onGround || player.capabilities.isFlying) && (Math.abs(player.moveForward) > 0 || Math.abs(player.moveStrafing) > 0)) { player.moveRelative(player.moveStrafing, player.moveForward, player.capabilities.isFlying ? (percentIncrease / 2.0f) : percentIncrease, 0.02F); } } @@ -307,8 +253,7 @@ public class LivingArmourHandler // Applies: Arrow Shot // Tracks: Arrow Shot @SubscribeEvent - public void onArrowFire(ArrowLooseEvent event) - { + public void onArrowFire(ArrowLooseEvent event) { World world = event.getEntityPlayer().getEntityWorld(); ItemStack stack = event.getBow(); EntityPlayer player = event.getEntityPlayer(); @@ -316,17 +261,14 @@ public class LivingArmourHandler if (world.isRemote) return; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerArrowShot.incrementCounter(armour); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.arrowShot", chestStack); - if (upgrade instanceof LivingArmourUpgradeArrowShot) - { + if (upgrade instanceof LivingArmourUpgradeArrowShot) { int charge = event.getCharge(); float velocity = (float) charge / 20.0F; velocity = (velocity * velocity + velocity * 2.0F) / 3.0F; @@ -338,8 +280,7 @@ public class LivingArmourHandler velocity = 1.0F; int extraArrows = ((LivingArmourUpgradeArrowShot) upgrade).getExtraArrows(); - for (int n = 0; n < extraArrows; n++) - { + for (int n = 0; n < extraArrows; n++) { ItemStack arrowStack = new ItemStack(Items.ARROW); ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); EntityArrow entityarrow = itemarrow.createArrow(world, arrowStack, player); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java index e4d8ff82..78b03262 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -1,6 +1,15 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.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.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -17,49 +26,23 @@ import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.item.armour.ItemSentientArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerArrowProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerCriticalStrike; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerDigging; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerExperience; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerFallProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerGraveDigger; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerHealthboost; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerMeleeDamage; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerNightSight; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerPhysicalProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSolarPowered; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSprintAttack; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeDigging; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeExperience; -import WayofTime.bloodmagic.util.Utils; @Handler -public class StatTrackerHandler -{ +public class StatTrackerHandler { private static float lastPlayerSwingStrength = 0; // Tracks: Digging, DigSlowdown @SubscribeEvent - public void blockBreakEvent(BlockEvent.BreakEvent event) - { + public void blockBreakEvent(BlockEvent.BreakEvent event) { EntityPlayer player = event.getPlayer(); - if (player != null) - { - if (LivingArmour.hasFullSet(player)) - { + if (player != null) { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (chestStack.getItem() instanceof ItemLivingArmour) - { + if (chestStack.getItem() instanceof ItemLivingArmour) { LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerDigging.incrementCounter(armour); LivingArmourUpgradeDigging.hasDug(armour); } @@ -70,25 +53,20 @@ public class StatTrackerHandler // Tracks: Health Boost @SubscribeEvent - public void onEntityHealed(LivingHealEvent event) - { + public void onEntityHealed(LivingHealEvent event) { EntityLivingBase healedEntity = event.getEntityLiving(); - if (!(healedEntity instanceof EntityPlayer)) - { + if (!(healedEntity instanceof EntityPlayer)) { return; } EntityPlayer player = (EntityPlayer) healedEntity; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerHealthboost.incrementCounter(armour, event.getAmount()); - if (player.getEntityWorld().canSeeSky(player.getPosition()) && player.getEntityWorld().provider.isDaytime()) - { + if (player.getEntityWorld().canSeeSky(player.getPosition()) && player.getEntityWorld().provider.isDaytime()) { StatTrackerSolarPowered.incrementCounter(armour, event.getAmount()); } } @@ -96,31 +74,26 @@ public class StatTrackerHandler } @SubscribeEvent - public void onLivingAttack(AttackEntityEvent event) - { + public 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 void entityHurt(LivingHurtEvent event) - { + public void entityHurt(LivingHurtEvent event) { DamageSource source = event.getSource(); Entity sourceEntity = event.getSource().getTrueSource(); EntityLivingBase attackedEntity = event.getEntityLiving(); - if (attackedEntity instanceof EntityPlayer) - { + if (attackedEntity instanceof EntityPlayer) { EntityPlayer attackedPlayer = (EntityPlayer) attackedEntity; // Living Armor Handling - if (LivingArmour.hasFullSet(attackedPlayer)) - { + if (LivingArmour.hasFullSet(attackedPlayer)) { float amount = Math.min(Utils.getModifiedDamage(attackedPlayer, event.getSource(), event.getAmount()), attackedPlayer.getHealth()); ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { if (sourceEntity != null && !source.isMagicDamage() && !source.isProjectile()) StatTrackerPhysicalProtect.incrementCounter(armour, amount); @@ -130,36 +103,30 @@ public class StatTrackerHandler if (source.isProjectile()) StatTrackerArrowProtect.incrementCounter(armour, amount); } - } else - { + } else { ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (chestStack.getItem() instanceof ItemSentientArmour) - { + if (chestStack.getItem() instanceof ItemSentientArmour) { ItemSentientArmour armour = (ItemSentientArmour) chestStack.getItem(); armour.onPlayerAttacked(chestStack, source, attackedPlayer); } } } - if (sourceEntity instanceof EntityPlayer) - { + if (sourceEntity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) sourceEntity; // Living Armor Handling - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { ItemStack mainWeapon = player.getItemStackFromSlot(EntityEquipmentSlot.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()) - { + if (!source.isProjectile()) { StatTrackerMeleeDamage.incrementCounter(armour, amount); if (player.getEntityWorld().getLight(player.getPosition()) <= 9) @@ -186,19 +153,15 @@ public class StatTrackerHandler // Tracks: Experienced @SubscribeEvent(priority = EventPriority.LOW) - public void onExperiencePickup(PlayerPickupXpEvent event) - { + public void onExperiencePickup(PlayerPickupXpEvent event) { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.experienced", chestStack); - if (upgrade instanceof LivingArmourUpgradeExperience) - { + if (upgrade instanceof LivingArmourUpgradeExperience) { double modifier = ((LivingArmourUpgradeExperience) upgrade).getExperienceModifier(); double exp = event.getOrb().xpValue * (1 + modifier); 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 6c72690d..6fc490c9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -1,10 +1,13 @@ package WayofTime.bloodmagic.util.handler.event; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.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.EntityLivingBase; import net.minecraft.entity.item.EntityItem; @@ -25,37 +28,26 @@ import net.minecraftforge.event.world.ChunkDataEvent; import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.demonAura.PosXY; -import WayofTime.bloodmagic.demonAura.WillChunk; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; + +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; @Handler -public class WillHandler -{ +public class WillHandler { private final HashMap serverTicks = new HashMap(); // Adds Will to player @SubscribeEvent - public void onItemPickup(EntityItemPickupEvent event) - { + public void onItemPickup(EntityItemPickupEvent event) { ItemStack stack = event.getItem().getItem(); - if (stack.getItem() instanceof IDemonWill) - { + if (stack.getItem() instanceof IDemonWill) { EntityPlayer player = event.getEntityPlayer(); 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)) - { + if (remainder == null || ((IDemonWill) stack.getItem()).getWill(pickupType, stack) < 0.0001 || PlayerDemonWillHandler.isDemonWillFull(pickupType, player)) { stack.setCount(0); event.setResult(Event.Result.ALLOW); } @@ -63,14 +55,11 @@ public class WillHandler } @SubscribeEvent - public void onEntityAttacked(LivingDeathEvent event) - { - if (event.getSource() instanceof EntityDamageSourceIndirect) - { + public void onEntityAttacked(LivingDeathEvent event) { + if (event.getSource() instanceof EntityDamageSourceIndirect) { Entity sourceEntity = event.getSource().getImmediateSource(); - if (sourceEntity instanceof EntitySentientArrow) - { + if (sourceEntity instanceof EntitySentientArrow) { ((EntitySentientArrow) sourceEntity).reimbursePlayer(event.getEntityLiving(), event.getEntityLiving().getMaxHealth()); } } @@ -78,14 +67,12 @@ public class WillHandler // Add/Drop Demon Will for Player @SubscribeEvent - public void onLivingDrops(LivingDropsEvent event) - { + public void onLivingDrops(LivingDropsEvent event) { EntityLivingBase attackedEntity = event.getEntityLiving(); DamageSource source = event.getSource(); Entity entity = source.getTrueSource(); - if (attackedEntity.isPotionActive(RegistrarBloodMagic.SOUL_SNARE) && (attackedEntity instanceof EntityMob || attackedEntity.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL)) - { + if (attackedEntity.isPotionActive(RegistrarBloodMagic.SOUL_SNARE) && (attackedEntity instanceof EntityMob || attackedEntity.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL)) { PotionEffect eff = attackedEntity.getActivePotionEffect(RegistrarBloodMagic.SOUL_SNARE); int lvl = eff.getAmplifier(); @@ -94,26 +81,20 @@ public class WillHandler event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); } - if (entity != null && entity instanceof EntityPlayer) - { + if (entity != null && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; ItemStack heldStack = player.getHeldItemMainhand(); - if (heldStack.getItem() instanceof IDemonWillWeapon && !player.getEntityWorld().isRemote) - { + 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()) - { + if (!droppedSouls.isEmpty()) { ItemStack remainder; - for (ItemStack willStack : droppedSouls) - { + for (ItemStack willStack : droppedSouls) { remainder = PlayerDemonWillHandler.addDemonWill(player, willStack); - if (!remainder.isEmpty()) - { + if (!remainder.isEmpty()) { EnumDemonWillType pickupType = ((IDemonWill) remainder.getItem()).getType(remainder); - if (((IDemonWill) remainder.getItem()).getWill(pickupType, remainder) >= 0.0001) - { + if (((IDemonWill) remainder.getItem()).getWill(pickupType, remainder) >= 0.0001) { event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder)); } } @@ -125,24 +106,20 @@ public class WillHandler } @SubscribeEvent - public void onServerWorldTick(TickEvent.WorldTickEvent event) - { + public void onServerWorldTick(TickEvent.WorldTickEvent event) { if (event.world.isRemote) return; int dim = event.world.provider.getDimension(); - if (event.phase == TickEvent.Phase.END) - { + if (event.phase == TickEvent.Phase.END) { if (!this.serverTicks.containsKey(dim)) this.serverTicks.put(dim, 0); int ticks = (this.serverTicks.get(dim)); - if (ticks % 20 == 0) - { + if (ticks % 20 == 0) { CopyOnWriteArrayList dirtyChunks = WorldDemonWillHandler.dirtyChunks.get(dim); - if ((dirtyChunks != null) && (dirtyChunks.size() > 0)) - { + if ((dirtyChunks != null) && (dirtyChunks.size() > 0)) { for (PosXY pos : dirtyChunks) event.world.markChunkDirty(new BlockPos(pos.x * 16, 5, pos.y * 16), null); @@ -156,8 +133,7 @@ public class WillHandler } @SubscribeEvent - public void chunkSave(ChunkDataEvent.Save event) - { + public void chunkSave(ChunkDataEvent.Save event) { int dim = event.getWorld().provider.getDimension(); ChunkPos loc = event.getChunk().getPos(); @@ -165,8 +141,7 @@ public class WillHandler event.getData().setTag("BloodMagic", nbt); WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.x, loc.z); - if (ac != null) - { + if (ac != null) { nbt.setShort("base", ac.getBase()); ac.getCurrentWill().writeToNBT(nbt, "current"); if (!event.getChunk().isLoaded()) @@ -175,18 +150,15 @@ public class WillHandler } @SubscribeEvent - public void chunkLoad(ChunkDataEvent.Load event) - { + public void chunkLoad(ChunkDataEvent.Load event) { int dim = event.getWorld().provider.getDimension(); - if (event.getData().getCompoundTag("BloodMagic").hasKey("base")) - { + if (event.getData().getCompoundTag("BloodMagic").hasKey("base")) { NBTTagCompound 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 - { + } else { WorldDemonWillHandler.generateWill(event.getChunk()); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java index 8cea0dfa..c79afba7 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java @@ -2,13 +2,11 @@ package WayofTime.bloodmagic.util.helper; import java.util.TreeMap; -public class NumeralHelper -{ +public class NumeralHelper { private static final TreeMap romanNumerals = new TreeMap(); - static - { + static { romanNumerals.put(1000, "M"); romanNumerals.put(900, "CM"); romanNumerals.put(500, "D"); @@ -24,8 +22,7 @@ public class NumeralHelper romanNumerals.put(1, "I"); } - public static String toRoman(int arabic) - { + public static String toRoman(int arabic) { int convert = romanNumerals.floorKey(arabic); if (arabic == convert) return romanNumerals.get(convert); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java index 73d27fd3..069246a9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java @@ -1,25 +1,19 @@ package WayofTime.bloodmagic.util.helper; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; import WayofTime.bloodmagic.api.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) - { +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()) - { + if (!resultStack.isEmpty()) { + if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { return recipe; } } @@ -29,17 +23,12 @@ public class RecipeHelper return null; } - public static AltarRecipeRegistry.AltarRecipe getAltarRecipeForOutput(ItemStack stack) - { - for (AltarRecipeRegistry.AltarRecipe recipe : AltarRecipeRegistry.getRecipes().values()) - { - if (recipe != null && !recipe.isFillable()) - { + 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()) - { + if (!resultStack.isEmpty()) { + if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { return recipe; } } @@ -49,17 +38,12 @@ public class RecipeHelper return null; } - public static TartaricForgeRecipe getForgeRecipeForOutput(ItemStack stack) - { - for (TartaricForgeRecipe recipe : TartaricForgeRecipeRegistry.getRecipeList()) - { - if (recipe != 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()) - { + if (!resultStack.isEmpty()) { + if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { return recipe; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java index 08da2246..42b3a443 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java @@ -6,25 +6,20 @@ import org.apache.commons.lang3.text.WordUtils; import java.util.ArrayList; import java.util.List; -public class TextHelper -{ - public static String getFormattedText(String string) - { +public class TextHelper { + public static String getFormattedText(String string) { return string.replaceAll("&", "\u00A7"); } - public static String localize(String input, Object... format) - { + public static String localize(String input, Object... format) { return I18n.translateToLocalFormatted(input, format); } - public static String localizeEffect(String input, Object... format) - { + public static String localizeEffect(String input, Object... format) { return getFormattedText(localize(input, format)); } - public static String[] localizeAll(String[] input) - { + 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]); @@ -32,8 +27,7 @@ public class TextHelper return ret; } - public static String[] localizeAllEffect(String[] input) - { + 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]); @@ -41,8 +35,7 @@ public class TextHelper return ret; } - public static ArrayList localizeAll(List input) - { + 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))); @@ -50,8 +43,7 @@ public class TextHelper return ret; } - public static ArrayList localizeAllEffect(List input) - { + 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))); @@ -59,18 +51,15 @@ public class TextHelper return ret; } - public static String[] cutLongString(String string, int characters) - { + public static String[] cutLongString(String string, int characters) { return WordUtils.wrap(string, characters, "/cut", false).split("/cut"); } - public static String[] cutLongString(String string) - { + public static String[] cutLongString(String string) { return cutLongString(string, 30); } - public static boolean canTranslate(String key) - { + public static boolean canTranslate(String key) { return I18n.canTranslate(key); } } From 3b173ecf172265d68a0add7d963ef5ed9b503604 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 15 Aug 2017 23:01:36 -0700 Subject: [PATCH 127/595] Some models work, some don't --- .../bloodmagic/core/RegistrarBloodMagic.java | 13 +++--- .../core/RegistrarBloodMagicBlocks.java | 8 ++-- .../bloodmagic/item/ItemBoundTool.java | 2 +- .../item/block/ItemBlockBloodTank.java | 5 ++- ...oncrystal.json => activation_crystal.json} | 0 ...ckalchemyarray.json => alchemy_array.json} | 0 ...ckalchemytable.json => alchemy_table.json} | 0 .../{blockaltar.json => altar.json} | 0 .../itemaltarmaker.json => altar_maker.json} | 0 ...itemarcaneashes.json => arcane_ashes.json} | 0 ...uterfilter.json => base_fluid_filter.json} | 0 ...outerfilter.json => base_item_filter.json} | 0 .../bloodmagic/blockstates/blockcrystal.json | 22 ---------- ...{blockbloodlight.json => blood_light.json} | 0 .../bloodmagic/blockstates/blood_orb.json | 41 +++++++++++++++++++ .../{blockbloodrune.json => blood_rune.json} | 0 .../itembloodshard.json => blood_shard.json} | 0 .../{blockbloodtank.json => blood_tank.json} | 0 .../itemboundaxe.json => bound_axe.json} | 0 ...emboundpickaxe.json => bound_pickaxe.json} | 0 ...itemboundshovel.json => bound_shovel.json} | 0 .../itemboundsword.json => bound_sword.json} | 0 .../itemcomponent.json => component.json} | 0 ...emcuttingfluid.json => cutting_fluid.json} | 0 ...acrifice.json => dagger_of_sacrifice.json} | 0 ...dstonebrick.json => decorative_brick.json} | 14 ++++++- ...ckdemonbricks1.json => demon_brick_1.json} | 0 ...ckdemonbricks2.json => demon_brick_2.json} | 0 ...demoncrucible.json => demon_crucible.json} | 0 ...ckdemoncrystal.json => demon_crystal.json} | 0 ...stallizer.json => demon_crystallizer.json} | 0 ...blockdemonextra.json => demon_extras.json} | 0 ...{blockdemonlight.json => demon_light.json} | 0 ...{blockpillar1.json => demon_pillar_1.json} | 0 ...{blockpillar2.json => demon_pillar_2.json} | 0 ...illarcap1.json => demon_pillar_cap_1.json} | 0 ...illarcap2.json => demon_pillar_cap_2.json} | 0 ...illarcap3.json => demon_pillar_cap_3.json} | 0 ...{blockdemonpylon.json => demon_pylon.json} | 0 ...{blockstairs1.json => demon_stairs_1.json} | 0 ...{blockstairs2.json => demon_stairs_2.json} | 0 ...{blockstairs3.json => demon_stairs_3.json} | 0 .../{blockwall1.json => demon_wall_1.json} | 0 ...onwillgauge.json => demon_will_gauge.json} | 0 ...nalportal.json => dimensional_portal.json} | 0 ...periencebook.json => experience_tome.json} | 0 ...ckincensealtar.json => incense_altar.json} | 0 ...utingnode.json => input_routing_node.json} | 0 ...riptiontool.json => inscription_tool.json} | 0 ...rsionpillar.json => inversion_pillar.json} | 0 ...llarend.json => inversion_pillar_end.json} | 0 .../item/itemblockdemoncrystal.json | 39 ------------------ ...oncrystal.json => item_demon_crystal.json} | 0 ...supgrade.json => item_points_upgrade.json} | 0 ...outingnode.json => item_routing_node.json} | 0 ...itemlavacrystal.json => lava_crystal.json} | 0 ...locklifeessence.json => life_essence.json} | 0 ...emlivingarmour.json => living_armour.json} | 0 ...tingnode.json => master_routing_node.json} | 0 .../{blockmimic.json => mimic.json} | 0 ...itemmonstersoul.json => monster_soul.json} | 0 .../itemnoderouter.json => node_router.json} | 0 ...tingnode.json => output_routing_node.json} | 0 ...packsacrifice.json => pack_sacrifice.json} | 0 ...acrifice.json => pack_self_sacrifice.json} | 0 .../blockstates/{blockpath.json => path.json} | 0 .../{blockphantom.json => phantom.json} | 0 ...itempotionflask.json => potion_flask.json} | 0 ...controller.json => ritual_controller.json} | 0 ...ritualdiviner.json => ritual_diviner.json} | 0 ...emritualreader.json => ritual_reader.json} | 0 ...lockritualstone.json => ritual_stone.json} | 0 ...ialdagger.json => sacrificial_dagger.json} | 0 ...emsanguinebook.json => sanguine_book.json} | 0 ...ntientarmour.json => sentient_armour.json} | 0 ...rmourgem.json => sentient_armour_gem.json} | 0 ...itemsentientaxe.json => sentient_axe.json} | 0 ...itemsentientbow.json => sentient_bow.json} | 0 ...ientpickaxe.json => sentient_pickaxe.json} | 0 ...ntientshovel.json => sentient_shovel.json} | 0 ...sentientsword.json => sentient_sword.json} | 0 .../itemsigilair.json => sigil_air.json} | 0 ...bloodlight.json => sigil_blood_light.json} | 0 ...itemsigilbounce.json => sigil_bounce.json} | 0 .../itemsigilclaw.json => sigil_claw.json} | 0 ...ompression.json => sigil_compression.json} | 0 ...ldivination.json => sigil_divination.json} | 0 ...ity.json => sigil_elemental_affinity.json} | 0 ...erance.json => sigil_ender_severance.json} | 0 ...ilfastminer.json => sigil_fast_miner.json} | 0 .../itemsigilfrost.json => sigil_frost.json} | 0 ...greengrove.json => sigil_green_grove.json} | 0 .../itemsigilhaste.json => sigil_haste.json} | 0 ...emsigilholding.json => sigil_holding.json} | 0 .../itemsigillava.json => sigil_lava.json} | 0 ...gilmagnetism.json => sigil_magnetism.json} | 0 ...mbridge.json => sigil_phantom_bridge.json} | 0 .../itemsigilseer.json => sigil_seer.json} | 0 ...uppression.json => sigil_suppression.json} | 0 ...eposition.json => sigil_teleposition.json} | 0 ...position.json => sigil_transposition.json} | 0 .../itemsigilvoid.json => sigil_void.json} | 0 .../itemsigilwater.json => sigil_water.json} | 0 ...gilwhirlwind.json => sigil_whirlwind.json} | 0 .../{item/itemslate.json => slate.json} | 0 .../{blocksoulforge.json => soul_forge.json} | 0 .../{item/itemsoulgem.json => soul_gem.json} | 0 .../itemsoulsnare.json => soul_snare.json} | 0 .../{blockspectral.json => spectral.json} | 0 .../{blockteleposer.json => teleposer.json} | 0 ...tionfocus.json => teleposition_focus.json} | 0 ...tspellblock.json => test_spell_block.json} | 0 ...itemupgradetome.json => upgrade_tome.json} | 0 ...gradetrainer.json => upgrade_trainer.json} | 0 .../assets/bloodmagic/lang/en_US.lang | 8 ++-- 115 files changed, 72 insertions(+), 80 deletions(-) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemactivationcrystal.json => activation_crystal.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockalchemyarray.json => alchemy_array.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockalchemytable.json => alchemy_table.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockaltar.json => altar.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemaltarmaker.json => altar_maker.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemarcaneashes.json => arcane_ashes.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemfluidrouterfilter.json => base_fluid_filter.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemrouterfilter.json => base_item_filter.json} (100%) delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/blockcrystal.json rename src/main/resources/assets/bloodmagic/blockstates/{blockbloodlight.json => blood_light.json} (100%) create mode 100644 src/main/resources/assets/bloodmagic/blockstates/blood_orb.json rename src/main/resources/assets/bloodmagic/blockstates/{blockbloodrune.json => blood_rune.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itembloodshard.json => blood_shard.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockbloodtank.json => blood_tank.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemboundaxe.json => bound_axe.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemboundpickaxe.json => bound_pickaxe.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemboundshovel.json => bound_shovel.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemboundsword.json => bound_sword.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemcomponent.json => component.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemcuttingfluid.json => cutting_fluid.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemdaggerofsacrifice.json => dagger_of_sacrifice.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockbloodstonebrick.json => decorative_brick.json} (54%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdemonbricks1.json => demon_brick_1.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdemonbricks2.json => demon_brick_2.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdemoncrucible.json => demon_crucible.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdemoncrystal.json => demon_crystal.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdemoncrystallizer.json => demon_crystallizer.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdemonextra.json => demon_extras.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdemonlight.json => demon_light.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockpillar1.json => demon_pillar_1.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockpillar2.json => demon_pillar_2.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockpillarcap1.json => demon_pillar_cap_1.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockpillarcap2.json => demon_pillar_cap_2.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockpillarcap3.json => demon_pillar_cap_3.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdemonpylon.json => demon_pylon.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockstairs1.json => demon_stairs_1.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockstairs2.json => demon_stairs_2.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockstairs3.json => demon_stairs_3.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockwall1.json => demon_wall_1.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemdemonwillgauge.json => demon_will_gauge.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockdimensionalportal.json => dimensional_portal.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemexperiencebook.json => experience_tome.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockincensealtar.json => incense_altar.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockinputroutingnode.json => input_routing_node.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/iteminscriptiontool.json => inscription_tool.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockinversionpillar.json => inversion_pillar.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockinversionpillarend.json => inversion_pillar_end.json} (100%) delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/itemblockdemoncrystal.json rename src/main/resources/assets/bloodmagic/blockstates/{item/itemdemoncrystal.json => item_demon_crystal.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemlivingarmourpointsupgrade.json => item_points_upgrade.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockitemroutingnode.json => item_routing_node.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemlavacrystal.json => lava_crystal.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blocklifeessence.json => life_essence.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemlivingarmour.json => living_armour.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockmasterroutingnode.json => master_routing_node.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockmimic.json => mimic.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemmonstersoul.json => monster_soul.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemnoderouter.json => node_router.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockoutputroutingnode.json => output_routing_node.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itempacksacrifice.json => pack_sacrifice.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itempackselfsacrifice.json => pack_self_sacrifice.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockpath.json => path.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockphantom.json => phantom.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itempotionflask.json => potion_flask.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockritualcontroller.json => ritual_controller.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemritualdiviner.json => ritual_diviner.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemritualreader.json => ritual_reader.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockritualstone.json => ritual_stone.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsacrificialdagger.json => sacrificial_dagger.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsanguinebook.json => sanguine_book.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsentientarmour.json => sentient_armour.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsentientarmourgem.json => sentient_armour_gem.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsentientaxe.json => sentient_axe.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsentientbow.json => sentient_bow.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsentientpickaxe.json => sentient_pickaxe.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsentientshovel.json => sentient_shovel.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsentientsword.json => sentient_sword.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilair.json => sigil_air.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilbloodlight.json => sigil_blood_light.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilbounce.json => sigil_bounce.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilclaw.json => sigil_claw.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilcompression.json => sigil_compression.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigildivination.json => sigil_divination.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilelementalaffinity.json => sigil_elemental_affinity.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilenderseverance.json => sigil_ender_severance.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilfastminer.json => sigil_fast_miner.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilfrost.json => sigil_frost.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilgreengrove.json => sigil_green_grove.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilhaste.json => sigil_haste.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilholding.json => sigil_holding.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigillava.json => sigil_lava.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilmagnetism.json => sigil_magnetism.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilphantombridge.json => sigil_phantom_bridge.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilseer.json => sigil_seer.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilsuppression.json => sigil_suppression.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilteleposition.json => sigil_teleposition.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigiltransposition.json => sigil_transposition.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilvoid.json => sigil_void.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilwater.json => sigil_water.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsigilwhirlwind.json => sigil_whirlwind.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemslate.json => slate.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blocksoulforge.json => soul_forge.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsoulgem.json => soul_gem.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemsoulsnare.json => soul_snare.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockspectral.json => spectral.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blockteleposer.json => teleposer.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemtelepositionfocus.json => teleposition_focus.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{blocktestspellblock.json => test_spell_block.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemupgradetome.json => upgrade_tome.json} (100%) rename src/main/resources/assets/bloodmagic/blockstates/{item/itemupgradetrainer.json => upgrade_trainer.json} (100%) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index a3184496..80b2cf1f 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -60,13 +60,14 @@ public class RegistrarBloodMagic { @SubscribeEvent public static void registerBloodOrbs(RegistryEvent.Register event) { + ResourceLocation orb = RegistrarBloodMagicItems.BLOOD_ORB.getRegistryName(); event.getRegistry().registerAll( - new BloodOrb("weak", 1, 5000).setRegistryName("weak"), - new BloodOrb("apprentice", 2, 25000).setRegistryName("apprentice"), - new BloodOrb("magician", 3, 150000).setRegistryName("magician"), - new BloodOrb("master", 4, 1000000).setRegistryName("master"), - new BloodOrb("archmage", 5, 10000000).setRegistryName("archmage"), - new BloodOrb("transcendent", 6, 30000000).setRegistryName("transcendent") + new BloodOrb("weak", 1, 5000).withModel(new ModelResourceLocation(orb, "type=weak")).setRegistryName("weak"), + new BloodOrb("apprentice", 2, 25000).withModel(new ModelResourceLocation(orb, "type=apprentice")).setRegistryName("apprentice"), + new BloodOrb("magician", 3, 150000).withModel(new ModelResourceLocation(orb, "type=magician")).setRegistryName("magician"), + new BloodOrb("master", 4, 1000000).withModel(new ModelResourceLocation(orb, "type=master")).setRegistryName("master"), + new BloodOrb("archmage", 5, 10000000).withModel(new ModelResourceLocation(orb, "type=archmage")).setRegistryName("archmage"), + new BloodOrb("transcendent", 6, 30000000).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") ); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java index 58e11bc8..82f61820 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java @@ -8,7 +8,7 @@ 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.Sets; +import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; @@ -18,7 +18,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.GameRegistry; -import java.util.Set; +import java.util.List; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @@ -66,14 +66,14 @@ public class RegistrarBloodMagicBlocks { public static final Block INVERSION_PILLAR = Blocks.AIR; public static final Block INVERSION_PILLAR_END = Blocks.AIR; - static Set blocks; + static List blocks; @SubscribeEvent public static void registerBlocks(RegistryEvent.Register event) { FluidRegistry.registerFluid(BlockLifeEssence.getLifeEssence()); FluidRegistry.addBucketForFluid(BlockLifeEssence.getLifeEssence()); - blocks = Sets.newHashSet( + blocks = Lists.newArrayList( new BlockAltar().setRegistryName("altar"), new BlockBloodRune().setRegistryName("blood_rune"), new BlockRitualController().setRegistryName("ritual_controller"), diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 3ce61755..0bbcea86 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -74,7 +74,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { @Override public void getSubItems(CreativeTabs tab, NonNullList subItems) { - if (isInCreativeTab(tab)) + if (!isInCreativeTab(tab)) return; subItems.add(Utils.setUnbreakable(new ItemStack(this))); diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index 81a701a3..0e8bb21d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -61,9 +61,10 @@ public class ItemBlockBloodTank extends ItemBlock { @SideOnly(Side.CLIENT) public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) + return; - for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) - list.add(new ItemStack(this, 1, i)); + for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) + list.add(new ItemStack(this, 1, i)); } public int getCapacity(ItemStack container) { diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemactivationcrystal.json b/src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemactivationcrystal.json rename to src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockalchemyarray.json b/src/main/resources/assets/bloodmagic/blockstates/alchemy_array.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockalchemyarray.json rename to src/main/resources/assets/bloodmagic/blockstates/alchemy_array.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockalchemytable.json b/src/main/resources/assets/bloodmagic/blockstates/alchemy_table.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockalchemytable.json rename to src/main/resources/assets/bloodmagic/blockstates/alchemy_table.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockaltar.json b/src/main/resources/assets/bloodmagic/blockstates/altar.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockaltar.json rename to src/main/resources/assets/bloodmagic/blockstates/altar.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemaltarmaker.json b/src/main/resources/assets/bloodmagic/blockstates/altar_maker.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemaltarmaker.json rename to src/main/resources/assets/bloodmagic/blockstates/altar_maker.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemarcaneashes.json b/src/main/resources/assets/bloodmagic/blockstates/arcane_ashes.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemarcaneashes.json rename to src/main/resources/assets/bloodmagic/blockstates/arcane_ashes.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemfluidrouterfilter.json b/src/main/resources/assets/bloodmagic/blockstates/base_fluid_filter.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemfluidrouterfilter.json rename to src/main/resources/assets/bloodmagic/blockstates/base_fluid_filter.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemrouterfilter.json b/src/main/resources/assets/bloodmagic/blockstates/base_item_filter.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemrouterfilter.json rename to src/main/resources/assets/bloodmagic/blockstates/base_item_filter.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockcrystal.json b/src/main/resources/assets/bloodmagic/blockstates/blockcrystal.json deleted file mode 100644 index c997259c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/blockcrystal.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "large": { - "textures": { - "all": "bloodmagic:blocks/ShardCluster" - } - }, - "brick": { - "textures": { - "all": "bloodmagic:blocks/ShardClusterBrick" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockbloodlight.json b/src/main/resources/assets/bloodmagic/blockstates/blood_light.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockbloodlight.json rename to src/main/resources/assets/bloodmagic/blockstates/blood_light.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blood_orb.json b/src/main/resources/assets/bloodmagic/blockstates/blood_orb.json new file mode 100644 index 00000000..a5c42df5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/blood_orb.json @@ -0,0 +1,41 @@ +{ + "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/blockbloodrune.json b/src/main/resources/assets/bloodmagic/blockstates/blood_rune.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockbloodrune.json rename to src/main/resources/assets/bloodmagic/blockstates/blood_rune.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itembloodshard.json b/src/main/resources/assets/bloodmagic/blockstates/blood_shard.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itembloodshard.json rename to src/main/resources/assets/bloodmagic/blockstates/blood_shard.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockbloodtank.json b/src/main/resources/assets/bloodmagic/blockstates/blood_tank.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockbloodtank.json rename to src/main/resources/assets/bloodmagic/blockstates/blood_tank.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemboundaxe.json b/src/main/resources/assets/bloodmagic/blockstates/bound_axe.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemboundaxe.json rename to src/main/resources/assets/bloodmagic/blockstates/bound_axe.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemboundpickaxe.json b/src/main/resources/assets/bloodmagic/blockstates/bound_pickaxe.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemboundpickaxe.json rename to src/main/resources/assets/bloodmagic/blockstates/bound_pickaxe.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemboundshovel.json b/src/main/resources/assets/bloodmagic/blockstates/bound_shovel.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemboundshovel.json rename to src/main/resources/assets/bloodmagic/blockstates/bound_shovel.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemboundsword.json b/src/main/resources/assets/bloodmagic/blockstates/bound_sword.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemboundsword.json rename to src/main/resources/assets/bloodmagic/blockstates/bound_sword.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemcomponent.json b/src/main/resources/assets/bloodmagic/blockstates/component.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemcomponent.json rename to src/main/resources/assets/bloodmagic/blockstates/component.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemcuttingfluid.json b/src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemcuttingfluid.json rename to src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemdaggerofsacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/dagger_of_sacrifice.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemdaggerofsacrifice.json rename to src/main/resources/assets/bloodmagic/blockstates/dagger_of_sacrifice.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockbloodstonebrick.json b/src/main/resources/assets/bloodmagic/blockstates/decorative_brick.json similarity index 54% rename from src/main/resources/assets/bloodmagic/blockstates/blockbloodstonebrick.json rename to src/main/resources/assets/bloodmagic/blockstates/decorative_brick.json index 9cce5ef3..00970ac6 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/blockbloodstonebrick.json +++ b/src/main/resources/assets/bloodmagic/blockstates/decorative_brick.json @@ -7,15 +7,25 @@ }, "variants": { "type": { - "large": { + "bloodstone_tile": { "textures": { "all": "bloodmagic:blocks/LargeBloodStoneBrick" } }, - "brick": { + "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/blockdemonbricks1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_brick_1.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks1.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_brick_1.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks2.json b/src/main/resources/assets/bloodmagic/blockstates/demon_brick_2.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdemonbricks2.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_brick_2.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrucible.json b/src/main/resources/assets/bloodmagic/blockstates/demon_crucible.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdemoncrucible.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_crucible.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystal.json b/src/main/resources/assets/bloodmagic/blockstates/demon_crystal.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystal.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_crystal.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystallizer.json b/src/main/resources/assets/bloodmagic/blockstates/demon_crystallizer.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdemoncrystallizer.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_crystallizer.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdemonextra.json b/src/main/resources/assets/bloodmagic/blockstates/demon_extras.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdemonextra.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_extras.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdemonlight.json b/src/main/resources/assets/bloodmagic/blockstates/demon_light.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdemonlight.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_light.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockpillar1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_1.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockpillar1.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_pillar_1.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockpillar2.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_2.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockpillar2.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_pillar_2.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_1.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockpillarcap1.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_1.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap2.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_2.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockpillarcap2.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_2.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockpillarcap3.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_3.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockpillarcap3.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_3.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdemonpylon.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pylon.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdemonpylon.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_pylon.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockstairs1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_1.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockstairs1.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_stairs_1.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockstairs2.json b/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_2.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockstairs2.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_stairs_2.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockstairs3.json b/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_3.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockstairs3.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_stairs_3.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockwall1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_wall_1.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockwall1.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_wall_1.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemdemonwillgauge.json b/src/main/resources/assets/bloodmagic/blockstates/demon_will_gauge.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemdemonwillgauge.json rename to src/main/resources/assets/bloodmagic/blockstates/demon_will_gauge.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json b/src/main/resources/assets/bloodmagic/blockstates/dimensional_portal.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockdimensionalportal.json rename to src/main/resources/assets/bloodmagic/blockstates/dimensional_portal.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemexperiencebook.json b/src/main/resources/assets/bloodmagic/blockstates/experience_tome.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemexperiencebook.json rename to src/main/resources/assets/bloodmagic/blockstates/experience_tome.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockincensealtar.json b/src/main/resources/assets/bloodmagic/blockstates/incense_altar.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockincensealtar.json rename to src/main/resources/assets/bloodmagic/blockstates/incense_altar.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockinputroutingnode.json b/src/main/resources/assets/bloodmagic/blockstates/input_routing_node.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockinputroutingnode.json rename to src/main/resources/assets/bloodmagic/blockstates/input_routing_node.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/iteminscriptiontool.json b/src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/iteminscriptiontool.json rename to src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockinversionpillar.json b/src/main/resources/assets/bloodmagic/blockstates/inversion_pillar.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockinversionpillar.json rename to src/main/resources/assets/bloodmagic/blockstates/inversion_pillar.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockinversionpillarend.json b/src/main/resources/assets/bloodmagic/blockstates/inversion_pillar_end.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockinversionpillarend.json rename to src/main/resources/assets/bloodmagic/blockstates/inversion_pillar_end.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemblockdemoncrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item/itemblockdemoncrystal.json deleted file mode 100644 index 492f59ee..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item/itemblockdemoncrystal.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "bloodmagic:crystal/Crystal1.obj", - "custom": { "flip-v": true }, - "transform": { - "translation": [ 0, 0, 1] - } - }, - "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" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemdemoncrystal.json b/src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemdemoncrystal.json rename to src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmourpointsupgrade.json b/src/main/resources/assets/bloodmagic/blockstates/item_points_upgrade.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmourpointsupgrade.json rename to src/main/resources/assets/bloodmagic/blockstates/item_points_upgrade.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockitemroutingnode.json b/src/main/resources/assets/bloodmagic/blockstates/item_routing_node.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockitemroutingnode.json rename to src/main/resources/assets/bloodmagic/blockstates/item_routing_node.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemlavacrystal.json b/src/main/resources/assets/bloodmagic/blockstates/lava_crystal.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemlavacrystal.json rename to src/main/resources/assets/bloodmagic/blockstates/lava_crystal.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blocklifeessence.json b/src/main/resources/assets/bloodmagic/blockstates/life_essence.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blocklifeessence.json rename to src/main/resources/assets/bloodmagic/blockstates/life_essence.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmour.json b/src/main/resources/assets/bloodmagic/blockstates/living_armour.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemlivingarmour.json rename to src/main/resources/assets/bloodmagic/blockstates/living_armour.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockmasterroutingnode.json b/src/main/resources/assets/bloodmagic/blockstates/master_routing_node.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockmasterroutingnode.json rename to src/main/resources/assets/bloodmagic/blockstates/master_routing_node.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockmimic.json b/src/main/resources/assets/bloodmagic/blockstates/mimic.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockmimic.json rename to src/main/resources/assets/bloodmagic/blockstates/mimic.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemmonstersoul.json b/src/main/resources/assets/bloodmagic/blockstates/monster_soul.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemmonstersoul.json rename to src/main/resources/assets/bloodmagic/blockstates/monster_soul.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemnoderouter.json b/src/main/resources/assets/bloodmagic/blockstates/node_router.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemnoderouter.json rename to src/main/resources/assets/bloodmagic/blockstates/node_router.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockoutputroutingnode.json b/src/main/resources/assets/bloodmagic/blockstates/output_routing_node.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockoutputroutingnode.json rename to src/main/resources/assets/bloodmagic/blockstates/output_routing_node.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itempacksacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/pack_sacrifice.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itempacksacrifice.json rename to src/main/resources/assets/bloodmagic/blockstates/pack_sacrifice.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itempackselfsacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/pack_self_sacrifice.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itempackselfsacrifice.json rename to src/main/resources/assets/bloodmagic/blockstates/pack_self_sacrifice.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockpath.json b/src/main/resources/assets/bloodmagic/blockstates/path.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockpath.json rename to src/main/resources/assets/bloodmagic/blockstates/path.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockphantom.json b/src/main/resources/assets/bloodmagic/blockstates/phantom.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockphantom.json rename to src/main/resources/assets/bloodmagic/blockstates/phantom.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json b/src/main/resources/assets/bloodmagic/blockstates/potion_flask.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itempotionflask.json rename to src/main/resources/assets/bloodmagic/blockstates/potion_flask.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json b/src/main/resources/assets/bloodmagic/blockstates/ritual_controller.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockritualcontroller.json rename to src/main/resources/assets/bloodmagic/blockstates/ritual_controller.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemritualdiviner.json b/src/main/resources/assets/bloodmagic/blockstates/ritual_diviner.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemritualdiviner.json rename to src/main/resources/assets/bloodmagic/blockstates/ritual_diviner.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemritualreader.json b/src/main/resources/assets/bloodmagic/blockstates/ritual_reader.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemritualreader.json rename to src/main/resources/assets/bloodmagic/blockstates/ritual_reader.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockritualstone.json b/src/main/resources/assets/bloodmagic/blockstates/ritual_stone.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockritualstone.json rename to src/main/resources/assets/bloodmagic/blockstates/ritual_stone.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsacrificialdagger.json b/src/main/resources/assets/bloodmagic/blockstates/sacrificial_dagger.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsacrificialdagger.json rename to src/main/resources/assets/bloodmagic/blockstates/sacrificial_dagger.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsanguinebook.json b/src/main/resources/assets/bloodmagic/blockstates/sanguine_book.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsanguinebook.json rename to src/main/resources/assets/bloodmagic/blockstates/sanguine_book.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmour.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_armour.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmour.json rename to src/main/resources/assets/bloodmagic/blockstates/sentient_armour.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmourgem.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_armour_gem.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsentientarmourgem.json rename to src/main/resources/assets/bloodmagic/blockstates/sentient_armour_gem.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientaxe.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_axe.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsentientaxe.json rename to src/main/resources/assets/bloodmagic/blockstates/sentient_axe.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientbow.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_bow.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsentientbow.json rename to src/main/resources/assets/bloodmagic/blockstates/sentient_bow.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientpickaxe.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_pickaxe.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsentientpickaxe.json rename to src/main/resources/assets/bloodmagic/blockstates/sentient_pickaxe.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientshovel.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_shovel.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsentientshovel.json rename to src/main/resources/assets/bloodmagic/blockstates/sentient_shovel.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsentientsword.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_sword.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsentientsword.json rename to src/main/resources/assets/bloodmagic/blockstates/sentient_sword.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilair.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_air.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilair.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_air.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbloodlight.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbloodlight.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbounce.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_bounce.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilbounce.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_bounce.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilclaw.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_claw.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilclaw.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_claw.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilcompression.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_compression.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilcompression.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_compression.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigildivination.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigildivination.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilelementalaffinity.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_elemental_affinity.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilelementalaffinity.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_elemental_affinity.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilenderseverance.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_ender_severance.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilenderseverance.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_ender_severance.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfastminer.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_fast_miner.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfastminer.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_fast_miner.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfrost.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_frost.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilfrost.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_frost.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilgreengrove.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_green_grove.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilgreengrove.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_green_grove.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilhaste.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_haste.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilhaste.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_haste.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilholding.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_holding.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilholding.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_holding.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigillava.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_lava.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigillava.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_lava.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilmagnetism.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_magnetism.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilmagnetism.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_magnetism.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilphantombridge.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_phantom_bridge.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilphantombridge.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_phantom_bridge.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilseer.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_seer.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilseer.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_seer.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilsuppression.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_suppression.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilsuppression.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_suppression.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilteleposition.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_teleposition.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilteleposition.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_teleposition.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigiltransposition.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_transposition.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigiltransposition.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_transposition.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilvoid.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_void.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilvoid.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_void.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwater.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_water.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwater.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_water.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwhirlwind.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_whirlwind.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsigilwhirlwind.json rename to src/main/resources/assets/bloodmagic/blockstates/sigil_whirlwind.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemslate.json b/src/main/resources/assets/bloodmagic/blockstates/slate.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemslate.json rename to src/main/resources/assets/bloodmagic/blockstates/slate.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blocksoulforge.json b/src/main/resources/assets/bloodmagic/blockstates/soul_forge.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blocksoulforge.json rename to src/main/resources/assets/bloodmagic/blockstates/soul_forge.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsoulgem.json b/src/main/resources/assets/bloodmagic/blockstates/soul_gem.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsoulgem.json rename to src/main/resources/assets/bloodmagic/blockstates/soul_gem.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemsoulsnare.json b/src/main/resources/assets/bloodmagic/blockstates/soul_snare.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemsoulsnare.json rename to src/main/resources/assets/bloodmagic/blockstates/soul_snare.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockspectral.json b/src/main/resources/assets/bloodmagic/blockstates/spectral.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockspectral.json rename to src/main/resources/assets/bloodmagic/blockstates/spectral.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blockteleposer.json b/src/main/resources/assets/bloodmagic/blockstates/teleposer.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blockteleposer.json rename to src/main/resources/assets/bloodmagic/blockstates/teleposer.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemtelepositionfocus.json b/src/main/resources/assets/bloodmagic/blockstates/teleposition_focus.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemtelepositionfocus.json rename to src/main/resources/assets/bloodmagic/blockstates/teleposition_focus.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/blocktestspellblock.json b/src/main/resources/assets/bloodmagic/blockstates/test_spell_block.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/blocktestspellblock.json rename to src/main/resources/assets/bloodmagic/blockstates/test_spell_block.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetome.json b/src/main/resources/assets/bloodmagic/blockstates/upgrade_tome.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetome.json rename to src/main/resources/assets/bloodmagic/blockstates/upgrade_tome.json diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetrainer.json b/src/main/resources/assets/bloodmagic/blockstates/upgrade_trainer.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item/itemupgradetrainer.json rename to src/main/resources/assets/bloodmagic/blockstates/upgrade_trainer.json diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 2b382440..77faec66 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -224,10 +224,10 @@ 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.bloodstonebrick.large.name=Large Bloodstone Brick -tile.bloodmagic.bloodstonebrick.brick.name=Bloodstone Brick -tile.bloodmagic.crystal.large.name=Crystal Cluster -tile.bloodmagic.crystal.brick.name=Crystal Cluster Brick +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 From 37ec0582ebee16cb06d168501ead4a0bf6b301cb Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 16 Aug 2017 16:39:57 -0700 Subject: [PATCH 128/595] Fixed the last of the model errors --- .../java/WayofTime/bloodmagic/BloodMagic.java | 4 +- .../bloodmagic/block/BlockDemonCrystal.java | 9 +--- .../bloodmagic/block/BlockRoutingNode.java | 12 ++++- .../mesh/CustomMeshDefinitionActivatable.java | 4 +- .../mesh/CustomMeshDefinitionMultiWill.java | 4 +- .../mesh/CustomMeshDefinitionWillGem.java | 4 +- .../guideapi/book/CategoryArchitect.java | 2 +- .../core/RegistrarBloodMagicBlocks.java | 15 +++++++ .../core/RegistrarBloodMagicItems.java | 36 ++++++++++----- .../bloodmagic/item/ItemBoundAxe.java | 2 +- .../bloodmagic/item/ItemBoundPickaxe.java | 2 +- .../bloodmagic/item/ItemBoundShovel.java | 2 +- .../bloodmagic/item/ItemBoundSword.java | 2 +- .../bloodmagic/item/ItemPotionFlask.java | 2 +- .../item/ItemSacrificialDagger.java | 17 +++---- .../item/armour/ItemLivingArmour.java | 30 ++++++------- .../item/armour/ItemSentientArmour.java | 36 +++++++-------- .../item/block/ItemBlockAlchemyTable.java | 12 ++++- .../item/sigil/ItemSigilBloodLight.java | 2 +- .../sigil/ItemSigilElementalAffinity.java | 2 +- .../item/sigil/ItemSigilEnderSeverance.java | 2 +- .../item/sigil/ItemSigilFastMiner.java | 2 +- .../item/sigil/ItemSigilGreenGrove.java | 2 +- .../item/sigil/ItemSigilPhantomBridge.java | 2 +- .../item/sigil/ItemSigilToggleableBase.java | 3 +- .../item/soul/ItemSentientArmourGem.java | 44 ++++++++++++------- .../bloodmagic/item/soul/ItemSentientAxe.java | 2 +- .../bloodmagic/item/soul/ItemSentientBow.java | 11 ++++- .../item/soul/ItemSentientPickaxe.java | 2 +- .../item/soul/ItemSentientShovel.java | 2 +- .../item/soul/ItemSentientSword.java | 2 +- .../bloodmagic/item/soul/ItemSoulGem.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 2 +- ...oints_upgrade.json => points_upgrade.json} | 0 .../assets/bloodmagic/lang/en_US.lang | 20 ++++----- ...itemsentientbow.json => sentient_bow.json} | 0 36 files changed, 176 insertions(+), 121 deletions(-) rename src/main/resources/assets/bloodmagic/blockstates/{item_points_upgrade.json => points_upgrade.json} (100%) rename src/main/resources/assets/bloodmagic/models/item/{itemsentientbow.json => sentient_bow.json} (100%) diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 39cc385d..4957a1be 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic; import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.util.helper.LogHelper; import WayofTime.bloodmagic.api_impl.BloodMagicAPI; @@ -8,6 +9,7 @@ import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; import WayofTime.bloodmagic.apiv2.IBloodMagicPlugin; 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; @@ -40,7 +42,7 @@ public class BloodMagic { public static final CreativeTabs TAB_BM = new CreativeTabs(MODID + ".creativeTab") { @Override public ItemStack getTabIconItem() { - return new ItemStack(RegistrarBloodMagicItems.BLOOD_ORB); + return OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK); } }; public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index a6964776..95352a33 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -4,7 +4,6 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.item.ItemDemonCrystal; -import WayofTime.bloodmagic.item.block.ItemBlockDemonCrystal; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -14,7 +13,6 @@ import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; @@ -28,7 +26,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; import java.util.Random; -public class BlockDemonCrystal extends Block implements IBMBlock { +public class BlockDemonCrystal extends Block { 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", EnumFacing.class); @@ -179,11 +177,6 @@ public class BlockDemonCrystal extends Block implements IBMBlock { return new TileDemonCrystal(); } - @Override - public ItemBlock getItem() { - return new ItemBlockDemonCrystal(this); - } - public static ItemStack getItemStackDropped(EnumDemonWillType type, int crystalNumber) { ItemStack stack = null; switch (type) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java index 30426072..773d98b9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java @@ -1,8 +1,10 @@ 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 com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyBool; @@ -17,8 +19,11 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import org.apache.commons.lang3.tuple.Pair; -public class BlockRoutingNode extends Block implements IBMBlock { +import java.util.List; + +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"); @@ -125,4 +130,9 @@ public class BlockRoutingNode extends Block implements IBMBlock { public ItemBlock getItem() { return new ItemBlock(this); } + + @Override + public List> getVariants() { + return Lists.newArrayList(Pair.of(0, "inventory")); + } } diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java index f7576cd2..27f9f414 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java @@ -18,8 +18,8 @@ public class CustomMeshDefinitionActivatable implements ItemMeshDefinition { 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, "item/" + name), "active=true"); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "active=true"); - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "active=false"); + 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 index 57c5cd8f..89267744 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java @@ -19,9 +19,9 @@ public class CustomMeshDefinitionMultiWill implements ItemMeshDefinition { 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, "item/" + name), "type=" + type.getName().toLowerCase()); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "type=" + type.getName().toLowerCase()); } - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "type=default"); + 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 index 907a6cea..ea2d04e2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java @@ -20,9 +20,9 @@ public class CustomMeshDefinitionWillGem implements ItemMeshDefinition { 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, "item/" + name), "type=" + ItemSoulGem.names[stack.getItemDamage()] + "_" + type.getName().toLowerCase()); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "type=" + ItemSoulGem.names[stack.getItemDamage()] + "_" + type.getName().toLowerCase()); } - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), "type=petty_default"); + return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "type=petty_default"); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index 25ce9177..ba1b8d31 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -410,7 +410,7 @@ public class CategoryArchitect { livingArmourPages.add(bindingRecipePage); } - bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS)); + bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS)); if (bindingRecipePage != null) { livingArmourPages.add(bindingRecipePage); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java index 82f61820..92544f16 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java @@ -11,7 +11,12 @@ import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.block.statemap.StateMapperBase; import net.minecraft.init.Blocks; +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; @@ -122,6 +127,16 @@ public class RegistrarBloodMagicBlocks { registerTiles(); } + @SubscribeEvent + public static void registerModels(ModelRegistryEvent event) { + ModelLoader.setCustomStateMapper(LIFE_ESSENCE, new StateMapperBase() { + @Override + protected ModelResourceLocation getModelResourceLocation(IBlockState state) { + return new ModelResourceLocation(state.getBlock().getRegistryName(), "fluid"); + } + }); + } + private static void registerTiles() { GameRegistry.registerTileEntity(TileAltar.class, BloodMagic.MODID + ":" + TileAltar.class.getSimpleName()); GameRegistry.registerTileEntity(TileImperfectRitualStone.class, BloodMagic.MODID + ":" + TileImperfectRitualStone.class.getSimpleName()); diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 1cc3cd7c..d12b7bce 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -2,6 +2,7 @@ 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; @@ -83,11 +84,11 @@ public class RegistrarBloodMagicItems { 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_LEGS = 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_LEGS = 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; @@ -169,11 +170,11 @@ public class RegistrarBloodMagicItems { new ItemTelepositionFocus().setRegistryName("teleposition_focus"), new ItemExperienceBook().setRegistryName("experience_tome"), new ItemBloodShard().setRegistryName("blood_shard"), - new ItemLivingArmour(EntityEquipmentSlot.HEAD).setRegistryName("living_armour_helm"), + new ItemLivingArmour(EntityEquipmentSlot.HEAD).setRegistryName("living_armour_helmet"), new ItemLivingArmour(EntityEquipmentSlot.CHEST).setRegistryName("living_armour_chest"), new ItemLivingArmour(EntityEquipmentSlot.LEGS).setRegistryName("living_armour_leggings"), new ItemLivingArmour(EntityEquipmentSlot.FEET).setRegistryName("living_armour_boots"), - new ItemSentientArmour(EntityEquipmentSlot.HEAD).setRegistryName("sentient_armour_helm"), + new ItemSentientArmour(EntityEquipmentSlot.HEAD).setRegistryName("sentient_armour_helmet"), new ItemSentientArmour(EntityEquipmentSlot.CHEST).setRegistryName("sentient_armour_chest"), new ItemSentientArmour(EntityEquipmentSlot.LEGS).setRegistryName("sentient_armour_leggings"), new ItemSentientArmour(EntityEquipmentSlot.FEET).setRegistryName("sentient_armour_boots"), @@ -206,19 +207,30 @@ public class RegistrarBloodMagicItems { @SideOnly(Side.CLIENT) @SubscribeEvent public static void registerRenders(ModelRegistryEvent event) { - items.stream().filter(i -> i instanceof IVariantProvider).forEach(item -> { - IVariantProvider variantProvider = (IVariantProvider) item; + items.stream().filter(i -> i instanceof IVariantProvider).forEach(i -> { + IVariantProvider variantProvider = (IVariantProvider) i; for (Pair variant : variantProvider.getVariants()) - ModelLoader.setCustomModelResourceLocation(item, variant.getLeft(), new ModelResourceLocation(item.getRegistryName(), variant.getRight())); + ModelLoader.setCustomModelResourceLocation(i, variant.getLeft(), new ModelResourceLocation(i.getRegistryName(), variant.getRight())); }); - RegistrarBloodMagicBlocks.blocks.stream().filter(i -> i instanceof IVariantProvider).forEach(block -> { - IVariantProvider variantProvider = (IVariantProvider) block; - for (Pair variant : variantProvider.getVariants()) - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), variant.getLeft(), new ModelResourceLocation(block.getRegistryName(), variant.getRight())); + items.stream().filter(i -> i instanceof IMeshProvider).forEach(i -> { + IMeshProvider mesh = (IMeshProvider) i; + ResourceLocation loc = mesh.getCustomLocation(); + if (loc == null) + loc = i.getRegistryName(); + for (String variant : mesh.getVariants()) + ModelLoader.registerItemVariants(i, new ModelResourceLocation(loc, variant)); + + ModelLoader.setCustomMeshDefinition(i, mesh.getMeshDefinition()); }); - final ResourceLocation holdingLoc = new ResourceLocation("bloodmagic", "item/ItemSigilHolding"); + RegistrarBloodMagicBlocks.blocks.stream().filter(b -> b instanceof IVariantProvider).forEach(b -> { + IVariantProvider variantProvider = (IVariantProvider) b; + for (Pair variant : variantProvider.getVariants()) + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(b), variant.getLeft(), new ModelResourceLocation(b.getRegistryName(), variant.getRight())); + }); + + final ResourceLocation holdingLoc = SIGIL_HOLDING.getRegistryName(); ModelLoader.setCustomMeshDefinition(SIGIL_HOLDING, stack -> { if (stack.hasTagCompound() && stack.getTagCompound().hasKey("color")) return new ModelResourceLocation(holdingLoc, "type=color"); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 47d13a14..26831f4c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -120,7 +120,7 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("ItemBoundAxe"); + return new CustomMeshDefinitionActivatable("bound_axe"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index bb1a1ccf..bc2c47f3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -133,7 +133,7 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("ItemBoundPickaxe"); + return new CustomMeshDefinitionActivatable("bound_pickaxe"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index 1f621468..c122d617 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -119,7 +119,7 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("ItemBoundShovel"); + return new CustomMeshDefinitionActivatable("bound_shovel"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 339d6d9b..cf6a8809 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -130,7 +130,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("ItemBoundSword"); + return new CustomMeshDefinitionActivatable("bound_sword"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index 4cd45ea4..3f5e15ac 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -127,7 +127,7 @@ public class ItemPotionFlask extends Item implements IMeshProvider { boolean full = true; if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) full = false; - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + getRegistryName().getResourcePath()), "full=" + (full ? "true" : "false")); + return new ModelResourceLocation(getRegistryName(), "full=" + full); }; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index e8c841ca..ba46d284 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -170,18 +170,15 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider { @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new ItemMeshDefinition() { - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) { - String variant = "type=normal"; - if (stack.getItemDamage() != 0) - variant = "type=creative"; + return stack -> { + String variant = "type=normal"; + if (stack.getItemDamage() != 0) + variant = "type=creative"; - if (canUseForSacrifice(stack)) - variant = "type=ceremonial"; + if (canUseForSacrifice(stack)) + variant = "type=ceremonial"; - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/ItemSacrificialDagger"), variant); - } + return new ModelResourceLocation(getRegistryName(), variant); }; } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index a7af1f03..bfd67b55 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -76,7 +76,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return "bloodmagic:models/armor/livingArmour_layer_1.png"; } - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { + if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS) { return "bloodmagic:models/armor/livingArmour_layer_2.png"; } else { return null; @@ -107,7 +107,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS || this == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) { damageAmount = 3d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { + } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS) { damageAmount = 6d / 20d * 0.6; } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { damageAmount = 0.64; @@ -182,7 +182,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return 8; } - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS) { + if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS) { return 6; } @@ -348,25 +348,21 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new ItemMeshDefinition() { - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) { - assert getCustomLocation() != null; - 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_LEGS) - return new ModelResourceLocation(getCustomLocation(), "armour=leg"); - else - return new ModelResourceLocation(getCustomLocation(), "armour=feet"); - } + 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, "item/ItemLivingArmour"); + return new ResourceLocation(BloodMagic.MODID, "living_armour"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index 7933de3a..962a6272 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -76,7 +76,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes return "bloodmagic:models/armor/sentientArmour_layer_1.png"; } - if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { + if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS) { switch (this.getCurrentType(stack)) { case DEFAULT: return "bloodmagic:models/armor/sentientArmour_layer_2.png"; @@ -142,7 +142,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS || this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) { damageAmount = 3d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { + } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS) { damageAmount = 6d / 20d * 0.6; } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { damageAmount = 0.64; @@ -207,7 +207,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes return 8; } - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGS) { + if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS) { return 6; } @@ -277,27 +277,23 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new ItemMeshDefinition() { - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) { - assert getCustomLocation() != null; - 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_LEGS) - return new ModelResourceLocation(getCustomLocation(), "armour=leg" + additional); - else - return new ModelResourceLocation(getCustomLocation(), "armour=feet" + additional); - } + 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, "item/ItemSentientArmour"); + return new ResourceLocation(BloodMagic.MODID, "sentient_armour"); } @Override @@ -557,7 +553,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes { 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_LEGS).getSubstituteStack(type, will, leggingsStack); + ItemStack omegaLeggingsStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS).getSubstituteStack(type, will, leggingsStack); ItemStack omegaBootsStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS).getSubstituteStack(type, will, bootsStack); player.setItemStackToSlot(EntityEquipmentSlot.HEAD, omegaHelmetStack); diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java index c82c92e8..6f082408 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java @@ -1,6 +1,8 @@ package WayofTime.bloodmagic.item.block; +import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileAlchemyTable; +import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -10,8 +12,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import org.apache.commons.lang3.tuple.Pair; -public class ItemBlockAlchemyTable extends ItemBlock { +import java.util.List; + +public class ItemBlockAlchemyTable extends ItemBlock implements IVariantProvider { public ItemBlockAlchemyTable(Block block) { super(block); } @@ -57,4 +62,9 @@ public class ItemBlockAlchemyTable extends ItemBlock { return true; } + + @Override + public List> getVariants() { + return Lists.newArrayList(Pair.of(0, "inventory")); + } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 8dc2d99f..5f9fd16a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -19,7 +19,7 @@ import net.minecraft.world.World; public class ItemSigilBloodLight extends ItemSigilBase { public ItemSigilBloodLight() { - super("bloodLight", 10); + super("blood_light", 10); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java index 8a08ec4f..e28a310f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java @@ -9,7 +9,7 @@ import net.minecraft.world.World; public class ItemSigilElementalAffinity extends ItemSigilToggleableBase { public ItemSigilElementalAffinity() { - super("elementalAffinity", 200); + super("elemental_affinity", 200); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java index 7a7def1a..855c29ab 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java @@ -13,7 +13,7 @@ import java.util.List; public class ItemSigilEnderSeverance extends ItemSigilToggleableBase { public ItemSigilEnderSeverance() { - super("enderSeverance", 200); + super("ender_severance", 200); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java index ad8be9f3..8c6b1a27 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -14,7 +14,7 @@ import java.util.List; public class ItemSigilFastMiner extends ItemSigilToggleableBase { public ItemSigilFastMiner() { - super("fastMiner", 100); + super("fast_miner", 100); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java index e5d05dcc..842b69ad 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java @@ -16,7 +16,7 @@ import net.minecraftforge.fml.common.eventhandler.Event.Result; public class ItemSigilGreenGrove extends ItemSigilToggleableBase { public ItemSigilGreenGrove() { - super("greenGrove", 150); + super("green_grove", 150); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java index 53a6cedd..61631c72 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java @@ -17,7 +17,7 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { private int range = 3; public ItemSigilPhantomBridge() { - super("phantomBridge", 100); + super("phantom_bridge", 100); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index d151c19c..7590fc19 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -19,6 +19,7 @@ import org.apache.commons.lang3.text.WordUtils; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.Locale; public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMeshProvider { protected final String tooltipBase; @@ -49,7 +50,7 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("ItemSigil" + WordUtils.capitalize(name)); + return new CustomMeshDefinitionActivatable("sigil_" + name.toLowerCase(Locale.ROOT)); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index 9c9ca878..e25ae539 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -3,20 +3,24 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; +import com.google.common.collect.Lists; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -public class ItemSentientArmourGem extends Item { +import javax.annotation.Nullable; +import java.util.List; + +public class ItemSentientArmourGem extends Item implements IMeshProvider { public ItemSentientArmourGem() { super(); @@ -53,19 +57,29 @@ public class ItemSentientArmourGem extends Item { } @SideOnly(Side.CLIENT) - public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) { - boolean hasSentientArmour = false; - NonNullList armourInventory = player.inventory.armorInventory; - for (ItemStack armourStack : armourInventory) { - if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) { - hasSentientArmour = true; + @Override + public ItemMeshDefinition getMeshDefinition() { + return stack -> { + boolean flag = false; + NonNullList armourInventory = Minecraft.getMinecraft().player.inventory.armorInventory; + for (ItemStack armourStack : armourInventory) { + if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) { + flag = true; + } } - } - if (hasSentientArmour) { - return new ModelResourceLocation("bloodmagic:ItemSentientArmourGem1", "inventory"); - } + return new ModelResourceLocation(stack.getItem().getRegistryName(), "type=" + (flag ? "" : "de") + "activated"); + }; + } + @Override + public List getVariants() { + return Lists.newArrayList("type=activated", "type=deactivated"); + } + + @Nullable + @Override + public ResourceLocation getCustomLocation() { return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 13f9d254..c2b82f28 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -297,7 +297,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("ItemSentientAxe"); + return new CustomMeshDefinitionMultiWill("sentient_axe"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 93591ef5..97b87625 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -7,9 +7,11 @@ import WayofTime.bloodmagic.api.iface.ISentientTool; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; +import com.google.common.collect.Lists; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -32,10 +34,12 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import org.apache.commons.lang3.tuple.Pair; +import java.util.List; import java.util.Locale; -public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentientTool//, IMeshProvider +public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentientTool, IVariantProvider//, IMeshProvider { public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; public static double[] defaultDamageAdded = new double[]{0.25, 0.5, 0.75, 1, 1.25}; @@ -248,6 +252,11 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien return super.onItemRightClick(world, player, hand); } + @Override + public List> getVariants() { + return Lists.newArrayList(Pair.of(0, "inventory")); + } + public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) { EnumDemonWillType type = this.getCurrentType(stack); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 75e2ee13..05c51b19 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -296,7 +296,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("ItemSentientPickaxe"); + return new CustomMeshDefinitionMultiWill("sentient_pickaxe"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index 6a99d001..2edd2b73 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -297,7 +297,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("ItemSentientShovel"); + return new CustomMeshDefinitionMultiWill("sentient_shovel"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 63f6f0bd..4753c957 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -272,7 +272,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("ItemSentientSword"); + return new CustomMeshDefinitionMultiWill("sentient_shovel"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index b7150d83..a4095e15 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -61,7 +61,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionWillGem("ItemSoulGem"); + return new CustomMeshDefinitionWillGem("soul_gem"); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index f88962e2..30cde112 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -256,7 +256,7 @@ public class ModRecipes { AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_SHOVEL), new AlchemyArrayEffectBinding("boundShovel", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)))); AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_HELMET), new AlchemyArrayEffectBinding("livingHelmet", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET))); AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_CHESTPLATE), new AlchemyArrayEffectBinding("livingChest", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_LEGGINGS), new AlchemyArrayEffectBinding("livingLegs", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGS))); + AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_LEGGINGS), new AlchemyArrayEffectBinding("livingLegs", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS))); AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_BOOTS), new AlchemyArrayEffectBinding("livingBoots", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS))); AlchemyArrayRecipeRegistry.registerCraftingRecipe(new ItemStack(Items.REDSTONE), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); diff --git a/src/main/resources/assets/bloodmagic/blockstates/item_points_upgrade.json b/src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json similarity index 100% rename from src/main/resources/assets/bloodmagic/blockstates/item_points_upgrade.json rename to src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 77faec66..1c8ac9bf 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -120,22 +120,22 @@ item.bloodmagic.monsterSoul.vengeful.name=Vengeful Demonic Will item.bloodmagic.monsterSoul.steadfast.name=Steadfast Demonic Will item.bloodmagic.sigil.air.name=Air Sigil -item.bloodmagic.sigil.bloodLight.name=Sigil of the Blood Lamp +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.greenGrove.name=Sigil of the Green Grove +item.bloodmagic.sigil.green_grove.name=Sigil of the Green Grove item.bloodmagic.sigil.elementalAffinity.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.fastMiner.name=Sigil of the Fast Miner +item.bloodmagic.sigil.fast_miner.name=Sigil of the Fast Miner item.bloodmagic.sigil.seer.name=Seer's Sigil -item.bloodmagic.sigil.phantomBridge.name=Sigil of the Phantom Bridge +item.bloodmagic.sigil.phantom_bridge.name=Sigil of the Phantom Bridge item.bloodmagic.sigil.whirlwind.name=Sigil of the Whirlwind -item.bloodmagic.sigil.enderSeverance.name=Sigil of Ender Severance +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 @@ -389,7 +389,7 @@ tooltip.bloodmagic.activated=Activated tooltip.bloodmagic.deactivated=Deactivated tooltip.bloodmagic.sigil.air.desc=&oI feel lighter already... -tooltip.bloodmagic.sigil.bloodLight.desc=&oI see a light! +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 @@ -402,11 +402,11 @@ 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.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.fastMiner.desc=&oKeep mining, and mining... +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 @@ -418,9 +418,9 @@ 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.phantom_bridge.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.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 diff --git a/src/main/resources/assets/bloodmagic/models/item/itemsentientbow.json b/src/main/resources/assets/bloodmagic/models/item/sentient_bow.json similarity index 100% rename from src/main/resources/assets/bloodmagic/models/item/itemsentientbow.json rename to src/main/resources/assets/bloodmagic/models/item/sentient_bow.json From a10b2ece9a5775cad8e4edf9f20660d2a14889fc Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 16 Aug 2017 17:29:24 -0700 Subject: [PATCH 129/595] Fixed altar detection --- .../bloodmagic/altar/BloodAltar.java | 39 ++++++++----------- .../bloodmagic/api_impl/BloodMagicAPI.java | 14 ++++--- .../bloodmagic/item/ItemAltarMaker.java | 20 +++++----- .../WayofTime/bloodmagic/util/PluginUtil.java | 2 + .../models/item/blockalchemyarray.json | 10 ----- .../models/item/blockbloodlight.json | 10 ----- .../models/item/blockdimensionalportal.json | 22 ----------- .../models/item/blockpedestal0.json | 10 ----- .../models/item/blockpedestal1.json | 10 ----- .../bloodmagic/models/item/blockphantom.json | 10 ----- .../bloodmagic/models/item/blockspectral.json | 10 ----- .../bloodmagic/models/item/itembloodorb.json | 6 --- .../models/item/itembloodorbapprentice.json | 6 --- .../models/item/itembloodorbarchmage.json | 6 --- .../models/item/itembloodorbmagician.json | 6 --- .../models/item/itembloodorbmaster.json | 6 --- .../models/item/itembloodorbtranscendent.json | 6 --- .../models/item/itembloodorbweak.json | 6 --- .../bloodmagic/models/item/itemmodelbase.json | 3 -- .../models/item/itemsentientarmourgem0.json | 11 ------ .../models/item/itemsentientarmourgem1.json | 12 ------ .../bloodmagic/models/item/itemtoolbase.json | 15 ------- 22 files changed, 36 insertions(+), 204 deletions(-) delete mode 100644 src/main/resources/assets/bloodmagic/models/item/blockalchemyarray.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/blockbloodlight.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/blockdimensionalportal.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/blockpedestal0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/blockpedestal1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/blockphantom.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/blockspectral.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorb.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbapprentice.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbarchmage.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbmagician.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbmaster.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbtranscendent.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itembloodorbweak.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itemmodelbase.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem0.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem1.json delete mode 100644 src/main/resources/assets/bloodmagic/models/item/itemtoolbase.json diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 23cc695f..b4846dfa 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -653,17 +653,16 @@ public class BloodAltar implements IFluidHandler { BlockPos componentPos = worldPos.add(altarComponent.getOffset()); IBlockState state = world.getBlockState(componentPos); - if (altarComponent.getComponent() == EnumAltarComponent.NOTAIR && world.isAirBlock(componentPos)) - return false; + if (altarComponent.getComponent() != EnumAltarComponent.NOTAIR) { + if (state.getBlock() instanceof IAltarComponent) { + EnumAltarComponent component = ((IAltarComponent) state.getBlock()).getType(world, state, componentPos); + if (component == null || component != altarComponent.getComponent()) + return false; + } - if (state.getBlock() instanceof IAltarComponent) { - EnumAltarComponent component = ((IAltarComponent) state.getBlock()).getType(world, state, componentPos); - if (component == null || component != altarComponent.getComponent()) + if (!BloodMagicAPI.INSTANCE.getComponentStates(altarComponent.getComponent()).contains(state)) return false; - } - - EnumAltarComponent component = BloodMagicAPI.INSTANCE.getAltarComponents().get(state); - if (component == null || component != altarComponent.getComponent()) + } else if (world.isAirBlock(componentPos)) return false; } @@ -671,28 +670,24 @@ public class BloodAltar implements IFluidHandler { } public static Pair getAltarMissingBlock(World world, BlockPos worldPos, int altarTier) { - if (altarTier >= EnumAltarTier.MAXTIERS) { + if (altarTier >= EnumAltarTier.MAXTIERS) return null; - } for (AltarComponent altarComponent : EnumAltarTier.values()[altarTier].getAltarComponents()) { BlockPos componentPos = worldPos.add(altarComponent.getOffset()); - BlockStack worldBlock = new BlockStack(world.getBlockState(componentPos).getBlock(), world.getBlockState(componentPos).getBlock().getMetaFromState(world.getBlockState(componentPos))); + IBlockState state = world.getBlockState(componentPos); if (altarComponent.getComponent() != EnumAltarComponent.NOTAIR) { - if (worldBlock.getBlock() instanceof IAltarComponent) { - EnumAltarComponent component = ((IAltarComponent) worldBlock.getBlock()).getType(world, worldBlock.getState(), componentPos); - if (component == null || component != altarComponent.getComponent()) { + if (state.getBlock() instanceof IAltarComponent) { + EnumAltarComponent component = ((IAltarComponent) state.getBlock()).getType(world, state, componentPos); + if (component == null || component != altarComponent.getComponent()) return Pair.of(componentPos, altarComponent.getComponent()); - } - } else if (worldBlock.getBlock() != Utils.getBlockForComponent(altarComponent.getComponent())) { - return new ImmutablePair(componentPos, altarComponent.getComponent()); } - } else { - if (world.isAirBlock(componentPos)) { + + if (!BloodMagicAPI.INSTANCE.getComponentStates(altarComponent.getComponent()).contains(state)) return Pair.of(componentPos, altarComponent.getComponent()); - } - } + } else if (world.isAirBlock(componentPos)) + return Pair.of(componentPos, altarComponent.getComponent()); } return null; diff --git a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java index 2177fa35..b2fc17ce 100644 --- a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java @@ -2,12 +2,14 @@ package WayofTime.bloodmagic.api_impl; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.apiv2.IBloodMagicAPI; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; import net.minecraft.util.ResourceLocation; -import java.util.Map; +import java.util.*; public class BloodMagicAPI implements IBloodMagicAPI { @@ -15,12 +17,12 @@ public class BloodMagicAPI implements IBloodMagicAPI { private final BloodMagicBlacklist blacklist; private final Map sacrificialValues; - private final Map altarComponents; + private final Multimap altarComponents; public BloodMagicAPI() { this.blacklist = new BloodMagicBlacklist(); this.sacrificialValues = Maps.newHashMap(); - this.altarComponents = Maps.newHashMap(); + this.altarComponents = ArrayListMultimap.create(); } @Override @@ -43,14 +45,14 @@ public class BloodMagicAPI implements IBloodMagicAPI { } } - altarComponents.put(state, component); + altarComponents.put(component, state); } public Map getSacrificialValues() { return ImmutableMap.copyOf(sacrificialValues); } - public Map getAltarComponents() { - return ImmutableMap.copyOf(altarComponents); + public List getComponentStates(EnumAltarComponent component) { + return (List) altarComponents.get(component); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 123f06f1..442ecd96 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -3,21 +3,19 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.AltarComponent; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.altar.IAltarManipulator; -import WayofTime.bloodmagic.api.altar.IBloodAltar; +import WayofTime.bloodmagic.api.altar.*; import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.api_impl.BloodMagicAPI; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Utils; + import WayofTime.bloodmagic.util.helper.NumeralHelper; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; @@ -111,9 +109,12 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP for (AltarComponent altarComponent : tierToBuild.getAltarComponents()) { BlockPos componentPos = pos.add(altarComponent.getOffset()); - Block blockForComponent = Utils.getBlockForComponent(altarComponent.getComponent()); + if (altarComponent.getComponent() == EnumAltarComponent.NOTAIR) { + world.setBlockState(componentPos, Blocks.STONEBRICK.getDefaultState()); + continue; + } - world.setBlockState(componentPos, blockForComponent.getDefaultState(), 3); + world.setBlockState(componentPos, BloodMagicAPI.INSTANCE.getComponentStates(altarComponent.getComponent()).get(0)); } ((IBloodAltar) world.getTileEntity(pos)).checkTier(); @@ -134,10 +135,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP else { for (AltarComponent altarComponent : altarTier.getAltarComponents()) { BlockPos componentPos = pos.add(altarComponent.getOffset()); - IBlockState componentState = world.getBlockState(pos); - world.setBlockToAir(componentPos); - world.notifyBlockUpdate(componentPos, componentState, componentState, 3); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java index e84b34fd..5b09e100 100644 --- a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java @@ -31,6 +31,8 @@ public class PluginUtil { } } + // Bring core plugin up to top + discoveredAnnotations.sort((o1, o2) -> o1.getLeft().getClass().getCanonicalName().startsWith("WayofTime") ? 1 : 0); return discoveredAnnotations; } } diff --git a/src/main/resources/assets/bloodmagic/models/item/blockalchemyarray.json b/src/main/resources/assets/bloodmagic/models/item/blockalchemyarray.json deleted file mode 100644 index 67c44a6e..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/blockalchemyarray.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "bloodmagic:block/BlockAlchemyArray", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/blockbloodlight.json b/src/main/resources/assets/bloodmagic/models/item/blockbloodlight.json deleted file mode 100644 index 68fd1bc5..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/blockbloodlight.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "bloodmagic:block/BlockBloodLight", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/blockdimensionalportal.json b/src/main/resources/assets/bloodmagic/models/item/blockdimensionalportal.json deleted file mode 100644 index c342e9c0..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/blockdimensionalportal.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "parent": "bloodmagic:block/BlockDimensionalPortal", - "display": { - "thirdperson": { - "rotation": [ - 10, - -45, - 170 - ], - "translation": [ - 0, - 1.5, - -2.75 - ], - "scale": [ - 0.375, - 0.375, - 0.375 - ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/blockpedestal0.json b/src/main/resources/assets/bloodmagic/models/item/blockpedestal0.json deleted file mode 100644 index 7e9dac62..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/blockpedestal0.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "bloodmagic:block/BlockPedestal0", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/blockpedestal1.json b/src/main/resources/assets/bloodmagic/models/item/blockpedestal1.json deleted file mode 100644 index f8f8a3a4..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/blockpedestal1.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "bloodmagic:block/BlockPedestal1", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/blockphantom.json b/src/main/resources/assets/bloodmagic/models/item/blockphantom.json deleted file mode 100644 index 106c3501..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/blockphantom.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "bloodmagic:block/BlockPhantom", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/blockspectral.json b/src/main/resources/assets/bloodmagic/models/item/blockspectral.json deleted file mode 100644 index 67bd40b9..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/blockspectral.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "bloodmagic:block/BlockSpectral", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/itembloodorb.json b/src/main/resources/assets/bloodmagic/models/item/itembloodorb.json deleted file mode 100644 index 12d55a89..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itembloodorb.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/WeakBloodOrb" - } -} diff --git a/src/main/resources/assets/bloodmagic/models/item/itembloodorbapprentice.json b/src/main/resources/assets/bloodmagic/models/item/itembloodorbapprentice.json deleted file mode 100644 index 1d1a48af..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itembloodorbapprentice.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/ApprenticeBloodOrb" - } -} diff --git a/src/main/resources/assets/bloodmagic/models/item/itembloodorbarchmage.json b/src/main/resources/assets/bloodmagic/models/item/itembloodorbarchmage.json deleted file mode 100644 index 0f7289fa..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itembloodorbarchmage.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/ArchmageBloodOrb" - } -} diff --git a/src/main/resources/assets/bloodmagic/models/item/itembloodorbmagician.json b/src/main/resources/assets/bloodmagic/models/item/itembloodorbmagician.json deleted file mode 100644 index b1a6d7ec..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itembloodorbmagician.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/MagicianBloodOrb" - } -} diff --git a/src/main/resources/assets/bloodmagic/models/item/itembloodorbmaster.json b/src/main/resources/assets/bloodmagic/models/item/itembloodorbmaster.json deleted file mode 100644 index 27d6c881..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itembloodorbmaster.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/MasterBloodOrb" - } -} diff --git a/src/main/resources/assets/bloodmagic/models/item/itembloodorbtranscendent.json b/src/main/resources/assets/bloodmagic/models/item/itembloodorbtranscendent.json deleted file mode 100644 index 20eba4e8..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itembloodorbtranscendent.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/TranscendentBloodOrb" - } -} diff --git a/src/main/resources/assets/bloodmagic/models/item/itembloodorbweak.json b/src/main/resources/assets/bloodmagic/models/item/itembloodorbweak.json deleted file mode 100644 index 12d55a89..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itembloodorbweak.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/WeakBloodOrb" - } -} diff --git a/src/main/resources/assets/bloodmagic/models/item/itemmodelbase.json b/src/main/resources/assets/bloodmagic/models/item/itemmodelbase.json deleted file mode 100644 index a5461048..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itemmodelbase.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent":"item/generated" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem0.json b/src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem0.json deleted file mode 100644 index 60cf7592..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem0.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/SentientArmourGem_deactivated" - } -} - - - - - diff --git a/src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem1.json b/src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem1.json deleted file mode 100644 index 5998ca9e..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itemsentientarmourgem1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent":"bloodmagic:item/ItemModelBase", - "textures": { - "layer0":"bloodmagic:items/SentientArmourGem_activated" - } -} - - - - - - diff --git a/src/main/resources/assets/bloodmagic/models/item/itemtoolbase.json b/src/main/resources/assets/bloodmagic/models/item/itemtoolbase.json deleted file mode 100644 index 420f57b7..00000000 --- a/src/main/resources/assets/bloodmagic/models/item/itemtoolbase.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "parent":"builtin/generated", - "display": { - "thirdperson": { - "rotation": [ 0, 90, -35 ], - "translation": [ 0, 1.25, -3.5 ], - "scale": [ 0.85, 0.85, 0.85 ] - }, - "firstperson": { - "rotation": [ 0, -135, 25 ], - "translation": [ 0, 4, 2 ], - "scale": [ 1.7, 1.7, 1.7 ] - } - } -} \ No newline at end of file From d99cf7728896566b25aea0bc970b97f2e4dfe0d5 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 19 Aug 2017 18:56:50 -0700 Subject: [PATCH 130/595] Move config to annotation system All old configs must be deleted for this to work properly. Since the rest of the update is filled with world breaking changes, this should be fine. Also some mapping updates (cherry picked from commit d587a8c) --- build.gradle | 5 +- gradle.properties | 12 +- .../java/WayofTime/bloodmagic/BloodMagic.java | 5 +- .../WayofTime/bloodmagic/ConfigHandler.java | 425 ++++-------------- .../util/helper/PlayerSacrificeHelper.java | 2 +- .../api_impl/BloodMagicBlacklist.java | 17 +- .../api_impl/BloodMagicCorePlugin.java | 91 +++- .../apiv2/IBloodMagicBlacklist.java | 18 +- .../bloodmagic/block/BlockSpectral.java | 2 +- .../client/gui/config/ConfigGui.java | 37 -- .../client/gui/config/ConfigGuiFactory.java | 29 -- .../render/block/RenderItemRoutingNode.java | 2 +- .../provider/DataProviderBloodAltar.java | 28 +- .../entity/ai/EntityAIAttackRangedBow.java | 2 +- .../entity/ai/EntityAIEatAndCorruptBlock.java | 2 +- .../entity/ai/EntityAIFollowOwner.java | 10 +- .../ai/EntityAIGrabEffectsFromOwner.java | 8 +- .../entity/ai/EntityAIPickUpAlly.java | 2 +- .../entity/ai/EntityAIProtectAlly.java | 2 +- .../entity/ai/EntityAIRetreatToHeal.java | 6 +- .../entity/ai/EntityAIStealthRetreat.java | 4 +- .../entity/mob/EntityCorruptedSpider.java | 2 +- .../bloodmagic/entity/mob/EntityMimic.java | 2 +- .../entity/mob/EntitySentientSpecter.java | 2 +- .../entity/projectile/EntityBloodLight.java | 4 +- .../bloodmagic/item/ItemBoundAxe.java | 4 +- .../bloodmagic/item/ItemBoundPickaxe.java | 6 +- .../bloodmagic/item/ItemBoundShovel.java | 2 +- .../bloodmagic/item/ItemBoundTool.java | 4 +- .../item/ItemSacrificialDagger.java | 6 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 4 +- .../bloodmagic/item/soul/ItemSentientBow.java | 5 +- .../item/soul/ItemSentientPickaxe.java | 4 +- .../item/soul/ItemSentientShovel.java | 4 +- .../bloodmagic/item/soul/ItemSoulSnare.java | 2 +- .../meteor/MeteorConfigHandler.java | 4 +- .../bloodmagic/registry/ModRecipes.java | 4 +- .../bloodmagic/registry/ModRituals.java | 71 ++- .../bloodmagic/ritual/RitualExpulsion.java | 2 +- .../ritual/RitualFeatheredKnife.java | 2 +- .../bloodmagic/ritual/RitualForsakenSoul.java | 2 +- .../util/handler/event/ClientHandler.java | 2 +- .../util/handler/event/CraftingHandler.java | 28 +- .../util/handler/event/GenericHandler.java | 4 +- .../handler/event/LivingArmourHandler.java | 2 +- 45 files changed, 320 insertions(+), 561 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java diff --git a/build.gradle b/build.gradle index 14a5a1bb..759d1f9f 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ buildscript { plugins { id "net.minecraftforge.gradle.forge" version "2.0.2" id 'com.matthewprenger.cursegradle' version '1.0.9' + id 'io.franzbecker.gradle-lombok' version '1.6' id 'maven-publish' } @@ -34,8 +35,8 @@ repositories { dependencies { deobfCompile "mezz.jei:jei_${mc_version}:${jei_version}" - deobfCompile "mcp.mobius.waila:Hwyla:${waila_version}_${mc_version}" - deobfCompile "info.amerifrance.guideapi:Guide-API:${mc_version}-${guideapi_version}" + deobfCompile "mcp.mobius.waila:Hwyla:${waila_version}" + deobfCompile "info.amerifrance.guideapi:Guide-API:${guideapi_version}" } minecraft { diff --git a/gradle.properties b/gradle.properties index bcf9d97a..6685f593 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,12 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic mod_version=2.2.0 -mc_version=1.12 -forge_version=14.21.1.2443 +mc_version=1.12.2 +forge_version=14.23.2.2611 curse_id=224791 -mappings_version=snapshot_20170814 +mappings_version=snapshot_20180201 -jei_version=4.7.5.85 -waila_version=1.8.20-B35 -guideapi_version=2.1.4-56 \ No newline at end of file +jei_version=4.8.5.147 +waila_version=1.8.23-B38_1.12 +guideapi_version=1.12-2.1.4-57 \ 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 4957a1be..badd6928 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -33,7 +33,7 @@ import org.apache.commons.lang3.tuple.Pair; import java.io.File; import java.util.List; -@Mod(modid = BloodMagic.MODID, name = BloodMagic.NAME, version = BloodMagic.VERSION, dependencies = BloodMagic.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory") +@Mod(modid = BloodMagic.MODID, name = BloodMagic.NAME, version = BloodMagic.VERSION, dependencies = BloodMagic.DEPEND) public class BloodMagic { public static final String MODID = "bloodmagic"; public static final String NAME = "Blood Magic: Alchemical Wizardry"; @@ -73,8 +73,7 @@ public class BloodMagic { @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { - configDir = new File(event.getModConfigurationDirectory(), "BloodMagic"); - ConfigHandler.init(new File(configDir, "BloodMagic.cfg")); + configDir = new File(event.getModConfigurationDirectory(), "bloodmagic"); PLUGINS.addAll(PluginUtil.getPlugins(event.getAsmData())); diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 4ec4c8c6..99867dc1 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -1,352 +1,115 @@ package WayofTime.bloodmagic; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.meteor.MeteorConfigHandler; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.Block; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.config.Configuration; +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; -import net.minecraftforge.fml.common.registry.ForgeRegistries; -import net.minecraftforge.oredict.OreDictionary; -import java.io.File; -import java.util.*; - -@Handler +@Config(modid = BloodMagic.MODID, name = BloodMagic.MODID + "/" + BloodMagic.MODID, category = "") +@Mod.EventBusSubscriber public class ConfigHandler { - public static Configuration config; - // Teleposer - public static String[] teleposerBlacklisting; - public static ArrayList teleposerBlacklist = new ArrayList<>(); - public static List teleposerBlacklistEntity; + @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({ "Toggles for all rituals" }) + public static ConfigRituals rituals = new ConfigRituals(); + @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(); - // Transposition Sigil - public static String[] transpositionBlacklisting; - public static ArrayList transpositionBlacklist = new ArrayList<>(); + 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 = { }; + } - // Well of Suffering Blacklist - public static List wellOfSufferingBlacklist; + 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; + } - // Blood Altar Sacrificial Values - public static String[] entitySacrificeValuesList; - public static Map entitySacrificeValues = new HashMap<>(); + public static class ConfigRituals { + public boolean ritualAnimalGrowth = true; + public boolean ritualContainment = true; + public boolean ritualCrushing = true; + public boolean ritualExpulsion = true; + public boolean ritualFeatheredKnife = true; + public boolean ritualFullStomach = true; + public boolean ritualGreenGrove = true; + public boolean ritualHarvest = true; + public boolean ritualInterdiction = true; + public boolean ritualJumping = true; + public boolean ritualLava = true; + public boolean ritualMagnetic = true; + public boolean ritualRegeneration = true; + public boolean ritualSpeed = true; + public boolean ritualSuppression = true; + public boolean ritualWater = true; + public boolean ritualWellOfSuffering = true; + public boolean ritualZephyr = true; + public boolean ritualUpgradeRemove = true; + public boolean ritualArmourEvolve = true; + public boolean ritualForsakenSoul = true; + public boolean ritualCrystalHarvest = true; + public boolean ritualPlacer = true; + public boolean ritualFelling = true; + public boolean ritualPump = true; + public boolean ritualAltarBuilder = true; + public boolean ritualPortal = true; + public boolean ritualMeteor = true; + public boolean ritualDowngrade = true; + public ConfigImperfectRituals imperfect = new ConfigImperfectRituals(); + } - // Rituals - public static boolean ritualAnimalGrowth; - public static boolean ritualContainment; - public static boolean ritualCrushing; - public static boolean ritualExpulsion; - public static boolean ritualFeatheredKnife; - public static boolean ritualFullStomach; - public static boolean ritualGreenGrove; - public static boolean ritualHarvest; - public static boolean ritualInterdiction; - public static boolean ritualJumping; - public static boolean ritualLava; - public static boolean ritualMagnetic; - public static boolean ritualRegeneration; - public static boolean ritualSpeed; - public static boolean ritualSuppression; - public static boolean ritualWater; - public static boolean ritualWellOfSuffering; - public static boolean ritualZephyr; - public static boolean ritualUpgradeRemove; - public static boolean ritualArmourEvolve; - public static boolean ritualForsakenSoul; - public static boolean ritualCrystalHarvest; + public static class ConfigImperfectRituals { + public boolean imperfectRitualNight = true; + public boolean imperfectRitualRain = true; + public boolean imperfectRitualResistance = true; + public boolean imperfectRitualZombie = true; + } - public static boolean cobblestoneRitual; - public static boolean placerRitual; - public static boolean fellingRitual; - public static boolean pumpRitual; - public static boolean altarBuilderRitual; - public static boolean portalRitual; - public static boolean meteorRitual; - public static boolean downgradeRitual; + 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; + } - // Imperfect Rituals - public static boolean imperfectRitualNight; - public static boolean imperfectRitualRain; - public static boolean imperfectRitualResistance; - public static boolean imperfectRitualZombie; + 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; - // Potion ID's - public static int customPotionDrowningID; - public static int customPotionBoostID; - public static int customPotionProjProtID; - public static int customPotionInhibitID; - public static int customPotionFlightID; - public static int customPotionReciprocationID; - public static int customPotionFlameCloakID; - public static int customPotionIceCloakID; - public static int customPotionHeavyHeartID; - public static int customPotionFireFuseID; - public static int customPotionPlanarBindingID; - public static int customPotionSoulFrayID; - public static int customPotionSoulHardenID; - public static int customPotionDeafID; - public static int customPotionFeatherFallID; - public static int customPotionDemonCloakID; - public static int customPotionAmphibianID; - - // Potion toggles - public static boolean customPotionDrowningEnabled; - public static boolean customPotionBoostEnabled; - public static boolean customPotionProjProtEnabled; - public static boolean customPotionInhibitEnabled; - public static boolean customPotionFlightEnabled; - public static boolean customPotionReciprocationEnabled; - public static boolean customPotionFlameCloakEnabled; - public static boolean customPotionIceCloakEnabled; - public static boolean customPotionHeavyHeartEnabled; - public static boolean customPotionFireFuseEnabled; - public static boolean customPotionPlanarBindingEnabled; - public static boolean customPotionSoulFrayEnabled; - public static boolean customPotionSoulHardenEnabled; - public static boolean customPotionDeafEnabled; - public static boolean customPotionFeatherFallEnabled; - public static boolean customPotionDemonCloakEnabled; - public static boolean customPotionAmphibianEnabled; - public static boolean vanillaPotionRegenerationEnabled; - public static boolean vanillaPotionNightVisionEnabled; - public static boolean vanillaPotionFireResistEnabled; - public static boolean vanillaPotionWaterBreathingEnabled; - public static boolean vanillaPotionSpeedEnabled; - public static boolean vanillaPotionHealthEnabled; - public static boolean vanillaPotionPoisonEnabled; - public static boolean vanillaPotionBlindnessEnabled; - public static boolean vanillaPotionWeaknessEnabled; - public static boolean vanillaPotionStrengthEnabled; - public static boolean vanillaPotionJumpBoostEnabled; - public static boolean vanillaPotionSlownessEnabled; - public static boolean vanillaPotionMiningEnabled; - public static boolean vanillaPotionInvisibilityEnabled; - public static boolean vanillaPotionResistanceEnabled; - public static boolean vanillaPotionSaturationEnabled; - public static boolean vanillaPotionHealthBoostEnabled; - public static boolean vanillaPotionAbsorptionEnabled; - - // General - public static int sacrificialPackConversion; - public static int sacrificialDaggerDamage; - public static int sacrificialDaggerConversion; - - // Client - public static boolean alwaysRenderRoutingLines; - public static boolean invisibleSpectralBlocks; - public static boolean sigilHoldingSkipsEmptySlots; - - // Compat - public static int wailaAltarDisplayMode; - public static boolean thaumcraftGogglesUpgrade; - public static boolean ignoreCompressionSpamAddedByCompression; + public enum AltarDisplayMode { + ALWAYS, + SIGIL_HELD, + SIGIL_CONTAINED, + ; + } + } @SubscribeEvent - public void onConfigChanged(ConfigChangedEvent event) { + public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) { if (event.getModID().equals(BloodMagic.MODID)) { - syncConfig(); - MeteorConfigHandler.handleMeteors(false); - } - } - - public static void init(File file) { - config = new Configuration(file); - syncConfig(); - } - - public static void syncConfig() { - String category; - - category = "Item/Block Blacklisting"; - config.addCustomCategoryComment(category, "Allows disabling of specific Blocks/Items.\nNote that using this may result in crashes. Use is not supported."); - config.setCategoryRequiresMcRestart(category, true); - - category = "Teleposer Blacklist"; - config.addCustomCategoryComment(category, "Block blacklisting"); - teleposerBlacklisting = config.getStringList("teleposerBlacklist", category, new String[]{"minecraft:bedrock", "minecraft:mob_spawner"}, "Stops specified blocks from being teleposed. Put entries on new lines. Valid syntax is:\nmodid:blockname:meta"); - buildBlacklist(teleposerBlacklisting, teleposerBlacklist); - teleposerBlacklistEntity = Arrays.asList(config.getStringList("teleposerBlacklistEntity", category, new String[]{}, "Entity class names listed here will not be able to be teleposed.")); - - category = "Transposition Sigil Blacklist"; - config.addCustomCategoryComment(category, "Block blacklisting"); - transpositionBlacklisting = config.getStringList("transpositionBlacklist", category, new String[]{"minecraft:bedrock", "minecraft:mob_spawner"}, "Stops specified blocks from being teleposed. Put entries on new lines. Valid syntax is:\nmodid:blockname:meta"); - buildBlacklist(transpositionBlacklisting, transpositionBlacklist); - - category = "Well of Suffering Blacklist"; - config.addCustomCategoryComment(category, "Entity blacklisting from WoS"); - wellOfSufferingBlacklist = Arrays.asList(config.getStringList("wellOfSufferingBlacklist", category, new String[]{"EntityArmorStand", "EntitySentientSpecter"}, "Use the class name of the Entity to blacklist it from usage.\nIE: EntityWolf, EntityWitch, etc")); - - category = "Blood Altar Sacrificial Values"; - config.addCustomCategoryComment(category, "Entity Sacrificial Value Settings"); - entitySacrificeValuesList = config.getStringList("entitySacrificeLP:HPValues", category, new String[]{"EntityVillager;100", "EntitySlime;15", "EntityEnderman;10", "EntityCow;100", "EntityChicken;100", "EntityHorse;100", "EntitySheep;100", "EntityWolf;100", "EntityOcelot;100", "EntityPig;100", "EntityRabbit;100", "EntityArmorStand;0", "EntitySentientSpecter;0"}, "Used to edit the amount of LP gained per HP sacrificed for the given entity.\nSetting an entity to 0 effectively blacklists it.\nIf a mod modifies an entity via the API, it will take precedence over this config.\nSyntax: EntityClassName;LPPerHP"); - buildEntitySacrificeValues(); - - category = "Potions"; - config.addCustomCategoryComment(category, "Potion settings"); - config.addCustomCategoryComment(category + ".id", "Potion ID settings"); - customPotionDrowningID = config.getInt("customPotionDrowningID", category + ".id", 100, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Drowning potion"); - customPotionBoostID = config.getInt("customPotionBoostID", category + ".id", 101, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Boost potion"); - customPotionProjProtID = config.getInt("customPotionProjProtID", category + ".id", 102, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Projectile Protection potion"); - customPotionInhibitID = config.getInt("customPotionInhibitID", category + ".id", 103, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Inhibit potion"); - customPotionFlightID = config.getInt("customPotionFlightID", category + ".id", 104, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Flight potion"); - customPotionReciprocationID = config.getInt("customPotionReciprocationID", category + ".id", 105, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Reciprocation potion"); - customPotionFlameCloakID = config.getInt("customPotionFlameCloakID", category + ".id", 106, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Flame Cloak potion"); - customPotionIceCloakID = config.getInt("customPotionIceCloakID", category + ".id", 107, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Ice Cloak potion"); - customPotionHeavyHeartID = config.getInt("customPotionHeavyHeartID", category + ".id", 108, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Heavy Heart potion"); - customPotionFireFuseID = config.getInt("customPotionFireFuseID", category + ".id", 109, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Fire Fuse potion"); - customPotionPlanarBindingID = config.getInt("customPotionPlanarBindingID", category + ".id", 110, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Planar Binding potion"); - customPotionSoulFrayID = config.getInt("customPotionSoulFrayID", category + ".id", 111, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Soul Fray potion"); - customPotionSoulHardenID = config.getInt("customPotionSoulHardenID", category + ".id", 112, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Soul Harden potion"); - customPotionDeafID = config.getInt("customPotionDeafID", category + ".id", 113, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Deaf potion"); - customPotionFeatherFallID = config.getInt("customPotionFeatherFallID", category + ".id", 114, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Feather Fall potion"); - customPotionDemonCloakID = config.getInt("customPotionDemonCloakID", category + ".id", 115, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Demon Cloak potion"); - customPotionAmphibianID = config.getInt("customPotionAmphibianID", category + ".id", 116, 20, Constants.Misc.POTION_ARRAY_SIZE, "ID of the Amphibian potion"); - - config.addCustomCategoryComment(category + ".toggle", "Toggle potions available in Alchemy"); - customPotionDrowningEnabled = config.getBoolean("customPotionDrowningEnabled", category + ".toggle", true, "Enables the Drowning potion in Alchemy"); - customPotionBoostEnabled = config.getBoolean("customPotionBoostEnabled", category + ".toggle", true, "Enables the Boost potion in Alchemy"); - customPotionProjProtEnabled = config.getBoolean("customPotionProjProtEnabled", category + ".toggle", true, "Enables the Projectile Protection potion in Alchemy"); - customPotionInhibitEnabled = config.getBoolean("customPotionInhibitEnabled", category + ".toggle", true, "Enables the Inhibit potion in Alchemy"); - customPotionFlightEnabled = config.getBoolean("customPotionFlightEnabled", category + ".toggle", true, "Enables the Flight potion in Alchemy"); - customPotionReciprocationEnabled = config.getBoolean("customPotionReciprocationEnabled", category + ".toggle", true, "Enables the Reciprocation potion in Alchemy"); - customPotionFlameCloakEnabled = config.getBoolean("customPotionFlameCloakEnabled", category + ".toggle", true, "Enables the Flame Cloak potion in Alchemy"); - customPotionIceCloakEnabled = config.getBoolean("customPotionIceCloakEnabled", category + ".toggle", true, "Enables the Ice Cloak potion in Alchemy"); - customPotionHeavyHeartEnabled = config.getBoolean("customPotionHeavyHeartEnabled", category + ".toggle", true, "Enables the Heavy Heart potion in Alchemy"); - customPotionFireFuseEnabled = config.getBoolean("customPotionFireFuseEnabled", category + ".toggle", true, "Enables the Fire Fuse potion in Alchemy"); - customPotionPlanarBindingEnabled = config.getBoolean("customPotionPlanarBindingEnabled", category + ".toggle", true, "Enables the Planar Binding potion in Alchemy"); - customPotionSoulFrayEnabled = config.getBoolean("customPotionSoulFrayEnabled", category + ".toggle", true, "Enables the Soul Fray potion in Alchemy"); - customPotionSoulHardenEnabled = config.getBoolean("customPotionSoulHardenEnabled", category + ".toggle", true, "Enables the Soul Harden potion in Alchemy"); - customPotionDeafEnabled = config.getBoolean("customPotionDeafEnabled", category + ".toggle", true, "Enables the Deaf potion in Alchemy"); - customPotionFeatherFallEnabled = config.getBoolean("customPotionFeatherFallEnabled", category + ".toggle", true, "Enables the Feather Fall potion in Alchemy"); - customPotionDemonCloakEnabled = config.getBoolean("customPotionDemonCloakEnabled", category + ".toggle", true, "Enables the Demon Cloak potion in Alchemy"); - customPotionAmphibianEnabled = config.getBoolean("customPotionAmphibianEnabled", category + ".toggle", true, "Enables the Amphibian potion in Alchemy"); - vanillaPotionAbsorptionEnabled = config.getBoolean("vanillaPotionAbsorptionEnabled", category + ".toggle", true, "Enables the Absorption potion in Alchemy"); - vanillaPotionBlindnessEnabled = config.getBoolean("vanillaPotionBlindnessEnabled", category + ".toggle", true, "Enables the Blindness potion in Alchemy"); - vanillaPotionFireResistEnabled = config.getBoolean("vanillaPotionFireResistEnabled", category + ".toggle", true, "Enables the Fire Resistance potion in Alchemy"); - vanillaPotionHealthBoostEnabled = config.getBoolean("vanillaPotionHealthBoostEnabled", category + ".toggle", true, "Enables the Health Boost potion in Alchemy"); - vanillaPotionHealthEnabled = config.getBoolean("vanillaPotionHealthEnabled", category + ".toggle", true, "Enables the Instant Health potion in Alchemy"); - vanillaPotionInvisibilityEnabled = config.getBoolean("vanillaPotionInvisibilityEnabled", category + ".toggle", true, "Enables the Invisibility potion in Alchemy"); - vanillaPotionJumpBoostEnabled = config.getBoolean("vanillaPotionJumpBoostEnabled", category + ".toggle", true, "Enables the Jump Boost potion in Alchemy"); - vanillaPotionMiningEnabled = config.getBoolean("vanillaPotionMiningEnabled", category + ".toggle", true, "Enables the Mining potion in Alchemy"); - vanillaPotionPoisonEnabled = config.getBoolean("vanillaPotionPoisonEnabled", category + ".toggle", true, "Enables the Poison potion in Alchemy"); - vanillaPotionRegenerationEnabled = config.getBoolean("vanillaPotionRegenerationEnabled", category + ".toggle", true, "Enables the Regeneration potion in Alchemy"); - vanillaPotionNightVisionEnabled = config.getBoolean("vanillaPotionNightVisionEnabled", category + ".toggle", true, "Enables the Night Vision potion in Alchemy"); - vanillaPotionResistanceEnabled = config.getBoolean("vanillaPotionResistanceEnabled", category + ".toggle", true, "Enables the Resistance potion in Alchemy"); - vanillaPotionSaturationEnabled = config.getBoolean("vanillaPotionSaturationEnabled", category + ".toggle", true, "Enables the Saturation potion in Alchemy"); - vanillaPotionSlownessEnabled = config.getBoolean("vanillaPotionSlownessEnabled", category + ".toggle", true, "Enables the Slowness potion in Alchemy"); - vanillaPotionSpeedEnabled = config.getBoolean("vanillaPotionSpeedEnabled", category + ".toggle", true, "Enables the Speed potion in Alchemy"); - vanillaPotionStrengthEnabled = config.getBoolean("vanillaPotionStrengthEnabled", category + ".toggle", true, "Enables the Strength potion in Alchemy"); - vanillaPotionWaterBreathingEnabled = config.getBoolean("vanillaPotionWaterBreathingEnabled", category + ".toggle", true, "Enables the Water Breathing potion in Alchemy"); - vanillaPotionWeaknessEnabled = config.getBoolean("vanillaPotionWeaknessEnabled", category + ".toggle", true, "Enables the Weakness potion in Alchemy"); - - category = "Rituals"; - config.addCustomCategoryComment(category, "Ritual toggling"); - config.setCategoryRequiresMcRestart(category, true); - ritualAnimalGrowth = config.get(category, "ritualAnimalGrowth", true).getBoolean(); - ritualContainment = config.get(category, "ritualContainment", true).getBoolean(); - ritualCrushing = config.get(category, "ritualCrushing", true).getBoolean(); - ritualExpulsion = config.get(category, "ritualExpulsion", true).getBoolean(); - ritualFeatheredKnife = config.get(category, "ritualFeatheredKnife", true).getBoolean(); - ritualFullStomach = config.get(category, "ritualFullStomach", true).getBoolean(); - ritualGreenGrove = config.get(category, "ritualGreenGrove", true).getBoolean(); - ritualHarvest = config.get(category, "ritualHarvest", true).getBoolean(); - ritualInterdiction = config.get(category, "ritualInterdiction", true).getBoolean(); - ritualJumping = config.get(category, "ritualJumping", true).getBoolean(); - ritualLava = config.get(category, "ritualLava", true).getBoolean(); - ritualMagnetic = config.get(category, "ritualMagnetic", true).getBoolean(); - ritualRegeneration = config.get(category, "ritualRegeneration", true).getBoolean(); - ritualSpeed = config.get(category, "ritualSpeed", true).getBoolean(); - ritualSuppression = config.get(category, "ritualSuppression", true).getBoolean(); - ritualWater = config.get(category, "ritualWater", true).getBoolean(); - ritualWellOfSuffering = config.get(category, "ritualWellOfSuffering", true).getBoolean(); - ritualZephyr = config.get(category, "ritualZephyr", true).getBoolean(); - ritualUpgradeRemove = config.get(category, "ritualRemove", true).getBoolean(); - ritualArmourEvolve = config.get(category, "ritualArmourEvolve", true).getBoolean(); - ritualForsakenSoul = config.get(category, "ritualForsakenSoul", true).getBoolean(); - ritualCrystalHarvest = config.get(category, "ritualCrystalHarvest", true).getBoolean(); - - cobblestoneRitual = config.get(category, "ritualCobblestone", true).getBoolean(); - placerRitual = config.get(category, "ritualPlacer", true).getBoolean(); - fellingRitual = config.get(category, "ritualFelling", true).getBoolean(); - pumpRitual = config.get(category, "ritualPump", true).getBoolean(); - altarBuilderRitual = config.get(category, "ritualAltarBuilder", true).getBoolean(); - portalRitual = config.get(category, "ritualPortal", true).getBoolean(); - meteorRitual = config.get(category, "ritualMeteor", true).getBoolean(); - downgradeRitual = config.get(category, "ritualDowngrade", true).getBoolean(); - - category = "Rituals.Imperfect"; - imperfectRitualNight = config.get(category, "imperfectRitualNight", true).getBoolean(); - imperfectRitualRain = config.get(category, "imperfectRitualRain", true).getBoolean(); - imperfectRitualResistance = config.get(category, "imperfectRitualResistance", true).getBoolean(); - imperfectRitualZombie = config.get(category, "imperfectRitualZombie", true).getBoolean(); - - category = "General"; - config.addCustomCategoryComment(category, "General settings"); - BloodMagicAPI.loggingEnabled = config.getBoolean("enableLogging", category, true, "Allows logging information to the console. Fatal errors will bypass this"); - sacrificialPackConversion = config.getInt("sacrificialPackConversion", category, 20, 0, 100, "Base multiplier for the Coat of Arms. DamageDealt * sacrificialPackConversion"); - sacrificialDaggerDamage = config.getInt("sacrificialDaggerDamage", category, 2, 0, 10000, "Damage done from using the Sacrificial Dagger"); - sacrificialDaggerConversion = config.getInt("sacrificialDaggerConversion", category, 100, 0, 10000, "Amount of LP received per damage point (not heart!)"); - - category = "Client"; - config.addCustomCategoryComment(category, "Client only settings"); - alwaysRenderRoutingLines = config.getBoolean("alwaysRenderRoutingLines", category, false, "Always renders the beams between routing nodes. If false, only renders while a Node Router is being held."); - invisibleSpectralBlocks = config.get(category, "invisibleSpectralBlocks", true, "Spectral Blocks (Used by the Suppression Sigil to store fluids) will not render at all. If false, a see through texture will render. [default: true]").setRequiresMcRestart(true).getBoolean(); - sigilHoldingSkipsEmptySlots = config.getBoolean("sigilHoldingSkipsEmptySlots", category, false, "The Sigil of Holding will skip empty sigil slots if set to true."); - - category = "Compatibility"; - config.addCustomCategoryComment(category, "Compatibility settings"); - wailaAltarDisplayMode = config.getInt("wailaAltarDisplayMode", category + ".waila", 1, 0, 2, "The mode for the Waila display on Blood Altars.\n0 - Always display information\n1 - Only display when Divination/Seer sigil is in hand.\n2 - Only display when Divination/Seer sigil is in inventory"); - thaumcraftGogglesUpgrade = config.getBoolean("thaumcraftGogglesUpgrade", category + ".thaumcraft", true, "Allows the Living Helmet to be upgraded with Goggles of Revealing in an Anvil."); - ignoreCompressionSpamAddedByCompression = config.getBoolean("ignoreCompressionSpamAddedByCompression", category + ".compression", true, "Compression decided to add a storage recipe for every item and block in the game. This will make the Sigil of Compression ignore those recipes so your game will actually load in a decent amount of time."); - - category = "Meteors"; - config.addCustomCategoryComment(category, "Meteor settings"); - - config.save(); - } - - private static void buildBlacklist(String[] blacklisting, List blockBlacklist) { - blockBlacklist.clear(); - - for (String blockSet : blacklisting) { - String[] blockData = blockSet.split(":"); - - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockData[0], blockData[1])); - int meta = 0; - - if (blockData.length == 3) { - // Check if it's an int, if so, parse it. If not, set meta to 0 - // to avoid crashing. - if (Utils.isInteger(blockData[2])) - meta = Integer.parseInt(blockData[2]); - else if (blockData[2].equals("*")) - meta = OreDictionary.WILDCARD_VALUE; - else - meta = 0; - } - - blockBlacklist.add(new BlockStack(block, meta)); - } - } - - private static void buildEntitySacrificeValues() { - entitySacrificeValues.clear(); - - for (String entityData : entitySacrificeValuesList) { - String[] split = entityData.split(";"); - - int amount = 500; - if (Utils.isInteger(split[1])) - amount = Integer.parseInt(split[1]); - - if (!entitySacrificeValues.containsKey(split[0])) - entitySacrificeValues.put(split[0], amount); + ConfigManager.sync(event.getModID(), Config.Type.INSTANCE); // Sync config values + MeteorConfigHandler.handleMeteors(false); // Reload meteors } } } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java index 4691fadc..6c1fdc9d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java @@ -61,7 +61,7 @@ public class PlayerSacrificeHelper { if (health > maxHealth / 10.0) { float sacrificedHealth = health - maxHealth / 10.0f; - int lpAdded = (int) (sacrificedHealth * ConfigHandler.sacrificialDaggerConversion * getModifier(amount)); + int lpAdded = (int) (sacrificedHealth * ConfigHandler.values.sacrificialDaggerConversion * getModifier(amount)); SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, (int) sacrificedHealth, lpAdded); if (MinecraftForge.EVENT_BUS.post(evt)) diff --git a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java index 0d448390..b88d64b6 100644 --- a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java @@ -7,6 +7,7 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.util.ResourceLocation; +import javax.annotation.Nonnull; import java.util.Set; public class BloodMagicBlacklist implements IBloodMagicBlacklist { @@ -26,49 +27,49 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { } @Override - public void addTeleposer(IBlockState state) { + public void addTeleposer(@Nonnull IBlockState state) { if (!teleposer.contains(state)) teleposer.add(state); } @Override - public void addTeleposer(Block block) { + public void addTeleposer(@Nonnull Block block) { for (IBlockState state : block.getBlockState().getValidStates()) addTeleposer(state); } @Override - public void addTeleposer(ResourceLocation entityId) { + public void addTeleposer(@Nonnull ResourceLocation entityId) { if (!teleposerEntities.contains(entityId)) teleposerEntities.add(entityId); } @Override - public void addTransposition(IBlockState state) { + public void addTransposition(@Nonnull IBlockState state) { if (!transposition.contains(state)) transposition.add(state); } @Override - public void addTransposition(Block block) { + public void addTransposition(@Nonnull Block block) { for (IBlockState state : block.getBlockState().getValidStates()) addTransposition(state); } @Override - public void addGreenGrove(IBlockState state) { + public void addGreenGrove(@Nonnull IBlockState state) { if (!greenGrove.contains(state)) greenGrove.add(state); } @Override - public void addGreenGrove(Block block) { + public void addGreenGrove(@Nonnull Block block) { for (IBlockState state : block.getBlockState().getValidStates()) addGreenGrove(state); } @Override - public void addSacrifice(ResourceLocation entityId) { + public void addWellOfSuffering(@Nonnull ResourceLocation entityId) { if (!sacrifice.contains(entityId)) sacrifice.add(entityId); } diff --git a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java index e2800fc6..aab81509 100644 --- a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.api_impl; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; import WayofTime.bloodmagic.apiv2.IBloodMagicAPI; @@ -10,8 +11,14 @@ import WayofTime.bloodmagic.block.BlockDecorative; import WayofTime.bloodmagic.block.enums.EnumBloodRune; import WayofTime.bloodmagic.block.enums.EnumDecorative; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import net.minecraft.block.Block; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.EntityEntry; +import net.minecraftforge.fml.common.registry.ForgeRegistries; @BloodMagicPlugin public class BloodMagicCorePlugin implements IBloodMagicPlugin { @@ -31,10 +38,13 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { api.getBlacklist().addTransposition(RegistrarBloodMagicBlocks.DEMON_CRYSTAL); api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.INVERSION_PILLAR); api.getBlacklist().addTransposition(RegistrarBloodMagicBlocks.INVERSION_PILLAR); - api.getBlacklist().addSacrifice(new ResourceLocation("armor_stand")); - api.getBlacklist().addSacrifice(new ResourceLocation(BloodMagic.MODID, "sentient_specter")); + api.getBlacklist().addWellOfSuffering(new ResourceLocation("armor_stand")); + api.getBlacklist().addWellOfSuffering(new ResourceLocation(BloodMagic.MODID, "sentient_specter")); - // TODO - Register things from config + api.setSacrificialValue(new ResourceLocation("armor_stand"), 0); + api.setSacrificialValue(new ResourceLocation(BloodMagic.MODID, "sentient_specter"), 0); + + handleConfigValues(api); // Add standard blocks for altar components api.registerAltarComponent(Blocks.GLOWSTONE.getDefaultState(), EnumAltarComponent.GLOWSTONE.name()); @@ -51,4 +61,79 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { for (EnumBloodRune runeType : EnumBloodRune.values()) api.registerAltarComponent(bloodRune.getDefaultState().withProperty(bloodRune.getProperty(), runeType), EnumAltarComponent.BLOODRUNE.name()); } + + private static void handleConfigValues(IBloodMagicAPI api) { + for (String value : ConfigHandler.values.sacrificialValues) { + String[] split = value.split(";"); + if (split.length != 2) // Not valid format + continue; + + api.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(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(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()); + } + } + + private static IBlockState parseState(String blockInfo) { + String[] split = blockInfo.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])); // Find the block + if (block == Blocks.AIR) + return Blocks.AIR.getDefaultState(); // The block is air, so we're looking at invalid data + + BlockStateContainer blockState = block.getBlockState(); + IBlockState 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("="); // Separates property and value + IProperty property = blockState.getProperty(valueSplit[0]); + if (property != null) + returnState = returnState.withProperty(property, (Comparable) property.parseValue(valueSplit[1]).get()); // Force the property into the state + } + + return returnState; + } } diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java index 61caa272..f1f1b0ad 100644 --- a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java @@ -4,21 +4,23 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.util.ResourceLocation; +import javax.annotation.Nonnull; + public interface IBloodMagicBlacklist { - void addTeleposer(IBlockState state); + void addTeleposer(@Nonnull IBlockState state); - void addTeleposer(Block block); + void addTeleposer(@Nonnull Block block); - void addTeleposer(ResourceLocation entityId); + void addTeleposer(@Nonnull ResourceLocation entityId); - void addTransposition(IBlockState state); + void addTransposition(@Nonnull IBlockState state); - void addTransposition(Block block); + void addTransposition(@Nonnull Block block); - void addGreenGrove(IBlockState state); + void addGreenGrove(@Nonnull IBlockState state); - void addGreenGrove(Block block); + void addGreenGrove(@Nonnull Block block); - void addSacrifice(ResourceLocation entityId); + void addWellOfSuffering(@Nonnull ResourceLocation entityId); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java index 7a001100..6aa45663 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -68,7 +68,7 @@ public class BlockSpectral extends Block implements IVariantProvider { @Override public EnumBlockRenderType getRenderType(IBlockState state) { - return ConfigHandler.invisibleSpectralBlocks ? EnumBlockRenderType.INVISIBLE : EnumBlockRenderType.MODEL; + return ConfigHandler.client.invisibleSpectralBlocks ? EnumBlockRenderType.INVISIBLE : EnumBlockRenderType.MODEL; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java deleted file mode 100644 index 9013d8ea..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGui.java +++ /dev/null @@ -1,37 +0,0 @@ -package WayofTime.bloodmagic.client.gui.config; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.common.config.ConfigElement; -import net.minecraftforge.fml.client.config.GuiConfig; -import net.minecraftforge.fml.client.config.IConfigElement; - -import java.util.ArrayList; -import java.util.List; - -public class ConfigGui extends GuiConfig { - - public ConfigGui(GuiScreen parentScreen) { - super(parentScreen, getConfigElements(parentScreen), BloodMagic.MODID, false, false, "BloodMagic Configuration"); - } - - @SuppressWarnings("rawtypes") - private static List getConfigElements(GuiScreen parent) { - List list = new ArrayList(); - - // adds sections declared in ConfigHandler. toLowerCase() is used - // because the configuration class automatically does this, so must we. - list.add(new ConfigElement(ConfigHandler.config.getCategory("Potions".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.config.getCategory("Client".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.config.getCategory("Compatibility".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.config.getCategory("Teleposer Blacklist".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.config.getCategory("Well of Suffering Blacklist".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.config.getCategory("Item/Block Blacklisting".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.config.getCategory("General".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.config.getCategory("Rituals".toLowerCase()))); - list.add(new ConfigElement(ConfigHandler.config.getCategory("Blood Altar Sacrificial Values".toLowerCase()))); - - return list; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java b/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java deleted file mode 100644 index 2f968574..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/config/ConfigGuiFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -package WayofTime.bloodmagic.client.gui.config; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.fml.client.IModGuiFactory; - -import java.util.Set; - -public class ConfigGuiFactory implements IModGuiFactory { - @Override - public void initialize(Minecraft minecraftInstance) { - - } - - @Override - public boolean hasConfigGui() { - return false; - } - - @Override - public GuiScreen createConfigGui(GuiScreen parentScreen) { - return new ConfigGui(parentScreen); - } - - @Override - public Set runtimeGuiCategories() { - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java index 9a94e561..083de767 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java @@ -24,7 +24,7 @@ public class RenderItemRoutingNode extends TileEntitySpecialRenderer connectionList = tileNode.getConnected(); for (BlockPos wantedPos : connectionList) { BlockPos offsetPos = wantedPos.subtract(tileNode.getPos()); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index 8affc801..9e3ddf39 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -27,16 +27,6 @@ import java.util.List; * in ImLookingAtBlood by Pokefenn. */ public class DataProviderBloodAltar implements IWailaDataProvider { - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - - @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - @Override public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { if (!config.getConfig(Constants.Compat.WAILA_CONFIG_ALTAR)) @@ -45,24 +35,21 @@ public class DataProviderBloodAltar implements IWailaDataProvider { boolean hasSigil = false; boolean hasSeer = false; - switch (ConfigHandler.wailaAltarDisplayMode) { - case 0: { + switch (ConfigHandler.compat.wailaAltarDisplayMode) { + case ALWAYS: { hasSigil = hasSeer = true; break; } - case 1: { + case SIGIL_HELD: { hasSeer = holdingSeerSigil(accessor.getPlayer()); hasSigil = hasSeer || holdingDivinationSigil(accessor.getPlayer()); break; } - case 2: { + case SIGIL_CONTAINED: { hasSeer = hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), accessor.getPlayer()); hasSigil = hasSeer || hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), accessor.getPlayer()); break; } - default: { - break; - } } if (!hasSeer && !hasSigil) @@ -93,11 +80,6 @@ public class DataProviderBloodAltar implements IWailaDataProvider { return currenttip; } - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - @Override public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { if (te != null) @@ -127,7 +109,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider { if (player.getHeldItemMainhand().getItem() instanceof ItemSigilDivination) return true; - if (player.getHeldItemOffhand() != null && player.getHeldItemOffhand().getItem() instanceof ItemSigilDivination) + if (!player.getHeldItemOffhand().isEmpty() && player.getHeldItemOffhand().getItem() instanceof ItemSigilDivination) return true; return false; diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java index 21416e37..f6eb575c 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java @@ -86,7 +86,7 @@ public class EntityAIAttackRangedBow extends EntityAIBase { } if (d0 <= (double) this.maxAttackDistance && this.seeTime >= 20) { - this.entity.getNavigator().clearPathEntity(); + this.entity.getNavigator().clearPath(); ++this.strafingTime; } else { this.entity.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.moveSpeedAmp); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java index 44337f13..a7718a6b 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java @@ -48,7 +48,7 @@ public class EntityAIEatAndCorruptBlock extends EntityAIBase { public void startExecuting() { this.eatingGrassTimer = 40; this.world.setEntityState(this.grassEaterEntity, (byte) 10); - this.grassEaterEntity.getNavigator().clearPathEntity(); + this.grassEaterEntity.getNavigator().clearPath(); } /** diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java index 73d08ea2..cd82198d 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java @@ -51,7 +51,7 @@ public class EntityAIFollowOwner extends EntityAIBase { return false; } else if (this.thePet.isStationary()) { return false; - } else if (this.thePet.getDistanceSqToEntity(entitylivingbase) < (double) (this.minDist * this.minDist)) { + } else if (this.thePet.getDistanceSq(entitylivingbase) < (double) (this.minDist * this.minDist)) { return false; } else { this.theOwner = entitylivingbase; @@ -63,7 +63,7 @@ public class EntityAIFollowOwner extends EntityAIBase { * Returns whether an in-progress EntityAIBase should continue executing */ public boolean continueExecuting() { - return !this.petPathfinder.noPath() && this.thePet.getDistanceSqToEntity(this.theOwner) > (double) (this.maxDist * this.maxDist) && !this.thePet.isStationary(); + return !this.petPathfinder.noPath() && this.thePet.getDistanceSq(this.theOwner) > (double) (this.maxDist * this.maxDist) && !this.thePet.isStationary(); } /** @@ -80,7 +80,7 @@ public class EntityAIFollowOwner extends EntityAIBase { */ public void resetTask() { this.theOwner = null; - this.petPathfinder.clearPathEntity(); + this.petPathfinder.clearPath(); this.thePet.setPathPriority(PathNodeType.WATER, this.oldWaterCost); } @@ -102,7 +102,7 @@ public class EntityAIFollowOwner extends EntityAIBase { if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.followSpeed)) { if (!this.thePet.getLeashed()) { - if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D) { + 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); @@ -111,7 +111,7 @@ public class EntityAIFollowOwner extends EntityAIBase { 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.clearPathEntity(); + this.petPathfinder.clearPath(); return; } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java index 3ff28996..3b42eec1 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java @@ -85,7 +85,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { */ public void resetTask() { this.theOwner = null; - this.petPathfinder.clearPathEntity(); + this.petPathfinder.clearPath(); this.thePet.setPathPriority(PathNodeType.WATER, this.oldWaterCost); } @@ -101,7 +101,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { public void updateTask() { this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, (float) this.thePet.getVerticalFaceSpeed()); - if (this.thePet.getDistanceSqToEntity(theOwner) < this.minDist * this.minDist) { + if (this.thePet.getDistanceSq(theOwner) < this.minDist * this.minDist) { if (this.thePet.stealEffectsFromOwner(theOwner)) { return; } @@ -113,7 +113,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.followSpeed)) { if (!this.thePet.getLeashed()) { - if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D) { + 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); @@ -122,7 +122,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { 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.clearPathEntity(); + this.petPathfinder.clearPath(); return; } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java index b7e370b4..bb120f4a 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java @@ -91,7 +91,7 @@ public class EntityAIPickUpAlly extends EntityAIBase { * Resets the task */ public void resetTask() { - this.entity.getNavigator().clearPathEntity(); + this.entity.getNavigator().clearPath(); this.pickupTarget = null; } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java index b4012277..d831c487 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java @@ -58,7 +58,7 @@ public class EntityAIProtectAlly extends EntityAIBase { public void startExecuting() { this.castTimer = 100; this.world.setEntityState(this.entity, (byte) 53); - this.entity.getNavigator().clearPathEntity(); + this.entity.getNavigator().clearPath(); } /** diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java index f077ac20..137efffa 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java @@ -71,7 +71,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase { if (vec3d == null) { return false; //Nowhere to run, gotta fight! - } else if (this.closestLivingEntity.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < this.closestLivingEntity.getDistanceSqToEntity(this.theEntity)) { + } 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); @@ -112,13 +112,13 @@ public class EntityAIRetreatToHeal extends EntityAIBase { @Override public void updateTask() { if (this.closestLivingEntity != null) { - if (this.theEntity.getDistanceSqToEntity(this.closestLivingEntity) < 49.0D) { + 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.getDistanceSqToEntity(this.closestLivingEntity) >= safeHealDistance * safeHealDistance) { + if (this.theEntity.ticksExisted % 20 == 0 && this.theEntity.getDistanceSq(this.closestLivingEntity) >= safeHealDistance * safeHealDistance) { healEntity(); return; } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java index bf7e5540..51600496 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java @@ -47,7 +47,7 @@ public class EntityAIStealthRetreat extends EntityAIBase { if (vec3d == null) { return false; - } else if (attacked.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < attacked.getDistanceSqToEntity(this.entity)) { + } 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); @@ -87,7 +87,7 @@ public class EntityAIStealthRetreat extends EntityAIBase { return; } - if (this.entity.getDistanceSqToEntity(this.entity.getAttackTarget()) < 49.0D) { + if (this.entity.getDistanceSq(this.entity.getAttackTarget()) < 49.0D) { this.entity.getNavigator().setSpeed(this.nearSpeed); } else { this.entity.getNavigator().setSpeed(this.farSpeed); diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java index 5e8c75b0..871bfb50 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java @@ -93,7 +93,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase { super.onUpdate(); if (!this.getEntityWorld().isRemote) { - this.setBesideClimbableBlock(this.isCollidedHorizontally); + this.setBesideClimbableBlock(this.collidedHorizontally); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index 2fdb7dd0..0661115a 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -215,7 +215,7 @@ public class EntityMimic extends EntityDemonBase { super.onUpdate(); if (!this.getEntityWorld().isRemote) { - this.setBesideClimbableBlock(this.isCollidedHorizontally); + this.setBesideClimbableBlock(this.collidedHorizontally); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 95557f14..084df078 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -410,7 +410,7 @@ public class EntitySentientSpecter extends EntityDemonBase { 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.setThrowableHeading(d0, d1 + d3 * 0.2, d2, 1.6F, 0); //TODO: Yes, it is an accurate arrow. Don't be hatin' + 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().getDifficultyId() * 0.11F)); diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index 712a9f98..c596696c 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -46,7 +46,7 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit motionX = -MathHelper.sin(rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float) Math.PI); motionZ = MathHelper.cos(rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float) Math.PI); motionY = -MathHelper.sin(rotationPitch / 180.0F * (float) Math.PI); - this.setThrowableHeading(motionX, motionY, motionZ, par3 * 1.5F, 1.0F); + this.shoot(motionX, motionY, motionZ, par3 * 1.5F, 1.0F); } @Override @@ -55,7 +55,7 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit } @Override - public void setThrowableHeading(double var1, double var3, double var5, float var7, float var8) { + 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; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 26831f4c..651a8e91 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -82,8 +82,8 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) continue; - if (blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1.0F) { - float strengthVsBlock = getStrVsBlock(stack, blockStack.getState()); + if (blockStack.getState().getBlockHardness(world, blockPos) != -1.0F) { + float strengthVsBlock = getDestroySpeed(stack, blockStack.getState()); if (strengthVsBlock > 1.1F || blockStack.getBlock() instanceof BlockLeaves && world.canMineBlockBody(player, blockPos)) { if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index bc2c47f3..37076c1e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -60,11 +60,11 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) { + public float getDestroySpeed(ItemStack stack, IBlockState state) { if (!getActivated(stack)) return 1.0F; - return state.getMaterial() != Material.IRON && state.getMaterial() != Material.ANVIL && state.getMaterial() != Material.ROCK ? super.getStrVsBlock(stack, state) : this.efficiencyOnProperMaterial; + return state.getMaterial() != Material.IRON && state.getMaterial() != Material.ANVIL && state.getMaterial() != Material.ROCK ? super.getDestroySpeed(stack, state) : this.efficiency; } @Override @@ -97,7 +97,7 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { continue; if (blockStack.getBlock() != null && blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1) { - float strengthVsBlock = getStrVsBlock(stack, blockStack.getState()); + float strengthVsBlock = getDestroySpeed(stack, blockStack.getState()); if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index c122d617..2f2600ec 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -83,7 +83,7 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { continue; if (blockStack.getBlock() != null && blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1) { - float strengthVsBlock = getStrVsBlock(stack, blockStack.getState()); + float strengthVsBlock = getDestroySpeed(stack, blockStack.getState()); if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 0bbcea86..fae76626 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -63,8 +63,8 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) { - return getActivated(stack) ? toolMaterial.getEfficiencyOnProperMaterial() : 1.0F; + public float getDestroySpeed(ItemStack stack, IBlockState state) { + return getActivated(stack) ? toolMaterial.getEfficiency() : 1.0F; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index ba46d284..1444de0e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -98,7 +98,7 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider { return new ActionResult(EnumActionResult.SUCCESS, stack); } - int lpAdded = ConfigHandler.sacrificialDaggerConversion * ConfigHandler.sacrificialDaggerDamage; + int lpAdded = ConfigHandler.values.sacrificialDaggerConversion * 2; RayTraceResult rayTrace = rayTrace(world, player, false); if (rayTrace != null && rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { @@ -109,14 +109,14 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider { } if (!player.capabilities.isCreativeMode) { - SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, ConfigHandler.sacrificialDaggerDamage, lpAdded); + 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(BloodMagicAPI.damageSource, 0.001F); - player.setHealth(Math.max(player.getHealth() - ConfigHandler.sacrificialDaggerDamage, 0.0001f)); + player.setHealth(Math.max(player.getHealth() - 2, 0.0001f)); if (player.getHealth() <= 0.001f) { player.onDeath(BloodMagicAPI.damageSource); player.setHealth(0); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index c2b82f28..b86fc3ea 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -82,8 +82,8 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) { - float value = super.getStrVsBlock(stack, state); + public float getDestroySpeed(ItemStack stack, IBlockState state) { + float value = super.getDestroySpeed(stack, state); if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); } else { diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 97b87625..ef658a06 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -264,13 +264,12 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien float newArrowVelocity = velocity * getVelocityOfArrow(stack); EntitySentientArrow entityArrow = new EntitySentientArrow(world, user, type, amount); - entityArrow.setAim(user, user.rotationPitch, user.rotationYaw, 0.0F, newArrowVelocity, 1.0F); 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.setThrowableHeading(d0, d1 + d3 * 0.05, d2, newArrowVelocity, 0); + 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); @@ -334,7 +333,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien float newArrowVelocity = arrowVelocity * getVelocityOfArrow(stack); EntitySentientArrow entityArrow = new EntitySentientArrow(world, entityLiving, type, amount); - entityArrow.setAim(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); + entityArrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); if (newArrowVelocity == 0) { world.playSound(null, player.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 05c51b19..ca8a0502 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -82,8 +82,8 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) { - float value = super.getStrVsBlock(stack, state); + public float getDestroySpeed(ItemStack stack, IBlockState state) { + float value = super.getDestroySpeed(stack, state); if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); } else { diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index 2edd2b73..e86ee440 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -82,8 +82,8 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public float getStrVsBlock(ItemStack stack, IBlockState state) { - float value = super.getStrVsBlock(stack, state); + public float getDestroySpeed(ItemStack stack, IBlockState state) { + float value = super.getDestroySpeed(stack, state); if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); } else { diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index e6d76d8c..f422be70 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -44,7 +44,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider { if (!worldIn.isRemote) { EntitySoulSnare snare = new EntitySoulSnare(worldIn, playerIn); - snare.setHeadingFromThrower(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); + snare.shoot(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); worldIn.spawnEntity(snare); } diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index 1c482c0d..e5aadc77 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -63,7 +63,7 @@ public class MeteorConfigHandler { reader.close(); } - if (checkNewVersion && ConfigHandler.config.getBoolean("resyncOnVersionChange", "Meteors", true, "Should the default meteors be regenerated if the mod has updated them")) { + if (checkNewVersion && ConfigHandler.values.shouldResyncMeteors) { Set discoveredDefaults = Sets.newHashSet(); // Check existing defaults for new version @@ -93,8 +93,6 @@ public class MeteorConfigHandler { } catch (Exception e) { e.printStackTrace(); } - - ConfigHandler.config.save(); } private static List> getDefaultMeteors() { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 30cde112..6cf39b59 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.alchemyArray.*; import WayofTime.bloodmagic.api.altar.EnumAltarTier; import WayofTime.bloodmagic.api.compress.CompressionRegistry; @@ -47,6 +46,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.common.ForgeModContainer; +import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.tuple.Pair; @@ -559,7 +559,7 @@ public class ModRecipes { private static void setupDir() { if (RECIPE_DIR == null) { - RECIPE_DIR = ConfigHandler.config.getConfigFile().toPath().resolve("../recipes/").toFile(); + RECIPE_DIR = new File(Loader.instance().getConfigDir(), "bloodmagic/recipes"); } if (!RECIPE_DIR.exists()) { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index ad026e23..3d0def9a 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -42,7 +42,6 @@ public class ModRituals { public static Ritual forsakenSoulRitual; public static Ritual crystalHarvestRitual; - // public static Ritual cobblestoneRitual; public static Ritual placerRitual; public static Ritual fellingRitual; public static Ritual pumpRitual; @@ -60,68 +59,64 @@ public class ModRituals { public static void initRituals() { waterRitual = new RitualWater(); - RitualRegistry.registerRitual(waterRitual, ConfigHandler.ritualWater); + RitualRegistry.registerRitual(waterRitual, ConfigHandler.rituals.ritualWater); lavaRitual = new RitualLava(); - RitualRegistry.registerRitual(lavaRitual, ConfigHandler.ritualLava); + RitualRegistry.registerRitual(lavaRitual, ConfigHandler.rituals.ritualLava); greenGroveRitual = new RitualGreenGrove(); - RitualRegistry.registerRitual(greenGroveRitual, ConfigHandler.ritualGreenGrove); + RitualRegistry.registerRitual(greenGroveRitual, ConfigHandler.rituals.ritualGreenGrove); jumpRitual = new RitualJumping(); - RitualRegistry.registerRitual(jumpRitual, ConfigHandler.ritualJumping); + RitualRegistry.registerRitual(jumpRitual, ConfigHandler.rituals.ritualJumping); sufferingRitual = new RitualWellOfSuffering(); - RitualRegistry.registerRitual(sufferingRitual, ConfigHandler.ritualWellOfSuffering); + RitualRegistry.registerRitual(sufferingRitual, ConfigHandler.rituals.ritualWellOfSuffering); featheredKnifeRitual = new RitualFeatheredKnife(); - RitualRegistry.registerRitual(featheredKnifeRitual, ConfigHandler.ritualFeatheredKnife); + RitualRegistry.registerRitual(featheredKnifeRitual, ConfigHandler.rituals.ritualFeatheredKnife); regenerationRitual = new RitualRegeneration(); - RitualRegistry.registerRitual(regenerationRitual, ConfigHandler.ritualRegeneration); + RitualRegistry.registerRitual(regenerationRitual, ConfigHandler.rituals.ritualRegeneration); animalGrowthRitual = new RitualAnimalGrowth(); - RitualRegistry.registerRitual(animalGrowthRitual, ConfigHandler.ritualAnimalGrowth); + RitualRegistry.registerRitual(animalGrowthRitual, ConfigHandler.rituals.ritualAnimalGrowth); harvestRitual = new RitualHarvest(); - RitualRegistry.registerRitual(harvestRitual, ConfigHandler.ritualHarvest); + RitualRegistry.registerRitual(harvestRitual, ConfigHandler.rituals.ritualHarvest); initHarvestHandlers(); magneticRitual = new RitualMagnetic(); - RitualRegistry.registerRitual(magneticRitual, ConfigHandler.ritualMagnetic); + RitualRegistry.registerRitual(magneticRitual, ConfigHandler.rituals.ritualMagnetic); crushingRitual = new RitualCrushing(); - RitualRegistry.registerRitual(crushingRitual, ConfigHandler.ritualCrushing); + RitualRegistry.registerRitual(crushingRitual, ConfigHandler.rituals.ritualCrushing); stomachRitual = new RitualFullStomach(); - RitualRegistry.registerRitual(stomachRitual, ConfigHandler.ritualFullStomach); + RitualRegistry.registerRitual(stomachRitual, ConfigHandler.rituals.ritualFullStomach); interdictionRitual = new RitualInterdiction(); - RitualRegistry.registerRitual(interdictionRitual, ConfigHandler.ritualInterdiction); + RitualRegistry.registerRitual(interdictionRitual, ConfigHandler.rituals.ritualInterdiction); containmentRitual = new RitualContainment(); - RitualRegistry.registerRitual(containmentRitual, ConfigHandler.ritualContainment); + RitualRegistry.registerRitual(containmentRitual, ConfigHandler.rituals.ritualContainment); speedRitual = new RitualSpeed(); - RitualRegistry.registerRitual(speedRitual, ConfigHandler.ritualSpeed); + RitualRegistry.registerRitual(speedRitual, ConfigHandler.rituals.ritualSpeed); suppressionRitual = new RitualSuppression(); - RitualRegistry.registerRitual(suppressionRitual, ConfigHandler.ritualSuppression); + RitualRegistry.registerRitual(suppressionRitual, ConfigHandler.rituals.ritualSuppression); zephyrRitual = new RitualZephyr(); - RitualRegistry.registerRitual(zephyrRitual, ConfigHandler.ritualZephyr); + RitualRegistry.registerRitual(zephyrRitual, ConfigHandler.rituals.ritualZephyr); expulsionRitual = new RitualExpulsion(); - RitualRegistry.registerRitual(expulsionRitual, ConfigHandler.ritualExpulsion); + RitualRegistry.registerRitual(expulsionRitual, ConfigHandler.rituals.ritualExpulsion); upgradeRemoveRitual = new RitualUpgradeRemove(); - RitualRegistry.registerRitual(upgradeRemoveRitual, ConfigHandler.ritualUpgradeRemove); + RitualRegistry.registerRitual(upgradeRemoveRitual, ConfigHandler.rituals.ritualUpgradeRemove); armourEvolveRitual = new RitualArmourEvolve(); - RitualRegistry.registerRitual(armourEvolveRitual, ConfigHandler.ritualArmourEvolve); + RitualRegistry.registerRitual(armourEvolveRitual, ConfigHandler.rituals.ritualArmourEvolve); forsakenSoulRitual = new RitualForsakenSoul(); - RitualRegistry.registerRitual(forsakenSoulRitual, ConfigHandler.ritualForsakenSoul); + RitualRegistry.registerRitual(forsakenSoulRitual, ConfigHandler.rituals.ritualForsakenSoul); crystalHarvestRitual = new RitualCrystalHarvest(); - RitualRegistry.registerRitual(crystalHarvestRitual, ConfigHandler.ritualCrystalHarvest); - -// cobblestoneRitual = new RitualCobblestone(); -// RitualRegistry.registerRitual(cobblestoneRitual, ConfigHandler.cobblestoneRitual); + RitualRegistry.registerRitual(crystalHarvestRitual, ConfigHandler.rituals.ritualCrystalHarvest); placerRitual = new RitualPlacer(); - RitualRegistry.registerRitual(placerRitual, ConfigHandler.placerRitual); + RitualRegistry.registerRitual(placerRitual, ConfigHandler.rituals.ritualPlacer); fellingRitual = new RitualFelling(); - RitualRegistry.registerRitual(fellingRitual, ConfigHandler.fellingRitual); + RitualRegistry.registerRitual(fellingRitual, ConfigHandler.rituals.ritualFelling); pumpRitual = new RitualPump(); - RitualRegistry.registerRitual(pumpRitual, ConfigHandler.pumpRitual); + RitualRegistry.registerRitual(pumpRitual, ConfigHandler.rituals.ritualPump); altarBuilderRitual = new RitualAltarBuilder(); - RitualRegistry.registerRitual(altarBuilderRitual, ConfigHandler.altarBuilderRitual); + RitualRegistry.registerRitual(altarBuilderRitual, ConfigHandler.rituals.ritualAltarBuilder); portalRitual = new RitualPortal(); - RitualRegistry.registerRitual(portalRitual, ConfigHandler.portalRitual); + RitualRegistry.registerRitual(portalRitual, ConfigHandler.rituals.ritualPortal); meteorRitual = new RitualMeteor(); - RitualRegistry.registerRitual(meteorRitual, ConfigHandler.meteorRitual); - + RitualRegistry.registerRitual(meteorRitual, ConfigHandler.rituals.ritualMeteor); downgradeRitual = new RitualLivingArmourDowngrade(); - RitualRegistry.registerRitual(downgradeRitual, ConfigHandler.downgradeRitual); + RitualRegistry.registerRitual(downgradeRitual, ConfigHandler.rituals.ritualDowngrade); RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 250, 0.5); RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE), 25, 0.05); @@ -129,13 +124,13 @@ public class ModRituals { public static void initImperfectRituals() { imperfectNight = new ImperfectRitualNight(); - ImperfectRitualRegistry.registerRitual(imperfectNight, ConfigHandler.imperfectRitualNight); + ImperfectRitualRegistry.registerRitual(imperfectNight, ConfigHandler.rituals.imperfect.imperfectRitualNight); imperfectRain = new ImperfectRitualRain(); - ImperfectRitualRegistry.registerRitual(imperfectRain, ConfigHandler.imperfectRitualRain); + ImperfectRitualRegistry.registerRitual(imperfectRain, ConfigHandler.rituals.imperfect.imperfectRitualRain); imperfectResistance = new ImperfectRitualResistance(); - ImperfectRitualRegistry.registerRitual(imperfectResistance, ConfigHandler.imperfectRitualResistance); + ImperfectRitualRegistry.registerRitual(imperfectResistance, ConfigHandler.rituals.imperfect.imperfectRitualResistance); imperfectZombie = new ImperfectRitualZombie(); - ImperfectRitualRegistry.registerRitual(imperfectZombie, ConfigHandler.imperfectRitualZombie); + ImperfectRitualRegistry.registerRitual(imperfectZombie, ConfigHandler.rituals.imperfect.imperfectRitualZombie); } public static void initHarvestHandlers() { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index 9cc17048..5c9b254a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -136,7 +136,7 @@ public class RitualExpulsion extends Ritual { if (flag1) { moveEntityViaTeleport(entityLiving, entityLiving.posX, entityLiving.posY, entityLiving.posZ); - if (!entityLiving.isCollided && !entityLiving.getEntityWorld().containsAnyLiquid(entityLiving.getEntityBoundingBox())) { + if (!entityLiving.collided && !entityLiving.getEntityWorld().containsAnyLiquid(entityLiving.getEntityBoundingBox())) { flag = true; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index 60dce160..38a5b4fb 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -152,7 +152,7 @@ public class RitualFeatheredKnife extends Ritual { player.setHealth(health - sacrificedHealth); - tileAltar.sacrificialDaggerCall((int) (ConfigHandler.sacrificialDaggerConversion * lpModifier * sacrificedHealth), false); + tileAltar.sacrificialDaggerCall((int) (ConfigHandler.values.sacrificialDaggerConversion * lpModifier * sacrificedHealth), false); totalEffects++; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 6f704b07..de8a4a54 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -112,7 +112,7 @@ public class RitualForsakenSoul extends Ritual { if (!entity.isEntityAlive()) { int uniqueness = calculateUniqueness(entity); double modifier = 1; - if (entity instanceof EntityAnimal && !entity.isCollided) { + if (entity instanceof EntityAnimal && !((EntityAnimal) entity).collided) { modifier = 4; } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index c92e1267..8c9aa9ee 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -311,7 +311,7 @@ public class ClientHandler { public static void cycleSigil(ItemStack stack, EntityPlayer player, int dWheel) { int mode = dWheel; - if (!ConfigHandler.sigilHoldingSkipsEmptySlots) { + if (!ConfigHandler.client.sigilHoldingSkipsEmptySlots) { mode = ItemSigilHolding.getCurrentItemOrdinal(stack); mode = dWheel < 0 ? ItemSigilHolding.next(mode) : ItemSigilHolding.prev(mode); } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index 366c9c1f..f47c2065 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.event.AltarCraftedEvent; @@ -51,19 +50,20 @@ public class CraftingHandler { // Handles crafting of: Revealing Upgrade Tome, Elytra Upgrade Tome, Combining Upgrade Tomes, Setting Upgrade for Trainer @SubscribeEvent public void onAnvil(AnvilUpdateEvent event) { - 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; - } - } + // 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) { 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 74d75c62..3a94876a 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -186,7 +186,7 @@ public class GenericHandler { boolean shouldSyphon = pack.getStoredLP(player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) < pack.CAPACITY; float damageDone = event.getEntityLiving().getHealth() < event.getAmount() ? event.getAmount() - event.getEntityLiving().getHealth() : event.getAmount(); - int totalLP = Math.round(damageDone * ConfigHandler.sacrificialPackConversion); + int totalLP = Math.round(damageDone * ConfigHandler.values.coatOfArmsConversion); if (shouldSyphon) ItemHelper.LPContainer.addLPToItem(player.getItemStackFromSlot(EntityEquipmentSlot.CHEST), totalLP, pack.CAPACITY); @@ -228,7 +228,7 @@ public class GenericHandler { attackTaskMap.put(animal, attackTask); } - if (animal.getAttackTarget() != null && animal.getDistanceSqToEntity(animal.getAttackTarget()) < 4) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 903d77e9..5488e7e1 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -284,7 +284,7 @@ public class LivingArmourHandler { ItemStack arrowStack = new ItemStack(Items.ARROW); ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); EntityArrow entityarrow = itemarrow.createArrow(world, arrowStack, player); - entityarrow.setAim(player, player.rotationPitch, player.rotationYaw, 0.0F, velocity * 3.0F, 1.0F); + entityarrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, velocity * 3.0F, 1.0F); float velocityModifier = 0.6f * velocity; From cc8d5af4018042c2bcb8e83b5bea27ce5dd9e770 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 19 Aug 2017 19:00:09 -0700 Subject: [PATCH 131/595] Rename meteor files to lowercase (cherry picked from commit 59df51a) --- .../bloodmagic/meteor/MeteorConfigHandler.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index e5aadc77..c608e061 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -136,14 +136,14 @@ public class MeteorConfigHandler { Meteor diamondMeteor = new Meteor(new ItemStack(Blocks.DIAMOND_BLOCK), diamondMeteorList, 10, 3); diamondMeteor.setVersion(3); - holders.add(Pair.of("IronMeteor", ironMeteor)); - DEFAULT_METEORS.put("IronMeteor", ironMeteor); + holders.add(Pair.of("iron", ironMeteor)); + DEFAULT_METEORS.put("iron", ironMeteor); - holders.add(Pair.of("GoldMeteor", goldMeteor)); - DEFAULT_METEORS.put("GoldMeteor", goldMeteor); + holders.add(Pair.of("gold", goldMeteor)); + DEFAULT_METEORS.put("gold", goldMeteor); - holders.add(Pair.of("DiamondMeteor", diamondMeteor)); - DEFAULT_METEORS.put("DiamondMeteor", diamondMeteor); + holders.add(Pair.of("diamond", diamondMeteor)); + DEFAULT_METEORS.put("diamond", diamondMeteor); return holders; } From 42931bcf0e4c0811403fcaf408bde5198a786235 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 19 Aug 2017 20:45:11 -0700 Subject: [PATCH 132/595] JSON recipes, much to the displeasure of Elucent and shadows feelsgoodman (cherry picked from commit c23d577) --- .../core/RegistrarBloodMagicRecipes.java | 34 ++ .../bloodmagic/item/ItemBloodOrb.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 298 +----------------- .../assets/bloodmagic/recipes/_constants.json | 128 ++++++++ .../recipes/activation_crystal.json | 16 + .../bloodmagic/recipes/alchemy_table.json | 29 ++ .../assets/bloodmagic/recipes/altar.json | 26 ++ .../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 | 17 + .../demon_brick_2_smallbrick_destructive.json | 17 + .../demon_brick_2_smallbrick_raw.json | 17 + .../demon_brick_2_smallbrick_steadfast.json | 17 + .../demon_brick_2_smallbrick_vengeful.json | 17 + .../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_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 ++ 137 files changed, 3312 insertions(+), 298 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java create mode 100644 src/main/resources/assets/bloodmagic/recipes/_constants.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/activation_crystal.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/alchemy_table.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/altar.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/base_item_filter_0.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/base_item_filter_1.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/base_item_filter_2.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/base_item_filter_3.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_acceleration.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_augcapacity.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_blank.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_capacity.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_charging.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_displacement.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_orb.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_sacrifice.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_selfsacrifice.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_speed.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_0.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_1.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_10.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_11.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_12.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_13.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_14.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_15.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_2.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_3.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_4.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_5.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_6.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_7.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_8.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_9.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_brick.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_tile.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_3_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_3_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_vengeful.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/experience_tome.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/incense_altar.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/lava_crystal.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/mimic_nohitbox.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/mimic_solidclear.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/mimic_solidlight.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/mimic_solidopaque.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/pack_sacrifice.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/pack_self_sacrifice.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_obsidian.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_obsidiantile.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_stone.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_stonetile.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_wood.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_woodtile.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_wornstone.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_wornstonetile.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_controller_imperfect.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_controller_inverted.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_controller_master.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_controller_master_alt.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_diviner_0.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_diviner_1.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_reader.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_stone_blank.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_stone_reset.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/sacrificial_dagger.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/soul_forge.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/soul_snare.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/teleposer.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/teleposition_focus_2.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/teleposition_focus_3.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/upgrade_trainer.json diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java new file mode 100644 index 00000000..542ce653 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -0,0 +1,34 @@ +package WayofTime.bloodmagic.core; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.item.ItemDemonCrystal; +import WayofTime.bloodmagic.item.soul.ItemSoulGem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +@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 (int j = 0; j < ItemDemonCrystal.NAMES.size(); j++) { + ItemStack baseGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); + ItemStack newGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); + + ItemStack crystalStack = new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, j); + + EnumDemonWillType willType = ((ItemDemonCrystal) RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL).getType(crystalStack); + ((ItemSoulGem) RegistrarBloodMagicItems.SOUL_GEM).setCurrentType(willType, newGemStack); + ShapelessOreRecipe shapeless = new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "soul_gem"), newGemStack, baseGemStack, crystalStack); + event.getRegistry().register(shapeless.setRegistryName("soul_gem_" + willType.getName())); + } + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 46f441da..0b7311a5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -94,7 +94,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab BloodOrb orb = getOrb(stack); if (flag.isAdvanced() && orb != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", orb.getRegistryName())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", orb.getRegistryName().getResourceDomain())); super.addInformation(stack, world, tooltip, flag); } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 6cf39b59..2b27d46d 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -6,12 +6,9 @@ import WayofTime.bloodmagic.api.altar.EnumAltarTier; import WayofTime.bloodmagic.api.compress.CompressionRegistry; import WayofTime.bloodmagic.api.iface.ISigil; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; import WayofTime.bloodmagic.api.recipe.AlchemyTableCustomRecipe; import WayofTime.bloodmagic.api.registry.*; import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.block.enums.EnumBloodRune; import WayofTime.bloodmagic.client.render.alchemyArray.*; import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; import WayofTime.bloodmagic.compress.BaseCompressionHandler; @@ -23,22 +20,15 @@ import WayofTime.bloodmagic.item.ItemComponent; import WayofTime.bloodmagic.item.ItemDemonCrystal; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; -import WayofTime.bloodmagic.item.soul.ItemSoulGem; import WayofTime.bloodmagic.livingArmour.downgrade.*; import WayofTime.bloodmagic.potion.BMPotionUtils; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableDyeableRecipe; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionRecipe; -import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Stopwatch; -import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.init.MobEffects; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.potion.PotionEffect; @@ -46,29 +36,21 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.common.ForgeModContainer; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.tuple.Pair; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; import java.util.*; import java.util.Map.Entry; public class ModRecipes { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - private static final Set USED_OD_NAMES = new TreeSet<>(); + public static ArrayList addedOreRecipeList = new ArrayList(); static ItemStack mundaneLengtheningStack = ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1); static ItemStack mundanePowerStack = ItemComponent.getStack(ItemComponent.CATALYST_POWER_1); - private static File RECIPE_DIR = null; public static void init() { initOreDict(); addFurnaceRecipes(); -// addCraftingRecipes(); addAltarRecipes(); addAlchemyArrayRecipes(); addSoulForgeRecipes(); @@ -89,123 +71,6 @@ public class ModRecipes { FurnaceRecipes.instance().addSmeltingRecipe(ItemComponent.getStack(ItemComponent.SAND_GOLD), new ItemStack(Items.GOLD_INGOT), (float) 0.15); } - public static void addCraftingRecipes() { - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE), "i i", "sgs", "sos", 'i', "ingotIron", 's', "stone", 'g', "ingotGold", 'o', "blockIron"); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.SACRIFICIAL_DAGGER), "aaa", " ba", "c a", 'a', "blockGlass", 'b', "ingotGold", 'c', "ingotIron"); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.ALTAR), "a a", "aba", "cdc", 'a', "stone", 'b', Blocks.FURNACE, 'c', "ingotGold", 'd', new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL)); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.PACK_SELF_SACRIFICE), "aba", "cdc", "aea", 'a', "blockGlass", 'b', Items.BUCKET, 'c', Items.FLINT, 'd', Items.LEATHER_CHESTPLATE, 'e', RegistrarBloodMagicItems.SLATE); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.PACK_SACRIFICE), "aba", "cdc", "aea", 'a', "blockGlass", 'b', Items.BUCKET, 'c', "ingotIron", 'd', Items.LEATHER_CHESTPLATE, 'e', RegistrarBloodMagicItems.SLATE); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER), "dfd", "ase", "dwd", 'f', EnumRuneType.FIRE.getScribeStack(), 'a', EnumRuneType.AIR.getScribeStack(), 'w', EnumRuneType.WATER.getScribeStack(), 'e', EnumRuneType.EARTH.getScribeStack(), 'd', "gemDiamond", 's', "stickWood"); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER, 1, 1), " S ", "tdt", " S ", 'S', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 't', EnumRuneType.DUSK.getScribeStack(), 'd', new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER)); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 4, 1), "aa", "aa", 'a', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK)); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 16), "stone", new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL, 1, 1), new ItemStack(Items.NETHER_STAR), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE)); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE, 4, 0), "sis", "iri", "sis", 's', "string", 'i', "ingotIron", 'r', "dustRedstone"); - - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_TANK), "RBR", "G G", "RRR", 'R', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'B', RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 'G', "blockGlass"); - for (int i = 1; i < TileBloodTank.CAPACITIES.length; i++) - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_TANK, 1, i), "RBR", "T T", "RRR", 'R', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'B', RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 'T', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_TANK, 1, i - 1)); - - addShapelessRecipe(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 2), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 3), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 2), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 1)); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER), "ggg", "efe", "ggg", 'g', "ingotGold", 'e', new ItemStack(Items.ENDER_PEARL), 'f', RegistrarBloodMagicItems.TELEPOSITION_FOCUS); - -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL), "aba", "bcb", "ded", 'a', "blockGlass", 'b', Items.LAVA_BUCKET, 'c', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), 'd', Blocks.OBSIDIAN, 'e', "gemDiamond")); -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), "aaa", "bcb", "aaa", 'a', "stone", 'b', RegistrarBloodMagicItems.SLATE, 'c', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK))); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1), "aba", "cdc", "aba", 'a', "stone", 'b', RegistrarBloodMagicItems.SLATE, 'c', Items.SUGAR, 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE)); //Speed -// addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.bloodRune, 1, 2), "aba", "cdc", "aba", 'a', "stone", 'b', RegistrarBloodMagicItems.slate, 'c', Items.sugar, 'd', new ItemStack(RegistrarBloodMagicBlocks.bloodRune))); //Efficiency -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3), "aba", "cdc", "aea", 'a', "stone", 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), 'c', "ingotGold", 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_APPRENTICE))); //Sacrifice -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4), "aba", "cdc", "aea", 'a', "stone", 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), 'c', "dustGlowstone", 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_APPRENTICE))); //Self-Sacrifice - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 5), "aba", "bcb", "ada", 'a', "stone", 'b', Items.WATER_BUCKET, 'c', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'd', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); //Displacement - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 6), "aba", "bcb", "ada", 'a', "stone", 'b', Items.BUCKET, 'c', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'd', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); //Capacity -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 7), "aba", "cdc", "aea", 'a', Blocks.OBSIDIAN, 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 'c', Items.BUCKET, 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 6), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); //Augmented Capacity -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 8), "aba", "cdc", "aba", 'a', "stone", 'b', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), 'c', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'd', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); //Orb -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 9), "aba", "cdc", "aea", 'a', Items.BUCKET, 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 'c', "ingotGold", 'd', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); //Acceleration -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 10), "RsR", "GrG", "ReR", 'G', "glowstone", 's', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 'R', "dustRedstone", 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1), 'e', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); //Charging -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE, 4), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), 'c', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_APPRENTICE))); -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', RegistrarBloodMagicBlocks.RITUAL_STONE, 'c', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 1), "aba", "bcb", "aba", 'a', Blocks.OBSIDIAN, 'b', "stone", 'c', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK))); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), new ItemStack(Blocks.REDSTONE_TORCH), new ItemStack(RegistrarBloodMagicItems.SLATE)); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 2)); - - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.BASE_ITEM_FILTER, 1, 0), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "blockGlass", 's', "stickWood"); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.BASE_ITEM_FILTER, 1, 1), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyeYellow", 's', "stickWood"); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.BASE_ITEM_FILTER, 1, 2), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyeGreen", 's', "stickWood"); - addShapedRecipe(new ItemStack(RegistrarBloodMagicItems.BASE_ITEM_FILTER, 1, 3), "sgs", "gfg", "sgs", 'f', ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 'g', "dyePurple", 's', "stickWood"); - -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicItems.UPGRADE_TRAINER), "ngn", "ioi", "ngn", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), 'i', "ingotIron", 'n', "nuggetGold", 'g', "ingotGold")); - -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.INCENSE_ALTAR), "s s", "shs", "coc", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), 's', "stone", 'c', "cobblestone", 'h', new ItemStack(Items.COAL, 1, 1))); -// GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 0), "plankWood", "plankWood", "plankWood", "plankWood", OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE))); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 1), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0)); -// GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 2), "stone", "stone", "stone", "stone", OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN))); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 3), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2)); -// GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 4), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 2), OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 5), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 4), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 4), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 4), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 4)); -// GameRegistry.addRecipe(new ShapelessBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 6), Blocks.OBSIDIAN, Blocks.OBSIDIAN, Blocks.OBSIDIAN, Blocks.OBSIDIAN, OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE))); - addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.PATH, 4, 7), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 6), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 6), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 6), new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 6)); - -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicItems.EXPERIENCE_TOME), "ses", "lbl", "gog", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), 'e', Blocks.LAPIS_BLOCK, 'l', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), 'b', Items.ENCHANTED_BOOK, 's', "string", 'g', "ingotGold")); -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicItems.RITUAL_READER), "gog", "isi", " s ", 's', new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 'g', "blockGlass", 'i', "ingotGold", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MASTER))); -// -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.ALCHEMY_TABLE), "sss", "wbw", "gog", 's', "stone", 'w', "plankWood", 'b', Items.BLAZE_ROD, 'g', "ingotGold", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_WEAK))); - - for (int i = 1; i < EnumBloodRune.values().length; i++) - addShapelessRecipe(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, i)); - - for (int i = 0; i < ItemSoulGem.names.length; i++) { - for (int j = 0; j < ItemDemonCrystal.NAMES.size(); j++) { - ItemStack baseGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); - ItemStack newGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); - - ItemStack crystalStack = new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, j); - - ((ItemSoulGem) RegistrarBloodMagicItems.SOUL_GEM).setCurrentType(((ItemDemonCrystal) RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL).getType(crystalStack), newGemStack); - addShapelessRecipe(newGemStack, baseGemStack, crystalStack); - } - } - -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 4, 0), "b b", " r ", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 4, 1), "bsb", "srs", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 's', "stone", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 4, 2), "bsb", "srs", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 's', "blockGlass", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); -// GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 2, 3), "bnb", "trt", "bob", 'b', new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK), 'r', new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE), 'n', "glowstone", 't', "torch", 'o', OrbRegistry.getOrbStack(RegistrarBloodMagicItems.ORB_MAGICIAN))); - - for (int i = 0; i < 5; i++) { - ItemStack crystalStack = new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, i); - ItemStack baseStoneStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_EXTRAS, 1, i); - ItemStack baseStoneStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_EXTRAS, 16, i); - ItemStack polishedStoneStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_EXTRAS, 1, i + 5); - ItemStack willBrickStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_1, 1, i); - ItemStack willBrickStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_1, 4, i); - - ItemStack willSmallBrickStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_2, 1, i); - ItemStack willSmallBrickStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_2, 1, i); - ItemStack pillarStack = new ItemStack(RegistrarBloodMagicBlocks.DEMON_PILLAR_1, 1, i); - ItemStack pillarStackCrafted = new ItemStack(RegistrarBloodMagicBlocks.DEMON_PILLAR_1, 6, i); - - addShapelessRecipe(baseStoneStackCrafted, crystalStack, "stone", "stone", "stone", "stone", "stone", "stone", "stone", "stone"); - addShapedRecipe(willBrickStackCrafted, "ss", "ss", 's', baseStoneStack); - addShapedRecipe(willSmallBrickStackCrafted, "ss", "ss", 's', willBrickStack); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_2, 9, i + 5), "scs", "ccc", "scs", 's', baseStoneStack, 'c', willBrickStack); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_BRICK_2, 9, i + 10), "scs", "coc", "scs", 's', baseStoneStack, 'c', willBrickStack, 'o', crystalStack); - addShapedRecipe(pillarStackCrafted, "ss", "ss", "ss", 's', polishedStoneStack); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PILLAR_2, 8, i), "ppp", "pcp", "ppp", 'p', pillarStack, 'c', crystalStack); - - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_WALL_1, 6, i), "sss", "sss", 's', willBrickStack); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_WALL_1, 6, i + 5), "sss", "sss", 's', willSmallBrickStack); - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_WALL_1, 6, i + 10), "sss", "sss", 's', polishedStoneStack); - - addShapedRecipe(new ItemStack(i < 2 ? RegistrarBloodMagicBlocks.DEMON_STAIRS_1 : (i < 4 ? RegistrarBloodMagicBlocks.DEMON_STAIRS_2 : RegistrarBloodMagicBlocks.DEMON_STAIRS_3), 8, i % 2), "s ", "ss ", "sss", 's', polishedStoneStack); - addShapedRecipe(new ItemStack(i < 2 ? RegistrarBloodMagicBlocks.DEMON_PILLAR_CAP_1 : (i < 4 ? RegistrarBloodMagicBlocks.DEMON_PILLAR_CAP_2 : RegistrarBloodMagicBlocks.DEMON_PILLAR_CAP_3), 6, i % 2), "sss", "sss", 's', pillarStack); - - addShapedRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_LIGHT, 5, i), "sgs", "ggg", "sgs", 's', polishedStoneStack, 'g', Blocks.GLOWSTONE); - - GameRegistry.addSmelting(baseStoneStack, polishedStoneStack, 0.15f); - } - - generateConstants(); - } - public static void addAltarRecipes() { // ONE AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE, RegistrarBloodMagic.ORB_WEAK.getCapacity(), 2, 1); @@ -556,165 +421,4 @@ public class ModRecipes { LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.NETHER_STAR, "gemDiamond", "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4)); } } - - private static void setupDir() { - if (RECIPE_DIR == null) { - RECIPE_DIR = new File(Loader.instance().getConfigDir(), "bloodmagic/recipes"); - } - - if (!RECIPE_DIR.exists()) { - RECIPE_DIR.mkdir(); - } - } - - private static void addShapedRecipe(ItemStack result, Object... components) { - setupDir(); - - // GameRegistry.addShapedRecipe(result, components); - - Map json = new HashMap<>(); - - List pattern = new ArrayList<>(); - int i = 0; - while (i < components.length && components[i] instanceof String) { - pattern.add((String) components[i]); - i++; - } - json.put("pattern", pattern); - - boolean isOreDict = false; - Map> key = new HashMap<>(); - Character curKey = null; - for (; i < components.length; i++) { - Object o = components[i]; - if (o instanceof Character) { - if (curKey != null) - throw new IllegalArgumentException("Provided two char keys in a row"); - curKey = (Character) o; - } else { - if (curKey == null) - throw new IllegalArgumentException("Providing object without a char key"); - if (o instanceof String) - isOreDict = true; - key.put(Character.toString(curKey), serializeItem(o)); - curKey = null; - } - } - json.put("key", key); - json.put("type", isOreDict ? "forge:ore_shaped" : "minecraft:crafting_shaped"); - json.put("result", serializeItem(result)); - - // names the json the same name as the output's registry name - // repeatedly adds _alt if a file already exists - // janky I know but it works - String suffix = result.getItem().getHasSubtypes() ? "_" + result.getItemDamage() : ""; - File f = new File(RECIPE_DIR, result.getItem().getRegistryName().getResourcePath() + suffix + ".json"); - - while (f.exists()) { - suffix += "_alt"; - f = new File(RECIPE_DIR, result.getItem().getRegistryName().getResourcePath() + suffix + ".json"); - } - - try (FileWriter w = new FileWriter(f)) { - GSON.toJson(json, w); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static void addShapelessRecipe(ItemStack result, Object... components) { - setupDir(); - - // addShapelessRecipe(result, components); - - Map json = new HashMap<>(); - - boolean isOreDict = false; - List> ingredients = new ArrayList<>(); - for (Object o : components) { - if (o instanceof String) - isOreDict = true; - ingredients.add(serializeItem(o)); - } - json.put("ingredients", ingredients); - json.put("type", isOreDict ? "forge:ore_shapeless" : "minecraft:crafting_shapeless"); - json.put("result", serializeItem(result)); - - // names the json the same name as the output's registry name - // repeatedly adds _alt if a file already exists - // janky I know but it works - String suffix = result.getItem().getHasSubtypes() ? "_" + result.getItemDamage() : ""; - File f = new File(RECIPE_DIR, result.getItem().getRegistryName().getResourcePath() + suffix + ".json"); - - while (f.exists()) { - suffix += "_alt"; - f = new File(RECIPE_DIR, result.getItem().getRegistryName().getResourcePath() + suffix + ".json"); - } - - - try (FileWriter w = new FileWriter(f)) { - GSON.toJson(json, w); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static Map serializeItem(Object thing) { - if (thing instanceof Item) { - return serializeItem(new ItemStack((Item) thing)); - } - if (thing instanceof Block) { - return serializeItem(new ItemStack((Block) thing)); - } - if (thing instanceof ItemStack) { - ItemStack stack = (ItemStack) thing; - - if (stack.getItem() instanceof IBloodOrb) { - Map ret = new HashMap<>(); - BloodOrb orb = ((IBloodOrb) stack.getItem()).getOrb(stack); - ret.put("orb", orb == null ? RegistrarBloodMagic.ORB_WEAK.getRegistryName().toString() : orb.getRegistryName().toString()); - return ret; - } - - Map ret = new HashMap<>(); - ret.put("item", stack.getItem().getRegistryName().toString()); - if (stack.getItem().getHasSubtypes() || stack.getItemDamage() != 0) { - ret.put("data", stack.getItemDamage()); - } - if (stack.getCount() > 1) { - ret.put("count", stack.getCount()); - } - - if (stack.hasTagCompound()) { - throw new IllegalArgumentException("nbt not implemented"); - } - - return ret; - } - if (thing instanceof String) { - Map ret = new HashMap<>(); - USED_OD_NAMES.add((String) thing); - ret.put("item", "#" + ((String) thing).toUpperCase(Locale.ROOT)); - return ret; - } - - throw new IllegalArgumentException("Not a block, item, stack, or od name"); - } - - private static void generateConstants() { - List> json = new ArrayList<>(); - for (String s : USED_OD_NAMES) { - Map entry = new HashMap<>(); - entry.put("name", s.toUpperCase(Locale.ROOT)); - entry.put("ingredient", ImmutableMap.of("type", "forge:ore_dict", "ore", s)); - json.add(entry); - } - - try (FileWriter w = new FileWriter(new File(RECIPE_DIR, "_constants.json"))) { - GSON.toJson(json, w); - } catch (IOException e) { - e.printStackTrace(); - - } - } } diff --git a/src/main/resources/assets/bloodmagic/recipes/_constants.json b/src/main/resources/assets/bloodmagic/recipes/_constants.json new file mode 100644 index 00000000..4685f9ef --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/_constants.json @@ -0,0 +1,128 @@ +[ + { + "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/activation_crystal.json b/src/main/resources/assets/bloodmagic/recipes/activation_crystal.json new file mode 100644 index 00000000..3f376baa --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/activation_crystal.json @@ -0,0 +1,16 @@ +{ + "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 new file mode 100644 index 00000000..ab2cc8c2 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/alchemy_table.json @@ -0,0 +1,29 @@ +{ + "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/altar.json b/src/main/resources/assets/bloodmagic/recipes/altar.json new file mode 100644 index 00000000..f346a26f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/altar.json @@ -0,0 +1,26 @@ +{ + "result": { + "item": "bloodmagic:altar" + }, + "pattern": [ + "a a", + "aba", + "cdc" + ], + "type": "forge:ore_shaped", + "key": { + "a": { + "item": "#STONE" + }, + "b": { + "item": "minecraft:furnace" + }, + "c": { + "item": "#INGOTGOLD" + }, + "d": { + "item": "bloodmagic:monster_soul", + "data": 0 + } + } +} \ 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 new file mode 100644 index 00000000..1655e10c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/base_item_filter_0.json @@ -0,0 +1,24 @@ +{ + "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 new file mode 100644 index 00000000..6f529b90 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/base_item_filter_1.json @@ -0,0 +1,24 @@ +{ + "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 new file mode 100644 index 00000000..8f82c2f4 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/base_item_filter_2.json @@ -0,0 +1,24 @@ +{ + "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 new file mode 100644 index 00000000..a7459853 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/base_item_filter_3.json @@ -0,0 +1,24 @@ +{ + "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 new file mode 100644 index 00000000..885311d0 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_acceleration.json @@ -0,0 +1,32 @@ +{ + "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 new file mode 100644 index 00000000..2c63c590 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_augcapacity.json @@ -0,0 +1,32 @@ +{ + "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 new file mode 100644 index 00000000..1a354301 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_blank.json @@ -0,0 +1,25 @@ +{ + "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 new file mode 100644 index 00000000..e3b8a876 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_capacity.json @@ -0,0 +1,28 @@ +{ + "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 new file mode 100644 index 00000000..7ebc7383 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_charging.json @@ -0,0 +1,32 @@ +{ + "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 new file mode 100644 index 00000000..54b8c8c4 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_displacement.json @@ -0,0 +1,28 @@ +{ + "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 new file mode 100644 index 00000000..9f76c1a9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_orb.json @@ -0,0 +1,29 @@ +{ + "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 new file mode 100644 index 00000000..70e2c399 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_sacrifice.json @@ -0,0 +1,32 @@ +{ + "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 new file mode 100644 index 00000000..af7f3bc3 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_selfsacrifice.json @@ -0,0 +1,32 @@ +{ + "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 new file mode 100644 index 00000000..b161a4af --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_speed.json @@ -0,0 +1,28 @@ +{ + "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 new file mode 100644 index 00000000..756d43af --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_0.json @@ -0,0 +1,25 @@ +{ + "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 new file mode 100644 index 00000000..5167464b --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_1.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..fdf4337f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_10.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..1aee0e5e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_11.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..ac198a0d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_12.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..7d3511fc --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_13.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..057ef84b --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_14.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..9c12b336 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_15.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..46e11986 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_2.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..62d52c96 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_3.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..88b6b83e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_4.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..8d6db55e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_5.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..9304a747 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_6.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..7decd313 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_7.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..8181bfae --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_8.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..e1237382 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_9.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..636c8710 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_brick.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..9dc01b3e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_tile.json @@ -0,0 +1,17 @@ +{ + "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 new file mode 100644 index 00000000..021815ad --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_corrosive.json @@ -0,0 +1,18 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_1", + "data": 1, + "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_brick_1_brick1_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_destructive.json new file mode 100644 index 00000000..ce28a636 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_destructive.json @@ -0,0 +1,18 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_1", + "data": 2, + "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_brick_1_brick1_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_raw.json new file mode 100644 index 00000000..60a2b525 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_raw.json @@ -0,0 +1,18 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_1", + "data": 0, + "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_brick_1_brick1_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_steadfast.json new file mode 100644 index 00000000..7aff9cee --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_steadfast.json @@ -0,0 +1,18 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_1", + "data": 4, + "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_brick_1_brick1_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_vengeful.json new file mode 100644 index 00000000..4904ae75 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_vengeful.json @@ -0,0 +1,18 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_1", + "data": 3, + "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_brick_2_smallbrick_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_corrosive.json new file mode 100644 index 00000000..11e92c0e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_corrosive.json @@ -0,0 +1,17 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_2", + "data": 1 + }, + "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 new file mode 100644 index 00000000..b3956493 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_destructive.json @@ -0,0 +1,17 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_2", + "data": 2 + }, + "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 new file mode 100644 index 00000000..7137a604 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_raw.json @@ -0,0 +1,17 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_2", + "data": 0 + }, + "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 new file mode 100644 index 00000000..24142cf4 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_steadfast.json @@ -0,0 +1,17 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_2", + "data": 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 new file mode 100644 index 00000000..6a889c25 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_vengeful.json @@ -0,0 +1,17 @@ +{ + "result": { + "item": "bloodmagic:demon_brick_2", + "data": 3 + }, + "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 new file mode 100644 index 00000000..cc134c02 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_corrosive.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..305ed3a7 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_destructive.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..a9aa5a77 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_raw.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..718356e2 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_steadfast.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..caa3ad55 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_vengeful.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..46cc1293 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_corrosive.json @@ -0,0 +1,27 @@ +{ + "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 new file mode 100644 index 00000000..17bc0d0e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_destructive.json @@ -0,0 +1,27 @@ +{ + "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 new file mode 100644 index 00000000..0e6832a4 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_raw.json @@ -0,0 +1,27 @@ +{ + "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 new file mode 100644 index 00000000..d221cbe8 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_steadfast.json @@ -0,0 +1,27 @@ +{ + "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 new file mode 100644 index 00000000..32fbbeec --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_vengeful.json @@ -0,0 +1,27 @@ +{ + "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_stone_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_corrosive.json new file mode 100644 index 00000000..28bf109a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_corrosive.json @@ -0,0 +1,38 @@ +{ + "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 new file mode 100644 index 00000000..b190c56f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_destructive.json @@ -0,0 +1,38 @@ +{ + "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 new file mode 100644 index 00000000..aeb276b6 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_raw.json @@ -0,0 +1,38 @@ +{ + "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 new file mode 100644 index 00000000..a03834f8 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_steadfast.json @@ -0,0 +1,38 @@ +{ + "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 new file mode 100644 index 00000000..86e63596 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_vengeful.json @@ -0,0 +1,38 @@ +{ + "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 new file mode 100644 index 00000000..6396fc8f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_corrosive.json @@ -0,0 +1,22 @@ +{ + "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 new file mode 100644 index 00000000..d7d99aa5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_destructive.json @@ -0,0 +1,22 @@ +{ + "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 new file mode 100644 index 00000000..8817d3ad --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_raw.json @@ -0,0 +1,22 @@ +{ + "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 new file mode 100644 index 00000000..cf27ceb3 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_steadfast.json @@ -0,0 +1,22 @@ +{ + "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 new file mode 100644 index 00000000..dfcf5d75 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_vengeful.json @@ -0,0 +1,22 @@ +{ + "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 new file mode 100644 index 00000000..4448dbfe --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_corrosive.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..c7ae8aed --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_destructive.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..afee6a8d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_raw.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..fbf5d7e0 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_steadfast.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..f9f079d6 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_vengeful.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..e74a80a8 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_corrosive.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..8869bc5f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_destructive.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..cdc818ac --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_raw.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..fab79b32 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_steadfast.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..2b65e834 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_vengeful.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..7f711d0c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_corrosive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..ba1305d5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_raw.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..4b1f890a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_destructive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..7a19d3cf --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_vengeful.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..a0f4f58e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_3_steadfast.json @@ -0,0 +1,17 @@ +{ + "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 new file mode 100644 index 00000000..0d2824b6 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_corrosive.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..3e4ff319 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_raw.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..6d6a96f5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_destructive.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..77527b86 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_vengeful.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 00000000..9fcdcbf9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_3_steadfast.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..7b48b030 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_corrosive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..e1b23e21 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_destructive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..25b47dec --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_raw.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..e7967dfa --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_steadfast.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..98d5ec24 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_vengeful.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..62ea247b --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_corrosive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..e00e4198 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_destructive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..791bdb5c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_raw.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..16a07805 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_steadfast.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..33031c4d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_vengeful.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..32bc21f7 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_corrosive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..2f4fbf18 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_destructive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..8c42b8c9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_raw.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..b94df87c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_steadfast.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..15ecb860 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_vengeful.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..12dbe103 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/experience_tome.json @@ -0,0 +1,33 @@ +{ + "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 new file mode 100644 index 00000000..4748c205 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/incense_altar.json @@ -0,0 +1,27 @@ +{ + "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 new file mode 100644 index 00000000..e0311e8f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/lava_crystal.json @@ -0,0 +1,29 @@ +{ + "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 new file mode 100644 index 00000000..361f9ed3 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/mimic_nohitbox.json @@ -0,0 +1,27 @@ +{ + "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 new file mode 100644 index 00000000..a14fa6e0 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/mimic_solidclear.json @@ -0,0 +1,30 @@ +{ + "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 new file mode 100644 index 00000000..7db4b442 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/mimic_solidlight.json @@ -0,0 +1,33 @@ +{ + "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 new file mode 100644 index 00000000..4c281089 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/mimic_solidopaque.json @@ -0,0 +1,30 @@ +{ + "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 new file mode 100644 index 00000000..e82cd67e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/pack_sacrifice.json @@ -0,0 +1,29 @@ +{ + "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 new file mode 100644 index 00000000..138ba293 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/pack_self_sacrifice.json @@ -0,0 +1,29 @@ +{ + "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 new file mode 100644 index 00000000..2898208a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/path/path_obsidian.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..e235db72 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/path/path_obsidiantile.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..0503ed1c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/path/path_stone.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..5cf9c223 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/path/path_stonetile.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..fcb33fd3 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/path/path_wood.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..90b26af1 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/path/path_woodtile.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..86e114b7 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/path/path_wornstone.json @@ -0,0 +1,30 @@ +{ + "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 new file mode 100644 index 00000000..2b66ed18 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/path/path_wornstonetile.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..17bfdac9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_controller_imperfect.json @@ -0,0 +1,24 @@ +{ + "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 new file mode 100644 index 00000000..d712efbe --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_controller_inverted.json @@ -0,0 +1,20 @@ +{ + "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 new file mode 100644 index 00000000..74e1458c --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_controller_master.json @@ -0,0 +1,25 @@ +{ + "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 new file mode 100644 index 00000000..5b55815a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_controller_master_alt.json @@ -0,0 +1,13 @@ +{ + "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 new file mode 100644 index 00000000..9b48c652 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_diviner_0.json @@ -0,0 +1,36 @@ +{ + "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 new file mode 100644 index 00000000..ca45383a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_diviner_1.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..cbf3f52a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_reader.json @@ -0,0 +1,27 @@ +{ + "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 new file mode 100644 index 00000000..7e321bb2 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_stone_blank.json @@ -0,0 +1,26 @@ +{ + "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 new file mode 100644 index 00000000..439ad7d2 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/ritual_stone_reset.json @@ -0,0 +1,13 @@ +{ + "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 new file mode 100644 index 00000000..f622ef14 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/sacrificial_dagger.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..7dfd9961 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/soul_forge.json @@ -0,0 +1,25 @@ +{ + "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 new file mode 100644 index 00000000..20a518c5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/soul_snare.json @@ -0,0 +1,24 @@ +{ + "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 new file mode 100644 index 00000000..388d0153 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/teleposer.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 00000000..16212c4f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/teleposition_focus_2.json @@ -0,0 +1,17 @@ +{ + "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 new file mode 100644 index 00000000..9be6ba08 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/teleposition_focus_3.json @@ -0,0 +1,17 @@ +{ + "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 new file mode 100644 index 00000000..d540e3e4 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/upgrade_trainer.json @@ -0,0 +1,27 @@ +{ + "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 From acdf40e2b697925a7e7ffed0633f5a0100cac677 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 20 Aug 2017 15:09:27 -0700 Subject: [PATCH 133/595] Update tile entity mappings (cherry picked from commit c00affa) --- .../core/RegistrarBloodMagicBlocks.java | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java index 92544f16..54cad50a 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java @@ -124,7 +124,7 @@ public class RegistrarBloodMagicBlocks { event.getRegistry().registerAll(blocks.toArray(new Block[0])); - registerTiles(); + registerTileEntities(); } @SubscribeEvent @@ -137,29 +137,28 @@ public class RegistrarBloodMagicBlocks { }); } - private static void registerTiles() { - GameRegistry.registerTileEntity(TileAltar.class, BloodMagic.MODID + ":" + TileAltar.class.getSimpleName()); - GameRegistry.registerTileEntity(TileImperfectRitualStone.class, BloodMagic.MODID + ":" + TileImperfectRitualStone.class.getSimpleName()); - GameRegistry.registerTileEntity(TileMasterRitualStone.class, BloodMagic.MODID + ":" + TileMasterRitualStone.class.getSimpleName()); - GameRegistry.registerTileEntity(TileAlchemyArray.class, BloodMagic.MODID + ":" + TileAlchemyArray.class.getSimpleName()); - GameRegistry.registerTileEntity(TileSpectralBlock.class, BloodMagic.MODID + ":" + TileSpectralBlock.class.getSimpleName()); - GameRegistry.registerTileEntity(TilePhantomBlock.class, BloodMagic.MODID + ":" + TilePhantomBlock.class.getSimpleName()); - GameRegistry.registerTileEntity(TileTeleposer.class, BloodMagic.MODID + ":" + TileTeleposer.class.getSimpleName()); - GameRegistry.registerTileEntity(TileSoulForge.class, BloodMagic.MODID + ":" + TileSoulForge.class.getSimpleName()); - GameRegistry.registerTileEntity(TileMasterRoutingNode.class, BloodMagic.MODID + ":" + TileMasterRoutingNode.class.getSimpleName()); - GameRegistry.registerTileEntity(TileInputRoutingNode.class, BloodMagic.MODID + ":" + TileInputRoutingNode.class.getSimpleName()); - GameRegistry.registerTileEntity(TileOutputRoutingNode.class, BloodMagic.MODID + ":" + TileOutputRoutingNode.class.getSimpleName()); - GameRegistry.registerTileEntity(TileItemRoutingNode.class, BloodMagic.MODID + ":" + TileItemRoutingNode.class.getSimpleName()); - GameRegistry.registerTileEntity(TileIncenseAltar.class, BloodMagic.MODID + ":" + TileIncenseAltar.class.getSimpleName()); - GameRegistry.registerTileEntity(TileDemonCrucible.class, BloodMagic.MODID + ":" + TileDemonCrucible.class.getSimpleName()); - GameRegistry.registerTileEntity(TileDemonPylon.class, BloodMagic.MODID + ":" + TileDemonPylon.class.getSimpleName()); - GameRegistry.registerTileEntity(TileDemonCrystallizer.class, BloodMagic.MODID + ":" + TileDemonCrystallizer.class.getSimpleName()); - GameRegistry.registerTileEntity(TileDemonCrystal.class, BloodMagic.MODID + ":" + TileDemonCrystal.class.getSimpleName()); - GameRegistry.registerTileEntity(TileAlchemyTable.class, BloodMagic.MODID + ":" + TileAlchemyTable.class.getSimpleName()); - - GameRegistry.registerTileEntity(TileDimensionalPortal.class, BloodMagic.MODID + ":" + TileDimensionalPortal.class.getSimpleName()); - GameRegistry.registerTileEntity(TileBloodTank.class, BloodMagic.MODID + ":" + TileBloodTank.class.getSimpleName()); - GameRegistry.registerTileEntity(TileMimic.class, BloodMagic.MODID + ":" + TileMimic.class.getSimpleName()); - GameRegistry.registerTileEntity(TileInversionPillar.class, BloodMagic.MODID + ":" + TileInversionPillar.class.getSimpleName()); + 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"); } } From 66ea13137714a99c7f174f475aca195eacbc8a7c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 19 Aug 2017 20:45:11 -0700 Subject: [PATCH 134/595] Fix JEI not seeing orbs as different items --- .../java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index 11c3f80a..5c58acbf 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -82,6 +82,7 @@ public class BloodMagicPlugin extends BlankModPlugin { @Override public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.UPGRADE_TOME); + subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.BLOOD_ORB); } @Override From 8a4117106dece0e4be88907658518ca1e7a1f6ee Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 13 Oct 2017 17:12:54 -0700 Subject: [PATCH 135/595] Stop using a custom bus subscriber annotation I'm sorry, past self, but Forge has had one since like 1.10, it's time to move on. It's for the better. (cherry picked from commit 9de2354) --- .../java/WayofTime/bloodmagic/BloodMagic.java | 3 -- .../WayofTime/bloodmagic/annot/Handler.java | 15 ------- .../java/WayofTime/bloodmagic/util/Utils.java | 41 ++++++++++--------- .../util/handler/event/ClientHandler.java | 24 +++++------ .../util/handler/event/CraftingHandler.java | 8 ++-- .../util/handler/event/GenericHandler.java | 40 +++++++++--------- .../handler/event/LivingArmourHandler.java | 21 +++++----- .../handler/event/StatTrackerHandler.java | 14 +++---- .../util/handler/event/WillHandler.java | 26 ++++++------ 9 files changed, 88 insertions(+), 104 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/annot/Handler.java diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index badd6928..86705236 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic; -import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.util.helper.LogHelper; @@ -17,7 +16,6 @@ import WayofTime.bloodmagic.proxy.CommonProxy; import WayofTime.bloodmagic.registry.*; import WayofTime.bloodmagic.structures.ModDungeons; import WayofTime.bloodmagic.util.PluginUtil; -import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.handler.IMCHandler; import com.google.common.collect.Lists; import net.minecraft.creativetab.CreativeTabs; @@ -80,7 +78,6 @@ public class BloodMagic { ModTranquilityHandlers.init(); ModDungeons.init(); - Utils.registerHandlers(event.getAsmData().getAll(Handler.class.getCanonicalName())); proxy.preInit(); } diff --git a/src/main/java/WayofTime/bloodmagic/annot/Handler.java b/src/main/java/WayofTime/bloodmagic/annot/Handler.java deleted file mode 100644 index 0e972824..00000000 --- a/src/main/java/WayofTime/bloodmagic/annot/Handler.java +++ /dev/null @@ -1,15 +0,0 @@ -package WayofTime.bloodmagic.annot; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Classes annotated with this will automatically be registered to the - * {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS}. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface Handler { -} diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index b30a0ab0..ae3b50ef 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; @@ -36,17 +35,12 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumFacing; import net.minecraft.util.SoundCategory; -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.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.common.MinecraftForge; import net.minecraftforge.fluids.IFluidBlock; -import net.minecraftforge.fml.common.discovery.ASMDataTable; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; @@ -922,19 +916,6 @@ public class Utils { return largerStack ? stack : ItemStack.EMPTY; } - public static void registerHandlers(Set eventHandlers) { - for (ASMDataTable.ASMData data : eventHandlers) { - try { - Class handlerClass = Class.forName(data.getClassName()); - Object handlerImpl = handlerClass.newInstance(); - MinecraftForge.EVENT_BUS.register(handlerImpl); - BloodMagic.instance.logger.debug("Registering event handler for class {}", data.getClassName()); - } catch (Exception e) { - // No-op - } - } - } - public static boolean hasUUID(ItemStack stack) { return stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.MOST_SIG) && stack.getTagCompound().hasKey(Constants.NBT.LEAST_SIG); } @@ -956,4 +937,24 @@ public class Utils { stack.getTagCompound().setLong(Constants.NBT.LEAST_SIG, itemUUID.getLeastSignificantBits()); } } + + public static RayTraceResult rayTrace(EntityPlayer 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 EntityPlayerMP) + reachDistance = ((EntityPlayerMP)player).interactionManager.getBlockReachDistance(); + + Vec3d reachPosition = eyePosition.addVector((double) f6 * reachDistance, (double) f5 * reachDistance, (double) f7 * reachDistance); + return player.getEntityWorld().rayTraceBlocks(eyePosition, reachPosition, useLiquids, !useLiquids, false); + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 8c9aa9ee..471d3035 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.ritual.Ritual; @@ -41,6 +40,7 @@ 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; @@ -50,7 +50,7 @@ import org.lwjgl.opengl.GL11; import java.util.*; -@Handler +@Mod.EventBusSubscriber @SideOnly(Side.CLIENT) public class ClientHandler { // Quick toggle for error suppression. Set to false if you wish to hide model errors. @@ -76,7 +76,7 @@ public class ClientHandler { private static boolean mrsHoloDisplay; @SubscribeEvent - public void onTooltipEvent(ItemTooltipEvent event) { + public static void onTooltipEvent(ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); if (stack.isEmpty()) { return; @@ -93,7 +93,7 @@ public class ClientHandler { } @SubscribeEvent - public void onSoundEvent(PlaySoundEvent event) { + public static void onSoundEvent(PlaySoundEvent event) { EntityPlayer player = Minecraft.getMinecraft().player; if (player != null && player.isPotionActive(RegistrarBloodMagic.DEAFNESS)) { event.setResultSound(null); @@ -101,7 +101,7 @@ public class ClientHandler { } @SubscribeEvent - public void onTextureStitch(TextureStitchEvent.Pre event) { + public static void onTextureStitch(TextureStitchEvent.Pre event) { final String BLOCKS = "blocks"; ritualStoneBlank = forName(event.getMap(), "RitualStone", BLOCKS); @@ -121,7 +121,7 @@ public class ClientHandler { } @SubscribeEvent - public void render(RenderWorldLastEvent event) { + public static void render(RenderWorldLastEvent event) { EntityPlayerSP player = minecraft.player; World world = player.getEntityWorld(); @@ -146,7 +146,7 @@ public class ClientHandler { } @SubscribeEvent - public void onMouseEvent(MouseEvent event) { + public static void onMouseEvent(MouseEvent event) { EntityPlayerSP player = Minecraft.getMinecraft().player; if (event.getDwheel() != 0 && player != null && player.isSneaking()) { @@ -164,7 +164,7 @@ public class ClientHandler { } @SubscribeEvent - public void onKey(InputEvent event) { + public static void onKey(InputEvent event) { if (!minecraft.inGameHasFocus) return; @@ -174,7 +174,7 @@ public class ClientHandler { } @SubscribeEvent - public void onHudRender(RenderGameOverlayEvent.Pre event) { + public static void onHudRender(RenderGameOverlayEvent.Pre event) { for (HUDElement element : hudElements) if (element.getElementType() == event.getType() && element.shouldRender(minecraft)) element.render(minecraft, event.getResolution(), event.getPartialTicks()); @@ -182,7 +182,7 @@ public class ClientHandler { // Stolen from Chisel @SubscribeEvent - public void onModelBake(ModelBakeEvent event) { + public static void onModelBake(ModelBakeEvent event) { if (BloodMagic.IS_DEV && SUPPRESS_ASSET_ERRORS) return; @@ -218,7 +218,7 @@ public class ClientHandler { // 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 void onTextureStitch(TextureStitchEvent.Post event) { + public static void onTextureStitch(TextureStitchEvent.Post event) { if (BloodMagic.IS_DEV && SUPPRESS_ASSET_ERRORS) return; @@ -249,7 +249,7 @@ public class ClientHandler { BloodMagic.instance.logger.debug("Suppressed required texture errors in {}", stopwatch.stop()); } - private void renderRitualStones(EntityPlayerSP player, float partialTicks) { + private static void renderRitualStones(EntityPlayerSP player, float partialTicks) { World world = player.getEntityWorld(); ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); EnumFacing direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index f47c2065..61e56302 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.event.AltarCraftedEvent; import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; @@ -21,17 +20,18 @@ import net.minecraftforge.event.AnvilUpdateEvent; 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; -@Handler +@Mod.EventBusSubscriber public class CraftingHandler { // Sets the uses of crafted Inscription Tools to 10 @SubscribeEvent - public void onAltarCrafted(AltarCraftedEvent event) { + public static void onAltarCrafted(AltarCraftedEvent event) { if (event.getOutput() == null) { return; } @@ -49,7 +49,7 @@ public class CraftingHandler { // Handles crafting of: Revealing Upgrade Tome, Elytra Upgrade Tome, Combining Upgrade Tomes, Setting Upgrade for Trainer @SubscribeEvent - public void onAnvil(AnvilUpdateEvent event) { + 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()) { 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 3a94876a..b5d59221 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.event.ItemBindEvent; import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; @@ -73,6 +72,7 @@ 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.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; @@ -85,7 +85,7 @@ import java.util.List; import java.util.Map; import java.util.Random; -@Handler +@Mod.EventBusSubscriber public class GenericHandler { public static Map bounceMap = new HashMap(); public static Map filledHandMap = new HashMap(); @@ -93,7 +93,7 @@ public class GenericHandler { private static Map attackTaskMap = new HashMap(); @SubscribeEvent - public void onEntityFall(LivingFallEvent event) { + public static void onEntityFall(LivingFallEvent event) { if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); if (player.isPotionActive(RegistrarBloodMagic.BOUNCE) && !player.isSneaking() && event.getDistance() > 2) { @@ -112,7 +112,7 @@ public class GenericHandler { } @SubscribeEvent - public void playerTickPost(TickEvent.PlayerTickEvent event) { + public static void playerTickPost(TickEvent.PlayerTickEvent event) { if (event.phase == TickEvent.Phase.END && bounceMap.containsKey(event.player)) { event.player.motionY = bounceMap.remove(event.player); } @@ -130,7 +130,7 @@ public class GenericHandler { } @SubscribeEvent - public void onPlayerClick(PlayerInteractEvent event) { + public static void onPlayerClick(PlayerInteractEvent event) { if (event.isCancelable() && event.getEntityPlayer().isPotionActive(RegistrarBloodMagic.CONSTRICT)) { EntityPlayer player = event.getEntityPlayer(); int level = player.getActivePotionEffect(RegistrarBloodMagic.CONSTRICT).getAmplifier(); @@ -141,7 +141,7 @@ public class GenericHandler { } @SubscribeEvent - public void onPlayerDropItem(ItemTossEvent event) { + public static void onPlayerDropItem(ItemTossEvent event) { EntityItem itemEntity = event.getEntityItem(); if (itemEntity != null) { ItemStack stack = itemEntity.getItem(); @@ -155,7 +155,7 @@ public class GenericHandler { } @SubscribeEvent - public void onExplosion(ExplosionEvent.Start event) { + public static void onExplosion(ExplosionEvent.Start event) { World world = event.getWorld(); Explosion exp = event.getExplosion(); Vec3d position = exp.getPosition(); @@ -174,7 +174,7 @@ public class GenericHandler { } @SubscribeEvent - public void onEntityHurt(LivingHurtEvent event) { + public static void onEntityHurt(LivingHurtEvent event) { if (event.getEntity().getEntityWorld().isRemote) return; @@ -208,7 +208,7 @@ public class GenericHandler { // Handles sending the client the Demon Will Aura updates @SubscribeEvent - public void onLivingUpdate(LivingUpdateEvent event) { + public static void onLivingUpdate(LivingUpdateEvent event) { if (!event.getEntityLiving().getEntityWorld().isRemote) { EntityLivingBase entity = event.getEntityLiving(); if (entity instanceof EntityPlayer && entity.ticksExisted % 50 == 0) //TODO: Change to an incremental counter @@ -284,7 +284,7 @@ public class GenericHandler { } // @SideOnly(Side.SERVER) - public void sendPlayerDemonWillAura(EntityPlayer player) { + public static void sendPlayerDemonWillAura(EntityPlayer player) { if (player instanceof EntityPlayerMP) { BlockPos pos = player.getPosition(); DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(player.getEntityWorld().provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); @@ -298,7 +298,7 @@ public class GenericHandler { // Handles destroying altar @SubscribeEvent - public void harvestEvent(PlayerEvent.HarvestCheck event) { + public static void harvestEvent(PlayerEvent.HarvestCheck event) { IBlockState state = event.getTargetBlock(); Block block = state.getBlock(); if (block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && !event.getEntityPlayer().getHeldItemMainhand().isEmpty() && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) { @@ -309,14 +309,14 @@ public class GenericHandler { // Handle Teleposer block blacklist @SubscribeEvent - public void onTelepose(TeleposeEvent event) { + 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 void onTeleposeEntity(TeleposeEvent.Ent event) { + public static void onTeleposeEntity(TeleposeEvent.Ent event) { EntityEntry entry = EntityRegistry.getEntry(event.entity.getClass()); if (BloodMagicAPI.INSTANCE.getBlacklist().getTeleposerEntities().contains(entry.getRegistryName())) event.setCanceled(true); @@ -324,13 +324,13 @@ public class GenericHandler { // Sets teleport cooldown for Teleposed entities to 5 ticks (1/4 second) instead of 150 (7.5 seconds) @SubscribeEvent - public void onTeleposeEntityPost(TeleposeEvent.Ent.Post event) { + 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 void onInteract(PlayerInteractEvent.RightClickItem event) { + public static void onInteract(PlayerInteractEvent.RightClickItem event) { if (event.getWorld().isRemote) return; @@ -372,7 +372,7 @@ public class GenericHandler { } @SubscribeEvent - public void selfSacrificeEvent(SacrificeKnifeUsedEvent event) { + public static void selfSacrificeEvent(SacrificeKnifeUsedEvent event) { EntityPlayer player = event.player; if (LivingArmour.hasFullSet(player)) { @@ -393,7 +393,7 @@ public class GenericHandler { // Drop Blood Shards @SubscribeEvent - public void onLivingDrops(LivingDropsEvent event) { + public static void onLivingDrops(LivingDropsEvent event) { EntityLivingBase attackedEntity = event.getEntityLiving(); DamageSource source = event.getSource(); Entity entity = source.getTrueSource(); @@ -411,7 +411,7 @@ public class GenericHandler { // Experience Tome @SubscribeEvent(priority = EventPriority.LOWEST) - public void onExperiencePickup(PlayerPickupXpEvent event) { + public static void onExperiencePickup(PlayerPickupXpEvent event) { EntityPlayer player = event.getEntityPlayer(); ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); @@ -432,11 +432,11 @@ public class GenericHandler { } } - private int xpToDurability(int xp) { + private static int xpToDurability(int xp) { return xp * 2; } - private int durabilityToXp(int durability) { + private static int durabilityToXp(int durability) { return durability / 2; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 5488e7e1..435fa5bf 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.core.RegistrarBloodMagic; @@ -35,14 +34,16 @@ 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; -@Handler +@Mod.EventBusSubscriber public class LivingArmourHandler { + @SubscribeEvent - public void onEntityHealed(LivingHealEvent event) { + public static void onEntityHealed(LivingHealEvent event) { if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntity(); if (LivingArmour.hasFullSet(player)) { @@ -65,7 +66,7 @@ public class LivingArmourHandler { } @SubscribeEvent - public void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) { + public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) { EntityPlayer player = event.getEntityPlayer(); if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); @@ -85,7 +86,7 @@ public class LivingArmourHandler { // Applies: Storm Trooper @SubscribeEvent - public void onEntityJoinedWorld(EntityJoinWorldEvent event) { + public static void onEntityJoinedWorld(EntityJoinWorldEvent event) { Entity owner = null; if (event.getEntity() instanceof EntityArrow) { owner = ((EntityArrow) event.getEntity()).shootingEntity; @@ -115,7 +116,7 @@ public class LivingArmourHandler { } @SubscribeEvent - public void onPlayerClick(PlayerInteractEvent event) { + public static void onPlayerClick(PlayerInteractEvent event) { if (event.isCancelable()) { EntityPlayer player = event.getEntityPlayer(); @@ -148,7 +149,7 @@ public class LivingArmourHandler { // Applies: Grim Reaper @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onEntityDeath(LivingDeathEvent event) { + public static void onEntityDeath(LivingDeathEvent event) { if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); @@ -174,7 +175,7 @@ public class LivingArmourHandler { // Applies: Jump @SubscribeEvent - public void onJumpEvent(LivingEvent.LivingJumpEvent event) { + public static void onJumpEvent(LivingEvent.LivingJumpEvent event) { if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); @@ -198,7 +199,7 @@ public class LivingArmourHandler { // Applies: Step Assist, Speed Boost @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { + public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); boolean hasAssist = false; @@ -253,7 +254,7 @@ public class LivingArmourHandler { // Applies: Arrow Shot // Tracks: Arrow Shot @SubscribeEvent - public void onArrowFire(ArrowLooseEvent event) { + public static void onArrowFire(ArrowLooseEvent event) { World world = event.getEntityPlayer().getEntityWorld(); ItemStack stack = event.getBow(); EntityPlayer player = event.getEntityPlayer(); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java index 78b03262..a8121653 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; @@ -24,17 +23,18 @@ 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; -@Handler +@Mod.EventBusSubscriber public class StatTrackerHandler { private static float lastPlayerSwingStrength = 0; // Tracks: Digging, DigSlowdown @SubscribeEvent - public void blockBreakEvent(BlockEvent.BreakEvent event) { + public static void blockBreakEvent(BlockEvent.BreakEvent event) { EntityPlayer player = event.getPlayer(); if (player != null) { if (LivingArmour.hasFullSet(player)) { @@ -53,7 +53,7 @@ public class StatTrackerHandler { // Tracks: Health Boost @SubscribeEvent - public void onEntityHealed(LivingHealEvent event) { + public static void onEntityHealed(LivingHealEvent event) { EntityLivingBase healedEntity = event.getEntityLiving(); if (!(healedEntity instanceof EntityPlayer)) { return; @@ -74,13 +74,13 @@ public class StatTrackerHandler { } @SubscribeEvent - public void onLivingAttack(AttackEntityEvent event) { + 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 void entityHurt(LivingHurtEvent event) { + public static void entityHurt(LivingHurtEvent event) { DamageSource source = event.getSource(); Entity sourceEntity = event.getSource().getTrueSource(); EntityLivingBase attackedEntity = event.getEntityLiving(); @@ -153,7 +153,7 @@ public class StatTrackerHandler { // Tracks: Experienced @SubscribeEvent(priority = EventPriority.LOW) - public void onExperiencePickup(PlayerPickupXpEvent event) { + public static void onExperiencePickup(PlayerPickupXpEvent event) { EntityPlayer player = event.getEntityPlayer(); if (LivingArmour.hasFullSet(player)) { 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 6fc490c9..49a48e97 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.util.handler.event; -import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.soul.*; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; @@ -25,6 +24,7 @@ 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; @@ -33,14 +33,14 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -@Handler +@Mod.EventBusSubscriber public class WillHandler { - private final HashMap serverTicks = new HashMap(); + private static final HashMap SERVER_TICKS = new HashMap(); // Adds Will to player @SubscribeEvent - public void onItemPickup(EntityItemPickupEvent event) { + public static void onItemPickup(EntityItemPickupEvent event) { ItemStack stack = event.getItem().getItem(); if (stack.getItem() instanceof IDemonWill) { EntityPlayer player = event.getEntityPlayer(); @@ -55,7 +55,7 @@ public class WillHandler { } @SubscribeEvent - public void onEntityAttacked(LivingDeathEvent event) { + public static void onEntityAttacked(LivingDeathEvent event) { if (event.getSource() instanceof EntityDamageSourceIndirect) { Entity sourceEntity = event.getSource().getImmediateSource(); @@ -67,7 +67,7 @@ public class WillHandler { // Add/Drop Demon Will for Player @SubscribeEvent - public void onLivingDrops(LivingDropsEvent event) { + public static void onLivingDrops(LivingDropsEvent event) { EntityLivingBase attackedEntity = event.getEntityLiving(); DamageSource source = event.getSource(); Entity entity = source.getTrueSource(); @@ -106,16 +106,16 @@ public class WillHandler { } @SubscribeEvent - public void onServerWorldTick(TickEvent.WorldTickEvent event) { + 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 (!this.serverTicks.containsKey(dim)) - this.serverTicks.put(dim, 0); + if (!SERVER_TICKS.containsKey(dim)) + SERVER_TICKS.put(dim, 0); - int ticks = (this.serverTicks.get(dim)); + int ticks = (SERVER_TICKS.get(dim)); if (ticks % 20 == 0) { CopyOnWriteArrayList dirtyChunks = WorldDemonWillHandler.dirtyChunks.get(dim); @@ -127,13 +127,13 @@ public class WillHandler { } } - this.serverTicks.put(dim, ticks + 1); + SERVER_TICKS.put(dim, ticks + 1); } } @SubscribeEvent - public void chunkSave(ChunkDataEvent.Save event) { + public static void chunkSave(ChunkDataEvent.Save event) { int dim = event.getWorld().provider.getDimension(); ChunkPos loc = event.getChunk().getPos(); @@ -150,7 +150,7 @@ public class WillHandler { } @SubscribeEvent - public void chunkLoad(ChunkDataEvent.Load event) { + public static void chunkLoad(ChunkDataEvent.Load event) { int dim = event.getWorld().provider.getDimension(); if (event.getData().getCompoundTag("BloodMagic").hasKey("base")) { NBTTagCompound nbt = event.getData().getCompoundTag("BloodMagic"); From 3536a25cc3fa2a3295dacb386de15f6686641c82 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 13 Oct 2017 17:41:54 -0700 Subject: [PATCH 136/595] Add modid to subscriber annotations (cherry picked from commit 7cac007) --- src/main/java/WayofTime/bloodmagic/ConfigHandler.java | 2 +- .../java/WayofTime/bloodmagic/potion/PotionEventHandlers.java | 3 ++- .../WayofTime/bloodmagic/util/handler/event/ClientHandler.java | 2 +- .../bloodmagic/util/handler/event/CraftingHandler.java | 2 +- .../bloodmagic/util/handler/event/GenericHandler.java | 2 +- .../bloodmagic/util/handler/event/LivingArmourHandler.java | 2 +- .../bloodmagic/util/handler/event/StatTrackerHandler.java | 2 +- .../WayofTime/bloodmagic/util/handler/event/WillHandler.java | 3 ++- 8 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 99867dc1..23e12138 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -8,7 +8,7 @@ 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 +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class ConfigHandler { @Config.Comment({ "Blacklist options for various features" }) diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 27911f00..a393cb53 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.potion; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.Entity; @@ -18,7 +19,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.util.List; -@Mod.EventBusSubscriber +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class PotionEventHandlers { @SubscribeEvent diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 471d3035..530d4ca5 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -50,7 +50,7 @@ import org.lwjgl.opengl.GL11; import java.util.*; -@Mod.EventBusSubscriber +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) @SideOnly(Side.CLIENT) public class ClientHandler { // Quick toggle for error suppression. Set to false if you wish to hide model errors. diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index 61e56302..3c9ca214 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -26,7 +26,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.util.ArrayList; import java.util.List; -@Mod.EventBusSubscriber +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class CraftingHandler { // Sets the uses of crafted Inscription Tools to 10 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 b5d59221..16cd191c 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -85,7 +85,7 @@ import java.util.List; import java.util.Map; import java.util.Random; -@Mod.EventBusSubscriber +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class GenericHandler { public static Map bounceMap = new HashMap(); public static Map filledHandMap = new HashMap(); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 435fa5bf..0e202ffe 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -39,7 +39,7 @@ import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -@Mod.EventBusSubscriber +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class LivingArmourHandler { @SubscribeEvent diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java index a8121653..8aee28b8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -27,7 +27,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -@Mod.EventBusSubscriber +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class StatTrackerHandler { private static float lastPlayerSwingStrength = 0; 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 49a48e97..4857c90e 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.util.handler.event; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.soul.*; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; @@ -33,7 +34,7 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -@Mod.EventBusSubscriber +@Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class WillHandler { private static final HashMap SERVER_TICKS = new HashMap(); From 3f4407e866e0b96907b596380d4ac94d54ba861d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 19 Aug 2017 20:45:11 -0700 Subject: [PATCH 137/595] Update changelog I got so sick and tired of people bothering me about this, that you have to deal with whatever comes of this. Rather than waiting patiently, all I got was constant annoyances. So here you go. Have fun. Go away. --- changelog.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/changelog.txt b/changelog.txt index bad8aefb..bb42e432 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,12 @@ +------------------------------------------------------ +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 ------------------------------------------------------ From 4fbcac6aa2f113d7c95194886b8896da3ac53218 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 19 Aug 2017 20:45:11 -0700 Subject: [PATCH 138/595] Fix JEI slug --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 759d1f9f..66a57a25 100644 --- a/build.gradle +++ b/build.gradle @@ -151,7 +151,7 @@ String getChangelogText() { } def curseRelations = { - optionalLibrary 'just-enough-items-jei' + optionalLibrary 'jei' optionalLibrary 'hwyla' requiredLibrary 'guide-api' } From ddaadfbe5275bd513903e02d0bf24677f396c843 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 5 Feb 2018 17:04:38 -0800 Subject: [PATCH 139/595] Swap the API packages The new one is now built for the api jar and the old one is now internal. It will slowly be moved around to sane places within the internal code. Most of the features provided in the old "api" are addon specific features which will generally rely on the main jar anyways. The new API will be specific to compatibility features, such as blacklists, recipes, and value modification. --- build.gradle | 1 + .../java/WayofTime/bloodmagic/BloodMagic.java | 12 ++++----- .../AlchemyArrayEffectAttractor.java | 2 +- .../AlchemyArrayEffectBinding.java | 4 +-- .../AlchemyArrayEffectBounce.java | 4 +-- .../AlchemyArrayEffectMovement.java | 4 +-- .../alchemyArray/AlchemyArrayEffectSigil.java | 4 +-- .../AlchemyArrayEffectSkeletonTurret.java | 2 +- .../AlchemyArrayEffectUpdraft.java | 4 +-- .../bloodmagic/altar/BloodAltar.java | 22 +++++++--------- .../{apiv2 => api}/BloodMagicPlugin.java | 2 +- .../{apiv2 => api}/IBloodMagicAPI.java | 2 +- .../{apiv2 => api}/IBloodMagicBlacklist.java | 2 +- .../{apiv2 => api}/IBloodMagicPlugin.java | 2 +- .../{api_impl => api/impl}/BloodMagicAPI.java | 6 ++--- .../impl}/BloodMagicBlacklist.java | 4 +-- .../impl}/BloodMagicCorePlugin.java | 10 +++---- .../bloodmagic/api/package-info.java | 2 +- .../{api => apibutnotreally}/BlockStack.java | 2 +- .../BloodMagicAPI.java | 4 +-- .../{api => apibutnotreally}/Constants.java | 2 +- .../DamageSourceBloodMagic.java | 2 +- .../ItemStackWrapper.java | 2 +- .../alchemyCrafting/AlchemyArrayEffect.java | 4 +-- .../AlchemyArrayEffectCrafting.java | 2 +- .../AlchemyCircleRenderer.java | 2 +- .../altar/AltarComponent.java | 2 +- .../altar/AltarUpgrade.java | 2 +- .../altar/EnumAltarComponent.java | 2 +- .../altar/EnumAltarTier.java | 2 +- .../altar/IAltarComponent.java | 2 +- .../altar/IAltarManipulator.java | 2 +- .../altar/IBloodAltar.java | 2 +- .../compress/CompressionHandler.java | 2 +- .../compress/CompressionRegistry.java | 2 +- .../event/AddToNetworkEvent.java | 2 +- .../event/AltarCraftedEvent.java | 4 +-- .../event/BoundToolEvent.java | 2 +- .../event/ItemBindEvent.java | 4 +-- .../event/RitualEvent.java | 10 +++---- .../event/SacrificeKnifeUsedEvent.java | 2 +- .../event/SoulNetworkEvent.java | 4 +-- .../event/TeleposeEvent.java | 2 +- .../iface/IActivatable.java | 2 +- .../iface/IAlchemyArray.java | 2 +- .../iface/IAltarReader.java | 2 +- .../iface/IBindable.java | 2 +- .../iface/ICustomAlchemyConsumable.java | 2 +- .../iface/IDemonWillViewer.java | 2 +- .../iface/IDocumentedBlock.java | 2 +- .../iface/IHarvestHandler.java | 6 ++--- .../iface/IItemLPContainer.java | 2 +- .../iface/IMultiWillTool.java | 4 +-- .../iface/INodeRenderer.java | 2 +- .../iface/IPurificationAsh.java | 2 +- .../iface/ISentientSwordEffectProvider.java | 4 +-- .../iface/ISentientTool.java | 2 +- .../iface/ISigil.java | 4 +-- .../iface/IUpgradeTrainer.java | 2 +- .../impl/ItemBindable.java | 6 ++--- .../impl/ItemSigil.java | 8 +++--- .../impl/ItemSigilToggleable.java | 14 +++++----- .../incense/EnumTranquilityType.java | 2 +- .../incense/IIncensePath.java | 2 +- .../incense/ITranquilityHandler.java | 2 +- .../incense/IncenseTranquilityRegistry.java | 2 +- .../incense/TranquilityStack.java | 2 +- .../livingArmour/ILivingArmour.java | 2 +- .../livingArmour/LivingArmourHandler.java | 4 +-- .../livingArmour/LivingArmourUpgrade.java | 2 +- .../livingArmour/StatTracker.java | 2 +- .../orb/BloodOrb.java | 2 +- .../orb/IBloodOrb.java | 2 +- .../apibutnotreally/package-info.java | 6 +++++ .../recipe/AlchemyTableCustomRecipe.java | 4 +-- .../recipe/AlchemyTableRecipe.java | 2 +- .../recipe/LivingArmourDowngradeRecipe.java | 4 +-- .../recipe/TartaricForgeRecipe.java | 2 +- .../registry/AlchemyArrayRecipeRegistry.java | 10 +++---- .../registry/AlchemyTableRecipeRegistry.java | 4 +-- .../registry/AltarRecipeRegistry.java | 8 +++--- .../registry/HarvestRegistry.java | 6 ++--- .../registry/ImperfectRitualRegistry.java | 8 +++--- .../LivingArmourDowngradeRecipeRegistry.java | 6 ++--- .../registry/OrbRegistry.java | 6 ++--- .../registry/RitualRegistry.java | 6 ++--- .../registry/TartaricForgeRecipeRegistry.java | 4 +-- .../ritual/AreaDescriptor.java | 4 +-- .../ritual/CapabilityRuneType.java | 2 +- .../ritual/EnumRitualReaderState.java | 2 +- .../ritual/EnumRuneType.java | 2 +- .../ritual/IMasterRitualStone.java | 6 ++--- .../ritual/IRitualStone.java | 2 +- .../ritual/Ritual.java | 8 +++--- .../ritual/RitualComponent.java | 2 +- .../ritual/RitualRenderer.java | 2 +- .../imperfect/IImperfectRitualStone.java | 2 +- .../ritual/imperfect/ImperfectRitual.java | 6 ++--- .../ritual/imperfect/package-info.java | 2 +- .../saving/BMWorldSavedData.java | 4 +-- .../saving/SoulNetwork.java | 10 +++---- .../soul/DemonWillHolder.java | 2 +- .../soul/EnumDemonWillType.java | 2 +- .../soul/IDemonWill.java | 2 +- .../soul/IDemonWillConduit.java | 2 +- .../soul/IDemonWillGem.java | 2 +- .../soul/IDemonWillWeapon.java | 2 +- .../soul/IDiscreteDemonWill.java | 2 +- .../soul/PlayerDemonWillHandler.java | 4 +-- .../teleport/ITeleport.java | 2 +- .../teleport/PortalLocation.java | 4 +-- .../teleport/Teleport.java | 2 +- .../teleport/TeleportQueue.java | 2 +- .../teleport/TeleporterBloodMagic.java | 2 +- .../util/helper/BindableHelper.java | 8 +++--- .../util/helper/IncenseHelper.java | 4 +-- .../util/helper/ItemHelper.java | 12 ++++----- .../util/helper/LogHelper.java | 4 +-- .../util/helper/NBTHelper.java | 2 +- .../util/helper/NetworkHelper.java | 16 ++++++------ .../util/helper/PlayerHelper.java | 4 +-- .../util/helper/PlayerSacrificeHelper.java | 6 ++--- .../util/helper/PurificationHelper.java | 4 +-- .../util/helper/RitualHelper.java | 12 ++++----- .../bloodmagic/block/BlockAlchemyTable.java | 2 +- .../bloodmagic/block/BlockAltar.java | 20 +++++++------- .../bloodmagic/block/BlockDemonCrucible.java | 4 +-- .../bloodmagic/block/BlockDemonCrystal.java | 4 +-- .../block/BlockDimensionalPortal.java | 6 ++--- .../block/BlockInputRoutingNode.java | 2 +- .../bloodmagic/block/BlockLifeEssence.java | 2 +- .../bloodmagic/block/BlockMimic.java | 4 +-- .../block/BlockOutputRoutingNode.java | 2 +- .../WayofTime/bloodmagic/block/BlockPath.java | 2 +- .../block/BlockRitualController.java | 14 +++++----- .../bloodmagic/block/BlockRitualStone.java | 4 +-- .../bloodmagic/block/BlockSoulForge.java | 2 +- .../bloodmagic/block/BlockTeleposer.java | 2 +- .../block/enums/EnumSubWillType.java | 2 +- .../bloodmagic/client/gui/GuiHandler.java | 2 +- .../client/hud/HUDElementDemonWillAura.java | 2 +- .../mesh/CustomMeshDefinitionActivatable.java | 2 +- .../mesh/CustomMeshDefinitionMultiWill.java | 4 +-- .../mesh/CustomMeshDefinitionWillGem.java | 2 +- .../AttractorAlchemyCircleRenderer.java | 2 +- .../BindingAlchemyCircleRenderer.java | 2 +- .../DualAlchemyCircleRenderer.java | 2 +- .../SingleAlchemyCircleRenderer.java | 2 +- .../StaticAlchemyCircleRenderer.java | 2 +- .../render/block/RenderAlchemyArray.java | 4 +-- .../client/render/block/RenderAltar.java | 4 +-- .../render/block/RenderItemRoutingNode.java | 2 +- .../command/sub/SubCommandBind.java | 8 +++--- .../command/sub/SubCommandNetwork.java | 4 +-- .../bloodmagic/command/sub/SubCommandOrb.java | 6 ++--- .../bloodmagic/compat/guideapi/BookUtils.java | 4 +-- .../compat/guideapi/book/CategoryAlchemy.java | 2 +- .../guideapi/book/CategoryArchitect.java | 6 ++--- .../compat/guideapi/book/CategoryDemon.java | 2 +- .../compat/guideapi/book/CategoryRitual.java | 4 +-- .../compat/guideapi/book/CategorySpell.java | 2 +- .../compat/guideapi/page/PageAltarRecipe.java | 4 +-- .../page/PageTartaricForgeRecipe.java | 4 +-- .../compat/jei/BloodMagicPlugin.java | 6 ++--- .../AlchemyArrayCraftingCategory.java | 2 +- .../AlchemyArrayCraftingRecipeHandler.java | 2 +- .../AlchemyArrayCraftingRecipeMaker.java | 8 +++--- .../AlchemyTableRecipeCategory.java | 4 +-- .../AlchemyTableRecipeHandler.java | 2 +- .../alchemyTable/AlchemyTableRecipeJEI.java | 2 +- .../alchemyTable/AlchemyTableRecipeMaker.java | 4 +-- .../compat/jei/altar/AltarRecipeCategory.java | 2 +- .../compat/jei/altar/AltarRecipeHandler.java | 2 +- .../compat/jei/altar/AltarRecipeJEI.java | 6 +++-- .../compat/jei/altar/AltarRecipeMaker.java | 6 ++--- .../ArmourDowngradeRecipeCategory.java | 2 +- .../ArmourDowngradeRecipeHandler.java | 2 +- .../ArmourDowngradeRecipeJEI.java | 4 +-- .../ArmourDowngradeRecipeMaker.java | 4 +-- .../jei/binding/BindingRecipeCategory.java | 2 +- .../jei/binding/BindingRecipeHandler.java | 2 +- .../jei/binding/BindingRecipeMaker.java | 6 ++--- .../forge/TartaricForgeRecipeCategory.java | 2 +- .../jei/forge/TartaricForgeRecipeHandler.java | 2 +- .../jei/forge/TartaricForgeRecipeJEI.java | 2 +- .../jei/forge/TartaricForgeRecipeMaker.java | 4 +-- .../compat/waila/WailaPluginBloodMagic.java | 2 +- .../provider/DataProviderAlchemyArray.java | 2 +- .../provider/DataProviderBloodAltar.java | 2 +- .../waila/provider/DataProviderBloodTank.java | 2 +- .../DataProviderRitualController.java | 12 ++++----- .../waila/provider/DataProviderTeleposer.java | 2 +- .../compress/AdvancedCompressionHandler.java | 4 +-- .../compress/BaseCompressionHandler.java | 2 +- .../compress/StorageBlockCraftingManager.java | 2 +- .../bloodmagic/core/RegistrarBloodMagic.java | 4 +-- .../core/RegistrarBloodMagicRecipes.java | 2 +- .../core/recipe/IngredientBloodOrb.java | 6 ++--- .../bloodmagic/demonAura/WillChunk.java | 2 +- .../demonAura/WorldDemonWillHandler.java | 6 ++--- .../entity/mob/EntityAspectedDemonBase.java | 4 +-- .../entity/mob/EntityCorruptedChicken.java | 2 +- .../entity/mob/EntityCorruptedSheep.java | 2 +- .../entity/mob/EntityCorruptedSpider.java | 2 +- .../entity/mob/EntitySentientSpecter.java | 4 +-- .../entity/projectile/EntityBloodLight.java | 2 +- .../entity/projectile/EntityMeteor.java | 2 +- .../projectile/EntitySentientArrow.java | 6 ++--- .../bloodmagic/gson/Serializers.java | 2 +- .../incense/TranquilityHandlers.java | 6 ++--- .../inversion/CorruptionHandler.java | 2 +- .../inversion/InversionPillarHandler.java | 2 +- .../bloodmagic/item/ItemAltarMaker.java | 8 +++--- .../bloodmagic/item/ItemBindableBase.java | 4 +-- .../bloodmagic/item/ItemBloodOrb.java | 10 +++---- .../bloodmagic/item/ItemBoundAxe.java | 6 ++--- .../bloodmagic/item/ItemBoundPickaxe.java | 6 ++--- .../bloodmagic/item/ItemBoundShovel.java | 6 ++--- .../bloodmagic/item/ItemBoundSword.java | 12 ++++----- .../bloodmagic/item/ItemBoundTool.java | 16 ++++++------ .../item/ItemDaggerOfSacrifice.java | 8 +++--- .../bloodmagic/item/ItemDemonCrystal.java | 4 +-- .../bloodmagic/item/ItemDemonWillGauge.java | 2 +- .../bloodmagic/item/ItemExperienceBook.java | 2 +- .../bloodmagic/item/ItemInscriptionTool.java | 6 ++--- .../bloodmagic/item/ItemLavaCrystal.java | 4 +-- .../bloodmagic/item/ItemPotionFlask.java | 2 +- .../bloodmagic/item/ItemRitualDiviner.java | 14 +++++----- .../bloodmagic/item/ItemRitualReader.java | 12 ++++----- .../item/ItemSacrificialDagger.java | 12 ++++----- .../bloodmagic/item/ItemSanguineBook.java | 10 +++---- .../item/ItemTelepositionFocus.java | 4 +-- .../bloodmagic/item/ItemUpgradeTome.java | 6 ++--- .../bloodmagic/item/ItemUpgradeTrainer.java | 8 +++--- .../item/alchemy/ItemCuttingFluid.java | 4 +-- .../item/armour/ItemLivingArmour.java | 12 ++++----- .../item/armour/ItemSentientArmour.java | 10 +++---- .../item/block/ItemBlockDemonCrystal.java | 2 +- .../item/gear/ItemPackSacrifice.java | 12 ++++----- .../item/gear/ItemPackSelfSacrifice.java | 14 +++++----- .../item/inventory/ContainerHolding.java | 2 +- .../item/inventory/InventoryHolding.java | 4 +-- .../item/inventory/ItemInventory.java | 4 +-- .../item/routing/ItemNodeRouter.java | 6 ++--- .../bloodmagic/item/sigil/ItemSigilAir.java | 10 +++---- .../bloodmagic/item/sigil/ItemSigilBase.java | 4 +-- .../item/sigil/ItemSigilBloodLight.java | 10 +++---- .../item/sigil/ItemSigilBounce.java | 2 +- .../bloodmagic/item/sigil/ItemSigilClaw.java | 2 +- .../item/sigil/ItemSigilCompression.java | 4 +-- .../item/sigil/ItemSigilDivination.java | 10 +++---- .../sigil/ItemSigilElementalAffinity.java | 2 +- .../item/sigil/ItemSigilEnderSeverance.java | 2 +- .../item/sigil/ItemSigilFastMiner.java | 4 +-- .../item/sigil/ItemSigilFilledHand.java | 2 +- .../bloodmagic/item/sigil/ItemSigilFrost.java | 2 +- .../item/sigil/ItemSigilGreenGrove.java | 4 +-- .../bloodmagic/item/sigil/ItemSigilHaste.java | 2 +- .../item/sigil/ItemSigilHolding.java | 12 ++++----- .../bloodmagic/item/sigil/ItemSigilLava.java | 6 ++--- .../item/sigil/ItemSigilMagnetism.java | 2 +- .../item/sigil/ItemSigilPhantomBridge.java | 2 +- .../bloodmagic/item/sigil/ItemSigilSeer.java | 10 +++---- .../item/sigil/ItemSigilSuppression.java | 2 +- .../item/sigil/ItemSigilTeleposition.java | 10 +++---- .../item/sigil/ItemSigilToggleableBase.java | 5 ++-- .../item/sigil/ItemSigilTransposition.java | 14 +++++----- .../bloodmagic/item/sigil/ItemSigilVoid.java | 6 ++--- .../bloodmagic/item/sigil/ItemSigilWater.java | 6 ++--- .../item/sigil/ItemSigilWhirlwind.java | 2 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 8 +++--- .../item/soul/ItemSentientArmourGem.java | 4 +-- .../bloodmagic/item/soul/ItemSentientAxe.java | 18 ++++++------- .../bloodmagic/item/soul/ItemSentientBow.java | 12 ++++----- .../item/soul/ItemSentientPickaxe.java | 18 ++++++------- .../item/soul/ItemSentientShovel.java | 18 ++++++------- .../item/soul/ItemSentientSword.java | 18 ++++++------- .../bloodmagic/item/soul/ItemSoulGem.java | 14 +++++----- .../bloodmagic/livingArmour/LivingArmour.java | 10 +++---- .../LivingArmourUpgradeBattleHungry.java | 4 +-- .../LivingArmourUpgradeCrippledArm.java | 4 +-- .../LivingArmourUpgradeDigSlowdown.java | 4 +-- .../LivingArmourUpgradeDisoriented.java | 4 +-- .../LivingArmourUpgradeMeleeDecrease.java | 4 +-- .../LivingArmourUpgradeQuenched.java | 4 +-- .../LivingArmourUpgradeSlippery.java | 4 +-- .../LivingArmourUpgradeSlowHeal.java | 4 +-- .../LivingArmourUpgradeSlowness.java | 4 +-- .../LivingArmourUpgradeStormTrooper.java | 4 +-- .../tracker/StatTrackerArrowProtect.java | 4 +-- .../tracker/StatTrackerArrowShot.java | 4 +-- .../tracker/StatTrackerCriticalStrike.java | 4 +-- .../tracker/StatTrackerDigging.java | 4 +-- .../tracker/StatTrackerExperience.java | 4 +-- .../tracker/StatTrackerFallProtect.java | 4 +-- .../tracker/StatTrackerFireResist.java | 4 +-- .../livingArmour/tracker/StatTrackerFood.java | 4 +-- .../tracker/StatTrackerGraveDigger.java | 4 +-- .../tracker/StatTrackerGrimReaperSprint.java | 4 +-- .../tracker/StatTrackerHealthboost.java | 4 +-- .../livingArmour/tracker/StatTrackerJump.java | 4 +-- .../tracker/StatTrackerMeleeDamage.java | 4 +-- .../tracker/StatTrackerMovement.java | 4 +-- .../tracker/StatTrackerNightSight.java | 4 +-- .../tracker/StatTrackerPhysicalProtect.java | 4 +-- .../tracker/StatTrackerPoison.java | 4 +-- .../tracker/StatTrackerRepairing.java | 4 +-- .../tracker/StatTrackerSelfSacrifice.java | 4 +-- .../tracker/StatTrackerSolarPowered.java | 4 +-- .../tracker/StatTrackerSprintAttack.java | 4 +-- .../tracker/StatTrackerStepAssist.java | 4 +-- .../LivingArmourUpgradeArrowProtect.java | 2 +- .../upgrade/LivingArmourUpgradeArrowShot.java | 4 +-- .../LivingArmourUpgradeCriticalStrike.java | 2 +- .../upgrade/LivingArmourUpgradeDigging.java | 4 +-- .../upgrade/LivingArmourUpgradeElytra.java | 4 +-- .../LivingArmourUpgradeExperience.java | 2 +- .../LivingArmourUpgradeFallProtect.java | 2 +- .../LivingArmourUpgradeFireResist.java | 6 ++--- .../LivingArmourUpgradeGraveDigger.java | 2 +- .../LivingArmourUpgradeGrimReaperSprint.java | 4 +-- .../LivingArmourUpgradeHealthboost.java | 4 +-- .../upgrade/LivingArmourUpgradeJump.java | 4 +-- .../LivingArmourUpgradeKnockbackResist.java | 2 +- .../LivingArmourUpgradeMeleeDamage.java | 4 +-- .../LivingArmourUpgradeNightSight.java | 6 ++--- .../LivingArmourUpgradePhysicalProtect.java | 2 +- .../LivingArmourUpgradePoisonResist.java | 6 ++--- .../upgrade/LivingArmourUpgradeRepairing.java | 4 +-- .../LivingArmourUpgradeSelfSacrifice.java | 2 +- .../LivingArmourUpgradeSolarPowered.java | 4 +-- .../upgrade/LivingArmourUpgradeSpeed.java | 4 +-- .../LivingArmourUpgradeSprintAttack.java | 2 +- .../LivingArmourUpgradeStepAssist.java | 4 +-- .../bloodmagic/meteor/MeteorRegistry.java | 2 +- .../network/DemonAuraPacketProcessor.java | 4 +-- .../bloodmagic/potion/BMPotionUtils.java | 8 +++--- .../potion/PotionEventHandlers.java | 2 +- .../bloodmagic/proxy/ClientProxy.java | 4 +-- .../bloodmagic/proxy/CommonProxy.java | 6 ++--- .../AlchemyTableDyeableRecipe.java | 4 +-- .../AlchemyTablePotionRecipe.java | 2 +- .../registry/ModArmourTrackers.java | 2 +- .../registry/ModCorruptionBlocks.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 14 +++++----- .../bloodmagic/registry/ModRituals.java | 12 ++++----- .../registry/ModTranquilityHandlers.java | 2 +- .../bloodmagic/ritual/RitualAltarBuilder.java | 16 ++++++------ .../bloodmagic/ritual/RitualAnimalGrowth.java | 4 +-- .../bloodmagic/ritual/RitualArmourEvolve.java | 2 +- .../bloodmagic/ritual/RitualCobblestone.java | 2 +- .../bloodmagic/ritual/RitualContainment.java | 4 +-- .../bloodmagic/ritual/RitualCrushing.java | 10 +++---- .../ritual/RitualCrystalHarvest.java | 2 +- .../bloodmagic/ritual/RitualExpulsion.java | 6 ++--- .../ritual/RitualFeatheredKnife.java | 10 +++---- .../bloodmagic/ritual/RitualFelling.java | 2 +- .../bloodmagic/ritual/RitualForsakenSoul.java | 4 +-- .../bloodmagic/ritual/RitualFullStomach.java | 2 +- .../bloodmagic/ritual/RitualGreenGrove.java | 8 +++--- .../bloodmagic/ritual/RitualHarvest.java | 8 +++--- .../bloodmagic/ritual/RitualInterdiction.java | 4 +-- .../bloodmagic/ritual/RitualJumping.java | 2 +- .../bloodmagic/ritual/RitualLava.java | 8 +++--- .../ritual/RitualLivingArmourDowngrade.java | 8 +++--- .../bloodmagic/ritual/RitualMagnetic.java | 4 +-- .../bloodmagic/ritual/RitualMeteor.java | 4 +-- .../bloodmagic/ritual/RitualPlacer.java | 2 +- .../bloodmagic/ritual/RitualPortal.java | 10 +++---- .../bloodmagic/ritual/RitualPump.java | 2 +- .../bloodmagic/ritual/RitualRegeneration.java | 6 ++--- .../bloodmagic/ritual/RitualSpeed.java | 4 +-- .../bloodmagic/ritual/RitualSuppression.java | 2 +- .../ritual/RitualUpgradeRemove.java | 8 +++--- .../bloodmagic/ritual/RitualWater.java | 2 +- .../ritual/RitualWellOfSuffering.java | 4 +-- .../bloodmagic/ritual/RitualZephyr.java | 2 +- .../harvest/HarvestHandlerPlantable.java | 6 ++--- .../ritual/harvest/HarvestHandlerStem.java | 6 ++--- .../ritual/harvest/HarvestHandlerTall.java | 6 ++--- .../ritual/imperfect/ImperfectRitualDay.java | 6 ++--- .../imperfect/ImperfectRitualNight.java | 6 ++--- .../ritual/imperfect/ImperfectRitualRain.java | 6 ++--- .../imperfect/ImperfectRitualResistance.java | 6 ++--- .../imperfect/ImperfectRitualZombie.java | 6 ++--- .../ritual/portal/LocationsHandler.java | 4 +-- .../bloodmagic/ritual/portal/Teleports.java | 8 +++--- .../bloodmagic/structures/Dungeon.java | 2 +- .../bloodmagic/structures/DungeonRoom.java | 2 +- .../bloodmagic/tile/TileAlchemyArray.java | 8 +++--- .../bloodmagic/tile/TileAlchemyTable.java | 14 +++++----- .../WayofTime/bloodmagic/tile/TileAltar.java | 4 +-- .../bloodmagic/tile/TileBloodTank.java | 2 +- .../bloodmagic/tile/TileDemonCrucible.java | 8 +++--- .../bloodmagic/tile/TileDemonCrystal.java | 4 +-- .../tile/TileDemonCrystallizer.java | 6 ++--- .../bloodmagic/tile/TileDemonPylon.java | 6 ++--- .../tile/TileImperfectRitualStone.java | 10 +++---- .../bloodmagic/tile/TileIncenseAltar.java | 12 ++++----- .../bloodmagic/tile/TileInversionPillar.java | 4 +-- .../tile/TileMasterRitualStone.java | 22 ++++++++-------- .../bloodmagic/tile/TilePhantomBlock.java | 2 +- .../tile/TilePurificationAltar.java | 6 ++--- .../bloodmagic/tile/TileSoulForge.java | 14 +++++----- .../bloodmagic/tile/TileSpectralBlock.java | 2 +- .../bloodmagic/tile/TileTeleposer.java | 12 ++++----- .../tile/container/ContainerAlchemyTable.java | 2 +- .../tile/container/ContainerSoulForge.java | 4 +-- .../tile/routing/TileFilteredRoutingNode.java | 2 +- .../tile/routing/TileMasterRoutingNode.java | 4 +-- .../tile/routing/TileRoutingNode.java | 2 +- .../bloodmagic/util/GhostItemHelper.java | 4 +-- .../WayofTime/bloodmagic/util/PluginUtil.java | 7 ++--- .../java/WayofTime/bloodmagic/util/Utils.java | 10 +++---- .../util/handler/event/ClientHandler.java | 8 +++--- .../util/handler/event/CraftingHandler.java | 12 ++++----- .../util/handler/event/GenericHandler.java | 26 +++++++++---------- .../handler/event/LivingArmourHandler.java | 4 +-- .../handler/event/StatTrackerHandler.java | 2 +- .../util/handler/event/WillHandler.java | 2 +- .../bloodmagic/util/helper/RecipeHelper.java | 6 ++--- 421 files changed, 1006 insertions(+), 999 deletions(-) rename src/main/java/WayofTime/bloodmagic/{apiv2 => api}/BloodMagicPlugin.java (88%) rename src/main/java/WayofTime/bloodmagic/{apiv2 => api}/IBloodMagicAPI.java (92%) rename src/main/java/WayofTime/bloodmagic/{apiv2 => api}/IBloodMagicBlacklist.java (94%) rename src/main/java/WayofTime/bloodmagic/{apiv2 => api}/IBloodMagicPlugin.java (68%) rename src/main/java/WayofTime/bloodmagic/{api_impl => api/impl}/BloodMagicAPI.java (91%) rename src/main/java/WayofTime/bloodmagic/{api_impl => api/impl}/BloodMagicBlacklist.java (96%) rename src/main/java/WayofTime/bloodmagic/{api_impl => api/impl}/BloodMagicCorePlugin.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/BlockStack.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/BloodMagicAPI.java (79%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/Constants.java (99%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/DamageSourceBloodMagic.java (93%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ItemStackWrapper.java (98%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/alchemyCrafting/AlchemyArrayEffect.java (86%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/alchemyCrafting/AlchemyArrayEffectCrafting.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/alchemyCrafting/AlchemyCircleRenderer.java (98%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/altar/AltarComponent.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/altar/AltarUpgrade.java (98%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/altar/EnumAltarComponent.java (91%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/altar/EnumAltarTier.java (99%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/altar/IAltarComponent.java (84%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/altar/IAltarManipulator.java (73%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/altar/IBloodAltar.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/compress/CompressionHandler.java (89%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/compress/CompressionRegistry.java (98%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/event/AddToNetworkEvent.java (94%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/event/AltarCraftedEvent.java (87%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/event/BoundToolEvent.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/event/ItemBindEvent.java (87%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/event/RitualEvent.java (89%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/event/SacrificeKnifeUsedEvent.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/event/SoulNetworkEvent.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/event/TeleposeEvent.java (98%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IActivatable.java (78%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IAlchemyArray.java (66%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IAltarReader.java (72%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IBindable.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/ICustomAlchemyConsumable.java (82%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IDemonWillViewer.java (86%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IDocumentedBlock.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IHarvestHandler.java (78%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IItemLPContainer.java (83%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IMultiWillTool.java (52%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/INodeRenderer.java (72%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IPurificationAsh.java (80%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/ISentientSwordEffectProvider.java (74%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/ISentientTool.java (79%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/ISigil.java (76%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/iface/IUpgradeTrainer.java (86%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/impl/ItemBindable.java (82%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/impl/ItemSigil.java (80%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/impl/ItemSigilToggleable.java (89%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/incense/EnumTranquilityType.java (70%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/incense/IIncensePath.java (89%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/incense/ITranquilityHandler.java (84%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/incense/IncenseTranquilityRegistry.java (94%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/incense/TranquilityStack.java (81%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/livingArmour/ILivingArmour.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/livingArmour/LivingArmourHandler.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/livingArmour/LivingArmourUpgrade.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/livingArmour/StatTracker.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/orb/BloodOrb.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/orb/IBloodOrb.java (75%) create mode 100644 src/main/java/WayofTime/bloodmagic/apibutnotreally/package-info.java rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/recipe/AlchemyTableCustomRecipe.java (91%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/recipe/AlchemyTableRecipe.java (99%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/recipe/LivingArmourDowngradeRecipe.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/recipe/TartaricForgeRecipe.java (99%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/AlchemyArrayRecipeRegistry.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/AlchemyTableRecipeRegistry.java (90%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/AltarRecipeRegistry.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/HarvestRegistry.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/ImperfectRitualRegistry.java (92%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/LivingArmourDowngradeRecipeRegistry.java (90%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/OrbRegistry.java (91%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/RitualRegistry.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/registry/TartaricForgeRecipeRegistry.java (90%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/AreaDescriptor.java (99%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/CapabilityRuneType.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/EnumRitualReaderState.java (62%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/EnumRuneType.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/IMasterRitualStone.java (88%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/IRitualStone.java (91%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/Ritual.java (98%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/RitualComponent.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/RitualRenderer.java (87%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/imperfect/IImperfectRitualStone.java (88%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/imperfect/ImperfectRitual.java (93%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/ritual/imperfect/package-info.java (71%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/saving/BMWorldSavedData.java (93%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/saving/SoulNetwork.java (94%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/soul/DemonWillHolder.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/soul/EnumDemonWillType.java (91%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/soul/IDemonWill.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/soul/IDemonWillConduit.java (90%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/soul/IDemonWillGem.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/soul/IDemonWillWeapon.java (84%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/soul/IDiscreteDemonWill.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/soul/PlayerDemonWillHandler.java (98%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/teleport/ITeleport.java (59%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/teleport/PortalLocation.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/teleport/Teleport.java (97%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/teleport/TeleportQueue.java (93%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/teleport/TeleporterBloodMagic.java (94%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/BindableHelper.java (95%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/IncenseHelper.java (84%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/ItemHelper.java (92%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/LogHelper.java (87%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/NBTHelper.java (83%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/NetworkHelper.java (91%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/PlayerHelper.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/PlayerSacrificeHelper.java (96%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/PurificationHelper.java (89%) rename src/main/java/WayofTime/bloodmagic/{api => apibutnotreally}/util/helper/RitualHelper.java (92%) diff --git a/build.gradle b/build.gradle index 66a57a25..27fe1311 100644 --- a/build.gradle +++ b/build.gradle @@ -93,6 +93,7 @@ task apiJar(type: Jar) { from sourceSets.main.allSource from sourceSets.main.output include 'WayofTime/bloodmagic/api/**/*' + exclude 'WayofTime/bloodmagic/api/impl/**/*' classifier = 'api' } diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 86705236..08bdce42 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic; -import WayofTime.bloodmagic.api.registry.OrbRegistry; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.util.helper.LogHelper; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; -import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; -import WayofTime.bloodmagic.apiv2.IBloodMagicPlugin; +import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.util.helper.LogHelper; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.BloodMagicPlugin; +import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java index 9a796c9c..e5888e90 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; import WayofTime.bloodmagic.fakePlayer.FakePlayerBM; import WayofTime.bloodmagic.tile.TileAlchemyArray; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java index 8310f713..d8f09294 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffectCrafting; import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java index 7b0211bd..a5d962b1 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java index f7425b3b..46cc3ed0 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java index afa6ce77..66ce98a8 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java index 464cd6cd..5f02f6c4 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; import WayofTime.bloodmagic.tile.TileAlchemyArray; import com.google.common.base.Predicate; import net.minecraft.entity.EntityLiving; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java index 2b778e11..4f89481b 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index b4846dfa..37f49e00 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -1,19 +1,18 @@ package WayofTime.bloodmagic.altar; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.*; -import WayofTime.bloodmagic.api.event.AltarCraftedEvent; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.altar.*; +import WayofTime.bloodmagic.apibutnotreally.event.AltarCraftedEvent; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry.AltarRecipe; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Enums; import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; @@ -31,7 +30,6 @@ import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.capability.FluidTankPropertiesWrapper; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import java.util.List; diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java similarity index 88% rename from src/main/java/WayofTime/bloodmagic/apiv2/BloodMagicPlugin.java rename to src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java index 6458977d..04907dfa 100644 --- a/src/main/java/WayofTime/bloodmagic/apiv2/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apiv2; +package WayofTime.bloodmagic.api; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicAPI.java rename to src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java index 0e7c8d50..a439d73e 100644 --- a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apiv2; +package WayofTime.bloodmagic.api; import net.minecraft.block.state.IBlockState; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java rename to src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java index f1f1b0ad..64ba641f 100644 --- a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apiv2; +package WayofTime.bloodmagic.api; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java similarity index 68% rename from src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicPlugin.java rename to src/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java index ad2098a7..450076db 100644 --- a/src/main/java/WayofTime/bloodmagic/apiv2/IBloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apiv2; +package WayofTime.bloodmagic.api; public interface IBloodMagicPlugin { diff --git a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java rename to src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index b2fc17ce..a8e9426e 100644 --- a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.api_impl; +package WayofTime.bloodmagic.api.impl; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.apiv2.IBloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; +import WayofTime.bloodmagic.api.IBloodMagicAPI; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; diff --git a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java rename to src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java index b88d64b6..c07e979c 100644 --- a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api_impl; +package WayofTime.bloodmagic.api.impl; -import WayofTime.bloodmagic.apiv2.IBloodMagicBlacklist; +import WayofTime.bloodmagic.api.IBloodMagicBlacklist; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java rename to src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index aab81509..659a87d6 100644 --- a/src/main/java/WayofTime/bloodmagic/api_impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -1,11 +1,11 @@ -package WayofTime.bloodmagic.api_impl; +package WayofTime.bloodmagic.api.impl; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; -import WayofTime.bloodmagic.apiv2.IBloodMagicAPI; -import WayofTime.bloodmagic.apiv2.IBloodMagicPlugin; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; +import WayofTime.bloodmagic.api.BloodMagicPlugin; +import WayofTime.bloodmagic.api.IBloodMagicAPI; +import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockDecorative; import WayofTime.bloodmagic.block.enums.EnumBloodRune; diff --git a/src/main/java/WayofTime/bloodmagic/api/package-info.java b/src/main/java/WayofTime/bloodmagic/api/package-info.java index 3f175867..d77cfda2 100644 --- a/src/main/java/WayofTime/bloodmagic/api/package-info.java +++ b/src/main/java/WayofTime/bloodmagic/api/package-info.java @@ -1,4 +1,4 @@ -@API(owner = BloodMagic.MODID, provides = BloodMagic.MODID + "|API", apiVersion = BloodMagic.VERSION) +@API(owner = BloodMagic.MODID, provides = BloodMagic.MODID + "|api", apiVersion = "2.0.0") package WayofTime.bloodmagic.api; import WayofTime.bloodmagic.BloodMagic; diff --git a/src/main/java/WayofTime/bloodmagic/api/BlockStack.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/BlockStack.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/BlockStack.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/BlockStack.java index 72752c81..74e50107 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BlockStack.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/BlockStack.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api; +package WayofTime.bloodmagic.apibutnotreally; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/BloodMagicAPI.java similarity index 79% rename from src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/BloodMagicAPI.java index e69115f3..48b7bc95 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/BloodMagicAPI.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api; +package WayofTime.bloodmagic.apibutnotreally; -import WayofTime.bloodmagic.api.util.helper.LogHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.LogHelper; import net.minecraft.util.DamageSource; /** diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/api/Constants.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java index 4ead21b0..11d1830b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api; +package WayofTime.bloodmagic.apibutnotreally; import WayofTime.bloodmagic.BloodMagic; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/DamageSourceBloodMagic.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/DamageSourceBloodMagic.java index d9747ad3..75af1dd6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/DamageSourceBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/DamageSourceBloodMagic.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api; +package WayofTime.bloodmagic.apibutnotreally; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ItemStackWrapper.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ItemStackWrapper.java index d0949cbe..a48a0acd 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ItemStackWrapper.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api; +package WayofTime.bloodmagic.apibutnotreally; import net.minecraft.block.Block; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffect.java similarity index 86% rename from src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffect.java index 7455ca08..d08c968c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffect.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.alchemyCrafting; +package WayofTime.bloodmagic.apibutnotreally.alchemyCrafting; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; +import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCrafting.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCrafting.java index a15da577..16712dee 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCrafting.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.alchemyCrafting; +package WayofTime.bloodmagic.apibutnotreally.alchemyCrafting; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyCircleRenderer.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyCircleRenderer.java index f6276316..789257c5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyCircleRenderer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.alchemyCrafting; +package WayofTime.bloodmagic.apibutnotreally.alchemyCrafting; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarComponent.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarComponent.java index 470097e1..20a70d23 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/AltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.altar; +package WayofTime.bloodmagic.apibutnotreally.altar; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarUpgrade.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarUpgrade.java index c18801eb..7598f58a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/AltarUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarUpgrade.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.altar; +package WayofTime.bloodmagic.apibutnotreally.altar; public class AltarUpgrade { private int speedCount; diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarComponent.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarComponent.java index 8443bc1a..8f863756 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.altar; +package WayofTime.bloodmagic.apibutnotreally.altar; import java.util.Locale; diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarTier.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarTier.java index 16a4e7e1..b783a928 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/EnumAltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarTier.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.altar; +package WayofTime.bloodmagic.apibutnotreally.altar; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/IAltarComponent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarComponent.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/api/altar/IAltarComponent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarComponent.java index 52d1d763..666f5be0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/IAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.altar; +package WayofTime.bloodmagic.apibutnotreally.altar; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/IAltarManipulator.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarManipulator.java similarity index 73% rename from src/main/java/WayofTime/bloodmagic/api/altar/IAltarManipulator.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarManipulator.java index 57509bc0..5a69420e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/IAltarManipulator.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarManipulator.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.altar; +package WayofTime.bloodmagic.apibutnotreally.altar; /** * Any item that implements this interface will not be pulled into the Altar on diff --git a/src/main/java/WayofTime/bloodmagic/api/altar/IBloodAltar.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IBloodAltar.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/altar/IBloodAltar.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IBloodAltar.java index 843d2a0e..a8642b89 100644 --- a/src/main/java/WayofTime/bloodmagic/api/altar/IBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IBloodAltar.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.altar; +package WayofTime.bloodmagic.apibutnotreally.altar; public interface IBloodAltar { int getCapacity(); diff --git a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionHandler.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionHandler.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/api/compress/CompressionHandler.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionHandler.java index 22a8fe9e..e36149c6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionHandler.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.compress; +package WayofTime.bloodmagic.apibutnotreally.compress; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionRegistry.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionRegistry.java index 7fc1bbae..786306c9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/compress/CompressionRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionRegistry.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.compress; +package WayofTime.bloodmagic.apibutnotreally.compress; import WayofTime.bloodmagic.util.Utils; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/AddToNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AddToNetworkEvent.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/api/event/AddToNetworkEvent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AddToNetworkEvent.java index ddd5c637..4f84073f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/AddToNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AddToNetworkEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.event; +package WayofTime.bloodmagic.apibutnotreally.event; import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AltarCraftedEvent.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AltarCraftedEvent.java index f20d0ec7..2875f168 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/AltarCraftedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AltarCraftedEvent.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.event; +package WayofTime.bloodmagic.apibutnotreally.event; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.eventhandler.Event; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/BoundToolEvent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/BoundToolEvent.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/event/BoundToolEvent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/event/BoundToolEvent.java index ab2de72a..3e848cf9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/BoundToolEvent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/BoundToolEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.event; +package WayofTime.bloodmagic.apibutnotreally.event; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/ItemBindEvent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/ItemBindEvent.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/api/event/ItemBindEvent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/event/ItemBindEvent.java index 03348e02..d072d39f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/ItemBindEvent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/ItemBindEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.event; +package WayofTime.bloodmagic.apibutnotreally.event; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -13,7 +13,7 @@ public class ItemBindEvent extends Event { /** * This event is called whenever a player attempts to bind a - * {@link WayofTime.bloodmagic.api.iface.IBindable} item. + * {@link WayofTime.bloodmagic.apibutnotreally.iface.IBindable} item. * * @param player The player doing the binding * @param key The UUID of the player doing the binding diff --git a/src/main/java/WayofTime/bloodmagic/api/event/RitualEvent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/RitualEvent.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/api/event/RitualEvent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/event/RitualEvent.java index 9036f4cb..dd118b83 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/RitualEvent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/RitualEvent.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.api.event; +package WayofTime.bloodmagic.apibutnotreally.event; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SacrificeKnifeUsedEvent.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SacrificeKnifeUsedEvent.java index 93f72b23..991e7a15 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SacrificeKnifeUsedEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.event; +package WayofTime.bloodmagic.apibutnotreally.event; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.fml.common.eventhandler.Cancelable; diff --git a/src/main/java/WayofTime/bloodmagic/api/event/SoulNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SoulNetworkEvent.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/event/SoulNetworkEvent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SoulNetworkEvent.java index 06928b8a..a39674a3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SoulNetworkEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.event; +package WayofTime.bloodmagic.apibutnotreally.event; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -24,7 +24,7 @@ public class SoulNetworkEvent extends Event { /** * This event is called when an - * {@link WayofTime.bloodmagic.api.impl.ItemBindable} is being drained + * {@link WayofTime.bloodmagic.apibutnotreally.impl.ItemBindable} is being drained * inside of a {@link net.minecraft.tileentity.TileEntity}. *

        * If canceled, the drain will not be executed. diff --git a/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/TeleposeEvent.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/event/TeleposeEvent.java index d474e46b..d17ea312 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/TeleposeEvent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/TeleposeEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.event; +package WayofTime.bloodmagic.apibutnotreally.event; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IActivatable.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IActivatable.java similarity index 78% rename from src/main/java/WayofTime/bloodmagic/api/iface/IActivatable.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IActivatable.java index c760dd5c..c72c4cb7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IActivatable.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAlchemyArray.java similarity index 66% rename from src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAlchemyArray.java index 60d34f08..dfa4559a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAlchemyArray.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IAltarReader.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAltarReader.java similarity index 72% rename from src/main/java/WayofTime/bloodmagic/api/iface/IAltarReader.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAltarReader.java index 292e2e74..d3d0bdc3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IAltarReader.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAltarReader.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; /** * Any item that implements this interface will not be pulled into the Altar on diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IBindable.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/iface/IBindable.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java index 5b515342..19cca36f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IBindable.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ICustomAlchemyConsumable.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ICustomAlchemyConsumable.java similarity index 82% rename from src/main/java/WayofTime/bloodmagic/api/iface/ICustomAlchemyConsumable.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ICustomAlchemyConsumable.java index b7d6f034..547eb869 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ICustomAlchemyConsumable.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ICustomAlchemyConsumable.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IDemonWillViewer.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDemonWillViewer.java similarity index 86% rename from src/main/java/WayofTime/bloodmagic/api/iface/IDemonWillViewer.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDemonWillViewer.java index cfcbd3d9..ecaa8dd3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IDemonWillViewer.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDemonWillViewer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDocumentedBlock.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDocumentedBlock.java index fca40184..68ba0fd8 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDocumentedBlock.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IHarvestHandler.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IHarvestHandler.java similarity index 78% rename from src/main/java/WayofTime/bloodmagic/api/iface/IHarvestHandler.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IHarvestHandler.java index f25382f5..c4b38f18 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IHarvestHandler.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IHarvestHandler.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; -import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -16,7 +16,7 @@ public interface IHarvestHandler { * the block types you want. * * @param world - The world the - * {@link WayofTime.bloodmagic.api.ritual.IMasterRitualStone} is in. + * {@link WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone} is in. * @param pos - The position of the Block being checked * @param blockStack - The Block being checked * @return If the block was successfully harvested. diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IItemLPContainer.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IItemLPContainer.java similarity index 83% rename from src/main/java/WayofTime/bloodmagic/api/iface/IItemLPContainer.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IItemLPContainer.java index b909856d..72e05cd9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IItemLPContainer.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IItemLPContainer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IMultiWillTool.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IMultiWillTool.java similarity index 52% rename from src/main/java/WayofTime/bloodmagic/api/iface/IMultiWillTool.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IMultiWillTool.java index 9ff0d689..519fc6cd 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IMultiWillTool.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IMultiWillTool.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import net.minecraft.item.ItemStack; public interface IMultiWillTool { diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/INodeRenderer.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/INodeRenderer.java similarity index 72% rename from src/main/java/WayofTime/bloodmagic/api/iface/INodeRenderer.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/INodeRenderer.java index 27b48335..a12114b0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/INodeRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/INodeRenderer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; /** * Held items that implement this will cause the beams between routing nodes to diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IPurificationAsh.java similarity index 80% rename from src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IPurificationAsh.java index b6b7940b..777a04e9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IPurificationAsh.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ISentientSwordEffectProvider.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientSwordEffectProvider.java similarity index 74% rename from src/main/java/WayofTime/bloodmagic/api/iface/ISentientSwordEffectProvider.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientSwordEffectProvider.java index 69ed3b28..16225306 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ISentientSwordEffectProvider.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientSwordEffectProvider.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ISentientTool.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientTool.java similarity index 79% rename from src/main/java/WayofTime/bloodmagic/api/iface/ISentientTool.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientTool.java index 979c1066..18ed5e29 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ISentientTool.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientTool.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java similarity index 76% rename from src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java index bc625ee5..12f54b04 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/ISigil.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -8,7 +8,7 @@ import net.minecraft.world.World; import javax.annotation.Nonnull; /** - * Used for all {@link WayofTime.bloodmagic.api.impl.ItemSigil} EXCEPT + * Used for all {@link WayofTime.bloodmagic.apibutnotreally.impl.ItemSigil} EXCEPT * Sigils of Holdings. */ public interface ISigil { diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IUpgradeTrainer.java similarity index 86% rename from src/main/java/WayofTime/bloodmagic/api/iface/IUpgradeTrainer.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IUpgradeTrainer.java index 6d4300bb..f8d30032 100644 --- a/src/main/java/WayofTime/bloodmagic/api/iface/IUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IUpgradeTrainer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.iface; +package WayofTime.bloodmagic.apibutnotreally.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java similarity index 82% rename from src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java index 11fe41a2..bb705a2c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemBindable.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.api.impl; +package WayofTime.bloodmagic.apibutnotreally.impl; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigil.java similarity index 80% rename from src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigil.java index ff17b437..3d2dbe87 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigil.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigil.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.api.impl; +package WayofTime.bloodmagic.apibutnotreally.impl; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigilToggleable.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigilToggleable.java index bd243ec5..9c905233 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigilToggleable.java @@ -1,11 +1,11 @@ -package WayofTime.bloodmagic.api.impl; +package WayofTime.bloodmagic.apibutnotreally.impl; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IActivatable; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IActivatable; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import com.google.common.base.Strings; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/EnumTranquilityType.java similarity index 70% rename from src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/EnumTranquilityType.java index ba589df3..af381ab7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/EnumTranquilityType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.incense; +package WayofTime.bloodmagic.apibutnotreally.incense; public enum EnumTranquilityType { PLANT(), diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IIncensePath.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IIncensePath.java index bb7bc0ad..5f75c546 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IIncensePath.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.incense; +package WayofTime.bloodmagic.apibutnotreally.incense; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/ITranquilityHandler.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/ITranquilityHandler.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/api/incense/ITranquilityHandler.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/ITranquilityHandler.java index e6b88a4d..baee7500 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/ITranquilityHandler.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/ITranquilityHandler.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.incense; +package WayofTime.bloodmagic.apibutnotreally.incense; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IncenseTranquilityRegistry.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IncenseTranquilityRegistry.java index 165b80cf..24d04fb7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IncenseTranquilityRegistry.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.incense; +package WayofTime.bloodmagic.apibutnotreally.incense; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/TranquilityStack.java similarity index 81% rename from src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/TranquilityStack.java index 5852d488..ff94b0b0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/TranquilityStack.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.incense; +package WayofTime.bloodmagic.apibutnotreally.incense; public class TranquilityStack { public final EnumTranquilityType type; diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/ILivingArmour.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/ILivingArmour.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/livingArmour/ILivingArmour.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/ILivingArmour.java index 3a487a6c..c260d452 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/ILivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/ILivingArmour.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.livingArmour; +package WayofTime.bloodmagic.apibutnotreally.livingArmour; import com.google.common.collect.Multimap; import net.minecraft.entity.ai.attributes.AttributeModifier; diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourHandler.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourHandler.java index 129ea2d8..193a6570 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourHandler.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.livingArmour; +package WayofTime.bloodmagic.apibutnotreally.livingArmour; -import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; import net.minecraft.nbt.NBTTagCompound; import java.lang.reflect.Constructor; diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourUpgrade.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourUpgrade.java index 703478fa..2fa4e8cc 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/LivingArmourUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourUpgrade.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.livingArmour; +package WayofTime.bloodmagic.apibutnotreally.livingArmour; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/StatTracker.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/StatTracker.java index a43b7448..f450b4aa 100644 --- a/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/StatTracker.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.livingArmour; +package WayofTime.bloodmagic.apibutnotreally.livingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/BloodOrb.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/BloodOrb.java index f5acc317..adbe7c7a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/orb/BloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/BloodOrb.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.orb; +package WayofTime.bloodmagic.apibutnotreally.orb; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraftforge.registries.IForgeRegistryEntry; diff --git a/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/IBloodOrb.java similarity index 75% rename from src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/IBloodOrb.java index 76f1161b..6b87ddd5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/orb/IBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/IBloodOrb.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.orb; +package WayofTime.bloodmagic.apibutnotreally.orb; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/package-info.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/package-info.java new file mode 100644 index 00000000..20478ed8 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/package-info.java @@ -0,0 +1,6 @@ +@Deprecated // This entire "api" is going to be nuked over time. Consider all of this unstable. +@API(owner = BloodMagic.MODID, provides = BloodMagic.MODID + "|API", apiVersion = BloodMagic.VERSION) +package WayofTime.bloodmagic.apibutnotreally; + +import WayofTime.bloodmagic.BloodMagic; +import net.minecraftforge.fml.common.API; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableCustomRecipe.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableCustomRecipe.java index be9afea1..5ce7e83c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableCustomRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableCustomRecipe.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.recipe; +package WayofTime.bloodmagic.apibutnotreally.recipe; -import WayofTime.bloodmagic.api.iface.ICustomAlchemyConsumable; +import WayofTime.bloodmagic.apibutnotreally.iface.ICustomAlchemyConsumable; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableRecipe.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableRecipe.java index 553cdb6d..6cb1cf8d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableRecipe.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.recipe; +package WayofTime.bloodmagic.apibutnotreally.recipe; import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/LivingArmourDowngradeRecipe.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/LivingArmourDowngradeRecipe.java index 65aa9c3a..d40eab8b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/LivingArmourDowngradeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/LivingArmourDowngradeRecipe.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.recipe; +package WayofTime.bloodmagic.apibutnotreally.recipe; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/TartaricForgeRecipe.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/TartaricForgeRecipe.java index d4becd01..028744fd 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/TartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/TartaricForgeRecipe.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.recipe; +package WayofTime.bloodmagic.apibutnotreally.recipe; import net.minecraft.block.Block; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java index c4cf383e..fd939ba5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffectCrafting; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyTableRecipeRegistry.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyTableRecipeRegistry.java index daceba43..ff55fd94 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyTableRecipeRegistry.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AltarRecipeRegistry.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AltarRecipeRegistry.java index 64342bfa..4e4c9352 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AltarRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AltarRecipeRegistry.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/HarvestRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/HarvestRegistry.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/registry/HarvestRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/HarvestRegistry.java index 90b2fa42..a0a5eeba 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/HarvestRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/HarvestRegistry.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.iface.IHarvestHandler; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockStem; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/ImperfectRitualRegistry.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/ImperfectRitualRegistry.java index feebf365..16c5a510 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/ImperfectRitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/ImperfectRitualRegistry.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/LivingArmourDowngradeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/LivingArmourDowngradeRecipeRegistry.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/api/registry/LivingArmourDowngradeRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/LivingArmourDowngradeRecipeRegistry.java index 3f635ed3..f2787e34 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/LivingArmourDowngradeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/LivingArmourDowngradeRecipeRegistry.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/OrbRegistry.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/OrbRegistry.java index 13cdde2b..0efd5b88 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/OrbRegistry.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; import com.google.common.collect.ArrayListMultimap; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/RitualRegistry.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/RitualRegistry.java index e62ece62..ced086b2 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/RitualRegistry.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/TartaricForgeRecipeRegistry.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/TartaricForgeRecipeRegistry.java index f9df0ffd..1090c897 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/TartaricForgeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/TartaricForgeRecipeRegistry.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.registry; +package WayofTime.bloodmagic.apibutnotreally.registry; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/AreaDescriptor.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/AreaDescriptor.java index 521c9dca..f2ea64be 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/AreaDescriptor.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/CapabilityRuneType.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/CapabilityRuneType.java index af658b4f..40be45bf 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/CapabilityRuneType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagByte; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRitualReaderState.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRitualReaderState.java similarity index 62% rename from src/main/java/WayofTime/bloodmagic/api/ritual/EnumRitualReaderState.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRitualReaderState.java index b1b9597f..f2d3cc8f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRitualReaderState.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRitualReaderState.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; public enum EnumRitualReaderState { SET_AREA, diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRuneType.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRuneType.java index 74c7aeb4..39685b3e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRuneType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; import net.minecraft.init.Items; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IMasterRitualStone.java similarity index 88% rename from src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IMasterRitualStone.java index 6fb8544e..8cf47ab3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IMasterRitualStone.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IRitualStone.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IRitualStone.java index 846d6267..073b9b4b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IRitualStone.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/Ritual.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/Ritual.java index 35763652..aa8c8c1c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/Ritual.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -21,7 +21,7 @@ import java.util.Map.Entry; /** * Abstract class for creating new rituals. Rituals need be registered with - * {@link WayofTime.bloodmagic.api.registry.RitualRegistry#registerRitual(Ritual, String)} + * {@link WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry#registerRitual(Ritual, String)} */ public abstract class Ritual { public final ArrayList ritualComponents = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualComponent.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualComponent.java index 97d8893d..ad864ce7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualRenderer.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualRenderer.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/api/ritual/RitualRenderer.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualRenderer.java index 57251f8d..4c999f20 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualRenderer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.ritual; +package WayofTime.bloodmagic.apibutnotreally.ritual; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/IImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/IImperfectRitualStone.java similarity index 88% rename from src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/IImperfectRitualStone.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/IImperfectRitualStone.java index 6c8620db..f468513e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/IImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/IImperfectRitualStone.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.ritual.imperfect; +package WayofTime.bloodmagic.apibutnotreally.ritual.imperfect; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/ImperfectRitual.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/ImperfectRitual.java index d19ef961..c6f668d3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/ImperfectRitual.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/ImperfectRitual.java @@ -1,13 +1,13 @@ -package WayofTime.bloodmagic.api.ritual.imperfect; +package WayofTime.bloodmagic.apibutnotreally.ritual.imperfect; -import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; /** * Abstract class for creating new imperfect rituals. ImperfectRituals need be * registered with - * {@link WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry#registerRitual(ImperfectRitual)} + * {@link WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry#registerRitual(ImperfectRitual)} */ public abstract class ImperfectRitual { diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/package-info.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/package-info.java similarity index 71% rename from src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/package-info.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/package-info.java index 5740241a..e47d4b81 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/imperfect/package-info.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/package-info.java @@ -1,6 +1,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.api.ritual.imperfect; +package WayofTime.bloodmagic.apibutnotreally.ritual.imperfect; import mcp.MethodsReturnNonnullByDefault; diff --git a/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/BMWorldSavedData.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/BMWorldSavedData.java index 16470fa5..be15d0a9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/saving/BMWorldSavedData.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/BMWorldSavedData.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.saving; +package WayofTime.bloodmagic.apibutnotreally.saving; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/SoulNetwork.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/SoulNetwork.java index 4fdb465b..54098c72 100644 --- a/src/main/java/WayofTime/bloodmagic/api/saving/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/SoulNetwork.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.api.saving; +package WayofTime.bloodmagic.apibutnotreally.saving; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.event.AddToNetworkEvent; -import WayofTime.bloodmagic.api.event.SoulNetworkEvent; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.event.AddToNetworkEvent; +import WayofTime.bloodmagic.apibutnotreally.event.SoulNetworkEvent; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import com.google.common.base.Strings; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/DemonWillHolder.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/DemonWillHolder.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/soul/DemonWillHolder.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/DemonWillHolder.java index 8ec0283e..721cbb99 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/DemonWillHolder.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/DemonWillHolder.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.soul; +package WayofTime.bloodmagic.apibutnotreally.soul; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/EnumDemonWillType.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/api/soul/EnumDemonWillType.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java index 445697f7..55a1dd42 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/EnumDemonWillType.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.soul; +package WayofTime.bloodmagic.apibutnotreally.soul; import net.minecraft.util.IStringSerializable; diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWill.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWill.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/soul/IDemonWill.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWill.java index 7ef8c777..1387372b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWill.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWill.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.soul; +package WayofTime.bloodmagic.apibutnotreally.soul; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillConduit.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillConduit.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillConduit.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillConduit.java index bfa3a253..96947c98 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillConduit.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillConduit.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.soul; +package WayofTime.bloodmagic.apibutnotreally.soul; /** * Implement this interface on a block that can accept and store Demonic Will. diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillGem.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillGem.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillGem.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillGem.java index 26c90de5..4878ca07 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillGem.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.soul; +package WayofTime.bloodmagic.apibutnotreally.soul; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillWeapon.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillWeapon.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillWeapon.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillWeapon.java index a24d804f..dc989bd2 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDemonWillWeapon.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillWeapon.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.soul; +package WayofTime.bloodmagic.apibutnotreally.soul; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/IDiscreteDemonWill.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDiscreteDemonWill.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/soul/IDiscreteDemonWill.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDiscreteDemonWill.java index d9ae26d6..c5a34382 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/IDiscreteDemonWill.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDiscreteDemonWill.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.soul; +package WayofTime.bloodmagic.apibutnotreally.soul; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/PlayerDemonWillHandler.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/PlayerDemonWillHandler.java index 464245f5..07d95f3a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/soul/PlayerDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/PlayerDemonWillHandler.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.soul; +package WayofTime.bloodmagic.apibutnotreally.soul; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -8,7 +8,7 @@ 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 WayofTime.bloodmagic.api.util.helper.NetworkHelper} + * in {@link WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper} */ public class PlayerDemonWillHandler { /** diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/ITeleport.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/ITeleport.java similarity index 59% rename from src/main/java/WayofTime/bloodmagic/api/teleport/ITeleport.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/ITeleport.java index 567b9052..f5a1392e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/ITeleport.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/ITeleport.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.teleport; +package WayofTime.bloodmagic.apibutnotreally.teleport; public interface ITeleport { void teleport(); diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/PortalLocation.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/PortalLocation.java index 094c195d..a861f5c9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/PortalLocation.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/PortalLocation.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.teleport; +package WayofTime.bloodmagic.apibutnotreally.teleport; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/Teleport.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/Teleport.java index 72f64bf3..b733e538 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/Teleport.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/Teleport.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.teleport; +package WayofTime.bloodmagic.apibutnotreally.teleport; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleportQueue.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleportQueue.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/api/teleport/TeleportQueue.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleportQueue.java index 941afa9d..6e56b7d9 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleportQueue.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleportQueue.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.teleport; +package WayofTime.bloodmagic.apibutnotreally.teleport; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; diff --git a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleporterBloodMagic.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleporterBloodMagic.java index 148eab4a..0bcb1d36 100644 --- a/src/main/java/WayofTime/bloodmagic/api/teleport/TeleporterBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleporterBloodMagic.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.teleport; +package WayofTime.bloodmagic.apibutnotreally.teleport; import net.minecraft.entity.Entity; import net.minecraft.util.math.MathHelper; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/BindableHelper.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/BindableHelper.java index e21b2d92..ca573a46 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/BindableHelper.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.ItemBindEvent; -import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.event.ItemBindEvent; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; import WayofTime.bloodmagic.util.handler.event.GenericHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/IncenseHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/IncenseHelper.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/IncenseHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/IncenseHelper.java index 8e835696..47aca8bc 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/IncenseHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/IncenseHelper.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/ItemHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/ItemHelper.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/ItemHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/ItemHelper.java index 35a27909..740043c0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/ItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/ItemHelper.java @@ -1,10 +1,10 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.iface.IItemLPContainer; -import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.iface.IItemLPContainer; +import WayofTime.bloodmagic.apibutnotreally.iface.IUpgradeTrainer; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.item.ItemUpgradeTome; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/LogHelper.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/LogHelper.java index bc10f82e..bc6d8de5 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/LogHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/LogHelper.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; -import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/NBTHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NBTHelper.java similarity index 83% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/NBTHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NBTHelper.java index 6c1985da..ec5202a6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/NBTHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NBTHelper.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NetworkHelper.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NetworkHelper.java index 6e4ae4fe..cfef4b4b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NetworkHelper.java @@ -1,12 +1,12 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.SoulNetworkEvent; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.registry.OrbRegistry; -import WayofTime.bloodmagic.api.saving.BMWorldSavedData; -import WayofTime.bloodmagic.api.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.event.SoulNetworkEvent; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; +import WayofTime.bloodmagic.apibutnotreally.saving.BMWorldSavedData; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; import com.google.common.base.Strings; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerHelper.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerHelper.java index 348dc3d8..de1c9c62 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerHelper.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import com.google.common.base.Strings; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerSacrificeHelper.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerSacrificeHelper.java index 6c1fdc9d..541a1472 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerSacrificeHelper.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PurificationHelper.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PurificationHelper.java index 60e8bda7..3c6ef594 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PurificationHelper.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/RitualHelper.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java rename to src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/RitualHelper.java index 9597d969..321e778d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/RitualHelper.java @@ -1,10 +1,10 @@ -package WayofTime.bloodmagic.api.util.helper; +package WayofTime.bloodmagic.apibutnotreally.util.helper; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.ritual.IRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java index 16380c15..1ced3484 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.item.block.ItemBlockAlchemyTable; import WayofTime.bloodmagic.tile.TileAlchemyTable; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 886bbe25..81b6dc1a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -2,16 +2,16 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.api.altar.IAltarManipulator; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.iface.IAltarReader; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.iface.IDocumentedBlock; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; +import WayofTime.bloodmagic.apibutnotreally.altar.IAltarManipulator; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.iface.IAltarReader; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.iface.IDocumentedBlock; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index b0bfcfb1..09af9235 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.IDemonWillGem; -import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; +import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileDemonCrucible; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 95352a33..53fd27cb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.item.ItemDemonCrystal; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 31361c34..44681800 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.teleport.PortalLocation; -import WayofTime.bloodmagic.api.teleport.TeleportQueue; +import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.apibutnotreally.teleport.PortalLocation; +import WayofTime.bloodmagic.apibutnotreally.teleport.TeleportQueue; import WayofTime.bloodmagic.block.base.BlockInteger; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.ritual.portal.Teleports; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java index 848afb35..6dba2cde 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java index 44c1766c..5b666693 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.material.Material; import net.minecraft.util.BlockRenderLayer; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index a93df99e..56a40037 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.api.altar.IAltarComponent; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; +import WayofTime.bloodmagic.apibutnotreally.altar.IAltarComponent; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumMimic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java index d3335a6f..92e59c3c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 69333f47..35674e6e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.incense.IIncensePath; +import WayofTime.bloodmagic.apibutnotreally.incense.IIncensePath; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumPath; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 0449705c..726b1af4 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.api.util.helper.RitualHelper; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.util.helper.RitualHelper; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumRitualController; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 1a573969..4d51b164 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.ritual.IRitualStone; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index 2c200c2c..c56ac05e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileSoulForge; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index 6ac92d99..c242b3b8 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.tile.TileTeleposer; diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java index 9f5f9c52..08188509 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.block.enums; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import net.minecraft.util.IStringSerializable; import java.util.Locale; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java index e2b95ea5..f2c1399e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.gui; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.item.inventory.ContainerHolding; import WayofTime.bloodmagic.item.inventory.InventoryHolding; import WayofTime.bloodmagic.tile.TileAlchemyTable; diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java index 946b2ca0..07b1f281 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.hud; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.proxy.ClientProxy; import WayofTime.bloodmagic.util.Utils; import net.minecraft.client.Minecraft; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java index 27f9f414..75792062 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.mesh; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.IActivatable; +import WayofTime.bloodmagic.apibutnotreally.iface.IActivatable; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java index 89267744..a27b8eba 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.client.mesh; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java index ea2d04e2..6900eead 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.mesh; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.soul.ItemSoulGem; import net.minecraft.client.renderer.ItemMeshDefinition; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java index 41fdcf94..b90de1bf 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index 2df29bc5..91fbb1b7 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java index 4e334205..e5e91378 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java index 3bd566f0..e7ec2570 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java index 5e3e3ff5..c91a06c3 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; 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 13700c19..a886a981 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.block; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; -import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.ItemStack; 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 b471e4f4..1f592774 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.block; -import WayofTime.bloodmagic.api.altar.AltarComponent; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; +import WayofTime.bloodmagic.apibutnotreally.altar.AltarComponent; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.handler.event.ClientHandler; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java index 083de767..eb13193b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.client.render.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.iface.INodeRenderer; +import WayofTime.bloodmagic.apibutnotreally.iface.INodeRenderer; import WayofTime.bloodmagic.client.helper.ShaderHelper; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; import net.minecraft.client.Minecraft; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index 3e5cbb48..98828c1d 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.command.sub; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.util.helper.BindableHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.util.helper.BindableHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import net.minecraft.command.CommandBase; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 21717206..1b164e28 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.command.sub; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java index 6fac129d..92eda02e 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.command.sub; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java index 0c70656d..13b1c7d6 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; -import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.client.render.alchemyArray.DualAlchemyCircleRenderer; import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; import amerifrance.guideapi.page.PageIRecipe; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index a161cb2c..eb3b8127 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index ba1b8d31..b623e8a6 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.api.registry.OrbRegistry; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry.AltarRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java index 3c5c338d..2363e749 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index a294a615..5b9c507e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry.AltarRecipe; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java index 765791a1..4f5446fd 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.guideapi.book; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java index 6117a981..5c925f74 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi.page; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.Page; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java index 7f52af4a..a8189038 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi.page; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.api.registry.OrbRegistry; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.Page; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index 5c58acbf..dca1919e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.compat.jei; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.client.gui.GuiSoulForge; import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingCategory; import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingRecipeHandler; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java index 5b9b8e22..9dddc706 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java index 4a0168a5..f05a4cbd 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java index 23fc84db..3d95e801 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; -import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffectCrafting; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; import com.google.common.collect.BiMap; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java index 4ade8678..64058d7a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.registry.OrbRegistry; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java index 420793e9..8010e978 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java index 0079d60a..f86b8b14 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.Lists; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java index e526d182..db5ebc33 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyTableRecipeRegistry; import javax.annotation.Nonnull; import java.util.ArrayList; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java index 482b98ab..2701f7d5 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.altar; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java index efd8c457..c8955819 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.altar; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java index d7de9b3d..36294a82 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java @@ -4,6 +4,7 @@ import WayofTime.bloodmagic.util.helper.NumeralHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.BlankRecipeWrapper; +import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; @@ -12,7 +13,7 @@ import java.awt.Color; import java.util.ArrayList; import java.util.List; -public class AltarRecipeJEI extends BlankRecipeWrapper { +public class AltarRecipeJEI implements IRecipeWrapper { @Nonnull private final List input; @Nonnull @@ -32,11 +33,12 @@ public class AltarRecipeJEI extends BlankRecipeWrapper { } @Override - public void getIngredients(IIngredients ingredients) { + 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) { ArrayList ret = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java index 760852b2..41b2cd1c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.compat.jei.altar; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; import WayofTime.bloodmagic.block.BlockLifeEssence; import net.minecraft.item.ItemStack; import net.minecraftforge.common.ForgeModContainer; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java index f8a93172..28e67e3a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java index 233f7ee5..b1e1eaf9 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java index d8155ace..611cd8d8 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; +import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import com.google.common.collect.Lists; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java index 4aeafbef..f0194367 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.api.registry.LivingArmourDowngradeRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.LivingArmourDowngradeRecipeRegistry; import javax.annotation.Nonnull; import java.util.ArrayList; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java index c511fa04..95e51d0e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.binding; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java index ce2fad06..4f756e80 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.binding; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java index 561f6b21..38a92b55 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compat.jei.binding; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; import com.google.common.collect.BiMap; import net.minecraft.item.ItemStack; 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 ceee68d8..a6a11a1c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.forge; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java index 608d97be..9cd307ca 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.forge; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java index 9919a733..d1004898 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.forge; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java index 9f66cc27..cea35588 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.forge; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.TartaricForgeRecipeRegistry; import javax.annotation.Nonnull; import java.util.ArrayList; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java index 5cfd9622..bafdcc27 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.waila; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.block.*; import WayofTime.bloodmagic.compat.waila.provider.*; import mcp.mobius.waila.api.IWailaPlugin; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index a11aae07..e3bd3c3e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAlchemyArray; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index 9e3ddf39..57282503 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.waila.provider; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index 7bd19ddd..1add88c3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.block.BlockBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index 8e1c8868..f60db24a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.block.BlockRitualController; import WayofTime.bloodmagic.tile.TileImperfectRitualStone; import WayofTime.bloodmagic.tile.TileMasterRitualStone; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java index d76f0043..2f7c4273 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.block.BlockTeleposer; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.tile.TileTeleposer; diff --git a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java index fc018d59..b13f6d36 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compress; -import WayofTime.bloodmagic.api.compress.CompressionHandler; -import WayofTime.bloodmagic.api.compress.CompressionRegistry; +import WayofTime.bloodmagic.apibutnotreally.compress.CompressionHandler; +import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; diff --git a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java index 00dd6361..9f4a2fcc 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compress; -import WayofTime.bloodmagic.api.compress.CompressionHandler; +import WayofTime.bloodmagic.apibutnotreally.compress.CompressionHandler; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 093dbff0..2d51470c 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compress; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.compress.CompressionRegistry; +import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 80b2cf1f..7a0c416d 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.registry.OrbRegistry; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import WayofTime.bloodmagic.entity.mob.*; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 542ce653..46a42aee 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.item.ItemDemonCrystal; import WayofTime.bloodmagic.item.soul.ItemSoulGem; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java index 99d8b83d..9c71bb94 100644 --- a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.core.recipe; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.registry.OrbRegistry; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntComparators; import it.unimi.dsi.fastutil.ints.IntList; diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java index 01547e6f..818bffc3 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.demonAura; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; import net.minecraft.world.chunk.Chunk; import java.lang.ref.WeakReference; diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index 98201ee6..96c4c15c 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.demonAura; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java index 69b5ceac..34879915 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.gson.Serializers; import com.google.common.base.Predicate; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java index ca6ec8be..0ae9a398 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.entity.ai.EntityAIAttackStealthMelee; import WayofTime.bloodmagic.entity.ai.EntityAIStealthRetreat; import WayofTime.bloodmagic.entity.ai.EntityAIStealthTowardsTarget; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java index cf128414..6bed3068 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.entity.ai.EntityAIEatAndCorruptBlock; import WayofTime.bloodmagic.entity.ai.EntityAIProtectAlly; import com.google.common.collect.Maps; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java index 871bfb50..f4fcbe89 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.entity.ai.EntityAIPickUpAlly; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 084df078..4ffeb770 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.entity.ai.EntityAIAttackRangedBow; diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index c596696c..db068c77 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index bfbbe0e8..71e6bb84 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.meteor.MeteorRegistry; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index 8946d035..e96c4cc9 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java index 1f947941..d629f793 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.gson; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import com.google.gson.*; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; diff --git a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java index f6b01f98..9fcad4b6 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.incense; -import WayofTime.bloodmagic.api.incense.EnumTranquilityType; -import WayofTime.bloodmagic.api.incense.ITranquilityHandler; -import WayofTime.bloodmagic.api.incense.TranquilityStack; +import WayofTime.bloodmagic.apibutnotreally.incense.EnumTranquilityType; +import WayofTime.bloodmagic.apibutnotreally.incense.ITranquilityHandler; +import WayofTime.bloodmagic.apibutnotreally.incense.TranquilityStack; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import net.minecraft.block.*; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java index c7b0abc7..3b9002b1 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.inversion; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java index d1a1e9aa..0bcf8815 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.inversion; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 442ecd96..c6c24cce 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.*; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.altar.*; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.ChatUtil; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index 195be959..c413e43b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.impl.ItemBindable; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.impl.ItemBindable; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 0b7311a5..4318a90f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 651a8e91..19d2d6e3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index 37076c1e..3de0de3b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index 2f2600ec..898fec90 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index cf6a8809..ebfd3952 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IActivatable; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IActivatable; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index fae76626..ee605c35 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.api.event.BoundToolEvent; -import WayofTime.bloodmagic.api.iface.IActivatable; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.event.BoundToolEvent; +import WayofTime.bloodmagic.apibutnotreally.iface.IActivatable; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index b5cdb49c..eb4fec00 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.api.util.helper.PurificationHelper; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PurificationHelper; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.client.IVariantProvider; import com.google.common.collect.Lists; import net.minecraft.entity.EntityLivingBase; @@ -69,7 +69,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { 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(WayofTime.bloodmagic.api.BloodMagicAPI.damageSource); + target.onDeath(WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI.damageSource); } return false; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java index bd8143dc..bd45e9cc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import com.google.common.collect.Lists; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index 68dcc7cf..4cc7940a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.IDemonWillViewer; +import WayofTime.bloodmagic.apibutnotreally.iface.IDemonWillViewer; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 45fad002..e029fe4f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 4481c2a2..1a16af89 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockRitualStone; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index c224ea7d..3bb6f750 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IVariantProvider; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index 3f5e15ac..524f1888 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.Lists; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index 616b01a2..e24e5e98 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.RitualHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.util.helper.RitualHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMasterRitualStone; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 455e3f1c..193d027f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.ritual.EnumRitualReaderState; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRitualReaderState; +import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 1444de0e..8107f15d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -2,12 +2,12 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index f17328f6..081c8a5d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.altar.IAltarManipulator; -import WayofTime.bloodmagic.api.iface.IDocumentedBlock; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.apibutnotreally.altar.IAltarManipulator; +import WayofTime.bloodmagic.apibutnotreally.iface.IDocumentedBlock; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.ChatUtil; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 64895638..684e8cfa 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index c7bd3f2c..1647562f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index f22ac3c0..832d90f2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.apibutnotreally.iface.IUpgradeTrainer; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index f65f891c..663d38ba 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item.alchemy; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.ICustomAlchemyConsumable; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.iface.ICustomAlchemyConsumable; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index bfd67b55..2f84dc7b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item.armour; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.ItemComponent; diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index 962a6272..62eb5cb9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.item.armour; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import com.google.common.collect.HashMultimap; diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java index 611c8150..21908bf8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.block; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index 3abdfdce..90a11db4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item.gear; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.IAltarManipulator; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.iface.IItemLPContainer; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LPContainer; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.altar.IAltarManipulator; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.iface.IItemLPContainer; +import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LPContainer; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index 1dd19a4b..80f9a90b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.item.gear; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.IAltarManipulator; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.iface.IItemLPContainer; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LPContainer; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.altar.IAltarManipulator; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.iface.IItemLPContainer; +import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LPContainer; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java index 09508f3f..ccfd1a2b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.inventory; -import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java index 83440993..62947841 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item.inventory; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java index 78c49062..6e6b44d6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item.inventory; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index 3cdb1aa0..882a5556 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.item.routing; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.INodeRenderer; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.INodeRenderer; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.routing.IMasterRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index 885f02b5..e0bbdf8c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index 7de088ff..6accf15c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.impl.ItemSigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.impl.ItemSigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 5f9fd16a..67881d1c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; import net.minecraft.entity.Entity; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java index 37a6eccb..07528ccf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java index 44753b5b..61e779d7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java index 34e2d061..25a4d2b3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.compress.CompressionRegistry; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index bc77fa24..13f9c407 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.iface.IAltarReader; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.iface.IAltarReader; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.TileIncenseAltar; import WayofTime.bloodmagic.tile.TileInversionPillar; import WayofTime.bloodmagic.util.ChatUtil; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java index e28a310f..fc124828 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java index 855c29ab..06bce035 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.monster.EntityEnderman; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java index 8c6b1a27..94bf6f8f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java index 9ef7189e..b941152b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.handler.event.GenericHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java index dfaab6cd..5287c105 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.enchantment.EnchantmentFrostWalker; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java index 842b69ad..5faaad29 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import net.minecraft.block.IGrowable; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java index 02559204..37cbf27d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index da59eee5..13276673 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IAltarReader; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IAltarReader; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.key.IKeybindable; import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index 919b2dab..abfdebb8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java index f4b7e412..eccf3a77 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityXPOrb; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java index 61631c72..118d528c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java index d05a105b..fc2fb523 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.iface.IAltarReader; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.iface.IAltarReader; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.TileIncenseAltar; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.NumeralHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java index 57064bf5..b5c6608e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.TileSpectralBlock; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index e4fd869f..425d43ea 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.teleport.TeleportQueue; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.teleport.TeleportQueue; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.ritual.portal.Teleports; import WayofTime.bloodmagic.tile.TileTeleposer; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 7590fc19..1f9d78c8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.impl.ItemSigilToggleable; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.impl.ItemSigilToggleable; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -14,7 +14,6 @@ import net.minecraft.util.ResourceLocation; 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.Nullable; import java.util.ArrayList; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index ac8429f4..250daeb6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 1dca46ef..1e0aa5ea 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index 8fa03754..e45ad632 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.block.BlockCauldron; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java index 05bb2c43..b8dd34cc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index 3be9b4be..743ea4b1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index e25ae539..2ca80fed 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; import com.google.common.collect.Lists; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index b86fc3ea..d4c7536c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -1,15 +1,15 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientTool; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillWeapon; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index ef658a06..6aeade8d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientTool; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index ca8a0502..490edb06 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -1,15 +1,15 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientTool; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillWeapon; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index e86ee440..e5b90eef 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -1,15 +1,15 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientTool; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillWeapon; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 4753c957..9546f2ac 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -1,15 +1,15 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientSwordEffectProvider; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientTool; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillWeapon; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index a4095e15..90fd0023 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.iface.IMultiWillTool; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillGem; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; +import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionWillGem; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index e9e3edfb..57df9a6c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.livingArmour; -import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.iface.IUpgradeTrainer; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java index 2de24a51..9162ab95 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java index a187eacd..eea9e27e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java index 50655a92..b837ba77 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java index 90dcf8a7..af2b15ca 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java index f5648b37..0b3b6095 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.minecraft.entity.SharedMonsterAttributes; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java index 394b308a..c2fb14e7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java index 31ddcfcc..f30ef882 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java index 57118a87..a9bc44d3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java index 4a8827cc..2877f3be 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.minecraft.entity.SharedMonsterAttributes; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java index 0b8f7788..4546f447 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java index bcb98f2a..57584dc9 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowProtect; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java index 1a408791..95e1357f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowShot; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java index 4fb581c8..2a843bcb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeCriticalStrike; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java index 8d5cafe3..a063e192 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeDigging; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java index 459d947a..57c67bea 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeExperience; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java index 64440c23..fc0017ea 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeFallProtect; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java index 3be711ab..c69e03e4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeFireResist; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java index e3b35918..06a9ecad 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeKnockbackResist; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java index e7069b4e..bbab4ad4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGraveDigger; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java index 21670c1f..ff48cb51 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGrimReaperSprint; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java index a5375402..e9701d9b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeHealthboost; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java index 9d26e3c8..eebfcbc4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeJump; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java index e2ee5927..177ad61a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeMeleeDamage; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java index 26ebe64b..53a91cf1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSpeed; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java index 1cd463bd..105885bb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeNightSight; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java index 11580b8f..1333750b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradePhysicalProtect; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java index dd76abe2..31d24e54 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradePoisonResist; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java index d3929d36..082a28d4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeRepairing; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java index fe7b7258..a0744780 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java index 8e2ecb20..d338e77b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSolarPowered; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java index ae0451e9..00be46cb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSprintAttack; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java index 438f5d59..700edfe1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeStepAssist; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java index 48d96ee4..d790ca2f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java index 95f9c7b4..c9714184 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java index 75ffd6b0..65077f41 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java index 1ba86bcb..4b69347c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.livingArmour.LivingArmour; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java index 7908f9d8..d43a8482 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java index 83a98ede..73a23691 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; public class LivingArmourUpgradeExperience extends LivingArmourUpgrade { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java index d00394dd..d829d828 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java index e76812e1..6cb7e0f6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java index e7c285e9..f277bea7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemSpade; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java index e6dc11ad..05f6644f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java index 19181cda..acb057e3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.minecraft.entity.SharedMonsterAttributes; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java index dd831b75..6cec3d05 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java index 84363286..faf8d7d5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.minecraft.entity.SharedMonsterAttributes; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java index 5b59193e..5214502d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.minecraft.entity.SharedMonsterAttributes; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java index 6a39ff37..966c9b1f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java index 0cb14b98..5143860a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java index d5ed775f..f563ba66 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java index 8f8ec4d2..318ab46f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java index acc05450..ca20ddb3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java index 34291867..3295882a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 2677eaba..87791649 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.minecraft.entity.SharedMonsterAttributes; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java index 22d175b6..d74bce15 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java index 48c8d7c6..2f14ec9d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; public class LivingArmourUpgradeStepAssist extends LivingArmourUpgrade { diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java index 4550aca7..4870d5ff 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.meteor; -import WayofTime.bloodmagic.api.ItemStackWrapper; +import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java index eb8b9724..f7d1f8c4 100644 --- a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.network; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.proxy.ClientProxy; import io.netty.buffer.ByteBuf; import net.minecraft.network.PacketBuffer; diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index cb0ea468..0a9f94d7 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.potion; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionAugmentRecipe; import net.minecraft.block.Block; import net.minecraft.block.IGrowable; @@ -66,7 +66,7 @@ public class BMPotionUtils { } if (incurredDamage > 0) { - entity.attackEntityFrom(WayofTime.bloodmagic.api.BloodMagicAPI.damageSource, (float) incurredDamage); + entity.attackEntityFrom(WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI.damageSource, (float) incurredDamage); } return incurredDamage; diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index a393cb53..2e2bdfa1 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.potion; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.IProjectile; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 3d9d0233..42ef7613 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.proxy; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.client.helper.ShaderHelper; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java index 636310a4..18885435 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.proxy; -import WayofTime.bloodmagic.api.ritual.CapabilityRuneType; -import WayofTime.bloodmagic.api.ritual.IRitualStone; -import WayofTime.bloodmagic.api.teleport.TeleportQueue; +import WayofTime.bloodmagic.apibutnotreally.ritual.CapabilityRuneType; +import WayofTime.bloodmagic.apibutnotreally.ritual.IRitualStone; +import WayofTime.bloodmagic.apibutnotreally.teleport.TeleportQueue; import WayofTime.bloodmagic.fuel.FuelHandler; import com.google.common.collect.ImmutableMap; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index 971e44cb..52d221eb 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index bd97772c..8c21e8e2 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java index 4e0e9d18..c3564204 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.livingArmour.downgrade.*; import WayofTime.bloodmagic.livingArmour.tracker.*; import WayofTime.bloodmagic.livingArmour.upgrade.*; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java index fff4f109..58516481 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.inversion.CorruptionHandler; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 2b27d46d..2f244a80 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -2,13 +2,13 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.alchemyArray.*; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.compress.CompressionRegistry; -import WayofTime.bloodmagic.api.iface.ISigil; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.recipe.AlchemyTableCustomRecipe; -import WayofTime.bloodmagic.api.registry.*; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; +import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableCustomRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; import WayofTime.bloodmagic.client.render.alchemyArray.*; import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; import WayofTime.bloodmagic.compress.BaseCompressionHandler; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 3d0def9a..1343d5fe 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.registry.HarvestRegistry; -import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerPlantable; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java index 69834f08..2fa8e433 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.api.incense.IncenseTranquilityRegistry; +import WayofTime.bloodmagic.apibutnotreally.incense.IncenseTranquilityRegistry; import WayofTime.bloodmagic.incense.TranquilityHandlers; public class ModTranquilityHandlers { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index 69ccc38a..a9785bf9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.altar.AltarComponent; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.altar.AltarComponent; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java index d5671333..e555c69a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java index 8db309d0..93df19e4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; import com.google.common.collect.Iterables; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java index 2a8be8aa..ccb845b9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.item.ItemComponent; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java index b5a4953e..41b8098d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index ea01a579..f31a03f0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.compress.CompressionRegistry; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; +import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java index 00e1b34f..c40acf12 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index 5c9b254a..5a52ad05 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index 38a5b4fb..c70de21b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.altar.IBloodAltar; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java index 52c22bf5..1207dd3c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index de8a4a54..b8fe4a66 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityAnimal; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java index 37e6c56b..3bce44ba 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemFood; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 9f2af4fa..9e42209c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java index e48c6b36..574ed869 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.iface.IHarvestHandler; -import WayofTime.bloodmagic.api.registry.HarvestRegistry; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; +import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java index 69e6c61d..0d4e0f61 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java index 45ab5d5c..1d27ada9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java index 1b6d15c1..082edc55 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java index 70d01e55..8034d1b8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.api.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.LivingArmourDowngradeRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.util.ChatUtil; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java index 948ce689..1f55d2f8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.BlockOre; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index 90a9412f..81299c17 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; import WayofTime.bloodmagic.meteor.MeteorRegistry; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java index 938a3fab..37dd74e7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemBlock; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java index 4732b101..85acd27b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; -import WayofTime.bloodmagic.api.teleport.PortalLocation; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; +import WayofTime.bloodmagic.apibutnotreally.teleport.PortalLocation; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.tile.TileDimensionalPortal; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index 0158e15c..ede507a1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import com.google.common.collect.Lists; import net.minecraft.block.BlockLiquid; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java index 64537627..9eea0094 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java index 4cc59843..bb3035b6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java index 967ca362..369f8873 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.tile.TileSpectralBlock; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java index f1c12561..3b42d23a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.livingArmour.StatTracker; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java index c8291570..13e0e257 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index e16184bd..2715bd64 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java index 7db7ffea..c406b163 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.ritual.*; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index 55512361..258fdfbe 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.harvest; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.iface.IHarvestHandler; -import WayofTime.bloodmagic.api.registry.HarvestRegistry; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; +import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java index 5454ca0b..6200a003 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual.harvest; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.iface.IHarvestHandler; -import WayofTime.bloodmagic.api.registry.HarvestRegistry; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; +import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; import net.minecraft.block.BlockStem; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java index 19f045b3..408eab39 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual.harvest; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.iface.IHarvestHandler; -import WayofTime.bloodmagic.api.registry.HarvestRegistry; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; +import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java index ef7523fa..49c280ac 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java index d8d9093c..80857a9a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java index 243bd5e3..6ec3a207 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java index 871769f2..88907218 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java index 39bec8d2..5404ec97 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java index 1a1c0555..7ec1d9a0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual.portal; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.teleport.PortalLocation; +import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.teleport.PortalLocation; import net.minecraftforge.common.DimensionManager; import java.io.*; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index b005e751..bde56486 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.portal; -import WayofTime.bloodmagic.api.event.TeleposeEvent; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.teleport.Teleport; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.event.TeleposeEvent; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.teleport.Teleport; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index 11209c0c..42cf8ab8 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.structures; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; +import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; import net.minecraft.util.EnumFacing; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java index d9ab71a6..84a2843d 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.structures; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; +import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 6905948d..39d77472 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.api.iface.IAlchemyArray; -import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 0290cf78..3ceab6be 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.api.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java index 945c7918..bfaeefbb 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.api.altar.EnumAltarTier; -import WayofTime.bloodmagic.api.altar.IBloodAltar; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java index 2bf3e98e..8e161c77 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.tile.base.TileBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index ac4a0e7b..df286a8b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWillConduit; -import WayofTime.bloodmagic.api.soul.IDemonWillGem; -import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; +import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index 2cfda269..d4fbdd7d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.block.BlockDemonCrystal; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.tile.base.TileTicking; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index 78d2424e..4e5d3fdb 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWillConduit; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.tile.base.TileTicking; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java index e1e73718..86ae91b0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWillConduit; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java index ec1fc4b8..3899cc39 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.api.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.base.TileBase; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index 8f90b289..26daca95 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.incense.EnumTranquilityType; -import WayofTime.bloodmagic.api.incense.IIncensePath; -import WayofTime.bloodmagic.api.incense.IncenseTranquilityRegistry; -import WayofTime.bloodmagic.api.incense.TranquilityStack; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.apibutnotreally.incense.EnumTranquilityType; +import WayofTime.bloodmagic.apibutnotreally.incense.IIncensePath; +import WayofTime.bloodmagic.apibutnotreally.incense.IncenseTranquilityRegistry; +import WayofTime.bloodmagic.apibutnotreally.incense.TranquilityStack; +import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.incense.IncenseAltarHandler; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index 7ba2a285..1d2e8a19 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.inversion.InversionPillarHandler; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index c812f552..4431af8f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -1,16 +1,16 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.RitualEvent; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; -import WayofTime.bloodmagic.api.util.helper.RitualHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.event.RitualEvent; +import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.RitualHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.ItemActivationCrystal; import WayofTime.bloodmagic.tile.base.TileTicking; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index e9cbe72a..a1b3a63d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java index 4e0f8872..bf3dddc8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.iface.IPurificationAsh; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; -import WayofTime.bloodmagic.api.util.helper.PurificationHelper; +import WayofTime.bloodmagic.apibutnotreally.iface.IPurificationAsh; +import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PurificationHelper; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 7bdf5b3e..fd066671 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillConduit; -import WayofTime.bloodmagic.api.soul.IDemonWillGem; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.TartaricForgeRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java index 44696136..172c7adb 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.base.TileTicking; import com.google.common.base.Strings; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index 97c51571..a8124376 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.TeleposeEvent; -import WayofTime.bloodmagic.api.teleport.TeleportQueue; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.event.TeleposeEvent; +import WayofTime.bloodmagic.apibutnotreally.teleport.TeleportQueue; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.block.BlockTeleposer; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.ritual.portal.Teleports; diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java index 9ba7f05a..c2569ba8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile.container; -import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; import WayofTime.bloodmagic.tile.TileAlchemyTable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java index ced03f85..bd82760e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile.container; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillGem; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; +import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; import WayofTime.bloodmagic.tile.TileSoulForge; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java index 83a22f14..5deac5ea 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile.routing; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.item.inventory.ItemInventory; import WayofTime.bloodmagic.util.GhostItemHelper; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index cbe898e4..2d17f476 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile.routing; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.routing.*; import WayofTime.bloodmagic.tile.TileInventory; diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java index a8b7aa2c..6e13a518 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile.routing; -import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.routing.IItemRoutingNode; import WayofTime.bloodmagic.routing.IMasterRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java index 36b29da4..77862f48 100644 --- a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java index 5b09e100..0b69af06 100644 --- a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java @@ -1,7 +1,8 @@ package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.apiv2.BloodMagicPlugin; -import WayofTime.bloodmagic.apiv2.IBloodMagicPlugin; +import WayofTime.bloodmagic.api.BloodMagicPlugin; +import WayofTime.bloodmagic.api.IBloodMagicPlugin; +import WayofTime.bloodmagic.api.impl.BloodMagicCorePlugin; import com.google.common.collect.Lists; import net.minecraftforge.fml.common.discovery.ASMDataTable; import org.apache.commons.lang3.tuple.Pair; @@ -32,7 +33,7 @@ public class PluginUtil { } // Bring core plugin up to top - discoveredAnnotations.sort((o1, o2) -> o1.getLeft().getClass().getCanonicalName().startsWith("WayofTime") ? 1 : 0); + discoveredAnnotations.sort((o1, o2) -> o1.getLeft().getClass() == BloodMagicCorePlugin.class ? 1 : 0); return discoveredAnnotations; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index ae3b50ef..19d1e886 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; -import WayofTime.bloodmagic.api.iface.IDemonWillViewer; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; +import WayofTime.bloodmagic.apibutnotreally.iface.IDemonWillViewer; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 530d4ca5..2719671e 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.registry.RitualRegistry; -import WayofTime.bloodmagic.api.ritual.Ritual; -import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; import WayofTime.bloodmagic.client.hud.HUDElement; import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.client.render.block.RenderFakeBlocks; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index 3c9ca214..add509dc 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.AltarCraftedEvent; -import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.util.helper.ItemHelper; -import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.event.AltarCraftedEvent; +import WayofTime.bloodmagic.apibutnotreally.iface.IUpgradeTrainer; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper; +import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.ItemInscriptionTool; 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 16cd191c..387af240 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -2,19 +2,19 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.ItemBindEvent; -import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.api.event.TeleposeEvent; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.iface.ISentientTool; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.orb.BloodOrb; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.saving.SoulNetwork; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.util.helper.*; -import WayofTime.bloodmagic.api_impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.event.ItemBindEvent; +import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.apibutnotreally.event.TeleposeEvent; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.iface.ISentientTool; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.apibutnotreally.util.helper.*; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 0e202ffe..42e866f8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java index 8aee28b8..a98a8e9f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; 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 4857c90e..b83bb3d3 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.soul.*; +import WayofTime.bloodmagic.apibutnotreally.soul.*; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.demonAura.PosXY; diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java index 069246a9..fd8e6bcf 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.TartaricForgeRecipeRegistry; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraftforge.fml.common.registry.ForgeRegistries; From 1205c4171210f8055bb3e115581b8fd457620cb5 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 5 Feb 2018 17:25:25 -0800 Subject: [PATCH 140/595] Fix GUIs not rendering backgrounds and tooltips (#1203) --- .../WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java | 7 +++++++ .../java/WayofTime/bloodmagic/client/gui/GuiHolding.java | 7 +++++++ .../bloodmagic/client/gui/GuiItemRoutingNode.java | 2 ++ .../bloodmagic/client/gui/GuiMasterRoutingNode.java | 7 +++++++ .../java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java | 7 +++++++ .../java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java | 7 +++++++ 6 files changed, 37 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java index 8fe326dc..3392b3f3 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java @@ -24,6 +24,13 @@ public class GuiAlchemyTable extends GuiContainer { 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java index 04ddecb4..11d9c93d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java @@ -25,6 +25,13 @@ public class GuiHolding extends GuiContainer { 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 diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java index 8c0a2bc2..564494e6 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -134,7 +134,9 @@ public class GuiItemRoutingNode extends GuiContainer { */ @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { + this.drawDefaultBackground(); super.drawScreen(mouseX, mouseY, partialTicks); + this.renderHoveredToolTip(mouseX, mouseY); Minecraft.getMinecraft().fontRenderer.drawString(inventory.getName(), xSize, ySize / 4, 4210752); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java index dd49555e..3da9b255 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java @@ -22,6 +22,13 @@ public class GuiMasterRoutingNode extends GuiContainer { inventory = (TileEntity) tileRoutingNode; } + @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); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java index 1d5ddf05..6a1d85b0 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java @@ -23,6 +23,13 @@ public class GuiSoulForge extends GuiContainer { 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java index 828a0805..e5db4c67 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java @@ -17,6 +17,13 @@ public class GuiTeleposer extends GuiContainer { 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); From 63f88f6bff0bd0920e3c437f07372e40f0dbcbd3 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 5 Feb 2018 17:36:13 -0800 Subject: [PATCH 141/595] Sorted out the sentient sword's identity crisis (#1201) --- .../java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 9546f2ac..24911140 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -272,7 +272,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override @SideOnly(Side.CLIENT) public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("sentient_shovel"); + return new CustomMeshDefinitionMultiWill("sentient_sword"); } @Nullable From e79f6c44d600791889a62571cc1b595d3f611166 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 5 Feb 2018 17:37:23 -0800 Subject: [PATCH 142/595] Fix crash on servers (#1204) --- .../WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java index 54cad50a..7838a879 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java @@ -22,6 +22,8 @@ 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; @@ -127,6 +129,7 @@ public class RegistrarBloodMagicBlocks { registerTileEntities(); } + @SideOnly(Side.CLIENT) @SubscribeEvent public static void registerModels(ModelRegistryEvent event) { ModelLoader.setCustomStateMapper(LIFE_ESSENCE, new StateMapperBase() { From 27e41e2e77c8aed287413cc6b1490b666c47321c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 5 Feb 2018 17:56:06 -0800 Subject: [PATCH 143/595] Fix crash when obtaining owner from an unbound bindable item (#1205) --- .../bloodmagic/apibutnotreally/impl/ItemBindable.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java index bb705a2c..2add8510 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java @@ -25,11 +25,11 @@ public class ItemBindable extends Item implements IBindable { @Override public String getOwnerName(ItemStack stack) { - return !stack.isEmpty() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; + return !stack.isEmpty() && stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; } @Override public String getOwnerUUID(ItemStack stack) { - return !stack.isEmpty() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; + return !stack.isEmpty() && stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; } } From 8be8cc30b97af8cad5bcd3e6313225c43f6024ab Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 17:04:04 -0800 Subject: [PATCH 144/595] nullcheck obtained entity entries (#1206, 1207) No idea what's going on here but aight --- .../java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java | 2 ++ .../java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java | 2 +- .../java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java | 2 +- .../WayofTime/bloodmagic/util/handler/event/GenericHandler.java | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index eb4fec00..dce324db 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -52,6 +52,8 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { return false; EntityEntry entityEntry = EntityRegistry.getEntry(target.getClass()); + if (entityEntry == null) + return false; int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getSacrificialValues().getOrDefault(entityEntry.getRegistryName(), 25); if (lifeEssenceRatio <= 0) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index b8fe4a66..537b8fc7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -104,7 +104,7 @@ public class RitualForsakenSoul extends Ritual { for (EntityLivingBase entity : entities) { EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); - if (BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) + if (entityEntry == null || BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) continue; if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index 2715bd64..c9af292b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -79,7 +79,7 @@ public class RitualWellOfSuffering extends Ritual { for (EntityLivingBase entity : entities) { EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); - if (BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) + if (entityEntry == null || BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) continue; int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getSacrificialValues().getOrDefault(entityEntry.getRegistryName(), SACRIFICE_AMOUNT); 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 387af240..0dae83b8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -318,7 +318,7 @@ public class GenericHandler { @SubscribeEvent public static void onTeleposeEntity(TeleposeEvent.Ent event) { EntityEntry entry = EntityRegistry.getEntry(event.entity.getClass()); - if (BloodMagicAPI.INSTANCE.getBlacklist().getTeleposerEntities().contains(entry.getRegistryName())) + if (entry != null && BloodMagicAPI.INSTANCE.getBlacklist().getTeleposerEntities().contains(entry.getRegistryName())) event.setCanceled(true); } From 92fa6cd7f7ba33de519720e39a63615803b44a31 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 17:33:02 -0800 Subject: [PATCH 145/595] Update changelog + version --- changelog.txt | 12 ++++++++++++ gradle.properties | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index bb42e432..4f8003c5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,15 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 6685f593..239d79e2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.0 +mod_version=2.2.1 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From 739c1aa05f9cbbfe67613eec09149dda7cdb912b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 18:59:47 -0800 Subject: [PATCH 146/595] Cleaner sub-item implementation Todo: Move more sub items to use it --- .../soul/EnumDemonWillType.java | 19 +- .../bloodmagic/block/BlockDemonCrystal.java | 10 +- .../bloodmagic/item/ItemDemonCrystal.java | 49 +--- .../WayofTime/bloodmagic/item/ItemEnum.java | 59 +++++ .../bloodmagic/item/types/ComponentTypes.java | 64 ++++++ .../bloodmagic/item/types/ISubItem.java | 19 ++ .../bloodmagic/registry/ModRecipes.java | 14 +- .../bloodmagic/blockstates/component.json | 212 +++++++++--------- .../blockstates/item_demon_crystal.json | 10 +- 9 files changed, 285 insertions(+), 171 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemEnum.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/types/ISubItem.java diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java index 55a1dd42..fa77f039 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java @@ -1,10 +1,14 @@ package WayofTime.bloodmagic.apibutnotreally.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 { +public enum EnumDemonWillType implements IStringSerializable, ISubItem { DEFAULT("default"), CORROSIVE("corrosive"), DESTRUCTIVE("destructive"), @@ -26,4 +30,17 @@ public enum EnumDemonWillType implements IStringSerializable { 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, ordinal()); + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 53fd27cb..9af126b3 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -181,19 +181,19 @@ public class BlockDemonCrystal extends Block { ItemStack stack = null; switch (type) { case CORROSIVE: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE); + stack = EnumDemonWillType.CORROSIVE.getStack(); break; case DEFAULT: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT); + stack = EnumDemonWillType.DEFAULT.getStack(); break; case DESTRUCTIVE: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE); + stack = EnumDemonWillType.DESTRUCTIVE.getStack(); break; case STEADFAST: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST); + stack = EnumDemonWillType.STEADFAST.getStack(); break; case VENGEFUL: - stack = ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL); + stack = EnumDemonWillType.VENGEFUL.getStack(); break; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java index bd45e9cc..508b1efd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java @@ -19,46 +19,13 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.List; -public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVariantProvider { - public static final ArrayList NAMES = Lists.newArrayList(); - - public static final String CRYSTAL_DEFAULT = "crystalDefault"; - public static final String CRYSTAL_CORROSIVE = "crystalCorrosive"; - public static final String CRYSTAL_VENGEFUL = "crystalVengeful"; - public static final String CRYSTAL_DESTRUCTIVE = "crystalDestructive"; - public static final String CRYSTAL_STEADFAST = "crystalSteadfast"; +public class ItemDemonCrystal extends ItemEnum implements IDiscreteDemonWill, IVariantProvider { public ItemDemonCrystal() { - super(); + super(EnumDemonWillType.class, "demonCrystal"); - setUnlocalizedName(BloodMagic.MODID + ".demonCrystal."); setHasSubtypes(true); setCreativeTab(BloodMagic.TAB_BM); - - buildItemList(); - } - - private void buildItemList() { - NAMES.add(0, CRYSTAL_DEFAULT); - NAMES.add(1, CRYSTAL_CORROSIVE); - NAMES.add(2, CRYSTAL_DESTRUCTIVE); - NAMES.add(3, CRYSTAL_VENGEFUL); - NAMES.add(4, CRYSTAL_STEADFAST); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + NAMES.get(stack.getItemDamage()); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < NAMES.size(); i++) - list.add(new ItemStack(this, 1, i)); } @Override @@ -88,16 +55,4 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria public EnumDemonWillType getType(ItemStack willStack) { return EnumDemonWillType.values()[MathHelper.clamp(willStack.getMetadata(), 0, EnumDemonWillType.values().length - 1)]; } - - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - for (String name : NAMES) - ret.add(new ImmutablePair(NAMES.indexOf(name), "type=" + name)); - return ret; - } - - public static ItemStack getStack(String name) { - return new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, NAMES.indexOf(name)); - } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java new file mode 100644 index 00000000..457089df --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java @@ -0,0 +1,59 @@ +package WayofTime.bloodmagic.item; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.item.types.ISubItem; +import com.google.common.collect.Lists; +import net.minecraft.creativetab.CreativeTabs; +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; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.List; + +public class ItemEnum & ISubItem> extends Item implements IVariantProvider { + + protected final T[] types; + + public ItemEnum(Class enumClass, String baseName) { + super(); + + this.types = enumClass.getEnumConstants(); + + setUnlocalizedName(BloodMagic.MODID + "." + baseName); + setHasSubtypes(types.length > 1); + setCreativeTab(BloodMagic.TAB_BM); + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return super.getUnlocalizedName(stack) + "." + getItemType(stack).getInternalName(); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(CreativeTabs 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)]; + } + + @Override + public List> getVariants() { + List> variants = Lists.newArrayList(); + for (int i = 0; i < types.length; i++) + variants.add(Pair.of(i, "type=" + types[i].getInternalName())); + + return variants; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java new file mode 100644 index 00000000..c49aa09b --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java @@ -0,0 +1,64 @@ +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 new file mode 100644 index 00000000..27204050 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/types/ISubItem.java @@ -0,0 +1,19 @@ +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/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 2f244a80..58a55030 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -9,6 +9,7 @@ import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableCustomRecipe; import WayofTime.bloodmagic.apibutnotreally.registry.*; import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; +import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.client.render.alchemyArray.*; import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; import WayofTime.bloodmagic.compress.BaseCompressionHandler; @@ -17,7 +18,6 @@ import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.ItemComponent; -import WayofTime.bloodmagic.item.ItemDemonCrystal; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; import WayofTime.bloodmagic.livingArmour.downgrade.*; @@ -176,7 +176,7 @@ public class ModRecipes { TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), 1, 1, "dustRedstone", "ingotGold", "blockGlass", "dyeBlue"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), 60, 20, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), "gemDiamond", "blockRedstone", "blockLapis"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), 240, 50, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "gemDiamond", "blockGold", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 1000, 100, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 1000, 100, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD), EnumDemonWillType.DEFAULT.getStack()); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 4), 4000, 500, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), Items.NETHER_STAR); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SWORD), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_SWORD)); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_AXE), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_AXE)); @@ -216,11 +216,11 @@ public class ModRecipes { TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotGold", new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE), 400, 200, "blockIron", "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 0), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DEFAULT)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 1), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_CORROSIVE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 2), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_DESTRUCTIVE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 3), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_VENGEFUL)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 4), 1200, 100, ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST), ItemDemonCrystal.getStack(ItemDemonCrystal.CRYSTAL_STEADFAST)); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 0), 1200, 100, EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack()); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 1), 1200, 100, EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack()); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 2), 1200, 100, EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack()); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 3), 1200, 100, EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack()); + TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 4), 1200, 100, EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack()); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRUCIBLE), 400, 100, Items.CAULDRON, "stone", "gemLapis", "gemDiamond"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PYLON), 400, 50, "blockIron", "stone", "gemLapis", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); diff --git a/src/main/resources/assets/bloodmagic/blockstates/component.json b/src/main/resources/assets/bloodmagic/blockstates/component.json index eb690f3b..898f699e 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/component.json +++ b/src/main/resources/assets/bloodmagic/blockstates/component.json @@ -6,117 +6,27 @@ }, "variants": { "type": { - "reagentwater": { - "textures": { - "layer0": "bloodmagic:items/ReagentWater" - } - }, - "reagentlava": { - "textures": { - "layer0": "bloodmagic:items/ReagentLava" - } - }, - "reagentair": { - "textures": { - "layer0": "bloodmagic:items/ReagentAir" - } - }, - "reagentfastminer": { - "textures": { - "layer0": "bloodmagic:items/ReagentFastMiner" - } - }, - "reagentvoid": { - "textures": { - "layer0": "bloodmagic:items/ReagentVoid" - } - }, - "reagentgrowth": { - "textures": { - "layer0": "bloodmagic:items/ReagentGrowth" - } - }, - "reagentaffinity": { - "textures": { - "layer0": "bloodmagic:items/ReagentAffinity" - } - }, - "reagentsight": { - "textures": { - "layer0": "bloodmagic:items/ReagentSight" - } - }, - "reagentbinding": { - "textures": { - "layer0": "bloodmagic:items/ReagentBinding" - } - }, - "reagentsuppression": { - "textures": { - "layer0": "bloodmagic:items/ReagentSuppression" - } - }, - "frameparts": { + "frame_part": { "textures": { "layer0": "bloodmagic:items/ComponentFrameParts" } }, - "reagentbloodlight": { - "textures": { - "layer0": "bloodmagic:items/ReagentBloodLight" - } - }, - "reagentmagnetism": { - "textures": { - "layer0": "bloodmagic:items/ReagentMagnetism" - } - }, - "reagenthaste": { - "textures": { - "layer0": "bloodmagic:items/ReagentHaste" - } - }, - "reagentcompression": { - "textures": { - "layer0": "bloodmagic:items/ReagentCompression" - } - }, - "reagentbridge": { - "textures": { - "layer0": "bloodmagic:items/ReagentBridge" - } - }, - "reagentseverance": { - "textures": { - "layer0": "bloodmagic:items/ReagentSeverance" - } - }, - "reagentteleposition": { - "textures": { - "layer0": "bloodmagic:items/ReagentTeleposition" - } - }, - "reagenttransposition": { - "textures": { - "layer0": "bloodmagic:items/ReagentTransposition" - } - }, - "ironsand": { + "sand_iron": { "textures": { "layer0": "bloodmagic:items/IronSand" } }, - "goldsand": { + "sand_gold": { "textures": { "layer0": "bloodmagic:items/GoldSand" } }, - "coalsand": { + "sand_coal": { "textures": { "layer0": "bloodmagic:items/CoalSand" } }, - "plantoil": { + "plant_oil": { "textures": { "layer0": "bloodmagic:items/PlantOil" } @@ -131,7 +41,7 @@ "layer0": "bloodmagic:items/Saltpeter" } }, - "neurotoxin": { + "neuro_toxin": { "textures": { "layer0": "bloodmagic:items/NeuroToxin" } @@ -141,32 +51,122 @@ "layer0": "bloodmagic:items/Antiseptic" } }, - "reagentholding": { - "textures": { - "layer0": "bloodmagic:items/ReagentHolding" - } - }, - "mundanelength": { + "catalyst_length_1": { "textures": { "layer0": "bloodmagic:items/MundaneLengtheningCatalyst" } }, - "mundanepower": { + "catalyst_power_1": { "textures": { "layer0": "bloodmagic:items/MundanePowerCatalyst" } }, - "reagentclaw": { + "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" } }, - "reagentbounce": { + "reagent_bounce": { "textures": { "layer0": "bloodmagic:items/ReagentBounce" } }, - "reagentfrost": { + "reagent_frost": { "textures": { "layer0": "bloodmagic:items/ReagentFrost" } diff --git a/src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json b/src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json index 0d65d0c3..cfa5e17c 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json +++ b/src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json @@ -6,27 +6,27 @@ }, "variants": { "type": { - "crystaldefault": { + "default": { "textures": { "layer0": "bloodmagic:items/DefaultCrystal" } }, - "crystalcorrosive": { + "corrosive": { "textures": { "layer0": "bloodmagic:items/CorrosiveCrystal" } }, - "crystalvengeful": { + "vengeful": { "textures": { "layer0": "bloodmagic:items/VengefulCrystal" } }, - "crystaldestructive": { + "destructive": { "textures": { "layer0": "bloodmagic:items/DestructiveCrystal" } }, - "crystalsteadfast": { + "steadfast": { "textures": { "layer0": "bloodmagic:items/SteadfastCrystal" } From 59f171ca5b58a7c387a881635a1f71932b4eaebb Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 19:00:15 -0800 Subject: [PATCH 147/595] Forgot lang --- .../assets/bloodmagic/lang/en_US.lang | 73 +++++++++---------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 1c8ac9bf..b4ea222e 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -66,52 +66,49 @@ item.bloodmagic.reagent.potentia.name=Potentia item.bloodmagic.bloodShard.weak.name=Weak Blood Shard item.bloodmagic.bloodShard.demon.name=Demon Blood Shard -item.bloodmagic.baseComponent.reagentWater.name=Water Reagent -item.bloodmagic.baseComponent.reagentLava.name=Lava Reagent -item.bloodmagic.baseComponent.reagentAir.name=Air Reagent -item.bloodmagic.baseComponent.reagentFastMiner.name=Mining Reagent -item.bloodmagic.baseComponent.reagentVoid.name=Void Reagent -item.bloodmagic.baseComponent.reagentGrowth.name=Growth Reagent -item.bloodmagic.baseComponent.reagentAffinity.name=Elemental Affinity Reagent -item.bloodmagic.baseComponent.reagentSight.name=Sight Reagent -item.bloodmagic.baseComponent.reagentBinding.name=Binding Reagent -item.bloodmagic.baseComponent.reagentSuppression.name=Suppression Reagent -item.bloodmagic.baseComponent.frameParts.name=Frame Parts -item.bloodmagic.baseComponent.reagentBloodLight.name=Blood Lamp Reagent -item.bloodmagic.baseComponent.reagentMagnetism.name=Magnetism Reagent -item.bloodmagic.baseComponent.reagentHaste.name=Haste Reagent -item.bloodmagic.baseComponent.reagentBridge.name=Phantom Bridge Reagent -item.bloodmagic.baseComponent.reagentCompression.name=Compression Reagent -item.bloodmagic.baseComponent.reagentSeverance.name=Severance Reagent -item.bloodmagic.baseComponent.reagentHolding.name=Holding Reagent -item.bloodmagic.baseComponent.reagentClaw.name=Claw Reagent -item.bloodmagic.baseComponent.reagentBounce.name=Elasticity Reagent -item.bloodmagic.baseComponent.reagentFrost.name=Frost Reagent +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.reagentTeleposition.name=Teleposition Reagent -item.bloodmagic.baseComponent.reagentTransposition.name=Transposition Reagent - -item.bloodmagic.baseComponent.ironSand.name=Iron Sand -item.bloodmagic.baseComponent.goldSand.name=Gold Sand -item.bloodmagic.baseComponent.coalSand.name=Coal Sand -item.bloodmagic.baseComponent.plantOil.name=Plant Oil +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.neurotoxin.name=Neuro Toxin +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.cuttingFluid.basicCuttingFluid.name=Basic Cutting Fluid item.bloodmagic.cuttingFluid.explosive.name=Explosive Powder -item.bloodmagic.baseComponent.mundaneLength.name=Simple Lengthening Catalyst -item.bloodmagic.baseComponent.mundanePower.name=Simple Power Catalyst - - -item.bloodmagic.demonCrystal.crystalDefault.name=Demon Will Crystal -item.bloodmagic.demonCrystal.crystalCorrosive.name=Corrosive Will Crystal -item.bloodmagic.demonCrystal.crystalDestructive.name=Destructive Will Crystal -item.bloodmagic.demonCrystal.crystalVengeful.name=Vengeful Will Crystal -item.bloodmagic.demonCrystal.crystalSteadfast.name=Steadfast Will Crystal +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.monsterSoul.base.name=Demonic Will item.bloodmagic.monsterSoul.corrosive.name=Corrosive Demonic Will From d67ed054ff85540117819ab679927117e1aba102 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 19:18:29 -0800 Subject: [PATCH 148/595] New recipe registration API --- .../bloodmagic/api/IBloodMagicAPI.java | 10 +- .../api/IBloodMagicRecipeRegistrar.java | 22 ++ .../api/event/BloodMagicCraftedEvent.java | 49 ++++ .../bloodmagic/api/impl/BloodMagicAPI.java | 16 +- .../api/impl/BloodMagicCorePlugin.java | 5 + .../api/impl/BloodMagicRecipeRegistrar.java | 211 ++++++++++++++++++ .../api/impl/recipe/RecipeAlchemyTable.java | 59 +++++ .../api/impl/recipe/RecipeBloodAltar.java | 72 ++++++ .../api/impl/recipe/RecipeTartaricForge.java | 53 +++++ 9 files changed, 493 insertions(+), 4 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java create mode 100644 src/main/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java create mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java create mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyTable.java create mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java create mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeTartaricForge.java diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java index a439d73e..daede4d1 100644 --- a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java @@ -3,6 +3,8 @@ package WayofTime.bloodmagic.api; import net.minecraft.block.state.IBlockState; import net.minecraft.util.ResourceLocation; +import javax.annotation.Nonnull; + public interface IBloodMagicAPI { /** @@ -10,9 +12,13 @@ public interface IBloodMagicAPI { * * @return the active blacklist instance */ + @Nonnull IBloodMagicBlacklist getBlacklist(); - void setSacrificialValue(ResourceLocation entityId, int value); + @Nonnull + IBloodMagicRecipeRegistrar getRecipeRegistrar(); - void registerAltarComponent(IBlockState state, String componentType); + void setSacrificialValue(@Nonnull ResourceLocation entityId, int value); + + void registerAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType); } 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..07e25481 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java @@ -0,0 +1,22 @@ +package WayofTime.bloodmagic.api; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; + +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; + +public interface IBloodMagicRecipeRegistrar { + + void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate); + + boolean removeBloodAltar(@Nonnull ItemStack input); + + void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, @Nonnegative int minimumTier, @Nonnull Ingredient... input); + + boolean removeAlchemyTable(@Nonnull ItemStack... input); + + void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Ingredient... input); + + boolean removeTartaricForge(@Nonnull ItemStack... input); +} 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..507a3c30 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java @@ -0,0 +1,49 @@ +package WayofTime.bloodmagic.api.event; + +import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.eventhandler.Event; + +public class BloodMagicCraftedEvent extends Event { + + private final boolean modifiable; + private ItemStack output; + + public BloodMagicCraftedEvent(ItemStack output, boolean modifiable) { + this.modifiable = modifiable; + this.output = output; + } + + public boolean isModifiable() { + return modifiable; + } + + public ItemStack getOutput() { + return output; + } + + public void setOutput(ItemStack output) { + if (isModifiable()) + this.output = output; + } + + /** + * Fired whenever a craft is completed in a BloodAltar. + *

        + * It is not cancelable, however you can modify the output stack. + */ + public static class Altar extends BloodMagicCraftedEvent { + + private final RecipeBloodAltar recipe; + + public Altar(RecipeBloodAltar recipe, ItemStack output) { + super(output, true); + + this.recipe = recipe; + } + + public RecipeBloodAltar getRecipe() { + return recipe; + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index a8e9426e..353e8771 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -9,6 +9,7 @@ import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; import net.minecraft.util.ResourceLocation; +import javax.annotation.Nonnull; import java.util.*; public class BloodMagicAPI implements IBloodMagicAPI { @@ -16,27 +17,36 @@ public class BloodMagicAPI implements IBloodMagicAPI { public static final BloodMagicAPI INSTANCE = new BloodMagicAPI(); private final BloodMagicBlacklist blacklist; + private final BloodMagicRecipeRegistrar recipeRegistrar; private final Map sacrificialValues; private final Multimap altarComponents; public BloodMagicAPI() { this.blacklist = new BloodMagicBlacklist(); + this.recipeRegistrar = new BloodMagicRecipeRegistrar(); this.sacrificialValues = Maps.newHashMap(); this.altarComponents = ArrayListMultimap.create(); } + @Nonnull @Override public BloodMagicBlacklist getBlacklist() { return blacklist; } + @Nonnull @Override - public void setSacrificialValue(ResourceLocation entityId, int value) { + public BloodMagicRecipeRegistrar getRecipeRegistrar() { + return recipeRegistrar; + } + + @Override + public void setSacrificialValue(@Nonnull ResourceLocation entityId, int value) { sacrificialValues.put(entityId, value); } @Override - public void registerAltarComponent(IBlockState state, String componentType) { + public void registerAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType) { EnumAltarComponent component = EnumAltarComponent.NOTAIR; for (EnumAltarComponent type : EnumAltarComponent.VALUES) { if (type.name().equalsIgnoreCase(componentType)) { @@ -48,10 +58,12 @@ public class BloodMagicAPI implements IBloodMagicAPI { altarComponents.put(component, state); } + @Nonnull public Map getSacrificialValues() { return ImmutableMap.copyOf(sacrificialValues); } + @Nonnull public List getComponentStates(EnumAltarComponent component) { return (List) altarComponents.get(component); } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 659a87d6..1cfadc41 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -11,6 +11,7 @@ import WayofTime.bloodmagic.block.BlockDecorative; import WayofTime.bloodmagic.block.enums.EnumBloodRune; import WayofTime.bloodmagic.block.enums.EnumDecorative; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.core.RegistrarBloodMagicRecipes; import net.minecraft.block.Block; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.BlockStateContainer; @@ -60,6 +61,10 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { BlockBloodRune bloodRune = (BlockBloodRune) RegistrarBloodMagicBlocks.BLOOD_RUNE; for (EnumBloodRune runeType : EnumBloodRune.values()) api.registerAltarComponent(bloodRune.getDefaultState().withProperty(bloodRune.getProperty(), runeType), EnumAltarComponent.BLOODRUNE.name()); + + RegistrarBloodMagicRecipes.registerAltarRecipes(((BloodMagicAPI) api).getRecipeRegistrar()); + RegistrarBloodMagicRecipes.registerAlchemyTableRecipes(((BloodMagicAPI) api).getRecipeRegistrar()); + RegistrarBloodMagicRecipes.registerTartaricForgeRecipes(((BloodMagicAPI) api).getRecipeRegistrar()); } private static void handleConfigValues(IBloodMagicAPI api) { diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java new file mode 100644 index 00000000..ce789e78 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -0,0 +1,211 @@ +package WayofTime.bloodmagic.api.impl; + +import WayofTime.bloodmagic.api.IBloodMagicRecipeRegistrar; +import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; +import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; +import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.core.recipe.IngredientBloodOrb; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.NonNullList; +import net.minecraftforge.common.crafting.CraftingHelper; + +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; +import java.util.Set; + +public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { + + private final Set altarRecipes; + private final Set alchemyRecipes; + private final Set tartaricForgeRecipes; + + public BloodMagicRecipeRegistrar() { + this.altarRecipes = Sets.newHashSet(); + this.alchemyRecipes = Sets.newHashSet(); + this.tartaricForgeRecipes = 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])); + } + + @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; + + for (int i = 0; i < input.size(); i++) { + Ingredient ingredient = recipe.getInput().get(i); + if (!ingredient.apply(input.get(i))) + 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; + + for (int i = 0; i < input.size(); i++) { + Ingredient ingredient = recipe.getInput().get(i); + if (!ingredient.apply(input.get(i))) + continue mainLoop; + } + + 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); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyTable.java new file mode 100644 index 00000000..7fe572b0 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyTable.java @@ -0,0 +1,59 @@ +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 new file mode 100644 index 00000000..40f01944 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java @@ -0,0 +1,72 @@ +package WayofTime.bloodmagic.api.impl.recipe; + +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import com.google.common.base.Preconditions; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; + +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; + +public class RecipeBloodAltar { + + @Nonnull + private final Ingredient input; + @Nonnull + private final ItemStack output; + @Nonnull + private final EnumAltarTier minimumTier; + @Nonnegative + private final int syphon; + @Nonnegative + private final int consumeRate; + @Nonnegative + private final int drainRate; + + 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 <= EnumAltarTier.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."); + + this.input = input; + this.output = output; + this.minimumTier = EnumAltarTier.values()[minimumTier]; + this.syphon = syphon; + this.consumeRate = consumeRate; + this.drainRate = drainRate; + } + + @Nonnull + public final Ingredient getInput() { + return input; + } + + @Nonnull + public final ItemStack getOutput() { + return output; + } + + @Nonnull + public EnumAltarTier getMinimumTier() { + return minimumTier; + } + + @Nonnegative + public final int getSyphon() { + return syphon; + } + + @Nonnegative + public final int getConsumeRate() { + return consumeRate; + } + + @Nonnegative + public final int getDrainRate() { + return drainRate; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeTartaricForge.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeTartaricForge.java new file mode 100644 index 00000000..96021cad --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeTartaricForge.java @@ -0,0 +1,53 @@ +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 RecipeTartaricForge { + + @Nonnull + private final NonNullList input; + @Nonnull + private final ItemStack output; + @Nonnegative + private final double minimumSouls; + @Nonnegative + private final double soulDrain; + + 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."); + + this.input = input; + this.output = output; + this.minimumSouls = minimumSouls; + this.soulDrain = soulDrain; + } + + @Nonnull + public final NonNullList getInput() { + return input; + } + + @Nonnull + public final ItemStack getOutput() { + return output; + } + + @Nonnegative + public final double getMinimumSouls() { + return minimumSouls; + } + + @Nonnegative + public final double getSoulDrain() { + return soulDrain; + } +} From f8c734bc96e182634affe5cf97fd4be1b6a3f957 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 21:24:40 -0800 Subject: [PATCH 149/595] Implemented new Tranquility value API For quick compat, mods can now register a static state-based tranquility value for their blocks. More --- .../bloodmagic/api/IBloodMagicAPI.java | 3 +- .../api/IBloodMagicValueManager.java | 14 +++ .../bloodmagic/api/impl/BloodMagicAPI.java | 14 +-- .../api/impl/BloodMagicCorePlugin.java | 31 +++-- .../api/impl/BloodMagicValueManager.java | 56 +++++++++ .../WayofTime/bloodmagic/block/BlockPath.java | 2 +- .../incense/EnumTranquilityType.java | 2 +- .../incense/IIncensePath.java | 2 +- .../incense/ITranquilityHandler.java | 2 +- .../incense/IncenseTranquilityRegistry.java | 2 +- .../incense/TranquilityHandlers.java | 107 ------------------ .../incense/TranquilityStack.java | 2 +- .../registry/ModTranquilityHandlers.java | 23 ++-- .../bloodmagic/tile/TileIncenseAltar.java | 8 +- 14 files changed, 125 insertions(+), 143 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java create mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/incense/EnumTranquilityType.java (70%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/incense/IIncensePath.java (89%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/incense/ITranquilityHandler.java (84%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/incense/IncenseTranquilityRegistry.java (94%) delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/incense/TranquilityStack.java (81%) diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java index daede4d1..9346d415 100644 --- a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java @@ -18,7 +18,8 @@ public interface IBloodMagicAPI { @Nonnull IBloodMagicRecipeRegistrar getRecipeRegistrar(); - void setSacrificialValue(@Nonnull ResourceLocation entityId, int value); + @Nonnull + IBloodMagicValueManager getValueManager(); void registerAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType); } diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java new file mode 100644 index 00000000..63676ebb --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java @@ -0,0 +1,14 @@ +package WayofTime.bloodmagic.api; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.ResourceLocation; + +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; + +public interface IBloodMagicValueManager { + + void setSacrificialValue(@Nonnull ResourceLocation entityId, @Nonnegative int value); + + void setTranquility(@Nonnull IBlockState state, @Nonnull String tranquilityType, double value); +} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index 353e8771..3a6ab28c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -18,13 +18,13 @@ public class BloodMagicAPI implements IBloodMagicAPI { private final BloodMagicBlacklist blacklist; private final BloodMagicRecipeRegistrar recipeRegistrar; - private final Map sacrificialValues; + private final BloodMagicValueManager valueManager; private final Multimap altarComponents; public BloodMagicAPI() { this.blacklist = new BloodMagicBlacklist(); this.recipeRegistrar = new BloodMagicRecipeRegistrar(); - this.sacrificialValues = Maps.newHashMap(); + this.valueManager = new BloodMagicValueManager(); this.altarComponents = ArrayListMultimap.create(); } @@ -40,9 +40,10 @@ public class BloodMagicAPI implements IBloodMagicAPI { return recipeRegistrar; } + @Nonnull @Override - public void setSacrificialValue(@Nonnull ResourceLocation entityId, int value) { - sacrificialValues.put(entityId, value); + public BloodMagicValueManager getValueManager() { + return valueManager; } @Override @@ -58,11 +59,6 @@ public class BloodMagicAPI implements IBloodMagicAPI { altarComponents.put(component, state); } - @Nonnull - public Map getSacrificialValues() { - return ImmutableMap.copyOf(sacrificialValues); - } - @Nonnull public List getComponentStates(EnumAltarComponent component) { return (List) altarComponents.get(component); diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 1cfadc41..280caae4 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -6,6 +6,8 @@ import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicAPI; import WayofTime.bloodmagic.api.IBloodMagicPlugin; +import WayofTime.bloodmagic.incense.EnumTranquilityType; +import WayofTime.bloodmagic.incense.TranquilityStack; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockDecorative; import WayofTime.bloodmagic.block.enums.EnumBloodRune; @@ -25,7 +27,8 @@ import net.minecraftforge.fml.common.registry.ForgeRegistries; public class BloodMagicCorePlugin implements IBloodMagicPlugin { @Override - public void register(IBloodMagicAPI api) { + 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); @@ -42,8 +45,22 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { api.getBlacklist().addWellOfSuffering(new ResourceLocation("armor_stand")); api.getBlacklist().addWellOfSuffering(new ResourceLocation(BloodMagic.MODID, "sentient_specter")); - api.setSacrificialValue(new ResourceLocation("armor_stand"), 0); - api.setSacrificialValue(new ResourceLocation(BloodMagic.MODID, "sentient_specter"), 0); + 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); @@ -62,9 +79,9 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { for (EnumBloodRune runeType : EnumBloodRune.values()) api.registerAltarComponent(bloodRune.getDefaultState().withProperty(bloodRune.getProperty(), runeType), EnumAltarComponent.BLOODRUNE.name()); - RegistrarBloodMagicRecipes.registerAltarRecipes(((BloodMagicAPI) api).getRecipeRegistrar()); - RegistrarBloodMagicRecipes.registerAlchemyTableRecipes(((BloodMagicAPI) api).getRecipeRegistrar()); - RegistrarBloodMagicRecipes.registerTartaricForgeRecipes(((BloodMagicAPI) api).getRecipeRegistrar()); + RegistrarBloodMagicRecipes.registerAltarRecipes(api.getRecipeRegistrar()); + RegistrarBloodMagicRecipes.registerAlchemyTableRecipes(api.getRecipeRegistrar()); + RegistrarBloodMagicRecipes.registerTartaricForgeRecipes(api.getRecipeRegistrar()); } private static void handleConfigValues(IBloodMagicAPI api) { @@ -73,7 +90,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { if (split.length != 2) // Not valid format continue; - api.setSacrificialValue(new ResourceLocation(split[0]), Integer.parseInt(split[1])); + api.getValueManager().setSacrificialValue(new ResourceLocation(split[0]), Integer.parseInt(split[1])); } for (String value : ConfigHandler.blacklist.teleposer) { diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java new file mode 100644 index 00000000..8ceacc66 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java @@ -0,0 +1,56 @@ +package WayofTime.bloodmagic.api.impl; + +import WayofTime.bloodmagic.api.IBloodMagicValueManager; +import WayofTime.bloodmagic.incense.EnumTranquilityType; +import WayofTime.bloodmagic.incense.TranquilityStack; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +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) { + sacrificial.put(entityId, value); + } + + @Override + public void setTranquility(@Nonnull IBlockState 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) + this.tranquility.put(state, new TranquilityStack(tranquility, value)); + } + + public void setTranquility(Block block, TranquilityStack tranquilityStack) { + for (IBlockState state : block.getBlockState().getValidStates()) + 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/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 35674e6e..553f791c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.incense.IIncensePath; +import WayofTime.bloodmagic.incense.IIncensePath; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumPath; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/EnumTranquilityType.java b/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java similarity index 70% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/EnumTranquilityType.java rename to src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java index af381ab7..c8f9adb8 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/EnumTranquilityType.java +++ b/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.incense; +package WayofTime.bloodmagic.incense; public enum EnumTranquilityType { PLANT(), diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IIncensePath.java b/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IIncensePath.java rename to src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java index 5f75c546..fa747980 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IIncensePath.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.incense; +package WayofTime.bloodmagic.incense; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/ITranquilityHandler.java b/src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/ITranquilityHandler.java rename to src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java index baee7500..6f4cef45 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/ITranquilityHandler.java +++ b/src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.incense; +package WayofTime.bloodmagic.incense; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IncenseTranquilityRegistry.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IncenseTranquilityRegistry.java rename to src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java index 24d04fb7..79d9c57f 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/IncenseTranquilityRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.incense; +package WayofTime.bloodmagic.incense; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java deleted file mode 100644 index 9fcad4b6..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/TranquilityHandlers.java +++ /dev/null @@ -1,107 +0,0 @@ -package WayofTime.bloodmagic.incense; - -import WayofTime.bloodmagic.apibutnotreally.incense.EnumTranquilityType; -import WayofTime.bloodmagic.apibutnotreally.incense.ITranquilityHandler; -import WayofTime.bloodmagic.apibutnotreally.incense.TranquilityStack; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import net.minecraft.block.*; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class TranquilityHandlers { - - public static class Plant implements ITranquilityHandler { - @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { - if (block instanceof BlockLeaves) { - return new TranquilityStack(EnumTranquilityType.PLANT, 1); - } - - return null; - } - } - - public static class Lava implements ITranquilityHandler { - @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { - if (block == Blocks.LAVA || block == Blocks.FLOWING_LAVA) { - return new TranquilityStack(EnumTranquilityType.LAVA, 1.2); - } - - return null; - } - } - - public static class Fire implements ITranquilityHandler { - @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { - if (block instanceof BlockFire) { - return new TranquilityStack(EnumTranquilityType.FIRE, 1); - } - - if (block == Blocks.NETHERRACK) { - return new TranquilityStack(EnumTranquilityType.FIRE, 0.5); - } - - return null; - } - } - - public static class Earth implements ITranquilityHandler { - @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { - if (block == Blocks.DIRT) { - return new TranquilityStack(EnumTranquilityType.EARTHEN, 0.25); - } - - if (block instanceof BlockGrass) { - return new TranquilityStack(EnumTranquilityType.EARTHEN, 0.5); - } - - if (block == Blocks.FARMLAND) { - return new TranquilityStack(EnumTranquilityType.EARTHEN, 1); - } - - return null; - } - } - - public static class Crop implements ITranquilityHandler { - @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { - if (block == Blocks.POTATOES || block == Blocks.CARROTS || block == Blocks.WHEAT || block == Blocks.NETHER_WART || block == Blocks.BEETROOTS) { - return new TranquilityStack(EnumTranquilityType.CROP, 1); - } - - return null; - } - } - - public static class Tree implements ITranquilityHandler { - @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { - if (block instanceof BlockLog) { - return new TranquilityStack(EnumTranquilityType.TREE, 1); - } - - return null; - } - } - - public static class Water implements ITranquilityHandler { - @Override - public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { - if (block == Blocks.WATER || block == Blocks.FLOWING_WATER) { - return new TranquilityStack(EnumTranquilityType.WATER, 1); - } - - if (block == RegistrarBloodMagicBlocks.LIFE_ESSENCE) { - return new TranquilityStack(EnumTranquilityType.WATER, 1.5); - } - - return null; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/TranquilityStack.java b/src/main/java/WayofTime/bloodmagic/incense/TranquilityStack.java similarity index 81% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/TranquilityStack.java rename to src/main/java/WayofTime/bloodmagic/incense/TranquilityStack.java index ff94b0b0..7dd3de54 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/incense/TranquilityStack.java +++ b/src/main/java/WayofTime/bloodmagic/incense/TranquilityStack.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.incense; +package WayofTime.bloodmagic.incense; public class TranquilityStack { public final EnumTranquilityType type; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java index 2fa8e433..d4fd77b7 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java @@ -1,16 +1,21 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.apibutnotreally.incense.IncenseTranquilityRegistry; -import WayofTime.bloodmagic.incense.TranquilityHandlers; +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.BlockFire; +import net.minecraft.block.BlockGrass; +import net.minecraft.block.BlockLeaves; +import net.minecraft.block.BlockLog; public class ModTranquilityHandlers { + public static void init() { - IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Plant()); - IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Crop()); - IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Water()); - IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Earth()); - IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Fire()); - IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Lava()); - IncenseTranquilityRegistry.registerTranquilityHandler(new TranquilityHandlers.Tree()); + IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof BlockLeaves ? new TranquilityStack(EnumTranquilityType.PLANT, 1.0D) : null); + IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof BlockFire ? new TranquilityStack(EnumTranquilityType.FIRE, 1.0D) : null); + IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof BlockGrass ? new TranquilityStack(EnumTranquilityType.EARTHEN, 0.5D) : null); + IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof BlockLog ? 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/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index 26daca95..51afef15 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.incense.EnumTranquilityType; -import WayofTime.bloodmagic.apibutnotreally.incense.IIncensePath; -import WayofTime.bloodmagic.apibutnotreally.incense.IncenseTranquilityRegistry; -import WayofTime.bloodmagic.apibutnotreally.incense.TranquilityStack; +import WayofTime.bloodmagic.incense.EnumTranquilityType; +import WayofTime.bloodmagic.incense.IIncensePath; +import WayofTime.bloodmagic.incense.IncenseTranquilityRegistry; +import WayofTime.bloodmagic.incense.TranquilityStack; import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.incense.IncenseAltarHandler; From 50fd02b6aa5739c3fab4f10fb0a218e15d72e224 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 21:27:23 -0800 Subject: [PATCH 150/595] Missed some value manager references --- .../java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java | 2 +- .../java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index dce324db..eeeb2012 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -54,7 +54,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { EntityEntry entityEntry = EntityRegistry.getEntry(target.getClass()); if (entityEntry == null) return false; - int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getSacrificialValues().getOrDefault(entityEntry.getRegistryName(), 25); + int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getValueManager().getSacrificial().getOrDefault(entityEntry.getRegistryName(), 25); if (lifeEssenceRatio <= 0) return false; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index c9af292b..86eaf30a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -82,7 +82,7 @@ public class RitualWellOfSuffering extends Ritual { if (entityEntry == null || BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) continue; - int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getSacrificialValues().getOrDefault(entityEntry.getRegistryName(), SACRIFICE_AMOUNT); + int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getValueManager().getSacrificial().getOrDefault(entityEntry.getRegistryName(), SACRIFICE_AMOUNT); if (lifeEssenceRatio <= 0) continue; From 57591973a35c8047c4b5391c6732ddc794ca3372 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 21:40:50 -0800 Subject: [PATCH 151/595] Move Altar to new recipe API --- .../bloodmagic/altar/BloodAltar.java | 29 +++++---- .../core/RegistrarBloodMagicItems.java | 3 +- .../core/RegistrarBloodMagicRecipes.java | 62 +++++++++++++++++-- .../bloodmagic/registry/ModRecipes.java | 42 ------------- 4 files changed, 72 insertions(+), 64 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 37f49e00..2e94d54b 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -1,13 +1,12 @@ package WayofTime.bloodmagic.altar; +import WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; +import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import WayofTime.bloodmagic.apibutnotreally.BlockStack; import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.apibutnotreally.altar.*; -import WayofTime.bloodmagic.apibutnotreally.event.AltarCraftedEvent; import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry.AltarRecipe; import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.block.BlockBloodRune; @@ -76,8 +75,7 @@ public class BloodAltar implements IFluidHandler { private int chargingFrequency = 0; private int maxCharge = 0; private int cooldownAfterCrafting = 60; - private AltarRecipe recipe; - private ItemStack result = ItemStack.EMPTY; + private RecipeBloodAltar recipe; private EnumAltarTier currentTierDisplayed = EnumAltarTier.ONE; public BloodAltar(TileAltar tileAltar) { @@ -187,18 +185,21 @@ public class BloodAltar implements IFluidHandler { if (!input.isEmpty()) { // Do recipes - AltarRecipe recipe = AltarRecipeRegistry.getRecipeForInput(input); + RecipeBloodAltar recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getBloodAltar(input); if (recipe != null) { - if (recipe.doesRequiredItemMatch(input, altarTier)) { + if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) { this.isActive = true; this.recipe = recipe; - this.result = recipe.getOutput().isEmpty() ? ItemStack.EMPTY : new ItemStack(recipe.getOutput().getItem(), 1, recipe.getOutput().getMetadata()); this.liquidRequired = recipe.getSyphon(); - this.canBeFilled = recipe.isFillable(); 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; } } @@ -311,13 +312,11 @@ public class BloodAltar implements IFluidHandler { if (hasOperated) { if (progress >= liquidRequired * stackSize) { - ItemStack result = this.result; + ItemStack result = recipe.getOutput().copy(); - if (!result.isEmpty()) - result.setCount(result.getCount() * stackSize); - - MinecraftForge.EVENT_BUS.post(new AltarCraftedEvent(recipe, result)); - tileAltar.setInventorySlotContents(0, result); + BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(recipe, result); + MinecraftForge.EVENT_BUS.post(event); + tileAltar.setInventorySlotContents(0, event.getOutput()); progress = 0; if (world instanceof WorldServer) { diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index d12b7bce..dc216c97 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -16,6 +16,7 @@ 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.types.ComponentTypes; import com.google.common.collect.Lists; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.init.Items; @@ -165,7 +166,7 @@ public class RegistrarBloodMagicItems { new ItemSigilClaw().setRegistryName("sigil_claw"), new ItemSigilBounce().setRegistryName("sigil_bounce"), new ItemSigilFrost().setRegistryName("sigil_frost"), - new ItemComponent().setRegistryName("component"), + new ItemEnum<>(ComponentTypes.class, "baseComponent").setRegistryName("component"), new ItemDemonCrystal().setRegistryName("item_demon_crystal"), new ItemTelepositionFocus().setRegistryName("teleposition_focus"), new ItemExperienceBook().setRegistryName("experience_tome"), diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 46a42aee..5202a4d3 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -1,15 +1,27 @@ package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.impl.BloodMagicRecipeRegistrar; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; +import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.item.ItemDemonCrystal; +import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.item.soul.ItemSoulGem; +import WayofTime.bloodmagic.item.types.ComponentTypes; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.Ingredient; 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; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @@ -18,17 +30,55 @@ public class RegistrarBloodMagicRecipes { @SubscribeEvent public static void registerRecipes(RegistryEvent.Register event) { for (int i = 0; i < ItemSoulGem.names.length; i++) { - for (int j = 0; j < ItemDemonCrystal.NAMES.size(); j++) { + for (EnumDemonWillType willType : EnumDemonWillType.values()) { ItemStack baseGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); ItemStack newGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); - ItemStack crystalStack = new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, j); - - EnumDemonWillType willType = ((ItemDemonCrystal) RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL).getType(crystalStack); ((ItemSoulGem) RegistrarBloodMagicItems.SOUL_GEM).setCurrentType(willType, newGemStack); - ShapelessOreRecipe shapeless = new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "soul_gem"), newGemStack, baseGemStack, crystalStack); + 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()); + } + + public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) { + // ONE + registrar.addBloodAltar(new OreIngredient("gemDiamond"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE.ordinal(), 2000, 2, 1); + registrar.addBloodAltar(new OreIngredient("stone"), new ItemStack(RegistrarBloodMagicItems.SLATE), EnumAltarTier.ONE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(Ingredient.fromItem(Items.BUCKET), FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)), EnumAltarTier.ONE.ordinal(), 1000, 5, 0); + registrar.addBloodAltar(Ingredient.fromItem(Items.BOOK), new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK), EnumAltarTier.ONE.ordinal(), 1000, 20, 0); + + // TWO + registrar.addBloodAltar(new OreIngredient("blockRedstone"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), EnumAltarTier.TWO.ordinal(), 5000, 5, 5); + registrar.addBloodAltar(Ingredient.fromItem(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), EnumAltarTier.TWO.ordinal(), 2000, 5, 5); + registrar.addBloodAltar(Ingredient.fromItem(Items.IRON_SWORD), new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE), EnumAltarTier.TWO.ordinal(), 3000, 5, 5); + + // THREE + registrar.addBloodAltar(new OreIngredient("blockGold"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), EnumAltarTier.THREE.ordinal(), 25000, 20, 20); + registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1)), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), EnumAltarTier.THREE.ordinal(), 5000, 15, 10); + registrar.addBloodAltar(new OreIngredient("obsidian"), EnumRuneType.EARTH.getScribeStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(new OreIngredient("blockLapis"), EnumRuneType.WATER.getScribeStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(Ingredient.fromItem(Items.MAGMA_CREAM), EnumRuneType.FIRE.getScribeStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(Ingredient.fromItem(Items.GHAST_TEAR), EnumRuneType.AIR.getScribeStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(Ingredient.fromItem(RegistrarBloodMagicItems.LAVA_CRYSTAL), new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL), EnumAltarTier.THREE.ordinal(), 10000, 20, 10); + + // FOUR + registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), EnumAltarTier.FOUR.ordinal(), 25000, 30, 50); + registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), EnumAltarTier.FOUR.ordinal(), 15000, 20, 20); + registrar.addBloodAltar(new OreIngredient("blockCoal"), EnumRuneType.DUSK.getScribeStack(), EnumAltarTier.FOUR.ordinal(), 2000, 20, 10); + registrar.addBloodAltar(new OreIngredient("enderpearl"), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), EnumAltarTier.FOUR.ordinal(), 2000, 10, 10); + registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), EnumAltarTier.FOUR.ordinal(), 10000, 20, 10); + + // FIVE + registrar.addBloodAltar(new OreIngredient("netherStar"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), EnumAltarTier.FIVE.ordinal(), 80000, 50, 100); + registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3)), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4), EnumAltarTier.FIVE.ordinal(), 30000, 40, 100); + + // SIX + registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, 2)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); + registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getScribeStack(), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 58a55030..df3172e8 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -2,13 +2,11 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.alchemyArray.*; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableCustomRecipe; import WayofTime.bloodmagic.apibutnotreally.registry.*; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.client.render.alchemyArray.*; import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; @@ -35,7 +33,6 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; -import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.tuple.Pair; @@ -72,46 +69,7 @@ public class ModRecipes { } public static void addAltarRecipes() { - // ONE - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE, RegistrarBloodMagic.ORB_WEAK.getCapacity(), 2, 1); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.DIAMOND), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE, 2000, 2, 1)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.STONE), new ItemStack(RegistrarBloodMagicItems.SLATE), EnumAltarTier.ONE, 1000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.BUCKET), new ItemStack(ForgeModContainer.getInstance().universalBucket), EnumAltarTier.ONE, 1000, 5, 0)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.BOOK), new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK), EnumAltarTier.ONE, 1000, 20, 0)); - // TWO - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), EnumAltarTier.TWO, RegistrarBloodMagic.ORB_APPRENTICE.getCapacity(), 5, 5); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.REDSTONE_BLOCK), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), EnumAltarTier.TWO, 5000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), EnumAltarTier.TWO, 2000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.IRON_SWORD), new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE), EnumAltarTier.TWO, 3000, 5, 5)); - - // THREE - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), EnumAltarTier.THREE, RegistrarBloodMagic.ORB_MAGICIAN.getCapacity(), 15, 15); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.GOLD_BLOCK), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), EnumAltarTier.THREE, 25000, 20, 20)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), EnumAltarTier.THREE, 5000, 15, 10)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.OBSIDIAN), EnumRuneType.EARTH.getScribeStack(), EnumAltarTier.THREE, 1000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.LAPIS_BLOCK), EnumRuneType.WATER.getScribeStack(), EnumAltarTier.THREE, 1000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.MAGMA_CREAM), EnumRuneType.FIRE.getScribeStack(), EnumAltarTier.THREE, 1000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.GHAST_TEAR), EnumRuneType.AIR.getScribeStack(), EnumAltarTier.THREE, 1000, 5, 5)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL), new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL), EnumAltarTier.THREE, 10000, 20, 10)); - - // FOUR - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), EnumAltarTier.FOUR, RegistrarBloodMagic.ORB_MASTER.getCapacity(), 25, 25); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), EnumAltarTier.FOUR, 25000, 30, 50)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), EnumAltarTier.FOUR, 15000, 20, 20)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.COAL_BLOCK), EnumRuneType.DUSK.getScribeStack(), EnumAltarTier.FOUR, 2000, 20, 10)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.ENDER_PEARL), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), EnumAltarTier.FOUR, 2000, 10, 10)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), EnumAltarTier.FOUR, 10000, 20, 10)); - - // FIVE - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), EnumAltarTier.FIVE, RegistrarBloodMagic.ORB_ARCHMAGE.getCapacity(), 50, 50); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Items.NETHER_STAR), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), EnumAltarTier.FIVE, 80000, 50, 100)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4), EnumAltarTier.FIVE, 30000, 40, 100)); - - // SIX - AltarRecipeRegistry.registerFillRecipe(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), EnumAltarTier.SIX, RegistrarBloodMagic.ORB_TRANSCENDENT.getCapacity(), 50, 50); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, 2), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), EnumAltarTier.SIX, 200000, 100, 200)); - AltarRecipeRegistry.registerRecipe(new AltarRecipeRegistry.AltarRecipe(new ItemStack(Blocks.GLOWSTONE), EnumRuneType.DAWN.getScribeStack(), EnumAltarTier.SIX, 200000, 100, 200)); } public static void addAlchemyArrayRecipes() { From 80e7b50ddeb30af747d56b8eef644c1ca25a291b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 6 Feb 2018 22:17:06 -0800 Subject: [PATCH 152/595] Move Soul Forge to new recipe API --- .../api/impl/BloodMagicRecipeRegistrar.java | 6 +- .../core/RegistrarBloodMagicRecipes.java | 58 +++++++++++++++++++ .../bloodmagic/tile/TileSoulForge.java | 25 ++++---- 3 files changed, 74 insertions(+), 15 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index ce789e78..9e23a462 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -186,8 +186,12 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { continue; for (int i = 0; i < input.size(); i++) { + boolean matched = false; Ingredient ingredient = recipe.getInput().get(i); - if (!ingredient.apply(input.get(i))) + if (ingredient.apply(input.get(i))) + matched = true; + + if (!matched) continue mainLoop; } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 5202a4d3..e0d3d6e3 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -7,8 +7,10 @@ import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.block.BlockLifeEssence; +import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.soul.ItemSoulGem; import WayofTime.bloodmagic.item.types.ComponentTypes; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; @@ -81,4 +83,60 @@ public class RegistrarBloodMagicRecipes { registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, 2)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getScribeStack(), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); } + + 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", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); + registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 1000, 100, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), 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.getStack(ItemCuttingFluid.BASIC)); + 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", new ItemStack(RegistrarBloodMagicItems.SLATE)); + registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER), 400, 5, "stickWood", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), "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", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); + + 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); + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index fd066671..b9055639 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.TartaricForgeRecipeRegistry; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; @@ -73,20 +73,18 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil List inputList = new ArrayList(); - for (int i = 0; i < 4; i++) { - if (!getStackInSlot(i).isEmpty()) { + for (int i = 0; i < 4; i++) + if (!getStackInSlot(i).isEmpty()) inputList.add(getStackInSlot(i)); - } - } - TartaricForgeRecipe recipe = TartaricForgeRecipeRegistry.getMatchingRecipe(inputList, getWorld(), getPos()); + RecipeTartaricForge recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getTartaricForge(inputList); if (recipe != null && (soulsInGem >= recipe.getMinimumSouls() || burnTime > 0)) { if (canCraft(recipe)) { burnTime++; if (burnTime == ticksRequired) { if (!getWorld().isRemote) { - double requiredSouls = recipe.getSoulsDrained(); + double requiredSouls = recipe.getSoulDrain(); if (requiredSouls > 0) { if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) { consumeSouls(EnumDemonWillType.DEFAULT, requiredSouls); @@ -113,12 +111,11 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil return ((double) burnTime) / ticksRequired; } - private boolean canCraft(TartaricForgeRecipe recipe) { - if (recipe == null) { + private boolean canCraft(RecipeTartaricForge recipe) { + if (recipe == null) return false; - } - ItemStack outputStack = recipe.getRecipeOutput(); + ItemStack outputStack = recipe.getOutput(); ItemStack currentOutputStack = getStackInSlot(outputSlot); if (outputStack.isEmpty()) return false; @@ -131,9 +128,9 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } - public void craftItem(TartaricForgeRecipe recipe) { + public void craftItem(RecipeTartaricForge recipe) { if (this.canCraft(recipe)) { - ItemStack outputStack = recipe.getRecipeOutput(); + ItemStack outputStack = recipe.getOutput(); ItemStack currentOutputStack = getStackInSlot(outputSlot); if (currentOutputStack.isEmpty()) { From e3cef5ee762640e1db15dc1e3f851eb19c30325a Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 7 Feb 2018 17:02:53 -0800 Subject: [PATCH 153/595] Add support for being in the mood to run on dedicated servers (#1211) --- .../WayofTime/bloodmagic/util/handler/event/ClientHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 2719671e..caa081bd 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -50,7 +50,7 @@ import org.lwjgl.opengl.GL11; import java.util.*; -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) +@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. From 2d3f86aaf8149ab4dc39231283becec52359356e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 7 Feb 2018 18:46:18 -0800 Subject: [PATCH 154/595] Fixup Soul Forge crafting --- .../WayofTime/bloodmagic/tile/TileSoulForge.java | 15 +++++++-------- .../tile/container/ContainerSoulForge.java | 4 ++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index b9055639..64d7fde1 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -11,6 +11,7 @@ import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ITickable; +import net.minecraftforge.items.ItemHandlerHelper; import java.util.ArrayList; import java.util.List; @@ -115,28 +116,26 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil if (recipe == null) return false; - ItemStack outputStack = recipe.getOutput(); ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (outputStack.isEmpty()) + if (recipe.getOutput().isEmpty()) return false; if (currentOutputStack.isEmpty()) return true; - if (!currentOutputStack.isItemEqual(outputStack)) + if (!currentOutputStack.isItemEqual(recipe.getOutput())) return false; - int result = currentOutputStack.getCount() + outputStack.getCount(); + int result = currentOutputStack.getCount() + recipe.getOutput().getCount(); return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); } public void craftItem(RecipeTartaricForge recipe) { if (this.canCraft(recipe)) { - ItemStack outputStack = recipe.getOutput(); ItemStack currentOutputStack = getStackInSlot(outputSlot); if (currentOutputStack.isEmpty()) { - setInventorySlotContents(outputSlot, outputStack); - } else if (currentOutputStack.getItem() == currentOutputStack.getItem()) { - currentOutputStack.grow(outputStack.getCount()); + setInventorySlotContents(outputSlot, recipe.getOutput().copy()); + } else if (ItemHandlerHelper.canItemStacksStack(currentOutputStack, recipe.getOutput())) { + currentOutputStack.grow(recipe.getOutput().getCount()); } consumeInventory(); diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java index bd82760e..37973d53 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java @@ -17,8 +17,8 @@ public class ContainerSoulForge extends Container { 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, 80, 87)); - this.addSlotToContainer(new Slot(tileForge, 3, 8, 87)); + 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)); From 9f6a4983a6f13cf1bdc49a5f8082d83ac19a3546 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 7 Feb 2018 21:45:40 -0800 Subject: [PATCH 155/595] Update JEI compat for Forge and Altar --- ...icPlugin.java => BloodMagicJEIPlugin.java} | 22 +++++---- .../AlchemyArrayCraftingCategory.java | 4 +- .../AlchemyTableRecipeCategory.java | 6 +-- .../alchemyTable/AlchemyTableRecipeJEI.java | 4 +- .../compat/jei/altar/AltarRecipeCategory.java | 20 ++++----- .../compat/jei/altar/AltarRecipeHandler.java | 31 ------------- .../compat/jei/altar/AltarRecipeJEI.java | 25 ++++++----- .../compat/jei/altar/AltarRecipeMaker.java | 45 ------------------- .../ArmourDowngradeRecipeCategory.java | 6 +-- .../ArmourDowngradeRecipeJEI.java | 4 +- .../jei/binding/BindingRecipeCategory.java | 4 +- .../forge/TartaricForgeRecipeCategory.java | 30 +++++-------- .../jei/forge/TartaricForgeRecipeHandler.java | 31 ------------- .../jei/forge/TartaricForgeRecipeJEI.java | 41 ++++++++--------- .../jei/forge/TartaricForgeRecipeMaker.java | 21 --------- ...dMagic.java => BloodMagicHwylaPlugin.java} | 3 +- 16 files changed, 80 insertions(+), 217 deletions(-) rename src/main/java/WayofTime/bloodmagic/compat/jei/{BloodMagicPlugin.java => BloodMagicJEIPlugin.java} (84%) delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java rename src/main/java/WayofTime/bloodmagic/compat/waila/{WailaPluginBloodMagic.java => BloodMagicHwylaPlugin.java} (96%) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java rename to src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index dca1919e..8a0ed800 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -1,5 +1,8 @@ package WayofTime.bloodmagic.compat.jei; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; @@ -9,10 +12,10 @@ import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingRecipeHa import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingRecipeMaker; import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeCategory; import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeHandler; +import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeJEI; import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeMaker; import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeCategory; -import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeHandler; -import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeMaker; +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; @@ -20,8 +23,7 @@ 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.TartaricForgeRecipeHandler; -import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeMaker; +import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeJEI; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import mezz.jei.api.*; @@ -32,7 +34,7 @@ import javax.annotation.Nonnull; import java.util.Map; @JEIPlugin -public class BloodMagicPlugin extends BlankModPlugin { +public class BloodMagicJEIPlugin extends BlankModPlugin { public static IJeiHelpers jeiHelper; @Override @@ -40,18 +42,20 @@ public class BloodMagicPlugin extends BlankModPlugin { jeiHelper = registry.getJeiHelpers(); registry.addRecipeHandlers( - new AltarRecipeHandler(), new BindingRecipeHandler(), new AlchemyArrayCraftingRecipeHandler(), - new TartaricForgeRecipeHandler(), new AlchemyTableRecipeHandler(), new ArmourDowngradeRecipeHandler() ); - registry.addRecipes(AltarRecipeMaker.getRecipes()); + registry.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAltarRecipes(), Constants.Compat.JEI_CATEGORY_ALTAR); + registry.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getTartaricForgeRecipes(), Constants.Compat.JEI_CATEGORY_SOULFORGE); + + registry.handleRecipes(RecipeBloodAltar.class, AltarRecipeJEI::new, Constants.Compat.JEI_CATEGORY_ALTAR); + registry.handleRecipes(RecipeTartaricForge.class, TartaricForgeRecipeJEI::new, Constants.Compat.JEI_CATEGORY_SOULFORGE); + registry.addRecipes(BindingRecipeMaker.getRecipes()); registry.addRecipes(AlchemyArrayCraftingRecipeMaker.getRecipes()); - registry.addRecipes(TartaricForgeRecipeMaker.getRecipes()); registry.addRecipes(AlchemyTableRecipeMaker.getRecipes()); registry.addRecipes(ArmourDowngradeRecipeMaker.getRecipes()); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java index 9dddc706..dbb41825 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IRecipeLayout; @@ -22,7 +22,7 @@ public class AlchemyArrayCraftingCategory implements IRecipeCategory { private static final int OUTPUT_SLOT = 2; @Nonnull - private final IDrawable background = BloodMagicPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/binding.png"), 0, 0, 100, 30); + 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"); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java index 64058d7a..53d792a2 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; import mezz.jei.api.gui.IDrawable; @@ -22,14 +22,14 @@ public class AlchemyTableRecipeCategory extends BlankRecipeCategory> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); + List> expanded = BloodMagicJEIPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); ingredients.setInputLists(ItemStack.class, expanded); ingredients.setOutput(ItemStack.class, recipe.getRecipeOutput(Lists.newArrayList())); } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java index 2701f7d5..69515377 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java @@ -2,13 +2,12 @@ package WayofTime.bloodmagic.compat.jei.altar; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +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; @@ -16,14 +15,12 @@ import net.minecraft.util.ResourceLocation; import javax.annotation.Nonnull; import javax.annotation.Nullable; -public class AltarRecipeCategory implements IRecipeCategory { +public class AltarRecipeCategory implements IRecipeCategory { private static final int INPUT_SLOT = 0; private static final int OUTPUT_SLOT = 1; @Nonnull - private final IDrawable background = BloodMagicPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/altar.png"), 3, 4, 155, 65); - @Nonnull - private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.altar"); + private final IDrawable background = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/altar.png"), 3, 4, 155, 65); @Nonnull @Override @@ -34,7 +31,7 @@ public class AltarRecipeCategory implements IRecipeCategory { @Nonnull @Override public String getTitle() { - return localizedName; + return TextHelper.localize("jei.bloodmagic.recipe.altar"); } @Nonnull @@ -55,16 +52,15 @@ public class AltarRecipeCategory implements IRecipeCategory { } @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { + 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); - if (recipeWrapper instanceof AltarRecipeJEI) { - recipeLayout.getItemStacks().set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); - recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); - } + 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/AltarRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java deleted file mode 100644 index c8955819..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.altar; - -import WayofTime.bloodmagic.apibutnotreally.Constants; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; - -import javax.annotation.Nonnull; - -public class AltarRecipeHandler implements IRecipeHandler { - @Nonnull - @Override - public Class getRecipeClass() { - return AltarRecipeJEI.class; - } - - @Override - public String getRecipeCategoryUid(@Nonnull AltarRecipeJEI recipe) { - return Constants.Compat.JEI_CATEGORY_ALTAR; - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull AltarRecipeJEI recipe) { - return recipe; - } - - @Override - public boolean isRecipeValid(@Nonnull AltarRecipeJEI recipe) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java index 36294a82..281e9b42 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java @@ -1,16 +1,17 @@ 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.BlankRecipeWrapper; 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.ArrayList; import java.util.List; public class AltarRecipeJEI implements IRecipeWrapper { @@ -23,13 +24,13 @@ public class AltarRecipeJEI implements IRecipeWrapper { private final int consumptionRate; private final int drainRate; - public AltarRecipeJEI(@Nonnull List input, @Nonnull ItemStack output, int tier, int requiredLP, int consumptionRate, int drainRate) { - this.input = input; - this.output = output; + 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(tier)), TextHelper.localize("jei.bloodmagic.recipe.requiredLP", requiredLP)}; - this.consumptionRate = consumptionRate; - this.drainRate = drainRate; + 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 @@ -41,12 +42,12 @@ public class AltarRecipeJEI implements IRecipeWrapper { @Nonnull @Override public List getTooltipStrings(int mouseX, int mouseY) { - ArrayList ret = new ArrayList(); + List tooltip = Lists.newArrayList(); if (mouseX >= 13 && mouseX <= 64 && mouseY >= 27 && mouseY <= 58) { - ret.add(TextHelper.localize("jei.bloodmagic.recipe.consumptionRate", consumptionRate)); - ret.add(TextHelper.localize("jei.bloodmagic.recipe.drainRate", drainRate)); + tooltip.add(TextHelper.localize("jei.bloodmagic.recipe.consumptionRate", consumptionRate)); + tooltip.add(TextHelper.localize("jei.bloodmagic.recipe.drainRate", drainRate)); } - return ret; + return tooltip; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java deleted file mode 100644 index 41b2cd1c..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeMaker.java +++ /dev/null @@ -1,45 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.altar; - -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.ForgeModContainer; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidUtil; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class AltarRecipeMaker { - @Nonnull - public static List getRecipes() { - Map, AltarRecipeRegistry.AltarRecipe> altarMap = AltarRecipeRegistry.getRecipes(); - - ArrayList recipes = new ArrayList(); - - for (Map.Entry, AltarRecipeRegistry.AltarRecipe> itemStackAltarRecipeEntry : altarMap.entrySet()) { - // Make sure input is not a Blood Orb. If it is, the recipe is for a filling orb, and we don't want that. - if (!(itemStackAltarRecipeEntry.getKey().get(0).toStack().getItem() instanceof IBloodOrb)) { - List input = ItemStackWrapper.toStackList(itemStackAltarRecipeEntry.getValue().getInput()); - ItemStack output = itemStackAltarRecipeEntry.getValue().getOutput(); - int requiredTier = itemStackAltarRecipeEntry.getValue().getMinTier().toInt(); - int requiredLP = itemStackAltarRecipeEntry.getValue().getSyphon(); - int consumptionRate = itemStackAltarRecipeEntry.getValue().getConsumeRate(); - int drainRate = itemStackAltarRecipeEntry.getValue().getDrainRate(); - - if (output.getItem() == ForgeModContainer.getInstance().universalBucket && requiredLP == 1000) - output = FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)); - - AltarRecipeJEI recipe = new AltarRecipeJEI(input, output, requiredTier, requiredLP, consumptionRate, drainRate); - recipes.add(recipe); - } - } - - return recipes; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java index 28e67e3a..675eae1c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; import mezz.jei.api.gui.IDrawable; @@ -24,14 +24,14 @@ public class ArmourDowngradeRecipeCategory implements IRecipeCategory { private static final int INPUT_SLOT = 2; @Nonnull - private final IDrawable background = BloodMagicPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/alchemyTable.png"), 0, 0, 118, 40); + 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 = BloodMagicPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); + craftingGridHelper = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); } @Nonnull diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java index 611cd8d8..e306b682 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import com.google.common.collect.Lists; import mezz.jei.api.ingredients.IIngredients; @@ -20,7 +20,7 @@ public class ArmourDowngradeRecipeJEI extends BlankRecipeWrapper { @Override public void getIngredients(IIngredients ingredients) { - List> expanded = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java index 95e51d0e..8e0b0a76 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.compat.jei.binding; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; import mezz.jei.api.gui.IRecipeLayout; @@ -22,7 +22,7 @@ public class BindingRecipeCategory implements IRecipeCategory { private static final int OUTPUT_SLOT = 2; @Nonnull - private final IDrawable background = BloodMagicPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/binding.png"), 0, 0, 100, 30); + 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"); 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 a6a11a1c..81b69ce8 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.compat.jei.forge; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; import mezz.jei.api.gui.IDrawable; @@ -10,7 +10,6 @@ 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; @@ -19,20 +18,18 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; -public class TartaricForgeRecipeCategory implements IRecipeCategory { +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; @Nonnull - private final IDrawable background = BloodMagicPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/soulForge.png"), 0, 0, 100, 40); - @Nonnull - private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.soulForge"); + 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; public TartaricForgeRecipeCategory() { - craftingGridHelper = BloodMagicPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); + craftingGridHelper = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); } @Nonnull @@ -44,7 +41,7 @@ public class TartaricForgeRecipeCategory implements IRecipeCategory { @Nonnull @Override public String getTitle() { - return localizedName; + return TextHelper.localize("jei.bloodmagic.recipe.soulForge"); } @Nonnull @@ -65,7 +62,7 @@ public class TartaricForgeRecipeCategory implements IRecipeCategory { } @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { + public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull TartaricForgeRecipeJEI recipeWrapper, @Nonnull IIngredients ingredients) { IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); guiItemStacks.init(OUTPUT_SLOT, false, 73, 13); @@ -79,18 +76,15 @@ public class TartaricForgeRecipeCategory implements IRecipeCategory { } List> inputs = ingredients.getInputs(ItemStack.class); - List> outputs = ingredients.getOutputs(ItemStack.class); - if (recipeWrapper instanceof TartaricForgeRecipeJEI) { - TartaricForgeRecipeJEI recipe = (TartaricForgeRecipeJEI) recipeWrapper; - 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.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); } + @Nonnull @Override public String getModName() { return BloodMagic.NAME; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java deleted file mode 100644 index 9cd307ca..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.forge; - -import WayofTime.bloodmagic.apibutnotreally.Constants; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; - -import javax.annotation.Nonnull; - -public class TartaricForgeRecipeHandler implements IRecipeHandler { - @Nonnull - @Override - public Class getRecipeClass() { - return TartaricForgeRecipeJEI.class; - } - - @Override - public String getRecipeCategoryUid(@Nonnull TartaricForgeRecipeJEI recipe) { - return Constants.Compat.JEI_CATEGORY_SOULFORGE; - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull TartaricForgeRecipeJEI recipe) { - return recipe; - } - - @Override - public boolean isRecipeValid(@Nonnull TartaricForgeRecipeJEI recipe) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java index d1004898..16870613 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java @@ -1,22 +1,22 @@ package WayofTime.bloodmagic.compat.jei.forge; -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.compat.jei.BloodMagicPlugin; +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.BlankRecipeWrapper; +import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.item.ItemStack; -import javax.annotation.Nullable; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; -public class TartaricForgeRecipeJEI extends BlankRecipeWrapper { - private TartaricForgeRecipe recipe; - private List validGems = new ArrayList(); +public class TartaricForgeRecipeJEI implements IRecipeWrapper { + private RecipeTartaricForge recipe; + private List validGems = Lists.newArrayList(); - public TartaricForgeRecipeJEI(TartaricForgeRecipe recipe) { + public TartaricForgeRecipeJEI(RecipeTartaricForge recipe) { this.recipe = recipe; for (DefaultWill will : DefaultWill.values()) @@ -25,33 +25,28 @@ public class TartaricForgeRecipeJEI extends BlankRecipeWrapper { } @Override - public void getIngredients(IIngredients ingredients) { - List> expandedInputs = BloodMagicPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); + 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.getRecipeOutput()); + ingredients.setOutput(ItemStack.class, recipe.getOutput()); } - @Nullable + @Nonnull @Override public List getTooltipStrings(int mouseX, int mouseY) { - ArrayList ret = new ArrayList(); + List tooltip = Lists.newArrayList(); if (mouseX >= 40 && mouseX <= 60 && mouseY >= 21 && mouseY <= 34) { - ret.add(TextHelper.localize("jei.bloodmagic.recipe.minimumSouls", recipe.getMinimumSouls())); - ret.add(TextHelper.localize("jei.bloodmagic.recipe.soulsDrained", recipe.getSoulsDrained())); - return ret; + tooltip.add(TextHelper.localize("jei.bloodmagic.recipe.minimumSouls", recipe.getMinimumSouls())); + tooltip.add(TextHelper.localize("jei.bloodmagic.recipe.soulsDrained", recipe.getSoulDrain())); } - return null; + return tooltip; } - public TartaricForgeRecipe getRecipe() { + public RecipeTartaricForge getRecipe() { return recipe; } - public List getValidGems() { - return validGems; - } - public enum DefaultWill { SOUL(new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL, 1, 0), 64), PETTY(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 0), 64), diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java deleted file mode 100644 index cea35588..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeMaker.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.forge; - -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.TartaricForgeRecipeRegistry; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - -public class TartaricForgeRecipeMaker { - @Nonnull - public static List getRecipes() { - List recipeList = TartaricForgeRecipeRegistry.getRecipeList(); - ArrayList recipes = new ArrayList(); - - for (TartaricForgeRecipe recipe : recipeList) - recipes.add(new TartaricForgeRecipeJEI(recipe)); - - return recipes; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java rename to src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java index bafdcc27..f2c1ec2c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/WailaPluginBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java @@ -9,7 +9,8 @@ import mcp.mobius.waila.api.IWailaRegistrar; import mcp.mobius.waila.api.WailaPlugin; @WailaPlugin -public class WailaPluginBloodMagic implements IWailaPlugin { +public class BloodMagicHwylaPlugin implements IWailaPlugin { + @Override public void register(IWailaRegistrar registrar) { registrar.registerBodyProvider(new DataProviderBloodAltar(), BlockAltar.class); From 03fece58fa20e90bdf1d3e6bf7d267f2d0aa4596 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 8 Feb 2018 19:01:12 -0800 Subject: [PATCH 156/595] Rewrite Hwyla integration Now properly makes use of the API --- .../bloodmagic/apibutnotreally/Constants.java | 1 - .../compat/waila/BloodMagicHwylaPlugin.java | 36 +++++--- .../provider/DataProviderAlchemyArray.java | 41 ++++----- .../provider/DataProviderBloodAltar.java | 69 +++++++------- .../waila/provider/DataProviderBloodTank.java | 47 +++------- .../waila/provider/DataProviderMimic.java | 51 +++++----- .../DataProviderRitualController.java | 92 +++++++++---------- .../waila/provider/DataProviderTeleposer.java | 50 +++++----- .../assets/bloodmagic/lang/en_US.lang | 1 + 9 files changed, 187 insertions(+), 201 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java index 11d1830b..581a8fad 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java @@ -148,7 +148,6 @@ public class Constants { public static final String JEI_CATEGORY_ALCHEMYTABLE = BloodMagic.MODID + ":salchemyTable"; public static final String JEI_CATEGORY_ARMOURDOWNGRADE = BloodMagic.MODID + ":armourDowngrade"; - public static final String WAILA_CONFIG_BYPASS_SNEAK = BloodMagic.MODID + ".bypassSneak"; 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"; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java index f2c1ec2c..c5908b25 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.compat.waila; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.block.*; import WayofTime.bloodmagic.compat.waila.provider.*; +import WayofTime.bloodmagic.tile.*; import mcp.mobius.waila.api.IWailaPlugin; import mcp.mobius.waila.api.IWailaRegistrar; import mcp.mobius.waila.api.WailaPlugin; @@ -13,22 +13,30 @@ public class BloodMagicHwylaPlugin implements IWailaPlugin { @Override public void register(IWailaRegistrar registrar) { - registrar.registerBodyProvider(new DataProviderBloodAltar(), BlockAltar.class); - registrar.registerNBTProvider(new DataProviderBloodAltar(), BlockAltar.class); - registrar.registerBodyProvider(new DataProviderTeleposer(), BlockTeleposer.class); - registrar.registerBodyProvider(new DataProviderRitualController(), BlockRitualController.class); - registrar.registerBodyProvider(new DataProviderAlchemyArray(), BlockAlchemyArray.class); - registrar.registerBodyProvider(new DataProviderBloodTank(), BlockBloodTank.class); - registrar.registerNBTProvider(new DataProviderBloodTank(), BlockBloodTank.class); - registrar.registerStackProvider(new DataProviderAlchemyArray(), BlockAlchemyArray.class); - registrar.registerStackProvider(new DataProviderMimic(), BlockMimic.class); - registrar.registerNBTProvider(new DataProviderMimic(), BlockMimic.class); - - registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK, false); + registrar.registerBodyProvider(DataProviderBloodAltar.INSTANCE, TileAltar.class); + registrar.registerNBTProvider(DataProviderBloodAltar.INSTANCE, TileAltar.class); registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_ALTAR, 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.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_ARRAY, 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 index e3bd3c3e..3a38301f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -15,48 +15,41 @@ 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 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(TextHelper.getFormattedText(RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getLocalizedName())); } - @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - + @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.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { - TileEntity tile = accessor.getTileEntity(); - if (tile instanceof TileAlchemyArray) { - TileAlchemyArray tileArray = (TileAlchemyArray) tile; - if (!tileArray.getStackInSlot(0).isEmpty()) - currenttip.add(TextHelper.localize("waila.bloodmagic.array.reagent", tileArray.getStackInSlot(0).getDisplayName())); - - if (!tileArray.getStackInSlot(1).isEmpty()) - currenttip.add(TextHelper.localize("waila.bloodmagic.array.catalyst", tileArray.getStackInSlot(1).getDisplayName())); - } - } else { - currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); - } + 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; } - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - + @Nonnull @Override public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { - return null; + TileAlchemyArray alchemyArray = (TileAlchemyArray) te; + if (!alchemyArray.getStackInSlot(0).isEmpty()) + tag.setString("reagent", alchemyArray.getStackInSlot(0).getDisplayName()); + if (!alchemyArray.getStackInSlot(1).isEmpty()) + tag.setString("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 index 57282503..e50f80cf 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -19,6 +19,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import javax.annotation.Nonnull; import java.util.List; /** @@ -27,11 +28,35 @@ import java.util.List; * in ImLookingAtBlood by Pokefenn. */ public class DataProviderBloodAltar implements IWailaDataProvider { + + public static final IWailaDataProvider INSTANCE = new DataProviderBloodAltar(); + + @Nonnull @Override public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { if (!config.getConfig(Constants.Compat.WAILA_CONFIG_ALTAR)) return currenttip; + if (accessor.getNBTData().hasKey("altar")) { + NBTTagCompound altarData = accessor.getNBTData().getCompoundTag("altar"); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarTier", altarData.getInteger("tier"))); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarCapacity", altarData.getInteger("capacity"))); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentEssence", altarData.getInteger("stored"))); + + if (altarData.hasKey("charge")) { + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent", altarData.getInteger("progress") + "%")); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentCharge", altarData.getInteger("charge"))); + } + } + + return currenttip; + } + + @Nonnull + @Override + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + TileAltar altar = (TileAltar) te; + boolean hasSigil = false; boolean hasSeer = false; @@ -41,49 +66,31 @@ public class DataProviderBloodAltar implements IWailaDataProvider { break; } case SIGIL_HELD: { - hasSeer = holdingSeerSigil(accessor.getPlayer()); - hasSigil = hasSeer || holdingDivinationSigil(accessor.getPlayer()); + hasSeer = holdingSeerSigil(player); + hasSigil = hasSeer || holdingDivinationSigil(player); break; } case SIGIL_CONTAINED: { - hasSeer = hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), accessor.getPlayer()); - hasSigil = hasSeer || hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), accessor.getPlayer()); + hasSeer = hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), player); + hasSigil = hasSeer || hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), player); break; } } if (!hasSeer && !hasSigil) - return currenttip; + return tag; - if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { - if (accessor.getBlock() instanceof BlockAltar && accessor.getTileEntity() instanceof TileAltar) { - TileAltar altar = (TileAltar) accessor.getTileEntity(); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarTier", altar.getTier().toInt())); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarCapacity", altar.getCapacity())); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentEssence", altar.getCurrentBlood())); - - if (hasSeer) { - int charge = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_TOTAL_CHARGE); - int progress = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_PROGRESS); - int liquidRequired = accessor.getNBTData().getCompoundTag("bloodAltar").getInteger(Constants.NBT.ALTAR_LIQUID_REQ); - int craftAmount = 1; - if (accessor.getNBTData().getTagList("Items", 10).get(0).getId() == 10) - craftAmount = ((NBTTagCompound) accessor.getNBTData().getTagList("Items", 10).get(0)).getByte("Count"); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent", (int) (((double) progress / (double) liquidRequired * 100) / craftAmount) + "%")); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentCharge", charge)); - } - } - } else { - currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); + NBTTagCompound altarData = new NBTTagCompound(); + altarData.setInteger("tier", altar.getTier().toInt()); + altarData.setInteger("capacity", altar.getCapacity()); + altarData.setInteger("stored", altar.getCurrentBlood()); + if (hasSeer) { + altarData.setInteger("progress", (int) (((double) altar.getProgress() / (double) altar.getLiquidRequired() * 100) / altar.getStackInSlot(0).getCount())); + altarData.setInteger("charge", altar.getTotalCharge()); } - return currenttip; - } + tag.setTag("altar", altarData); - @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { - if (te != null) - te.writeToNBT(tag); return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index 1add88c3..477d2393 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.compat.waila.provider; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.block.BlockBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.util.helper.TextHelper; import mcp.mobius.waila.api.IWailaConfigHandler; @@ -15,54 +14,38 @@ 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 { - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } + 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; - if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { - if (accessor.getBlock() instanceof BlockBloodTank && accessor.getTileEntity() instanceof TileBloodTank) { - TileBloodTank bloodTank = (TileBloodTank) accessor.getTileEntity(); - NBTTagCompound tag = accessor.getNBTData(); - int capacity = accessor.getNBTData().getInteger(Constants.NBT.ALTAR_CAPACITY); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.tier", bloodTank.getBlockMetadata() + 1)); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity", capacity)); - - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag(Constants.NBT.TANK)); - if (fluidStack != null) { - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type", fluidStack.getLocalizedName())); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount", fluidStack.amount, capacity)); - } - } - } else { - currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); + 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; } - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - + @Nonnull @Override public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { - if (te != null) - te.writeToNBT(tag); + TileBloodTank tank = (TileBloodTank) te; + tag.setInteger("tier", tank.getBlockMetadata() + 1); + tag.setInteger("capacity", tank.capacity); + if (tank.getTank().getFluid() != null) + tag.setTag("fluid", tank.getTank().getFluid().writeToNBT(new NBTTagCompound())); 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 index 96594bde..3900f95e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java @@ -5,44 +5,53 @@ import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; 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; import java.util.List; public class DataProviderMimic implements IWailaDataProvider { + public static final IWailaDataProvider INSTANCE = new DataProviderMimic(); + + @Nonnull @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (accessor.getNBTData().getBoolean("hasItem")) - return new ItemStack(accessor.getNBTData()); + if (accessor.getNBTData().hasKey("mimiced")) { + NBTTagCompound 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 new ItemStack(accessor.getBlock(), 1, accessor.getMetadata()); - } - - @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - - @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; + return ret; + } + + return ItemStack.EMPTY; } + @Nonnull @Override public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { - if (te instanceof TileMimic && ((TileMimic) te).getStackInSlot(0) != null) { - tag.setBoolean("hasItem", true); - ((TileMimic) te).getStackInSlot(0).writeToNBT(tag); + TileMimic mimic = (TileMimic) te; + ItemStack mimiced = mimic.getStackInSlot(0); + if (!mimiced.isEmpty()) { + NBTTagCompound item = new NBTTagCompound(); + item.setString("id", mimiced.getItem().getRegistryName().toString()); + item.setInteger("data", mimiced.getMetadata()); + NBTTagCompound shareTag = mimiced.getItem().getNBTShareTag(mimiced); + if (shareTag != null) + item.setTag("nbt", shareTag); + + tag.setTag("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 index f60db24a..6769804e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -6,14 +6,12 @@ import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; -import WayofTime.bloodmagic.block.BlockRitualController; -import WayofTime.bloodmagic.tile.TileImperfectRitualStone; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.util.helper.TextHelper; +import joptsimple.internal.Strings; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; -import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -21,70 +19,64 @@ 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 { - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } + 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; - if (accessor.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { - if (accessor.getBlock() instanceof BlockRitualController) { - int controllerMeta = accessor.getBlock().getMetaFromState(accessor.getBlockState()); - - if ((controllerMeta == 0 || controllerMeta == 2) && accessor.getTileEntity() instanceof TileMasterRitualStone) { - TileMasterRitualStone mrs = (TileMasterRitualStone) accessor.getTileEntity(); - - if (mrs.getCurrentRitual() != null && mrs.isActive()) { - currenttip.add(TextHelper.localizeEffect(mrs.getCurrentRitual().getUnlocalizedName())); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromUUID(mrs.getOwner()))); - if (!RitualRegistry.ritualEnabled(mrs.getCurrentRitual())) - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.config.disabled")); - } else { - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.deactivated")); - } - } - - if (controllerMeta == 1 && accessor.getTileEntity() instanceof TileImperfectRitualStone) { - if (accessor.getWorld().isAirBlock(accessor.getPosition().up())) { - Block up = accessor.getWorld().getBlockState(accessor.getPosition().up()).getBlock(); - int meta = up.getMetaFromState(accessor.getWorld().getBlockState(accessor.getPosition().up())); - BlockStack blockStack = new BlockStack(up, meta); - ImperfectRitual ritual = ImperfectRitualRegistry.getRitualForBlock(blockStack); - - if (ritual != null) { - currenttip.add(TextHelper.localizeEffect(ritual.getUnlocalizedName())); - if (!ImperfectRitualRegistry.ritualEnabled(ritual)) - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.config.disabled")); - } - } - } - } + NBTTagCompound 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 { - currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); + 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; } - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - + @Nonnull @Override public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { - return null; + + if (te instanceof TileMasterRitualStone) { + TileMasterRitualStone mrs = (TileMasterRitualStone) te; + tag.setBoolean("master", true); + if (mrs.getCurrentRitual() != null) { + tag.setString("ritual", mrs.getCurrentRitual().getUnlocalizedName()); + tag.setBoolean("active", mrs.isActive()); + if (!Strings.isNullOrEmpty(mrs.getOwner())) + tag.setString("owner", PlayerHelper.getUsernameFromUUID(mrs.getOwner())); + tag.setBoolean("enabled", RitualRegistry.ritualEnabled(mrs.getCurrentRitual())); + } + } else { + tag.setBoolean("master", false); + + ImperfectRitual ritual = ImperfectRitualRegistry.getRitualForBlock(BlockStack.getStackFromPos(world, pos.up())); + if (ritual != null) { + tag.setString("ritual", ritual.getUnlocalizedName()); + tag.setBoolean("enabled", ImperfectRitualRegistry.ritualEnabled(ritual)); + } + } + + 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 index 2f7c4273..0463a22b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.compat.waila.provider; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.block.BlockTeleposer; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.tile.TileTeleposer; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -11,54 +10,49 @@ import mcp.mobius.waila.api.IWailaDataProvider; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +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 { - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } + 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.getPlayer().isSneaking() || config.getConfig(Constants.Compat.WAILA_CONFIG_BYPASS_SNEAK)) { - if (accessor.getBlock() instanceof BlockTeleposer && accessor.getTileEntity() instanceof TileTeleposer) { - TileTeleposer teleposer = (TileTeleposer) accessor.getTileEntity(); - if (!teleposer.getStackInSlot(0).isEmpty()) { - ItemStack contained = teleposer.getStackInSlot(0); - BlockPos toPos = ((ItemTelepositionFocus) contained.getItem()).getBlockPos(contained); - int dimensionID = contained.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID); + if (accessor.getNBTData().hasKey("focus")) { + NBTTagCompound 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.coords", toPos.getX(), toPos.getY(), toPos.getZ())); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", dimensionID)); - } - } - } else { - currenttip.add(TextHelper.localizeEffect("waila.bloodmagic.sneak")); + currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.bound", dimName, boundPos.getX(), boundPos.getY(), boundPos.getZ())); } return currenttip; } - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - @Override public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { - return null; + TileTeleposer teleposer = (TileTeleposer) te; + ItemStack contained = teleposer.getStackInSlot(0); + if (!contained.isEmpty() && contained.hasTagCompound()) { + ItemTelepositionFocus focus = (ItemTelepositionFocus) contained.getItem(); + NBTTagCompound focusData = new NBTTagCompound(); + focusData.setTag("pos", NBTUtil.createPosTag(focus.getBlockPos(contained))); + focusData.setInteger("dim", contained.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID)); + tag.setTag("focus", focusData); + } + return tag; } } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index b4ea222e..3482c754 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -469,6 +469,7 @@ 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 From aa5bf185526c00d34179e911892d851ac868f63c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 00:09:04 -0800 Subject: [PATCH 157/595] Fix version replacement --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 27fe1311..b11e08ca 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ minecraft { runDir = "run" replace "@VERSION@", project.version - replaceIn "Constants.java" + replaceIn "BloodMagic.java" clientRunArgs += "--username=${username}" From 47482b6add064ef87f13cf1b499ba5fd2bbc63ab Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 00:39:04 -0800 Subject: [PATCH 158/595] Javadoc the new API --- .../bloodmagic/api/BloodMagicPlugin.java | 4 ++ .../bloodmagic/api/IBloodMagicAPI.java | 34 +++++++++++-- .../bloodmagic/api/IBloodMagicBlacklist.java | 35 ++++++++++--- .../bloodmagic/api/IBloodMagicPlugin.java | 9 ++++ .../api/IBloodMagicRecipeRegistrar.java | 51 +++++++++++++++++++ .../api/IBloodMagicValueManager.java | 28 ++++++++++ .../api/impl/BloodMagicBlacklist.java | 3 -- .../api/impl/BloodMagicCorePlugin.java | 2 +- 8 files changed, 152 insertions(+), 14 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java index 04907dfa..0d2bf397 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java @@ -5,6 +5,10 @@ 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 { diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java index 9346d415..8817dd25 100644 --- a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java @@ -1,25 +1,53 @@ package WayofTime.bloodmagic.api; import net.minecraft.block.state.IBlockState; -import net.minecraft.util.ResourceLocation; import javax.annotation.Nonnull; +/** + * The main interface between a plugin and Blood Magic's internals. + */ public interface IBloodMagicAPI { /** - * Retrieves the instance of the blacklisting system that Blood Magic uses. + * Retrieves the instance of the blacklist. * - * @return the active blacklist instance + * @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); } diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java index 64ba641f..e99c1609 100644 --- a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java @@ -1,26 +1,47 @@ package WayofTime.bloodmagic.api; -import net.minecraft.block.Block; 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); - void addTeleposer(@Nonnull Block block); - + /** + * 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); - void addTransposition(@Nonnull Block block); - + /** + * 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); - void addGreenGrove(@Nonnull Block block); - + /** + * 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/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java index 450076db..78ac7036 100644 --- a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java @@ -1,6 +1,15 @@ 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 + * + * @param api The active instance of the {@link IBloodMagicAPI} + */ void register(IBloodMagicAPI api); } diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java index 07e25481..9320886d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java @@ -6,17 +6,68 @@ import net.minecraft.item.crafting.Ingredient; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; +/** + * 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 Ingredient} 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 Ingredient} array. + * + * @param input The input items to remove the recipe of. + * + * @return Whether or not a recipe was removed. + */ boolean removeTartaricForge(@Nonnull ItemStack... input); } diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java index 63676ebb..1f22de5a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java @@ -6,9 +6,37 @@ 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/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java index c07e979c..29fd1f49 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java @@ -32,7 +32,6 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { teleposer.add(state); } - @Override public void addTeleposer(@Nonnull Block block) { for (IBlockState state : block.getBlockState().getValidStates()) addTeleposer(state); @@ -50,7 +49,6 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { transposition.add(state); } - @Override public void addTransposition(@Nonnull Block block) { for (IBlockState state : block.getBlockState().getValidStates()) addTransposition(state); @@ -62,7 +60,6 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { greenGrove.add(state); } - @Override public void addGreenGrove(@Nonnull Block block) { for (IBlockState state : block.getBlockState().getValidStates()) addGreenGrove(state); diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 280caae4..c31010da 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -84,7 +84,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { RegistrarBloodMagicRecipes.registerTartaricForgeRecipes(api.getRecipeRegistrar()); } - private static void handleConfigValues(IBloodMagicAPI api) { + private static void handleConfigValues(BloodMagicAPI api) { for (String value : ConfigHandler.values.sacrificialValues) { String[] split = value.split(";"); if (split.length != 2) // Not valid format From 163fe864e51d29f86518a285bb1b512dfd9a0818 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 10:15:16 -0800 Subject: [PATCH 159/595] Soul Snares should not trigger on players. Especially not in a weird way (#1216) --- .../entity/projectile/EntitySoulSnare.java | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java index 2be580f8..f0a5ef66 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java @@ -10,6 +10,7 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; public class EntitySoulSnare extends EntityThrowable { + public EntitySoulSnare(World worldIn) { super(worldIn); } @@ -22,29 +23,21 @@ public class EntitySoulSnare extends EntityThrowable { super(worldIn, x, y, z); } - /** - * Called when this EntityThrowable hits a block or entity. - */ @Override protected void onImpact(RayTraceResult result) { - if (result.entityHit == this.getThrower() && this.ticksExisted < 20) { + if (result.entityHit == this.getThrower() || this.ticksExisted < 2 || getEntityWorld().isRemote) return; - } - if (result.entityHit != null && result.entityHit != this.getThrower()) { - if (result.entityHit instanceof EntityLivingBase && result.entityHit.getEntityWorld().rand.nextDouble() < 0.25) { + if (result.entityHit instanceof EntityLivingBase) { + if (result.entityHit.getEntityWorld().rand.nextDouble() < 0.25) ((EntityLivingBase) result.entityHit).addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_SNARE, 300, 0)); - } result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), (float) 0); } - for (int j = 0; j < 8; ++j) { + for (int j = 0; j < 8; ++j) this.getEntityWorld().spawnParticle(EnumParticleTypes.SNOWBALL, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D); - } - if (!this.getEntityWorld().isRemote) { - this.setDead(); - } + this.setDead(); } } \ No newline at end of file From 4b5f8a9685703c3745e8dbcde7ecf6507171651f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 10:16:09 -0800 Subject: [PATCH 160/595] Move entity registry to new Forge system --- .../bloodmagic/core/RegistrarBloodMagic.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 7a0c416d..54e3ca40 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -19,7 +19,7 @@ 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.EntityRegistry; +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; @@ -91,16 +91,19 @@ public class RegistrarBloodMagic { @SubscribeEvent public static void registerEntities(RegistryEvent.Register event) { int entities = 0; - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "blood_light"), EntityBloodLight.class, "BloodLight", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "soul_snare"), EntitySoulSnare.class, "SoulSnare", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "soul_arrow"), EntitySentientArrow.class, "SoulArrow", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "meteor"), EntityMeteor.class, "Meteor", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "sentient_specter"), EntitySentientSpecter.class, "SentientSpecter", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "mimic"), EntityMimic.class, "Mimic", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_zombie"), EntityCorruptedZombie.class, "CorruptedZombie", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_sheep"), EntityCorruptedSheep.class, "CorruptedSheep", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_chicken"), EntityCorruptedChicken.class, "CorruptedChicken", ++entities, BloodMagic.instance, 16 * 4, 3, true); - EntityRegistry.registerModEntity(new ResourceLocation(BloodMagic.MODID, "corrupted_spider"), EntityCorruptedSpider.class, "CorruptedSpider", ++entities, BloodMagic.instance, 16 * 4, 3, true); + + 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 From 123b06c28824c98024605b960568c242d3afd0d4 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 11:40:13 -0800 Subject: [PATCH 161/595] Alchemy arrays should mostly function now (#1202) Rewrites the crafting recipe portion of alchemy arrays. Currently the rewritten portion is wrapped in the old stuff. Ideally the remaining old stuff will be rewritten as well. Mods who wish to do custom array effects still need to depend on internal classes and I think this is fine. --- .../api/IBloodMagicRecipeRegistrar.java | 26 ++++++++- .../api/impl/BloodMagicCorePlugin.java | 1 + .../api/impl/BloodMagicRecipeRegistrar.java | 46 +++++++++++++++ .../api/impl/recipe/RecipeAlchemyArray.java | 53 +++++++++++++++++ .../AlchemyArrayEffectCraftingNew.java | 58 +++++++++++++++++++ .../registry/AlchemyArrayRecipeRegistry.java | 14 ++--- .../render/block/RenderAlchemyArray.java | 7 +++ .../core/RegistrarBloodMagicRecipes.java | 28 +++++++++ .../bloodmagic/registry/ModRecipes.java | 24 -------- .../bloodmagic/tile/TileAlchemyArray.java | 16 ++++- 10 files changed, 239 insertions(+), 34 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyArray.java create mode 100644 src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java index 9320886d..61123c52 100644 --- a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java @@ -2,9 +2,11 @@ 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. @@ -44,7 +46,7 @@ public interface IBloodMagicRecipeRegistrar { 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 Ingredient} array. + * Removes an Alchemy Table recipe based on an input {@link ItemStack} array. * * @param input The input items to remove the recipe of. * @@ -63,11 +65,31 @@ public interface IBloodMagicRecipeRegistrar { 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 Ingredient} array. + * 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); } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index c31010da..4d456f95 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -82,6 +82,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { RegistrarBloodMagicRecipes.registerAltarRecipes(api.getRecipeRegistrar()); RegistrarBloodMagicRecipes.registerAlchemyTableRecipes(api.getRecipeRegistrar()); RegistrarBloodMagicRecipes.registerTartaricForgeRecipes(api.getRecipeRegistrar()); + RegistrarBloodMagicRecipes.registerAlchemyArrayRecipes(api.getRecipeRegistrar()); } private static void handleConfigValues(BloodMagicAPI api) { diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index 9e23a462..470d1ba3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.api.impl; 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.RecipeTartaricForge; @@ -13,6 +14,7 @@ import com.google.common.collect.Sets; 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 javax.annotation.Nonnegative; @@ -26,11 +28,13 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { private final Set altarRecipes; private final Set alchemyRecipes; private final Set tartaricForgeRecipes; + private final Set alchemyArrayRecipes; public BloodMagicRecipeRegistrar() { this.altarRecipes = Sets.newHashSet(); this.alchemyRecipes = Sets.newHashSet(); this.tartaricForgeRecipes = Sets.newHashSet(); + this.alchemyArrayRecipes = Sets.newHashSet(); } @Override @@ -138,6 +142,31 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { 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); + } + @Nullable public RecipeBloodAltar getBloodAltar(@Nonnull ItemStack input) { Preconditions.checkNotNull(input, "input cannot be null."); @@ -201,6 +230,19 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { 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); } @@ -212,4 +254,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { public Set getTartaricForgeRecipes() { return ImmutableSet.copyOf(tartaricForgeRecipes); } + + public Set getAlchemyArrayRecipes() { + return ImmutableSet.copyOf(alchemyArrayRecipes); + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyArray.java new file mode 100644 index 00000000..02b4f153 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyArray.java @@ -0,0 +1,53 @@ +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; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class RecipeAlchemyArray { + + @Nonnull + private final Ingredient input; + @Nonnull + private final Ingredient catalyst; + @Nonnull + private final ItemStack output; + @Nonnull + private final ResourceLocation circleTexture; + + 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."); + + 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 Ingredient getInput() { + return input; + } + + @Nonnull + public Ingredient getCatalyst() { + return catalyst; + } + + @Nonnull + public ItemStack getOutput() { + return output; + } + + @Nonnull + public ResourceLocation getCircleTexture() { + return circleTexture; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java new file mode 100644 index 00000000..076c049d --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java @@ -0,0 +1,58 @@ +package WayofTime.bloodmagic.apibutnotreally.alchemyCrafting; + +import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +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(); + + EntityItem outputEntity = new EntityItem(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(NBTTagCompound tag) { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + + } + + @Override + public AlchemyArrayEffect getNewCopy() { + return new AlchemyArrayEffectCraftingNew(key, recipe); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java index fd939ba5..06370e71 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java @@ -17,7 +17,7 @@ import java.util.List; import java.util.Map.Entry; public class AlchemyArrayRecipeRegistry { - public static final AlchemyCircleRenderer defaultRenderer = new AlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BaseArray.png")); + 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(); @@ -56,7 +56,7 @@ public class AlchemyArrayRecipeRegistry { } } - recipes.put(input, new AlchemyArrayRecipe(input, catalystStack, arrayEffect, circleRenderer == null ? defaultRenderer : circleRenderer)); + recipes.put(input, new AlchemyArrayRecipe(input, catalystStack, arrayEffect, circleRenderer == null ? DEFAULT_RENDERER : circleRenderer)); } public static AlchemyArrayEffect getAlchemyArrayEffect(String key) { @@ -136,7 +136,7 @@ public class AlchemyArrayRecipeRegistry { } public static void registerRecipe(ItemStack inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { - AlchemyCircleRenderer circleRenderer = arrayResource == null ? defaultRenderer : new AlchemyCircleRenderer(arrayResource); + AlchemyCircleRenderer circleRenderer = arrayResource == null ? DEFAULT_RENDERER : new AlchemyCircleRenderer(arrayResource); registerRecipe(Collections.singletonList(inputStacks), catalystStack, arrayEffect, circleRenderer); } @@ -145,12 +145,12 @@ public class AlchemyArrayRecipeRegistry { } public static void registerRecipe(List inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { - AlchemyCircleRenderer circleRenderer = arrayResource == null ? defaultRenderer : new AlchemyCircleRenderer(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 ? defaultRenderer : new AlchemyCircleRenderer(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); } @@ -185,7 +185,7 @@ public class AlchemyArrayRecipeRegistry { for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { AlchemyArrayRecipe arrayRecipe = entry.getValue(); if (input.size() == 1 && arrayRecipe.getInput().size() == 1) { - if (ItemStackWrapper.getHolder(arrayRecipe.getInput().get(0)).equals(ItemStackWrapper.getHolder(input.get(0)))) { + if (ItemStack.areItemsEqual(input.get(0), arrayRecipe.input.get(0))) { AlchemyArrayEffect effect = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); if (effect != null) { return effect.getNewCopy(); @@ -220,7 +220,7 @@ public class AlchemyArrayRecipeRegistry { } } - return defaultRenderer; + return DEFAULT_RENDERER; } public static AlchemyCircleRenderer getAlchemyCircleRenderer(ItemStack itemStack, @Nullable ItemStack catalystStack) { 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 a886a981..023db61e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.client.render.block; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.tile.TileAlchemyArray; @@ -13,6 +15,11 @@ public class RenderAlchemyArray extends TileEntitySpecialRenderer 0 ? craftTime + partialTicks : 0)); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index e0d3d6e3..aeeefd25 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -7,6 +7,7 @@ import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.block.BlockLifeEssence; +import WayofTime.bloodmagic.item.ItemComponent; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.soul.ItemSoulGem; import WayofTime.bloodmagic.item.types.ComponentTypes; @@ -139,4 +140,31 @@ public class RegistrarBloodMagicRecipes { 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); } + + public static void registerAlchemyArrayRecipes(BloodMagicRecipeRegistrar registrar) { + registrar.addAlchemyArray(new ItemStack(Items.REDSTONE), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); + + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_WATER), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_LAVA), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LavaSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_AIR), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/AirSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_VOID), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/VoidSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/GrowthSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ElementalAffinitySigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LightSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MagnetismSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SuppressionSigil.png")); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_HASTE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TRANSPOSITION), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_CLAW), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_CLAW), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_BOUNCE), null); + registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_FROST), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FROST), null); + + } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index df3172e8..06dd3e5d 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -82,30 +82,6 @@ public class ModRecipes { AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_LEGGINGS), new AlchemyArrayEffectBinding("livingLegs", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS))); AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_BOOTS), new AlchemyArrayEffectBinding("livingBoots", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS))); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(new ItemStack(Items.REDSTONE), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); - - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_WATER), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_LAVA), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LavaSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AIR), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/AirSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_VOID), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/VoidSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/GrowthSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ElementalAffinitySigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LightSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MagnetismSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SuppressionSigil.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HASTE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TRANSPOSITION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_CLAW), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_CLAW), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_BOUNCE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FROST), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FROST), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); - 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"))); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 39d77472..2fddf46c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffectCraftingNew; import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; import net.minecraft.block.state.IBlockState; @@ -107,7 +110,18 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } } } else { - return false; + RecipeAlchemyArray recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArray(getStackInSlot(0), getStackInSlot(1)); + if (recipe == null) + return false; + + AlchemyArrayEffect newEffect = new AlchemyArrayEffectCraftingNew(recipe); + if (arrayEffect == null) { + arrayEffect = newEffect; + key = newEffect.key; + } else if (!newEffect.key.equals(key)) { + arrayEffect = newEffect; + key = newEffect.key; + } } if (arrayEffect != null) { From f974f44aeb343a222074b26d7c615e118cfdd9f6 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 11:53:45 -0800 Subject: [PATCH 162/595] Fixup Alchemy Array JEI compat --- .../compat/jei/BloodMagicJEIPlugin.java | 11 +++--- .../AlchemyArrayCraftingCategory.java | 2 +- .../AlchemyArrayCraftingRecipeHandler.java | 31 --------------- .../AlchemyArrayCraftingRecipeJEI.java | 21 +++++----- .../AlchemyArrayCraftingRecipeMaker.java | 39 ------------------- 5 files changed, 16 insertions(+), 88 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index 8a0ed800..e6c26b9a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.compat.jei; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; import WayofTime.bloodmagic.apibutnotreally.Constants; @@ -8,11 +9,9 @@ import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.client.gui.GuiSoulForge; import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingCategory; -import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingRecipeHandler; -import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingRecipeMaker; +import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingRecipeJEI; import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeCategory; import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeHandler; -import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeJEI; import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeMaker; import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeCategory; import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeJEI; @@ -34,7 +33,7 @@ import javax.annotation.Nonnull; import java.util.Map; @JEIPlugin -public class BloodMagicJEIPlugin extends BlankModPlugin { +public class BloodMagicJEIPlugin implements IModPlugin { public static IJeiHelpers jeiHelper; @Override @@ -43,19 +42,19 @@ public class BloodMagicJEIPlugin extends BlankModPlugin { registry.addRecipeHandlers( new BindingRecipeHandler(), - new AlchemyArrayCraftingRecipeHandler(), new AlchemyTableRecipeHandler(), new ArmourDowngradeRecipeHandler() ); 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.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.addRecipes(BindingRecipeMaker.getRecipes()); - registry.addRecipes(AlchemyArrayCraftingRecipeMaker.getRecipes()); registry.addRecipes(AlchemyTableRecipeMaker.getRecipes()); registry.addRecipes(ArmourDowngradeRecipeMaker.getRecipes()); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java index dbb41825..c026c81f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java @@ -63,7 +63,7 @@ public class AlchemyArrayCraftingCategory implements IRecipeCategory { 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(ingredients.getInputs(ItemStack.class).size() - 1)); + recipeLayout.getItemStacks().set(CATALYST_SLOT, ingredients.getInputs(ItemStack.class).get(1)); recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java deleted file mode 100644 index f05a4cbd..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.alchemyArray; - -import WayofTime.bloodmagic.apibutnotreally.Constants; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; - -import javax.annotation.Nonnull; - -public class AlchemyArrayCraftingRecipeHandler implements IRecipeHandler { - @Nonnull - @Override - public Class getRecipeClass() { - return AlchemyArrayCraftingRecipeJEI.class; - } - - @Override - public String getRecipeCategoryUid(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) { - return Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY; - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) { - return recipe; - } - - @Override - public boolean isRecipeValid(@Nonnull AlchemyArrayCraftingRecipeJEI recipe) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java index 9cd323b9..fe451eb0 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java @@ -1,35 +1,34 @@ 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.BlankRecipeWrapper; +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 extends BlankRecipeWrapper { +public class AlchemyArrayCraftingRecipeJEI implements IRecipeWrapper { @Nonnull private final List inputs; @Nullable - private final ItemStack catalyst; + private final List catalyst; @Nonnull private final ItemStack output; - public AlchemyArrayCraftingRecipeJEI(@Nonnull List input, @Nullable ItemStack catalyst, @Nonnull ItemStack output) { - this.inputs = input; - this.catalyst = catalyst; - this.output = output; - } - - public ItemStack getCatalyst() { - return catalyst; + 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, Lists.newArrayList(catalyst))); + ingredients.setInputLists(ItemStack.class, Lists.newArrayList(inputs, catalyst)); ingredients.setOutput(ItemStack.class, output); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java deleted file mode 100644 index 3d95e801..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeMaker.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.alchemyArray; - -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffectCrafting; -import WayofTime.bloodmagic.apibutnotreally.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 AlchemyArrayCraftingRecipeMaker { - @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 AlchemyArrayEffectCrafting) { - ItemStack output = ((AlchemyArrayEffectCrafting) itemStackAlchemyArrayRecipeEntry.getValue().getAlchemyArrayEffectForCatalyst(catalyst)).outputStack; - - AlchemyArrayCraftingRecipeJEI recipe = new AlchemyArrayCraftingRecipeJEI(input, catalyst, output); - recipes.add(recipe); - } - } - } - - return recipes; - } -} From ab09b4f052cd71cd980c3e702177411a30033c29 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 11:59:59 -0800 Subject: [PATCH 163/595] Update changelog + version --- changelog.txt | 18 ++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 4f8003c5..745d9e7b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,21 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 239d79e2..a30fcbb6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.1 +mod_version=2.2.2 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From beb71e4c41baac0afc09ad398a799530e3cae7dd Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 12:02:44 -0800 Subject: [PATCH 164/595] Include a dummied version of the alchemy table recipe method so it builds --- .../WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index aeeefd25..79430210 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -85,6 +85,10 @@ public class RegistrarBloodMagicRecipes { registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getScribeStack(), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); } + public static void registerAlchemyTableRecipes(BloodMagicRecipeRegistrar registrar) { + + } + 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"); From 33d6cdb3a9f96cef598ef32415ffe1ae5b8ae107 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 14:43:00 -0800 Subject: [PATCH 165/595] Fix mundane component being really really really thirsty (#1218) --- .../render/entity/RenderEntityBloodLight.java | 4 +- .../guideapi/book/CategoryArchitect.java | 38 ++--- .../core/RegistrarBloodMagicRecipes.java | 93 +++++++++--- .../bloodmagic/fuel/FuelHandler.java | 4 +- .../bloodmagic/item/ItemComponent.java | 137 ------------------ .../item/armour/ItemLivingArmour.java | 4 +- .../bloodmagic/registry/ModRecipes.java | 112 +++++++------- .../bloodmagic/ritual/RitualCobblestone.java | 4 +- 8 files changed, 154 insertions(+), 242 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemComponent.java diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java index 5d74c644..64430836 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import WayofTime.bloodmagic.item.ItemComponent; +import WayofTime.bloodmagic.item.types.ComponentTypes; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderItem; @@ -26,7 +26,7 @@ public class RenderEntityBloodLight extends Render { GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); GlStateManager.rotate(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); this.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); - this.renderItem.renderItem(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), ItemCameraTransforms.TransformType.GROUND); + this.renderItem.renderItem(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), ItemCameraTransforms.TransformType.GROUND); GlStateManager.disableRescaleNormal(); GlStateManager.popMatrix(); super.doRender(entity, x, y, z, entityYaw, partialTicks); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index b623e8a6..599800cc 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -12,7 +12,7 @@ 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.item.ItemComponent; +import WayofTime.bloodmagic.item.types.ComponentTypes; import WayofTime.bloodmagic.util.helper.RecipeHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import amerifrance.guideapi.api.IPage; @@ -140,7 +140,7 @@ public class CategoryArchitect { List waterPages = new ArrayList(); - TartaricForgeRecipe waterRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_WATER)); + TartaricForgeRecipe waterRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_WATER.getStack()); if (waterRecipe != null) { waterPages.add(new PageTartaricForgeRecipe(waterRecipe)); } @@ -155,7 +155,7 @@ public class CategoryArchitect { List lavaPages = new ArrayList(); - TartaricForgeRecipe lavaRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_LAVA)); + TartaricForgeRecipe lavaRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_LAVA.getStack()); if (lavaRecipe != null) { lavaPages.add(new PageTartaricForgeRecipe(lavaRecipe)); } @@ -220,7 +220,7 @@ public class CategoryArchitect { List holdingPages = new ArrayList(); - TartaricForgeRecipe holdingRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING)); + TartaricForgeRecipe holdingRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_HOLDING.getStack()); if (holdingRecipe != null) { holdingPages.add(new PageTartaricForgeRecipe(holdingRecipe)); } @@ -235,7 +235,7 @@ public class CategoryArchitect { List airPages = new ArrayList(); - TartaricForgeRecipe airRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_AIR)); + TartaricForgeRecipe airRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_AIR.getStack()); if (airRecipe != null) { airPages.add(new PageTartaricForgeRecipe(airRecipe)); } @@ -250,7 +250,7 @@ public class CategoryArchitect { List voidPages = new ArrayList(); - TartaricForgeRecipe voidRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_VOID)); + TartaricForgeRecipe voidRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_VOID.getStack()); if (voidRecipe != null) { voidPages.add(new PageTartaricForgeRecipe(voidRecipe)); } @@ -265,7 +265,7 @@ public class CategoryArchitect { List greenGrovePages = new ArrayList(); - TartaricForgeRecipe greenGroveRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH)); + TartaricForgeRecipe greenGroveRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_GROWTH.getStack()); if (greenGroveRecipe != null) { greenGrovePages.add(new PageTartaricForgeRecipe(greenGroveRecipe)); } @@ -280,7 +280,7 @@ public class CategoryArchitect { List fastMinerPages = new ArrayList(); - TartaricForgeRecipe fastMinerRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER)); + TartaricForgeRecipe fastMinerRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_FAST_MINER.getStack()); if (fastMinerRecipe != null) { fastMinerPages.add(new PageTartaricForgeRecipe(fastMinerRecipe)); } @@ -295,7 +295,7 @@ public class CategoryArchitect { List seerPages = new ArrayList(); - TartaricForgeRecipe seerRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT)); + TartaricForgeRecipe seerRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SIGHT.getStack()); if (seerRecipe != null) { seerPages.add(new PageTartaricForgeRecipe(seerRecipe)); } @@ -340,7 +340,7 @@ public class CategoryArchitect { List affinityPages = new ArrayList(); - TartaricForgeRecipe affinityRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY)); + TartaricForgeRecipe affinityRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_AFFINITY.getStack()); if (affinityRecipe != null) { affinityPages.add(new PageTartaricForgeRecipe(affinityRecipe)); } @@ -355,7 +355,7 @@ public class CategoryArchitect { List lampPages = new ArrayList(); - TartaricForgeRecipe lampRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT)); + TartaricForgeRecipe lampRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack()); if (lampRecipe != null) { lampPages.add(new PageTartaricForgeRecipe(lampRecipe)); } @@ -370,7 +370,7 @@ public class CategoryArchitect { List magnetismPages = new ArrayList(); - TartaricForgeRecipe magnetismRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM)); + TartaricForgeRecipe magnetismRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_MAGNETISM.getStack()); if (magnetismRecipe != null) { magnetismPages.add(new PageTartaricForgeRecipe(magnetismRecipe)); } @@ -395,7 +395,7 @@ public class CategoryArchitect { List livingArmourPages = new ArrayList(); - TartaricForgeRecipe bindingRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_BINDING)); + TartaricForgeRecipe bindingRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BINDING.getStack()); if (bindingRecipe != null) { livingArmourPages.add(new PageTartaricForgeRecipe(bindingRecipe)); } @@ -535,7 +535,7 @@ public class CategoryArchitect { List suppressionPages = new ArrayList(); - TartaricForgeRecipe suppressionRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION)); + TartaricForgeRecipe suppressionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SUPPRESSION.getStack()); if (suppressionRecipe != null) { suppressionPages.add(new PageTartaricForgeRecipe(suppressionRecipe)); } @@ -550,7 +550,7 @@ public class CategoryArchitect { List hastePages = new ArrayList(); - TartaricForgeRecipe hasteRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_HASTE)); + TartaricForgeRecipe hasteRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_HASTE.getStack()); if (hasteRecipe != null) { hastePages.add(new PageTartaricForgeRecipe(hasteRecipe)); } @@ -565,7 +565,7 @@ public class CategoryArchitect { List severancePages = new ArrayList(); - TartaricForgeRecipe severanceRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE)); + TartaricForgeRecipe severanceRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SEVERANCE.getStack()); if (severanceRecipe != null) { severancePages.add(new PageTartaricForgeRecipe(severanceRecipe)); } @@ -580,7 +580,7 @@ public class CategoryArchitect { List telepositionPages = new ArrayList(); - TartaricForgeRecipe telepositionRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION)); + TartaricForgeRecipe telepositionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_TELEPOSITION.getStack()); if (telepositionRecipe != null) { telepositionPages.add(new PageTartaricForgeRecipe(telepositionRecipe)); } @@ -595,7 +595,7 @@ public class CategoryArchitect { List compressionPages = new ArrayList(); - TartaricForgeRecipe compressionRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION)); + TartaricForgeRecipe compressionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_COMPRESSION.getStack()); if (compressionRecipe != null) { compressionPages.add(new PageTartaricForgeRecipe(compressionRecipe)); } @@ -610,7 +610,7 @@ public class CategoryArchitect { List bridgePages = new ArrayList(); - TartaricForgeRecipe bridgeRecipe = RecipeHelper.getForgeRecipeForOutput(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE)); + TartaricForgeRecipe bridgeRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BRIDGE.getStack()); if (bridgeRecipe != null) { bridgePages.add(new PageTartaricForgeRecipe(bridgeRecipe)); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 79430210..48937522 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -7,10 +7,11 @@ import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.block.BlockLifeEssence; -import WayofTime.bloodmagic.item.ItemComponent; 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 com.google.common.collect.Sets; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -27,6 +28,9 @@ import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreIngredient; import net.minecraftforge.oredict.ShapelessOreRecipe; +import java.util.List; +import java.util.Set; + @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class RegistrarBloodMagicRecipes { @@ -86,7 +90,52 @@ public class RegistrarBloodMagicRecipes { } 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.getStack(ItemCuttingFluid.EXPLOSIVE), 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, ComponentTypes.SALTPETER.getStack(), ComponentTypes.SULFUR.getStack(), 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.getStack(ItemCuttingFluid.BASIC), 1000, 400, 1, "dustCoal", "gunpowder", Items.REDSTONE, Items.SUGAR, ComponentTypes.PLANT_OIL.getStack(), new ItemStack(Items.POTIONITEM)); + registrar.addAlchemyTable(ComponentTypes.SAND_IRON.getStack(2), 400, 200, 1, "oreIron", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); + registrar.addAlchemyTable(ComponentTypes.SAND_GOLD.getStack(2), 400, 200, 1, "oreGold", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); + registrar.addAlchemyTable(new ItemStack(Items.REDSTONE, 8), 400, 200, 1, "oreRedstone", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); + registrar.addAlchemyTable(new ItemStack(Blocks.GRAVEL), 50, 50, 1, "cobblestone", ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE)); + registrar.addAlchemyTable(new ItemStack(Blocks.SAND), 50, 50, 1, Blocks.GRAVEL, ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE)); + 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.getStack(ItemLivingArmourPointsUpgrade.DRAFT_ANGELUS), 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, new ItemStack(Items.POTIONITEM), "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.getStack(ItemCuttingFluid.BASIC)); + addedOreRecipeList.add(ore); + } + } + } } public static void registerTartaricForgeRecipes(BloodMagicRecipeRegistrar registrar) { @@ -148,27 +197,27 @@ public class RegistrarBloodMagicRecipes { public static void registerAlchemyArrayRecipes(BloodMagicRecipeRegistrar registrar) { registrar.addAlchemyArray(new ItemStack(Items.REDSTONE), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_WATER), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_LAVA), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LavaSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_AIR), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/AirSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_VOID), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/VoidSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/GrowthSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ElementalAffinitySigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LightSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MagnetismSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SuppressionSigil.png")); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_HASTE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TRANSPOSITION), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_CLAW), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_CLAW), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_BOUNCE), null); - registrar.addAlchemyArray(ItemComponent.getStack(ItemComponent.REAGENT_FROST), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FROST), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_WATER.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_LAVA.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LavaSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_AIR.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/AirSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_FAST_MINER.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_VOID.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/VoidSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_GROWTH.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/GrowthSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_AFFINITY.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ElementalAffinitySigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_SIGHT.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_HOLDING.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LightSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_MAGNETISM.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MagnetismSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_SUPPRESSION.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SuppressionSigil.png")); + registrar.addAlchemyArray(ComponentTypes.REAGENT_HASTE.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_BRIDGE.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_COMPRESSION.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_SEVERANCE.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_TELEPOSITION.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_TRANSPOSITION.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TRANSPOSITION), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_CLAW.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_CLAW), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_BOUNCE.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_BOUNCE), null); + registrar.addAlchemyArray(ComponentTypes.REAGENT_FROST.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FROST), null); } } diff --git a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java index aae512d7..29b01c00 100644 --- a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java +++ b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.fuel; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.ItemComponent; +import WayofTime.bloodmagic.item.types.ComponentTypes; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.IFuelHandler; public class FuelHandler implements IFuelHandler { @Override public int getBurnTime(ItemStack fuel) { - if (fuel != null && fuel.getItem() == RegistrarBloodMagicItems.COMPONENT && fuel.getMetadata() == ItemComponent.getStack(ItemComponent.SAND_COAL).getMetadata()) { + if (fuel != null && fuel.getItem() == RegistrarBloodMagicItems.COMPONENT && fuel.getMetadata() == ComponentTypes.SAND_COAL.ordinal()) { return 1600; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java b/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java deleted file mode 100644 index 4363715e..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemComponent.java +++ /dev/null @@ -1,137 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; - -public class ItemComponent extends Item implements IVariantProvider { - public static final String REAGENT_WATER = "reagentWater"; - public static final String REAGENT_LAVA = "reagentLava"; - public static final String REAGENT_AIR = "reagentAir"; - public static final String REAGENT_FASTMINER = "reagentFastMiner"; - public static final String REAGENT_VOID = "reagentVoid"; - public static final String REAGENT_GROWTH = "reagentGrowth"; - public static final String REAGENT_AFFINITY = "reagentAffinity"; - public static final String REAGENT_SIGHT = "reagentSight"; - public static final String REAGENT_BINDING = "reagentBinding"; - public static final String REAGENT_SUPPRESSION = "reagentSuppression"; - public static final String COMPONENT_FRAME_PART = "frameParts"; - public static final String REAGENT_BLOODLIGHT = "reagentBloodLight"; - public static final String REAGENT_MAGNETISM = "reagentMagnetism"; - public static final String REAGENT_HASTE = "reagentHaste"; - public static final String REAGENT_COMPRESSION = "reagentCompression"; - public static final String REAGENT_BRIDGE = "reagentBridge"; - public static final String REAGENT_SEVERANCE = "reagentSeverance"; - public static final String REAGENT_TELEPOSITION = "reagentTeleposition"; - public static final String REAGENT_TRANSPOSITION = "reagentTransposition"; - public static final String SAND_IRON = "ironSand"; - public static final String SAND_GOLD = "goldSand"; - public static final String SAND_COAL = "coalSand"; - public static final String PLANT_OIL = "plantOil"; - public static final String SULFUR = "sulfur"; - public static final String SALTPETER = "saltpeter"; - public static final String NEURO_TOXIN = "neurotoxin"; - public static final String ANTISEPTIC = "antiseptic"; - public static final String REAGENT_HOLDING = "reagentHolding"; - public static final String CATALYST_LENGTH_1 = "mundaneLength"; - public static final String CATALYST_POWER_1 = "mundanePower"; - public static final String REAGENT_CLAW = "reagentClaw"; - public static final String REAGENT_BOUNCE = "reagentBounce"; - public static final String REAGENT_FROST = "reagentFrost"; - private static ArrayList names = new ArrayList(); - - public ItemComponent() { - super(); - - setUnlocalizedName(BloodMagic.MODID + ".baseComponent."); - setHasSubtypes(true); - setCreativeTab(BloodMagic.TAB_BM); - - buildItemList(); - } - - private void buildItemList() { - names.add(0, REAGENT_WATER); - names.add(1, REAGENT_LAVA); - names.add(2, REAGENT_AIR); - names.add(3, REAGENT_FASTMINER); - names.add(4, REAGENT_VOID); - names.add(5, REAGENT_GROWTH); - names.add(6, REAGENT_AFFINITY); - names.add(7, REAGENT_SIGHT); - names.add(8, REAGENT_BINDING); - names.add(9, REAGENT_SUPPRESSION); - names.add(10, COMPONENT_FRAME_PART); - names.add(11, REAGENT_BLOODLIGHT); - names.add(12, REAGENT_MAGNETISM); - names.add(13, REAGENT_HASTE); - names.add(14, REAGENT_COMPRESSION); - names.add(15, REAGENT_BRIDGE); - names.add(16, REAGENT_SEVERANCE); - names.add(17, REAGENT_TELEPOSITION); - names.add(18, REAGENT_TRANSPOSITION); - names.add(19, SAND_IRON); - names.add(20, SAND_GOLD); - names.add(21, SAND_COAL); - names.add(22, PLANT_OIL); - names.add(23, SULFUR); - names.add(24, SALTPETER); - names.add(25, NEURO_TOXIN); - names.add(26, ANTISEPTIC); - names.add(27, REAGENT_HOLDING); - names.add(28, CATALYST_LENGTH_1); - names.add(29, CATALYST_POWER_1); - names.add(30, REAGENT_CLAW); - names.add(31, REAGENT_BOUNCE); - names.add(32, REAGENT_FROST); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names.get(stack.getItemDamage()); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.size(); i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - for (String name : names) - ret.add(new ImmutablePair(names.indexOf(name), "type=" + name)); - return ret; - } - - public static ItemStack getStack(String name) { - return new ItemStack(RegistrarBloodMagicItems.COMPONENT, 1, names.indexOf(name)); - } - - public static ItemStack getStack(String key, int stackSize) { - ItemStack stack = getStack(key); - stack.setCount(stackSize); - - return stack; - } - - public static ArrayList getNames() { - return names; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 2f84dc7b..e0ba0d32 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -9,7 +9,7 @@ import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.ItemComponent; +import WayofTime.bloodmagic.item.types.ComponentTypes; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerRepairing; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeElytra; @@ -97,7 +97,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ItemStack.areItemsEqual(repair, ItemComponent.getStack(ItemComponent.REAGENT_BINDING)); + return ItemStack.areItemsEqual(repair, ComponentTypes.REAGENT_BINDING.getStack()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 06dd3e5d..db223ce5 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -15,9 +15,9 @@ import WayofTime.bloodmagic.compress.StorageBlockCraftingManager; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.ItemComponent; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; +import WayofTime.bloodmagic.item.types.ComponentTypes; import WayofTime.bloodmagic.livingArmour.downgrade.*; import WayofTime.bloodmagic.potion.BMPotionUtils; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableDyeableRecipe; @@ -42,8 +42,8 @@ import java.util.Map.Entry; public class ModRecipes { public static ArrayList addedOreRecipeList = new ArrayList(); - static ItemStack mundaneLengtheningStack = ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1); - static ItemStack mundanePowerStack = ItemComponent.getStack(ItemComponent.CATALYST_POWER_1); + static ItemStack mundaneLengtheningStack = ComponentTypes.CATALYST_LENGTH_1.getStack(); + static ItemStack mundanePowerStack = ComponentTypes.CATALYST_POWER_1.getStack(); public static void init() { initOreDict(); @@ -58,14 +58,14 @@ public class ModRecipes { } public static void initOreDict() { - OreDictionary.registerOre("dustIron", ItemComponent.getStack(ItemComponent.SAND_IRON)); - OreDictionary.registerOre("dustGold", ItemComponent.getStack(ItemComponent.SAND_GOLD)); - OreDictionary.registerOre("dustCoal", ItemComponent.getStack(ItemComponent.SAND_COAL)); + OreDictionary.registerOre("dustIron", ComponentTypes.SAND_IRON.getStack()); + OreDictionary.registerOre("dustGold", ComponentTypes.SAND_GOLD.getStack()); + OreDictionary.registerOre("dustCoal", ComponentTypes.SAND_COAL.getStack()); } public static void addFurnaceRecipes() { - FurnaceRecipes.instance().addSmeltingRecipe(ItemComponent.getStack(ItemComponent.SAND_IRON), new ItemStack(Items.IRON_INGOT), (float) 0.15); - FurnaceRecipes.instance().addSmeltingRecipe(ItemComponent.getStack(ItemComponent.SAND_GOLD), new ItemStack(Items.GOLD_INGOT), (float) 0.15); + 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() { @@ -73,14 +73,14 @@ public class ModRecipes { } public static void addAlchemyArrayRecipes() { - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_SWORD), new AlchemyArrayEffectBinding("boundSword", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD))), new BindingAlchemyCircleRenderer()); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_AXE), new AlchemyArrayEffectBinding("boundAxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_PICKAXE), new AlchemyArrayEffectBinding("boundPickaxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.DIAMOND_SHOVEL), new AlchemyArrayEffectBinding("boundShovel", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_HELMET), new AlchemyArrayEffectBinding("livingHelmet", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_CHESTPLATE), new AlchemyArrayEffectBinding("livingChest", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_LEGGINGS), new AlchemyArrayEffectBinding("livingLegs", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS))); - AlchemyArrayRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), new ItemStack(Items.IRON_BOOTS), new AlchemyArrayEffectBinding("livingBoots", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS))); + 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"))); @@ -89,7 +89,7 @@ public class ModRecipes { 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(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), new ItemStack(Items.IRON_PICKAXE), new AlchemyArrayEffectSigil("fastMiner", (ISigil) RegistrarBloodMagicItems.SIGIL_FAST_MINER), new SingleAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png"))); + 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"))); } @@ -118,32 +118,32 @@ public class ModRecipes { TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SHOVEL), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_SHOVEL)); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_BOW), 70, 0, new ItemStack(Items.BOW), new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "string", "string"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), 0, 0, "dustRedstone", "dyeWhite", "gunpowder", Items.COAL); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_WATER), 10, 3, new ItemStack(Items.SUGAR), new ItemStack(Items.WATER_BUCKET), new ItemStack(Items.WATER_BUCKET)); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_LAVA), 32, 10, Items.LAVA_BUCKET, "dustRedstone", "cobblestone", "blockCoal"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_VOID), 64, 10, Items.BUCKET, "string", "string", "gunpowder"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_GROWTH), 128, 20, "treeSapling", "treeSapling", "sugarcane", Items.SUGAR); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AIR), 128, 20, Items.GHAST_TEAR, "feather", "feather"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SIGHT), 64, 0, RegistrarBloodMagicItems.SIGIL_DIVINATION, "blockGlass", "blockGlass", "dustGlowstone"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HOLDING), 64, 20, "chestWood", "leather", "string", "string"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FASTMINER), 128, 10, Items.IRON_PICKAXE, Items.IRON_AXE, Items.IRON_SHOVEL, Items.GUNPOWDER); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_AFFINITY), 300, 30, RegistrarBloodMagicItems.SIGIL_WATER, RegistrarBloodMagicItems.SIGIL_AIR, RegistrarBloodMagicItems.SIGIL_LAVA, Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SUPPRESSION), 500, 50, RegistrarBloodMagicBlocks.TELEPOSER, Items.WATER_BUCKET, Items.LAVA_BUCKET, Items.BLAZE_ROD); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BINDING), 400, 10, "dustGlowstone", "dustRedstone", "nuggetGold", Items.GUNPOWDER); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), 300, 10, "glowstone", Blocks.TORCH, "dustRedstone", "dustRedstone"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_MAGNETISM), 600, 10, "string", "ingotGold", "blockIron", "ingotGold"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_HASTE), 1400, 100, Items.COOKIE, Items.SUGAR, Items.COOKIE, "stone"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BRIDGE), 600, 50, Blocks.SOUL_SAND, Blocks.SOUL_SAND, "stone", Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_SEVERANCE), 800, 70, Items.ENDER_EYE, Items.ENDER_PEARL, "ingotGold", "ingotGold"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_COMPRESSION), 2000, 200, "blockIron", "blockGold", Blocks.OBSIDIAN, "cobblestone"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "glowstone", "blockRedstone", "ingotGold"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "gemDiamond", Items.ENDER_PEARL, Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_CLAW), 800, 120, Items.FLINT, Items.FLINT, ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_BOUNCE), 200, 20, Blocks.SLIME_BLOCK, Blocks.SLIME_BLOCK, Items.LEATHER, "string"); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.REAGENT_FROST), 80, 10, Blocks.ICE, Items.SNOWBALL, Items.SNOWBALL, "dustRedstone"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_WATER.getStack(), 10, 3, new ItemStack(Items.SUGAR), new ItemStack(Items.WATER_BUCKET), new ItemStack(Items.WATER_BUCKET)); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_LAVA.getStack(), 32, 10, Items.LAVA_BUCKET, "dustRedstone", "cobblestone", "blockCoal"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_VOID.getStack(), 64, 10, Items.BUCKET, "string", "string", "gunpowder"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_GROWTH.getStack(), 128, 20, "treeSapling", "treeSapling", "sugarcane", Items.SUGAR); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_AIR.getStack(), 128, 20, Items.GHAST_TEAR, "feather", "feather"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_SIGHT.getStack(), 64, 0, RegistrarBloodMagicItems.SIGIL_DIVINATION, "blockGlass", "blockGlass", "dustGlowstone"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_HOLDING.getStack(), 64, 20, "chestWood", "leather", "string", "string"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_FAST_MINER.getStack(), 128, 10, Items.IRON_PICKAXE, Items.IRON_AXE, Items.IRON_SHOVEL, Items.GUNPOWDER); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_AFFINITY.getStack(), 300, 30, RegistrarBloodMagicItems.SIGIL_WATER, RegistrarBloodMagicItems.SIGIL_AIR, RegistrarBloodMagicItems.SIGIL_LAVA, Blocks.OBSIDIAN); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_SUPPRESSION.getStack(), 500, 50, RegistrarBloodMagicBlocks.TELEPOSER, Items.WATER_BUCKET, Items.LAVA_BUCKET, Items.BLAZE_ROD); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), 400, 10, "dustGlowstone", "dustRedstone", "nuggetGold", Items.GUNPOWDER); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), 300, 10, "glowstone", Blocks.TORCH, "dustRedstone", "dustRedstone"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_MAGNETISM.getStack(), 600, 10, "string", "ingotGold", "blockIron", "ingotGold"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_HASTE.getStack(), 1400, 100, Items.COOKIE, Items.SUGAR, Items.COOKIE, "stone"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BRIDGE.getStack(), 600, 50, Blocks.SOUL_SAND, Blocks.SOUL_SAND, "stone", Blocks.OBSIDIAN); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_SEVERANCE.getStack(), 800, 70, Items.ENDER_EYE, Items.ENDER_PEARL, "ingotGold", "ingotGold"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_COMPRESSION.getStack(), 2000, 200, "blockIron", "blockGold", Blocks.OBSIDIAN, "cobblestone"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_TELEPOSITION.getStack(), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "glowstone", "blockRedstone", "ingotGold"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_TRANSPOSITION.getStack(), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "gemDiamond", Items.ENDER_PEARL, Blocks.OBSIDIAN); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_CLAW.getStack(), 800, 120, Items.FLINT, Items.FLINT, ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BOUNCE.getStack(), 200, 20, Blocks.SLIME_BLOCK, Blocks.SLIME_BLOCK, Items.LEATHER, "string"); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_FROST.getStack(), 80, 10, Blocks.ICE, Items.SNOWBALL, Items.SNOWBALL, "dustRedstone"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_ARMOUR_GEM), 240, 150, Items.DIAMOND_CHESTPLATE, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), Blocks.IRON_BLOCK, Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.COMPONENT_FRAME_PART), 400, 10, "blockGlass", "stone", new ItemStack(RegistrarBloodMagicItems.SLATE)); + TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.FRAME_PART.getStack(), 400, 10, "blockGlass", "stone", new ItemStack(RegistrarBloodMagicItems.SLATE)); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER), 400, 5, "stickWood", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), "gemLapis", "gemLapis"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE), 400, 5, "dustGlowstone", "dustRedstone", "blockGlass", "stone"); TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotIron", new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); @@ -175,16 +175,16 @@ public class ModRecipes { AlchemyTableRecipeRegistry.registerRecipe(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); AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Blocks.OBSIDIAN), 50, 50, 1, Items.WATER_BUCKET, Items.LAVA_BUCKET); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.SULFUR, 8), 0, 100, 0, Items.LAVA_BUCKET); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.SALTPETER, 4), 0, 100, 0, ItemComponent.getStack(ItemComponent.PLANT_OIL), ItemComponent.getStack(ItemComponent.PLANT_OIL), "dustCoal"); - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.GUNPOWDER, 3), 0, 100, 0, ItemComponent.getStack(ItemComponent.SALTPETER), ItemComponent.getStack(ItemComponent.SULFUR), new ItemStack(Items.COAL, 1, 1)); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.SULFUR.getStack(8), 0, 100, 0, Items.LAVA_BUCKET); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.SALTPETER.getStack(4), 0, 100, 0, ComponentTypes.PLANT_OIL.getStack(), ComponentTypes.PLANT_OIL.getStack(), "dustCoal"); + AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.GUNPOWDER, 3), 0, 100, 0, ComponentTypes.SALTPETER.getStack(), ComponentTypes.SULFUR.getStack(), new ItemStack(Items.COAL, 1, 1)); - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ItemComponent.getStack(ItemComponent.SAND_COAL, 4), 100, 100, 1, new ItemStack(Items.COAL, 1, 0), new ItemStack(Items.COAL, 1, 0), Items.FLINT)); + AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ComponentTypes.SAND_COAL.getStack(4), 100, 100, 1, new ItemStack(Items.COAL, 1, 0), new ItemStack(Items.COAL, 1, 0), Items.FLINT)); - AlchemyTableRecipeRegistry.registerRecipe(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 1000, 400, 1, "dustCoal", "gunpowder", Items.REDSTONE, Items.SUGAR, ItemComponent.getStack(ItemComponent.PLANT_OIL), new ItemStack(Items.POTIONITEM)); + AlchemyTableRecipeRegistry.registerRecipe(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 1000, 400, 1, "dustCoal", "gunpowder", Items.REDSTONE, Items.SUGAR, ComponentTypes.PLANT_OIL.getStack(), new ItemStack(Items.POTIONITEM)); - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ItemComponent.getStack(ItemComponent.SAND_IRON, 2), 400, 200, 1, "oreIron", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ItemComponent.getStack(ItemComponent.SAND_GOLD, 2), 400, 200, 1, "oreGold", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); + AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ComponentTypes.SAND_IRON.getStack(2), 400, 200, 1, "oreIron", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); + AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ComponentTypes.SAND_GOLD.getStack(2), 400, 200, 1, "oreGold", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(new ItemStack(Items.REDSTONE, 8), 400, 200, 1, "oreRedstone", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); @@ -196,21 +196,21 @@ public class ModRecipes { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(new ItemStack(Blocks.GRAVEL), 50, 50, 1, "cobblestone", ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE))); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(new ItemStack(Blocks.SAND), 50, 50, 1, Blocks.GRAVEL, ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE))); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, "cropCarrot", "cropCarrot", "cropCarrot", new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, "cropPotato", "cropPotato", new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, "cropWheat", "cropWheat", new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.PLANT_OIL), 100, 100, 1, Items.BEETROOT, Items.BEETROOT, Items.BEETROOT, new ItemStack(Items.DYE, 1, 15)); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropCarrot", "cropCarrot", "cropCarrot", new ItemStack(Items.DYE, 1, 15)); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropPotato", "cropPotato", new ItemStack(Items.DYE, 1, 15)); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropWheat", "cropWheat", new ItemStack(Items.DYE, 1, 15)); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, Items.BEETROOT, Items.BEETROOT, Items.BEETROOT, new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.NEURO_TOXIN), 1000, 100, 2, new ItemStack(Items.FISH, 1, 3)); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.ANTISEPTIC, 2), 1000, 200, 2, ItemComponent.getStack(ItemComponent.PLANT_OIL), "nuggetGold", "cropWheat", Items.SUGAR, Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.NEURO_TOXIN.getStack(), 1000, 100, 2, new ItemStack(Items.FISH, 1, 3)); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.ANTISEPTIC.getStack(2), 1000, 200, 2, ComponentTypes.PLANT_OIL.getStack(), "nuggetGold", "cropWheat", Items.SUGAR, Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM); - AlchemyTableRecipeRegistry.registerRecipe(ItemLivingArmourPointsUpgrade.getStack(ItemLivingArmourPointsUpgrade.DRAFT_ANGELUS), 20000, 400, 3, ItemComponent.getStack(ItemComponent.NEURO_TOXIN), ItemComponent.getStack(ItemComponent.ANTISEPTIC), "dustGold", Items.FERMENTED_SPIDER_EYE, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0), Items.GHAST_TEAR); + AlchemyTableRecipeRegistry.registerRecipe(ItemLivingArmourPointsUpgrade.getStack(ItemLivingArmourPointsUpgrade.DRAFT_ANGELUS), 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); AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING))); AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.POTION_FLASK), 1000, 200, 2, new ItemStack(Items.POTIONITEM), "cropNetherWart", "dustRedstone", "dustGlowstone"); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_LENGTH_1), 1000, 100, 2, "gunpowder", "cropNetherWart", "gemLapis"); - AlchemyTableRecipeRegistry.registerRecipe(ItemComponent.getStack(ItemComponent.CATALYST_POWER_1), 1000, 100, 2, "gunpowder", "cropNetherWart", "dustRedstone"); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.CATALYST_LENGTH_1.getStack(), 1000, 100, 2, "gunpowder", "cropNetherWart", "gemLapis"); + AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.CATALYST_POWER_1.getStack(), 1000, 100, 2, "gunpowder", "cropNetherWart", "dustRedstone"); } public static void addOreDoublingAlchemyRecipes() { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java index ccb845b9..c2a6ee58 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.item.ItemComponent; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.block.Block; import net.minecraft.init.Blocks; @@ -40,7 +40,7 @@ public class RitualCobblestone extends Ritual { if (tileEntity != null && tileEntity instanceof TileAlchemyArray) { TileAlchemyArray alchemyArray = (TileAlchemyArray) tileEntity; - if (!alchemyArray.getStackInSlot(0).isEmpty() && alchemyArray.getStackInSlot(0).getItem() instanceof ItemComponent) { + if (!alchemyArray.getStackInSlot(0).isEmpty() && alchemyArray.getStackInSlot(0).getItem() == RegistrarBloodMagicItems.COMPONENT) { switch (alchemyArray.getStackInSlot(0).getItemDamage()) { case 0: block = Blocks.OBSIDIAN; From 3286849309cbe6b50dc3cdbf455032fab83f5c27 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Feb 2018 15:02:55 -0800 Subject: [PATCH 166/595] Nerf fast miner array which is actually a buff (#1219) I guess Vanilla can't handle Haste III? --- .../WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java index 94bf6f8f..566d0255 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -28,7 +28,7 @@ public class ItemSigilFastMiner extends ItemSigilToggleableBase { public boolean performArrayEffect(World world, BlockPos pos) { double radius = 10; int ticks = 600; - int potionPotency = 2; + int potionPotency = 1; AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, bb); From 7167aba23c9d9285cf86e59132970c5468e17470 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 12 Feb 2018 19:45:09 -0800 Subject: [PATCH 167/595] Move Divination output to a HUD element RIP chat spam 2014-2018 :hype: --- .../WayofTime/bloodmagic/client/Sprite.java | 56 +++++++++++ .../client/hud/HUDElementCornerTile.java | 89 ++++++++++++++++++ .../item/sigil/ItemSigilDivination.java | 32 ------- .../bloodmagic/item/sigil/ItemSigilSeer.java | 37 -------- .../bloodmagic/proxy/ClientProxy.java | 43 +++++++++ .../bloodmagic/textures/gui/widgets.png | Bin 22017 -> 24967 bytes 6 files changed, 188 insertions(+), 69 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/client/Sprite.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java diff --git a/src/main/java/WayofTime/bloodmagic/client/Sprite.java b/src/main/java/WayofTime/bloodmagic/client/Sprite.java new file mode 100644 index 00000000..795286a0 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/Sprite.java @@ -0,0 +1,56 @@ +package WayofTime.bloodmagic.client; + +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) { + 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/hud/HUDElementCornerTile.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java new file mode 100644 index 00000000..207fde44 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java @@ -0,0 +1,89 @@ +package WayofTime.bloodmagic.client.hud; + +import WayofTime.bloodmagic.client.Sprite; +import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; +import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; +import WayofTime.bloodmagic.tile.TileAltar; +import com.google.common.collect.Lists; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumHand; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import org.apache.commons.lang3.tuple.Pair; + +import java.awt.Color; +import java.util.List; +import java.util.function.Function; + +public abstract class HUDElementCornerTile extends HUDElement { + + protected final List>> information; + + public HUDElementCornerTile() { + super(5, 5, RenderGameOverlayEvent.ElementType.HOTBAR); + + this.information = Lists.newArrayList(); + addInformation(information); + } + + protected abstract void addInformation(List>> information); + + @SuppressWarnings("unchecked") + @Override + public void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) { + T tile = (T) Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); + + int yOffset = 0; + for (Pair> sprite : information) { + Minecraft.getMinecraft().renderEngine.bindTexture(sprite.getLeft().getTextureLocation()); + sprite.getLeft().draw(getXOffset(), getYOffset() + yOffset); + int textY = getYOffset() + yOffset + (sprite.getLeft().getTextureHeight() / 4); + Minecraft.getMinecraft().fontRenderer.drawStringWithShadow(sprite.getRight().apply(tile), getXOffset() + sprite.getLeft().getTextureWidth() + 2, textY, Color.WHITE.getRGB()); + yOffset += sprite.getLeft().getTextureHeight() + 2; + } + } + + public static abstract class BloodAltar extends HUDElementCornerTile { + + private final boolean simple; + + public BloodAltar(boolean simple) { + this.simple = simple; + } + + @Override + public boolean shouldRender(Minecraft minecraft) { + EntityPlayer player = Minecraft.getMinecraft().player; + ItemStack sigilStack = player.getHeldItem(EnumHand.MAIN_HAND); + boolean flag = false; + if (simple) { + if (sigilStack.getItem() instanceof ItemSigilDivination) + flag = true; + + if (!flag) { + sigilStack = player.getHeldItem(EnumHand.OFF_HAND); + if (sigilStack.getItem() instanceof ItemSigilDivination) + flag = true; + } + } else { + if (sigilStack.getItem() instanceof ItemSigilSeer) + flag = true; + + if (!flag) { + sigilStack = player.getHeldItem(EnumHand.OFF_HAND); + if (sigilStack.getItem() instanceof ItemSigilSeer) + flag = true; + } + } + + TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); + if (!(tile instanceof TileAltar)) + flag = false; + + return flag; + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index 13f9c407..4f97fab1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -1,17 +1,12 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; import WayofTime.bloodmagic.apibutnotreally.iface.IAltarReader; import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; -import WayofTime.bloodmagic.tile.TileIncenseAltar; -import WayofTime.bloodmagic.tile.TileInversionPillar; import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.helper.NumeralHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; @@ -63,33 +58,6 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { toSend.add(new TextComponentTranslation(tooltipBase + "otherNetwork", getOwnerName(stack))); toSend.add(new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); - } else { - if (position.typeOfHit == RayTraceResult.Type.BLOCK) { - TileEntity tile = world.getTileEntity(position.getBlockPos()); - - 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 TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(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 - - { - int currentEssence = NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).getCurrentEssence(); - ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); - } - } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java index fc2fb523..ffb2eb29 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java @@ -1,17 +1,12 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; import WayofTime.bloodmagic.apibutnotreally.iface.IAltarReader; import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; -import WayofTime.bloodmagic.tile.TileIncenseAltar; import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.helper.NumeralHelper; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; @@ -48,38 +43,6 @@ public class ItemSigilSeer extends ItemSigilBase implements IAltarReader { toSend.add(new TextComponentTranslation(tooltipBase + "otherNetwork", getOwnerName(stack))); toSend.add(new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); - } else { - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { - - TileEntity tile = world.getTileEntity(rayTrace.getBlockPos()); - - if (tile != null && tile instanceof IBloodAltar) { - IBloodAltar altar = (IBloodAltar) tile; - int tier = altar.getTier().ordinal() + 1; - int currentEssence = altar.getCurrentBlood(); - int capacity = altar.getCapacity(); - int charge = altar.getTotalCharge(); - altar.checkTier(); - if (tile instanceof IInventory) { - if (!((IInventory) tile).getStackInSlot(0).isEmpty()) { - int progress = altar.getProgress(); - int totalLiquidRequired = altar.getLiquidRequired() * ((IInventory) tile).getStackInSlot(0).getCount(); - int consumptionRate = (int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1)); - ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarProgress", progress, totalLiquidRequired), new TextComponentTranslation(tooltipBase + "currentAltarConsumptionRate", consumptionRate), new TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity), new TextComponentTranslation(tooltipBase + "currentCharge", charge)); - } else { - ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity), new TextComponentTranslation(tooltipBase + "currentCharge", charge)); - } - } - } 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 { - int currentEssence = NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).getCurrentEssence(); - ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); - } - } } } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 42ef7613..26a98d86 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -5,7 +5,9 @@ import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.client.Sprite; import WayofTime.bloodmagic.client.helper.ShaderHelper; +import WayofTime.bloodmagic.client.hud.HUDElementCornerTile; import WayofTime.bloodmagic.client.hud.HUDElementDemonWillAura; import WayofTime.bloodmagic.client.hud.HUDElementHolding; import WayofTime.bloodmagic.client.key.KeyBindings; @@ -20,6 +22,7 @@ import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; import WayofTime.bloodmagic.tile.*; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; +import WayofTime.bloodmagic.util.helper.NumeralHelper; import com.google.common.collect.ImmutableMap; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -42,7 +45,9 @@ import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import org.apache.commons.lang3.tuple.Pair; import java.awt.Color; +import java.util.List; import java.util.Map; +import java.util.function.Function; public class ClientProxy extends CommonProxy { public static DemonWillHolder currentAura = new DemonWillHolder(); @@ -118,6 +123,44 @@ public class ClientProxy extends CommonProxy { public void postInit() { new HUDElementHolding(); new HUDElementDemonWillAura(); + new HUDElementCornerTile.BloodAltar(true) { // Divination Sigil + @Override + protected void addInformation(List>> information) { + information.add(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), altar -> NumeralHelper.toRoman(altar.getTier().toInt()))); + information.add(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()))); + } + }; + new HUDElementCornerTile.BloodAltar(false) { // Seer Sigil + @Override + protected void addInformation(List>> information) { + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), + altar -> NumeralHelper.toRoman(altar.getTier().toInt()) + )); + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), + altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) + )); + information.add(Pair.of( // Craft Progress + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 32, 46, 16, 16), + altar -> { + if (!altar.isActive()) + return "Inactive"; // FIXME localize + int progress = altar.getProgress(); + int totalLiquidRequired = altar.getLiquidRequired() * altar.getStackInSlot(0).getCount(); + return String.format("%d/%d", progress, totalLiquidRequired); + } + )); + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 48, 46, 16, 16), + altar -> String.valueOf((int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1))) + )); + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 64, 46, 16, 16), + altar -> String.valueOf(altar.getTotalCharge()) + )); + } + }; } @Override diff --git a/src/main/resources/assets/bloodmagic/textures/gui/widgets.png b/src/main/resources/assets/bloodmagic/textures/gui/widgets.png index 456166c9145b8337c66386ce688b5ec30a2eb1dd..6d8d9cfe1c773bcda8dbd235b756b045a7817ebf 100644 GIT binary patch delta 6789 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 JDmCq*{sYpBJxl-q delta 4177 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 From fa59e7000a1b7f385af333030645c3df90c7cefa Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 13 Feb 2018 16:31:30 -0800 Subject: [PATCH 168/595] Mark of the Falling Tower now demands sacrifices again (#1222) --- .../bloodmagic/meteor/MeteorRegistry.java | 36 +++++++++---------- .../bloodmagic/ritual/RitualMeteor.java | 10 +++--- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java index 4870d5ff..aaf4d0b3 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java @@ -1,23 +1,22 @@ package WayofTime.bloodmagic.meteor; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; +import com.google.common.collect.Maps; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.HashMap; +import javax.annotation.Nullable; import java.util.List; import java.util.Map; public class MeteorRegistry { - public static Map meteorMap = new HashMap(); + + public static Map meteorMap = Maps.newHashMap(); public static void registerMeteor(ItemStack stack, Meteor holder) { - ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack); - if (wrapper != null) { - meteorMap.put(wrapper, holder); - } + if (!stack.isEmpty()) + meteorMap.put(stack, holder); } public static void registerMeteor(ItemStack stack, List componentList, float explosionStrength, int radius) { @@ -25,20 +24,21 @@ public class MeteorRegistry { registerMeteor(stack, holder); } - public static boolean hasMeteorForItem(ItemStack stack) { - ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack); - return wrapper != null && meteorMap.containsKey(wrapper); - } - + @Nullable public static Meteor getMeteorForItem(ItemStack stack) { - ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack); - return wrapper != null ? meteorMap.get(wrapper) : null; + 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, IBlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) { - Meteor holder = getMeteorForItem(stack); - if (holder != null) { - holder.generateMeteor(world, pos, fillerBlock, radiusModifier, explosionModifier, fillerChance); - } + Meteor meteor = getMeteorForItem(stack); + if (meteor != null) + meteor.generateMeteor(world, pos, fillerBlock, radiusModifier, explosionModifier, fillerChance); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index 81299c17..36706d6e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; +import WayofTime.bloodmagic.meteor.Meteor; import WayofTime.bloodmagic.meteor.MeteorRegistry; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; @@ -50,10 +51,11 @@ public class RitualMeteor extends Ritual { for (EntityItem entityItem : itemList) { ItemStack stack = entityItem.getItem(); - if (MeteorRegistry.hasMeteorForItem(stack)) { - EntityMeteor meteor = new EntityMeteor(world, pos.getX(), 260, pos.getZ(), 0, -0.1, 0, radiusModifier, explosionModifier, fillerChance); - meteor.setMeteorStack(stack.copy()); - world.spawnEntity(meteor); + Meteor meteor = MeteorRegistry.getMeteorForItem(stack); + if (meteor != null) { + 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(); From 3fb708d2be0a981da85726d3ff233a9b0f96db29 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 13 Feb 2018 16:57:21 -0800 Subject: [PATCH 169/595] Fixed crafting order of decor bricks so polished is no longer a lonely boi (#1221) --- .../item/block/base/ItemBlockEnum.java | 2 +- .../demon_brick_1_brick1_corrosive.json | 2 +- .../demon_brick_1_brick1_destructive.json | 2 +- .../demon_decor/demon_brick_1_brick1_raw.json | 2 +- .../demon_brick_1_brick1_steadfast.json | 2 +- .../demon_brick_1_brick1_vengeful.json | 2 +- .../demon_extras_polished_stone_corrosive.json | 18 ++++++++++++++++++ ...emon_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 ++++++++++++++++++ 11 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_corrosive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_destructive.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_raw.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_steadfast.json create mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_vengeful.json diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java index a241c1c9..25f7375d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java @@ -23,7 +23,7 @@ public class ItemBlockEnum & IStringSerializable> extends Item @Override public String getUnlocalizedName(ItemStack stack) { - return getBlock().getUnlocalizedName() + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, 15)].getName(); + return getBlock().getUnlocalizedName() + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, getBlock().getTypes().length - 1)].getName(); } @Override 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 index 021815ad..90d39443 100644 --- 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 @@ -12,7 +12,7 @@ "key": { "s": { "item": "bloodmagic:demon_extras", - "data": 1 + "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 index ce28a636..31546399 100644 --- 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 @@ -12,7 +12,7 @@ "key": { "s": { "item": "bloodmagic:demon_extras", - "data": 2 + "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 index 60a2b525..e226f9a7 100644 --- 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 @@ -12,7 +12,7 @@ "key": { "s": { "item": "bloodmagic:demon_extras", - "data": 0 + "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 index 7aff9cee..18f5ad91 100644 --- 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 @@ -12,7 +12,7 @@ "key": { "s": { "item": "bloodmagic:demon_extras", - "data": 4 + "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 index 4904ae75..8fa984f8 100644 --- 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 @@ -12,7 +12,7 @@ "key": { "s": { "item": "bloodmagic:demon_extras", - "data": 3 + "data": 8 } } } \ 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 new file mode 100644 index 00000000..a66bd811 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_corrosive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..5df3b1d9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_destructive.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..49240f26 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_raw.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..73845172 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_steadfast.json @@ -0,0 +1,18 @@ +{ + "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 new file mode 100644 index 00000000..6c4cd7c5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_vengeful.json @@ -0,0 +1,18 @@ +{ + "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 From 65b89795bc3735dccf80478b7eabe12cce29c6d2 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 13 Feb 2018 17:24:06 -0800 Subject: [PATCH 170/595] Remove unnecessary base bindable class Jarbo 8 exists --- .../apibutnotreally/iface/IBindable.java | 14 ++++++-- .../apibutnotreally/iface/ISigil.java | 9 +++-- .../apibutnotreally/impl/ItemBindable.java | 35 ------------------- .../apibutnotreally/impl/ItemSigil.java | 16 ++------- .../bloodmagic/item/ItemBindableBase.java | 6 ++-- 5 files changed, 25 insertions(+), 55 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java index 19cca36f..37b32d8f 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.apibutnotreally.iface; +import WayofTime.bloodmagic.apibutnotreally.Constants; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -7,6 +8,7 @@ import net.minecraft.item.ItemStack; * Implement this interface on any Item that can be bound to a player. */ public interface IBindable { + /** * Gets the username of the Item's owner. Usually for display, such as in * the tooltip. @@ -16,7 +18,9 @@ public interface IBindable { * @param stack - The owned ItemStack * @return - The username of the Item's owner */ - String getOwnerName(ItemStack stack); + default String getOwnerName(ItemStack stack) { + return !stack.isEmpty() && stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; + } /** * Gets the UUID of the Item's owner. @@ -26,7 +30,9 @@ public interface IBindable { * @param stack - The owned ItemStack * @return - The UUID of the Item's owner */ - String getOwnerUUID(ItemStack stack); + default String getOwnerUUID(ItemStack stack) { + return !stack.isEmpty() && stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; + } /** * Called when the player attempts to bind the item. @@ -35,5 +41,7 @@ public interface IBindable { * @param stack - The ItemStack to attempt binding * @return If binding was successful. */ - boolean onBind(EntityPlayer player, ItemStack stack); + default boolean onBind(EntityPlayer player, ItemStack stack) { + return true; + } } diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java index 12f54b04..196aa098 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java @@ -12,9 +12,14 @@ import javax.annotation.Nonnull; * Sigils of Holdings. */ public interface ISigil { - boolean performArrayEffect(World world, BlockPos pos); - boolean hasArrayEffect(); + default boolean performArrayEffect(World world, BlockPos pos) { + return false; + } + + default boolean hasArrayEffect() { + return false; + } interface Holding { @Nonnull diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java deleted file mode 100644 index 2add8510..00000000 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemBindable.java +++ /dev/null @@ -1,35 +0,0 @@ -package WayofTime.bloodmagic.apibutnotreally.impl; - -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -/** - * Base class for all bindable items. - */ -public class ItemBindable extends Item implements IBindable { - public ItemBindable() { - super(); - - setMaxStackSize(1); - } - - // IBindable - - @Override - public boolean onBind(EntityPlayer player, ItemStack stack) { - return true; - } - - @Override - public String getOwnerName(ItemStack stack) { - return !stack.isEmpty() && stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; - } - - @Override - public String getOwnerUUID(ItemStack stack) { - return !stack.isEmpty() && stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigil.java index 3d2dbe87..208f2b67 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigil.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/impl/ItemSigil.java @@ -1,16 +1,16 @@ package WayofTime.bloodmagic.apibutnotreally.impl; import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; /** * Base class for all (static) sigils. */ -public class ItemSigil extends ItemBindable implements ISigil { +public class ItemSigil extends Item implements IBindable, ISigil { private int lpUsed; public ItemSigil(int lpUsed) { @@ -32,16 +32,6 @@ public class ItemSigil extends ItemBindable implements ISigil { return stack; } - @Override - public boolean performArrayEffect(World world, BlockPos pos) { - return false; - } - - @Override - public boolean hasArrayEffect() { - return false; - } - public int getLpUsed() { return lpUsed; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index c413e43b..092c1bed 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -1,11 +1,12 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.impl.ItemBindable; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -13,11 +14,12 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; -public class ItemBindableBase extends ItemBindable { +public class ItemBindableBase extends Item implements IBindable { public ItemBindableBase() { super(); setCreativeTab(BloodMagic.TAB_BM); + setMaxStackSize(1); } @Override From c03af41c884127e037e3c940ec4796f79f0305f0 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 13 Feb 2018 23:32:15 -0800 Subject: [PATCH 171/595] Some subitem cleanup Still lots left to do. This will help prepare for The Flattening. --- .../bloodmagic/client/IMeshProvider.java | 4 +- .../core/RegistrarBloodMagicItems.java | 5 +- .../item/ItemActivationCrystal.java | 73 ++++++++++--------- .../bloodmagic/item/ItemBloodOrb.java | 10 +-- .../bloodmagic/item/ItemBloodShard.java | 50 ------------- .../bloodmagic/item/ItemDemonCrystal.java | 15 +--- .../WayofTime/bloodmagic/item/ItemEnum.java | 21 ++++-- .../item/ItemSacrificialDagger.java | 51 ++++++------- .../WayofTime/bloodmagic/item/ItemSlate.java | 65 +++++++---------- .../item/ItemTelepositionFocus.java | 68 ++++++++--------- .../bloodmagic/item/soul/ItemMonsterSoul.java | 67 ++++++++--------- .../bloodmagic/item/types/ShardType.java | 26 +++++++ .../blockstates/activation_crystal.json | 2 +- .../bloodmagic/blockstates/monster_soul.json | 2 +- .../assets/bloodmagic/lang/en_US.lang | 32 ++++---- 15 files changed, 210 insertions(+), 281 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/types/ShardType.java diff --git a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java index d697da6f..6706e2c6 100644 --- a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java +++ b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java @@ -36,5 +36,7 @@ public interface IMeshProvider { * @return - The custom ResourceLocation */ @Nullable - ResourceLocation getCustomLocation(); + default ResourceLocation getCustomLocation() { + return null; + } } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index dc216c97..5a8c6180 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -17,6 +17,7 @@ import WayofTime.bloodmagic.item.routing.ItemRouterFilter; import WayofTime.bloodmagic.item.sigil.*; import WayofTime.bloodmagic.item.soul.*; import WayofTime.bloodmagic.item.types.ComponentTypes; +import WayofTime.bloodmagic.item.types.ShardType; import com.google.common.collect.Lists; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.init.Items; @@ -166,11 +167,11 @@ public class RegistrarBloodMagicItems { new ItemSigilClaw().setRegistryName("sigil_claw"), new ItemSigilBounce().setRegistryName("sigil_bounce"), new ItemSigilFrost().setRegistryName("sigil_frost"), - new ItemEnum<>(ComponentTypes.class, "baseComponent").setRegistryName("component"), + 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 ItemBloodShard().setRegistryName("blood_shard"), + new ItemEnum.Variant<>(ShardType.class, "blood_shard").setRegistryName("blood_shard"), new ItemLivingArmour(EntityEquipmentSlot.HEAD).setRegistryName("living_armour_helmet"), new ItemLivingArmour(EntityEquipmentSlot.CHEST).setRegistryName("living_armour_chest"), new ItemLivingArmour(EntityEquipmentSlot.LEGS).setRegistryName("living_armour_leggings"), diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index c0560ec7..7b2bb804 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -1,64 +1,65 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.types.ISubItem; import WayofTime.bloodmagic.util.helper.TextHelper; +import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; 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 org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; +import java.util.Locale; -public class ItemActivationCrystal extends ItemBindableBase implements IVariantProvider { - public static String[] names = {"weak", "awakened", "creative"}; +public class ItemActivationCrystal extends ItemEnum.Variant implements IBindable { public ItemActivationCrystal() { - super(); + super(CrystalType.class, "activation_crystal"); - setUnlocalizedName(BloodMagic.MODID + ".activationCrystal."); - setHasSubtypes(true); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); + 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.activationCrystal." + names[stack.getItemDamage()])); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.activation_crystal." + getItemType(stack).getInternalName())); + + if (!stack.hasTagCompound()) + return; + + if (!Strings.isNullOrEmpty(getOwnerUUID(stack))) + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); super.addInformation(stack, world, tooltip, flag); } - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=weak")); - ret.add(new ImmutablePair(1, "type=demonic")); - ret.add(new ImmutablePair(2, "type=creative")); - return ret; - } - 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/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 4318a90f..c18428b5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; @@ -23,7 +22,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; import java.util.List; -public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindable { +public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { public ItemBloodOrb() { setUnlocalizedName(BloodMagic.MODID + ".orb"); this.setMaxDamage(0); @@ -109,13 +108,6 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IBindab return true; } - // IBindable - - @Override - public boolean onBind(EntityPlayer player, ItemStack stack) { - return true; - } - // IBloodOrb @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java deleted file mode 100644 index acbf2214..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java +++ /dev/null @@ -1,50 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; - -public class ItemBloodShard extends Item implements IVariantProvider { - public String[] names = {"weak", "demon"}; - - public ItemBloodShard() { - super(); - - setCreativeTab(BloodMagic.TAB_BM); - setUnlocalizedName(BloodMagic.MODID + ".bloodShard."); - setHasSubtypes(true); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; - } - - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=weak")); - ret.add(new ImmutablePair(1, "type=demonic")); - return ret; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java index 508b1efd..89ed3f05 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java @@ -3,23 +3,10 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import com.google.common.collect.Lists; -import net.minecraft.creativetab.CreativeTabs; -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; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; -import java.util.List; - -public class ItemDemonCrystal extends ItemEnum implements IDiscreteDemonWill, IVariantProvider { +public class ItemDemonCrystal extends ItemEnum.Variant implements IDiscreteDemonWill { public ItemDemonCrystal() { super(EnumDemonWillType.class, "demonCrystal"); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java index 457089df..c4def10f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java @@ -15,7 +15,7 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.List; -public class ItemEnum & ISubItem> extends Item implements IVariantProvider { +public class ItemEnum & ISubItem> extends Item { protected final T[] types; @@ -48,12 +48,19 @@ public class ItemEnum & ISubItem> extends Item implements IVar return types[MathHelper.clamp(stack.getItemDamage(), 0, types.length)]; } - @Override - public List> getVariants() { - List> variants = Lists.newArrayList(); - for (int i = 0; i < types.length; i++) - variants.add(Pair.of(i, "type=" + types[i].getInternalName())); + public static class Variant & ISubItem> extends ItemEnum implements IVariantProvider { - return variants; + public Variant(Class enumClass, String baseName) { + super(enumClass, baseName); + } + + @Override + public List> getVariants() { + List> variants = Lists.newArrayList(); + for (int i = 0; i < types.length; i++) + variants.add(Pair.of(i, "type=" + types[i].getInternalName())); + + return variants; + } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 8107f15d..05563b0a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; import WayofTime.bloodmagic.apibutnotreally.Constants; @@ -9,18 +8,18 @@ import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.types.ISubItem; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.*; @@ -30,39 +29,22 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import javax.annotation.Nullable; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Locale; -public class ItemSacrificialDagger extends Item implements IMeshProvider { - public static String[] names = {"normal", "creative"}; +public class ItemSacrificialDagger extends ItemEnum implements IMeshProvider { public ItemSacrificialDagger() { - super(); + super(DaggerType.class, "sacrificial_dagger"); - setUnlocalizedName(BloodMagic.MODID + ".sacrificialDagger."); - setCreativeTab(BloodMagic.TAB_BM); setHasSubtypes(true); setMaxStackSize(1); setFull3D(); } - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); - } - @Override public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sacrificialDagger.desc")))); @@ -191,9 +173,22 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider { return variants; } - @Nullable - @Override - public ResourceLocation getCustomLocation() { - return null; + 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/ItemSlate.java b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java index b2564ffb..b2d294b5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java @@ -1,47 +1,23 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; +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.creativetab.CreativeTabs; -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 org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.List; +import java.util.Locale; -public class ItemSlate extends Item implements IVariantProvider { - public String[] names = {"blank", "reinforced", "imbued", "demonic", "ethereal"}; +public class ItemSlate extends ItemEnum.Variant { public ItemSlate() { - super(); - - setCreativeTab(BloodMagic.TAB_BM); - setUnlocalizedName(BloodMagic.MODID + ".slate."); - setHasSubtypes(true); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + super(SlateType.class, "slate"); } @Override @@ -50,14 +26,25 @@ public class ItemSlate extends Item implements IVariantProvider { list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.slate.desc")))); } - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=blank")); - ret.add(new ImmutablePair(1, "type=reinforced")); - ret.add(new ImmutablePair(2, "type=imbued")); - ret.add(new ImmutablePair(3, "type=demonic")); - ret.add(new ImmutablePair(4, "type=ethereal")); - return ret; + 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 index 684e8cfa..37a765fe 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -1,56 +1,35 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IVariantProvider; +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.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; 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 org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.List; +import java.util.Locale; -public class ItemTelepositionFocus extends ItemBindableBase implements IVariantProvider { - public static String[] names = {"weak", "enhanced", "reinforced", "demonic"}; +public class ItemTelepositionFocus extends ItemEnum.Variant implements IBindable { public ItemTelepositionFocus() { - super(); + super(FocusType.class, "focus"); - setUnlocalizedName(BloodMagic.MODID + ".focus."); - setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); - setHasSubtypes(true); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); } @Override @@ -69,7 +48,7 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP @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." + names[stack.getItemDamage()])))); + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localize("tooltip.bloodmagic.telepositionFocus." + getItemType(stack).getInternalName())))); super.addInformation(stack, world, tooltip, flag); @@ -86,16 +65,6 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP } } - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=weak")); - ret.add(new ImmutablePair(1, "type=enhanced")); - ret.add(new ImmutablePair(2, "type=reinforced")); - ret.add(new ImmutablePair(3, "type=demonic")); - return ret; - } - public World getWorld(ItemStack stack) { stack = NBTHelper.checkNBT(stack); return DimensionManager.getWorld(stack.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID)); @@ -115,4 +84,25 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP itemTag.setInteger(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/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index 743ea4b1..fabc46cb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -1,53 +1,32 @@ package WayofTime.bloodmagic.item.soul; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IVariantProvider; +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.creativetab.CreativeTabs; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; +import java.util.Locale; -public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvider { - public static String[] names = {"base", "corrosive", "destructive", "vengeful", "steadfast"}; +public class ItemMonsterSoul extends ItemEnum.Variant implements IDemonWill { public ItemMonsterSoul() { - super(); + super(WillType.class, "monster_soul"); - setUnlocalizedName(BloodMagic.MODID + ".monsterSoul."); - setCreativeTab(BloodMagic.TAB_BM); - setHasSubtypes(true); setMaxStackSize(1); } - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; - } - - @Override - public void getSubItems(CreativeTabs 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) { @@ -104,16 +83,6 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide return soulStack; } - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - for (int i = 0; i < names.length; i++) { - String name = names[i]; - ret.add(new ImmutablePair(i, "type=" + name)); - } - return ret; - } - @Override public double getWill(ItemStack willStack) { return this.getWill(EnumDemonWillType.DEFAULT, willStack); @@ -128,4 +97,26 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide 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/types/ShardType.java b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java new file mode 100644 index 00000000..d3edd6e3 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java @@ -0,0 +1,26 @@ +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/resources/assets/bloodmagic/blockstates/activation_crystal.json b/src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json index 913aa3f8..b5535ec3 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json +++ b/src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json @@ -11,7 +11,7 @@ "layer0": "bloodmagic:items/activationCrystalWeak" } }, - "demonic": { + "awakened": { "textures": { "layer0": "bloodmagic:items/activationCrystalAwakened" } diff --git a/src/main/resources/assets/bloodmagic/blockstates/monster_soul.json b/src/main/resources/assets/bloodmagic/blockstates/monster_soul.json index bbdebb50..3212e25c 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/monster_soul.json +++ b/src/main/resources/assets/bloodmagic/blockstates/monster_soul.json @@ -6,7 +6,7 @@ }, "variants": { "type": { - "base": { + "raw": { "textures": { "layer0": "bloodmagic:items/BaseMonsterSoul" } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 3482c754..27fb5cc3 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -3,12 +3,12 @@ itemGroup.bloodmagic.creativeTab=Blood Magic itemGroup.bloodmagic.creativeTabTome=Blood Magic | Tomes #Items -item.bloodmagic.activationCrystal.weak.name=Weak Activation Crystal -item.bloodmagic.activationCrystal.awakened.name=Awakened Activation Crystal -item.bloodmagic.activationCrystal.creative.name=Creative Activation Crystal +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.sacrificialDagger.normal.name=Sacrificial Dagger -item.bloodmagic.sacrificialDagger.creative.name=Creative Sacrificial Dagger +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 @@ -63,8 +63,8 @@ item.bloodmagic.reagent.virtus.name=Virtus item.bloodmagic.reagent.reductus.name=Reductus item.bloodmagic.reagent.potentia.name=Potentia -item.bloodmagic.bloodShard.weak.name=Weak Blood Shard -item.bloodmagic.bloodShard.demon.name=Demon Blood Shard +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 @@ -110,11 +110,11 @@ 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.monsterSoul.base.name=Demonic Will -item.bloodmagic.monsterSoul.corrosive.name=Corrosive Demonic Will -item.bloodmagic.monsterSoul.destructive.name=Destructive Demonic Will -item.bloodmagic.monsterSoul.vengeful.name=Vengeful Demonic Will -item.bloodmagic.monsterSoul.steadfast.name=Steadfast Demonic Will +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 @@ -124,7 +124,7 @@ 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.elementalAffinity.name=Sigil of Elemental Affinity +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 @@ -440,9 +440,9 @@ tooltip.bloodmagic.pack.selfSacrifice.desc=This pack really chafes... tooltip.bloodmagic.pack.sacrifice.desc=Description tooltip.bloodmagic.pack.stored=Stored: %d LP -tooltip.bloodmagic.activationCrystal.weak=Activates low-level rituals -tooltip.bloodmagic.activationCrystal.awakened=Activates more powerful rituals -tooltip.bloodmagic.activationCrystal.creative=Creative Only - Activates any ritual +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: tooltip.bloodmagic.diviner.blankRune=Blank Runes: %d From 2afc235af7e4c985b828e74e3ad717109f880b67 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 14 Feb 2018 23:37:23 -0800 Subject: [PATCH 172/595] Move API to it's own source set --- build.gradle | 36 +++++++++++-------- .../bloodmagic/api/BloodMagicPlugin.java | 0 .../bloodmagic/api/IBloodMagicAPI.java | 0 .../bloodmagic/api/IBloodMagicBlacklist.java | 0 .../bloodmagic/api/IBloodMagicPlugin.java | 0 .../api/IBloodMagicRecipeRegistrar.java | 0 .../api/IBloodMagicValueManager.java | 0 .../api/event/BloodMagicCraftedEvent.java | 12 +++---- .../bloodmagic/api/package-info.java | 4 +++ .../bloodmagic/altar/BloodAltar.java | 2 +- .../bloodmagic/api/package-info.java | 5 --- 11 files changed, 32 insertions(+), 27 deletions(-) rename src/{main => api}/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java (100%) rename src/{main => api}/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java (100%) rename src/{main => api}/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java (100%) rename src/{main => api}/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java (100%) rename src/{main => api}/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java (100%) rename src/{main => api}/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java (100%) rename src/{main => api}/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java (76%) create mode 100644 src/api/java/WayofTime/bloodmagic/api/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/package-info.java diff --git a/build.gradle b/build.gradle index b11e08ca..8d66bf41 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { plugins { id "net.minecraftforge.gradle.forge" version "2.0.2" - id 'com.matthewprenger.cursegradle' version '1.0.9' + id 'com.matthewprenger.cursegradle' version '1.0.10' id 'io.franzbecker.gradle-lombok' version '1.6' id 'maven-publish' } @@ -69,16 +69,16 @@ processResources { } } -if (JavaVersion.current().isJava8Compatible()) { - allprojects { - tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:none', '-quiet') - } +allprojects { + tasks.withType(Javadoc) { + options.addStringOption('Xdoclint:none', '-quiet') } } jar { classifier = '' + from sourceSets.main.output + from sourceSets.api.output manifest.mainAttributes( "Built-By": System.getProperty('user.name'), "Created-By": "${System.getProperty('java.vm.version')} + (${System.getProperty('java.vm.vendor')})", @@ -88,22 +88,28 @@ jar { ) } -// API jar task apiJar(type: Jar) { - from sourceSets.main.allSource - from sourceSets.main.output - include 'WayofTime/bloodmagic/api/**/*' - exclude 'WayofTime/bloodmagic/api/impl/**/*' classifier = 'api' + from sourceSets.api.output + + // TODO: when FG bug is fixed, remove allJava from the api jar. + // https://github.com/MinecraftForge/ForgeGradle/issues/369 + // Gradle should be able to pull them from the -sources jar. + from sourceSets.api.allJava } -// Javadoc jar task javadocJar(type: Jar, dependsOn: javadoc) { from javadoc.destinationDir classifier = 'javadoc' } -tasks.build.dependsOn javadoc, javadocJar, apiJar +task sourcesJar(type: Jar) { + classifier = 'sources' + from sourceSets.main.allJava + from sourceSets.api.allJava +} + +tasks.build.dependsOn javadoc, javadocJar, apiJar, sourcesJar tasks.withType(JavaCompile) { task -> task.options.encoding = 'UTF-8' @@ -115,7 +121,7 @@ publishing { mavenJava(MavenPublication) { artifact jar artifact javadocJar - artifact sourceJar + artifact sourcesJar artifact apiJar } } @@ -169,7 +175,7 @@ curseforge { relations curseRelations addArtifact javadocJar - addArtifact sourceJar + addArtifact sourcesJar addArtifact apiJar } } diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java b/src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java similarity index 100% rename from src/main/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java rename to src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java similarity index 100% rename from src/main/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java rename to src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java similarity index 100% rename from src/main/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java rename to src/api/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java similarity index 100% rename from src/main/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java rename to src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java similarity index 100% rename from src/main/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java rename to src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java diff --git a/src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java similarity index 100% rename from src/main/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java rename to src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java diff --git a/src/main/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java b/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java similarity index 76% rename from src/main/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java rename to src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java index 507a3c30..1df4bb13 100644 --- a/src/main/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java +++ b/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.api.event; -import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; import net.minecraftforge.fml.common.eventhandler.Event; public class BloodMagicCraftedEvent extends Event { @@ -34,16 +34,16 @@ public class BloodMagicCraftedEvent extends Event { */ public static class Altar extends BloodMagicCraftedEvent { - private final RecipeBloodAltar recipe; + private final Ingredient input; - public Altar(RecipeBloodAltar recipe, ItemStack output) { + public Altar(Ingredient input, ItemStack output) { super(output, true); - this.recipe = recipe; + this.input = input; } - public RecipeBloodAltar getRecipe() { - return recipe; + public Ingredient getInput() { + return input; } } } diff --git a/src/api/java/WayofTime/bloodmagic/api/package-info.java b/src/api/java/WayofTime/bloodmagic/api/package-info.java new file mode 100644 index 00000000..9d563054 --- /dev/null +++ b/src/api/java/WayofTime/bloodmagic/api/package-info.java @@ -0,0 +1,4 @@ +@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/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 2e94d54b..2002bfc5 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -314,7 +314,7 @@ public class BloodAltar implements IFluidHandler { if (progress >= liquidRequired * stackSize) { ItemStack result = recipe.getOutput().copy(); - BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(recipe, result); + BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(recipe.getInput(), result); MinecraftForge.EVENT_BUS.post(event); tileAltar.setInventorySlotContents(0, event.getOutput()); progress = 0; diff --git a/src/main/java/WayofTime/bloodmagic/api/package-info.java b/src/main/java/WayofTime/bloodmagic/api/package-info.java deleted file mode 100644 index d77cfda2..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -@API(owner = BloodMagic.MODID, provides = BloodMagic.MODID + "|api", apiVersion = "2.0.0") -package WayofTime.bloodmagic.api; - -import WayofTime.bloodmagic.BloodMagic; -import net.minecraftforge.fml.common.API; \ No newline at end of file From 616c08094b4b6682cca0a0ca3eb19d0ce98b4d4f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 14 Feb 2018 23:38:57 -0800 Subject: [PATCH 173/595] Run formatter --- .../bloodmagic/api/IBloodMagicAPI.java | 16 ++--- .../api/IBloodMagicRecipeRegistrar.java | 34 +++++------ .../api/IBloodMagicValueManager.java | 22 +++---- .../java/WayofTime/bloodmagic/BloodMagic.java | 6 +- .../WayofTime/bloodmagic/ConfigHandler.java | 59 +++++++++---------- .../bloodmagic/altar/BloodAltar.java | 2 +- .../bloodmagic/api/impl/BloodMagicAPI.java | 7 +-- .../api/impl/BloodMagicCorePlugin.java | 6 +- .../AlchemyArrayEffectCraftingNew.java | 2 +- .../bloodmagic/block/BlockDemonCrystal.java | 1 - .../WayofTime/bloodmagic/block/BlockPath.java | 2 +- .../AlchemyArrayCraftingRecipeJEI.java | 1 - .../provider/DataProviderBloodAltar.java | 1 - .../waila/provider/DataProviderMimic.java | 1 - .../core/RegistrarBloodMagicRecipes.java | 2 +- .../item/ItemActivationCrystal.java | 3 +- .../bloodmagic/item/ItemAltarMaker.java | 3 +- .../item/ItemDaggerOfSacrifice.java | 2 +- .../item/ItemSacrificialDagger.java | 3 +- .../WayofTime/bloodmagic/item/ItemSlate.java | 3 +- .../item/ItemTelepositionFocus.java | 3 +- .../item/sigil/ItemSigilGreenGrove.java | 2 +- .../item/sigil/ItemSigilTransposition.java | 2 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 3 +- .../bloodmagic/item/types/ComponentTypes.java | 3 +- .../bloodmagic/item/types/ShardType.java | 3 +- .../bloodmagic/potion/BMPotionUtils.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 10 +++- .../bloodmagic/ritual/RitualForsakenSoul.java | 2 +- .../bloodmagic/ritual/RitualGreenGrove.java | 2 +- .../bloodmagic/ritual/RitualMagnetic.java | 2 +- .../ritual/RitualWellOfSuffering.java | 2 +- .../bloodmagic/tile/TileIncenseAltar.java | 6 +- .../WayofTime/bloodmagic/util/ChatUtil.java | 4 +- .../java/WayofTime/bloodmagic/util/Utils.java | 7 ++- .../util/handler/event/GenericHandler.java | 2 +- 36 files changed, 108 insertions(+), 123 deletions(-) diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java index 8817dd25..776bee6d 100644 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java +++ b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java @@ -35,18 +35,18 @@ public interface IBloodMagicAPI { /** * Registers an {@link IBlockState} as a given component for the Blood Altar. - * + *

        * Valid component types: *

          - *
        • GLOWSTONE
        • - *
        • BLOODSTONE
        • - *
        • BEACON
        • - *
        • BLOODRUNE
        • - *
        • CRYSTAL
        • - *
        • NOTAIR
        • + *
        • GLOWSTONE
        • + *
        • BLOODSTONE
        • + *
        • BEACON
        • + *
        • BLOODRUNE
        • + *
        • CRYSTAL
        • + *
        • NOTAIR
        • *
        * - * @param state The state to register + * @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); diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java index 61123c52..3817725d 100644 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java +++ b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java @@ -16,12 +16,12 @@ public interface IBloodMagicRecipeRegistrar { /** * Adds a new recipe to the Blood Altar. * - * @param input An input {@link Ingredient}. - * @param output An output {@link ItemStack}. + * @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 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. + * @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); @@ -29,7 +29,6 @@ public interface IBloodMagicRecipeRegistrar { * 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); @@ -37,11 +36,11 @@ public interface IBloodMagicRecipeRegistrar { /** * 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 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. + * @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); @@ -49,7 +48,6 @@ public interface IBloodMagicRecipeRegistrar { * 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); @@ -57,10 +55,10 @@ public interface IBloodMagicRecipeRegistrar { /** * Adds a new recipe to the Soul/Tartaric Forge. * - * @param output An output {@link ItemStack}. + * @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. + * @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); @@ -68,7 +66,6 @@ public interface IBloodMagicRecipeRegistrar { * 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); @@ -76,9 +73,9 @@ public interface IBloodMagicRecipeRegistrar { /** * 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 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); @@ -86,9 +83,8 @@ public interface IBloodMagicRecipeRegistrar { /** * 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 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); diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java index 1f22de5a..f51db50c 100644 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java +++ b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java @@ -16,27 +16,27 @@ public interface IBloodMagicValueManager { * 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. + * @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
        • + *
        • PLANT
        • + *
        • CROP
        • + *
        • TREE
        • + *
        • EARTHEN
        • + *
        • WATER
        • + *
        • FIRE
        • + *
        • LAVA
        • *
        * - * @param state The {@link IBlockState} to set the value of. + * @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. + * @param value The amount of tranquility this block should provide. */ void setTranquility(@Nonnull IBlockState state, @Nonnull String tranquilityType, double value); } diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 08bdce42..c8671049 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic; +import WayofTime.bloodmagic.api.BloodMagicPlugin; +import WayofTime.bloodmagic.api.IBloodMagicPlugin; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; import WayofTime.bloodmagic.apibutnotreally.util.helper.LogHelper; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.BloodMagicPlugin; -import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 23e12138..0a87cb07 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -11,36 +11,44 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class ConfigHandler { - @Config.Comment({ "Blacklist options for various features" }) + @Config.Comment({"Blacklist options for various features"}) public static ConfigBlacklist blacklist = new ConfigBlacklist(); - @Config.Comment({ "Value modifiers for various features" }) + @Config.Comment({"Value modifiers for various features"}) public static ConfigValues values = new ConfigValues(); - @Config.Comment({ "Toggles for all rituals" }) + @Config.Comment({"Toggles for all rituals"}) public static ConfigRituals rituals = new ConfigRituals(); - @Config.Comment({ "Settings that only pertain to the client" }) + @Config.Comment({"Settings that only pertain to the client"}) public static ConfigClient client = new ConfigClient(); - @Config.Comment({ "Compatibility settings" }) + @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 + MeteorConfigHandler.handleMeteors(false); // Reload meteors + } + } + 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 = { }; + @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.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.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." }) + @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; } @@ -85,31 +93,22 @@ public class ConfigHandler { } 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." }) + @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." }) + @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." }) + @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." }) + @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 - MeteorConfigHandler.handleMeteors(false); // Reload meteors + SIGIL_CONTAINED,; } } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 2002bfc5..859c2ffd 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -1,6 +1,7 @@ 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.apibutnotreally.BlockStack; import WayofTime.bloodmagic.apibutnotreally.Constants; @@ -8,7 +9,6 @@ import WayofTime.bloodmagic.apibutnotreally.altar.*; import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index 3a6ab28c..df5dc2b0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -1,16 +1,13 @@ package WayofTime.bloodmagic.api.impl; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.IBloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; -import net.minecraft.util.ResourceLocation; import javax.annotation.Nonnull; -import java.util.*; +import java.util.List; public class BloodMagicAPI implements IBloodMagicAPI { diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 4d456f95..f6255a0f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -2,18 +2,18 @@ package WayofTime.bloodmagic.api.impl; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicAPI; import WayofTime.bloodmagic.api.IBloodMagicPlugin; -import WayofTime.bloodmagic.incense.EnumTranquilityType; -import WayofTime.bloodmagic.incense.TranquilityStack; +import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockDecorative; import WayofTime.bloodmagic.block.enums.EnumBloodRune; 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 net.minecraft.block.Block; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.BlockStateContainer; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java index 076c049d..6b06b090 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java +++ b/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java @@ -17,7 +17,7 @@ public class AlchemyArrayEffectCraftingNew extends AlchemyArrayEffect { public AlchemyArrayEffectCraftingNew(String key, RecipeAlchemyArray recipeAlchemyArray) { super(key); - + this.recipe = recipeAlchemyArray; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 9af126b3..7d286cd3 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.item.ItemDemonCrystal; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.Block; import net.minecraft.block.material.Material; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 553f791c..92fae1bf 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.incense.IIncensePath; 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.SoundType; import net.minecraft.block.material.Material; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java index fe451eb0..ce5ec8a6 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java @@ -3,7 +3,6 @@ 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.BlankRecipeWrapper; import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index e50f80cf..a7d3a22d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.compat.waila.provider; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java index 3900f95e..e4bf0264 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java @@ -15,7 +15,6 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.ForgeRegistries; import javax.annotation.Nonnull; -import java.util.List; public class DataProviderMimic implements IWailaDataProvider { diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 48937522..ba331b03 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -42,7 +42,7 @@ public class RegistrarBloodMagicRecipes { 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()); + ShapelessOreRecipe shapeless = new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "soul_gem"), newGemStack, baseGemStack, willType.getStack()); event.getRegistry().register(shapeless.setRegistryName("soul_gem_" + willType.getName())); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index 7b2bb804..73972287 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -47,8 +47,7 @@ public class ItemActivationCrystal extends ItemEnum.Variant { REINFORCED, IMBUED, DEMONIC, - ETHEREAL, - ; + ETHEREAL,; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 37a765fe..8f9a0cdc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -90,8 +90,7 @@ public class ItemTelepositionFocus extends ItemEnum.Variant CORROSIVE, DESTRUCTIVE, VENGEFUL, - STEADFAST, - ; + STEADFAST,; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java index c49aa09b..89474201 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java @@ -40,8 +40,7 @@ public enum ComponentTypes implements ISubItem { CATALYST_POWER_1, REAGENT_CLAW, REAGENT_BOUNCE, - REAGENT_FROST, - ; + REAGENT_FROST,; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java index d3edd6e3..f3ca9233 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java @@ -9,8 +9,7 @@ import java.util.Locale; public enum ShardType implements ISubItem { WEAK, - DEMONIC, - ; + DEMONIC,; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index 0a9f94d7..392a6386 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.potion; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionAugmentRecipe; import net.minecraft.block.Block; import net.minecraft.block.IGrowable; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index db223ce5..de382992 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -6,7 +6,10 @@ import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableCustomRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.*; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.LivingArmourDowngradeRecipeRegistry; +import WayofTime.bloodmagic.apibutnotreally.registry.TartaricForgeRecipeRegistry; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; import WayofTime.bloodmagic.client.render.alchemyArray.*; import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; @@ -36,7 +39,10 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.tuple.Pair; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; public class ModRecipes { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 537b8fc7..4e71364d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityAnimal; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 9e42209c..2bac524c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java index 1f55d2f8..794bb119 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java @@ -23,7 +23,7 @@ import java.util.Map; public class RitualMagnetic extends Ritual { public static final String PLACEMENT_RANGE = "placementRange"; private static final Map oreBlockCache = new HashMap(); -// public static final String SEARCH_RANGE = "searchRange"; + // public static final String SEARCH_RANGE = "searchRange"; public BlockPos lastPos; // An offset public RitualMagnetic() { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index 86eaf30a..bda9622f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index 51afef15..bae862d0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -1,12 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.incense.EnumTranquilityType; -import WayofTime.bloodmagic.incense.IIncensePath; -import WayofTime.bloodmagic.incense.IncenseTranquilityRegistry; -import WayofTime.bloodmagic.incense.TranquilityStack; import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.incense.IncenseAltarHandler; +import WayofTime.bloodmagic.incense.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java index 5ff4bd36..e11ccb24 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java @@ -185,8 +185,8 @@ public class ChatUtil { /** * @author tterrag1098 - *

        - * Ripped from EnderCore (and slightly altered) + *

        + * Ripped from EnderCore (and slightly altered) */ public static class PacketNoSpamChat implements IMessage { private ITextComponent[] chatLines; diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 19d1e886..fa590b7e 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -49,7 +49,10 @@ import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; import net.minecraftforge.items.wrapper.SidedInvWrapper; import javax.annotation.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.UUID; public class Utils { public static float addAbsorptionToMaximum(EntityLivingBase entity, float added, int maximum, int duration) { @@ -952,7 +955,7 @@ public class Utils { double reachDistance = 5.0D; if (player instanceof EntityPlayerMP) - reachDistance = ((EntityPlayerMP)player).interactionManager.getBlockReachDistance(); + reachDistance = ((EntityPlayerMP) player).interactionManager.getBlockReachDistance(); Vec3d reachPosition = eyePosition.addVector((double) f6 * reachDistance, (double) f5 * reachDistance, (double) f7 * reachDistance); return player.getEntityWorld().rayTraceBlocks(eyePosition, reachPosition, useLiquids, !useLiquids, false); 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 0dae83b8..e75009fe 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.apibutnotreally.Constants; import WayofTime.bloodmagic.apibutnotreally.event.ItemBindEvent; import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; @@ -14,7 +15,6 @@ import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; import WayofTime.bloodmagic.apibutnotreally.util.helper.*; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; From 2fecb427fd41aafd0d66f45631d72e426f8e74a0 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 15 Feb 2018 18:49:01 -0800 Subject: [PATCH 174/595] Merge apibutnotreally with the main packages Do not consider anything outside of the true API safe to use. And even then, I'm changing things. Just wait. Please I beg you. --- .../java/WayofTime/bloodmagic/BloodMagic.java | 6 ++--- .../AlchemyArrayEffect.java | 4 +-- .../AlchemyArrayEffectAttractor.java | 1 - .../AlchemyArrayEffectBinding.java | 2 -- .../AlchemyArrayEffectBounce.java | 3 +-- .../AlchemyArrayEffectCrafting.java | 2 +- .../AlchemyArrayEffectCraftingNew.java | 2 +- .../AlchemyArrayEffectMovement.java | 3 +-- .../alchemyArray/AlchemyArrayEffectSigil.java | 3 +-- .../AlchemyArrayEffectSkeletonTurret.java | 1 - .../AlchemyArrayEffectUpdraft.java | 3 +-- .../AlchemyCircleRenderer.java | 2 +- .../altar/AltarComponent.java | 2 +- .../altar/AltarUpgrade.java | 2 +- .../bloodmagic/altar/BloodAltar.java | 11 ++++---- .../altar/EnumAltarComponent.java | 2 +- .../altar/EnumAltarTier.java | 2 +- .../altar/IAltarComponent.java | 2 +- .../altar/IAltarManipulator.java | 2 +- .../altar/IBloodAltar.java | 2 +- .../bloodmagic/api/impl/BloodMagicAPI.java | 2 +- .../api/impl/BloodMagicCorePlugin.java | 2 +- .../api/impl/BloodMagicRecipeRegistrar.java | 2 +- .../api/impl/recipe/RecipeBloodAltar.java | 2 +- .../apibutnotreally/package-info.java | 6 ----- .../bloodmagic/block/BlockAlchemyTable.java | 2 +- .../bloodmagic/block/BlockAltar.java | 20 +++++++-------- .../bloodmagic/block/BlockDemonCrucible.java | 4 +-- .../bloodmagic/block/BlockDemonCrystal.java | 4 +-- .../block/BlockDimensionalPortal.java | 6 ++--- .../block/BlockInputRoutingNode.java | 2 +- .../bloodmagic/block/BlockLifeEssence.java | 2 +- .../bloodmagic/block/BlockMimic.java | 4 +-- .../block/BlockOutputRoutingNode.java | 2 +- .../block/BlockRitualController.java | 14 +++++------ .../bloodmagic/block/BlockRitualStone.java | 4 +-- .../bloodmagic/block/BlockSoulForge.java | 2 +- .../bloodmagic/block/BlockTeleposer.java | 2 +- .../block/enums/EnumSubWillType.java | 2 +- .../bloodmagic/client/gui/GuiHandler.java | 2 +- .../client/hud/HUDElementDemonWillAura.java | 2 +- .../mesh/CustomMeshDefinitionActivatable.java | 2 +- .../mesh/CustomMeshDefinitionMultiWill.java | 4 +-- .../mesh/CustomMeshDefinitionWillGem.java | 2 +- .../AttractorAlchemyCircleRenderer.java | 2 +- .../BindingAlchemyCircleRenderer.java | 2 +- .../DualAlchemyCircleRenderer.java | 2 +- .../SingleAlchemyCircleRenderer.java | 2 +- .../StaticAlchemyCircleRenderer.java | 2 +- .../render/block/RenderAlchemyArray.java | 4 +-- .../client/render/block/RenderAltar.java | 4 +-- .../render/block/RenderItemRoutingNode.java | 2 +- .../command/sub/SubCommandBind.java | 8 +++--- .../command/sub/SubCommandNetwork.java | 4 +-- .../bloodmagic/command/sub/SubCommandOrb.java | 6 ++--- .../bloodmagic/compat/guideapi/BookUtils.java | 4 +-- .../compat/guideapi/book/CategoryAlchemy.java | 2 +- .../guideapi/book/CategoryArchitect.java | 6 ++--- .../compat/guideapi/book/CategoryDemon.java | 2 +- .../compat/guideapi/book/CategoryRitual.java | 4 +-- .../compat/guideapi/book/CategorySpell.java | 2 +- .../compat/guideapi/page/PageAltarRecipe.java | 4 +-- .../page/PageTartaricForgeRecipe.java | 4 +-- .../compat/jei/BloodMagicJEIPlugin.java | 6 ++--- .../AlchemyArrayCraftingCategory.java | 2 +- .../AlchemyTableRecipeCategory.java | 4 +-- .../AlchemyTableRecipeHandler.java | 2 +- .../alchemyTable/AlchemyTableRecipeJEI.java | 2 +- .../alchemyTable/AlchemyTableRecipeMaker.java | 4 +-- .../compat/jei/altar/AltarRecipeCategory.java | 2 +- .../ArmourDowngradeRecipeCategory.java | 2 +- .../ArmourDowngradeRecipeHandler.java | 2 +- .../ArmourDowngradeRecipeJEI.java | 4 +-- .../ArmourDowngradeRecipeMaker.java | 4 +-- .../jei/binding/BindingRecipeCategory.java | 2 +- .../jei/binding/BindingRecipeHandler.java | 2 +- .../jei/binding/BindingRecipeMaker.java | 6 ++--- .../forge/TartaricForgeRecipeCategory.java | 2 +- .../compat/waila/BloodMagicHwylaPlugin.java | 2 +- .../provider/DataProviderAlchemyArray.java | 2 +- .../provider/DataProviderBloodAltar.java | 2 +- .../waila/provider/DataProviderBloodTank.java | 2 +- .../DataProviderRitualController.java | 12 ++++----- .../waila/provider/DataProviderTeleposer.java | 2 +- .../compress/AdvancedCompressionHandler.java | 2 -- .../compress/BaseCompressionHandler.java | 1 - .../compress/CompressionHandler.java | 2 +- .../compress/CompressionRegistry.java | 2 +- .../compress/StorageBlockCraftingManager.java | 1 - .../bloodmagic/core/RegistrarBloodMagic.java | 4 +-- .../core/RegistrarBloodMagicRecipes.java | 8 +++--- .../data}/BMWorldSavedData.java | 4 +-- .../saving => core/data}/SoulNetwork.java | 16 ++++++------ .../core/recipe/IngredientBloodOrb.java | 6 ++--- .../registry/AlchemyArrayRecipeRegistry.java | 10 ++++---- .../registry/AlchemyTableRecipeRegistry.java | 4 +-- .../registry/AltarRecipeRegistry.java | 10 ++++---- .../registry/HarvestRegistry.java | 6 ++--- .../registry/ImperfectRitualRegistry.java | 12 ++++----- .../LivingArmourDowngradeRecipeRegistry.java | 6 ++--- .../registry/OrbRegistry.java | 6 ++--- .../registry/RitualRegistry.java | 14 +++++------ .../registry/TartaricForgeRecipeRegistry.java | 4 +-- .../bloodmagic/demonAura/WillChunk.java | 2 +- .../demonAura/WorldDemonWillHandler.java | 10 ++++---- .../entity/mob/EntityAspectedDemonBase.java | 4 +-- .../entity/mob/EntityCorruptedChicken.java | 2 +- .../entity/mob/EntityCorruptedSheep.java | 2 +- .../entity/mob/EntityCorruptedSpider.java | 2 +- .../entity/mob/EntitySentientSpecter.java | 4 +-- .../entity/projectile/EntityBloodLight.java | 2 +- .../entity/projectile/EntityMeteor.java | 2 +- .../projectile/EntitySentientArrow.java | 6 ++--- .../event/AddToNetworkEvent.java | 2 +- .../event/AltarCraftedEvent.java | 4 +-- .../event/BoundToolEvent.java | 2 +- .../event/ItemBindEvent.java | 4 +-- .../event/RitualEvent.java | 10 ++++---- .../event/SacrificeKnifeUsedEvent.java | 2 +- .../event/SoulNetworkEvent.java | 2 +- .../event/TeleposeEvent.java | 2 +- .../bloodmagic/gson/Serializers.java | 2 +- .../iface/IActivatable.java | 2 +- .../iface/IAlchemyArray.java | 2 +- .../iface/IAltarReader.java | 2 +- .../iface/IBindable.java | 4 +-- .../iface/ICustomAlchemyConsumable.java | 2 +- .../iface/IDemonWillViewer.java | 2 +- .../iface/IDocumentedBlock.java | 2 +- .../iface/IHarvestHandler.java | 7 +++--- .../iface/IItemLPContainer.java | 2 +- .../iface/IMultiWillTool.java | 4 +-- .../iface/INodeRenderer.java | 2 +- .../iface/IPurificationAsh.java | 2 +- .../iface/ISentientSwordEffectProvider.java | 4 +-- .../iface/ISentientTool.java | 2 +- .../{apibutnotreally => }/iface/ISigil.java | 5 ++-- .../iface/IUpgradeTrainer.java | 2 +- .../inversion/CorruptionHandler.java | 2 +- .../inversion/InversionPillarHandler.java | 2 +- .../item/ItemActivationCrystal.java | 4 +-- .../bloodmagic/item/ItemAltarMaker.java | 7 +++--- .../bloodmagic/item/ItemBindableBase.java | 4 +-- .../bloodmagic/item/ItemBloodOrb.java | 8 +++--- .../bloodmagic/item/ItemBoundAxe.java | 6 ++--- .../bloodmagic/item/ItemBoundPickaxe.java | 6 ++--- .../bloodmagic/item/ItemBoundShovel.java | 6 ++--- .../bloodmagic/item/ItemBoundSword.java | 12 ++++----- .../bloodmagic/item/ItemBoundTool.java | 16 ++++++------ .../item/ItemDaggerOfSacrifice.java | 7 +++--- .../bloodmagic/item/ItemDemonCrystal.java | 4 +-- .../bloodmagic/item/ItemDemonWillGauge.java | 2 +- .../bloodmagic/item/ItemExperienceBook.java | 2 +- .../bloodmagic/item/ItemInscriptionTool.java | 6 ++--- .../bloodmagic/item/ItemLavaCrystal.java | 4 +-- .../bloodmagic/item/ItemPotionFlask.java | 2 +- .../bloodmagic/item/ItemRitualDiviner.java | 14 +++++------ .../bloodmagic/item/ItemRitualReader.java | 12 ++++----- .../item/ItemSacrificialDagger.java | 16 ++++++------ .../bloodmagic/item/ItemSanguineBook.java | 10 ++++---- .../impl => item}/ItemSigil.java | 10 ++++---- .../impl => item}/ItemSigilToggleable.java | 14 +++++------ .../item/ItemTelepositionFocus.java | 6 ++--- .../bloodmagic/item/ItemUpgradeTome.java | 6 ++--- .../bloodmagic/item/ItemUpgradeTrainer.java | 8 +++--- .../item/alchemy/ItemCuttingFluid.java | 4 +-- .../item/armour/ItemLivingArmour.java | 12 ++++----- .../item/armour/ItemSentientArmour.java | 10 ++++---- .../item/block/ItemBlockDemonCrystal.java | 2 +- .../item/gear/ItemPackSacrifice.java | 12 ++++----- .../item/gear/ItemPackSelfSacrifice.java | 14 +++++------ .../item/inventory/ContainerHolding.java | 2 +- .../item/inventory/InventoryHolding.java | 4 +-- .../item/inventory/ItemInventory.java | 4 +-- .../item/routing/ItemNodeRouter.java | 6 ++--- .../bloodmagic/item/sigil/ItemSigilAir.java | 10 ++++---- .../bloodmagic/item/sigil/ItemSigilBase.java | 4 +-- .../item/sigil/ItemSigilBloodLight.java | 10 ++++---- .../item/sigil/ItemSigilBounce.java | 2 +- .../bloodmagic/item/sigil/ItemSigilClaw.java | 2 +- .../item/sigil/ItemSigilCompression.java | 4 +-- .../item/sigil/ItemSigilDivination.java | 8 +++--- .../sigil/ItemSigilElementalAffinity.java | 2 +- .../item/sigil/ItemSigilEnderSeverance.java | 2 +- .../item/sigil/ItemSigilFastMiner.java | 6 ++--- .../item/sigil/ItemSigilFilledHand.java | 2 +- .../bloodmagic/item/sigil/ItemSigilFrost.java | 2 +- .../item/sigil/ItemSigilGreenGrove.java | 2 +- .../bloodmagic/item/sigil/ItemSigilHaste.java | 2 +- .../item/sigil/ItemSigilHolding.java | 12 ++++----- .../bloodmagic/item/sigil/ItemSigilLava.java | 6 ++--- .../item/sigil/ItemSigilMagnetism.java | 2 +- .../item/sigil/ItemSigilPhantomBridge.java | 2 +- .../bloodmagic/item/sigil/ItemSigilSeer.java | 8 +++--- .../item/sigil/ItemSigilSuppression.java | 2 +- .../item/sigil/ItemSigilTeleposition.java | 10 ++++---- .../item/sigil/ItemSigilToggleableBase.java | 4 +-- .../item/sigil/ItemSigilTransposition.java | 12 ++++----- .../bloodmagic/item/sigil/ItemSigilVoid.java | 6 ++--- .../bloodmagic/item/sigil/ItemSigilWater.java | 6 ++--- .../item/sigil/ItemSigilWhirlwind.java | 2 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 8 +++--- .../item/soul/ItemSentientArmourGem.java | 4 +-- .../bloodmagic/item/soul/ItemSentientAxe.java | 18 ++++++------- .../bloodmagic/item/soul/ItemSentientBow.java | 12 ++++----- .../item/soul/ItemSentientPickaxe.java | 18 ++++++------- .../item/soul/ItemSentientShovel.java | 18 ++++++------- .../item/soul/ItemSentientSword.java | 18 ++++++------- .../bloodmagic/item/soul/ItemSoulGem.java | 14 +++++------ .../livingArmour/ILivingArmour.java | 2 +- .../bloodmagic/livingArmour/LivingArmour.java | 6 +---- .../livingArmour/LivingArmourHandler.java | 6 ++--- .../livingArmour/LivingArmourUpgrade.java | 2 +- .../livingArmour/StatTracker.java | 3 +-- .../LivingArmourUpgradeBattleHungry.java | 4 +-- .../LivingArmourUpgradeCrippledArm.java | 4 +-- .../LivingArmourUpgradeDigSlowdown.java | 4 +-- .../LivingArmourUpgradeDisoriented.java | 4 +-- .../LivingArmourUpgradeMeleeDecrease.java | 4 +-- .../LivingArmourUpgradeQuenched.java | 4 +-- .../LivingArmourUpgradeSlippery.java | 4 +-- .../LivingArmourUpgradeSlowHeal.java | 4 +-- .../LivingArmourUpgradeSlowness.java | 4 +-- .../LivingArmourUpgradeStormTrooper.java | 4 +-- .../tracker/StatTrackerArrowProtect.java | 4 +-- .../tracker/StatTrackerArrowShot.java | 4 +-- .../tracker/StatTrackerCriticalStrike.java | 4 +-- .../tracker/StatTrackerDigging.java | 4 +-- .../tracker/StatTrackerExperience.java | 4 +-- .../tracker/StatTrackerFallProtect.java | 4 +-- .../tracker/StatTrackerFireResist.java | 4 +-- .../livingArmour/tracker/StatTrackerFood.java | 4 +-- .../tracker/StatTrackerGraveDigger.java | 4 +-- .../tracker/StatTrackerGrimReaperSprint.java | 4 +-- .../tracker/StatTrackerHealthboost.java | 4 +-- .../livingArmour/tracker/StatTrackerJump.java | 4 +-- .../tracker/StatTrackerMeleeDamage.java | 4 +-- .../tracker/StatTrackerMovement.java | 4 +-- .../tracker/StatTrackerNightSight.java | 4 +-- .../tracker/StatTrackerPhysicalProtect.java | 4 +-- .../tracker/StatTrackerPoison.java | 4 +-- .../tracker/StatTrackerRepairing.java | 4 +-- .../tracker/StatTrackerSelfSacrifice.java | 4 +-- .../tracker/StatTrackerSolarPowered.java | 4 +-- .../tracker/StatTrackerSprintAttack.java | 4 +-- .../tracker/StatTrackerStepAssist.java | 4 +-- .../LivingArmourUpgradeArrowProtect.java | 2 +- .../upgrade/LivingArmourUpgradeArrowShot.java | 4 +-- .../LivingArmourUpgradeCriticalStrike.java | 2 +- .../upgrade/LivingArmourUpgradeDigging.java | 4 +-- .../upgrade/LivingArmourUpgradeElytra.java | 4 +-- .../LivingArmourUpgradeExperience.java | 2 +- .../LivingArmourUpgradeFallProtect.java | 2 +- .../LivingArmourUpgradeFireResist.java | 6 ++--- .../LivingArmourUpgradeGraveDigger.java | 2 +- .../LivingArmourUpgradeGrimReaperSprint.java | 4 +-- .../LivingArmourUpgradeHealthboost.java | 4 +-- .../upgrade/LivingArmourUpgradeJump.java | 4 +-- .../LivingArmourUpgradeKnockbackResist.java | 2 +- .../LivingArmourUpgradeMeleeDamage.java | 4 +-- .../LivingArmourUpgradeNightSight.java | 6 ++--- .../LivingArmourUpgradePhysicalProtect.java | 2 +- .../LivingArmourUpgradePoisonResist.java | 6 ++--- .../upgrade/LivingArmourUpgradeRepairing.java | 4 +-- .../LivingArmourUpgradeSelfSacrifice.java | 2 +- .../LivingArmourUpgradeSolarPowered.java | 4 +-- .../upgrade/LivingArmourUpgradeSpeed.java | 4 +-- .../LivingArmourUpgradeSprintAttack.java | 2 +- .../LivingArmourUpgradeStepAssist.java | 4 +-- .../network/DemonAuraPacketProcessor.java | 4 +-- .../{apibutnotreally => }/orb/BloodOrb.java | 2 +- .../{apibutnotreally => }/orb/IBloodOrb.java | 2 +- .../bloodmagic/potion/BMPotionUtils.java | 7 +++--- .../potion/PotionEventHandlers.java | 2 +- .../bloodmagic/proxy/ClientProxy.java | 4 +-- .../bloodmagic/proxy/CommonProxy.java | 6 ++--- .../recipe/AlchemyTableCustomRecipe.java | 4 +-- .../recipe/AlchemyTableRecipe.java | 2 +- .../recipe/LivingArmourDowngradeRecipe.java | 4 +-- .../recipe/TartaricForgeRecipe.java | 2 +- .../AlchemyTableDyeableRecipe.java | 4 +-- .../AlchemyTablePotionRecipe.java | 2 +- .../registry/ModArmourTrackers.java | 2 +- .../registry/ModCorruptionBlocks.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 18 ++++++------- .../bloodmagic/registry/ModRituals.java | 12 ++++----- .../bloodmagic/ritual/RitualAltarBuilder.java | 16 ++++++------ .../bloodmagic/ritual/RitualAnimalGrowth.java | 4 +-- .../bloodmagic/ritual/RitualArmourEvolve.java | 2 +- .../bloodmagic/ritual/RitualCobblestone.java | 2 +- .../bloodmagic/ritual/RitualContainment.java | 4 +-- .../bloodmagic/ritual/RitualCrushing.java | 10 ++++---- .../ritual/RitualCrystalHarvest.java | 2 +- .../bloodmagic/ritual/RitualExpulsion.java | 6 ++--- .../ritual/RitualFeatheredKnife.java | 10 ++++---- .../bloodmagic/ritual/RitualFelling.java | 2 +- .../bloodmagic/ritual/RitualForsakenSoul.java | 2 +- .../bloodmagic/ritual/RitualFullStomach.java | 2 +- .../bloodmagic/ritual/RitualGreenGrove.java | 6 ++--- .../bloodmagic/ritual/RitualHarvest.java | 8 +++--- .../bloodmagic/ritual/RitualInterdiction.java | 4 +-- .../bloodmagic/ritual/RitualJumping.java | 2 +- .../bloodmagic/ritual/RitualLava.java | 10 ++++---- .../ritual/RitualLivingArmourDowngrade.java | 8 +++--- .../bloodmagic/ritual/RitualMagnetic.java | 4 +-- .../bloodmagic/ritual/RitualMeteor.java | 4 +-- .../bloodmagic/ritual/RitualPlacer.java | 2 +- .../bloodmagic/ritual/RitualPortal.java | 10 ++++---- .../bloodmagic/ritual/RitualPump.java | 2 +- .../bloodmagic/ritual/RitualRegeneration.java | 8 +++--- .../bloodmagic/ritual/RitualSpeed.java | 4 +-- .../bloodmagic/ritual/RitualSuppression.java | 2 +- .../ritual/RitualUpgradeRemove.java | 8 +++--- .../bloodmagic/ritual/RitualWater.java | 2 +- .../ritual/RitualWellOfSuffering.java | 2 +- .../bloodmagic/ritual/RitualZephyr.java | 2 +- .../data}/AreaDescriptor.java | 4 +-- .../data}/CapabilityRuneType.java | 2 +- .../data}/EnumRitualReaderState.java | 2 +- .../ritual => ritual/data}/EnumRuneType.java | 2 +- .../data}/IMasterRitualStone.java | 6 ++--- .../ritual => ritual/data}/IRitualStone.java | 2 +- .../ritual => ritual/data}/Ritual.java | 9 ++++--- .../data}/RitualComponent.java | 2 +- .../data}/RitualRenderer.java | 2 +- .../imperfect/IImperfectRitualStone.java | 2 +- .../data}/imperfect/ImperfectRitual.java | 7 +++--- .../data}/imperfect/package-info.java | 2 +- .../harvest/HarvestHandlerPlantable.java | 6 ++--- .../ritual/harvest/HarvestHandlerStem.java | 6 ++--- .../ritual/harvest/HarvestHandlerTall.java | 6 ++--- .../ritual/imperfect/ImperfectRitualDay.java | 6 ++--- .../imperfect/ImperfectRitualNight.java | 6 ++--- .../ritual/imperfect/ImperfectRitualRain.java | 6 ++--- .../imperfect/ImperfectRitualResistance.java | 6 ++--- .../imperfect/ImperfectRitualZombie.java | 6 ++--- .../ritual/portal/LocationsHandler.java | 18 ++++++------- .../bloodmagic/ritual/portal/Teleports.java | 8 +++--- .../soul/DemonWillHolder.java | 2 +- .../soul/EnumDemonWillType.java | 2 +- .../soul/IDemonWill.java | 2 +- .../soul/IDemonWillConduit.java | 2 +- .../soul/IDemonWillGem.java | 2 +- .../soul/IDemonWillWeapon.java | 2 +- .../soul/IDiscreteDemonWill.java | 2 +- .../soul/PlayerDemonWillHandler.java | 5 ++-- .../bloodmagic/structures/Dungeon.java | 2 +- .../bloodmagic/structures/DungeonRoom.java | 2 +- .../teleport/ITeleport.java | 2 +- .../teleport/PortalLocation.java | 4 +-- .../teleport/Teleport.java | 2 +- .../teleport/TeleportQueue.java | 2 +- .../teleport/TeleporterBloodMagic.java | 2 +- .../bloodmagic/tile/TileAlchemyArray.java | 10 ++++---- .../bloodmagic/tile/TileAlchemyTable.java | 14 +++++------ .../WayofTime/bloodmagic/tile/TileAltar.java | 4 +-- .../bloodmagic/tile/TileBloodTank.java | 2 +- .../bloodmagic/tile/TileDemonCrucible.java | 8 +++--- .../bloodmagic/tile/TileDemonCrystal.java | 4 +-- .../tile/TileDemonCrystallizer.java | 6 ++--- .../bloodmagic/tile/TileDemonPylon.java | 6 ++--- .../tile/TileImperfectRitualStone.java | 10 ++++---- .../bloodmagic/tile/TileIncenseAltar.java | 4 +-- .../bloodmagic/tile/TileInversionPillar.java | 4 +-- .../tile/TileMasterRitualStone.java | 22 ++++++++-------- .../bloodmagic/tile/TilePhantomBlock.java | 2 +- .../tile/TilePurificationAltar.java | 6 ++--- .../bloodmagic/tile/TileSoulForge.java | 10 ++++---- .../bloodmagic/tile/TileSpectralBlock.java | 2 +- .../bloodmagic/tile/TileTeleposer.java | 12 ++++----- .../tile/container/ContainerAlchemyTable.java | 2 +- .../tile/container/ContainerSoulForge.java | 4 +-- .../tile/routing/TileFilteredRoutingNode.java | 2 +- .../tile/routing/TileMasterRoutingNode.java | 4 +-- .../tile/routing/TileRoutingNode.java | 2 +- .../{apibutnotreally => util}/BlockStack.java | 3 ++- .../{apibutnotreally => util}/Constants.java | 2 +- .../DamageSourceBloodMagic.java | 2 +- .../bloodmagic/util/GhostItemHelper.java | 3 +-- .../ItemStackWrapper.java | 3 ++- .../PleaseStopUsingMe.java} | 7 +++--- .../java/WayofTime/bloodmagic/util/Utils.java | 8 +++--- .../util/handler/event/ClientHandler.java | 8 +++--- .../util/handler/event/CraftingHandler.java | 12 ++++----- .../util/handler/event/GenericHandler.java | 25 +++++++++---------- .../handler/event/LivingArmourHandler.java | 4 +-- .../handler/event/StatTrackerHandler.java | 2 +- .../util/handler/event/WillHandler.java | 2 +- .../util/helper/BindableHelper.java | 8 +++--- .../util/helper/IncenseHelper.java | 4 +-- .../util/helper/ItemHelper.java | 12 ++++----- .../util/helper/LogHelper.java | 10 ++++---- .../util/helper/NBTHelper.java | 2 +- .../util/helper/NetworkHelper.java | 16 ++++++------ .../util/helper/PlayerHelper.java | 4 +-- .../util/helper/PlayerSacrificeHelper.java | 6 ++--- .../util/helper/PurificationHelper.java | 4 +-- .../bloodmagic/util/helper/RecipeHelper.java | 6 ++--- .../util/helper/RitualHelper.java | 12 ++++----- 399 files changed, 958 insertions(+), 977 deletions(-) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/alchemyCrafting => alchemyArray}/AlchemyArrayEffect.java (86%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/alchemyCrafting => alchemyArray}/AlchemyArrayEffectCrafting.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/alchemyCrafting => alchemyArray}/AlchemyArrayEffectCraftingNew.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/alchemyCrafting => alchemyArray}/AlchemyCircleRenderer.java (98%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/altar/AltarComponent.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/altar/AltarUpgrade.java (98%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/altar/EnumAltarComponent.java (91%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/altar/EnumAltarTier.java (99%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/altar/IAltarComponent.java (84%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/altar/IAltarManipulator.java (73%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/altar/IBloodAltar.java (95%) delete mode 100644 src/main/java/WayofTime/bloodmagic/apibutnotreally/package-info.java rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/compress/CompressionHandler.java (89%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/compress/CompressionRegistry.java (98%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/saving => core/data}/BMWorldSavedData.java (93%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/saving => core/data}/SoulNetwork.java (90%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/AlchemyArrayRecipeRegistry.java (97%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/AlchemyTableRecipeRegistry.java (90%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/AltarRecipeRegistry.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/HarvestRegistry.java (95%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/ImperfectRitualRegistry.java (87%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/LivingArmourDowngradeRecipeRegistry.java (90%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/OrbRegistry.java (91%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/RitualRegistry.java (87%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => core}/registry/TartaricForgeRecipeRegistry.java (90%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/event/AddToNetworkEvent.java (94%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/event/AltarCraftedEvent.java (87%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/event/BoundToolEvent.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/event/ItemBindEvent.java (87%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/event/RitualEvent.java (89%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/event/SacrificeKnifeUsedEvent.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/event/SoulNetworkEvent.java (98%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/event/TeleposeEvent.java (98%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IActivatable.java (78%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IAlchemyArray.java (66%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IAltarReader.java (72%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IBindable.java (92%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/ICustomAlchemyConsumable.java (82%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IDemonWillViewer.java (86%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IDocumentedBlock.java (95%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IHarvestHandler.java (78%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IItemLPContainer.java (83%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IMultiWillTool.java (52%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/INodeRenderer.java (72%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IPurificationAsh.java (80%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/ISentientSwordEffectProvider.java (74%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/ISentientTool.java (79%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/ISigil.java (79%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/iface/IUpgradeTrainer.java (86%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/impl => item}/ItemSigil.java (71%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/impl => item}/ItemSigilToggleable.java (89%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/livingArmour/ILivingArmour.java (95%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/livingArmour/LivingArmourHandler.java (89%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/livingArmour/LivingArmourUpgrade.java (97%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/livingArmour/StatTracker.java (94%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/orb/BloodOrb.java (97%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/orb/IBloodOrb.java (75%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/recipe/AlchemyTableCustomRecipe.java (91%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/recipe/AlchemyTableRecipe.java (99%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/recipe/LivingArmourDowngradeRecipe.java (97%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/recipe/TartaricForgeRecipe.java (99%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/AreaDescriptor.java (99%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/CapabilityRuneType.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/EnumRitualReaderState.java (62%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/EnumRuneType.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/IMasterRitualStone.java (88%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/IRitualStone.java (91%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/Ritual.java (98%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/RitualComponent.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/RitualRenderer.java (87%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/imperfect/IImperfectRitualStone.java (88%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/imperfect/ImperfectRitual.java (93%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/ritual => ritual/data}/imperfect/package-info.java (71%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/soul/DemonWillHolder.java (97%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/soul/EnumDemonWillType.java (95%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/soul/IDemonWill.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/soul/IDemonWillConduit.java (90%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/soul/IDemonWillGem.java (95%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/soul/IDemonWillWeapon.java (84%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/soul/IDiscreteDemonWill.java (95%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/soul/PlayerDemonWillHandler.java (98%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/teleport/ITeleport.java (59%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/teleport/PortalLocation.java (95%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/teleport/Teleport.java (97%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/teleport/TeleportQueue.java (93%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/teleport/TeleporterBloodMagic.java (94%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => util}/BlockStack.java (97%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => util}/Constants.java (99%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => util}/DamageSourceBloodMagic.java (93%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => util}/ItemStackWrapper.java (98%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally/BloodMagicAPI.java => util/PleaseStopUsingMe.java} (74%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/BindableHelper.java (95%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/IncenseHelper.java (84%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/ItemHelper.java (92%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/LogHelper.java (74%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/NBTHelper.java (83%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/NetworkHelper.java (91%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/PlayerHelper.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/PlayerSacrificeHelper.java (96%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/PurificationHelper.java (89%) rename src/main/java/WayofTime/bloodmagic/{apibutnotreally => }/util/helper/RitualHelper.java (92%) diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index c8671049..18a83ef5 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -3,9 +3,9 @@ package WayofTime.bloodmagic; import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.util.helper.LogHelper; +import WayofTime.bloodmagic.core.registry.OrbRegistry; +import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.util.helper.LogHelper; import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffect.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java similarity index 86% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffect.java rename to src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java index d08c968c..6bac1e53 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffect.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.alchemyCrafting; +package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; +import WayofTime.bloodmagic.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java index e5888e90..9dc68b22 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; import WayofTime.bloodmagic.fakePlayer.FakePlayerBM; import WayofTime.bloodmagic.tile.TileAlchemyArray; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java index d8f09294..d3e9849c 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffectCrafting; import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java index a5d962b1..85d62dee 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; +import WayofTime.bloodmagic.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCrafting.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCrafting.java rename to src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java index 16712dee..9f658335 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCrafting.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.alchemyCrafting; +package WayofTime.bloodmagic.alchemyArray; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java rename to src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java index 6b06b090..b96c9052 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyArrayEffectCraftingNew.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.alchemyCrafting; +package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java index 46cc3ed0..3bf96427 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; +import WayofTime.bloodmagic.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java index 66ce98a8..beb4ba46 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; +import WayofTime.bloodmagic.iface.ISigil; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java index 5f02f6c4..6f1fd59d 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; import WayofTime.bloodmagic.tile.TileAlchemyArray; import com.google.common.base.Predicate; import net.minecraft.entity.EntityLiving; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java index 4f89481b..f2cb4612 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; +import WayofTime.bloodmagic.iface.IAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyCircleRenderer.java rename to src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java index 789257c5..89b0e042 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/alchemyCrafting/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.alchemyCrafting; +package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarComponent.java rename to src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java index 20a70d23..e70e496b 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.altar; +package WayofTime.bloodmagic.altar; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarUpgrade.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarUpgrade.java rename to src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java index 7598f58a..5100406c 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/AltarUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.altar; +package WayofTime.bloodmagic.altar; public class AltarUpgrade { private int speedCount; diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 859c2ffd..3d22f37e 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -3,12 +3,11 @@ 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.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.altar.*; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.orb.BloodOrb; +import WayofTime.bloodmagic.orb.IBloodOrb; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/EnumAltarComponent.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarComponent.java rename to src/main/java/WayofTime/bloodmagic/altar/EnumAltarComponent.java index 8f863756..aa0327c8 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/EnumAltarComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.altar; +package WayofTime.bloodmagic.altar; import java.util.Locale; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarTier.java rename to src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java index b783a928..4eaf1714 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/EnumAltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.altar; +package WayofTime.bloodmagic.altar; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarComponent.java rename to src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java index 666f5be0..0db6e35e 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.altar; +package WayofTime.bloodmagic.altar; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarManipulator.java b/src/main/java/WayofTime/bloodmagic/altar/IAltarManipulator.java similarity index 73% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarManipulator.java rename to src/main/java/WayofTime/bloodmagic/altar/IAltarManipulator.java index 5a69420e..5ce9f00c 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IAltarManipulator.java +++ b/src/main/java/WayofTime/bloodmagic/altar/IAltarManipulator.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.altar; +package WayofTime.bloodmagic.altar; /** * Any item that implements this interface will not be pulled into the Altar on diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IBloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IBloodAltar.java rename to src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java index a8642b89..a72c1afd 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/altar/IBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.altar; +package WayofTime.bloodmagic.altar; public interface IBloodAltar { int getCapacity(); diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index df5dc2b0..12717e3e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.api.impl; import WayofTime.bloodmagic.api.IBloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.EnumAltarComponent; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index f6255a0f..d73df0b8 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -5,7 +5,7 @@ import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicAPI; import WayofTime.bloodmagic.api.IBloodMagicPlugin; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.EnumAltarComponent; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockDecorative; import WayofTime.bloodmagic.block.enums.EnumBloodRune; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index 470d1ba3..e65eac53 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -5,7 +5,7 @@ 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.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.core.recipe.IngredientBloodOrb; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; 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 40f01944..2490f9ce 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.api.impl.recipe; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.EnumAltarTier; import com.google.common.base.Preconditions; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/package-info.java b/src/main/java/WayofTime/bloodmagic/apibutnotreally/package-info.java deleted file mode 100644 index 20478ed8..00000000 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@Deprecated // This entire "api" is going to be nuked over time. Consider all of this unstable. -@API(owner = BloodMagic.MODID, provides = BloodMagic.MODID + "|API", apiVersion = BloodMagic.VERSION) -package WayofTime.bloodmagic.apibutnotreally; - -import WayofTime.bloodmagic.BloodMagic; -import net.minecraftforge.fml.common.API; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java index 1ced3484..e3b768f0 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.item.block.ItemBlockAlchemyTable; import WayofTime.bloodmagic.tile.TileAlchemyTable; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 81b6dc1a..7a63b22d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -2,16 +2,16 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; -import WayofTime.bloodmagic.apibutnotreally.altar.IAltarManipulator; -import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; -import WayofTime.bloodmagic.apibutnotreally.iface.IAltarReader; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.iface.IDocumentedBlock; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.IAltarManipulator; +import WayofTime.bloodmagic.altar.IBloodAltar; +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.core.data.SoulNetwork; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 09af9235..0d61ac9e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; -import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.soul.IDemonWillGem; +import WayofTime.bloodmagic.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileDemonCrucible; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 7d286cd3..ddea0501 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.Block; import net.minecraft.block.material.Material; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 44681800..02df2866 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.apibutnotreally.teleport.PortalLocation; -import WayofTime.bloodmagic.apibutnotreally.teleport.TeleportQueue; +import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.teleport.PortalLocation; +import WayofTime.bloodmagic.teleport.TeleportQueue; import WayofTime.bloodmagic.block.base.BlockInteger; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.ritual.portal.Teleports; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java index 6dba2cde..85aab8ae 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java index 5b666693..8828d7c0 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.material.Material; import net.minecraft.util.BlockRenderLayer; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 56a40037..003a64de 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; -import WayofTime.bloodmagic.apibutnotreally.altar.IAltarComponent; +import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.IAltarComponent; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumMimic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java index 92e59c3c..5882dc30 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 726b1af4..4b4c1b61 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.apibutnotreally.util.helper.RitualHelper; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.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; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 4d51b164..483a10fb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; -import WayofTime.bloodmagic.apibutnotreally.ritual.IRitualStone; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.data.IRitualStone; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index c56ac05e..7b8cc730 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileSoulForge; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index c242b3b8..4df0bbe5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.tile.TileTeleposer; diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java index 08188509..01c05b88 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.block.enums; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.util.IStringSerializable; import java.util.Locale; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java index f2c1399e..80705ac1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.gui; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.item.inventory.ContainerHolding; import WayofTime.bloodmagic.item.inventory.InventoryHolding; import WayofTime.bloodmagic.tile.TileAlchemyTable; diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java index 07b1f281..72f5f05f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.hud; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.proxy.ClientProxy; import WayofTime.bloodmagic.util.Utils; import net.minecraft.client.Minecraft; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java index 75792062..a674b457 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.mesh; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.iface.IActivatable; +import WayofTime.bloodmagic.iface.IActivatable; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java index a27b8eba..58f7fc64 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.client.mesh; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.iface.IMultiWillTool; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.iface.IMultiWillTool; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java index 6900eead..a1e3af67 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.mesh; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.soul.ItemSoulGem; import net.minecraft.client.renderer.ItemMeshDefinition; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java index b90de1bf..4e330f9e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index 91fbb1b7..699916ca 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java index e5e91378..29f03cbb 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java index e7ec2570..f409062a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java index c91a06c3..a1e2b461 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; +import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; 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 023db61e..b954ce52 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.client.render.block; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; +import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.ItemStack; 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 1f592774..0c4a9073 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.block; -import WayofTime.bloodmagic.apibutnotreally.altar.AltarComponent; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.AltarComponent; +import WayofTime.bloodmagic.altar.EnumAltarTier; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.handler.event.ClientHandler; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java index eb13193b..d4cab8a7 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.client.render.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.apibutnotreally.iface.INodeRenderer; +import WayofTime.bloodmagic.iface.INodeRenderer; import WayofTime.bloodmagic.client.helper.ShaderHelper; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; import net.minecraft.client.Minecraft; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index 98828c1d..f01b70ee 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.command.sub; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.util.helper.BindableHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.util.helper.BindableHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import net.minecraft.command.CommandBase; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 1b164e28..07a53b22 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.command.sub; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java index 92eda02e..27a34df7 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.command.sub; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java index 13b1c7d6..80b78c00 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index eb3b8127..fcde6142 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index 599800cc..9648211e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; +import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; +import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java index 2363e749..92566ab3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index 5b9c507e..6e53c89d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; +import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java index 4f5446fd..6c3d17e9 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.guideapi.book; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java index 5c925f74..eca0eff2 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi.page; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java index a8189038..a26dd233 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.guideapi.page; -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index e6c26b9a..de5265ee 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -4,9 +4,9 @@ import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.client.gui.GuiSoulForge; import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingCategory; import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingRecipeJEI; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java index c026c81f..b6284e66 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyArray; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java index 53d792a2..e6ded288 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java index 8010e978..ea92c210 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java index f1a65187..3a88276f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.Lists; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java index db5ebc33..5ef8c619 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; import javax.annotation.Nonnull; import java.util.ArrayList; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java index 69515377..10f2f6a2 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.altar; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java index 675eae1c..b14c69fd 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java index b1e1eaf9..b5c2fd73 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java index e306b682..ba22f8c5 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java index f0194367..f7baa13c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.armourDowngrade; -import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.LivingArmourDowngradeRecipeRegistry; +import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; +import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; import javax.annotation.Nonnull; import java.util.ArrayList; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java index 8e0b0a76..a2493fbd 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.binding; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.IDrawable; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java index 4f756e80..3d429211 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.jei.binding; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import mezz.jei.api.recipe.IRecipeHandler; import mezz.jei.api.recipe.IRecipeWrapper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java index 38a92b55..db44651e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compat.jei.binding; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; +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; 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 81b69ce8..96b7db2f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.jei.forge; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; import WayofTime.bloodmagic.util.helper.TextHelper; import mezz.jei.api.gui.ICraftingGridHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java index c5908b25..46e16f45 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.waila; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.compat.waila.provider.*; import WayofTime.bloodmagic.tile.*; import mcp.mobius.waila.api.IWailaPlugin; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index 3a38301f..bc8ade1c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileAlchemyArray; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index a7d3a22d..a4ac2b7b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.compat.waila.provider; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index 477d2393..b664531c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.util.helper.TextHelper; import mcp.mobius.waila.api.IWailaConfigHandler; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index 6769804e..5f5ac41a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.util.helper.TextHelper; import joptsimple.internal.Strings; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java index 0463a22b..8f21ea90 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.tile.TileTeleposer; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java index b13f6d36..2050f6b7 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java @@ -1,7 +1,5 @@ package WayofTime.bloodmagic.compress; -import WayofTime.bloodmagic.apibutnotreally.compress.CompressionHandler; -import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; diff --git a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java index 9f4a2fcc..1af4b63b 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.compress; -import WayofTime.bloodmagic.apibutnotreally.compress.CompressionHandler; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionHandler.java rename to src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java index e36149c6..b7da216d 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.compress; +package WayofTime.bloodmagic.compress; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionRegistry.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionRegistry.java rename to src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java index 786306c9..280bd784 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/compress/CompressionRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.compress; +package WayofTime.bloodmagic.compress; import WayofTime.bloodmagic.util.Utils; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 2d51470c..4dd1822c 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.compress; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 54e3ca40..992bb9a1 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; -import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; +import WayofTime.bloodmagic.orb.BloodOrb; +import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.entity.mob.*; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index ba331b03..d49617dc 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicRecipeRegistrar; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; -import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.core.registry.OrbRegistry; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/BMWorldSavedData.java b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/BMWorldSavedData.java rename to src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java index be15d0a9..0eb2be6a 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/BMWorldSavedData.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.saving; +package WayofTime.bloodmagic.core.data; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/SoulNetwork.java rename to src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index 54098c72..55b09299 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/saving/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.apibutnotreally.saving; +package WayofTime.bloodmagic.core.data; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.event.AddToNetworkEvent; -import WayofTime.bloodmagic.apibutnotreally.event.SoulNetworkEvent; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.event.AddToNetworkEvent; +import WayofTime.bloodmagic.event.SoulNetworkEvent; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import com.google.common.base.Strings; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -112,14 +112,14 @@ public class SoulNetwork implements INBTSerializable { if (syphon < 100 && syphon > 0) { if (!user.capabilities.isCreativeMode) { user.hurtResistantTime = 0; - user.attackEntityFrom(BloodMagicAPI.damageSource, 1.0F); + user.attackEntityFrom(PleaseStopUsingMe.damageSource, 1.0F); } } else if (syphon >= 100) { if (!user.capabilities.isCreativeMode) { for (int i = 0; i < ((syphon + 99) / 100); i++) { user.hurtResistantTime = 0; - user.attackEntityFrom(BloodMagicAPI.damageSource, 1.0F); + user.attackEntityFrom(PleaseStopUsingMe.damageSource, 1.0F); } } } @@ -130,7 +130,7 @@ public class SoulNetwork implements INBTSerializable { if (getParent() != null) getParent().markDirty(); else - BloodMagicAPI.logger.error("A SoulNetwork was created, but a parent was not set to allow saving."); + PleaseStopUsingMe.logger.error("A SoulNetwork was created, but a parent was not set to allow saving."); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java index 9c71bb94..c61289d9 100644 --- a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.core.recipe; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; +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; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java index 06370e71..36edf7b1 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffectCrafting; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyCircleRenderer; +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; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyTableRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyTableRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java index ff55fd94..e09a6ce6 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AlchemyTableRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AltarRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AltarRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java index 4e4c9352..789ec6ad 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/AltarRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.ItemStackWrapper; +import WayofTime.bloodmagic.altar.EnumAltarTier; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.minecraft.item.ItemStack; @@ -29,7 +29,7 @@ public class AltarRecipeRegistry { if (!recipes.containsValue(altarRecipe) && altarRecipe.getInput().size() > 0) recipes.put(altarRecipe.getInput(), altarRecipe); else - BloodMagicAPI.logger.error("Error adding altar recipe for input [{}].", altarRecipe.toString()); + PleaseStopUsingMe.logger.error("Error adding altar recipe for input [{}].", altarRecipe.toString()); } public static void registerFillRecipe(ItemStack orbStack, EnumAltarTier tier, int maxForOrb, int consumeRate, int drainRate) { diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/HarvestRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/HarvestRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java index a0a5eeba..ab500fd8 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/HarvestRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.iface.IHarvestHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockStem; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/ImperfectRitualRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java index 16c5a510..0336e6b0 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/ImperfectRitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; @@ -23,7 +23,7 @@ public class ImperfectRitualRegistry { public static void registerRitual(ImperfectRitual imperfectRitual, String id, boolean enabled) { if (imperfectRitual != null) { if (registry.containsKey(id)) - BloodMagicAPI.logger.error("Duplicate imperfect ritual id: %s", id); + PleaseStopUsingMe.logger.error("Duplicate imperfect ritual id: %s", id); else { registry.put(id, imperfectRitual); enabledRituals.put(imperfectRitual, enabled); @@ -71,7 +71,7 @@ public class ImperfectRitualRegistry { try { return enabledRituals.get(imperfectRitual); } catch (NullPointerException e) { - BloodMagicAPI.logger.error("Invalid Imperfect Ritual was called"); + PleaseStopUsingMe.logger.error("Invalid Imperfect Ritual was called"); return false; } } diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/LivingArmourDowngradeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/LivingArmourDowngradeRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java index f2787e34..8360dbd5 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/LivingArmourDowngradeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; +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; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/OrbRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java index 0efd5b88..5ddbeb3c 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; +import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.orb.BloodOrb; import com.google.common.collect.ArrayListMultimap; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/RitualRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java index ced086b2..2c778938 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.ritual.data.Ritual; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; @@ -28,14 +28,14 @@ public class RitualRegistry { */ public static void registerRitual(Ritual ritual, String id, boolean enabled) { if (locked) { - BloodMagicAPI.logger.error("This registry has been locked. Please register your ritual earlier."); - BloodMagicAPI.logger.error("If you reflect this, I will hunt you down. - TehNut"); + PleaseStopUsingMe.logger.error("This registry has been locked. Please register your ritual earlier."); + PleaseStopUsingMe.logger.error("If you reflect this, I will hunt you down. - TehNut"); return; } if (ritual != null) { if (registry.containsKey(id)) - BloodMagicAPI.logger.error("Duplicate ritual id: %s", id); + PleaseStopUsingMe.logger.error("Duplicate ritual id: %s", id); else { registry.put(id, ritual); enabledRituals.put(ritual, enabled); @@ -78,7 +78,7 @@ public class RitualRegistry { try { return enabledRituals.get(ritual); } catch (NullPointerException e) { - BloodMagicAPI.logger.error("Invalid Ritual was called"); + PleaseStopUsingMe.logger.error("Invalid Ritual was called"); return false; } } diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/TartaricForgeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/TartaricForgeRecipeRegistry.java rename to src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java index 1090c897..83b075e0 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/registry/TartaricForgeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.registry; +package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java index 818bffc3..658280f0 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.demonAura; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.DemonWillHolder; import net.minecraft.world.chunk.Chunk; import java.lang.ref.WeakReference; diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index 96c4c15c..06cac743 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.demonAura; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; @@ -45,13 +45,13 @@ public class WorldDemonWillHandler { public static void addWillWorld(int dim) { if (!containedWills.containsKey(dim)) { containedWills.put(dim, new WillWorld(dim)); - BloodMagicAPI.logger.info("Creating demon will cache for world " + dim); + PleaseStopUsingMe.logger.info("Creating demon will cache for world " + dim); } } public static void removeWillWorld(int dim) { containedWills.remove(dim); - BloodMagicAPI.logger.info("Removing demon will cache for world " + dim); + PleaseStopUsingMe.logger.info("Removing demon will cache for world " + dim); } public static void addWillChunk(int dim, Chunk chunk, short base, DemonWillHolder currentWill) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java index 34879915..cb721ce7 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +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.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java index 0ae9a398..5044857f 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.entity.ai.EntityAIAttackStealthMelee; import WayofTime.bloodmagic.entity.ai.EntityAIStealthRetreat; import WayofTime.bloodmagic.entity.ai.EntityAIStealthTowardsTarget; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java index 6bed3068..b5869354 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.entity.ai.EntityAIEatAndCorruptBlock; import WayofTime.bloodmagic.entity.ai.EntityAIProtectAlly; import com.google.common.collect.Maps; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java index f4fcbe89..71290023 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.entity.ai.EntityAIPickUpAlly; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 4ffeb770..3acc8fed 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.entity.mob; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +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; diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index db068c77..5e2e4e43 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index 71e6bb84..4c701ace 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.meteor.MeteorRegistry; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index e96c4cc9..b4950f64 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AddToNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/event/AddToNetworkEvent.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AddToNetworkEvent.java rename to src/main/java/WayofTime/bloodmagic/event/AddToNetworkEvent.java index 4f84073f..4e4798c7 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AddToNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/AddToNetworkEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.event; +package WayofTime.bloodmagic.event; import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AltarCraftedEvent.java b/src/main/java/WayofTime/bloodmagic/event/AltarCraftedEvent.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AltarCraftedEvent.java rename to src/main/java/WayofTime/bloodmagic/event/AltarCraftedEvent.java index 2875f168..0aca6bcd 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/AltarCraftedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/AltarCraftedEvent.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.event; +package WayofTime.bloodmagic.event; -import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.eventhandler.Event; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/BoundToolEvent.java b/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/event/BoundToolEvent.java rename to src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java index 3e848cf9..66c70ea9 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/BoundToolEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.event; +package WayofTime.bloodmagic.event; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/ItemBindEvent.java b/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/event/ItemBindEvent.java rename to src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java index d072d39f..7f7e7bf4 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/ItemBindEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.event; +package WayofTime.bloodmagic.event; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -13,7 +13,7 @@ public class ItemBindEvent extends Event { /** * This event is called whenever a player attempts to bind a - * {@link WayofTime.bloodmagic.apibutnotreally.iface.IBindable} item. + * {@link WayofTime.bloodmagic.iface.IBindable} item. * * @param player The player doing the binding * @param key The UUID of the player doing the binding diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/RitualEvent.java b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/event/RitualEvent.java rename to src/main/java/WayofTime/bloodmagic/event/RitualEvent.java index dd118b83..d65da6a4 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/RitualEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.apibutnotreally.event; +package WayofTime.bloodmagic.event; -import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SacrificeKnifeUsedEvent.java b/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SacrificeKnifeUsedEvent.java rename to src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java index 991e7a15..982166b7 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SacrificeKnifeUsedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.event; +package WayofTime.bloodmagic.event; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.fml.common.eventhandler.Cancelable; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SoulNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SoulNetworkEvent.java rename to src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java index a39674a3..fc81dbe7 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.event; +package WayofTime.bloodmagic.event; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/TeleposeEvent.java b/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/event/TeleposeEvent.java rename to src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java index d17ea312..856c9917 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/event/TeleposeEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.event; +package WayofTime.bloodmagic.event; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java index d629f793..3a77e208 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.gson; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import com.google.gson.*; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IActivatable.java b/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java similarity index 78% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IActivatable.java rename to src/main/java/WayofTime/bloodmagic/iface/IActivatable.java index c72c4cb7..f9b39342 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java similarity index 66% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAlchemyArray.java rename to src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java index dfa4559a..f8026ce3 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAltarReader.java b/src/main/java/WayofTime/bloodmagic/iface/IAltarReader.java similarity index 72% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAltarReader.java rename to src/main/java/WayofTime/bloodmagic/iface/IAltarReader.java index d3d0bdc3..0e2e5fbe 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IAltarReader.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IAltarReader.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; /** * Any item that implements this interface will not be pulled into the Altar on diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java b/src/main/java/WayofTime/bloodmagic/iface/IBindable.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java rename to src/main/java/WayofTime/bloodmagic/iface/IBindable.java index 37b32d8f..164d77ff 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IBindable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IBindable.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ICustomAlchemyConsumable.java b/src/main/java/WayofTime/bloodmagic/iface/ICustomAlchemyConsumable.java similarity index 82% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ICustomAlchemyConsumable.java rename to src/main/java/WayofTime/bloodmagic/iface/ICustomAlchemyConsumable.java index 547eb869..708067ba 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ICustomAlchemyConsumable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ICustomAlchemyConsumable.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDemonWillViewer.java b/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java similarity index 86% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDemonWillViewer.java rename to src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java index ecaa8dd3..10c58212 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDemonWillViewer.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDocumentedBlock.java b/src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDocumentedBlock.java rename to src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java index 68ba0fd8..7a991bab 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IDocumentedBlock.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IHarvestHandler.java b/src/main/java/WayofTime/bloodmagic/iface/IHarvestHandler.java similarity index 78% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IHarvestHandler.java rename to src/main/java/WayofTime/bloodmagic/iface/IHarvestHandler.java index c4b38f18..91240f62 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IHarvestHandler.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IHarvestHandler.java @@ -1,6 +1,7 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -16,7 +17,7 @@ public interface IHarvestHandler { * the block types you want. * * @param world - The world the - * {@link WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone} is in. + * {@link IMasterRitualStone} is in. * @param pos - The position of the Block being checked * @param blockStack - The Block being checked * @return If the block was successfully harvested. diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IItemLPContainer.java b/src/main/java/WayofTime/bloodmagic/iface/IItemLPContainer.java similarity index 83% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IItemLPContainer.java rename to src/main/java/WayofTime/bloodmagic/iface/IItemLPContainer.java index 72e05cd9..b2daff9c 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IItemLPContainer.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IItemLPContainer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IMultiWillTool.java b/src/main/java/WayofTime/bloodmagic/iface/IMultiWillTool.java similarity index 52% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IMultiWillTool.java rename to src/main/java/WayofTime/bloodmagic/iface/IMultiWillTool.java index 519fc6cd..cda13f64 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IMultiWillTool.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IMultiWillTool.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.item.ItemStack; public interface IMultiWillTool { diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/INodeRenderer.java b/src/main/java/WayofTime/bloodmagic/iface/INodeRenderer.java similarity index 72% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/INodeRenderer.java rename to src/main/java/WayofTime/bloodmagic/iface/INodeRenderer.java index a12114b0..cc93b3bc 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/INodeRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/iface/INodeRenderer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; /** * Held items that implement this will cause the beams between routing nodes to diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IPurificationAsh.java b/src/main/java/WayofTime/bloodmagic/iface/IPurificationAsh.java similarity index 80% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IPurificationAsh.java rename to src/main/java/WayofTime/bloodmagic/iface/IPurificationAsh.java index 777a04e9..22355522 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IPurificationAsh.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IPurificationAsh.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientSwordEffectProvider.java b/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java similarity index 74% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientSwordEffectProvider.java rename to src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java index 16225306..db74ba4a 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientSwordEffectProvider.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientTool.java b/src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java similarity index 79% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientTool.java rename to src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java index 18ed5e29..3f9693ab 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISentientTool.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java b/src/main/java/WayofTime/bloodmagic/iface/ISigil.java similarity index 79% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java rename to src/main/java/WayofTime/bloodmagic/iface/ISigil.java index 196aa098..5912f52d 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/ISigil.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ISigil.java @@ -1,5 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; +import WayofTime.bloodmagic.item.ItemSigil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -8,7 +9,7 @@ import net.minecraft.world.World; import javax.annotation.Nonnull; /** - * Used for all {@link WayofTime.bloodmagic.apibutnotreally.impl.ItemSigil} EXCEPT + * Used for all {@link ItemSigil} EXCEPT * Sigils of Holdings. */ public interface ISigil { diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/iface/IUpgradeTrainer.java similarity index 86% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IUpgradeTrainer.java rename to src/main/java/WayofTime/bloodmagic/iface/IUpgradeTrainer.java index f8d30032..6e9197e9 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/iface/IUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IUpgradeTrainer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.iface; +package WayofTime.bloodmagic.iface; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java index 3b9002b1..c6019eae 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.inversion; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java index 0bcf8815..b1b2517b 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.inversion; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index 73972287..dfb40d9d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.types.ISubItem; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 5ce735b1..804104f5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -1,11 +1,10 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.BloodAltar; +import WayofTime.bloodmagic.altar.*; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.altar.*; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.ChatUtil; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index 092c1bed..4e251de3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index c18428b5..61dd28b9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +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 com.google.common.base.Strings; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 19d2d6e3..751a584a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.util.ItemStackWrapper; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index 3de0de3b..ee6f3f2f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.util.ItemStackWrapper; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index 898fec90..b1842152 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.util.ItemStackWrapper; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index ebfd3952..773ffb15 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.iface.IActivatable; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.iface.IActivatable; +import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index ee605c35..727cfcfb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.ItemStackWrapper; -import WayofTime.bloodmagic.apibutnotreally.event.BoundToolEvent; -import WayofTime.bloodmagic.apibutnotreally.iface.IActivatable; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.util.ItemStackWrapper; +import WayofTime.bloodmagic.event.BoundToolEvent; +import WayofTime.bloodmagic.iface.IActivatable; +import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index cf3ee617..15140d9c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -2,8 +2,9 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PurificationHelper; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.util.helper.PurificationHelper; import WayofTime.bloodmagic.client.IVariantProvider; import com.google.common.collect.Lists; import net.minecraft.entity.EntityLivingBase; @@ -71,7 +72,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { 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(WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI.damageSource); + target.onDeath(PleaseStopUsingMe.damageSource); } return false; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java index 89ed3f05..4e62706e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.IDiscreteDemonWill; import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index 4cc7940a..f5d3af13 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.iface.IDemonWillViewer; +import WayofTime.bloodmagic.iface.IDemonWillViewer; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index e029fe4f..9b1bd3f3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 1a16af89..52bc7794 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockRitualStone; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index 3bb6f750..81c127fc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IVariantProvider; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index 524f1888..cb3c7c2c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.Lists; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index e24e5e98..652021b0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.util.helper.RitualHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.RitualComponent; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.helper.RitualHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMasterRitualStone; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 193d027f..07e6be63 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRitualReaderState; -import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.ritual.data.EnumRitualReaderState; +import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.IDiscreteDemonWill; +import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index a80924ae..bcfd621b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.types.ISubItem; @@ -97,10 +97,10 @@ public class ItemSacrificialDagger extends ItemEnum ctor = clazz.getConstructor(int.class); if (ctor == null) { - BloodMagicAPI.logger.error("Error adding living armour upgrade {} as it doesn't have a valid constructor.", upgrade.getUniqueIdentifier()); + PleaseStopUsingMe.logger.error("Error adding living armour upgrade {} as it doesn't have a valid constructor.", upgrade.getUniqueIdentifier()); } else { upgradeConstructorMap.put(upgrade.getUniqueIdentifier(), ctor); } diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourUpgrade.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourUpgrade.java rename to src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java index 2fa4e8cc..c160c6cd 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/LivingArmourUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.livingArmour; +package WayofTime.bloodmagic.livingArmour; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/StatTracker.java b/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/StatTracker.java rename to src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java index f450b4aa..c9d4d182 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/livingArmour/StatTracker.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java @@ -1,6 +1,5 @@ -package WayofTime.bloodmagic.apibutnotreally.livingArmour; +package WayofTime.bloodmagic.livingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java index 9162ab95..fe02490a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java index eea9e27e..88b31e64 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java index b837ba77..cf948dac 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java index af2b15ca..c2a3d980 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java index 0b3b6095..06aebdc0 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java index c2fb14e7..9272cd48 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java index f30ef882..afca233c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java index a9bc44d3..0b964731 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java index 2877f3be..cbdab679 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java index 4546f447..d90aa3e5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java index 57584dc9..b084083f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java index 95e1357f..a89f4588 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java index 2a843bcb..f14f0598 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java index a063e192..0a99d49d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java index 57c67bea..99931891 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java index fc0017ea..561cb733 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java index c69e03e4..c36f87c6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java index 06a9ecad..b5ef43a6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java index bbab4ad4..2b7e5bc5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java index ff48cb51..3d562a37 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java index e9701d9b..73e1b3cc 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java index eebfcbc4..7adb31fd 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java index 177ad61a..78adec51 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java index 53a91cf1..eb44d538 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java index 105885bb..77a1e3db 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java index 1333750b..4e215caa 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java index 31d24e54..16e238bb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java index 082a28d4..d81b4e62 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java index a0744780..4a508d89 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java index d338e77b..41abc39a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java index 00be46cb..c8743426 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java index 700edfe1..b5bbec27 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.tracker; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; +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.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java index d790ca2f..f50e5d59 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java index c9714184..64e99f67 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java index 65077f41..64b1ff05 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java index 4b69347c..6dac903b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.livingArmour.LivingArmour; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java index d43a8482..d1699406 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java index 73a23691..ba5abaaa 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; public class LivingArmourUpgradeExperience extends LivingArmourUpgrade { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java index d829d828..c394a4af 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java index 6cb7e0f6..a4725a05 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +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.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java index f277bea7..69a58009 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemSpade; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java index 05f6644f..1e8fdfd3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java index acb057e3..69ce784c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java index 6cec3d05..4bb03e62 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java index faf8d7d5..2045b972 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.minecraft.entity.SharedMonsterAttributes; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java index 5214502d..5b5abda1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java index 966c9b1f..27a39c9f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java index 5143860a..9b755a27 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java index f563ba66..49bd19c0 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +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.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java index 318ab46f..80f7093d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java index ca20ddb3..0c3a6db7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java index 3295882a..d285c11d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.ILivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 87791649..3fe1f8a0 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +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; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java index d74bce15..49504483 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java index 2f14ec9d..83d414d4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import net.minecraft.nbt.NBTTagCompound; public class LivingArmourUpgradeStepAssist extends LivingArmourUpgrade { diff --git a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java index f7d1f8c4..9d0ea6ce 100644 --- a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.network; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +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; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/BloodOrb.java b/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/BloodOrb.java rename to src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java index adbe7c7a..2c23d393 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/BloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.orb; +package WayofTime.bloodmagic.orb; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraftforge.registries.IForgeRegistryEntry; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/IBloodOrb.java b/src/main/java/WayofTime/bloodmagic/orb/IBloodOrb.java similarity index 75% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/IBloodOrb.java rename to src/main/java/WayofTime/bloodmagic/orb/IBloodOrb.java index 6b87ddd5..09848dbb 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/orb/IBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/orb/IBloodOrb.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.orb; +package WayofTime.bloodmagic.orb; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index 392a6386..5ba2f665 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -1,8 +1,9 @@ package WayofTime.bloodmagic.potion; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionAugmentRecipe; import net.minecraft.block.Block; import net.minecraft.block.IGrowable; @@ -66,7 +67,7 @@ public class BMPotionUtils { } if (incurredDamage > 0) { - entity.attackEntityFrom(WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI.damageSource, (float) incurredDamage); + entity.attackEntityFrom(PleaseStopUsingMe.damageSource, (float) incurredDamage); } return incurredDamage; diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 2e2bdfa1..40d0d5ed 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.potion; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.Entity; import net.minecraft.entity.IProjectile; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 26a98d86..4ae09cac 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.proxy; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.client.Sprite; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java index 18885435..bfc6ee8d 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.proxy; -import WayofTime.bloodmagic.apibutnotreally.ritual.CapabilityRuneType; -import WayofTime.bloodmagic.apibutnotreally.ritual.IRitualStone; -import WayofTime.bloodmagic.apibutnotreally.teleport.TeleportQueue; +import WayofTime.bloodmagic.ritual.data.CapabilityRuneType; +import WayofTime.bloodmagic.ritual.data.IRitualStone; +import WayofTime.bloodmagic.teleport.TeleportQueue; import WayofTime.bloodmagic.fuel.FuelHandler; import com.google.common.collect.ImmutableMap; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableCustomRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableCustomRecipe.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableCustomRecipe.java rename to src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableCustomRecipe.java index 5ce7e83c..9af2e9d4 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableCustomRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableCustomRecipe.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.recipe; +package WayofTime.bloodmagic.recipe; -import WayofTime.bloodmagic.apibutnotreally.iface.ICustomAlchemyConsumable; +import WayofTime.bloodmagic.iface.ICustomAlchemyConsumable; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableRecipe.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableRecipe.java rename to src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableRecipe.java index 6cb1cf8d..ecea0ca4 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableRecipe.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.recipe; +package WayofTime.bloodmagic.recipe; import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/LivingArmourDowngradeRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/LivingArmourDowngradeRecipe.java rename to src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java index d40eab8b..8fa14ad2 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/LivingArmourDowngradeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.recipe; +package WayofTime.bloodmagic.recipe; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/TartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/TartaricForgeRecipe.java rename to src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java index 028744fd..db294411 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/recipe/TartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.recipe; +package WayofTime.bloodmagic.recipe; import net.minecraft.block.Block; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index 52d221eb..910be33d 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index 8c21e8e2..33e89171 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java index c3564204..931169b8 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; +import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.livingArmour.downgrade.*; import WayofTime.bloodmagic.livingArmour.tracker.*; import WayofTime.bloodmagic.livingArmour.upgrade.*; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java index 58516481..80525583 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.inversion.CorruptionHandler; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index de382992..9fb8ae3e 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -2,15 +2,15 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.alchemyArray.*; -import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; -import WayofTime.bloodmagic.apibutnotreally.iface.ISigil; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableCustomRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.TartaricForgeRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.compress.CompressionRegistry; +import WayofTime.bloodmagic.iface.ISigil; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.recipe.AlchemyTableCustomRecipe; +import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; +import WayofTime.bloodmagic.core.registry.TartaricForgeRecipeRegistry; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.client.render.alchemyArray.*; import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; import WayofTime.bloodmagic.compress.BaseCompressionHandler; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 1343d5fe..8f9beacc 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.core.registry.HarvestRegistry; +import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerPlantable; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index a9785bf9..6ce09db4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.altar.AltarComponent; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; -import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.altar.AltarComponent; +import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.RitualComponent; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java index e555c69a..147a3791 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java index 93df19e4..9a59ff3a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.ritual.data.*; import com.google.common.collect.Iterables; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java index c2a6ee58..a364d484 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.block.Block; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java index 41b8098d..4f6dc7a6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; +import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index f31a03f0..8a801aa6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.compress.CompressionRegistry; -import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.compress.CompressionRegistry; +import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java index c40acf12..b6387112 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index 5a52ad05..d706b79c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.util.helper.PlayerHelper; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index c70de21b..f7749ddf 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -2,16 +2,16 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.altar.IBloodAltar; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; +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 WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java index 1207dd3c..a426c67a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 4e71364d..52048dbf 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityAnimal; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java index 3bce44ba..8a8f5181 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemFood; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 2bac524c..8a6f9cfb 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.BlockFarmland; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java index 574ed869..b1d4d478 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; -import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.iface.IHarvestHandler; +import WayofTime.bloodmagic.core.registry.HarvestRegistry; +import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java index 0d4e0f61..22a26195 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; +import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java index 1d27ada9..84da47b7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java index 082edc55..d3878ed7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; @@ -198,7 +198,7 @@ public class RitualLava extends Ritual { } if (!entity.isDead && entity.hurtTime <= 0 && Utils.isImmuneToFireDamage(entity)) { - if (entity.attackEntityFrom(BloodMagicAPI.damageSource, damage)) { + if (entity.attackEntityFrom(PleaseStopUsingMe.damageSource, damage)) { corrosiveDrained += corrosiveWillDrain; corrosiveWill -= corrosiveWillDrain; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java index 8034d1b8..936d7d77 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; +import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.effect.EntityLightningBolt; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java index 794bb119..42d262ed 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.BlockOre; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index 36706d6e..42052ea9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; 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.data.*; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java index 37dd74e7..7c4da792 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemBlock; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java index 85acd27b..0c4503d8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; -import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; -import WayofTime.bloodmagic.apibutnotreally.teleport.PortalLocation; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.RitualComponent; +import WayofTime.bloodmagic.teleport.PortalLocation; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; import WayofTime.bloodmagic.tile.TileDimensionalPortal; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index ede507a1..bdb869bc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import com.google.common.collect.Lists; import net.minecraft.block.BlockLiquid; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java index 9eea0094..b2eb76bb 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -92,7 +92,7 @@ public class RitualRegeneration extends Ritual { float currentHealth = damagedEntity.getHealth(); - damagedEntity.attackEntityFrom(BloodMagicAPI.damageSource, Math.min(player.getMaxHealth() - player.getHealth(), syphonedHealthAmount)); + damagedEntity.attackEntityFrom(PleaseStopUsingMe.damageSource, Math.min(player.getMaxHealth() - player.getHealth(), syphonedHealthAmount)); float healthDifference = currentHealth - damagedEntity.getHealth(); if (healthDifference > 0) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java index bb3035b6..57b51bcf 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java index 369f8873..3bb9ed0d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.tile.TileSpectralBlock; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java index 3b42d23a..fe1a3a07 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.StatTracker; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; -import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper.LivingUpgrades; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.StatTracker; +import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.ritual.data.*; import com.google.common.collect.Iterables; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java index 13e0e257..82e5bc43 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index bda9622f..ba3bc5e0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java index c406b163..a397d22e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.ritual.*; +import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/AreaDescriptor.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java index f2ea64be..c898bf3e 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/CapabilityRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/data/CapabilityRuneType.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/CapabilityRuneType.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/CapabilityRuneType.java index 40be45bf..3ed6c7b9 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/CapabilityRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/CapabilityRuneType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagByte; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRitualReaderState.java b/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java similarity index 62% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRitualReaderState.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java index f2d3cc8f..0944cbcb 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRitualReaderState.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; public enum EnumRitualReaderState { SET_AREA, diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRuneType.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java index 39685b3e..ea1f364a 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; import net.minecraft.init.Items; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java similarity index 88% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IMasterRitualStone.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java index 8cf47ab3..781988fc 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/data/IRitualStone.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IRitualStone.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/IRitualStone.java index 073b9b4b..00017ab0 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/IRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/IRitualStone.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/Ritual.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java index aa8c8c1c..d75447ce 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java @@ -1,7 +1,8 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.core.registry.RitualRegistry; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -21,7 +22,7 @@ import java.util.Map.Entry; /** * Abstract class for creating new rituals. Rituals need be registered with - * {@link WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry#registerRitual(Ritual, String)} + * {@link RitualRegistry#registerRitual(Ritual, String)} */ public abstract class Ritual { public final ArrayList ritualComponents = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualComponent.java b/src/main/java/WayofTime/bloodmagic/ritual/data/RitualComponent.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualComponent.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/RitualComponent.java index ad864ce7..25c46e62 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualComponent.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/RitualComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualRenderer.java b/src/main/java/WayofTime/bloodmagic/ritual/data/RitualRenderer.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualRenderer.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/RitualRenderer.java index 4c999f20..0138310b 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/RitualRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/RitualRenderer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual; +package WayofTime.bloodmagic.ritual.data; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/IImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/IImperfectRitualStone.java similarity index 88% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/IImperfectRitualStone.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/IImperfectRitualStone.java index f468513e..eeca00f0 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/IImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/IImperfectRitualStone.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual.imperfect; +package WayofTime.bloodmagic.ritual.data.imperfect; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/ImperfectRitual.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/ImperfectRitual.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/ImperfectRitual.java index c6f668d3..bf78aaee 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/ImperfectRitual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/ImperfectRitual.java @@ -1,13 +1,14 @@ -package WayofTime.bloodmagic.apibutnotreally.ritual.imperfect; +package WayofTime.bloodmagic.ritual.data.imperfect; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; /** * Abstract class for creating new imperfect rituals. ImperfectRituals need be * registered with - * {@link WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry#registerRitual(ImperfectRitual)} + * {@link ImperfectRitualRegistry#registerRitual(ImperfectRitual)} */ public abstract class ImperfectRitual { diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/package-info.java b/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/package-info.java similarity index 71% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/package-info.java rename to src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/package-info.java index e47d4b81..00a78dbb 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ritual/imperfect/package-info.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/package-info.java @@ -1,6 +1,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.apibutnotreally.ritual.imperfect; +package WayofTime.bloodmagic.ritual.data.imperfect; import mcp.MethodsReturnNonnullByDefault; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index 258fdfbe..8e5e9a61 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.harvest; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; -import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.iface.IHarvestHandler; +import WayofTime.bloodmagic.core.registry.HarvestRegistry; import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java index 6200a003..15f06cdf 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual.harvest; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; -import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.iface.IHarvestHandler; +import WayofTime.bloodmagic.core.registry.HarvestRegistry; import net.minecraft.block.BlockStem; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java index 408eab39..f643015e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual.harvest; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.iface.IHarvestHandler; -import WayofTime.bloodmagic.apibutnotreally.registry.HarvestRegistry; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.iface.IHarvestHandler; +import WayofTime.bloodmagic.core.registry.HarvestRegistry; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java index 49c280ac..2d60a7e8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java index 80857a9a..caa2bcd7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java index 6ec3a207..098c9bba 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java index 88907218..1c3249db 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java index 5404ec97..4f2e34fd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java index 7ec1d9a0..af88a470 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual.portal; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.teleport.PortalLocation; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.teleport.PortalLocation; import net.minecraftforge.common.DimensionManager; import java.io.*; @@ -27,12 +27,12 @@ public class LocationsHandler implements Serializable { updateFile(fileName, portals); } if (!portals.get(name).isEmpty() && portals.get(name).size() >= 2) { - BloodMagicAPI.logger.info("Location " + name + " already exists."); + PleaseStopUsingMe.logger.info("Location " + name + " already exists."); updateFile(fileName, portals); return false; } else { portals.get(name).add(location); - BloodMagicAPI.logger.info("Adding " + name); + PleaseStopUsingMe.logger.info("Adding " + name); updateFile(fileName, portals); return true; } @@ -42,11 +42,11 @@ public class LocationsHandler implements Serializable { if (portals.get(name) != null && !portals.get(name).isEmpty()) { if (portals.get(name).contains(location)) { portals.get(name).remove(location); - BloodMagicAPI.logger.info("Removing " + name); + PleaseStopUsingMe.logger.info("Removing " + name); updateFile(fileName, portals); return true; } else { - BloodMagicAPI.logger.info("No location matching " + name); + PleaseStopUsingMe.logger.info("No location matching " + name); updateFile(fileName, portals); return false; } @@ -75,10 +75,10 @@ public class LocationsHandler implements Serializable { if (!file.exists()) { if (file.getParentFile().mkdir()) { if (file.createNewFile()) { - BloodMagicAPI.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + PleaseStopUsingMe.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); } } else if (file.createNewFile()) { - BloodMagicAPI.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + PleaseStopUsingMe.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); } } FileInputStream fileIn = new FileInputStream(file); @@ -90,7 +90,7 @@ public class LocationsHandler implements Serializable { } catch (IOException e) { return null; } catch (ClassNotFoundException e) { - BloodMagicAPI.logger.error(String.valueOf(file) + " was not found in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + PleaseStopUsingMe.logger.error(String.valueOf(file) + " was not found in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index bde56486..b2571e6d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.portal; -import WayofTime.bloodmagic.apibutnotreally.event.TeleposeEvent; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; -import WayofTime.bloodmagic.apibutnotreally.teleport.Teleport; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.event.TeleposeEvent; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.teleport.Teleport; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/DemonWillHolder.java b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/DemonWillHolder.java rename to src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java index 721cbb99..91422105 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/DemonWillHolder.java +++ b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.soul; +package WayofTime.bloodmagic.soul; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java b/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java rename to src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java index fa77f039..8854afb6 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/EnumDemonWillType.java +++ b/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.soul; +package WayofTime.bloodmagic.soul; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.types.ISubItem; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWill.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWill.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWill.java rename to src/main/java/WayofTime/bloodmagic/soul/IDemonWill.java index 1387372b..cb83bc1d 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWill.java +++ b/src/main/java/WayofTime/bloodmagic/soul/IDemonWill.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.soul; +package WayofTime.bloodmagic.soul; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillConduit.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillConduit.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillConduit.java rename to src/main/java/WayofTime/bloodmagic/soul/IDemonWillConduit.java index 96947c98..0d5027ae 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillConduit.java +++ b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillConduit.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.soul; +package WayofTime.bloodmagic.soul; /** * Implement this interface on a block that can accept and store Demonic Will. diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillGem.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillGem.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillGem.java rename to src/main/java/WayofTime/bloodmagic/soul/IDemonWillGem.java index 4878ca07..78c64544 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillGem.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.soul; +package WayofTime.bloodmagic.soul; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillWeapon.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillWeapon.java rename to src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java index dc989bd2..f90c2c98 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDemonWillWeapon.java +++ b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.soul; +package WayofTime.bloodmagic.soul; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDiscreteDemonWill.java b/src/main/java/WayofTime/bloodmagic/soul/IDiscreteDemonWill.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDiscreteDemonWill.java rename to src/main/java/WayofTime/bloodmagic/soul/IDiscreteDemonWill.java index c5a34382..9709817a 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/IDiscreteDemonWill.java +++ b/src/main/java/WayofTime/bloodmagic/soul/IDiscreteDemonWill.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.soul; +package WayofTime.bloodmagic.soul; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/PlayerDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/PlayerDemonWillHandler.java rename to src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java index 07d95f3a..89d3b97a 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/soul/PlayerDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java @@ -1,5 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.soul; +package WayofTime.bloodmagic.soul; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; @@ -8,7 +9,7 @@ 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 WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper} + * in {@link NetworkHelper} */ public class PlayerDemonWillHandler { /** diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index 42cf8ab8..3ca1a305 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.structures; -import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; +import WayofTime.bloodmagic.ritual.data.AreaDescriptor; import net.minecraft.util.EnumFacing; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java index 84a2843d..dac62074 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.structures; -import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; +import WayofTime.bloodmagic.ritual.data.AreaDescriptor; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/ITeleport.java b/src/main/java/WayofTime/bloodmagic/teleport/ITeleport.java similarity index 59% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/ITeleport.java rename to src/main/java/WayofTime/bloodmagic/teleport/ITeleport.java index f5a1392e..1f9242f4 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/ITeleport.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/ITeleport.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.teleport; +package WayofTime.bloodmagic.teleport; public interface ITeleport { void teleport(); diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/PortalLocation.java b/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/PortalLocation.java rename to src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java index a861f5c9..ccb55eeb 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/PortalLocation.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.teleport; +package WayofTime.bloodmagic.teleport; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/Teleport.java b/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/Teleport.java rename to src/main/java/WayofTime/bloodmagic/teleport/Teleport.java index b733e538..18719e16 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/Teleport.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.teleport; +package WayofTime.bloodmagic.teleport; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleportQueue.java b/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleportQueue.java rename to src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java index 6e56b7d9..8b3d72e5 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleportQueue.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.teleport; +package WayofTime.bloodmagic.teleport; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleporterBloodMagic.java b/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleporterBloodMagic.java rename to src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java index 0bcb1d36..16e7a6fc 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/teleport/TeleporterBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.teleport; +package WayofTime.bloodmagic.teleport; import net.minecraft.entity.Entity; import net.minecraft.util.math.MathHelper; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 2fddf46c..4d1b42cf 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffect; -import WayofTime.bloodmagic.apibutnotreally.alchemyCrafting.AlchemyArrayEffectCraftingNew; -import WayofTime.bloodmagic.apibutnotreally.iface.IAlchemyArray; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyArrayRecipeRegistry; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; +import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectCraftingNew; +import WayofTime.bloodmagic.iface.IAlchemyArray; +import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 3ceab6be..212edac9 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.orb.BloodOrb; +import WayofTime.bloodmagic.orb.IBloodOrb; +import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.util.helper.NetworkHelper; import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java index bfaeefbb..b7b5e5aa 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarTier; -import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; +import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.IBloodAltar; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java index 8e161c77..f0b0b41a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.tile.base.TileBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index df286a8b..3d05fe43 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; -import WayofTime.bloodmagic.apibutnotreally.soul.IDiscreteDemonWill; +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; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index d4fbdd7d..0e26e4be 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.block.BlockDemonCrystal; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.tile.base.TileTicking; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index 4e5d3fdb..eb97e4cb 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.IDemonWillConduit; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.tile.base.TileTicking; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java index 86ae91b0..80817ce6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; +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.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java index 3899cc39..da6ff9b0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; +import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.base.TileBase; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index bae862d0..1601a07a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.ritual.data.AreaDescriptor; +import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.incense.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index 1d2e8a19..2c77e867 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +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; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 4431af8f..aaf844d2 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -1,16 +1,16 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.event.RitualEvent; -import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.RitualHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.event.RitualEvent; +import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.helper.RitualHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.ItemActivationCrystal; import WayofTime.bloodmagic.tile.base.TileTicking; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index a1b3a63d..cdda27d8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java index bf3dddc8..3e90cb5d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.iface.IPurificationAsh; -import WayofTime.bloodmagic.apibutnotreally.ritual.AreaDescriptor; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PurificationHelper; +import WayofTime.bloodmagic.iface.IPurificationAsh; +import WayofTime.bloodmagic.ritual.data.AreaDescriptor; +import WayofTime.bloodmagic.util.helper.PurificationHelper; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 64d7fde1..f6909c28 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillConduit; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; +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.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java index 172c7adb..d2d41e2d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.base.TileTicking; import com.google.common.base.Strings; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index a8124376..dc2317c8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.event.TeleposeEvent; -import WayofTime.bloodmagic.apibutnotreally.teleport.TeleportQueue; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NetworkHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.PlayerHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.event.TeleposeEvent; +import WayofTime.bloodmagic.teleport.TeleportQueue; +import WayofTime.bloodmagic.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.block.BlockTeleposer; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.ritual.portal.Teleports; diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java index c2569ba8..879a0ed3 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile.container; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; +import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.tile.TileAlchemyTable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java index 37973d53..a86e82d4 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile.container; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWill; -import WayofTime.bloodmagic.apibutnotreally.soul.IDemonWillGem; +import WayofTime.bloodmagic.soul.IDemonWill; +import WayofTime.bloodmagic.soul.IDemonWillGem; import WayofTime.bloodmagic.tile.TileSoulForge; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java index 5deac5ea..7fb17330 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile.routing; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.item.inventory.ItemInventory; import WayofTime.bloodmagic.util.GhostItemHelper; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index 2d17f476..c760c950 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile.routing; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.soul.EnumDemonWillType; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.routing.*; import WayofTime.bloodmagic.tile.TileInventory; diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java index 6e13a518..fbc6c626 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile.routing; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.routing.IItemRoutingNode; import WayofTime.bloodmagic.routing.IMasterRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/BlockStack.java b/src/main/java/WayofTime/bloodmagic/util/BlockStack.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/BlockStack.java rename to src/main/java/WayofTime/bloodmagic/util/BlockStack.java index 74e50107..85428c4d 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/BlockStack.java +++ b/src/main/java/WayofTime/bloodmagic/util/BlockStack.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally; +package WayofTime.bloodmagic.util; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -6,6 +6,7 @@ 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; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java rename to src/main/java/WayofTime/bloodmagic/util/Constants.java index 581a8fad..77d6d512 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally; +package WayofTime.bloodmagic.util; import WayofTime.bloodmagic.BloodMagic; import net.minecraft.item.Item; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/DamageSourceBloodMagic.java b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/DamageSourceBloodMagic.java rename to src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java index 75af1dd6..303bea5a 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/DamageSourceBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally; +package WayofTime.bloodmagic.util; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java index 77862f48..6c454ba8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.helper.NBTHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/ItemStackWrapper.java rename to src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java index a48a0acd..0163eea1 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally; +package WayofTime.bloodmagic.util; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -9,6 +9,7 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; +@Deprecated public class ItemStackWrapper { public final Item item; public final int stackSize; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java similarity index 74% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/BloodMagicAPI.java rename to src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java index 48b7bc95..072d7986 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally; +package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.apibutnotreally.util.helper.LogHelper; +import WayofTime.bloodmagic.util.helper.LogHelper; import net.minecraft.util.DamageSource; /** @@ -9,7 +9,8 @@ import net.minecraft.util.DamageSource; * Some API methods can be used via IMC instead. The supported methods are: */ // TODO - Nuke this class -public class BloodMagicAPI { +@Deprecated +public class PleaseStopUsingMe { public static boolean loggingEnabled; public static LogHelper logger = new LogHelper("BloodMagic|API"); diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index fa590b7e..88c989b8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,10 +1,8 @@ package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.apibutnotreally.BlockStack; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.altar.EnumAltarComponent; -import WayofTime.bloodmagic.apibutnotreally.iface.IDemonWillViewer; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.iface.IDemonWillViewer; +import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index caa081bd..f99d4ec6 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.RitualComponent; import WayofTime.bloodmagic.client.hud.HUDElement; import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.client.render.block.RenderFakeBlocks; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index add509dc..a859d993 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.event.AltarCraftedEvent; -import WayofTime.bloodmagic.apibutnotreally.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.util.helper.ItemHelper; -import WayofTime.bloodmagic.apibutnotreally.util.helper.NBTHelper; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.event.AltarCraftedEvent; +import WayofTime.bloodmagic.iface.IUpgradeTrainer; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; +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; 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 e75009fe..d9a4d4f2 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -3,18 +3,17 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.event.ItemBindEvent; -import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.apibutnotreally.event.TeleposeEvent; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; -import WayofTime.bloodmagic.apibutnotreally.iface.ISentientTool; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; -import WayofTime.bloodmagic.apibutnotreally.soul.DemonWillHolder; -import WayofTime.bloodmagic.apibutnotreally.util.helper.*; +import WayofTime.bloodmagic.util.Constants; +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.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.orb.BloodOrb; +import WayofTime.bloodmagic.orb.IBloodOrb; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; @@ -33,7 +32,7 @@ import WayofTime.bloodmagic.network.DemonAuraPacketProcessor; import WayofTime.bloodmagic.potion.BMPotionUtils; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.TextHelper; +import WayofTime.bloodmagic.util.helper.*; import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 42e866f8..f78a7e59 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java index a98a8e9f..a894a655 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; 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 b83bb3d3..ce76a8d0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.apibutnotreally.soul.*; +import WayofTime.bloodmagic.soul.*; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.demonAura.PosXY; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/BindableHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/BindableHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java index ca573a46..f74bb848 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/BindableHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.event.ItemBindEvent; -import WayofTime.bloodmagic.apibutnotreally.iface.IBindable; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.event.ItemBindEvent; +import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.handler.event.GenericHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/IncenseHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/IncenseHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java index 47aca8bc..40071726 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/IncenseHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/ItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/ItemHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java index 740043c0..24912b87 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/ItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java @@ -1,10 +1,10 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; -import WayofTime.bloodmagic.apibutnotreally.iface.IItemLPContainer; -import WayofTime.bloodmagic.apibutnotreally.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.apibutnotreally.livingArmour.LivingArmourUpgrade; +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.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/LogHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/LogHelper.java similarity index 74% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/LogHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/LogHelper.java index bc6d8de5..3876068e 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/LogHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/LogHelper.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.BloodMagicAPI; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,17 +12,17 @@ public class LogHelper { } public void info(String info, Object... format) { - if (BloodMagicAPI.loggingEnabled) + if (PleaseStopUsingMe.loggingEnabled) logger.info(info, format); } public void error(String error, Object... format) { - if (BloodMagicAPI.loggingEnabled) + if (PleaseStopUsingMe.loggingEnabled) logger.error(error, format); } public void debug(String debug, Object... format) { - if (BloodMagicAPI.loggingEnabled) + if (PleaseStopUsingMe.loggingEnabled) logger.debug(debug, format); } diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NBTHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java similarity index 83% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NBTHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java index ec5202a6..59a73f3e 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NBTHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NetworkHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index cfef4b4b..81f9dabe 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -1,12 +1,12 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.Constants; -import WayofTime.bloodmagic.apibutnotreally.event.SoulNetworkEvent; -import WayofTime.bloodmagic.apibutnotreally.orb.BloodOrb; -import WayofTime.bloodmagic.apibutnotreally.orb.IBloodOrb; -import WayofTime.bloodmagic.apibutnotreally.registry.OrbRegistry; -import WayofTime.bloodmagic.apibutnotreally.saving.BMWorldSavedData; -import WayofTime.bloodmagic.apibutnotreally.saving.SoulNetwork; +import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.event.SoulNetworkEvent; +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 com.google.common.base.Strings; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java index de1c9c62..2354b3e1 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import com.google.common.base.Strings; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerSacrificeHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java index 541a1472..4aec71d4 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.apibutnotreally.altar.IBloodAltar; -import WayofTime.bloodmagic.apibutnotreally.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.altar.IBloodAltar; +import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PurificationHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PurificationHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java index 3c6ef594..49057296 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/PurificationHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java @@ -1,6 +1,6 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.Constants; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java index fd8e6bcf..97b4853a 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.apibutnotreally.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.apibutnotreally.registry.TartaricForgeRecipeRegistry; +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; diff --git a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/RitualHelper.java rename to src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java index 321e778d..6ecfe11e 100644 --- a/src/main/java/WayofTime/bloodmagic/apibutnotreally/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java @@ -1,10 +1,10 @@ -package WayofTime.bloodmagic.apibutnotreally.util.helper; +package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.apibutnotreally.registry.RitualRegistry; -import WayofTime.bloodmagic.apibutnotreally.ritual.EnumRuneType; -import WayofTime.bloodmagic.apibutnotreally.ritual.IRitualStone; -import WayofTime.bloodmagic.apibutnotreally.ritual.Ritual; -import WayofTime.bloodmagic.apibutnotreally.ritual.RitualComponent; +import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.data.IRitualStone; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.RitualComponent; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; From e4e6a8c4ca79f373ff78428b189a853ff6a839f6 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 16 Feb 2018 16:37:02 -0800 Subject: [PATCH 175/595] Cleanup Altar Upgrade system --- .../bloodmagic/altar/AltarUpgrade.java | 122 ++---------------- .../bloodmagic/altar/BloodAltar.java | 74 +++-------- .../api/impl/BloodMagicCorePlugin.java | 4 +- .../bloodmagic/block/BlockBloodRune.java | 18 ++- ...{EnumBloodRune.java => BloodRuneType.java} | 6 +- .../bloodmagic/iface/IBloodRune.java | 15 +++ .../bloodmagic/blockstates/blood_rune.json | 4 +- 7 files changed, 64 insertions(+), 179 deletions(-) rename src/main/java/WayofTime/bloodmagic/block/enums/{EnumBloodRune.java => BloodRuneType.java} (80%) create mode 100644 src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java index 5100406c..bdca69c4 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java @@ -1,122 +1,24 @@ package WayofTime.bloodmagic.altar; -public class AltarUpgrade { - private int speedCount; - private int efficiencyCount; - private int sacrificeCount; - private int selfSacrificeCount; - private int displacementCount; - private int capacityCount; - private int orbCapacityCount; - private int betterCapacityCount; - private int accelerationCount; - private int chargingCount; +import WayofTime.bloodmagic.block.enums.BloodRuneType; +import com.google.common.collect.Maps; - public AltarUpgrade(int speedCount, int efficiencyCount, int sacrificeCount, int selfSacrificeCount, int displacementCount, int capacityCount, int orbCapacityCount, int betterCapacityCount, int accelerationCount, int chargingCount) { - this.speedCount = speedCount; - this.efficiencyCount = efficiencyCount; - this.sacrificeCount = sacrificeCount; - this.selfSacrificeCount = selfSacrificeCount; - this.displacementCount = displacementCount; - this.capacityCount = capacityCount; - this.orbCapacityCount = orbCapacityCount; - this.betterCapacityCount = betterCapacityCount; - this.accelerationCount = accelerationCount; - this.chargingCount = chargingCount; - } +import java.util.EnumMap; + +public class AltarUpgrade { + + private final EnumMap upgradeLevels; public AltarUpgrade() { + this.upgradeLevels = Maps.newEnumMap(BloodRuneType.class); } - // Adders - - public AltarUpgrade addSpeed() { - speedCount++; + public AltarUpgrade upgrade(BloodRuneType rune) { + upgradeLevels.compute(rune, (r, l) -> l == null ? 0 : l + 1); return this; } - public AltarUpgrade addEfficiency() { - efficiencyCount++; - return this; - } - - public AltarUpgrade addSacrifice() { - sacrificeCount++; - return this; - } - - public AltarUpgrade addSelfSacrifice() { - selfSacrificeCount++; - return this; - } - - public AltarUpgrade addDisplacement() { - displacementCount++; - return this; - } - - public AltarUpgrade addCapacity() { - capacityCount++; - return this; - } - - public AltarUpgrade addOrbCapacity() { - orbCapacityCount++; - return this; - } - - public AltarUpgrade addBetterCapacity() { - betterCapacityCount++; - return this; - } - - public AltarUpgrade addAcceleration() { - accelerationCount++; - return this; - } - - public AltarUpgrade addCharging() { - chargingCount++; - return this; - } - - public int getSpeedCount() { - return speedCount; - } - - public int getEfficiencyCount() { - return efficiencyCount; - } - - public int getSacrificeCount() { - return sacrificeCount; - } - - public int getSelfSacrificeCount() { - return selfSacrificeCount; - } - - public int getDisplacementCount() { - return displacementCount; - } - - public int getCapacityCount() { - return capacityCount; - } - - public int getOrbCapacityCount() { - return orbCapacityCount; - } - - public int getBetterCapacityCount() { - return betterCapacityCount; - } - - public int getAccelerationCount() { - return accelerationCount; - } - - public int getChargingCount() { - return chargingCount; + public int getLevel(BloodRuneType rune) { + return upgradeLevels.getOrDefault(rune, 0); } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 3d22f37e..9c71f339 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -3,12 +3,12 @@ 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.util.BlockStack; +import WayofTime.bloodmagic.block.enums.BloodRuneType; +import WayofTime.bloodmagic.iface.IBloodRune; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.orb.BloodOrb; import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; import com.google.common.base.Enums; @@ -388,17 +388,17 @@ public class BloodAltar implements IFluidHandler { return; } else if (!tier.equals(EnumAltarTier.ONE) && upgrade != null) { this.isUpgraded = true; - this.accelerationUpgrades = upgrade.getAccelerationCount(); - this.consumptionMultiplier = (float) (0.20 * upgrade.getSpeedCount()); - this.efficiencyMultiplier = (float) Math.pow(0.85, upgrade.getEfficiencyCount()); - this.sacrificeEfficiencyMultiplier = (float) (0.10 * upgrade.getSacrificeCount()); - this.selfSacrificeEfficiencyMultiplier = (float) (0.10 * upgrade.getSelfSacrificeCount()); - this.capacityMultiplier = (float) ((1 * Math.pow(1.10, upgrade.getBetterCapacityCount()) + 0.20 * upgrade.getCapacityCount())); - this.dislocationMultiplier = (float) (Math.pow(1.2, upgrade.getDisplacementCount())); - this.orbCapacityMultiplier = (float) (1 + 0.02 * upgrade.getOrbCapacityCount()); - this.chargingFrequency = Math.max(20 - upgrade.getAccelerationCount(), 1); - this.chargingRate = (int) (10 * upgrade.getChargingCount() * (1 + consumptionMultiplier / 2)); - this.maxCharge = (int) (Fluid.BUCKET_VOLUME * Math.max(0.5 * capacityMultiplier, 1) * upgrade.getChargingCount()); + 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); @@ -701,50 +701,10 @@ public class BloodAltar implements IFluidHandler { BlockPos componentPos = pos.add(altarComponent.getOffset()); if (altarComponent.isUpgradeSlot()) { - BlockStack worldBlock = new BlockStack(world.getBlockState(componentPos).getBlock(), world.getBlockState(componentPos).getBlock().getMetaFromState(world.getBlockState(componentPos))); - - if (worldBlock.getBlock() instanceof BlockBloodRune) { - switch (((BlockBloodRune) worldBlock.getBlock()).getRuneEffect(worldBlock.getMeta())) { - case 1: - upgrades.addSpeed(); - break; - - case 2: - upgrades.addEfficiency(); - break; - - case 3: - upgrades.addSacrifice(); - break; - - case 4: - upgrades.addSelfSacrifice(); - break; - - case 5: - upgrades.addDisplacement(); - break; - - case 6: - upgrades.addCapacity(); - break; - - case 7: - upgrades.addBetterCapacity(); - break; - - case 8: - upgrades.addOrbCapacity(); - break; - - case 9: - upgrades.addAcceleration(); - break; - - case 10: - upgrades.addCharging(); - break; - } + IBlockState state = world.getBlockState(componentPos); + if (state.getBlock() instanceof IBloodRune) { + BloodRuneType rune = ((IBloodRune) state.getBlock()).getBloodRune(world, componentPos, state); + upgrades.upgrade(rune); } } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index d73df0b8..9f98f857 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -8,7 +8,7 @@ import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.altar.EnumAltarComponent; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockDecorative; -import WayofTime.bloodmagic.block.enums.EnumBloodRune; +import WayofTime.bloodmagic.block.enums.BloodRuneType; import WayofTime.bloodmagic.block.enums.EnumDecorative; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicRecipes; @@ -76,7 +76,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.CRYSTAL_TILE), EnumAltarComponent.CRYSTAL.name()); BlockBloodRune bloodRune = (BlockBloodRune) RegistrarBloodMagicBlocks.BLOOD_RUNE; - for (EnumBloodRune runeType : EnumBloodRune.values()) + for (BloodRuneType runeType : BloodRuneType.values()) api.registerAltarComponent(bloodRune.getDefaultState().withProperty(bloodRune.getProperty(), runeType), EnumAltarComponent.BLOODRUNE.name()); RegistrarBloodMagicRecipes.registerAltarRecipes(api.getRecipeRegistrar()); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java index bd440dd3..471bc99d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java @@ -2,19 +2,25 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumBloodRune; +import WayofTime.bloodmagic.block.enums.BloodRuneType; +import WayofTime.bloodmagic.iface.IBloodRune; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; 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 { +public class BlockBloodRune extends BlockEnum implements IBloodRune { + public BlockBloodRune() { - super(Material.ROCK, EnumBloodRune.class); + super(Material.ROCK, BloodRuneType.class); setUnlocalizedName(BloodMagic.MODID + ".rune."); setCreativeTab(BloodMagic.TAB_BM); @@ -24,8 +30,10 @@ public class BlockBloodRune extends BlockEnum { setHarvestLevel("pickaxe", 2); } - public int getRuneEffect(int meta) { - return meta; + @Nullable + @Override + public BloodRuneType getBloodRune(IBlockAccess world, BlockPos pos, IBlockState state) { + return state.getValue(getProperty()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumBloodRune.java b/src/main/java/WayofTime/bloodmagic/block/enums/BloodRuneType.java similarity index 80% rename from src/main/java/WayofTime/bloodmagic/block/enums/EnumBloodRune.java rename to src/main/java/WayofTime/bloodmagic/block/enums/BloodRuneType.java index a9c04bd1..702fe5d9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/BloodRuneType.java @@ -4,15 +4,15 @@ import net.minecraft.util.IStringSerializable; import java.util.Locale; -public enum EnumBloodRune implements IStringSerializable { +public enum BloodRuneType implements IStringSerializable { BLANK, SPEED, EFFICIENCY, SACRIFICE, - SELFSACRIFICE, + SELF_SACRIFICE, DISPLACEMENT, CAPACITY, - AUGCAPACITY, + AUGMENTED_CAPACITY, ORB, ACCELERATION, CHARGING; diff --git a/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java b/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java new file mode 100644 index 00000000..39863d68 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java @@ -0,0 +1,15 @@ +package WayofTime.bloodmagic.iface; + + +import WayofTime.bloodmagic.block.enums.BloodRuneType; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; + +import javax.annotation.Nullable; + +public interface IBloodRune { + + @Nullable + BloodRuneType getBloodRune(IBlockAccess world, BlockPos pos, IBlockState state); +} diff --git a/src/main/resources/assets/bloodmagic/blockstates/blood_rune.json b/src/main/resources/assets/bloodmagic/blockstates/blood_rune.json index f267e034..80973833 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/blood_rune.json +++ b/src/main/resources/assets/bloodmagic/blockstates/blood_rune.json @@ -27,7 +27,7 @@ "all": "bloodmagic:blocks/RuneOfSacrifice" } }, - "selfsacrifice": { + "self_sacrifice": { "textures": { "all": "bloodmagic:blocks/RuneOfSelfSacrifice" } @@ -42,7 +42,7 @@ "all": "bloodmagic:blocks/AltarCapacityRune" } }, - "augcapacity": { + "augmented_capacity": { "textures": { "all": "bloodmagic:blocks/BetterCapacityRune" } From 5920d9124dff99d3184ecf35848ae085ba06b0e3 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 16 Feb 2018 16:48:21 -0800 Subject: [PATCH 176/595] Blood Altar will now be less stingy without outputs --- src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 9c71f339..9d1272ca 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -28,6 +28,7 @@ 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.items.ItemHandlerHelper; import org.apache.commons.lang3.tuple.Pair; import java.util.List; @@ -311,7 +312,7 @@ public class BloodAltar implements IFluidHandler { if (hasOperated) { if (progress >= liquidRequired * stackSize) { - ItemStack result = recipe.getOutput().copy(); + ItemStack result = ItemHandlerHelper.copyStackWithSize(recipe.getOutput(), stackSize); BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(recipe.getInput(), result); MinecraftForge.EVENT_BUS.post(event); From 49394b56d6c0114c0690447d1e98633e231635ad Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 16 Feb 2018 17:10:00 -0800 Subject: [PATCH 177/595] Coerced augmented flask recipe outputs out of hiding (#1200) --- .../AlchemyTablePotionAugmentRecipe.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 60 ------------------- 2 files changed, 1 insertion(+), 61 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java index ebd06887..1c2ccd46 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java @@ -52,7 +52,7 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { @Override public ItemStack getModifiedFlaskForInput(ItemStack inputStack) { - if (inputStack == null) { + if (inputStack.isEmpty()) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); List effectList = new ArrayList(); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 9fb8ae3e..7b23cda6 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -9,14 +9,11 @@ import WayofTime.bloodmagic.recipe.AlchemyTableCustomRecipe; import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.core.registry.TartaricForgeRecipeRegistry; -import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.client.render.alchemyArray.*; import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; import WayofTime.bloodmagic.compress.BaseCompressionHandler; import WayofTime.bloodmagic.compress.StorageBlockCraftingManager; import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; @@ -56,7 +53,6 @@ public class ModRecipes { addFurnaceRecipes(); addAltarRecipes(); addAlchemyArrayRecipes(); - addSoulForgeRecipes(); addAlchemyTableRecipes(); addOreDoublingAlchemyRecipes(); addPotionRecipes(); @@ -112,62 +108,6 @@ public class ModRecipes { BloodMagic.instance.logger.info("Added compression recipes in {}", stopwatch); } - public static void addSoulForgeRecipes() { - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), 1, 1, "dustRedstone", "ingotGold", "blockGlass", "dyeBlue"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), 60, 20, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), "gemDiamond", "blockRedstone", "blockLapis"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), 240, 50, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "gemDiamond", "blockGold", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 1000, 100, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD), EnumDemonWillType.DEFAULT.getStack()); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 4), 4000, 500, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), Items.NETHER_STAR); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SWORD), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_SWORD)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_AXE), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_AXE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_PICKAXE), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_PICKAXE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SHOVEL), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_SHOVEL)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_BOW), 70, 0, new ItemStack(Items.BOW), new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "string", "string"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), 0, 0, "dustRedstone", "dyeWhite", "gunpowder", Items.COAL); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_WATER.getStack(), 10, 3, new ItemStack(Items.SUGAR), new ItemStack(Items.WATER_BUCKET), new ItemStack(Items.WATER_BUCKET)); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_LAVA.getStack(), 32, 10, Items.LAVA_BUCKET, "dustRedstone", "cobblestone", "blockCoal"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_VOID.getStack(), 64, 10, Items.BUCKET, "string", "string", "gunpowder"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_GROWTH.getStack(), 128, 20, "treeSapling", "treeSapling", "sugarcane", Items.SUGAR); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_AIR.getStack(), 128, 20, Items.GHAST_TEAR, "feather", "feather"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_SIGHT.getStack(), 64, 0, RegistrarBloodMagicItems.SIGIL_DIVINATION, "blockGlass", "blockGlass", "dustGlowstone"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_HOLDING.getStack(), 64, 20, "chestWood", "leather", "string", "string"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_FAST_MINER.getStack(), 128, 10, Items.IRON_PICKAXE, Items.IRON_AXE, Items.IRON_SHOVEL, Items.GUNPOWDER); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_AFFINITY.getStack(), 300, 30, RegistrarBloodMagicItems.SIGIL_WATER, RegistrarBloodMagicItems.SIGIL_AIR, RegistrarBloodMagicItems.SIGIL_LAVA, Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_SUPPRESSION.getStack(), 500, 50, RegistrarBloodMagicBlocks.TELEPOSER, Items.WATER_BUCKET, Items.LAVA_BUCKET, Items.BLAZE_ROD); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), 400, 10, "dustGlowstone", "dustRedstone", "nuggetGold", Items.GUNPOWDER); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), 300, 10, "glowstone", Blocks.TORCH, "dustRedstone", "dustRedstone"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_MAGNETISM.getStack(), 600, 10, "string", "ingotGold", "blockIron", "ingotGold"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_HASTE.getStack(), 1400, 100, Items.COOKIE, Items.SUGAR, Items.COOKIE, "stone"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BRIDGE.getStack(), 600, 50, Blocks.SOUL_SAND, Blocks.SOUL_SAND, "stone", Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_SEVERANCE.getStack(), 800, 70, Items.ENDER_EYE, Items.ENDER_PEARL, "ingotGold", "ingotGold"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_COMPRESSION.getStack(), 2000, 200, "blockIron", "blockGold", Blocks.OBSIDIAN, "cobblestone"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_TELEPOSITION.getStack(), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "glowstone", "blockRedstone", "ingotGold"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_TRANSPOSITION.getStack(), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "gemDiamond", Items.ENDER_PEARL, Blocks.OBSIDIAN); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_CLAW.getStack(), 800, 120, Items.FLINT, Items.FLINT, ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BOUNCE.getStack(), 200, 20, Blocks.SLIME_BLOCK, Blocks.SLIME_BLOCK, Items.LEATHER, "string"); - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_FROST.getStack(), 80, 10, Blocks.ICE, Items.SNOWBALL, Items.SNOWBALL, "dustRedstone"); - - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.SENTIENT_ARMOUR_GEM), 240, 150, Items.DIAMOND_CHESTPLATE, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), Blocks.IRON_BLOCK, Blocks.OBSIDIAN); - - TartaricForgeRecipeRegistry.registerRecipe(ComponentTypes.FRAME_PART.getStack(), 400, 10, "blockGlass", "stone", new ItemStack(RegistrarBloodMagicItems.SLATE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER), 400, 5, "stickWood", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), "gemLapis", "gemLapis"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE), 400, 5, "dustGlowstone", "dustRedstone", "blockGlass", "stone"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotIron", new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotGold", new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE), 400, 200, "blockIron", "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 0), 1200, 100, EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack()); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 1), 1200, 100, EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack()); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 2), 1200, 100, EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack()); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 3), 1200, 100, EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack()); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 4), 1200, 100, EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack()); - - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRUCIBLE), 400, 100, Items.CAULDRON, "stone", "gemLapis", "gemDiamond"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PYLON), 400, 50, "blockIron", "stone", "gemLapis", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTALLIZER), 500, 100, RegistrarBloodMagicBlocks.SOUL_FORGE, "stone", "gemLapis", "blockGlass"); - TartaricForgeRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE), 400, 50, "ingotGold", "dustRedstone", "blockGlass", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); - } - public static void addAlchemyTableRecipes() { AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.STRING, 4), 0, 100, 0, Blocks.WOOL, Items.FLINT); AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.FLINT, 2), 0, 20, 0, Blocks.GRAVEL, Items.FLINT); From 29c2ebe8c216b106c587c1ec23b14e4de8c4d5f4 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 16 Feb 2018 17:36:26 -0800 Subject: [PATCH 178/595] Update changelog + version --- changelog.txt | 16 ++++++++++++++++ gradle.properties | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 745d9e7b..590d761f 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,19 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index a30fcbb6..afba9053 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.2 +mod_version=2.2.3 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From b29ade63f0cccd7bb0c9913db3b727d1e0b2f7ad Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 16 Feb 2018 23:48:28 -0800 Subject: [PATCH 179/595] Logging overhaul --- .../WayofTime/bloodmagic/ConfigHandler.java | 9 +++ .../bloodmagic/api/impl/BloodMagicAPI.java | 8 ++- .../api/impl/BloodMagicBlacklist.java | 21 +++++-- .../api/impl/BloodMagicValueManager.java | 10 +++- .../bloodmagic/core/data/SoulNetwork.java | 4 +- .../core/registry/AltarRecipeRegistry.java | 5 +- .../registry/ImperfectRitualRegistry.java | 7 ++- .../core/registry/RitualRegistry.java | 21 +++---- .../demonAura/WorldDemonWillHandler.java | 7 ++- .../livingArmour/LivingArmourHandler.java | 5 +- .../ritual/portal/LocationsHandler.java | 16 +++--- .../java/WayofTime/bloodmagic/util/BMLog.java | 57 +++++++++++++++++++ 12 files changed, 130 insertions(+), 40 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/util/BMLog.java diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 0a87cb07..889c07af 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -11,6 +11,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class ConfigHandler { + @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"}) @@ -30,6 +32,13 @@ public class ConfigHandler { } } + 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.", "Warning: May drastically increase log size."}) + public boolean enableAPILogging = 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"}; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index 12717e3e..a1f82fe7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.api.impl; import WayofTime.bloodmagic.api.IBloodMagicAPI; import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.util.BMLog; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import net.minecraft.block.state.IBlockState; @@ -45,7 +46,7 @@ public class BloodMagicAPI implements IBloodMagicAPI { @Override public void registerAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType) { - EnumAltarComponent component = EnumAltarComponent.NOTAIR; + EnumAltarComponent component = null; for (EnumAltarComponent type : EnumAltarComponent.VALUES) { if (type.name().equalsIgnoreCase(componentType)) { component = type; @@ -53,7 +54,10 @@ public class BloodMagicAPI implements IBloodMagicAPI { } } - altarComponents.put(component, state); + if (component != null) { + BMLog.API.info("Registered {} as a {} altar component.", state, componentType); + altarComponents.put(component, state); + } else BMLog.API.warn("Invalid Altar component type: {}.", componentType); } @Nonnull diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java index 29fd1f49..5348eb2c 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java @@ -1,6 +1,7 @@ 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; @@ -28,8 +29,10 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addTeleposer(@Nonnull IBlockState state) { - if (!teleposer.contains(state)) + if (!teleposer.contains(state)) { + BMLog.API.info("Blacklist: Added {} to the Teleposer blacklist.", state); teleposer.add(state); + } } public void addTeleposer(@Nonnull Block block) { @@ -39,14 +42,18 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addTeleposer(@Nonnull ResourceLocation entityId) { - if (!teleposerEntities.contains(entityId)) + if (!teleposerEntities.contains(entityId)) { + BMLog.API.info("Blacklist: Added {} to the Teleposer blacklist.", entityId); teleposerEntities.add(entityId); + } } @Override public void addTransposition(@Nonnull IBlockState state) { - if (!transposition.contains(state)) + if (!transposition.contains(state)) { + BMLog.API.info("Blacklist: Added {} to the Transposition blacklist.", state); transposition.add(state); + } } public void addTransposition(@Nonnull Block block) { @@ -56,8 +63,10 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addGreenGrove(@Nonnull IBlockState state) { - if (!greenGrove.contains(state)) + if (!greenGrove.contains(state)) { + BMLog.API.info("Blacklist: Added {} to the Green Grove blacklist.", state); greenGrove.add(state); + } } public void addGreenGrove(@Nonnull Block block) { @@ -67,8 +76,10 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addWellOfSuffering(@Nonnull ResourceLocation entityId) { - if (!sacrifice.contains(entityId)) + if (!sacrifice.contains(entityId)) { + BMLog.API.info("Blacklist: Added {} to the Well of Suffering blacklist.", entityId); sacrifice.add(entityId); + } } // Internal use getters diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java index 8ceacc66..99fc2e9f 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java @@ -3,6 +3,7 @@ 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; @@ -24,6 +25,7 @@ public class BloodMagicValueManager implements IBloodMagicValueManager { @Override public void setSacrificialValue(@Nonnull ResourceLocation entityId, int value) { + BMLog.API.info("Value Manager: Set sacrificial value of {} to {}.", entityId, value); sacrificial.put(entityId, value); } @@ -37,13 +39,17 @@ public class BloodMagicValueManager implements IBloodMagicValueManager { } } - if (tranquility != null) + if (tranquility != null) { + BMLog.API.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 (IBlockState state : block.getBlockState().getValidStates()) + for (IBlockState state : block.getBlockState().getValidStates()) { + BMLog.API.info("Value Manager: Set tranquility value of {} to {} @ {}", state, tranquilityStack.type, tranquilityStack.value); tranquility.put(state, tranquilityStack); + } } public Map getSacrificial() { diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index 55b09299..acc83e58 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.core.data; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.PleaseStopUsingMe; import WayofTime.bloodmagic.event.AddToNetworkEvent; import WayofTime.bloodmagic.event.SoulNetworkEvent; @@ -130,7 +132,7 @@ public class SoulNetwork implements INBTSerializable { if (getParent() != null) getParent().markDirty(); else - PleaseStopUsingMe.logger.error("A SoulNetwork was created, but a parent was not set to allow saving."); + BMLog.DEFAULT.error("A SoulNetwork was created, but a parent was not set to allow saving."); } @Nullable diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java index 789ec6ad..49ab1e77 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.altar.EnumAltarTier; import com.google.common.collect.BiMap; @@ -29,7 +30,7 @@ public class AltarRecipeRegistry { if (!recipes.containsValue(altarRecipe) && altarRecipe.getInput().size() > 0) recipes.put(altarRecipe.getInput(), altarRecipe); else - PleaseStopUsingMe.logger.error("Error adding altar recipe for input [{}].", altarRecipe.toString()); + BMLog.DEFAULT.error("Error adding altar recipe for input [{}].", altarRecipe.toString()); } public static void registerFillRecipe(ItemStack orbStack, EnumAltarTier tier, int maxForOrb, int consumeRate, int drainRate) { diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java index 0336e6b0..7694eae2 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java @@ -1,7 +1,8 @@ package WayofTime.bloodmagic.core.registry; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; @@ -23,7 +24,7 @@ public class ImperfectRitualRegistry { public static void registerRitual(ImperfectRitual imperfectRitual, String id, boolean enabled) { if (imperfectRitual != null) { if (registry.containsKey(id)) - PleaseStopUsingMe.logger.error("Duplicate imperfect ritual id: %s", id); + BMLog.DEFAULT.error("Duplicate imperfect ritual id: %s", id); else { registry.put(id, imperfectRitual); enabledRituals.put(imperfectRitual, enabled); @@ -71,7 +72,7 @@ public class ImperfectRitualRegistry { try { return enabledRituals.get(imperfectRitual); } catch (NullPointerException e) { - PleaseStopUsingMe.logger.error("Invalid Imperfect Ritual was called"); + BMLog.DEFAULT.error("Invalid Imperfect Ritual was called"); return false; } } diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java index 2c778938..dad49720 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.util.BMLog; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; @@ -28,14 +28,14 @@ public class RitualRegistry { */ public static void registerRitual(Ritual ritual, String id, boolean enabled) { if (locked) { - PleaseStopUsingMe.logger.error("This registry has been locked. Please register your ritual earlier."); - PleaseStopUsingMe.logger.error("If you reflect this, I will hunt you down. - TehNut"); + BMLog.DEFAULT.error("This registry has been locked. Please register your ritual earlier."); + BMLog.DEFAULT.error("If you reflect this, I will hunt you down. - TehNut"); return; } if (ritual != null) { if (registry.containsKey(id)) - PleaseStopUsingMe.logger.error("Duplicate ritual id: %s", id); + BMLog.DEFAULT.error("Duplicate ritual id: %s", id); else { registry.put(id, ritual); enabledRituals.put(ritual, enabled); @@ -78,7 +78,7 @@ public class RitualRegistry { try { return enabledRituals.get(ritual); } catch (NullPointerException e) { - PleaseStopUsingMe.logger.error("Invalid Ritual was called"); + BMLog.DEFAULT.error("Invalid Ritual was called"); return false; } } @@ -111,13 +111,10 @@ public class RitualRegistry { locked = true; // Lock registry so no no rituals can be registered lookupList.clear(); // Make sure it's empty lookupList.addAll(registry.keySet()); - Collections.sort(lookupList, new Comparator() { - @Override - public int compare(String o1, String o2) { - Ritual ritual1 = registry.get(o1); - Ritual ritual2 = registry.get(o2); - return ritual1.getComponents().size() > ritual2.getComponents().size() ? -1 : 0; // Put earlier if bigger - } + Collections.sort(lookupList, (o1, o2) -> { + Ritual ritual1 = registry.get(o1); + Ritual ritual2 = registry.get(o2); + return ritual1.getComponents().size() > ritual2.getComponents().size() ? -1 : 0; // Put earlier if bigger }); } } diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index 06cac743..e863aac9 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -1,8 +1,9 @@ package WayofTime.bloodmagic.demonAura; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.BloodMagic; 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; @@ -45,13 +46,13 @@ public class WorldDemonWillHandler { public static void addWillWorld(int dim) { if (!containedWills.containsKey(dim)) { containedWills.put(dim, new WillWorld(dim)); - PleaseStopUsingMe.logger.info("Creating demon will cache for world " + dim); + BMLog.DEBUG.info("Creating demon will cache for world " + dim); } } public static void removeWillWorld(int dim) { containedWills.remove(dim); - PleaseStopUsingMe.logger.info("Removing demon will cache for world " + dim); + BMLog.DEBUG.info("Removing demon will cache for world " + dim); } public static void addWillChunk(int dim, Chunk chunk, short base, DemonWillHolder currentWill) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java index 5fe53275..a1a0c46f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.livingArmour; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.util.BMLog; import net.minecraft.nbt.NBTTagCompound; import java.lang.reflect.Constructor; @@ -31,7 +32,7 @@ public class LivingArmourHandler { try { Constructor ctor = clazz.getConstructor(int.class); if (ctor == null) { - PleaseStopUsingMe.logger.error("Error adding living armour upgrade {} as it doesn't have a valid constructor.", upgrade.getUniqueIdentifier()); + BMLog.DEFAULT.error("Error adding living armour upgrade {} as it doesn't have a valid constructor.", upgrade.getUniqueIdentifier()); } else { upgradeConstructorMap.put(upgrade.getUniqueIdentifier(), ctor); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java index af88a470..fbf098d3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual.portal; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; import WayofTime.bloodmagic.teleport.PortalLocation; +import WayofTime.bloodmagic.util.BMLog; import net.minecraftforge.common.DimensionManager; import java.io.*; @@ -27,12 +27,12 @@ public class LocationsHandler implements Serializable { updateFile(fileName, portals); } if (!portals.get(name).isEmpty() && portals.get(name).size() >= 2) { - PleaseStopUsingMe.logger.info("Location " + name + " already exists."); + BMLog.DEBUG.info("Location {} already exists.", name); updateFile(fileName, portals); return false; } else { portals.get(name).add(location); - PleaseStopUsingMe.logger.info("Adding " + name); + BMLog.DEBUG.info("Adding {}", name); updateFile(fileName, portals); return true; } @@ -42,11 +42,11 @@ public class LocationsHandler implements Serializable { if (portals.get(name) != null && !portals.get(name).isEmpty()) { if (portals.get(name).contains(location)) { portals.get(name).remove(location); - PleaseStopUsingMe.logger.info("Removing " + name); + BMLog.DEBUG.info("Removing {}", name); updateFile(fileName, portals); return true; } else { - PleaseStopUsingMe.logger.info("No location matching " + name); + BMLog.DEBUG.info("No location matching {}", name); updateFile(fileName, portals); return false; } @@ -75,10 +75,10 @@ public class LocationsHandler implements Serializable { if (!file.exists()) { if (file.getParentFile().mkdir()) { if (file.createNewFile()) { - PleaseStopUsingMe.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + BMLog.DEBUG.info("Creating {} in {}", fileName, DimensionManager.getCurrentSaveRootDirectory()); } } else if (file.createNewFile()) { - PleaseStopUsingMe.logger.info("Creating " + fileName + " in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + BMLog.DEBUG.info("Creating {} in {}", fileName, DimensionManager.getCurrentSaveRootDirectory()); } } FileInputStream fileIn = new FileInputStream(file); @@ -90,7 +90,7 @@ public class LocationsHandler implements Serializable { } catch (IOException e) { return null; } catch (ClassNotFoundException e) { - PleaseStopUsingMe.logger.error(String.valueOf(file) + " was not found in " + String.valueOf(DimensionManager.getCurrentSaveRootDirectory())); + BMLog.DEFAULT.error("{} was not found in {}", file, DimensionManager.getCurrentSaveRootDirectory()); return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/BMLog.java b/src/main/java/WayofTime/bloodmagic/util/BMLog.java new file mode 100644 index 00000000..0a9f1cfa --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/BMLog.java @@ -0,0 +1,57 @@ +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 { + + DEFAULT(BloodMagic.MODID) { + @Override + boolean enabled() { + return true; + } + }, + DEBUG() { + @Override + boolean enabled() { + return ConfigHandler.general.enableDebugLogging; + } + }, + API() { + @Override + boolean enabled() { + return ConfigHandler.general.enableAPILogging; + } + }, + ; + + private final Logger logger; + + BMLog(String logName) { + logger = LogManager.getLogger(logName); + } + + BMLog() { + logger = LogManager.getLogger(BloodMagic.MODID + "|" + WordUtils.capitalizeFully(name().replace("_", " "))); + } + + abstract boolean enabled(); + + public void info(String input, Object... args) { + if (enabled()) + logger.info(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); + } +} From 0e986a0bdf655781001cb35067305ae15b18ed99 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 16 Feb 2018 23:58:24 -0800 Subject: [PATCH 180/595] Slightly alter the altar renderer --- .../client/render/block/RenderAltar.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) 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 0c4a9073..d8988f06 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -13,7 +13,6 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -37,16 +36,15 @@ public class RenderAltar extends TileEntitySpecialRenderer { GlStateManager.pushMatrix(); GlStateManager.translate(x, y, z); if (level > 0) - this.renderFluid(getWorld(), level); - this.renderItem(tileAltar.getWorld(), inputStack); + this.renderFluid(level); + this.renderItem(inputStack); GlStateManager.popMatrix(); - if (tileAltar.getCurrentTierDisplayed() != EnumAltarTier.ONE) { + if (tileAltar.getCurrentTierDisplayed() != EnumAltarTier.ONE) renderHologram(tileAltar, tileAltar.getCurrentTierDisplayed(), partialTicks); - } } - private void renderFluid(World world, float fluidLevel) { + private void renderFluid(float fluidLevel) { GlStateManager.pushMatrix(); Fluid fluid = BlockLifeEssence.getLifeEssence(); @@ -82,23 +80,20 @@ public class RenderAltar extends TileEntitySpecialRenderer { GlStateManager.popMatrix(); } - private void renderItem(World world, ItemStack stack) { + private void renderItem(ItemStack stack) { RenderItem itemRenderer = mc.getRenderItem(); if (!stack.isEmpty()) { GlStateManager.translate(0.5, 1, 0.5); - EntityItem entityitem = new EntityItem(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.scale(0.75F, 0.75F, 0.75F); GlStateManager.pushAttrib(); RenderHelper.enableStandardItemLighting(); - itemRenderer.renderItem(entityitem.getItem(), ItemCameraTransforms.TransformType.FIXED); + itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.GROUND); RenderHelper.disableStandardItemLighting(); GlStateManager.popAttrib(); From f49e661eb6980cf4904b8ba5079b5d67e1cffb2b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 09:26:35 -0800 Subject: [PATCH 181/595] Make sure we're looking at a block before doing blocky things (#1227) --- .../bloodmagic/client/hud/HUDElementCornerTile.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java index 207fde44..05a40b57 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java @@ -11,6 +11,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.RayTraceResult; import net.minecraftforge.client.event.RenderGameOverlayEvent; import org.apache.commons.lang3.tuple.Pair; @@ -79,6 +80,10 @@ public abstract class HUDElementCornerTile extends HUDElem } } + RayTraceResult trace = Minecraft.getMinecraft().objectMouseOver; + if (trace.typeOfHit != RayTraceResult.Type.BLOCK) + return false; + TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); if (!(tile instanceof TileAltar)) flag = false; From f89b5a005af35f10cbbd24a3f7e464a0d347b408 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 09:48:17 -0800 Subject: [PATCH 182/595] Logging for plugin gathering Moved spammy API stuff to a separate logger --- .../java/WayofTime/bloodmagic/BloodMagic.java | 7 ++--- .../WayofTime/bloodmagic/ConfigHandler.java | 4 ++- .../bloodmagic/api/impl/BloodMagicAPI.java | 2 +- .../api/impl/BloodMagicBlacklist.java | 10 +++--- .../api/impl/BloodMagicValueManager.java | 6 ++-- .../java/WayofTime/bloodmagic/util/BMLog.java | 6 ++++ .../WayofTime/bloodmagic/util/PluginUtil.java | 31 +++++++++++++++++-- 7 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 18a83ef5..0b1122f4 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic; import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicPlugin; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.core.registry.RitualRegistry; import WayofTime.bloodmagic.util.helper.LogHelper; @@ -73,7 +72,7 @@ public class BloodMagic { public void preInit(FMLPreInitializationEvent event) { configDir = new File(event.getModConfigurationDirectory(), "bloodmagic"); - PLUGINS.addAll(PluginUtil.getPlugins(event.getAsmData())); + PLUGINS.addAll(PluginUtil.gatherPlugins(event.getAsmData())); ModTranquilityHandlers.init(); ModDungeons.init(); @@ -84,8 +83,8 @@ public class BloodMagic { @Mod.EventHandler public void init(FMLInitializationEvent event) { BloodMagicPacketHandler.init(); - for (Pair plugin : PLUGINS) - plugin.getLeft().register(BloodMagicAPI.INSTANCE); + + PluginUtil.registerPlugins(PLUGINS); ModRecipes.init(); ModRituals.initRituals(); diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 889c07af..27316942 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -35,8 +35,10 @@ public class ConfigHandler { 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.", "Warning: May drastically increase log size."}) + @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; } public static class ConfigBlacklist { diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index a1f82fe7..05d0716b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -55,7 +55,7 @@ public class BloodMagicAPI implements IBloodMagicAPI { } if (component != null) { - BMLog.API.info("Registered {} as a {} altar component.", state, componentType); + BMLog.API_VERBOSE.info("Registered {} as a {} altar component.", state, componentType); altarComponents.put(component, state); } else BMLog.API.warn("Invalid Altar component type: {}.", componentType); } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java index 5348eb2c..18029c71 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java @@ -30,7 +30,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addTeleposer(@Nonnull IBlockState state) { if (!teleposer.contains(state)) { - BMLog.API.info("Blacklist: Added {} to the Teleposer blacklist.", state); + BMLog.API_VERBOSE.info("Blacklist: Added {} to the Teleposer blacklist.", state); teleposer.add(state); } } @@ -43,7 +43,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addTeleposer(@Nonnull ResourceLocation entityId) { if (!teleposerEntities.contains(entityId)) { - BMLog.API.info("Blacklist: Added {} to the Teleposer blacklist.", entityId); + BMLog.API_VERBOSE.info("Blacklist: Added {} to the Teleposer blacklist.", entityId); teleposerEntities.add(entityId); } } @@ -51,7 +51,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addTransposition(@Nonnull IBlockState state) { if (!transposition.contains(state)) { - BMLog.API.info("Blacklist: Added {} to the Transposition blacklist.", state); + BMLog.API_VERBOSE.info("Blacklist: Added {} to the Transposition blacklist.", state); transposition.add(state); } } @@ -64,7 +64,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addGreenGrove(@Nonnull IBlockState state) { if (!greenGrove.contains(state)) { - BMLog.API.info("Blacklist: Added {} to the Green Grove blacklist.", state); + BMLog.API_VERBOSE.info("Blacklist: Added {} to the Green Grove blacklist.", state); greenGrove.add(state); } } @@ -77,7 +77,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { @Override public void addWellOfSuffering(@Nonnull ResourceLocation entityId) { if (!sacrifice.contains(entityId)) { - BMLog.API.info("Blacklist: Added {} to the Well of Suffering blacklist.", entityId); + BMLog.API_VERBOSE.info("Blacklist: Added {} to the Well of Suffering blacklist.", entityId); sacrifice.add(entityId); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java index 99fc2e9f..5c894574 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java @@ -25,7 +25,7 @@ public class BloodMagicValueManager implements IBloodMagicValueManager { @Override public void setSacrificialValue(@Nonnull ResourceLocation entityId, int value) { - BMLog.API.info("Value Manager: Set sacrificial value of {} to {}.", entityId, value); + BMLog.API_VERBOSE.info("Value Manager: Set sacrificial value of {} to {}.", entityId, value); sacrificial.put(entityId, value); } @@ -40,14 +40,14 @@ public class BloodMagicValueManager implements IBloodMagicValueManager { } if (tranquility != null) { - BMLog.API.info("Value Manager: Set tranquility value of {} to {} @ {}", state, tranquilityType, value); + 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 (IBlockState state : block.getBlockState().getValidStates()) { - BMLog.API.info("Value Manager: Set tranquility value of {} to {} @ {}", state, tranquilityStack.type, tranquilityStack.value); + BMLog.API_VERBOSE.info("Value Manager: Set tranquility value of {} to {} @ {}", state, tranquilityStack.type, tranquilityStack.value); tranquility.put(state, tranquilityStack); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/BMLog.java b/src/main/java/WayofTime/bloodmagic/util/BMLog.java index 0a9f1cfa..c6e75232 100644 --- a/src/main/java/WayofTime/bloodmagic/util/BMLog.java +++ b/src/main/java/WayofTime/bloodmagic/util/BMLog.java @@ -26,6 +26,12 @@ public enum BMLog { return ConfigHandler.general.enableAPILogging; } }, + API_VERBOSE() { + @Override + boolean enabled() { + return ConfigHandler.general.enableVerboseAPILogging; + } + }, ; private final Logger logger; diff --git a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java index 0b69af06..2faf5d38 100644 --- a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java @@ -2,7 +2,9 @@ package WayofTime.bloodmagic.util; import WayofTime.bloodmagic.api.BloodMagicPlugin; 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.fml.common.discovery.ASMDataTable; import org.apache.commons.lang3.tuple.Pair; @@ -15,7 +17,8 @@ public class PluginUtil { @SuppressWarnings("unchecked") @Nonnull - public static List> getPlugins(ASMDataTable dataTable) { + public static List> gatherPlugins(ASMDataTable dataTable) { + Stopwatch stopwatch = Stopwatch.createStarted(); List> discoveredAnnotations = Lists.newArrayList(); Set discoveredPlugins = dataTable.getAll(BloodMagicPlugin.class.getCanonicalName()); @@ -26,6 +29,7 @@ public class PluginUtil { 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(); @@ -33,7 +37,30 @@ public class PluginUtil { } // Bring core plugin up to top - discoveredAnnotations.sort((o1, o2) -> o1.getLeft().getClass() == BloodMagicCorePlugin.class ? 1 : 0); + 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; } + + public static void registerPlugins(List> plugins) { + Stopwatch total = Stopwatch.createStarted(); + int errors = 0; + for (Pair plugin : plugins) { + Stopwatch per = Stopwatch.createStarted(); + try { + plugin.getLeft().register(BloodMagicAPI.INSTANCE); + } catch (Exception e) { + errors++; + BMLog.DEFAULT.error("Error loading plugin at {}: {}: {}", plugin.getLeft().getClass(), e.getClass().getSimpleName(), e.getMessage()); + } + BMLog.API.info("Registered plugin at {} in {}", plugin.getLeft().getClass(), per.stop()); + } + + BMLog.API.info("Registered {} plugins with {} errors in {}", plugins.size() - errors, errors, total.stop()); + } } From 90a071ae2377c433a0b85b78abe511423a0049cc Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 09:54:29 -0800 Subject: [PATCH 183/595] Fix some logger usages --- .../bloodmagic/core/registry/ImperfectRitualRegistry.java | 2 +- .../WayofTime/bloodmagic/core/registry/RitualRegistry.java | 2 +- .../WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java index 7694eae2..c1c0acdf 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java @@ -24,7 +24,7 @@ public class ImperfectRitualRegistry { public static void registerRitual(ImperfectRitual imperfectRitual, String id, boolean enabled) { if (imperfectRitual != null) { if (registry.containsKey(id)) - BMLog.DEFAULT.error("Duplicate imperfect ritual id: %s", id); + BMLog.DEFAULT.error("Duplicate imperfect ritual id: {}", id); else { registry.put(id, imperfectRitual); enabledRituals.put(imperfectRitual, enabled); diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java index dad49720..cc3f5dc6 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java @@ -35,7 +35,7 @@ public class RitualRegistry { if (ritual != null) { if (registry.containsKey(id)) - BMLog.DEFAULT.error("Duplicate ritual id: %s", id); + BMLog.DEFAULT.error("Duplicate ritual id: {}", id); else { registry.put(id, ritual); enabledRituals.put(ritual, enabled); diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index e863aac9..0ccf57e0 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -46,13 +46,13 @@ public class WorldDemonWillHandler { 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); + 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); + BMLog.DEBUG.info("Removing demon will cache for world {}", dim); } public static void addWillChunk(int dim, Chunk chunk, short base, DemonWillHolder currentWill) { From 009711583e2b258329cbf4b9c84bada7130ff6b3 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 10:08:23 -0800 Subject: [PATCH 184/595] Update changelog + version --- changelog.txt | 9 +++++++++ gradle.properties | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 590d761f..8b6b1ff3 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,12 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index afba9053..43d16647 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.3 +mod_version=2.2.4 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From b0b62de7fd1fbcf8107000788f4239890e2514f5 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 10:14:53 -0800 Subject: [PATCH 185/595] Mark builds as alpha status --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8d66bf41..fde35074 100644 --- a/build.gradle +++ b/build.gradle @@ -170,7 +170,7 @@ curseforge { project { id = "${curse_id}" changelog = getChangelogText() - releaseType = 'beta' + releaseType = 'alpha' relations curseRelations From 441e7b8952e4f84bb0a99814904cc3ef55583c66 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 10:38:33 -0800 Subject: [PATCH 186/595] Fix Lava Crystal being consumed --- .../bloodmagic/item/ItemLavaCrystal.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index 81c127fc..b64edd65 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IVariantProvider; @@ -21,11 +22,13 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide @Override public ItemStack getContainerItem(ItemStack itemStack) { - NetworkHelper.getSoulNetwork(this.getOwnerUUID(itemStack)).syphon(25); - ItemStack copiedStack = itemStack.copy(); - copiedStack.setItemDamage(copiedStack.getItemDamage()); - copiedStack.setCount(1); - return copiedStack; + String uuid = getOwnerUUID(itemStack); + if (uuid != null) + NetworkHelper.getSoulNetwork(this.getOwnerUUID(itemStack)).syphon(25); + + ItemStack returnStack = new ItemStack(this); + returnStack.setTagCompound(itemStack.getTagCompound()); + return returnStack; } @Override @@ -35,9 +38,6 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide @Override public int getItemBurnTime(ItemStack stack) { - if (!stack.hasTagCompound()) - return -1; - if (getOwnerUUID(stack) == null) return -1; @@ -52,6 +52,16 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide return -1; } + @Override + public String getOwnerName(ItemStack stack) { + return stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; + } + + @Override + public String getOwnerUUID(ItemStack stack) { + return stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; + } + @Override public List> getVariants() { List> ret = Lists.newArrayList(); From 41baaaf28e35fe63959e6ce05bcb3dfbbc096989 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 15:07:54 -0800 Subject: [PATCH 187/595] YARTF (yet another ray trace fix) (#1228) --- .../WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java index 05a40b57..b84f1c5b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java @@ -81,7 +81,7 @@ public abstract class HUDElementCornerTile extends HUDElem } RayTraceResult trace = Minecraft.getMinecraft().objectMouseOver; - if (trace.typeOfHit != RayTraceResult.Type.BLOCK) + if (trace == null || trace.typeOfHit != RayTraceResult.Type.BLOCK) return false; TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); From 6ffe4b8f5806e48bcdd25788a01b81d6da1bfc28 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 15:36:50 -0800 Subject: [PATCH 188/595] Fix localization for augmented capacity and self sacrifice runes --- src/main/resources/assets/bloodmagic/lang/en_US.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 27fb5cc3..d08c16c4 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -204,10 +204,10 @@ 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.selfsacrifice.name=Rune of Self 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.augcapacity.name=Rune of Augmented 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 From 0cb9d66c8172fe1c27ef5f29c8d7805d050188a1 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 15:50:11 -0800 Subject: [PATCH 189/595] Satiated Stomach will now let you gorge yourself if you're really hungry (#1188) If the user is below 5 saturation, it will no longer ignore above-max saturation foods. --- .../bloodmagic/ritual/RitualFullStomach.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java index 8a8f5181..7cc66329 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java @@ -11,6 +11,8 @@ 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.ArrayList; import java.util.List; @@ -40,37 +42,32 @@ public class RitualFullStomach extends Ritual { AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); - if (!(tile instanceof IInventory)) { + if (tile == null || !tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)) return; - } - - IInventory inventory = (IInventory) tile; + IItemHandler inventory = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); int lastSlot = 0; - AreaDescriptor fillingRange = getBlockRange(FILL_RANGE); - List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, fillingRange.getAABB(pos)); for (EntityPlayer player : playerList) { FoodStats foodStats = player.getFoodStats(); float satLevel = foodStats.getSaturationLevel(); - for (int i = lastSlot; i < inventory.getSizeInventory(); i++) { - ItemStack stack = inventory.getStackInSlot(i); + 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; - if (saturationAmount + satLevel <= 20) { - NBTTagCompound nbt = new NBTTagCompound(); - foodStats.writeNBT(nbt); - nbt.setFloat("foodSaturationLevel", saturationAmount + satLevel); - foodStats.readNBT(nbt); - - inventory.decrStackSize(i, 1); + // 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; From 539879dbd7fd0482fa549a49ee121b72a680a510 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 16:10:27 -0800 Subject: [PATCH 190/595] Mod ID filter should only be based on the modid (#1179) Dangit way --- .../bloodmagic/routing/ModIdItemFilter.java | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java index c414770a..36531585 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java @@ -1,24 +1,16 @@ package WayofTime.bloodmagic.routing; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.ForgeRegistries; public class ModIdItemFilter extends TestItemFilter { + @Override public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { - if (ItemStack.areItemsEqualIgnoreDurability(filterStack, testStack)) { - String keyId = getModID(filterStack.getItem()); - String checkedId = getModID(testStack.getItem()); - return keyId.equals(checkedId); - } - - return false; + return getModID(filterStack).equalsIgnoreCase(getModID(testStack)); } - public String getModID(Item item) { - ResourceLocation resource = ForgeRegistries.ITEMS.getKey(item); - return resource.getResourceDomain(); + public String getModID(ItemStack stack) { + String modid = stack.getItem().getCreatorModId(stack); + return modid == null ? "" : modid; } } From c05336ac9f21f3af7caa81f28c4b043c5175ca42 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 16:27:57 -0800 Subject: [PATCH 191/595] "Temporarily" disable cross-dimension entity teleports --- .../item/sigil/ItemSigilTeleposition.java | 6 +++-- .../bloodmagic/tile/TileTeleposer.java | 26 ++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index ea744f7f..38535e96 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -56,9 +56,11 @@ public class ItemSigilTeleposition extends ItemSigilBase { BlockPos blockPos = new BlockPos(getValue(stack.getTagCompound(), Constants.NBT.X_COORD), getValue(stack.getTagCompound(), Constants.NBT.Y_COORD), getValue(stack.getTagCompound(), Constants.NBT.Z_COORD)).up(); if (world.provider.getDimension() == getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID)) { TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(blockPos, player, getOwnerUUID(stack), true)); - } else { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, getOwnerUUID(stack), world, getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID), true)); } + // FIXME - Fix cross-dimension teleports causing major desync +// } else { +// TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, getOwnerUUID(stack), world, getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID), true)); +// } } return super.onItemRightClick(world, player, hand); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index dc2317c8..f91052d9 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -104,19 +104,21 @@ public class TileTeleposer extends TileInventory implements ITickable { 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), focusWorld, getWorld().provider.getDimension(), true)); - } - } } + // FIXME - Fix cross-dimension teleports causing major desync +// } 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), focusWorld, getWorld().provider.getDimension(), true)); +// } +// } +// } } } } From 74eaabff8ec132255253ba048f0a256e536c7fcf Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 16:37:04 -0800 Subject: [PATCH 192/595] Bounce array now behaves as a pillow while sneak (#1196) --- .../bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java index 85d62dee..cd35b720 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java @@ -22,7 +22,7 @@ public class AlchemyArrayEffectBounce extends AlchemyArrayEffect { @Override public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { if (entity.isSneaking()) { - return; + entity.fallDistance = 0; } else if (entity.motionY < 0.0D) { entity.motionY = -entity.motionY; From 600326acce08a78ee6f28d28bcf785c6547d918d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Feb 2018 16:56:16 -0800 Subject: [PATCH 193/595] Update changelog + version --- changelog.txt | 15 +++++++++++++++ gradle.properties | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 8b6b1ff3..bb775ab4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,18 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 43d16647..5157ee7e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.4 +mod_version=2.2.5 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From ee42f6ddc25037c776193532956b54901e904cfd Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 18 Feb 2018 14:20:36 -0800 Subject: [PATCH 194/595] Slates and inscription tools should use ItemEnum properly --- .../compat/guideapi/book/CategoryRitual.java | 2 +- .../core/RegistrarBloodMagicRecipes.java | 77 ++++++++++--------- .../bloodmagic/item/ItemInscriptionTool.java | 53 +++++-------- .../bloodmagic/ritual/data/EnumRuneType.java | 29 ++++--- 4 files changed, 79 insertions(+), 82 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index 6e53c89d..ccc59e49 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -44,7 +44,7 @@ public class CategoryRitual { for (int i = 1; i < 5; i++) { EnumRuneType type = EnumRuneType.values()[i]; - AltarRecipe scribeRecipe = RecipeHelper.getAltarRecipeForOutput(type.getScribeStack()); + AltarRecipe scribeRecipe = RecipeHelper.getAltarRecipeForOutput(type.getStack()); if (scribeRecipe != null) { ritualStonePages.add(new PageAltarRecipe(scribeRecipe)); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index d49617dc..ed3fcbac 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicRecipeRegistrar; import WayofTime.bloodmagic.altar.EnumAltarTier; import WayofTime.bloodmagic.core.registry.OrbRegistry; +import WayofTime.bloodmagic.item.ItemSlate; import WayofTime.bloodmagic.ritual.data.EnumRuneType; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.block.BlockLifeEssence; @@ -55,38 +56,38 @@ public class RegistrarBloodMagicRecipes { public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) { // ONE registrar.addBloodAltar(new OreIngredient("gemDiamond"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE.ordinal(), 2000, 2, 1); - registrar.addBloodAltar(new OreIngredient("stone"), new ItemStack(RegistrarBloodMagicItems.SLATE), EnumAltarTier.ONE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(new OreIngredient("stone"), ItemSlate.SlateType.BLANK.getStack(), EnumAltarTier.ONE.ordinal(), 1000, 5, 5); registrar.addBloodAltar(Ingredient.fromItem(Items.BUCKET), FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)), EnumAltarTier.ONE.ordinal(), 1000, 5, 0); registrar.addBloodAltar(Ingredient.fromItem(Items.BOOK), new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK), EnumAltarTier.ONE.ordinal(), 1000, 20, 0); // TWO registrar.addBloodAltar(new OreIngredient("blockRedstone"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), EnumAltarTier.TWO.ordinal(), 5000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), EnumAltarTier.TWO.ordinal(), 2000, 5, 5); + registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.BLANK.getStack()), ItemSlate.SlateType.REINFORCED.getStack(), EnumAltarTier.TWO.ordinal(), 2000, 5, 5); registrar.addBloodAltar(Ingredient.fromItem(Items.IRON_SWORD), new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE), EnumAltarTier.TWO.ordinal(), 3000, 5, 5); // THREE registrar.addBloodAltar(new OreIngredient("blockGold"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), EnumAltarTier.THREE.ordinal(), 25000, 20, 20); - registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1)), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), EnumAltarTier.THREE.ordinal(), 5000, 15, 10); - registrar.addBloodAltar(new OreIngredient("obsidian"), EnumRuneType.EARTH.getScribeStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(new OreIngredient("blockLapis"), EnumRuneType.WATER.getScribeStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.MAGMA_CREAM), EnumRuneType.FIRE.getScribeStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.GHAST_TEAR), EnumRuneType.AIR.getScribeStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.REINFORCED.getStack()), ItemSlate.SlateType.IMBUED.getStack(), EnumAltarTier.THREE.ordinal(), 5000, 15, 10); + registrar.addBloodAltar(new OreIngredient("obsidian"), EnumRuneType.EARTH.getStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(new OreIngredient("blockLapis"), EnumRuneType.WATER.getStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(Ingredient.fromItem(Items.MAGMA_CREAM), EnumRuneType.FIRE.getStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); + registrar.addBloodAltar(Ingredient.fromItem(Items.GHAST_TEAR), EnumRuneType.AIR.getStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); registrar.addBloodAltar(Ingredient.fromItem(RegistrarBloodMagicItems.LAVA_CRYSTAL), new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL), EnumAltarTier.THREE.ordinal(), 10000, 20, 10); // FOUR registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), EnumAltarTier.FOUR.ordinal(), 25000, 30, 50); - registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), EnumAltarTier.FOUR.ordinal(), 15000, 20, 20); - registrar.addBloodAltar(new OreIngredient("blockCoal"), EnumRuneType.DUSK.getScribeStack(), EnumAltarTier.FOUR.ordinal(), 2000, 20, 10); + registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.IMBUED.getStack()), ItemSlate.SlateType.DEMONIC.getStack(), EnumAltarTier.FOUR.ordinal(), 15000, 20, 20); + registrar.addBloodAltar(new OreIngredient("blockCoal"), EnumRuneType.DUSK.getStack(), EnumAltarTier.FOUR.ordinal(), 2000, 20, 10); registrar.addBloodAltar(new OreIngredient("enderpearl"), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), EnumAltarTier.FOUR.ordinal(), 2000, 10, 10); registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), EnumAltarTier.FOUR.ordinal(), 10000, 20, 10); // FIVE registrar.addBloodAltar(new OreIngredient("netherStar"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), EnumAltarTier.FIVE.ordinal(), 80000, 50, 100); - registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3)), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4), EnumAltarTier.FIVE.ordinal(), 30000, 40, 100); + registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.DEMONIC.getStack()), ItemSlate.SlateType.ETHEREAL.getStack(), EnumAltarTier.FIVE.ordinal(), 30000, 40, 100); // SIX registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, 2)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); - registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getScribeStack(), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); + registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getStack(), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); } public static void registerAlchemyTableRecipes(BloodMagicRecipeRegistrar registrar) { @@ -141,8 +142,8 @@ public class RegistrarBloodMagicRecipes { 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", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 1000, 100, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD), EnumDemonWillType.DEFAULT.getStack()); + 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)); @@ -175,12 +176,12 @@ public class RegistrarBloodMagicRecipes { 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", new ItemStack(RegistrarBloodMagicItems.SLATE)); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER), 400, 5, "stickWood", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), "gemLapis", "gemLapis"); + 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", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); + 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()); @@ -195,29 +196,29 @@ public class RegistrarBloodMagicRecipes { } public static void registerAlchemyArrayRecipes(BloodMagicRecipeRegistrar registrar) { - registrar.addAlchemyArray(new ItemStack(Items.REDSTONE), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); + 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(), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_LAVA.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE), new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LavaSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_AIR.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/AirSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_FAST_MINER.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_VOID.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/VoidSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_GROWTH.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/GrowthSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_AFFINITY.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ElementalAffinitySigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_SIGHT.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_HOLDING.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LightSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_MAGNETISM.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MagnetismSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_SUPPRESSION.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SuppressionSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_HASTE.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_BRIDGE.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_COMPRESSION.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_SEVERANCE.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_TELEPOSITION.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_TRANSPOSITION.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3), new ItemStack(RegistrarBloodMagicItems.SIGIL_TRANSPOSITION), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_CLAW.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2), new ItemStack(RegistrarBloodMagicItems.SIGIL_CLAW), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_BOUNCE.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_BOUNCE), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_FROST.getStack(), new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1), new ItemStack(RegistrarBloodMagicItems.SIGIL_FROST), null); + 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); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 52bc7794..b8d88eda 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -1,17 +1,19 @@ package WayofTime.bloodmagic.item; -import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.ritual.data.EnumRuneType; import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockRitualStone; -import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; +import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; @@ -21,24 +23,16 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class ItemInscriptionTool extends ItemBindableBase implements IVariantProvider { +public class ItemInscriptionTool extends ItemEnum implements IBindable { + public ItemInscriptionTool() { - super(); + super(EnumRuneType.class, "scribe"); - setUnlocalizedName(BloodMagic.MODID + ".scribe."); - setHasSubtypes(true); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + EnumRuneType.values()[stack.getItemDamage()]; + setMaxStackSize(1); } @Override @@ -47,9 +41,11 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro if (!isInCreativeTab(creativeTab)) return; - for (int i = 1; i < EnumRuneType.values().length; i++) { - ItemStack stack = NBTHelper.checkNBT(new ItemStack(this, 1, i)); - stack.getTagCompound().setInteger(Constants.NBT.USES, 10); + for (EnumRuneType runeType : types) { + ItemStack stack = new ItemStack(this, 1, runeType.ordinal()); + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger(Constants.NBT.USES, 10); + stack.setTagCompound(tag); list.add(stack); } } @@ -59,11 +55,11 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro ItemStack stack = player.getHeldItem(hand); IBlockState state = world.getBlockState(pos); - if (state.getBlock() instanceof BlockRitualStone && !((BlockRitualStone) state.getBlock()).isRuneType(world, pos, getType(stack))) { + 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(), getType(stack))); + 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) @@ -96,20 +92,13 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro @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.inscriber.desc")))); - super.addInformation(stack, world, list, flag); - } + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.inscriber.desc")))); - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - for (int i = 1; i < EnumRuneType.values().length; i++) - ret.add(new ImmutablePair(i, "type=" + EnumRuneType.values()[i].name())); - return ret; - } + if (!stack.hasTagCompound()) + return; - public EnumRuneType getType(ItemStack stack) { - return EnumRuneType.values()[stack.getItemDamage()]; + if (!Strings.isNullOrEmpty(getOwnerUUID(stack))) + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java index ea1f364a..6bab1b6e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java @@ -1,15 +1,16 @@ package WayofTime.bloodmagic.ritual.data; -import net.minecraft.init.Items; -import net.minecraft.item.Item; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.item.types.ISubItem; import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.fml.common.registry.GameRegistry; +import javax.annotation.Nonnull; import java.util.Locale; -public enum EnumRuneType implements IStringSerializable { +public enum EnumRuneType implements IStringSerializable, ISubItem { + BLANK(TextFormatting.GRAY), WATER(TextFormatting.AQUA), FIRE(TextFormatting.RED), @@ -18,19 +19,12 @@ public enum EnumRuneType implements IStringSerializable { DUSK(TextFormatting.DARK_GRAY), DAWN(TextFormatting.GOLD); - @GameRegistry.ObjectHolder("bloodmagic:inscription_tool") - public static final Item INSCRIPTION_TOOL = Items.AIR; - public final TextFormatting colorCode; EnumRuneType(TextFormatting colorCode) { this.colorCode = colorCode; } - public ItemStack getScribeStack() { - return new ItemStack(INSCRIPTION_TOOL, 1, ordinal()); - } - @Override public String toString() { return name().toLowerCase(Locale.ENGLISH); @@ -41,6 +35,18 @@ public enum EnumRuneType implements IStringSerializable { return this.toString(); } + @Nonnull + @Override + public String getInternalName() { + return name().toLowerCase(Locale.ROOT); + } + + @Nonnull + @Override + public ItemStack getStack(int count) { + return new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, count, ordinal()); + } + public static EnumRuneType byMetadata(int meta) { if (meta < 0 || meta >= values().length) meta = 0; @@ -48,4 +54,5 @@ public enum EnumRuneType implements IStringSerializable { return values()[meta]; } + } From ea47db3e5d2691e60647427ff696b298dcd3c884 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 18 Feb 2018 14:33:50 -0800 Subject: [PATCH 195/595] Wrong extenderoo --- .../java/WayofTime/bloodmagic/item/ItemInscriptionTool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index b8d88eda..a87bff6c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -27,7 +27,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.Arrays; import java.util.List; -public class ItemInscriptionTool extends ItemEnum implements IBindable { +public class ItemInscriptionTool extends ItemEnum.Variant implements IBindable { public ItemInscriptionTool() { super(EnumRuneType.class, "scribe"); From c5b0b61315fe325818eb5372fbf4fa8febf12a29 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 18 Feb 2018 15:55:40 -0800 Subject: [PATCH 196/595] Add HUD elements for tranquility (#1233) --- .../bloodmagic/client/hud/Elements.java | 101 ++++++++++++++++++ .../client/hud/HUDElementCornerTile.java | 8 +- .../bloodmagic/proxy/ClientProxy.java | 42 +------- .../bloodmagic/textures/gui/widgets.png | Bin 24967 -> 25852 bytes 4 files changed, 108 insertions(+), 43 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/Elements.java diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java b/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java new file mode 100644 index 00000000..6c507d1a --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java @@ -0,0 +1,101 @@ +package WayofTime.bloodmagic.client.hud; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.Sprite; +import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.tile.TileIncenseAltar; +import WayofTime.bloodmagic.tile.TileInversionPillar; +import WayofTime.bloodmagic.util.helper.NumeralHelper; +import net.minecraft.util.ResourceLocation; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.List; +import java.util.function.Function; + +public class Elements { + + public static void createHUDElements() { + new HUDElementHolding(); + new HUDElementDemonWillAura(); + // Blood Altar with Divination Sigil + new HUDElementCornerTile.DivinedView(TileAltar.class, true) { + @Override + protected void addInformation(List>> information) { + // Current tier + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), + altar -> NumeralHelper.toRoman(altar.getTier().toInt()) + )); + // Stored/Capacity + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), + altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) + )); + } + }; + // Blood Altar with Seers Sigil + new HUDElementCornerTile.DivinedView(TileAltar.class, false) { + @Override + protected void addInformation(List>> information) { + // Current tier + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), + altar -> NumeralHelper.toRoman(altar.getTier().toInt()) + )); + // Stored/Capacity + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), + altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) + )); + // Crafting progress/Crafting requirement + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 32, 46, 16, 16), + altar -> { + if (!altar.isActive()) + return "Inactive"; // FIXME localize + int progress = altar.getProgress(); + int totalLiquidRequired = altar.getLiquidRequired() * altar.getStackInSlot(0).getCount(); + return String.format("%d/%d", progress, totalLiquidRequired); + } + )); + // Consumption rate + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 48, 46, 16, 16), + altar -> String.valueOf((int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1))) + )); + // Total charge + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 64, 46, 16, 16), + altar -> String.valueOf(altar.getTotalCharge()) + )); + } + }; + // Incense Altar + new HUDElementCornerTile.DivinedView(TileIncenseAltar.class, true) { + @Override + protected void addInformation(List>> information) { + // Current tranquility + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 80, 46, 16, 16), + incense -> String.valueOf((int) ((100D * (int) (100 * incense.tranquility)) / 100D)) + )); + // Sacrifice bonus + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 96, 46, 16, 16), + incense -> String.valueOf((int) (100 * incense.incenseAddition)) + )); + } + }; + // Inversion Pillar + new HUDElementCornerTile.DivinedView(TileInversionPillar.class, true) { + @Override + protected void addInformation(List>> information) { + // Current inversion + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 112, 46, 16, 16), + pillar -> String.valueOf(((int) (10 * pillar.getCurrentInversion())) / 10D) + )); + } + }; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java index b84f1c5b..3ac6264c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java @@ -47,11 +47,13 @@ public abstract class HUDElementCornerTile extends HUDElem } } - public static abstract class BloodAltar extends HUDElementCornerTile { + public static abstract class DivinedView extends HUDElementCornerTile { + private final Class tileClass; private final boolean simple; - public BloodAltar(boolean simple) { + public DivinedView(Class tileClass, boolean simple) { + this.tileClass = tileClass; this.simple = simple; } @@ -85,7 +87,7 @@ public abstract class HUDElementCornerTile extends HUDElem return false; TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); - if (!(tile instanceof TileAltar)) + if (tile == null || !tileClass.isAssignableFrom(tile.getClass())) flag = false; return flag; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 4ae09cac..3aa2be30 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.proxy; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.hud.Elements; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.client.IMeshProvider; @@ -121,46 +122,7 @@ public class ClientProxy extends CommonProxy { @Override public void postInit() { - new HUDElementHolding(); - new HUDElementDemonWillAura(); - new HUDElementCornerTile.BloodAltar(true) { // Divination Sigil - @Override - protected void addInformation(List>> information) { - information.add(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), altar -> NumeralHelper.toRoman(altar.getTier().toInt()))); - information.add(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()))); - } - }; - new HUDElementCornerTile.BloodAltar(false) { // Seer Sigil - @Override - protected void addInformation(List>> information) { - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), - altar -> NumeralHelper.toRoman(altar.getTier().toInt()) - )); - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), - altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) - )); - information.add(Pair.of( // Craft Progress - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 32, 46, 16, 16), - altar -> { - if (!altar.isActive()) - return "Inactive"; // FIXME localize - int progress = altar.getProgress(); - int totalLiquidRequired = altar.getLiquidRequired() * altar.getStackInSlot(0).getCount(); - return String.format("%d/%d", progress, totalLiquidRequired); - } - )); - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 48, 46, 16, 16), - altar -> String.valueOf((int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1))) - )); - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 64, 46, 16, 16), - altar -> String.valueOf(altar.getTotalCharge()) - )); - } - }; + Elements.createHUDElements(); } @Override diff --git a/src/main/resources/assets/bloodmagic/textures/gui/widgets.png b/src/main/resources/assets/bloodmagic/textures/gui/widgets.png index 6d8d9cfe1c773bcda8dbd235b756b045a7817ebf..4c80a03ca37d5c71d5b08430638dc66a59dac018 100644 GIT binary patch delta 6923 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 UQ>Fbr;O2YykDf-gnsxa907Wle3IG5A delta 6101 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 From 64336f6f78f22e5eb9416cba7253479f1dac79a2 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 18 Feb 2018 15:55:52 -0800 Subject: [PATCH 197/595] Sigils should only stack to 1 --- src/main/java/WayofTime/bloodmagic/item/ItemSigil.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/item/ItemSigil.java index 417c92e2..605c4bdc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSigil.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSigil.java @@ -17,6 +17,8 @@ public class ItemSigil extends Item implements IBindable, ISigil { super(); this.lpUsed = lpUsed; + + setMaxStackSize(1); } public boolean isUnusable(ItemStack stack) { From 37c8012741f894dcb8f2dbd9998a440df31050f0 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 18 Feb 2018 15:56:03 -0800 Subject: [PATCH 198/595] Ignore blank inscription tools --- .../java/WayofTime/bloodmagic/item/ItemInscriptionTool.java | 3 +++ .../assets/bloodmagic/blockstates/inscription_tool.json | 1 + 2 files changed, 4 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index a87bff6c..b3a62bf6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -42,6 +42,9 @@ public class ItemInscriptionTool extends ItemEnum.Variant implemen return; for (EnumRuneType runeType : types) { + if (runeType == EnumRuneType.BLANK) + continue; + ItemStack stack = new ItemStack(this, 1, runeType.ordinal()); NBTTagCompound tag = new NBTTagCompound(); tag.setInteger(Constants.NBT.USES, 10); diff --git a/src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json b/src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json index 941bdac9..2a14cf73 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json +++ b/src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json @@ -6,6 +6,7 @@ }, "variants": { "type": { + "blank": { }, "water": { "textures": { "layer0": "bloodmagic:items/WaterScribeTool" From 7a288a729213cb0e571cbc0db2be6f5d9c6bfdb8 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 18 Feb 2018 16:05:11 -0800 Subject: [PATCH 199/595] Update changelog + version --- changelog.txt | 10 ++++++++++ gradle.properties | 2 +- .../bloodmagic/client/hud/HUDElementCornerTile.java | 3 +-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/changelog.txt b/changelog.txt index bb775ab4..2f556fa9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,13 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 5157ee7e..a94bfbd0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.5 +mod_version=2.2.6 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java index 3ac6264c..3f7062a1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.client.hud; import WayofTime.bloodmagic.client.Sprite; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; -import WayofTime.bloodmagic.tile.TileAltar; import com.google.common.collect.Lists; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; @@ -86,7 +85,7 @@ public abstract class HUDElementCornerTile extends HUDElem if (trace == null || trace.typeOfHit != RayTraceResult.Type.BLOCK) return false; - TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); + TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(trace.getBlockPos()); if (tile == null || !tileClass.isAssignableFrom(tile.getClass())) flag = false; From 0beef19ba1dd1998227742a15745a1be2beea1ca Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 19 Feb 2018 14:04:32 -0800 Subject: [PATCH 200/595] Seer Sigil should display tranquility data (#1234) --- .../client/hud/HUDElementCornerTile.java | 6 +-- .../provider/DataProviderBloodAltar.java | 5 +- .../core/RegistrarBloodMagicItems.java | 4 +- .../item/sigil/ItemSigilDivination.java | 24 ++------- .../bloodmagic/item/sigil/ItemSigilSeer.java | 51 ------------------- 5 files changed, 12 insertions(+), 78 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java index 3f7062a1..fac02451 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.client.hud; import WayofTime.bloodmagic.client.Sprite; +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; -import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; import com.google.common.collect.Lists; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; @@ -71,12 +71,12 @@ public abstract class HUDElementCornerTile extends HUDElem flag = true; } } else { - if (sigilStack.getItem() instanceof ItemSigilSeer) + if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) flag = true; if (!flag) { sigilStack = player.getHeldItem(EnumHand.OFF_HAND); - if (sigilStack.getItem() instanceof ItemSigilSeer) + if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) flag = true; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index a4ac2b7b..1614bee5 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -4,7 +4,6 @@ import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; -import WayofTime.bloodmagic.item.sigil.ItemSigilSeer; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.helper.TextHelper; import mcp.mobius.waila.api.IWailaConfigHandler; @@ -102,10 +101,10 @@ public class DataProviderBloodAltar implements IWailaDataProvider { } private static boolean holdingSeerSigil(EntityPlayer player) { - if (player.getHeldItemMainhand().getItem() instanceof ItemSigilSeer) + if (player.getHeldItemMainhand().getItem() == RegistrarBloodMagicItems.SIGIL_SEER) return true; - if (player.getHeldItemOffhand().getItem() instanceof ItemSigilSeer) + if (player.getHeldItemOffhand().getItem() == RegistrarBloodMagicItems.SIGIL_SEER) return true; return false; diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 5a8c6180..0d7544ad 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -144,7 +144,7 @@ public class RegistrarBloodMagicItems { new ItemBoundPickaxe().setRegistryName("bound_pickaxe"), new ItemBoundAxe().setRegistryName("bound_axe"), new ItemBoundShovel().setRegistryName("bound_shovel"), - new ItemSigilDivination().setRegistryName("sigil_divination"), + new ItemSigilDivination(true).setRegistryName("sigil_divination"), new ItemSigilAir().setRegistryName("sigil_air"), new ItemSigilWater().setRegistryName("sigil_water"), new ItemSigilLava().setRegistryName("sigil_lava"), @@ -156,7 +156,7 @@ public class RegistrarBloodMagicItems { new ItemSigilSuppression().setRegistryName("sigil_suppression"), new ItemSigilHaste().setRegistryName("sigil_haste"), new ItemSigilFastMiner().setRegistryName("sigil_fast_miner"), - new ItemSigilSeer().setRegistryName("sigil_seer"), + new ItemSigilDivination(false).setRegistryName("sigil_seer"), new ItemSigilPhantomBridge().setRegistryName("sigil_phantom_bridge"), new ItemSigilWhirlwind().setRegistryName("sigil_whirlwind"), new ItemSigilCompression().setRegistryName("sigil_compression"), diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index d25aad56..0447c242 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -19,39 +19,25 @@ import java.util.ArrayList; import java.util.List; public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { - public ItemSigilDivination() { - super("divination"); + + public ItemSigilDivination(boolean simple) { + super(simple ? "divination" : "seer"); } @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { -// if (world instanceof WorldServer) -// { -// System.out.println("Testing..."); -//// BuildTestStructure s = new BuildTestStructure(); -//// s.placeStructureAtPosition(new Random(), Rotation.CLOCKWISE_180, (WorldServer) world, player.getPosition(), 0); -// DungeonTester.testDungeonElementWithOutput((WorldServer) world, player.getPosition()); -// } - -// if (!world.isRemote) -// { -// EntityCorruptedSheep fred = new EntityCorruptedSheep(world, EnumDemonWillType.DESTRUCTIVE); -// fred.setPosition(player.posX, player.posY, player.posZ); -// world.spawnEntityInWorld(fred); -// } 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(EnumActionResult.FAIL, stack); if (!world.isRemote) { super.onItemRightClick(world, player, hand); - RayTraceResult position = rayTrace(world, player, false); + RayTraceResult rayTrace = rayTrace(world, player, false); - if (position == null) { + if (rayTrace == null) { int currentEssence = NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).getCurrentEssence(); List toSend = new ArrayList(); if (!getOwnerName(stack).equals(PlayerHelper.getUsernameFromPlayer(player))) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java deleted file mode 100644 index 0408c20b..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ /dev/null @@ -1,51 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.iface.IAltarReader; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.util.ChatUtil; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; - -public class ItemSigilSeer extends ItemSigilBase implements IAltarReader { - public ItemSigilSeer() { - super("seer"); - } - - @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand 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(EnumActionResult.FAIL, stack); - - if (!world.isRemote) { - super.onItemRightClick(world, player, hand); - RayTraceResult rayTrace = rayTrace(world, player, false); - - if (rayTrace == null) { - int currentEssence = NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).getCurrentEssence(); - - List toSend = new ArrayList(); - if (!getOwnerName(stack).equals(PlayerHelper.getUsernameFromPlayer(player))) - toSend.add(new TextComponentTranslation(tooltipBase + "otherNetwork", getOwnerName(stack))); - toSend.add(new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); - ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); - } - } - - return super.onItemRightClick(world, player, hand); - } -} From 77bdbed8b5646dd361fd44541bbef47a0f982732 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 19 Feb 2018 14:06:05 -0800 Subject: [PATCH 201/595] Nullcheck tile in Lava/Water/Void sigils (#1236) --- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java | 2 +- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java | 2 +- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index e3570dfa..3a70741c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -80,7 +80,7 @@ public class ItemSigilLava extends ItemSigilBase { } TileEntity tile = world.getTileEntity(blockPos); - if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { + if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000); int amount = handler.fill(fluid, false); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 2d4e3c1f..a4b54fda 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -86,7 +86,7 @@ public class ItemSigilVoid extends ItemSigilBase { } TileEntity tile = world.getTileEntity(blockPos); - if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { + if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack amount = handler.drain(1000, false); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index 42cbde55..fd73d938 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -73,7 +73,7 @@ public class ItemSigilWater extends ItemSigilBase { return EnumActionResult.FAIL; TileEntity tile = world.getTileEntity(blockPos); - if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { + if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack fluid = new FluidStack(FluidRegistry.WATER, 1000); int amount = handler.fill(fluid, false); From 562e62725cf58e1f44836b905df89940fbc73378 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 19 Feb 2018 14:07:44 -0800 Subject: [PATCH 202/595] Add Sulfur and Saltpeter to OreDict (#1235) --- src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 7b23cda6..072a068f 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -63,6 +63,8 @@ public class ModRecipes { 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() { From 106532061d1e194a266414db8f05c7a79421c151 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 19 Feb 2018 15:41:18 -0800 Subject: [PATCH 203/595] Alchemy Table now supports new recipe API --- .../compat/jei/BloodMagicJEIPlugin.java | 12 ++- .../AlchemyTableRecipeCategory.java | 11 +-- .../AlchemyTableRecipeHandler.java | 31 ------ .../alchemyTable/AlchemyTableRecipeJEI.java | 42 +++++--- .../alchemyTable/AlchemyTableRecipeMaker.java | 21 ---- .../core/RegistrarBloodMagicRecipes.java | 22 ++--- .../registry/AlchemyTableRecipeRegistry.java | 2 +- .../item/alchemy/ItemCuttingFluid.java | 72 ++++---------- .../ItemLivingArmourPointsUpgrade.java | 99 ++++++------------- .../AlchemyTableCustomRecipe.java | 2 +- .../AlchemyTableDyeableRecipe.java | 1 - .../AlchemyTablePotionRecipe.java | 1 - .../AlchemyTableRecipe.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 73 -------------- .../bloodmagic/registry/ModRituals.java | 4 +- .../bloodmagic/ritual/RitualCrushing.java | 2 +- .../bloodmagic/tile/TileAlchemyTable.java | 66 +++++++++---- .../bloodmagic/tile/base/TileBase.java | 3 +- .../bloodmagic/blockstates/cutting_fluid.json | 2 +- .../blockstates/points_upgrade.json | 2 +- .../assets/bloodmagic/lang/en_US.lang | 6 +- 21 files changed, 167 insertions(+), 309 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java rename src/main/java/WayofTime/bloodmagic/recipe/{ => alchemyTable}/AlchemyTableCustomRecipe.java (96%) rename src/main/java/WayofTime/bloodmagic/recipe/{ => alchemyTable}/AlchemyTableRecipe.java (99%) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index de5265ee..cf027782 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -2,8 +2,12 @@ package WayofTime.bloodmagic.compat.jei; 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.compat.jei.alchemyTable.AlchemyTableRecipeJEI; +import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; @@ -11,8 +15,6 @@ 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.AlchemyTableRecipeHandler; -import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeMaker; import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeCategory; import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeJEI; import WayofTime.bloodmagic.compat.jei.armourDowngrade.ArmourDowngradeRecipeCategory; @@ -42,20 +44,22 @@ public class BloodMagicJEIPlugin implements IModPlugin { registry.addRecipeHandlers( new BindingRecipeHandler(), - new AlchemyTableRecipeHandler(), new ArmourDowngradeRecipeHandler() ); 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); 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(AlchemyTableRecipeMaker.getRecipes()); registry.addRecipes(ArmourDowngradeRecipeMaker.getRecipes()); registry.addIngredientInfo(new ItemStack(RegistrarBloodMagicItems.ALTAR_MAKER), ItemStack.class, "jei.bloodmagic.desc.altarBuilder"); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java index e6ded288..c15e1db3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java @@ -10,13 +10,14 @@ 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.BlankRecipeCategory; +import mezz.jei.api.recipe.IRecipeCategory; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import javax.annotation.Nonnull; -public class AlchemyTableRecipeCategory extends BlankRecipeCategory { +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; @@ -24,8 +25,6 @@ public class AlchemyTableRecipeCategory extends BlankRecipeCategory { - @Nonnull - @Override - public Class getRecipeClass() { - return AlchemyTableRecipeJEI.class; - } - - @Override - public String getRecipeCategoryUid(@Nonnull AlchemyTableRecipeJEI recipe) { - return Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE; - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull AlchemyTableRecipeJEI recipe) { - return recipe; - } - - @Override - public boolean isRecipeValid(@Nonnull AlchemyTableRecipeJEI recipe) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java index 3a88276f..715fb008 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java @@ -1,42 +1,60 @@ package WayofTime.bloodmagic.compat.jei.alchemyTable; -import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; +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.BlankRecipeWrapper; +import mezz.jei.api.recipe.IRecipeWrapper; import net.minecraft.item.ItemStack; import java.util.ArrayList; import java.util.List; -public class AlchemyTableRecipeJEI extends BlankRecipeWrapper { - private AlchemyTableRecipe recipe; +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.recipe = 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(recipe.getInput()); + List> expanded = BloodMagicJEIPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(input); ingredients.setInputLists(ItemStack.class, expanded); - ingredients.setOutput(ItemStack.class, recipe.getRecipeOutput(Lists.newArrayList())); + 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", recipe.getTierRequired())); - ret.add(TextHelper.localize("jei.bloodmagic.recipe.lpDrained", recipe.getLpDrained())); - ret.add(TextHelper.localize("jei.bloodmagic.recipe.ticksRequired", recipe.getTicksRequired())); + 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 AlchemyTableRecipe getRecipe() { - return recipe; + public int getTier() { + return tier; } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java deleted file mode 100644 index 5ef8c619..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeMaker.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.alchemyTable; - -import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; -import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - -public class AlchemyTableRecipeMaker { - @Nonnull - public static List getRecipes() { - List recipeList = AlchemyTableRecipeRegistry.getRecipeList(); - ArrayList recipes = new ArrayList(); - - for (AlchemyTableRecipe recipe : recipeList) - recipes.add(new AlchemyTableRecipeJEI(recipe)); - - return recipes; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index ed3fcbac..298b7480 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -94,7 +94,7 @@ public class RegistrarBloodMagicRecipes { 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.getStack(ItemCuttingFluid.EXPLOSIVE), 500, 200, 1, "gunpowder", "gunpowder", "dustCoal"); + 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"); @@ -102,21 +102,21 @@ public class RegistrarBloodMagicRecipes { 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, ComponentTypes.SALTPETER.getStack(), ComponentTypes.SULFUR.getStack(), new ItemStack(Items.COAL, 1, 1)); + 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.getStack(ItemCuttingFluid.BASIC), 1000, 400, 1, "dustCoal", "gunpowder", Items.REDSTONE, Items.SUGAR, ComponentTypes.PLANT_OIL.getStack(), new ItemStack(Items.POTIONITEM)); - registrar.addAlchemyTable(ComponentTypes.SAND_IRON.getStack(2), 400, 200, 1, "oreIron", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); - registrar.addAlchemyTable(ComponentTypes.SAND_GOLD.getStack(2), 400, 200, 1, "oreGold", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); - registrar.addAlchemyTable(new ItemStack(Items.REDSTONE, 8), 400, 200, 1, "oreRedstone", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC)); - registrar.addAlchemyTable(new ItemStack(Blocks.GRAVEL), 50, 50, 1, "cobblestone", ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE)); - registrar.addAlchemyTable(new ItemStack(Blocks.SAND), 50, 50, 1, Blocks.GRAVEL, ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE)); + registrar.addAlchemyTable(ItemCuttingFluid.FluidType.BASIC.getStack(), 1000, 400, 1, "dustCoal", "gunpowder", Items.REDSTONE, Items.SUGAR, ComponentTypes.PLANT_OIL.getStack(), new ItemStack(Items.POTIONITEM)); + 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.getStack(ItemLivingArmourPointsUpgrade.DRAFT_ANGELUS), 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(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, new ItemStack(Items.POTIONITEM), "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"); @@ -132,7 +132,7 @@ public class RegistrarBloodMagicRecipes { 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.getStack(ItemCuttingFluid.BASIC)); + registrar.addAlchemyTable(dustStack, 400, 200, 1, ore, ItemCuttingFluid.FluidType.BASIC.getStack()); addedOreRecipeList.add(ore); } } @@ -170,7 +170,7 @@ public class RegistrarBloodMagicRecipes { 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.getStack(ItemCuttingFluid.BASIC)); + 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"); diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java index e09a6ce6..901994a7 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index 490cd425..c53c6da0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -1,40 +1,28 @@ package WayofTime.bloodmagic.item.alchemy; -import WayofTime.bloodmagic.BloodMagic; 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.client.IVariantProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; +import java.util.Locale; -public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomAlchemyConsumable { - public static final String BASIC = "basicCuttingFluid"; - public static final String EXPLOSIVE = "explosive"; - private static ArrayList names = new ArrayList(); +public class ItemCuttingFluid extends ItemEnum.Variant implements ICustomAlchemyConsumable { public ItemCuttingFluid() { - super(); + super(FluidType.class, "cutting_fluid"); - setUnlocalizedName(BloodMagic.MODID + ".cuttingFluid."); - setHasSubtypes(true); - setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); - - buildItemList(); } @Override @@ -46,34 +34,6 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA tooltip.add(TextHelper.localize("tooltip.bloodmagic.cuttingFluidRatio", max - getDamageOfFluid(stack), max)); } - private void buildItemList() { - names.add(0, BASIC); - names.add(1, EXPLOSIVE); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names.get(stack.getItemDamage()); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.size(); i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - for (String name : names) - ret.add(new ImmutablePair(names.indexOf(name), "type=" + name)); - return ret; - } - public int getDamageOfFluid(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -119,11 +79,21 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA return stack; } - public static ItemStack getStack(String name) { - return new ItemStack(RegistrarBloodMagicItems.CUTTING_FLUID, 1, names.indexOf(name)); - } + public enum FluidType implements ISubItem { + BASIC, + EXPLOSIVE, + ; - public static ArrayList getNames() { - return names; + @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 index 30e35efd..9be66674 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java @@ -1,65 +1,58 @@ package WayofTime.bloodmagic.item.alchemy; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; 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.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.List; +import java.util.Locale; -public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvider { - public static final String DRAFT_ANGELUS = "draftAngelus"; - private static ArrayList names = new ArrayList(); +public class ItemLivingArmourPointsUpgrade extends ItemEnum.Variant { public ItemLivingArmourPointsUpgrade() { - super(); - - setUnlocalizedName(BloodMagic.MODID + ".livingPointUpgrade."); - setHasSubtypes(true); - setCreativeTab(BloodMagic.TAB_BM); - - buildItemList(); + super(UpgradeType.class, "living_point_upgrade"); } @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.livingArmourPointsUpgrade.desc", 200)))); } @Override - public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityLivingBase entityLiving) { - EntityPlayer player = entityLiving instanceof EntityPlayer ? (EntityPlayer) entityLiving : null; + public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { + playerIn.setActiveHand(hand); + return new ActionResult<>(EnumActionResult.SUCCESS, playerIn.getHeldItem(hand)); + } - if (player == null || !player.capabilities.isCreativeMode) { + @Override + public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityLivingBase entityLiving) { + if (!(entityLiving instanceof EntityPlayer)) + return super.onItemUseFinish(stack, worldIn, entityLiving); + + EntityPlayer player = (EntityPlayer) entityLiving; + + if (!player.capabilities.isCreativeMode) stack.shrink(1); - } if (!worldIn.isRemote) { player.addPotionEffect(new PotionEffect(MobEffects.WITHER, 300, 5)); @@ -92,51 +85,21 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi return EnumAction.DRINK; } - @Override - public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { - playerIn.setActiveHand(hand); - return new ActionResult(EnumActionResult.SUCCESS, playerIn.getHeldItem(hand)); - } + public enum UpgradeType implements ISubItem { - private void buildItemList() { - names.add(0, DRAFT_ANGELUS); - } + DRAFT_ANGELUS, + ; - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names.get(stack.getItemDamage()); - } + @Nonnull + @Override + public String getInternalName() { + return name().toLowerCase(Locale.ROOT); + } - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.size(); i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - public List> getVariants() { - List> ret = new ArrayList>(); - for (String name : names) - ret.add(new ImmutablePair(names.indexOf(name), "type=" + name)); - return ret; - } - - public static ItemStack getStack(String name) { - return new ItemStack(RegistrarBloodMagicItems.POINTS_UPGRADE, 1, names.indexOf(name)); - } - - public static ItemStack getStack(String key, int stackSize) { - ItemStack stack = getStack(key); - stack.setCount(stackSize); - - return stack; - } - - public static ArrayList getNames() { - return names; + @Nonnull + @Override + public ItemStack getStack(int count) { + return new ItemStack(RegistrarBloodMagicItems.POINTS_UPGRADE, count, ordinal()); + } } } diff --git a/src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableCustomRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableCustomRecipe.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableCustomRecipe.java rename to src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableCustomRecipe.java index 9af2e9d4..9e13b9aa 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableCustomRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableCustomRecipe.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.recipe; +package WayofTime.bloodmagic.recipe.alchemyTable; import WayofTime.bloodmagic.iface.ICustomAlchemyConsumable; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index 910be33d..50e83c2b 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.recipe.alchemyTable; import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index 33e89171..4a627ede 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.recipe.alchemyTable; -import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; diff --git a/src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableRecipe.java rename to src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java index ecea0ca4..8fbd717d 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.recipe; +package WayofTime.bloodmagic.recipe.alchemyTable; import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 072a068f..62318a39 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -5,7 +5,6 @@ import WayofTime.bloodmagic.alchemyArray.*; import WayofTime.bloodmagic.compress.CompressionRegistry; import WayofTime.bloodmagic.iface.ISigil; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.recipe.AlchemyTableCustomRecipe; import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; @@ -15,8 +14,6 @@ import WayofTime.bloodmagic.compress.BaseCompressionHandler; import WayofTime.bloodmagic.compress.StorageBlockCraftingManager; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; -import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; import WayofTime.bloodmagic.item.types.ComponentTypes; import WayofTime.bloodmagic.livingArmour.downgrade.*; import WayofTime.bloodmagic.potion.BMPotionUtils; @@ -44,7 +41,6 @@ import java.util.Map.Entry; public class ModRecipes { - public static ArrayList addedOreRecipeList = new ArrayList(); static ItemStack mundaneLengtheningStack = ComponentTypes.CATALYST_LENGTH_1.getStack(); static ItemStack mundanePowerStack = ComponentTypes.CATALYST_POWER_1.getStack(); @@ -54,7 +50,6 @@ public class ModRecipes { addAltarRecipes(); addAlchemyArrayRecipes(); addAlchemyTableRecipes(); - addOreDoublingAlchemyRecipes(); addPotionRecipes(); addLivingArmourDowngradeRecipes(); } @@ -111,72 +106,7 @@ public class ModRecipes { } public static void addAlchemyTableRecipes() { - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.STRING, 4), 0, 100, 0, Blocks.WOOL, Items.FLINT); - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.FLINT, 2), 0, 20, 0, Blocks.GRAVEL, Items.FLINT); - AlchemyTableRecipeRegistry.registerRecipe(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); - - AlchemyTableRecipeRegistry.registerRecipe(ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE), 500, 200, 1, "gunpowder", "gunpowder", "dustCoal"); - - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.BREAD), 100, 200, 1, Items.WHEAT, Items.SUGAR); - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Blocks.GRASS), 200, 200, 1, Blocks.DIRT, new ItemStack(Items.DYE, 1, 15), Items.WHEAT_SEEDS); - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.CLAY_BALL, 4), 50, 100, 2, Items.WATER_BUCKET, "sand"); - AlchemyTableRecipeRegistry.registerRecipe(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); - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Blocks.OBSIDIAN), 50, 50, 1, Items.WATER_BUCKET, Items.LAVA_BUCKET); - - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.SULFUR.getStack(8), 0, 100, 0, Items.LAVA_BUCKET); - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.SALTPETER.getStack(4), 0, 100, 0, ComponentTypes.PLANT_OIL.getStack(), ComponentTypes.PLANT_OIL.getStack(), "dustCoal"); - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(Items.GUNPOWDER, 3), 0, 100, 0, ComponentTypes.SALTPETER.getStack(), ComponentTypes.SULFUR.getStack(), new ItemStack(Items.COAL, 1, 1)); - - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ComponentTypes.SAND_COAL.getStack(4), 100, 100, 1, new ItemStack(Items.COAL, 1, 0), new ItemStack(Items.COAL, 1, 0), Items.FLINT)); - - AlchemyTableRecipeRegistry.registerRecipe(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 1000, 400, 1, "dustCoal", "gunpowder", Items.REDSTONE, Items.SUGAR, ComponentTypes.PLANT_OIL.getStack(), new ItemStack(Items.POTIONITEM)); - - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ComponentTypes.SAND_IRON.getStack(2), 400, 200, 1, "oreIron", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(ComponentTypes.SAND_GOLD.getStack(2), 400, 200, 1, "oreGold", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); - - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(new ItemStack(Items.REDSTONE, 8), 400, 200, 1, "oreRedstone", ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); - - addedOreRecipeList.add("oreIron"); - addedOreRecipeList.add("oreGold"); - addedOreRecipeList.add("oreCoal"); - addedOreRecipeList.add("oreRedstone"); - - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(new ItemStack(Blocks.GRAVEL), 50, 50, 1, "cobblestone", ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE))); - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(new ItemStack(Blocks.SAND), 50, 50, 1, Blocks.GRAVEL, ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE))); - - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropCarrot", "cropCarrot", "cropCarrot", new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropPotato", "cropPotato", new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropWheat", "cropWheat", new ItemStack(Items.DYE, 1, 15)); - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, Items.BEETROOT, Items.BEETROOT, Items.BEETROOT, new ItemStack(Items.DYE, 1, 15)); - - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.NEURO_TOXIN.getStack(), 1000, 100, 2, new ItemStack(Items.FISH, 1, 3)); - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.ANTISEPTIC.getStack(2), 1000, 200, 2, ComponentTypes.PLANT_OIL.getStack(), "nuggetGold", "cropWheat", Items.SUGAR, Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM); - - AlchemyTableRecipeRegistry.registerRecipe(ItemLivingArmourPointsUpgrade.getStack(ItemLivingArmourPointsUpgrade.DRAFT_ANGELUS), 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); - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING))); - - AlchemyTableRecipeRegistry.registerRecipe(new ItemStack(RegistrarBloodMagicItems.POTION_FLASK), 1000, 200, 2, new ItemStack(Items.POTIONITEM), "cropNetherWart", "dustRedstone", "dustGlowstone"); - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.CATALYST_LENGTH_1.getStack(), 1000, 100, 2, "gunpowder", "cropNetherWart", "gemLapis"); - AlchemyTableRecipeRegistry.registerRecipe(ComponentTypes.CATALYST_POWER_1.getStack(), 1000, 100, 2, "gunpowder", "cropNetherWart", "dustRedstone"); - } - - public static void addOreDoublingAlchemyRecipes() { - 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); - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableCustomRecipe(dustStack, 400, 200, 1, ore, ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC))); - addedOreRecipeList.add(ore); - } - } - } } public static void addPotionRecipes() { @@ -200,9 +130,6 @@ public class ModRecipes { addPotionRecipe(1000, 1, new ItemStack(Items.STRING), new PotionEffect(RegistrarBloodMagic.CLING, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new PotionEffect(RegistrarBloodMagic.DEAFNESS, 450)); - -// AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(5000, 100, 4, new ItemStack(Blocks.SLIME_BLOCK), new PotionEffect(ModPotions.bounce, 15 * 60 * 20))); -// AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(5000, 100, 4, new ItemStack("string"), new PotionEffect(ModPotions.bounce, 15 * 60 * 20))); } public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 8f9beacc..46e18f52 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -118,8 +118,8 @@ public class ModRituals { downgradeRitual = new RitualLivingArmourDowngrade(); RitualRegistry.registerRitual(downgradeRitual, ConfigHandler.rituals.ritualDowngrade); - RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 250, 0.5); - RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE), 25, 0.05); + RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.BASIC.getStack(), 250, 0.5); + RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.EXPLOSIVE.getStack(), 25, 0.05); } public static void initImperfectRituals() { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index 8a801aa6..3909f072 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.compress.CompressionRegistry; -import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 212edac9..5693df57 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -1,9 +1,11 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.orb.BloodOrb; import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.recipe.AlchemyTableRecipe; +import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.util.helper.NetworkHelper; @@ -193,14 +195,13 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, 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) { - IBlockState state = getWorld().getBlockState(pos); - getWorld().notifyBlockUpdate(getPos(), state, state, 3); - } + if (burnTime == 1) + notifyUpdate(); - if (canCraft(inputList, recipe)) { + if (canCraft(recipe.getRecipeOutput(inputList))) { ticksRequired = recipe.getTicksRequired(); burnTime++; @@ -228,8 +229,42 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } else { 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 && !getWorld().isRemote) + consumeLp(recipeAlchemyTable.getSyphon()); + + ItemStack outputSlotStack = getStackInSlot(outputSlot); + if (outputSlotStack.isEmpty()) + setInventorySlotContents(outputSlot, recipeAlchemyTable.getOutput().copy()); + else + outputSlotStack.grow(recipeAlchemyTable.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 + currentStack.shrink(1); + } + + burnTime = 0; + notifyUpdate(); + } + } + } + } else { + burnTime = 0; + } } } @@ -237,20 +272,15 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return ((double) burnTime) / ticksRequired; } - private boolean canCraft(List inputList, AlchemyTableRecipe recipe) { - if (recipe == null) { - return false; - } - - ItemStack outputStack = recipe.getRecipeOutput(inputList); + private boolean canCraft(ItemStack output) { ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (outputStack.isEmpty()) + if (output.isEmpty()) return false; if (currentOutputStack.isEmpty()) return true; - if (!ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) + if (!ItemHandlerHelper.canItemStacksStack(output, currentOutputStack)) return false; - int result = currentOutputStack.getCount() + outputStack.getCount(); + int result = currentOutputStack.getCount() + output.getCount(); return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); } @@ -292,7 +322,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } public void craftItem(List inputList, AlchemyTableRecipe recipe) { - if (this.canCraft(inputList, recipe)) { + if (this.canCraft(recipe.getRecipeOutput(inputList))) { ItemStack outputStack = recipe.getRecipeOutput(inputList); ItemStack currentOutputStack = getStackInSlot(outputSlot); diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java index 56498ae8..e39ba05f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java @@ -76,7 +76,8 @@ public class TileBase extends TileEntity { } public void notifyUpdate() { - getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); + IBlockState state = getWorld().getBlockState(getPos()); + getWorld().notifyBlockUpdate(getPos(), state, state, 3); } // Data syncing diff --git a/src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json b/src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json index fbd1ac61..0d733140 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json +++ b/src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json @@ -6,7 +6,7 @@ }, "variants": { "type": { - "basiccuttingfluid": { + "basic": { "textures": { "layer0": "bloodmagic:items/BasicCuttingFluid" } diff --git a/src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json b/src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json index 67ac1582..61e07141 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json +++ b/src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json @@ -6,7 +6,7 @@ }, "variants": { "type": { - "draftangelus": { + "draft_angelus": { "textures": { "layer0": "bloodmagic:items/Coagulant" } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index d08c16c4..00a7151a 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -101,8 +101,8 @@ 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.cuttingFluid.basicCuttingFluid.name=Basic Cutting Fluid -item.bloodmagic.cuttingFluid.explosive.name=Explosive Powder +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 @@ -185,7 +185,7 @@ item.bloodmagic.fluidFilter.exact.name=Fluid Filter item.bloodmagic.experienceTome.name=Tome of Peritia item.bloodmagic.sanguineBook.name=Inspectoris Scandalum -item.bloodmagic.livingPointUpgrade.draftAngelus.name=Draft of Angelus +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 From cf9e6e207fe01fa9166f3e4324d5d990744ca32e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 21 Feb 2018 18:03:36 -0800 Subject: [PATCH 204/595] Add Discord badge to readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61f510ae..c945030e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Blood Magic: Alchemical Wizardry [![](http://cf.way2muchnoise.eu/full_blood-magic_downloads.svg)](https://minecraft.curseforge.com/projects/blood-magic) +# 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) From bf2fe1166efb110e181eed6eacc73040bb4f20a8 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 23 Feb 2018 16:47:34 -0800 Subject: [PATCH 205/595] Safety for UUID check in lava crystal (#1238) some weird mod was doing weird tooltip things weirdly --- .../java/WayofTime/bloodmagic/item/ItemLavaCrystal.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index b64edd65..2e2d6d21 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IVariantProvider; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; @@ -23,8 +24,8 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide @Override public ItemStack getContainerItem(ItemStack itemStack) { String uuid = getOwnerUUID(itemStack); - if (uuid != null) - NetworkHelper.getSoulNetwork(this.getOwnerUUID(itemStack)).syphon(25); + if (!Strings.isNullOrEmpty(uuid)) + NetworkHelper.getSoulNetwork(uuid).syphon(25); ItemStack returnStack = new ItemStack(this); returnStack.setTagCompound(itemStack.getTagCompound()); @@ -38,7 +39,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide @Override public int getItemBurnTime(ItemStack stack) { - if (getOwnerUUID(stack) == null) + if (Strings.isNullOrEmpty(getOwnerUUID(stack))) return -1; if (NetworkHelper.canSyphonFromContainer(stack, 25)) From 57c25f0064d43d5707e0097dad831ae30100fa68 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 24 Feb 2018 20:31:09 -0500 Subject: [PATCH 206/595] - Added the Furnace Array (name pending), which takes health from nearby players to power adjacent furnaces. Not covered by standard medical insurance. --- changelog.txt | 5 + .../AlchemyArrayEffectFurnaceFuel.java | 138 ++++++++++++++++++ .../LowAlchemyCircleRenderer.java | 22 +++ .../bloodmagic/registry/ModRecipes.java | 115 ++++++++------- .../models/alchemyarrays/furnacearray.png | Bin 0 -> 45089 bytes 5 files changed, 231 insertions(+), 49 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/furnacearray.png diff --git a/changelog.txt b/changelog.txt index 2f556fa9..d3583a7a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +------------------------------------------------------ +Version 2.2.7 +------------------------------------------------------ +- Added the Furnace Array (name pending), which takes health from nearby players to power adjacent furnaces. Not covered by standard medical insurance. + ------------------------------------------------------ Version 2.2.6 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java new file mode 100644 index 00000000..29706cef --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java @@ -0,0 +1,138 @@ +package WayofTime.bloodmagic.alchemyArray; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockFurnace; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import WayofTime.bloodmagic.util.PleaseStopUsingMe; + +public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect +{ + static double radius = 10; + static int burnTicksAdded = 201; //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(); + EntityPlayer sacrifice = null; + + for (EnumFacing face : EnumFacing.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 TileEntityFurnace) + { + TileEntityFurnace furnaceTile = (TileEntityFurnace) bottomTile; + if (canFurnaceSmelt(furnaceTile) && !furnaceTile.isBurning()) + { + if (sacrifice == null || sacrifice.isDead) + { + AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); + List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, bb); + for (EntityPlayer player : playerList) + { + if (!player.isDead) + { + sacrifice = player; + } + } + } + + if (addFuelTime(furnaceTile, world, furnacePos, burnTicksAdded)) + { + if (!sacrifice.capabilities.isCreativeMode) + { + sacrifice.hurtResistantTime = 0; + sacrifice.attackEntityFrom(PleaseStopUsingMe.damageSource, 1.0F); //No. + } + } + } + } + } + + return false; + } + + public static boolean addFuelTime(TileEntityFurnace furnaceTile, World world, BlockPos furnacePos, int cookTime) + { + furnaceTile.setField(0, cookTime); + BlockFurnace.setState(true, world, furnacePos); + return true; + } + + public static boolean canFurnaceSmelt(TileEntityFurnace 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(NBTTagCompound tag) + { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectFurnaceFuel(key); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java new file mode 100644 index 00000000..bce8f30f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java @@ -0,0 +1,22 @@ +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/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 62318a39..28b4094c 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -39,12 +39,14 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -public class ModRecipes { +public class ModRecipes +{ static ItemStack mundaneLengtheningStack = ComponentTypes.CATALYST_LENGTH_1.getStack(); static ItemStack mundanePowerStack = ComponentTypes.CATALYST_POWER_1.getStack(); - public static void init() { + public static void init() + { initOreDict(); addFurnaceRecipes(); addAltarRecipes(); @@ -54,7 +56,8 @@ public class ModRecipes { addLivingArmourDowngradeRecipes(); } - public static void initOreDict() { + 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()); @@ -62,16 +65,19 @@ public class ModRecipes { OreDictionary.registerOre("dustSaltpeter", ComponentTypes.SALTPETER.getStack()); } - public static void addFurnaceRecipes() { + 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 addAltarRecipes() + { } - public static void addAlchemyArrayRecipes() { + 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)))); @@ -85,6 +91,7 @@ public class ModRecipes { 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"))); @@ -92,7 +99,8 @@ public class ModRecipes { } - public static void addCompressionHandlers() { + 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)); @@ -105,11 +113,13 @@ public class ModRecipes { BloodMagic.instance.logger.info("Added compression recipes in {}", stopwatch); } - public static void addAlchemyTableRecipes() { + public static void addAlchemyTableRecipes() + { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING))); } - public static void addPotionRecipes() { + public static void addPotionRecipes() + { addPotionRecipe(1000, 1, new ItemStack(Items.GHAST_TEAR), new PotionEffect(MobEffects.REGENERATION, 450)); addPotionRecipe(1000, 1, new ItemStack(Items.GOLDEN_CARROT), new PotionEffect(MobEffects.NIGHT_VISION, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.MAGMA_CREAM), new PotionEffect(MobEffects.FIRE_RESISTANCE, 2 * 60 * 20)); @@ -132,7 +142,8 @@ public class ModRecipes { addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new PotionEffect(RegistrarBloodMagic.DEAFNESS, 450)); } - public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) { + public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) + { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(lpDrained, 100, tier, inputStack, baseEffect)); List lengtheningList = new ArrayList(); @@ -146,7 +157,8 @@ public class ModRecipes { AlchemyTableRecipeRegistry.registerRecipe(BMPotionUtils.getPowerAugmentRecipe(lpDrained, 100, tier, powerList, baseEffect, 1)); } - public static void addLivingArmourDowngradeRecipes() { + public static void addLivingArmourDowngradeRecipes() + { String messageBase = "ritual.bloodmagic.downgradeRitual.dialogue."; ItemStack bowStack = new ItemStack(Items.BOW); @@ -160,16 +172,18 @@ public class ModRecipes { 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})); + 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()) { + for (Entry> entry : dialogueMap.entrySet()) + { ItemStack keyStack = entry.getKey(); String str = entry.getValue().getKey(); Map> textMap = new HashMap>(); - for (int tick : entry.getValue().getValue()) { + for (int tick : entry.getValue().getValue()) + { List textList = new ArrayList(); textList.add(new TextComponentTranslation("\u00A74%s", new TextComponentTranslation(messageBase + str + "." + tick))); textMap.put(tick, textList); @@ -187,7 +201,8 @@ public class ModRecipes { LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeQuenched(0), bottleStack, Items.DRAGON_BREATH); LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeCrippledArm(0), shieldStack, "gemDiamond"); - for (int i = 0; i < 10; i++) { + 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); @@ -197,37 +212,39 @@ public class ModRecipes { } } - 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)); + 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/resources/assets/bloodmagic/textures/models/alchemyarrays/furnacearray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/furnacearray.png new file mode 100644 index 0000000000000000000000000000000000000000..5639657dbdf4c475c4b22ce482710474187b6706 GIT binary patch literal 45089 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%0AOA(zd0URg5xTx&R@ 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 literal 0 HcmV?d00001 From 941173dbf4bb27549cf570bcbdb9f8c95a8185f3 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 27 Feb 2018 17:25:41 -0500 Subject: [PATCH 207/595] Added book entry for the Burning Furnace array. --- .../AlchemyArrayEffectFurnaceFuel.java | 2 +- .../compat/guideapi/book/CategoryAlchemy.java | 43 ++++++++++++++----- .../assets/bloodmagicguide/lang/en_US.lang | 2 + 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java index 29706cef..145b6143 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java @@ -20,7 +20,7 @@ import WayofTime.bloodmagic.util.PleaseStopUsingMe; public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect { static double radius = 10; - static int burnTicksAdded = 201; //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. + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index fcde6142..9eb03a5b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -22,8 +22,10 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -public class CategoryAlchemy { - public static Map buildCategory() { +public class CategoryAlchemy +{ + public static Map buildCategory() + { Map entries = new LinkedHashMap(); String keyBase = "guide." + BloodMagic.MODID + ".entry.alchemy."; @@ -34,16 +36,28 @@ public class CategoryAlchemy { List ashPages = new ArrayList(); TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); - if (ashRecipe != null) { + 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) { + if (speedRecipePage != null) + { speedPages.add(speedRecipePage); } speedPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "speed" + ".info"), 370)); @@ -52,7 +66,8 @@ public class CategoryAlchemy { List updraftPages = new ArrayList(); PageAlchemyArray updraftRecipePage = BookUtils.getAlchemyPage("updraft"); - if (updraftRecipePage != null) { + if (updraftRecipePage != null) + { updraftPages.add(updraftRecipePage); } updraftPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "updraft" + ".info"), 370)); @@ -61,7 +76,8 @@ public class CategoryAlchemy { List turretPages = new ArrayList(); PageAlchemyArray turretRecipePage = BookUtils.getAlchemyPage("skeletonTurret"); - if (turretRecipePage != null) { + if (turretRecipePage != null) + { turretPages.add(turretRecipePage); } turretPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "turret" + ".info"), 370)); @@ -70,7 +86,8 @@ public class CategoryAlchemy { List bouncePages = new ArrayList(); PageAlchemyArray bounceRecipePage = BookUtils.getAlchemyPage("bounce"); - if (bounceRecipePage != null) { + if (bounceRecipePage != null) + { bouncePages.add(bounceRecipePage); } bouncePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bounce" + ".info"), 370)); @@ -84,15 +101,19 @@ public class CategoryAlchemy { List fastMinerPages = new ArrayList(); PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage("fastMiner"); - if (fastMinerRecipePage != null) { + 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)); - for (Entry entry : entries.entrySet()) { - for (IPage page : entry.getValue().pageList) { - if (page instanceof PageText) { + for (Entry entry : entries.entrySet()) + { + for (IPage page : entry.getValue().pageList) + { + if (page instanceof PageText) + { ((PageText) page).setUnicodeFlag(true); } } diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index 75787652..1ba63f89 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -243,6 +243,7 @@ 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 @@ -256,3 +257,4 @@ guide.bloodmagic.entry.alchemy.bounce.info=By using a source of heat near its ce 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... From 2a43e5384279b5a38b8b392b548dc094e3a54316 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 27 Feb 2018 16:59:51 -0800 Subject: [PATCH 208/595] Rewrite IBindable to provide an object instead of storing 2 strings --- .../bloodmagic/altar/BloodAltar.java | 22 ++- .../bloodmagic/block/BlockAltar.java | 8 +- .../block/BlockRitualController.java | 3 +- .../client/gui/GuiItemRoutingNode.java | 2 +- .../command/sub/SubCommandBind.java | 18 ++- .../DataProviderRitualController.java | 2 +- .../bloodmagic/core/RegistrarBloodMagic.java | 25 ++-- .../bloodmagic/core/data/Binding.java | 71 ++++++++++ .../bloodmagic/core/data/SoulNetwork.java | 3 +- .../bloodmagic/event/ItemBindEvent.java | 19 ++- .../bloodmagic/event/RitualEvent.java | 26 ++-- .../bloodmagic/event/SoulNetworkEvent.java | 21 +-- .../bloodmagic/iface/IActivatable.java | 21 ++- .../WayofTime/bloodmagic/iface/IBindable.java | 27 ++-- .../item/ItemActivationCrystal.java | 8 +- .../bloodmagic/item/ItemBindableBase.java | 8 +- .../bloodmagic/item/ItemBloodOrb.java | 18 +-- .../bloodmagic/item/ItemBoundSword.java | 49 +------ .../bloodmagic/item/ItemBoundTool.java | 49 +------ .../bloodmagic/item/ItemInscriptionTool.java | 8 +- .../bloodmagic/item/ItemLavaCrystal.java | 30 ++-- .../bloodmagic/item/ItemSigilToggleable.java | 11 +- .../item/ItemTelepositionFocus.java | 5 +- .../bloodmagic/item/sigil/ItemSigilAir.java | 2 +- .../bloodmagic/item/sigil/ItemSigilBase.java | 7 +- .../item/sigil/ItemSigilBloodLight.java | 6 +- .../item/sigil/ItemSigilDivination.java | 17 ++- .../item/sigil/ItemSigilHolding.java | 5 +- .../bloodmagic/item/sigil/ItemSigilLava.java | 4 +- .../item/sigil/ItemSigilTeleposition.java | 2 +- .../item/sigil/ItemSigilToggleableBase.java | 8 +- .../item/sigil/ItemSigilTransposition.java | 2 +- .../bloodmagic/item/sigil/ItemSigilVoid.java | 6 +- .../bloodmagic/item/sigil/ItemSigilWater.java | 2 +- .../WayofTime/bloodmagic/orb/BloodOrb.java | 9 +- .../bloodmagic/ritual/RitualExpulsion.java | 38 +++-- .../bloodmagic/ritual/RitualPortal.java | 5 +- .../ritual/data/IMasterRitualStone.java | 3 +- .../bloodmagic/ritual/data/Ritual.java | 7 +- .../bloodmagic/ritual/portal/Teleports.java | 26 ++-- .../bloodmagic/teleport/Teleport.java | 20 +-- .../tile/TileMasterRitualStone.java | 37 +++-- .../bloodmagic/tile/TileTeleposer.java | 27 ++-- .../util/handler/event/GenericHandler.java | 29 ++-- .../util/helper/BindableHelper.java | 130 ++---------------- .../bloodmagic/util/helper/NetworkHelper.java | 32 +++-- .../bloodmagic/util/helper/PlayerHelper.java | 48 +------ 47 files changed, 416 insertions(+), 510 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/core/data/Binding.java diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 9d1272ca..2da8895d 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -4,6 +4,8 @@ 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.core.data.Binding; +import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.iface.IBloodRune; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.orb.BloodOrb; @@ -329,27 +331,21 @@ public class BloodAltar implements IFluidHandler { } } } else { - ItemStack returnedItem = tileAltar.getStackInSlot(0); + ItemStack contained = tileAltar.getStackInSlot(0); - if (returnedItem.isEmpty() || !(returnedItem.getItem() instanceof IBloodOrb)) + if (contained.isEmpty() || !(contained.getItem() instanceof IBloodOrb) || !(contained.getItem() instanceof IBindable)) return; - IBloodOrb item = (IBloodOrb) (returnedItem.getItem()); - NBTTagCompound itemTag = returnedItem.getTagCompound(); + BloodOrb orb = ((IBloodOrb) contained.getItem()).getOrb(contained); + Binding binding = ((IBindable) contained.getItem()).getBinding(contained); - if (itemTag == null) - return; - - String ownerUUID = itemTag.getString(Constants.NBT.OWNER_UUID); - - if (Strings.isNullOrEmpty(ownerUUID)) + if (binding == null || orb == null) return; if (fluid != null && fluid.amount >= 1) { - int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 ? consumptionRate * (1 + consumptionMultiplier) : consumptionRate), fluid.amount); + int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 ? orb.getFillRate() * (1 + consumptionMultiplier) : orb.getFillRate()), fluid.amount); - BloodOrb orb = item.getOrb(returnedItem); - int drain = orb == null ? 0 : NetworkHelper.getSoulNetwork(ownerUUID).add(liquidDrained, (int) (orb.getCapacity() * this.orbCapacityMultiplier)); + int drain = NetworkHelper.getSoulNetwork(binding).add(liquidDrained, (int) (orb.getCapacity() * this.orbCapacityMultiplier)); fluid.amount = fluid.amount - drain; if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 7a63b22d..7f9d2236 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.altar.EnumAltarComponent; import WayofTime.bloodmagic.altar.IAltarManipulator; import WayofTime.bloodmagic.altar.IBloodAltar; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IAltarReader; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.iface.IDocumentedBlock; @@ -15,7 +16,6 @@ import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.Utils; -import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -68,9 +68,9 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl if (world.getBlockState(pos.down()).getBlock() instanceof BlockDecorative) { if (orbStack.getItem() instanceof IBloodOrb && orbStack.getItem() instanceof IBindable) { BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); - IBindable bindable = (IBindable) orbStack.getItem(); - if (orb != null && !Strings.isNullOrEmpty(bindable.getOwnerUUID(orbStack))) { - SoulNetwork soulNetwork = NetworkHelper.getSoulNetwork(bindable.getOwnerUUID(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(); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 4b4c1b61..2824b6f0 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -50,8 +50,7 @@ public class BlockRitualController extends BlockEnum imple if (state.getValue(getProperty()) != EnumRitualController.IMPERFECT && tile instanceof TileMasterRitualStone) { if (heldItem.getItem() == RegistrarBloodMagicItems.ACTIVATION_CRYSTAL) { - IBindable bindable = (IBindable) heldItem.getItem(); - if (Strings.isNullOrEmpty(bindable.getOwnerName(heldItem))) + if (((IBindable) heldItem.getItem()).getBinding(heldItem) == null) return false; String key = RitualHelper.getValidRitual(world, pos); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java index 564494e6..ffba0f12 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -197,7 +197,7 @@ public class GuiItemRoutingNode extends GuiContainer { // { // if (slotInd == 0) // { -// this.nameField.setText(stack == null ? "" : stack.getDisplayName()); +// this.nameField.setText(stack == null ? "" : stack.getOwnerName()); // this.nameField.setEnabled(stack != null); // // if (stack != null) diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index f01b70ee..7548e3ec 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.command.sub; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.helper.BindableHelper; @@ -38,8 +39,6 @@ public class SubCommandBind extends CommandBase { try { EntityPlayer player = CommandBase.getCommandSenderAsPlayer(commandSender); - String playerName = player.getName(); - String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); ItemStack held = player.getHeldItemMainhand(); boolean bind = true; @@ -53,21 +52,20 @@ public class SubCommandBind extends CommandBase { bind = Boolean.parseBoolean(args[0]); if (args.length > 2) - playerName = args[1]; + player = CommandBase.getPlayer(server, commandSender, args[1]); } else { - playerName = args[0]; - uuid = PlayerHelper.getUUIDFromPlayer(CommandBase.getPlayer(server, commandSender, playerName)).toString(); + player = CommandBase.getPlayer(server, commandSender, args[0]); } } if (bind) { - BindableHelper.setItemOwnerName(held, playerName); - BindableHelper.setItemOwnerUUID(held, uuid); + Binding binding = new Binding(player.getGameProfile().getId(), player.getGameProfile().getName()); + BindableHelper.applyBinding(held, binding); commandSender.sendMessage(new TextComponentTranslation("commands.bind.success")); } else { - if (!Strings.isNullOrEmpty(((IBindable) held.getItem()).getOwnerUUID(held))) { - held.getTagCompound().removeTag(Constants.NBT.OWNER_UUID); - held.getTagCompound().removeTag(Constants.NBT.OWNER_NAME); + Binding binding = ((IBindable) held.getItem()).getBinding(held); + if (binding != null) { + held.getTagCompound().removeTag("binding"); commandSender.sendMessage(new TextComponentTranslation("commands.bind.remove.success")); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index 5f5ac41a..f246bc48 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -63,7 +63,7 @@ public class DataProviderRitualController implements IWailaDataProvider { if (mrs.getCurrentRitual() != null) { tag.setString("ritual", mrs.getCurrentRitual().getUnlocalizedName()); tag.setBoolean("active", mrs.isActive()); - if (!Strings.isNullOrEmpty(mrs.getOwner())) + if (mrs.getOwner() != null) tag.setString("owner", PlayerHelper.getUsernameFromUUID(mrs.getOwner())); tag.setBoolean("enabled", RitualRegistry.ritualEnabled(mrs.getCurrentRitual())); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 992bb9a1..c23234a9 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -30,18 +30,19 @@ import net.minecraftforge.registries.RegistryBuilder; @GameRegistry.ObjectHolder(BloodMagic.MODID) public class RegistrarBloodMagic { + private static final BloodOrb ORB_DEF = new BloodOrb("", 0, 0, 0); @GameRegistry.ObjectHolder("weak") - public static final BloodOrb ORB_WEAK = new BloodOrb("", 0, 0); + public static final BloodOrb ORB_WEAK = ORB_DEF; @GameRegistry.ObjectHolder("apprentice") - public static final BloodOrb ORB_APPRENTICE = new BloodOrb("", 0, 0); + public static final BloodOrb ORB_APPRENTICE = ORB_DEF; @GameRegistry.ObjectHolder("magician") - public static final BloodOrb ORB_MAGICIAN = new BloodOrb("", 0, 0); + public static final BloodOrb ORB_MAGICIAN = ORB_DEF; @GameRegistry.ObjectHolder("master") - public static final BloodOrb ORB_MASTER = new BloodOrb("", 0, 0); + public static final BloodOrb ORB_MASTER = ORB_DEF; @GameRegistry.ObjectHolder("archmage") - public static final BloodOrb ORB_ARCHMAGE = new BloodOrb("", 0, 0); + public static final BloodOrb ORB_ARCHMAGE = ORB_DEF; @GameRegistry.ObjectHolder("transcendent") - public static final BloodOrb ORB_TRANSCENDENT = new BloodOrb("", 0, 0); + public static final BloodOrb ORB_TRANSCENDENT = ORB_DEF; public static final Potion BOOST = MobEffects.HASTE; public static final Potion WHIRLWIND = MobEffects.HASTE; @@ -62,12 +63,12 @@ public class RegistrarBloodMagic { public static void registerBloodOrbs(RegistryEvent.Register event) { ResourceLocation orb = RegistrarBloodMagicItems.BLOOD_ORB.getRegistryName(); event.getRegistry().registerAll( - new BloodOrb("weak", 1, 5000).withModel(new ModelResourceLocation(orb, "type=weak")).setRegistryName("weak"), - new BloodOrb("apprentice", 2, 25000).withModel(new ModelResourceLocation(orb, "type=apprentice")).setRegistryName("apprentice"), - new BloodOrb("magician", 3, 150000).withModel(new ModelResourceLocation(orb, "type=magician")).setRegistryName("magician"), - new BloodOrb("master", 4, 1000000).withModel(new ModelResourceLocation(orb, "type=master")).setRegistryName("master"), - new BloodOrb("archmage", 5, 10000000).withModel(new ModelResourceLocation(orb, "type=archmage")).setRegistryName("archmage"), - new BloodOrb("transcendent", 6, 30000000).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") + 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"), + new BloodOrb("transcendent", 6, 30000000, 50).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") ); } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java new file mode 100644 index 00000000..e8182e9a --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java @@ -0,0 +1,71 @@ +package WayofTime.bloodmagic.core.data; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +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 Binding(UUID uuid, String name) { + this.uuid = uuid; + this.name = name; + } + + private Binding() { + // No-op + } + + @Override + public NBTTagCompound serializeNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setTag("id", NBTUtil.createUUIDTag(uuid)); + tag.setString("name", name); + return tag; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) { + this.uuid = NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")); + this.name = nbt.getString("name"); + } + + public UUID getOwnerId() { + return uuid; + } + + public Binding setOwnerId(UUID uuid) { + this.uuid = uuid; + return this; + } + + public String getOwnerName() { + return name; + } + + public Binding setOwnerName(String name) { + this.name = name; + return this; + } + + @Nullable + public static Binding fromStack(ItemStack stack) { + if (!stack.hasTagCompound()) // Definitely hasn't been bound yet. + return null; + + NBTBase bindingTag = stack.getTagCompound().getTag("binding"); + if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.hasNoTags()) // Make sure it's both a tag compound and that it has actual data. + return null; + + Binding binding = new Binding(); + binding.deserializeNBT((NBTTagCompound) bindingTag); + return binding; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index acc83e58..a9ec1ff2 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.core.data; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.PleaseStopUsingMe; import WayofTime.bloodmagic.event.AddToNetworkEvent; @@ -74,7 +73,7 @@ public class SoulNetwork implements INBTSerializable { return false; if (!Strings.isNullOrEmpty(playerId.toString())) { - SoulNetworkEvent.ItemDrainNetworkEvent event = new SoulNetworkEvent.ItemDrainNetworkEvent(user, playerId.toString(), null, toSyphon); + SoulNetworkEvent.ItemDrainNetworkEvent event = new SoulNetworkEvent.ItemDrainNetworkEvent(user, playerId, null, toSyphon); if (MinecraftForge.EVENT_BUS.post(event)) return false; diff --git a/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java b/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java index 7f7e7bf4..e5cf73c5 100644 --- a/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java @@ -7,24 +7,29 @@ import net.minecraftforge.fml.common.eventhandler.Event; @Cancelable public class ItemBindEvent extends Event { - public final EntityPlayer player; - public String key; - public ItemStack itemStack; + + private final EntityPlayer 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 key The UUID of the player doing the binding * @param itemStack The {@link ItemStack} that the player is binding *

        * This event is {@link Cancelable}.
        */ - public ItemBindEvent(EntityPlayer player, String key, ItemStack itemStack) { - super(); + public ItemBindEvent(EntityPlayer player, ItemStack itemStack) { this.player = player; - this.key = key; this.itemStack = itemStack; } + + public EntityPlayer getNewOwner() { + return player; + } + + public ItemStack getBindingStack() { + return itemStack; + } } diff --git a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java index d65da6a4..bf69e5b7 100644 --- a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java @@ -10,14 +10,16 @@ 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 { public final IMasterRitualStone mrs; - public final String ownerName; + public final UUID ownerId; public final Ritual ritual; - private RitualEvent(IMasterRitualStone mrs, String ownerName, Ritual ritual) { + private RitualEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual) { this.mrs = mrs; - this.ownerName = ownerName; + this.ownerId = ownerId; this.ritual = ritual; } @@ -33,8 +35,8 @@ public class RitualEvent extends Event { public final ItemStack crystalStack; public int crystalTier; - public RitualActivatedEvent(IMasterRitualStone mrs, String owner, Ritual ritual, EntityPlayer player, ItemStack activationCrystal, int crystalTier) { - super(mrs, owner, ritual); + public RitualActivatedEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual, EntityPlayer player, ItemStack activationCrystal, int crystalTier) { + super(mrs, ownerId, ritual); this.player = player; this.crystalStack = activationCrystal; @@ -50,8 +52,8 @@ public class RitualEvent extends Event { */ @Cancelable public static class RitualRunEvent extends RitualEvent { - public RitualRunEvent(IMasterRitualStone mrs, String owner, Ritual ritual) { - super(mrs, owner, ritual); + public RitualRunEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual) { + super(mrs, ownerId, ritual); } } @@ -65,8 +67,8 @@ public class RitualEvent extends Event { public final Ritual.BreakType method; - public RitualStopEvent(IMasterRitualStone mrs, String owner, Ritual ritual, Ritual.BreakType method) { - super(mrs, owner, ritual); + public RitualStopEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual, Ritual.BreakType method) { + super(mrs, ownerId, ritual); this.method = method; } @@ -76,12 +78,12 @@ public class RitualEvent extends Event { public static class ImperfectRitualActivatedEvent extends Event { public final IImperfectRitualStone ims; - public final String ownerName; + public final UUID ownerId; public final ImperfectRitual imperfectRitual; - public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, String ownerName, ImperfectRitual imperfectRitual) { + public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, UUID ownerId, ImperfectRitual imperfectRitual) { this.ims = ims; - this.ownerName = ownerName; + this.ownerId = ownerId; this.imperfectRitual = imperfectRitual; } } diff --git a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java index fc81dbe7..cb962fdd 100644 --- a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java @@ -6,6 +6,7 @@ import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nullable; +import java.util.UUID; /** * Base event class for Soul Network related events. @@ -14,17 +15,17 @@ import javax.annotation.Nullable; * amount of LP to be drained */ public class SoulNetworkEvent extends Event { - public final String ownerUUID; + public final UUID ownerUUID; public int syphon; - public SoulNetworkEvent(String ownerUUID, int syphon) { + public SoulNetworkEvent(UUID ownerUUID, int syphon) { this.ownerUUID = ownerUUID; this.syphon = syphon; } /** * This event is called when an - * {@link WayofTime.bloodmagic.apibutnotreally.impl.ItemBindable} is being drained + * {@link WayofTime.bloodmagic.iface.IBindable} is being drained * inside of a {@link net.minecraft.tileentity.TileEntity}. *

        * If canceled, the drain will not be executed. @@ -33,8 +34,8 @@ public class SoulNetworkEvent extends Event { public static class ItemDrainInContainerEvent extends SoulNetworkEvent { public ItemStack stack; - public ItemDrainInContainerEvent(ItemStack stack, String ownerName, int syphon) { - super(ownerName, syphon); + public ItemDrainInContainerEvent(ItemStack stack, UUID ownerId, int syphon) { + super(ownerId, syphon); this.stack = stack; } } @@ -50,8 +51,8 @@ public class SoulNetworkEvent extends Event { // If true, will damage regardless of if the network had enough inside it public boolean shouldDamage; - public PlayerDrainNetworkEvent(EntityPlayer player, String ownerNetwork, int drainAmount) { - super(ownerNetwork, drainAmount); + public PlayerDrainNetworkEvent(EntityPlayer player, UUID ownerId, int drainAmount) { + super(ownerId, drainAmount); this.shouldDamage = false; this.player = player; } @@ -72,12 +73,12 @@ public class SoulNetworkEvent extends Event { * event prevents action without penalties * * @param player Player using the item - * @param ownerNetwork Network that the item is tied to + * @param ownerId Network that the item is tied to * @param itemStack Item used * @param drainAmount Original drain amount - change to alter cost */ - public ItemDrainNetworkEvent(EntityPlayer player, String ownerNetwork, @Nullable ItemStack itemStack, int drainAmount) { - super(player, ownerNetwork, drainAmount); + public ItemDrainNetworkEvent(EntityPlayer player, UUID ownerId, @Nullable ItemStack itemStack, int drainAmount) { + super(player, ownerId, drainAmount); this.itemStack = itemStack; this.damageAmount = (float) (drainAmount) / 100.0f; } diff --git a/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java b/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java index f9b39342..e5ee95e9 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java @@ -1,9 +1,26 @@ package WayofTime.bloodmagic.iface; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import javax.annotation.Nonnull; public interface IActivatable { - boolean getActivated(ItemStack stack); - ItemStack setActivatedState(ItemStack stack, boolean activated); + default boolean getActivated(ItemStack stack) { + return !stack.isEmpty() && stack.hasTagCompound() && stack.getTagCompound().getBoolean(Constants.NBT.ACTIVATED); + } + + @Nonnull + default ItemStack setActivatedState(ItemStack stack, boolean activated) { + if (!stack.isEmpty()) { + if (!stack.hasTagCompound()) + stack.setTagCompound(new NBTTagCompound()); + + stack.getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); + } + + return stack; + } } diff --git a/src/main/java/WayofTime/bloodmagic/iface/IBindable.java b/src/main/java/WayofTime/bloodmagic/iface/IBindable.java index 164d77ff..cc2dad03 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IBindable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IBindable.java @@ -1,37 +1,28 @@ package WayofTime.bloodmagic.iface; -import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.core.data.Binding; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import javax.annotation.Nullable; + /** * Implement this interface on any Item that can be bound to a player. */ public interface IBindable { /** - * Gets the username of the Item's owner. Usually for display, such as in - * the tooltip. + * 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 username of the Item's owner + * @return - The binding object */ - default String getOwnerName(ItemStack stack) { - return !stack.isEmpty() && stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; - } - - /** - * Gets the UUID of the Item's owner. - *

        - * If the item is not bound, this will be null. - * - * @param stack - The owned ItemStack - * @return - The UUID of the Item's owner - */ - default String getOwnerUUID(ItemStack stack) { - return !stack.isEmpty() && stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; + @Nullable + default Binding getBinding(ItemStack stack) { + Binding binding = Binding.fromStack(stack); + return !stack.isEmpty() && binding != null ? binding : null; } /** diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index dfb40d9d..65c0c354 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -1,12 +1,11 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.types.ISubItem; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -34,8 +33,9 @@ public class ItemActivationCrystal extends ItemEnum.Variant implemen if (!stack.hasTagCompound()) return; - if (!Strings.isNullOrEmpty(getOwnerUUID(stack))) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); + 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 index 2e2d6d21..ddb05494 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; @@ -13,39 +14,42 @@ import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nullable; import java.util.List; public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvider { + public ItemLavaCrystal() { super(); setUnlocalizedName(BloodMagic.MODID + ".lavaCrystal"); } @Override - public ItemStack getContainerItem(ItemStack itemStack) { - String uuid = getOwnerUUID(itemStack); - if (!Strings.isNullOrEmpty(uuid)) - NetworkHelper.getSoulNetwork(uuid).syphon(25); + public ItemStack getContainerItem(ItemStack stack) { + Binding binding = getBinding(stack); + if (binding != null) + NetworkHelper.getSoulNetwork(binding.getOwnerId()).syphon(25); ItemStack returnStack = new ItemStack(this); - returnStack.setTagCompound(itemStack.getTagCompound()); + returnStack.setTagCompound(stack.getTagCompound()); return returnStack; } @Override - public boolean hasContainerItem(ItemStack itemStack) { + public boolean hasContainerItem(ItemStack stack) { return true; } @Override public int getItemBurnTime(ItemStack stack) { - if (Strings.isNullOrEmpty(getOwnerUUID(stack))) + Binding binding = getBinding(stack); + if (binding == null) return -1; if (NetworkHelper.canSyphonFromContainer(stack, 25)) return 200; else { - EntityPlayer player = PlayerHelper.getPlayerFromUUID(getOwnerUUID(stack)); + EntityPlayer player = PlayerHelper.getPlayerFromUUID(binding.getOwnerId()); if (player != null) player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 99)); } @@ -53,14 +57,10 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide return -1; } + @Nullable @Override - public String getOwnerName(ItemStack stack) { - return stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_NAME) : null; - } - - @Override - public String getOwnerUUID(ItemStack stack) { - return stack.hasTagCompound() ? stack.getTagCompound().getString(Constants.NBT.OWNER_UUID) : null; + public Binding getBinding(ItemStack stack) { + return Binding.fromStack(stack); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/item/ItemSigilToggleable.java index c340021c..9b9bbe27 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSigilToggleable.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item; +import WayofTime.bloodmagic.core.data.Binding; 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 com.google.common.base.Strings; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -22,6 +22,7 @@ import net.minecraft.world.World; * Base class for all toggleable sigils. */ public class ItemSigilToggleable extends ItemSigil implements IActivatable { + public ItemSigilToggleable(int lpUsed) { super(lpUsed); } @@ -64,10 +65,12 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable { ItemStack stack = player.getHeldItem(hand); if (stack.getItem() instanceof ISigil.Holding) stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (Strings.isNullOrEmpty(getOwnerUUID(stack)) || player.isSneaking()) // Make sure Sigils are bound before handling. Also ignores while toggling state + + Binding binding = getBinding(stack); + if (binding == null || player.isSneaking()) // Make sure Sigils are bound before handling. Also ignores while toggling state return EnumActionResult.PASS; - return (NetworkHelper.getSoulNetwork(getOwnerUUID(player.getHeldItem(hand))).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + return (NetworkHelper.getSoulNetwork(binding).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; } public boolean onSigilUse(ItemStack itemStack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) { @@ -78,7 +81,7 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable { public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { if (!worldIn.isRemote && entityIn instanceof EntityPlayerMP && getActivated(stack)) { if (entityIn.ticksExisted % 100 == 0) { - if (!NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage((EntityPlayer) entityIn, getLpUsed())) { + if (!NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage((EntityPlayer) entityIn, getLpUsed())) { setActivatedState(stack, false); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index b12011d1..2d645ba2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -1,5 +1,6 @@ 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; @@ -51,11 +52,13 @@ public class ItemTelepositionFocus extends ItemEnum.Variant 0) return super.onItemRightClick(world, player, hand); + SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); 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) - NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()); + network.syphonAndDamage(player, getLpUsed()); resetCooldown(stack); player.swingArm(hand); return super.onItemRightClick(world, player, hand); @@ -55,7 +57,7 @@ public class ItemSigilBloodLight extends ItemSigilBase { } else { if (!world.isRemote) { world.spawnEntity(new EntityBloodLight(world, player)); - NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()); + network.syphonAndDamage(player, getLpUsed()); } resetCooldown(stack); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index 0447c242..a9a4b26f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -1,21 +1,21 @@ 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.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.ChatUtil; +import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; -import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.List; public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { @@ -35,13 +35,12 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { if (!world.isRemote) { super.onItemRightClick(world, player, hand); - RayTraceResult rayTrace = rayTrace(world, player, false); - - if (rayTrace == null) { - int currentEssence = NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).getCurrentEssence(); - List toSend = new ArrayList(); - if (!getOwnerName(stack).equals(PlayerHelper.getUsernameFromPlayer(player))) - toSend.add(new TextComponentTranslation(tooltipBase + "otherNetwork", getOwnerName(stack))); + 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 TextComponentTranslation(tooltipBase + "otherNetwork", binding.getOwnerName())); toSend.add(new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index d6f77a58..32fa6957 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -11,7 +11,6 @@ import WayofTime.bloodmagic.client.key.IKeybindable; import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -90,7 +89,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl List inv = getInternalInventory(stack); ItemStack itemUsing = inv.get(currentSlot); - if (itemUsing.isEmpty() || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing))) + if (itemUsing.isEmpty() || ((IBindable) itemUsing.getItem()).getBinding(stack) == null) return EnumActionResult.PASS; EnumActionResult result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); @@ -109,7 +108,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl List inv = getInternalInventory(stack); ItemStack itemUsing = inv.get(currentSlot); - if (itemUsing.isEmpty() || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing))) + if (itemUsing.isEmpty() || ((IBindable) itemUsing.getItem()).getBinding(stack) == null) return ActionResult.newResult(EnumActionResult.PASS, stack); itemUsing.getItem().onItemRightClick(world, player, hand); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index 3a70741c..b02e3f3c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -59,7 +59,7 @@ public class ItemSigilLava extends ItemSigilBase { return super.onItemRightClick(world, player, hand); } - if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) { + if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) { return super.onItemRightClick(world, player, hand); } } @@ -85,7 +85,7 @@ public class ItemSigilLava extends ItemSigilBase { FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000); int amount = handler.fill(fluid, false); - if (amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { + if (amount > 0 && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, getLpUsed())) { handler.fill(fluid, true); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 38535e96..4a9566da 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -55,7 +55,7 @@ public class ItemSigilTeleposition extends ItemSigilBase { if (!world.isRemote && NBTHelper.checkNBT(stack) != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) { BlockPos blockPos = new BlockPos(getValue(stack.getTagCompound(), Constants.NBT.X_COORD), getValue(stack.getTagCompound(), Constants.NBT.Y_COORD), getValue(stack.getTagCompound(), Constants.NBT.Z_COORD)).up(); if (world.provider.getDimension() == getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID)) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(blockPos, player, getOwnerUUID(stack), true)); + TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(blockPos, player, getBinding(stack).getOwnerId(), true)); } // FIXME - Fix cross-dimension teleports causing major desync // } else { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 1b6b777c..f54bc75b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.item.ItemSigilToggleable; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; @@ -21,6 +22,7 @@ import java.util.List; import java.util.Locale; public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMeshProvider { + protected final String tooltipBase; private final String name; @@ -40,10 +42,12 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes super.addInformation(stack, world, tooltip, flag); if (!stack.hasTagCompound()) return; + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated"))); - if (!Strings.isNullOrEmpty(getOwnerName(stack))) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", PlayerHelper.getUsernameFromStack(stack))); + Binding binding = getBinding(stack); + if (binding != null) + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index b150306d..3a00e1fe 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -99,7 +99,7 @@ public class ItemSigilTransposition extends ItemSigilBase { stack.getTagCompound().setByte(Constants.NBT.CONTAINED_BLOCK_META, metadata); stack.getTagCompound().setTag(Constants.NBT.CONTAINED_TILE_ENTITY, tileNBTTag); - NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, cost); + NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, cost); world.removeTileEntity(blockPos); world.setBlockToAir(blockPos); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index a4b54fda..a2e20146 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.item.sigil; +import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.iface.ISigil; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; @@ -85,12 +86,13 @@ public class ItemSigilVoid extends ItemSigilBase { return EnumActionResult.FAIL; } + SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); TileEntity tile = world.getTileEntity(blockPos); if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack amount = handler.drain(1000, false); - if (amount != null && amount.amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { + if (amount != null && amount.amount > 0 && network.syphonAndDamage(player, getLpUsed())) { handler.drain(1000, true); return EnumActionResult.SUCCESS; } @@ -104,7 +106,7 @@ public class ItemSigilVoid extends ItemSigilBase { return EnumActionResult.FAIL; } - if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) { + if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && network.syphonAndDamage(player, getLpUsed())) { world.setBlockToAir(newPos); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index fd73d938..396c2aa5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -54,7 +54,7 @@ public class ItemSigilWater extends ItemSigilBase { if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) return super.onItemRightClick(world, player, hand); - if (this.canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceWater(world, blockpos1)) + if (this.canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceWater(world, blockpos1)) return super.onItemRightClick(world, player, hand); } } diff --git a/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java b/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java index 2c23d393..6a8b5a1b 100644 --- a/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java @@ -15,6 +15,7 @@ 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; @@ -25,11 +26,13 @@ public class BloodOrb extends IForgeRegistryEntry.Impl { * @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) { + public BloodOrb(String name, int tier, int capacity, int fillRate) { this.name = name; this.tier = tier; this.capacity = capacity; + this.fillRate = fillRate; } public String getName() { @@ -44,6 +47,10 @@ public class BloodOrb extends IForgeRegistryEntry.Impl { return capacity; } + public int getFillRate() { + return fillRate; + } + @Nullable public ModelResourceLocation getModelLocation() { return modelLocation; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index d706b79c..ba6a2fa7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -1,11 +1,12 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; -import com.google.common.base.Strings; +import com.google.common.collect.Lists; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -23,6 +24,7 @@ import net.minecraftforge.items.IItemHandler; import java.util.ArrayList; import java.util.List; import java.util.Random; +import java.util.UUID; public class RitualExpulsion extends Ritual { public static final String EXPULSION_RANGE = "expulsionRange"; @@ -48,7 +50,7 @@ public class RitualExpulsion extends Ritual { AreaDescriptor expulsionRange = getBlockRange(EXPULSION_RANGE); - List allowedNames = new ArrayList(); + List whitelist = Lists.newArrayList(); BlockPos masterPos = masterRitualStone.getBlockPos(); TileEntity tile = world.getTileEntity(masterPos.up()); @@ -57,10 +59,10 @@ public class RitualExpulsion extends Ritual { if (handler != null) { for (int i = 0; i < handler.getSlots(); i++) { ItemStack itemStack = handler.getStackInSlot(i); - if (itemStack != null && itemStack.getItem() instanceof IBindable) { - IBindable bindable = (IBindable) itemStack.getItem(); - if (!Strings.isNullOrEmpty(bindable.getOwnerName(itemStack)) && !allowedNames.contains(bindable.getOwnerName(itemStack))) - allowedNames.add(bindable.getOwnerUUID(itemStack)); + 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()); } } } @@ -69,14 +71,14 @@ public class RitualExpulsion extends Ritual { final int teleportDistance = 100; for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, expulsionRange.getAABB(masterRitualStone.getBlockPos()))) { - if (player.capabilities.isCreativeMode || PlayerHelper.getUUIDFromPlayer(player).toString().equals(masterRitualStone.getOwner()) || allowedNames.contains(PlayerHelper.getUUIDFromPlayer(player).toString())) + if (player.capabilities.isCreativeMode || PlayerHelper.getUUIDFromPlayer(player).toString().equals(masterRitualStone.getOwner()) || whitelist.contains(player.getGameProfile().getId())) continue; if (teleportRandomly(player, teleportDistance)) masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * 1000); } - allowedNames.clear(); + whitelist.clear(); } public boolean teleportRandomly(EntityLivingBase entityLiving, double distance) { @@ -162,20 +164,16 @@ public class RitualExpulsion extends Ritual { } public void moveEntityViaTeleport(EntityLivingBase entityLiving, double x, double y, double z) { - if (entityLiving != null && entityLiving instanceof EntityPlayer) { - if (entityLiving instanceof EntityPlayerMP) { - EntityPlayerMP entityplayermp = (EntityPlayerMP) entityLiving; + if (entityLiving instanceof EntityPlayerMP) { + EntityPlayerMP player = (EntityPlayerMP) entityLiving; - if (entityplayermp.getEntityWorld() == entityLiving.getEntityWorld()) { - EnderTeleportEvent event = new EnderTeleportEvent(entityplayermp, x, y, z, 5.0F); + EnderTeleportEvent event = new EnderTeleportEvent(player, x, y, z, 5.0F); - if (!MinecraftForge.EVENT_BUS.post(event)) { - if (entityLiving.isRiding()) { - entityplayermp.mountEntityAndWakeUp(); - } - entityLiving.setPositionAndUpdate(event.getTargetX(), event.getTargetY(), event.getTargetZ()); - } - } + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java index 0c4503d8..2dd00fe1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java @@ -18,6 +18,7 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.ForgeRegistries; import java.util.ArrayList; +import java.util.UUID; public class RitualPortal extends Ritual { @@ -31,14 +32,14 @@ public class RitualPortal extends Ritual { } @Override - public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, String owner) { + public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, UUID owner) { World world = masterRitualStone.getWorldObj(); int x = masterRitualStone.getBlockPos().getX(); int y = masterRitualStone.getBlockPos().getY(); int z = masterRitualStone.getBlockPos().getZ(); EnumFacing direction = masterRitualStone.getDirection(); - String name = owner; + String name = owner.toString(); IBlockState blockState; if (!world.isRemote) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java index 781988fc..320757ef 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java @@ -9,6 +9,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.List; +import java.util.UUID; /** * This interface is for internal implementation only. @@ -16,7 +17,7 @@ import java.util.List; * It is provided via the API for easy obtaining of basic data. */ public interface IMasterRitualStone { - String getOwner(); + UUID getOwner(); SoulNetwork getOwnerNetwork(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java index d75447ce..b2a4d680 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java @@ -14,10 +14,7 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import org.apache.commons.lang3.builder.ToStringBuilder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; /** @@ -100,7 +97,7 @@ public abstract class Ritual { * owner of the ritual if being reactivated. * @return - Whether activation was successful */ - public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, String owner) { + public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, UUID owner) { return true; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index b2571e6d..5e24db13 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -20,17 +20,19 @@ import net.minecraft.world.WorldServer; 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, String networkToDrain, boolean teleposer) { - this(new BlockPos(x, y, z), entity, networkToDrain, 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, String networkToDrain, boolean teleposer) { - super(blockPos, entity, networkToDrain); + public TeleportSameDim(BlockPos blockPos, Entity entity, UUID networkOwner, boolean teleposer) { + super(blockPos, entity, networkOwner); this.teleposer = teleposer; } @@ -39,7 +41,7 @@ public class Teleports { if (entity != null) { if (entity.timeUntilPortal <= 0) { if (entity instanceof EntityPlayer) { - SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); + SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); if (network.getCurrentEssence() < getTeleportCost()) return; @@ -60,7 +62,7 @@ public class Teleports { if (teleposer) MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z))); } else { - SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); + SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); if (network.getCurrentEssence() < (getTeleportCost() / 10)) return; @@ -95,12 +97,12 @@ public class Teleports { private int newWorldID; private boolean teleposer; - public TeleportToDim(int x, int y, int z, Entity entity, String networkToDrain, World oldWorld, int newWorld, boolean teleposer) { - this(new BlockPos(x, y, z), entity, networkToDrain, oldWorld, newWorld, 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, String networkToDrain, World oldWorld, int newWorldID, boolean teleposer) { - super(blockPos, entity, networkToDrain); + 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; @@ -118,7 +120,7 @@ public class Teleports { EntityPlayerMP player = (EntityPlayerMP) entity; if (!player.getEntityWorld().isRemote) { - SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); + SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); if (network.getCurrentEssence() < getTeleportCost()) return; @@ -138,7 +140,7 @@ public class Teleports { } } else if (!entity.getEntityWorld().isRemote) { - SoulNetwork network = NetworkHelper.getSoulNetwork(networkToDrain); + SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); if (network.getCurrentEssence() < (getTeleportCost() / 10)) return; diff --git a/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java b/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java index 18719e16..742b4000 100644 --- a/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java @@ -3,23 +3,25 @@ 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 String networkToDrain; + protected UUID networkOwner; - public Teleport(int x, int y, int z, Entity entity, String networkToDrain) { + 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.networkToDrain = networkToDrain; + this.networkOwner = networkOwner; } - public Teleport(BlockPos blockPos, Entity entity, String networkToDrain) { - this(blockPos.getX(), blockPos.getY(), blockPos.getZ(), entity, networkToDrain); + public Teleport(BlockPos blockPos, Entity entity, UUID networkOwner) { + this(blockPos.getX(), blockPos.getY(), blockPos.getZ(), entity, networkOwner); } public int getX() { @@ -38,8 +40,8 @@ public abstract class Teleport implements ITeleport { return entity; } - public String getNetworkToDrain() { - return networkToDrain; + public UUID getNetworkOwner() { + return networkOwner; } @Override @@ -53,7 +55,7 @@ public abstract class Teleport implements ITeleport { 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 networkToDrain != null ? networkToDrain.equals(teleport.networkToDrain) : teleport.networkToDrain == null; + return networkOwner != null ? networkOwner.equals(teleport.networkOwner) : teleport.networkOwner == null; } @Override @@ -62,7 +64,7 @@ public abstract class Teleport implements ITeleport { result = 31 * result + y; result = 31 * result + z; result = 31 * result + (entity != null ? entity.hashCode() : 0); - result = 31 * result + (networkToDrain != null ? networkToDrain.hashCode() : 0); + result = 31 * result + (networkOwner != null ? networkOwner.hashCode() : 0); return result; } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index aaf844d2..9bce3ea8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.RitualEvent; import WayofTime.bloodmagic.core.registry.RitualRegistry; @@ -7,10 +9,7 @@ import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; import WayofTime.bloodmagic.ritual.data.Ritual; import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.util.helper.RitualHelper; +import WayofTime.bloodmagic.util.helper.*; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.ItemActivationCrystal; import WayofTime.bloodmagic.tile.base.TileTicking; @@ -29,9 +28,10 @@ import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.UUID; public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone { - private String owner; + private UUID owner; private SoulNetwork cachedNetwork; private boolean active; private boolean redstoned; @@ -57,7 +57,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (!isActive() && !isPowered() && isRedstoned() && getCurrentRitual() != null) { active = true; ItemStack crystalStack = NBTHelper.checkNBT(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL, 1, getCurrentRitual().getCrystalLevel())); - crystalStack.getTagCompound().setString(Constants.NBT.OWNER_UUID, getOwner()); + BindableHelper.applyBinding(crystalStack, new Binding(owner, PlayerHelper.getUsernameFromUUID(owner))); activateRitual(crystalStack, null, getCurrentRitual()); redstoned = false; } @@ -72,8 +72,8 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS @Override public void deserialize(NBTTagCompound tag) { - owner = tag.getString(Constants.NBT.OWNER_UUID); - if (!Strings.isNullOrEmpty(owner)) + owner = tag.hasUniqueId("owner") ? tag.getUniqueId("owner") : null; + if (owner != null) cachedNetwork = NetworkHelper.getSoulNetwork(owner); currentRitual = RitualRegistry.getRitualForId(tag.getString(Constants.NBT.CURRENT_RITUAL)); if (currentRitual != null) { @@ -97,7 +97,8 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS @Override public NBTTagCompound serialize(NBTTagCompound tag) { String ritualId = RitualRegistry.getIdForRitual(getCurrentRitual()); - tag.setString(Constants.NBT.OWNER_UUID, Strings.isNullOrEmpty(getOwner()) ? "" : getOwner()); + if (owner != null) + tag.setUniqueId(Constants.NBT.OWNER_UUID, owner); tag.setString(Constants.NBT.CURRENT_RITUAL, Strings.isNullOrEmpty(ritualId) ? "" : ritualId); if (currentRitual != null) { NBTTagCompound ritualTag = new NBTTagCompound(); @@ -121,15 +122,13 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (PlayerHelper.isFakePlayer(activator)) return false; - activationCrystal = NBTHelper.checkNBT(activationCrystal); - String crystalOwner = activationCrystal.getTagCompound().getString(Constants.NBT.OWNER_UUID); - - if (!Strings.isNullOrEmpty(crystalOwner) && ritual != null) { + 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(crystalOwner); + SoulNetwork network = NetworkHelper.getSoulNetwork(binding); if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && (activator != null && !activator.capabilities.isCreativeMode)) { activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.weak"), true); @@ -139,7 +138,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (currentRitual != null) currentRitual.stopRitual(this, Ritual.BreakType.ACTIVATE); - RitualEvent.RitualActivatedEvent event = new RitualEvent.RitualActivatedEvent(this, crystalOwner, ritual, activator, activationCrystal, crystalLevel); + RitualEvent.RitualActivatedEvent event = new RitualEvent.RitualActivatedEvent(this, binding.getOwnerId(), ritual, activator, activationCrystal, crystalLevel); if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) { if (activator != null) @@ -147,7 +146,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS return false; } - if (ritual.activateRitual(this, activator, crystalOwner)) { + if (ritual.activateRitual(this, activator, binding.getOwnerId())) { if (!isRedstoned() && (activator != null && !activator.capabilities.isCreativeMode)) network.syphon(ritual.getActivationCost()); @@ -155,7 +154,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.activate"), true); this.active = true; - this.owner = crystalOwner; + this.owner = binding.getOwnerId(); this.cachedNetwork = network; this.currentRitual = ritual; @@ -240,11 +239,11 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public String getOwner() { + public UUID getOwner() { return owner; } - public void setOwner(String owner) { + public void setOwner(UUID owner) { this.owner = owner; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index f91052d9..416c37f7 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -1,19 +1,19 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.TeleposeEvent; import WayofTime.bloodmagic.teleport.TeleportQueue; -import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.block.BlockTeleposer; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.ritual.portal.Teleports; import WayofTime.bloodmagic.util.Utils; -import com.google.common.base.Strings; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -59,17 +59,23 @@ public class TileTeleposer extends TileInventory implements ITickable { } public void initiateTeleport() { - if (!getWorld().isRemote && canInitiateTeleport(this) && getBlockType() instanceof BlockTeleposer) { - ItemStack focusStack = NBTHelper.checkNBT(getStackInSlot(0)); + 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(getStackInSlot(0)); World focusWorld = focus.getWorld(getStackInSlot(0)); + if (focusWorld == null) + return; - if (focusWorld != null && focusWorld.getTileEntity(focusPos) instanceof TileTeleposer && !focusWorld.getTileEntity(focusPos).equals(this)) { + TileEntity boundTile = focusWorld.getTileEntity(focusPos); + if (boundTile instanceof TileTeleposer && boundTile != this) { final int focusLevel = (getStackInSlot(0).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.getSoulNetwork(focus.getOwnerUUID(focusStack)).syphonAndDamage(PlayerHelper.getPlayerFromUUID(focus.getOwnerUUID(focusStack)), lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1))) { + if (NetworkHelper.getSoulNetwork(binding).syphonAndDamage(PlayerHelper.getPlayerFromUUID(binding.getOwnerId()), lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1))) { int blocksTransported = 0; for (int i = -(focusLevel - 1); i <= (focusLevel - 1); i++) { @@ -95,13 +101,13 @@ public class TileTeleposer extends TileInventory implements ITickable { 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), true)); + 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, binding.getOwnerId(), 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), true)); + 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, binding.getOwnerId(), true)); } } } @@ -124,7 +130,8 @@ public class TileTeleposer extends TileInventory implements ITickable { } } - private boolean canInitiateTeleport(TileTeleposer teleposer) { - return !teleposer.getStackInSlot(0).isEmpty() && teleposer.getStackInSlot(0).getItem() instanceof ItemTelepositionFocus && !Strings.isNullOrEmpty(((ItemTelepositionFocus) teleposer.getStackInSlot(0).getItem()).getOwnerName(teleposer.getStackInSlot(0))); + 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/util/handler/event/GenericHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java index d9a4d4f2..cd8bebf3 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.ItemBindEvent; import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; @@ -53,6 +54,7 @@ import net.minecraft.init.MobEffects; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumHand; import net.minecraft.util.EnumParticleTypes; @@ -79,10 +81,7 @@ import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; +import java.util.*; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class GenericHandler { @@ -339,25 +338,25 @@ public class GenericHandler { return; ItemStack held = event.getItemStack(); - if (!held.isEmpty() && held.getItem() instanceof IBindable) { - held = NBTHelper.checkNBT(held); + if (!held.isEmpty() && held.getItem() instanceof IBindable) { // Make sure it's bindable IBindable bindable = (IBindable) held.getItem(); - if (Strings.isNullOrEmpty(bindable.getOwnerUUID(held))) { + Binding binding = bindable.getBinding(held); + if (binding == null) { // If the binding is null, let's create one if (bindable.onBind(player, held)) { - String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); - ItemBindEvent toPost = new ItemBindEvent(player, uuid, held); - if (MinecraftForge.EVENT_BUS.post(toPost) || toPost.getResult() == Result.DENY) + ItemBindEvent toPost = new ItemBindEvent(player, held); + if (MinecraftForge.EVENT_BUS.post(toPost)) // Allow cancellation of binding return; - BindableHelper.setItemOwnerUUID(held, uuid); - BindableHelper.setItemOwnerName(held, player.getDisplayNameString()); + BindableHelper.applyBinding(held, player); // Bind item to the player } - } else if (bindable.getOwnerUUID(held).equals(PlayerHelper.getUUIDFromPlayer(player).toString()) && !bindable.getOwnerName(held).equals(player.getDisplayNameString())) - BindableHelper.setItemOwnerName(held, player.getDisplayNameString()); + // 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) { - held = NBTHelper.checkNBT(held); IBloodOrb bloodOrb = (IBloodOrb) held.getItem(); SoulNetwork network = NetworkHelper.getSoulNetwork(player); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java index f74bb848..2606eae9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java @@ -1,17 +1,26 @@ package WayofTime.bloodmagic.util.helper; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.ItemBindEvent; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.handler.event.GenericHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; - -import java.util.UUID; +import net.minecraft.nbt.NBTTagCompound; public class BindableHelper { + + public static void applyBinding(ItemStack stack, EntityPlayer 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 NBTTagCompound()); + + stack.getTagCompound().setTag("binding", binding.serializeNBT()); + } + /** * Sets the Owner Name of the item without checking if it is already bound. * Also bypasses {@link ItemBindEvent}. @@ -37,113 +46,4 @@ public class BindableHelper { stack.getTagCompound().setString(Constants.NBT.OWNER_UUID, ownerUUID); } - - // Everything below is to be removed. - - /** - * Deprecated. - *

        - * Built into {@link IBindable} now. - * - * @param stack - The ItemStack to check the owner of - * @return - The username of the ItemStack's owner - */ - @Deprecated - public static String getOwnerName(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - - return PlayerHelper.getUsernameFromStack(stack); - } - - /** - * Deprecated. - *

        - * Built into {@link IBindable} now. - * - * @param stack - The ItemStack to check the owner of - * @return - The UUID of the ItemStack's owner - */ - @Deprecated - public static String getOwnerUUID(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - - return stack.getTagCompound().getString(Constants.NBT.OWNER_UUID); - } - - /** - * Deprecated. - *

        - * Now handled automatically with - * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} - * - * @param stack - The ItemStack to bind - * @param player - The Player to bind the ItemStack to - * @return - Whether binding was successful - */ - @Deprecated - public static boolean checkAndSetItemOwner(ItemStack stack, EntityPlayer player) { - return !PlayerHelper.isFakePlayer(player) && checkAndSetItemOwner(stack, PlayerHelper.getUUIDFromPlayer(player), player.getName()); - } - - /** - * Deprecated. - *

        - * Now handled automatically with - * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} - * - * @param stack - The ItemStack to bind - * @param uuid - The username to bind the ItemStack to - * @param currentUsername - The current name of the player. - * @return - Whether the binding was successful - */ - @Deprecated - public static boolean checkAndSetItemOwner(ItemStack stack, String uuid, String currentUsername) { - stack = NBTHelper.checkNBT(stack); - - if (!(stack.getItem() instanceof IBindable)) - return false; - - String currentOwner = stack.getTagCompound().getString(Constants.NBT.OWNER_UUID); - - if (currentOwner == "") //The player has not been set yet, so set everything. - { - MinecraftForge.EVENT_BUS.post(new ItemBindEvent(PlayerHelper.getPlayerFromUUID(uuid), uuid, stack)); - ((IBindable) stack.getItem()).onBind(PlayerHelper.getPlayerFromUUID(uuid), stack); - stack.getTagCompound().setString(Constants.NBT.OWNER_UUID, uuid); - stack.getTagCompound().setString(Constants.NBT.OWNER_NAME, currentUsername); - return true; - } else if (currentOwner.equals(uuid)) //The player has been set, so this will simply update the display name - { - stack.getTagCompound().setString(Constants.NBT.OWNER_NAME, currentUsername); - } - - return true; - } - - /** - * Deprecated. - *

        - * Now handled automatically with - * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} - * - * @param stack - ItemStack to check - * @param uuid - UUID of the Player - * @param currentUsername - The current name of the player. - */ - @Deprecated - public static boolean checkAndSetItemOwner(ItemStack stack, UUID uuid, String currentUsername) { - return checkAndSetItemOwner(stack, uuid.toString(), currentUsername); - } - - /** - * Deprecated. - * - * @param stack - The ItemStack to bind - * @param ownerName - The username to bind the ItemStack to - * @see #setItemOwnerName(ItemStack, String) - */ - @Deprecated - public static void setItemOwner(ItemStack stack, String ownerName) { - setItemOwnerName(stack, ownerName); - } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index 81f9dabe..1b3a4bda 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.util.helper; +import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.SoulNetworkEvent; import WayofTime.bloodmagic.orb.BloodOrb; @@ -57,6 +59,10 @@ public class NetworkHelper { return getSoulNetwork(PlayerHelper.getUUIDFromPlayer(player)); } + public static SoulNetwork getSoulNetwork(Binding binding) { + return getSoulNetwork(binding.getOwnerId()); + } + /** * Gets the current orb tier of the SoulNetwork. * @@ -99,7 +105,7 @@ public class NetworkHelper { @Deprecated public static boolean syphonAndDamage(SoulNetwork soulNetwork, EntityPlayer user, int toSyphon) { -// if (soulNetwork.getPlayer() == null) +// if (soulNetwork.getNewOwner() == null) // { // soulNetwork.syphon(toSyphon); // return true; @@ -117,15 +123,16 @@ public class NetworkHelper { */ public static boolean syphonFromContainer(ItemStack stack, int toSyphon) //TODO: Change to a String, int? { - stack = NBTHelper.checkNBT(stack); - String ownerName = stack.getTagCompound().getString(Constants.NBT.OWNER_UUID); - - if (Strings.isNullOrEmpty(ownerName)) + if (!(stack.getItem() instanceof IBindable)) return false; - SoulNetwork network = getSoulNetwork(ownerName); + Binding binding = ((IBindable) stack.getItem()).getBinding(stack); + if (binding == null) + return false; - SoulNetworkEvent.ItemDrainInContainerEvent event = new SoulNetworkEvent.ItemDrainInContainerEvent(stack, ownerName, toSyphon); + SoulNetwork network = getSoulNetwork(binding); + + SoulNetworkEvent.ItemDrainInContainerEvent event = new SoulNetworkEvent.ItemDrainInContainerEvent(stack, binding.getOwnerId(), toSyphon); return !(MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) && network.syphon(event.syphon) >= toSyphon; } @@ -138,13 +145,14 @@ public class NetworkHelper { * @return - If syphoning is possible */ public static boolean canSyphonFromContainer(ItemStack stack, int toSyphon) { - stack = NBTHelper.checkNBT(stack); - String ownerName = stack.getTagCompound().getString(Constants.NBT.OWNER_UUID); - - if (Strings.isNullOrEmpty(ownerName)) + if (!(stack.getItem() instanceof IBindable)) return false; - SoulNetwork network = getSoulNetwork(ownerName); + Binding binding = ((IBindable) stack.getItem()).getBinding(stack); + if (binding == null) + return false; + + SoulNetwork network = getSoulNetwork(binding); return network.getCurrentEssence() >= toSyphon; } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java index 2354b3e1..601a9240 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java @@ -1,12 +1,7 @@ package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.util.Constants; -import com.google.common.base.Strings; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; import net.minecraftforge.common.UsernameCache; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -23,43 +18,25 @@ public class PlayerHelper { */ private static final ArrayList knownFakePlayers = Lists.newArrayList(); - public static String getUsernameFromPlayer(EntityPlayer player) { - return player.getEntityWorld().isRemote ? "" : UsernameCache.getLastKnownUsername(getUUIDFromPlayer(player)); - } - - public static EntityPlayer getPlayerFromUsername(String username) { + public static EntityPlayer getPlayerFromId(UUID uuid) { if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) return null; - return FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayerByUsername(username); - } - - public static EntityPlayer getPlayerFromUUID(String uuid) { - return getPlayerFromUsername(getUsernameFromUUID(uuid)); + return FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayerByUUID(uuid); } public static EntityPlayer getPlayerFromUUID(UUID uuid) { - return getPlayerFromUsername(getUsernameFromUUID(uuid)); + return getPlayerFromId(uuid); } public static UUID getUUIDFromPlayer(EntityPlayer player) { return player.getGameProfile().getId(); } - public static String getUsernameFromUUID(String uuid) { - return UsernameCache.getLastKnownUsername(UUID.fromString(uuid)); - } - public static String getUsernameFromUUID(UUID uuid) { return UsernameCache.getLastKnownUsername(uuid); } - public static String getUsernameFromStack(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - - return stack.getTagCompound().getString(Constants.NBT.OWNER_NAME); - } - /** * Checks whether or not the given player is an "actual" player * @@ -69,23 +46,4 @@ public class PlayerHelper { public static boolean isFakePlayer(EntityPlayer player) { return player instanceof FakePlayer || (player != null && knownFakePlayers.contains(player.getClass().getCanonicalName())); } - - public static void causeNauseaToPlayer(ItemStack stack) { - if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) - return; - - stack = NBTHelper.checkNBT(stack); - - if (!Strings.isNullOrEmpty(stack.getTagCompound().getString(Constants.NBT.OWNER_UUID))) - causeNauseaToPlayer(stack.getTagCompound().getString(Constants.NBT.OWNER_UUID)); - } - - public static void causeNauseaToPlayer(String ownerName) { - EntityPlayer player = getPlayerFromUsername(ownerName); - - if (player == null) - return; - - player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 80)); - } } From eaf4bfb8574cec465f673f6c12444037337ce3d4 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 27 Feb 2018 18:17:03 -0800 Subject: [PATCH 209/595] Fix Haste being... *constricted* when above level 2 (#1239) --- .../java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index c23234a9..e9287caf 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -80,7 +80,7 @@ public class RegistrarBloodMagic { 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("constriction"), + 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"), From caab4dcbef996527b97f28ea6c1a8c7cfdccd53e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 27 Feb 2018 18:17:30 -0800 Subject: [PATCH 210/595] Fix rituals crashing when deserializing the owner --- .../java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 9bce3ea8..4e140dea 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -98,7 +98,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS public NBTTagCompound serialize(NBTTagCompound tag) { String ritualId = RitualRegistry.getIdForRitual(getCurrentRitual()); if (owner != null) - tag.setUniqueId(Constants.NBT.OWNER_UUID, owner); + tag.setUniqueId("owner", owner); tag.setString(Constants.NBT.CURRENT_RITUAL, Strings.isNullOrEmpty(ritualId) ? "" : ritualId); if (currentRitual != null) { NBTTagCompound ritualTag = new NBTTagCompound(); From f4b72bed8b62261143a54b148c0619ee9afdf3eb Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 27 Feb 2018 21:17:31 -0500 Subject: [PATCH 211/595] Added temp recipe to try out a new Teleport array. Don't stick only your hand in it, though. --- .../AlchemyArrayEffectTeleport.java | 109 ++++++++++++++++++ .../bloodmagic/registry/ModRecipes.java | 2 + .../models/alchemyarrays/teleportation.png | Bin 0 -> 50896 bytes 3 files changed, 111 insertions(+) create mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/teleportation.png diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java new file mode 100644 index 00000000..47d0e935 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java @@ -0,0 +1,109 @@ +package WayofTime.bloodmagic.alchemyArray; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.SoundEvents; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.SPacketUpdateHealth; +import net.minecraft.potion.Potion; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +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, IBlockState state, Entity entity) + { + + { + double motionY = 0.5; + double speed = 3; + EnumFacing direction = array.getRotation(); + + teleportEntityInDirection(world, pos, entity, direction); + } + + } + + public void teleportEntityInDirection(World world, BlockPos currentPos, Entity entity, EnumFacing 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) + { + Potion d; + if (entity instanceof EntityPlayer) + { + EntityPlayerMP player = (EntityPlayerMP) entity; + + player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); + player.getEntityWorld().updateEntityWithOptionalForce(player, false); + player.connection.sendPacket(new SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); + + } else + { + WorldServer worldServer = (WorldServer) entity.getEntityWorld(); + + entity.setPosition(x + 0.5, y + 0.5, z + 0.5); + worldServer.resetUpdateEntityTick(); + } + } + return; + } + } + } + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectTeleport(key); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 28b4094c..855181d2 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -95,6 +95,8 @@ public class ModRecipes 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.FEATHER), new ItemStack(Items.APPLE), new AlchemyArrayEffectTeleport("teleport"), new StaticAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/teleportation.png"))); + 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"))); } diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/teleportation.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/teleportation.png new file mode 100644 index 0000000000000000000000000000000000000000..de03c724053eb312de67d10a59dae0b898fab85d GIT binary patch literal 50896 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

        126#V~Flo@M-s+D$Ug;bu=zVIrM8zwLNl3 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 literal 0 HcmV?d00001 From 395f1188e7ea1666658c6be4a5141e3fe8ca1bd7 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 27 Feb 2018 18:19:41 -0800 Subject: [PATCH 212/595] Put fast miner array back up at Haste 3 It was ~~our~~ my fault. --- .../WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java index 517b0d27..2a4371b2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -28,7 +28,7 @@ public class ItemSigilFastMiner extends ItemSigilToggleableBase { public boolean performArrayEffect(World world, BlockPos pos) { double radius = 10; int ticks = 600; - int potionPotency = 1; + int potionPotency = 2; AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, bb); From 91d7f23b4f2e628054cac37822dd934762a8a0d9 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 28 Feb 2018 17:53:23 -0800 Subject: [PATCH 213/595] Add API method for registering recipes at proper time The old access to IBloodMagicRecipeRegistrar still exists, but should not be used so mods like CraftTweaker can do their thing. This commit also introduces @BloodMagicPlugin.Inject which will inject the active API instance into an annotated field with the API interface as it's type. These fields are populated during pre init. --- .../bloodmagic/api/BloodMagicPlugin.java | 13 +++ .../bloodmagic/api/IBloodMagicAPI.java | 4 + .../bloodmagic/api/IBloodMagicPlugin.java | 15 ++- .../java/WayofTime/bloodmagic/BloodMagic.java | 3 +- .../api/impl/BloodMagicCorePlugin.java | 12 ++- .../core/RegistrarBloodMagicRecipes.java | 3 + .../WayofTime/bloodmagic/util/PluginUtil.java | 93 ++++++++++++++++--- 7 files changed, 125 insertions(+), 18 deletions(-) diff --git a/src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java b/src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java index 0d2bf397..3cbeb4b9 100644 --- a/src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java +++ b/src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java @@ -13,4 +13,17 @@ import java.lang.annotation.Target; @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 index 776bee6d..11ce4bce 100644 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java +++ b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java @@ -6,6 +6,10 @@ 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 { diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java index 78ac7036..c18d3c1d 100644 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java +++ b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java @@ -7,9 +7,20 @@ package WayofTime.bloodmagic.api; public interface IBloodMagicPlugin { /** - * Register mod content with the API + * Register mod content with the API. Called during {@link net.minecraftforge.fml.common.event.FMLInitializationEvent}. * * @param api The active instance of the {@link IBloodMagicAPI} */ - void register(IBloodMagicAPI api); + 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/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 0b1122f4..ce2f8153 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -73,6 +73,7 @@ public class BloodMagic { configDir = new File(event.getModConfigurationDirectory(), "bloodmagic"); PLUGINS.addAll(PluginUtil.gatherPlugins(event.getAsmData())); + PluginUtil.injectAPIInstances(PluginUtil.gatherInjections(event.getAsmData())); ModTranquilityHandlers.init(); ModDungeons.init(); @@ -84,7 +85,7 @@ public class BloodMagic { public void init(FMLInitializationEvent event) { BloodMagicPacketHandler.init(); - PluginUtil.registerPlugins(PLUGINS); + PluginUtil.handlePluginStep(PluginUtil.RegistrationStep.PLUGIN_REGISTER); ModRecipes.init(); ModRituals.initRituals(); diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 9f98f857..453d5174 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -6,6 +6,7 @@ import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicAPI; import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.api.IBloodMagicRecipeRegistrar; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockDecorative; import WayofTime.bloodmagic.block.enums.BloodRuneType; @@ -78,11 +79,14 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { BlockBloodRune bloodRune = (BlockBloodRune) RegistrarBloodMagicBlocks.BLOOD_RUNE; for (BloodRuneType runeType : BloodRuneType.values()) api.registerAltarComponent(bloodRune.getDefaultState().withProperty(bloodRune.getProperty(), runeType), EnumAltarComponent.BLOODRUNE.name()); + } - RegistrarBloodMagicRecipes.registerAltarRecipes(api.getRecipeRegistrar()); - RegistrarBloodMagicRecipes.registerAlchemyTableRecipes(api.getRecipeRegistrar()); - RegistrarBloodMagicRecipes.registerTartaricForgeRecipes(api.getRecipeRegistrar()); - RegistrarBloodMagicRecipes.registerAlchemyArrayRecipes(api.getRecipeRegistrar()); + @Override + public void registerRecipes(IBloodMagicRecipeRegistrar recipeRegistrar) { + RegistrarBloodMagicRecipes.registerAltarRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); + RegistrarBloodMagicRecipes.registerAlchemyTableRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); + RegistrarBloodMagicRecipes.registerTartaricForgeRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); + RegistrarBloodMagicRecipes.registerAlchemyArrayRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); } private static void handleConfigValues(BloodMagicAPI api) { diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 298b7480..85ceebe4 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -12,6 +12,7 @@ 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.util.PluginUtil; import com.google.common.collect.Sets; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -51,6 +52,8 @@ public class RegistrarBloodMagicRecipes { 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); } public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) { diff --git a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java index 2faf5d38..aeed6037 100644 --- a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java @@ -1,17 +1,23 @@ 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 { @@ -20,7 +26,7 @@ public class PluginUtil { public static List> gatherPlugins(ASMDataTable dataTable) { Stopwatch stopwatch = Stopwatch.createStarted(); List> discoveredAnnotations = Lists.newArrayList(); - Set discoveredPlugins = dataTable.getAll(BloodMagicPlugin.class.getCanonicalName()); + Set discoveredPlugins = dataTable.getAll(BloodMagicPlugin.class.getName()); for (ASMDataTable.ASMData data : discoveredPlugins) { try { @@ -47,20 +53,85 @@ public class PluginUtil { return discoveredAnnotations; } - public static void registerPlugins(List> plugins) { - Stopwatch total = Stopwatch.createStarted(); - int errors = 0; - for (Pair plugin : plugins) { - Stopwatch per = Stopwatch.createStarted(); + @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 { - plugin.getLeft().register(BloodMagicAPI.INSTANCE); + 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) { - errors++; - BMLog.DEFAULT.error("Error loading plugin at {}: {}: {}", plugin.getLeft().getClass(), e.getClass().getSimpleName(), e.getMessage()); + e.printStackTrace(); } - BMLog.API.info("Registered plugin at {} in {}", plugin.getLeft().getClass(), per.stop()); } - BMLog.API.info("Registered {} plugins with {} errors in {}", plugins.size() - errors, errors, total.stop()); + 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; + } } } From b1be099d6785f2b0f7f48394c787346b20733102 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 28 Feb 2018 18:06:39 -0800 Subject: [PATCH 214/595] Update changelog + version --- changelog.txt | 18 +++++++++++++++++- gradle.properties | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/changelog.txt b/changelog.txt index d3583a7a..3a1b7fea 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,7 +1,23 @@ ------------------------------------------------------ Version 2.2.7 ------------------------------------------------------ -- Added the Furnace Array (name pending), which takes health from nearby players to power adjacent furnaces. Not covered by standard medical insurance. +- 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 diff --git a/gradle.properties b/gradle.properties index a94bfbd0..7a442322 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.6 +mod_version=2.2.7 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From 0dd0854bd967b324dbc4a7d1b3f84c628db66781 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 1 Mar 2018 18:23:56 -0800 Subject: [PATCH 215/595] Move all SysOut references to debug logging --- .../java/WayofTime/bloodmagic/BloodMagic.java | 4 +- .../bloodmagic/block/base/BlockString.java | 97 ------------------- .../block/property/PropertyString.java | 41 -------- .../entity/ai/EntityAIPickUpAlly.java | 3 +- .../inversion/InversionPillarHandler.java | 5 +- .../bloodmagic/item/ItemExperienceBook.java | 3 +- .../tracker/StatTrackerGrimReaperSprint.java | 3 +- .../structures/BuildTestStructure.java | 3 +- .../bloodmagic/structures/Dungeon.java | 3 +- .../structures/DungeonStructure.java | 3 +- .../bloodmagic/tile/TileInversionPillar.java | 7 +- 11 files changed, 21 insertions(+), 151 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockString.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/property/PropertyString.java diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index ce2f8153..5ff8bdc4 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -36,14 +36,14 @@ public class 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 CreativeTabs TAB_BM = new CreativeTabs(MODID + ".creativeTab") { @Override public ItemStack getTabIconItem() { return OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK); } }; - public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); - public static final List> PLUGINS = Lists.newArrayList(); public static CreativeTabs TAB_TOMES = new CreativeTabs(MODID + ".creativeTabTome") { @Override public ItemStack getTabIconItem() { diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java deleted file mode 100644 index 7afab9bd..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockString.java +++ /dev/null @@ -1,97 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import WayofTime.bloodmagic.block.property.PropertyString; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.block.state.IBlockState; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.ArrayUtils; - -/** - * Creates a block that has multiple meta-based states. - *

        - * These states will be named after the given string array. Somewhere along the - * way, each value is {@code toLowerCase()}'ed, so the blockstate JSON needs all - * values to be lowercase. - */ -public class BlockString extends Block { - private final int maxMeta; - private final String[] types; - private final PropertyString property; - private final BlockStateContainer realStateContainer; - - public BlockString(Material material, String[] values, String propName) { - super(material); - - this.maxMeta = values.length; - this.types = values; - - this.property = PropertyString.create(propName, values); - this.realStateContainer = createStateContainer(); - setDefaultState(getBlockState().getBaseState()); - } - - public BlockString(Material material, String[] values) { - this(material, values, "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 IBlockState getStateFromMeta(int meta) { - return getDefaultState().withProperty(property, types[meta]); - } - - @Override - public int getMetaFromState(IBlockState state) { - return ArrayUtils.indexOf(types, state.getValue(property)); - } - - @Override - public int damageDropped(IBlockState state) { - return getMetaFromState(state); - } - - @SideOnly(Side.CLIENT) - @Override - public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { - for (int i = 0; i < maxMeta; i++) - subBlocks.add(new ItemStack(this, 1, i)); - } - - protected BlockStateContainer createStateContainer() { - System.out.println(""); - BlockStateContainer ctn = new BlockStateContainer.Builder(this).add(property).build(); - System.out.println("Number of states: " + ctn.getValidStates().size()); - return ctn; - } - - public int getMaxMeta() { - return maxMeta; - } - - public String[] getTypes() { - return types; - } - - public PropertyString getProperty() { - return property; - } - - public BlockStateContainer getRealStateContainer() { - return realStateContainer; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/property/PropertyString.java b/src/main/java/WayofTime/bloodmagic/block/property/PropertyString.java deleted file mode 100644 index 1706dcb4..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/property/PropertyString.java +++ /dev/null @@ -1,41 +0,0 @@ -package WayofTime.bloodmagic.block.property; - -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableSet; -import net.minecraft.block.properties.PropertyHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.Collection; - -public class PropertyString extends PropertyHelper { - private final ImmutableSet allowedValues; - - protected PropertyString(String name, String[] values) { - super(name, String.class); - allowedValues = ImmutableSet.copyOf(values); - } - - @SideOnly(Side.CLIENT) - public Optional parseValue(String value) { - return allowedValues.contains(value) ? Optional.of(value) : Optional.absent(); - } - - @Override - public Collection getAllowedValues() { - return allowedValues; - } - - public String getName0(String value) { - return value; - } - - @Override - public String getName(String value) { - return this.getName0(value); - } - - public static PropertyString create(String name, String[] values) { - return new PropertyString(name, values); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java index bb120f4a..eb69d601 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; +import WayofTime.bloodmagic.util.BMLog; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.pathfinding.Path; @@ -142,7 +143,7 @@ public class EntityAIPickUpAlly extends EntityAIBase { double d0 = this.getAttackReachSqr(potentialPickup); if (distance <= d0 && this.attackTick <= 0 && !potentialPickup.isRiding()) { - System.out.println("Hai!"); + BMLog.DEBUG.info("Hai!"); potentialPickup.startRiding(this.entity, true); } } diff --git a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java index b1b2517b..e988ba1f 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java @@ -1,6 +1,7 @@ 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; @@ -63,7 +64,7 @@ public class InversionPillarHandler { //Assume that it has been added already. private static void onPillarAdded(World world, EnumDemonWillType type, BlockPos pos) { - System.out.println("Adding..."); + BMLog.DEBUG.info("Adding..."); List closePosList = new ArrayList(); int dim = world.provider.getDimension(); @@ -114,7 +115,7 @@ public class InversionPillarHandler { } private static void onPillarRemoved(World world, EnumDemonWillType type, BlockPos pos) { - System.out.println("Removing..."); + BMLog.DEBUG.info("Removing..."); int dim = world.provider.getDimension(); if (nearPillarMap.containsKey(dim)) { Map>> willMap = nearPillarMap.get(dim); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 9b1bd3f3..10c4776b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -76,7 +77,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { int neededExp = (int) Math.ceil((1 - progress) * expToNext); float containedExp = (float) getStoredExperience(stack); - System.out.println("Needed: " + neededExp + ", contained: " + containedExp + ", exp to next: " + expToNext); + BMLog.DEBUG.info("Needed: " + neededExp + ", contained: " + containedExp + ", exp to next: " + expToNext); if (containedExp >= neededExp) { setStoredExperience(stack, containedExp - neededExp); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java index 3d562a37..9a3830ad 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java @@ -5,6 +5,7 @@ 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.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -102,7 +103,7 @@ public class StatTrackerGrimReaperSprint extends StatTracker { StatTracker tracker = armour.getTracker(BloodMagic.MODID + ".tracker.grimReaper"); if (tracker instanceof StatTrackerGrimReaperSprint) { ((StatTrackerGrimReaperSprint) tracker).totalDeaths++; - System.out.println(((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/structures/BuildTestStructure.java b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java index 58b52194..bf1d7826 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java @@ -1,6 +1,7 @@ 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; @@ -25,7 +26,7 @@ public class BuildTestStructure { Template template = templatemanager.getTemplate(minecraftserver, resource); if (template == null) { - System.out.println("Invalid template for location: " + resource); + BMLog.DEBUG.warn("Invalid template for location: " + resource); return false; } diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index 3ca1a305..c0137c5d 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.structures; import WayofTime.bloodmagic.ritual.data.AreaDescriptor; +import WayofTime.bloodmagic.util.BMLog; import net.minecraft.util.EnumFacing; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; @@ -131,7 +132,7 @@ public class Dungeon { long endTime = System.nanoTime(); long duration = (endTime - startTime); //divide by 1000000 to get milliseconds. - System.out.println("Duration: " + duration + "(ns), " + duration / 1000000 + "(ms)"); + BMLog.DEBUG.info("Duration: " + duration + "(ns), " + duration / 1000000 + "(ms)"); //Building what I've got for (Entry> entry : roomMap.entrySet()) { diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java index 8e06624f..198869e6 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java @@ -1,5 +1,6 @@ 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; @@ -27,7 +28,7 @@ public class DungeonStructure { Template template = templatemanager.getTemplate(minecraftserver, resource); if (template == null) { - System.out.println("Invalid template for location: " + resource); + BMLog.DEBUG.warn("Invalid template for location: " + resource); return false; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index 2c77e867..638930a3 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -1,6 +1,7 @@ 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; @@ -118,13 +119,13 @@ public class TileInversionPillar extends TileTicking { currentInfectionRadius++; consecutiveFailedChecks = 0; currentInversion -= inversionToIncreaseRadius; - System.out.println("Increasing radius!"); + 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; - System.out.println("Increasing radius due to being in the air!"); + BMLog.DEBUG.info("Increasing radius due to being in the air!"); } if (currentInfectionRadius >= 8 && currentInversion >= inversionToAddPillar) { @@ -304,7 +305,7 @@ public class TileInversionPillar extends TileTicking { public void handleEvents(float time, Iterable pastEvents) { for (Event event : pastEvents) { - System.out.println("Event: " + event.event() + " " + event.offset() + " " + getPos() + " " + time); + BMLog.DEBUG.info("Event: " + event.event() + " " + event.offset() + " " + getPos() + " " + time); } } From 70d98455b719b952c6aaa80dffb273823dc4b5ad Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 1 Mar 2018 19:27:38 -0800 Subject: [PATCH 216/595] Cleaned up a lot of different inspections --- .../AlchemyArrayEffectAttractor.java | 10 +- .../AlchemyArrayEffectSkeletonTurret.java | 9 +- .../bloodmagic/altar/BloodAltar.java | 1 - .../bloodmagic/altar/EnumAltarTier.java | 2 +- .../bloodmagic/block/BlockAlchemyTable.java | 2 +- .../bloodmagic/block/BlockAltar.java | 6 +- .../bloodmagic/block/BlockDemonCrucible.java | 4 +- .../bloodmagic/block/BlockDemonCrystal.java | 4 +- .../block/BlockDemonCrystallizer.java | 4 +- .../bloodmagic/block/BlockDemonPylon.java | 4 +- .../bloodmagic/block/BlockIncenseAltar.java | 4 +- .../block/BlockInversionPillar.java | 2 +- .../block/BlockInversionPillarEnd.java | 4 +- .../bloodmagic/block/BlockPhantom.java | 4 +- .../block/BlockRitualController.java | 1 - .../bloodmagic/block/BlockSoulForge.java | 4 +- .../bloodmagic/block/BlockSpectral.java | 4 +- .../bloodmagic/block/BlockTeleposer.java | 4 +- .../client/gui/GuiItemRoutingNode.java | 31 ++---- .../client/gui/GuiMasterRoutingNode.java | 3 - .../client/helper/ShaderHelper.java | 20 ++-- .../client/hud/HUDElementDemonWillAura.java | 2 +- .../render/entity/RenderCorruptedChicken.java | 2 +- .../render/entity/RenderCorruptedSheep.java | 6 +- .../render/entity/RenderCorruptedSpider.java | 2 +- .../render/entity/RenderCorruptedZombie.java | 2 +- .../render/entity/RenderEntityMeteor.java | 25 ++--- .../entity/RenderEntitySentientArrow.java | 2 +- .../command/sub/SubCommandBind.java | 3 - .../bloodmagic/compat/guideapi/BookUtils.java | 4 +- .../compat/guideapi/book/CategoryAlchemy.java | 20 ++-- .../guideapi/book/CategoryArchitect.java | 100 +++++++++--------- .../compat/guideapi/book/CategoryDemon.java | 34 +++--- .../compat/guideapi/book/CategoryRitual.java | 12 +-- .../compat/guideapi/book/CategorySpell.java | 2 +- .../guideapi/page/PageAlchemyArray.java | 2 +- .../alchemyTable/AlchemyTableRecipeJEI.java | 2 +- .../ArmourDowngradeRecipeMaker.java | 2 +- .../jei/binding/BindingRecipeMaker.java | 2 +- .../DataProviderRitualController.java | 1 - .../compress/CompressionRegistry.java | 4 +- .../core/data/BMWorldSavedData.java | 2 +- .../registry/AlchemyArrayRecipeRegistry.java | 12 +-- .../registry/AlchemyTableRecipeRegistry.java | 4 +- .../core/registry/AltarRecipeRegistry.java | 5 +- .../core/registry/HarvestRegistry.java | 20 ++-- .../registry/ImperfectRitualRegistry.java | 7 +- .../LivingArmourDowngradeRecipeRegistry.java | 6 +- .../bloodmagic/core/registry/OrbRegistry.java | 6 +- .../core/registry/RitualRegistry.java | 14 +-- .../registry/TartaricForgeRecipeRegistry.java | 4 +- .../bloodmagic/demonAura/WillWorld.java | 2 +- .../demonAura/WorldDemonWillHandler.java | 7 +- .../entity/ai/EntityAIRetreatToHeal.java | 2 +- .../entity/mob/EntityAspectedDemonBase.java | 2 +- .../entity/mob/EntityCorruptedChicken.java | 4 +- .../entity/mob/EntityCorruptedSheep.java | 25 ++--- .../entity/mob/EntityCorruptedSpider.java | 6 +- .../entity/mob/EntityDemonBase.java | 2 +- .../entity/mob/EntitySentientSpecter.java | 16 +-- .../incense/EnumTranquilityType.java | 3 +- .../incense/IncenseAltarHandler.java | 4 +- .../incense/IncenseTranquilityRegistry.java | 2 +- .../inversion/CorruptionHandler.java | 4 +- .../inversion/InversionPillarHandler.java | 32 +++--- .../bloodmagic/item/ItemAltarMaker.java | 4 +- .../bloodmagic/item/ItemArcaneAshes.java | 4 +- .../bloodmagic/item/ItemBoundAxe.java | 2 +- .../bloodmagic/item/ItemBoundPickaxe.java | 2 +- .../bloodmagic/item/ItemBoundShovel.java | 2 +- .../bloodmagic/item/ItemBoundSword.java | 4 +- .../bloodmagic/item/ItemBoundTool.java | 4 +- .../bloodmagic/item/ItemDemonWillGauge.java | 4 +- .../bloodmagic/item/ItemExperienceBook.java | 6 +- .../bloodmagic/item/ItemLavaCrystal.java | 2 - .../bloodmagic/item/ItemPotionFlask.java | 4 +- .../bloodmagic/item/ItemRitualDiviner.java | 18 ++-- .../bloodmagic/item/ItemRitualReader.java | 12 +-- .../item/ItemSacrificialDagger.java | 4 +- .../bloodmagic/item/ItemUpgradeTome.java | 4 +- .../bloodmagic/item/ItemUpgradeTrainer.java | 6 +- .../item/armour/ItemLivingArmour.java | 10 +- .../item/armour/ItemSentientArmour.java | 4 +- .../item/block/base/ItemBlockString.java | 32 ------ .../item/gear/ItemPackSacrifice.java | 4 +- .../item/gear/ItemPackSelfSacrifice.java | 4 +- .../item/routing/ItemFluidRouterFilter.java | 8 +- .../item/routing/ItemNodeRouter.java | 12 +-- .../item/routing/ItemRouterFilter.java | 14 +-- .../bloodmagic/item/sigil/ItemSigilBase.java | 4 +- .../item/sigil/ItemSigilPhantomBridge.java | 13 +-- .../item/sigil/ItemSigilToggleableBase.java | 4 +- .../item/soul/ItemSentientArmourGem.java | 2 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 6 +- .../item/soul/ItemSentientPickaxe.java | 6 +- .../item/soul/ItemSentientShovel.java | 6 +- .../item/soul/ItemSentientSword.java | 6 +- .../bloodmagic/item/soul/ItemSoulGem.java | 4 +- .../bloodmagic/item/soul/ItemSoulSnare.java | 6 +- .../bloodmagic/livingArmour/LivingArmour.java | 8 +- .../livingArmour/LivingArmourHandler.java | 9 +- .../LivingArmourUpgradeDigSlowdown.java | 2 +- .../LivingArmourUpgradeMeleeDecrease.java | 2 +- .../LivingArmourUpgradeSlowness.java | 2 +- .../tracker/StatTrackerArrowProtect.java | 4 +- .../tracker/StatTrackerArrowShot.java | 4 +- .../tracker/StatTrackerCriticalStrike.java | 4 +- .../tracker/StatTrackerDigging.java | 4 +- .../tracker/StatTrackerExperience.java | 4 +- .../tracker/StatTrackerFallProtect.java | 4 +- .../tracker/StatTrackerFireResist.java | 2 +- .../livingArmour/tracker/StatTrackerFood.java | 4 +- .../tracker/StatTrackerGraveDigger.java | 4 +- .../tracker/StatTrackerGrimReaperSprint.java | 4 +- .../tracker/StatTrackerHealthboost.java | 4 +- .../livingArmour/tracker/StatTrackerJump.java | 4 +- .../tracker/StatTrackerMeleeDamage.java | 4 +- .../tracker/StatTrackerMovement.java | 6 +- .../tracker/StatTrackerNightSight.java | 4 +- .../tracker/StatTrackerPhysicalProtect.java | 4 +- .../tracker/StatTrackerPoison.java | 2 +- .../tracker/StatTrackerRepairing.java | 4 +- .../tracker/StatTrackerSelfSacrifice.java | 4 +- .../tracker/StatTrackerSolarPowered.java | 4 +- .../tracker/StatTrackerSprintAttack.java | 4 +- .../tracker/StatTrackerStepAssist.java | 6 +- .../upgrade/LivingArmourUpgradeDigging.java | 2 +- .../LivingArmourUpgradeHealthboost.java | 2 +- .../LivingArmourUpgradeKnockbackResist.java | 2 +- .../LivingArmourUpgradeMeleeDamage.java | 2 +- .../upgrade/LivingArmourUpgradeSpeed.java | 2 +- .../bloodmagic/potion/BMPotionUtils.java | 2 +- .../bloodmagic/proxy/ClientProxy.java | 7 -- .../recipe/LivingArmourDowngradeRecipe.java | 12 +-- .../recipe/TartaricForgeRecipe.java | 31 +++--- .../AlchemyTableDyeableRecipe.java | 4 +- .../AlchemyTablePotionAugmentRecipe.java | 12 +-- .../AlchemyTablePotionRecipe.java | 10 +- .../alchemyTable/AlchemyTableRecipe.java | 12 +-- .../bloodmagic/registry/ModRecipes.java | 10 +- .../bloodmagic/ritual/RitualAltarBuilder.java | 6 +- .../bloodmagic/ritual/RitualAnimalGrowth.java | 2 +- .../bloodmagic/ritual/RitualArmourEvolve.java | 2 +- .../bloodmagic/ritual/RitualCobblestone.java | 2 +- .../bloodmagic/ritual/RitualContainment.java | 5 +- .../bloodmagic/ritual/RitualCrushing.java | 8 +- .../ritual/RitualCrystalHarvest.java | 2 +- .../bloodmagic/ritual/RitualExpulsion.java | 5 +- .../ritual/RitualFeatheredKnife.java | 4 +- .../bloodmagic/ritual/RitualFelling.java | 4 +- .../bloodmagic/ritual/RitualForsakenSoul.java | 8 +- .../bloodmagic/ritual/RitualFullStomach.java | 4 +- .../bloodmagic/ritual/RitualGreenGrove.java | 2 +- .../bloodmagic/ritual/RitualHarvest.java | 2 +- .../bloodmagic/ritual/RitualInterdiction.java | 5 +- .../bloodmagic/ritual/RitualJumping.java | 2 +- .../bloodmagic/ritual/RitualLava.java | 2 +- .../ritual/RitualLivingArmourDowngrade.java | 30 +++--- .../bloodmagic/ritual/RitualMagnetic.java | 11 +- .../bloodmagic/ritual/RitualMeteor.java | 2 +- .../bloodmagic/ritual/RitualPlacer.java | 2 +- .../bloodmagic/ritual/RitualPortal.java | 2 +- .../bloodmagic/ritual/RitualPump.java | 2 +- .../bloodmagic/ritual/RitualRegeneration.java | 2 +- .../bloodmagic/ritual/RitualSpeed.java | 2 +- .../bloodmagic/ritual/RitualSuppression.java | 2 +- .../ritual/RitualUpgradeRemove.java | 2 +- .../bloodmagic/ritual/RitualWater.java | 2 +- .../ritual/RitualWellOfSuffering.java | 2 +- .../bloodmagic/ritual/RitualZephyr.java | 2 +- .../ritual/data/AreaDescriptor.java | 18 ++-- .../ritual/data/EnumRitualReaderState.java | 3 +- .../bloodmagic/ritual/data/Ritual.java | 12 +-- .../harvest/HarvestHandlerPlantable.java | 4 +- .../ritual/harvest/HarvestHandlerStem.java | 2 +- .../ritual/harvest/HarvestHandlerTall.java | 2 +- .../ritual/portal/LocationsHandler.java | 4 +- .../routing/RoutingFluidFilter.java | 4 +- .../bloodmagic/routing/TestItemFilter.java | 8 +- .../bloodmagic/soul/DemonWillHolder.java | 2 +- .../bloodmagic/structures/Dungeon.java | 12 +-- .../bloodmagic/structures/DungeonRoom.java | 10 +- .../structures/DungeonRoomRegistry.java | 2 +- .../bloodmagic/structures/DungeonUtil.java | 2 +- .../bloodmagic/teleport/TeleportQueue.java | 2 +- .../teleport/TeleporterBloodMagic.java | 2 +- .../bloodmagic/tile/TileAlchemyArray.java | 1 - .../bloodmagic/tile/TileAlchemyTable.java | 4 +- .../bloodmagic/tile/TileDemonCrucible.java | 2 +- .../bloodmagic/tile/TileIncenseAltar.java | 8 +- .../bloodmagic/tile/TileInversionPillar.java | 3 +- .../tile/TileMasterRitualStone.java | 10 +- .../WayofTime/bloodmagic/tile/TileMimic.java | 4 +- .../tile/TilePurificationAltar.java | 2 +- .../bloodmagic/tile/TileSoulForge.java | 2 +- .../tile/routing/TileMasterRoutingNode.java | 34 +++--- .../tile/routing/TileRoutingNode.java | 2 +- .../WayofTime/bloodmagic/util/ChatUtil.java | 7 +- .../bloodmagic/util/ItemStackWrapper.java | 4 +- .../java/WayofTime/bloodmagic/util/Utils.java | 6 +- .../util/handler/event/ClientHandler.java | 8 +- .../util/handler/event/CraftingHandler.java | 2 +- .../util/handler/event/GenericHandler.java | 13 +-- .../util/handler/event/WillHandler.java | 2 +- .../bloodmagic/util/helper/NetworkHelper.java | 2 - .../bloodmagic/util/helper/NumeralHelper.java | 2 +- .../bloodmagic/util/helper/TextHelper.java | 4 +- 207 files changed, 603 insertions(+), 731 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java index 9dc68b22..9d8d63d5 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -28,7 +28,7 @@ import java.util.*; */ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { private FakePlayer target; - private Set tracking = new HashSet(); + private Set tracking = new HashSet<>(); private int counter = 0; private int maxMobsAttracted = 10000; @@ -48,9 +48,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { BlockPos pos = tile.getPos(); counter++; if (counter < 10) { - Iterator itr = tracking.iterator(); - while (itr.hasNext()) { - EntityLiving ent = itr.next(); + for (EntityLiving ent : tracking) { onEntityTick(pos, ent); } @@ -61,7 +59,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { World world = tile.getWorld(); - Set trackingThisTick = new HashSet(); + Set trackingThisTick = new HashSet<>(); List entsInBounds = world.getEntitiesWithinAABB(EntityLiving.class, getBounds(pos)); for (EntityLiving ent : entsInBounds) { @@ -268,7 +266,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { private void cancelCurrentTasks(EntityLiving ent) { Iterator iterator = ent.tasks.taskEntries.iterator(); - List currentTasks = new ArrayList(); + List currentTasks = new ArrayList<>(); while (iterator.hasNext()) { EntityAITaskEntry entityaitaskentry = iterator.next(); if (entityaitaskentry != null) { diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java index 6f1fd59d..d297eb60 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java @@ -25,12 +25,7 @@ import java.util.List; * Credits for the initial code go to Crazy Pants of EIO. */ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { - public static Predicate checkSkeleton = new Predicate() { - @Override - public boolean apply(EntityMob input) { - return !(input instanceof EntitySkeleton); - } - }; + public static Predicate checkSkeleton = input -> !(input instanceof EntitySkeleton); private EntitySkeleton turret; public AlchemyArrayEffectSkeletonTurret(String key) { @@ -105,7 +100,7 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { private void cancelCurrentTargetTasks(EntityLiving entity) { Iterator iterator = entity.targetTasks.taskEntries.iterator(); - List currentTasks = new ArrayList(); + List currentTasks = new ArrayList<>(); while (iterator.hasNext()) { EntityAITaskEntry entityaitaskentry = iterator.next(); if (entityaitaskentry != null)// && entityaitaskentry.action instanceof EntityAITarget) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 2da8895d..f55108ca 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -14,7 +14,6 @@ import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; import com.google.common.base.Enums; -import com.google.common.base.Strings; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java index 4eaf1714..0478db4b 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java @@ -122,7 +122,7 @@ public enum EnumAltarTier { public static final int MAXTIERS = values().length; - ArrayList altarComponents = new ArrayList(); + ArrayList altarComponents = new ArrayList<>(); public void buildComponents() { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java index e3b768f0..8d9c9b8f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -25,7 +25,7 @@ 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", EnumFacing.class); + public static final PropertyEnum DIRECTION = PropertyEnum.create("direction", EnumFacing.class); public BlockAlchemyTable() { super(Material.ROCK); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 7f9d2236..679ae793 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -164,8 +164,8 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } @@ -173,7 +173,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl @Override public List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state) { - List docs = new ArrayList(); + List docs = new ArrayList<>(); IBloodAltar altar = ((IBloodAltar) world.getTileEntity(pos)); Pair missingBlock = BloodAltar.getAltarMissingBlock(world, pos, altar.getTier().toInt()); if (missingBlock != null) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 0d61ac9e..1bcbbc80 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -101,8 +101,8 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index ddea0501..fdb13d22 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -27,8 +27,8 @@ import java.util.Random; public class BlockDemonCrystal extends Block { 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", EnumFacing.class); + public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumDemonWillType.class); + public static final PropertyEnum ATTACHED = PropertyEnum.create("attached", EnumFacing.class); public BlockDemonCrystal() { super(Material.ROCK); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java index 0b255c05..8ed12395 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java @@ -69,8 +69,8 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java index 28abe0f5..a761816b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -62,8 +62,8 @@ public class BlockDemonPylon extends BlockContainer implements IVariantProvider @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java index af051063..87048b65 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -85,8 +85,8 @@ public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlo @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java index 03040157..e5b3b04d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java @@ -74,7 +74,7 @@ public class BlockInversionPillar extends BlockEnum { @Override public List> getVariants() { - List> ret = new ArrayList>(); + List> ret = new ArrayList<>(); for (int i = 0; i < this.getTypes().length; i++) ret.add(Pair.of(i, "static=false,type=" + this.getTypes()[i])); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java index 9b0e3067..7fb5b5d5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java @@ -55,9 +55,9 @@ public class BlockInversionPillarEnd extends BlockEnum impleme @Override public List> getVariants() { - List> ret = new ArrayList>(); + List> ret = new ArrayList<>(); for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair(i, "type=" + this.getTypes()[i])); + ret.add(new ImmutablePair<>(i, "type=" + this.getTypes()[i])); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java index b488e046..6744b025 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java @@ -86,8 +86,8 @@ public class BlockPhantom extends Block implements IVariantProvider { @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 2824b6f0..a4405cf6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -14,7 +14,6 @@ import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.tile.TileImperfectRitualStone; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import amerifrance.guideapi.api.IGuideLinked; -import com.google.common.base.Strings; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index 7b8cc730..e4a0a271 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -99,8 +99,8 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java index 6aa45663..2aa70bea 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -109,8 +109,8 @@ public class BlockSpectral extends Block implements IVariantProvider { @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index 4df0bbe5..5ac1eaf1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -66,8 +66,8 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java index ffba0f12..e879512a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -25,15 +25,6 @@ import java.io.IOException; @SideOnly(Side.CLIENT) public class GuiItemRoutingNode extends GuiContainer { - private GuiButton downButton; - private GuiButton upButton; - private GuiButton northButton; - private GuiButton southButton; - private GuiButton westButton; - private GuiButton eastButton; - private GuiButton incrementButton; - private GuiButton decrementButton; - private GuiTextField textBox; private TileFilteredRoutingNode inventory; @@ -65,14 +56,14 @@ public class GuiItemRoutingNode extends GuiContainer { top = (this.height - this.ySize) / 2; this.buttonList.clear(); - this.buttonList.add(this.downButton = new GuiButton(0, left + 176, top + 14, 18, 18, "D")); - this.buttonList.add(this.upButton = new GuiButton(1, left + 176, top + 32, 18, 18, "U")); - this.buttonList.add(this.northButton = new GuiButton(2, left + 176, top + 50, 18, 18, "N")); - this.buttonList.add(this.southButton = new GuiButton(3, left + 176, top + 68, 18, 18, "S")); - this.buttonList.add(this.westButton = new GuiButton(4, left + 176, top + 86, 18, 18, "W")); - this.buttonList.add(this.eastButton = new GuiButton(5, left + 176, top + 104, 18, 18, "E")); - this.buttonList.add(this.incrementButton = new GuiButton(6, left + 160, top + 50, 10, 18, ">")); - this.buttonList.add(this.decrementButton = new GuiButton(7, left + 132, top + 50, 10, 18, "<")); + this.buttonList.add(new GuiButton(0, left + 176, top + 14, 18, 18, "D")); + this.buttonList.add(new GuiButton(1, left + 176, top + 32, 18, 18, "U")); + this.buttonList.add(new GuiButton(2, left + 176, top + 50, 18, 18, "N")); + this.buttonList.add(new GuiButton(3, left + 176, top + 68, 18, 18, "S")); + this.buttonList.add(new GuiButton(4, left + 176, top + 86, 18, 18, "W")); + this.buttonList.add(new GuiButton(5, left + 176, top + 104, 18, 18, "E")); + this.buttonList.add(new GuiButton(6, left + 160, top + 50, 10, 18, ">")); + this.buttonList.add(new GuiButton(7, left + 132, top + 50, 10, 18, "<")); disableDirectionalButton(inventory.currentActiveSlot); this.textBox = new GuiTextField(0, this.fontRenderer, left + 94, top + 37, 70, 12); @@ -92,7 +83,7 @@ public class GuiItemRoutingNode extends GuiContainer { try { Integer testVal = Integer.decode(str); if (testVal != null) { - amount = testVal.intValue(); + amount = testVal; } } catch (NumberFormatException d) { } @@ -120,7 +111,7 @@ public class GuiItemRoutingNode extends GuiContainer { if (container.lastGhostSlotClicked != -1) { Slot slot = container.getSlot(container.lastGhostSlotClicked + 1); ItemStack stack = slot.getStack(); - if (stack != null) { + if (!stack.isEmpty()) { int amount = GhostItemHelper.getItemGhostAmount(stack); this.textBox.setText("" + amount); } else { @@ -173,7 +164,7 @@ public class GuiItemRoutingNode extends GuiContainer { String s = ""; if (container.lastGhostSlotClicked != -1) { ItemStack clickedStack = inventorySlots.getSlot(1 + container.lastGhostSlotClicked).getStack(); - if (clickedStack != null) { + if (!clickedStack.isEmpty()) { s = clickedStack.getDisplayName(); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java index 3da9b255..c64d1b21 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java @@ -6,20 +6,17 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class GuiMasterRoutingNode extends GuiContainer { - private TileEntity inventory; public GuiMasterRoutingNode(InventoryPlayer playerInventory, IInventory tileRoutingNode) { super(new ContainerMasterRoutingNode(playerInventory, tileRoutingNode)); this.xSize = 216; this.ySize = 216; - inventory = (TileEntity) tileRoutingNode; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java b/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java index a268d9f9..950af569 100644 --- a/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java +++ b/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java @@ -1,13 +1,3 @@ -/** - * 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)] - */ package WayofTime.bloodmagic.client.helper; import net.minecraft.client.renderer.OpenGlHelper; @@ -22,6 +12,16 @@ 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; diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java index 72f5f05f..20003b61 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java @@ -15,7 +15,7 @@ import java.util.ArrayList; import java.util.List; public class HUDElementDemonWillAura extends HUDElement { - protected List barOrder = new ArrayList(); + protected List barOrder = new ArrayList<>(); public HUDElementDemonWillAura() { super(5, 5, RenderGameOverlayEvent.ElementType.HOTBAR); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java index 44db0152..6db0f642 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java @@ -16,7 +16,7 @@ public class RenderCorruptedChicken extends RenderLiving public RenderCorruptedChicken(RenderManager renderManagerIn) { super(renderManagerIn, new ModelCorruptedChicken(0), 0.3f); - this.addLayer(new LayerWill(this, new ModelCorruptedChicken(1.1f))); + this.addLayer(new LayerWill<>(this, new ModelCorruptedChicken(1.1f))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java index 11529425..d8024973 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java @@ -19,9 +19,9 @@ public class RenderCorruptedSheep extends RenderLiving { public RenderCorruptedSheep(RenderManager 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()); + this.addLayer(new LayerWill<>(this, new ModelCorruptedSheep(1.1f))); + this.addLayer(new LayerWill<>(this, new ModelCorruptedSheep2(1.1f))); + this.addLayer(new LayerAlchemyCircle<>()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java index 343a459c..bef6c894 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java @@ -18,7 +18,7 @@ public class RenderCorruptedSpider extends RenderLiving { public RenderCorruptedSpider(RenderManager renderManagerIn) { super(renderManagerIn, new ModelSpider(), 1.0F); this.addLayer(new LayerCorruptedSpiderEyes(this)); - this.addLayer(new LayerWill(this, new ModelCorruptedSpider(1.1f))); + this.addLayer(new LayerWill<>(this, new ModelCorruptedSpider(1.1f))); } protected float getDeathMaxRotation(EntityCorruptedSpider entityLivingBaseIn) { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java index 57475a5f..f7ffad16 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java @@ -38,7 +38,7 @@ public class RenderCorruptedZombie extends RenderBiped { } this.layerRenderers.remove(layerbipedarmor); - this.addLayer(new LayerWill(this, new ModelZombie(1.2f, false))); + this.addLayer(new LayerWill<>(this, new ModelZombie(1.2f, false))); } /** diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java index f1cf5f9f..77c9cdbc 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java @@ -10,9 +10,11 @@ import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.util.ResourceLocation; public class RenderEntityMeteor extends Render { - private static final ResourceLocation resource = new ResourceLocation(BloodMagic.MODID, "textures/models/Meteor.png"); + + private static final ResourceLocation TEXTURE = new ResourceLocation(BloodMagic.MODID, "textures/models/Meteor.png"); + private static final float SCALE = 1; + public ModelBase model = new ModelMeteor(); - private float scale = 1; public RenderEntityMeteor(RenderManager renderManagerIn) { super(renderManagerIn); @@ -20,24 +22,11 @@ public class RenderEntityMeteor extends Render { @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(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(TextureMap.LOCATION_BLOCKS_TEXTURE); -// this.renderItem.renderItem(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), ItemCameraTransforms.TransformType.GROUND); -// GlStateManager.disableRescaleNormal(); -// GlStateManager.popMatrix(); - GlStateManager.pushMatrix(); GlStateManager.translate((float) x, (float) y, (float) z); GlStateManager.enableRescaleNormal(); - GlStateManager.scale(scale, scale, scale); - this.bindTexture(this.getEntityTexture(entity)); -// GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * f1, 0.0F, 1.0F, 0.0F); -// GL11.glRotatef(180.0f - entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1, 1.0F, 0.0F, 0.0f); + GlStateManager.scale(SCALE, SCALE, SCALE); + this.bindTexture(TEXTURE); model.render(entity, 0, (float) x, (float) y, (float) z, entityYaw, partialTicks); GlStateManager.disableRescaleNormal(); GlStateManager.popMatrix(); @@ -47,6 +36,6 @@ public class RenderEntityMeteor extends Render { @Override protected ResourceLocation getEntityTexture(EntityMeteor entity) { - return resource; + return TEXTURE; } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java index c0a2a618..3e522850 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java @@ -37,7 +37,7 @@ public class RenderEntitySentientArrow extends Render { int i = 0; float f = 0.0F; float f1 = 0.5F; - float f2 = (float) (0 + i * 10) / 32.0F; + float f2 = (float) (i * 10) / 32.0F; float f3 = (float) (5 + i * 10) / 32.0F; float f4 = 0.0F; float f5 = 0.15625F; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index 7548e3ec..5547ac6d 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -1,12 +1,9 @@ package WayofTime.bloodmagic.command.sub; import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.helper.BindableHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java index 80b78c00..c8b7e847 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java @@ -22,7 +22,7 @@ public class BookUtils { AlchemyCircleRenderer renderer = AlchemyArrayRecipeRegistry.getAlchemyCircleRenderer(inputStack, catalystStack); if (renderer instanceof DualAlchemyCircleRenderer) { - List resources = new ArrayList(); + List resources = new ArrayList<>(); resources.add(((DualAlchemyCircleRenderer) renderer).arrayResource); resources.add(((DualAlchemyCircleRenderer) renderer).secondaryArrayResource); return new PageAlchemyArray(resources, inputStack, catalystStack); @@ -43,7 +43,7 @@ public class BookUtils { AlchemyCircleRenderer renderer = AlchemyArrayRecipeRegistry.getAlchemyCircleRenderer(inputStack, catalystStack); if (renderer != null) { if (renderer instanceof DualAlchemyCircleRenderer) { - List resources = new ArrayList(); + List resources = new ArrayList<>(); resources.add(((DualAlchemyCircleRenderer) renderer).arrayResource); resources.add(((DualAlchemyCircleRenderer) renderer).secondaryArrayResource); return new PageAlchemyArray(resources, inputStack, catalystStack, outputStack); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index 9eb03a5b..a167ea9b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -26,14 +26,14 @@ public class CategoryAlchemy { public static Map buildCategory() { - Map entries = new LinkedHashMap(); + Map entries = new LinkedHashMap<>(); String keyBase = "guide." + BloodMagic.MODID + ".entry.alchemy."; - List introPages = new ArrayList(); + 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(); + List ashPages = new ArrayList<>(); TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); if (ashRecipe != null) @@ -43,7 +43,7 @@ public class CategoryAlchemy 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(); + List furnacePages = new ArrayList<>(); PageAlchemyArray furnaceRecipePage = BookUtils.getAlchemyPage("furnace"); if (furnaceRecipePage != null) @@ -53,7 +53,7 @@ public class CategoryAlchemy 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(); + List speedPages = new ArrayList<>(); PageAlchemyArray speedRecipePage = BookUtils.getAlchemyPage("movement"); if (speedRecipePage != null) @@ -63,7 +63,7 @@ public class CategoryAlchemy 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 updraftPages = new ArrayList(); + List updraftPages = new ArrayList<>(); PageAlchemyArray updraftRecipePage = BookUtils.getAlchemyPage("updraft"); if (updraftRecipePage != null) @@ -73,7 +73,7 @@ public class CategoryAlchemy 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(); + List turretPages = new ArrayList<>(); PageAlchemyArray turretRecipePage = BookUtils.getAlchemyPage("skeletonTurret"); if (turretRecipePage != null) @@ -83,7 +83,7 @@ public class CategoryAlchemy 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(); + List bouncePages = new ArrayList<>(); PageAlchemyArray bounceRecipePage = BookUtils.getAlchemyPage("bounce"); if (bounceRecipePage != null) @@ -93,12 +93,12 @@ public class CategoryAlchemy 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 buffPages = new ArrayList(); + 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(); + List fastMinerPages = new ArrayList<>(); PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage("fastMiner"); if (fastMinerRecipePage != null) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index 9648211e..946dd171 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -31,15 +31,15 @@ import java.util.Map.Entry; public class CategoryArchitect { public static Map buildCategory() { - Map entries = new LinkedHashMap(); + Map entries = new LinkedHashMap<>(); String keyBase = "guide." + BloodMagic.MODID + ".entry.architect."; - List introPages = new ArrayList(); + 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(); + List altarPages = new ArrayList<>(); IRecipe altarRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ALTAR)); if (altarRecipe != null) { @@ -56,7 +56,7 @@ public class CategoryArchitect { 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 ashPages = new ArrayList(); + List ashPages = new ArrayList<>(); TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); if (ashRecipe != null) { @@ -65,7 +65,7 @@ public class CategoryArchitect { 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(); + List divinationPages = new ArrayList<>(); PageAlchemyArray divinationRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION)); if (divinationRecipePage != null) { @@ -75,12 +75,12 @@ public class CategoryArchitect { 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(); + 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(); + List weakorbPages = new ArrayList<>(); weakorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakorb" + ".info.1"), 370)); AltarRecipe weakorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK)); @@ -91,7 +91,7 @@ public class CategoryArchitect { 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(); + List incensePages = new ArrayList<>(); IRecipe incenseRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.INCENSE_ALTAR)); if (incenseRecipe != null) { @@ -108,7 +108,7 @@ public class CategoryArchitect { 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(); + List runePages = new ArrayList<>(); IRecipe runeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 0)); if (runeRecipe != null) { @@ -118,7 +118,7 @@ public class CategoryArchitect { 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(); + List inspectPages = new ArrayList<>(); AltarRecipe inspectRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK)); if (inspectRecipe != null) { @@ -128,7 +128,7 @@ public class CategoryArchitect { 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(); + List speedRunePages = new ArrayList<>(); IRecipe speedRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1)); if (speedRecipe != null) { @@ -138,7 +138,7 @@ public class CategoryArchitect { 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(); + List waterPages = new ArrayList<>(); TartaricForgeRecipe waterRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_WATER.getStack()); if (waterRecipe != null) { @@ -153,7 +153,7 @@ public class CategoryArchitect { 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(); + List lavaPages = new ArrayList<>(); TartaricForgeRecipe lavaRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_LAVA.getStack()); if (lavaRecipe != null) { @@ -168,7 +168,7 @@ public class CategoryArchitect { 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(); + List lavaCrystalPages = new ArrayList<>(); IRecipe lavaCrystalRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL)); if (lavaCrystalRecipe != null) { @@ -178,7 +178,7 @@ public class CategoryArchitect { 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(); + List apprenticeorbPages = new ArrayList<>(); AltarRecipe apprenticeorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE)); if (apprenticeorbRecipe != null) { @@ -188,7 +188,7 @@ public class CategoryArchitect { 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 daggerPages = new ArrayList(); + List daggerPages = new ArrayList<>(); AltarRecipe daggerOfSacrificeRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE)); if (daggerOfSacrificeRecipe != null) { @@ -198,7 +198,7 @@ public class CategoryArchitect { 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 runeSacrificePages = new ArrayList(); + List runeSacrificePages = new ArrayList<>(); IRecipe runeSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3)); if (runeSacrificeRecipe != null) { @@ -208,7 +208,7 @@ public class CategoryArchitect { 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(); + List runeSelfSacrificePages = new ArrayList<>(); IRecipe runeSelfSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); if (runeSelfSacrificeRecipe != null) { @@ -218,7 +218,7 @@ public class CategoryArchitect { 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(); + List holdingPages = new ArrayList<>(); TartaricForgeRecipe holdingRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_HOLDING.getStack()); if (holdingRecipe != null) { @@ -233,7 +233,7 @@ public class CategoryArchitect { 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(); + List airPages = new ArrayList<>(); TartaricForgeRecipe airRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_AIR.getStack()); if (airRecipe != null) { @@ -248,7 +248,7 @@ public class CategoryArchitect { 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(); + List voidPages = new ArrayList<>(); TartaricForgeRecipe voidRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_VOID.getStack()); if (voidRecipe != null) { @@ -263,7 +263,7 @@ public class CategoryArchitect { 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(); + List greenGrovePages = new ArrayList<>(); TartaricForgeRecipe greenGroveRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_GROWTH.getStack()); if (greenGroveRecipe != null) { @@ -278,7 +278,7 @@ public class CategoryArchitect { 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(); + List fastMinerPages = new ArrayList<>(); TartaricForgeRecipe fastMinerRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_FAST_MINER.getStack()); if (fastMinerRecipe != null) { @@ -293,7 +293,7 @@ public class CategoryArchitect { 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(); + List seerPages = new ArrayList<>(); TartaricForgeRecipe seerRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SIGHT.getStack()); if (seerRecipe != null) { @@ -308,7 +308,7 @@ public class CategoryArchitect { 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(); + List magicianOrbPages = new ArrayList<>(); AltarRecipe magicianOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN)); if (magicianOrbRecipe != null) { @@ -318,7 +318,7 @@ public class CategoryArchitect { 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(); + List capacityPages = new ArrayList<>(); IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); if (capacityRecipe != null) { @@ -328,7 +328,7 @@ public class CategoryArchitect { 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(); + List displacementPages = new ArrayList<>(); IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); if (displacementRecipe != null) { @@ -338,7 +338,7 @@ public class CategoryArchitect { 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(); + List affinityPages = new ArrayList<>(); TartaricForgeRecipe affinityRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_AFFINITY.getStack()); if (affinityRecipe != null) { @@ -353,7 +353,7 @@ public class CategoryArchitect { 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(); + List lampPages = new ArrayList<>(); TartaricForgeRecipe lampRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack()); if (lampRecipe != null) { @@ -368,7 +368,7 @@ public class CategoryArchitect { 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(); + List magnetismPages = new ArrayList<>(); TartaricForgeRecipe magnetismRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_MAGNETISM.getStack()); if (magnetismRecipe != null) { @@ -383,7 +383,7 @@ public class CategoryArchitect { 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(); + List peritiaPages = new ArrayList<>(); IRecipe peritiaRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.EXPERIENCE_TOME)); if (peritiaRecipe != null) { @@ -393,7 +393,7 @@ public class CategoryArchitect { 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(); + List livingArmourPages = new ArrayList<>(); TartaricForgeRecipe bindingRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BINDING.getStack()); if (bindingRecipe != null) { @@ -423,17 +423,17 @@ public class CategoryArchitect { 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(); + 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(); + 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 teleposerPages = new ArrayList(); + List teleposerPages = new ArrayList<>(); AltarRecipe teleposerFocusRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)); if (teleposerFocusRecipe != null) { @@ -448,7 +448,7 @@ public class CategoryArchitect { 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 boundBladePages = new ArrayList(); + List boundBladePages = new ArrayList<>(); PageAlchemyArray boundBladePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD)); if (boundBladePage != null) { @@ -458,7 +458,7 @@ public class CategoryArchitect { 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(); + List boundToolPages = new ArrayList<>(); PageAlchemyArray boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)); if (boundToolPage != null) { @@ -478,12 +478,12 @@ public class CategoryArchitect { 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(); + 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 masterOrbPages = new ArrayList(); + List masterOrbPages = new ArrayList<>(); AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER)); if (magicianOrbRecipe != null) { @@ -493,7 +493,7 @@ public class CategoryArchitect { 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(); + List orbRunePages = new ArrayList<>(); IRecipe orbRuneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 8)); if (orbRuneRecipe != null) { @@ -503,7 +503,7 @@ public class CategoryArchitect { 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(); + List augmentedCapacityPages = new ArrayList<>(); IRecipe augmentedCapacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 7)); if (orbRuneRecipe != null) { @@ -513,7 +513,7 @@ public class CategoryArchitect { 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(); + List chargingPages = new ArrayList<>(); IRecipe chargingRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 10)); if (orbRuneRecipe != null) { @@ -523,7 +523,7 @@ public class CategoryArchitect { 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(); + List accelerationPages = new ArrayList<>(); IRecipe accelerationRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 9)); if (orbRuneRecipe != null) { @@ -533,7 +533,7 @@ public class CategoryArchitect { 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(); + List suppressionPages = new ArrayList<>(); TartaricForgeRecipe suppressionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SUPPRESSION.getStack()); if (suppressionRecipe != null) { @@ -548,7 +548,7 @@ public class CategoryArchitect { 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(); + List hastePages = new ArrayList<>(); TartaricForgeRecipe hasteRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_HASTE.getStack()); if (hasteRecipe != null) { @@ -563,7 +563,7 @@ public class CategoryArchitect { 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(); + List severancePages = new ArrayList<>(); TartaricForgeRecipe severanceRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SEVERANCE.getStack()); if (severanceRecipe != null) { @@ -578,7 +578,7 @@ public class CategoryArchitect { 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(); + List telepositionPages = new ArrayList<>(); TartaricForgeRecipe telepositionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_TELEPOSITION.getStack()); if (telepositionRecipe != null) { @@ -593,7 +593,7 @@ public class CategoryArchitect { 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(); + List compressionPages = new ArrayList<>(); TartaricForgeRecipe compressionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_COMPRESSION.getStack()); if (compressionRecipe != null) { @@ -608,7 +608,7 @@ public class CategoryArchitect { 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(); + List bridgePages = new ArrayList<>(); TartaricForgeRecipe bridgeRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BRIDGE.getStack()); if (bridgeRecipe != null) { @@ -623,7 +623,7 @@ public class CategoryArchitect { 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(); + List mimicPages = new ArrayList<>(); IRecipe mimicRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 1, 1)); if (mimicRecipe != null) { diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java index 92566ab3..eb26e3a4 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java @@ -26,15 +26,15 @@ import java.util.Map.Entry; public class CategoryDemon { //TODO: Add Forge recipe pages public static Map buildCategory() { - Map entries = new LinkedHashMap(); + Map entries = new LinkedHashMap<>(); String keyBase = "guide." + BloodMagic.MODID + ".entry.demon."; - List introPages = new ArrayList(); + 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(); + List snarePages = new ArrayList<>(); snarePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "snare" + ".info.1"), 370)); IRecipe snareRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE)); @@ -45,7 +45,7 @@ public class CategoryDemon { 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(); + List forgePages = new ArrayList<>(); forgePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "forge" + ".info.1"), 370)); IRecipe forgeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE)); @@ -56,7 +56,7 @@ public class CategoryDemon { 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(); + 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) { @@ -65,7 +65,7 @@ public class CategoryDemon { 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(); + 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) { @@ -74,7 +74,7 @@ public class CategoryDemon { 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(); + 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) { @@ -83,16 +83,16 @@ public class CategoryDemon { 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(); + 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(); + 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(); + List routingPages = new ArrayList<>(); TartaricForgeRecipe nodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); if (nodeRecipe != null) { routingPages.add(new PageTartaricForgeRecipe(nodeRecipe)); @@ -118,17 +118,17 @@ public class CategoryDemon { 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(); + 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(); + 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(); + List cruciblePages = new ArrayList<>(); TartaricForgeRecipe crucibleRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRUCIBLE)); if (crucibleRecipe != null) { @@ -138,7 +138,7 @@ public class CategoryDemon { 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(); + List crystallizerPages = new ArrayList<>(); TartaricForgeRecipe crystallizerRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTALLIZER)); if (crystallizerRecipe != null) { @@ -148,7 +148,7 @@ public class CategoryDemon { 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(); + List clusterPages = new ArrayList<>(); TartaricForgeRecipe clusterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL)); if (clusterRecipe != null) { @@ -158,7 +158,7 @@ public class CategoryDemon { 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(); + List pylonPages = new ArrayList<>(); TartaricForgeRecipe pylonRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PYLON)); if (pylonRecipe != null) { @@ -168,7 +168,7 @@ public class CategoryDemon { 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(); + List gaugePages = new ArrayList<>(); TartaricForgeRecipe gaugeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE)); if (gaugeRecipe != null) { diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index ccc59e49..3d77b52c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -28,12 +28,12 @@ public class CategoryRitual { static String keyBase = "guide." + BloodMagic.MODID + ".entry.ritual."; public static Map buildCategory() { - Map entries = new LinkedHashMap(); + Map entries = new LinkedHashMap<>(); addRitualPagesToEntries("intro", entries); addRitualPagesToEntries("basics", entries); - List ritualStonePages = new ArrayList(); + List ritualStonePages = new ArrayList<>(); IRecipe ritualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE)); if (ritualStoneRecipe != null) { @@ -53,7 +53,7 @@ public class CategoryRitual { 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(); + List masterRitualStonePages = new ArrayList<>(); IRecipe masterRitualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 0)); if (masterRitualStoneRecipe != null) { @@ -63,7 +63,7 @@ public class CategoryRitual { 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(); + List activationCrystalPages = new ArrayList<>(); activationCrystalPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "activationCrystal" + ".info.1"), 370)); @@ -75,7 +75,7 @@ public class CategoryRitual { 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(); + List divinerPages = new ArrayList<>(); divinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "diviner" + ".info.1"), 370)); @@ -120,7 +120,7 @@ public class CategoryRitual { } public static void addRitualPagesToEntries(String name, Map entries) { - List pages = new ArrayList(); + 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 index 6c3d17e9..680bffda 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java @@ -9,7 +9,7 @@ import java.util.Map; public class CategorySpell { public static Map buildCategory() { - Map entries = new LinkedHashMap(); + Map entries = new LinkedHashMap<>(); String keyBase = Constants.Mod.DOMAIN + "spell_"; return entries; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java index 8529425f..caa0df9a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java @@ -24,7 +24,7 @@ public class PageAlchemyArray extends Page { public final ItemStack inputStack; public final ItemStack catalystStack; public final ItemStack outputStack; - public List arrayResources = new ArrayList(); + public List arrayResources = new ArrayList<>(); public PageAlchemyArray(List arrayResources, ItemStack inputStack, ItemStack catalystStack, ItemStack outputStack) { this.arrayResources = arrayResources; diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java index 715fb008..ba639936 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java @@ -45,7 +45,7 @@ public class AlchemyTableRecipeJEI implements IRecipeWrapper { @Override public List getTooltipStrings(int mouseX, int mouseY) { - ArrayList ret = new ArrayList(); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java index f7baa13c..90ca286d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java @@ -11,7 +11,7 @@ public class ArmourDowngradeRecipeMaker { @Nonnull public static List getRecipes() { List recipeList = LivingArmourDowngradeRecipeRegistry.getRecipeList(); - ArrayList recipes = new ArrayList(); + ArrayList recipes = new ArrayList<>(); for (LivingArmourDowngradeRecipe recipe : recipeList) recipes.add(new ArmourDowngradeRecipeJEI(recipe)); diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java index db44651e..d921befc 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java @@ -17,7 +17,7 @@ public class BindingRecipeMaker { public static List getRecipes() { Map, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> alchemyArrayRecipeMap = AlchemyArrayRecipeRegistry.getRecipes(); - ArrayList recipes = new ArrayList(); + ArrayList recipes = new ArrayList<>(); for (Map.Entry, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> itemStackAlchemyArrayRecipeEntry : alchemyArrayRecipeMap.entrySet()) { List input = itemStackAlchemyArrayRecipeEntry.getValue().getInput(); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index f246bc48..f5a4b923 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -8,7 +8,6 @@ import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.util.helper.TextHelper; -import joptsimple.internal.Strings; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; diff --git a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java index 280bd784..2d975531 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java @@ -18,8 +18,8 @@ import java.util.Map; * form. */ public class CompressionRegistry { - public static List compressionRegistry = new ArrayList(); - public static Map thresholdMap = new HashMap(); + public static List compressionRegistry = new ArrayList<>(); + public static Map thresholdMap = new HashMap<>(); public static void registerHandler(CompressionHandler handler) { compressionRegistry.add(handler); diff --git a/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java index 0eb2be6a..70338a16 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java @@ -13,7 +13,7 @@ import java.util.UUID; public class BMWorldSavedData extends WorldSavedData { public static final String ID = "BloodMagic-SoulNetworks"; - private Map soulNetworks = new HashMap(); + private Map soulNetworks = new HashMap<>(); public BMWorldSavedData(String id) { super(id); diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java index 36edf7b1..bc28b170 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java @@ -20,7 +20,7 @@ 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(); + private static HashMap effectMap = new HashMap<>(); /** * General case for creating an AlchemyArrayEffect for a given input. @@ -120,7 +120,7 @@ public class AlchemyArrayRecipeRegistry { } 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); + 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) { @@ -132,7 +132,7 @@ public class AlchemyArrayRecipeRegistry { } 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)); + 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) { @@ -151,7 +151,7 @@ public class AlchemyArrayRecipeRegistry { 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); + 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) { @@ -163,7 +163,7 @@ public class AlchemyArrayRecipeRegistry { } 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); + 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) { @@ -250,7 +250,7 @@ public class AlchemyArrayRecipeRegistry { } 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); + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java index 901994a7..d27e99c1 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; public class AlchemyTableRecipeRegistry { - private static List recipeList = new ArrayList(); + private static List recipeList = new ArrayList<>(); public static void registerRecipe(AlchemyTableRecipe recipe) { recipeList.add(recipe); @@ -34,6 +34,6 @@ public class AlchemyTableRecipeRegistry { } public static List getRecipeList() { - return new ArrayList(recipeList); + 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 index 49ab1e77..e52151a5 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.altar.EnumAltarTier; @@ -119,11 +118,11 @@ public class AltarRecipeRegistry { } public AltarRecipe(String inputEntry, ItemStack output, EnumAltarTier 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); + 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, EnumAltarTier 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); + 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, EnumAltarTier tierCheck) { diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java index ab500fd8..9be7251b 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java @@ -8,11 +8,11 @@ import net.minecraft.block.BlockStem; import java.util.*; public class HarvestRegistry { - private static List handlerList = new ArrayList(); - private static Map standardCrops = new HashMap(); - private static Set tallCrops = new HashSet(); - private static Map stemCrops = new HashMap(); - private static Map amplifierMap = new HashMap(); + private static List handlerList = new ArrayList<>(); + private static Map standardCrops = new HashMap<>(); + private static Set tallCrops = new HashSet<>(); + private static Map stemCrops = new HashMap<>(); + private static Map amplifierMap = new HashMap<>(); /** * Registers a handler for the Harvest Ritual to call. @@ -81,22 +81,22 @@ public class HarvestRegistry { } public static List getHandlerList() { - return new ArrayList(handlerList); + return new ArrayList<>(handlerList); } public static Map getStandardCrops() { - return new HashMap(standardCrops); + return new HashMap<>(standardCrops); } public static Set getTallCrops() { - return new HashSet(tallCrops); + return new HashSet<>(tallCrops); } public static Map getStemCrops() { - return new HashMap(stemCrops); + return new HashMap<>(stemCrops); } public static Map getAmplifierMap() { - return new HashMap(amplifierMap); + return new HashMap<>(amplifierMap); } } diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java index c1c0acdf..1cf8922a 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; @@ -12,7 +11,7 @@ import java.util.HashMap; import java.util.Map; public class ImperfectRitualRegistry { - public static final Map enabledRituals = new HashMap(); + public static final Map enabledRituals = new HashMap<>(); private static final BiMap registry = HashBiMap.create(); /** @@ -90,10 +89,10 @@ public class ImperfectRitualRegistry { } public static ArrayList getIds() { - return new ArrayList(registry.keySet()); + return new ArrayList<>(registry.keySet()); } public static ArrayList getRituals() { - return new ArrayList(registry.values()); + return new ArrayList<>(registry.values()); } } diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java index 8360dbd5..61a28fb5 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java @@ -15,8 +15,8 @@ import java.util.Map; import java.util.Map.Entry; public class LivingArmourDowngradeRecipeRegistry { - private static List recipeList = new ArrayList(); - private static Map>> dialogueMap = new HashMap>>(); + private static List recipeList = new ArrayList<>(); + private static Map>> dialogueMap = new HashMap<>(); public static void registerRecipe(LivingArmourDowngradeRecipe recipe) { recipeList.add(recipe); @@ -55,6 +55,6 @@ public class LivingArmourDowngradeRecipeRegistry { } public static List getRecipeList() { - return new ArrayList(recipeList); + 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 5ddbeb3c..d911c303 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java @@ -21,7 +21,7 @@ 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(); + private static List orbs = new ArrayList<>(); public static List getOrbsForTier(int tier) { if (getTierMap().containsKey(tier)) @@ -31,7 +31,7 @@ public class OrbRegistry { } public static List getOrbsUpToTier(int tier) { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (int i = 1; i <= tier; i++) ret.addAll(getOrbsForTier(i)); @@ -40,7 +40,7 @@ public class OrbRegistry { } public static List getOrbsDownToTier(int tier) { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (int i = EnumAltarTier.MAXTIERS; i >= tier; i--) ret.addAll(getOrbsForTier(i)); diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java index cc3f5dc6..b13b4614 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java @@ -9,14 +9,14 @@ import javax.annotation.Nullable; import java.util.*; public class RitualRegistry { - public static final Map enabledRituals = new HashMap(); + public static final Map enabledRituals = new HashMap<>(); private static final BiMap registry = HashBiMap.create(); - private static final List lookupList = new ArrayList(); + private static final List lookupList = new ArrayList<>(); /** * Ordered list for actions that depend on the order that the rituals were * registered in */ - private static final ArrayList orderedIdList = new ArrayList(); + private static final ArrayList orderedIdList = new ArrayList<>(); private static boolean locked; @@ -92,11 +92,11 @@ public class RitualRegistry { } public static Map getEnabledMap() { - return new HashMap(enabledRituals); + return new HashMap<>(enabledRituals); } public static ArrayList getIds() { - return new ArrayList(lookupList); + return new ArrayList<>(lookupList); } public static ArrayList getOrderedIds() { @@ -104,14 +104,14 @@ public class RitualRegistry { } public static ArrayList getRituals() { - return new ArrayList(registry.values()); + return new ArrayList<>(registry.values()); } public static void orderLookupList() { locked = true; // Lock registry so no no rituals can be registered lookupList.clear(); // Make sure it's empty lookupList.addAll(registry.keySet()); - Collections.sort(lookupList, (o1, o2) -> { + lookupList.sort((o1, o2) -> { Ritual ritual1 = registry.get(o1); Ritual ritual2 = registry.get(o2); return ritual1.getComponents().size() > ritual2.getComponents().size() ? -1 : 0; // Put earlier if bigger diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java index 83b075e0..595310ae 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; public class TartaricForgeRecipeRegistry { - private static List recipeList = new ArrayList(); + private static List recipeList = new ArrayList<>(); public static void registerRecipe(TartaricForgeRecipe recipe) { recipeList.add(recipe); @@ -34,6 +34,6 @@ public class TartaricForgeRecipeRegistry { } public static List getRecipeList() { - return new ArrayList(recipeList); + return new ArrayList<>(recipeList); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java b/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java index bf587940..76bf8a75 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java @@ -4,7 +4,7 @@ import java.util.concurrent.ConcurrentHashMap; public class WillWorld { int dim; - ConcurrentHashMap willChunks = new ConcurrentHashMap(); + ConcurrentHashMap willChunks = new ConcurrentHashMap<>(); // private static ConcurrentHashMap nodeTickets = new ConcurrentHashMap(); diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index 0ccf57e0..bd37857a 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.demonAura; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.util.BMLog; @@ -13,8 +12,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; public class WorldDemonWillHandler { - public static ConcurrentHashMap> dirtyChunks = new ConcurrentHashMap>(); - static ConcurrentHashMap containedWills = new ConcurrentHashMap(); + public static ConcurrentHashMap> dirtyChunks = new ConcurrentHashMap<>(); + static ConcurrentHashMap containedWills = new ConcurrentHashMap<>(); @Nullable public static DemonWillHolder getWillHolder(int dim, int x, int y) { @@ -165,7 +164,7 @@ public class WorldDemonWillHandler { } PosXY pos = new PosXY(chunk.loc.x, chunk.loc.y); if (!dirtyChunks.containsKey(dim)) { - dirtyChunks.put(dim, new CopyOnWriteArrayList()); + dirtyChunks.put(dim, new CopyOnWriteArrayList<>()); } CopyOnWriteArrayList dc = dirtyChunks.get(dim); if (!dc.contains(pos)) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java index 137efffa..a2468fbe 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java @@ -36,7 +36,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase { private Predicate avoidTargetSelector; public EntityAIRetreatToHeal(EntityDemonBase theEntityIn, Class classToAvoidIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) { - this(theEntityIn, classToAvoidIn, Predicates.alwaysTrue(), avoidDistanceIn, farSpeedIn, nearSpeedIn); + this(theEntityIn, classToAvoidIn, Predicates.alwaysTrue(), avoidDistanceIn, farSpeedIn, nearSpeedIn); } public EntityAIRetreatToHeal(EntityDemonBase theEntityIn, Class classToAvoidIn, Predicate avoidTargetSelectorIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java index cb721ce7..47f9cf1d 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java @@ -16,7 +16,7 @@ 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); + protected static final DataParameter TYPE = EntityDataManager.createKey(EntityAspectedDemonBase.class, Serializers.WILL_TYPE_SERIALIZER); public EntityAspectedDemonBase(World worldIn) { super(worldIn); diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java index 5044857f..450bb4f9 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java @@ -63,8 +63,8 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase { this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); + this.targetTasks.addTask(1, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java index b5869354..bd12e3e9 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java @@ -30,12 +30,13 @@ 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 DataParameter DYE_COLOR = EntityDataManager.createKey(EntityCorruptedSheep.class, DataSerializers.BYTE); private static final Map DYE_TO_RGB = Maps.newEnumMap(EnumDyeColor.class); public static int maxProtectionCooldown = 90 * 20; //90 second cooldown @@ -93,8 +94,8 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); this.tasks.addTask(8, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); + this.targetTasks.addTask(1, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); } @Override @@ -180,7 +181,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh @Override protected void entityInit() { super.entityInit(); - this.dataManager.register(DYE_COLOR, Byte.valueOf((byte) 0)); + this.dataManager.register(DYE_COLOR, (byte) 0); } @Override @@ -255,34 +256,34 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh * Gets the wool color of this sheep. */ public EnumDyeColor getFleeceColor() { - return EnumDyeColor.byMetadata(this.dataManager.get(DYE_COLOR).byteValue() & 15); + return EnumDyeColor.byMetadata(this.dataManager.get(DYE_COLOR) & 15); } /** * Sets the wool color of this sheep */ public void setFleeceColor(EnumDyeColor color) { - byte b0 = this.dataManager.get(DYE_COLOR).byteValue(); - this.dataManager.set(DYE_COLOR, Byte.valueOf((byte) (b0 & 240 | color.getMetadata() & 15))); + 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).byteValue() & 16) != 0; + 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).byteValue(); + byte b0 = this.dataManager.get(DYE_COLOR); if (sheared) { - this.dataManager.set(DYE_COLOR, Byte.valueOf((byte) (b0 | 16))); + this.dataManager.set(DYE_COLOR, (byte) (b0 | 16)); } else { - this.dataManager.set(DYE_COLOR, Byte.valueOf((byte) (b0 & -17))); + this.dataManager.set(DYE_COLOR, (byte) (b0 & -17)); } } @@ -327,7 +328,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh this.setSheared(true); int i = 1 + this.rand.nextInt(3); - java.util.List ret = new java.util.ArrayList(); + List ret = new ArrayList<>(); for (int j = 0; j < i; ++j) ret.add(new ItemStack(Item.getItemFromBlock(Blocks.WOOL), 1, this.getFleeceColor().getMetadata())); diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java index 71290023..589f6e72 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java @@ -20,7 +20,7 @@ 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); + private static final DataParameter CLIMBING = EntityDataManager.createKey(EntityCorruptedSpider.class, DataSerializers.BYTE); public EntityCorruptedSpider(World world) { this(world, EnumDemonWillType.DEFAULT); @@ -43,8 +43,8 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase { this.tasks.addTask(6, new EntityAILookIdle(this)); this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); + this.targetTasks.addTask(1, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java index 2df10d5e..b82cfc8d 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java @@ -45,7 +45,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { protected void entityInit() { super.entityInit(); this.dataManager.register(TAMED, (byte) 0); - this.dataManager.register(OWNER_UNIQUE_ID, Optional.absent()); + this.dataManager.register(OWNER_UNIQUE_ID, Optional.absent()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 3acc8fed..1b13122c 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -57,7 +57,7 @@ public class EntitySentientSpecter extends EntityDemonBase { this.setSize(0.6F, 1.95F); // ((PathNavigateGround) getNavigator()).setCanSwim(false); this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIRetreatToHeal(this, EntityCreature.class, 6.0F, 1.0D, 1.2D)); + this.tasks.addTask(2, new EntityAIRetreatToHeal<>(this, EntityCreature.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)); @@ -67,9 +67,9 @@ public class EntitySentientSpecter extends EntityDemonBase { this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); - this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); + this.targetTasks.addTask(3, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); - this.targetTasks.addTask(4, new EntityAIHurtByTargetIgnoreTamed(this, false, new Class[0])); + 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))); @@ -138,7 +138,7 @@ public class EntitySentientSpecter extends EntityDemonBase { boolean hasStolenEffect = false; - List removedEffects = new ArrayList(); + List removedEffects = new ArrayList<>(); for (PotionEffect eff : owner.getActivePotionEffects()) { if (canStealEffectFromOwner(owner, eff)) { @@ -157,7 +157,7 @@ public class EntitySentientSpecter extends EntityDemonBase { public boolean applyNegativeEffectsToAttacked(EntityLivingBase attackedEntity, float percentTransmitted) { boolean hasProvidedEffect = false; - List removedEffects = new ArrayList(); + List removedEffects = new ArrayList<>(); for (PotionEffect eff : this.getActivePotionEffects()) { if (eff.getPotion().isBadEffect() && attackedEntity.isPotionApplicable(eff)) { if (!attackedEntity.isPotionActive(eff.getPotion())) { @@ -197,13 +197,13 @@ public class EntitySentientSpecter extends EntityDemonBase { } public List getPotionEffectsForArrowRemovingDuration(float percentTransmitted) { - List arrowEffects = new ArrayList(); + List arrowEffects = new ArrayList<>(); if (type != EnumDemonWillType.CORROSIVE) { return arrowEffects; } - List removedEffects = new ArrayList(); + List removedEffects = new ArrayList<>(); for (PotionEffect eff : this.getActivePotionEffects()) { if (eff.getPotion().isBadEffect()) { removedEffects.add(eff); @@ -310,7 +310,7 @@ public class EntitySentientSpecter extends EntityDemonBase { if (getEntityWorld() instanceof WorldServer) { WorldServer server = (WorldServer) 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, new int[0]); + 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); } } diff --git a/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java b/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java index c8f9adb8..d2221dbf 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java +++ b/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java @@ -7,5 +7,6 @@ public enum EnumTranquilityType { EARTHEN(), WATER(), FIRE(), - LAVA(); + LAVA(), + ; } diff --git a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java index 9f01f968..f41928c1 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java @@ -12,7 +12,7 @@ import java.util.Map; import java.util.TreeMap; public class IncenseAltarHandler { - public static Map> incenseComponentMap = new TreeMap>(); + 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}; @@ -22,7 +22,7 @@ public class IncenseAltarHandler { if (incenseComponentMap.containsKey(altarLevel)) { incenseComponentMap.get(altarLevel).add(component); } else { - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(component); incenseComponentMap.put(altarLevel, list); } diff --git a/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java index 79d9c57f..e291bbf9 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; public class IncenseTranquilityRegistry { - public static List handlerList = new ArrayList(); + public static List handlerList = new ArrayList<>(); public static void registerTranquilityHandler(ITranquilityHandler handler) { handlerList.add(handler); diff --git a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java index c6019eae..1e916933 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java @@ -11,7 +11,7 @@ import java.util.HashMap; import java.util.Map; public class CorruptionHandler { - public static Map, Map> corruptBlockMap = new HashMap, Map>(); + public static Map, Map> corruptBlockMap = new HashMap<>(); public static void registerBlockCorruption(EnumDemonWillType type, Block block, int meta, IBlockState corruptedState) { Pair pair = Pair.of(block, meta); @@ -19,7 +19,7 @@ public class CorruptionHandler { Map stateMap = corruptBlockMap.get(pair); stateMap.put(type, corruptedState); } else { - Map stateMap = new HashMap(); + Map stateMap = new HashMap<>(); stateMap.put(type, corruptedState); corruptBlockMap.put(pair, stateMap); } diff --git a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java index e988ba1f..34a090ef 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java @@ -9,8 +9,8 @@ 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 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(); @@ -25,15 +25,15 @@ public class InversionPillarHandler { return false; } } else { - List posList = new ArrayList(); + 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(); + Map> willMap = new HashMap<>(); + List posList = new ArrayList<>(); posList.add(pos); willMap.put(type, posList); @@ -65,7 +65,7 @@ public class InversionPillarHandler { //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(); + List closePosList = new ArrayList<>(); int dim = world.provider.getDimension(); if (pillarMap.containsKey(dim)) { @@ -91,7 +91,7 @@ public class InversionPillarHandler { if (posList != null && !posList.contains(pos)) { posList.add(pos); } else { - posList = new ArrayList(); + posList = new ArrayList<>(); posList.add(pos); posMap.put(closePos, posList); } @@ -99,14 +99,14 @@ public class InversionPillarHandler { posMap.put(pos, closePosList); } else { - Map> posMap = new HashMap>(); + Map> posMap = new HashMap<>(); posMap.put(pos, closePosList); willMap.put(type, posMap); } } else { - Map>> willMap = new HashMap>>(); - Map> posMap = new HashMap>(); + Map>> willMap = new HashMap<>(); + Map> posMap = new HashMap<>(); posMap.put(pos, closePosList); willMap.put(type, posMap); @@ -123,9 +123,7 @@ public class InversionPillarHandler { Map> posMap = willMap.get(type); List posList = posMap.get(pos); if (posList != null) { - Iterator itr = posList.iterator(); - while (itr.hasNext()) { - BlockPos checkPos = itr.next(); + for (BlockPos checkPos : posList) { List checkPosList = posMap.get(checkPos); if (checkPosList != null) { checkPosList.remove(pos); @@ -152,12 +150,12 @@ public class InversionPillarHandler { } } - return new ArrayList(); + 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. + List checkedPosList = new ArrayList<>(); + List uncheckedPosList = new ArrayList<>(); //Positions where we did not check their connections. uncheckedPosList.add(pos); @@ -170,7 +168,7 @@ public class InversionPillarHandler { while (!uncheckedPosList.isEmpty()) { //Positions that are new this iteration and need to be dumped into uncheckedPosList next iteration. - List newPosList = new ArrayList(); + List newPosList = new ArrayList<>(); for (BlockPos checkPos : uncheckedPosList) { List posList = posMap.get(checkPos); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 804104f5..efa445e2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -89,8 +89,8 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=altarmaker")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=altarmaker")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index 4734f6f9..ff20254d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -62,8 +62,8 @@ public class ItemArcaneAshes extends Item implements IVariantProvider { @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=arcaneashes")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=arcaneashes")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 751a584a..589e91ee 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -131,7 +131,7 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); ret.add("active=true"); ret.add("active=false"); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index ee6f3f2f..f54d39a7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -144,7 +144,7 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); ret.add("active=true"); ret.add("active=false"); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index b1842152..910a4658 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -130,7 +130,7 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); ret.add("active=true"); ret.add("active=false"); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 74bb779e..c7d49cfc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -118,7 +118,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); + Multimap multimap = HashMultimap.create(); if (equipmentSlot == EntityEquipmentSlot.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)); @@ -140,7 +140,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); ret.add("active=true"); ret.add("active=false"); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 415e712a..4c39abdd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -46,8 +46,8 @@ public class ItemBoundTool extends ItemTool 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 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); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index f5d3af13..3a0a86ad 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -33,8 +33,8 @@ public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemon @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=willgauge")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=willgauge")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 10c4776b..24474e87 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -60,13 +60,13 @@ public class ItemExperienceBook extends Item implements IVariantProvider { giveOneLevelExpToPlayer(stack, player); } - return new ActionResult(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(EnumActionResult.SUCCESS, stack); } @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=experiencetome")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=experiencetome")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index ddb05494..52a3e3c4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -2,11 +2,9 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IVariantProvider; -import com.google.common.base.Strings; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index cb3c7c2c..ef73018c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -95,10 +95,10 @@ public class ItemPotionFlask extends Item implements IMeshProvider { if (remainingUses <= 0) { NBTHelper.checkNBT(stack); stack.getTagCompound().setBoolean("empty", true); - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } player.setActiveHand(hand); - return new ActionResult(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(EnumActionResult.SUCCESS, stack); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index 652021b0..10b2ea3c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -295,7 +295,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { ItemStack stack = player.getHeldItem(hand); RayTraceResult ray = this.rayTrace(world, player, false); if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } if (player.isSneaking()) { @@ -303,10 +303,10 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { cycleRitual(stack, player); } - return new ActionResult(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(EnumActionResult.SUCCESS, stack); } - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } @Override @@ -333,10 +333,10 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=basic")); - ret.add(new ImmutablePair(1, "type=dusk")); - ret.add(new ImmutablePair(2, "type=dawn")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=basic")); + ret.add(new ImmutablePair<>(1, "type=dusk")); + ret.add(new ImmutablePair<>(2, "type=dawn")); return ret; } @@ -549,14 +549,14 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { 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, new int[0]); + 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, new int[0]); + 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 index 07e6be63..a718ea5b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -67,7 +67,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { ItemStack stack = player.getHeldItem(hand); RayTraceResult ray = this.rayTrace(world, player, false); if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } if (player.isSneaking()) { @@ -75,10 +75,10 @@ public class ItemRitualReader extends Item implements IVariantProvider { cycleReader(stack, player); } - return new ActionResult(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(EnumActionResult.SUCCESS, stack); } - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } @Override @@ -107,7 +107,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { master.provideInformationOfRangeToPlayer(player, range); break; case SET_WILL_TYPES: - List typeList = new ArrayList(); + List typeList = new ArrayList<>(); NonNullList inv = player.inventory.mainInventory; for (int i = 0; i < 9; i++) { ItemStack testStack = inv.get(i); @@ -234,8 +234,8 @@ public class ItemRitualReader extends Item implements IVariantProvider { @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=normal")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index bcfd621b..3ffdf74d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -77,7 +77,7 @@ public class ItemSacrificialDagger extends ItemEnum(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(EnumActionResult.SUCCESS, stack); } int lpAdded = ConfigHandler.values.sacrificialDaggerConversion * 2; @@ -166,7 +166,7 @@ public class ItemSacrificialDagger extends ItemEnum getVariants() { - List variants = new ArrayList(); + List variants = new ArrayList<>(); variants.add("type=normal"); variants.add("type=creative"); variants.add("type=ceremonial"); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index 3df9322b..a6bfe3b2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -97,8 +97,8 @@ public class ItemUpgradeTome extends Item implements IVariantProvider { @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=upgradetome")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=upgradetome")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index cc7f150b..1f6b9e6d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -61,7 +61,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @Override public List getTrainedUpgrades(ItemStack stack) { - List keyList = new ArrayList(); + List keyList = new ArrayList<>(); String key = LivingUpgrades.getKey(stack); if (!key.isEmpty()) { @@ -83,8 +83,8 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=upgradetrainer")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=upgradetrainer")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 158b1034..8f4a5409 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -51,7 +51,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP 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(); + public static Map armourMap = new HashMap<>(); private static Field _FLAGS = ReflectionHelper.findField(Entity.class, "FLAGS", "field_184240_ax"); private static DataParameter FLAGS = null; @@ -283,9 +283,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (FLAGS == null) { try { FLAGS = (DataParameter) _FLAGS.get(null); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { + } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } @@ -337,7 +335,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return armour.getAttributeModifiers(); } - return HashMultimap.create(); + return HashMultimap.create(); } @Override @@ -367,7 +365,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); ret.add("armour=head"); ret.add("armour=body"); ret.add("armour=leg"); diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index 793faa21..b2151097 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -298,7 +298,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (EnumDemonWillType type : EnumDemonWillType.values()) { String additional = "_" + type.getName().toLowerCase(); @@ -313,7 +313,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes @Override public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); + Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.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)); diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java deleted file mode 100644 index 895b40c8..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockString.java +++ /dev/null @@ -1,32 +0,0 @@ -package WayofTime.bloodmagic.item.block.base; - -import WayofTime.bloodmagic.block.base.BlockString; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; - -public class ItemBlockString extends ItemBlock { - - public ItemBlockString(BlockString block) { - super(block); - - if (block.getTypes().length > 1) - setHasSubtypes(true); - } - - @SuppressWarnings("unchecked") - @Override - public BlockString getBlock() { - return (BlockString) super.getBlock(); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return getBlock().getUnlocalizedName() + "." + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, 15)]; - } - - @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 index cba28176..a726b800 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -77,8 +77,8 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index 002b469d..492dd868 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -102,8 +102,8 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index 455c44c4..94fbf3ec 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -70,7 +70,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, testFilter = new RoutingFluidFilter(); } - List filteredList = new ArrayList(); + List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); @@ -100,7 +100,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, testFilter = new RoutingFluidFilter(); } - List filteredList = new ArrayList(); + 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); @@ -122,8 +122,8 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=exact")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=exact")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index b3b3e522..d8fb3a56 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -84,7 +84,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi 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); + node.connectMasterToRemainingNode(world, new LinkedList<>(), master); master.addConnection(pos, containedPos); master.addNodeToList(node); node.addConnection(containedPos); @@ -106,7 +106,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi if (!pastNode.isMaster(master)) { if (pastNode.getMasterPos().equals(BlockPos.ORIGIN)) //TODO: This is where the issue is { - pastNode.connectMasterToRemainingNode(world, new LinkedList(), master); + pastNode.connectMasterToRemainingNode(world, new LinkedList<>(), master); master.addConnection(pos, containedPos); pastNode.addConnection(pos); master.addNodeToList(pastNode); @@ -143,7 +143,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi IMasterRoutingNode master = (IMasterRoutingNode) tile; master.addConnection(pos, containedPos); master.addNodeToList(pastNode); - pastNode.connectMasterToRemainingNode(world, new LinkedList(), master); + pastNode.connectMasterToRemainingNode(world, new LinkedList<>(), master); } pastNode.addConnection(pos); node.addConnection(containedPos); @@ -157,7 +157,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi IMasterRoutingNode master = (IMasterRoutingNode) tile; master.addConnection(pos, containedPos); master.addNodeToList(node); - node.connectMasterToRemainingNode(world, new LinkedList(), master); + node.connectMasterToRemainingNode(world, new LinkedList<>(), master); } pastNode.addConnection(pos); node.addConnection(containedPos); @@ -177,8 +177,8 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=normal")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 76cc2b48..a7c1d197 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -78,7 +78,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari testFilter = new DefaultItemFilter(); } - List filteredList = new ArrayList(); + List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); @@ -117,7 +117,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari testFilter = new DefaultItemFilter(); } - List filteredList = new ArrayList(); + 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); @@ -139,11 +139,11 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=exact")); - ret.add(new ImmutablePair(1, "type=ignorenbt")); - ret.add(new ImmutablePair(2, "type=moditems")); - ret.add(new ImmutablePair(3, "type=oredict")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=exact")); + ret.add(new ImmutablePair<>(1, "type=ignorenbt")); + ret.add(new ImmutablePair<>(2, "type=moditems")); + ret.add(new ImmutablePair<>(3, "type=oredict")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index a3753559..39d5689d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -3,10 +3,8 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.item.ItemSigil; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -55,7 +53,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider { @Override public List> getVariants() { - List> ret = new ArrayList>(); + List> ret = new ArrayList<>(); ret.add(Pair.of(0, "type=normal")); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java index ce3b9360..eb2d1431 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java @@ -12,9 +12,10 @@ import java.util.HashMap; import java.util.Map; public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { - private Map> prevPositionMap = new HashMap>(); - private double expansionFactor = 2; - private int range = 3; + private static final double EXPANSION_FACTOR = 2; + private static final int RANGE = 3; + + private Map> prevPositionMap = new HashMap<>(); public ItemSigilPhantomBridge() { super("phantom_bridge", 100); @@ -57,12 +58,12 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { int posY = playerPos.getY(); int posZ = playerPos.getZ(); - double offsetPosX = posX + expansionFactor * playerVelX; - double offsetPosZ = posZ + expansionFactor * playerVelZ; + double offsetPosX = posX + EXPANSION_FACTOR * playerVelX; + double offsetPosZ = posZ + EXPANSION_FACTOR * playerVelZ; double avgX = (posX + offsetPosX) / 2; double avgZ = (posZ + offsetPosZ) / 2; - double C = 2 * (range + expansionFactor * totalVel) + 1; + double C = 2 * (RANGE + EXPANSION_FACTOR * totalVel) + 1; int truncC = (int) C; //TODO: Make this for-loop better. diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index f54bc75b..952a8712 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -3,11 +3,9 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.item.ItemSigilToggleable; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; @@ -64,7 +62,7 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); ret.add("active=false"); ret.add("active=true"); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index 7d0450a9..604826b0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -53,7 +53,7 @@ public class ItemSentientArmourGem extends Item implements IMeshProvider { ItemSentientArmour.convertPlayerArmour(type, will, player); } - return new ActionResult(EnumActionResult.PASS, player.getHeldItem(hand)); + return new ActionResult<>(EnumActionResult.PASS, player.getHeldItem(hand)); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index fbcef7f1..ca4a4558 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -308,7 +308,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=" + type.getName().toLowerCase()); } @@ -318,7 +318,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP @Override public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { - List soulList = new ArrayList(); + List soulList = new ArrayList<>(); if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; @@ -343,7 +343,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP //TODO: Change attack speed. @Override public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); + Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.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)); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 7f70b1e2..a1ffaaac 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -307,7 +307,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=" + type.getName().toLowerCase()); } @@ -317,7 +317,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon @Override public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { - List soulList = new ArrayList(); + List soulList = new ArrayList<>(); if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; @@ -342,7 +342,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon //TODO: Change attack speed. @Override public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); + Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.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)); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index f391bb4f..deb5056c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -308,7 +308,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=" + type.getName().toLowerCase()); } @@ -318,7 +318,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I @Override public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { - List soulList = new ArrayList(); + List soulList = new ArrayList<>(); if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; @@ -343,7 +343,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I //TODO: Change attack speed. @Override public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); + Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.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)); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 32f45db7..13206057 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -283,7 +283,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=" + type.getName().toLowerCase()); } @@ -293,7 +293,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM @Override public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { - List soulList = new ArrayList(); + List soulList = new ArrayList<>(); if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; @@ -318,7 +318,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM //TODO: Change attack speed. @Override public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); + Multimap multimap = HashMultimap.create(); if (slot == EntityEquipmentSlot.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)); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index 139313e3..d55aa834 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -55,7 +55,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I double filled = PlayerDemonWillHandler.addDemonWill(type, player, drain, stack); this.drainWill(type, stack, filled, true); - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } @Override @@ -72,7 +72,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I @Override public List getVariants() { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (EnumDemonWillType type : EnumDemonWillType.values()) { ret.add("type=petty_" + type.getName().toLowerCase()); ret.add("type=lesser_" + type.getName().toLowerCase()); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index f422be70..15e42172 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -48,7 +48,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider { worldIn.spawnEntity(snare); } - return new ActionResult(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(EnumActionResult.SUCCESS, stack); } @Override @@ -76,8 +76,8 @@ public class ItemSoulSnare extends Item implements IVariantProvider { @Override public List> getVariants() { - List> ret = new ArrayList>(); - ret.add(new ImmutablePair(0, "type=soulsnare")); + List> ret = new ArrayList<>(); + ret.add(new ImmutablePair<>(0, "type=soulsnare")); return ret; } } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index fcd8c555..19f9a7a1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -23,8 +23,8 @@ 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 HashMap trackerMap = new HashMap<>(); + public HashMap upgradeMap = new HashMap<>(); public int maxUpgradePoints = 100; public int totalUpgradePoints = 0; @@ -60,7 +60,7 @@ public class LivingArmour implements ILivingArmour { @Override public Multimap getAttributeModifiers() { - HashMultimap modifierMap = HashMultimap.create(); + HashMultimap modifierMap = HashMultimap.create(); for (Entry entry : upgradeMap.entrySet()) { LivingArmourUpgrade upgrade = entry.getValue(); @@ -165,7 +165,7 @@ public class LivingArmour implements ILivingArmour { return; } - List allowedUpgradesList = new ArrayList(); + List allowedUpgradesList = new ArrayList<>(); for (ItemStack stack : player.inventory.mainInventory) { if (stack != null && stack.getItem() instanceof IUpgradeTrainer) { List keyList = ((IUpgradeTrainer) stack.getItem()).getTrainedUpgrades(stack); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java index a1a0c46f..c15afafb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.livingArmour; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.BMLog; import net.minecraft.nbt.NBTTagCompound; @@ -10,10 +9,10 @@ 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 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); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java index cf948dac..6c1dece3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java @@ -12,7 +12,7 @@ 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 static HashMap changeMap = new HashMap<>(); public LivingArmourUpgradeDigSlowdown(int level) { super(level); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java index 06aebdc0..a67a5cfb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -29,7 +29,7 @@ public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade { @Override public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java index cbdab679..db12a7ac 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -24,7 +24,7 @@ public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade { @Override public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java index b084083f..51671858 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerArrowProtect extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -66,7 +66,7 @@ public class StatTrackerArrowProtect extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalDamage >= damageRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java index a89f4588..ed0e225d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerArrowShot extends StatTracker { - public static HashMap changeMap = new HashMap(); + public static HashMap changeMap = new HashMap<>(); public static int[] shotsRequired = new int[]{50, 200, 700, 1500, 3000}; public int totalShots = 0; @@ -66,7 +66,7 @@ public class StatTrackerArrowShot extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 5; i++) { if (totalShots >= shotsRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java index f14f0598..fef5ed19 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerCriticalStrike extends StatTracker { - public static HashMap changeMap = new HashMap(); + public static HashMap changeMap = new HashMap<>(); public static int[] damageRequired = new int[]{200, 800, 1300, 2500, 3800}; public double totalDamageDealt = 0; @@ -66,7 +66,7 @@ public class StatTrackerCriticalStrike extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 5; i++) { if (totalDamageDealt >= damageRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java index 0a99d49d..c04c1951 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerDigging extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -66,7 +66,7 @@ public class StatTrackerDigging extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalBlocksDug >= blocksRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java index 99931891..379d3631 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerExperience extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -66,7 +66,7 @@ public class StatTrackerExperience extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalExperienceGained >= experienceRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java index 561cb733..76f6248d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerFallProtect extends StatTracker { - public static HashMap changeMap = new HashMap(); + public static HashMap changeMap = new HashMap<>(); public static int[] damageRequired = new int[]{30, 200, 400, 800, 1500}; public int totalDamage = 0; @@ -66,7 +66,7 @@ public class StatTrackerFallProtect extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 5; i++) { if (totalDamage >= damageRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java index c36f87c6..c6e467d1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java @@ -55,7 +55,7 @@ public class StatTrackerFireResist extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 5; i++) { if (totalFireTicks >= fireTicksRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java index b5ef43a6..b00fbb71 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; public class StatTrackerFood extends StatTracker { - public static Map lastFoodEatenMap = new HashMap(); + public static Map lastFoodEatenMap = new HashMap<>(); public static int[] foodRequired = new int[]{100, 200, 300, 500, 1000}; @@ -74,7 +74,7 @@ public class StatTrackerFood extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < foodRequired.length; i++) { if (foodEaten >= foodRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java index 2b7e5bc5..209a8316 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerGraveDigger extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -66,7 +66,7 @@ public class StatTrackerGraveDigger extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalDamageDealt >= damageRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java index 9a3830ad..0234bbf2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerGrimReaperSprint extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -67,7 +67,7 @@ public class StatTrackerGrimReaperSprint extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalDeaths >= deathsRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java index 73e1b3cc..666cf88f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerHealthboost extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -66,7 +66,7 @@ public class StatTrackerHealthboost extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalHealthGenned >= healthedRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java index 7adb31fd..d5214fa6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerJump extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -68,7 +68,7 @@ public class StatTrackerJump extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalJumps >= jumpsRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java index 78adec51..a7172372 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerMeleeDamage extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -66,7 +66,7 @@ public class StatTrackerMeleeDamage extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalDamageDealt >= damageRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java index eb44d538..49a598d1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java @@ -16,8 +16,8 @@ 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 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}; @@ -82,7 +82,7 @@ public class StatTrackerMovement extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalMovement >= blocksRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java index 77a1e3db..ca2a181b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerNightSight extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -81,7 +81,7 @@ public class StatTrackerNightSight extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); if (totalNightVision < neededNightVision) { return upgradeList; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java index 4e215caa..7fca6648 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerPhysicalProtect extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -66,7 +66,7 @@ public class StatTrackerPhysicalProtect extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalDamage >= damageRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java index 16e238bb..fb002e49 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java @@ -56,7 +56,7 @@ public class StatTrackerPoison extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 5; i++) { if (totalPoisonTicks >= poisonTicksRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java index d81b4e62..458b5eb6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerRepairing extends StatTracker { - public static HashMap changeMap = new HashMap(); + public static HashMap changeMap = new HashMap<>(); public static int[] damageRequired = new int[]{500}; public double totalDamage = 0; @@ -66,7 +66,7 @@ public class StatTrackerRepairing extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 1; i++) { if (totalDamage >= damageRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java index 4a508d89..631ac1d2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerSelfSacrifice extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -68,7 +68,7 @@ public class StatTrackerSelfSacrifice extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalSacrifices >= sacrificesRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java index 41abc39a..29d656ac 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerSolarPowered extends StatTracker { - public static HashMap changeMap = new HashMap(); + 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; @@ -66,7 +66,7 @@ public class StatTrackerSolarPowered extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 10; i++) { if (totalHealthGenned >= healthedRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java index c8743426..09d2f220 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.List; public class StatTrackerSprintAttack extends StatTracker { - public static HashMap changeMap = new HashMap(); + public static HashMap changeMap = new HashMap<>(); public static int[] damageRequired = new int[]{200, 800, 1300, 2500, 3800}; public double totalDamageDealt = 0; @@ -66,7 +66,7 @@ public class StatTrackerSprintAttack extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); for (int i = 0; i < 5; i++) { if (totalDamageDealt >= damageRequired[i]) { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java index b5bbec27..77ad3f12 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java @@ -15,8 +15,8 @@ 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 Map lastPosX = new HashMap<>(); + public static Map lastPosZ = new HashMap<>(); public static int blocksRequired = 1000; @@ -82,7 +82,7 @@ public class StatTrackerStepAssist extends StatTracker { @Override public List getUpgrades() { - List upgradeList = new ArrayList(); + List upgradeList = new ArrayList<>(); if (totalMovement >= blocksRequired) { upgradeList.add(new LivingArmourUpgradeStepAssist(0)); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java index 6dac903b..a88e42c9 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java @@ -17,7 +17,7 @@ public class LivingArmourUpgradeDigging extends LivingArmourUpgrade { 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 static HashMap changeMap = new HashMap<>(); public LivingArmourUpgradeDigging(int level) { super(level); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java index 69ce784c..08ecc06c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -29,7 +29,7 @@ public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade { @Override public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java index 2045b972..8909473e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -22,7 +22,7 @@ public class LivingArmourUpgradeKnockbackResist extends LivingArmourUpgrade { @Override public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java index 5b5abda1..22e206f8 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -29,7 +29,7 @@ public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade { @Override public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); + 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)); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 3fe1f8a0..446decfb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -47,7 +47,7 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade { @Override public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); + Multimap modifierMap = HashMultimap.create(); // modifierMap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(895132, 1), "Speed modifier" + 1, speedModifier[this.level], 1)); diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index 5ba2f665..1fad6f4e 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -37,7 +37,7 @@ public class BMPotionUtils { double incurredDamage = 0; - List growList = new ArrayList(); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 3aa2be30..04ace93a 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -6,11 +6,7 @@ import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.client.Sprite; import WayofTime.bloodmagic.client.helper.ShaderHelper; -import WayofTime.bloodmagic.client.hud.HUDElementCornerTile; -import WayofTime.bloodmagic.client.hud.HUDElementDemonWillAura; -import WayofTime.bloodmagic.client.hud.HUDElementHolding; import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.client.render.LayerBloodElytra; import WayofTime.bloodmagic.client.render.block.*; @@ -23,7 +19,6 @@ import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; import WayofTime.bloodmagic.tile.*; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import WayofTime.bloodmagic.util.helper.NumeralHelper; import com.google.common.collect.ImmutableMap; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -46,9 +41,7 @@ import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import org.apache.commons.lang3.tuple.Pair; import java.awt.Color; -import java.util.List; import java.util.Map; -import java.util.function.Function; public class ClientProxy extends CommonProxy { public static DemonWillHolder currentAura = new DemonWillHolder(); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java index 8fa14ad2..2a17628f 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java @@ -17,7 +17,7 @@ import java.util.List; public class LivingArmourDowngradeRecipe { protected LivingArmourUpgrade upgrade = null; protected ItemStack keyStack = ItemStack.EMPTY; - protected List input = new ArrayList(); + protected List input = new ArrayList<>(); public LivingArmourDowngradeRecipe(LivingArmourUpgrade upgrade, ItemStack keyStack, Object... recipe) { this.upgrade = upgrade; @@ -32,12 +32,12 @@ public class LivingArmourDowngradeRecipe { } else if (in instanceof String) { input.add(OreDictionary.getOres((String) in)); } else { - String ret = "Invalid living armour downgrade recipe: "; + StringBuilder ret = new StringBuilder("Invalid living armour downgrade recipe: "); for (Object tmp : recipe) { - ret += tmp + ", "; + ret.append(tmp).append(", "); } - ret += upgrade.toString(); - throw new RuntimeException(ret); + ret.append(upgrade.toString()); + throw new RuntimeException(ret.toString()); } } } @@ -63,7 +63,7 @@ public class LivingArmourDowngradeRecipe { return false; } - ArrayList required = new ArrayList(input); + ArrayList required = new ArrayList<>(input); for (ItemStack slot : checkedList) { if (slot != null) { diff --git a/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java index db294411..21f5936b 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java @@ -14,7 +14,7 @@ import java.util.List; public class TartaricForgeRecipe { protected ItemStack output = null; - protected List input = new ArrayList(); + protected List input = new ArrayList<>(); protected double minimumSouls; protected double soulsDrained; @@ -40,12 +40,12 @@ public class TartaricForgeRecipe { } else if (in instanceof String) { input.add(OreDictionary.getOres((String) in)); } else { - String ret = "Invalid soul forge recipe: "; + StringBuilder ret = new StringBuilder("Invalid soul forge recipe: "); for (Object tmp : recipe) { - ret += tmp + ", "; + ret.append(tmp).append(", "); } - ret += output; - throw new RuntimeException(ret); + ret.append(output); + throw new RuntimeException(ret.toString()); } } } @@ -67,24 +67,19 @@ public class TartaricForgeRecipe { */ @SuppressWarnings("unchecked") public boolean matches(List checkedList, World world, BlockPos pos) { - ArrayList required = new ArrayList(input); - - for (int x = 0; x < checkedList.size(); x++) { - ItemStack slot = checkedList.get(x); + ArrayList required = new ArrayList<>(input); + for (ItemStack slot : checkedList) { if (slot != null) { boolean inRecipe = false; - Iterator req = required.iterator(); - while (req.hasNext()) { + for (Object aRequired : required) { boolean match = false; - Object next = req.next(); - - if (next instanceof ItemStack) { - match = OreDictionary.itemMatches((ItemStack) next, slot, false); - } else if (next instanceof List) { - Iterator itr = ((List) next).iterator(); + 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); } @@ -92,7 +87,7 @@ public class TartaricForgeRecipe { if (match) { inRecipe = true; - required.remove(next); + required.remove(aRequired); break; } } diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index 50e83c2b..9182aad7 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -19,11 +19,11 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe { public AlchemyTableDyeableRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem) { super(inputItem, lpDrained, ticksRequired, tierRequired); - ArrayList validDyes = new ArrayList(); + 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(); + ArrayList recipe = new ArrayList<>(); recipe.add(inputItem); recipe.add(validDyes); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java index 1c2ccd46..17162a39 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java @@ -19,10 +19,8 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect, double lengthAugment, int powerAugment) { super(lpDrained, ticksRequired, tierRequired, inputItems, baseEffect); - ArrayList recipe = new ArrayList(); - for (ItemStack stack : inputItems) { - recipe.add(stack); - } + ArrayList recipe = new ArrayList<>(); + recipe.addAll(inputItems); recipe.add(getAugmentedPotionFlask(baseEffect)); this.input = recipe; @@ -55,7 +53,7 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { if (inputStack.isEmpty()) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - List effectList = new ArrayList(); + List effectList = new ArrayList<>(); int potionLength = wantedPotion.isInstant() ? 1 : BMPotionUtils.getAugmentedLength(baseEffect.getDuration(), lengthAugment, powerAugment - baseEffect.getAmplifier()); effectList.add(new PotionEffect(wantedPotion, potionLength, powerAugment - baseEffect.getAmplifier())); @@ -67,7 +65,7 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { ItemStack outputStack = inputStack.copy(); List effectList = PotionUtils.getEffectsFromStack(outputStack); - List newEffectList = new ArrayList(); + List newEffectList = new ArrayList<>(); for (PotionEffect effect : effectList) { if (effect.getPotion() == wantedPotion) { @@ -89,7 +87,7 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { public static ItemStack getAugmentedPotionFlask(PotionEffect baseEffect) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - List effectList = new ArrayList(); + List effectList = new ArrayList<>(); effectList.add(baseEffect); BMPotionUtils.setEffects(outputStack, effectList); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index 4a627ede..172af124 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -22,10 +22,8 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect) { super(basePotionFlaskStack, lpDrained, ticksRequired, tierRequired); - ArrayList recipe = new ArrayList(); - for (ItemStack stack : inputItems) { - recipe.add(stack); - } + ArrayList recipe = new ArrayList<>(); + recipe.addAll(inputItems); recipe.add(basePotionFlaskStack); this.input = recipe; @@ -60,7 +58,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { @Override public boolean matches(List checkedList, World world, BlockPos pos) { - ArrayList required = new ArrayList(input); + ArrayList required = new ArrayList<>(input); for (ItemStack slot : checkedList) { if (slot != null) { @@ -121,7 +119,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { if (inputStack.isEmpty()) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - List effectList = new ArrayList(); + List effectList = new ArrayList<>(); effectList.add(baseEffect); PotionUtils.appendEffects(outputStack, effectList); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java index 8fbd717d..a845963a 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java @@ -15,7 +15,7 @@ import java.util.List; public class AlchemyTableRecipe { protected ItemStack output = ItemStack.EMPTY; - protected ArrayList input = new ArrayList(); + protected ArrayList input = new ArrayList<>(); protected int lpDrained; protected int ticksRequired; protected int tierRequired; @@ -43,12 +43,12 @@ public class AlchemyTableRecipe { } else if (in instanceof String) { input.add(OreDictionary.getOres((String) in)); } else { - String ret = "Invalid alchemy recipe: "; + StringBuilder ret = new StringBuilder("Invalid alchemy recipe: "); for (Object tmp : recipe) { - ret += tmp + ", "; + ret.append(tmp).append(", "); } - ret += output; - throw new RuntimeException(ret); + ret.append(output); + throw new RuntimeException(ret.toString()); } } } @@ -78,7 +78,7 @@ public class AlchemyTableRecipe { */ @SuppressWarnings("unchecked") public boolean matches(List checkedList, World world, BlockPos pos) { - ArrayList required = new ArrayList(input); + ArrayList required = new ArrayList<>(input); for (ItemStack slot : checkedList) { if (!slot.isEmpty()) { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 855181d2..4a49327e 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -148,12 +148,12 @@ public class ModRecipes { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(lpDrained, 100, tier, inputStack, baseEffect)); - List lengtheningList = new ArrayList(); + List lengtheningList = new ArrayList<>(); lengtheningList.add(inputStack); lengtheningList.add(mundaneLengtheningStack); AlchemyTableRecipeRegistry.registerRecipe(BMPotionUtils.getLengthAugmentRecipe(lpDrained, 100, tier, lengtheningList, baseEffect, 1)); - List powerList = new ArrayList(); + List powerList = new ArrayList<>(); powerList.add(inputStack); powerList.add(mundanePowerStack); AlchemyTableRecipeRegistry.registerRecipe(BMPotionUtils.getPowerAugmentRecipe(lpDrained, 100, tier, powerList, baseEffect, 1)); @@ -173,7 +173,7 @@ public class ModRecipes ItemStack minecartStack = new ItemStack(Items.MINECART); ItemStack stringStack = new ItemStack(Items.STRING); - Map> dialogueMap = new HashMap>(); + 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 })); @@ -183,10 +183,10 @@ public class ModRecipes { ItemStack keyStack = entry.getKey(); String str = entry.getValue().getKey(); - Map> textMap = new HashMap>(); + Map> textMap = new HashMap<>(); for (int tick : entry.getValue().getValue()) { - List textList = new ArrayList(); + List textList = new ArrayList<>(); textList.add(new TextComponentTranslation("\u00A74%s", new TextComponentTranslation(messageBase + str + "." + tick))); textMap.put(tick, textList); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java index 6ce09db4..67a8bf76 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java @@ -29,7 +29,7 @@ import java.util.ArrayList; import java.util.Iterator; public class RitualAltarBuilder extends Ritual { - private Iterator altarComponentsIterator = new ArrayList(EnumAltarTier.SIX.getAltarComponents()).iterator(); + private Iterator altarComponentsIterator = new ArrayList<>(EnumAltarTier.SIX.getAltarComponents()).iterator(); private boolean cycleDone = false; private AltarComponent currentComponent; @@ -53,7 +53,7 @@ public class RitualAltarBuilder extends Ritual { } if (cycleDone) { - altarComponentsIterator = new ArrayList(EnumAltarTier.SIX.getAltarComponents()).iterator(); + altarComponentsIterator = new ArrayList<>(EnumAltarTier.SIX.getAltarComponents()).iterator(); } if (world.getBlockState(altarPos).getBlock().isReplaceable(world, altarPos) && hasItem(tileEntity, Item.getItemFromBlock(RegistrarBloodMagicBlocks.ALTAR), 0, true)) { @@ -114,7 +114,7 @@ public class RitualAltarBuilder extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); for (int i = -12; i <= -8; i++) { addRune(components, i, -6, 13, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java index 147a3791..596d5c21 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java @@ -170,7 +170,7 @@ public class RitualAnimalGrowth extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addParallelRunes(components, 2, 0, EnumRuneType.DUSK); this.addParallelRunes(components, 1, 0, EnumRuneType.WATER); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java index 9a59ff3a..df617162 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java @@ -66,7 +66,7 @@ public class RitualArmourEvolve extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.DUSK); this.addCornerRunes(components, 2, 0, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java index a364d484..d20a3643 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java @@ -84,7 +84,7 @@ public class RitualCobblestone extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 1, EnumRuneType.FIRE); this.addParallelRunes(components, 1, 0, EnumRuneType.WATER); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java index 4f6dc7a6..4691725c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -32,7 +31,7 @@ public class RitualContainment extends Ritual { AreaDescriptor containmentRange = getBlockRange(CONTAINMENT_RANGE); for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, containmentRange.getAABB(masterRitualStone.getBlockPos()))) { - if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || PlayerHelper.getUUIDFromPlayer((EntityPlayer) entity).toString().equals(masterRitualStone.getOwner()))) + if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || ((EntityPlayer) entity).getGameProfile().getId().equals(masterRitualStone.getOwner()))) continue; double xDif = entity.posX - (masterRitualStone.getBlockPos().getX() + 0.5); @@ -58,7 +57,7 @@ public class RitualContainment extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addParallelRunes(components, 1, 0, EnumRuneType.EARTH); this.addCornerRunes(components, 2, 0, EnumRuneType.EARTH); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index 3909f072..5dea1dbf 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -36,8 +36,8 @@ public class RitualCrushing extends Ritual { 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 Map cuttingFluidLPMap = new HashMap<>(); + public static Map cuttingFluidWillMap = new HashMap<>(); public static int defaultRefreshTime = 40; public int refreshTime = 40; @@ -120,7 +120,7 @@ public class RitualCrushing extends Ritual { } cuttingStack = cuttingStack.copy(); - List input = new ArrayList(); + List input = new ArrayList<>(); input.add(cuttingStack); input.add(copyStack); @@ -252,7 +252,7 @@ public class RitualCrushing extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addParallelRunes(components, 1, 0, EnumRuneType.EARTH); this.addParallelRunes(components, 2, 0, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java index b6387112..6525cb0d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java @@ -68,7 +68,7 @@ public class RitualCrystalHarvest extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); this.addParallelRunes(components, 1, 1, EnumRuneType.DUSK); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java index ba6a2fa7..04ed12f4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import com.google.common.collect.Lists; @@ -71,7 +70,7 @@ public class RitualExpulsion extends Ritual { final int teleportDistance = 100; for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, expulsionRange.getAABB(masterRitualStone.getBlockPos()))) { - if (player.capabilities.isCreativeMode || PlayerHelper.getUUIDFromPlayer(player).toString().equals(masterRitualStone.getOwner()) || whitelist.contains(player.getGameProfile().getId())) + if (player.capabilities.isCreativeMode || player.getGameProfile().getId().equals(masterRitualStone.getOwner()) || whitelist.contains(player.getGameProfile().getId())) continue; if (teleportRandomly(player, teleportDistance)) @@ -192,7 +191,7 @@ public class RitualExpulsion extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 2, 0, EnumRuneType.EARTH); this.addRune(components, 2, 0, 1, EnumRuneType.EARTH); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java index f7749ddf..efa144fb 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java @@ -109,7 +109,7 @@ public class RitualFeatheredKnife extends Ritual { for (EntityPlayer player : entities) { float healthThreshold = steadfastWill >= steadfastWillThreshold ? 0.7f : 0.3f; - if (vengefulWill >= vengefulWillThreshold && !player.getUniqueID().toString().equals(masterRitualStone.getOwner())) { + if (vengefulWill >= vengefulWillThreshold && !player.getGameProfile().getId().equals(masterRitualStone.getOwner())) { healthThreshold = 0.1f; } @@ -186,7 +186,7 @@ public class RitualFeatheredKnife extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addParallelRunes(components, 1, 0, EnumRuneType.DUSK); this.addParallelRunes(components, 2, -1, EnumRuneType.WATER); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java index a426c67a..c6e3112c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java @@ -35,7 +35,7 @@ public class RitualFelling extends Ritual { setMaximumVolumeAndDistanceOfRange(FELLING_RANGE, 14000, 15, 30); setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); - treePartsCache = new ArrayList(); + treePartsCache = new ArrayList<>(); } @Override @@ -86,7 +86,7 @@ public class RitualFelling extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); addCornerRunes(components, 1, 0, EnumRuneType.EARTH); addCornerRunes(components, 1, 1, EnumRuneType.EARTH); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 52048dbf..402a8b40 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -29,7 +29,7 @@ public class RitualForsakenSoul extends Ritual { public double willBuffer = 0; public double crystalBuffer = 0; - public List keyList = new ArrayList(); + public List keyList = new ArrayList<>(); public RitualForsakenSoul() { super("ritualForsakenSoul", 0, 40000, "ritual." + BloodMagic.MODID + ".forsakenSoulRitual"); @@ -83,7 +83,7 @@ public class RitualForsakenSoul extends Ritual { int maxEffects = 100; int totalEffects = 0; - List crystalList = new ArrayList(); + List crystalList = new ArrayList<>(); AreaDescriptor crystalRange = getBlockRange(CRYSTAL_RANGE); @@ -153,7 +153,7 @@ public class RitualForsakenSoul extends Ritual { keyList.remove(0); } - List uniquenessList = new ArrayList(); + List uniquenessList = new ArrayList<>(); for (int value : keyList) { if (!uniquenessList.contains(value)) { uniquenessList.add(value); @@ -179,7 +179,7 @@ public class RitualForsakenSoul extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); this.addParallelRunes(components, 1, -1, EnumRuneType.DUSK); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java index 7cc66329..7bcd06e7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java @@ -3,10 +3,8 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.FoodStats; import net.minecraft.util.math.BlockPos; @@ -96,7 +94,7 @@ public class RitualFullStomach extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addParallelRunes(components, 3, 0, EnumRuneType.FIRE); this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 8a6f9cfb..84089407 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -260,7 +260,7 @@ public class RitualGreenGrove extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.EARTH); this.addParallelRunes(components, 1, 0, EnumRuneType.WATER); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java index b1d4d478..ec6650f1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java @@ -67,7 +67,7 @@ public class RitualHarvest extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); components.add(new RitualComponent(new BlockPos(1, 0, 1), EnumRuneType.DUSK)); components.add(new RitualComponent(new BlockPos(1, 0, -1), EnumRuneType.DUSK)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java index 22a26195..26801083 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -32,7 +31,7 @@ public class RitualInterdiction extends Ritual { AreaDescriptor interdictionRange = getBlockRange(INTERDICTION_RANGE); for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, interdictionRange.getAABB(masterRitualStone.getBlockPos()))) { - if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || PlayerHelper.getUUIDFromPlayer((EntityPlayer) entity).toString().equals(masterRitualStone.getOwner()))) + if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || ((EntityPlayer) entity).getGameProfile().getId().equals(masterRitualStone.getOwner()))) continue; double xDif = entity.posX - (masterRitualStone.getBlockPos().getX() + 0.5); @@ -62,7 +61,7 @@ public class RitualInterdiction extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); this.addParallelRunes(components, 1, 0, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java index 84da47b7..62f6f77c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java @@ -70,7 +70,7 @@ public class RitualJumping extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); for (int i = -1; i <= 1; i++) this.addCornerRunes(components, 1, i, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java index d3878ed7..884ddf09 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java @@ -234,7 +234,7 @@ public class RitualLava extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addParallelRunes(components, 1, 0, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java index 936d7d77..566f9019 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java @@ -51,7 +51,7 @@ public class RitualLivingArmourDowngrade extends Ritual { boolean isActivatorPresent = false; for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, downgradeRange.getAABB(masterRitualStone.getBlockPos()))) { - if (player.getUniqueID().toString().equals(masterRitualStone.getOwner())) { + if (player.getGameProfile().getId().equals(masterRitualStone.getOwner())) { ItemStack keyStack = getStackFromItemFrame(world, masterPos, masterRitualStone.getDirection()); if (keyStack.isEmpty()) { return; @@ -77,7 +77,7 @@ public class RitualLivingArmourDowngrade extends Ritual { } IItemHandler inv = Utils.getInventory(tile, null); if (inv != null) { - List recipeList = new ArrayList(); + List recipeList = new ArrayList<>(); for (int i = 0; i < inv.getSlots(); i++) { ItemStack invStack = inv.getStackInSlot(i); if (!invStack.isEmpty()) { @@ -163,7 +163,7 @@ public class RitualLivingArmourDowngrade extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addRune(components, 0, 0, -1, EnumRuneType.AIR); this.addRune(components, 0, 0, -2, EnumRuneType.DUSK); @@ -180,25 +180,25 @@ public class RitualLivingArmourDowngrade extends Ritual { this.addRune(components, sgn * 2, 0, 2, EnumRuneType.AIR); this.addRune(components, sgn * 3, 0, 2, EnumRuneType.AIR); this.addRune(components, sgn * 3, 0, 3, EnumRuneType.AIR); - this.addRune(components, sgn * 1, 0, 0, EnumRuneType.EARTH); - this.addRune(components, sgn * 1, 0, 1, EnumRuneType.EARTH); + this.addRune(components, sgn, 0, 0, EnumRuneType.EARTH); + this.addRune(components, sgn, 0, 1, EnumRuneType.EARTH); this.addRune(components, sgn * 2, 0, -1, EnumRuneType.FIRE); this.addRune(components, sgn * 2, 0, -2, EnumRuneType.FIRE); this.addRune(components, sgn * 3, 0, -2, EnumRuneType.FIRE); this.addRune(components, sgn * 3, 0, -3, EnumRuneType.FIRE); this.addRune(components, sgn * 3, 0, -4, EnumRuneType.FIRE); - this.addRune(components, sgn * 1, 1, -1, EnumRuneType.AIR); - this.addRune(components, sgn * 1, 1, -2, EnumRuneType.AIR); - this.addRune(components, sgn * 1, 1, -4, EnumRuneType.FIRE); + this.addRune(components, sgn, 1, -1, EnumRuneType.AIR); + this.addRune(components, sgn, 1, -2, EnumRuneType.AIR); + this.addRune(components, sgn, 1, -4, EnumRuneType.FIRE); this.addRune(components, sgn * 2, 1, -4, EnumRuneType.FIRE); - this.addRune(components, sgn * 1, 0, -3, EnumRuneType.EARTH); - this.addRune(components, sgn * 1, 0, -4, EnumRuneType.EARTH); - this.addRune(components, sgn * 1, 0, -5, EnumRuneType.EARTH); - this.addRune(components, sgn * 1, 1, -5, EnumRuneType.EARTH); - this.addRune(components, sgn * 1, 2, -5, EnumRuneType.EARTH); - this.addRune(components, sgn * 1, 3, -5, EnumRuneType.EARTH); + this.addRune(components, sgn, 0, -3, EnumRuneType.EARTH); + this.addRune(components, sgn, 0, -4, EnumRuneType.EARTH); + this.addRune(components, sgn, 0, -5, EnumRuneType.EARTH); + this.addRune(components, sgn, 1, -5, EnumRuneType.EARTH); + this.addRune(components, sgn, 2, -5, EnumRuneType.EARTH); + this.addRune(components, sgn, 3, -5, EnumRuneType.EARTH); - this.addRune(components, sgn * 1, 3, -4, EnumRuneType.EARTH); + this.addRune(components, sgn, 3, -4, EnumRuneType.EARTH); } return components; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java index 42d262ed..86e3d325 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java @@ -73,7 +73,7 @@ public class RitualMagnetic extends Ritual { k = Math.min(radius, Math.max(-radius, lastPos.getZ())); } - while (j + pos.getY() >= 0) { + if (j + pos.getY() >= 0) { while (i <= radius) { while (k <= radius) { BlockPos newPos = pos.add(i, j, k); @@ -136,7 +136,7 @@ public class RitualMagnetic extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.EARTH); this.addParallelRunes(components, 2, 1, EnumRuneType.EARTH); @@ -162,12 +162,7 @@ public class RitualMagnetic extends Ritual { return false; BlockStack type = new BlockStack(block, meta); - Boolean result = oreBlockCache.get(type); - if (result == null) { - result = computeIsItemOre(type); - oreBlockCache.put(type, result); - } - return result; + return oreBlockCache.computeIfAbsent(type, RitualMagnetic::computeIsItemOre); } private static boolean computeIsItemOre(BlockStack type) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index 42052ea9..939fd82a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -96,7 +96,7 @@ public class RitualMeteor extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addParallelRunes(components, 2, 0, EnumRuneType.FIRE); this.addOffsetRunes(components, 3, 1, 0, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java index 7c4da792..27809a91 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java @@ -81,7 +81,7 @@ public class RitualPlacer extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); addRune(components, 3, 0, 3, EnumRuneType.EARTH); addRune(components, 3, 0, -3, EnumRuneType.EARTH); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java index 2dd00fe1..d62f2f64 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java @@ -184,7 +184,7 @@ public class RitualPortal extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); addRune(components, 1, 0, 0, EnumRuneType.AIR); addRune(components, 2, 0, 0, EnumRuneType.WATER); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index bdb869bc..1cb26be9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -92,7 +92,7 @@ public class RitualPump extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); addRune(components, 1, 0, 1, EnumRuneType.WATER); addRune(components, 1, 0, -1, EnumRuneType.EARTH); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java index b2eb76bb..1da5a885 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java @@ -154,7 +154,7 @@ public class RitualRegeneration extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); components.add(new RitualComponent(new BlockPos(4, 0, 0), EnumRuneType.AIR)); components.add(new RitualComponent(new BlockPos(5, 0, -1), EnumRuneType.AIR)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java index 57b51bcf..02d9fd7e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java @@ -154,7 +154,7 @@ public class RitualSpeed extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addRune(components, 0, 0, -2, EnumRuneType.DUSK); this.addRune(components, 1, 0, -1, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java index 3bb9ed0d..b944c9ec 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java @@ -57,7 +57,7 @@ public class RitualSuppression extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 2, 0, EnumRuneType.WATER); this.addRune(components, -2, 0, -1, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java index fe1a3a07..49ad448b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java @@ -104,7 +104,7 @@ public class RitualUpgradeRemove extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.DUSK); this.addCornerRunes(components, 2, 0, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java index 82e5bc43..0d784546 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java @@ -58,7 +58,7 @@ public class RitualWater extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.WATER); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index ba3bc5e0..44604cc5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -119,7 +119,7 @@ public class RitualWellOfSuffering extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addCornerRunes(components, 1, 0, EnumRuneType.FIRE); this.addCornerRunes(components, 2, -1, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java index a397d22e..fc4ea91f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java @@ -82,7 +82,7 @@ public class RitualZephyr extends Ritual { @Override public ArrayList getComponents() { - ArrayList components = new ArrayList(); + ArrayList components = new ArrayList<>(); this.addParallelRunes(components, 2, 0, EnumRuneType.AIR); this.addCornerRunes(components, 1, 1, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java index c898bf3e..59248e7f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java @@ -14,7 +14,7 @@ import java.util.List; public abstract class AreaDescriptor implements Iterator { public List getContainedPositions(BlockPos pos) { - return new ArrayList(); + return new ArrayList<>(); } public AxisAlignedBB getAABB(BlockPos pos) { @@ -92,7 +92,7 @@ public abstract class AreaDescriptor implements Iterator { @Override public List getContainedPositions(BlockPos pos) { if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { - ArrayList posList = new ArrayList(); + ArrayList posList = new ArrayList<>(); for (int j = minimumOffset.getY(); j < maximumOffset.getY(); j++) { for (int i = minimumOffset.getX(); i < maximumOffset.getX(); i++) { @@ -125,12 +125,12 @@ public abstract class AreaDescriptor implements Iterator { 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(); + blockPosCache = new ArrayList<>(); } @Override public void resetCache() { - this.blockPosCache = new ArrayList(); + this.blockPosCache = new ArrayList<>(); } @Override @@ -267,13 +267,13 @@ public abstract class AreaDescriptor implements Iterator { 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(); + blockPosCache = new ArrayList<>(); } @Override public List getContainedPositions(BlockPos pos) { if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { - ArrayList posList = new ArrayList(); + ArrayList posList = new ArrayList<>(); int i = -radius; int j = minimumOffset.getY(); @@ -318,7 +318,7 @@ public abstract class AreaDescriptor implements Iterator { @Override public void resetCache() { - this.blockPosCache = new ArrayList(); + this.blockPosCache = new ArrayList<>(); } @Override @@ -400,7 +400,7 @@ public abstract class AreaDescriptor implements Iterator { public Cross(BlockPos center, int size) { this.centerPos = center; this.size = size; - this.blockPosCache = new ArrayList(); + this.blockPosCache = new ArrayList<>(); } @Override @@ -424,7 +424,7 @@ public abstract class AreaDescriptor implements Iterator { @Override public void resetCache() { - blockPosCache = new ArrayList(); + blockPosCache = new ArrayList<>(); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java b/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java index 0944cbcb..6a3e7bf8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java @@ -3,5 +3,6 @@ package WayofTime.bloodmagic.ritual.data; public enum EnumRitualReaderState { SET_AREA, INFORMATION, - SET_WILL_TYPES; + SET_WILL_TYPES, + ; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java index b2a4d680..fae7e240 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java @@ -22,11 +22,11 @@ import java.util.Map.Entry; * {@link RitualRegistry#registerRitual(Ritual, String)} */ public abstract class Ritual { - public final ArrayList ritualComponents = new ArrayList(); - protected final Map modableRangeMap = new HashMap(); - protected final Map volumeRangeMap = new HashMap(); - protected final Map horizontalRangeMap = new HashMap(); - protected final Map verticalRangeMap = new HashMap(); + public final ArrayList ritualComponents = new ArrayList<>(); + 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; @@ -159,7 +159,7 @@ public abstract class Ritual { } public List getListOfRanges() { - return new ArrayList(modableRangeMap.keySet()); + return new ArrayList<>(modableRangeMap.keySet()); } public String getNextBlockRange(String range) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index 8e5e9a61..e6f600ed 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -121,9 +121,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler { } } catch (NoSuchMethodException e) { BloodMagic.instance.logger.error("HarvestCraft integration cancelled; unable to find crop name mapper"); - } catch (IllegalAccessException e) { - BloodMagic.instance.logger.error("HarvestCraft integration cancelled; crop name lookup broke"); - } catch (InvocationTargetException e) { + } catch (IllegalAccessException | InvocationTargetException e) { BloodMagic.instance.logger.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 index 15f06cdf..79aa7dbd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -32,7 +32,7 @@ public class HarvestHandlerStem implements IHarvestHandler { @Override public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) { boolean retFlag = false; - List drops = new ArrayList(); + List drops = new ArrayList<>(); BlockPos cropPos = pos; if (HarvestRegistry.getStemCrops().containsKey(blockStack)) { EnumFacing cropDir = blockStack.getBlock().getActualState(blockStack.getState(), world, pos).getValue(BlockStem.FACING); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java index f643015e..a9f11698 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java @@ -27,7 +27,7 @@ public class HarvestHandlerTall implements IHarvestHandler { public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) { boolean retFlag = false; - List drops = new ArrayList(); + List drops = new ArrayList<>(); if (HarvestRegistry.getTallCrops().contains(blockStack)) { BlockStack up = BlockStack.getStackFromPos(world, pos.up()); if (up.equals(blockStack)) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java index fbf098d3..bdcd9fdd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java @@ -17,13 +17,13 @@ public class LocationsHandler implements Serializable { private static LocationsHandler locationsHandler; private LocationsHandler() { - portals = new HashMap>(); + portals = new HashMap<>(); } public boolean addLocation(String name, PortalLocation location) { ArrayList portalLocations = portals.get(name); if (portalLocations == null) { - portals.put(name, new ArrayList()); + portals.put(name, new ArrayList<>()); updateFile(fileName, portals); } if (!portals.get(name).isEmpty() && portals.get(name).size() >= 2) { diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java index 81c51625..5de7f9cb 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -25,7 +25,7 @@ public class RoutingFluidFilter implements IFluidFilter { this.fluidHandler = fluidHandler; if (isFilterOutput) { //The requestList contains a list of how much can be extracted. - requestList = new ArrayList(); + requestList = new ArrayList<>(); for (ItemStack filterStack : filteredList) { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); if (fluidFilterStack != null) { @@ -46,7 +46,7 @@ public class RoutingFluidFilter implements IFluidFilter { } } } else { - requestList = new ArrayList(); + requestList = new ArrayList<>(); for (ItemStack filterStack : filteredList) { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); if (fluidFilterStack != null) { diff --git a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java index ecf423d7..2e45865d 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java @@ -86,13 +86,7 @@ public class TestItemFilter implements IItemFilter { } } - Iterator iterator = requestList.iterator(); - while (iterator.hasNext()) { - ItemStack filterStack = iterator.next(); - if (filterStack.isEmpty()) { - iterator.remove(); - } - } + requestList.removeIf(ItemStack::isEmpty); } /** diff --git a/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java index 91422105..5ac2397d 100644 --- a/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java +++ b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java @@ -6,7 +6,7 @@ import java.util.HashMap; import java.util.Map.Entry; public class DemonWillHolder { - public HashMap willMap = new HashMap(); + public HashMap willMap = new HashMap<>(); public double addWill(EnumDemonWillType type, double amount, double max) { double current = 0; diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index c0137c5d..8170946d 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -17,9 +17,9 @@ public class Dungeon { public static boolean placeStructureAtPosition(Random rand, WorldServer 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 + 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; @@ -49,7 +49,7 @@ public class Dungeon { //Initial AreaDescriptors and door positions are initialized. Time for fun! for (int i = 0; i < 100; i++) { - List facingList = new ArrayList(); + List facingList = new ArrayList<>(); for (Entry> entry : availableDoorMap.entrySet()) { if (entry.getValue() != null && !entry.getValue().isEmpty()) { facingList.add(entry.getKey()); @@ -62,7 +62,6 @@ public class Dungeon { Pair removedDoor2 = null; BlockPos roomLocation = null; - roomPlacement: for (EnumFacing doorFacing : facingList) { EnumFacing oppositeDoorFacing = doorFacing.getOpposite(); List availableDoorList = availableDoorMap.get(doorFacing); //May need to copy here @@ -97,8 +96,9 @@ public class Dungeon { room = testingRoom; - break roomPlacement; } + + break; } // Collections.shuffle(otherDoorList); diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java index dac62074..de848276 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java @@ -13,10 +13,10 @@ import java.util.Map.Entry; public class DungeonRoom { public int dungeonWeight = 1; - public Map structureMap = new HashMap(); + 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 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; @@ -25,7 +25,7 @@ public class DungeonRoom { } public List getAreaDescriptors(PlacementSettings settings, BlockPos offset) { - List newList = new ArrayList(); + List newList = new ArrayList<>(); for (AreaDescriptor desc : descriptorList) { newList.add(desc.rotateDescriptor(settings).offset(offset)); @@ -35,7 +35,7 @@ public class DungeonRoom { } public List getDoorOffsetsForFacing(PlacementSettings settings, EnumFacing facing, BlockPos offset) { - List offsetList = new ArrayList(); + List offsetList = new ArrayList<>(); EnumFacing originalFacing = DungeonUtil.reverseRotate(settings.getMirror(), settings.getRotation(), facing); if (doorMap.containsKey(originalFacing)) { diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java index 3bd4ab75..5dd80e81 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java @@ -6,7 +6,7 @@ import java.util.Map.Entry; import java.util.Random; public class DungeonRoomRegistry { - public static Map dungeonWeightMap = new HashMap(); + public static Map dungeonWeightMap = new HashMap<>(); private static int totalWeight = 0; public static void registerDungeonRoom(DungeonRoom room, int weight) { diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java index 9534787e..ddf6c518 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java @@ -38,7 +38,7 @@ public class DungeonUtil { if (doorMap.containsKey(facing)) { doorMap.get(facing).add(offsetPos); } else { - List doorList = new ArrayList(); + List doorList = new ArrayList<>(); doorList.add(offsetPos); doorMap.put(facing, doorList); } diff --git a/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java b/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java index 8b3d72e5..1f7463f5 100644 --- a/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java @@ -11,7 +11,7 @@ public class TeleportQueue { private static List queue; private TeleportQueue() { - queue = new ArrayList(); + queue = new ArrayList<>(); } public void addITeleport(ITeleport iTeleport) { diff --git a/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java b/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java index 16e7a6fc..4a02d90a 100644 --- a/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java @@ -17,7 +17,7 @@ public class TeleporterBloodMagic extends Teleporter { @Override public void removeStalePortalLocations(long worldTime) { - ; + } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 4d1b42cf..2ee25431 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -17,7 +17,6 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche public boolean isActive = false; public int activeCounter = 0; public EnumFacing rotation = EnumFacing.HORIZONTALS[0]; - ; private String key = "empty"; private AlchemyArrayEffect arrayEffect; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 5693df57..fd911ee6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -168,7 +168,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } public List getAccessibleInputSlots(EnumFacing direction) { - List list = new ArrayList(); + List list = new ArrayList<>(); for (int i = 0; i < 6; i++) { if (isInputSlotAccessible(i)) { @@ -185,7 +185,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return; } - List inputList = new ArrayList(); + List inputList = new ArrayList<>(); for (int i = 0; i < 6; i++) { if (!getStackInSlot(i).isEmpty()) { diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index 3d05fe43..7685e0fc 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -17,7 +17,7 @@ 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 HashMap willMap = new HashMap<>(); //TODO: Change to DemonWillHolder public int internalCounter = 0; public TileDemonCrucible() { diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index 1601a07a..125f8cca 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -22,7 +22,7 @@ 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 Map tranquilityMap = new HashMap<>(); public double incenseAddition = 0; //Self-sacrifice is multiplied by 1 plus this value. public double tranquility = 0; @@ -55,7 +55,7 @@ public class TileIncenseAltar extends TileInventory implements ITickable { if (hasPerformed) { if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) { WorldServer server = (WorldServer) 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, new int[0]); + server.spawnParticle(EnumParticleTypes.FLAME, pos.getX() + 0.5, pos.getY() + 1.2, pos.getZ() + 0.5, 1, 0.02, 0.03, 0.02, 0); } } } @@ -80,7 +80,7 @@ public class TileIncenseAltar extends TileInventory implements ITickable { 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(); + Map tranquilityMap = new HashMap<>(); for (int currentDistance = 2; currentDistance < currentDistance + maxLength; currentDistance++) { boolean canFormRoad = false; @@ -116,7 +116,7 @@ public class TileIncenseAltar extends TileInventory implements ITickable { continue; //TODO: Can make this just set j to currentDistance to speed it up. } - for (int y = 0 + yOffset; y <= 2 + yOffset; y++) { + for (int y = yOffset; y <= 2 + yOffset; y++) { BlockPos offsetPos = pos.add(i, y, j); IBlockState state = getWorld().getBlockState(offsetPos); Block block = state.getBlock(); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index 638930a3..a947fda7 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -19,7 +19,6 @@ 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.ITimeValue; import net.minecraftforge.common.animation.TimeValues.VariableValue; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.model.animation.CapabilityAnimation; @@ -64,7 +63,7 @@ public class TileInversionPillar extends TileTicking { 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)); + asm = BloodMagic.proxy.load(new ResourceLocation(BloodMagic.MODID.toLowerCase(), "asms/block/inversion_pillar.json"), ImmutableMap.of("offset", animationOffset, "cycle_length", cycleLength)); animationOffsetValue = -1; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 4e140dea..0bbf0441 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -40,7 +40,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS private Ritual currentRitual; private EnumFacing direction = EnumFacing.NORTH; private boolean inverted; - private List currentActiveWillConfig = new ArrayList(); + private List currentActiveWillConfig = new ArrayList<>(); @Override public void onUpdate() { @@ -322,7 +322,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS @Override public List getActiveWillConfig() { - return new ArrayList(currentActiveWillConfig); + return new ArrayList<>(currentActiveWillConfig); } @Override @@ -330,17 +330,17 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS //There is probably an easier way to make expanded chat messages if (typeList.size() >= 1) { Object[] translations = new TextComponentTranslation[typeList.size()]; - String constructedString = "%s"; + StringBuilder constructedString = new StringBuilder("%s"); for (int i = 1; i < typeList.size(); i++) { - constructedString = constructedString + ", %s"; + constructedString.append(", %s"); } for (int i = 0; i < typeList.size(); i++) { translations[i] = new TextComponentTranslation("tooltip.bloodmagic.currentBaseType." + typeList.get(i).name.toLowerCase()); } - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.set", new TextComponentTranslation(constructedString, translations))); + ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.set", new TextComponentTranslation(constructedString.toString(), translations))); } else { ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.void")); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index 46ed0004..1076ba17 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -339,9 +339,7 @@ public class TileMimic extends TileInventory implements ITickable { try { _blockMetadata.setInt(tile, replacementMeta); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { + } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java index 3e90cb5d..88ea4e75 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -57,7 +57,7 @@ public class TilePurificationAltar extends TileInventory implements ITickable { if (hasPerformed) { if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) { WorldServer server = (WorldServer) 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, new int[0]); + server.spawnParticle(EnumParticleTypes.FLAME, pos.getX() + 0.5, pos.getY() + 1.2, pos.getZ() + 0.5, 1, 0.02, 0.03, 0.02, 0); } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index f6909c28..3640b6c7 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -72,7 +72,7 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil double soulsInGem = getWill(EnumDemonWillType.DEFAULT); - List inputList = new ArrayList(); + List inputList = new ArrayList<>(); for (int i = 0; i < 4; i++) if (!getStackInSlot(i).isEmpty()) diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index c760c950..250752bd 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -20,10 +20,10 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti 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(); + 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"); @@ -43,12 +43,12 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti return; } - Map> outputMap = new TreeMap>(); - Map> outputFluidMap = new TreeMap>(); + Map> outputMap = new TreeMap<>(); + Map> outputFluidMap = new TreeMap<>(); for (BlockPos outputPos : outputNodeList) { TileEntity outputTile = getWorld().getTileEntity(outputPos); - if (this.isConnected(new LinkedList(), outputPos)) { + if (this.isConnected(new LinkedList<>(), outputPos)) { if (outputTile instanceof IOutputItemRoutingNode) { IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; @@ -63,7 +63,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (outputMap.containsKey(priority)) { outputMap.get(priority).add(filter); } else { - List filterList = new LinkedList(); + List filterList = new LinkedList<>(); filterList.add(filter); outputMap.put(priority, filterList); } @@ -85,7 +85,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (outputMap.containsKey(priority)) { outputFluidMap.get(priority).add(filter); } else { - List filterList = new LinkedList(); + List filterList = new LinkedList<>(); filterList.add(filter); outputFluidMap.put(priority, filterList); } @@ -95,12 +95,12 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - Map> inputMap = new TreeMap>(); - Map> inputFluidMap = new TreeMap>(); + Map> inputMap = new TreeMap<>(); + Map> inputFluidMap = new TreeMap<>(); for (BlockPos inputPos : inputNodeList) { TileEntity inputTile = getWorld().getTileEntity(inputPos); - if (this.isConnected(new LinkedList(), inputPos)) { + if (this.isConnected(new LinkedList<>(), inputPos)) { if (inputTile instanceof IInputItemRoutingNode) { IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; @@ -115,7 +115,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (inputMap.containsKey(priority)) { inputMap.get(priority).add(filter); } else { - List filterList = new LinkedList(); + List filterList = new LinkedList<>(); filterList.add(filter); inputMap.put(priority, filterList); } @@ -137,7 +137,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (inputMap.containsKey(priority)) { inputFluidMap.get(priority).add(filter); } else { - List filterList = new LinkedList(); + List filterList = new LinkedList<>(); filterList.add(filter); inputFluidMap.put(priority, filterList); } @@ -315,7 +315,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (connectionMap.containsKey(pos1) && !connectionMap.get(pos1).contains(pos2)) { connectionMap.get(pos1).add(pos2); } else { - List list = new LinkedList(); + List list = new LinkedList<>(); list.add(pos2); connectionMap.put(pos1, list); } @@ -323,7 +323,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) { connectionMap.get(pos2).add(pos1); } else { - List list = new LinkedList(); + List list = new LinkedList<>(); list.add(pos1); connectionMap.put(pos2, list); } @@ -360,7 +360,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti @Override public List getConnected() { - return new LinkedList(); + return new LinkedList<>(); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java index fbc6c626..66c6b4df 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -21,7 +21,7 @@ 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(); + private List connectionList = new LinkedList<>(); public TileRoutingNode(int size, String name) { super(size, name); diff --git a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java index e11ccb24..b82710f9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java @@ -219,12 +219,7 @@ public class ChatUtil { public static class Handler implements IMessageHandler { @Override public IMessage onMessage(final PacketNoSpamChat message, MessageContext ctx) { - Minecraft.getMinecraft().addScheduledTask(new Runnable() { - @Override - public void run() { - sendNoSpamMessages(message.chatLines); - } - }); + Minecraft.getMinecraft().addScheduledTask(() -> sendNoSpamMessages(message.chatLines)); return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java index 0163eea1..d1d648d0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java @@ -96,7 +96,7 @@ public class ItemStackWrapper { } public static List toWrapperList(List itemStackList) { - List wrapperList = new ArrayList(); + List wrapperList = new ArrayList<>(); for (ItemStack stack : itemStackList) wrapperList.add(ItemStackWrapper.getHolder(stack)); @@ -104,7 +104,7 @@ public class ItemStackWrapper { } public static List toStackList(List wrapperList) { - List stackList = new ArrayList(); + List stackList = new ArrayList<>(); for (ItemStackWrapper wrapper : wrapperList) stackList.add(wrapper.toStack()); diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 88c989b8..417eddad 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -231,9 +231,7 @@ public class Utils { public static boolean isInteger(String integer) { try { Integer.parseInt(integer); - } catch (NumberFormatException e) { - return false; - } catch (NullPointerException e) { + } catch (NumberFormatException | NullPointerException e) { return false; } // only got here if we didn't return false @@ -365,7 +363,7 @@ public class Utils { public static float applyArmor(EntityLivingBase entity, ItemStack[] inventory, DamageSource source, double damage) { damage *= 25; - ArrayList dmgVals = new ArrayList(); + ArrayList dmgVals = new ArrayList<>(); for (int x = 0; x < inventory.length; x++) { ItemStack stack = inventory[x]; if (stack.isEmpty()) { diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index f99d4ec6..e1025a32 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -55,7 +55,7 @@ import java.util.*; 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 final List hudElements = new ArrayList(); + public static final List hudElements = new ArrayList<>(); public static TextureAtlasSprite ritualStoneBlank; public static TextureAtlasSprite ritualStoneWater; public static TextureAtlasSprite ritualStoneFire; @@ -191,13 +191,13 @@ public class ClientHandler { Set missingVariants = ReflectionHelper.getPrivateValue(ModelLoader.class, event.getModelLoader(), "missingVariants"); // Collect all Blood Magic model errors - List errored = new ArrayList(); + List errored = new ArrayList<>(); for (ResourceLocation modelError : modelErrors.keySet()) if (modelError.getResourceDomain().equalsIgnoreCase(BloodMagic.MODID)) errored.add(modelError); // Collect all Blood Magic variant errors - List missing = new ArrayList(); + List missing = new ArrayList<>(); for (ModelResourceLocation missingVariant : missingVariants) if (missingVariant.getResourceDomain().equalsIgnoreCase(BloodMagic.MODID)) missing.add(missingVariant); @@ -228,7 +228,7 @@ public class ClientHandler { String mc = "minecraft"; String format = "textures/%s.png"; - Set toRemove = new HashSet(); + 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)) { diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index a859d993..1eafcbe6 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -127,7 +127,7 @@ public class CraftingHandler { if (rightUpgrade != null) { String key = ItemHelper.LivingUpgrades.getKey(event.getRight()); ItemStack outputStack = event.getLeft().copy(); - List keyList = new ArrayList(); + List keyList = new ArrayList<>(); keyList.add(key); if (((IUpgradeTrainer) event.getLeft().getItem()).setTrainedUpgrades(outputStack, keyList)) { event.setCost(1); 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 cd8bebf3..8ba5b079 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -34,7 +34,6 @@ import WayofTime.bloodmagic.potion.BMPotionUtils; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.*; -import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; @@ -54,7 +53,6 @@ import net.minecraft.init.MobEffects; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumHand; import net.minecraft.util.EnumParticleTypes; @@ -74,7 +72,6 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; import net.minecraftforge.event.world.ExplosionEvent; 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; @@ -85,10 +82,10 @@ import java.util.*; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class GenericHandler { - public static Map bounceMap = new HashMap(); - public static Map filledHandMap = new HashMap(); - private static Map targetTaskMap = new HashMap(); - private static Map attackTaskMap = new HashMap(); + public static Map bounceMap = new HashMap<>(); + public static Map filledHandMap = new HashMap<>(); + private static Map targetTaskMap = new HashMap<>(); + private static Map attackTaskMap = new HashMap<>(); @SubscribeEvent public static void onEntityFall(LivingFallEvent event) { @@ -218,7 +215,7 @@ public class GenericHandler { EntityAnimal animal = (EntityAnimal) event.getEntityLiving(); if (animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { if (!targetTaskMap.containsKey(animal)) { - EntityAITarget task = new EntityAINearestAttackableTarget(animal, EntityMob.class, false); + EntityAITarget task = new EntityAINearestAttackableTarget<>(animal, EntityMob.class, false); EntityAIBase attackTask = new EntityAIAttackMelee(animal, 1.0D, false); animal.targetTasks.addTask(1, task); animal.tasks.addTask(1, attackTask); 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 ce76a8d0..4b735090 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -37,7 +37,7 @@ import java.util.concurrent.CopyOnWriteArrayList; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class WillHandler { - private static final HashMap SERVER_TICKS = new HashMap(); + private static final HashMap SERVER_TICKS = new HashMap<>(); // Adds Will to player @SubscribeEvent diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index 1b3a4bda..279498e4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -2,14 +2,12 @@ package WayofTime.bloodmagic.util.helper; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.SoulNetworkEvent; 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 com.google.common.base.Strings; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java index c79afba7..e98cccfb 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java @@ -4,7 +4,7 @@ import java.util.TreeMap; public class NumeralHelper { - private static final TreeMap romanNumerals = new TreeMap(); + private static final TreeMap romanNumerals = new TreeMap<>(); static { romanNumerals.put(1000, "M"); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java index 42b3a443..8b9c3e35 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java @@ -36,7 +36,7 @@ public class TextHelper { } public static ArrayList localizeAll(List input) { - ArrayList ret = new ArrayList(input.size()); + ArrayList ret = new ArrayList<>(input.size()); for (int i = 0; i < input.size(); i++) ret.add(i, localize(input.get(i))); @@ -44,7 +44,7 @@ public class TextHelper { } public static ArrayList localizeAllEffect(List input) { - ArrayList ret = new ArrayList(input.size()); + ArrayList ret = new ArrayList<>(input.size()); for (int i = 0; i < input.size(); i++) ret.add(i, localizeEffect(input.get(i))); From f025407014c85896fa28c7f872660eec6feb5920 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 1 Mar 2018 19:40:37 -0800 Subject: [PATCH 217/595] Move fuel handling to new event --- .../WayofTime/bloodmagic/fuel/FuelHandler.java | 17 ----------------- .../WayofTime/bloodmagic/proxy/CommonProxy.java | 3 --- .../util/handler/event/CraftingHandler.java | 9 +++++++++ 3 files changed, 9 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java diff --git a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java b/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java deleted file mode 100644 index 29b01c00..00000000 --- a/src/main/java/WayofTime/bloodmagic/fuel/FuelHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -package WayofTime.bloodmagic.fuel; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.IFuelHandler; - -public class FuelHandler implements IFuelHandler { - @Override - public int getBurnTime(ItemStack fuel) { - if (fuel != null && fuel.getItem() == RegistrarBloodMagicItems.COMPONENT && fuel.getMetadata() == ComponentTypes.SAND_COAL.ordinal()) { - return 1600; - } - - return 0; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java index bfc6ee8d..34643085 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.proxy; import WayofTime.bloodmagic.ritual.data.CapabilityRuneType; import WayofTime.bloodmagic.ritual.data.IRitualStone; import WayofTime.bloodmagic.teleport.TeleportQueue; -import WayofTime.bloodmagic.fuel.FuelHandler; import com.google.common.collect.ImmutableMap; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -13,12 +12,10 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.animation.ITimeValue; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.model.animation.IAnimationStateMachine; -import net.minecraftforge.fml.common.registry.GameRegistry; public class CommonProxy { public void preInit() { MinecraftForge.EVENT_BUS.register(TeleportQueue.getInstance()); - GameRegistry.registerFuelHandler(new FuelHandler()); registerRenderers(); } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index 1eafcbe6..119e96a2 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -1,6 +1,7 @@ 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; @@ -15,8 +16,10 @@ import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntityFurnace; 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; @@ -137,4 +140,10 @@ public class CraftingHandler { } } } + + @SubscribeEvent + public static void handleFuelLevel(FurnaceFuelBurnTimeEvent event) { + if (event.getItemStack().getItem() == RegistrarBloodMagicItems.COMPONENT && event.getItemStack().getMetadata() == ComponentTypes.SAND_COAL.ordinal()) + event.setBurnTime(TileEntityFurnace.getItemBurnTime(new ItemStack(Items.COAL))); + } } From 022fe00847814b1fcd23eb147c5241aa8803b484 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 2 Mar 2018 14:46:59 -0500 Subject: [PATCH 218/595] Worked on the Ellipsoid Ritual (currently disabled). No, it is not used to summon mathematical demons. --- .../bloodmagic/registry/ModRituals.java | 18 +- .../bloodmagic/ritual/RitualEllipsoid.java | 202 ++++++++++++++++++ 2 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 46e18f52..5f5a6564 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -18,7 +18,8 @@ import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualResistance; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualZombie; import net.minecraft.init.Blocks; -public class ModRituals { +public class ModRituals +{ public static Ritual waterRitual; public static Ritual lavaRitual; public static Ritual greenGroveRitual; @@ -48,6 +49,8 @@ public class ModRituals { public static Ritual altarBuilderRitual; public static Ritual portalRitual; + public static Ritual ellipsoidRitual; + public static Ritual meteorRitual; public static Ritual downgradeRitual; @@ -57,7 +60,8 @@ public class ModRituals { public static ImperfectRitual imperfectResistance; public static ImperfectRitual imperfectZombie; - public static void initRituals() { + public static void initRituals() + { waterRitual = new RitualWater(); RitualRegistry.registerRitual(waterRitual, ConfigHandler.rituals.ritualWater); lavaRitual = new RitualLava(); @@ -115,14 +119,19 @@ public class ModRituals { RitualRegistry.registerRitual(portalRitual, ConfigHandler.rituals.ritualPortal); meteorRitual = new RitualMeteor(); RitualRegistry.registerRitual(meteorRitual, ConfigHandler.rituals.ritualMeteor); + downgradeRitual = new RitualLivingArmourDowngrade(); RitualRegistry.registerRitual(downgradeRitual, ConfigHandler.rituals.ritualDowngrade); + ellipsoidRitual = new RitualEllipsoid(); + RitualRegistry.registerRitual(ellipsoidRitual, false); + RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.BASIC.getStack(), 250, 0.5); RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.EXPLOSIVE.getStack(), 25, 0.05); } - public static void initImperfectRituals() { + public static void initImperfectRituals() + { imperfectNight = new ImperfectRitualNight(); ImperfectRitualRegistry.registerRitual(imperfectNight, ConfigHandler.rituals.imperfect.imperfectRitualNight); imperfectRain = new ImperfectRitualRain(); @@ -133,7 +142,8 @@ public class ModRituals { ImperfectRitualRegistry.registerRitual(imperfectZombie, ConfigHandler.rituals.imperfect.imperfectRitualZombie); } - public static void initHarvestHandlers() { + public static void initHarvestHandlers() + { HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.DIAMOND_BLOCK), 15); HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.GOLD_BLOCK), 10); HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.IRON_BLOCK), 6); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java new file mode 100644 index 00000000..cc62e700 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java @@ -0,0 +1,202 @@ +package WayofTime.bloodmagic.ritual; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.util.Utils; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +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; + +public class RitualEllipsoid extends Ritual +{ +// public static final String FELLING_RANGE = "fellingRange"; + 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(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); + } + + @Override + public void performRitual(IMasterRitualStone masterRitualStone) + { + World world = masterRitualStone.getWorldObj(); + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); + + BlockPos masterPos = masterRitualStone.getBlockPos(); + AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); + + if (currentEssence < getRefreshCost()) + { + masterRitualStone.getOwnerNetwork().causeNausea(); + return; + } + + if (tileInventory != null) + { + IItemHandler inventory = Utils.getInventory(tileInventory, EnumFacing.DOWN); + int numSlots = inventory.getSlots(); + if (numSlots >= 3) + { + ItemStack xStack = inventory.getStackInSlot(0); + ItemStack yStack = inventory.getStackInSlot(1); + ItemStack zStack = inventory.getStackInSlot(2); + + if (xStack.isEmpty() || yStack.isEmpty() || zStack.isEmpty()) + { + return; + } + + int xR = xStack.getCount(); + int yR = yStack.getCount(); + int zR = zStack.getCount(); + + int j = -yR; + int i = -xR; + int k = -zR; + + if (currentPos != null) + { + j = currentPos.getY(); + i = Math.min(xR, Math.max(-xR, currentPos.getX())); + k = Math.min(zR, Math.max(-zR, currentPos.getZ())); + } + + while (j <= yR) + { + while (i <= xR) + { + while (k <= zR) + { + if (checkIfEllipsoidShell(xR, yR, zR, i, j, k)) + { + BlockPos newPos = masterPos.add(i, j, k); + + if (world.isAirBlock(newPos)) + { + if (j > 0) + { + world.setBlockState(newPos, Blocks.GLASS.getDefaultState()); + } else + { + world.setBlockState(newPos, Blocks.STONE.getDefaultState()); + } + k++; + this.currentPos = new BlockPos(i, j, k); + return; + } + } + k++; + } + i++; + k = -zR; + } + j++; + i = -xR; + this.currentPos = new BlockPos(i, j, k); + return; + } + + j = -yR; + 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 0; + } + + @Override + public int getRefreshTime() + { + return 1; + } + +// @Override +// public void readFromNBT(NBTTagCompound tag) +// { +// super.readFromNBT(tag); +// tag +// } + + @Override + public ArrayList getComponents() + { + ArrayList components = new ArrayList(); + + addCornerRunes(components, 1, 0, EnumRuneType.WATER); + addCornerRunes(components, 1, 1, EnumRuneType.WATER); + + return components; + } + + @Override + public Ritual getNewCopy() + { + return new RitualEllipsoid(); + } +} From 08031e65f822e877427e7e7084a29b94011391de Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 2 Mar 2018 15:21:51 -0500 Subject: [PATCH 219/595] Fixed client-sided crash in the Blood Light sigil by rearranging a few arguments. --- changelog.txt | 6 +++ .../item/sigil/ItemSigilBloodLight.java | 41 +++++++++++++------ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/changelog.txt b/changelog.txt index 3a1b7fea..5a76db06 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +------------------------------------------------------ +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. + ------------------------------------------------------ Version 2.2.7 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 5fb9b806..42b5f026 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -18,19 +18,23 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -public class ItemSigilBloodLight extends ItemSigilBase { - public ItemSigilBloodLight() { +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) { + 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, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) + { ItemStack stack = player.getHeldItem(hand); if (stack.getItem() instanceof ISigil.Holding) stack = ((Holding) stack.getItem()).getHeldItem(stack, player); @@ -42,20 +46,27 @@ public class ItemSigilBloodLight extends ItemSigilBase { if (getCooldownRemainder(stack) > 0) return super.onItemRightClick(world, player, hand); - SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); - if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { + if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) + { BlockPos blockPos = mop.getBlockPos().offset(mop.sideHit); - if (world.isAirBlock(blockPos)) { + if (world.isAirBlock(blockPos)) + { world.setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); if (!world.isRemote) + { + SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); network.syphonAndDamage(player, getLpUsed()); + } resetCooldown(stack); player.swingArm(hand); return super.onItemRightClick(world, player, hand); } - } else { - if (!world.isRemote) { + } else + { + if (!world.isRemote) + { + SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); world.spawnEntity(new EntityBloodLight(world, player)); network.syphonAndDamage(player, getLpUsed()); } @@ -66,19 +77,23 @@ public class ItemSigilBloodLight extends ItemSigilBase { } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) + { return oldStack.getItem() != newStack.getItem(); } - public int getCooldownRemainder(ItemStack stack) { + public int getCooldownRemainder(ItemStack stack) + { return NBTHelper.checkNBT(stack).getTagCompound().getInteger(Constants.NBT.TICKS_REMAINING); } - public void reduceCooldown(ItemStack stack) { + public void reduceCooldown(ItemStack stack) + { NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.TICKS_REMAINING, getCooldownRemainder(stack) - 1); } - public void resetCooldown(ItemStack stack) { + public void resetCooldown(ItemStack stack) + { NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.TICKS_REMAINING, 10); } } From 7a02783e3122349001037b75acd6f14986992d5e Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 2 Mar 2018 15:29:45 -0500 Subject: [PATCH 220/595] Changed the recipe of the Teleport array. --- changelog.txt | 2 ++ src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 5a76db06..567608ca 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,8 @@ 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! ------------------------------------------------------ Version 2.2.7 diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 4a49327e..0fb77ac2 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -95,7 +95,7 @@ public class ModRecipes 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.FEATHER), new ItemStack(Items.APPLE), new AlchemyArrayEffectTeleport("teleport"), new StaticAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/teleportation.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(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"))); From 927fc6498ffce6d102cf8f95d2d2b3423e50b3de Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 3 Mar 2018 19:16:53 -0800 Subject: [PATCH 221/595] Cleanup harvest handling --- .../core/registry/HarvestRegistry.java | 102 ----------------- .../bloodmagic/iface/IHarvestHandler.java | 26 ----- .../bloodmagic/registry/ModRituals.java | 8 +- .../bloodmagic/ritual/RitualHarvest.java | 51 +++++++-- .../harvest/HarvestHandlerPlantable.java | 60 +++++----- .../ritual/harvest/HarvestHandlerStem.java | 61 +++++----- .../ritual/harvest/HarvestHandlerTall.java | 49 ++++---- .../ritual/harvest/HarvestRegistry.java | 105 ++++++++++++++++++ .../ritual/harvest/IHarvestHandler.java | 37 ++++++ 9 files changed, 263 insertions(+), 236 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/IHarvestHandler.java create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/harvest/IHarvestHandler.java diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java deleted file mode 100644 index 9be7251b..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/registry/HarvestRegistry.java +++ /dev/null @@ -1,102 +0,0 @@ -package WayofTime.bloodmagic.core.registry; - -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.iface.IHarvestHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockStem; - -import java.util.*; - -public class HarvestRegistry { - private static List handlerList = new ArrayList<>(); - private static Map standardCrops = new HashMap<>(); - private static Set tallCrops = new HashSet<>(); - private static Map stemCrops = new HashMap<>(); - private static Map amplifierMap = new HashMap<>(); - - /** - * Registers a handler for the Harvest Ritual to call. - * - * @param handler - The custom handler to register - */ - public static void registerHandler(IHarvestHandler handler) { - if (!handlerList.contains(handler)) - handlerList.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 (!standardCrops.containsKey(crop)) - standardCrops.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(BlockStack crop) { - if (!tallCrops.contains(crop)) - tallCrops.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 BlockStem} - * - * @param crop - The crop block to handle. - * @param stem - The stem of the crop - */ - public static void registerStemCrop(BlockStack crop, BlockStack stem) { - if (!stemCrops.containsKey(crop) && stem.getBlock() instanceof BlockStem) - stemCrops.put(stem, crop); - } - - /** - * Registers a range amplifier for the Harvest Ritual. - * - * @param blockStack - The block for the amplifier. - * @param range - The range the amplifier provides. - */ - public static void registerRangeAmplifier(BlockStack blockStack, int range) { - if (!amplifierMap.containsKey(blockStack)) - amplifierMap.put(blockStack, range); - } - - public static List getHandlerList() { - return new ArrayList<>(handlerList); - } - - public static Map getStandardCrops() { - return new HashMap<>(standardCrops); - } - - public static Set getTallCrops() { - return new HashSet<>(tallCrops); - } - - public static Map getStemCrops() { - return new HashMap<>(stemCrops); - } - - public static Map getAmplifierMap() { - return new HashMap<>(amplifierMap); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/IHarvestHandler.java b/src/main/java/WayofTime/bloodmagic/iface/IHarvestHandler.java deleted file mode 100644 index 91240f62..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/IHarvestHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -/** - * 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, plant a new one, and drop the produced - * items.
        - * Make sure to do checks so you are certain the blocks being handled are - * the block types you want. - * - * @param world - The world the - * {@link IMasterRitualStone} is in. - * @param pos - The position of the Block being checked - * @param blockStack - The Block being checked - * @return If the block was successfully harvested. - */ - boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack); -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 5f5a6564..8582d583 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.core.registry.HarvestRegistry; +import WayofTime.bloodmagic.ritual.harvest.HarvestRegistry; import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; import WayofTime.bloodmagic.core.registry.RitualRegistry; import WayofTime.bloodmagic.ritual.data.Ritual; @@ -144,9 +144,9 @@ public class ModRituals public static void initHarvestHandlers() { - HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.DIAMOND_BLOCK), 15); - HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.GOLD_BLOCK), 10); - HarvestRegistry.registerRangeAmplifier(new BlockStack(Blocks.IRON_BLOCK), 6); + 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()); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java index ec6650f1..63036470 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java @@ -1,14 +1,23 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.iface.IHarvestHandler; -import WayofTime.bloodmagic.core.registry.HarvestRegistry; +import WayofTime.bloodmagic.ritual.harvest.IHarvestHandler; +import WayofTime.bloodmagic.ritual.harvest.HarvestRegistry; import WayofTime.bloodmagic.ritual.data.*; +import com.google.common.collect.Lists; +import net.minecraft.block.state.IBlockState; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; 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.ArrayList; +import java.util.List; /** * This ritual uses registered {@link IHarvestHandler}'s to harvest blocks. @@ -18,7 +27,7 @@ import java.util.ArrayList; *

        * This ritual includes a way to change the range based on what block is above * the MasterRitualStone. You can use - * {@link HarvestRegistry#registerRangeAmplifier(BlockStack, int)} to register a + * {@link HarvestRegistry#registerRangeAmplifier(net.minecraft.block.state.IBlockState, int)} to register a * new amplifier. */ public class RitualHarvest extends Ritual { @@ -47,7 +56,7 @@ public class RitualHarvest extends Ritual { harvestArea.resetIterator(); while (harvestArea.hasNext()) { BlockPos nextPos = harvestArea.next().add(pos); - if (harvestBlock(world, nextPos)) { + if (harvestBlock(world, nextPos, masterRitualStone.getBlockPos())) { harvested++; } } @@ -102,12 +111,34 @@ public class RitualHarvest extends Ritual { return new RitualHarvest(); } - public static boolean harvestBlock(World world, BlockPos pos) { - BlockStack harvestStack = BlockStack.getStackFromPos(world, pos); + public static boolean harvestBlock(World world, BlockPos cropPos, BlockPos controllerPos) { + IBlockState harvestState = world.getBlockState(cropPos); + TileEntity potentialInventory = world.getTileEntity(controllerPos.up()); + IItemHandler itemHandler = null; + if (potentialInventory != null && potentialInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) + itemHandler = potentialInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - for (IHarvestHandler handler : HarvestRegistry.getHandlerList()) - if (handler.harvestAndPlant(world, pos, harvestStack)) - return true; + 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/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index e6f600ed..38a405f9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -1,21 +1,18 @@ package WayofTime.bloodmagic.ritual.harvest; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.iface.IHarvestHandler; -import WayofTime.bloodmagic.core.registry.HarvestRegistry; +import WayofTime.bloodmagic.util.BMLog; import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.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 net.minecraftforge.fml.relauncher.ReflectionHelper; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -25,10 +22,10 @@ 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)} + * 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); @@ -54,19 +51,12 @@ public class HarvestHandlerPlantable implements IHarvestHandler { } @Override - public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) { - if (!HarvestRegistry.getStandardCrops().containsKey(blockStack.getBlock())) - return false; - - int matureMeta = HarvestRegistry.getStandardCrops().get(blockStack.getBlock()); - - if (blockStack.getMeta() < matureMeta) - return false; - - List drops = blockStack.getBlock().getDrops(world, pos, blockStack.getState(), 0); + public boolean harvest(World world, BlockPos pos, IBlockState state, List drops) { + NonNullList blockDrops = NonNullList.create(); + state.getBlock().getDrops(blockDrops, world, pos, state, 0); boolean foundSeed = false; - for (ItemStack stack : drops) { + for (ItemStack stack : blockDrops) { if (stack.isEmpty()) continue; @@ -78,16 +68,13 @@ public class HarvestHandlerPlantable implements IHarvestHandler { } if (foundSeed) { - world.setBlockState(pos, blockStack.getBlock().getDefaultState()); - world.playEvent(2001, pos, Block.getStateId(blockStack.getState())); - for (ItemStack stack : drops) { + world.setBlockState(pos, state.getBlock().getDefaultState()); + world.playEvent(2001, pos, Block.getStateId(state)); + for (ItemStack stack : blockDrops) { if (stack.isEmpty()) continue; - if (!world.isRemote) { - EntityItem toDrop = new EntityItem(world, pos.getX(), pos.getY() + 0.5, pos.getZ(), stack); - world.spawnEntity(toDrop); - } + drops.add(stack); } return true; @@ -96,6 +83,11 @@ public class HarvestHandlerPlantable implements IHarvestHandler { return false; } + @Override + public boolean test(World world, BlockPos pos, IBlockState 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; @@ -110,19 +102,19 @@ public class HarvestHandlerPlantable implements IHarvestHandler { return; try { - ClassLoader loader = HarvestHandlerPlantable.class.getClassLoader(); - String className = "com.pam.harvestcraft.blocks.CropRegistry"; - Class registry = ReflectionHelper.getClass(loader, className); - Field names = ReflectionHelper.findField(registry, "cropNames"); - Method getCrop = registry.getMethod("getCrop", String.class); + 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)) { BlockCrops crop = (BlockCrops) getCrop.invoke(null, name); HarvestRegistry.registerStandardCrop(crop, crop.getMaxAge()); } - } catch (NoSuchMethodException e) { - BloodMagic.instance.logger.error("HarvestCraft integration cancelled; unable to find crop name mapper"); + } 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) { - BloodMagic.instance.logger.error("HarvestCraft integration cancelled; crop name lookup broke"); + 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 index 79aa7dbd..2e7bb2fd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -1,62 +1,55 @@ package WayofTime.bloodmagic.ritual.harvest; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.iface.IHarvestHandler; -import WayofTime.bloodmagic.core.registry.HarvestRegistry; +import net.minecraft.block.BlockPumpkin; import net.minecraft.block.BlockStem; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import java.util.ArrayList; import java.util.List; /** - * Harvest handler for crops with stems such as Pumpkins and Melons. - * {@link OreDictionary#WILDCARD_VALUE} is used as a wildcard to allow the crop - * to be harvested at any metadata. Rotation based crop blocks are a good reason + * 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(BlockStack, BlockStack)} + * {@link HarvestRegistry#registerStemCrop(IBlockState, IBlockState)} */ public class HarvestHandlerStem implements IHarvestHandler { + public HarvestHandlerStem() { - HarvestRegistry.registerStemCrop(new BlockStack(Blocks.PUMPKIN, OreDictionary.WILDCARD_VALUE), new BlockStack(Blocks.PUMPKIN_STEM, 7)); - HarvestRegistry.registerStemCrop(new BlockStack(Blocks.MELON_BLOCK), new BlockStack(Blocks.MELON_STEM, 7)); + for (EnumFacing facing : EnumFacing.HORIZONTALS) + HarvestRegistry.registerStemCrop(Blocks.PUMPKIN.getDefaultState().withProperty(BlockPumpkin.FACING, facing), Blocks.PUMPKIN_STEM.getDefaultState().withProperty(BlockStem.AGE, 7)); + + HarvestRegistry.registerStemCrop(Blocks.MELON_BLOCK.getDefaultState(), Blocks.MELON_STEM.getDefaultState().withProperty(BlockStem.AGE, 7)); } @Override - public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) { - boolean retFlag = false; - List drops = new ArrayList<>(); - BlockPos cropPos = pos; - if (HarvestRegistry.getStemCrops().containsKey(blockStack)) { - EnumFacing cropDir = blockStack.getBlock().getActualState(blockStack.getState(), world, pos).getValue(BlockStem.FACING); + public boolean harvest(World world, BlockPos pos, IBlockState state, List drops) { + EnumFacing cropDir = state.getBlock().getActualState(state, world, pos).getValue(BlockStem.FACING); - if (cropDir != EnumFacing.UP) { - cropPos = pos.offset(cropDir); - BlockStack probableCrop = BlockStack.getStackFromPos(world, cropPos); - BlockStack regCrop = HarvestRegistry.getStemCrops().get(blockStack); + if (cropDir != EnumFacing.UP) { + BlockPos cropPos = pos.offset(cropDir); + IBlockState probableCrop = world.getBlockState(cropPos); + IBlockState registeredCrop = HarvestRegistry.getStemCrops().get(state); - if ((regCrop.getMeta() == OreDictionary.WILDCARD_VALUE && regCrop.getBlock() == probableCrop.getBlock()) || regCrop.equals(probableCrop)) { - drops = probableCrop.getBlock().getDrops(world, cropPos, probableCrop.getState(), 0); - world.destroyBlock(cropPos, false); - retFlag = true; - } + if (registeredCrop == probableCrop) { + NonNullList blockDrops = NonNullList.create(); + probableCrop.getBlock().getDrops(blockDrops, world, cropPos, probableCrop, 0); + drops.addAll(blockDrops); + world.destroyBlock(cropPos, false); + return true; } } - if (!world.isRemote) { - for (ItemStack drop : drops) { - EntityItem item = new EntityItem(world, cropPos.getX(), cropPos.getY() + 0.5, cropPos.getZ(), drop); - world.spawnEntity(item); - } - } + return false; + } - return retFlag; + @Override + public boolean test(World world, BlockPos pos, IBlockState 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 index a9f11698..544a3d83 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java @@ -1,49 +1,46 @@ package WayofTime.bloodmagic.ritual.harvest; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.iface.IHarvestHandler; -import WayofTime.bloodmagic.core.registry.HarvestRegistry; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.block.BlockCactus; +import net.minecraft.block.BlockReed; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.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.ArrayList; 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(BlockStack)} + * {@link HarvestRegistry#registerTallCrop(IBlockState)} */ public class HarvestHandlerTall implements IHarvestHandler { + public HarvestHandlerTall() { - HarvestRegistry.registerTallCrop(new BlockStack(Blocks.REEDS)); - HarvestRegistry.registerTallCrop(new BlockStack(Blocks.CACTUS)); + for (int i = 0; i < 15; i++) { + HarvestRegistry.registerTallCrop(Blocks.REEDS.getDefaultState().withProperty(BlockReed.AGE, i)); + HarvestRegistry.registerTallCrop(Blocks.CACTUS.getDefaultState().withProperty(BlockCactus.AGE, i)); + } } @Override - public boolean harvestAndPlant(World world, BlockPos pos, BlockStack blockStack) { - boolean retFlag = false; - - List drops = new ArrayList<>(); - if (HarvestRegistry.getTallCrops().contains(blockStack)) { - BlockStack up = BlockStack.getStackFromPos(world, pos.up()); - if (up.equals(blockStack)) { - drops = up.getBlock().getDrops(world, pos.up(), up.getState(), 0); - world.destroyBlock(pos.up(), false); - retFlag = true; - } + public boolean harvest(World world, BlockPos pos, IBlockState state, List drops) { + IBlockState 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; } - if (!world.isRemote) { - for (ItemStack drop : drops) { - EntityItem item = new EntityItem(world, pos.getX(), pos.getY() + 0.5, pos.getZ(), drop); - world.spawnEntity(item); - } - } + return false; + } - return retFlag; + @Override + public boolean test(World world, BlockPos pos, IBlockState 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 new file mode 100644 index 00000000..c5deba16 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java @@ -0,0 +1,105 @@ +package WayofTime.bloodmagic.ritual.harvest; + +import com.google.common.collect.*; +import net.minecraft.block.Block; +import net.minecraft.block.BlockStem; +import net.minecraft.block.state.IBlockState; + +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 Map STEM_CROPS = Maps.newHashMap(); + 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(IBlockState 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 BlockStem} + * + * @param crop - The crop block to handle. + * @param stem - The stem of the crop + */ + public static void registerStemCrop(IBlockState crop, IBlockState stem) { + if (!STEM_CROPS.containsKey(crop) && stem.getBlock() instanceof BlockStem) + 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(IBlockState 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 Map getStemCrops() { + return ImmutableMap.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 new file mode 100644 index 00000000..b8b49316 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/IHarvestHandler.java @@ -0,0 +1,37 @@ +package WayofTime.bloodmagic.ritual.harvest; + +import net.minecraft.block.state.IBlockState; +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 IBlockState} being checked + * @param state - The {@link IBlockState} being checked + * @param drops - The items to be dropped + * @return If the block was successfully harvested. + */ + boolean harvest(World world, BlockPos pos, IBlockState 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 IBlockState} being checked + * @param state The {@link IBlockState} being checked + * @return if this block is valid for harvest. + */ + boolean test(World world, BlockPos pos, IBlockState state); +} From 81ad9bf76472ded54c43a4da421b2dc33be2ef11 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 3 Mar 2018 19:17:06 -0800 Subject: [PATCH 222/595] Cleaner fuel handling --- .../bloodmagic/util/handler/event/CraftingHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index 119e96a2..c1456262 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -143,7 +143,7 @@ public class CraftingHandler { @SubscribeEvent public static void handleFuelLevel(FurnaceFuelBurnTimeEvent event) { - if (event.getItemStack().getItem() == RegistrarBloodMagicItems.COMPONENT && event.getItemStack().getMetadata() == ComponentTypes.SAND_COAL.ordinal()) + if (ItemStack.areItemsEqual(event.getItemStack(), ComponentTypes.SAND_COAL.getStack())) event.setBurnTime(TileEntityFurnace.getItemBurnTime(new ItemStack(Items.COAL))); } } From e2f7772e82352d7c6478c8c256aef0e595f4496d Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 4 Mar 2018 09:29:19 -0500 Subject: [PATCH 223/595] Improved the Ellipsoid effect. --- .../bloodmagic/ritual/RitualEllipsoid.java | 127 +++++++++++------- .../assets/bloodmagic/lang/en_US.lang | 5 +- 2 files changed, 84 insertions(+), 48 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java index cc62e700..1fb6b7d1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java @@ -1,29 +1,30 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; -import WayofTime.bloodmagic.util.Utils; +import java.util.ArrayList; + import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +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 net.minecraftforge.items.ItemHandlerHelper; - -import javax.annotation.Nullable; - -import java.util.ArrayList; -import java.util.Iterator; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ritual.data.AreaDescriptor; +import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.data.RitualComponent; +import WayofTime.bloodmagic.util.Utils; public class RitualEllipsoid extends Ritual { -// public static final String FELLING_RANGE = "fellingRange"; + public static final String SPHEROID_RANGE = "spheroidRange"; public static final String CHEST_RANGE = "chest"; private boolean cached = false; @@ -32,10 +33,10 @@ public class RitualEllipsoid extends Ritual public RitualEllipsoid() { super("ritualEllipsoid", 0, 20000, "ritual." + BloodMagic.MODID + ".ellipseRitual"); -// addBlockRange(FELLING_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-10, -3, -10), new BlockPos(11, 27, 11))); + 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(FELLING_RANGE, 14000, 15, 30); + setMaximumVolumeAndDistanceOfRange(SPHEROID_RANGE, 0, 32, 32); setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); } @@ -55,75 +56,107 @@ public class RitualEllipsoid extends Ritual return; } + AreaDescriptor sphereRange = 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) { - IItemHandler inventory = Utils.getInventory(tileInventory, EnumFacing.DOWN); - int numSlots = inventory.getSlots(); - if (numSlots >= 3) + if (tileInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - ItemStack xStack = inventory.getStackInSlot(0); - ItemStack yStack = inventory.getStackInSlot(1); - ItemStack zStack = inventory.getStackInSlot(2); + IItemHandler itemHandler = tileInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (xStack.isEmpty() || yStack.isEmpty() || zStack.isEmpty()) + if (itemHandler.getSlots() <= 0) { return; } - int xR = xStack.getCount(); - int yR = yStack.getCount(); - int zR = zStack.getCount(); + int blockSlot = -1; + for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) + { + ItemStack stack = itemHandler.extractItem(invSlot, 1, true); + if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) + continue; - int j = -yR; - int i = -xR; - int k = -zR; + 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(-xR, currentPos.getX())); - k = Math.min(zR, Math.max(-zR, currentPos.getZ())); + 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 <= yR) + while (j <= maxY) { - while (i <= xR) + while (i <= maxX) { - while (k <= zR) + 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.isAirBlock(newPos)) +// + if (!world.getBlockState(newPos).getBlock().isReplaceable(world, newPos)) { - if (j > 0) - { - world.setBlockState(newPos, Blocks.GLASS.getDefaultState()); - } else - { - world.setBlockState(newPos, Blocks.STONE.getDefaultState()); - } k++; - this.currentPos = new BlockPos(i, j, k); - return; + continue; } + + IBlockState 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(getRefreshCost()); + k++; + this.currentPos = new BlockPos(i, j, k); + return; } k++; } i++; - k = -zR; + k = -minZ; } j++; - i = -xR; + i = -minX; this.currentPos = new BlockPos(i, j, k); return; } - j = -yR; + j = -minY; this.currentPos = new BlockPos(i, j, k); return; - } } } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 00a7151a..a218e51f 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -605,7 +605,7 @@ 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 @@ -713,6 +713,9 @@ ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Crystal) Demon Crystals in th 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.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. From 986852e2658d55acd6f3e8690458f738021f14fa Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 4 Mar 2018 09:36:03 -0500 Subject: [PATCH 224/595] Added the ability to set the array to no longer drop its ingredients. - I need to just change all of the files to my format, so Nut doesn't cry each push. --- .../bloodmagic/tile/TileAlchemyArray.java | 116 ++++++++++++------ 1 file changed, 81 insertions(+), 35 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 2ee25431..03454b0c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,61 +1,78 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectCraftingNew; -import WayofTime.bloodmagic.iface.IAlchemyArray; -import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; +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; -public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray { +public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray +{ public boolean isActive = false; public int activeCounter = 0; public EnumFacing rotation = EnumFacing.HORIZONTALS[0]; private String key = "empty"; private AlchemyArrayEffect arrayEffect; + private boolean doDropIngredients = true; - public TileAlchemyArray() { + public TileAlchemyArray() + { super(2, "alchemyArray"); } - public void onEntityCollidedWithBlock(IBlockState state, Entity entity) { - if (arrayEffect != null) { + public void onEntityCollidedWithBlock(IBlockState state, Entity entity) + { + if (arrayEffect != null) + { arrayEffect.onEntityCollidedWithBlock(this, getWorld(), pos, state, entity); } } @Override - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(NBTTagCompound tagCompound) + { super.deserialize(tagCompound); this.isActive = tagCompound.getBoolean("isActive"); this.activeCounter = tagCompound.getInteger("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 = EnumFacing.HORIZONTALS[tagCompound.getInteger(Constants.NBT.DIRECTION)]; NBTTagCompound arrayTag = tagCompound.getCompoundTag("arrayTag"); arrayEffect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(key); - if (arrayEffect != null) { + if (arrayEffect != null) + { arrayEffect.readFromNBT(arrayTag); } } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public NBTTagCompound serialize(NBTTagCompound tagCompound) + { super.serialize(tagCompound); tagCompound.setBoolean("isActive", isActive); tagCompound.setInteger("activeCounter", activeCounter); tagCompound.setString("key", "".equals(key) ? "empty" : key); + tagCompound.setBoolean("doDropIngredients", doDropIngredients); tagCompound.setInteger(Constants.NBT.DIRECTION, rotation.getHorizontalIndex()); NBTTagCompound arrayTag = new NBTTagCompound(); - if (arrayEffect != null) { + if (arrayEffect != null) + { arrayEffect.writeToNBT(arrayTag); } tagCompound.setTag("arrayTag", arrayTag); @@ -64,16 +81,27 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public int getInventoryStackLimit() { + public int getInventoryStackLimit() + { return 1; } + //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 update() { - if (isActive && attemptCraft()) { + public void update() + { + if (isActive && attemptCraft()) + { activeCounter++; - } else { + } else + { isActive = false; + doDropIngredients = true; activeCounter = 0; arrayEffect = null; key = "empty"; @@ -84,49 +112,65 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche * This occurs when the block is destroyed. */ @Override - public void dropItems() { - super.dropItems(); - if (arrayEffect != null) { + public void dropItems() + { + if (!doDropIngredients) + { + super.dropItems(); + } + if (arrayEffect != null) + { } } - public boolean attemptCraft() { + public boolean attemptCraft() + { AlchemyArrayEffect effect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(this.getStackInSlot(0), this.getStackInSlot(1)); - if (effect != null) { - if (arrayEffect == null) { + if (effect != null) + { + if (arrayEffect == null) + { arrayEffect = effect; key = effect.getKey(); - } else { + } else + { String effectKey = effect.getKey(); - if (effectKey.equals(key)) { + if (effectKey.equals(key)) + { //Good! Moving on. - } else { + } else + { //Something has changed, therefore we have to move our stuffs. //TODO: Add an AlchemyArrayEffect.onBreak(); ? arrayEffect = effect; key = effect.getKey(); } } - } else { + } else + { RecipeAlchemyArray recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArray(getStackInSlot(0), getStackInSlot(1)); if (recipe == null) return false; AlchemyArrayEffect newEffect = new AlchemyArrayEffectCraftingNew(recipe); - if (arrayEffect == null) { + if (arrayEffect == null) + { arrayEffect = newEffect; key = newEffect.key; - } else if (!newEffect.key.equals(key)) { + } else if (!newEffect.key.equals(key)) + { arrayEffect = newEffect; key = newEffect.key; } } - if (arrayEffect != null) { + if (arrayEffect != null) + { isActive = true; - if (arrayEffect.update(this, this.activeCounter)) { + if (arrayEffect.update(this, this.activeCounter)) + { this.decrStackSize(0, 1); this.decrStackSize(1, 1); this.getWorld().setBlockToAir(getPos()); @@ -139,11 +183,13 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public EnumFacing getRotation() { + public EnumFacing getRotation() + { return rotation; } - public void setRotation(EnumFacing rotation) { + public void setRotation(EnumFacing rotation) + { this.rotation = rotation; } } From 3f5178dd6a0fde802447848b35a85c4ada567c92 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 4 Mar 2018 09:17:23 -0800 Subject: [PATCH 225/595] A bit of Ritual cleanup Slowly getting rid of these BlockStack references. Slowly moving towards a proper "API" in our internals. --- .../java/WayofTime/bloodmagic/BloodMagic.java | 2 +- .../block/BlockDimensionalPortal.java | 2 +- .../block/BlockRitualController.java | 18 ++-- .../bloodmagic/block/BlockRitualStone.java | 4 +- .../compat/guideapi/book/CategoryRitual.java | 2 +- .../DataProviderRitualController.java | 8 +- .../core/RegistrarBloodMagicRecipes.java | 2 +- .../bloodmagic/event/RitualEvent.java | 8 +- .../bloodmagic/item/ItemInscriptionTool.java | 2 +- .../bloodmagic/item/ItemRitualDiviner.java | 23 +++-- .../bloodmagic/item/ItemRitualReader.java | 4 +- .../bloodmagic/proxy/CommonProxy.java | 4 +- .../bloodmagic/registry/ModRituals.java | 19 ++--- .../ritual/{data => }/AreaDescriptor.java | 2 +- .../ritual/{data => }/CapabilityRuneType.java | 2 +- .../{data => }/EnumRitualReaderState.java | 2 +- .../ritual/{data => }/EnumRuneType.java | 2 +- .../ritual/{data => }/IMasterRitualStone.java | 2 +- .../ritual/{data => }/IRitualStone.java | 2 +- .../bloodmagic/ritual/{data => }/Ritual.java | 23 ++--- .../ritual/{data => }/RitualComponent.java | 2 +- .../registry => ritual}/RitualRegistry.java | 10 ++- .../ritual/{data => }/RitualRenderer.java | 2 +- .../imperfect/IImperfectRitualStone.java | 2 +- .../{data => }/imperfect/ImperfectRitual.java | 42 +++++----- .../imperfect}/ImperfectRitualRegistry.java | 11 +-- .../{data => }/imperfect/package-info.java | 2 +- .../{ => types}/RitualAltarBuilder.java | 17 ++-- .../{ => types}/RitualAnimalGrowth.java | 14 ++-- .../{ => types}/RitualArmourEvolve.java | 26 +++--- .../ritual/{ => types}/RitualCobblestone.java | 15 ++-- .../ritual/{ => types}/RitualContainment.java | 20 ++--- .../ritual/{ => types}/RitualCrushing.java | 18 ++-- .../{ => types}/RitualCrystalHarvest.java | 30 +++---- .../ritual/{ => types}/RitualEllipsoid.java | 23 ++--- .../ritual/{ => types}/RitualExpulsion.java | 83 +++++++++---------- .../{ => types}/RitualFeatheredKnife.java | 25 +++--- .../ritual/{ => types}/RitualFelling.java | 11 +-- .../{ => types}/RitualForsakenSoul.java | 28 +++---- .../ritual/{ => types}/RitualFullStomach.java | 21 ++--- .../ritual/{ => types}/RitualGreenGrove.java | 15 ++-- .../ritual/{ => types}/RitualHarvest.java | 11 +-- .../{ => types}/RitualInterdiction.java | 16 ++-- .../ritual/{ => types}/RitualJumping.java | 13 +-- .../ritual/{ => types}/RitualLava.java | 13 +-- .../RitualLivingArmourDowngrade.java | 69 +++++++-------- .../ritual/{ => types}/RitualMagnetic.java | 20 ++--- .../ritual/{ => types}/RitualMeteor.java | 49 +++++------ .../ritual/{ => types}/RitualPlacer.java | 12 +-- .../ritual/{ => types}/RitualPortal.java | 18 ++-- .../ritual/{ => types}/RitualPump.java | 11 +-- .../{ => types}/RitualRegeneration.java | 21 ++--- .../ritual/{ => types}/RitualSpeed.java | 21 ++--- .../ritual/{ => types}/RitualSuppression.java | 30 +++---- .../{ => types}/RitualUpgradeRemove.java | 27 +++--- .../ritual/{ => types}/RitualWater.java | 14 ++-- .../{ => types}/RitualWellOfSuffering.java | 25 +++--- .../ritual/{ => types}/RitualZephyr.java | 17 ++-- .../imperfect/ImperfectRitualDay.java | 9 +- .../imperfect/ImperfectRitualNight.java | 9 +- .../imperfect/ImperfectRitualRain.java | 9 +- .../imperfect/ImperfectRitualResistance.java | 9 +- .../imperfect/ImperfectRitualZombie.java | 9 +- .../bloodmagic/structures/Dungeon.java | 2 +- .../bloodmagic/structures/DungeonRoom.java | 2 +- .../tile/TileDimensionalPortal.java | 2 +- .../tile/TileImperfectRitualStone.java | 13 +-- .../bloodmagic/tile/TileIncenseAltar.java | 2 +- .../tile/TileMasterRitualStone.java | 6 +- .../tile/TilePurificationAltar.java | 2 +- .../util/handler/event/ClientHandler.java | 15 ++-- .../bloodmagic/util/helper/RitualHelper.java | 18 ++-- 72 files changed, 450 insertions(+), 594 deletions(-) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/AreaDescriptor.java (99%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/CapabilityRuneType.java (97%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/EnumRitualReaderState.java (69%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/EnumRuneType.java (97%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/IMasterRitualStone.java (97%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/IRitualStone.java (93%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/Ritual.java (93%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/RitualComponent.java (97%) rename src/main/java/WayofTime/bloodmagic/{core/registry => ritual}/RitualRegistry.java (90%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/RitualRenderer.java (90%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/imperfect/IImperfectRitualStone.java (90%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/imperfect/ImperfectRitual.java (61%) rename src/main/java/WayofTime/bloodmagic/{core/registry => ritual/imperfect}/ImperfectRitualRegistry.java (90%) rename src/main/java/WayofTime/bloodmagic/ritual/{data => }/imperfect/package-info.java (75%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualAltarBuilder.java (96%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualAnimalGrowth.java (95%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualArmourEvolve.java (74%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualCobblestone.java (88%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualContainment.java (80%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualCrushing.java (95%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualCrystalHarvest.java (72%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualEllipsoid.java (93%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualExpulsion.java (75%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualFeatheredKnife.java (92%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualFelling.java (94%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualForsakenSoul.java (88%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualFullStomach.java (86%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualGreenGrove.java (96%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualHarvest.java (96%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualInterdiction.java (85%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualJumping.java (87%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualLava.java (97%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualLivingArmourDowngrade.java (75%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualMagnetic.java (90%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualMeteor.java (73%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualPlacer.java (94%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualPortal.java (96%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualPump.java (94%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualRegeneration.java (92%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualSpeed.java (91%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualSuppression.java (70%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualUpgradeRemove.java (84%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualWater.java (84%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualWellOfSuffering.java (85%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/RitualZephyr.java (86%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/imperfect/ImperfectRitualDay.java (61%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/imperfect/ImperfectRitualNight.java (61%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/imperfect/ImperfectRitualRain.java (68%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/imperfect/ImperfectRitualResistance.java (60%) rename src/main/java/WayofTime/bloodmagic/ritual/{ => types}/imperfect/ImperfectRitualZombie.java (76%) diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 5ff8bdc4..4581753c 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic; import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.core.registry.RitualRegistry; +import WayofTime.bloodmagic.ritual.RitualRegistry; import WayofTime.bloodmagic.util.helper.LogHelper; import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 02df2866..8939e5f5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.teleport.PortalLocation; import WayofTime.bloodmagic.teleport.TeleportQueue; import WayofTime.bloodmagic.block.base.BlockInteger; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index a4405cf6..756dea87 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -1,12 +1,11 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.core.registry.RitualRegistry; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; +import WayofTime.bloodmagic.ritual.RitualRegistry; +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; @@ -31,6 +30,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; public class BlockRitualController extends BlockEnum implements IGuideLinked { + public BlockRitualController() { super(Material.ROCK, EnumRitualController.class); @@ -67,10 +67,8 @@ public class BlockRitualController extends BlockEnum imple } } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) { - IBlockState determinerState = world.getBlockState(pos.up()); - BlockStack determiner = new BlockStack(determinerState.getBlock(), determinerState.getBlock().getMetaFromState(determinerState)); - - return ((TileImperfectRitualStone) tile).performRitual(world, pos, ImperfectRitualRegistry.getRitualForBlock(determiner), player); + IBlockState ritualBlock = world.getBlockState(pos.up()); + return ((TileImperfectRitualStone) tile).performRitual(world, pos, ImperfectRitualRegistry.getRitualForBlock(ritualBlock), player); } return false; @@ -115,7 +113,7 @@ public class BlockRitualController extends BlockEnum imple else return new ResourceLocation("bloodmagic", "ritual_" + mrs.getCurrentRitual().getName()); } else if (state.getValue(getProperty()).equals(EnumRitualController.IMPERFECT)) { - ImperfectRitual imperfectRitual = ImperfectRitualRegistry.getRitualForBlock(BlockStack.getStackFromPos(world, pos.up())); + ImperfectRitual imperfectRitual = ImperfectRitualRegistry.getRitualForBlock(world.getBlockState(pos.up())); if (imperfectRitual != null) return new ResourceLocation("bloodmagic", "ritual_" + imperfectRitual.getName()); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 483a10fb..905c8810 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; -import WayofTime.bloodmagic.ritual.data.IRitualStone; +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; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index 3d77b52c..2547591b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.EnumRuneType; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index f5a4b923..3e97d19f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -2,9 +2,9 @@ package WayofTime.bloodmagic.compat.waila.provider; import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.core.registry.RitualRegistry; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; +import WayofTime.bloodmagic.ritual.RitualRegistry; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -69,7 +69,7 @@ public class DataProviderRitualController implements IWailaDataProvider { } else { tag.setBoolean("master", false); - ImperfectRitual ritual = ImperfectRitualRegistry.getRitualForBlock(BlockStack.getStackFromPos(world, pos.up())); + ImperfectRitual ritual = ImperfectRitualRegistry.getRitualForBlock(world.getBlockState(pos.up())); if (ritual != null) { tag.setString("ritual", ritual.getUnlocalizedName()); tag.setBoolean("enabled", ImperfectRitualRegistry.ritualEnabled(ritual)); diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 85ceebe4..dbd69d57 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -5,7 +5,7 @@ import WayofTime.bloodmagic.api.impl.BloodMagicRecipeRegistrar; import WayofTime.bloodmagic.altar.EnumAltarTier; import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.item.ItemSlate; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.EnumRuneType; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; diff --git a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java index bf69e5b7..a76ceb7d 100644 --- a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.event; -import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +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.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 70162421..67e87565 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; +import WayofTime.bloodmagic.ritual.EnumRuneType; import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockRitualStone; import WayofTime.bloodmagic.util.helper.TextHelper; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index 10b2ea3c..e6e41c4c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.core.registry.RitualRegistry; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.RitualComponent; +import WayofTime.bloodmagic.ritual.RitualRegistry; +import WayofTime.bloodmagic.ritual.EnumRuneType; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.ritual.RitualComponent; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.util.helper.RitualHelper; import WayofTime.bloodmagic.client.IVariantProvider; @@ -16,6 +16,7 @@ import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.handler.event.ClientHandler; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.base.Strings; +import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; @@ -117,7 +118,9 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { Ritual ritual = RitualRegistry.getRitualForId(this.getCurrentRitual(stack)); if (ritual != null) { EnumFacing direction = getDirection(stack); - for (RitualComponent component : ritual.getComponents()) { + List components = Lists.newArrayList(); + ritual.gatherComponents(components); + for (RitualComponent component : components) { if (!canPlaceRitualStone(component.getRuneType(), stack)) { return false; } @@ -223,7 +226,8 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } else if (sneaking) { tooltip.add(TextHelper.localize(tooltipBase + "currentDirection", Utils.toFancyCasing(getDirection(stack).getName()))); tooltip.add(""); - ArrayList componentList = ritual.getComponents(); + List components = Lists.newArrayList(); + ritual.gatherComponents(components); int blankRunes = 0; int airRunes = 0; @@ -232,9 +236,9 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { int earthRunes = 0; int duskRunes = 0; int dawnRunes = 0; - int totalRunes = componentList.size(); + int totalRunes = components.size(); - for (RitualComponent component : componentList) { + for (RitualComponent component : components) { switch (component.getRuneType()) { case BLANK: blankRunes++; @@ -486,7 +490,8 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { return false; } - ArrayList components = ritual.getComponents(); + List components = Lists.newArrayList(); + ritual.gatherComponents(components); for (RitualComponent component : components) { if (!canPlaceRitualStone(component.getRuneType(), stack)) { return false; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index a718ea5b..0b203dd9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.ritual.data.EnumRitualReaderState; -import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.EnumRitualReaderState; +import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.util.helper.NBTHelper; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java index 34643085..6eab4d82 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.proxy; -import WayofTime.bloodmagic.ritual.data.CapabilityRuneType; -import WayofTime.bloodmagic.ritual.data.IRitualStone; +import WayofTime.bloodmagic.ritual.CapabilityRuneType; +import WayofTime.bloodmagic.ritual.IRitualStone; import WayofTime.bloodmagic.teleport.TeleportQueue; import com.google.common.collect.ImmutableMap; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 8582d583..e1c67c19 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -1,21 +1,20 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.ritual.harvest.HarvestRegistry; -import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.core.registry.RitualRegistry; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; +import WayofTime.bloodmagic.ritual.RitualRegistry; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; -import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerPlantable; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerStem; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerTall; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualNight; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRain; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualResistance; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualZombie; +import WayofTime.bloodmagic.ritual.types.imperfect.ImperfectRitualNight; +import WayofTime.bloodmagic.ritual.types.imperfect.ImperfectRitualRain; +import WayofTime.bloodmagic.ritual.types.imperfect.ImperfectRitualResistance; +import WayofTime.bloodmagic.ritual.types.imperfect.ImperfectRitualZombie; +import WayofTime.bloodmagic.ritual.types.*; import net.minecraft.init.Blocks; public class ModRituals diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java similarity index 99% rename from src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java rename to src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java index 59248e7f..b6bcdd7d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.util.Constants; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/CapabilityRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/ritual/data/CapabilityRuneType.java rename to src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java index 3ed6c7b9..c8800b94 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/CapabilityRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagByte; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumRitualReaderState.java similarity index 69% rename from src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java rename to src/main/java/WayofTime/bloodmagic/ritual/EnumRitualReaderState.java index 6a3e7bf8..55694e32 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRitualReaderState.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/EnumRitualReaderState.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; public enum EnumRitualReaderState { SET_AREA, diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java rename to src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java index 6bab1b6e..1566d5b5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.types.ISubItem; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java rename to src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index 320757ef..f6743a12 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.soul.EnumDemonWillType; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/IRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IRitualStone.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/ritual/data/IRitualStone.java rename to src/main/java/WayofTime/bloodmagic/ritual/IRitualStone.java index 00017ab0..73c0e471 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/IRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IRitualStone.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java rename to src/main/java/WayofTime/bloodmagic/ritual/Ritual.java index fae7e240..3ae656fa 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java @@ -1,8 +1,7 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.core.registry.RitualRegistry; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -22,7 +21,7 @@ import java.util.Map.Entry; * {@link RitualRegistry#registerRitual(Ritual, String)} */ public abstract class Ritual { - public final ArrayList ritualComponents = new ArrayList<>(); + protected final Map modableRangeMap = new HashMap<>(); protected final Map volumeRangeMap = new HashMap<>(); protected final Map horizontalRangeMap = new HashMap<>(); @@ -262,16 +261,13 @@ public abstract class Ritual { } } - /** - * @return a list of {@link RitualComponent} for checking the ritual. - */ - public abstract ArrayList getComponents(); + public abstract void gatherComponents(List components); - public void addRune(ArrayList components, int offset1, int y, int offset2, EnumRuneType rune) { + protected final void addRune(List components, int offset1, int y, int offset2, EnumRuneType rune) { components.add(new RitualComponent(new BlockPos(offset1, y, offset2), rune)); } - public void addOffsetRunes(ArrayList components, int offset1, int offset2, int y, EnumRuneType rune) { + protected final void addOffsetRunes(List 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); @@ -282,14 +278,14 @@ public abstract class Ritual { addRune(components, -offset2, y, -offset1, rune); } - public void addCornerRunes(ArrayList components, int offset, int y, EnumRuneType rune) { + protected final void addCornerRunes(List 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); } - public void addParallelRunes(ArrayList components, int offset, int y, EnumRuneType rune) { + protected final void addParallelRunes(List 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); @@ -302,10 +298,6 @@ public abstract class Ritual { public abstract Ritual getNewCopy(); - public ArrayList getRitualComponents() { - return ritualComponents; - } - public String getName() { return name; } @@ -345,7 +337,6 @@ public abstract class Ritual { @Override public String toString() { return new ToStringBuilder(this) - .append("ritualComponents", ritualComponents) .append("name", name) .append("crystalLevel", crystalLevel) .append("activationCost", activationCost) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/RitualComponent.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/ritual/data/RitualComponent.java rename to src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java index 25c46e62..92feb8ec 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/RitualComponent.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java rename to src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java index b13b4614..af289560 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.core.registry; +package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.ritual.data.Ritual; import WayofTime.bloodmagic.util.BMLog; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import com.google.common.collect.Lists; import javax.annotation.Nullable; import java.util.*; @@ -114,7 +114,11 @@ public class RitualRegistry { lookupList.sort((o1, o2) -> { Ritual ritual1 = registry.get(o1); Ritual ritual2 = registry.get(o2); - return ritual1.getComponents().size() > ritual2.getComponents().size() ? -1 : 0; // Put earlier if bigger + List first = Lists.newArrayList(); + ritual1.gatherComponents(first); + List second = Lists.newArrayList(); + ritual2.gatherComponents(second); + return first.size() > second.size() ? -1 : 0; // Put earlier if bigger }); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/RitualRenderer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/ritual/data/RitualRenderer.java rename to src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java index 0138310b..a5df2590 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/RitualRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data; +package WayofTime.bloodmagic.ritual; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/IImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/IImperfectRitualStone.java rename to src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java index eeca00f0..205bdf87 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/IImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual.data.imperfect; +package WayofTime.bloodmagic.ritual.imperfect; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java similarity index 61% rename from src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/ImperfectRitual.java rename to src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java index bf78aaee..dae1c461 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/ImperfectRitual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java @@ -1,10 +1,11 @@ -package WayofTime.bloodmagic.ritual.data.imperfect; +package WayofTime.bloodmagic.ritual.imperfect; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; +import java.util.function.Predicate; + /** * Abstract class for creating new imperfect rituals. ImperfectRituals need be * registered with @@ -13,26 +14,26 @@ import net.minecraft.world.World; public abstract class ImperfectRitual { private final String name; - private final BlockStack requiredBlock; + private final Predicate blockRequirement; private final int activationCost; - private final boolean lightshow; + private final boolean lightShow; private final String unlocalizedName; - public ImperfectRitual(String name, BlockStack requiredBlock, int activationCost, boolean lightshow, String unlocalizedName) { + public ImperfectRitual(String name, Predicate blockRequirement, int activationCost, boolean lightShow, String unlocalizedName) { this.name = name; - this.requiredBlock = requiredBlock; + this.blockRequirement = blockRequirement; this.activationCost = activationCost; - this.lightshow = lightshow; + this.lightShow = lightShow; this.unlocalizedName = unlocalizedName; } /** - * @param name - The name of the ritual - * @param requiredBlock - The block required above the ImperfectRitualStone - * @param activationCost - Base LP cost for activating the ritual + * @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, BlockStack requiredBlock, int activationCost, String unlocalizedName) { - this(name, requiredBlock, activationCost, false, unlocalizedName); + public ImperfectRitual(String name, Predicate blockRequirement, int activationCost, String unlocalizedName) { + this(name, blockRequirement, activationCost, false, unlocalizedName); } /** @@ -49,16 +50,16 @@ public abstract class ImperfectRitual { return name; } - public BlockStack getRequiredBlock() { - return requiredBlock; + public Predicate getBlockRequirement() { + return blockRequirement; } public int getActivationCost() { return activationCost; } - public boolean isLightshow() { - return lightshow; + public boolean isLightShow() { + return lightShow; } public String getUnlocalizedName() { @@ -67,7 +68,7 @@ public abstract class ImperfectRitual { @Override public String toString() { - return getName() + ":" + getRequiredBlock().toString() + "@" + getActivationCost(); + return getName() + "@" + getActivationCost(); } @Override @@ -78,19 +79,14 @@ public abstract class ImperfectRitual { ImperfectRitual that = (ImperfectRitual) o; if (activationCost != that.activationCost) return false; - if (lightshow != that.lightshow) return false; if (name != null ? !name.equals(that.name) : that.name != null) return false; - if (requiredBlock != null ? !requiredBlock.equals(that.requiredBlock) : that.requiredBlock != 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 + (requiredBlock != null ? requiredBlock.hashCode() : 0); result = 31 * result + activationCost; - result = 31 * result + (lightshow ? 1 : 0); result = 31 * result + (unlocalizedName != null ? unlocalizedName.hashCode() : 0); return result; } diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRegistry.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java rename to src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRegistry.java index 1cf8922a..2417a24d 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/ImperfectRitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRegistry.java @@ -1,11 +1,11 @@ -package WayofTime.bloodmagic.core.registry; +package WayofTime.bloodmagic.ritual.imperfect; import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import net.minecraft.block.state.IBlockState; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -43,9 +43,10 @@ public class ImperfectRitualRegistry { registerRitual(imperfectRitual, imperfectRitual.getName()); } - public static ImperfectRitual getRitualForBlock(BlockStack blockStack) { + @Nullable + public static ImperfectRitual getRitualForBlock(IBlockState state) { for (ImperfectRitual imperfectRitual : getRegistry().values()) - if (imperfectRitual.getRequiredBlock().equals(blockStack)) + if (imperfectRitual.getBlockRequirement().test(state)) return imperfectRitual; return null; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/package-info.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/package-info.java similarity index 75% rename from src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/package-info.java rename to src/main/java/WayofTime/bloodmagic/ritual/imperfect/package-info.java index 00a78dbb..9b848792 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/data/imperfect/package-info.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/package-info.java @@ -1,6 +1,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.ritual.data.imperfect; +package WayofTime.bloodmagic.ritual.imperfect; import mcp.MethodsReturnNonnullByDefault; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index 67a8bf76..145ac180 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -1,14 +1,14 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.altar.AltarComponent; import WayofTime.bloodmagic.altar.EnumAltarComponent; import WayofTime.bloodmagic.altar.EnumAltarTier; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; -import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.RitualComponent; +import WayofTime.bloodmagic.ritual.EnumRuneType; +import WayofTime.bloodmagic.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.ritual.RitualComponent; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; @@ -27,6 +27,7 @@ import net.minecraftforge.items.IItemHandler; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; public class RitualAltarBuilder extends Ritual { private Iterator altarComponentsIterator = new ArrayList<>(EnumAltarTier.SIX.getAltarComponents()).iterator(); @@ -113,9 +114,7 @@ public class RitualAltarBuilder extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - + public void gatherComponents(List components) { for (int i = -12; i <= -8; i++) { addRune(components, i, -6, 13, EnumRuneType.AIR); addRune(components, i, -6, -13, EnumRuneType.FIRE); @@ -151,8 +150,6 @@ public class RitualAltarBuilder extends Ritual { for (int i = 3; i <= 5; i++) { addCornerRunes(components, 13, i, EnumRuneType.DUSK); } - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java index 596d5c21..eb271087 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java @@ -1,10 +1,10 @@ -package WayofTime.bloodmagic.ritual; +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.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; @@ -18,7 +18,6 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; -import java.util.ArrayList; import java.util.List; public class RitualAnimalGrowth extends Ritual { @@ -169,11 +168,10 @@ public class RitualAnimalGrowth extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); + public void gatherComponents(List components) { - this.addParallelRunes(components, 2, 0, EnumRuneType.DUSK); - this.addParallelRunes(components, 1, 0, EnumRuneType.WATER); + addParallelRunes(components, 2, 0, EnumRuneType.DUSK); + addParallelRunes(components, 1, 0, EnumRuneType.WATER); components.add(new RitualComponent(new BlockPos(1, 0, 2), EnumRuneType.EARTH)); components.add(new RitualComponent(new BlockPos(1, 0, -2), EnumRuneType.EARTH)); components.add(new RitualComponent(new BlockPos(-1, 0, 2), EnumRuneType.EARTH)); @@ -182,8 +180,6 @@ public class RitualAnimalGrowth extends Ritual { components.add(new RitualComponent(new BlockPos(2, 0, -1), EnumRuneType.AIR)); components.add(new RitualComponent(new BlockPos(-2, 0, 1), EnumRuneType.AIR)); components.add(new RitualComponent(new BlockPos(-2, 0, -1), EnumRuneType.AIR)); - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java similarity index 74% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java index df617162..9c602679 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import com.google.common.collect.Iterables; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; @@ -11,7 +11,6 @@ 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 RitualArmourEvolve extends Ritual { @@ -65,22 +64,19 @@ public class RitualArmourEvolve extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); + public void gatherComponents(List components) { - this.addCornerRunes(components, 1, 0, EnumRuneType.DUSK); - this.addCornerRunes(components, 2, 0, EnumRuneType.FIRE); - this.addOffsetRunes(components, 1, 2, 0, EnumRuneType.FIRE); - this.addCornerRunes(components, 1, 1, EnumRuneType.DUSK); - this.addParallelRunes(components, 4, 0, EnumRuneType.EARTH); - this.addCornerRunes(components, 1, 3, EnumRuneType.DUSK); - this.addParallelRunes(components, 1, 4, EnumRuneType.EARTH); + 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++) { - this.addCornerRunes(components, 3, i, EnumRuneType.EARTH); + addCornerRunes(components, 3, i, EnumRuneType.EARTH); } - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java similarity index 88% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java index d20a3643..abae34aa 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.block.Block; import net.minecraft.init.Blocks; @@ -10,7 +10,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; +import java.util.List; public class RitualCobblestone extends Ritual { @@ -83,13 +83,10 @@ public class RitualCobblestone extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); + public void gatherComponents(List components) { - this.addCornerRunes(components, 1, 1, EnumRuneType.FIRE); - this.addParallelRunes(components, 1, 0, EnumRuneType.WATER); - - return components; + addCornerRunes(components, 1, 1, EnumRuneType.FIRE); + addParallelRunes(components, 1, 0, EnumRuneType.WATER); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java similarity index 80% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java index 4691725c..b7c58ff3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java @@ -1,13 +1,13 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; +import java.util.List; public class RitualContainment extends Ritual { public static final String CONTAINMENT_RANGE = "containmentRange"; @@ -56,15 +56,11 @@ public class RitualContainment extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addParallelRunes(components, 1, 0, EnumRuneType.EARTH); - this.addCornerRunes(components, 2, 0, EnumRuneType.EARTH); - this.addParallelRunes(components, 1, 5, EnumRuneType.EARTH); - this.addCornerRunes(components, 2, 5, EnumRuneType.EARTH); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 5dea1dbf..06d3bc1b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -1,13 +1,13 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.compress.CompressionRegistry; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -251,15 +251,11 @@ public class RitualCrushing extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addParallelRunes(components, 1, 0, EnumRuneType.EARTH); - this.addParallelRunes(components, 2, 0, EnumRuneType.FIRE); - this.addCornerRunes(components, 2, 0, EnumRuneType.DUSK); - this.addParallelRunes(components, 2, 1, EnumRuneType.AIR); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java similarity index 72% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java index 6525cb0d..8eb060a1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java @@ -1,14 +1,14 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; +import java.util.List; public class RitualCrystalHarvest extends Ritual { public static final String CRYSTAL_RANGE = "crystal"; @@ -67,20 +67,16 @@ public class RitualCrystalHarvest extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); - this.addParallelRunes(components, 1, 1, EnumRuneType.DUSK); - this.addParallelRunes(components, 1, -1, EnumRuneType.FIRE); - this.addParallelRunes(components, 2, -1, EnumRuneType.FIRE); - this.addParallelRunes(components, 3, -1, EnumRuneType.FIRE); - this.addOffsetRunes(components, 3, 1, -1, EnumRuneType.FIRE); - this.addCornerRunes(components, 3, -1, EnumRuneType.EARTH); - this.addCornerRunes(components, 3, 0, EnumRuneType.EARTH); - this.addOffsetRunes(components, 3, 2, 0, EnumRuneType.DUSK); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java similarity index 93% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java index 1fb6b7d1..631b35b7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -1,10 +1,9 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; -import java.util.ArrayList; +import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -15,12 +14,11 @@ import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.AreaDescriptor; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; -import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.RitualComponent; -import WayofTime.bloodmagic.util.Utils; +import WayofTime.bloodmagic.ritual.AreaDescriptor; +import WayofTime.bloodmagic.ritual.EnumRuneType; +import WayofTime.bloodmagic.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.ritual.RitualComponent; public class RitualEllipsoid extends Ritual { @@ -217,14 +215,9 @@ public class RitualEllipsoid extends Ritual // } @Override - public ArrayList getComponents() - { - ArrayList components = new ArrayList(); - + public void gatherComponents(List components) { addCornerRunes(components, 1, 0, EnumRuneType.WATER); addCornerRunes(components, 1, 1, EnumRuneType.WATER); - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java similarity index 75% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java index 04ed12f4..1be8f406 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; import com.google.common.collect.Lists; import net.minecraft.block.state.IBlockState; @@ -20,7 +20,6 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.items.IItemHandler; -import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.UUID; @@ -190,47 +189,43 @@ public class RitualExpulsion extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 2, 0, EnumRuneType.EARTH); - this.addRune(components, 2, 0, 1, EnumRuneType.EARTH); - this.addRune(components, 1, 0, 2, EnumRuneType.EARTH); - this.addRune(components, 2, 0, -1, EnumRuneType.EARTH); - this.addRune(components, -1, 0, 2, EnumRuneType.EARTH); - this.addRune(components, -2, 0, 1, EnumRuneType.EARTH); - this.addRune(components, 1, 0, -2, EnumRuneType.EARTH); - this.addRune(components, -2, 0, -1, EnumRuneType.EARTH); - this.addRune(components, -1, 0, -2, EnumRuneType.EARTH); - this.addRune(components, 4, 0, 2, EnumRuneType.AIR); - this.addRune(components, 5, 0, 2, EnumRuneType.AIR); - this.addRune(components, 4, 0, -2, EnumRuneType.AIR); - this.addRune(components, 5, 0, -2, EnumRuneType.AIR); - this.addRune(components, -4, 0, 2, EnumRuneType.AIR); - this.addRune(components, -5, 0, 2, EnumRuneType.AIR); - this.addRune(components, -4, 0, -2, EnumRuneType.AIR); - this.addRune(components, -5, 0, -2, EnumRuneType.AIR); - this.addRune(components, 2, 0, 4, EnumRuneType.AIR); - this.addRune(components, 2, 0, 5, EnumRuneType.AIR); - this.addRune(components, -2, 0, 4, EnumRuneType.AIR); - this.addRune(components, -2, 0, 5, EnumRuneType.AIR); - this.addRune(components, 2, 0, -4, EnumRuneType.AIR); - this.addRune(components, 2, 0, -5, EnumRuneType.AIR); - this.addRune(components, -2, 0, -4, EnumRuneType.AIR); - this.addRune(components, -2, 0, -5, EnumRuneType.AIR); - this.addParallelRunes(components, 5, 0, EnumRuneType.DUSK); - this.addParallelRunes(components, 6, 0, EnumRuneType.EARTH); - this.addRune(components, -6, 0, 1, EnumRuneType.DUSK); - this.addRune(components, -6, 0, -1, EnumRuneType.DUSK); - this.addRune(components, 6, 0, 1, EnumRuneType.DUSK); - this.addRune(components, 6, 0, -1, EnumRuneType.DUSK); - this.addRune(components, 1, 0, 6, EnumRuneType.DUSK); - this.addRune(components, -1, 0, 6, EnumRuneType.DUSK); - this.addRune(components, 1, 0, -6, EnumRuneType.DUSK); - this.addRune(components, -1, 0, -6, EnumRuneType.DUSK); - this.addCornerRunes(components, 4, 0, EnumRuneType.FIRE); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java index efa144fb..476ab93c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java @@ -1,9 +1,10 @@ -package WayofTime.bloodmagic.ritual; +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; @@ -11,7 +12,6 @@ import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; -import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; @@ -23,7 +23,6 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.List; public class RitualFeatheredKnife extends Ritual { @@ -185,18 +184,14 @@ public class RitualFeatheredKnife extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addParallelRunes(components, 1, 0, EnumRuneType.DUSK); - this.addParallelRunes(components, 2, -1, EnumRuneType.WATER); - this.addCornerRunes(components, 1, -1, EnumRuneType.AIR); - this.addOffsetRunes(components, 2, 4, -1, EnumRuneType.FIRE); - this.addOffsetRunes(components, 2, 4, 0, EnumRuneType.EARTH); - this.addOffsetRunes(components, 4, 3, 0, EnumRuneType.EARTH); - this.addCornerRunes(components, 3, 0, EnumRuneType.AIR); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java index c6e3112c..31813dea 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; @@ -16,6 +16,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; public class RitualFelling extends Ritual { public static final String FELLING_RANGE = "fellingRange"; @@ -85,13 +86,9 @@ public class RitualFelling extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - + public void gatherComponents(List components) { addCornerRunes(components, 1, 0, EnumRuneType.EARTH); addCornerRunes(components, 1, 1, EnumRuneType.EARTH); - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java similarity index 88% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java index 402a8b40..8767e150 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityAnimal; @@ -178,20 +178,16 @@ public class RitualForsakenSoul extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); - this.addParallelRunes(components, 1, -1, EnumRuneType.DUSK); - this.addParallelRunes(components, 1, 1, EnumRuneType.FIRE); - this.addParallelRunes(components, 2, 1, EnumRuneType.FIRE); - this.addParallelRunes(components, 3, 1, EnumRuneType.FIRE); - this.addOffsetRunes(components, 3, 1, 1, EnumRuneType.FIRE); - this.addCornerRunes(components, 3, 1, EnumRuneType.EARTH); - this.addCornerRunes(components, 3, 0, EnumRuneType.EARTH); - this.addOffsetRunes(components, 3, 2, 0, EnumRuneType.EARTH); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java similarity index 86% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java index 7bcd06e7..35fa103d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; @@ -12,7 +12,6 @@ import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import java.util.ArrayList; import java.util.List; public class RitualFullStomach extends Ritual { @@ -93,16 +92,12 @@ public class RitualFullStomach extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addParallelRunes(components, 3, 0, EnumRuneType.FIRE); - this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); - this.addOffsetRunes(components, 1, 2, 0, EnumRuneType.AIR); - this.addCornerRunes(components, 4, 0, EnumRuneType.WATER); - this.addOffsetRunes(components, 4, 3, 0, EnumRuneType.EARTH); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java index 84089407..79f3b0f2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java @@ -1,12 +1,12 @@ -package WayofTime.bloodmagic.ritual; +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.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.BlockFarmland; @@ -22,7 +22,6 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -259,13 +258,9 @@ public class RitualGreenGrove extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 1, 0, EnumRuneType.EARTH); - this.addParallelRunes(components, 1, 0, EnumRuneType.WATER); - - return components; + public void gatherComponents(List components) { + addCornerRunes(components, 1, 0, EnumRuneType.EARTH); + addParallelRunes(components, 1, 0, EnumRuneType.WATER); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java index 63036470..c554cc83 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.ritual.harvest.IHarvestHandler; import WayofTime.bloodmagic.ritual.harvest.HarvestRegistry; -import WayofTime.bloodmagic.ritual.data.*; import com.google.common.collect.Lists; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.InventoryHelper; @@ -16,7 +16,6 @@ import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -import java.util.ArrayList; import java.util.List; /** @@ -75,9 +74,7 @@ public class RitualHarvest extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - + public void gatherComponents(List components) { components.add(new RitualComponent(new BlockPos(1, 0, 1), EnumRuneType.DUSK)); components.add(new RitualComponent(new BlockPos(1, 0, -1), EnumRuneType.DUSK)); components.add(new RitualComponent(new BlockPos(-1, 0, -1), EnumRuneType.DUSK)); @@ -102,8 +99,6 @@ public class RitualHarvest extends Ritual { components.add(new RitualComponent(new BlockPos(3, 0, -2), EnumRuneType.WATER)); components.add(new RitualComponent(new BlockPos(-2, 0, -3), EnumRuneType.WATER)); components.add(new RitualComponent(new BlockPos(-3, 0, -2), EnumRuneType.WATER)); - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java similarity index 85% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java index 26801083..44d48d1d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java @@ -1,13 +1,13 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; +import java.util.List; public class RitualInterdiction extends Ritual { public static final String INTERDICTION_RANGE = "interdictionRange"; @@ -60,13 +60,9 @@ public class RitualInterdiction extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 1, 0, EnumRuneType.AIR); - this.addParallelRunes(components, 1, 0, EnumRuneType.AIR); - - return components; + public void gatherComponents(List components) { + addCornerRunes(components, 1, 0, EnumRuneType.AIR); + addParallelRunes(components, 1, 0, EnumRuneType.AIR); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java similarity index 87% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java index 62f6f77c..f594e44b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java @@ -1,14 +1,13 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.List; public class RitualJumping extends Ritual { @@ -69,13 +68,9 @@ public class RitualJumping extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - + public void gatherComponents(List components) { for (int i = -1; i <= 1; i++) - this.addCornerRunes(components, 1, i, EnumRuneType.AIR); - - return components; + addCornerRunes(components, 1, i, EnumRuneType.AIR); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java similarity index 97% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index 884ddf09..89e9b8ec 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -1,12 +1,12 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.PleaseStopUsingMe; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; @@ -25,7 +25,6 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -import java.util.ArrayList; import java.util.List; public class RitualLava extends Ritual { @@ -233,12 +232,8 @@ public class RitualLava extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addParallelRunes(components, 1, 0, EnumRuneType.FIRE); - - return components; + public void gatherComponents(List components) { + addParallelRunes(components, 1, 0, EnumRuneType.FIRE); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java similarity index 75% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java index 566f9019..c22915bc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; @@ -6,7 +6,7 @@ import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.effect.EntityLightningBolt; @@ -162,46 +162,41 @@ public class RitualLivingArmourDowngrade extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addRune(components, 0, 0, -1, EnumRuneType.AIR); - this.addRune(components, 0, 0, -2, EnumRuneType.DUSK); - this.addRune(components, 0, 1, -3, EnumRuneType.DUSK); - this.addRune(components, 0, 2, -3, EnumRuneType.BLANK); - this.addRune(components, 0, 3, -3, EnumRuneType.BLANK); - this.addRune(components, 0, 1, -4, EnumRuneType.FIRE); + public void gatherComponents(List 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++) - this.addRune(components, 0, 0, i, EnumRuneType.AIR); + addRune(components, 0, 0, i, EnumRuneType.AIR); for (int sgn = -1; sgn <= 1; sgn += 2) { - this.addRune(components, sgn, 0, 4, EnumRuneType.AIR); - this.addRune(components, sgn * 2, 0, 2, EnumRuneType.AIR); - this.addRune(components, sgn * 3, 0, 2, EnumRuneType.AIR); - this.addRune(components, sgn * 3, 0, 3, EnumRuneType.AIR); - this.addRune(components, sgn, 0, 0, EnumRuneType.EARTH); - this.addRune(components, sgn, 0, 1, EnumRuneType.EARTH); - this.addRune(components, sgn * 2, 0, -1, EnumRuneType.FIRE); - this.addRune(components, sgn * 2, 0, -2, EnumRuneType.FIRE); - this.addRune(components, sgn * 3, 0, -2, EnumRuneType.FIRE); - this.addRune(components, sgn * 3, 0, -3, EnumRuneType.FIRE); - this.addRune(components, sgn * 3, 0, -4, EnumRuneType.FIRE); - this.addRune(components, sgn, 1, -1, EnumRuneType.AIR); - this.addRune(components, sgn, 1, -2, EnumRuneType.AIR); - this.addRune(components, sgn, 1, -4, EnumRuneType.FIRE); - this.addRune(components, sgn * 2, 1, -4, EnumRuneType.FIRE); - this.addRune(components, sgn, 0, -3, EnumRuneType.EARTH); - this.addRune(components, sgn, 0, -4, EnumRuneType.EARTH); - this.addRune(components, sgn, 0, -5, EnumRuneType.EARTH); - this.addRune(components, sgn, 1, -5, EnumRuneType.EARTH); - this.addRune(components, sgn, 2, -5, EnumRuneType.EARTH); - this.addRune(components, sgn, 3, -5, EnumRuneType.EARTH); - - this.addRune(components, sgn, 3, -4, EnumRuneType.EARTH); + 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); } - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java similarity index 90% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index 86e3d325..2fc4868c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.BlockOre; @@ -16,8 +16,8 @@ import net.minecraft.util.math.BlockPos; 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; public class RitualMagnetic extends Ritual { @@ -135,15 +135,11 @@ public class RitualMagnetic extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 1, 0, EnumRuneType.EARTH); - this.addParallelRunes(components, 2, 1, EnumRuneType.EARTH); - this.addCornerRunes(components, 2, 1, EnumRuneType.AIR); - this.addParallelRunes(components, 2, 2, EnumRuneType.FIRE); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java similarity index 73% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java index 939fd82a..95edf4ed 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java @@ -1,18 +1,17 @@ -package WayofTime.bloodmagic.ritual; +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.entity.projectile.EntityMeteor; import WayofTime.bloodmagic.meteor.Meteor; import WayofTime.bloodmagic.meteor.MeteorRegistry; -import WayofTime.bloodmagic.ritual.data.*; import net.minecraft.entity.item.EntityItem; 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 RitualMeteor extends Ritual { @@ -95,36 +94,32 @@ public class RitualMeteor extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addParallelRunes(components, 2, 0, EnumRuneType.FIRE); - this.addOffsetRunes(components, 3, 1, 0, EnumRuneType.AIR); - this.addOffsetRunes(components, 4, 2, 0, EnumRuneType.AIR); - this.addOffsetRunes(components, 5, 3, 0, EnumRuneType.DUSK); - this.addCornerRunes(components, 4, 0, EnumRuneType.DUSK); + public void gatherComponents(List 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++) { - this.addParallelRunes(components, 4, 0, EnumRuneType.EARTH); + addParallelRunes(components, 4, 0, EnumRuneType.EARTH); } - this.addParallelRunes(components, 8, 0, EnumRuneType.EARTH); - this.addParallelRunes(components, 8, 1, EnumRuneType.EARTH); - this.addParallelRunes(components, 7, 1, EnumRuneType.EARTH); - this.addParallelRunes(components, 7, 2, EnumRuneType.EARTH); - this.addParallelRunes(components, 6, 2, EnumRuneType.FIRE); - this.addParallelRunes(components, 6, 3, EnumRuneType.WATER); - this.addParallelRunes(components, 5, 3, EnumRuneType.WATER); - this.addParallelRunes(components, 5, 4, EnumRuneType.AIR); + 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); - this.addOffsetRunes(components, 1, 4, 4, EnumRuneType.AIR); - this.addParallelRunes(components, 4, 4, EnumRuneType.AIR); + addOffsetRunes(components, 1, 4, 4, EnumRuneType.AIR); + addParallelRunes(components, 4, 4, EnumRuneType.AIR); - this.addOffsetRunes(components, 2, 4, 4, EnumRuneType.WATER); - this.addOffsetRunes(components, 2, 3, 4, EnumRuneType.FIRE); - this.addCornerRunes(components, 3, 4, EnumRuneType.FIRE); - - return components; + addOffsetRunes(components, 2, 4, 4, EnumRuneType.WATER); + addOffsetRunes(components, 2, 3, 4, EnumRuneType.FIRE); + addCornerRunes(components, 3, 4, EnumRuneType.FIRE); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java index 27809a91..be35f269 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemBlock; @@ -13,7 +13,7 @@ import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import java.util.ArrayList; +import java.util.List; public class RitualPlacer extends Ritual { public static final String PLACER_RANGE = "placerRange"; @@ -80,9 +80,7 @@ public class RitualPlacer extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - + public void gatherComponents(List components) { addRune(components, 3, 0, 3, EnumRuneType.EARTH); addRune(components, 3, 0, -3, EnumRuneType.EARTH); addRune(components, -3, 0, 3, EnumRuneType.EARTH); @@ -96,8 +94,6 @@ public class RitualPlacer extends Ritual { addRune(components, -2, 0, -3, EnumRuneType.WATER); addRune(components, -3, 0, 2, EnumRuneType.WATER); addRune(components, -3, 0, -2, EnumRuneType.WATER); - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java index d62f2f64..da2c5a7d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java @@ -1,10 +1,10 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; -import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.RitualComponent; +import WayofTime.bloodmagic.ritual.EnumRuneType; +import WayofTime.bloodmagic.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.ritual.RitualComponent; import WayofTime.bloodmagic.teleport.PortalLocation; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; @@ -17,7 +17,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.ForgeRegistries; -import java.util.ArrayList; +import java.util.List; import java.util.UUID; public class RitualPortal extends Ritual { @@ -183,9 +183,7 @@ public class RitualPortal extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - + public void gatherComponents(List components) { addRune(components, 1, 0, 0, EnumRuneType.AIR); addRune(components, 2, 0, 0, EnumRuneType.WATER); addRune(components, -1, 0, 0, EnumRuneType.FIRE); @@ -203,8 +201,6 @@ public class RitualPortal extends Ritual { addRune(components, -2, 3, 0, EnumRuneType.FIRE); addRune(components, -2, 2, 0, EnumRuneType.EARTH); addRune(components, -2, 1, 0, EnumRuneType.DUSK); - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java similarity index 94% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java index 1cb26be9..b61c1312 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import com.google.common.collect.Lists; import net.minecraft.block.BlockLiquid; import net.minecraft.block.state.IBlockState; @@ -18,7 +18,6 @@ import net.minecraftforge.fluids.capability.wrappers.BlockLiquidWrapper; import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper; import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -91,17 +90,13 @@ public class RitualPump extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - + public void gatherComponents(List 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); - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java similarity index 92% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java index 1da5a885..c547d6b8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java @@ -1,10 +1,10 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.PleaseStopUsingMe; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -14,7 +14,6 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -153,9 +152,7 @@ public class RitualRegeneration extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - + public void gatherComponents(List components) { components.add(new RitualComponent(new BlockPos(4, 0, 0), EnumRuneType.AIR)); components.add(new RitualComponent(new BlockPos(5, 0, -1), EnumRuneType.AIR)); components.add(new RitualComponent(new BlockPos(5, 0, 1), EnumRuneType.AIR)); @@ -168,13 +165,11 @@ public class RitualRegeneration extends Ritual { components.add(new RitualComponent(new BlockPos(0, 0, -4), EnumRuneType.FIRE)); components.add(new RitualComponent(new BlockPos(1, 0, -5), EnumRuneType.FIRE)); components.add(new RitualComponent(new BlockPos(-1, 0, -5), EnumRuneType.FIRE)); - this.addOffsetRunes(components, 3, 5, 0, EnumRuneType.WATER); - this.addCornerRunes(components, 3, 0, EnumRuneType.DUSK); - this.addOffsetRunes(components, 4, 5, 0, EnumRuneType.EARTH); - this.addOffsetRunes(components, 4, 5, -1, EnumRuneType.EARTH); - this.addCornerRunes(components, 5, 0, EnumRuneType.EARTH); - - return components; + 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java similarity index 91% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java index 02d9fd7e..3bf3ab59 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java @@ -1,9 +1,9 @@ -package WayofTime.bloodmagic.ritual; +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.ritual.data.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -13,7 +13,6 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.List; public class RitualSpeed extends Ritual { @@ -153,18 +152,14 @@ public class RitualSpeed extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addRune(components, 0, 0, -2, EnumRuneType.DUSK); - this.addRune(components, 1, 0, -1, EnumRuneType.AIR); - this.addRune(components, -1, 0, -1, EnumRuneType.AIR); + public void gatherComponents(List 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++) { - this.addRune(components, 2, 0, i, EnumRuneType.AIR); - this.addRune(components, -2, 0, i, EnumRuneType.AIR); + addRune(components, 2, 0, i, EnumRuneType.AIR); + addRune(components, -2, 0, i, EnumRuneType.AIR); } - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java similarity index 70% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java index b944c9ec..964744e8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileSpectralBlock; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.state.IBlockState; @@ -9,7 +9,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; +import java.util.List; public class RitualSuppression extends Ritual { public static final String SUPPRESSION_RANGE = "suppressionRange"; @@ -56,20 +56,16 @@ public class RitualSuppression extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 2, 0, EnumRuneType.WATER); - this.addRune(components, -2, 0, -1, EnumRuneType.AIR); - this.addRune(components, -1, 0, -2, EnumRuneType.AIR); - this.addRune(components, -2, 0, 1, EnumRuneType.AIR); - this.addRune(components, 1, 0, -2, EnumRuneType.AIR); - this.addRune(components, 2, 0, 1, EnumRuneType.AIR); - this.addRune(components, 1, 0, 2, EnumRuneType.AIR); - this.addRune(components, 2, 0, -1, EnumRuneType.AIR); - this.addRune(components, -1, 0, 2, EnumRuneType.AIR); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java index 49ad448b..c504e747 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java @@ -1,13 +1,13 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.livingArmour.StatTracker; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.ritual.data.*; import com.google.common.collect.Iterables; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; @@ -16,7 +16,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; @@ -103,22 +102,18 @@ public class RitualUpgradeRemove extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 1, 0, EnumRuneType.DUSK); - this.addCornerRunes(components, 2, 0, EnumRuneType.FIRE); - this.addOffsetRunes(components, 1, 2, 0, EnumRuneType.FIRE); - this.addCornerRunes(components, 1, 1, EnumRuneType.WATER); - this.addParallelRunes(components, 4, 0, EnumRuneType.EARTH); - this.addCornerRunes(components, 1, 3, EnumRuneType.WATER); - this.addParallelRunes(components, 1, 4, EnumRuneType.AIR); + public void gatherComponents(List 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++) { - this.addCornerRunes(components, 3, i, EnumRuneType.EARTH); + addCornerRunes(components, 3, i, EnumRuneType.EARTH); } - - return components; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java similarity index 84% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java index 0d784546..74867148 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java @@ -1,12 +1,12 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; +import java.util.List; public class RitualWater extends Ritual { public static final String WATER_RANGE = "waterRange"; @@ -57,12 +57,8 @@ public class RitualWater extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 1, 0, EnumRuneType.WATER); - - return components; + public void gatherComponents(List components) { + addCornerRunes(components, 1, 0, EnumRuneType.WATER); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java similarity index 85% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index 44604cc5..51cf4e4c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -1,8 +1,8 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -14,7 +14,6 @@ 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; public class RitualWellOfSuffering extends Ritual { @@ -118,18 +117,14 @@ public class RitualWellOfSuffering extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addCornerRunes(components, 1, 0, EnumRuneType.FIRE); - this.addCornerRunes(components, 2, -1, EnumRuneType.FIRE); - this.addParallelRunes(components, 2, -1, EnumRuneType.EARTH); - this.addCornerRunes(components, -3, -1, EnumRuneType.DUSK); - this.addOffsetRunes(components, 2, 4, -1, EnumRuneType.WATER); - this.addOffsetRunes(components, 1, 4, 0, EnumRuneType.WATER); - this.addParallelRunes(components, 4, 1, EnumRuneType.AIR); - - return components; + public void gatherComponents(List 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java similarity index 86% rename from src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java index fc4ea91f..d4a15920 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java @@ -1,7 +1,7 @@ -package WayofTime.bloodmagic.ritual; +package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.data.*; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; @@ -10,7 +10,6 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.List; public class RitualZephyr extends Ritual { @@ -81,14 +80,10 @@ public class RitualZephyr extends Ritual { } @Override - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - this.addParallelRunes(components, 2, 0, EnumRuneType.AIR); - this.addCornerRunes(components, 1, 1, EnumRuneType.AIR); - this.addParallelRunes(components, 1, -1, EnumRuneType.AIR); - - return components; + public void gatherComponents(List components) { + addParallelRunes(components, 2, 0, EnumRuneType.AIR); + addCornerRunes(components, 1, 1, EnumRuneType.AIR); + addParallelRunes(components, 1, -1, EnumRuneType.AIR); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java similarity index 61% rename from src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java index 2d60a7e8..8c6d4eda 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualDay.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java @@ -1,15 +1,14 @@ -package WayofTime.bloodmagic.ritual.imperfect; +package WayofTime.bloodmagic.ritual.types.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; public class ImperfectRitualDay extends ImperfectRitual { public ImperfectRitualDay() { - super("day", new BlockStack(Blocks.GOLD_BLOCK), 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.day"); + super("day", s -> s.getBlock() == Blocks.GOLD_BLOCK, 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.day"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java similarity index 61% rename from src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java index caa2bcd7..504fe1a0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualNight.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java @@ -1,15 +1,14 @@ -package WayofTime.bloodmagic.ritual.imperfect; +package WayofTime.bloodmagic.ritual.types.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; public class ImperfectRitualNight extends ImperfectRitual { public ImperfectRitualNight() { - super("night", new BlockStack(Blocks.LAPIS_BLOCK), 100, true, "ritual." + BloodMagic.MODID + ".imperfect.night"); + super("night", s -> s.getBlock() == Blocks.LAPIS_BLOCK, 100, true, "ritual." + BloodMagic.MODID + ".imperfect.night"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java similarity index 68% rename from src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java index 098c9bba..58e1ec6c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRain.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java @@ -1,15 +1,14 @@ -package WayofTime.bloodmagic.ritual.imperfect; +package WayofTime.bloodmagic.ritual.types.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; public class ImperfectRitualRain extends ImperfectRitual { public ImperfectRitualRain() { - super("rain", new BlockStack(Blocks.WATER), 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.rain"); + super("rain", s -> s.getBlock() == Blocks.WATER, 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.rain"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java similarity index 60% rename from src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java index 1c3249db..9bb7e0de 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualResistance.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java @@ -1,9 +1,8 @@ -package WayofTime.bloodmagic.ritual.imperfect; +package WayofTime.bloodmagic.ritual.types.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; @@ -11,7 +10,7 @@ import net.minecraft.potion.PotionEffect; public class ImperfectRitualResistance extends ImperfectRitual { public ImperfectRitualResistance() { - super("resistance", new BlockStack(Blocks.BEDROCK), 5000, "ritual." + BloodMagic.MODID + ".imperfect.resistance"); + super("resistance", s -> s.getBlock() == Blocks.BEDROCK, 5000, "ritual." + BloodMagic.MODID + ".imperfect.resistance"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java similarity index 76% rename from src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java rename to src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java index 4f2e34fd..4c539eb4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualZombie.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java @@ -1,9 +1,8 @@ -package WayofTime.bloodmagic.ritual.imperfect; +package WayofTime.bloodmagic.ritual.types.imperfect; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -12,7 +11,7 @@ import net.minecraft.potion.PotionEffect; public class ImperfectRitualZombie extends ImperfectRitual { public ImperfectRitualZombie() { - super("zombie", new BlockStack(Blocks.COAL_BLOCK), 5000, "ritual." + BloodMagic.MODID + ".imperfect.zombie"); + super("zombie", s -> s.getBlock() == Blocks.COAL_BLOCK, 5000, "ritual." + BloodMagic.MODID + ".imperfect.zombie"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index 8170946d..dab32935 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.structures; -import WayofTime.bloodmagic.ritual.data.AreaDescriptor; +import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.util.BMLog; import net.minecraft.util.EnumFacing; import net.minecraft.util.Mirror; diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java index de848276..cef16685 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.structures; -import WayofTime.bloodmagic.ritual.data.AreaDescriptor; +import WayofTime.bloodmagic.ritual.AreaDescriptor; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java index 8fe0d65c..c58a02be 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.ritual.RitualPortal; +import WayofTime.bloodmagic.ritual.types.RitualPortal; import WayofTime.bloodmagic.tile.base.TileBase; import com.google.common.base.Strings; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java index da6ff9b0..7e8b1d12 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.core.registry.ImperfectRitualRegistry; -import WayofTime.bloodmagic.ritual.data.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.data.imperfect.ImperfectRitual; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; +import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; +import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.base.TileBase; @@ -11,16 +11,17 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import javax.annotation.Nullable; + public class TileImperfectRitualStone extends TileBase implements IImperfectRitualStone { - // IImperfectRitualStone @Override - public boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, EntityPlayer player) { + public boolean performRitual(World world, BlockPos pos, @Nullable ImperfectRitual imperfectRitual, EntityPlayer player) { if (imperfectRitual != null && ImperfectRitualRegistry.ritualEnabled(imperfectRitual)) { if (!PlayerHelper.isFakePlayer(player) && !world.isRemote) { NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, imperfectRitual.getActivationCost()); if (imperfectRitual.onActivate(this, player)) { - if (imperfectRitual.isLightshow()) + if (imperfectRitual.isLightShow()) getWorld().addWeatherEffect(new EntityLightningBolt(getWorld(), getPos().getX(), getPos().getY() + 2, getPos().getZ(), true)); return true; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index 125f8cca..f0da8c4a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.ritual.data.AreaDescriptor; +import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.incense.*; import net.minecraft.block.Block; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 0bbf0441..fd8fcca1 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -4,9 +4,9 @@ import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.RitualEvent; -import WayofTime.bloodmagic.core.registry.RitualRegistry; -import WayofTime.bloodmagic.ritual.data.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.data.Ritual; +import WayofTime.bloodmagic.ritual.RitualRegistry; +import WayofTime.bloodmagic.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.Ritual; import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.util.helper.*; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java index 88ea4e75..fdcab9f4 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.iface.IPurificationAsh; -import WayofTime.bloodmagic.ritual.data.AreaDescriptor; +import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.util.helper.PurificationHelper; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.item.ItemStack; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index e1025a32..a63f727e 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -3,9 +3,9 @@ package WayofTime.bloodmagic.util.handler.event; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.core.registry.RitualRegistry; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.RitualComponent; +import WayofTime.bloodmagic.ritual.RitualRegistry; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.ritual.RitualComponent; import WayofTime.bloodmagic.client.hud.HUDElement; import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.client.render.block.RenderFakeBlocks; @@ -18,6 +18,7 @@ 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.EntityPlayerSP; @@ -269,7 +270,9 @@ public class ClientHandler { double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; - for (RitualComponent ritualComponent : ritual.getComponents()) { + List components = Lists.newArrayList(); + ritual.gatherComponents(components); + for (RitualComponent ritualComponent : components) { vX = vec3.add(ritualComponent.getOffset(direction)); double minX = vX.getX() - posX; double minY = vX.getY() - posY; @@ -346,7 +349,9 @@ public class ClientHandler { double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; - for (RitualComponent ritualComponent : ritual.getComponents()) { + List components = Lists.newArrayList(); + ritual.gatherComponents(components); + for (RitualComponent ritualComponent : components) { vX = vec3.add(ritualComponent.getOffset(direction)); double minX = vX.getX() - posX; double minY = vX.getY() - posY; diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java index 6ecfe11e..5a73de68 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java @@ -1,10 +1,11 @@ package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.core.registry.RitualRegistry; -import WayofTime.bloodmagic.ritual.data.EnumRuneType; -import WayofTime.bloodmagic.ritual.data.IRitualStone; -import WayofTime.bloodmagic.ritual.data.Ritual; -import WayofTime.bloodmagic.ritual.data.RitualComponent; +import WayofTime.bloodmagic.ritual.RitualRegistry; +import WayofTime.bloodmagic.ritual.EnumRuneType; +import WayofTime.bloodmagic.ritual.IRitualStone; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.ritual.RitualComponent; +import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; @@ -15,6 +16,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityInject; import java.util.ArrayList; +import java.util.List; public class RitualHelper { @CapabilityInject(IRitualStone.Tile.class) @@ -76,10 +78,8 @@ public class RitualHelper { return false; } - ArrayList components = ritual.getComponents(); - - if (components == null) - return false; + List components = Lists.newArrayList(); + ritual.gatherComponents(components); for (RitualComponent component : components) { BlockPos newPos = pos.add(component.getOffset(direction)); From 8a61741e0d6fb5206d047e5dd2e60c44059d117f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 4 Mar 2018 10:15:03 -0800 Subject: [PATCH 226/595] Rewrite Transposition Sigil --- .../item/sigil/ItemSigilTransposition.java | 114 +++++++++--------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index 3a00e1fe..6e3b00f4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -1,32 +1,30 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.util.Constants; 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.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityMobSpawner; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.ForgeRegistries; 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); } @@ -40,26 +38,22 @@ public class ItemSigilTransposition extends ItemSigilBase { return; NBTTagCompound tag = stack.getTagCompound(); - if (tag.hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && tag.hasKey(Constants.NBT.CONTAINED_BLOCK_META)) { + if (tag.hasKey("stored")) { tooltip.add(" "); - BlockStack blockStack = new BlockStack(Block.getBlockFromName(tag.getString(Constants.NBT.CONTAINED_BLOCK_NAME)), tag.getByte(Constants.NBT.CONTAINED_BLOCK_META)); - tooltip.add(blockStack.getItemStack().getDisplayName()); + tooltip.add(tag.getCompoundTag("stored").getString("display")); } } + @SideOnly(Side.CLIENT) @Override public String getItemStackDisplayName(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); + if (!stack.hasTagCompound()) + return super.getItemStackDisplayName(stack); + NBTTagCompound tag = stack.getTagCompound(); + if (tag.hasKey("stored")) + return super.getItemStackDisplayName(stack) + " (" + tag.getCompoundTag("stored").getString("display") + ")"; - if (tag.hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && tag.hasKey(Constants.NBT.CONTAINED_BLOCK_META)) { - BlockStack blockStack = new BlockStack(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(tag.getString(Constants.NBT.CONTAINED_BLOCK_NAME))), tag.getByte(Constants.NBT.CONTAINED_BLOCK_META)); - if (blockStack.getItemStack() != null && blockStack.getItemStack().getItem() != null) //TODO: Figure out why it's a null item. This is a patchwork solution. - { - return super.getItemStackDisplayName(stack) + " (" + blockStack.getItemStack().getDisplayName() + ")"; - } - - } return super.getItemStackDisplayName(stack); } @@ -71,68 +65,59 @@ public class ItemSigilTransposition extends ItemSigilBase { if (PlayerHelper.isFakePlayer(player)) return EnumActionResult.FAIL; - stack = NBTHelper.checkNBT(stack); - IBlockState state = world.getBlockState(blockPos); if (!world.isRemote) { if (BloodMagicAPI.INSTANCE.getBlacklist().getTransposition().contains(state)) return EnumActionResult.FAIL; - if (player.isSneaking() && (!stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) || !stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META))) { + if (player.isSneaking() && stack.hasTagCompound() && !stack.getTagCompound().hasKey("stored")) { if (state.getPlayerRelativeBlockHardness(player, world, blockPos) >= 0 && state.getBlockHardness(world, blockPos) >= 0) { int cost = getLpUsed(); - NBTTagCompound tileNBTTag = new NBTTagCompound(); - String blockName = state.getBlock().getRegistryName().toString(); - byte metadata = (byte) state.getBlock().getMetaFromState(state); + NBTTagCompound stored = new NBTTagCompound(); + stored.setTag("state", NBTUtil.writeBlockState(new NBTTagCompound(), 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 NBTTagCompound())); - if (world.getTileEntity(blockPos) != null) { - cost *= 5; - world.getTileEntity(blockPos).writeToNBT(tileNBTTag); - - if (world.getTileEntity(blockPos) instanceof TileEntityMobSpawner) { - cost *= 6; + if (world.getTileEntity(blockPos) instanceof TileEntityMobSpawner) + cost *= 6; } } - stack.getTagCompound().setString(Constants.NBT.CONTAINED_BLOCK_NAME, blockName); - stack.getTagCompound().setByte(Constants.NBT.CONTAINED_BLOCK_META, metadata); - stack.getTagCompound().setTag(Constants.NBT.CONTAINED_TILE_ENTITY, tileNBTTag); - + stack.getTagCompound().setTag("stored", stored); NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, cost); - world.removeTileEntity(blockPos); world.setBlockToAir(blockPos); - return EnumActionResult.SUCCESS; } - } else if (stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META)) { - IBlockState iblockstate = world.getBlockState(blockPos); - Block block = iblockstate.getBlock(); - BlockStack blockToPlace = new BlockStack(Block.getBlockFromName(stack.getTagCompound().getString(Constants.NBT.CONTAINED_BLOCK_NAME)), stack.getTagCompound().getByte(Constants.NBT.CONTAINED_BLOCK_META)); + } else if (stack.hasTagCompound() && stack.getTagCompound().hasKey("stored")) { + IBlockState worldState = world.getBlockState(blockPos); + NBTTagCompound storedTag = stack.getTagCompound().getCompoundTag("stored"); + IBlockState storedState = NBTUtil.readBlockState(storedTag.getCompoundTag("state")); + NBTTagCompound tileData = storedTag.hasKey("tileData") ? storedTag.getCompoundTag("tileData") : null; - if (!block.isReplaceable(world, blockPos)) { + if (!worldState.getBlock().isReplaceable(world, blockPos)) blockPos = blockPos.offset(side); - } - if (!stack.isEmpty() && player.canPlayerEdit(blockPos, side, stack) && world.mayPlace(blockToPlace.getBlock(), blockPos, false, side, player)) { - if (world.setBlockState(blockPos, blockToPlace.getState(), 3)) { - blockToPlace.getBlock().onBlockPlacedBy(world, blockPos, blockToPlace.getState(), player, blockToPlace.getItemStack()); -// world.playSound((double) ((float) blockPos.getX() + 0.5F), (double) ((float) blockPos.getY() + 0.5F), (double) ((float) blockPos.getZ() + 0.5F), blockToPlace.getBlock().getStepSound().getPlaceSound(), (blockToPlace.getBlock().getStepSound().getVolume() + 1.0F) / 2.0F, blockToPlace.getBlock().getStepSound().getPitch() * 0.8F); + 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 (stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_TILE_ENTITY) && blockToPlace.getBlock().hasTileEntity(blockToPlace.getState())) { - NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.CONTAINED_TILE_ENTITY); - tag.setInteger("x", blockPos.getX()); - tag.setInteger("y", blockPos.getY()); - tag.setInteger("z", blockPos.getZ()); - world.getTileEntity(blockPos).readFromNBT(tag); + 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(Constants.NBT.CONTAINED_BLOCK_NAME); - stack.getTagCompound().removeTag(Constants.NBT.CONTAINED_BLOCK_META); - stack.getTagCompound().removeTag(Constants.NBT.CONTAINED_TILE_ENTITY); - + stack.getTagCompound().removeTag("stored"); return EnumActionResult.SUCCESS; } } @@ -140,4 +125,19 @@ public class ItemSigilTransposition extends ItemSigilBase { } return EnumActionResult.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 NBTTagCompound getNBTShareTag(ItemStack stack) { + if (!stack.hasTagCompound() || !stack.getTagCompound().hasKey("stored")) + return super.getNBTShareTag(stack); + + NBTTagCompound shareTag = stack.getTagCompound().copy(); + NBTTagCompound storedTag = shareTag.getCompoundTag("stored"); + storedTag.removeTag("state"); + storedTag.removeTag("stored"); + + return shareTag; + } } From 2b86e5c8ad27622634aa20b52ed4f647eca1fc1f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 4 Mar 2018 10:47:15 -0800 Subject: [PATCH 227/595] More removal of BlockStack usages --- .../DataProviderRitualController.java | 1 - .../ritual/types/RitualMagnetic.java | 41 ++----------------- .../java/WayofTime/bloodmagic/util/Utils.java | 14 +++---- 3 files changed, 11 insertions(+), 45 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index 3e97d19f..2d5f1975 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.compat.waila.provider; -import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; import WayofTime.bloodmagic.ritual.RitualRegistry; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index 2fc4868c..2950cc63 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -2,27 +2,19 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; -import net.minecraft.block.BlockOre; -import net.minecraft.block.BlockRedstoneOre; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -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 java.util.HashMap; import java.util.List; -import java.util.Map; public class RitualMagnetic extends Ritual { public static final String PLACEMENT_RANGE = "placementRange"; - private static final Map oreBlockCache = new HashMap(); // public static final String SEARCH_RANGE = "searchRange"; public BlockPos lastPos; // An offset @@ -58,9 +50,7 @@ public class RitualMagnetic extends Ritual { } IBlockState downState = world.getBlockState(pos.down()); - Block downBlock = downState.getBlock(); - - int radius = getRadius(downBlock); + int radius = getRadius(downState.getBlock()); if (replace) { int j = -1; @@ -78,10 +68,7 @@ public class RitualMagnetic extends Ritual { while (k <= radius) { BlockPos newPos = pos.add(i, j, k); IBlockState state = world.getBlockState(newPos); - Block block = state.getBlock(); - ItemStack checkStack = block.getItem(world, newPos, state); -// int meta = block.getMetaFromState(state); - + ItemStack checkStack = state.getBlock().getPickBlock(state, null, world, newPos, null); if (isBlockOre(checkStack)) { Utils.swapLocations(world, newPos, world, replacement); masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); @@ -103,7 +90,6 @@ public class RitualMagnetic extends Ritual { j = -1; this.lastPos = new BlockPos(i, j, k); - return; } } @@ -147,35 +133,16 @@ public class RitualMagnetic extends Ritual { return new RitualMagnetic(); } - public static boolean isBlockOre(Block block, int meta) { - if (block == null) - return false; - - if (block instanceof BlockOre || block instanceof BlockRedstoneOre) - return true; - - if (Item.getItemFromBlock(block) == Items.AIR) - return false; - - BlockStack type = new BlockStack(block, meta); - return oreBlockCache.computeIfAbsent(type, RitualMagnetic::computeIsItemOre); - } - - private static boolean computeIsItemOre(BlockStack type) { - ItemStack stack = new ItemStack(type.getBlock(), type.getMeta()); - return isBlockOre(stack); - } - public static boolean isBlockOre(ItemStack stack) { - if (stack.isEmpty()) { + 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/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 417eddad..83ea0573 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -848,10 +848,10 @@ public class Utils { if (finalTile != null) finalTile.writeToNBT(finalTag); - BlockStack initialStack = BlockStack.getStackFromPos(initialWorld, initialPos); - BlockStack finalStack = BlockStack.getStackFromPos(finalWorld, finalPos); + IBlockState initialState = initialWorld.getBlockState(initialPos); + IBlockState finalState = finalWorld.getBlockState(finalPos); - if ((initialStack.getBlock().equals(Blocks.AIR) && finalStack.getBlock().equals(Blocks.AIR)) || initialStack.getBlock() instanceof BlockPortal || finalStack.getBlock() instanceof BlockPortal) + if ((initialState.getBlock().equals(Blocks.AIR) && finalState.getBlock().equals(Blocks.AIR)) || initialState.getBlock() instanceof BlockPortal || finalState.getBlock() instanceof BlockPortal) return false; if (playSound) { @@ -860,9 +860,9 @@ public class Utils { } //Finally, we get to do something! (CLEARING TILES) - if (finalStack.getBlock() != null) + if (finalState.getBlock().hasTileEntity(finalState)) finalWorld.removeTileEntity(finalPos); - if (initialStack.getBlock() != null) + if (initialState.getBlock().hasTileEntity(initialState)) initialWorld.removeTileEntity(initialPos); //TILES CLEARED @@ -889,8 +889,8 @@ public class Utils { newTileFinal.setWorld(initialWorld); } - initialWorld.notifyNeighborsOfStateChange(initialPos, finalStack.getBlock(), true); - finalWorld.notifyNeighborsOfStateChange(finalPos, initialStack.getBlock(), true); + initialWorld.notifyNeighborsOfStateChange(initialPos, finalState.getBlock(), true); + finalWorld.notifyNeighborsOfStateChange(finalPos, initialState.getBlock(), true); return true; } From 3a83b4ca8a07cc12fa2d0bd1476156021ecaacbb Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 4 Mar 2018 19:11:46 -0500 Subject: [PATCH 228/595] Increased the max number of items transferable by the Master Routing Node in its system to 64 per second. --- changelog.txt | 1 + .../tile/routing/TileMasterRoutingNode.java | 257 ++++++++++++------ 2 files changed, 172 insertions(+), 86 deletions(-) diff --git a/changelog.txt b/changelog.txt index 567608ca..775f13c4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -5,6 +5,7 @@ Version 2.2.8 - 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! +- 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. ------------------------------------------------------ Version 2.2.7 diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index 250752bd..776901f4 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -16,7 +16,8 @@ import net.minecraft.world.World; import java.util.*; import java.util.Map.Entry; -public class TileMasterRoutingNode extends TileInventory implements IMasterRoutingNode, ITickable { +public class TileMasterRoutingNode extends TileInventory implements IMasterRoutingNode, ITickable +{ public static final int tickRate = 20; private int currentInput; // A list of connections @@ -25,13 +26,16 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti private List outputNodeList = new LinkedList<>(); private List inputNodeList = new LinkedList<>(); - public TileMasterRoutingNode() { + public TileMasterRoutingNode() + { super(0, "masterRoutingNode"); } @Override - public void update() { - if (!getWorld().isRemote) { + public void update() + { + if (!getWorld().isRemote) + { // currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); currentInput = getWorld().getStrongPower(pos); @@ -46,23 +50,31 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti Map> outputMap = new TreeMap<>(); Map> outputFluidMap = new TreeMap<>(); - for (BlockPos outputPos : outputNodeList) { + for (BlockPos outputPos : outputNodeList) + { TileEntity outputTile = getWorld().getTileEntity(outputPos); - if (this.isConnected(new LinkedList<>(), outputPos)) { - if (outputTile instanceof IOutputItemRoutingNode) { + if (this.isConnected(new LinkedList<>(), outputPos)) + { + if (outputTile instanceof IOutputItemRoutingNode) + { IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) { - if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) { + for (EnumFacing facing : EnumFacing.VALUES) + { + if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) + { continue; } IItemFilter filter = outputNode.getOutputFilterForSide(facing); - if (filter != null) { + if (filter != null) + { int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) { + if (outputMap.containsKey(priority)) + { outputMap.get(priority).add(filter); - } else { + } else + { List filterList = new LinkedList<>(); filterList.add(filter); outputMap.put(priority, filterList); @@ -71,20 +83,26 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - if (outputTile instanceof IOutputFluidRoutingNode) { + if (outputTile instanceof IOutputFluidRoutingNode) + { IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) { - if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) { + for (EnumFacing facing : EnumFacing.VALUES) + { + if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) + { continue; } IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); - if (filter != null) { + if (filter != null) + { int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) { + if (outputMap.containsKey(priority)) + { outputFluidMap.get(priority).add(filter); - } else { + } else + { List filterList = new LinkedList<>(); filterList.add(filter); outputFluidMap.put(priority, filterList); @@ -98,23 +116,31 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti Map> inputMap = new TreeMap<>(); Map> inputFluidMap = new TreeMap<>(); - for (BlockPos inputPos : inputNodeList) { + for (BlockPos inputPos : inputNodeList) + { TileEntity inputTile = getWorld().getTileEntity(inputPos); - if (this.isConnected(new LinkedList<>(), inputPos)) { - if (inputTile instanceof IInputItemRoutingNode) { + if (this.isConnected(new LinkedList<>(), inputPos)) + { + if (inputTile instanceof IInputItemRoutingNode) + { IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) { - if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) { + for (EnumFacing facing : EnumFacing.VALUES) + { + if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) + { continue; } IItemFilter filter = inputNode.getInputFilterForSide(facing); - if (filter != null) { + if (filter != null) + { int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) { + if (inputMap.containsKey(priority)) + { inputMap.get(priority).add(filter); - } else { + } else + { List filterList = new LinkedList<>(); filterList.add(filter); inputMap.put(priority, filterList); @@ -123,20 +149,26 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - if (inputTile instanceof IInputFluidRoutingNode) { + if (inputTile instanceof IInputFluidRoutingNode) + { IInputFluidRoutingNode inputNode = (IInputFluidRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) { - if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) { + for (EnumFacing facing : EnumFacing.VALUES) + { + if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) + { continue; } IFluidFilter filter = inputNode.getInputFluidFilterForSide(facing); - if (filter != null) { + if (filter != null) + { int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) { + if (inputMap.containsKey(priority)) + { inputFluidMap.get(priority).add(filter); - } else { + } else + { List filterList = new LinkedList<>(); filterList.add(filter); inputFluidMap.put(priority, filterList); @@ -150,14 +182,19 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT)); int maxFluidTransfer = 1000; - for (Entry> outputEntry : outputMap.entrySet()) { + for (Entry> outputEntry : outputMap.entrySet()) + { List outputList = outputEntry.getValue(); - for (IItemFilter outputFilter : outputList) { - for (Entry> inputEntry : inputMap.entrySet()) { + for (IItemFilter outputFilter : outputList) + { + for (Entry> inputEntry : inputMap.entrySet()) + { List inputList = inputEntry.getValue(); - for (IItemFilter inputFilter : inputList) { + for (IItemFilter inputFilter : inputList) + { maxTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxTransfer); - if (maxTransfer <= 0) { + if (maxTransfer <= 0) + { return; } } @@ -165,14 +202,19 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - for (Entry> outputEntry : outputFluidMap.entrySet()) { + for (Entry> outputEntry : outputFluidMap.entrySet()) + { List outputList = outputEntry.getValue(); - for (IFluidFilter outputFilter : outputList) { - for (Entry> inputEntry : inputFluidMap.entrySet()) { + for (IFluidFilter outputFilter : outputList) + { + for (Entry> inputEntry : inputFluidMap.entrySet()) + { List inputList = inputEntry.getValue(); - for (IFluidFilter inputFilter : inputList) { + for (IFluidFilter inputFilter : inputList) + { maxFluidTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxFluidTransfer); - if (maxFluidTransfer <= 0) { + if (maxFluidTransfer <= 0) + { return; } } @@ -181,15 +223,18 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - public int getMaxTransferForDemonWill(double will) { - return 8; + public int getMaxTransferForDemonWill(double will) + { + return 64; } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public NBTTagCompound serialize(NBTTagCompound tag) + { super.serialize(tag); NBTTagList tags = new NBTTagList(); - for (BlockPos pos : generalNodeList) { + for (BlockPos pos : generalNodeList) + { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -199,7 +244,8 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti tag.setTag(Constants.NBT.ROUTING_MASTER_GENERAL, tags); tags = new NBTTagList(); - for (BlockPos pos : inputNodeList) { + for (BlockPos pos : inputNodeList) + { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -209,7 +255,8 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti tag.setTag(Constants.NBT.ROUTING_MASTER_INPUT, tags); tags = new NBTTagList(); - for (BlockPos pos : outputNodeList) { + for (BlockPos pos : outputNodeList) + { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -221,25 +268,29 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(NBTTagCompound tag) + { super.deserialize(tag); NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); - for (int i = 0; i < tags.tagCount(); i++) { + for (int i = 0; i < tags.tagCount(); i++) + { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); generalNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_INPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) { + for (int i = 0; i < tags.tagCount(); i++) + { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); inputNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) { + for (int i = 0; i < tags.tagCount(); i++) + { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); outputNodeList.add(newPos); @@ -247,14 +298,16 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public boolean isConnected(List path, BlockPos nodePos) { + 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)) { + if (!(tile instanceof IRoutingNode)) + { // connectionMap.remove(nodePos); return false; } @@ -263,17 +316,22 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti List connectionList = node.getConnected(); // List testPath = path.subList(0, path.size()); path.add(nodePos); - for (BlockPos testPos : connectionList) { - if (path.contains(testPos)) { + for (BlockPos testPos : connectionList) + { + if (path.contains(testPos)) + { continue; } - if (testPos.equals(this.getPos()) && node.isConnectionEnabled(testPos)) { + 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)) { + } else if (NodeHelper.isNodeConnectionEnabled(getWorld(), node, testPos)) + { + if (isConnected(path, testPos)) + { // path.clear(); // path.addAll(testPath); return true; @@ -285,44 +343,56 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public boolean isConnectionEnabled(BlockPos testPos) { + public boolean isConnectionEnabled(BlockPos testPos) + { return currentInput <= 0; } @Override - public void addNodeToList(IRoutingNode node) { + public void addNodeToList(IRoutingNode node) + { BlockPos newPos = node.getBlockPos(); - if (!generalNodeList.contains(newPos)) { + if (!generalNodeList.contains(newPos)) + { generalNodeList.add(newPos); } - if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) { + if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) + { inputNodeList.add(newPos); } - if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) { + if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) + { outputNodeList.add(newPos); } } @Override - public void addConnections(BlockPos pos, List connectionList) { - for (BlockPos testPos : connectionList) { + 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)) { + public void addConnection(BlockPos pos1, BlockPos pos2) + { + if (connectionMap.containsKey(pos1) && !connectionMap.get(pos1).contains(pos2)) + { connectionMap.get(pos1).add(pos2); - } else { + } else + { List list = new LinkedList<>(); list.add(pos2); connectionMap.put(pos1, list); } - if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) { + if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) + { connectionMap.get(pos2).add(pos1); - } else { + } else + { List list = new LinkedList<>(); list.add(pos1); connectionMap.put(pos2, list); @@ -330,69 +400,84 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void removeConnection(BlockPos pos1, BlockPos pos2) { - if (connectionMap.containsKey(pos1)) { + public void removeConnection(BlockPos pos1, BlockPos pos2) + { + if (connectionMap.containsKey(pos1)) + { List posList = connectionMap.get(pos1); posList.remove(pos2); - if (posList.isEmpty()) { + if (posList.isEmpty()) + { connectionMap.remove(pos1); } } - if (connectionMap.containsKey(pos2)) { + if (connectionMap.containsKey(pos2)) + { List posList = connectionMap.get(pos2); posList.remove(pos1); - if (posList.isEmpty()) { + if (posList.isEmpty()) + { connectionMap.remove(pos2); } } } @Override - public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) { + public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) + { return; } @Override - public BlockPos getBlockPos() { + public BlockPos getBlockPos() + { return this.getPos(); } @Override - public List getConnected() { + public List getConnected() + { return new LinkedList<>(); } @Override - public BlockPos getMasterPos() { + public BlockPos getMasterPos() + { return this.getPos(); } @Override - public boolean isMaster(IMasterRoutingNode master) { + public boolean isMaster(IMasterRoutingNode master) + { return false; } @Override - public void addConnection(BlockPos pos1) { + public void addConnection(BlockPos pos1) + { // Empty } @Override - public void removeConnection(BlockPos pos1) { + public void removeConnection(BlockPos pos1) + { generalNodeList.remove(pos1); inputNodeList.remove(pos1); outputNodeList.remove(pos1); } @Override - public void removeAllConnections() { + public void removeAllConnections() + { List list = generalNodeList.subList(0, generalNodeList.size()); Iterator itr = list.iterator(); - while (itr.hasNext()) { + while (itr.hasNext()) + { BlockPos testPos = itr.next(); TileEntity tile = getWorld().getTileEntity(testPos); - if (tile instanceof IRoutingNode) { + if (tile instanceof IRoutingNode) + { ((IRoutingNode) tile).removeConnection(pos); getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(testPos), getWorld().getBlockState(testPos), 3); } From b01162333357192c127b72372d825a61f433aae3 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 5 Mar 2018 00:10:30 -0800 Subject: [PATCH 229/595] Switch ritual component gathering to a Consumer rather than direct list access --- .../bloodmagic/item/ItemRitualDiviner.java | 6 +-- .../WayofTime/bloodmagic/ritual/Ritual.java | 13 ++--- .../bloodmagic/ritual/RitualRegistry.java | 4 +- .../ritual/types/RitualAltarBuilder.java | 4 +- .../ritual/types/RitualAnimalGrowth.java | 19 +++---- .../ritual/types/RitualArmourEvolve.java | 4 +- .../ritual/types/RitualCobblestone.java | 5 +- .../ritual/types/RitualContainment.java | 4 +- .../ritual/types/RitualCrushing.java | 3 +- .../ritual/types/RitualCrystalHarvest.java | 4 +- .../ritual/types/RitualEllipsoid.java | 4 +- .../ritual/types/RitualExpulsion.java | 3 +- .../ritual/types/RitualFeatheredKnife.java | 3 +- .../ritual/types/RitualFelling.java | 4 +- .../ritual/types/RitualForsakenSoul.java | 3 +- .../ritual/types/RitualFullStomach.java | 3 +- .../ritual/types/RitualGreenGrove.java | 3 +- .../ritual/types/RitualHarvest.java | 51 ++++++++++--------- .../ritual/types/RitualInterdiction.java | 4 +- .../ritual/types/RitualJumping.java | 3 +- .../bloodmagic/ritual/types/RitualLava.java | 3 +- .../types/RitualLivingArmourDowngrade.java | 3 +- .../ritual/types/RitualMagnetic.java | 4 +- .../bloodmagic/ritual/types/RitualMeteor.java | 3 +- .../bloodmagic/ritual/types/RitualPlacer.java | 4 +- .../bloodmagic/ritual/types/RitualPortal.java | 4 +- .../bloodmagic/ritual/types/RitualPump.java | 3 +- .../ritual/types/RitualRegeneration.java | 27 +++++----- .../bloodmagic/ritual/types/RitualSpeed.java | 3 +- .../ritual/types/RitualSuppression.java | 4 +- .../ritual/types/RitualUpgradeRemove.java | 3 +- .../bloodmagic/ritual/types/RitualWater.java | 4 +- .../ritual/types/RitualWellOfSuffering.java | 3 +- .../bloodmagic/ritual/types/RitualZephyr.java | 3 +- .../util/handler/event/ClientHandler.java | 4 +- .../bloodmagic/util/helper/RitualHelper.java | 3 +- 36 files changed, 121 insertions(+), 104 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index e6e41c4c..d39fc897 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -119,7 +119,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { if (ritual != null) { EnumFacing direction = getDirection(stack); List components = Lists.newArrayList(); - ritual.gatherComponents(components); + ritual.gatherComponents(components::add); for (RitualComponent component : components) { if (!canPlaceRitualStone(component.getRuneType(), stack)) { return false; @@ -227,7 +227,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { tooltip.add(TextHelper.localize(tooltipBase + "currentDirection", Utils.toFancyCasing(getDirection(stack).getName()))); tooltip.add(""); List components = Lists.newArrayList(); - ritual.gatherComponents(components); + ritual.gatherComponents(components::add); int blankRunes = 0; int airRunes = 0; @@ -491,7 +491,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } List components = Lists.newArrayList(); - ritual.gatherComponents(components); + ritual.gatherComponents(components::add); for (RitualComponent component : components) { if (!canPlaceRitualStone(component.getRuneType(), stack)) { return false; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java index 3ae656fa..472fa682 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java @@ -15,6 +15,7 @@ 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. Rituals need be registered with @@ -261,13 +262,13 @@ public abstract class Ritual { } } - public abstract void gatherComponents(List components); + public abstract void gatherComponents(Consumer components); - protected final void addRune(List components, int offset1, int y, int offset2, EnumRuneType rune) { - components.add(new RitualComponent(new BlockPos(offset1, y, offset2), rune)); + 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(List components, int offset1, int offset2, int y, EnumRuneType 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); @@ -278,14 +279,14 @@ public abstract class Ritual { addRune(components, -offset2, y, -offset1, rune); } - protected final void addCornerRunes(List components, int offset, int y, EnumRuneType 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(List components, int offset, int y, EnumRuneType 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java index af289560..66039e2b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java @@ -115,9 +115,9 @@ public class RitualRegistry { Ritual ritual1 = registry.get(o1); Ritual ritual2 = registry.get(o2); List first = Lists.newArrayList(); - ritual1.gatherComponents(first); + ritual1.gatherComponents(first::add); List second = Lists.newArrayList(); - ritual2.gatherComponents(second); + ritual2.gatherComponents(second::add); return first.size() > second.size() ? -1 : 0; // Put earlier if bigger }); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index 145ac180..37125032 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -27,7 +27,7 @@ import net.minecraftforge.items.IItemHandler; import java.util.ArrayList; import java.util.Iterator; -import java.util.List; +import java.util.function.Consumer; public class RitualAltarBuilder extends Ritual { private Iterator altarComponentsIterator = new ArrayList<>(EnumAltarTier.SIX.getAltarComponents()).iterator(); @@ -114,7 +114,7 @@ public class RitualAltarBuilder extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java index eb271087..f7724e6a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java @@ -19,6 +19,7 @@ import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import java.util.List; +import java.util.function.Consumer; public class RitualAnimalGrowth extends Ritual { public static final double rawWillDrain = 0.05; @@ -168,18 +169,18 @@ public class RitualAnimalGrowth extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addParallelRunes(components, 2, 0, EnumRuneType.DUSK); addParallelRunes(components, 1, 0, EnumRuneType.WATER); - components.add(new RitualComponent(new BlockPos(1, 0, 2), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(1, 0, -2), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(-1, 0, 2), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(-1, 0, -2), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(2, 0, 1), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(2, 0, -1), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(-2, 0, 1), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(-2, 0, -1), EnumRuneType.AIR)); + 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java index 9c602679..90447806 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java @@ -12,6 +12,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.List; +import java.util.function.Consumer; public class RitualArmourEvolve extends Ritual { public static final String CHECK_RANGE = "fillRange"; @@ -64,8 +65,7 @@ public class RitualArmourEvolve extends Ritual { } @Override - public void gatherComponents(List components) { - + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.DUSK); addCornerRunes(components, 2, 0, EnumRuneType.FIRE); addOffsetRunes(components, 1, 2, 0, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java index abae34aa..cf481fa9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java @@ -10,7 +10,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.List; +import java.util.function.Consumer; public class RitualCobblestone extends Ritual { @@ -83,8 +83,7 @@ public class RitualCobblestone extends Ritual { } @Override - public void gatherComponents(List components) { - + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 1, EnumRuneType.FIRE); addParallelRunes(components, 1, 0, EnumRuneType.WATER); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java index b7c58ff3..4ad43168 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java @@ -7,7 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.List; +import java.util.function.Consumer; public class RitualContainment extends Ritual { public static final String CONTAINMENT_RANGE = "containmentRange"; @@ -56,7 +56,7 @@ public class RitualContainment extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addParallelRunes(components, 1, 0, EnumRuneType.EARTH); addCornerRunes(components, 2, 0, EnumRuneType.EARTH); addParallelRunes(components, 1, 5, EnumRuneType.EARTH); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 06d3bc1b..caefd268 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -26,6 +26,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Consumer; public class RitualCrushing extends Ritual { public static final String CRUSHING_RANGE = "crushingRange"; @@ -251,7 +252,7 @@ public class RitualCrushing extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addParallelRunes(components, 1, 0, EnumRuneType.EARTH); addParallelRunes(components, 2, 0, EnumRuneType.FIRE); addCornerRunes(components, 2, 0, EnumRuneType.DUSK); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java index 8eb060a1..62d86acc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java @@ -8,7 +8,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.List; +import java.util.function.Consumer; public class RitualCrystalHarvest extends Ritual { public static final String CRYSTAL_RANGE = "crystal"; @@ -67,7 +67,7 @@ public class RitualCrystalHarvest extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.AIR); addParallelRunes(components, 1, 1, EnumRuneType.DUSK); addParallelRunes(components, 1, -1, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java index 631b35b7..1def76f5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual.types; -import java.util.List; +import java.util.function.Consumer; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -215,7 +215,7 @@ public class RitualEllipsoid extends Ritual // } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.WATER); addCornerRunes(components, 1, 1, EnumRuneType.WATER); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java index 1be8f406..10209075 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java @@ -23,6 +23,7 @@ import net.minecraftforge.items.IItemHandler; import java.util.List; import java.util.Random; import java.util.UUID; +import java.util.function.Consumer; public class RitualExpulsion extends Ritual { public static final String EXPULSION_RANGE = "expulsionRange"; @@ -189,7 +190,7 @@ public class RitualExpulsion extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java index 476ab93c..dd347421 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java @@ -24,6 +24,7 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import java.util.List; +import java.util.function.Consumer; public class RitualFeatheredKnife extends Ritual { public static final String ALTAR_RANGE = "altar"; @@ -184,7 +185,7 @@ public class RitualFeatheredKnife extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addParallelRunes(components, 1, 0, EnumRuneType.DUSK); addParallelRunes(components, 2, -1, EnumRuneType.WATER); addCornerRunes(components, 1, -1, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java index 31813dea..c4b33b27 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java @@ -16,7 +16,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Iterator; -import java.util.List; +import java.util.function.Consumer; public class RitualFelling extends Ritual { public static final String FELLING_RANGE = "fellingRange"; @@ -86,7 +86,7 @@ public class RitualFelling extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.EARTH); addCornerRunes(components, 1, 1, EnumRuneType.EARTH); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java index 8767e150..ee49bbcd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java @@ -18,6 +18,7 @@ import net.minecraftforge.fml.common.registry.EntityRegistry; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; public class RitualForsakenSoul extends Ritual { public static final String CRYSTAL_RANGE = "crystal"; @@ -178,7 +179,7 @@ public class RitualForsakenSoul extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.AIR); addParallelRunes(components, 1, -1, EnumRuneType.DUSK); addParallelRunes(components, 1, 1, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java index 35fa103d..f0a739ea 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java @@ -13,6 +13,7 @@ import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import java.util.List; +import java.util.function.Consumer; public class RitualFullStomach extends Ritual { public static final String FILL_RANGE = "fillRange"; @@ -92,7 +93,7 @@ public class RitualFullStomach extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addParallelRunes(components, 3, 0, EnumRuneType.FIRE); addCornerRunes(components, 1, 0, EnumRuneType.AIR); addOffsetRunes(components, 1, 2, 0, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java index 79f3b0f2..f2aa95ad 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java @@ -24,6 +24,7 @@ import net.minecraft.world.World; import java.util.List; import java.util.Random; +import java.util.function.Consumer; public class RitualGreenGrove extends Ritual { public static final String GROW_RANGE = "growing"; @@ -258,7 +259,7 @@ public class RitualGreenGrove extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.EARTH); addParallelRunes(components, 1, 0, EnumRuneType.WATER); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java index c554cc83..faa582ad 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java @@ -17,6 +17,7 @@ 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. @@ -74,31 +75,31 @@ public class RitualHarvest extends Ritual { } @Override - public void gatherComponents(List components) { - components.add(new RitualComponent(new BlockPos(1, 0, 1), EnumRuneType.DUSK)); - components.add(new RitualComponent(new BlockPos(1, 0, -1), EnumRuneType.DUSK)); - components.add(new RitualComponent(new BlockPos(-1, 0, -1), EnumRuneType.DUSK)); - components.add(new RitualComponent(new BlockPos(-1, 0, 1), EnumRuneType.DUSK)); - components.add(new RitualComponent(new BlockPos(2, 0, 0), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(-2, 0, 0), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(0, 0, 2), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(0, 0, -2), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(3, 0, 1), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(3, 0, -1), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(-3, 0, 1), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(-3, 0, -1), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(1, 0, 3), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(-1, 0, 3), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(1, 0, -3), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(-1, 0, -3), EnumRuneType.EARTH)); - components.add(new RitualComponent(new BlockPos(2, 0, 3), EnumRuneType.WATER)); - components.add(new RitualComponent(new BlockPos(3, 0, 2), EnumRuneType.WATER)); - components.add(new RitualComponent(new BlockPos(2, 0, -3), EnumRuneType.WATER)); - components.add(new RitualComponent(new BlockPos(-3, 0, 2), EnumRuneType.WATER)); - components.add(new RitualComponent(new BlockPos(-2, 0, 3), EnumRuneType.WATER)); - components.add(new RitualComponent(new BlockPos(3, 0, -2), EnumRuneType.WATER)); - components.add(new RitualComponent(new BlockPos(-2, 0, -3), EnumRuneType.WATER)); - components.add(new RitualComponent(new BlockPos(-3, 0, -2), EnumRuneType.WATER)); + public void gatherComponents(Consumer components) { + components.accept(new RitualComponent(new BlockPos(1, 0, 1), EnumRuneType.DUSK)); + components.accept(new RitualComponent(new BlockPos(1, 0, -1), EnumRuneType.DUSK)); + components.accept(new RitualComponent(new BlockPos(-1, 0, -1), EnumRuneType.DUSK)); + components.accept(new RitualComponent(new BlockPos(-1, 0, 1), EnumRuneType.DUSK)); + components.accept(new RitualComponent(new BlockPos(2, 0, 0), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(-2, 0, 0), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(0, 0, 2), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(0, 0, -2), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(3, 0, 1), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(3, 0, -1), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(-3, 0, 1), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(-3, 0, -1), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(1, 0, 3), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(-1, 0, 3), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(1, 0, -3), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(-1, 0, -3), EnumRuneType.EARTH)); + components.accept(new RitualComponent(new BlockPos(2, 0, 3), EnumRuneType.WATER)); + components.accept(new RitualComponent(new BlockPos(3, 0, 2), EnumRuneType.WATER)); + components.accept(new RitualComponent(new BlockPos(2, 0, -3), EnumRuneType.WATER)); + components.accept(new RitualComponent(new BlockPos(-3, 0, 2), EnumRuneType.WATER)); + components.accept(new RitualComponent(new BlockPos(-2, 0, 3), EnumRuneType.WATER)); + components.accept(new RitualComponent(new BlockPos(3, 0, -2), EnumRuneType.WATER)); + components.accept(new RitualComponent(new BlockPos(-2, 0, -3), EnumRuneType.WATER)); + components.accept(new RitualComponent(new BlockPos(-3, 0, -2), EnumRuneType.WATER)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java index 44d48d1d..a9eb84b3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java @@ -7,7 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.List; +import java.util.function.Consumer; public class RitualInterdiction extends Ritual { public static final String INTERDICTION_RANGE = "interdictionRange"; @@ -60,7 +60,7 @@ public class RitualInterdiction extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.AIR); addParallelRunes(components, 1, 0, EnumRuneType.AIR); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java index f594e44b..e34a008d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java @@ -9,6 +9,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.List; +import java.util.function.Consumer; public class RitualJumping extends Ritual { public static final String JUMP_RANGE = "jumpRange"; @@ -68,7 +69,7 @@ public class RitualJumping extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { for (int i = -1; i <= 1; i++) addCornerRunes(components, 1, i, EnumRuneType.AIR); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index 89e9b8ec..56e32be6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -26,6 +26,7 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import java.util.List; +import java.util.function.Consumer; public class RitualLava extends Ritual { public static final String LAVA_RANGE = "lavaRange"; @@ -232,7 +233,7 @@ public class RitualLava extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addParallelRunes(components, 1, 0, EnumRuneType.FIRE); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java index c22915bc..d0f9e4b5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java @@ -25,6 +25,7 @@ import net.minecraftforge.items.IItemHandler; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; public class RitualLivingArmourDowngrade extends Ritual { public static final String DOWNGRADE_RANGE = "containmentRange"; @@ -162,7 +163,7 @@ public class RitualLivingArmourDowngrade extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index 2950cc63..ba7fe38b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -11,7 +11,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -import java.util.List; +import java.util.function.Consumer; public class RitualMagnetic extends Ritual { public static final String PLACEMENT_RANGE = "placementRange"; @@ -121,7 +121,7 @@ public class RitualMagnetic extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.EARTH); addParallelRunes(components, 2, 1, EnumRuneType.EARTH); addCornerRunes(components, 2, 1, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java index 95edf4ed..e8b9c652 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java @@ -13,6 +13,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.List; +import java.util.function.Consumer; public class RitualMeteor extends Ritual { public static final String ITEM_RANGE = "itemRange"; @@ -94,7 +95,7 @@ public class RitualMeteor extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java index be35f269..d18f1cb5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java @@ -13,7 +13,7 @@ import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import java.util.List; +import java.util.function.Consumer; public class RitualPlacer extends Ritual { public static final String PLACER_RANGE = "placerRange"; @@ -80,7 +80,7 @@ public class RitualPlacer extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java index da2c5a7d..fd3b83f4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java @@ -17,8 +17,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.ForgeRegistries; -import java.util.List; import java.util.UUID; +import java.util.function.Consumer; public class RitualPortal extends Ritual { @@ -183,7 +183,7 @@ public class RitualPortal extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java index b61c1312..50667a6a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java @@ -20,6 +20,7 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.Iterator; import java.util.List; +import java.util.function.Consumer; public class RitualPump extends Ritual { public static final String PUMP_RANGE = "pumpRange"; @@ -90,7 +91,7 @@ public class RitualPump extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java index c547d6b8..78e145ba 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java @@ -16,6 +16,7 @@ import net.minecraft.world.World; import java.util.Collections; import java.util.List; +import java.util.function.Consumer; public class RitualRegeneration extends Ritual { public static final String HEAL_RANGE = "heal"; @@ -152,19 +153,19 @@ public class RitualRegeneration extends Ritual { } @Override - public void gatherComponents(List components) { - components.add(new RitualComponent(new BlockPos(4, 0, 0), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(5, 0, -1), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(5, 0, 1), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(-4, 0, 0), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(-5, 0, -1), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(-5, 0, 1), EnumRuneType.AIR)); - components.add(new RitualComponent(new BlockPos(0, 0, 4), EnumRuneType.FIRE)); - components.add(new RitualComponent(new BlockPos(1, 0, 5), EnumRuneType.FIRE)); - components.add(new RitualComponent(new BlockPos(-1, 0, 5), EnumRuneType.FIRE)); - components.add(new RitualComponent(new BlockPos(0, 0, -4), EnumRuneType.FIRE)); - components.add(new RitualComponent(new BlockPos(1, 0, -5), EnumRuneType.FIRE)); - components.add(new RitualComponent(new BlockPos(-1, 0, -5), EnumRuneType.FIRE)); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java index 3bf3ab59..cc9390f9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java @@ -14,6 +14,7 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import java.util.List; +import java.util.function.Consumer; public class RitualSpeed extends Ritual { public static final String SPEED_RANGE = "sanicRange"; @@ -152,7 +153,7 @@ public class RitualSpeed extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java index 964744e8..8866eee8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java @@ -9,7 +9,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.List; +import java.util.function.Consumer; public class RitualSuppression extends Ritual { public static final String SUPPRESSION_RANGE = "suppressionRange"; @@ -56,7 +56,7 @@ public class RitualSuppression extends Ritual { } @Override - public void gatherComponents(List components) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java index c504e747..65120c45 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java @@ -19,6 +19,7 @@ import net.minecraft.world.World; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; +import java.util.function.Consumer; public class RitualUpgradeRemove extends Ritual { public static final String CHECK_RANGE = "fillRange"; @@ -102,7 +103,7 @@ public class RitualUpgradeRemove extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.DUSK); addCornerRunes(components, 2, 0, EnumRuneType.FIRE); addOffsetRunes(components, 1, 2, 0, EnumRuneType.FIRE); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java index 74867148..569998a1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java @@ -6,7 +6,7 @@ import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.List; +import java.util.function.Consumer; public class RitualWater extends Ritual { public static final String WATER_RANGE = "waterRange"; @@ -57,7 +57,7 @@ public class RitualWater extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.WATER); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index 51cf4e4c..8d07813f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -15,6 +15,7 @@ import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; import java.util.List; +import java.util.function.Consumer; public class RitualWellOfSuffering extends Ritual { public static final String ALTAR_RANGE = "altar"; @@ -117,7 +118,7 @@ public class RitualWellOfSuffering extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.FIRE); addCornerRunes(components, 2, -1, EnumRuneType.FIRE); addParallelRunes(components, 2, -1, EnumRuneType.EARTH); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java index d4a15920..d21d4e8c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java @@ -11,6 +11,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.List; +import java.util.function.Consumer; public class RitualZephyr extends Ritual { public static final String ZEPHYR_RANGE = "zephyrRange"; @@ -80,7 +81,7 @@ public class RitualZephyr extends Ritual { } @Override - public void gatherComponents(List components) { + public void gatherComponents(Consumer components) { addParallelRunes(components, 2, 0, EnumRuneType.AIR); addCornerRunes(components, 1, 1, EnumRuneType.AIR); addParallelRunes(components, 1, -1, EnumRuneType.AIR); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index a63f727e..472ed94f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -271,7 +271,7 @@ public class ClientHandler { double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; List components = Lists.newArrayList(); - ritual.gatherComponents(components); + ritual.gatherComponents(components::add); for (RitualComponent ritualComponent : components) { vX = vec3.add(ritualComponent.getOffset(direction)); double minX = vX.getX() - posX; @@ -350,7 +350,7 @@ public class ClientHandler { double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; List components = Lists.newArrayList(); - ritual.gatherComponents(components); + ritual.gatherComponents(components::add); for (RitualComponent ritualComponent : components) { vX = vec3.add(ritualComponent.getOffset(direction)); double minX = vX.getX() - posX; diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java index 5a73de68..fa6e3963 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java @@ -15,7 +15,6 @@ import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityInject; -import java.util.ArrayList; import java.util.List; public class RitualHelper { @@ -79,7 +78,7 @@ public class RitualHelper { } List components = Lists.newArrayList(); - ritual.gatherComponents(components); + ritual.gatherComponents(components::add); for (RitualComponent component : components) { BlockPos newPos = pos.add(component.getOffset(direction)); From c079da79692256dcebf62724c71912df251b6457 Mon Sep 17 00:00:00 2001 From: qianzha Date: Thu, 8 Mar 2018 08:12:52 +0800 Subject: [PATCH 230/595] Update zh_CN.lang (#1240) * Update zh_CN.lang * Update zh_CN.lang * Update zh_TW.lang --- .../assets/bloodmagic/lang/zh_CN.lang | 144 +++++++++--------- .../assets/bloodmagicguide/lang/zh_CN.lang | 4 +- .../assets/bloodmagicguide/lang/zh_TW.lang | 2 +- 3 files changed, 75 insertions(+), 75 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang index f824d9ce..5c76206c 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang @@ -3,12 +3,12 @@ itemGroup.bloodmagic.creativeTab=血魔法 itemGroup.bloodmagic.creativeTabTome=血魔法|手册 #Items -item.bloodmagic.activationCrystal.weak.name=[虚弱]激活水晶 -item.bloodmagic.activationCrystal.awakened.name=[觉醒]激活水晶 -item.bloodmagic.activationCrystal.creative.name=[创造]激活水晶 +item.bloodmagic.activation_crystal.weak.name=[虚弱]激活水晶 +item.bloodmagic.activation_crystal.awakened.name=[觉醒]激活水晶 +item.bloodmagic.activation_crystal.creative.name=[创造]激活水晶 -item.bloodmagic.sacrificialDagger.normal.name=牺牲匕首 -item.bloodmagic.sacrificialDagger.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=献祭刀 @@ -63,79 +63,76 @@ 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.blood_shard.weak.name=[虚弱]气血碎片 +item.bloodmagic.blood_shard.demonic.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.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.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.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.neurotoxin.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.cuttingFluid.basicCuttingFluid.name=基础切削油 -item.bloodmagic.cuttingFluid.explosive.name=爆炸ç«è¯ +item.bloodmagic.cutting_fluid.basic.name=基础切削油 +item.bloodmagic.cutting_fluid.explosive.name=爆炸ç«è¯ -item.bloodmagic.baseComponent.mundaneLength.name=简å•的延时催化剂 -item.bloodmagic.baseComponent.mundanePower.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.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.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.bloodLight.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.greenGrove.name=绿丛å°è®° -item.bloodmagic.sigil.elementalAffinity.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.fastMiner.name=速掘å°è®° +item.bloodmagic.sigil.fast_miner.name=速掘å°è®° item.bloodmagic.sigil.seer.name=è§è§£å°è®° -item.bloodmagic.sigil.phantomBridge.name=影桥å°è®° +item.bloodmagic.sigil.phantom_bridge.name=影桥å°è®° item.bloodmagic.sigil.whirlwind.name=旋风å°è®° -item.bloodmagic.sigil.enderSeverance.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=ä¼ é€å°è®° @@ -188,7 +185,7 @@ item.bloodmagic.fluidFilter.exact.name=精确液体筛选器 item.bloodmagic.experienceTome.name=ç»éªŒæ‰‹å†Œ item.bloodmagic.sanguineBook.name=指示之书 -item.bloodmagic.livingPointUpgrade.draftAngelus.name=祷告之始 +item.bloodmagic.living_point_upgrade.draft_angelus.name=祷告之始 item.bloodmagic.willGauge.name=çµåŸŸæµ‹é‡ä»ª item.bloodmagic.potionFlask.name=è¯å‰‚ç“¶ @@ -207,10 +204,10 @@ 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.self_sacrifice.name=牺牲符文 tile.bloodmagic.rune.displacement.name=转ä½ç¬¦æ–‡ tile.bloodmagic.rune.capacity.name=增容符文 -tile.bloodmagic.rune.augcapacity.name=超容符文 +tile.bloodmagic.rune.augmented_capacity.name=超容符文 tile.bloodmagic.rune.orb.name=å®ç ç¬¦æ–‡ tile.bloodmagic.rune.acceleration.name=促进符文 tile.bloodmagic.rune.charging.name=充能符文 @@ -224,10 +221,10 @@ 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.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=å½±æ¡¥æ–¹å— @@ -389,7 +386,7 @@ tooltip.bloodmagic.activated=激活 tooltip.bloodmagic.deactivated=åœç”¨ tooltip.bloodmagic.sigil.air.desc=&o我感到轻æ¾å¤šäº†... -tooltip.bloodmagic.sigil.bloodLight.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 çš„çµé­‚ @@ -402,11 +399,11 @@ 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.greenGrove.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.fastMiner.desc=&o继续挖, 继续挖... +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 @@ -418,9 +415,9 @@ 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.phantom_bridge.desc=&o御气于é’空之上... tooltip.bloodmagic.sigil.whirlwind.desc=&o最好ä¸è¦ç©¿è£™å­ -tooltip.bloodmagic.sigil.enderSeverance.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修改 @@ -443,9 +440,9 @@ tooltip.bloodmagic.pack.selfSacrifice.desc=相当ä¸èˆ’适的背包... tooltip.bloodmagic.pack.sacrifice.desc=æè¿° tooltip.bloodmagic.pack.stored=储存:%d LP -tooltip.bloodmagic.activationCrystal.weak=æ¿€æ´»ä½Žç­‰ä»ªå¼ -tooltip.bloodmagic.activationCrystal.awakened=æ¿€æ´»æ›´å¼ºå¤§çš„ä»ªå¼ -tooltip.bloodmagic.activationCrystal.creative=åˆ›é€ æ¨¡å¼ - æ¿€æ´»ä»»ä½•ä»ªå¼ +tooltip.bloodmagic.activation_crystal.weak=æ¿€æ´»ä½Žç­‰ä»ªå¼ +tooltip.bloodmagic.activation_crystal.awakened=æ¿€æ´»æ›´å¼ºå¤§çš„ä»ªå¼ +tooltip.bloodmagic.activation_crystal.creative=åˆ›é€ æ¨¡å¼ - æ¿€æ´»ä»»ä½•ä»ªå¼ tooltip.bloodmagic.diviner.currentRitual=当å‰ä»ªå¼: tooltip.bloodmagic.diviner.blankRune=空白仪å¼çŸ³ï¼š%d @@ -472,6 +469,7 @@ 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=用于在世界中转移区域 diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang index 7732676e..e6c42342 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang @@ -145,7 +145,7 @@ guide.bloodmagic.entry.architect.weakorb.info.1=æ²¡äº†é­”æ³•æ¥æºçš„魔法师 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.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。 @@ -243,6 +243,7 @@ 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=法阵:燃炉 @@ -256,3 +257,4 @@ 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点生命值(åŠé¢—心)æ‰èƒ½ç»´æŒç†”炉中两个物å“的冶炼。这对åšç‚¹ä¸œè¥¿åž«åž«è‚šå­æˆ–者冶炼一堆矿石很有帮助,但ä¸å¹¸çš„æ˜¯ä½ è¿˜æ²¡æœ‰åŠžæ³•åœ¨æ³•é˜µä¸Šè®¾ç½®ä»€ä¹ˆä¿æŠ¤æŽªæ–½â€¦â€¦ diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang index c4aaf9d8..fd3a40d4 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang @@ -145,7 +145,7 @@ guide.bloodmagic.entry.architect.weakorb.info.1=沒了魔法來æºçš„魔法師 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.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。 From c4527d157f5a9c663fb13be41a2128f857a53a7d Mon Sep 17 00:00:00 2001 From: WayofTime Date: Wed, 7 Mar 2018 19:58:59 -0500 Subject: [PATCH 231/595] Worked on the Laputa array. Yes, I went there. --- .../AlchemyArrayEffectLaputa.java | 155 ++++++++++++++++++ .../bloodmagic/registry/ModRecipes.java | 1 + .../models/alchemyarrays/shardoflaputa.png | Bin 0 -> 54532 bytes 3 files changed, 156 insertions(+) create mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/shardoflaputa.png diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java new file mode 100644 index 00000000..cdb1e14e --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java @@ -0,0 +1,155 @@ +package WayofTime.bloodmagic.alchemyArray; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +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); + + TeleposeEvent event = new TeleposeEvent(world, newPos, world, offsetPos); + if (Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos) && !MinecraftForge.EVENT_BUS.post(event)) + { + 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(4) + 4; + } + + public int getRandomHeightOffset(Random rand) + { + return radius * 2 + 1 + rand.nextInt(5); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + tag.setInteger("radius", radius); + tag.setInteger("teleportHeightOffset", teleportHeightOffset); + tag.setInteger(Constants.NBT.X_COORD, currentPos.getX()); + tag.setInteger(Constants.NBT.Y_COORD, currentPos.getY()); + tag.setInteger(Constants.NBT.Z_COORD, currentPos.getZ()); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + radius = tag.getInteger("radius"); + teleportHeightOffset = tag.getInteger("teleportHeightOffset"); + currentPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD)); + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectLaputa(key); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 0fb77ac2..9e1f2b9b 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -96,6 +96,7 @@ public class ModRecipes 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.APPLE), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectLaputa("laputa"), new AttractorAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/shardoflaputa.png"))); 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"))); diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/shardoflaputa.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/shardoflaputa.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae4fd521f353891bba0932a48f39f85c6704c09 GIT binary patch literal 54532 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 Date: Wed, 7 Mar 2018 19:43:00 -0800 Subject: [PATCH 232/595] Cleanup model registration --- .../bloodmagic/block/BlockAltar.java | 16 ++------ .../bloodmagic/block/BlockBloodTank.java | 10 ++--- .../bloodmagic/block/BlockDemonCrucible.java | 13 +------ .../block/BlockDemonCrystallizer.java | 12 ++---- .../block/BlockDemonPillarBase.java | 14 ++----- .../block/BlockDemonPillarCapBase.java | 15 ++----- .../bloodmagic/block/BlockDemonPylon.java | 12 ------ .../block/BlockDemonStairsBase.java | 13 ++----- .../bloodmagic/block/BlockDemonWallBase.java | 13 ++----- .../bloodmagic/block/BlockIncenseAltar.java | 11 ------ .../block/BlockInversionPillar.java | 11 ++---- .../block/BlockInversionPillarEnd.java | 12 ++---- .../bloodmagic/block/BlockPhantom.java | 11 ------ .../bloodmagic/block/BlockRoutingNode.java | 9 ++--- .../bloodmagic/block/BlockSoulForge.java | 13 +------ .../bloodmagic/block/BlockSpectral.java | 13 +------ .../bloodmagic/block/BlockTeleposer.java | 14 +------ .../bloodmagic/block/base/BlockEnum.java | 14 +++---- .../bloodmagic/client/IMeshProvider.java | 8 ++-- .../bloodmagic/client/IVariantProvider.java | 10 +++-- .../core/RegistrarBloodMagicItems.java | 25 ++++++++---- .../bloodmagic/item/ItemAltarMaker.java | 15 +++---- .../bloodmagic/item/ItemArcaneAshes.java | 10 ++--- .../bloodmagic/item/ItemBoundAxe.java | 22 +++-------- .../bloodmagic/item/ItemBoundPickaxe.java | 22 +++-------- .../bloodmagic/item/ItemBoundShovel.java | 22 +++-------- .../bloodmagic/item/ItemBoundSword.java | 26 ++++--------- .../item/ItemDaggerOfSacrifice.java | 13 +++---- .../bloodmagic/item/ItemDemonWillGauge.java | 13 +++---- .../WayofTime/bloodmagic/item/ItemEnum.java | 12 ++---- .../bloodmagic/item/ItemExperienceBook.java | 13 +++---- .../bloodmagic/item/ItemLavaCrystal.java | 13 +++---- .../bloodmagic/item/ItemPotionFlask.java | 16 +++----- .../bloodmagic/item/ItemRitualDiviner.java | 25 ++++++------ .../bloodmagic/item/ItemRitualReader.java | 16 ++++---- .../item/ItemSacrificialDagger.java | 24 ++++++------ .../bloodmagic/item/ItemSanguineBook.java | 14 +++---- .../bloodmagic/item/ItemUpgradeTome.java | 17 ++++---- .../bloodmagic/item/ItemUpgradeTrainer.java | 12 +++--- .../item/armour/ItemLivingArmour.java | 30 +++++++------- .../item/armour/ItemSentientArmour.java | 24 ++++++------ .../item/block/ItemBlockAlchemyTable.java | 9 ++--- .../item/gear/ItemPackSacrifice.java | 15 +++---- .../item/gear/ItemPackSelfSacrifice.java | 15 +++---- .../item/routing/ItemFluidRouterFilter.java | 10 ++--- .../item/routing/ItemNodeRouter.java | 17 ++++---- .../item/routing/ItemRouterFilter.java | 16 ++++---- .../bloodmagic/item/sigil/ItemSigilBase.java | 12 +++--- .../item/sigil/ItemSigilHolding.java | 15 ++++--- .../item/sigil/ItemSigilToggleableBase.java | 23 +++-------- .../item/soul/ItemSentientArmourGem.java | 24 +++++------- .../bloodmagic/item/soul/ItemSentientAxe.java | 29 +++++--------- .../bloodmagic/item/soul/ItemSentientBow.java | 21 +++++----- .../item/soul/ItemSentientPickaxe.java | 29 +++++--------- .../item/soul/ItemSentientShovel.java | 29 +++++--------- .../item/soul/ItemSentientSword.java | 29 +++++--------- .../bloodmagic/item/soul/ItemSoulGem.java | 35 +++++++---------- .../bloodmagic/item/soul/ItemSoulSnare.java | 11 ++---- .../bloodmagic/proxy/ClientProxy.java | 39 ++----------------- .../bloodmagic/proxy/CommonProxy.java | 10 ----- 60 files changed, 338 insertions(+), 678 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 679ae793..a99dadea 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -5,17 +5,17 @@ import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.altar.EnumAltarComponent; 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.core.data.SoulNetwork; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IVariantProvider; 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.material.Material; import net.minecraft.block.state.IBlockState; @@ -31,7 +31,6 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; @@ -160,15 +159,6 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl return new TileAltar(); } - // IVariantProvider - - @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; - } - // IDocumentedBlock @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 6637e06d..b9dfe15d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -6,6 +6,7 @@ import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.block.ItemBlockBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank; import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -28,8 +29,8 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; @@ -195,11 +196,8 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB // IVariantProvider @Override - public List> getVariants() { - List> ret = Lists.newArrayList(); + public void gatherVariants(@Nonnull Int2ObjectMap variants) { for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) - ret.add(Pair.of(i, "inventory")); - - return ret; + variants.put(i, "inventory"); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 1bcbbc80..5627ce9d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -1,9 +1,9 @@ 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.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileDemonCrucible; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; @@ -19,12 +19,8 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBlock { public BlockDemonCrucible() { @@ -99,13 +95,6 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl return new TileDemonCrucible(); } - @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; - } - @Override public ItemBlock getItem() { return new ItemBlock(this); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java index 8ed12395..26ecfb88 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java @@ -3,6 +3,7 @@ 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.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -13,11 +14,8 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; -import java.util.List; +import javax.annotation.Nonnull; public class BlockDemonCrystallizer extends BlockContainer implements IVariantProvider, IBMBlock { public BlockDemonCrystallizer() { @@ -68,10 +66,8 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "normal"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java index 44c7f95f..5db379bb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java @@ -2,14 +2,13 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnumPillar; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; -import org.apache.commons.lang3.tuple.Pair; -import java.util.List; +import javax.annotation.Nonnull; public class BlockDemonPillarBase & IStringSerializable> extends BlockEnumPillar { public BlockDemonPillarBase(String baseName, Material materialIn, Class enumClass) { @@ -24,16 +23,11 @@ public class BlockDemonPillarBase & IStringSerializable> exten } @Override - public List> getVariants() { - List> ret = Lists.newArrayList(); - - //This is done to make the ItemBlocks have the proper model + public void gatherVariants(@Nonnull Int2ObjectMap variants) { EnumFacing.Axis[] axis = new EnumFacing.Axis[]{EnumFacing.Axis.Y, EnumFacing.Axis.X, EnumFacing.Axis.Z}; for (int i = 0; i < 3; i++) for (int j = 0; j < this.getTypes().length; j++) - ret.add(Pair.of(i * 5 + j, "axis=" + axis[i] + ",type=" + this.getTypes()[j])); - - return ret; + 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 index 51ef6dbb..b31b09b1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java @@ -2,14 +2,13 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnumPillarCap; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; -import org.apache.commons.lang3.tuple.Pair; -import java.util.List; +import javax.annotation.Nonnull; public class BlockDemonPillarCapBase & IStringSerializable> extends BlockEnumPillarCap { public BlockDemonPillarCapBase(String baseName, Material materialIn, Class enumClass) { @@ -24,15 +23,9 @@ public class BlockDemonPillarCapBase & IStringSerializable> ex } @Override - public List> getVariants() { - List> ret = Lists.newArrayList(); - - //This is done to make the ItemBlocks have the proper model - + public void gatherVariants(@Nonnull Int2ObjectMap variants) { for (int i = 0; i < EnumFacing.values().length; i++) for (int j = 0; j < this.getTypes().length; j++) - ret.add(Pair.of(i * 2 + j, "facing=" + EnumFacing.values()[i] + ",type=" + this.getTypes()[j])); - - return ret; + variants.put(i * 2 + j, "facing=" + EnumFacing.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 index a761816b..e24869fd 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -11,11 +11,6 @@ import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; public class BlockDemonPylon extends BlockContainer implements IVariantProvider { public BlockDemonPylon() { @@ -59,11 +54,4 @@ public class BlockDemonPylon extends BlockContainer implements IVariantProvider public TileEntity createNewTileEntity(World world, int meta) { return new TileDemonPylon(); } - - @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; - } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java index 30166d16..05bd1d75 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java @@ -2,13 +2,10 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnumStairs; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.IStringSerializable; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; public class BlockDemonStairsBase & IStringSerializable> extends BlockEnumStairs { public BlockDemonStairsBase(String baseName, Material materialIn, Class enumClass) { @@ -23,12 +20,8 @@ public class BlockDemonStairsBase & IStringSerializable> exten } @Override - public List> getVariants() { - List> ret = Lists.newArrayList(); - + public void gatherVariants(Int2ObjectMap variants) { for (int i = 0; i < this.getTypes().length; i++) - ret.add(Pair.of(i, "facing=south,half=bottom,shape=straight,type=" + this.getTypes()[i])); - - return ret; + 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 index 2ad6bfe1..ba6699fa 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java @@ -2,13 +2,10 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.block.base.BlockEnumWall; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.IStringSerializable; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; public class BlockDemonWallBase & IStringSerializable> extends BlockEnumWall { public BlockDemonWallBase(String baseName, Material materialIn, Class enumClass) { @@ -23,12 +20,8 @@ public class BlockDemonWallBase & IStringSerializable> extends } @Override - public List> getVariants() { - List> ret = Lists.newArrayList(); - + public void gatherVariants(Int2ObjectMap variants) { for (int i = 0; i < this.getTypes().length; i++) - ret.add(Pair.of(i, "east=true,north=false,south=false,type=" + this.getTypes()[i] + ",up=true,west=true")); - - return ret; + 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/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java index 87048b65..e77d0982 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -13,12 +13,8 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlock { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); @@ -83,13 +79,6 @@ public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlo return new TileIncenseAltar(); } - @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; - } - @Override public ItemBlock getItem() { return new ItemBlock(this); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java index e5b3b04d..f9c17e29 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java @@ -4,6 +4,7 @@ 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; @@ -14,10 +15,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.property.Properties; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; public class BlockInversionPillar extends BlockEnum { public BlockInversionPillar() { @@ -73,11 +70,9 @@ public class BlockInversionPillar extends BlockEnum { } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); + public void gatherVariants(Int2ObjectMap variants) { for (int i = 0; i < this.getTypes().length; i++) - ret.add(Pair.of(i, "static=false,type=" + this.getTypes()[i])); - return ret; + variants.put(i, "static=false,type=" + this.getTypes()[i]); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java index 7fb5b5d5..54193ee9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java @@ -4,17 +4,13 @@ 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.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; public class BlockInversionPillarEnd extends BlockEnum implements IVariantProvider { public BlockInversionPillarEnd() { @@ -54,10 +50,8 @@ public class BlockInversionPillarEnd extends BlockEnum impleme } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); + public void gatherVariants(Int2ObjectMap variants) { for (int i = 0; i < this.getTypes().length; i++) - ret.add(new ImmutablePair<>(i, "type=" + this.getTypes()[i])); - return ret; + variants.put(i, "type=" + this.getTypes()[i]); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java index 6744b025..bb6ad64a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java @@ -15,12 +15,8 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; import java.util.Random; public class BlockPhantom extends Block implements IVariantProvider { @@ -83,11 +79,4 @@ public class BlockPhantom extends Block implements IVariantProvider { public TileEntity createTileEntity(World world, IBlockState state) { return new TilePhantomBlock(100); } - - @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; - } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java index 773d98b9..bb26cf20 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java @@ -4,7 +4,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyBool; @@ -19,9 +19,8 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; -import java.util.List; +import javax.annotation.Nonnull; public class BlockRoutingNode extends Block implements IBMBlock, IVariantProvider { public static final PropertyBool UP = PropertyBool.create("up"); @@ -132,7 +131,7 @@ public class BlockRoutingNode extends Block implements IBMBlock, IVariantProvide } @Override - public List> getVariants() { - return Lists.newArrayList(Pair.of(0, "inventory")); + 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 index e4a0a271..4f93536b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileSoulForge; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -18,12 +18,8 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; 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); @@ -97,13 +93,6 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock return new TileSoulForge(); } - @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; - } - @Override public ItemBlock getItem() { return new ItemBlock(this); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java index 2aa70bea..6802804b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -2,7 +2,6 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileSpectralBlock; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -18,15 +17,12 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; -import java.util.ArrayList; import java.util.List; import java.util.Random; -public class BlockSpectral extends Block implements IVariantProvider { +public class BlockSpectral extends Block { protected static final AxisAlignedBB AABB = new AxisAlignedBB(0, 0, 0, 0, 0, 0); public BlockSpectral() { @@ -106,11 +102,4 @@ public class BlockSpectral extends Block implements IVariantProvider { public TileEntity createTileEntity(World world, IBlockState state) { return new TileSpectralBlock(); } - - @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; - } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index 5ac1eaf1..22fb0307 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.tile.TileTeleposer; +import WayofTime.bloodmagic.util.Constants; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -17,11 +17,6 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; public class BlockTeleposer extends BlockContainer implements IVariantProvider, IBMBlock { public BlockTeleposer() { @@ -64,13 +59,6 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, return new TileTeleposer(); } - @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "normal")); - return ret; - } - @Override public ItemBlock getItem() { return new ItemBlock(this); diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java index 2691f724..0734740e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.block.base; import WayofTime.bloodmagic.block.IBMBlock; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.block.base.ItemBlockEnum; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyEnum; @@ -14,9 +14,8 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; import net.minecraft.util.NonNullList; -import org.apache.commons.lang3.tuple.Pair; -import java.util.List; +import javax.annotation.Nonnull; public class BlockEnum & IStringSerializable> extends Block implements IBMBlock, IVariantProvider { private final E[] types; @@ -77,15 +76,12 @@ public class BlockEnum & IStringSerializable> extends Block im } @Override - public List> getVariants() { - List> variants = Lists.newArrayList(); + public void gatherVariants(@Nonnull Int2ObjectMap variants) { if (getItem() == null) - return variants; + return; for (int i = 0; i < types.length; i++) - variants.add(Pair.of(i, getProperty().getName() + "=" + types[i].name())); - - return variants; + variants.put(i, getProperty().getName() + "=" + types[i].name()); } public E[] getTypes() { diff --git a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java index 6706e2c6..fb8ec3c2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java +++ b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java @@ -6,7 +6,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; -import java.util.List; +import java.util.function.Consumer; /** * Provides a custom {@link ItemMeshDefinition} for automatic registration of @@ -22,11 +22,9 @@ public interface IMeshProvider { ItemMeshDefinition getMeshDefinition(); /** - * Gets all possible variants for this item - * - * @return - All possible variants for this item + * Gathers all possible variants for this item */ - List getVariants(); + void gatherVariants(Consumer variants); /** * If a custom ResourceLocation is required, return it here. diff --git a/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java b/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java index c37d9958..cffbd900 100644 --- a/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java +++ b/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java @@ -1,9 +1,13 @@ package WayofTime.bloodmagic.client; -import org.apache.commons.lang3.tuple.Pair; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.block.Block; -import java.util.List; +import javax.annotation.Nonnull; public interface IVariantProvider { - List> getVariants(); + + default void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, this instanceof Block ? "normal" : "inventory"); + } } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 0d7544ad..76d5da2c 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -19,6 +19,9 @@ import WayofTime.bloodmagic.item.soul.*; 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.block.model.ModelResourceLocation; import net.minecraft.init.Items; import net.minecraft.inventory.EntityEquipmentSlot; @@ -33,14 +36,15 @@ 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 org.apache.commons.lang3.tuple.Pair; 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; @@ -210,9 +214,10 @@ public class RegistrarBloodMagicItems { @SubscribeEvent public static void registerRenders(ModelRegistryEvent event) { items.stream().filter(i -> i instanceof IVariantProvider).forEach(i -> { - IVariantProvider variantProvider = (IVariantProvider) i; - for (Pair variant : variantProvider.getVariants()) - ModelLoader.setCustomModelResourceLocation(i, variant.getLeft(), new ModelResourceLocation(i.getRegistryName(), variant.getRight())); + 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 -> { @@ -220,16 +225,20 @@ public class RegistrarBloodMagicItems { ResourceLocation loc = mesh.getCustomLocation(); if (loc == null) loc = i.getRegistryName(); - for (String variant : mesh.getVariants()) + + 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 -> { - IVariantProvider variantProvider = (IVariantProvider) b; - for (Pair variant : variantProvider.getVariants()) - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(b), variant.getLeft(), new ModelResourceLocation(b.getRegistryName(), variant.getRight())); + 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())); }); final ResourceLocation holdingLoc = SIGIL_HOLDING.getRegistryName(); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index efa445e2..83ca8822 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -3,13 +3,14 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.altar.*; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.client.IVariantProvider; 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.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; @@ -23,10 +24,8 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantProvider { @@ -88,10 +87,8 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=altarmaker")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=altarmaker"); // FIXME } public void setTierToBuild(EnumAltarTier tierToBuild) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index ff20254d..41ebf298 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -5,6 +5,7 @@ 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.EntityPlayer; import net.minecraft.item.Item; @@ -17,10 +18,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; import java.util.List; public class ItemArcaneAshes extends Item implements IVariantProvider { @@ -61,9 +59,7 @@ public class ItemArcaneAshes extends Item implements IVariantProvider { } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=arcaneashes")); - return ret; + public void gatherVariants(Int2ObjectMap variants) { + variants.put(0, "type=arcaneashes"); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 589e91ee..f4b092e0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; @@ -22,7 +22,6 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Enchantments; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -31,10 +30,9 @@ import net.minecraftforge.fml.common.eventhandler.Event; 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.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); @@ -123,17 +121,9 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { return new CustomMeshDefinitionActivatable("bound_axe"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - ret.add("active=true"); - ret.add("active=false"); - return ret; + 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 index f54d39a7..8e7da20c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; @@ -21,7 +21,6 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Enchantments; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -30,10 +29,9 @@ import net.minecraftforge.fml.common.eventhandler.Event; 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.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); @@ -136,17 +134,9 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { return new CustomMeshDefinitionActivatable("bound_pickaxe"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - ret.add("active=true"); - ret.add("active=false"); - return ret; + 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 index 910a4658..a1426e9e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import com.google.common.collect.HashMultiset; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; @@ -21,7 +21,6 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Enchantments; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -30,10 +29,9 @@ import net.minecraftforge.fml.common.eventhandler.Event; 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.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); @@ -122,17 +120,9 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { return new CustomMeshDefinitionActivatable("bound_shovel"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - ret.add("active=true"); - ret.add("active=false"); - return ret; + 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 index c7d49cfc..1c67b320 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IActivatable; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.helper.NetworkHelper; 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.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; @@ -27,15 +27,13 @@ import net.minecraft.item.ItemSword; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; 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.ArrayList; import java.util.List; +import java.util.function.Consumer; public class ItemBoundSword extends ItemSword implements IBindable, IActivatable, IMeshProvider { public ItemBoundSword() { @@ -132,17 +130,9 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable return new CustomMeshDefinitionActivatable("bound_sword"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - ret.add("active=true"); - ret.add("active=false"); - return ret; + public void gatherVariants(Consumer variants) { + variants.accept("active=true"); + variants.accept("active=false"); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index 15140d9c..3b5203a9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.util.PleaseStopUsingMe; import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.util.helper.PurificationHelper; -import WayofTime.bloodmagic.client.IVariantProvider; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.passive.EntityAnimal; @@ -19,9 +19,8 @@ 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 org.apache.commons.lang3.tuple.Pair; -import java.util.List; +import javax.annotation.Nonnull; public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { public ItemDaggerOfSacrifice() { @@ -79,9 +78,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { } @Override - public List> getVariants() { - List> ret = Lists.newArrayList(); - ret.add(Pair.of(0, "type=normal")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=normal"); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index 3a0a86ad..bc8448ea 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -1,9 +1,10 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.iface.IDemonWillViewer; 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.EntityPlayer; import net.minecraft.item.Item; @@ -11,10 +12,8 @@ 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.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.List; @@ -32,10 +31,8 @@ public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemon } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=willgauge")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=willgauge"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java index c4def10f..e949e446 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.types.ISubItem; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -11,9 +11,6 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; public class ItemEnum & ISubItem> extends Item { @@ -55,12 +52,9 @@ public class ItemEnum & ISubItem> extends Item { } @Override - public List> getVariants() { - List> variants = Lists.newArrayList(); + public void gatherVariants(Int2ObjectMap variants) { for (int i = 0; i < types.length; i++) - variants.add(Pair.of(i, "type=" + types[i].getInternalName())); - - return variants; + 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 index 24474e87..5d8bc69e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -1,10 +1,11 @@ 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.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; @@ -17,10 +18,8 @@ import net.minecraft.util.EnumHand; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; public class ItemExperienceBook extends Item implements IVariantProvider { @@ -64,10 +63,8 @@ public class ItemExperienceBook extends Item implements IVariantProvider { } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=experiencetome")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=experiencetome"); } public void giveOneLevelExpToPlayer(ItemStack stack, EntityPlayer player) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index 52a3e3c4..cebbe121 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -1,19 +1,18 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.client.IVariantProvider; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; -import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvider { @@ -62,9 +61,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide } @Override - public List> getVariants() { - List> ret = Lists.newArrayList(); - ret.add(Pair.of(0, "type=normal")); - return ret; + 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 index ef73018c..0d7f9e01 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -1,10 +1,9 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.Lists; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; @@ -24,8 +23,8 @@ 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.function.Consumer; public class ItemPotionFlask extends Item implements IMeshProvider { public ItemPotionFlask() { @@ -131,14 +130,9 @@ public class ItemPotionFlask extends Item implements IMeshProvider { }; } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - return Lists.newArrayList("full=true", "full=false"); + 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/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index d39fc897..1de11784 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -1,22 +1,23 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.ritual.RitualRegistry; +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.ritual.RitualRegistry; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.helper.RitualHelper; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.util.ChatUtil; +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.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; @@ -35,11 +36,9 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.input.Keyboard; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.List; @@ -336,12 +335,10 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=basic")); - ret.add(new ImmutablePair<>(1, "type=dusk")); - ret.add(new ImmutablePair<>(2, "type=dawn")); - return ret; + 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, EntityPlayer player) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 0b203dd9..9cc9c6df 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -1,15 +1,16 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.ritual.EnumRitualReaderState; import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.client.IVariantProvider; 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.EntityPlayer; import net.minecraft.item.Item; @@ -23,10 +24,9 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.input.Keyboard; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -233,9 +233,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=normal")); - return ret; + 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 index 3ffdf74d..11a6381d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -1,16 +1,16 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; -import WayofTime.bloodmagic.util.Constants; +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.PleaseStopUsingMe; import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; @@ -30,10 +30,10 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.function.Consumer; public class ItemSacrificialDagger extends ItemEnum implements IMeshProvider { @@ -165,12 +165,10 @@ public class ItemSacrificialDagger extends ItemEnum getVariants() { - List variants = new ArrayList<>(); - variants.add("type=normal"); - variants.add("type=creative"); - variants.add("type=ceremonial"); - return variants; + public void gatherVariants(Consumer variants) { + variants.accept("type=normal"); + variants.accept("type=creative"); + variants.accept("type=ceremonial"); } public enum DaggerType implements ISubItem { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index 85fd255a..377c401e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -1,16 +1,17 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.altar.EnumAltarTier; import WayofTime.bloodmagic.altar.IAltarManipulator; -import WayofTime.bloodmagic.iface.IDocumentedBlock; -import WayofTime.bloodmagic.util.helper.NBTHelper; 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.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; @@ -28,9 +29,8 @@ import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.Pair; -import java.util.Collections; +import javax.annotation.Nonnull; import java.util.List; public class ItemSanguineBook extends Item implements IVariantProvider, IAltarManipulator { @@ -109,7 +109,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa // IVariantProvider @Override - public List> getVariants() { - return Collections.singletonList(Pair.of(0, "type=normal")); + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=normal"); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index a6bfe3b2..dc7d64b3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -1,13 +1,14 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; 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.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -20,10 +21,8 @@ import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; import java.util.Map.Entry; @@ -96,10 +95,8 @@ public class ItemUpgradeTome extends Item implements IVariantProvider { } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=upgradetome")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=upgradetome"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index 1f6b9e6d..cef99437 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -1,12 +1,13 @@ 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.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -15,9 +16,8 @@ import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; @@ -82,9 +82,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=upgradetrainer")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=upgradetrainer"); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 8f4a5409..b976cb04 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -1,21 +1,21 @@ package WayofTime.bloodmagic.item.armour; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.core.data.SoulNetwork; 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; @@ -44,8 +44,12 @@ import org.lwjgl.input.Keyboard; import javax.annotation.Nullable; import java.lang.reflect.Field; -import java.util.*; +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 ItemArmor implements ISpecialArmor, IMeshProvider { public static final boolean useSpecialArmourCalculation = true; @@ -364,13 +368,11 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public List getVariants() { - List ret = new ArrayList<>(); - ret.add("armour=head"); - ret.add("armour=body"); - ret.add("armour=leg"); - ret.add("armour=feet"); - return ret; + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index b2151097..5b043282 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.item.armour; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; +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 WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.minecraft.client.renderer.ItemMeshDefinition; @@ -33,7 +33,10 @@ import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.*; +import java.util.Locale; +import java.util.Map; +import java.util.UUID; +import java.util.function.Consumer; public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMeshProvider, IMultiWillTool { public static String[] names = {"helmet", "chest", "legs", "boots"}; @@ -297,18 +300,15 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public List getVariants() { - List ret = new ArrayList<>(); + public void gatherVariants(Consumer variants) { for (EnumDemonWillType type : EnumDemonWillType.values()) { String additional = "_" + type.getName().toLowerCase(); - ret.add("armour=head" + additional); - ret.add("armour=body" + additional); - ret.add("armour=leg" + additional); - ret.add("armour=feet" + additional); + variants.accept("armour=head" + additional); + variants.accept("armour=body" + additional); + variants.accept("armour=leg" + additional); + variants.accept("armour=feet" + additional); } - - return ret; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java index 6f082408..3a42a40e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.item.block; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileAlchemyTable; -import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -12,9 +12,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; public class ItemBlockAlchemyTable extends ItemBlock implements IVariantProvider { public ItemBlockAlchemyTable(Block block) { @@ -64,7 +61,7 @@ public class ItemBlockAlchemyTable extends ItemBlock implements IVariantProvider } @Override - public List> getVariants() { - return Lists.newArrayList(Pair.of(0, "inventory")); + public void gatherVariants(Int2ObjectMap variants) { + variants.put(0, "inventory"); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index a726b800..31dfe5b2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -1,14 +1,15 @@ package WayofTime.bloodmagic.item.gear; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; 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.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; @@ -20,10 +21,8 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, IItemLPContainer, IVariantProvider { @@ -76,10 +75,8 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=normal")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=normal"); } // IFillable diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index 492dd868..a0c08a87 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -1,15 +1,16 @@ package WayofTime.bloodmagic.item.gear; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; 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.client.IVariantProvider; import WayofTime.bloodmagic.util.helper.TextHelper; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; @@ -21,10 +22,8 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.List; public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulator, IItemLPContainer, IVariantProvider { @@ -101,10 +100,8 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=normal")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=normal"); } // IFillable diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index 94fbf3ec..1437dbd1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -7,6 +7,7 @@ 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.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -17,9 +18,8 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; @@ -121,10 +121,8 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=exact")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=exact"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index d8fb3a56..7994c36b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -1,13 +1,14 @@ package WayofTime.bloodmagic.item.routing; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.iface.INodeRenderer; -import WayofTime.bloodmagic.util.helper.NBTHelper; 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.EntityPlayer; import net.minecraft.item.Item; @@ -22,10 +23,8 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.LinkedList; import java.util.List; @@ -176,10 +175,8 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=normal")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=normal"); } public BlockPos getBlockPos(ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index a7c1d197..840f1c27 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -6,6 +6,7 @@ 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.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -16,9 +17,8 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandler; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; @@ -138,13 +138,11 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=exact")); - ret.add(new ImmutablePair<>(1, "type=ignorenbt")); - ret.add(new ImmutablePair<>(2, "type=moditems")); - ret.add(new ImmutablePair<>(3, "type=oredict")); - return ret; + 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 diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index 39d5689d..c9f5747b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -1,18 +1,18 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.item.ItemSigil; -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.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.List; @@ -52,10 +52,8 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider { } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(Pair.of(0, "type=normal")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=normal"); } public String getName() { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index 32fa6957..76a2b19b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -1,16 +1,17 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.client.key.IKeybindable; +import WayofTime.bloodmagic.client.key.KeyBindings; 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.client.key.IKeybindable; -import WayofTime.bloodmagic.client.key.KeyBindings; -import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.TextHelper; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -23,10 +24,8 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nonnull; -import java.util.Collections; import java.util.List; public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAltarReader, ISigil.Holding { @@ -166,8 +165,8 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } @Override - public List> getVariants() { - return Collections.emptyList(); + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + } public static int next(int mode) { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 952a8712..6aa74856 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -1,23 +1,21 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.item.ItemSigilToggleable; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; +import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.item.ItemSigilToggleable; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; 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.List; import java.util.Locale; +import java.util.function.Consumer; public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMeshProvider { @@ -54,18 +52,9 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes return new CustomMeshDefinitionActivatable("sigil_" + name.toLowerCase(Locale.ROOT)); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - ret.add("active=false"); - ret.add("active=true"); - - return ret; + public void gatherVariants(Consumer variants) { + variants.accept("active=false"); + variants.accept("active=true"); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index 604826b0..9cb62f6d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -1,24 +1,25 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; -import com.google.common.collect.Lists; +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.block.model.ModelResourceLocation; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +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.Nullable; -import java.util.List; +import java.util.function.Consumer; public class ItemSentientArmourGem extends Item implements IMeshProvider { public ItemSentientArmourGem() { @@ -73,13 +74,8 @@ public class ItemSentientArmourGem extends Item implements IMeshProvider { } @Override - public List getVariants() { - return Lists.newArrayList("type=activated", "type=deactivated"); - } - - @Nullable - @Override - public ResourceLocation getCustomLocation() { - return null; + 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 index ca4a4558..9f9bb426 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; +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; @@ -9,11 +12,8 @@ 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.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -36,14 +36,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import javax.annotation.Nullable; import java.util.*; +import java.util.function.Consumer; public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; @@ -300,20 +299,10 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP return new CustomMeshDefinitionMultiWill("sentient_axe"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - ret.add("type=" + type.getName().toLowerCase()); - } - - return ret; + public void gatherVariants(Consumer variants) { + for (EnumDemonWillType type : EnumDemonWillType.values()) + variants.accept("type=" + type.getName().toLowerCase()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 57314155..b4b104bc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -1,17 +1,17 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.iface.ISentientTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import com.google.common.collect.Lists; +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.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -34,9 +34,8 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.Pair; -import java.util.List; +import javax.annotation.Nonnull; import java.util.Locale; public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentientTool, IVariantProvider//, IMeshProvider @@ -253,8 +252,8 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public List> getVariants() { - return Lists.newArrayList(Pair.of(0, "inventory")); + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "inventory"); } public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) { diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index a1ffaaac..f939b4e3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; +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; @@ -9,11 +12,8 @@ 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.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -36,14 +36,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import javax.annotation.Nullable; import java.util.*; +import java.util.function.Consumer; public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; @@ -299,20 +298,10 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon return new CustomMeshDefinitionMultiWill("sentient_pickaxe"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - ret.add("type=" + type.getName().toLowerCase()); - } - - return ret; + public void gatherVariants(Consumer variants) { + for (EnumDemonWillType type : EnumDemonWillType.values()) + variants.accept("type=" + type.getName().toLowerCase()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index deb5056c..995f80ac 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; +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; @@ -9,11 +12,8 @@ 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.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -36,14 +36,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import javax.annotation.Nullable; import java.util.*; +import java.util.function.Consumer; public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; @@ -300,20 +299,10 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I return new CustomMeshDefinitionMultiWill("sentient_shovel"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - ret.add("type=" + type.getName().toLowerCase()); - } - - return ret; + public void gatherVariants(Consumer variants) { + for (EnumDemonWillType type : EnumDemonWillType.values()) + variants.accept("type=" + type.getName().toLowerCase()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 13206057..d97cab1c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; +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; @@ -9,11 +12,8 @@ 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.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.util.helper.TextHelper; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -34,14 +34,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import javax.annotation.Nullable; import java.util.*; +import java.util.function.Consumer; public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000, 2000, 4000}; @@ -275,20 +274,10 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM return new CustomMeshDefinitionMultiWill("sentient_sword"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - ret.add("type=" + type.getName().toLowerCase()); - } - - return ret; + public void gatherVariants(Consumer variants) { + for (EnumDemonWillType type : EnumDemonWillType.values()) + variants.accept("type=" + type.getName().toLowerCase()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index d55aa834..aa678159 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -1,15 +1,15 @@ package WayofTime.bloodmagic.item.soul; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; +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.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionWillGem; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; @@ -18,16 +18,18 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; 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.Nullable; -import java.util.ArrayList; 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"}; @@ -64,24 +66,15 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I return new CustomMeshDefinitionWillGem("soul_gem"); } - @Nullable @Override - public ResourceLocation getCustomLocation() { - return null; - } - - @Override - public List getVariants() { - List ret = new ArrayList<>(); + public void gatherVariants(Consumer variants) { for (EnumDemonWillType type : EnumDemonWillType.values()) { - ret.add("type=petty_" + type.getName().toLowerCase()); - ret.add("type=lesser_" + type.getName().toLowerCase()); - ret.add("type=common_" + type.getName().toLowerCase()); - ret.add("type=greater_" + type.getName().toLowerCase()); - ret.add("type=grand_" + type.getName().toLowerCase()); + 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()); } - - return ret; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index 15e42172..50971b17 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -4,6 +4,7 @@ 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.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -14,10 +15,8 @@ import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.List; @@ -75,9 +74,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider { } @Override - public List> getVariants() { - List> ret = new ArrayList<>(); - ret.add(new ImmutablePair<>(0, "type=soulsnare")); - return ret; + public void gatherVariants(@Nonnull Int2ObjectMap variants) { + variants.put(0, "type=soulsnare"); } } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 04ace93a..d24ce3b8 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,12 +1,8 @@ package WayofTime.bloodmagic.proxy; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.hud.Elements; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.IVariantProvider; 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.*; @@ -17,18 +13,16 @@ 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.soul.DemonWillHolder; import WayofTime.bloodmagic.tile.*; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; +import WayofTime.bloodmagic.util.Constants; import com.google.common.collect.ImmutableMap; -import net.minecraft.block.Block; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; -import net.minecraft.item.Item; import net.minecraft.potion.PotionUtils; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.client.model.animation.AnimationTESR; import net.minecraftforge.client.model.obj.OBJLoader; @@ -38,7 +32,6 @@ 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 org.apache.commons.lang3.tuple.Pair; import java.awt.Color; import java.util.Map; @@ -118,32 +111,6 @@ public class ClientProxy extends CommonProxy { Elements.createHUDElements(); } - @Override - public void tryHandleBlockModel(Block block, String name) { - if (block instanceof IVariantProvider) { - IVariantProvider variantProvider = (IVariantProvider) block; - for (Pair variant : variantProvider.getVariants()) - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), variant.getLeft(), new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), variant.getRight())); - } - } - - @Override - public void tryHandleItemModel(Item item, String name) { - if (item instanceof IMeshProvider) { - IMeshProvider meshProvider = (IMeshProvider) item; - ModelLoader.setCustomMeshDefinition(item, meshProvider.getMeshDefinition()); - ResourceLocation resourceLocation = meshProvider.getCustomLocation(); - if (resourceLocation == null) - resourceLocation = new ResourceLocation(BloodMagic.MODID, "item/" + name); - for (String variant : meshProvider.getVariants()) - ModelLoader.registerItemVariants(item, new ModelResourceLocation(resourceLocation, variant)); - } else if (item instanceof IVariantProvider) { - IVariantProvider variantProvider = (IVariantProvider) item; - for (Pair variant : variantProvider.getVariants()) - ModelLoader.setCustomModelResourceLocation(item, variant.getLeft(), new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), variant.getRight())); - } - } - private void addElytraLayer() { RenderManager renderManager = Minecraft.getMinecraft().getRenderManager(); try { diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java index 6eab4d82..d63dc5a5 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -4,8 +4,6 @@ import WayofTime.bloodmagic.ritual.CapabilityRuneType; import WayofTime.bloodmagic.ritual.IRitualStone; import WayofTime.bloodmagic.teleport.TeleportQueue; import com.google.common.collect.ImmutableMap; -import net.minecraft.block.Block; -import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -36,14 +34,6 @@ public class CommonProxy { return null; } - public void tryHandleBlockModel(Block block, String name) { - // NO-OP - } - - public void tryHandleItemModel(Item item, String name) { - // NO-OP - } - public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) { return null; } From fefeaf26af1183ace6ed7a0a8678c8380fd5c179 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 7 Mar 2018 19:55:32 -0800 Subject: [PATCH 233/595] Holding sigil can provide it's own mesh provider now --- .../core/RegistrarBloodMagicItems.java | 9 -------- .../item/sigil/ItemSigilHolding.java | 21 ++++++++++++++++++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 76d5da2c..4afa594e 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -240,14 +240,5 @@ public class RegistrarBloodMagicItems { for (Int2ObjectMap.Entry variant : variants.int2ObjectEntrySet()) ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(b), variant.getIntKey(), new ModelResourceLocation(b.getRegistryName(), variant.getValue())); }); - - final ResourceLocation holdingLoc = SIGIL_HOLDING.getRegistryName(); - ModelLoader.setCustomMeshDefinition(SIGIL_HOLDING, stack -> { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("color")) - return new ModelResourceLocation(holdingLoc, "type=color"); - return new ModelResourceLocation(holdingLoc, "type=normal"); - }); - ModelLoader.registerItemVariants(SIGIL_HOLDING, new ModelResourceLocation(holdingLoc, "type=normal")); - ModelLoader.registerItemVariants(SIGIL_HOLDING, new ModelResourceLocation(holdingLoc, "type=color")); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index 76a2b19b..17e36621 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -1,6 +1,7 @@ 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.iface.IAltarReader; @@ -12,6 +13,8 @@ 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.block.model.ModelResourceLocation; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -27,8 +30,9 @@ 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 { +public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAltarReader, ISigil.Holding, IMeshProvider { public static final int inventorySize = 5; public ItemSigilHolding() { @@ -166,7 +170,22 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl @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) { From eada60f43661e5b2151e280be89ad2c69831c60f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 9 Mar 2018 18:00:04 -0800 Subject: [PATCH 234/595] Some altar cleanup and renaming --- .../bloodmagic/altar/AltarComponent.java | 11 +- .../{EnumAltarTier.java => AltarTier.java} | 98 +++++++------- .../WayofTime/bloodmagic/altar/AltarUtil.java | 85 +++++++++++++ .../bloodmagic/altar/BloodAltar.java | 120 +++--------------- ...AltarComponent.java => ComponentType.java} | 6 +- .../bloodmagic/altar/IAltarComponent.java | 2 +- .../bloodmagic/altar/IBloodAltar.java | 2 +- .../bloodmagic/api/impl/BloodMagicAPI.java | 10 +- .../api/impl/BloodMagicCorePlugin.java | 18 +-- .../api/impl/recipe/RecipeBloodAltar.java | 10 +- .../bloodmagic/block/BlockAltar.java | 7 +- .../bloodmagic/block/BlockMimic.java | 6 +- .../client/render/block/RenderAltar.java | 8 +- .../core/RegistrarBloodMagicRecipes.java | 48 +++---- .../core/registry/AltarRecipeRegistry.java | 22 ++-- .../bloodmagic/core/registry/OrbRegistry.java | 4 +- .../bloodmagic/item/ItemAltarMaker.java | 16 +-- .../bloodmagic/item/ItemSanguineBook.java | 8 +- .../ritual/types/RitualAltarBuilder.java | 12 +- .../WayofTime/bloodmagic/tile/TileAltar.java | 8 +- .../java/WayofTime/bloodmagic/util/Utils.java | 6 +- 21 files changed, 253 insertions(+), 254 deletions(-) rename src/main/java/WayofTime/bloodmagic/altar/{EnumAltarTier.java => AltarTier.java} (68%) create mode 100644 src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java rename src/main/java/WayofTime/bloodmagic/altar/{EnumAltarComponent.java => ComponentType.java} (78%) diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java index e70e496b..abc937c7 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java @@ -6,18 +6,17 @@ import net.minecraft.util.math.BlockPos; * Used for building the altar structure. */ public class AltarComponent { - private BlockPos offset; + private final BlockPos offset; + private final ComponentType component; private boolean upgradeSlot; - private EnumAltarComponent 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, EnumAltarComponent component) { + public AltarComponent(BlockPos offset, ComponentType component) { this.offset = offset; this.component = component; } @@ -29,7 +28,7 @@ public class AltarComponent { * @param offset - Where the block should be in relation to the Altar */ public AltarComponent(BlockPos offset) { - this(offset, EnumAltarComponent.NOTAIR); + this(offset, ComponentType.NOTAIR); } /** @@ -50,7 +49,7 @@ public class AltarComponent { return upgradeSlot; } - public EnumAltarComponent getComponent() { + public ComponentType getComponent() { return component; } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java similarity index 68% rename from src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java rename to src/main/java/WayofTime/bloodmagic/altar/AltarTier.java index 0478db4b..df88e59c 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/EnumAltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java @@ -5,31 +5,31 @@ import net.minecraft.util.math.BlockPos; import java.util.ArrayList; //@formatter:off -public enum EnumAltarTier { +public enum AltarTier { ONE(), TWO() { @Override public void buildComponents() { - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, -1), EnumAltarComponent.BLOODRUNE)); - altarComponents.add(new AltarComponent(new BlockPos(0, -1, -1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, -1), EnumAltarComponent.BLOODRUNE)); - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 0), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, 0), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 1), EnumAltarComponent.BLOODRUNE)); - altarComponents.add(new AltarComponent(new BlockPos(0, -1, 1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, 1), EnumAltarComponent.BLOODRUNE)); + altarComponents.add(new AltarComponent(new BlockPos(-1, -1, -1), ComponentType.BLOODRUNE)); + altarComponents.add(new AltarComponent(new BlockPos(0, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(1, -1, -1), ComponentType.BLOODRUNE)); + altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 1), ComponentType.BLOODRUNE)); + altarComponents.add(new AltarComponent(new BlockPos(0, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(1, -1, 1), ComponentType.BLOODRUNE)); } }, THREE() { @Override public void buildComponents() { - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, -1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(0, -1, -1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, -1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 0), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, 0), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(0, -1, 1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, 1), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(-1, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(0, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(1, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(0, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(1, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); altarComponents.add(new AltarComponent(new BlockPos(-3, -1, -3))); altarComponents.add(new AltarComponent(new BlockPos(-3, 0, -3))); altarComponents.add(new AltarComponent(new BlockPos(3, -1, -3))); @@ -38,16 +38,16 @@ public enum EnumAltarTier { altarComponents.add(new AltarComponent(new BlockPos(-3, 0, 3))); altarComponents.add(new AltarComponent(new BlockPos(3, -1, 3))); altarComponents.add(new AltarComponent(new BlockPos(3, 0, 3))); - altarComponents.add(new AltarComponent(new BlockPos(-3, 1, -3), EnumAltarComponent.GLOWSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(3, 1, -3), EnumAltarComponent.GLOWSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(-3, 1, 3), EnumAltarComponent.GLOWSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(3, 1, 3), EnumAltarComponent.GLOWSTONE)); + altarComponents.add(new AltarComponent(new BlockPos(-3, 1, -3), ComponentType.GLOWSTONE)); + altarComponents.add(new AltarComponent(new BlockPos(3, 1, -3), ComponentType.GLOWSTONE)); + altarComponents.add(new AltarComponent(new BlockPos(-3, 1, 3), ComponentType.GLOWSTONE)); + altarComponents.add(new AltarComponent(new BlockPos(3, 1, 3), ComponentType.GLOWSTONE)); for (int i = -2; i <= 2; i++) { - altarComponents.add(new AltarComponent(new BlockPos(3, -2, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-3, -2, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -2, 3), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -2, -3), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(3, -2, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(-3, -2, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(i, -2, 3), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(i, -2, -3), ComponentType.BLOODRUNE).setUpgradeSlot()); } } }, @@ -57,10 +57,10 @@ public enum EnumAltarTier { altarComponents.addAll(THREE.getAltarComponents()); for (int i = -3; i <= 3; i++) { - altarComponents.add(new AltarComponent(new BlockPos(5, -3, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-5, -3, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -3, 5), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -3, -5), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(5, -3, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(-5, -3, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(i, -3, 5), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(i, -3, -5), ComponentType.BLOODRUNE).setUpgradeSlot()); } for (int i = -2; i <= 1; i++) { @@ -70,26 +70,26 @@ public enum EnumAltarTier { altarComponents.add(new AltarComponent(new BlockPos(-5, i, 5))); } - altarComponents.add(new AltarComponent(new BlockPos(5, 2, 5), EnumAltarComponent.BLOODSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(5, 2, -5), EnumAltarComponent.BLOODSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(-5, 2, -5), EnumAltarComponent.BLOODSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(-5, 2, 5), EnumAltarComponent.BLOODSTONE)); + altarComponents.add(new AltarComponent(new BlockPos(5, 2, 5), ComponentType.BLOODSTONE)); + altarComponents.add(new AltarComponent(new BlockPos(5, 2, -5), ComponentType.BLOODSTONE)); + altarComponents.add(new AltarComponent(new BlockPos(-5, 2, -5), ComponentType.BLOODSTONE)); + altarComponents.add(new AltarComponent(new BlockPos(-5, 2, 5), ComponentType.BLOODSTONE)); } }, FIVE() { @Override public void buildComponents() { altarComponents.addAll(FOUR.getAltarComponents()); - altarComponents.add(new AltarComponent(new BlockPos(-8, -3, 8), EnumAltarComponent.BEACON)); - altarComponents.add(new AltarComponent(new BlockPos(-8, -3, -8), EnumAltarComponent.BEACON)); - altarComponents.add(new AltarComponent(new BlockPos(8, -3, -8), EnumAltarComponent.BEACON)); - altarComponents.add(new AltarComponent(new BlockPos(8, -3, 8), EnumAltarComponent.BEACON)); + altarComponents.add(new AltarComponent(new BlockPos(-8, -3, 8), ComponentType.BEACON)); + altarComponents.add(new AltarComponent(new BlockPos(-8, -3, -8), ComponentType.BEACON)); + altarComponents.add(new AltarComponent(new BlockPos(8, -3, -8), ComponentType.BEACON)); + altarComponents.add(new AltarComponent(new BlockPos(8, -3, 8), ComponentType.BEACON)); for (int i = -6; i <= 6; i++) { - altarComponents.add(new AltarComponent(new BlockPos(8, -4, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-8, -4, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -4, 8), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -4, -8), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(8, -4, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(-8, -4, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(i, -4, 8), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(i, -4, -8), ComponentType.BLOODRUNE).setUpgradeSlot()); } } }, @@ -105,16 +105,16 @@ public enum EnumAltarTier { altarComponents.add(new AltarComponent(new BlockPos(-11, i, 11))); } - altarComponents.add(new AltarComponent(new BlockPos(11, 3, 11), EnumAltarComponent.CRYSTAL)); - altarComponents.add(new AltarComponent(new BlockPos(-11, 3, -11), EnumAltarComponent.CRYSTAL)); - altarComponents.add(new AltarComponent(new BlockPos(11, 3, -11), EnumAltarComponent.CRYSTAL)); - altarComponents.add(new AltarComponent(new BlockPos(-11, 3, 11), EnumAltarComponent.CRYSTAL)); + altarComponents.add(new AltarComponent(new BlockPos(11, 3, 11), ComponentType.CRYSTAL)); + altarComponents.add(new AltarComponent(new BlockPos(-11, 3, -11), ComponentType.CRYSTAL)); + altarComponents.add(new AltarComponent(new BlockPos(11, 3, -11), ComponentType.CRYSTAL)); + altarComponents.add(new AltarComponent(new BlockPos(-11, 3, 11), ComponentType.CRYSTAL)); for (int i = -9; i <= 9; i++) { - altarComponents.add(new AltarComponent(new BlockPos(11, -5, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-11, -5, i), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -5, 11), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -5, -11), EnumAltarComponent.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(11, -5, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(-11, -5, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(i, -5, 11), ComponentType.BLOODRUNE).setUpgradeSlot()); + altarComponents.add(new AltarComponent(new BlockPos(i, -5, -11), ComponentType.BLOODRUNE).setUpgradeSlot()); } } //@formatter:on diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java new file mode 100644 index 00000000..845f9051 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java @@ -0,0 +1,85 @@ +package WayofTime.bloodmagic.altar; + +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.block.BlockBloodRune; +import WayofTime.bloodmagic.tile.TileAltar; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.apache.commons.lang3.tuple.Pair; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +public class AltarUtil { + + @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()) { + IBlockState worldState = world.getBlockState(pos.add(component.getOffset())); + 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; + } + + lastCheck = tier; + } + + return lastCheck; + } + + @Nonnull + public static AltarUpgrade getUpgrades(World world, BlockPos pos, AltarTier currentTier) { + AltarUpgrade upgrades = new AltarUpgrade(); + + for (AltarTier tier : AltarTier.values()) { + if (tier.ordinal() > currentTier.ordinal()) + return upgrades; + + for (AltarComponent component : tier.getAltarComponents()) { + if (!component.isUpgradeSlot() || component.getComponent() != ComponentType.BLOODRUNE) + continue; + + BlockPos componentPos = pos.add(component.getOffset()); + IBlockState state = world.getBlockState(componentPos); + if (state.getBlock() instanceof BlockBloodRune) + upgrades.upgrade(((BlockBloodRune) state.getBlock()).getBloodRune(world, componentPos, state)); + } + } + + return upgrades; + } + + @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()); + IBlockState 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()); + } + } + + return null; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index f55108ca..39ccbf9c 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -6,7 +6,6 @@ import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import WayofTime.bloodmagic.block.enums.BloodRuneType; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.iface.IBloodRune; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.orb.BloodOrb; import WayofTime.bloodmagic.orb.IBloodOrb; @@ -30,18 +29,15 @@ import net.minecraftforge.fluids.capability.FluidTankPropertiesWrapper; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.ItemHandlerHelper; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; public class BloodAltar implements IFluidHandler { static { - EnumAltarTier.ONE.buildComponents(); - EnumAltarTier.TWO.buildComponents(); - EnumAltarTier.THREE.buildComponents(); - EnumAltarTier.FOUR.buildComponents(); - EnumAltarTier.FIVE.buildComponents(); - EnumAltarTier.SIX.buildComponents(); + AltarTier.ONE.buildComponents(); + AltarTier.TWO.buildComponents(); + AltarTier.THREE.buildComponents(); + AltarTier.FOUR.buildComponents(); + AltarTier.FIVE.buildComponents(); + AltarTier.SIX.buildComponents(); } public boolean isActive; @@ -49,7 +45,7 @@ public class BloodAltar implements IFluidHandler { protected FluidStack fluidInput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); private TileAltar tileAltar; private int internalCounter = 0; - private EnumAltarTier altarTier = EnumAltarTier.ONE; + private AltarTier altarTier = AltarTier.ONE; private AltarUpgrade upgrade; private int capacity = Fluid.BUCKET_VOLUME * 10; private FluidStack fluid = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); @@ -77,7 +73,7 @@ public class BloodAltar implements IFluidHandler { private int maxCharge = 0; private int cooldownAfterCrafting = 60; private RecipeBloodAltar recipe; - private EnumAltarTier currentTierDisplayed = EnumAltarTier.ONE; + private AltarTier currentTierDisplayed = AltarTier.ONE; public BloodAltar(TileAltar tileAltar) { this.tileAltar = tileAltar; @@ -98,7 +94,7 @@ public class BloodAltar implements IFluidHandler { } internalCounter = tagCompound.getInteger("internalCounter"); - altarTier = Enums.getIfPresent(EnumAltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_TIER)).or(EnumAltarTier.ONE); + altarTier = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_TIER)).or(AltarTier.ONE); isActive = tagCompound.getBoolean(Constants.NBT.ALTAR_ACTIVE); liquidRequired = tagCompound.getInteger(Constants.NBT.ALTAR_LIQUID_REQ); canBeFilled = tagCompound.getBoolean(Constants.NBT.ALTAR_FILLABLE); @@ -124,7 +120,7 @@ public class BloodAltar implements IFluidHandler { chargingFrequency = tagCompound.getInteger(Constants.NBT.ALTAR_CHARGE_FREQUENCY); totalCharge = tagCompound.getInteger(Constants.NBT.ALTAR_TOTAL_CHARGE); maxCharge = tagCompound.getInteger(Constants.NBT.ALTAR_MAX_CHARGE); - currentTierDisplayed = Enums.getIfPresent(EnumAltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(EnumAltarTier.ONE); + currentTierDisplayed = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(AltarTier.ONE); } public void writeToNBT(NBTTagCompound tagCompound) { @@ -358,15 +354,15 @@ public class BloodAltar implements IFluidHandler { } public void checkTier() { - EnumAltarTier tier = BloodAltar.getAltarTier(tileAltar.getWorld(), tileAltar.getPos()); + AltarTier tier = AltarUtil.getTier(tileAltar.getWorld(), tileAltar.getPos()); this.altarTier = tier; - upgrade = BloodAltar.getUpgrades(tileAltar.getWorld(), tileAltar.getPos(), tier); + upgrade = AltarUtil.getUpgrades(tileAltar.getWorld(), tileAltar.getPos(), tier); if (tier.equals(currentTierDisplayed)) - currentTierDisplayed = EnumAltarTier.ONE; + currentTierDisplayed = AltarTier.ONE; - if (tier.equals(EnumAltarTier.ONE)) { + if (tier.equals(AltarTier.ONE)) { upgrade = null; isUpgraded = false; this.consumptionMultiplier = 0; @@ -382,7 +378,7 @@ public class BloodAltar implements IFluidHandler { this.maxCharge = 0; this.totalCharge = 0; return; - } else if (!tier.equals(EnumAltarTier.ONE) && upgrade != null) { + } else if (!tier.equals(AltarTier.ONE)) { this.isUpgraded = true; this.accelerationUpgrades = upgrade.getLevel(BloodRuneType.ACCELERATION); this.consumptionMultiplier = (float) (0.20 * upgrade.getLevel(BloodRuneType.SPEED)); @@ -464,11 +460,11 @@ public class BloodAltar implements IFluidHandler { return getFluidAmount(); } - public EnumAltarTier getTier() { + public AltarTier getTier() { return altarTier; } - public void setTier(EnumAltarTier tier) { + public void setTier(AltarTier tier) { this.altarTier = tier; } @@ -508,7 +504,7 @@ public class BloodAltar implements IFluidHandler { return bufferCapacity; } - public boolean setCurrentTierDisplayed(EnumAltarTier altarTier) { + public boolean setCurrentTierDisplayed(AltarTier altarTier) { if (currentTierDisplayed == altarTier) return false; else @@ -626,85 +622,7 @@ public class BloodAltar implements IFluidHandler { return new IFluidTankProperties[]{new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity))}; } - public EnumAltarTier getCurrentTierDisplayed() { + public AltarTier getCurrentTierDisplayed() { return currentTierDisplayed; } - - public static EnumAltarTier getAltarTier(World world, BlockPos pos) { - for (int i = EnumAltarTier.MAXTIERS - 1; i >= 1; i--) { - if (checkAltarIsValid(world, pos, i)) { - return EnumAltarTier.values()[i]; - } - } - - return EnumAltarTier.ONE; - } - - public static boolean checkAltarIsValid(World world, BlockPos worldPos, int altarTier) { - for (AltarComponent altarComponent : EnumAltarTier.values()[altarTier].getAltarComponents()) { - BlockPos componentPos = worldPos.add(altarComponent.getOffset()); - IBlockState state = world.getBlockState(componentPos); - - if (altarComponent.getComponent() != EnumAltarComponent.NOTAIR) { - if (state.getBlock() instanceof IAltarComponent) { - EnumAltarComponent component = ((IAltarComponent) state.getBlock()).getType(world, state, componentPos); - if (component == null || component != altarComponent.getComponent()) - return false; - } - - if (!BloodMagicAPI.INSTANCE.getComponentStates(altarComponent.getComponent()).contains(state)) - return false; - } else if (world.isAirBlock(componentPos)) - return false; - } - - return true; - } - - public static Pair getAltarMissingBlock(World world, BlockPos worldPos, int altarTier) { - if (altarTier >= EnumAltarTier.MAXTIERS) - return null; - - for (AltarComponent altarComponent : EnumAltarTier.values()[altarTier].getAltarComponents()) { - BlockPos componentPos = worldPos.add(altarComponent.getOffset()); - IBlockState state = world.getBlockState(componentPos); - - if (altarComponent.getComponent() != EnumAltarComponent.NOTAIR) { - if (state.getBlock() instanceof IAltarComponent) { - EnumAltarComponent component = ((IAltarComponent) state.getBlock()).getType(world, state, componentPos); - if (component == null || component != altarComponent.getComponent()) - return Pair.of(componentPos, altarComponent.getComponent()); - } - - if (!BloodMagicAPI.INSTANCE.getComponentStates(altarComponent.getComponent()).contains(state)) - return Pair.of(componentPos, altarComponent.getComponent()); - } else if (world.isAirBlock(componentPos)) - return Pair.of(componentPos, altarComponent.getComponent()); - } - - return null; - } - - public static AltarUpgrade getUpgrades(World world, BlockPos pos, EnumAltarTier altarTier) { - if (world.isRemote) { - return null; - } - - AltarUpgrade upgrades = new AltarUpgrade(); - List list = altarTier.getAltarComponents(); - - for (AltarComponent altarComponent : list) { - BlockPos componentPos = pos.add(altarComponent.getOffset()); - - if (altarComponent.isUpgradeSlot()) { - IBlockState state = world.getBlockState(componentPos); - if (state.getBlock() instanceof IBloodRune) { - BloodRuneType rune = ((IBloodRune) state.getBlock()).getBloodRune(world, componentPos, state); - upgrades.upgrade(rune); - } - } - } - - return upgrades; - } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/EnumAltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/ComponentType.java similarity index 78% rename from src/main/java/WayofTime/bloodmagic/altar/EnumAltarComponent.java rename to src/main/java/WayofTime/bloodmagic/altar/ComponentType.java index aa0327c8..1eec1f0d 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/EnumAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/ComponentType.java @@ -5,7 +5,7 @@ import java.util.Locale; /** * List of different components used to construct different tiers of altars. */ -public enum EnumAltarComponent { +public enum ComponentType { GLOWSTONE, BLOODSTONE, BEACON, @@ -13,11 +13,11 @@ public enum EnumAltarComponent { CRYSTAL, NOTAIR; - public static final EnumAltarComponent[] VALUES = values(); + public static final ComponentType[] VALUES = values(); private static final String BASE = "chat.bloodmagic.altar.comp."; private String key; - EnumAltarComponent() { + ComponentType() { this.key = BASE + name().toLowerCase(Locale.ENGLISH); } diff --git a/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java index 0db6e35e..6a96dc66 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java @@ -8,5 +8,5 @@ import javax.annotation.Nullable; public interface IAltarComponent { @Nullable - EnumAltarComponent getType(World world, IBlockState state, BlockPos pos); + ComponentType getType(World world, IBlockState state, BlockPos pos); } diff --git a/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java index a72c1afd..0270ac3e 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java @@ -5,7 +5,7 @@ public interface IBloodAltar { int getCurrentBlood(); - EnumAltarTier getTier(); + AltarTier getTier(); int getProgress(); diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index 05d0716b..a779da4b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.api.impl; import WayofTime.bloodmagic.api.IBloodMagicAPI; -import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.ComponentType; import WayofTime.bloodmagic.util.BMLog; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -17,7 +17,7 @@ public class BloodMagicAPI implements IBloodMagicAPI { private final BloodMagicBlacklist blacklist; private final BloodMagicRecipeRegistrar recipeRegistrar; private final BloodMagicValueManager valueManager; - private final Multimap altarComponents; + private final Multimap altarComponents; public BloodMagicAPI() { this.blacklist = new BloodMagicBlacklist(); @@ -46,8 +46,8 @@ public class BloodMagicAPI implements IBloodMagicAPI { @Override public void registerAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType) { - EnumAltarComponent component = null; - for (EnumAltarComponent type : EnumAltarComponent.VALUES) { + ComponentType component = null; + for (ComponentType type : ComponentType.VALUES) { if (type.name().equalsIgnoreCase(componentType)) { component = type; break; @@ -61,7 +61,7 @@ public class BloodMagicAPI implements IBloodMagicAPI { } @Nonnull - public List getComponentStates(EnumAltarComponent component) { + public List getComponentStates(ComponentType component) { return (List) altarComponents.get(component); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 453d5174..8448277e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -5,7 +5,7 @@ import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicAPI; import WayofTime.bloodmagic.api.IBloodMagicPlugin; -import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.ComponentType; import WayofTime.bloodmagic.api.IBloodMagicRecipeRegistrar; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockDecorative; @@ -66,19 +66,19 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { handleConfigValues(api); // Add standard blocks for altar components - api.registerAltarComponent(Blocks.GLOWSTONE.getDefaultState(), EnumAltarComponent.GLOWSTONE.name()); - api.registerAltarComponent(Blocks.SEA_LANTERN.getDefaultState(), EnumAltarComponent.GLOWSTONE.name()); - api.registerAltarComponent(Blocks.BEACON.getDefaultState(), EnumAltarComponent.BEACON.name()); + 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), EnumAltarComponent.BLOODSTONE.name()); - api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.BLOODSTONE_TILE), EnumAltarComponent.BLOODSTONE.name()); - api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.CRYSTAL_BRICK), EnumAltarComponent.CRYSTAL.name()); - api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.CRYSTAL_TILE), EnumAltarComponent.CRYSTAL.name()); + 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()); + 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), EnumAltarComponent.BLOODRUNE.name()); + api.registerAltarComponent(bloodRune.getDefaultState().withProperty(bloodRune.getProperty(), runeType), ComponentType.BLOODRUNE.name()); } @Override 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 2490f9ce..5682645e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.api.impl.recipe; -import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.AltarTier; import com.google.common.base.Preconditions; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; @@ -15,7 +15,7 @@ public class RecipeBloodAltar { @Nonnull private final ItemStack output; @Nonnull - private final EnumAltarTier minimumTier; + private final AltarTier minimumTier; @Nonnegative private final int syphon; @Nonnegative @@ -27,14 +27,14 @@ public class RecipeBloodAltar { 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 <= EnumAltarTier.MAXTIERS, "minimumTier cannot be higher than max tier"); + 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."); this.input = input; this.output = output; - this.minimumTier = EnumAltarTier.values()[minimumTier]; + this.minimumTier = AltarTier.values()[minimumTier]; this.syphon = syphon; this.consumeRate = consumeRate; this.drainRate = drainRate; @@ -51,7 +51,7 @@ public class RecipeBloodAltar { } @Nonnull - public EnumAltarTier getMinimumTier() { + public AltarTier getMinimumTier() { return minimumTier; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index a99dadea..2312acab 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -1,10 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.altar.EnumAltarComponent; -import WayofTime.bloodmagic.altar.IAltarManipulator; -import WayofTime.bloodmagic.altar.IBloodAltar; +import WayofTime.bloodmagic.altar.*; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.core.data.SoulNetwork; @@ -165,7 +162,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl public List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state) { List docs = new ArrayList<>(); IBloodAltar altar = ((IBloodAltar) world.getTileEntity(pos)); - Pair missingBlock = BloodAltar.getAltarMissingBlock(world, pos, altar.getTier().toInt()); + Pair missingBlock = AltarUtil.getFirstMissingComponent(world, pos, altar.getTier().toInt()); if (missingBlock != null) docs.add(new TextComponentTranslation("chat.bloodmagic.altar.nextTier", new TextComponentTranslation(missingBlock.getRight().getKey()), Utils.prettifyBlockPosString(missingBlock.getLeft()))); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 003a64de..33e6cb94 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.ComponentType; import WayofTime.bloodmagic.altar.IAltarComponent; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.block.enums.EnumMimic; @@ -200,7 +200,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent @Nullable @Override - public EnumAltarComponent getType(World world, IBlockState state, BlockPos pos) { + public ComponentType getType(World world, IBlockState state, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileMimic) { TileMimic mimic = (TileMimic) tile; @@ -210,7 +210,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent if (block instanceof IAltarComponent) { return ((IAltarComponent) block).getType(world, block.getStateFromMeta(mimic.metaOfReplacedBlock), pos); } else { - for (EnumAltarComponent altarComponent : EnumAltarComponent.values()) + for (ComponentType altarComponent : ComponentType.values()) if (block == Utils.getBlockForComponent(altarComponent)) return altarComponent; } 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 d8988f06..0246341a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.client.render.block; import WayofTime.bloodmagic.altar.AltarComponent; -import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.AltarTier; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.handler.event.ClientHandler; @@ -40,7 +40,7 @@ public class RenderAltar extends TileEntitySpecialRenderer { this.renderItem(inputStack); GlStateManager.popMatrix(); - if (tileAltar.getCurrentTierDisplayed() != EnumAltarTier.ONE) + if (tileAltar.getCurrentTierDisplayed() != AltarTier.ONE) renderHologram(tileAltar, tileAltar.getCurrentTierDisplayed(), partialTicks); } @@ -102,11 +102,11 @@ public class RenderAltar extends TileEntitySpecialRenderer { } } - private void renderHologram(TileAltar altar, EnumAltarTier tier, float partialTicks) { + private void renderHologram(TileAltar altar, AltarTier tier, float partialTicks) { EntityPlayerSP player = mc.player; World world = player.world; - if (tier == EnumAltarTier.ONE) + if (tier == AltarTier.ONE) return; GlStateManager.pushMatrix(); diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index dbd69d57..dc591305 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicRecipeRegistrar; -import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.AltarTier; import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.item.ItemSlate; import WayofTime.bloodmagic.ritual.EnumRuneType; @@ -58,39 +58,39 @@ public class RegistrarBloodMagicRecipes { public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) { // ONE - registrar.addBloodAltar(new OreIngredient("gemDiamond"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), EnumAltarTier.ONE.ordinal(), 2000, 2, 1); - registrar.addBloodAltar(new OreIngredient("stone"), ItemSlate.SlateType.BLANK.getStack(), EnumAltarTier.ONE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.BUCKET), FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)), EnumAltarTier.ONE.ordinal(), 1000, 5, 0); - registrar.addBloodAltar(Ingredient.fromItem(Items.BOOK), new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK), EnumAltarTier.ONE.ordinal(), 1000, 20, 0); + 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), EnumAltarTier.TWO.ordinal(), 5000, 5, 5); - registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.BLANK.getStack()), ItemSlate.SlateType.REINFORCED.getStack(), EnumAltarTier.TWO.ordinal(), 2000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.IRON_SWORD), new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE), EnumAltarTier.TWO.ordinal(), 3000, 5, 5); + 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), EnumAltarTier.THREE.ordinal(), 25000, 20, 20); - registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.REINFORCED.getStack()), ItemSlate.SlateType.IMBUED.getStack(), EnumAltarTier.THREE.ordinal(), 5000, 15, 10); - registrar.addBloodAltar(new OreIngredient("obsidian"), EnumRuneType.EARTH.getStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(new OreIngredient("blockLapis"), EnumRuneType.WATER.getStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.MAGMA_CREAM), EnumRuneType.FIRE.getStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.GHAST_TEAR), EnumRuneType.AIR.getStack(), EnumAltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(RegistrarBloodMagicItems.LAVA_CRYSTAL), new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL), EnumAltarTier.THREE.ordinal(), 10000, 20, 10); + 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), EnumAltarTier.FOUR.ordinal(), 25000, 30, 50); - registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.IMBUED.getStack()), ItemSlate.SlateType.DEMONIC.getStack(), EnumAltarTier.FOUR.ordinal(), 15000, 20, 20); - registrar.addBloodAltar(new OreIngredient("blockCoal"), EnumRuneType.DUSK.getStack(), EnumAltarTier.FOUR.ordinal(), 2000, 20, 10); - registrar.addBloodAltar(new OreIngredient("enderpearl"), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), EnumAltarTier.FOUR.ordinal(), 2000, 10, 10); - registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), EnumAltarTier.FOUR.ordinal(), 10000, 20, 10); + registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), AltarTier.FOUR.ordinal(), 25000, 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), EnumAltarTier.FIVE.ordinal(), 80000, 50, 100); - registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.DEMONIC.getStack()), ItemSlate.SlateType.ETHEREAL.getStack(), EnumAltarTier.FIVE.ordinal(), 30000, 40, 100); + 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 - registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, 2)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); - registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getStack(), EnumAltarTier.SIX.ordinal(), 200000, 100, 200); + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java index e52151a5..c0c74d3a 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.core.registry; import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.ItemStackWrapper; -import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.AltarTier; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.minecraft.item.ItemStack; @@ -32,7 +32,7 @@ public class AltarRecipeRegistry { BMLog.DEFAULT.error("Error adding altar recipe for input [{}].", altarRecipe.toString()); } - public static void registerFillRecipe(ItemStack orbStack, EnumAltarTier tier, int maxForOrb, int consumeRate, int drainRate) { + public static void registerFillRecipe(ItemStack orbStack, AltarTier tier, int maxForOrb, int consumeRate, int drainRate) { registerRecipe(new AltarRecipe(orbStack, orbStack, tier, maxForOrb, consumeRate, drainRate, true)); } @@ -76,7 +76,7 @@ public class AltarRecipeRegistry { public static class AltarRecipe { private final List input; private final ItemStack output; - private final EnumAltarTier minTier; + private final AltarTier minTier; private final int syphon, consumeRate, drainRate; private final boolean fillable; @@ -95,7 +95,7 @@ public class AltarRecipeRegistry { * @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, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) { + 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; @@ -105,27 +105,27 @@ public class AltarRecipeRegistry { this.fillable = fillable; } - public AltarRecipe(List input, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate) { + 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, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) { + 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, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate) { + 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, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) { + 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, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate) { + 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, EnumAltarTier tierCheck) { + public boolean doesRequiredItemMatch(ItemStack comparedStack, AltarTier tierCheck) { if (comparedStack == null || this.input == null) return false; @@ -151,7 +151,7 @@ public class AltarRecipeRegistry { return output; } - public EnumAltarTier getMinTier() { + public AltarTier getMinTier() { return minTier; } diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java index d911c303..81267670 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.core.registry; -import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.AltarTier; import WayofTime.bloodmagic.orb.BloodOrb; import com.google.common.collect.ArrayListMultimap; import net.minecraft.item.Item; @@ -42,7 +42,7 @@ public class OrbRegistry { public static List getOrbsDownToTier(int tier) { List ret = new ArrayList<>(); - for (int i = EnumAltarTier.MAXTIERS; i >= tier; i--) + for (int i = AltarTier.MAXTIERS; i >= tier; i--) ret.addAll(getOrbsForTier(i)); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 83ca8822..b299b030 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -29,7 +29,7 @@ import javax.annotation.Nonnull; import java.util.List; public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantProvider { - private EnumAltarTier tierToBuild = EnumAltarTier.ONE; + private AltarTier tierToBuild = AltarTier.ONE; public ItemAltarMaker() { super(); @@ -61,12 +61,12 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP stack = NBTHelper.checkNBT(stack); if (player.isSneaking()) { - if (stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) >= EnumAltarTier.MAXTIERS - 1) + 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(EnumAltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]); + setTierToBuild(AltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]); ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); return super.onItemRightClick(world, player, hand); } @@ -91,7 +91,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP variants.put(0, "type=altarmaker"); // FIXME } - public void setTierToBuild(EnumAltarTier tierToBuild) { + public void setTierToBuild(AltarTier tierToBuild) { this.tierToBuild = tierToBuild; } @@ -99,12 +99,12 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP if (world.isRemote) return; - if (tierToBuild == EnumAltarTier.ONE) + if (tierToBuild == AltarTier.ONE) return; for (AltarComponent altarComponent : tierToBuild.getAltarComponents()) { BlockPos componentPos = pos.add(altarComponent.getOffset()); - if (altarComponent.getComponent() == EnumAltarComponent.NOTAIR) { + if (altarComponent.getComponent() == ComponentType.NOTAIR) { world.setBlockState(componentPos, Blocks.STONEBRICK.getDefaultState()); continue; } @@ -123,9 +123,9 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP RayTraceResult rayTrace = rayTrace(world, player, false); BlockPos pos = rayTrace.getBlockPos(); IBlockState state = world.getBlockState(pos); - EnumAltarTier altarTier = BloodAltar.getAltarTier(world, pos); + AltarTier altarTier = AltarUtil.getTier(world, pos); - if (altarTier.equals(EnumAltarTier.ONE)) + if (altarTier.equals(AltarTier.ONE)) return "" + altarTier.toInt(); else { for (AltarComponent altarComponent : altarTier.getAltarComponents()) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index 377c401e..ec2457d6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.AltarTier; import WayofTime.bloodmagic.altar.IAltarManipulator; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.iface.IDocumentedBlock; @@ -34,7 +34,7 @@ import javax.annotation.Nonnull; import java.util.List; public class ItemSanguineBook extends Item implements IVariantProvider, IAltarManipulator { - private EnumAltarTier currentDisplayedTier = EnumAltarTier.ONE; + private AltarTier currentDisplayedTier = AltarTier.ONE; public ItemSanguineBook() { setUnlocalizedName(BloodMagic.MODID + ".sanguineBook"); @@ -73,12 +73,12 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa 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) >= EnumAltarTier.MAXTIERS - 1) + 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 = EnumAltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]; + currentDisplayedTier = AltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]; ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); return super.onItemRightClick(world, player, hand); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index 37125032..c1572201 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.BlockStack; import WayofTime.bloodmagic.altar.AltarComponent; -import WayofTime.bloodmagic.altar.EnumAltarComponent; -import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.ComponentType; +import WayofTime.bloodmagic.altar.AltarTier; import WayofTime.bloodmagic.ritual.EnumRuneType; import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.ritual.Ritual; @@ -30,7 +30,7 @@ import java.util.Iterator; import java.util.function.Consumer; public class RitualAltarBuilder extends Ritual { - private Iterator altarComponentsIterator = new ArrayList<>(EnumAltarTier.SIX.getAltarComponents()).iterator(); + private Iterator altarComponentsIterator = new ArrayList<>(AltarTier.SIX.getAltarComponents()).iterator(); private boolean cycleDone = false; private AltarComponent currentComponent; @@ -54,7 +54,7 @@ public class RitualAltarBuilder extends Ritual { } if (cycleDone) { - altarComponentsIterator = new ArrayList<>(EnumAltarTier.SIX.getAltarComponents()).iterator(); + altarComponentsIterator = new ArrayList<>(AltarTier.SIX.getAltarComponents()).iterator(); } if (world.getBlockState(altarPos).getBlock().isReplaceable(world, altarPos) && hasItem(tileEntity, Item.getItemFromBlock(RegistrarBloodMagicBlocks.ALTAR), 0, true)) { @@ -206,7 +206,7 @@ public class RitualAltarBuilder extends Ritual { for (int i = 0; i < itemHandler.getSlots(); i++) { if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune && itemHandler.extractItem(i, 1, true) != null) { - BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(EnumAltarComponent.BLOODRUNE), itemHandler.getStackInSlot(i).getItemDamage()); + BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(ComponentType.BLOODRUNE), itemHandler.getStackInSlot(i).getItemDamage()); itemHandler.extractItem(i, 1, false); return blockStack; } @@ -215,7 +215,7 @@ public class RitualAltarBuilder extends Ritual { IInventory inv = (IInventory) tileEntity; for (int i = 0; i < inv.getSizeInventory(); i++) { if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof ItemBlock && Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune) { - BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(EnumAltarComponent.BLOODRUNE), inv.getStackInSlot(i).getItemDamage()); + BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(ComponentType.BLOODRUNE), inv.getStackInSlot(i).getItemDamage()); inv.decrStackSize(i, 1); return blockStack; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java index b7b5e5aa..b0ecd0c9 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.altar.EnumAltarTier; +import WayofTime.bloodmagic.altar.AltarTier; import WayofTime.bloodmagic.altar.IBloodAltar; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -67,7 +67,7 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable { } @Override - public EnumAltarTier getTier() { + public AltarTier getTier() { return bloodAltar.getTier(); } @@ -161,11 +161,11 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable { return bloodAltar.getChargingFrequency(); } - public EnumAltarTier getCurrentTierDisplayed() { + public AltarTier getCurrentTierDisplayed() { return bloodAltar.getCurrentTierDisplayed(); } - public boolean setCurrentTierDisplayed(EnumAltarTier altarTier) { + public boolean setCurrentTierDisplayed(AltarTier altarTier) { return bloodAltar.setCurrentTierDisplayed(altarTier); } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 83ea0573..052977db 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.altar.EnumAltarComponent; +import WayofTime.bloodmagic.altar.ComponentType; import WayofTime.bloodmagic.iface.IDemonWillViewer; import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; @@ -321,12 +321,12 @@ public class Utils { } /** - * Gets a default block for each type of {@link EnumAltarComponent} + * 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(EnumAltarComponent component) { + public static Block getBlockForComponent(ComponentType component) { switch (component) { case GLOWSTONE: return Blocks.GLOWSTONE; From e2d2ecb3baae71fff8c98b5e64b1bbba873577ba Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 9 Mar 2018 23:53:56 -0800 Subject: [PATCH 235/595] Run formatter on build.gradle --- build.gradle | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index fde35074..987c88db 100644 --- a/build.gradle +++ b/build.gradle @@ -5,14 +5,14 @@ buildscript { maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' } } plugins { - id "net.minecraftforge.gradle.forge" version "2.0.2" + id "net.minecraftforge.gradle.forge" version "2.0.2" id 'com.matthewprenger.cursegradle' version '1.0.10' - id 'io.franzbecker.gradle-lombok' version '1.6' + id 'io.franzbecker.gradle-lombok' version '1.6' id 'maven-publish' } @@ -30,7 +30,7 @@ version = "${mc_version}-${mod_version}-${build_number}" repositories { maven { url "http://dvs1.progwml6.com/files/maven" } - maven { url "http://tehnut.info/maven" } + maven { url "http://tehnut.info/maven" } } dependencies { @@ -80,11 +80,11 @@ jar { from sourceSets.main.output from sourceSets.api.output manifest.mainAttributes( - "Built-By": System.getProperty('user.name'), - "Created-By": "${System.getProperty('java.vm.version')} + (${System.getProperty('java.vm.vendor')})", - "Implementation-Title": project.name, - "Implementation-Version": project.version, - "Built-On": "${mc_version}-${forge_version}" + "Built-By": System.getProperty('user.name'), + "Created-By": "${System.getProperty('java.vm.version')} + (${System.getProperty('java.vm.vendor')})", + "Implementation-Title": project.name, + "Implementation-Version": project.version, + "Built-On": "${mc_version}-${forge_version}" ) } @@ -146,7 +146,9 @@ String getChangelogText() { } if (lineCount < 3) { lineCount++ - if (it.startsWith(separator)) {return} + if (it.startsWith(separator)) { + return + } } if (!it.startsWith(separator)) { str += "$it" + (lineCount < 3 ? ':\n\n' : '\n') From ecb81a7017696c1b8d6ff561a6e06980b44cfd2d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 10 Mar 2018 00:07:19 -0800 Subject: [PATCH 236/595] A bit more altar cleanup --- .../WayofTime/bloodmagic/altar/AltarTier.java | 168 ++++++++++-------- .../WayofTime/bloodmagic/altar/AltarUtil.java | 8 +- .../bloodmagic/altar/BloodAltar.java | 8 - .../bloodmagic/block/BlockAltar.java | 9 +- .../client/render/block/RenderAltar.java | 13 +- .../java/WayofTime/bloodmagic/util/Utils.java | 10 +- 6 files changed, 108 insertions(+), 108 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java index df88e59c..d940e6ab 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java @@ -1,138 +1,148 @@ package WayofTime.bloodmagic.altar; +import com.google.common.collect.Lists; import net.minecraft.util.math.BlockPos; -import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; -//@formatter:off public enum AltarTier { - ONE(), TWO() { + ONE() { @Override - public void buildComponents() { - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, -1), ComponentType.BLOODRUNE)); - altarComponents.add(new AltarComponent(new BlockPos(0, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, -1), ComponentType.BLOODRUNE)); - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 1), ComponentType.BLOODRUNE)); - altarComponents.add(new AltarComponent(new BlockPos(0, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, 1), ComponentType.BLOODRUNE)); + 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() { - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(0, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-1, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(0, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(1, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-3, -1, -3))); - altarComponents.add(new AltarComponent(new BlockPos(-3, 0, -3))); - altarComponents.add(new AltarComponent(new BlockPos(3, -1, -3))); - altarComponents.add(new AltarComponent(new BlockPos(3, 0, -3))); - altarComponents.add(new AltarComponent(new BlockPos(-3, -1, 3))); - altarComponents.add(new AltarComponent(new BlockPos(-3, 0, 3))); - altarComponents.add(new AltarComponent(new BlockPos(3, -1, 3))); - altarComponents.add(new AltarComponent(new BlockPos(3, 0, 3))); - altarComponents.add(new AltarComponent(new BlockPos(-3, 1, -3), ComponentType.GLOWSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(3, 1, -3), ComponentType.GLOWSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(-3, 1, 3), ComponentType.GLOWSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(3, 1, 3), ComponentType.GLOWSTONE)); + 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 <= 2; i++) { - altarComponents.add(new AltarComponent(new BlockPos(3, -2, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-3, -2, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -2, 3), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -2, -3), ComponentType.BLOODRUNE).setUpgradeSlot()); + 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() { - altarComponents.addAll(THREE.getAltarComponents()); + public void buildComponents(Consumer components) { + THREE.getAltarComponents().forEach(components); for (int i = -3; i <= 3; i++) { - altarComponents.add(new AltarComponent(new BlockPos(5, -3, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-5, -3, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -3, 5), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -3, -5), ComponentType.BLOODRUNE).setUpgradeSlot()); + 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 = -2; i <= 1; i++) { - altarComponents.add(new AltarComponent(new BlockPos(5, i, 5))); - altarComponents.add(new AltarComponent(new BlockPos(5, i, -5))); - altarComponents.add(new AltarComponent(new BlockPos(-5, i, -5))); - altarComponents.add(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))); + components.accept(new AltarComponent(new BlockPos(-5, i, 5))); } - altarComponents.add(new AltarComponent(new BlockPos(5, 2, 5), ComponentType.BLOODSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(5, 2, -5), ComponentType.BLOODSTONE)); - altarComponents.add(new AltarComponent(new BlockPos(-5, 2, -5), ComponentType.BLOODSTONE)); - altarComponents.add(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)); + components.accept(new AltarComponent(new BlockPos(-5, 2, 5), ComponentType.BLOODSTONE)); } }, FIVE() { @Override - public void buildComponents() { - altarComponents.addAll(FOUR.getAltarComponents()); - altarComponents.add(new AltarComponent(new BlockPos(-8, -3, 8), ComponentType.BEACON)); - altarComponents.add(new AltarComponent(new BlockPos(-8, -3, -8), ComponentType.BEACON)); - altarComponents.add(new AltarComponent(new BlockPos(8, -3, -8), ComponentType.BEACON)); - altarComponents.add(new AltarComponent(new BlockPos(8, -3, 8), ComponentType.BEACON)); + 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 = -6; i <= 6; i++) { - altarComponents.add(new AltarComponent(new BlockPos(8, -4, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-8, -4, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -4, 8), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -4, -8), ComponentType.BLOODRUNE).setUpgradeSlot()); + 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() { - altarComponents.addAll(FIVE.getAltarComponents()); + public void buildComponents(Consumer components) { + FIVE.getAltarComponents().forEach(components); for (int i = -4; i <= 2; i++) { - altarComponents.add(new AltarComponent(new BlockPos(11, i, 11))); - altarComponents.add(new AltarComponent(new BlockPos(-11, i, -11))); - altarComponents.add(new AltarComponent(new BlockPos(11, i, -11))); - altarComponents.add(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(-11, i, 11))); } - altarComponents.add(new AltarComponent(new BlockPos(11, 3, 11), ComponentType.CRYSTAL)); - altarComponents.add(new AltarComponent(new BlockPos(-11, 3, -11), ComponentType.CRYSTAL)); - altarComponents.add(new AltarComponent(new BlockPos(11, 3, -11), ComponentType.CRYSTAL)); - altarComponents.add(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)); + components.accept(new AltarComponent(new BlockPos(-11, 3, 11), ComponentType.CRYSTAL)); for (int i = -9; i <= 9; i++) { - altarComponents.add(new AltarComponent(new BlockPos(11, -5, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(-11, -5, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -5, 11), ComponentType.BLOODRUNE).setUpgradeSlot()); - altarComponents.add(new AltarComponent(new BlockPos(i, -5, -11), ComponentType.BLOODRUNE).setUpgradeSlot()); + 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()); } } -//@formatter:on }; public static final int MAXTIERS = values().length; - ArrayList altarComponents = new ArrayList<>(); + private List altarComponents; - public void buildComponents() { + AltarTier() { + this.altarComponents = Lists.newArrayList(); + buildComponents(altarComponents::add); } + public abstract void buildComponents(Consumer components); + public int toInt() { return ordinal() + 1; } - public ArrayList getAltarComponents() { + public List getAltarComponents() { return altarComponents; } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java index 845f9051..7519c870 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java @@ -25,7 +25,13 @@ public class AltarUtil { AltarTier lastCheck = AltarTier.ONE; for (AltarTier tier : AltarTier.values()) { for (AltarComponent component : tier.getAltarComponents()) { - IBlockState worldState = world.getBlockState(pos.add(component.getOffset())); + BlockPos componentPos = pos.add(component.getOffset()); + IBlockState worldState = world.getBlockState(componentPos); + + 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; diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 39ccbf9c..0cb9b8f7 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -31,14 +31,6 @@ import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.ItemHandlerHelper; public class BloodAltar implements IFluidHandler { - static { - AltarTier.ONE.buildComponents(); - AltarTier.TWO.buildComponents(); - AltarTier.THREE.buildComponents(); - AltarTier.FOUR.buildComponents(); - AltarTier.FIVE.buildComponents(); - AltarTier.SIX.buildComponents(); - } public boolean isActive; protected FluidStack fluidOutput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 2312acab..39fe58e1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -117,7 +117,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl if (altar == null || player.isSneaking()) return false; - ItemStack playerItem = player.inventory.getCurrentItem(); + ItemStack playerItem = player.getHeldItem(hand); if (playerItem.getItem() instanceof IAltarReader || playerItem.getItem() instanceof IAltarManipulator) { playerItem.getItem().onItemRightClick(world, player, hand); @@ -136,11 +136,8 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl @Override public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileAltar) { - TileAltar tileAltar = (TileAltar) world.getTileEntity(blockPos); - if (tileAltar != null) - tileAltar.dropItems(); - } + if (tile instanceof TileAltar) + ((TileAltar) tile).dropItems(); super.breakBlock(world, blockPos, blockState); } 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 0246341a..2dba9db8 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -14,7 +14,6 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; @@ -22,10 +21,8 @@ import net.minecraftforge.fluids.FluidStack; import org.lwjgl.opengl.GL11; public class RenderAltar extends TileEntitySpecialRenderer { - public static Minecraft mc = Minecraft.getMinecraft(); - public static ResourceLocation resource = new ResourceLocation("bloodmagic", "textures/blocks/lifeEssenceStill.png"); - public static float minHeight = 0.499f; - public static float maxHeight = 0.745f; + private static final float MIN_HEIGHT = 0.499f; + private static final float MAX_HEIGHT = 0.745f; @Override public void render(TileAltar tileAltar, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { @@ -50,7 +47,7 @@ public class RenderAltar extends TileEntitySpecialRenderer { Fluid fluid = BlockLifeEssence.getLifeEssence(); FluidStack fluidStack = new FluidStack(fluid, 1000); - GlStateManager.translate(0.5, minHeight + (fluidLevel) * (maxHeight - minHeight), 0.5); + GlStateManager.translate(0.5, MIN_HEIGHT + (fluidLevel) * (MAX_HEIGHT - MIN_HEIGHT), 0.5); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder wr = tessellator.getBuffer(); @@ -81,7 +78,7 @@ public class RenderAltar extends TileEntitySpecialRenderer { } private void renderItem(ItemStack stack) { - RenderItem itemRenderer = mc.getRenderItem(); + RenderItem itemRenderer = Minecraft.getMinecraft().getRenderItem(); if (!stack.isEmpty()) { GlStateManager.translate(0.5, 1, 0.5); GlStateManager.pushMatrix(); @@ -103,7 +100,7 @@ public class RenderAltar extends TileEntitySpecialRenderer { } private void renderHologram(TileAltar altar, AltarTier tier, float partialTicks) { - EntityPlayerSP player = mc.player; + EntityPlayerSP player = Minecraft.getMinecraft().player; World world = player.world; if (tier == AltarTier.ONE) diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 052977db..33fbff01 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -270,17 +270,15 @@ public class Utils { * otherwise */ public static boolean insertItemToTile(TileInventory tile, EntityPlayer player, int slot) { - if (tile.getStackInSlot(slot).isEmpty() && !player.getHeldItemMainhand().isEmpty()) { + 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 (!tile.getStackInSlot(slot).isEmpty() && player.getHeldItemMainhand().isEmpty()) { - if (!tile.getWorld().isRemote) { - EntityItem invItem = new EntityItem(tile.getWorld(), player.posX, player.posY + 0.25, player.posZ, tile.getStackInSlot(slot)); - tile.getWorld().spawnEntity(invItem); - } + } else if (!slotStack.isEmpty() && player.getHeldItemMainhand().isEmpty()) { + ItemHandlerHelper.giveItemToPlayer(player, slotStack); tile.clear(); return false; } From bbe026dda9ac69fca16bb59e9efcec520ddc7529 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 11 Mar 2018 11:19:34 -0400 Subject: [PATCH 237/595] Added a new (slightly WIP?) array, the Turret Array --- changelog.txt | 2 + .../AlchemyArrayEffectArrowTurret.java | 242 +++++++++++++++ .../TurretAlchemyCircleRenderer.java | 285 ++++++++++++++++++ .../bloodmagic/registry/ModRecipes.java | 79 +++-- .../bloodmagic/tile/TileAlchemyArray.java | 15 +- 5 files changed, 596 insertions(+), 27 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java diff --git a/changelog.txt b/changelog.txt index 775f13c4..e27942ad 100644 --- a/changelog.txt +++ b/changelog.txt @@ -5,6 +5,8 @@ Version 2.2.8 - 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 a new (slightly WIP?) array, 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. - 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. ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java new file mode 100644 index 00000000..25d838cb --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java @@ -0,0 +1,242 @@ +package WayofTime.bloodmagic.alchemyArray; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.projectile.EntityTippedArrow; +import net.minecraft.init.Items; +import net.minecraft.item.ItemArrow; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec2f; +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 EntityLiving 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, EnumFacing.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 ItemArrow)) + { + 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 ItemArrow) + { + arrowStack = testStack; + lastChestSlot = i; + break; + } + } + + } + + if (lastChestSlot < 0) + { + return false; //No arrows in the chest. Welp! + } + + if (canFireOnMob(world, pos, target)) + { + Vec2f 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(EntityMob.class, getBounds(pos)); + + for (EntityMob 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, EntityLiving targetMob) + { + float vel = 3f; + double damage = 2; + if (!world.isRemote) + { + if (arrowStack.getItem() instanceof ItemArrow) + { +// ItemArrow arrow = (ItemArrow) arrowStack.getItem(); +// EntityArrow entityarrow = arrow.createArrow(world, arrowStack, targetMob); + EntityTippedArrow entityarrow = new EntityTippedArrow(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 Vec2f getPitchYaw(BlockPos pos, Entity entityIn) + { + if (entityIn == null) + { + return new Vec2f(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 Vec2f((float) pitch, (float) 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(NBTTagCompound tag) + { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectArrowTurret(key); + } + +} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java new file mode 100644 index 00000000..66039503 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java @@ -0,0 +1,285 @@ +package WayofTime.bloodmagic.client.render.alchemyArray; + +import java.util.List; + +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.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec2f; +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.getMinecraft().renderEngine.bindTexture(arrayResource); + + GlStateManager.disableCull(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(770, 1); + + GlStateManager.translate(x, y, z); + + // Specify which face this "circle" is located on + EnumFacing sideHit = EnumFacing.UP; + EnumFacing rotation = tileArray.getRotation(); + + GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * 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.getMinecraft().renderEngine.bindTexture(bottomArrayResource); + GlStateManager.rotate(-rot, 0, 0, 1); + GlStateManager.translate(0, 0, -bottomHeightOffset); + renderStandardCircle(tessellator, wr, size / 2); + GlStateManager.popMatrix(); + + GlStateManager.pushMatrix(); + Minecraft.getMinecraft().renderEngine.bindTexture(middleArrayResource); + GlStateManager.rotate(0, 0, 0, 1); + GlStateManager.translate(0, 0, -middleHeightOffset); + renderStandardCircle(tessellator, wr, size); + GlStateManager.popMatrix(); + + GlStateManager.pushMatrix(); + Minecraft.getMinecraft().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/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 9e1f2b9b..14386ee5 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -1,26 +1,11 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.alchemyArray.*; -import WayofTime.bloodmagic.compress.CompressionRegistry; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; -import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.client.render.alchemyArray.*; -import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; -import WayofTime.bloodmagic.compress.BaseCompressionHandler; -import WayofTime.bloodmagic.compress.StorageBlockCraftingManager; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import WayofTime.bloodmagic.livingArmour.downgrade.*; -import WayofTime.bloodmagic.potion.BMPotionUtils; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableDyeableRecipe; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionRecipe; -import WayofTime.bloodmagic.util.Utils; -import com.google.common.base.Stopwatch; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.init.MobEffects; @@ -31,13 +16,54 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.oredict.OreDictionary; + import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import WayofTime.bloodmagic.BloodMagic; +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.AlchemyArrayEffectMovement; +import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSigil; +import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSkeletonTurret; +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.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.Utils; + +import com.google.common.base.Stopwatch; public class ModRecipes { @@ -96,6 +122,7 @@ public class ModRecipes 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("turretTest"), new TurretAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png"))); // AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.APPLE), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectLaputa("laputa"), new AttractorAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/shardoflaputa.png"))); 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"))); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 03454b0c..1a02cbd2 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,10 +1,16 @@ package WayofTime.bloodmagic.tile; +import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectCraftingNew; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; @@ -20,7 +26,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche public EnumFacing rotation = EnumFacing.HORIZONTALS[0]; private String key = "empty"; - private AlchemyArrayEffect arrayEffect; + public AlchemyArrayEffect arrayEffect; private boolean doDropIngredients = true; public TileAlchemyArray() @@ -192,4 +198,11 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche { this.rotation = rotation; } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getRenderBoundingBox() + { + return Block.FULL_BLOCK_AABB.offset(getPos()); + } } From c7af09a4589d35a20e1af42e86840b921da9c725 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 11 Mar 2018 12:48:49 -0700 Subject: [PATCH 238/595] Fixed Master Blood Orb cost (#1248) This has been wrong for almost 2 years now. Neat. --- .../WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index dc591305..9a75d798 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -78,7 +78,7 @@ public class RegistrarBloodMagicRecipes { 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(), 25000, 30, 50); + 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); From 46389368ecc980275e5805064321a1ffd637763f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 12 Mar 2018 16:20:32 -0700 Subject: [PATCH 239/595] Fix default potion flask recipe --- .../WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java | 1 + .../WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index cf027782..0f183c45 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -90,6 +90,7 @@ public class BloodMagicJEIPlugin implements IModPlugin { public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.UPGRADE_TOME); subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.BLOOD_ORB); + subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.POTION_FLASK); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 9a75d798..7a5f5dfb 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -16,9 +16,11 @@ import WayofTime.bloodmagic.util.PluginUtil; import com.google.common.collect.Sets; import net.minecraft.init.Blocks; import net.minecraft.init.Items; +import net.minecraft.init.PotionTypes; 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; @@ -120,7 +122,7 @@ public class RegistrarBloodMagicRecipes { 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, new ItemStack(Items.POTIONITEM), "cropNetherWart", "dustRedstone", "dustGlowstone"); + registrar.addAlchemyTable(new ItemStack(RegistrarBloodMagicItems.POTION_FLASK), 1000, 200, 2, PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.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"); From 924dc7b38d54c013d08d676ea2503f1fa8dffc5e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 13 Mar 2018 23:10:13 -0700 Subject: [PATCH 240/595] Fix server crash when handling dye recipes (#1250) --- .../AlchemyTableDyeableRecipe.java | 3 ++- .../java/WayofTime/bloodmagic/util/Utils.java | 24 +++++++++++++++---- .../util/handler/event/CraftingHandler.java | 3 ++- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index 9182aad7..93c0feb9 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.recipe.alchemyTable; import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.util.Utils; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; @@ -76,7 +77,7 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe { outputStack.setTagCompound(new NBTTagCompound()); } - outputStack.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(dyeColor.getColorValue())); + outputStack.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(Utils.DYE_COLOR_VALUES.getOrDefault(dyeColor, 0))); return outputStack; } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 33fbff01..3e6fecc0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -8,6 +8,7 @@ import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; import WayofTime.bloodmagic.tile.TileInventory; import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; import net.minecraft.block.Block; import net.minecraft.block.BlockLiquid; import net.minecraft.block.BlockPortal; @@ -23,6 +24,7 @@ import net.minecraft.init.MobEffects; import net.minecraft.init.SoundEvents; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.EnumDyeColor; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; @@ -39,6 +41,7 @@ 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.relauncher.ReflectionHelper; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; @@ -47,12 +50,25 @@ import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; import net.minecraftforge.items.wrapper.SidedInvWrapper; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.UUID; +import java.lang.reflect.Field; +import java.util.*; public class Utils { + + public static final EnumMap DYE_COLOR_VALUES = Maps.newEnumMap(EnumDyeColor.class); + + static { + try { + Field colorValue = ReflectionHelper.findField(EnumDyeColor.class, "field_193351_w", "colorValue"); + colorValue.setAccessible(true); + for (EnumDyeColor color : EnumDyeColor.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(EntityLivingBase entity, float added, int maximum, int duration) { float currentAmount = entity.getAbsorptionAmount(); added = Math.min(maximum - currentAmount, added); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java index c1456262..4d97a8d4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -6,6 +6,7 @@ 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; @@ -86,7 +87,7 @@ public class CraftingHandler { ItemStack output = event.getLeft().copy(); if (!output.hasTagCompound()) output.setTagCompound(new NBTTagCompound()); - output.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(dyeColor.getColorValue())); + output.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(Utils.DYE_COLOR_VALUES.getOrDefault(dyeColor, 0))); event.setCost(1); event.setOutput(output); From 77e5beb9e185f45f79b6e6655a39cd1f90e3b9f6 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Mar 2018 17:18:20 -0700 Subject: [PATCH 241/595] Fully remove old LogHelper usage --- .../java/WayofTime/bloodmagic/BloodMagic.java | 2 -- .../AlchemyArrayEffectLaputa.java | 3 -- .../TurretAlchemyCircleRenderer.java | 5 --- .../compress/StorageBlockCraftingManager.java | 4 +-- .../meteor/MeteorConfigHandler.java | 4 +-- .../bloodmagic/proxy/ClientProxy.java | 6 ++-- .../bloodmagic/registry/ModRecipes.java | 4 +-- .../bloodmagic/tile/TileAlchemyArray.java | 2 -- .../bloodmagic/util/PleaseStopUsingMe.java | 3 -- .../util/handler/event/ClientHandler.java | 9 ++--- .../bloodmagic/util/helper/LogHelper.java | 36 ------------------- 11 files changed, 14 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/LogHelper.java diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 4581753c..630607c9 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -4,7 +4,6 @@ import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.ritual.RitualRegistry; -import WayofTime.bloodmagic.util.helper.LogHelper; import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; @@ -65,7 +64,6 @@ public class BloodMagic { FluidRegistry.enableUniversalBucket(); } - public LogHelper logger = new LogHelper(MODID); private File configDir; @Mod.EventHandler diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java index cdb1e14e..d3701692 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java @@ -2,11 +2,8 @@ package WayofTime.bloodmagic.alchemyArray; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java index 66039503..967b4638 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java @@ -1,19 +1,14 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import java.util.List; - 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.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec2f; import net.minecraft.world.World; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectArrowTurret; diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 4dd1822c..19e06bb4 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.compress; -import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.util.BMLog; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; @@ -19,7 +19,7 @@ public class StorageBlockCraftingManager { public void addStorageBlockRecipes() { // this.recipes = new StorageBlockCraftingRecipeAssimilator().getPackingRecipes(); - BloodMagic.instance.logger.info("Total number of compression recipes: " + this.recipes.size()); + BMLog.DEBUG.info("Total number of compression recipes: " + this.recipes.size()); } public ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world) { diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index c608e061..c6e1b65c 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.meteor; -import WayofTime.bloodmagic.BloodMagic; 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; @@ -29,7 +29,7 @@ public class MeteorConfigHandler { public static void handleMeteors(boolean checkNewVersion) { if (meteorDir == null) { - BloodMagic.instance.logger.error("Attempted to handle meteor config but the folder has not been initialized. Was this run too early?"); + BMLog.DEFAULT.error("Attempted to handle meteor config but the folder has not been initialized. Was this run too early?"); return; } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index d24ce3b8..1f8ff251 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -16,6 +16,7 @@ import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; 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; @@ -117,10 +118,9 @@ public class ClientProxy extends CommonProxy { Map skinMap = ObfuscationReflectionHelper.getPrivateValue(RenderManager.class, renderManager, "skinMap", "field_178636_l"); skinMap.get("default").addLayer(new LayerBloodElytra(skinMap.get("default"))); skinMap.get("slim").addLayer(new LayerBloodElytra(skinMap.get("slim"))); - BloodMagic.instance.logger.info("Elytra layer added"); + BMLog.DEBUG.info("Elytra layer added"); } catch (Exception e) { - BloodMagic.instance.logger.error("Failed to set custom Elytra Layer for Elytra Living Armour Upgrade."); - BloodMagic.instance.logger.error(e.getLocalizedMessage()); + BMLog.DEBUG.error("Failed to set custom Elytra Layer for Elytra Living Armour Upgrade: {}", e.getMessage()); } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 14386ee5..f8375a0e 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import WayofTime.bloodmagic.util.BMLog; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.init.MobEffects; @@ -19,7 +20,6 @@ import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectArrowTurret; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectAttractor; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; @@ -140,7 +140,7 @@ public class ModRecipes CompressionRegistry.registerItemThreshold(new ItemStack(Blocks.COBBLESTONE), 64); stopwatch.stop(); - BloodMagic.instance.logger.info("Added compression recipes in {}", stopwatch); + BMLog.DEBUG.info("Added compression recipes in {}", stopwatch); } public static void addAlchemyTableRecipes() diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 1a02cbd2..a8f0ff7c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -4,11 +4,9 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; diff --git a/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java b/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java index 072d7986..368bd44e 100644 --- a/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java +++ b/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.util; -import WayofTime.bloodmagic.util.helper.LogHelper; import net.minecraft.util.DamageSource; /** @@ -13,7 +12,5 @@ import net.minecraft.util.DamageSource; public class PleaseStopUsingMe { public static boolean loggingEnabled; - public static LogHelper logger = new LogHelper("BloodMagic|API"); - public static DamageSource damageSource = new DamageSourceBloodMagic(); } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 472ed94f..ebc027cd 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -2,6 +2,7 @@ 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.RitualRegistry; import WayofTime.bloodmagic.ritual.Ritual; @@ -211,10 +212,10 @@ public class ClientHandler { missingVariants.removeAll(missing); if (errored.size() > 0) - BloodMagic.instance.logger.info("Suppressed {} model errors from Blood Magic.", errored.size()); + BMLog.DEBUG.info("Suppressed {} model errors from Blood Magic.", errored.size()); if (missing.size() > 0) - BloodMagic.instance.logger.info("Suppressed {} variant errors from Blood Magic.", missing.size()); - BloodMagic.instance.logger.debug("Suppressed discovered model/variant errors in {}", stopwatch.stop()); + 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. @@ -247,7 +248,7 @@ public class ClientHandler { missingTextures.keySet().remove(mc); badTextureDomains.remove(mc); } - BloodMagic.instance.logger.debug("Suppressed required texture errors in {}", stopwatch.stop()); + BMLog.DEBUG.info("Suppressed required texture errors in {}", stopwatch.stop()); } private static void renderRitualStones(EntityPlayerSP player, float partialTicks) { diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/LogHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/LogHelper.java deleted file mode 100644 index 3876068e..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/LogHelper.java +++ /dev/null @@ -1,36 +0,0 @@ -package WayofTime.bloodmagic.util.helper; - -import WayofTime.bloodmagic.util.PleaseStopUsingMe; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class LogHelper { - private Logger logger; - - public LogHelper(String logger) { - this.logger = LogManager.getLogger(logger); - } - - public void info(String info, Object... format) { - if (PleaseStopUsingMe.loggingEnabled) - logger.info(info, format); - } - - public void error(String error, Object... format) { - if (PleaseStopUsingMe.loggingEnabled) - logger.error(error, format); - } - - public void debug(String debug, Object... format) { - if (PleaseStopUsingMe.loggingEnabled) - logger.debug(debug, format); - } - - public void fatal(String fatal, Object... format) { - logger.error(fatal, format); - } - - public Logger getLogger() { - return logger; - } -} From f535e331dd0a5811e2a6507339888f7e89983600 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 17 Mar 2018 22:30:14 -0700 Subject: [PATCH 242/595] Removed all usages of PleaseStopUsingMe --- .../AlchemyArrayEffectFurnaceFuel.java | 4 ++-- .../bloodmagic/core/data/SoulNetwork.java | 6 +++--- .../bloodmagic/item/ItemDaggerOfSacrifice.java | 4 ++-- .../bloodmagic/item/ItemSacrificialDagger.java | 6 +++--- .../item/sigil/ItemSigilFastMiner.java | 4 ++-- .../bloodmagic/potion/BMPotionUtils.java | 4 ++-- .../bloodmagic/ritual/types/RitualLava.java | 4 ++-- .../ritual/types/RitualRegeneration.java | 4 ++-- .../bloodmagic/util/DamageSourceBloodMagic.java | 3 +++ .../bloodmagic/util/PleaseStopUsingMe.java | 16 ---------------- 10 files changed, 21 insertions(+), 34 deletions(-) delete mode 100644 src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java index 145b6143..b9f2f51b 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.alchemyArray; import java.util.List; +import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import net.minecraft.block.Block; import net.minecraft.block.BlockFurnace; import net.minecraft.entity.player.EntityPlayer; @@ -15,7 +16,6 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect { @@ -67,7 +67,7 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect if (!sacrifice.capabilities.isCreativeMode) { sacrifice.hurtResistantTime = 0; - sacrifice.attackEntityFrom(PleaseStopUsingMe.damageSource, 1.0F); //No. + sacrifice.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); //No. } } } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index a9ec1ff2..046c6b61 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.core.data; import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.event.AddToNetworkEvent; import WayofTime.bloodmagic.event.SoulNetworkEvent; import WayofTime.bloodmagic.util.helper.PlayerHelper; @@ -113,14 +113,14 @@ public class SoulNetwork implements INBTSerializable { if (syphon < 100 && syphon > 0) { if (!user.capabilities.isCreativeMode) { user.hurtResistantTime = 0; - user.attackEntityFrom(PleaseStopUsingMe.damageSource, 1.0F); + user.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); } } else if (syphon >= 100) { if (!user.capabilities.isCreativeMode) { for (int i = 0; i < ((syphon + 99) / 100); i++) { user.hurtResistantTime = 0; - user.attackEntityFrom(PleaseStopUsingMe.damageSource, 1.0F); + user.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index 3b5203a9..c3b3ecfd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.util.helper.PurificationHelper; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -71,7 +71,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { 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(PleaseStopUsingMe.damageSource); + target.onDeath(DamageSourceBloodMagic.INSTANCE); } return false; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 11a6381d..6dc81125 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -7,7 +7,7 @@ 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.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; @@ -97,10 +97,10 @@ public class ItemSacrificialDagger extends ItemEnum 0) { - entity.attackEntityFrom(PleaseStopUsingMe.damageSource, (float) incurredDamage); + entity.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, (float) incurredDamage); } return incurredDamage; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index 56e32be6..d81a2ace 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; @@ -198,7 +198,7 @@ public class RitualLava extends Ritual { } if (!entity.isDead && entity.hurtTime <= 0 && Utils.isImmuneToFireDamage(entity)) { - if (entity.attackEntityFrom(PleaseStopUsingMe.damageSource, damage)) { + if (entity.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, damage)) { corrosiveDrained += corrosiveWillDrain; corrosiveWill -= corrosiveWillDrain; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java index 78e145ba..f480edc7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.PleaseStopUsingMe; +import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; @@ -92,7 +92,7 @@ public class RitualRegeneration extends Ritual { float currentHealth = damagedEntity.getHealth(); - damagedEntity.attackEntityFrom(PleaseStopUsingMe.damageSource, Math.min(player.getMaxHealth() - player.getHealth(), syphonedHealthAmount)); + damagedEntity.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, Math.min(player.getMaxHealth() - player.getHealth(), syphonedHealthAmount)); float healthDifference = currentHealth - damagedEntity.getHealth(); if (healthDifference > 0) { diff --git a/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java index 303bea5a..28a29658 100644 --- a/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java @@ -7,6 +7,9 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; public class DamageSourceBloodMagic extends DamageSource { + + public static final DamageSourceBloodMagic INSTANCE = new DamageSourceBloodMagic(); + public DamageSourceBloodMagic() { super("bloodMagic"); diff --git a/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java b/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java deleted file mode 100644 index 368bd44e..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/PleaseStopUsingMe.java +++ /dev/null @@ -1,16 +0,0 @@ -package WayofTime.bloodmagic.util; - -import net.minecraft.util.DamageSource; - -/** - * The primary API class. Includes helper methods and blacklists. - *

        - * Some API methods can be used via IMC instead. The supported methods are: - */ -// TODO - Nuke this class -@Deprecated -public class PleaseStopUsingMe { - public static boolean loggingEnabled; - - public static DamageSource damageSource = new DamageSourceBloodMagic(); -} From dd6b5bd3b513000a1ad51c1344338e4062ae00f8 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 23 Mar 2018 11:02:43 -0400 Subject: [PATCH 243/595] Added an example item whose variants use the same textures but different colours for the layers. --- .../core/RegistrarBloodMagicItems.java | 30 +++++--- .../bloodmagic/item/ItemEnumColour.java | 67 ++++++++++++++++++ .../bloodmagic/item/types/AlchemicTypes.java | 59 +++++++++++++++ .../bloodmagic/proxy/ClientProxy.java | 57 +++++++++++---- .../ritual/types/RitualEllipsoid.java | 3 +- .../bloodmagic/blockstates/alchemic_vial.json | 18 +++++ .../textures/items/alchemic_liquid.png | Bin 0 -> 222 bytes .../textures/items/alchemic_ribbon.png | Bin 0 -> 200 bytes .../textures/items/alchemic_vial.png | Bin 0 -> 248 bytes 9 files changed, 209 insertions(+), 25 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemEnumColour.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/types/AlchemicTypes.java create mode 100644 src/main/resources/assets/bloodmagic/blockstates/alchemic_vial.json create mode 100644 src/main/resources/assets/bloodmagic/textures/items/alchemic_liquid.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/alchemic_ribbon.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/alchemic_vial.png diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 4afa594e..e7085209 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -16,10 +16,13 @@ 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.types.AlchemicTypes; 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.block.model.ModelResourceLocation; @@ -43,7 +46,8 @@ import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @SuppressWarnings("unchecked") -public class RegistrarBloodMagicItems { +public class RegistrarBloodMagicItems +{ public static final Item BLOOD_ORB = Items.AIR; public static final Item ACTIVATION_CRYSTAL = Items.AIR; @@ -117,6 +121,7 @@ public class RegistrarBloodMagicItems { 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 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); @@ -124,10 +129,12 @@ public class RegistrarBloodMagicItems { public static List items; @SubscribeEvent - public static void registerItems(RegistryEvent.Register event) { + public static void registerItems(RegistryEvent.Register event) + { items = Lists.newArrayList(); - RegistrarBloodMagicBlocks.blocks.stream().filter(block -> block instanceof IBMBlock && ((IBMBlock) block).getItem() != null).forEach(block -> { + 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())); }); @@ -204,23 +211,27 @@ public class RegistrarBloodMagicItems { new ItemSanguineBook().setRegistryName("sanguine_book"), new ItemLivingArmourPointsUpgrade().setRegistryName("points_upgrade"), new ItemDemonWillGauge().setRegistryName("demon_will_gauge"), - new ItemPotionFlask().setRegistryName("potion_flask") - )); + new ItemPotionFlask().setRegistryName("potion_flask"), + new ItemEnumColour.Variant<>(AlchemicTypes.class, "alchemicVial").setRegistryName("alchemic_vial") + )); 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 -> { + 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 -> { + items.stream().filter(i -> i instanceof IMeshProvider).forEach(i -> + { IMeshProvider mesh = (IMeshProvider) i; ResourceLocation loc = mesh.getCustomLocation(); if (loc == null) @@ -234,7 +245,8 @@ public class RegistrarBloodMagicItems { ModelLoader.setCustomMeshDefinition(i, mesh.getMeshDefinition()); }); - RegistrarBloodMagicBlocks.blocks.stream().filter(b -> b instanceof IVariantProvider).forEach(b -> { + RegistrarBloodMagicBlocks.blocks.stream().filter(b -> b instanceof IVariantProvider).forEach(b -> + { Int2ObjectMap variants = new Int2ObjectOpenHashMap<>(); ((IVariantProvider) b).gatherVariants(variants); for (Int2ObjectMap.Entry variant : variants.int2ObjectEntrySet()) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnumColour.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnumColour.java new file mode 100644 index 00000000..bb99c6a9 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/ItemEnumColour.java @@ -0,0 +1,67 @@ +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.creativetab.CreativeTabs; +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 ItemEnumColour & ISubItem> extends Item +{ + //Copy of @ItemEnum, except all variants use the same textures with different colouring + protected final T[] types; + + public ItemEnumColour(Class enumClass, String baseName) + { + super(); + + this.types = enumClass.getEnumConstants(); + + setUnlocalizedName(BloodMagic.MODID + "." + baseName); + setHasSubtypes(types.length > 1); + setCreativeTab(BloodMagic.TAB_BM); + } + + @Override + public String getUnlocalizedName(ItemStack stack) + { + return super.getUnlocalizedName(stack) + "." + getItemType(stack).getInternalName(); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(CreativeTabs 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)]; + } + + public static class Variant & ISubItem> extends ItemEnum implements IVariantProvider + { + + public Variant(Class enumClass, String baseName) + { + super(enumClass, baseName); + } + + @Override + public void gatherVariants(Int2ObjectMap variants) + { + variants.put(0, "type=normal"); + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/types/AlchemicTypes.java b/src/main/java/WayofTime/bloodmagic/item/types/AlchemicTypes.java new file mode 100644 index 00000000..35498ea0 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/types/AlchemicTypes.java @@ -0,0 +1,59 @@ +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 AlchemicTypes implements ISubItem +{ + BASE(0x2e35ff); + + final int potionColour; + + AlchemicTypes(int colour1) + { + potionColour = colour1; + } + + @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.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 >= AlchemicTypes.values().length) + { + return -1; + } + + return AlchemicTypes.values()[variant].getColourForLayer(layer); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 1f8ff251..b6cc9e64 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -13,12 +13,15 @@ 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.AlchemicTypes; 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.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; @@ -37,18 +40,22 @@ import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import java.awt.Color; import java.util.Map; -public class ClientProxy extends CommonProxy { +public class ClientProxy extends CommonProxy +{ public static DemonWillHolder currentAura = new DemonWillHolder(); @Override - public void preInit() { + public void preInit() + { super.preInit(); OBJLoader.INSTANCE.addDomain(BloodMagic.MODID); - ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() { + ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() + { @Override - public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) { + public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) + { chest.handleEvents(time, pastEvents); } }); @@ -66,7 +73,8 @@ public class ClientProxy extends CommonProxy { } @Override - public void registerRenderers() { + public void registerRenderers() + { RenderingRegistry.registerEntityRenderingHandler(EntitySoulSnare.class, new SoulSnareRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntitySentientArrow.class, new SentientArrowRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntityBloodLight.class, new BloodLightRenderFactory()); @@ -82,19 +90,24 @@ public class ClientProxy extends CommonProxy { } @Override - public void init() { + public void init() + { super.init(); - Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> { - try { + Minecraft.getMinecraft().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) { + } catch (NumberFormatException e) + { return -1; } return -1; }, RegistrarBloodMagicItems.SIGIL_HOLDING); - Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> { + Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> + { if (tintIndex != 0 && tintIndex != 2) return -1; @@ -103,29 +116,43 @@ public class ClientProxy extends CommonProxy { return PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromStack(stack)); }, RegistrarBloodMagicItems.POTION_FLASK); + Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> + { +// if (tintIndex != 0 && tintIndex != 2) +// return -1; + + int variant = stack.getMetadata(); + + return AlchemicTypes.getColourForLayer(variant, tintIndex); + }, RegistrarBloodMagicItems.ALCHEMIC_VIAL); addElytraLayer(); } @Override - public void postInit() { + public void postInit() + { Elements.createHUDElements(); } - private void addElytraLayer() { + private void addElytraLayer() + { RenderManager renderManager = Minecraft.getMinecraft().getRenderManager(); - try { + try + { Map skinMap = ObfuscationReflectionHelper.getPrivateValue(RenderManager.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) { + } 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) { + public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) + { return ModelLoaderRegistry.loadASM(location, parameters); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java index 1def76f5..2b454edb 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -215,7 +215,8 @@ public class RitualEllipsoid extends Ritual // } @Override - public void gatherComponents(Consumer components) { + public void gatherComponents(Consumer components) + { addCornerRunes(components, 1, 0, EnumRuneType.WATER); addCornerRunes(components, 1, 1, EnumRuneType.WATER); } diff --git a/src/main/resources/assets/bloodmagic/blockstates/alchemic_vial.json b/src/main/resources/assets/bloodmagic/blockstates/alchemic_vial.json new file mode 100644 index 00000000..74f8af30 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/alchemic_vial.json @@ -0,0 +1,18 @@ +{ + "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/textures/items/alchemic_liquid.png b/src/main/resources/assets/bloodmagic/textures/items/alchemic_liquid.png new file mode 100644 index 0000000000000000000000000000000000000000..4930364ff3048c8b16e4e2414a839e6cc50b552c GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(}#5xOlqRR-g!Hfk$L9 z0|U1(2s1Lwnj--eWH0gbb!C6VEG8l)-`p_I0w^S#84^+AoS&PUnpXnkGB7w7r6!i7 zrYMwWmSiZnd-?{X=%um)#hpA|978NlCnrd-x-|a>g5?p#Sy`{@H<_%D-u~|YiZrRL zv^K+_;NbuNe|~OH{Qd1M&*t>=X)4zk)Kd6X&SD3e5m4usS9k8jB#Uf#N!zE{-7^>bP0l+XkKb>A^_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/alchemic_vial.png b/src/main/resources/assets/bloodmagic/textures/items/alchemic_vial.png new file mode 100644 index 0000000000000000000000000000000000000000..3062b21d8f4cfb9411f7463ccca7a95451218cac GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(}+JEQTFn-eEwBv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns||VipsUSHD!TE)Xarn;8;O;+&tGo0?Yw Date: Fri, 23 Mar 2018 13:24:33 -0400 Subject: [PATCH 244/595] *Hopefully* make Nut cry a bit less. --- .../core/RegistrarBloodMagicItems.java | 2 +- .../bloodmagic/item/ItemAlchemicVial.java | 22 ++++++ .../bloodmagic/item/ItemEnumColour.java | 67 ------------------- 3 files changed, 23 insertions(+), 68 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemEnumColour.java diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index e7085209..0d9abfe8 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -212,7 +212,7 @@ public class RegistrarBloodMagicItems new ItemLivingArmourPointsUpgrade().setRegistryName("points_upgrade"), new ItemDemonWillGauge().setRegistryName("demon_will_gauge"), new ItemPotionFlask().setRegistryName("potion_flask"), - new ItemEnumColour.Variant<>(AlchemicTypes.class, "alchemicVial").setRegistryName("alchemic_vial") + new ItemAlchemicVial().setRegistryName("alchemic_vial") )); event.getRegistry().registerAll(items.toArray(new Item[0])); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java b/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java new file mode 100644 index 00000000..520bbcb6 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java @@ -0,0 +1,22 @@ +package WayofTime.bloodmagic.item; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; + +import javax.annotation.Nonnull; + +import WayofTime.bloodmagic.item.types.AlchemicTypes; +import WayofTime.bloodmagic.item.types.ISubItem; + +public class ItemAlchemicVial & ISubItem> extends ItemEnum.Variant +{ + public ItemAlchemicVial() + { + super((Class) AlchemicTypes.class, "alchemic_vial"); + } + + @Override + public void gatherVariants(@Nonnull Int2ObjectMap variants) + { + variants.put(0, "type=normal"); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnumColour.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnumColour.java deleted file mode 100644 index bb99c6a9..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemEnumColour.java +++ /dev/null @@ -1,67 +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.creativetab.CreativeTabs; -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 ItemEnumColour & ISubItem> extends Item -{ - //Copy of @ItemEnum, except all variants use the same textures with different colouring - protected final T[] types; - - public ItemEnumColour(Class enumClass, String baseName) - { - super(); - - this.types = enumClass.getEnumConstants(); - - setUnlocalizedName(BloodMagic.MODID + "." + baseName); - setHasSubtypes(types.length > 1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public String getUnlocalizedName(ItemStack stack) - { - return super.getUnlocalizedName(stack) + "." + getItemType(stack).getInternalName(); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs 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)]; - } - - public static class Variant & ISubItem> extends ItemEnum implements IVariantProvider - { - - public Variant(Class enumClass, String baseName) - { - super(enumClass, baseName); - } - - @Override - public void gatherVariants(Int2ObjectMap variants) - { - variants.put(0, "type=normal"); - } - } -} From cdfc77be036d1fba7a7dd2161819c23a4d96c4b6 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 23 Mar 2018 16:18:16 -0700 Subject: [PATCH 245/595] Cleanup ritual events (#1256) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also actually fire the imperfect one ¬_¬ --- .../block/BlockRitualController.java | 11 ++- .../bloodmagic/event/RitualEvent.java | 67 +++++++++++++++---- .../tile/TileMasterRitualStone.java | 6 +- 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index 756dea87..e1c71e8f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -1,7 +1,9 @@ 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.imperfect.ImperfectRitualRegistry; import WayofTime.bloodmagic.ritual.RitualRegistry; import WayofTime.bloodmagic.ritual.Ritual; @@ -26,6 +28,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.Explosion; import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; import javax.annotation.Nullable; @@ -66,9 +69,13 @@ public class BlockRitualController extends BlockEnum imple } } } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) { - IBlockState ritualBlock = world.getBlockState(pos.up()); - return ((TileImperfectRitualStone) tile).performRitual(world, pos, ImperfectRitualRegistry.getRitualForBlock(ritualBlock), player); + ImperfectRitual ritual = ImperfectRitualRegistry.getRitualForBlock(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; diff --git a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java index a76ceb7d..08d94f85 100644 --- a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java @@ -13,9 +13,10 @@ import net.minecraftforge.fml.common.eventhandler.Event; import java.util.UUID; public class RitualEvent extends Event { - public final IMasterRitualStone mrs; - public final UUID ownerId; - public final Ritual ritual; + + private final IMasterRitualStone mrs; + private final UUID ownerId; + private final Ritual ritual; private RitualEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual) { this.mrs = mrs; @@ -23,6 +24,18 @@ public class RitualEvent extends Event { 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. @@ -31,9 +44,10 @@ public class RitualEvent extends Event { */ @Cancelable public static class RitualActivatedEvent extends RitualEvent { - public final EntityPlayer player; - public final ItemStack crystalStack; - public int crystalTier; + + private final EntityPlayer player; + private final ItemStack crystalStack; + private final int crystalTier; public RitualActivatedEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual, EntityPlayer player, ItemStack activationCrystal, int crystalTier) { super(mrs, ownerId, ritual); @@ -42,6 +56,18 @@ public class RitualEvent extends Event { this.crystalStack = activationCrystal; this.crystalTier = crystalTier; } + + public EntityPlayer getPlayer() { + return player; + } + + public ItemStack getCrystalStack() { + return crystalStack; + } + + public int getCrystalTier() { + return crystalTier; + } } /** @@ -52,6 +78,7 @@ public class RitualEvent extends Event { */ @Cancelable public static class RitualRunEvent extends RitualEvent { + public RitualRunEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual) { super(mrs, ownerId, ritual); } @@ -65,26 +92,42 @@ public class RitualEvent extends Event { */ public static class RitualStopEvent extends RitualEvent { - public final Ritual.BreakType method; + 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 { - public final IImperfectRitualStone ims; - public final UUID ownerId; - public final ImperfectRitual imperfectRitual; + private final IImperfectRitualStone ims; + private final EntityPlayer activator; + private final ImperfectRitual imperfectRitual; - public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, UUID ownerId, ImperfectRitual imperfectRitual) { + public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, EntityPlayer activator, ImperfectRitual imperfectRitual) { this.ims = ims; - this.ownerId = ownerId; + this.activator = activator; this.imperfectRitual = imperfectRitual; } + + public IImperfectRitualStone getRitualStone() { + return ims; + } + + public EntityPlayer getActivator() { + return activator; + } + + public ImperfectRitual getImperfectRitual() { + return imperfectRitual; + } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index fd8fcca1..182b2cf3 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -140,7 +140,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS RitualEvent.RitualActivatedEvent event = new RitualEvent.RitualActivatedEvent(this, binding.getOwnerId(), ritual, activator, activationCrystal, crystalLevel); - if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) { + if (MinecraftForge.EVENT_BUS.post(event)) { if (activator != null) activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.prevent"), true); return false; @@ -181,7 +181,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (RitualHelper.checkValidRitual(getWorld(), getPos(), RitualRegistry.getIdForRitual(currentRitual), getDirection())) { RitualEvent.RitualRunEvent event = new RitualEvent.RitualRunEvent(this, getOwner(), getCurrentRitual()); - if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) + if (MinecraftForge.EVENT_BUS.post(event)) return; getCurrentRitual().performRitual(this); @@ -196,7 +196,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (!getWorld().isRemote && getCurrentRitual() != null) { RitualEvent.RitualStopEvent event = new RitualEvent.RitualStopEvent(this, getOwner(), getCurrentRitual(), breakType); - if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) + if (MinecraftForge.EVENT_BUS.post(event)) return; getCurrentRitual().stopRitual(this, breakType); From 7ec27febc691d5bf660a2931c6b1a7452a49061b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 23 Mar 2018 16:42:18 -0700 Subject: [PATCH 246/595] Apply same model to all alchemic vials --- .../bloodmagic/core/RegistrarBloodMagicItems.java | 1 - .../bloodmagic/item/ItemAlchemicVial.java | 15 ++++++--------- .../{AlchemicTypes.java => AlchemicVialType.java} | 15 ++++----------- .../WayofTime/bloodmagic/proxy/ClientProxy.java | 4 ++-- 4 files changed, 12 insertions(+), 23 deletions(-) rename src/main/java/WayofTime/bloodmagic/item/types/{AlchemicTypes.java => AlchemicVialType.java} (73%) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 0d9abfe8..caa674b9 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -16,7 +16,6 @@ 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.types.AlchemicTypes; import WayofTime.bloodmagic.item.types.ComponentTypes; import WayofTime.bloodmagic.item.types.ShardType; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java b/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java index 520bbcb6..bd75cd4a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java @@ -1,22 +1,19 @@ package WayofTime.bloodmagic.item; +import WayofTime.bloodmagic.item.types.AlchemicVialType; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import javax.annotation.Nonnull; - -import WayofTime.bloodmagic.item.types.AlchemicTypes; -import WayofTime.bloodmagic.item.types.ISubItem; - -public class ItemAlchemicVial & ISubItem> extends ItemEnum.Variant +public class ItemAlchemicVial extends ItemEnum.Variant { public ItemAlchemicVial() { - super((Class) AlchemicTypes.class, "alchemic_vial"); + super(AlchemicVialType.class, "alchemic_vial"); } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) + public void gatherVariants(Int2ObjectMap variants) { - variants.put(0, "type=normal"); + 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/types/AlchemicTypes.java b/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java similarity index 73% rename from src/main/java/WayofTime/bloodmagic/item/types/AlchemicTypes.java rename to src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java index 35498ea0..db637b99 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/AlchemicTypes.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java @@ -6,13 +6,13 @@ import net.minecraft.item.ItemStack; import javax.annotation.Nonnull; import java.util.Locale; -public enum AlchemicTypes implements ISubItem +public enum AlchemicVialType implements ISubItem { BASE(0x2e35ff); final int potionColour; - AlchemicTypes(int colour1) + AlchemicVialType(int colour1) { potionColour = colour1; } @@ -24,13 +24,6 @@ public enum AlchemicTypes implements ISubItem return name().toLowerCase(Locale.ROOT); } - @Nonnull - @Override - public ItemStack getStack() - { - return getStack(1); - } - @Nonnull @Override public ItemStack getStack(int count) @@ -49,11 +42,11 @@ public enum AlchemicTypes implements ISubItem public static int getColourForLayer(int variant, int layer) { - if (variant >= AlchemicTypes.values().length) + if (variant >= AlchemicVialType.values().length) { return -1; } - return AlchemicTypes.values()[variant].getColourForLayer(layer); + return AlchemicVialType.values()[variant].getColourForLayer(layer); } } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index b6cc9e64..87256a18 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -13,7 +13,7 @@ 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.AlchemicTypes; +import WayofTime.bloodmagic.item.types.AlchemicVialType; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.tile.*; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; @@ -123,7 +123,7 @@ public class ClientProxy extends CommonProxy int variant = stack.getMetadata(); - return AlchemicTypes.getColourForLayer(variant, tintIndex); + return AlchemicVialType.getColourForLayer(variant, tintIndex); }, RegistrarBloodMagicItems.ALCHEMIC_VIAL); addElytraLayer(); From 58d9678c40e9d2815bc3d356b37b82586c837d7b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 23 Mar 2018 16:50:17 -0700 Subject: [PATCH 247/595] Switch some more instances of chat spam to the action bar --- .../WayofTime/bloodmagic/item/ItemAltarMaker.java | 14 +++++++------- .../bloodmagic/item/ItemRitualDiviner.java | 2 +- .../bloodmagic/item/ItemRitualReader.java | 2 +- .../bloodmagic/item/ItemSanguineBook.java | 3 ++- .../util/handler/event/GenericHandler.java | 3 ++- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index b299b030..e1da3b10 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -5,7 +5,6 @@ import WayofTime.bloodmagic.altar.*; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.block.BlockAltar; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.util.helper.NumeralHelper; @@ -21,6 +20,7 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -54,7 +54,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP return super.onItemRightClick(world, player, hand); if (!player.capabilities.isCreativeMode) { - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.creativeOnly")); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.altarMaker.creativeOnly"), true); return super.onItemRightClick(world, player, hand); } @@ -67,18 +67,18 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP 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)]); - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); + player.sendStatusMessage(new TextComponentTranslation("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.MISS || rayTrace.typeOfHit == RayTraceResult.Type.ENTITY) + if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) return super.onItemRightClick(world, player, hand); - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK && world.getBlockState(rayTrace.getBlockPos()).getBlock() instanceof BlockAltar) { - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.building", NumeralHelper.toRoman(tierToBuild.toInt()))); + IBlockState state = world.getBlockState(rayTrace.getBlockPos()); + if (state.getBlock() instanceof BlockAltar) { + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.altarMaker.building", NumeralHelper.toRoman(tierToBuild.toInt())), true); buildAltar(world, rayTrace.getBlockPos()); - IBlockState state = world.getBlockState(rayTrace.getBlockPos()); world.notifyBlockUpdate(rayTrace.getBlockPos(), state, state, 3); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index 1de11784..e55a482d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -366,7 +366,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } public void notifyDirectionChange(EnumFacing direction, EntityPlayer player) { - ChatUtil.sendNoSpam(player, TextHelper.localize(tooltipBase + "currentDirection", Utils.toFancyCasing(direction.getName()))); + player.sendStatusMessage(new TextComponentTranslation(tooltipBase + "currentDirection", Utils.toFancyCasing(direction.name())), true); } public void setDirection(ItemStack stack, EnumFacing direction) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 9cc9c6df..cdabfa3a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -136,7 +136,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { BlockPos containedPos = getBlockPos(stack); if (containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, pos.subtract(masterPos)); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.firstBlock")); + player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.firstBlock"), true); //TODO: Notify player. } else { tile = world.getTileEntity(masterPos); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index ec2457d6..ca2d37f9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -25,6 +25,7 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -79,7 +80,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa 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)]; - ChatUtil.sendNoSpam(player, TextHelper.localizeEffect("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1))); + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)), true); return super.onItemRightClick(world, player, hand); } 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 8ba5b079..0dff68cc 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -59,6 +59,7 @@ 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.TextComponentTranslation; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -298,7 +299,7 @@ public class GenericHandler { Block block = state.getBlock(); if (block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && !event.getEntityPlayer().getHeldItemMainhand().isEmpty() && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) { ItemAltarMaker altarMaker = (ItemAltarMaker) event.getEntityPlayer().getHeldItemMainhand().getItem(); - ChatUtil.sendNoSpam(event.getEntityPlayer(), TextHelper.localizeEffect("chat.bloodmagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer()))); + event.getEntityPlayer().sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer())), true); } } From 8dce5927879cc42d2034e6da17acad3337b8ffeb Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 23 Mar 2018 17:12:32 -0700 Subject: [PATCH 248/595] Fix out of bounds on invalid enum items --- src/main/java/WayofTime/bloodmagic/item/ItemEnum.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java index e949e446..0fed5b36 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java @@ -42,7 +42,7 @@ public class ItemEnum & ISubItem> extends Item { } public T getItemType(ItemStack stack) { - return types[MathHelper.clamp(stack.getItemDamage(), 0, types.length)]; + return types[MathHelper.clamp(stack.getItemDamage(), 0, types.length - 1)]; } public static class Variant & ISubItem> extends ItemEnum implements IVariantProvider { From 6e7b387e6ad1b945152c7652c4862463c7edf3ab Mon Sep 17 00:00:00 2001 From: WayofTime Date: Thu, 29 Mar 2018 16:05:56 -0400 Subject: [PATCH 249/595] Added additional effects to the Sentient Bow when aspected to different Will types. --- changelog.txt | 1 + .../projectile/EntitySentientArrow.java | 113 +++++++-- .../bloodmagic/item/soul/ItemSentientBow.java | 228 +++++++++++------- 3 files changed, 245 insertions(+), 97 deletions(-) diff --git a/changelog.txt b/changelog.txt index e27942ad..4716494f 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,7 @@ Version 2.2.8 - Added a new (slightly WIP?) array, 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. - 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. ------------------------------------------------------ Version 2.2.7 diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index b4950f64..1e91024e 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -1,41 +1,59 @@ package WayofTime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; +import java.util.Locale; + import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityTippedArrow; import net.minecraft.init.Items; +import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; +import WayofTime.bloodmagic.util.Constants; -import java.util.Locale; - -public class EntitySentientArrow extends EntityTippedArrow { +public class EntitySentientArrow extends EntityTippedArrow +{ public double reimbursedAmountOnHit = 0; public EnumDemonWillType type = EnumDemonWillType.DEFAULT; + public int currentLevel = 0; + 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 EntitySentientArrow(World worldIn) { + public EntitySentientArrow(World worldIn) + { super(worldIn); } - public EntitySentientArrow(World worldIn, double x, double y, double z) { + public EntitySentientArrow(World worldIn, double x, double y, double z) + { super(worldIn, x, y, z); } - public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reinburseAmount) { + public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reinburseAmount, int currentLevel) + { super(worldIn, shooter); this.reimbursedAmountOnHit = reinburseAmount; this.type = type; + this.currentLevel = currentLevel; } - public void reimbursePlayer(EntityLivingBase hitEntity, float damage) { - if (this.shootingEntity instanceof EntityPlayer) { - if (hitEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) { + public void reimbursePlayer(EntityLivingBase hitEntity, float damage) + { + if (this.shootingEntity instanceof EntityPlayer) + { + if (hitEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) + { return; } @@ -44,23 +62,88 @@ public class EntitySentientArrow extends EntityTippedArrow { } @Override - public void writeEntityToNBT(NBTTagCompound tag) { + protected void arrowHit(EntityLivingBase living) + { + super.arrowHit(living); + + switch (type) + { + case CORROSIVE: + living.addPotionEffect(new PotionEffect(MobEffects.POISON, currentLevel >= 0 ? poisonDuration[currentLevel] : 0, currentLevel >= 0 ? poisonLevel[currentLevel] : 0)); + break; + case DEFAULT: + break; + case DESTRUCTIVE: + this.world.createExplosion(this, this.posX, this.posY, this.posZ, currentLevel >= 0 ? destructiveExplosionRadius[currentLevel] : 0, false); + break; + case STEADFAST: + living.addPotionEffect(new PotionEffect(MobEffects.LEVITATION, currentLevel >= 0 ? levitationDuration[currentLevel] : 0, currentLevel >= 0 ? levitationLevel[currentLevel] : 0)); + break; + case VENGEFUL: + living.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, currentLevel >= 0 ? slownessDuration[currentLevel] : 0, currentLevel >= 0 ? slownessLevel[currentLevel] : 0)); + break; + default: + break; + } + } + + @Override + public void onUpdate() + { + super.onUpdate(); + + if (!this.world.isRemote && this.inGround && this.timeInGround > 0) + { + switch (type) + { + case DESTRUCTIVE: + this.world.createExplosion(this, this.posX, this.posY, this.posZ, currentLevel >= 0 ? destructiveExplosionRadius[currentLevel] : 0, false); + this.setDead(); + break; + case CORROSIVE: + break; + case DEFAULT: + break; + case STEADFAST: + break; + case VENGEFUL: + break; + default: + break; + } + } +// else if (this.inGround && this.timeInGround != 0 && !this.customPotionEffects.isEmpty() && this.timeInGround >= 600) +// { +// this.world.setEntityState(this, (byte)0); +// this.potion = PotionTypes.EMPTY; +// this.customPotionEffects.clear(); +// this.dataManager.set(COLOR, Integer.valueOf(-1)); +// } + } + + @Override + public void writeEntityToNBT(NBTTagCompound tag) + { super.writeEntityToNBT(tag); tag.setDouble("reimbursement", reimbursedAmountOnHit); + tag.setInteger("currentLevel", currentLevel); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } @Override - public void readEntityFromNBT(NBTTagCompound tag) { + public void readEntityFromNBT(NBTTagCompound tag) + { super.readEntityFromNBT(tag); reimbursedAmountOnHit = tag.getDouble("reimbursement"); type = EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); + currentLevel = tag.getInteger("currentLevel"); } @Override - protected ItemStack getArrowStack() { + protected ItemStack getArrowStack() + { return new ItemStack(Items.ARROW); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index b4b104bc..70e48450 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -40,56 +40,68 @@ import java.util.Locale; public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentientTool, IVariantProvider//, IMeshProvider { - public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; - public static double[] defaultDamageAdded = new double[]{0.25, 0.5, 0.75, 1, 1.25}; - public static float[] velocityAdded = new float[]{0.25f, 0.5f, 0.75f, 1, 1.25f}; - public static double[] soulDrainPerSwing = new double[]{0.05, 0.1, 0.2, 0.4, 0.75}; //TODO - public static double[] soulDrop = new double[]{2, 4, 7, 10, 13}; - public static double[] staticDrop = new double[]{1, 1, 2, 3, 3}; + 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 ItemSentientBow() { + public ItemSentientBow() + { super(); setUnlocalizedName(BloodMagic.MODID + ".sentientBow"); setCreativeTab(BloodMagic.TAB_BM); - this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() { + this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() + { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { - if (entityIn == null) { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) + { + if (entityIn == null) + { return 0.0F; - } else { + } 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() { + this.addPropertyOverride(new ResourceLocation("pulling"), new IItemPropertyGetter() + { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) + { return entityIn != null && entityIn.isHandActive() && entityIn.getActiveItemStack() == stack ? 1.0F : 0.0F; } }); - this.addPropertyOverride(new ResourceLocation("type"), new IItemPropertyGetter() { + this.addPropertyOverride(new ResourceLocation("type"), new IItemPropertyGetter() + { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) + { return ((ItemSentientBow) RegistrarBloodMagicItems.SENTIENT_BOW).getCurrentType(stack).ordinal(); } }); } @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { + 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, EntityPlayer player) { + public void recalculatePowers(ItemStack stack, World world, EntityPlayer 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) { + public void recalculatePowers(ItemStack stack, EnumDemonWillType type, double will) + { this.setCurrentType(stack, will > 0 ? type : EnumDemonWillType.DEFAULT); - int level = getLevel(stack, will); + int level = getLevel(will); // double drain = level >= 0 ? soulDrainPerSwing[level] : 0; @@ -108,10 +120,13 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien setDamageAdded(stack, level >= 0 ? getDamageModifier(type, level) : 0); } - private int getLevel(ItemStack stack, double soulsRemaining) { + private int getLevel(double soulsRemaining) + { int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) { - if (soulsRemaining >= soulBracket[i]) { + for (int i = 0; i < soulBracket.length; i++) + { + if (soulsRemaining >= soulBracket[i]) + { lvl = i; } } @@ -120,42 +135,49 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public EnumDemonWillType getCurrentType(ItemStack stack) { + public EnumDemonWillType getCurrentType(ItemStack stack) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { + 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]; + 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 float getVelocityModifier(EnumDemonWillType type, int willBracket) + { + switch (type) + { + case VENGEFUL: + return velocityAdded[willBracket]; + default: + return 0; } } - public void setDamageAdded(ItemStack stack, double damage) { + public void setDamageAdded(ItemStack stack, double damage) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -163,7 +185,8 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble("damage", damage); } - public double getDamageAdded(ItemStack stack) { + public double getDamageAdded(ItemStack stack) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -171,7 +194,8 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien return tag.getDouble("damage"); } - public void setVelocityOfArrow(ItemStack stack, float velocity) { + public void setVelocityOfArrow(ItemStack stack, float velocity) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -179,19 +203,22 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setFloat("velocity", velocity); } - public float getVelocityOfArrow(ItemStack stack) { + public float getVelocityOfArrow(ItemStack stack) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (tag.hasKey("velocity")) { + if (tag.hasKey("velocity")) + { return tag.getFloat("velocity"); } return 3; } - public void setCurrentType(ItemStack stack, EnumDemonWillType type) { + public void setCurrentType(ItemStack stack, EnumDemonWillType type) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -199,14 +226,16 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } - public double getDrainOfActivatedBow(ItemStack stack) { + public double getDrainOfActivatedBow(ItemStack stack) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } - public void setDrainOfActivatedBow(ItemStack stack, double drain) { + public void setDrainOfActivatedBow(ItemStack stack, double drain) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -214,14 +243,16 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } - public double getStaticDropOfActivatedBow(ItemStack stack) { + public double getStaticDropOfActivatedBow(ItemStack stack) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } - public void setStaticDropOfActivatedBow(ItemStack stack, double drop) { + public void setStaticDropOfActivatedBow(ItemStack stack, double drop) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -229,14 +260,16 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } - public double getDropOfActivatedBow(ItemStack stack) { + public double getDropOfActivatedBow(ItemStack stack) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } - public void setDropOfActivatedBow(ItemStack stack, double drop) { + public void setDropOfActivatedBow(ItemStack stack, double drop) + { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -245,24 +278,28 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) + { ItemStack stack = player.getHeldItem(hand); this.recalculatePowers(stack, world, player); return super.onItemRightClick(world, player, hand); } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { + public void gatherVariants(@Nonnull Int2ObjectMap variants) + { variants.put(0, "inventory"); } - public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) { + public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) + { EnumDemonWillType type = this.getCurrentType(stack); double amount = user instanceof EntityPlayer ? (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)) : 0; float newArrowVelocity = velocity * getVelocityOfArrow(stack); - EntitySentientArrow entityArrow = new EntitySentientArrow(world, user, type, amount); + double soulsRemaining = user instanceof EntityPlayer ? (PlayerDemonWillHandler.getTotalDemonWill(type, (EntityPlayer) user)) : 0; + EntitySentientArrow entityArrow = new EntitySentientArrow(world, user, type, amount, getLevel(soulsRemaining)); double d0 = target.posX - user.posX; double d1 = target.getEntityBoundingBox().minY + (double) (target.height / 3.0F) - entityArrow.posY; @@ -270,12 +307,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); entityArrow.shoot(d0, d1 + d3 * 0.05, d2, newArrowVelocity, 0); - if (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) { + if (velocity == 1.0F) + { entityArrow.setIsCritical(true); } @@ -285,11 +324,13 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - if (k > 0) { + if (k > 0) + { entityArrow.setKnockbackStrength(k); } - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) { + if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) + { entityArrow.setFire(100); } @@ -299,8 +340,10 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) { - if (entityLiving instanceof EntityPlayer) { + public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) + { + if (entityLiving instanceof EntityPlayer) + { EntityPlayer player = (EntityPlayer) entityLiving; boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0; ItemStack itemstack = this.getFiredArrow(player); @@ -310,17 +353,21 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien if (i < 0) return; - if (itemstack != null || flag) { - if (itemstack == null) { + if (itemstack != null || flag) + { + if (itemstack == null) + { itemstack = new ItemStack(Items.ARROW); } float arrowVelocity = getArrowVelocity(i); - if ((double) arrowVelocity >= 0.1D) { + if ((double) arrowVelocity >= 0.1D) + { boolean flag1 = flag && itemstack.getItem() == Items.ARROW; //Forge: Fix consuming custom arrows. - if (!world.isRemote) { + if (!world.isRemote) + { this.recalculatePowers(stack, world, player); EnumDemonWillType type = this.getCurrentType(stack); @@ -331,15 +378,18 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien double amount = (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)); float newArrowVelocity = arrowVelocity * getVelocityOfArrow(stack); - EntitySentientArrow entityArrow = new EntitySentientArrow(world, entityLiving, type, amount); + double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); + EntitySentientArrow entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining)); entityArrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); - if (newArrowVelocity == 0) { + if (newArrowVelocity == 0) + { world.playSound(null, player.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); return; } - if (arrowVelocity == 1.0F) { + if (arrowVelocity == 1.0F) + { entityArrow.setIsCritical(true); } @@ -349,17 +399,20 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - if (k > 0) { + if (k > 0) + { entityArrow.setKnockbackStrength(k); } - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) { + if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) + { entityArrow.setFire(100); } stack.damageItem(1, player); - if (flag1) { + if (flag1) + { entityArrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; } @@ -368,10 +421,12 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien 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) { + if (!flag1) + { itemstack.shrink(1); - if (itemstack.isEmpty()) { + if (itemstack.isEmpty()) + { player.inventory.deleteStack(itemstack); } } @@ -382,16 +437,22 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } } - protected ItemStack getFiredArrow(EntityPlayer player) { - if (this.isArrow(player.getHeldItem(EnumHand.OFF_HAND))) { + protected ItemStack getFiredArrow(EntityPlayer player) + { + if (this.isArrow(player.getHeldItem(EnumHand.OFF_HAND))) + { return player.getHeldItem(EnumHand.OFF_HAND); - } else if (this.isArrow(player.getHeldItem(EnumHand.MAIN_HAND))) { + } else if (this.isArrow(player.getHeldItem(EnumHand.MAIN_HAND))) + { return player.getHeldItem(EnumHand.MAIN_HAND); - } else { - for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { + } else + { + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) + { ItemStack itemstack = player.inventory.getStackInSlot(i); - if (this.isArrow(itemstack)) { + if (this.isArrow(itemstack)) + { return itemstack; } } @@ -401,14 +462,17 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) + { World world = player.getEntityWorld(); - if (!world.isRemote) { + if (!world.isRemote) + { this.recalculatePowers(droppedStack, world, player); EnumDemonWillType type = this.getCurrentType(droppedStack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) { + if (soulsRemaining < 1024) + { return false; } From b7adad76e7e84fdc47f26414eb1c37a1ce45ff59 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 30 Mar 2018 07:15:38 -0400 Subject: [PATCH 250/595] Added in book entries for the Teleport Array and the Turret Array. --- changelog.txt | 3 ++- .../AlchemyArrayEffectTeleport.java | 12 ++--------- .../compat/guideapi/book/CategoryAlchemy.java | 20 +++++++++++++++++++ .../bloodmagic/registry/ModRecipes.java | 2 +- .../assets/bloodmagicguide/lang/en_US.lang | 8 +++++++- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/changelog.txt b/changelog.txt index 4716494f..c7161c82 100644 --- a/changelog.txt +++ b/changelog.txt @@ -5,10 +5,11 @@ Version 2.2.8 - 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 a new (slightly WIP?) array, the Turret Array: +- Added a new array, 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. - 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. ------------------------------------------------------ Version 2.2.7 diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java index 47d0e935..9437e86b 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java @@ -8,7 +8,6 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.SoundEvents; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.server.SPacketUpdateHealth; -import net.minecraft.potion.Potion; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.SoundCategory; @@ -37,15 +36,9 @@ public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect @Override public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { + EnumFacing direction = array.getRotation(); - { - double motionY = 0.5; - double speed = 3; - EnumFacing direction = array.getRotation(); - - teleportEntityInDirection(world, pos, entity, direction); - } - + teleportEntityInDirection(world, pos, entity, direction); } public void teleportEntityInDirection(World world, BlockPos currentPos, Entity entity, EnumFacing direction) @@ -66,7 +59,6 @@ public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect entity.timeUntilPortal = TELEPORT_DELAY; if (!world.isRemote) { - Potion d; if (entity instanceof EntityPlayer) { EntityPlayerMP player = (EntityPlayerMP) entity; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index a167ea9b..bbf67db9 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -93,6 +93,26 @@ public class CategoryAlchemy 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 buffPages = new ArrayList<>(); buffPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "buff" + ".info"), 370)); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index f8375a0e..fdebf48d 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -122,7 +122,7 @@ public class ModRecipes 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("turretTest"), new TurretAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.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.APPLE), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectLaputa("laputa"), new AttractorAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/shardoflaputa.png"))); 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"))); diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index 1ba63f89..8f5d49b9 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -244,7 +244,8 @@ 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 @@ -258,3 +259,8 @@ guide.bloodmagic.entry.alchemy.turret.info=By utilizing the Demon Will that is s 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!) + + + From d2a84c0e7c9049870042bf3f4136b21fa0e37d22 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 30 Mar 2018 11:35:40 -0400 Subject: [PATCH 251/595] Added in the Spike Array --- changelog.txt | 7 ++- .../alchemyArray/AlchemyArrayEffectSpike.java | 52 ++++++++++++++++++ .../LowStaticAlchemyCircleRenderer.java | 29 ++++++++++ .../bloodmagic/registry/ModRecipes.java | 5 +- .../models/alchemyarrays/spikearray.png | Bin 0 -> 47801 bytes 5 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/spikearray.png diff --git a/changelog.txt b/changelog.txt index c7161c82..f385a646 100644 --- a/changelog.txt +++ b/changelog.txt @@ -5,8 +5,11 @@ Version 2.2.8 - 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 a new array, 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. +- 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. diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java new file mode 100644 index 00000000..a0bbf514 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java @@ -0,0 +1,52 @@ +package WayofTime.bloodmagic.alchemyArray; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.nbt.NBTTagCompound; +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, IBlockState state, Entity entity) + { + if (entity instanceof EntityLivingBase) + { + entity.attackEntityFrom(DamageSource.CACTUS, 2); + } + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectSpike(key); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java new file mode 100644 index 00000000..0256ec93 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java @@ -0,0 +1,29 @@ +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/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index fdebf48d..2e2930e8 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import WayofTime.bloodmagic.util.BMLog; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.init.MobEffects; @@ -28,12 +27,14 @@ import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectFurnaceFuel; 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.SingleAlchemyCircleRenderer; import WayofTime.bloodmagic.client.render.alchemyArray.StaticAlchemyCircleRenderer; import WayofTime.bloodmagic.client.render.alchemyArray.TurretAlchemyCircleRenderer; @@ -61,6 +62,7 @@ import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeStormTroop 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; @@ -124,6 +126,7 @@ public class ModRecipes 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.APPLE), new ItemStack(Items.REDSTONE), 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(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"))); diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/spikearray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/spikearray.png new file mode 100644 index 0000000000000000000000000000000000000000..7e312f51f067e9fbe9ca93b1112db801edc766ca GIT binary patch literal 47801 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 Date: Fri, 30 Mar 2018 18:01:23 -0400 Subject: [PATCH 252/595] Fixed the Haste sigil and "Quick Feet" so that they work with MC's new movement method. Also added better looking potion effects for a few things Enabled Shard of Laputa array - no book entry yet. --- .../bloodmagic/core/RegistrarBloodMagic.java | 32 ++-- .../bloodmagic/registry/ModRecipes.java | 3 +- .../handler/event/LivingArmourHandler.java | 171 ++++++++++++------ .../bloodmagic/textures/misc/potions.png | Bin 1577 -> 2109 bytes 4 files changed, 135 insertions(+), 71 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index e9287caf..9b0c4e9a 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -28,7 +28,8 @@ import net.minecraftforge.registries.RegistryBuilder; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) -public class RegistrarBloodMagic { +public class RegistrarBloodMagic +{ private static final BloodOrb ORB_DEF = new BloodOrb("", 0, 0, 0); @GameRegistry.ObjectHolder("weak") @@ -60,7 +61,8 @@ public class RegistrarBloodMagic { public static IForgeRegistry BLOOD_ORBS = null; @SubscribeEvent - public static void registerBloodOrbs(RegistryEvent.Register event) { + 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"), @@ -69,13 +71,14 @@ public class RegistrarBloodMagic { 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"), new BloodOrb("transcendent", 6, 30000000, 50).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") - ); + ); } @SubscribeEvent - public static void registerPotions(RegistryEvent.Register event) { + public static void registerPotions(RegistryEvent.Register event) + { event.getRegistry().registerAll( - new PotionBloodMagic("Boost", false, 0xFFFFFF, 0, 1).setRegistryName("boost"), + new PotionBloodMagic("Boost", false, 0xFFFFFF, 0, 0).setRegistryName("boost"), 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"), @@ -86,11 +89,12 @@ public class RegistrarBloodMagic { 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") - ); + ); } @SubscribeEvent - public static void registerEntities(RegistryEvent.Register event) { + public static void registerEntities(RegistryEvent.Register event) + { int entities = 0; event.getRegistry().registerAll( @@ -104,11 +108,12 @@ public class RegistrarBloodMagic { 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) { + public static void onRegistryCreation(RegistryEvent.NewRegistry event) + { BLOOD_ORBS = new RegistryBuilder() .setName(new ResourceLocation(BloodMagic.MODID, "blood_orb")) .setIDRange(0, Short.MAX_VALUE) @@ -119,8 +124,10 @@ public class RegistrarBloodMagic { @SideOnly(Side.CLIENT) @SubscribeEvent - public static void registerModels(ModelRegistryEvent event) { - for (BloodOrb orb : BLOOD_ORBS) { + public static void registerModels(ModelRegistryEvent event) + { + for (BloodOrb orb : BLOOD_ORBS) + { ModelResourceLocation modelLocation = orb.getModelLocation(); if (modelLocation == null) modelLocation = new ModelResourceLocation(orb.getRegistryName(), "inventory"); @@ -128,7 +135,8 @@ public class RegistrarBloodMagic { ModelLoader.registerItemVariants(RegistrarBloodMagicItems.BLOOD_ORB, modelLocation); } - ModelLoader.setCustomMeshDefinition(RegistrarBloodMagicItems.BLOOD_ORB, stack -> { + ModelLoader.setCustomMeshDefinition(RegistrarBloodMagicItems.BLOOD_ORB, stack -> + { if (!stack.hasTagCompound()) return new ModelResourceLocation(ORB_WEAK.getRegistryName(), "inventory"); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 2e2930e8..d84c7548 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -24,6 +24,7 @@ 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.AlchemyArrayEffectMovement; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSigil; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSkeletonTurret; @@ -125,7 +126,7 @@ public class ModRecipes 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.APPLE), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectLaputa("laputa"), new AttractorAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/shardoflaputa.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(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"))); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index f78a7e59..456482c3 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -40,24 +40,31 @@ import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class LivingArmourHandler { +public class LivingArmourHandler +{ @SubscribeEvent - public static void onEntityHealed(LivingHealEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { + public static void onEntityHealed(LivingHealEvent event) + { + if (event.getEntityLiving() instanceof EntityPlayer) + { EntityPlayer player = (EntityPlayer) event.getEntity(); - if (LivingArmour.hasFullSet(player)) { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { + if (armour != null) + { double modifier = 1; LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.slowHeal", chestStack); - if (upgrade instanceof LivingArmourUpgradeSlowHeal) { + if (upgrade instanceof LivingArmourUpgradeSlowHeal) + { modifier *= ((LivingArmourUpgradeSlowHeal) upgrade).getHealingModifier(); } - if (modifier != 1) { + if (modifier != 1) + { event.setAmount((float) (event.getAmount() * modifier)); } } @@ -66,18 +73,23 @@ public class LivingArmourHandler { } @SubscribeEvent - public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) { + public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) + { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { + if (armour != null) + { double modifier = 1; - for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) { + for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) + { modifier *= upgrade.getMiningSpeedModifier(player); } - if (modifier != 1) { + if (modifier != 1) + { event.setNewSpeed((float) (event.getOriginalSpeed() * modifier)); } } @@ -86,24 +98,31 @@ public class LivingArmourHandler { // Applies: Storm Trooper @SubscribeEvent - public static void onEntityJoinedWorld(EntityJoinWorldEvent event) { + public static void onEntityJoinedWorld(EntityJoinWorldEvent event) + { Entity owner = null; - if (event.getEntity() instanceof EntityArrow) { + if (event.getEntity() instanceof EntityArrow) + { owner = ((EntityArrow) event.getEntity()).shootingEntity; - } else if (event.getEntity() instanceof EntityThrowable) { + } else if (event.getEntity() instanceof EntityThrowable) + { owner = ((EntityThrowable) event.getEntity()).getThrower(); } - if (owner instanceof EntityPlayer) { + if (owner instanceof EntityPlayer) + { Entity projectile = event.getEntity(); EntityPlayer player = (EntityPlayer) owner; - if (LivingArmour.hasFullSet(player)) { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { + if (armour != null) + { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stormTrooper", chestStack); - if (upgrade instanceof LivingArmourUpgradeStormTrooper) { + 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; @@ -116,29 +135,37 @@ public class LivingArmourHandler { } @SubscribeEvent - public static void onPlayerClick(PlayerInteractEvent event) { - if (event.isCancelable()) { + public static void onPlayerClick(PlayerInteractEvent event) + { + if (event.isCancelable()) + { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - if (event.getHand() == EnumHand.OFF_HAND) { + if (armour != null) + { + if (event.getHand() == EnumHand.OFF_HAND) + { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.crippledArm", chestStack); - if (upgrade instanceof LivingArmourUpgradeCrippledArm) { + if (upgrade instanceof LivingArmourUpgradeCrippledArm) + { event.setCanceled(true); } } - if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) { + if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) + { ItemStack drinkStack = event.getItemStack(); //TODO: See if the item is a splash potion? Those should be usable. LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); - if (upgrade instanceof LivingArmourUpgradeQuenched) { + if (upgrade instanceof LivingArmourUpgradeQuenched) + { event.setCanceled(true); } } @@ -149,19 +176,24 @@ public class LivingArmourHandler { // Applies: Grim Reaper @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onEntityDeath(LivingDeathEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { + public static void onEntityDeath(LivingDeathEvent event) + { + if (event.getEntityLiving() instanceof EntityPlayer) + { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { + if (armour != null) + { StatTrackerGrimReaperSprint.incrementCounter(armour); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.grimReaper", chestStack); - if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) { + if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) + { ((LivingArmourUpgradeGrimReaperSprint) upgrade).applyEffectOnRebirth(player); event.setCanceled(true); event.setResult(Event.Result.DENY); @@ -175,20 +207,26 @@ public class LivingArmourHandler { // Applies: Jump @SubscribeEvent - public static void onJumpEvent(LivingEvent.LivingJumpEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { + public static void onJumpEvent(LivingEvent.LivingJumpEvent event) + { + if (event.getEntityLiving() instanceof EntityPlayer) + { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { + if (armour != null) + { StatTrackerJump.incrementCounter(armour); - if (!player.isSneaking()) { + if (!player.isSneaking()) + { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.jump", chestStack); - if (upgrade instanceof LivingArmourUpgradeJump) { + if (upgrade instanceof LivingArmourUpgradeJump) + { player.motionY += ((LivingArmourUpgradeJump) upgrade).getJumpModifier(); } } @@ -199,21 +237,28 @@ public class LivingArmourHandler { // Applies: Step Assist, Speed Boost @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { + public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) + { + if (event.getEntityLiving() instanceof EntityPlayer) + { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); boolean hasAssist = false; - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) + { hasAssist = true; player.stepHeight = Constants.Misc.ALTERED_STEP_HEIGHT; - } else { - if (LivingArmour.hasFullSet(player)) { + } else + { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) { + if (armour != null) + { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stepAssist", chestStack); - if (upgrade instanceof LivingArmourUpgradeStepAssist) { + if (upgrade instanceof LivingArmourUpgradeStepAssist) + { player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); hasAssist = true; } @@ -226,27 +271,32 @@ public class LivingArmourHandler { float percentIncrease = 0; - if (LivingArmour.hasFullSet(player)) { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) { + if (armour != null) + { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.movement", chestStack); - if (upgrade instanceof LivingArmourUpgradeSpeed) { - percentIncrease += 0.1f * ((LivingArmourUpgradeSpeed) upgrade).getSpeedModifier(); + if (upgrade instanceof LivingArmourUpgradeSpeed) + { + percentIncrease += ((LivingArmourUpgradeSpeed) upgrade).getSpeedModifier(); } } } - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) + { int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); { - percentIncrease += (i + 1) * 0.05f; + percentIncrease += (i + 1) * 0.5f; } } - if (percentIncrease > 0 && (player.onGround || player.capabilities.isFlying) && (Math.abs(player.moveForward) > 0 || Math.abs(player.moveStrafing) > 0)) { - player.moveRelative(player.moveStrafing, player.moveForward, player.capabilities.isFlying ? (percentIncrease / 2.0f) : percentIncrease, 0.02F); + 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); } } } @@ -254,7 +304,8 @@ public class LivingArmourHandler { // Applies: Arrow Shot // Tracks: Arrow Shot @SubscribeEvent - public static void onArrowFire(ArrowLooseEvent event) { + public static void onArrowFire(ArrowLooseEvent event) + { World world = event.getEntityPlayer().getEntityWorld(); ItemStack stack = event.getBow(); EntityPlayer player = event.getEntityPlayer(); @@ -262,14 +313,17 @@ public class LivingArmourHandler { if (world.isRemote) return; - if (LivingArmour.hasFullSet(player)) { + if (LivingArmour.hasFullSet(player)) + { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { + if (armour != null) + { StatTrackerArrowShot.incrementCounter(armour); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.arrowShot", chestStack); - if (upgrade instanceof LivingArmourUpgradeArrowShot) { + if (upgrade instanceof LivingArmourUpgradeArrowShot) + { int charge = event.getCharge(); float velocity = (float) charge / 20.0F; velocity = (velocity * velocity + velocity * 2.0F) / 3.0F; @@ -281,7 +335,8 @@ public class LivingArmourHandler { velocity = 1.0F; int extraArrows = ((LivingArmourUpgradeArrowShot) upgrade).getExtraArrows(); - for (int n = 0; n < extraArrows; n++) { + for (int n = 0; n < extraArrows; n++) + { ItemStack arrowStack = new ItemStack(Items.ARROW); ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); EntityArrow entityarrow = itemarrow.createArrow(world, arrowStack, player); diff --git a/src/main/resources/assets/bloodmagic/textures/misc/potions.png b/src/main/resources/assets/bloodmagic/textures/misc/potions.png index 49c30a6e3a54c8bedba5f62ceaf3a7727f82fd28..0ceb8f8ba5ae5f4d9983f4ce6bbe059eed5d4039 100644 GIT binary patch delta 1845 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 bcEbMvyHm}gW+aYk00000NkvXXu0mjf^VYIs From 58ca46b6bd7e7d61ab998ec43f210d165dc4f4eb Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 30 Mar 2018 18:03:31 -0400 Subject: [PATCH 253/595] Disabled the added Health in the "Quick Feet" upgrade. --- changelog.txt | 2 + .../upgrade/LivingArmourUpgradeSpeed.java | 62 ++++++++++++------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/changelog.txt b/changelog.txt index f385a646..beacb676 100644 --- a/changelog.txt +++ b/changelog.txt @@ -13,6 +13,8 @@ Version 2.2.8 - 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? ------------------------------------------------------ Version 2.2.7 diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 446decfb..d0392eec 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -16,76 +16,90 @@ import org.apache.commons.codec.binary.StringUtils; import java.util.UUID; -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 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) { + public LivingArmourUpgradeSpeed(int level) + { super(level); } - public double getSpeedModifier() { + public double getSpeedModifier() + { return speedModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { - if (player.isSprinting()) { - if (sprintSpeedTime[this.level] > 0) { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) + { + if (player.isSprinting()) + { + if (sprintSpeedTime[this.level] > 0) + { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, sprintSpeedTime[this.level], sprintSpeedLevel[this.level], false, false)); } - if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) { + if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) + { player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, sprintRegenTime[this.level], 0, false, false)); } } } @Override - public Multimap getAttributeModifiers() { + 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)); - } +// 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() { + public String getUniqueIdentifier() + { return BloodMagic.MODID + ".upgrade.movement"; } @Override - public int getMaxTier() { + public int getMaxTier() + { return 10; } @Override - public int getCostOfUpgrade() { + public int getCostOfUpgrade() + { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(NBTTagCompound tag) + { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(NBTTagCompound tag) + { // EMPTY } @Override - public String getUnlocalizedName() { + public String getUnlocalizedName() + { return tooltipBase + "speed"; } } From 467bcb4d52ae05b053a8bfa30114f82ff13b1043 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 30 Mar 2018 19:42:11 -0400 Subject: [PATCH 254/595] Readded the ritual "Focus of the Ellipsoid": creates a hollow ellipsoid from blocks provided in the connecting chest. Also added the guide page for the Shard of Laputa. --- changelog.txt | 2 + .../WayofTime/bloodmagic/ConfigHandler.java | 82 +++++++++++-------- .../AlchemyArrayEffectLaputa.java | 2 +- .../compat/guideapi/book/CategoryAlchemy.java | 10 +++ .../bloodmagic/registry/ModRituals.java | 2 +- .../ritual/types/RitualEllipsoid.java | 41 +++++++++- .../assets/bloodmagic/lang/en_US.lang | 1 + .../assets/bloodmagicguide/lang/en_US.lang | 3 +- 8 files changed, 102 insertions(+), 41 deletions(-) diff --git a/changelog.txt b/changelog.txt index beacb676..f72e8573 100644 --- a/changelog.txt +++ b/changelog.txt @@ -15,6 +15,8 @@ Version 2.2.8 - 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. ------------------------------------------------------ Version 2.2.7 diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 27316942..c0f2a892 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -9,61 +9,68 @@ 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 +{ - @Config.Comment({"General settings"}) + @Config.Comment({ "General settings" }) public static ConfigGeneral general = new ConfigGeneral(); - @Config.Comment({"Blacklist options for various features"}) + @Config.Comment({ "Blacklist options for various features" }) public static ConfigBlacklist blacklist = new ConfigBlacklist(); - @Config.Comment({"Value modifiers for various features"}) + @Config.Comment({ "Value modifiers for various features" }) public static ConfigValues values = new ConfigValues(); - @Config.Comment({"Toggles for all rituals"}) + @Config.Comment({ "Toggles for all rituals" }) public static ConfigRituals rituals = new ConfigRituals(); - @Config.Comment({"Settings that only pertain to the client"}) + @Config.Comment({ "Settings that only pertain to the client" }) public static ConfigClient client = new ConfigClient(); - @Config.Comment({"Compatibility settings"}) + @Config.Comment({ "Compatibility settings" }) public static ConfigCompat compat = new ConfigCompat(); @SubscribeEvent - public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) { - if (event.getModID().equals(BloodMagic.MODID)) { + public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) + { + if (event.getModID().equals(BloodMagic.MODID)) + { ConfigManager.sync(event.getModID(), Config.Type.INSTANCE); // Sync config values 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 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."}) + @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."}) + @Config.Comment({ "Enables extra information to be printed to the log.", "Warning: May drastically increase log size." }) public boolean enableVerboseAPILogging = 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 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."}) + 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.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."}) + @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; } - public static class ConfigRituals { + public static class ConfigRituals + { public boolean ritualAnimalGrowth = true; public boolean ritualContainment = true; public boolean ritualCrushing = true; @@ -93,33 +100,38 @@ public class ConfigHandler { public boolean ritualPortal = true; public boolean ritualMeteor = true; public boolean ritualDowngrade = true; + public boolean ritualEllipsoid = true; public ConfigImperfectRituals imperfect = new ConfigImperfectRituals(); } - public static class ConfigImperfectRituals { + public static class ConfigImperfectRituals + { public boolean imperfectRitualNight = true; public boolean imperfectRitualRain = true; public boolean imperfectRitualResistance = true; public boolean imperfectRitualZombie = 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 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."}) + @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."}) + @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 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 { + public enum AltarDisplayMode + { ALWAYS, SIGIL_HELD, - SIGIL_CONTAINED,; + SIGIL_CONTAINED, ; } } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java index d3701692..0a4dcbe5 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java @@ -118,7 +118,7 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect public int getRandomRadius(Random rand) { - return rand.nextInt(4) + 4; + return rand.nextInt(5) + 4; } public int getRandomHeightOffset(Random rand) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index bbf67db9..307cc083 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -113,6 +113,16 @@ public class CategoryAlchemy 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)); + List buffPages = new ArrayList<>(); buffPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "buff" + ".info"), 370)); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index e1c67c19..544df8a9 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -123,7 +123,7 @@ public class ModRituals RitualRegistry.registerRitual(downgradeRitual, ConfigHandler.rituals.ritualDowngrade); ellipsoidRitual = new RitualEllipsoid(); - RitualRegistry.registerRitual(ellipsoidRitual, false); + RitualRegistry.registerRitual(ellipsoidRitual, ConfigHandler.rituals.ritualEllipsoid); RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.BASIC.getStack(), 250, 0.5); RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.EXPLOSIVE.getStack(), 25, 0.05); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java index 2b454edb..e47a8c74 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -198,7 +198,7 @@ public class RitualEllipsoid extends Ritual @Override public int getRefreshCost() { - return 0; + return 5; } @Override @@ -217,8 +217,43 @@ public class RitualEllipsoid extends Ritual @Override public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.WATER); - addCornerRunes(components, 1, 1, EnumRuneType.WATER); + 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 diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index a218e51f..befcd6ac 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -713,6 +713,7 @@ ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Crystal) Demon Crystals in th 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. diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index 8f5d49b9..aa0981c5 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -246,7 +246,7 @@ 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 @@ -261,6 +261,7 @@ guide.bloodmagic.entry.alchemy.fastMiner.info=When tasked with carving out a lar 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. From bf18c337e281d10e92b499e26fe242a9ead5baba Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 1 Apr 2018 15:37:55 -0700 Subject: [PATCH 255/595] Fix of by one with altar upgrade calculation --- src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java index bdca69c4..fce1de92 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java @@ -14,7 +14,7 @@ public class AltarUpgrade { } public AltarUpgrade upgrade(BloodRuneType rune) { - upgradeLevels.compute(rune, (r, l) -> l == null ? 0 : l + 1); + upgradeLevels.compute(rune, (r, l) -> l == null ? 1 : l + 1); return this; } From 03a2904bd15a60603dde51aeb6f953fd7d68f49a Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 7 Apr 2018 12:24:28 -0700 Subject: [PATCH 256/595] Fixed holding sigil internal interactions It will no longer tick unbound sigils and checks binding of stored sigil on right click.. --- .../item/sigil/ItemSigilHolding.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index 17e36621..6399e817 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -4,6 +4,7 @@ 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; @@ -92,7 +93,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl List inv = getInternalInventory(stack); ItemStack itemUsing = inv.get(currentSlot); - if (itemUsing.isEmpty() || ((IBindable) itemUsing.getItem()).getBinding(stack) == null) + if (itemUsing.isEmpty() || ((IBindable) itemUsing.getItem()).getBinding(itemUsing) == null) return EnumActionResult.PASS; EnumActionResult result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); @@ -111,7 +112,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl List inv = getInternalInventory(stack); ItemStack itemUsing = inv.get(currentSlot); - if (itemUsing.isEmpty() || ((IBindable) itemUsing.getItem()).getBinding(stack) == null) + if (itemUsing.isEmpty() || ((IBindable) itemUsing.getItem()).getBinding(itemUsing) == null) return ActionResult.newResult(EnumActionResult.PASS, stack); itemUsing.getItem().onItemRightClick(world, player, hand); @@ -149,20 +150,19 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } @Override - public void onUpdate(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected) { - if (itemStack.getTagCompound() != null) { - this.tickInternalInventory(itemStack, world, entity, itemSlot, isSelected); - } + 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) { - List inv = getInternalInventory(itemStack); - - for (int i = 0; i < inventorySize; i++) { - ItemStack stack = inv.get(i); - if (stack.isEmpty()) { + 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); } From 234ccd4935f81ea912fcd5f562c1be15c63021f4 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 7 Apr 2018 12:47:46 -0700 Subject: [PATCH 257/595] Fixed a null stack check in holding GUI --- .../java/WayofTime/bloodmagic/client/gui/GuiHolding.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java index 11d9c93d..95fbd50f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java @@ -9,6 +9,8 @@ import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -46,7 +48,8 @@ public class GuiHolding extends GuiContainer { int x = (width - xSize) / 2; int y = (height - ySize) / 2; this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize); - if (player.getHeldItemMainhand() != null && player.getHeldItemMainhand().getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING) { + ItemStack held = player.getHeldItem(EnumHand.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); } From c8b394bf86f5a955dae343070575cb648f0452ac Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 7 Apr 2018 13:05:32 -0700 Subject: [PATCH 258/595] Add missing itemblock for demon crystals (#1252) Still need to figure out the rendering issue. Might just need to rewrite them to store the age as meta instead of the type. --- .../bloodmagic/block/BlockDemonCrystal.java | 165 ++++++++---------- .../bloodmagic/tile/TileDemonCrystal.java | 12 +- 2 files changed, 82 insertions(+), 95 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index fdb13d22..489e77ca 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -1,9 +1,12 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.item.block.ItemBlockDemonCrystal; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.tile.TileDemonCrystal; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyEnum; @@ -12,6 +15,7 @@ import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; @@ -22,10 +26,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Random; -public class BlockDemonCrystal extends Block { +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", EnumFacing.class); @@ -42,40 +47,80 @@ public class BlockDemonCrystal extends Block { } @Override - public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side) { - BlockPos offsetPos = pos.offset(side.getOpposite()); - IBlockState offsetState = world.getBlockState(offsetPos); - Block offsetBlock = offsetState.getBlock(); + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + if (world.isRemote) + return true; - return offsetBlock.isSideSolid(offsetState, world, offsetPos, side) && this.canPlaceBlockAt(world, pos); + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof TileDemonCrystal) { + TileDemonCrystal crystal = (TileDemonCrystal) tile; + + if (PlayerDemonWillHandler.getTotalDemonWill(EnumDemonWillType.DEFAULT, player) > 1024) + crystal.dropSingleCrystal(); + } + + return true; } @Override - public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { - TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); - EnumFacing placement = tile.getPlacement(); - BlockPos offsetPos = pos.offset(placement.getOpposite()); - IBlockState offsetState = world.getBlockState(offsetPos); - Block offsetBlock = offsetState.getBlock(); + public void getDrops(NonNullList drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof TileDemonCrystal) { + EnumDemonWillType type = state.getValue(TYPE); + int number = ((TileDemonCrystal) tile).getCrystalCount(); - if (!offsetBlock.isSideSolid(offsetState, world, offsetPos, placement)) { - world.setBlockToAir(pos); + drops.add(getItemStackDropped(type, number)); } } @Override public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { - if (world.getTileEntity(pos) == null) { - return state; + 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()); } - TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); - return state.withProperty(AGE, tile.getCrystalCountForRender()).withProperty(ATTACHED, tile.getPlacement()); + return state; + } + + @Override + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof TileDemonCrystal) { + TileDemonCrystal crystal = (TileDemonCrystal) tile; + EnumFacing placement = crystal.getPlacement(); + BlockPos offsetPos = pos.offset(placement.getOpposite()); + IBlockState offsetState = world.getBlockState(offsetPos); + + if (!offsetState.isSideSolid(world, offsetPos, placement)) + world.destroyBlock(pos, true); + } + } + + @Override + public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side) { + BlockPos offsetPos = pos.offset(side.getOpposite()); + IBlockState offsetState = world.getBlockState(offsetPos); + + return offsetState.isSideSolid(world, offsetPos, side) && this.canPlaceBlockAt(world, pos); } @Override public void getSubBlocks(CreativeTabs creativeTabs, NonNullList list) { - for (int i = 0; i < EnumDemonWillType.values().length; i++) - list.add(new ItemStack(this, 1, i)); + for (EnumDemonWillType willType : EnumDemonWillType.values()) + list.add(new ItemStack(this, 1, willType.ordinal())); + } + + @Override + public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity tile, ItemStack stack) { + super.harvestBlock(world, player, pos, state, tile, stack); + world.setBlockToAir(pos); + } + + @Override + public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) { + return willHarvest || super.removedByPlayer(state, world, pos, player, false); } @Override @@ -103,22 +148,11 @@ public class BlockDemonCrystal extends Block { return EnumBlockRenderType.MODEL; } -// public boolean canBlockStay(World worldIn, BlockPos pos, IBlockState state) -// { -// return (worldIn.getLight(pos) >= 8 || worldIn.canSeeSky(pos)) && worldIn.getBlockState(pos.down()).getBlock().canSustainPlant(worldIn, pos.down(), net.minecraft.util.EnumFacing.UP, this); -// } - - /** - * Convert the given metadata into a BlockState for this Block - */ @Override public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(TYPE, EnumDemonWillType.values()[meta]); } - /** - * Convert the BlockState into the correct metadata value - */ @Override public int getMetaFromState(IBlockState state) { return state.getValue(TYPE).ordinal(); @@ -129,42 +163,6 @@ public class BlockDemonCrystal extends Block { return new BlockStateContainer(this, TYPE, AGE, ATTACHED); } - @Override - public void breakBlock(World world, BlockPos pos, IBlockState state) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileDemonCrystal) { - EnumDemonWillType type = state.getValue(TYPE); - int number = ((TileDemonCrystal) tile).getCrystalCount(); - - spawnAsEntity(world, pos, getItemStackDropped(type, number)); - world.removeTileEntity(pos); - } - - super.breakBlock(world, pos, state); - } - - @Override - public int quantityDropped(Random random) { - return 0; - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - if (world.isRemote) { - return true; - } - - TileDemonCrystal crystal = (TileDemonCrystal) world.getTileEntity(pos); - - if (PlayerDemonWillHandler.getTotalDemonWill(EnumDemonWillType.DEFAULT, player) > 1024) { - crystal.dropSingleCrystal(); - - world.notifyBlockUpdate(pos, state, state, 3); - } - - return true; - } - @Override public boolean hasTileEntity(IBlockState state) { return true; @@ -177,7 +175,7 @@ public class BlockDemonCrystal extends Block { } public static ItemStack getItemStackDropped(EnumDemonWillType type, int crystalNumber) { - ItemStack stack = null; + ItemStack stack = ItemStack.EMPTY; switch (type) { case CORROSIVE: stack = EnumDemonWillType.CORROSIVE.getStack(); @@ -200,25 +198,14 @@ public class BlockDemonCrystal extends Block { return stack; } - // @Override -// public java.util.List getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune) -// { -// java.util.List ret = super.getDrops(world, pos, state, fortune); -// int age = ((Integer) state.getValue(AGE)).intValue(); -// Random rand = world instanceof World ? ((World) world).rand : new Random(); -// -// if (age >= 7) -// { -// int k = 3 + fortune; -// -// for (int i = 0; i < 3 + fortune; ++i) -// { -// if (rand.nextInt(15) <= age) -// { -// ret.add(new ItemStack(this.getSeed(), 1, 0)); -// } -// } -// } -// return ret; -// } + @Override + public ItemBlock 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()); + } } \ 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 index 0e26e4be..e2b21806 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -6,7 +6,7 @@ import WayofTime.bloodmagic.block.BlockDemonCrystal; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; @@ -103,12 +103,11 @@ public class TileDemonCrystal extends TileTicking { } public void checkAndGrowCrystal() { - if (progressToNextCrystal >= 1) { + if (progressToNextCrystal >= 1 || internalCounter % 100 == 0) { progressToNextCrystal--; crystalCount++; - IBlockState thisState = getWorld().getBlockState(pos); - getWorld().notifyBlockUpdate(pos, thisState, thisState, 3); markDirty(); + notifyUpdate(); } } @@ -121,9 +120,10 @@ public class TileDemonCrystal extends TileTicking { IBlockState state = getWorld().getBlockState(pos); EnumDemonWillType type = state.getValue(BlockDemonCrystal.TYPE); ItemStack stack = BlockDemonCrystal.getItemStackDropped(type, 1); - if (stack != null) { + if (!stack.isEmpty()) { crystalCount--; - getWorld().spawnEntity(new EntityItem(getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, stack)); + InventoryHelper.spawnItemStack(getWorld(), pos.getX(), pos.getY(), pos.getZ(), stack); + notifyUpdate(); return true; } } From 6944e5e8d40aa65167e2989d198418211d1b5093 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 7 Apr 2018 13:08:28 -0700 Subject: [PATCH 259/595] Add missing demon pylon itemblock (#1259) --- .../java/WayofTime/bloodmagic/block/BlockDemonPylon.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java index e24869fd..60fdafea 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -6,13 +6,14 @@ import WayofTime.bloodmagic.tile.TileDemonPylon; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockDemonPylon extends BlockContainer implements IVariantProvider { +public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVariantProvider { public BlockDemonPylon() { super(Material.ROCK); @@ -54,4 +55,9 @@ public class BlockDemonPylon extends BlockContainer implements IVariantProvider public TileEntity createNewTileEntity(World world, int meta) { return new TileDemonPylon(); } + + @Override + public ItemBlock getItem() { + return new ItemBlock(this); + } } From f01e1bfee0100e9a0a0d3e9c127a6ae35ccec48d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 7 Apr 2018 13:18:57 -0700 Subject: [PATCH 260/595] Update changelog + version --- changelog.txt | 9 +++++++++ gradle.properties | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index f72e8573..ae38265b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -17,6 +17,15 @@ Version 2.2.8 - 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 diff --git a/gradle.properties b/gradle.properties index 7a442322..d81bba9b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.7 +mod_version=2.2.8 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From 9c2621e93aa3bb2da9f6046c27c670709f1a5262 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 7 Apr 2018 18:51:21 -0400 Subject: [PATCH 261/595] Fixed stupid NPE in the Furnace Array --- changelog.txt | 5 +++++ .../alchemyArray/AlchemyArrayEffectFurnaceFuel.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/changelog.txt b/changelog.txt index ae38265b..ee011044 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +------------------------------------------------------ +Version 2.2.9 +------------------------------------------------------ +- Fixed stupid NPE in the Furnace Array + ------------------------------------------------------ Version 2.2.8 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java index b9f2f51b..c21135ac 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java @@ -62,6 +62,11 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect } } + if (sacrifice == null || sacrifice.isDead) + { + return false; + } + if (addFuelTime(furnaceTile, world, furnacePos, burnTicksAdded)) { if (!sacrifice.capabilities.isCreativeMode) From dc7af258ffac5238d02ec04e5107c0cd17079576 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 8 Apr 2018 12:53:23 -0700 Subject: [PATCH 262/595] Upgradle --- build.gradle | 1 - gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 987c88db..9947af35 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,6 @@ buildscript { plugins { id "net.minecraftforge.gradle.forge" version "2.0.2" id 'com.matthewprenger.cursegradle' version '1.0.10' - id 'io.franzbecker.gradle-lombok' version '1.6' id 'maven-publish' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 928cda88..a5ffca25 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip From e64e481a1128b20f0823eb5cd77e281be4972db9 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 8 Apr 2018 12:55:23 -0700 Subject: [PATCH 263/595] Fix errant MRS tags displaying on fresh MRSs (#1265) I literally totally hate everybody who downvoted my comment in that issue and will show them my wrath. --- .../provider/DataProviderRitualController.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index 2d5f1975..9b8c8c12 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -32,14 +32,15 @@ public class DataProviderRitualController implements IWailaDataProvider { NBTTagCompound tag = accessor.getNBTData(); if (tag.getBoolean("master")) { - if (tag.hasKey("ritual")) + 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")); + 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"))); From b63c3837477bcbd962a03b4ae06a0ca6b018fbbc Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 11 Apr 2018 16:46:09 -0700 Subject: [PATCH 264/595] Fix Sanguine Scientium recipe (#1267) --- .../WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java index 39319de7..e1ba4eee 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java @@ -53,6 +53,6 @@ public class GuideBloodMagic implements IGuideBook { @Nullable @Override public IRecipe getRecipe(@Nonnull ItemStack bookStack) { - return new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "guide"), GuideAPI.getStackFromBook(GUIDE_BOOK), new ItemStack(Items.BOOK), "glass", "feather").setRegistryName("guide"); + return new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "guide"), GuideAPI.getStackFromBook(GUIDE_BOOK), new ItemStack(Items.BOOK), "blockGlass", "feather").setRegistryName("bloodmagic_guide"); } } From ebdc66d0633624d85fc628bcfea2a09d582a6206 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 13 Apr 2018 11:31:52 -0400 Subject: [PATCH 265/595] Changed the Alchemy Table to use Bindable for checking the Orb's stored LP. Also fixed a crafting exploit with the table. #1269 --- .../bloodmagic/tile/TileAlchemyTable.java | 334 +++++++++++------- 1 file changed, 207 insertions(+), 127 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index fd911ee6..ecbc8fa8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -1,15 +1,8 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; -import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import com.google.common.base.Strings; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -22,11 +15,20 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.SidedInvWrapper; +import WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; +import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.iface.IBindable; +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 java.util.ArrayList; -import java.util.List; - -public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable { +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; @@ -37,36 +39,43 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public int ticksRequired = 1; public BlockPos connectedPos = BlockPos.ORIGIN; - public boolean[] blockedSlots = new boolean[]{false, false, false, false, false, false}; + public boolean[] blockedSlots = new boolean[] { false, false, false, false, false, false }; - public TileAlchemyTable() { + public TileAlchemyTable() + { super(9, "alchemyTable"); } - public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) { + public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) + { this.isSlave = isSlave; this.connectedPos = connectedPos; - if (!isSlave) { + if (!isSlave) + { this.direction = direction; } } - public boolean isInvisible() { + public boolean isInvisible() + { return isSlave(); } - public boolean isInputSlotAccessible(int slot) { + public boolean isInputSlotAccessible(int slot) + { return !(slot < 6 && slot >= 0) || !blockedSlots[slot]; } - public void toggleInputSlotAccessible(int slot) { + public void toggleInputSlotAccessible(int slot) + { if (slot < 6 && slot >= 0) blockedSlots[slot] = !blockedSlots[slot]; } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(NBTTagCompound tag) + { super.deserialize(tag); isSlave = tag.getBoolean("isSlave"); @@ -82,7 +91,8 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public NBTTagCompound serialize(NBTTagCompound tag) + { super.serialize(tag); tag.setBoolean("isSlave", isSlave); @@ -104,14 +114,19 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, @SuppressWarnings("unchecked") @Override - public T getCapability(Capability capability, EnumFacing facing) { - if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { - if (this.isSlave()) { + public T getCapability(Capability capability, EnumFacing facing) + { + if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + { + if (this.isSlave()) + { TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable) { + if (tile instanceof TileAlchemyTable) + { return (T) new SidedInvWrapper((TileAlchemyTable) tile, facing); } - } else { + } else + { return (T) new SidedInvWrapper(this, facing); } } @@ -120,58 +135,73 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public int[] getSlotsForFace(EnumFacing 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}; + public int[] getSlotsForFace(EnumFacing 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, EnumFacing 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: - return getAccessibleInputSlots(direction).contains(index); + public boolean canInsertItem(int index, ItemStack stack, EnumFacing 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: + return getAccessibleInputSlots(direction).contains(index); } } @Override - public boolean canExtractItem(int index, ItemStack stack, EnumFacing 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: - return getAccessibleInputSlots(direction).contains(index); + public boolean canExtractItem(int index, ItemStack stack, EnumFacing 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: + return getAccessibleInputSlots(direction).contains(index); } } - public List getAccessibleInputSlots(EnumFacing direction) { + public List getAccessibleInputSlots(EnumFacing direction) + { List list = new ArrayList<>(); - for (int i = 0; i < 6; i++) { - if (isInputSlotAccessible(i)) { + for (int i = 0; i < 6; i++) + { + if (isInputSlotAccessible(i)) + { list.add(i); } } @@ -180,15 +210,19 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public void update() { - if (isSlave()) { + public void update() + { + if (isSlave()) + { return; } List inputList = new ArrayList<>(); - for (int i = 0; i < 6; i++) { - if (!getStackInSlot(i).isEmpty()) { + for (int i = 0; i < 6; i++) + { + if (!getStackInSlot(i).isEmpty()) + { inputList.add(getStackInSlot(i)); } } @@ -197,24 +231,31 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, // 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 (recipe != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) + { if (burnTime == 1) notifyUpdate(); - if (canCraft(recipe.getRecipeOutput(inputList))) { + if (canCraft(recipe.getRecipeOutput(inputList))) + { ticksRequired = recipe.getTicksRequired(); burnTime++; - if (burnTime == ticksRequired) { - if (!getWorld().isRemote) { + if (burnTime == ticksRequired) + { + if (!getWorld().isRemote) + { int requiredLp = recipe.getLpDrained(); - if (requiredLp > 0) { - if (!getWorld().isRemote) { + if (requiredLp > 0) + { + if (!getWorld().isRemote) + { consumeLp(requiredLp); } } - if (!getWorld().isRemote) { + if (!getWorld().isRemote) + { craftItem(inputList, recipe); } } @@ -223,25 +264,40 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, IBlockState state = getWorld().getBlockState(pos); getWorld().notifyBlockUpdate(getPos(), state, state, 3); - } else if (burnTime > ticksRequired + 10) { + } else if (burnTime > ticksRequired + 10) + { burnTime = 0; } - } else { + } else + { burnTime = 0; } - } else { // Simple recipes + } else + { // Simple recipes RecipeAlchemyTable recipeAlchemyTable = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyTable(inputList); - if (recipeAlchemyTable != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipeAlchemyTable.getMinimumTier() && getContainedLp() >= recipeAlchemyTable.getSyphon()))) { + if (recipeAlchemyTable != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipeAlchemyTable.getMinimumTier() && getContainedLp() >= recipeAlchemyTable.getSyphon()))) + { if (burnTime == 1) notifyUpdate(); - if (canCraft(recipeAlchemyTable.getOutput())) { + if (canCraft(recipeAlchemyTable.getOutput())) + { ticksRequired = recipeAlchemyTable.getTicks(); burnTime++; - if (burnTime >= ticksRequired) { - if (!getWorld().isRemote) { - if (recipeAlchemyTable.getSyphon() > 0 && !getWorld().isRemote) - consumeLp(recipeAlchemyTable.getSyphon()); + 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 outputSlotStack = getStackInSlot(outputSlot); if (outputSlotStack.isEmpty()) @@ -249,7 +305,8 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, else outputSlotStack.grow(recipeAlchemyTable.getOutput().getCount()); - for (int i = 0; i < 6; i++) { + for (int i = 0; i < 6; i++) + { ItemStack currentStack = getStackInSlot(i); if (currentStack.getItem().hasContainerItem(currentStack)) setInventorySlotContents(i, currentStack.getItem().getContainerItem(currentStack)); @@ -262,17 +319,20 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } } - } else { + } else + { burnTime = 0; } } } - public double getProgressForGui() { + public double getProgressForGui() + { return ((double) burnTime) / ticksRequired; } - private boolean canCraft(ItemStack output) { + private boolean canCraft(ItemStack output) + { ItemStack currentOutputStack = getStackInSlot(outputSlot); if (output.isEmpty()) return false; @@ -284,10 +344,13 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); } - public int getTierOfOrb() { + public int getTierOfOrb() + { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) { - if (orbStack.getItem() instanceof IBloodOrb) { + if (!orbStack.isEmpty()) + { + if (orbStack.getItem() instanceof IBloodOrb) + { BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); return orb == null ? 0 : orb.getTier(); } @@ -296,23 +359,20 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public int getContainedLp() { + public int getContainedLp() + { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) { - if (orbStack.getItem() instanceof IBloodOrb) { - NBTTagCompound itemTag = orbStack.getTagCompound(); - - if (itemTag == null) { + if (!orbStack.isEmpty()) + { + if (orbStack.getItem() instanceof IBloodOrb) + { + Binding binding = ((IBindable) orbStack.getItem()).getBinding(orbStack); + if (binding == null) + { return 0; } - String ownerUUID = itemTag.getString(Constants.NBT.OWNER_UUID); - - if (Strings.isNullOrEmpty(ownerUUID)) { - return 0; - } - - SoulNetwork network = NetworkHelper.getSoulNetwork(ownerUUID); + SoulNetwork network = NetworkHelper.getSoulNetwork(binding); return network.getCurrentEssence(); } @@ -321,14 +381,18 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void craftItem(List inputList, AlchemyTableRecipe recipe) { - if (this.canCraft(recipe.getRecipeOutput(inputList))) { + public void craftItem(List inputList, AlchemyTableRecipe recipe) + { + if (this.canCraft(recipe.getRecipeOutput(inputList))) + { ItemStack outputStack = recipe.getRecipeOutput(inputList); ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (currentOutputStack.isEmpty()) { + if (currentOutputStack.isEmpty()) + { setInventorySlotContents(outputSlot, outputStack); - } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) { + } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) + { currentOutputStack.grow(outputStack.getCount()); } @@ -336,12 +400,16 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } - public int consumeLp(int requested) { + public int consumeLp(int requested) + { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) { - if (orbStack.getItem() instanceof IBloodOrb) { - if (NetworkHelper.syphonFromContainer(orbStack, requested)) { + if (!orbStack.isEmpty()) + { + if (orbStack.getItem() instanceof IBloodOrb) + { + if (NetworkHelper.syphonFromContainer(orbStack, requested)) + { return requested; } } @@ -350,52 +418,64 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void consumeInventory(AlchemyTableRecipe recipe) { + public void consumeInventory(AlchemyTableRecipe recipe) + { ItemStack[] input = new ItemStack[6]; - for (int i = 0; i < 6; i++) { + for (int i = 0; i < 6; i++) + { input[i] = getStackInSlot(i); } ItemStack[] result = recipe.getRemainingItems(input); - for (int i = 0; i < 6; i++) { + for (int i = 0; i < 6; i++) + { setInventorySlotContents(i, result[i]); } } - public EnumFacing getDirection() { + public EnumFacing getDirection() + { return direction; } - public boolean isSlave() { + public boolean isSlave() + { return isSlave; } - public int getBurnTime() { + public int getBurnTime() + { return burnTime; } - public int getTicksRequired() { + public int getTicksRequired() + { return ticksRequired; } - public BlockPos getConnectedPos() { + public BlockPos getConnectedPos() + { return connectedPos; } - public boolean[] getBlockedSlots() { + public boolean[] getBlockedSlots() + { return blockedSlots; } - public static int getOrbSlot() { + public static int getOrbSlot() + { return orbSlot; } - public static int getToolSlot() { + public static int getToolSlot() + { return toolSlot; } - public static int getOutputSlot() { + public static int getOutputSlot() + { return outputSlot; } } From 765a7a2998af88878a05eeb7936ca017000fe91a Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 13 Apr 2018 11:34:21 -0400 Subject: [PATCH 266/595] Updated changelog. --- changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.txt b/changelog.txt index ee011044..8302d97d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,6 +2,7 @@ Version 2.2.9 ------------------------------------------------------ - Fixed stupid NPE in the Furnace Array +- Fixed part of the Alchemy Table - now it works for recipes that require a LP cost. ------------------------------------------------------ Version 2.2.8 From 2db0ce5639d034c25d123781922b7adfe3960824 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 13 Apr 2018 12:20:39 -0400 Subject: [PATCH 267/595] Added an entry to the book that explains you can, in fact, use Sea Lanterns instead of glowstone blocks for your Tier 3 altar. --- changelog.txt | 1 + .../guideapi/book/CategoryArchitect.java | 230 ++++++++++++------ .../assets/bloodmagicguide/lang/en_US.lang | 4 + 3 files changed, 160 insertions(+), 75 deletions(-) diff --git a/changelog.txt b/changelog.txt index 8302d97d..dfceb679 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,7 @@ Version 2.2.9 ------------------------------------------------------ - Fixed stupid NPE in the Furnace Array - Fixed part of the Alchemy Table - now it works for recipes that require a LP cost. +- Added an entry to the book that explains you can, in fact, use Sea Lanterns instead of glowstone blocks for your Tier 3 altar. ------------------------------------------------------ Version 2.2.8 diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index 946dd171..ac330963 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -29,8 +29,10 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -public class CategoryArchitect { - public static Map buildCategory() { +public class CategoryArchitect +{ + public static Map buildCategory() + { Map entries = new LinkedHashMap<>(); String keyBase = "guide." + BloodMagic.MODID + ".entry.architect."; @@ -42,14 +44,16 @@ public class CategoryArchitect { List altarPages = new ArrayList<>(); IRecipe altarRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ALTAR)); - if (altarRecipe != null) { + 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) { + if (daggerRecipe != null) + { altarPages.add(BookUtils.getPageForRecipe(daggerRecipe)); } @@ -59,7 +63,8 @@ public class CategoryArchitect { List ashPages = new ArrayList<>(); TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); - if (ashRecipe != null) { + if (ashRecipe != null) + { ashPages.add(new PageTartaricForgeRecipe(ashRecipe)); } ashPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "ash" + ".info"), 370)); @@ -68,7 +73,8 @@ public class CategoryArchitect { List divinationPages = new ArrayList<>(); PageAlchemyArray divinationRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION)); - if (divinationRecipePage != null) { + if (divinationRecipePage != null) + { divinationPages.add(divinationRecipePage); } @@ -84,7 +90,8 @@ public class CategoryArchitect { weakorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakorb" + ".info.1"), 370)); AltarRecipe weakorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK)); - if (weakorbRecipe != null) { + if (weakorbRecipe != null) + { weakorbPages.add(new PageAltarRecipe(weakorbRecipe)); } @@ -94,14 +101,16 @@ public class CategoryArchitect { List incensePages = new ArrayList<>(); IRecipe incenseRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.INCENSE_ALTAR)); - if (incenseRecipe != null) { + 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) { + if (woodPathRecipe != null) + { incensePages.add(BookUtils.getPageForRecipe(woodPathRecipe)); } @@ -111,7 +120,8 @@ public class CategoryArchitect { List runePages = new ArrayList<>(); IRecipe runeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 0)); - if (runeRecipe != null) { + if (runeRecipe != null) + { runePages.add(BookUtils.getPageForRecipe(runeRecipe)); } @@ -121,7 +131,8 @@ public class CategoryArchitect { List inspectPages = new ArrayList<>(); AltarRecipe inspectRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK)); - if (inspectRecipe != null) { + if (inspectRecipe != null) + { inspectPages.add(new PageAltarRecipe(inspectRecipe)); } @@ -131,7 +142,8 @@ public class CategoryArchitect { List speedRunePages = new ArrayList<>(); IRecipe speedRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1)); - if (speedRecipe != null) { + if (speedRecipe != null) + { speedRunePages.add(BookUtils.getPageForRecipe(speedRecipe)); } @@ -141,12 +153,14 @@ public class CategoryArchitect { List waterPages = new ArrayList<>(); TartaricForgeRecipe waterRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_WATER.getStack()); - if (waterRecipe != null) { + if (waterRecipe != null) + { waterPages.add(new PageTartaricForgeRecipe(waterRecipe)); } PageAlchemyArray waterRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER)); - if (waterRecipePage != null) { + if (waterRecipePage != null) + { waterPages.add(waterRecipePage); } @@ -156,12 +170,14 @@ public class CategoryArchitect { List lavaPages = new ArrayList<>(); TartaricForgeRecipe lavaRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_LAVA.getStack()); - if (lavaRecipe != null) { + if (lavaRecipe != null) + { lavaPages.add(new PageTartaricForgeRecipe(lavaRecipe)); } PageAlchemyArray lavaRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA)); - if (lavaRecipePage != null) { + if (lavaRecipePage != null) + { lavaPages.add(lavaRecipePage); } @@ -171,7 +187,8 @@ public class CategoryArchitect { List lavaCrystalPages = new ArrayList<>(); IRecipe lavaCrystalRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL)); - if (lavaCrystalRecipe != null) { + if (lavaCrystalRecipe != null) + { lavaCrystalPages.add(BookUtils.getPageForRecipe(lavaCrystalRecipe)); } @@ -181,7 +198,8 @@ public class CategoryArchitect { List apprenticeorbPages = new ArrayList<>(); AltarRecipe apprenticeorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE)); - if (apprenticeorbRecipe != null) { + if (apprenticeorbRecipe != null) + { apprenticeorbPages.add(new PageAltarRecipe(apprenticeorbRecipe)); } @@ -191,7 +209,8 @@ public class CategoryArchitect { List daggerPages = new ArrayList<>(); AltarRecipe daggerOfSacrificeRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE)); - if (daggerOfSacrificeRecipe != null) { + if (daggerOfSacrificeRecipe != null) + { daggerPages.add(new PageAltarRecipe(daggerOfSacrificeRecipe)); } @@ -201,7 +220,8 @@ public class CategoryArchitect { List runeSacrificePages = new ArrayList<>(); IRecipe runeSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3)); - if (runeSacrificeRecipe != null) { + if (runeSacrificeRecipe != null) + { runeSacrificePages.add(BookUtils.getPageForRecipe(runeSacrificeRecipe)); } @@ -211,7 +231,8 @@ public class CategoryArchitect { List runeSelfSacrificePages = new ArrayList<>(); IRecipe runeSelfSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); - if (runeSelfSacrificeRecipe != null) { + if (runeSelfSacrificeRecipe != null) + { runeSelfSacrificePages.add(BookUtils.getPageForRecipe(runeSelfSacrificeRecipe)); } @@ -221,12 +242,14 @@ public class CategoryArchitect { List holdingPages = new ArrayList<>(); TartaricForgeRecipe holdingRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_HOLDING.getStack()); - if (holdingRecipe != null) { + if (holdingRecipe != null) + { holdingPages.add(new PageTartaricForgeRecipe(holdingRecipe)); } PageAlchemyArray holdingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING)); - if (holdingRecipePage != null) { + if (holdingRecipePage != null) + { holdingPages.add(holdingRecipePage); } @@ -236,12 +259,14 @@ public class CategoryArchitect { List airPages = new ArrayList<>(); TartaricForgeRecipe airRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_AIR.getStack()); - if (airRecipe != null) { + if (airRecipe != null) + { airPages.add(new PageTartaricForgeRecipe(airRecipe)); } PageAlchemyArray airRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR)); - if (airRecipePage != null) { + if (airRecipePage != null) + { airPages.add(airRecipePage); } @@ -251,12 +276,14 @@ public class CategoryArchitect { List voidPages = new ArrayList<>(); TartaricForgeRecipe voidRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_VOID.getStack()); - if (voidRecipe != null) { + if (voidRecipe != null) + { voidPages.add(new PageTartaricForgeRecipe(voidRecipe)); } PageAlchemyArray voidRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID)); - if (voidRecipePage != null) { + if (voidRecipePage != null) + { voidPages.add(voidRecipePage); } @@ -266,12 +293,14 @@ public class CategoryArchitect { List greenGrovePages = new ArrayList<>(); TartaricForgeRecipe greenGroveRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_GROWTH.getStack()); - if (greenGroveRecipe != null) { + if (greenGroveRecipe != null) + { greenGrovePages.add(new PageTartaricForgeRecipe(greenGroveRecipe)); } PageAlchemyArray greenGroveRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE)); - if (greenGroveRecipePage != null) { + if (greenGroveRecipePage != null) + { greenGrovePages.add(greenGroveRecipePage); } @@ -281,12 +310,14 @@ public class CategoryArchitect { List fastMinerPages = new ArrayList<>(); TartaricForgeRecipe fastMinerRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_FAST_MINER.getStack()); - if (fastMinerRecipe != null) { + if (fastMinerRecipe != null) + { fastMinerPages.add(new PageTartaricForgeRecipe(fastMinerRecipe)); } PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER)); - if (fastMinerRecipePage != null) { + if (fastMinerRecipePage != null) + { fastMinerPages.add(fastMinerRecipePage); } @@ -296,12 +327,14 @@ public class CategoryArchitect { List seerPages = new ArrayList<>(); TartaricForgeRecipe seerRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SIGHT.getStack()); - if (seerRecipe != null) { + if (seerRecipe != null) + { seerPages.add(new PageTartaricForgeRecipe(seerRecipe)); } PageAlchemyArray seerRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER)); - if (seerRecipePage != null) { + if (seerRecipePage != null) + { seerPages.add(seerRecipePage); } @@ -311,17 +344,24 @@ public class CategoryArchitect { List magicianOrbPages = new ArrayList<>(); AltarRecipe magicianOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN)); - if (magicianOrbRecipe != null) { + 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, 4)); - if (capacityRecipe != null) { + if (capacityRecipe != null) + { capacityPages.add(BookUtils.getPageForRecipe(capacityRecipe)); } @@ -331,7 +371,8 @@ public class CategoryArchitect { List displacementPages = new ArrayList<>(); IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); - if (displacementRecipe != null) { + if (displacementRecipe != null) + { displacementPages.add(BookUtils.getPageForRecipe(displacementRecipe)); } @@ -341,12 +382,14 @@ public class CategoryArchitect { List affinityPages = new ArrayList<>(); TartaricForgeRecipe affinityRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_AFFINITY.getStack()); - if (affinityRecipe != null) { + if (affinityRecipe != null) + { affinityPages.add(new PageTartaricForgeRecipe(affinityRecipe)); } PageAlchemyArray affinityRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY)); - if (affinityRecipePage != null) { + if (affinityRecipePage != null) + { affinityPages.add(affinityRecipePage); } @@ -356,12 +399,14 @@ public class CategoryArchitect { List lampPages = new ArrayList<>(); TartaricForgeRecipe lampRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack()); - if (lampRecipe != null) { + if (lampRecipe != null) + { lampPages.add(new PageTartaricForgeRecipe(lampRecipe)); } PageAlchemyArray lampRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT)); - if (lampRecipePage != null) { + if (lampRecipePage != null) + { lampPages.add(lampRecipePage); } @@ -371,12 +416,14 @@ public class CategoryArchitect { List magnetismPages = new ArrayList<>(); TartaricForgeRecipe magnetismRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_MAGNETISM.getStack()); - if (magnetismRecipe != null) { + if (magnetismRecipe != null) + { magnetismPages.add(new PageTartaricForgeRecipe(magnetismRecipe)); } PageAlchemyArray magnetismRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM)); - if (magnetismRecipePage != null) { + if (magnetismRecipePage != null) + { magnetismPages.add(magnetismRecipePage); } @@ -386,7 +433,8 @@ public class CategoryArchitect { List peritiaPages = new ArrayList<>(); IRecipe peritiaRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.EXPERIENCE_TOME)); - if (peritiaRecipe != null) { + if (peritiaRecipe != null) + { peritiaPages.add(BookUtils.getPageForRecipe(peritiaRecipe)); } @@ -396,27 +444,32 @@ public class CategoryArchitect { List livingArmourPages = new ArrayList<>(); TartaricForgeRecipe bindingRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BINDING.getStack()); - if (bindingRecipe != null) { + if (bindingRecipe != null) + { livingArmourPages.add(new PageTartaricForgeRecipe(bindingRecipe)); } PageAlchemyArray bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST)); - if (bindingRecipePage != null) { + if (bindingRecipePage != null) + { livingArmourPages.add(bindingRecipePage); } bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET)); - if (bindingRecipePage != null) { + if (bindingRecipePage != null) + { livingArmourPages.add(bindingRecipePage); } bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS)); - if (bindingRecipePage != null) { + if (bindingRecipePage != null) + { livingArmourPages.add(bindingRecipePage); } bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS)); - if (bindingRecipePage != null) { + if (bindingRecipePage != null) + { livingArmourPages.add(bindingRecipePage); } @@ -436,12 +489,14 @@ public class CategoryArchitect { List teleposerPages = new ArrayList<>(); AltarRecipe teleposerFocusRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)); - if (teleposerFocusRecipe != null) { + if (teleposerFocusRecipe != null) + { teleposerPages.add(new PageAltarRecipe(teleposerFocusRecipe)); } IRecipe teleposerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER)); - if (teleposerRecipe != null) { + if (teleposerRecipe != null) + { teleposerPages.add(BookUtils.getPageForRecipe(teleposerRecipe)); } @@ -451,7 +506,8 @@ public class CategoryArchitect { List boundBladePages = new ArrayList<>(); PageAlchemyArray boundBladePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD)); - if (boundBladePage != null) { + if (boundBladePage != null) + { boundBladePages.add(boundBladePage); } @@ -461,17 +517,20 @@ public class CategoryArchitect { List boundToolPages = new ArrayList<>(); PageAlchemyArray boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)); - if (boundToolPage != null) { + if (boundToolPage != null) + { boundToolPages.add(boundToolPage); } boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)); - if (boundToolPage != null) { + if (boundToolPage != null) + { boundToolPages.add(boundToolPage); } boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)); - if (boundToolPage != null) { + if (boundToolPage != null) + { boundToolPages.add(boundToolPage); } @@ -486,7 +545,8 @@ public class CategoryArchitect { List masterOrbPages = new ArrayList<>(); AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER)); - if (magicianOrbRecipe != null) { + if (magicianOrbRecipe != null) + { masterOrbPages.add(new PageAltarRecipe(masterOrbRecipe)); } @@ -496,7 +556,8 @@ public class CategoryArchitect { List orbRunePages = new ArrayList<>(); IRecipe orbRuneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 8)); - if (orbRuneRecipe != null) { + if (orbRuneRecipe != null) + { orbRunePages.add(BookUtils.getPageForRecipe(orbRuneRecipe)); } @@ -506,7 +567,8 @@ public class CategoryArchitect { List augmentedCapacityPages = new ArrayList<>(); IRecipe augmentedCapacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 7)); - if (orbRuneRecipe != null) { + if (orbRuneRecipe != null) + { augmentedCapacityPages.add(BookUtils.getPageForRecipe(augmentedCapacityRecipe)); } @@ -516,7 +578,8 @@ public class CategoryArchitect { List chargingPages = new ArrayList<>(); IRecipe chargingRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 10)); - if (orbRuneRecipe != null) { + if (orbRuneRecipe != null) + { chargingPages.add(BookUtils.getPageForRecipe(chargingRecipe)); } @@ -526,7 +589,8 @@ public class CategoryArchitect { List accelerationPages = new ArrayList<>(); IRecipe accelerationRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 9)); - if (orbRuneRecipe != null) { + if (orbRuneRecipe != null) + { accelerationPages.add(BookUtils.getPageForRecipe(accelerationRecipe)); } @@ -536,12 +600,14 @@ public class CategoryArchitect { List suppressionPages = new ArrayList<>(); TartaricForgeRecipe suppressionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SUPPRESSION.getStack()); - if (suppressionRecipe != null) { + if (suppressionRecipe != null) + { suppressionPages.add(new PageTartaricForgeRecipe(suppressionRecipe)); } PageAlchemyArray suppressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION)); - if (suppressionRecipePage != null) { + if (suppressionRecipePage != null) + { suppressionPages.add(suppressionRecipePage); } @@ -551,12 +617,14 @@ public class CategoryArchitect { List hastePages = new ArrayList<>(); TartaricForgeRecipe hasteRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_HASTE.getStack()); - if (hasteRecipe != null) { + if (hasteRecipe != null) + { hastePages.add(new PageTartaricForgeRecipe(hasteRecipe)); } PageAlchemyArray hasteRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE)); - if (hasteRecipePage != null) { + if (hasteRecipePage != null) + { hastePages.add(hasteRecipePage); } @@ -566,12 +634,14 @@ public class CategoryArchitect { List severancePages = new ArrayList<>(); TartaricForgeRecipe severanceRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SEVERANCE.getStack()); - if (severanceRecipe != null) { + if (severanceRecipe != null) + { severancePages.add(new PageTartaricForgeRecipe(severanceRecipe)); } PageAlchemyArray severanceRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE)); - if (severanceRecipePage != null) { + if (severanceRecipePage != null) + { severancePages.add(severanceRecipePage); } @@ -581,12 +651,14 @@ public class CategoryArchitect { List telepositionPages = new ArrayList<>(); TartaricForgeRecipe telepositionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_TELEPOSITION.getStack()); - if (telepositionRecipe != null) { + if (telepositionRecipe != null) + { telepositionPages.add(new PageTartaricForgeRecipe(telepositionRecipe)); } PageAlchemyArray telepositionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION)); - if (telepositionRecipePage != null) { + if (telepositionRecipePage != null) + { telepositionPages.add(telepositionRecipePage); } @@ -596,12 +668,14 @@ public class CategoryArchitect { List compressionPages = new ArrayList<>(); TartaricForgeRecipe compressionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_COMPRESSION.getStack()); - if (compressionRecipe != null) { + if (compressionRecipe != null) + { compressionPages.add(new PageTartaricForgeRecipe(compressionRecipe)); } PageAlchemyArray compressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION)); - if (compressionRecipePage != null) { + if (compressionRecipePage != null) + { compressionPages.add(compressionRecipePage); } @@ -611,12 +685,14 @@ public class CategoryArchitect { List bridgePages = new ArrayList<>(); TartaricForgeRecipe bridgeRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BRIDGE.getStack()); - if (bridgeRecipe != null) { + if (bridgeRecipe != null) + { bridgePages.add(new PageTartaricForgeRecipe(bridgeRecipe)); } PageAlchemyArray bridgeRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE)); - if (bridgeRecipePage != null) { + if (bridgeRecipePage != null) + { bridgePages.add(bridgeRecipePage); } @@ -626,16 +702,20 @@ public class CategoryArchitect { List mimicPages = new ArrayList<>(); IRecipe mimicRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 1, 1)); - if (mimicRecipe != null) { + 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) { + for (Entry entry : entries.entrySet()) + { + for (IPage page : entry.getValue().pageList) + { + if (page instanceof PageText) + { ((PageText) page).setUnicodeFlag(true); } } diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index aa0981c5..d0ff5595 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -134,6 +134,8 @@ 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. @@ -190,6 +192,8 @@ guide.bloodmagic.entry.architect.augmentedCapacity.info=The Rune of Augmented Ca 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 From af3e1fecb6d3b47fb9c8105f39767b734c32d137 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 13 Apr 2018 16:44:00 -0400 Subject: [PATCH 268/595] Fixed an interaction issue between vanilla hoppers and the Alchemy Table, due to the hoppers not actually using the Forge capabilities for all of its checking methods. --- changelog.txt | 4 +++- .../bloodmagic/tile/TileAlchemyTable.java | 24 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/changelog.txt b/changelog.txt index dfceb679..3c827cb6 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,7 +2,9 @@ Version 2.2.9 ------------------------------------------------------ - Fixed stupid NPE in the Furnace Array -- Fixed part of the Alchemy Table - now it works for recipes that require a LP cost. +- 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. ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index ecbc8fa8..fd9de09f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -8,13 +8,13 @@ import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -import net.minecraftforge.items.wrapper.SidedInvWrapper; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; import WayofTime.bloodmagic.core.data.Binding; @@ -121,13 +121,13 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, if (this.isSlave()) { TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable) + if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) { - return (T) new SidedInvWrapper((TileAlchemyTable) tile, facing); + return (T) tile.getCapability(capability, facing); } } else { - return (T) new SidedInvWrapper(this, facing); + return super.getCapability(capability, facing); } } @@ -167,6 +167,14 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, 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); } } @@ -190,6 +198,14 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, 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); } } From 2d83e8047d35d67a0d71bd65f0927ba6468166a2 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 15 Apr 2018 11:05:02 -0700 Subject: [PATCH 269/595] Fix Blood Light not being punchable (#1272) Also makes it more visible while holding the sigil. --- .../bloodmagic/block/BlockBloodLight.java | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java index 71f9d92e..7076f77f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -8,7 +8,9 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.particle.ParticleManager; +import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumHand; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -29,15 +31,15 @@ public class BlockBloodLight extends Block { setUnlocalizedName(BloodMagic.MODID + ".bloodLight"); } + @Override + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return AABB; + } + @Nullable @Override public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { - return null; - } - - @Override - public boolean isCollidable() { - return false; + return NULL_AABB; } @Override @@ -89,21 +91,18 @@ public class BlockBloodLight extends Block { @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) { - EntityPlayerSP playerSP = Minecraft.getMinecraft().player; + EntityPlayerSP player = Minecraft.getMinecraft().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); - if (!playerSP.getActiveItemStack().isEmpty() && playerSP.getActiveItemStack().getItem() == RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT) { - 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); - 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); - 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(EnumHand.MAIN_HAND); - @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { - return AABB; + 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 From 79ccd1f3bb9676522295f4c9f1b22f971f5ab3d0 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 15 Apr 2018 11:21:14 -0700 Subject: [PATCH 270/595] Add inputs to crafting events + implement SF/AT events (#1270) --- .../api/event/BloodMagicCraftedEvent.java | 50 +++++++++++++------ .../bloodmagic/tile/TileAlchemyTable.java | 26 ++++++++-- .../bloodmagic/tile/TileSoulForge.java | 16 ++++-- 3 files changed, 71 insertions(+), 21 deletions(-) diff --git a/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java b/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java index 1df4bb13..0b92284c 100644 --- a/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java +++ b/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java @@ -1,16 +1,17 @@ package WayofTime.bloodmagic.api.event; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; 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, boolean modifiable) { + public BloodMagicCraftedEvent(ItemStack output, ItemStack[] inputs, boolean modifiable) { this.modifiable = modifiable; + this.inputs = inputs; this.output = output; } @@ -18,6 +19,10 @@ public class BloodMagicCraftedEvent extends Event { return modifiable; } + public ItemStack[] getInputs() { + return inputs; + } + public ItemStack getOutput() { return output; } @@ -28,22 +33,39 @@ public class BloodMagicCraftedEvent extends Event { } /** - * Fired whenever a craft is completed in a BloodAltar. - *

        + * 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 { - private final Ingredient input; - - public Altar(Ingredient input, ItemStack output) { - super(output, true); - - this.input = input; - } - - public Ingredient getInput() { - return input; + 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/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index fd9de09f..11b9e8eb 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.tile; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -12,6 +13,7 @@ import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.util.EnumFacing; 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; @@ -26,6 +28,7 @@ import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NetworkHelper; +import org.apache.commons.lang3.ArrayUtils; public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable { @@ -315,11 +318,18 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } + 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, recipeAlchemyTable.getOutput().copy()); + setInventorySlotContents(outputSlot, event.getOutput()); else - outputSlotStack.grow(recipeAlchemyTable.getOutput().getCount()); + outputSlotStack.grow(event.getOutput().getCount()); for (int i = 0; i < 6; i++) { @@ -399,11 +409,19 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public void craftItem(List inputList, AlchemyTableRecipe recipe) { - if (this.canCraft(recipe.getRecipeOutput(inputList))) + ItemStack outputStack = recipe.getRecipeOutput(inputList); + if (this.canCraft(outputStack)) { - ItemStack outputStack = recipe.getRecipeOutput(inputList); 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); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 3640b6c7..4e737ae9 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -1,5 +1,6 @@ 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; @@ -11,6 +12,7 @@ import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ITickable; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.items.ItemHandlerHelper; import java.util.ArrayList; @@ -132,10 +134,18 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil 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, recipe.getOutput().copy()); - } else if (ItemHandlerHelper.canItemStacksStack(currentOutputStack, recipe.getOutput())) { - currentOutputStack.grow(recipe.getOutput().getCount()); + setInventorySlotContents(outputSlot, event.getOutput()); + } else if (ItemHandlerHelper.canItemStacksStack(currentOutputStack, event.getOutput())) { + currentOutputStack.grow(event.getOutput().getCount()); } consumeInventory(); From 07ae96a60eb8e71393e564fb17fe981722cc0a45 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 17 Apr 2018 19:12:29 -0400 Subject: [PATCH 271/595] Fixed Demon Crystals growing at an accelerated rate (all the time). --- changelog.txt | 2 + .../bloodmagic/tile/TileDemonCrystal.java | 94 ++++++++++++------- 2 files changed, 64 insertions(+), 32 deletions(-) diff --git a/changelog.txt b/changelog.txt index 3c827cb6..a0908def 100644 --- a/changelog.txt +++ b/changelog.txt @@ -6,6 +6,8 @@ Version 2.2.9 - 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? ------------------------------------------------------ Version 2.2.8 diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index e2b21806..a4b878e6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -12,7 +12,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.MathHelper; -public class TileDemonCrystal extends TileTicking { +public class TileDemonCrystal extends TileTicking +{ public static final double sameWillConversionRate = 50; public static final double defaultWillConversionRate = 100; public static final double timeDelayForWrongWill = 0.6; @@ -24,35 +25,46 @@ public class TileDemonCrystal extends TileTicking { public int crystalCount = 1; public EnumFacing placement = EnumFacing.UP; //Side that this crystal is placed on. - public TileDemonCrystal() { + public TileDemonCrystal() + { this.crystalCount = 1; } @Override - public void onUpdate() { - if (getWorld().isRemote) { + public void onUpdate() + { + if (getWorld().isRemote) + { return; } internalCounter++; - if (internalCounter % 20 == 0 && crystalCount < 7) { + if (internalCounter % 20 == 0 && crystalCount < 7) + { EnumDemonWillType type = EnumDemonWillType.values()[this.getBlockMetadata()]; double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (type != EnumDemonWillType.DEFAULT) { - if (value >= 100) { + if (type != EnumDemonWillType.DEFAULT) + { + if (value >= 100) + { double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; - } else { + } else + { value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT); - if (value > 0.5) { + 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) { + } else + { + if (value > 0.5) + { + double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; } @@ -72,14 +84,17 @@ public class TileDemonCrystal extends TileTicking { * 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 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) { + public double growCrystalWithWillAmount(double willDrain, double progressPercentage) + { + if (crystalCount >= 7) + { return 0; } @@ -89,7 +104,8 @@ public class TileDemonCrystal extends TileTicking { double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double percentDrain = willDrain <= 0 ? 1 : Math.min(1, value / willDrain); - if (percentDrain <= 0) { + if (percentDrain <= 0) + { return 0; } @@ -102,8 +118,10 @@ public class TileDemonCrystal extends TileTicking { return percentDrain * progressPercentage; } - public void checkAndGrowCrystal() { - if (progressToNextCrystal >= 1 || internalCounter % 100 == 0) { + public void checkAndGrowCrystal() + { + if (progressToNextCrystal >= 1 && internalCounter % 100 == 0) + { progressToNextCrystal--; crystalCount++; markDirty(); @@ -111,16 +129,20 @@ public class TileDemonCrystal extends TileTicking { } } - public double getMaxWillForCrystal() { + public double getMaxWillForCrystal() + { return 50; } - public boolean dropSingleCrystal() { - if (!getWorld().isRemote && crystalCount > 1) { + public boolean dropSingleCrystal() + { + if (!getWorld().isRemote && crystalCount > 1) + { IBlockState state = getWorld().getBlockState(pos); EnumDemonWillType type = state.getValue(BlockDemonCrystal.TYPE); ItemStack stack = BlockDemonCrystal.getItemStackDropped(type, 1); - if (!stack.isEmpty()) { + if (!stack.isEmpty()) + { crystalCount--; InventoryHelper.spawnItemStack(getWorld(), pos.getX(), pos.getY(), pos.getZ(), stack); notifyUpdate(); @@ -131,16 +153,19 @@ public class TileDemonCrystal extends TileTicking { return false; } - public double getCrystalGrowthPerSecond(double will) { - return 1.0 / 800 * Math.sqrt(will / 200); + public double getCrystalGrowthPerSecond(double will) + { + return 1.0 / 200 * Math.sqrt(will / 200); } - public int getCrystalCountForRender() { + public int getCrystalCountForRender() + { return MathHelper.clamp(crystalCount - 1, 0, 6); } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(NBTTagCompound tag) + { holder.readFromNBT(tag, "Will"); crystalCount = tag.getInteger("crystalCount"); placement = EnumFacing.getFront(tag.getInteger("placement")); @@ -148,7 +173,8 @@ public class TileDemonCrystal extends TileTicking { } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public NBTTagCompound serialize(NBTTagCompound tag) + { holder.writeToNBT(tag, "Will"); tag.setInteger("crystalCount", crystalCount); tag.setInteger("placement", placement.getIndex()); @@ -156,19 +182,23 @@ public class TileDemonCrystal extends TileTicking { return tag; } - public int getCrystalCount() { + public int getCrystalCount() + { return crystalCount; } - public void setCrystalCount(int crystalCount) { + public void setCrystalCount(int crystalCount) + { this.crystalCount = crystalCount; } - public EnumFacing getPlacement() { + public EnumFacing getPlacement() + { return placement; } - public void setPlacement(EnumFacing placement) { + public void setPlacement(EnumFacing placement) + { this.placement = placement; } } \ No newline at end of file From 19cdfbfb0a2a8e8a911732340e2b556dcdbad4ce Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 17 Apr 2018 16:16:03 -0700 Subject: [PATCH 272/595] This file slipped through the craks :think: --- src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 0cb9b8f7..70eedb21 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -303,7 +303,7 @@ public class BloodAltar implements IFluidHandler { if (progress >= liquidRequired * stackSize) { ItemStack result = ItemHandlerHelper.copyStackWithSize(recipe.getOutput(), stackSize); - BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(recipe.getInput(), result); + BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(result, input.copy()); MinecraftForge.EVENT_BUS.post(event); tileAltar.setInventorySlotContents(0, event.getOutput()); progress = 0; From 60c8441115ca2d1e75027858181f9ea79df7ecb5 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 20 Apr 2018 13:39:05 -0400 Subject: [PATCH 273/595] Added the "Resonance of the Faceted Crystal" --- changelog.txt | 2 + .../WayofTime/bloodmagic/ConfigHandler.java | 1 + .../compat/guideapi/book/CategoryRitual.java | 37 ++-- .../bloodmagic/registry/ModRituals.java | 4 + .../ritual/types/RitualCrystalSplit.java | 192 ++++++++++++++++++ .../bloodmagic/tile/TileDemonCrystal.java | 20 +- .../tile/TileDemonCrystallizer.java | 92 +++++---- .../assets/bloodmagic/lang/en_US.lang | 2 + .../assets/bloodmagicguide/lang/en_US.lang | 4 +- 9 files changed, 296 insertions(+), 58 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java diff --git a/changelog.txt b/changelog.txt index a0908def..1a56be77 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,8 @@ Version 2.2.9 - 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. ------------------------------------------------------ Version 2.2.8 diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index c0f2a892..a16e13bc 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -101,6 +101,7 @@ public class ConfigHandler public boolean ritualMeteor = true; public boolean ritualDowngrade = true; public boolean ritualEllipsoid = true; + public boolean ritualCrystalSplit = true; public ConfigImperfectRituals imperfect = new ConfigImperfectRituals(); } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index 2547591b..0a82b197 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -24,10 +24,12 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -public class CategoryRitual { +public class CategoryRitual +{ static String keyBase = "guide." + BloodMagic.MODID + ".entry.ritual."; - public static Map buildCategory() { + public static Map buildCategory() + { Map entries = new LinkedHashMap<>(); addRitualPagesToEntries("intro", entries); @@ -36,16 +38,19 @@ public class CategoryRitual { List ritualStonePages = new ArrayList<>(); IRecipe ritualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE)); - if (ritualStoneRecipe != null) { + 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++) { + for (int i = 1; i < 5; i++) + { EnumRuneType type = EnumRuneType.values()[i]; AltarRecipe scribeRecipe = RecipeHelper.getAltarRecipeForOutput(type.getStack()); - if (scribeRecipe != null) { + if (scribeRecipe != null) + { ritualStonePages.add(new PageAltarRecipe(scribeRecipe)); } } @@ -56,7 +61,8 @@ public class CategoryRitual { List masterRitualStonePages = new ArrayList<>(); IRecipe masterRitualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 0)); - if (masterRitualStoneRecipe != null) { + if (masterRitualStoneRecipe != null) + { masterRitualStonePages.add(BookUtils.getPageForRecipe(masterRitualStoneRecipe)); } @@ -68,7 +74,8 @@ public class CategoryRitual { activationCrystalPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "activationCrystal" + ".info.1"), 370)); AltarRecipe crystalRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL)); - if (crystalRecipe != null) { + if (crystalRecipe != null) + { activationCrystalPages.add(new PageAltarRecipe(crystalRecipe)); } @@ -80,7 +87,8 @@ public class CategoryRitual { divinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "diviner" + ".info.1"), 370)); IRecipe divinerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER)); - if (divinerRecipe != null) { + if (divinerRecipe != null) + { divinerPages.add(BookUtils.getPageForRecipe(divinerRecipe)); } @@ -107,10 +115,14 @@ public class CategoryRitual { addRitualPagesToEntries("timberman", entries); addRitualPagesToEntries("meteor", entries); addRitualPagesToEntries("downgrade", entries); + addRitualPagesToEntries("crystalSplit", entries); - for (Entry entry : entries.entrySet()) { - for (IPage page : entry.getValue().pageList) { - if (page instanceof PageText) { + for (Entry entry : entries.entrySet()) + { + for (IPage page : entry.getValue().pageList) + { + if (page instanceof PageText) + { ((PageText) page).setUnicodeFlag(true); } } @@ -119,7 +131,8 @@ public class CategoryRitual { return entries; } - public static void addRitualPagesToEntries(String name, Map 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/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 544df8a9..c3da05f3 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -49,6 +49,7 @@ public class ModRituals public static Ritual portalRitual; public static Ritual ellipsoidRitual; + public static Ritual crystalSplitRitual; public static Ritual meteorRitual; @@ -125,6 +126,9 @@ public class ModRituals ellipsoidRitual = new RitualEllipsoid(); RitualRegistry.registerRitual(ellipsoidRitual, ConfigHandler.rituals.ritualEllipsoid); + crystalSplitRitual = new RitualCrystalSplit(); + RitualRegistry.registerRitual(crystalSplitRitual, ConfigHandler.rituals.ritualCrystalSplit); + RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.BASIC.getStack(), 250, 0.5); RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.EXPLOSIVE.getStack(), 25, 0.05); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java new file mode 100644 index 00000000..5930d6d9 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java @@ -0,0 +1,192 @@ +package WayofTime.bloodmagic.ritual.types; + +import java.util.function.Consumer; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; +import WayofTime.bloodmagic.ritual.EnumRuneType; +import WayofTime.bloodmagic.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.ritual.Ritual; +import WayofTime.bloodmagic.ritual.RitualComponent; +import WayofTime.bloodmagic.soul.EnumDemonWillType; +import WayofTime.bloodmagic.tile.TileDemonCrystal; + +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(); + EnumFacing direction = masterRitualStone.getDirection(); + BlockPos rawPos = pos.up(2); + + TileEntity tile = world.getTileEntity(rawPos); + if (!(tile instanceof TileDemonCrystal) || ((TileDemonCrystal) tile).getType() != EnumDemonWillType.DEFAULT) + { + return; + } + + IBlockState rawState = world.getBlockState(rawPos); + + TileDemonCrystal rawTile = (TileDemonCrystal) tile; + if (rawTile.crystalCount >= 5) + { + BlockPos vengefulPos = pos.offset(rotateFacing(EnumFacing.NORTH, direction)).up(); + BlockPos corrosivePos = pos.offset(rotateFacing(EnumFacing.EAST, direction)).up(); + BlockPos steadfastPos = pos.offset(rotateFacing(EnumFacing.SOUTH, direction)).up(); + BlockPos destructivePos = pos.offset(rotateFacing(EnumFacing.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 EnumFacing rotateFacing(EnumFacing facing, EnumFacing 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(); + IBlockState 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(EntityPlayer player) + { + return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info") }; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index a4b878e6..392b3ebf 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -1,16 +1,17 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.block.BlockDemonCrystal; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +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; public class TileDemonCrystal extends TileTicking { @@ -42,12 +43,12 @@ public class TileDemonCrystal extends TileTicking if (internalCounter % 20 == 0 && crystalCount < 7) { - EnumDemonWillType type = EnumDemonWillType.values()[this.getBlockMetadata()]; + EnumDemonWillType type = getType(); double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); if (type != EnumDemonWillType.DEFAULT) { - if (value >= 100) + if (value >= 0.5) { double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; @@ -118,6 +119,11 @@ public class TileDemonCrystal extends TileTicking return percentDrain * progressPercentage; } + public EnumDemonWillType getType() + { + return EnumDemonWillType.values()[this.getBlockMetadata()]; + } + public void checkAndGrowCrystal() { if (progressToNextCrystal >= 1 && internalCounter % 100 == 0) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index eb97e4cb..0fd56f0c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -1,17 +1,18 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWillConduit; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.tile.base.TileTicking; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; 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 class TileDemonCrystallizer extends TileTicking implements IDemonWillConduit +{ public static final int maxWill = 100; public static final double drainRate = 1; public static final double willToFormCrystal = 99; @@ -20,13 +21,16 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond public DemonWillHolder holder = new DemonWillHolder(); public double internalCounter = 0; - public TileDemonCrystallizer() { + public TileDemonCrystallizer() + { } @Override - public void onUpdate() { - if (getWorld().isRemote) { + public void onUpdate() + { + if (getWorld().isRemote) + { return; } @@ -35,11 +39,15 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond { EnumDemonWillType highestType = WorldDemonWillHandler.getHighestDemonWillType(getWorld(), pos); double amount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, highestType); - if (amount >= willToFormCrystal) { + if (amount >= willToFormCrystal) + { internalCounter += getCrystalFormationRate(amount); - if (internalCounter >= totalFormationTime) { - if (WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) { - if (highestType == EnumDemonWillType.DEFAULT && formRandomSpecialCrystal(offsetPos) || formCrystal(highestType, offsetPos)) { + 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; } @@ -49,10 +57,12 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } } - public boolean formCrystal(EnumDemonWillType type, BlockPos position) { + 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) { + if (tile instanceof TileDemonCrystal) + { ((TileDemonCrystal) tile).setPlacement(EnumFacing.UP); return true; } @@ -60,26 +70,21 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond return false; } - public boolean formRandomSpecialCrystal(BlockPos position) { - if (getWorld().rand.nextDouble() > 0.1) { - return formCrystal(EnumDemonWillType.DEFAULT, position); - } - EnumDemonWillType crystalType = EnumDemonWillType.values()[getWorld().rand.nextInt(EnumDemonWillType.values().length - 1) + 1]; - return formCrystal(crystalType, position); - } - - public double getCrystalFormationRate(double currentWill) { + public double getCrystalFormationRate(double currentWill) + { return 1; } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(NBTTagCompound tag) + { holder.readFromNBT(tag, "Will"); internalCounter = tag.getDouble("internalCounter"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public NBTTagCompound serialize(NBTTagCompound tag) + { holder.writeToNBT(tag, "Will"); tag.setDouble("internalCounter", internalCounter); return tag; @@ -88,21 +93,26 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond // IDemonWillConduit @Override - public int getWeight() { + public int getWeight() + { return 10; } @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { - if (amount <= 0) { + public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) + { + if (amount <= 0) + { return 0; } - if (!canFill(type)) { + if (!canFill(type)) + { return 0; } - if (!doFill) { + if (!doFill) + { return Math.min(maxWill - holder.getWill(type), amount); } @@ -110,14 +120,17 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { + public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) + { double drained = amount; double current = holder.getWill(type); - if (current < drained) { + if (current < drained) + { drained = current; } - if (doDrain) { + if (doDrain) + { return holder.drainWill(type, amount); } @@ -125,17 +138,20 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public boolean canFill(EnumDemonWillType type) { + public boolean canFill(EnumDemonWillType type) + { return true; } @Override - public boolean canDrain(EnumDemonWillType type) { + public boolean canDrain(EnumDemonWillType type) + { return true; } @Override - public double getCurrentWill(EnumDemonWillType type) { + public double getCurrentWill(EnumDemonWillType type) + { return holder.getWill(type); } } \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index befcd6ac..73a05bfd 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -613,6 +613,7 @@ 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 Crytstal 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. @@ -659,6 +660,7 @@ ritual.bloodmagic.animalGrowthRitual.default.info=(Raw) Increases the speed of t 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.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. diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index d0ff5595..222ea2ab 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -50,6 +50,7 @@ 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 # 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. @@ -81,6 +82,7 @@ guide.bloodmagic.entry.ritual.laying.info=As many are aware, being able to place 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 mudpack 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. # Architect Entries guide.bloodmagic.entry.architect.intro=Foreword @@ -231,7 +233,7 @@ guide.bloodmagic.entry.demon.routing.info=Item transport in Blood Magic comes fr 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. When Will of the same type bump into each other in the Aura it tends to congregate similar to how impurities in an otherwise homogeneous liquid clump together. If a device is able to latch onto these clumps within the Raw Will in the Aura, chunks of pure Will of a particular type can be gathered. One such device 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 pray 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\tWhen it generates a crystal from Raw Will, there is a small chance (~40%%) for the formed crystal to be of one of the aspected types. Essentially, this is how you can initially gather the different types of Will. +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 Crash of the 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. From c9319477bd378469f2d47aea1e2bb8daabf2dec1 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 20 Apr 2018 16:11:05 -0400 Subject: [PATCH 274/595] Made the Blood Altar check if it had a null recipe on update while active. (Actual change on line 271) Potential fix for #1275. --- changelog.txt | 1 + .../bloodmagic/altar/BloodAltar.java | 263 ++++++++++++------ 2 files changed, 178 insertions(+), 86 deletions(-) diff --git a/changelog.txt b/changelog.txt index 1a56be77..a812faeb 100644 --- a/changelog.txt +++ b/changelog.txt @@ -10,6 +10,7 @@ Version 2.2.9 - 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 diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 70eedb21..5fc75ba7 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -30,7 +30,8 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.ItemHandlerHelper; -public class BloodAltar implements IFluidHandler { +public class BloodAltar implements IFluidHandler +{ public boolean isActive; protected FluidStack fluidOutput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); @@ -67,12 +68,15 @@ public class BloodAltar implements IFluidHandler { private RecipeBloodAltar recipe; private AltarTier currentTierDisplayed = AltarTier.ONE; - public BloodAltar(TileAltar tileAltar) { + public BloodAltar(TileAltar tileAltar) + { this.tileAltar = tileAltar; } - public void readFromNBT(NBTTagCompound tagCompound) { - if (!tagCompound.hasKey(Constants.NBT.EMPTY)) { + public void readFromNBT(NBTTagCompound tagCompound) + { + if (!tagCompound.hasKey(Constants.NBT.EMPTY)) + { FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagCompound); if (fluid != null) @@ -115,7 +119,8 @@ public class BloodAltar implements IFluidHandler { currentTierDisplayed = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(AltarTier.ONE); } - public void writeToNBT(NBTTagCompound tagCompound) { + public void writeToNBT(NBTTagCompound tagCompound) + { if (fluid != null) fluid.writeToNBT(tagCompound); @@ -158,7 +163,8 @@ public class BloodAltar implements IFluidHandler { tagCompound.setString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED, currentTierDisplayed.name()); } - public void startCycle() { + public void startCycle() + { if (tileAltar.getWorld() != null) tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); @@ -172,11 +178,14 @@ public class BloodAltar implements IFluidHandler { ItemStack input = tileAltar.getStackInSlot(0); - if (!input.isEmpty()) { + if (!input.isEmpty()) + { // Do recipes RecipeBloodAltar recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getBloodAltar(input); - if (recipe != null) { - if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) { + if (recipe != null) + { + if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) + { this.isActive = true; this.recipe = recipe; this.liquidRequired = recipe.getSyphon(); @@ -185,7 +194,8 @@ public class BloodAltar implements IFluidHandler { this.canBeFilled = false; return; } - } else if (input.getItem() instanceof IBloodOrb) { + } else if (input.getItem() instanceof IBloodOrb) + { this.isActive = true; this.canBeFilled = true; return; @@ -195,7 +205,8 @@ public class BloodAltar implements IFluidHandler { isActive = false; } - public void update() { + public void update() + { World world = tileAltar.getWorld(); BlockPos pos = tileAltar.getPos(); @@ -208,14 +219,17 @@ public class BloodAltar implements IFluidHandler { if (lockdownDuration > 0) lockdownDuration--; - if (internalCounter % 20 == 0) { - for (EnumFacing facing : EnumFacing.VALUES) { + if (internalCounter % 20 == 0) + { + for (EnumFacing facing : EnumFacing.VALUES) + { BlockPos newPos = pos.offset(facing); IBlockState block = world.getBlockState(newPos); block.getBlock().onNeighborChange(world, newPos, pos); } } - if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) { + if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) + { int syphonMax = (int) (20 * this.dislocationMultiplier); int fluidInputted; int fluidOutputted; @@ -230,7 +244,8 @@ public class BloodAltar implements IFluidHandler { tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) { + if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) + { int chargeInputted = Math.min(chargingRate, this.fluid.amount); chargeInputted = Math.min(chargeInputted, maxCharge - totalCharge); totalCharge += chargeInputted; @@ -244,13 +259,21 @@ public class BloodAltar implements IFluidHandler { updateAltar(); } - private void updateAltar() { - if (!isActive) { + private void updateAltar() + { + if (!isActive) + { if (cooldownAfterCrafting > 0) cooldownAfterCrafting--; return; } + if (recipe == null) + { + startCycle(); + return; + } + ItemStack input = tileAltar.getStackInSlot(0); if (input.isEmpty()) @@ -262,11 +285,13 @@ public class BloodAltar implements IFluidHandler { if (world.isRemote) return; - if (!canBeFilled) { + if (!canBeFilled) + { boolean hasOperated = false; int stackSize = input.getCount(); - if (totalCharge > 0) { + if (totalCharge > 0) + { int chargeDrained = Math.min(liquidRequired * stackSize - progress, totalCharge); totalCharge -= chargeDrained; @@ -274,7 +299,8 @@ public class BloodAltar implements IFluidHandler { hasOperated = true; } - if (fluid != null && fluid.amount >= 1) { + 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)) @@ -285,22 +311,27 @@ public class BloodAltar implements IFluidHandler { hasOperated = true; - if (internalCounter % 4 == 0 && world instanceof WorldServer) { + if (internalCounter % 4 == 0 && world instanceof WorldServer) + { WorldServer server = (WorldServer) 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) { + } else if (!hasOperated && progress > 0) + { progress -= (int) (efficiencyMultiplier * drainRate); - if (internalCounter % 2 == 0 && world instanceof WorldServer) { + if (internalCounter % 2 == 0 && world instanceof WorldServer) + { WorldServer server = (WorldServer) 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) { + if (hasOperated) + { + if (progress >= liquidRequired * stackSize) + { ItemStack result = ItemHandlerHelper.copyStackWithSize(recipe.getOutput(), stackSize); BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(result, input.copy()); @@ -308,7 +339,8 @@ public class BloodAltar implements IFluidHandler { tileAltar.setInventorySlotContents(0, event.getOutput()); progress = 0; - if (world instanceof WorldServer) { + if (world instanceof WorldServer) + { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 40, 0.3, 0, 0.3, 0); } @@ -317,7 +349,8 @@ public class BloodAltar implements IFluidHandler { this.isActive = false; } } - } else { + } else + { ItemStack contained = tileAltar.getStackInSlot(0); if (contained.isEmpty() || !(contained.getItem() instanceof IBloodOrb) || !(contained.getItem() instanceof IBindable)) @@ -329,13 +362,15 @@ public class BloodAltar implements IFluidHandler { if (binding == null || orb == null) return; - if (fluid != null && fluid.amount >= 1) { + 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(liquidDrained, (int) (orb.getCapacity() * this.orbCapacityMultiplier)); fluid.amount = fluid.amount - drain; - if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) { + if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) + { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.SPELL_WITCH, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0, 0, 0, 0.001); } @@ -345,7 +380,8 @@ public class BloodAltar implements IFluidHandler { tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - public void checkTier() { + public void checkTier() + { AltarTier tier = AltarUtil.getTier(tileAltar.getWorld(), tileAltar.getPos()); this.altarTier = tier; @@ -354,7 +390,8 @@ public class BloodAltar implements IFluidHandler { if (tier.equals(currentTierDisplayed)) currentTierDisplayed = AltarTier.ONE; - if (tier.equals(AltarTier.ONE)) { + if (tier.equals(AltarTier.ONE)) + { upgrade = null; isUpgraded = false; this.consumptionMultiplier = 0; @@ -370,7 +407,8 @@ public class BloodAltar implements IFluidHandler { this.maxCharge = 0; this.totalCharge = 0; return; - } else if (!tier.equals(AltarTier.ONE)) { + } else if (!tier.equals(AltarTier.ONE)) + { this.isUpgraded = true; this.accelerationUpgrades = upgrade.getLevel(BloodRuneType.ACCELERATION); this.consumptionMultiplier = (float) (0.20 * upgrade.getLevel(BloodRuneType.SPEED)); @@ -400,103 +438,128 @@ public class BloodAltar implements IFluidHandler { tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - public int fillMainTank(int amount) { + 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) { + 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 { + } else + { fluid.amount += Math.min(capacity - fluid.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount); } } - public void setMainFluid(FluidStack fluid) { + public void setMainFluid(FluidStack fluid) + { this.fluid = fluid; } - public void setOutputFluid(FluidStack fluid) { + public void setOutputFluid(FluidStack fluid) + { this.fluidOutput = fluid; } - public void setInputFluid(FluidStack fluid) { + public void setInputFluid(FluidStack fluid) + { this.fluidInput = fluid; } - public AltarUpgrade getUpgrade() { + public AltarUpgrade getUpgrade() + { return upgrade; } - public void setUpgrade(AltarUpgrade upgrade) { + public void setUpgrade(AltarUpgrade upgrade) + { this.upgrade = upgrade; } - public int getCapacity() { + public int getCapacity() + { return capacity; } - public FluidStack getFluid() { + public FluidStack getFluid() + { return fluid; } - public int getFluidAmount() { + public int getFluidAmount() + { return fluid.amount; } - public int getCurrentBlood() { + public int getCurrentBlood() + { return getFluidAmount(); } - public AltarTier getTier() { + public AltarTier getTier() + { return altarTier; } - public void setTier(AltarTier tier) { + public void setTier(AltarTier tier) + { this.altarTier = tier; } - public int getProgress() { + public int getProgress() + { return progress; } - public float getSacrificeMultiplier() { + public float getSacrificeMultiplier() + { return sacrificeEfficiencyMultiplier; } - public float getSelfSacrificeMultiplier() { + public float getSelfSacrificeMultiplier() + { return selfSacrificeEfficiencyMultiplier; } - public float getOrbMultiplier() { + public float getOrbMultiplier() + { return orbCapacityMultiplier; } - public float getDislocationMultiplier() { + public float getDislocationMultiplier() + { return dislocationMultiplier; } - public float getConsumptionMultiplier() { + public float getConsumptionMultiplier() + { return consumptionMultiplier; } - public float getConsumptionRate() { + public float getConsumptionRate() + { return consumptionRate; } - public int getLiquidRequired() { + public int getLiquidRequired() + { return liquidRequired; } - public int getBufferCapacity() { + public int getBufferCapacity() + { return bufferCapacity; } - public boolean setCurrentTierDisplayed(AltarTier altarTier) { + public boolean setCurrentTierDisplayed(AltarTier altarTier) + { if (currentTierDisplayed == altarTier) return false; else @@ -504,79 +567,99 @@ public class BloodAltar implements IFluidHandler { return true; } - public void addToDemonBloodDuration(int dur) { + public void addToDemonBloodDuration(int dur) + { this.demonBloodDuration += dur; } - public boolean hasDemonBlood() { + public boolean hasDemonBlood() + { return this.demonBloodDuration > 0; } - public void decrementDemonBlood() { + public void decrementDemonBlood() + { this.demonBloodDuration = Math.max(0, this.demonBloodDuration - 1); } - public void setActive() { - if (tileAltar.getStackInSlot(0).isEmpty()) { + public void setActive() + { + if (tileAltar.getStackInSlot(0).isEmpty()) + { isActive = false; } } - public boolean isActive() { + public boolean isActive() + { return isActive; } - public void requestPauseAfterCrafting(int amount) { - if (this.isActive) { + public void requestPauseAfterCrafting(int amount) + { + if (this.isActive) + { this.cooldownAfterCrafting = amount; } } - public int getChargingRate() { + public int getChargingRate() + { return chargingRate; } - public int getTotalCharge() { + public int getTotalCharge() + { return totalCharge; } - public int getChargingFrequency() { + public int getChargingFrequency() + { return chargingFrequency == 0 ? 1 : chargingFrequency; } @Override - public int fill(FluidStack resource, boolean doFill) { - if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) { + public int fill(FluidStack resource, boolean doFill) + { + if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) + { return 0; } - if (!doFill) { - if (fluidInput == null) { + if (!doFill) + { + if (fluidInput == null) + { return Math.min(bufferCapacity, resource.amount); } - if (!fluidInput.isFluidEqual(resource)) { + if (!fluidInput.isFluidEqual(resource)) + { return 0; } return Math.min(bufferCapacity - fluidInput.amount, resource.amount); } - if (fluidInput == null) { + if (fluidInput == null) + { fluidInput = new FluidStack(resource, Math.min(bufferCapacity, resource.amount)); return fluidInput.amount; } - if (!fluidInput.isFluidEqual(resource)) { + if (!fluidInput.isFluidEqual(resource)) + { return 0; } int filled = bufferCapacity - fluidInput.amount; - if (resource.amount < filled) { + if (resource.amount < filled) + { fluidInput.amount += resource.amount; filled = resource.amount; - } else { + } else + { fluidInput.amount = bufferCapacity; } @@ -584,37 +667,45 @@ public class BloodAltar implements IFluidHandler { } @Override - public FluidStack drain(FluidStack resource, boolean doDrain) { - if (resource == null || !resource.isFluidEqual(fluidOutput)) { + 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) { + public FluidStack drain(int maxDrain, boolean doDrain) + { + if (fluidOutput == null) + { return null; } int drained = maxDrain; - if (fluidOutput.amount < drained) { + if (fluidOutput.amount < drained) + { drained = fluidOutput.amount; } FluidStack stack = new FluidStack(fluidOutput, drained); - if (doDrain) { + if (doDrain) + { fluidOutput.amount -= drained; } return stack; } @Override - public IFluidTankProperties[] getTankProperties() { - return new IFluidTankProperties[]{new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity))}; + public IFluidTankProperties[] getTankProperties() + { + return new IFluidTankProperties[] { new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity)) }; } - public AltarTier getCurrentTierDisplayed() { + public AltarTier getCurrentTierDisplayed() + { return currentTierDisplayed; } } From ddf07acf703e63c331dbda82375cd60b6a98d114 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 21 Apr 2018 16:42:22 -0700 Subject: [PATCH 275/595] "way pls" - WayofTime 2018 --- src/main/resources/assets/bloodmagic/lang/en_US.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 73a05bfd..b74fe090 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -535,7 +535,7 @@ 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.itemFilter.exact=Filters the fluid input/output +tooltip.bloodmagic.fluidFilter.exact=Filters the fluid input/output tooltip.bloodmagic.fluid.type=Fluid Contained: %s tooltip.bloodmagic.fluid.amount=Amount: %d / %d mB From afcf1a1822f5240fe52dea3fcdd4784e5bf7ccb6 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sat, 21 Apr 2018 16:53:19 -0700 Subject: [PATCH 276/595] Add a recipe for the fluid filter --- .../item/routing/ItemFluidRouterFilter.java | 7 +++--- .../recipes/base_fluid_filter_0.json | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/bloodmagic/recipes/base_fluid_filter_0.json diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index 1437dbd1..534ab3c4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -52,7 +52,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @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()])); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.fluidFilter." + names[stack.getItemDamage()])); super.addInformation(stack, world, tooltip, flag); } @@ -89,8 +89,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { - IFluidFilter testFilter = new RoutingFluidFilter(); - + IFluidFilter testFilter; switch (filterStack.getMetadata()) { case 0: testFilter = new RoutingFluidFilter(); @@ -104,7 +103,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, 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 == null) { + if (stack.isEmpty()) { continue; } 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 new file mode 100644 index 00000000..29d26032 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/recipes/base_fluid_filter_0.json @@ -0,0 +1,24 @@ +{ + "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 From 37f9ea2ab23393a8ecb5880cdec9e48391789e01 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 22 Apr 2018 16:04:08 -0400 Subject: [PATCH 277/595] Fixed server-sided crash for the turret array (why is Vec2f not found on the server???) --- changelog.txt | 6 ++++++ .../alchemyArray/AlchemyArrayEffectArrowTurret.java | 11 ++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/changelog.txt b/changelog.txt index a812faeb..f34df715 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +------------------------------------------------------ +Version 2.2.10 +------------------------------------------------------ +- Fixed Turret Array crash on servers. + + ------------------------------------------------------ Version 2.2.9 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java index 25d838cb..d2782237 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java @@ -15,12 +15,13 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.util.Utils; +import com.sun.javafx.geom.Vec2d; + public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { public EntityLiving target; @@ -91,7 +92,7 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect if (canFireOnMob(world, pos, target)) { - Vec2f pitchYaw = getPitchYaw(pos, target); + Vec2d pitchYaw = getPitchYaw(pos, target); lastPitch = pitch; lastYaw = yaw; pitch = pitchYaw.x; @@ -179,11 +180,11 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect } } - public static Vec2f getPitchYaw(BlockPos pos, Entity entityIn) + public static Vec2d getPitchYaw(BlockPos pos, Entity entityIn) { if (entityIn == null) { - return new Vec2f(0, 0); + return new Vec2d(0, 0); } double distanceX = entityIn.posX - (pos.getX() + 0.5); @@ -193,7 +194,7 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect double yaw = Math.atan2(-distanceX, distanceZ) * 180 / Math.PI; double pitch = -Math.atan2(distanceY, radialDistance) * 180 / Math.PI; - return new Vec2f((float) pitch, (float) yaw); + return new Vec2d((float) pitch, (float) yaw); } public boolean canEntityBeSeen(World world, BlockPos pos, Entity entityIn) From f4aef16ed13ca108250f7e1e72bd2832fa9fc31e Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 22 Apr 2018 16:14:36 -0400 Subject: [PATCH 278/595] Fixed the Turret Array. (Deja vu) --- .../alchemyArray/AlchemyArrayEffectArrowTurret.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java index d2782237..ccebac1f 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java @@ -2,6 +2,8 @@ package WayofTime.bloodmagic.alchemyArray; import java.util.List; +import javax.vecmath.Vector2d; + import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.monster.EntityMob; @@ -20,8 +22,6 @@ import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.util.Utils; -import com.sun.javafx.geom.Vec2d; - public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { public EntityLiving target; @@ -92,7 +92,7 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect if (canFireOnMob(world, pos, target)) { - Vec2d pitchYaw = getPitchYaw(pos, target); + Vector2d pitchYaw = getPitchYaw(pos, target); lastPitch = pitch; lastYaw = yaw; pitch = pitchYaw.x; @@ -180,11 +180,11 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect } } - public static Vec2d getPitchYaw(BlockPos pos, Entity entityIn) + public static Vector2d getPitchYaw(BlockPos pos, Entity entityIn) { if (entityIn == null) { - return new Vec2d(0, 0); + return new Vector2d(0, 0); } double distanceX = entityIn.posX - (pos.getX() + 0.5); @@ -194,7 +194,7 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect double yaw = Math.atan2(-distanceX, distanceZ) * 180 / Math.PI; double pitch = -Math.atan2(distanceY, radialDistance) * 180 / Math.PI; - return new Vec2d((float) pitch, (float) yaw); + return new Vector2d(pitch, yaw); } public boolean canEntityBeSeen(World world, BlockPos pos, Entity entityIn) From 6522b0fa1b98759f28048a1e6120322c2d0334bb Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 22 Apr 2018 20:59:29 -0400 Subject: [PATCH 279/595] Fixed the Blood Altar so it can actually fill Blood Orbs (derp). --- changelog.txt | 2 +- gradle.properties | 2 +- src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/changelog.txt b/changelog.txt index f34df715..36548cc2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,7 +2,7 @@ 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 diff --git a/gradle.properties b/gradle.properties index d81bba9b..203e4f8f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.8 +mod_version=2.2.10 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 5fc75ba7..0a6fcdb9 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -268,7 +268,7 @@ public class BloodAltar implements IFluidHandler return; } - if (recipe == null) + if (!canBeFilled && recipe == null) { startCycle(); return; @@ -365,7 +365,6 @@ public class BloodAltar implements IFluidHandler 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(liquidDrained, (int) (orb.getCapacity() * this.orbCapacityMultiplier)); fluid.amount = fluid.amount - drain; From da8e43a8b494df393687af91415a69f8b10db227 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 24 Apr 2018 17:06:43 -0700 Subject: [PATCH 280/595] Fix Blood Tank NBT transfer between item/tile form (#1283) --- .../bloodmagic/block/BlockBloodTank.java | 26 +++++++++---------- .../item/block/ItemBlockBloodTank.java | 5 ++-- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index b9dfe15d..9140427b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -5,7 +5,6 @@ import WayofTime.bloodmagic.block.base.BlockInteger; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.block.ItemBlockBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank; -import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -20,6 +19,7 @@ import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; @@ -32,7 +32,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; 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); @@ -113,23 +112,22 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public List getDrops(IBlockAccess world, BlockPos pos, IBlockState blockState, int fortune) { - List list = Lists.newArrayList(); - + public void getDrops(NonNullList drops, IBlockAccess world, BlockPos pos, IBlockState blockState, int fortune) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBloodTank) { TileBloodTank bloodTank = (TileBloodTank) tile; ItemStack drop = new ItemStack(this, 1, bloodTank.getBlockMetadata()); - NBTTagCompound tag = new NBTTagCompound(); + NBTTagCompound fluidTag = new NBTTagCompound(); - if (bloodTank.getTank().getFluid() != null) - bloodTank.getTank().getFluid().writeToNBT(tag); + if (bloodTank.getTank().getFluid() != null) { + bloodTank.getTank().getFluid().writeToNBT(fluidTag); + NBTTagCompound dropTag = new NBTTagCompound(); + dropTag.setTag("Fluid", fluidTag); + drop.setTagCompound(dropTag); + } - drop.setTagCompound(tag); - list.add(drop); + drops.add(drop); } - - return list; } @Override @@ -138,8 +136,8 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB if (tile instanceof TileBloodTank) { TileBloodTank bloodTank = (TileBloodTank) tile; NBTTagCompound tag = stack.getTagCompound(); - if (tag != null) { - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); + if (stack.hasTagCompound() && stack.getTagCompound().hasKey("Fluid")) { + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag("Fluid")); bloodTank.getTank().setFluid(fluidStack); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index 0e8bb21d..f614ed34 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -47,9 +47,8 @@ public class ItemBlockBloodTank extends ItemBlock { 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()) { - NBTTagCompound tag = stack.getTagCompound(); - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); + 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))); From 151c1dfd67819b8ab00572f768d70e42f9659b97 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 24 Apr 2018 17:08:08 -0700 Subject: [PATCH 281/595] "way pls" - TehNut 2018 (#1279) --- src/main/resources/assets/bloodmagic/lang/en_US.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index b74fe090..11123441 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -613,7 +613,7 @@ 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 Crytstal +ritual.bloodmagic.crystalSplitRitual=Resonance of the Faceted Crystal 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. From 842c9d1411f17a18e96199ac3392906651429da1 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Thu, 26 Apr 2018 16:33:22 -0400 Subject: [PATCH 282/595] Fixed the Alchemy Array from voiding items when broken when it shouldn't have. --- changelog.txt | 6 ++++++ .../java/WayofTime/bloodmagic/tile/TileAlchemyArray.java | 6 +----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/changelog.txt b/changelog.txt index 36548cc2..0ee1e6e0 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +------------------------------------------------------ +Version 2.2.10-94 +------------------------------------------------------ +- Fixed the Alchemy Array from voiding items when broken when it shouldn't have. +- Fixed Blood Tank NBT transfer between item/tile form. + ------------------------------------------------------ Version 2.2.10 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index a8f0ff7c..c1c82c2c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -118,14 +118,10 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche @Override public void dropItems() { - if (!doDropIngredients) + if (arrayEffect == null || doDropIngredients) { super.dropItems(); } - if (arrayEffect != null) - { - - } } public boolean attemptCraft() From 26d67e68eb3e2c750a8a77b880dce42352c04614 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Thu, 26 Apr 2018 17:16:41 -0400 Subject: [PATCH 283/595] Quickly fixed something to avoid the wrath that anyone with a nut allergy would fear. --- changelog.txt | 3 ++- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/changelog.txt b/changelog.txt index 0ee1e6e0..d3e2ee41 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,8 +1,9 @@ ------------------------------------------------------ -Version 2.2.10-94 +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 diff --git a/gradle.properties b/gradle.properties index 203e4f8f..3c89390d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.10 +mod_version=2.2.11 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From 560d1677657a0151b09524be01eb6e252a97e8e1 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 26 Apr 2018 19:12:14 -0700 Subject: [PATCH 284/595] Check the proper maps when looking up fluid priorities (#1286) When copypasta goes wrong. --- .../bloodmagic/tile/routing/TileMasterRoutingNode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index 776901f4..51318fdc 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -98,7 +98,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (filter != null) { int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) + if (outputFluidMap.containsKey(priority)) { outputFluidMap.get(priority).add(filter); } else @@ -164,7 +164,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (filter != null) { int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) + if (inputFluidMap.containsKey(priority)) { inputFluidMap.get(priority).add(filter); } else From eb6b8a3aa5559363ff5fe242783ac4daa8ee8d26 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 28 Apr 2018 21:56:57 -0400 Subject: [PATCH 285/595] Small bit of framework for Soul Breath items, plus testing with the "Scroll of Icarus". Crafting mechanic as well as refilling of its resource not implemented. --- .../bloodmagic/core/RegistrarBloodMagic.java | 27 +++-- .../core/RegistrarBloodMagicItems.java | 106 +++++++++++++----- .../potion/PotionEventHandlers.java | 76 ++++++++++--- .../bloodmagic/registry/ModRecipes.java | 1 + .../WayofTime/bloodmagic/util/Constants.java | 20 +++- .../assets/bloodmagic/lang/en_US.lang | 2 + .../bloodmagic/textures/misc/potions.png | Bin 2109 -> 2109 bytes 7 files changed, 174 insertions(+), 58 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 9b0c4e9a..c039399d 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -1,14 +1,5 @@ package WayofTime.bloodmagic.core; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.orb.BloodOrb; -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.potion.PotionBloodMagic; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.init.MobEffects; import net.minecraft.potion.Potion; @@ -25,6 +16,20 @@ 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; +import WayofTime.bloodmagic.core.registry.OrbRegistry; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; +import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; +import WayofTime.bloodmagic.entity.mob.EntityMimic; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; +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; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @@ -57,6 +62,7 @@ public class RegistrarBloodMagic public static final Potion BOUNCE = MobEffects.HASTE; public static final Potion CLING = MobEffects.HASTE; public static final Potion SACRIFICIAL_LAMB = MobEffects.HASTE; + public static final Potion FLIGHT = MobEffects.HASTE; public static IForgeRegistry BLOOD_ORBS = null; @@ -88,7 +94,8 @@ public class RegistrarBloodMagic 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("S. Lamb", false, 0x000000, 3, 1).setRegistryName("sacrificial_lamb"), + new PotionBloodMagic("Flight", false, 0x000000, 4, 0).setRegistryName("flight") ); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index caa674b9..fd76818f 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -1,29 +1,11 @@ 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.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 java.util.List; +import java.util.Set; + import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.init.Items; import net.minecraft.inventory.EntityEquipmentSlot; @@ -38,9 +20,81 @@ 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 WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.block.IBMBlock; +import WayofTime.bloodmagic.client.IMeshProvider; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.item.ItemActivationCrystal; +import WayofTime.bloodmagic.item.ItemAlchemicVial; +import WayofTime.bloodmagic.item.ItemAltarMaker; +import WayofTime.bloodmagic.item.ItemArcaneAshes; +import WayofTime.bloodmagic.item.ItemBloodOrb; +import WayofTime.bloodmagic.item.ItemBoundAxe; +import WayofTime.bloodmagic.item.ItemBoundPickaxe; +import WayofTime.bloodmagic.item.ItemBoundShovel; +import WayofTime.bloodmagic.item.ItemBoundSword; +import WayofTime.bloodmagic.item.ItemDaggerOfSacrifice; +import WayofTime.bloodmagic.item.ItemDemonCrystal; +import WayofTime.bloodmagic.item.ItemDemonWillGauge; +import WayofTime.bloodmagic.item.ItemEnum; +import WayofTime.bloodmagic.item.ItemExperienceBook; +import WayofTime.bloodmagic.item.ItemInscriptionTool; +import WayofTime.bloodmagic.item.ItemLavaCrystal; +import WayofTime.bloodmagic.item.ItemPotionFlask; +import WayofTime.bloodmagic.item.ItemRitualDiviner; +import WayofTime.bloodmagic.item.ItemRitualReader; +import WayofTime.bloodmagic.item.ItemSacrificialDagger; +import WayofTime.bloodmagic.item.ItemSanguineBook; +import WayofTime.bloodmagic.item.ItemSlate; +import WayofTime.bloodmagic.item.ItemTelepositionFocus; +import WayofTime.bloodmagic.item.ItemUpgradeTome; +import WayofTime.bloodmagic.item.ItemUpgradeTrainer; +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.ItemSigilAir; +import WayofTime.bloodmagic.item.sigil.ItemSigilBloodLight; +import WayofTime.bloodmagic.item.sigil.ItemSigilBounce; +import WayofTime.bloodmagic.item.sigil.ItemSigilClaw; +import WayofTime.bloodmagic.item.sigil.ItemSigilCompression; +import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; +import WayofTime.bloodmagic.item.sigil.ItemSigilElementalAffinity; +import WayofTime.bloodmagic.item.sigil.ItemSigilEnderSeverance; +import WayofTime.bloodmagic.item.sigil.ItemSigilFastMiner; +import WayofTime.bloodmagic.item.sigil.ItemSigilFrost; +import WayofTime.bloodmagic.item.sigil.ItemSigilGreenGrove; +import WayofTime.bloodmagic.item.sigil.ItemSigilHaste; +import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; +import WayofTime.bloodmagic.item.sigil.ItemSigilLava; +import WayofTime.bloodmagic.item.sigil.ItemSigilMagnetism; +import WayofTime.bloodmagic.item.sigil.ItemSigilPhantomBridge; +import WayofTime.bloodmagic.item.sigil.ItemSigilSuppression; +import WayofTime.bloodmagic.item.sigil.ItemSigilTeleposition; +import WayofTime.bloodmagic.item.sigil.ItemSigilTransposition; +import WayofTime.bloodmagic.item.sigil.ItemSigilVoid; +import WayofTime.bloodmagic.item.sigil.ItemSigilWater; +import WayofTime.bloodmagic.item.sigil.ItemSigilWhirlwind; +import WayofTime.bloodmagic.item.soul.ItemMonsterSoul; +import WayofTime.bloodmagic.item.soul.ItemSentientArmourGem; +import WayofTime.bloodmagic.item.soul.ItemSentientAxe; +import WayofTime.bloodmagic.item.soul.ItemSentientBow; +import WayofTime.bloodmagic.item.soul.ItemSentientPickaxe; +import WayofTime.bloodmagic.item.soul.ItemSentientShovel; +import WayofTime.bloodmagic.item.soul.ItemSentientSword; +import WayofTime.bloodmagic.item.soul.ItemSoulGem; +import WayofTime.bloodmagic.item.soul.ItemSoulSnare; +import WayofTime.bloodmagic.item.soulBreath.ItemFlightScroll; +import WayofTime.bloodmagic.item.types.ComponentTypes; +import WayofTime.bloodmagic.item.types.ShardType; -import java.util.List; -import java.util.Set; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @@ -121,6 +175,7 @@ public class RegistrarBloodMagicItems 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); @@ -211,7 +266,8 @@ public class RegistrarBloodMagicItems new ItemLivingArmourPointsUpgrade().setRegistryName("points_upgrade"), new ItemDemonWillGauge().setRegistryName("demon_will_gauge"), new ItemPotionFlask().setRegistryName("potion_flask"), - new ItemAlchemicVial().setRegistryName("alchemic_vial") + new ItemAlchemicVial().setRegistryName("alchemic_vial"), + new ItemFlightScroll().setRegistryName("icarus_scroll") )); event.getRegistry().registerAll(items.toArray(new Item[0])); diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 40d0d5ed..2ffb368b 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -1,10 +1,13 @@ package WayofTime.bloodmagic.potion; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + import net.minecraft.entity.Entity; import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.potion.PotionEffect; @@ -16,15 +19,20 @@ 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.List; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class PotionEventHandlers { +public class PotionEventHandlers +{ + public static List flightList = new ArrayList(); @SubscribeEvent - public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) { - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { + public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) + { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) + { int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); event.getEntityLiving().motionY += (0.1f) * (2 + i); } @@ -35,7 +43,33 @@ public class PotionEventHandlers { } @SubscribeEvent - public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { + public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) + { + if (event.getEntityLiving() instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + 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 (event.getEntityLiving().isPotionActive(ModPotions.boost)) // { // int i = event.getEntityLiving().getActivePotionEffect(ModPotions.boost).getAmplifier(); @@ -52,12 +86,14 @@ public class PotionEventHandlers { // } // } - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.WHIRLWIND)) { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.WHIRLWIND)) + { int d0 = 3; AxisAlignedBB axisAlignedBB = new AxisAlignedBB(event.getEntityLiving().posX - 0.5, event.getEntityLiving().posY - 0.5, event.getEntityLiving().posZ - 0.5, event.getEntityLiving().posX + 0.5, event.getEntityLiving().posY + 0.5, event.getEntityLiving().posZ + 0.5).expand(d0, d0, d0); List entityList = event.getEntityLiving().getEntityWorld().getEntitiesWithinAABB(Entity.class, axisAlignedBB); - for (Entity projectile : entityList) { + for (Entity projectile : entityList) + { if (projectile == null) continue; if (!(projectile instanceof IProjectile)) @@ -84,7 +120,8 @@ public class PotionEventHandlers { if (angle < 3 * (Math.PI / 4)) continue; // angle is < 135 degrees - if (throwingEntity != null) { + if (throwingEntity != null) + { delX = -projectile.posX + throwingEntity.posX; delY = -projectile.posY + (throwingEntity.posY + throwingEntity.getEyeHeight()); delZ = -projectile.posZ + throwingEntity.posZ; @@ -104,26 +141,31 @@ public class PotionEventHandlers { } @SubscribeEvent - public static void onPlayerRespawn(PlayerEvent.Clone event) { + public static void onPlayerRespawn(PlayerEvent.Clone event) + { if (event.isWasDeath()) event.getEntityPlayer().addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, 400)); } @SubscribeEvent - public static void onSacrificeKnifeUsed(SacrificeKnifeUsedEvent event) { + 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) { + 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()) { + public static void onEndermanTeleportEvent(EnderTeleportEvent event) + { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.PLANAR_BINDING) && event.isCancelable()) + { event.setCanceled(true); } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index d84c7548..cbec17ec 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -172,6 +172,7 @@ public class ModRecipes addPotionRecipe(1000, 1, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0), new PotionEffect(MobEffects.HEALTH_BOOST, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Blocks.SLIME_BLOCK), new PotionEffect(RegistrarBloodMagic.BOUNCE, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.STRING), new PotionEffect(RegistrarBloodMagic.CLING, 2 * 60 * 20)); + addPotionRecipe(1000, 1, new ItemStack(Items.CAKE), new PotionEffect(RegistrarBloodMagic.FLIGHT, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new PotionEffect(RegistrarBloodMagic.DEAFNESS, 450)); } diff --git a/src/main/java/WayofTime/bloodmagic/util/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java index 77d6d512..13b43026 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -7,8 +7,10 @@ import net.minecraftforge.fml.common.registry.ForgeRegistries; import java.util.Locale; -public class Constants { - public static class NBT { +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"; @@ -125,13 +127,17 @@ public class Constants { public static final String POTION_IMPURITY = "impurity"; public static final String TANK = "tank"; + + public static final String BREATH = "breath"; } - public static class Mod { + public static class Mod + { public static final String DOMAIN = BloodMagic.MODID.toLowerCase(Locale.ENGLISH) + ":"; } - public static final class Gui { + 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; @@ -140,7 +146,8 @@ public class Constants { public static final int SIGIL_HOLDING_GUI = 5; } - public static class Compat { + 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"; @@ -157,7 +164,8 @@ public class Constants { public static final Item THAUMCRAFT_GOGGLES = ForgeRegistries.ITEMS.getValue(new ResourceLocation("Thaumcraft", "goggles")); } - public static class Misc { + 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 = 30002; diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 11123441..b4b2e0b5 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -190,6 +190,8 @@ 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/potions.png b/src/main/resources/assets/bloodmagic/textures/misc/potions.png index 0ceb8f8ba5ae5f4d9983f4ce6bbe059eed5d4039..f289281240a90f136817ac2eca17b8dedca422a3 100644 GIT binary patch delta 60 zcmdlhuvcJ$mf?Q}AY8C_`D6wL2F?PH$YKTtZeb8+WSBKa0w~B{;_2(k{)k0dgx#!8 LB(HU2^doivKOhlX delta 60 zcmdlhuvcJ$mSGD65NA}Fjz**oCS=tt}T>}nB7 From 7cecdef6c51d8b26b0d2f28df13657764f190190 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 29 Apr 2018 07:39:20 -0400 Subject: [PATCH 286/595] Fixed the Hellfire Forge and Alchemy Table so that they now accept ingredients in any order. --- changelog.txt | 6 + .../api/impl/BloodMagicRecipeRegistrar.java | 160 ++++++++++++------ 2 files changed, 113 insertions(+), 53 deletions(-) diff --git a/changelog.txt b/changelog.txt index d3e2ee41..46e87f91 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +------------------------------------------------------ +Version 2.2.12 +------------------------------------------------------ +- Fixed Hellfire Forge and Alchemy Table's shape-crafted-ness. + + ------------------------------------------------------ Version 2.2.11 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index e65eac53..59fb5dba 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -7,10 +7,12 @@ import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.core.recipe.IngredientBloodOrb; + import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Sets; + import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.NonNullList; @@ -20,17 +22,21 @@ import net.minecraftforge.common.crafting.CraftingHelper; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.annotation.Nullable; + +import java.util.ArrayList; import java.util.List; import java.util.Set; -public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { +public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar +{ private final Set altarRecipes; private final Set alchemyRecipes; private final Set tartaricForgeRecipes; private final Set alchemyArrayRecipes; - public BloodMagicRecipeRegistrar() { + public BloodMagicRecipeRegistrar() + { this.altarRecipes = Sets.newHashSet(); this.alchemyRecipes = Sets.newHashSet(); this.tartaricForgeRecipes = Sets.newHashSet(); @@ -38,7 +44,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Override - public void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate) { + 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."); @@ -50,14 +57,16 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Override - public boolean removeBloodAltar(@Nonnull ItemStack input) { + 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) { + 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."); @@ -68,7 +77,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { 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) { + 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."); @@ -76,8 +86,10 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { Preconditions.checkNotNull(input, "input cannot be null."); List ingredients = Lists.newArrayList(); - for (Object object : input) { - if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) { + 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; } @@ -88,12 +100,14 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { addAlchemyTable(output, syphon, ticks, minimumTier, ingredients.toArray(new Ingredient[0])); } - public void addAlchemyTable(RecipeAlchemyTable recipe) { + public void addAlchemyTable(RecipeAlchemyTable recipe) + { alchemyRecipes.add(recipe); } @Override - public boolean removeAlchemyTable(@Nonnull ItemStack... input) { + public boolean removeAlchemyTable(@Nonnull ItemStack... input) + { Preconditions.checkNotNull(input, "inputs cannot be null."); for (ItemStack stack : input) @@ -103,7 +117,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Override - public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Ingredient... input) { + 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."); @@ -114,7 +129,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Override - public boolean removeTartaricForge(@Nonnull ItemStack... input) { + public boolean removeTartaricForge(@Nonnull ItemStack... input) + { Preconditions.checkNotNull(input, "inputs cannot be null."); for (ItemStack stack : input) @@ -123,15 +139,18 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { return tartaricForgeRecipes.remove(getTartaricForge(Lists.newArrayList(input))); } - public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Object... 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) { + 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; } @@ -143,7 +162,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Override - public void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) { + 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."); @@ -152,14 +172,16 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Override - public boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) { + 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) { + 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."); @@ -168,7 +190,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Nullable - public RecipeBloodAltar getBloodAltar(@Nonnull ItemStack input) { + public RecipeBloodAltar getBloodAltar(@Nonnull ItemStack input) + { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; @@ -181,44 +204,32 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Nullable - public RecipeAlchemyTable getAlchemyTable(@Nonnull List input) { + public RecipeAlchemyTable getAlchemyTable(@Nonnull List input) + { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; - mainLoop: - for (RecipeAlchemyTable recipe : alchemyRecipes) { + mainLoop: for (RecipeAlchemyTable recipe : alchemyRecipes) + { if (recipe.getInput().size() != input.size()) continue; - for (int i = 0; i < input.size(); i++) { - Ingredient ingredient = recipe.getInput().get(i); - if (!ingredient.apply(input.get(i))) - continue mainLoop; - } + List recipeInput = new ArrayList<>(recipe.getInput()); - 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; - - for (int i = 0; i < input.size(); i++) { + for (int i = 0; i < input.size(); i++) + { boolean matched = false; - Ingredient ingredient = recipe.getInput().get(i); - if (ingredient.apply(input.get(i))) - matched = true; + 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; @@ -231,7 +242,46 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { } @Nullable - public RecipeAlchemyArray getAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) { + 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 RecipeAlchemyArray getAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) + { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; @@ -243,19 +293,23 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { return null; } - public Set getAltarRecipes() { + public Set getAltarRecipes() + { return ImmutableSet.copyOf(altarRecipes); } - public Set getAlchemyRecipes() { + public Set getAlchemyRecipes() + { return ImmutableSet.copyOf(alchemyRecipes); } - public Set getTartaricForgeRecipes() { + public Set getTartaricForgeRecipes() + { return ImmutableSet.copyOf(tartaricForgeRecipes); } - public Set getAlchemyArrayRecipes() { + public Set getAlchemyArrayRecipes() + { return ImmutableSet.copyOf(alchemyArrayRecipes); } } From b20e1ac4d777231a0fbcaf561184c0421805d04a Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 29 Apr 2018 08:40:42 -0400 Subject: [PATCH 287/595] Fixed Cutting Fluids so they now work properly. --- changelog.txt | 2 +- .../WayofTime/bloodmagic/tile/TileAlchemyTable.java | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/changelog.txt b/changelog.txt index 46e87f91..94038314 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,7 +2,7 @@ Version 2.2.12 ------------------------------------------------------ - Fixed Hellfire Forge and Alchemy Table's shape-crafted-ness. - +- Fixed Cutting Fluids so they now work properly. ------------------------------------------------------ Version 2.2.11 diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 11b9e8eb..4871b0b5 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -3,13 +3,11 @@ package WayofTime.bloodmagic.tile; import java.util.ArrayList; import java.util.List; -import WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; @@ -17,18 +15,22 @@ 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 WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.core.data.SoulNetwork; 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 org.apache.commons.lang3.ArrayUtils; public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable { @@ -336,6 +338,8 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, 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); } From d29b91a1068fa007bb2604f17b717aa2852d48c7 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 29 Apr 2018 09:57:29 -0400 Subject: [PATCH 288/595] Fixed the Fluid filters so that they now work perfectly in the routing system. --- changelog.txt | 1 + .../item/routing/ItemFluidRouterFilter.java | 71 ++++++---- .../item/routing/ItemRouterFilter.java | 106 ++++++++------- .../routing/RoutingFluidFilter.java | 125 ++++++++++++------ 4 files changed, 189 insertions(+), 114 deletions(-) diff --git a/changelog.txt b/changelog.txt index 94038314..f449eb05 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,7 @@ 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. ------------------------------------------------------ Version 2.2.11 diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index 534ab3c4..a72dfd3f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -23,10 +23,12 @@ 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 class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, IVariantProvider +{ + public static String[] names = { "exact" }; - public ItemFluidRouterFilter() { + public ItemFluidRouterFilter() + { super(); setUnlocalizedName(BloodMagic.MODID + ".fluidFilter."); @@ -35,13 +37,15 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public String getUnlocalizedName(ItemStack stack) { + public String getUnlocalizedName(ItemStack stack) + { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) + { if (!isInCreativeTab(creativeTab)) return; @@ -51,35 +55,39 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { + 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) { + public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) + { IFluidFilter testFilter; - switch (filterStack.getMetadata()) { - case 0: - testFilter = new RoutingFluidFilter(); - break; + switch (filterStack.getMetadata()) + { + case 0: + testFilter = new RoutingFluidFilter(); + break; - default: - testFilter = new RoutingFluidFilter(); + default: + testFilter = new RoutingFluidFilter(); } List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) { + for (int i = 0; i < inv.getSizeInventory(); i++) + { ItemStack stack = inv.getStackInSlot(i); - if (stack == null) { + if (stack.isEmpty()) + { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - filteredList.add(ghostStack); } @@ -88,27 +96,32 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { + public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) + { IFluidFilter testFilter; - switch (filterStack.getMetadata()) { - case 0: - testFilter = new RoutingFluidFilter(); - break; + switch (filterStack.getMetadata()) + { + case 0: + testFilter = new RoutingFluidFilter(); + break; - default: - testFilter = new RoutingFluidFilter(); + 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++) { + for (int i = 0; i < inv.getSizeInventory(); i++) + { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) { + if (stack.isEmpty()) + { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) { + if (ghostStack.isEmpty()) + { ghostStack.setCount(Integer.MAX_VALUE); } @@ -120,12 +133,14 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { + public void gatherVariants(@Nonnull Int2ObjectMap variants) + { variants.put(0, "type=exact"); } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) + { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 840f1c27..f80cf9aa 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -22,10 +22,12 @@ 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 class ItemRouterFilter extends Item implements IItemFilterProvider, IVariantProvider +{ + public static String[] names = { "exact", "ignoreNBT", "modItems", "oreDict" }; - public ItemRouterFilter() { + public ItemRouterFilter() + { super(); setUnlocalizedName(BloodMagic.MODID + ".itemFilter."); @@ -34,13 +36,15 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public String getUnlocalizedName(ItemStack stack) { + public String getUnlocalizedName(ItemStack stack) + { return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) + { if (!isInCreativeTab(creativeTab)) return; @@ -50,39 +54,44 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { + 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) { + 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; + 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(); + default: + testFilter = new DefaultItemFilter(); } List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) { + for (int i = 0; i < inv.getSizeInventory(); i++) + { ItemStack stack = inv.getStackInSlot(i); - if (stack == null) { + if (stack.isEmpty()) + { continue; } @@ -96,37 +105,42 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) { + 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; + 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(); + 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++) { + for (int i = 0; i < inv.getSizeInventory(); i++) + { ItemStack stack = inv.getStackInSlot(i); - if (stack == null) { + if (stack.isEmpty()) + { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) { + if (ghostStack.isEmpty()) + { ghostStack.setCount(Integer.MAX_VALUE); } @@ -138,7 +152,8 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { + public void gatherVariants(@Nonnull Int2ObjectMap variants) + { variants.put(0, "type=exact"); variants.put(1, "type=ignorenbt"); variants.put(2, "type=moditems"); @@ -146,7 +161,8 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) + { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java index 5de7f9cb..6ff9f8d9 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -1,5 +1,11 @@ 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; @@ -9,47 +15,54 @@ import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class RoutingFluidFilter implements IFluidFilter { +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) { + public void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput) + { this.accessedTile = tile; this.fluidHandler = fluidHandler; - if (isFilterOutput) { + if (isFilterOutput) + { //The requestList contains a list of how much can be extracted. requestList = new ArrayList<>(); - for (ItemStack filterStack : filteredList) { + for (ItemStack filterStack : filteredList) + { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) { + if (fluidFilterStack != null) + { requestList.add(fluidFilterStack); } } IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - for (IFluidTankProperties property : properties) { + for (IFluidTankProperties property : properties) + { FluidStack containedStack = property.getContents(); - if (containedStack != null) { - for (FluidStack fluidFilterStack : requestList) { - if (doStacksMatch(fluidFilterStack, containedStack)) { + if (containedStack != null) + { + for (FluidStack fluidFilterStack : requestList) + { + if (doStacksMatch(fluidFilterStack, containedStack)) + { fluidFilterStack.amount = Math.max(fluidFilterStack.amount - containedStack.amount, 0); } } } } - } else { + } else + { requestList = new ArrayList<>(); - for (ItemStack filterStack : filteredList) { + for (ItemStack filterStack : filteredList) + { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) { + if (fluidFilterStack != null) + { fluidFilterStack.amount *= -1; requestList.add(fluidFilterStack); } @@ -57,11 +70,15 @@ public class RoutingFluidFilter implements IFluidFilter { IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - for (IFluidTankProperties property : properties) { + for (IFluidTankProperties property : properties) + { FluidStack containedStack = property.getContents(); - if (containedStack != null) { - for (FluidStack fluidFilterStack : requestList) { - if (doStacksMatch(fluidFilterStack, containedStack)) { + if (containedStack != null) + { + for (FluidStack fluidFilterStack : requestList) + { + if (doStacksMatch(fluidFilterStack, containedStack)) + { fluidFilterStack.amount += containedStack.amount; } } @@ -74,16 +91,20 @@ public class RoutingFluidFilter implements IFluidFilter { * Gives the remainder~ */ @Override - public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) { + public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) + { int allowedAmount = 0; - for (FluidStack filterStack : requestList) { - if (doStacksMatch(filterStack, fluidStack)) { + for (FluidStack filterStack : requestList) + { + if (doStacksMatch(filterStack, fluidStack)) + { allowedAmount = Math.min(filterStack.amount, fluidStack.amount); break; } } - if (allowedAmount <= 0) { + if (allowedAmount <= 0) + { return fluidStack; } @@ -92,11 +113,14 @@ public class RoutingFluidFilter implements IFluidFilter { copyStack.amount = fluidStack.amount - filledAmount; Iterator itr = requestList.iterator(); - while (itr.hasNext()) { + while (itr.hasNext()) + { FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) { + if (doStacksMatch(filterStack, copyStack)) + { filterStack.amount -= filledAmount; - if (filterStack.amount <= 0) { + if (filterStack.amount <= 0) + { itr.remove(); } } @@ -110,10 +134,13 @@ public class RoutingFluidFilter implements IFluidFilter { } @Override - public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) { - for (FluidStack filterFluidStack : requestList) { + public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) + { + for (FluidStack filterFluidStack : requestList) + { int allowedAmount = Math.min(filterFluidStack.amount, maxTransfer); - if (allowedAmount <= 0) { + if (allowedAmount <= 0) + { continue; } @@ -125,7 +152,8 @@ public class RoutingFluidFilter implements IFluidFilter { FluidStack remainderStack = outputFilter.transferStackThroughOutputFilter(drainStack); int drained = remainderStack == null ? copyStack.amount : (copyStack.amount - remainderStack.amount); - if (drained > 0) { + if (drained > 0) + { drainStack.amount = drained; fluidHandler.drain(drainStack, true); @@ -133,11 +161,14 @@ public class RoutingFluidFilter implements IFluidFilter { } Iterator itr = requestList.iterator(); - while (itr.hasNext()) { + while (itr.hasNext()) + { FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) { + if (doStacksMatch(filterStack, copyStack)) + { filterStack.amount -= drained; - if (filterStack.amount <= 0) { + if (filterStack.amount <= 0) + { itr.remove(); } } @@ -155,9 +186,12 @@ public class RoutingFluidFilter implements IFluidFilter { } @Override - public boolean doesStackMatchFilter(FluidStack testStack) { - for (FluidStack filterStack : requestList) { - if (doStacksMatch(filterStack, testStack)) { + public boolean doesStackMatchFilter(FluidStack testStack) + { + for (FluidStack filterStack : requestList) + { + if (doStacksMatch(filterStack, testStack)) + { return true; } } @@ -166,17 +200,26 @@ public class RoutingFluidFilter implements IFluidFilter { } @Override - public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) { + public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) + { return testStack != null && filterStack.getFluid() == testStack.getFluid(); } @Nullable - public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) { + 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 = inputStack.getCount(); + fluidStack.amount = isEmpty ? 0 : inputStack.getCount(); return fluidStack; } } From 29ae24b044a793188f752af0637ae75e5fd6e0bf Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 30 Apr 2018 19:01:54 -0700 Subject: [PATCH 289/595] Fix altar double counting upgrades (#1291) --- .../WayofTime/bloodmagic/altar/AltarUtil.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java index 7519c870..acde6d6d 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java @@ -50,19 +50,14 @@ public class AltarUtil { public static AltarUpgrade getUpgrades(World world, BlockPos pos, AltarTier currentTier) { AltarUpgrade upgrades = new AltarUpgrade(); - for (AltarTier tier : AltarTier.values()) { - if (tier.ordinal() > currentTier.ordinal()) - return upgrades; + for (AltarComponent component : currentTier.getAltarComponents()) { + if (!component.isUpgradeSlot() || component.getComponent() != ComponentType.BLOODRUNE) + continue; - for (AltarComponent component : tier.getAltarComponents()) { - if (!component.isUpgradeSlot() || component.getComponent() != ComponentType.BLOODRUNE) - continue; - - BlockPos componentPos = pos.add(component.getOffset()); - IBlockState state = world.getBlockState(componentPos); - if (state.getBlock() instanceof BlockBloodRune) - upgrades.upgrade(((BlockBloodRune) state.getBlock()).getBloodRune(world, componentPos, state)); - } + BlockPos componentPos = pos.add(component.getOffset()); + IBlockState state = world.getBlockState(componentPos); + if (state.getBlock() instanceof BlockBloodRune) + upgrades.upgrade(((BlockBloodRune) state.getBlock()).getBloodRune(world, componentPos, state)); } return upgrades; From 920d105374a502927355953ac7393835cd155342 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 1 May 2018 06:51:37 -0400 Subject: [PATCH 290/595] Needed to be more pushy. --- .settings/org.eclipse.jdt.ui.prefs | 6 +- .../item/soulBreath/ItemFlightScroll.java | 116 ++++++++++++++++++ .../soulBreath/ItemSoulBreathContainer.java | 75 +++++++++++ .../bloodmagic/soul/ISoulBreathContainer.java | 16 +++ .../bloodmagic/blockstates/icarus_scroll.json | 21 ++++ .../textures/items/icarusscroll_activated.png | Bin 0 -> 625 bytes .../items/icarusscroll_deactivated.png | Bin 0 -> 622 bytes 7 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java create mode 100644 src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java create mode 100644 src/main/resources/assets/bloodmagic/blockstates/icarus_scroll.json create mode 100644 src/main/resources/assets/bloodmagic/textures/items/icarusscroll_activated.png create mode 100644 src/main/resources/assets/bloodmagic/textures/items/icarusscroll_deactivated.png diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs index f9b2d33a..3f2271a9 100644 --- a/.settings/org.eclipse.jdt.ui.prefs +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -1,7 +1,11 @@ eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_BloodMagic1.8 +formatter_profile=_BloodMagic formatter_settings_version=12 +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 sp_cleanup.add_default_serial_version_id=true sp_cleanup.add_generated_serial_version_id=false sp_cleanup.add_missing_annotations=true diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java new file mode 100644 index 00000000..e10d1297 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java @@ -0,0 +1,116 @@ +package WayofTime.bloodmagic.item.soulBreath; + +import java.util.function.Consumer; + +import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumHand; +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 +{ + //TODO: A lot of this stuff could be moved to a toggle-able variant + public ItemFlightScroll() + { + super(); + setUnlocalizedName(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, EntityPlayer player, EnumHand hand) + { + ItemStack stack = player.getHeldItem(hand); + + if (!world.isRemote) + { + if (player.isSneaking()) + setActivatedState(stack, !getActivated(stack)); + } + + return super.onItemRightClick(world, player, hand); + } + + @Override + public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) + { + if (!worldIn.isRemote && entityIn instanceof EntityPlayerMP && getActivated(stack)) + { + if (entityIn.ticksExisted % 100 == 0) + { + double drainNeeded = getBreathCostPerSecond(stack); + if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) + { + this.drainBreath(stack, drainNeeded, true); + } else + { + this.setActivatedState(stack, false); + } + } + + onEffectUpdate(stack, worldIn, (EntityPlayer) entityIn, itemSlot, isSelected); + } + } + + public void onEffectUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) + { + player.addPotionEffect(new PotionEffect(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 new file mode 100644 index 00000000..1dfb41cd --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java @@ -0,0 +1,75 @@ +package WayofTime.bloodmagic.item.soulBreath; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import WayofTime.bloodmagic.soul.ISoulBreathContainer; +import WayofTime.bloodmagic.util.Constants; + +public abstract class ItemSoulBreathContainer extends Item implements ISoulBreathContainer +{ + @Override + public double getBreath(ItemStack stack) + { + NBTTagCompound tag = stack.getTagCompound(); + + return tag.getDouble(Constants.NBT.BREATH); + } + + @Override + public void setBreath(ItemStack stack, double amount) + { + NBTTagCompound tag = stack.getTagCompound(); + + tag.setDouble(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/soul/ISoulBreathContainer.java b/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java new file mode 100644 index 00000000..f8b9b137 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java @@ -0,0 +1,16 @@ +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/resources/assets/bloodmagic/blockstates/icarus_scroll.json b/src/main/resources/assets/bloodmagic/blockstates/icarus_scroll.json new file mode 100644 index 00000000..748b4003 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/icarus_scroll.json @@ -0,0 +1,21 @@ +{ + "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/textures/items/icarusscroll_activated.png b/src/main/resources/assets/bloodmagic/textures/items/icarusscroll_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..767852ce986246c1e6191e3f19b48d99190d2fb9 GIT binary patch literal 625 zcmV-%0*?KOP)WFU8GbZ8()Nlj2>E@cM*00GrWL_t(I%f*vBXjDNI zhQBj+?>@4wkJyQY4-{;zY()eg;A0D0>y@Aq4W`hnAi*rCuy#=pgJ=<7hzM$FXDx_U zT38D)=I-9TGxxVxU0sq?DLgRE%$e`}^Pe*&iM51djZs+bVB+{jb(c~?5I%?y`brIm zB4hSlYO4a~ntRn~j1#&YT&WBaxlfsC-DLXZbEZzz|0YWsTA!ayNT84N=OmCoA09S- z@156~{Uwbb9?_qC``5(Rck9|(-GY2Z`f~w?$OFXHD$Yd|s#VCv{YUp`y;vN6!o_2w z8asOl1yAlX${RK#d5|OYl72Pku*hMyf{Dpug7U!jLzjpA`0{3&-Srj#U*BFQ_;lqi z^fC=D_~Zw99?0`R`2LMgPsS;f*FoCBMG@U@SPtlRa?C~j;V4#!%mE^#2~tj$EMOMl z;+RenmJd>`=8(j;gOlt$dX*hVrofC{CtF0t3VTkqDb_X-SJqQ1MFYT~3u6b$0=O{Q zBxGH{P}U=aj66#zlt(Zevv=A6+<3KQLkheXR~|oQ=2{c80t$g%vVa+sYNJGPnfC2l zOgxw$@?fCg^uAbz5j+%PD8_~Wvp(EsA}%_-7ZS|9@7WOGzx~EvMve3JEpOYO00000 LNkvXXu0mjf0SO1@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/items/icarusscroll_deactivated.png b/src/main/resources/assets/bloodmagic/textures/items/icarusscroll_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..d16e87e04373ef1e329f7359fdc428718a6b2d29 GIT binary patch literal 622 zcmV-!0+IcRP)WFU8GbZ8()Nlj2>E@cM*00GiTL_t(I%f*wwYg2I) z#XtA^eJ^?GOInS%h<}BXi<1sc{)pn*xmZMMsxBH(gcg4hovKAF7KciyS_F0Ipp*ZC zqc|x9V(d#^-uL^iL!cVcOdY)I6k3 zVd+yUV+mFoM|5Up4&UoyiV>)iyOf2+``p>w;O3dycm-cKuIkAj-)MDORJT?E_<8IC z2S2Y-zkHEf=g(0t|AooFA-;cF)5Gy0)Mcc<+ZdGGLm0;xV+rCIa^?BUXDq(y3|pw5 zs_N{eYp8eRE+d*cfT{yE_ Date: Tue, 1 May 2018 16:29:19 -0400 Subject: [PATCH 291/595] Made some WIP additions to the Scroll of Icarus, allowing it to pick up mobs. Lacks costs and may break. --- .../item/soulBreath/ItemFlightScroll.java | 210 +++++++++++++++++- 1 file changed, 205 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java index e10d1297..9d63d703 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java @@ -1,15 +1,26 @@ 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.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -23,6 +34,10 @@ 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() { @@ -57,18 +72,62 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr if (!world.isRemote) { if (player.isSneaking()) - setActivatedState(stack, !getActivated(stack)); + { + if (!getActivated(stack)) + { + double drainNeeded = getBreathCostPerSecond(stack); + if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) + { + setActivatedState(stack, true); + } + } else + { + setActivatedState(stack, false); + } + } else + { + + } } return super.onItemRightClick(world, player, hand); } @Override - public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) + public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, EnumHand hand) { - if (!worldIn.isRemote && entityIn instanceof EntityPlayerMP && getActivated(stack)) + if (entity.world.isRemote) { - if (entityIn.ticksExisted % 100 == 0) + 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 + { + EntityLivingBase 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 EntityPlayerMP && getActivated(stack)) + { + if (entity.ticksExisted % 20 == 0) { double drainNeeded = getBreathCostPerSecond(stack); if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) @@ -80,8 +139,149 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } } - onEffectUpdate(stack, worldIn, (EntityPlayer) entityIn, itemSlot, isSelected); + onEffectUpdate(stack, world, (EntityPlayer) entity, itemSlot, isSelected); } + + if (!world.isRemote) + { + if (entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) 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()) + { + EntityLivingBase floatingEntity = entry.getKey(); + if (floatingEntity == null || floatingEntity.isDead || floatingEntity.dimension != player.dimension) + { + removalList.add(floatingEntity); + } + + followOwner(player, floatingEntity, entry.getValue()); + } + + for (EntityLivingBase livingEntity : removalList) + { + entityMap.remove(livingEntity); + } + + if (entityMap.isEmpty()) + { + floatMap.remove(player); + } + + } + } + } + } + + public static boolean updateEntityOffset(EntityPlayer player, EntityLivingBase 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 EntityLivingBase getHeldEntity(EntityPlayer player) + { + if (heldEntityMap.containsKey(player)) + { + return heldEntityMap.get(player); + } + + return null; + } + + public static double getHeldEntityOffset(EntityPlayer player) + { + if (heldEntityMap.containsKey(player)) + { + return heldEntityOffsetMap.get(player); + } + + return 1; + } + + public static void holdEntity(EntityPlayer player, EntityLivingBase 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(EntityPlayer player) + { + EntityLivingBase 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(EntityPlayer player, EntityLivingBase 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(EntityPlayer owner, EntityLivingBase 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 maxFollowSpeed = Math.max(ownerSpeed * 1.5, 0.5d); + + livingEntity.addPotionEffect(new PotionEffect(MobEffects.LEVITATION, 20, 0, false, true)); + + double wantedX = owner.posX + offsetX; + double wantedY = owner.posY + offsetY; + double wantedZ = owner.posZ + offsetZ; + +// livingEntity.posX = wantedX; +// livingEntity.posY = wantedY; +// livingEntity.posZ = wantedZ; + livingEntity.setPosition(wantedX, wantedY, wantedZ); } public void onEffectUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) From 383be360ffd46ab3be0bd400b6789c1926706f79 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 1 May 2018 21:39:15 -0400 Subject: [PATCH 292/595] Improved collision "i.e. actually made a non-retarded position update" for the Scroll of Icarus. --- .../item/soulBreath/ItemFlightScroll.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java index 9d63d703..3eac2ed9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java @@ -86,7 +86,8 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } } 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. } } @@ -269,8 +270,10 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr 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 maxFollowSpeed = Math.max(ownerSpeed * 1.5, 0.5d); + 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 PotionEffect(MobEffects.LEVITATION, 20, 0, false, true)); @@ -278,10 +281,13 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr double wantedY = owner.posY + offsetY; double wantedZ = owner.posZ + offsetZ; -// livingEntity.posX = wantedX; -// livingEntity.posY = wantedY; -// livingEntity.posZ = wantedZ; - livingEntity.setPosition(wantedX, wantedY, wantedZ); + 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(); + + livingEntity.setVelocity(vec.x * speed, vec.y * speed, vec.z * speed); } public void onEffectUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) From 778838e2b004cd39768e1fb01885ff45f29ed87b Mon Sep 17 00:00:00 2001 From: cpw Date: Fri, 4 May 2018 03:26:28 +0100 Subject: [PATCH 293/595] Fix light calculation to use actual visible level. Should now work on (#1295) surface at night as well as underground. Tweak duration to reduce flicker. --- .../livingArmour/upgrade/LivingArmourUpgradeNightSight.java | 2 +- src/main/java/WayofTime/bloodmagic/util/Constants.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java index 27a39c9f..b9171625 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java @@ -29,7 +29,7 @@ public class LivingArmourUpgradeNightSight extends LivingArmourUpgrade { @Override public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { - if (world.getLight(player.getPosition()) <= 9) { + if (world.getLight(player.getPosition(), false) <= 9) { isActive = true; if (player.isPotionActive(MobEffects.NIGHT_VISION)) { int dur = player.getActivePotionEffect(MobEffects.NIGHT_VISION).getDuration(); diff --git a/src/main/java/WayofTime/bloodmagic/util/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java index 13b43026..fd678307 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -168,7 +168,7 @@ public class Constants { 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 = 30002; + public static final int NIGHT_VISION_CONSTANT_BEGIN = 30020; public static final int NIGHT_VISION_CONSTANT_END = 30000; } } From 6a56a13aacaa6960f18a6b893a6c2b4fdf8a7152 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 4 May 2018 14:34:46 -0400 Subject: [PATCH 294/595] Final push before 2.2.12. --- changelog.txt | 2 ++ gradle.properties | 2 +- .../bloodmagic/item/soulBreath/ItemFlightScroll.java | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index f449eb05..9a176a06 100644 --- a/changelog.txt +++ b/changelog.txt @@ -4,6 +4,8 @@ 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 diff --git a/gradle.properties b/gradle.properties index 3c89390d..eacbf839 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.11 +mod_version=2.2.12 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java index 3eac2ed9..a4878215 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java @@ -287,6 +287,11 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr vec.normalize(); + if (speed <= 0.00001) + { + return; + } + livingEntity.setVelocity(vec.x * speed, vec.y * speed, vec.z * speed); } From c94af26a64f36da5a573ed078e4f70c07d75c750 Mon Sep 17 00:00:00 2001 From: Vegar Guldal Date: Fri, 4 May 2018 22:58:39 +0200 Subject: [PATCH 295/595] Require water potion instead of uncraftable potion (#1297) Fixes issue where cutting fluid is uncraftable. --- .../WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 7a5f5dfb..a323b825 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -109,7 +109,7 @@ public class RegistrarBloodMagicRecipes { 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(), new ItemStack(Items.POTIONITEM)); + 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), PotionTypes.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()); From 32227afd9da45ab715397f5ffc5080295b61bfa1 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 5 May 2018 15:20:37 -0400 Subject: [PATCH 296/595] Fixed Syntax error in the recipes, as well as annoyed Nut with another class with bracing changes. (Wonder when I should change all the classes...) --- .../core/RegistrarBloodMagicRecipes.java | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index a323b825..62f6d717 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -36,12 +36,16 @@ import java.util.List; import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class RegistrarBloodMagicRecipes { +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()) { + 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); @@ -58,7 +62,8 @@ public class RegistrarBloodMagicRecipes { PluginUtil.handlePluginStep(PluginUtil.RegistrationStep.RECIPE_REGISTER); } - public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) { + 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); @@ -95,7 +100,8 @@ public class RegistrarBloodMagicRecipes { registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getStack(), AltarTier.SIX.ordinal(), 200000, 100, 200); } - public static void registerAlchemyTableRecipes(BloodMagicRecipeRegistrar registrar) { + 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); @@ -109,7 +115,7 @@ public class RegistrarBloodMagicRecipes { 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), PotionTypes.WATER); + 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), PotionTypes.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()); @@ -128,13 +134,16 @@ public class RegistrarBloodMagicRecipes { 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)) { + 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()) { + 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()); @@ -144,7 +153,8 @@ public class RegistrarBloodMagicRecipes { } } - public static void registerTartaricForgeRecipes(BloodMagicRecipeRegistrar registrar) { + 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()); @@ -200,7 +210,8 @@ public class RegistrarBloodMagicRecipes { registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE), 400, 50, "ingotGold", "dustRedstone", "blockGlass", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); } - public static void registerAlchemyArrayRecipes(BloodMagicRecipeRegistrar registrar) { + 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")); From 389043dc64718f3443ea50182999aca8b1410d7a Mon Sep 17 00:00:00 2001 From: WayofTime Date: Mon, 7 May 2018 22:10:59 -0400 Subject: [PATCH 297/595] Implemented the Mob Sacrifice Array. Needs some cleaning up + added visuals, but appears functional. --- .../api/IBloodMagicRecipeRegistrar.java | 13 +- .../AlchemyArrayEffectMobSacrifice.java | 184 ++++++++++++ .../api/impl/BloodMagicCorePlugin.java | 40 ++- .../api/impl/BloodMagicRecipeRegistrar.java | 119 ++++++-- .../api/impl/recipe/RecipeSacrificeCraft.java | 48 ++++ .../MobSacrificeAlchemyCircleRenderer.java | 267 ++++++++++++++++++ .../core/RegistrarBloodMagicRecipes.java | 5 + .../bloodmagic/registry/ModRecipes.java | 3 + .../models/alchemyarrays/mobsacrifice.png | Bin 0 -> 27246 bytes .../textures/models/mobsacrificeswirl.png | Bin 0 -> 137017 bytes 10 files changed, 644 insertions(+), 35 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java create mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java create mode 100644 src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/mobsacrifice.png create mode 100644 src/main/resources/assets/bloodmagic/textures/models/mobsacrificeswirl.png diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java index 3817725d..93e13c45 100644 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java +++ b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java @@ -11,7 +11,8 @@ import javax.annotation.Nullable; /** * Allows recipe addition and removal. */ -public interface IBloodMagicRecipeRegistrar { +public interface IBloodMagicRecipeRegistrar +{ /** * Adds a new recipe to the Blood Altar. @@ -54,7 +55,7 @@ public interface IBloodMagicRecipeRegistrar { /** * 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. @@ -65,8 +66,8 @@ public interface IBloodMagicRecipeRegistrar { /** * 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. + * @param input The input items to remove the recipe of. + * @return Whether or not a recipe was removed. */ boolean removeTartaricForge(@Nonnull ItemStack... input); @@ -88,4 +89,8 @@ public interface IBloodMagicRecipeRegistrar { * @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/alchemyArray/AlchemyArrayEffectMobSacrifice.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java new file mode 100644 index 00000000..e0ad6ae9 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java @@ -0,0 +1,184 @@ +package WayofTime.bloodmagic.alchemyArray; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.SoundEvents; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.SoundCategory; +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 WayofTime.bloodmagic.api.impl.BloodMagicAPI; +import WayofTime.bloodmagic.api.impl.recipe.RecipeSacrificeCraft; +import WayofTime.bloodmagic.ritual.AreaDescriptor; +import WayofTime.bloodmagic.util.DamageSourceBloodMagic; +import WayofTime.bloodmagic.util.helper.PurificationHelper; + +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 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); + } + } + + if (!world.isRemote) + { + if (ticksActive >= 200) + { + BlockPos pos = tile.getPos(); + + List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDescriptor.getAABB(pos)); + + List inputList = new ArrayList(); + + for (EntityItem 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(EntityLivingBase.class, mobDescriptor.getAABB(pos)); + for (EntityLivingBase living : livingEntities) + { + double health = getEffectiveHealth(living); + if (health > 0) + { + healthAvailable += health; + } + } + + if (healthAvailable < healthRequired) + { + return false; + } + + for (EntityLivingBase living : livingEntities) + { + double health = getEffectiveHealth(living); + if (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 (EntityItem itemEntity : itemList) + { + itemEntity.getItem().setCount(itemEntity.getItem().getCount() - 1); + if (itemEntity.getItem().isEmpty()) //TODO: Check container + { + itemEntity.setDead(); + } + } + + world.spawnEntity(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, recipe.getOutput())); + } + } + } + + return false; + } + + //Future-proofing in case I want to make different mobs give different effective health + public double getEffectiveHealth(EntityLivingBase living) + { + if (living == null) + return 0; + + if (!living.isNonBoss()) + return 0; + + if (living instanceof EntityPlayer) + 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(NBTTagCompound tag) + { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectMobSacrifice(key); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 8448277e..633e2a40 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -25,10 +25,12 @@ import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.ForgeRegistries; @BloodMagicPlugin -public class BloodMagicCorePlugin implements IBloodMagicPlugin { +public class BloodMagicCorePlugin implements IBloodMagicPlugin +{ @Override - public void register(IBloodMagicAPI apiInterface) { + public void register(IBloodMagicAPI apiInterface) + { BloodMagicAPI api = (BloodMagicAPI) apiInterface; // Add forced blacklistings api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE); @@ -82,15 +84,19 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { } @Override - public void registerRecipes(IBloodMagicRecipeRegistrar recipeRegistrar) { + 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) { + private static void handleConfigValues(BloodMagicAPI api) + { + for (String value : ConfigHandler.values.sacrificialValues) + { String[] split = value.split(";"); if (split.length != 2) // Not valid format continue; @@ -98,15 +104,18 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { api.getValueManager().setSacrificialValue(new ResourceLocation(split[0]), Integer.parseInt(split[1])); } - for (String value : ConfigHandler.blacklist.teleposer) { + 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. + 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. + if (blockData.length > 1) + { // We have properties listed, so let's build a state. api.getBlacklist().addTeleposer(parseState(value)); continue; } @@ -118,13 +127,15 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { api.getBlacklist().addTeleposer(entityEntry.getRegistryName()); } - for (String value : ConfigHandler.blacklist.transposer) { + 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. + if (blockData.length > 1) + { // We have properties listed, so let's build a state. api.getBlacklist().addTeleposer(parseState(value)); continue; } @@ -132,7 +143,8 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { api.getBlacklist().addTeleposer(block); } - for (String value : ConfigHandler.blacklist.wellOfSuffering) { + for (String value : ConfigHandler.blacklist.wellOfSuffering) + { EntityEntry entityEntry = ForgeRegistries.ENTITIES.getValue(new ResourceLocation(value)); if (entityEntry == null) // Not a valid entity continue; @@ -141,7 +153,8 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { } } - private static IBlockState parseState(String blockInfo) { + private static IBlockState parseState(String blockInfo) + { String[] split = blockInfo.split("\\["); split[1] = split[1].substring(0, split[1].lastIndexOf("]")); // Make sure brackets are removed from state @@ -154,7 +167,8 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin { // Force our values into the state String[] stateValues = split[1].split(","); // Splits up each value - for (String value : stateValues) { + for (String value : stateValues) + { String[] valueSplit = value.split("="); // Separates property and value IProperty property = blockState.getProperty(valueSplit[0]); if (property != null) diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index 59fb5dba..776d762d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -1,31 +1,31 @@ package WayofTime.bloodmagic.api.impl; -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.RecipeTartaricForge; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.core.recipe.IngredientBloodOrb; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; +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 javax.annotation.Nonnegative; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +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 { @@ -34,6 +34,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar private final Set alchemyRecipes; private final Set tartaricForgeRecipes; private final Set alchemyArrayRecipes; + private final Set sacrificeCraftRecipes; public BloodMagicRecipeRegistrar() { @@ -41,6 +42,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar this.alchemyRecipes = Sets.newHashSet(); this.tartaricForgeRecipes = Sets.newHashSet(); this.alchemyArrayRecipes = Sets.newHashSet(); + this.sacrificeCraftRecipes = Sets.newHashSet(); } @Override @@ -189,6 +191,49 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar 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) { @@ -279,6 +324,44 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar 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) { diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java new file mode 100644 index 00000000..95bf3354 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java @@ -0,0 +1,48 @@ +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/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java new file mode 100644 index 00000000..d4590a5d --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java @@ -0,0 +1,267 @@ +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.EnumFacing; +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.getMinecraft().renderEngine.bindTexture(arrayResource); + + GlStateManager.disableCull(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(770, 1); + + GlStateManager.translate(x, y, z); + + // Specify which face this "circle" is located on + EnumFacing sideHit = EnumFacing.UP; + EnumFacing rotation = tileArray.getRotation(); + + GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * 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.getMinecraft().renderEngine.bindTexture(bottomArrayResource); + translateAndRotateFloatingArray(tessellator, wr, size, rot, craftTime, i); + GlStateManager.popMatrix(); + } + + //Render the main array. + GlStateManager.pushMatrix(); + Minecraft.getMinecraft().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.getMinecraft().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/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 62f6d717..caa7f823 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -237,4 +237,9 @@ public class RegistrarBloodMagicRecipes 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); + } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index cbec17ec..25d54dd2 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -25,6 +25,7 @@ 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; @@ -36,6 +37,7 @@ import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRende 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; @@ -128,6 +130,7 @@ public class ModRecipes 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"))); diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/mobsacrifice.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/mobsacrifice.png new file mode 100644 index 0000000000000000000000000000000000000000..409c9eebee29a9918d2919e4c014b0fb5d3d4f33 GIT binary patch literal 27246 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

        8vl|cBsWV& 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 LNkvXXu0mjf!6xZ- literal 0 HcmV?d00001 From f563da152e35ec08a23946df28c372b4ec4f74de Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 13 May 2018 22:20:33 -0700 Subject: [PATCH 298/595] Fix Teleposer swapping blocks even if the event is cancelled (#1303) --- src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index 416c37f7..9a4e955e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -82,7 +82,7 @@ public class TileTeleposer extends TileInventory implements ITickable { 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 (Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos) && !MinecraftForge.EVENT_BUS.post(event)) { + if (!MinecraftForge.EVENT_BUS.post(event) && Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos)) { blocksTransported++; } } From edf4564a07ec54d0bb658f6a65a9111a799b8aae Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 15 May 2018 12:40:00 -0400 Subject: [PATCH 299/595] Fancied up the rendering of the Mob Sacrifice array, as well as added more behaviour --- .../AlchemyArrayEffectMobSacrifice.java | 161 ++++++++++++------ .../models/alchemyarrays/mobsacrifice.png | Bin 27246 -> 44577 bytes 2 files changed, 105 insertions(+), 56 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java index e0ad6ae9..6ed8fbcf 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java @@ -11,13 +11,16 @@ import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.SoundEvents; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; 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.WorldServer; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; @@ -30,6 +33,8 @@ 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) { @@ -54,84 +59,128 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect } } - if (!world.isRemote) + //We need to do the check on both sides to correctly do particles. + + if (ticksActive >= 200) { - if (ticksActive >= 200) + BlockPos pos = tile.getPos(); + + List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDescriptor.getAABB(pos)); + + List inputList = new ArrayList(); + + for (EntityItem entityItem : itemList) { - BlockPos pos = tile.getPos(); - - List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDescriptor.getAABB(pos)); - - List inputList = new ArrayList(); - - for (EntityItem entityItem : itemList) + if (entityItem.isDead || entityItem.getItem().isEmpty()) { - if (entityItem.isDead || entityItem.getItem().isEmpty()) - { - continue; - } - - inputList.add(entityItem.getItem().copy()); + continue; } - if (inputList.isEmpty()) + 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(EntityLivingBase.class, mobDescriptor.getAABB(pos)); + for (EntityLivingBase living : livingEntities) { + double health = getEffectiveHealth(living); + if (health > 0) + { + healthAvailable += health; + } + } + + if (healthAvailable < healthRequired) + { + craftTime = 0; return false; } - if (inputList.size() == 1) //TODO: Test if it is a something that can be filled with Soul Breath + craftTime++; + + if (craftTime >= REQUIRED_CRAFT_TIME) { + if (!world.isRemote) + { + for (EntityLivingBase living : livingEntities) + { + double health = getEffectiveHealth(living); + if (healthAvailable > 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; + } + } - RecipeSacrificeCraft recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getSacrificeCraft(inputList); - if (recipe != null) + for (EntityItem itemEntity : itemList) + { + itemEntity.getItem().setCount(itemEntity.getItem().getCount() - 1); + if (itemEntity.getItem().isEmpty()) //TODO: Check container + { + itemEntity.setDead(); + } + } + + world.spawnEntity(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5, recipe.getOutput())); + craftTime = 0; + } + } else { - double healthRequired = recipe.getHealthRequired(); - double healthAvailable = 0; - - List livingEntities = world.getEntitiesWithinAABB(EntityLivingBase.class, mobDescriptor.getAABB(pos)); - for (EntityLivingBase living : livingEntities) + if (world.isRemote) { - double health = getEffectiveHealth(living); - if (health > 0) + Vec3d spawnPosition = new Vec3d(pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5); + for (EntityItem itemEntity : itemList) { - healthAvailable += health; - } - } + ItemStack stack = itemEntity.getItem(); + double velocityFactor = 0.1; - if (healthAvailable < healthRequired) - { - return false; - } + 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); - for (EntityLivingBase living : livingEntities) - { - double health = getEffectiveHealth(living); - if (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); +// 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()); } - if (healthAvailable <= 0) + for (EntityLivingBase living : livingEntities) { - break; + 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); } } - - for (EntityItem itemEntity : itemList) - { - itemEntity.getItem().setCount(itemEntity.getItem().getCount() - 1); - if (itemEntity.getItem().isEmpty()) //TODO: Check container - { - itemEntity.setDead(); - } - } - - world.spawnEntity(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, recipe.getOutput())); } } } diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/mobsacrifice.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/mobsacrifice.png index 409c9eebee29a9918d2919e4c014b0fb5d3d4f33..717018449429c81300d21bd5d5779f439e68a902 100644 GIT binary patch literal 44577 zcmb4r1yfv2u=d%--Q6WXaQEPnAi>=of-S*)2`)hr+$Csm2oNB!NPyrHTm!*^v$%fy z-dpzvd{ebGXHRYQ%(Oh+J=3$Xns1eHFexzs0Kj?kT0t8Cz=%gMfR2jjF8qGqAv#oR zRb>T4k7&2@9ifO01M=F)69BM?{`-J{>|AohOEj-H>WXNaC^!H*Y0A3aD&iH5ldhqc zyt}KbotqcpD*(v9x3luHv!(ZS@^YkCext5w%Wa1S0QA5c1zBCcr9(6CHvQS@f?(X2 zG~iYy)2t;-(l6^bjQ)2ls~Z$c zB_Nw{idCUmC9Qa!P)mBGk#v|69i5o!9b%?-_BZSbJ%+i-Mf>@G!)}QPY7`V$ZFiyw zk=~Y=`+`7I06Kc=UiwMj9oX_TD1gHoOBERpy2$##=QmbDN#%62Ne(9T5w6dl+sFUybMn*;u z0KcD^nEJ?tBQFDt#qN1B8c%J*)foTT8O^D2FQ><_5NRoAH0o6L&_m3pAi9F$MEIvz z*2rwhUvs+F`$Wr?0<~cKl!%piMU6dBXoTWVEoL{45KX--?Vv#ULNkSpj%W&_HzoRm z;61SAE1;u{FC+8*AF5?Os$v1)_*c7}6c(K=4hLPZVTLrSd!#3+I(4~nF`VnM`vq2^A zSx%;i;1M@8&ORT{zv8(bq;Wu|31~*<`vbIS5OV1DOqm5jMj)%Zr_2y4paZE54W_0{ zB&sBD>BA{E%#(B7%X{sZKx@T$u3PCyDw2+ZG#g65s?ZiUy-R)PC6u zMKqaoa%m_nkch$yf>|qH7JyceEj@wjm)+86meCay#=~G31FE3;UP)d&_7SxyGYD41 zwS*3P0Z2h8<|Y6)t86ER5C20*En(dz&Qmp)WUB`Eyk2f*|>%3DVg2&E@mKVWJ^itI!&J`ut5PRgZJ`LkFXHDPd#oqaSY^$ z_P+NAq8x{%hPVHLu(=BXNEWCD4cYNTMm{iu)C_7fMP8^^%BLd)LyA<))aNPB1vLSUzNdIPaiMQ( z5=aN2Bp^wUr7yvMx~}r;Mu&R+a+uc*Wl~_o55B0x1x>=9x^GwJ9VY=sXD|3LWVXKS z=50`3f+5^cce5x{w2hZOVy^a%TiNtc<&6JnEBY3m^mt05i3trf5QII}K?=a8P=6QD z{1H{Ax)ZB<-5LrUffB%{W%gZkNTL|9_q0pzP%TmCC5ndb)nsI3$V2tS-Uh=*zU?|-;Ese6 zbXe1dbls}R&VhEtlT(&FK4|U!z;dp7+aH~52{R}d_S88Ax!CR*(D zjkTCX;X;hSdnV!F5gpP>O^~OckYSuI)JloF3c&#=AIudM+y;C}7{%8btJ`p&wqhL_ z31-`JnG6V~%FLaH6hts4y)766a$;P1uoVQuVrp57%Q;7?k_vOeV}}@vc@SV&u(cc+ zGl0~#*jTN_@}Rd|f=Wq<;2^qB$LYd2Rt)M}Jh1|Vh3?k(yj?$vJe&#UgoY4oo?;$5 zFV_3{rY?>{%R^aZs9GuS=&~+zq?4TSoi#(yAbJahO58^xJ1Zan@@b--l!_7zqj_^; z6!t#sbrd*do^D&j{`ho z9AAwzN?ipG5l!Jf6bMM3sxby+$IvnrJA7T8MA~S0L7>i1%)>ci%+V|4sG>keltR^) zEw2!a@OWbOl=}(_7KAA#Qqa2C3TbE0Am;?avP*M?i_dmOaBIgvWyXL^AtMgM^vj&2 zb`!!B8Z}4tk;XNxE+NKZDFs2JassTc-w+y=Ox0a*z4!L;pfe_(mf$_-2wPMD9OSZh zeTs7WjYW1+FZZlQYxIWtXRx^~+l;Y;DXFIFdzB9t@82bZ(jBE={nY6akuj6#JXPgh z$K7$)5rf;*IR0mQgbq)+d~VH5Np~YadlY&6&+m(_9EW*G&3sxI;rF;u0VAqp=C=iZ z_*{lVTkU$bY!hWqQIbwzya&awd0DPmr13foC{G`6=)f;&pqXbO|7)P2hMIGs6?&30JKA)=~_j#Z!8#ur_yDkns7Dbpn$rxnV@aGPnk-7Mh zz>NO~0{Va6a9zdbR}<%rcEN=R5}ZXMwbn>7I84AdM_V7JPe77`15v;!5tP=W&PZv$ zqWgV(9**TB_^5{Rh2`{1sRJJeUlm|sME>>);NGT}Zy9jzd?`?d{-1Aq2=9cuS5?fp zq6!bYQ~Sx^e}xB11D*L_#5*WMz|B*rFe?CeL$JT*_L_F|#vVjYh}NgR3E&Cf;`ZCF zn}&kw18C=dD_i8Stx_K<^V;7NL)OBSr2cs$L2}Ly>oda@xTr40{sZ4ylV{DusIsWw zS2!?!g2WmQDxt+_i*iYHMbOR-36+XlHZoG;Iek*G2GGIQI!gys8>e1+J2q@gCev*F zsVuLtR`v9Pb)iA#WZ9O|1iVwY6sZt&M=b_#oPm`+zm6^%nU0vjIn#!l0u)ObedOW_ zTseSd(eNwS(j9NxV2f&HNo%}EIp)vM@-{ivrRjwLuo~AgKHRk!`OT310krXcwFwVv z)@MA-PA<_Zf+=N67l{7XjLC@n9}4?++;;p_3XK$)$(&Nsyc-~eM=#bIrG{ezj= za7pPo!B@hT9U~xej16jBnG4mlm!mk@xhe?Y53}ZbewCW@Cit63i2gF(mdU>k6}a;~ z_17b@>Vh@6et$Mr7o6*f7YIQi z25NVU=?nt9MVhU!3?$&|5@Nkn-8l?*2czuAS-2&w=27B804i9N5GG1WS=F=cQDgK; zaC`5o2-FiqeRy7j0reJ(o&Ax0I``HuFS1PimZET=k9-ap^6f1zJ|f#FG#m}J00d0q zPEMLm&SsI(aPQ99G9>t8#RgBK4z7j$rMpjR@rx%8a-Dl8Fv}YP=g}w%f0zSq+NSp| z1EJ>0tu7&POL1oNv>p+iDA46i`zNQF?CF!8>{suk^E$^UKOHTM{AIn*8gh{4BK~s_ zGKGprEHch~y>Bp{>F73EFdOqG_!joxPWar;<<%_eA@$mPl1$hd@E$$r$QWm(#(5Kw z?(rZDhPh!(uiM4lEhXadv8ae>T~)S5#z#v!X7LkYF@Srv@S`;^!CSsWBHbZ&bUeRr zAD!>MzutE^5gn&NNd6-0Ic&J&AP8V>q`V?o7GK^a58yC!D}7iafTacDFP;iRaXyLq zeID>nc)UCqkN=5#zfA%(q;06<~b{GsZ%Zid-exYYDt@Isx-$#ZD_ zc~YZsU>7n`LGyn01i9Sgnx#~;?PkpteYRcatoI*39i+^q!CB8~#99l%4F4YGo=zlY zy(&nS(O{HKwF@YEKX~Xe1mCXS3rDuR9V?DvarPQMa6b8Q@M_LqtKrZ7(T#l|dr-{) zC%Pvo20A*k*MWoTmVBDL6^K&1ZjRmVN|UoL<5G-P!g(>t1zU71g>?fWeKy+UwXBh| zSU-7%1~m)%eY^VQ4h0hb?)BiwwYg;!cLEpHr>??IRSPJ-7_}k&x2)-6UiN*?<0<5b zf%~>wcgfUM9g6WR?)B%R(^1j&F%#ux5E#7Jad{2!_7r_MInX|qZsEwEIQ#7w^zj)u zouCJqH;&(Ywif4Xdxf>3S8ypM7$jlpUvBaCcGZXH;ltMK$l7F17OJxVXm(ahr$aS$?s9Q`+}9{YtjE3+48BRUXbij zu7%PU>v-mM1AkZj64lp|WBNf&(({hcXtv#q?QrIS(}w5NK= zUA(7jNuSkb1$2D;*ZZfFzZb_CYOY0^rF*w)uARDi@I)%#i&^IcLszz6K;KOE@g+GE z7yqC=-1NL5)}s)&is?C&;Yne%)9mx>8K7Ok!wn&71^PFh5%n6P0j4GFc06bJvWG$;_si3_ zxT9f80g7U+lC;DGN>fdl{^Ma23aUXPXeJ+9H8am7RGJmdSlTEfoummtQiq&=%eNJt zV5+BYs+jAFB*=zPH0A4NQ^&(+;;=gPv=)86C@;dm=-hEi+WI;BXtoJnMB@1LtCQ^Q zrhVP!_4+a>=*tT3M)A%`&Lx$mc_aV?dVUK<-FtS7?wL~t*0#F4tF8o*Ed95|_UiHd z94mRFxwHAX3=6B(ktP($kQdUeX=h|=ww6IEGZKL=C!s#Cowr+O7yAaILOZre@ewf( zJ28C*a(`)l&m>X<4IP{2G=u5M%&gI6)H5J5B4gE-NC-1c5z1 zB~*VK^77I|*4#iI^`+yOG%_4rua?{&2h-AS2Y*QW;feS>%;Cbk+>ZI^Txq^8fSL_L zER-;$Y_YPP|MOb-@R|a>E}g{G7^u1|m&7MGY2Zzs|9`RF z{sgB}9lK&JHlbb8@{$oB=|S?(K9vZ-ro(}~>uNcG^Xn`a@_PN&^f(oNOMKogdm<2H zk7-moFfd-8KeWORdtsm_=g!fF1CamEtWN7ef_BmDA=93qLyAUs3FgC4IAobbcEkP1 z3=yziU1+x8P@%WK0|A^P@BHgW99(1k*Q(IduWvDInY~h9J+K*p55)K;sUEHklP)Fd zk635*toqTN;GbIn*!G&-{Ntv+EJu;=P*J}) zCDv0uXOQsQ06KC@w4z+wYZeR9e~*9P^EO|m6znRASs<&7JbZspjbc{?9)<=)w?Ky( z^Cn6d`-QQ^`ikkuVVt~dNI^$J_RvYgFLE*?F#{LazM&?j4rMZa6$HfnO$^@aoFmge zF4yE0+zF;!GTcALIHE8bXTCMMCY7hT`yDssCmumXhx@TaHo**>Y!C$3 z_twLBw*o4|k|j+SFb}>-Dllm$%=V1ixo00w&=aFDT!XjW?L0zkIMcl{*zBQ z@nv1ON#v(IeBdD%zmuI=|&T~4Wh1gJ%N1ERn()ZPU%*H16;vpq`1}PzMymVoB*u|EXm@e^vV<(( zRs1^#d_CpBF}gzpd{yuo68SWXqkxy*Gwb#SKSTU4 zHh8p-=LAE$POKC8Di6j(sY@RpKhQWgg zp*kS1lr)jemj5=2L~|+h2+NuyKVI$MBm*p2mpM0izSPRX{xB-Qf1_`sTB5=mW&9PH?U-cZUJ7{fp3v>2j8fC&UoQZi-peo>%l5iiU=~^{q(Xx6>aVNgd5}N$ zOkn4bj+Ilv!lL{w7$w+v&3S}2E}`J@`89{`$OVV)=tT#CsQAh(jjYru8^VT!~+lpCf|HF3;o&_RghlEOOwa2lc@`bw=!)&e~<)Aq~c32V9xR2hoPbte!(1 z2*AjMOhF&xzFG{0M4jD>0zt%uZq_|8u6Br1a^> za^C^R{=Z*C+|3<>M>F~K-(LLc9xshi45F%o|fAzalAT*;v$&Sae+uujUU+NnmH5%C5F6O!8RiVqSp_VOJ z>4AH-jfvVf^SgwT^y5I2&(22OexwB87*QHK`2>kF%qR!K46~#&3VIZk?EG^n`p)9~ zyJQ%+)+{8WlP@{HJcB&`%4U7+nk4(k>|JFWWUP+EXc zoLGWy=i|Yhyw9*4af6c*UWe+OPZ?0<%gf9AM<;Ew%HLc@jkZVBld7J=A3Vb;VqVS^ zhq+<7?|w@2j4_jQT~NFIfrAzW4%E9OMo5;xT0baNnapEm`-WwfW1zv@buY9|awD+k z0}6*edz$nUp+&29*24%-ck>Xa=Fk=PtcT%PtFpcSDH0x2u<}$h@)cD0nXuu)xqPGu zF}nu*hT?%P?aa_GB8O^suRZxm%^c@M;E>N$0`>`dmAdBIF==h8$~frqRW<&zBzNN8(^x#G%r5gSgw-@3T_fJ1F5lPi@kr=a<_MaR&UfGDEEo<`O))B?kl(EN1!M;}maxvqWcoh-REzHb zIkGssV-`ae_dEuux&v*G4$0W)i%=bR?Q8F9i`2NFISXc`>Yu18kq^kf{g6>smu98> zm!FSjs>hy&MS>a{TQ+LrlXZ7@hxESw=~=LP1S4DAl{s3`ClVlSSvUCb;6h@}sSY3x zueL?UL&FFKLfsAsB^D!#MlV%FoFf-yfc!L)-_F4MO9z=8SBScd$5PQZ+qL2{TgJ=|{4 zY5wnbUO52mHfzu=uTMVF&g9sq4E{zb0xB*6c#6W zI0v56RGaE}vS>|)5ORz{eILWw%bQ9{xmV2%AKp^!dU6^-GCV(Tpn=7R0l606h|Q3{ zsl0evx(OOcj?|xSpD9pv^rzu>f;yX65e;OJ@Qib4xJv2!_~JR~MVma6H1X%59&u^9 zv!$x1J1$#RfAi=obAsGSzqOs?wYPDs=&2F6o;iVRW8Y+Tzft~QEr4#wIWYK!M}ekIPY@`_-vHEB3Ad&phgyTu09aH3D>B=Zib^K==D0 zB(>VnF<_5s+I(Z6dcxy)<@*T2=ADMspW52n+i5zV3@UZG^&-$}R%N2*F3Ou#XN9=>$(p0un*t|Cp-88kMpS@r1xQjXbBk1?g+ZZ!+s=Nzz zD%i1#NN~v}5f}v@5ZrFjayu3Px$GAmNvSk-a1^oa2E<}JQ0DZs?Ry)|8t#3eFnN|P zl3Z`=IWsCyH8WdHN08>gd)9Li>W*%-;56@S3muq0MgEN4Hz6IZ7x;+?J>glTieiN2 zr!B~|g4|=yubK%gLy^_39fA&ZPxD>VQ6u=Vpoon*(~1Lb#o!l?1||pbT}MC7e*9=J zPSp%5&=c4h#ri!zPglKiobh{h)>RYw%^7)vXl!Y0OdeK7y|u>QHgfg$t_)|Rl766_ z5t%siHqc9UAAJL*bofX6sF{o7X2P2g2(isp%dT@=EgJ_l)#{2nMRIuXvjRcdVMbHvO}ItQn=H1ej})BCYb*NHK%h^{Q4O8^XgA?X`j>~)lVB# zU@@B~Y6V*q#NovI(tr0ryYuikq{~}T(b6z`cL`&8h<#8_q!0UzeLhbwwZlaIYL|9p z&{zN6(BSDWZ$4txCw|vhN|n!b{~F&&AyiUBnA3+r_QKnrc&HxO=zUoKtL71mb97kQ z_UQp^DWAblbaUTb%)%+(`&q{>jj24Ve|oeGB^UF?$^Ht9J#AR>>AEfspSJ~Yc2Ze> zNS7@7`2jxjz%qrEUYx&9=os2 zBAN1COZ{F6TY;=s_jMnQtB@g$WlN#9rA*~H!Pu=a9Pzw^Dy96!9$1oJv@6xD%AQ?H zwZEI*wkU(<;Ou^V7Q{A$WZp_0ED1fEi;KV};%?a%1x1{J#!~o0N+=UA5%Fgl7 z3A0W=kM7($CzCxLWsMZ{(3Guvd7N62q=TS~NjHh@^DENbaKrf3ZwR=~8E8Y+Zh!P- zsXsZCk&s%hMS)Zju3h8s#9GRAd3y^n*En%<&{C}CI=6Arrd;3thm*>s+F3oLkDr}p z%DA?OftZ+`iGuFVPuP3#ECGj>@!R%9{^|oUx!aUK-w6udxYe8HW-#L&;iA;TBQ!cFKCLy@|)(dFyCvK$8a6;^<9+dpJI_}Xj+ z!O4`YyIjS1(wcXno|r)O%LUUZV#!qaw;G`pwOyn=1_^pX$?JKiiDIcfq{Io0{)za{ zlo>J!qwCvO-Q}C>-62Cy`d$L)3E>c+vnp%txbZw?a{Mu>&$6j=Vj>0GQDd;R8v}T_ z7xPy^)wK&2;jcakZbV}2Iisa~=pr0c9CrvD`PxDU1c1r=X{D*o-C5ty4S9kt)KnxG zk|&P}C|YQ~Y?{hT2t6n@`%~LsvH_;$PX8p0ZYP}u<@~2Tdi(qfEP{g{W#hb`akzWK zz5=`<4>#Ee)C7lqMYLt!-Ghhv9xh14VZ`LkD~s@T=NWMkGwzUhuQSu>-*3_TCmx&^ z6#GM3-T&UKk;2>#-mJ!*RC^kq@5TBghg;ZxW>L?c2si9<{2 zG}N}%+FCcXr!I-m)>WV!fu<4&PuM6GN{5Jj^0gzPEf5Al#=3g-lNq6gm~ zsED)3vv~SLAu8>@@vrW#T4cz{;f0(GZf18p0Ezq5UyAlThX<23t?*uD6kMM4QwFonW!*TsdaX7FfrhVrFbljS*&M zG+{cGB%pb%@Pl)N($Z*-M>eKqDH9B1Rrou1tO6MSIwRVHI4LT$mly6Ucr{p7LLeZ5 z$Ld=j2B`3dVwu3o7X+7(dj*98C6B~FF&iN}38EBN&LdV9pZG}7|xW~1sN23n?R4I)%>GOU%Lf6IcCJnH^G|+ z?pV(*6|-eg4_YXT)W08_uNh~VVm;021E|MnK1#4 zxPScornN4oMj;00ePjVg&cMUG<@Jo`_VQ-dPwj^k|IGS+(w)6w8h0t2xZ9Qn z@2@@Oh~nP1f~c!>vXJ(`8%D}Y^9)*;%nZAM4Q26PBPoNn&OI8?c`onjY)&8i)Oi0= z6&NU|MX>&ZrwM!q!xE+L{?&M$0a#H$eSstBJ?tUveYwZ*5Quj98$ex$j*A6yDG-M5 zN?px)!9Qq5@JPB@Yl4!9u+yS&kNGBhNIx)Gv;}E}5B}Jcx_@`;akSvGEaPu-)kJSfpgXzX_=LDgwOpD{p3QQYfI#+epHs=u)- zljoWov3Qj@vQH_At8#Eo)`(}a+)gfo1*nslGzNa!Q3gw)L&>V;ksk%Ou|sQSSYF#n zwqKOxMes}hId$x-IdSRH+~2cm4x>#Z#P;vCa*)3}EaSVR_)S|#0?oU{aHNp`zT37a zlD7UEYPB3gN*_L2Fw!~UE}Q{4=KH!vlytwz<`yCNR}t6Y6EzBvRo>uUD!Iw#7 zujG-!2ErAY-JTp;`i`}s6b(IRDCd=;f#CxBR$PC0+{8e@%9p<>P6!jZa(n(rGu73F zTrW$IDSho|(;CWsogQy@J*I_r``V@llv~NL6p9r|em18;bVLA{qtW-g8djwu zoq@jn$VDMCcGIC3-XYM~OO$#p1gtfO8-x9lfAsCN3F_?*2;5-w)OP2igI@B5h69D| zU(|G-UZKEz{Oz7rPOd0*JGpeN`CJ_oJj&xM>&@gI?@7RS z9B#qoY~4JAv~sNV1RJ$c!nAq`iaAkJD(DKGL%@}GTn*kvz~D|-L7zNJSwI{<-YcQi ziL?zN<6Kt<&Fk15g~BCuQa}kas#)Zp7-eov>bH?1?Oo~@;+7LYa4ld-+RCTW3@m;+ z)z^=s9qX?7IS{7#Aa*@6b5wBOV#=tyIH^;y?SAtPyn%(&WshX|ww@W*JdFXPqcpx{ z=Z?S1-Ey(R>DpnwttN#kSGWaFpdEU;1JXzf{Hl_2$WT-kClilEgAjM*4Tb3byJ~>} zPyMWJe$>2S*TACm?mz$NqD)p_eqaEh{m6Y+nDH4!KD2Kh*U0}9HjH&nN3id{OpG)v zhTzu#O$!cm`=+J%Jj&+lgzrcBSz@BMPc;<7S#o^&?p_unAK%K9@ZC)p^8I5pyu<1m zpWgVF&UuQ7CkMMUJv0Dl6w%od0Z6KLX_9QfW7tUN=L{5~w$&9@VmO)Ps&(5~Y>NWy zq=poDdO?1NReL<~$>co%Dij(7Ku`%qfDM4}wm+u5i>4g@h73^=Qa$D5Dq~20WG>2< z_7Kcm^;_9c>`9g(x$__25Nd3<+|!WU*RFBTCF|%=RzNwp6bAydQhj4lrNPZJ2kPaU8sT)}KQ?10NU9-hLafEAf(4fSli*9`sQ$>E}_R17E=vZ&~DCO);HdZ5Wota>kU}{rvP&)twLvm43pdy+=)Hl6^ zasbT&=zxO4fpX7-0CGVLuz|@+q=h%uI+bqs$TDia^Y?5c|Bb@#J1JkLVj@N0)LYo@ z{C#Eh^`pY?rN(Mixn>Kj4Sqo4vy3Df3e;|)w_}`OVb@S7T4WitPy}`7nl3`wu>5#; z^oww2{M>)^B%drTh@t>j)Mscgn_&W}-a7VrS%b9Onx(xu4s41U%s&WE!L{SH^Z;{v9RY?w%x20 zXu$wSj0Y?O#`>w9A&@iA0YrgBZ2WcQs-+jboK-6dbNAW15r?Y9Fs;TCecWG3>FMxHXgxvPD=N<@@LOJh}KV4os@Lw zHmC2rTcrE@k4l|gkMxIDjVcf0~o4DKx0TzU~>=0Wt5vM4gm)!lhiVwKVSflf;kYSH+%Lk04zaKKROv# zee%?Lxb+65%*U-mEh`47o=PKaw-aQtwI3`)SGov#SeAdd?qdWL+UQ+wzA-_Qs2fh7 zY5GM(lCXNEhQ<57)V?UpL&FKOM6!BdMDG`jy2Pes#Y?rsNf$wv`4~6sDcS7Y0gN~B z(B-C%&VjK>8R$2ETE+(90RC*SJaA#Y73sr?KD`mlN~+&?!9e1> ze1sN_;9wJI4f; z6?%y0`>_3iFHvSdVKi?D0rI9P9k9B<@hgpB;PD}qzw0^Wy6`o@iyV`WSsif3_oXE( z_=;G(x)D%vR=h$!s()&Fhe+b2DYx(&jaiog2~0JSXsYpBc*I#eeX^$GUpUSxwZ5g~ zdSw>;rQL=!fO-xu8NTV>!eRvu_qBKVo~|;{0pbq6sGmxfz^R;;`?KVet6W67{ zXQ2Dtj^v9tHrw7CMf}r+3H~TZTQ{)~BP;Y;&~vSQPZAx5lZakz;bETs7E$SD&V3p6 z(ikdRN(Qzj1zPm8SHDz@7VOp+%aWLz&<7ZSU>-sB|18&;Go$MlHqpTZ7YzkPw+u^jMyfy%E*_PoNPCq3+JvX1Vs{|1u$q$^!G!Rg1)(v-+zM_h+$@vgJ8xBUoz&m^r6b*C{}?!=~t8md_TWHL~r}P3NdDtm%Lmh;2Jf9;5t-24o$v*7QH#zh zNI<9cU2=s{Maxpq@OD^`->cu4El&D}aTPDtEvIs)~%RXNCGx6DG{pbto6 zz{r=^kYJvuAS*-sY@!_={8oGz8DU=4!%yn1znEjW++0lnOzTNlHq8rOItNyG^-}3B z@5WhtrAf8Y*eP@UDSPbJRPAvVqSTdxGdE$r!3x;qg*-UEzN`+jP-mc-y8+jq$c0Mlxx5Fp5BNHu{vsYu=}la2yP#CeV`Tbc*5ckuDrUrB#KV4uyLqy*CER}&eT zN(ked&R3(z1ewqeS{Gpzav&H+)zk501sLn?p9soJuwuZ;hGOv{jYUh9VmaNvW-9zC z=9V?D-VchE_a*`3sP(z%fVC0DwPg3C%QOzSnPj%(sr;d~`xD;BaZYs;i+#7Zy$>jj zEXegN2Uy`O&flrWg5}2~rFce+sfMp~$)B@=e%%gjg9XDTelOA6Brk`)MM*~9y)Cr= zOncPObyq7bfjm>tQ&GdYLpGOcXGQ^t-0qES3v@Ig*Z0 zQceu8US{}m(*mVf*2!45Sgu)_kZ|g%(aV;^t>xhdHQv6d6;ol-Bc0c4FTzL&3l7G! z)$gKI7q@TBo-bq8E={7TJ5V-+*{{ z`@XQ6&98ogVfjIIh6t!OV|yauuik+G&q(zpyrC2DBUeB7<^@gOIN!$!!^l~I-i8yW zJ@;zf(6C%A&^-BGU{b=w6#v5Z1^eEz=J_%cb&gR0`KBDc#iZij(jGoQCJpD8KD_$ zG5C^iCG6daWhkd5TD2TYl`m2v_iLM#tg8xBh{gNy?XkMCWUmhLyDvHmQVbr3~QVuqN8bFsZCH4{S zh`!RudGLLC^qkQG|(j=UD(62I%Wl)v>iccN1hC)k$+8RE%Q2qifK= zx-W{y?bOk9RGO_Z;s;6m%fWAJv=PujK}B{z$reA9?iPYF7j?s(Lb~CFLdO++Wpftk zR=RR7STLlW^{ji3gDi7Um~t2w;MXKEMV|PAmY9_NY1v-8czs9>eXAuA8} zkpw^xq7&^}enWbdWK;BB&hNUYV|}5K32l z0x-9bV6aRSM1mgt-3d{}0C(fr&_Q>MXBX2D^e*EV!^7@1@C;){gBRcy7N}`L4mxk?UhaO3#q8{f~(ITc*d~ir1b%h{}22;3W9buQQaD zjaQ@*o#-i9wrz~)saSPVjG%T|9A$~w#h!~{*aPi+!U?aB^GYhkZ72Tjd{WREg())^ zuR`+I?mQa+UL#{D^EQIjZyxsXbl*gPHqdiq;+O$m+C$$*6|J?) zSL2TaeL-{A6^ljoqPG2vt>aS_S!zMf#LXGtpVSUl6EWw|pU*X&&+ zGMO0!@N`dXc62FIX9g9XTy99E&F|6>AQy{ih|6m<86EMV7B0@g#O(nLt^cvK#!o9c(4{V8 z+Vn&c!B1?P%eguR;l2|!<{U<}tUf`%3Y62Lp3t`BQHu!Z9ybvsdG01T+PycOAaRyM z8-a+5Q;73HLOfD#Xm^C@^V87u?XC{iDKXhCdFX_XI2z2=FdO`6T)GA*vN>klHZkL( zj<)UuIOw)jV*xI^5O!#t9R4F?$ox8<3>-|or%bscK48hF$2RctgN$v0g%FE#daq~> zgA6`*AN2&EE>+sJF?AKi1QBTIT`%P%+aU_KPkVv`A|=!H@T{{cIwQ?co!|sU#Q!b% zSl!z`HB!wN0%|)uxD)3+lzkmfjVR*3)w3qcQX_BU@$tprt$(U2mait)^sGK$P~=~) zSfUaRjr`#sY{)({C2w49Ay~%p8vaMCB;O)^PuS72b^Vn%d{4mipLyjH%3l=#a=W(d zZi!rb%_idSG3WN2==-S1fPRaX{w|Q@!m?XD0S=)c&*y!foD|x;QfpB&OOZ59>&@=` zLNQ`aaMi#laK^*bNM^_qZVa9GuFVS)qdeTf#ITg#t}HYv;~~%!9_3B{kdHZeObSRv zGEhUN)#TSMga5pn(g&bWM+9>EVCE^|QI&wMw9@n17IB z=<(h!rs%Wor*>vW9ea0@S^z@qB-Ly-;VsK=SQt$PppgJBBtvITD%PN-#D6uzh(k)< z#=c;x?+C6YGuwje?@!@-Z;r{a) zu~S)KdUL%L3SffuR5c-GeA=W$LtPmu;Ncd~_UK;unm0YkC#Q&k<;nDOjt22-8F}0t zZ_r9b=Xd1b`DZdpLK-7oYXDNr8%hAyZd0@%*=nnk6W)kGp4-z`Uw5{duWsu zF0-t?k&}@-*;ThD_a*9E4w~l0;wztvlv3^)N|@5orCdG<_p|nYHE8H~n;3scH*c;I zEZ-4SFjRnhzF3<_c^1n?fFF+c&VdlJd1LQ?pX4AN3v6I04e%bP43Vx7Z&A)#I@yb} zR;OAmsYsH>PdGrohMPtS1e@!Ae{41QvU4o8{OB&^oq^Y{ocHaWkQLn6v~IwdAO;^F z$CG&HgsLmS>d?Yo4X8lleQ-6D z>TTdja_Jr6tC_{kep(xTd9)a`(VBc^RvSbgD-iBVYYx=w+vkHM(SdpKS-s9Ix54RZ zqm#{(eFEQ2_wKvkXXPFNExVwSBkHRbIylSlm#iJmxb4U$|Ge4VIVrH-kfzUZ^V% zemMY1nZ9rl?L~D!{GmWSwZIl8)aG^;6{t~pk>Cbo&(|J4Etpe`N2pY%419SHpy>HYWAW@ zOLn5RYZR$VLr!(5cTikvVCTY(JhL6xkbUgV_>=yFJ7d3?y7Q!n!EZE9Wl@Tch8=D+ zOoNfZj1BH`DiR1PQ~D^^N33V|)7c7~9>v}D63b@fUPop);cNwcAk+;P87fvm$U9cf z;vQR8V22fwI17-E@Ag!;MF2n@ezhO3c>om0#M8 zqeAeX16BH?<2nxpm9cyWE)$Pi&7tQl^Sy*E)89Um{Xd$%IxfoZ3HR*M&C=c79ZIKw zbeGhZk_Hu!S`m;&r4b|)1Oe%kSX$|lZX~2(>Ad^<+zuDBe0J6{-Pa3y9{Bv&E=X@i+?@bjC(69#ut*o@ZYfI zENKX0XQ$)Mu8keLF{Z*=R05(oaR#wQ;vBGYt1%*kVI$aes#3!zk!^3H~3C zsX*d$X@L)}Z>dSE_8fP6gQ3K-j$$um-{xQ`Ksu`?c!o6~EhNc6svErvNruuyhr<+-%`wRCj9)aZsJ3Qyn7 zi^Lj<&u&42sOU03qT4TnAp(;c(KY*U{jt2YI-%d%wkpb}zlh$NnR5ys$}HZC2Zb1f z57s%tj~kwP2PfzKX0Sq=+3woaGc_^bC zksPQ!JO=KA^@LN-yel}bmwl-iW)Dj{*X!t^`i zp}}Fm{rL+gbkHXm$3ABR^MT{SfQa(n#k`S{BaQJvc{uRKG7Xwho>gz$+c&qH41@uh z6t|DW$*pn-x*xhO?%KDX195|00tokEw!>ZG``T%Sg1(RyDuI(XXb<%XgP*)(!sDVQ zd+O8vXhuq!z`$!Rlahh%*$Qk>0=v3%UA|WqddP42P0^v8M+IadeAxDm^cM?wOn?mo z@0P0XnB7Uy;B6d^?gfTfgML;$!v{k_3kD2Z?H<`ya(UL^-gf>74k3ECX%DnrIei=; z4qHPc8l0A+x{O1ZeqbV)gjWV+-c)F*{CqAapM4s@H*oT@l61_h=z^DjAZsuG&Z{v| zRmJqijxDs8;Z?Zx;Q!MB&SiwN^ezK9r9?iB?$g436ixepO!4> zdx-*CN%Z+)<*F*qBxB!i_pMOP(i7R-cqwOQynZBv@QFLk1n`gIvv6$k2gyaMY97KC2m=F7|du=BTXE76ZBhIaUDVF-$@KCo(G0lyP+By(84P0v9 zCCn!96J~5V5F+hqy2!rugb@cfHA&N)Z@vH?GPM$*Lz3I}Iv%ciu2Q8DgW;?kzKJi(Smo79^&z z$|?ZKYv=cHv!XIlQ|4f!O#@Oy2%7%YIZbr#*<9P4<%U913PSu=a)avI6hfFh~F< z%+Vq~RsFRPSV#^F9XJl+ry)5h?&Uc|qe3k2zpq~Y$}x+bF?HwDj_w0g_d=+C!Xft5l(ca4>py4uw`sdoJRZx1CH}G5 zaO##Ab*A8MW{}+{zg%!TMT+1hEb>X9VFf6(U>^r%?drciQ4!Yra5O);ncBTrT8+4eq}~Gsjd#3`&3%Yy&ev4)-Bj264B|`pK?e+7QuRW$cb|)fr+jgp3;_`8rgj(9 z|KC;g<@TSMgpm|3ft``ZB?M6v^_nsUyys^5fpPSKdCts#V(#nE5uh714n4JRI$US+ zBwTqc5UOXjE{H-0H|}9*qCZMlgwzNgqVc?FAPRr2y7ZlhmuWu2bc$q^54zMyw+A+14H&+HHi2oena?1_O9K`N;ebbH0clrrMq!(X;|8vwlV zDhAApKgwevUg5Ui{`qUZ=A5ev!!FJpPu!Qh#)T2o^9_)(yfS`{{mx8XB{%5blkieD z=oX1S)=)z-%8RA{sZ&(O9a=AD{=0LW=BO$l2_qPR=Jo5VO$q-TE@aJiN@O z{7W>%6TPswb9ctx3)D|3e|i-#rJ;C@s*mQ}*t@!Da<B0^0D>tg(n$GsD_lwo&-G4Bl6#+O!ILK%Z#48$B|Rk ze%E7}>UU+*Wu|`8@={4DNE((511XO@AXclRh+)(F5R3PI%&ETv+%IS(o|}nQ{l?y& zDnMyUh`sA@KU3Rxv^F3HiGNvaOht=g%z#TlKy|#P1^6}hhLZL3bW*fN#oqXNKdi1b zbUdK60Ass*>elm!oCfOHM04FALv>i#q`4>uKKmNA3yFu)e*t=Ed5#6+@o>Uvj`m%{ z+aFrllF!n;_Gfq~z^kWO`Ouk|(h={8@Sa+KO?KeD_@IjT+TiW#ABR16XG0T!%*&De zBeZ!V-Y(C|Y5y7uACK~|l;kuH&7mNr*vzH+tSuQ?0TDaB>+70KnZ>R9254vdvIB2=@M1yc=$L+&y1+}?9$s$c-% z0Tu{WAY%U|JSHKSExg9m?}-KPar2k#rDp1hss%I_UrWFLZ6B&hlTrXia|wQ@f$iKh z2{ycU)`J#sA7<(^SpknF(&`}}S6pp|TA#<4*&}VfJWfiWxMN(!T{(GYx&l;w!0O77 z1h-g-D;MmsW?`BWbTJAD(@U1K|M=-t>Qdi>Be92IGnJr9V=?Dj$Y5DvSnI2&zW|QXe#_mmZSIfQ(C73#u5KMvm#JL2JW+0S{%c zrr!l(>B+*RG;j&fwz0zq7v1LI0q8Hz{vjj>_D6|-UW!Oa1(G6+ZpA$|Qdz)PwY;Cy zgyFlLKQywvmH`dgrA(K=aWX`Vzw0JUFN$K#WRm&sT&>aEbL#4HLc5VaTt_>{<_E8d zkXKK2dQUMxo7rPQXS`XnpB&FW=R9@Lns9fwJM~P2l z0wGLFe{bDmvp2+}-znJM<~mBDC&q*`^!I{f3V3z!3Of_1CG2R#;@-!{9n;xubY=bZ ztn|dn+dWk}hyR-cTTs5M!hRqD{HKvN9}P;uWNj3C5aP`x_Ip@_9~`mmUle~p0S^t3 z7qAoDgolk)QLg~K-_`CgG=s{r@xK;w#;t|`pHu`d^5KE% z=%-`K_rgXh6MfH4M{>Y24z0!g)k0)4CnaS|TV5T(n%mp-iE8t#7$wlQ9maI}FQYV4 zq}{UbmfrD3I->En&QCZB)4NOMFg@W0aIcET*i9IncXNcSPsu+=XHoS3!XMx|jc8ho zB7+VSAX)^Cc5JBf?wicJlSbw@le3yoB#ZQ9k1^j`gAp9)mEydaktU+Ie?CQpc!ZHjY_S&%yYt6f# z!Bgc#4sm3hp24`FluOYmTL>nXO!Ip-cD-dZKmUH->Y?`e;Ih6Ke4hQ$E);QauDvv( z`2CF~L<~l98gX&g)#4h3T8I-SjqY(dH-~{_$)~s$aJ*m+92qT4_P!G2cEKYYX&RrUj}AhO9jN$ly=7L- z``4#%{la0o)_DHdtF7pzkCV{L1iYg{gNp&S+xujM2KZ7l6)TxWS`>Ng%k?{RjsctjJgxBNae2a~ zqr0ac3_FQ-pxTLe3{CF)i|N~+G%|<~c8Lb5j_R^m6)_8BlPD~Q#i+!31jYN|fO-7K zRbNc}Nd%JsPT!9dW*pxm2J$AbN++}#wO>fD#yyDb8%*azwBm$Mgd_&896TPJ;%zdR zU7B-dWC~unl7Vp#NVL|P#5f>kKHvZmlxP5^EEDIpjrU6`n(8DPR}6&da`UPuXj=qP5~H>N4JKGKYCQMp+8=zZ0hR^tVC~}Rk?CvXn@!+ zNd85k;)avZ_@j4?G_xYidxKHC(XXB|EYG!6 z_+yGO9;S7!{I%{q9~NVyi%7=mQ2WnNuq+$1Ey42K3DNZ*3yrJ!6eT;`LRZW-$Iup% zf8fyok#L|nsk}!f{@>2pL&sZ1=3$?IN3fTdIM$n-A{02*d&M|V z-K$#nLw}WfCj@sTnB|c&^2&Rl`rf!xw3ZVltEj?(hU`&!5#eaw&=>NGLly7C()C)3 zJ)~?`aVJ+_LfnL$GM8J=pnyXgFY8;*r15{|deh|p&KaEqnBDoZUR%xeqTb#m>(7;1 zldg2}I1vrqt$~EcbE6h^$fvKHRi~dQ@zhWW_0#XwdU1fxjAcz6<7!5duO>bYVyKb7 zefh);yOFz-6aML>^Y+V3DLBU?tV=+jqExoJa~&9?FA-x$?s9Bm%w zdVBGLQVq)!7M0G*>c@hgM^w>>*awJ83#VZ|COZ4<8lG>v;y! z+WcoGs((SiijDj)CIaV~`{VD~FwX8^ou0ODN{ysT9*BW7jIRST_JfxJP_rpm%0C)O zNQ$^sJ9m1stbP7l8Fk?k(()1ol?CjuA=2_r8NlnL4TzcZf~BGju!R`=5ySsc7gjam$ z+Y1IiDI?w|i4G#;Yp0c|@&;wUO9#c1SF@obZPr>sR2}h>|31SF4E^ki7^%X@?^?{n z%2?qAA;}g*=e-$uMoqc0s5?a(HE07X2@(WUb;&Fehm+YYASy3FBeT2sH%Z@>k z9-Eb{gA-R#0f(NDamRGTgAE1|L2-UW!SZuGAyS1tx{1#iD@GD6qKey3Yaj&XmZ&DY z5(z>r_>3|vKF}2H(T@@CA@Oqi^*oVT4%c!l_@;a1K?K$Z1*oJT6rsLnvpmar5(YU+ z&wc88D(x!-7 z>|(Eo6Va>+o0}1x6JDy8+&_j(#Eibdg4kk)SS~; zGqFD!*kIyv!kf|Km0s3fN^g-y9I-vi4!!pM_dq8LRfn|B+w~sZ1(P$!B}s7aDCKs7|#yvDBNJ5;#R!;MhjScC z#Zwv+9Bx;tjq8_VC0$wn8R)d-3X3y15SOfIWNTD!~GEVJn}^vS@yDLaRc878pL&>iWbmkCKsys`|=KX7vct=gEo~A zH^d+m7uMvfGa5=8nK4h|OnXar1YomO1%gHVtOSB z7`gr&RxcN#luuTh&0Bm}ifZ4(5-UYysJZMfazoK zwl9@K4pbKSa(TWtj_T@t;~+!)2iXi)6OJ!wVh-&XY>X#EvVlv-1v|t#6<)3$dqEw3 z$}beOHi-^@1w#LnO(*>co@Av{=LNa}Gd~+j}}=G3dGI4=yjHe%m31biQW9E|t^=<2h9Oq6bI` zO_XrY9K#u`;e=}#*B`I|tTa2>abocK1(|u-F?J=e+OC$e+zuN;*mN=72+ z!^mGQYT=(|&wdNz9AJ8r%DZJlRsz7g0%qZfG@u5k`k{K9Iq>WVa8%g^eUZeopWxe_ zvLq)cIb2()4KApz7Yn%FX_}zqTq5A6;%=r`wzh~a|A43|J1Lp}xco|-HUB%qlqr%S zhcM-|_P?@uL`7+sn>p66#s%;Ru2=$Jp)@~Ragp-B96rq>{S+|}J1E>fz^bH05@Oc3 zf_dih;g1>j;>^0s#NXztf{}U&$Dk|}^IoJ9GbA%64A=JSNb?AdRlkX@mMwD5)cnsw zq8y`Wqi14tW$xgtqbe5=^F2z#0M9UwYyfiGc zp~WbHiMPG^4cK57bzv=95}b;RE8n#VK(~{r&E9^abI1a=;zVclqATmmt`+I&p(=n0 zT3KyBy%FL6r4iq8R+RU9plNTxCy0SB8H;fR6{+F53a_DxtTMx9Uv!R>-wHgMM5P`oAX*nh zYhX+LQQ+k?fib*jVw8K*)e}=^c(}uo-0|L;0HJ{?ll?LE?EBO^6q#%IyQ^YdeqhWn z4ZEPjo4!{UpYd#6cx1!`)CP3{rBX6J*8qN>V|Gi zv6<0y_rl=jg|`DbwC|R;BUn%ix%9+O z*Hk#bT%PDV9}L9r%X?LZGCCFe!`}!DKPBFBrtYn3&tH0uX&IGXT}1HR9^LvmrNR)^ zlz0H2>|TDT;rZJN%m%2-N3=HL=dyIVj=Dh!7avoAQ0Ko3oV+H*v#SD8xVAnza9rpM zd~dbKH-%vHD>uY(UHhTaD966}bEeHek)Ui;9~3{Hh6$ zPOkH9YJ2)`5#e`;Pn6-GciCKkI!%Al2Q-dAeua34A5QqwgL)SlUD~fvpAOtctz`5! zh()R8U+Ey#=n&RgOAkX1(tX~E39&n!Mwk!@ryr_kq(GD{S+ho?+{u18*et7Z}J`&AvKK3EA1)bO+` zHTl`EXqc$n9!v1cGwO8}CKfL2)Y)IT)lG$pZ>Vi=ucLoC@zrz=F4U(Chc=A}QYi~} zxH7j*H4_{$Mg@Ll|2XC5YZn)v@qYpcKjg=ylhYQhx&n-&KkAQP<-dH(h%ZoM{1%N_ z3cXs?w!EVu>$RwMl#cI>;MC{8!uK_}IjSG!WRsu(8UE+vfg}&aw*0wbh?s|`mn9?} z^^8|9!{wG9Bst{0rQJWu=aG&>>1h8-*z_pL3(WB4O|4MnzZu5?+B5521Qd?i6PcC3 zJ1hmWN&^oprs(nq*GhM{5u}&_AyuRKlBeIxQT2NJDX19qs49wM6Jj>TOFCLk3bz&) zM&B`7FU`9@x$PD=HQX=+366IIRgCoO3(`Z_Y19Y4w$*Z#8n4RB3 z_rwrtM#;t7KaDjwNBagW;MxRO8`h!J?KE`J%Nyxb{ro5faC!*Ola*{9AHn*RI>B!! zPfd`5Ub+HB=-?8jUCf-@y_#G!!T|T4rLQo1Vi4ifP#qx^BTIhW2!0E=+2&D-&4cR? zXI#P;ZFoqVf~)<7=ZazY%e%>mdMN7d0yZdOGZUmty$Y&?WQ_DAUW~pXVrN;|K-DWH zu)KpO6=`wza2x&JM?d%7{%@Cq3TcSoxs}+tIQI~lD{aL76yz5i%g%t2(2j9;T+C*M zpQp=^8TQ%pAyA676uacHK76=gG_*Psf}4&fC;SKaB!uifK;2#R_>BVh8)mon*{^VP;hDjL%(v zMhURE!yCA7FUB-$EZI9tQPrFmavc5{>qyO&0*vUwqFC4SJSb7`Z@`?u9oh_GDT#G~dxsKT>IxX@)e z3EehCx%DO-{Z7N}aI^J}1P>%sihZ!!M9X8Z@`tnx_AvTgO;Kt2`2?57WfFf~w&Jw> zMQx?2(rin~X^~dPCP-SvH^6g4_2>MHOmNPpY5Swu!C;p01XnFdaaOpFN^PpAnTpYI z93y99L9Zc=8-I|<$0}4#z@0V1AG6&_a)R~g*lV-E^>Jo&6p6kpY~R6rYHv_W%rV`U z9!cd?nHbuJZQw~=2lPejxsF_qkdoKdrZHN_4N?%-Tt-BVZLbOgI)0V)LhZ`4O5mTT_#*R6+>oI=U;w0dhu zEWEV#pBg$`-f(s2qit&>{#Qj^Uk?!6ZTw@S9YrW)d^m@}iy}#Y)cq9zb>^gUEZOUF zuIB2L#-b_4PO!Bp21;awD0=p5gOZz+j&JP(T1pBGQ-6P z^~sz3=t4q?ZTuC<*Osb`UOIafGwIQosA(oFG~Ew2Z{n;_@9*>MdU(Q;62AFA_5G$u z?;MT)wb*B6IzyQ7t=VLUrTQpNwVR{ue%vYOS+Q58nHO!ee2x)7x@xH;$Nb_~oHSzD zLH$e%>PxwQL0qubfv`lDg5Buiv}m1rzTH@ zFnn9Jvi&h{J%r`@O<*rUuwqzD^p9AA2mL1!fCe_!s!}Tp%UqZZ3b!=#WU*W_|gUdgO-xt12Zl%~=kXW1lLA!t|>@u*!Ks|c_=j8}$jhiL;!V=wm zjeVi+M7GTaf5ky5$Cy7Rj-9o#%-OrxSKeD(?5_3>V%@v`97i~7B40%>=jZjd0OKqg zN<+6MuIMl%d_30Fiab)H-oJiwR4k84qEeSwJ9oKtQ*D5L)<434AGS z5+sW`f=q${b>;3jaLUsR-oH~8zczpMn;PS<0?dfaXb=|@|62x{lddpb6jDd{ z+vDR&(K{Vo+4Y!M^O5e7j5C#ycq#;lWeR7(eKO;C(K@}n%xL*#UrN+#vo+AmAVfa* zZtoyyQC4>GkMW;Be~f1hpql1}8@OR#a=yt>?HNMmam&zA+<%taiCtxA-dijpYwWz5 zL4B22^_ZS|0=16&|LXa{Ir^nB_%1D2U1WbTjAAjJ9DT9iJV2)OJEtqf(;Zy6v9|enjAPC? zKisc>n6bC)2i>^Dx74an*YfegJpIKjpYLpd*Qv8bg6xQIJ*>#p&>Ga^1bOZIBtQSi z1z@Ahva@f7v4JFn7XGVihs;O`wM?{`W z3cIh`V!sGH`eU6er3*ZPg*usB5d{OtmSE7#Kg53L85h@$|ta`}=#hZ@iYH~p!lEmbhM6mmq zHFnC^N7KpcLV|L)7CVrIO>Z$7mLXh3dwliQg)v?u`1*VHWK$| zJ39|BhTY%pWob%(d(8#;zy&mldg6J32V~G^wJHwsB1v=f=7Tu6t~~ri`s`^7bfw^U z@4t-uiukUtM)r!3#-%S;Z@IgEHIon<{c6gy?`+p}ke=J(Hu^Nq&Bv8FU_ z>SSKcv8O4+?h1$Dapr4GY$&1Tr{cQ zMFy8Q#?VfhzFO=sePGr1mz!z9DJvwK6tIrby6lWA*(=r52C}J8hZ)XLI0_{=5h|C?&md+5 z2m{Kc8)5g_@~<&^T6(x6r=DL;E@ zv0Hled8bh+ztU15efOV`L>lSvmc=d-vX@`i#t3Ss)X8xpuf=%d?X0blB=^)NAea~8 zN_Jm;LnNm25;*m)YD(GYx6G?`rK7pH@lF#WOj{17wIgp6gwBsCxrFoeBFW!`e5{10 z3EC_@a|pW#M!K9X?kix2Y-Gc+{3sTFPXRi2?By{9$>GO6%l z7OdE#q>X@m+LwG(;O_Ft;BI@jt5VNFlBI2Nr9!j4rBcz>+gBkEg2D!$s=1g z(1594Z(3>lb-K3C_Rq|la{BV+az}_>V7pWSL=%XTkd$l~h9)Cd!S4Chn+?ofjS?s^ zSDY;k{|9n0?NYLdu^N4hHx4!t#=Yhb@(bZ@RSqj6n>BX^Uxd`Yf^0WZxy9HN#xArl z{lao6j+xM1?UXL9^A!!kAN01LO{9+f z{C9>GPZK`i{9`pl6@s0nsu$57=2Cv~H)!i6^J&eW@5ZGjy3y?1d>G%OBy;>B0iz=O zelE)u*~8cLa~XOG@PMiX0%J1>fZr@elOtZLHIce6dqGyZHO&O zKS_!A7tPkNo|sSV$?SuDkLdTIK?01G5Z1{f=6aDFNXFwuUb?x!RO-QzTkp7xgSkUO^h~85Q}OihO8(1b+~Roj^su~ zm_mQNyw40nhdtYAj=QS$z+!j4Zt5nFeGx^OH$1tz<#0SnvT#uL9;tR5cwOW%O_WCp zUym<+{VJGLC8pZ?=CSC@pAXUG@OIFc`EUiqe+fR>AzQ$ zg&IGTkDiM){(H%mV$^9)cE7MGZE{3ie&!CO%g+vDqJ5hdvMhG1EOuET+4#0~a7_dt zv_&gFd)t#}lgxBE+ubf2bW%}!RVdSe`-VK^=oao_d4;zLbxGF5V1i;gaRW}UjcqIO zAWw~`S7VBj1`;POeUBKZoNrpl;k+|H4OKO=nUm(1%Xx!KP0F7;U|+3+U>w^IQ`da& zUf)4vdgJb2&if}rg1^%42TYjdx zhrru>XNo4J?dE|w>Z+pEmiG4UqzQF8?=a;#t03^2ldIsq;z)V;9LZeS>d%{VzPF4u zeW6|g{&ZnWaA1y=;1;Iv>tDS?pD3#VINy3ur=iI@y9w)gdIRo%IX*ZBJ2B7$goPdK zIYysyxmnd3Wt>p@z)L7BzqgS41Q>ZJL$cXBy09rf z6C9TiG^@-*xfHyl{ZAIVZ+dG?r!5%q@|4F1M~%(!+6=Ev*6+Tw3DTd2=(D9(Vuy{K zUyNFW4J*09lD>$i9X>C&ku3WvSZ-1G{pZN5^3#I~v<%#p*X1uiarN?``#soxDPe>x z;M%&q^PSRu8-!LLmhYotVYq*m9AKD6gkc+TJnL5^J(pzKjGB7ocppamxG`f!NC18J zq^ud`PSdBZ#gTLj2!->d5w~(8XT>n0!?kZS^J5l=7%Q@Xz+$&ODE?}ifPldIqvm6n z$OWB@fpQ#l#o}N^Oiin-^5_t(P(0h6J{ItofOC|eeTk#s|IST@+Zy0b>D`0_By9V( zAv*h;zD@j1r8dvYB_}Knztk;BaChcbtZ~mff2%ew$;9H@&imH$|H{l3G3Zoz={2851U9WC}_a_dq$bYHPd^lHEv zAJKg~MzQEZbX9d=iW_ID2`~X!m-x%gn5b}RKcUn$v>Y(fF1Aw3bM^$jlb?S>9_bUM zv4vzJwTwiz2yTg3*G{!NL}G#atbvV3Qe33Yl`O)hZXtZr z^sZ9(R$aLzUq$+&Gfcm#0}W#^{sNu&jh7z(!;fhT`Qh6Yobt0o5an8~{t(RlWEo;B z+V&^_5BWzLME&(`k^s*{wl6&aTC$jq%WwN@-gjP%XMCYo@Z86@e7t_SZDhcZW?VdERpg3|s#4Gc>DB;d8Efiic{Yd?6m~r`4T@ z?~!ge#2AQ+VfkF|tmudzbyM@SpT0C%?Dq6VIa$c%GJ4j$7ocWg|q1lC;rP--+Y>NDN-o%+mAut+{v5P~OntgG(&KsOd{_}Omg=je~ zTA0t}(gFS@4%}l+VZmaT*`f?o08 zB|yh-dkZqim*!T!8rwNrhxXOe#`DNDN;FF#l%*vL-kVd{TCPF*nz47S0@*rgApcjCN3^sKD<=Lc=Xc(7p3Ih zc36en8mXY%G`DEKgJ@|7wj2u&Q3!&x*H#Fbsud2X$*iMgD^ zu^(bj=bNF{yD2lJ`T6-+aN2+$PHyE5FIS+hYrQvnH zZBcTQ9rtw_*znzbUVgZiag_i(W0MseE417yx*V78d60qV+jP#YDU5GDp~{A9RcyqvhUkyrI1N_Dv%x%;m4 zfhP~;fezpzTmpOB~P#uS#44A=37lU#>jld9&DEZ^X-Gu$(zW^9kh z-8>Z+6PrXC*B_d*q^;*R|1-1mgP(^}pm7-c-Va&`Gz_7!DL#hK#3xlp@8h!#HOq@yW4`8St?`WFjEKtTu0dd@cFN?(0rk|PQTdrS zU^LGU@oTc8F9bME_8b0hl3u~0OAMh_EqD4)FZ+xkPnwUgMwQ({PWn@M=kwXULLdmn zgu{6f*naJV&UX?A6qvP!TfV*H9Iy{+w`l0XVKd4QfaF3a=R}8b- z8?9JdzVY*}d3Wda{kI+sE$zHZ`Qc{dNddpopADdMx%tU!&LH+ZoQZeCqTQenJpel_ zLOM+;?9I}uFG@Z~Sf$9NJZyu#-FsDuyvGbeJ1t5^3X3Z(s;-bo}YLEgK*_I^N zgr^@7iO4DW=bzbBMIKSHmR*jc@*_i|DckhdIp)!Bn^nB{9ieY%D;#&DO3p6Ru588p4i__iUtI2us<{N9s(MNuQLyG`{}+yg#;apm&BF;)8-XYmdXC z-t8&&ZoNC%y6ABnizXqK&xch$G>LIRxIT_c{+hu~FvdjXw+&O*405;ugU#xUtQdLp zSl3tFzX`+6v1I)swjR!R}6Oq*(t~d0A5oUePcZGd;RNWoJ>1f(4vL#cV{%JRBokTToVE) zOz}Gj9BzJh8y`2S_c~B+Iq#Yl-W6Nhz&6cp`*6-N_pvwDaOQN46_xTuh_O^O_dt({N1I=k@J*fb13x~Rq% zL>uMh^%behB7o1!V%zFM1<*?VKNmp0du{wc4#=T-NADwbg5B~mOLci(sW9OxoKe3< zk9E<&Rai)cqi*nM=zHTwzu!Y`dv+SaVT1ge5!kls0%6M1$mhH@>3x&B?-#?uZ3q!U zx7iDwiIke`G(-vK-T<$$KM187YZon!aC4?bSkXLYXDU7tJa5w~mlw8O z_HKQ<#oiKso{rj}<0A4Ic5mi{2Gy;8p!JnJBU~Br%#VmvSgSxc5NWXu_$?bD41-Bgu%D3C&x*qjH5HZF zt@iPihaooG{1kZi_@OYODDf!{m-^+;RxdIKK{uZ2#RomPz7aIDfy-O;^=%{SSVhLA ze6N0aTBC4N=ypG?H0PjSvjta+Y#S~jAnE1(J2sv7LZzpB=*-cJ0Ryqcgkex`Ny@

        P=mL5TA?CaO%$JtRo(|OKdn>tU$GJd#9I>F?H*c@%bPz{ z`D3mjJO5Iq*x`kw`g}f$F7zzoxykmA`cMIL+3%kX`TiWzMm`%VOj00=+0Y(PYLr`u zk0tQnx>|2y81YL5*(Sq!4XXIvbA7}y_scpWc%o(`fJT}-gY+^db$uG*RCLR;<2sP` zDAn5j7yH6;R<~X?aM(naAouqs-#y9&iF&)_9=&ewsUtqYbOF#Nxl?T2_?GBN#_}7^ zBFs^u(hM-Ye(=dKmt%l=|K6l~A``MqY5I!!`*s`j8cwyumu@|>-oGJicSHTo4^zm> z8wjr&J{4yqAV$O)X8$?O@lxW(X5ZkI)?z}k(E{WztZ4 z1^lAS6c9bdkqnwOEpgG!K9#-i9kob~r6n`=1olbVIj}bX`A^OtDTi1UUB3mr)>E}h zjOD6jq=Fj*)pnwU+E$pReuT5E9Y2*S4H^JQ@IId@_Y;|)%Ob(``OjjVcw?tIu$&h^ z`T#ocxKswUVHTZcDH9*;-m+LcF&UKgb02~e2QG&pn1 zj;6=4X3=B;60wTpSWwcJ*zo79MKG>7bM=JApludn=7izO`9m2+j4`nC#|O9;p0(_s z7^W@$j7$Cx$xB_&07-W9;bT%Kh1GX!&g9SN;X}oe_ucF*`Cz-VSI%88C@vpZ#LGT(?hY2YU^2v2b^ypgC z6XBcq)m#D9`;V0qa+-JF0a0L_t}=rXDYiI@_PxQp$Tclqb%8>`-kzsas?SCY94&7J zn`SA`MKKy0rLK!q)=J*z-86$aZ($&KmMiCDgM=76kY?jYs_5iO2!Kx}m$=T7Ow3XWUWLmer!fFUFGCs~O9jkz0gZH| zAk>$LsjEyP*ox=cze`)5N~Z?s`>8f&+T=v1GT(V9f(H09XgzTVz*UWXz+> z&VlW{l)XJaGVoouY;TW6hL=bGyS7UaM7V`+nty*ruv zqv@;aPHWNbrUgH%59CDcQ{ThKpzNb3BD8_)ovJ{m;%CmI@omq-GN z2Tj;tqNQK2=-JV6i}7JZ10C7ul&SYno5U)pBGh)urnXG1eI441te*70La2Ap30Xw* zOA{}z6c=843dpmgZlLRf0`#%~rNv;Jfig7LTgVOg(3XahPn6cmGX2fC zt0;(%@?ttso5aE{ZNy~N+QsI(JDHiPFk-A}VAv~VlN)hNezoZg=Xi&$VwMuns{;?zeFUgroeIyNvIR0{&x8oq_(x69T2 zZb75HO@SC*jGHqLI1XmuR7Vi0S|c;#{I8||GkcOKk z)yEI%f)m^@)qv;(H8ZqG6Y-M4m{?&@fQqR==Tka4!rvF5!2y7Zot$e;Dp+0rI#HZxulRbt}R05yQ&K(jPhv#a+hO-?`jsc0l? zL87|fLfA5|YPO!e?J(E#Y$1177S6#x?5g&OOAobq{JL@V^V!SJjo>be4hh`$YVicuLr1i1JTjX%AnYO}(oLGw^$LNA#X=4|?(~IG`2!V}iC0 zWMyE{24Js5@BHcEJy@k`Rw?1NrozbTx>M#f21? zDSB`370tx%K;iy8_3+(^Y*=U4-jZl@U=S4(vP!F=6Lfqa7+Ll5AhQ5Wv?5nNX578; zNP-;82-+=T=`Tx&`HhowEqR#cHv=5_LHS_Ua7K+oQp0oe3`M>rOfkF0wbaOhA0QTh z1$38AHT_9BHVCZ*`+Z@=MUboxJiAM%BM~p^i5M*g1bL`buU&JVk#Tu6cLVF9Tu9;% z8n>~Cc;it;szdp4|rph#&%ec z#_k4yJ1~29iwZbB;ba|)-vjG^^AcFE;|Sd*aimo2bqx!@6Pal1);MQ^0ThW*Yi+mOm}}B(#hh+n zD@%(={>^1UR*rBPUn-<=7!mdAV{rSA_aTaLpOqBmVu3U%ro{!g{o}xvJeF$WWEg*jzKn6^;>ukjPFe@ee>co8L558C-Wpm9EX8|4+TaT zsjh_ZlZ?t2;M$f*18Nfu635Pwvp2e{A3@tiqvk++b*(bpEO1J^$Ut1GOGGuQFK_dNnCggevUixW0*%uz6M8Tu8z3Jwgc1F- zIce-7;tnY`P_HWT;S@vq%^TkQz6Fg>Qard<%WCkaGl=8oe8<@)!Nbd!-)Ap08#O(*=-?hB+GAnR{=H}_oZlK#%?|Ik;z%D zc1Li>=e9zw&2W{fk7ol|e&BB?=7jekS`9&^%Eq`Zwe6^c995p%p>(1vIrS?FRfp6U z4^Q1rcd0#MOSct4az@`JS4KmUCF07QY*!>JcKA1yq7M0EmTF_B6_+x8aASR2Z9zQ4 zTN+%yQebKpfC>UTamBBod3NLxrm*-inzS@>h?!Wz%3+uEM^?Q>b8w%Dd{9tf5i+i? zC2V~3bIetg6VyD!F-BT1ik!Tw?({+_jxAZI?p;nj%d(gra%q7ebn(3u>AU1*xBr&% zTP9@mOQfjxBlP|1xQ2u-x}wOb%X1Xpl!2;=(klweyNoWqb=3M{*iOXo zD2W>TBF8fJ`QuodtbYJJ<^t5kKUWqb<|Wq#hezDA$`@un|d0 zoRHVybhMVxcPo&uT>5&&)&o!_TlAO!W-nzkF!MnTYSRX213W~^SoEn?xBURNE}w+M zL-eiMbX7go9K|cXr0|rVB_?lG5$-1XLEO-*2Ot#5LM<=mGG!A3*BoS+Fa_R!u1p~< zeX2(c!$no0^I2t!MLz>wisgDf{tQTI;e|nTTD1G$tCljLwEMn$rHj(Q&BC|Wxk;>S zwcc$9PcE+gO)^Y1Sy%UW?7ul~JS$1GmiS6PwaP#O{0q<7ni>d0Yu{y9hiIa!+d%d8 zMEnK`^7_N(xAJ1P?IZp3OkD+>|2Sj0U$9)2JbL(t0(LJr%Vb*vPRuKsx1eN~`@~{^ z?`20bDIVVNf3sy)vhWBN?1bb4bB$YLgw%sKI-`WLEJ_T(Yep%k(e9vwh^3W!YhJbZ zjuMFnnY|o!Hyx&p6Ht0eoB^{3)QaSw_2{Wg!mjrFUi~xy)`iQJGfh>RcDZ4xN|5EZ zXd6`ofd@nKt~{IHijtmM^&}g)hIn)r`t_E{u@T~!7ilQz^#DX+j4xn83I*;~!1}-{ zuW3y77k;w8F6BLw2^>>AK{_38fL52Ip0tQs7UkoK@LxUp>5YD`DC z2NEC`duh+tNJu#lyS_q#J$NC7)#fCHzfV97yi~2Mxts^lm6b>!3z}ZwK?!}wOi1eg z6pYt~@o~sipoS83ffU#4CH0$$=THvNLlyZK5qjRD)zi*}h)yiXRTwlz^woeJQrMK* z)Jm!Ju+g?fkFMwgnm|Z3*W^0^Os5s)$%992j1xLul-yA-SUUo3uYo-Tc$RK- zkkgU2^Hbt?*cU}IRZhT&!(5bkSxo0Om_8v3I0hfQwRK_!xfy(Ll!0H6dRl-7tQ7bhfc4SsV_p$l*7@Dh z^3+r6e&*|)et^TD292IBE>q#jogd1#Y3j~8y5UDjyedP1t@uuZTa_vuXEjDV)}Ng>2xIRo zY9yu|+>2ap!~vW9y^dKHd`<#D*ufHE)$3HNqqNL{7qAH1vS`Xh+YkD%0{R$=i5H7n!-YcRmlpFW!+;lG=gwDA}vg z|8h}ojL$kW=5B2(7f|1dfAvUVpBrwb1u5l$Dj6c&S%o65L-(rCHWsAvHoAy&#tBW$ zrx|>hii=-uM3DipBVlH}C_kV|ZnZg@m`X?7$wV!}Fij{Ade*ZnRQ}oipndVFICQW7 zA~2}o!^=7MI2eOIP!d^?cOa_&WZh9qC1(Fyx|qdzA`d z;MJo9#;0|zn&y8qz2M^mRLT3OXJeAPgS9+`0z0>X>8E8<@)bpjn_Vs@({e~{pV4Bm zCIJG6=$dz00S{~9LhLie_}8~U+8mlP8Qx3p8phKe>V*0fN&GVg2F?R&BSkYdwgGu? zc&|30F5P?noXS?0%SC|K)BZ?=UpV8-PCo{Jc;Zg|1c9eUP~xqnVv52vNx;fw)X9vk zgzA0;iJb}~`nrQkG$11+@9dMb$5Ulu60=*o4&DBol(r6Op4q|AZk9uQ{J zA^5*{YGD|ca+<5-VY`DgSn;8)Pb8HNjMm!Z3klmH7lGbPNTKJ=^)J*zvafG73_V* zVu?>*gB90~iBI`w{7VG2bvJ7N&u`981_zwJqm7Na@1yE~d1nOPv~^#Ay!)GQuOm@| zg+&SkpOp6pd6LXZq>aCixkuxgVeFmBw$*K_!vC=o+YzR?EXzSZxjKI=0g znp5<`)TG3}?csrf?Q--r=&~3+AB;^yCyK&i7!v8m6~?YL$Nm1!`5byeU5VUC zD2dWj5A`X2MT>j?k{%f*zcn~-;~nJohypc8VUklT^(e}_H=F4h&jnTbO30vERl2yn!cbrot>XkJp*A1G|44>CL5Z5^U4Mu6GMwP} zEL?5~$C#$*L^3I5p&Y>D!kV{XQ}o!FX=@$lK#?C=)LzSQV(4(cTd!*1!9F9}p9%re zc@4i`%TS62L#;;xJO5QaDC$Y4;Hl3j(X__E#TV9&%pQ{d;>it5@vzN&AdK>eEuX?O z)x~+Ico@O|3|ZInLA$+;t`|7b(CQqyQeM#~y1g@D0^l5Kh@E=LNc*Z@N8Y6W0wH(% zhHkX7BY$fSDfdyghe)KV@iE2G-v&}F0U!;Inb~})Te_QTgisJHzcGg82+vRaWS9BC zn|?wV_-oJrJ}?G2-oC-LIi0bskxb7e$Ev(T|1(SIQN>}tz6@F?cIqv|-&7v5rL$s8 zMRP)MH-N~b6H(A&RgeDnBtZ?nWbv^Ie8AsGDOY~~9+ycHEED%=+$!TmMh(}>y6vWA zdW*T%lI0;!Ev1#eEFH8fWVXu)M$cDT{(Hmjn2y`kXst1|tE(Dh=lW<_7x1>!hdPbn z%SFGF@dfxv?HscN6q@WYQ950Jd3rV>EMbU_FDY627(NvX+TGE1uHqeIG$U(~giNRk zl`963mZF4q`QSDMs8G`SrtiE^Yl#(a)Mxplw)lW!7$&5u|JgXDRC>=T3{wQysUa+x zf`2tE4sLg{l86s;gn)1^@Sva4G<+Cq$_M|5ZVfT)xMiM(BAUfVXcPH9?@~(av#FpP zSF%AW&lQtU)1>u1Cfl8mZp_Y^%K6dV+G{F1w*jSAe$07FB`vg@7#c*Ia7Uo`)e&tR z+`eNf5L_fYUkkAhoiKyvW6(C6miXioL$KN#5fBin?RocenSm6{s7Zv)U~>@s_f!hZ z`XkUee%%DTgjNo%qE7quY<_D!Xht8Yd@QN{Cx10u3EBO%kOpXNDHpk#9)x~P?pK!| z9(9CK7(<;Hn=Jnk@d+#>xntDFe1K)d0t7b?$zhLyBc*)OTo{lox5_C1eA(~}!SM5i z?&jQ|!2lN?^UxIy9+L3cwd;np&A7IcG65tt5VbWPmGQ)I!4tA?P2uD}jOkbFHzW;E zK%V-2ayBMzt`=B;D__1scCP6l~nu{qqQ5`>;4Xv}QT(76=ypPnFC6n_VF#Q(*= zmvdOzQ#S*GYYL+1iPxJ>1m3(?3^i$>K#zpUkOj1t3!)BKDd6|P>M?&clPs1N@KNNz zWP0t$%8u`=Zd<6^lFXZ6zAb-YsoE5yOq$a4hO!L1gU;gyZrjD%!%I@S8_r<0x7kQ4 z$IBmI!$*qgYzUsaA9wSpn!!)8^=zZY+JF&$^Ss3~EzmLX(ENt`CV#QZU`zW+?2C4) znB)&ORM>3YU$)>lE0W&F4wkEn|6D~~BZ9ktuZFfQ*$>zPU2hcn25LPMl?Ac!nA!cc z;vV|3-X+e6eXnb>GCV?Q!fCNf;c&zTj6g>xEa{}FSnAu8vXLX0D zRe)KwO4&#k2U;7qjb25hy?U!z8WU0C@#;`gL_Pzxe+|IDOP!3=`fBz3J*UAJjsx!y zIr*CSrSKeP#jUa+9#`<}(x%N)`yakI)m*2%R9aR0h9eJPkmIW#d)sN+XF173-=mu4Bkk@UG=Phqk_GBPTYn(ENuYpIqIc=r2G$22+1u`1+C|n{3WPP88~=&+*H%zq zJnw6n9M7)@ccdu*fL2!*p=P$v4E&rMQgYF(6>f^Hk(0_zc^p+#uOZDA$bQo-IndD* znk`y>>^QNR8u+1a?DAYeB~$`g%h!6S+!okD5fcaFoJOYKy{Jg+aQhvS!Q|!~KoNZ* zf@Jlzx23^7e_%X_aT@nb(=U1O@0v70eLnF+O`TGj!i6Pzc0iL09-d1P8wXRE21s!_ zb0=>FK-K-=x!w}>-Bn`4Jn09tR&BI?5b@Idr^vzFLf@SdMh9W-Kxl&D`NG{L&4y3X zFBRm-EfmbekfB_U-YF-9^XCDq#oYv3QLAtpXVHe zd=xmt*Lm~dQK~SVR=79~c1JXibm!L8*oP7NmvhBuPI6E(jr(Ntp;@bm?;jYQSK#Y$ zW~Q4nrF_w+4{dwalbKgIu!cU?1zS7>>>(UaO7tBIw*`Sg06%IG)k$??3}Rc(k})UQ zH2r!g7{B%=GXeIuS!F1v3A4TN&&OJU7Q4~!RQ~ju zSbgXw6^_hBHqhg9GzT^#sYKz?Ry07)<~j!s&(E9jThmge?vsR>W#6-@`}Tc;R*wG@ zRoRx?o28n!;$+t!`(Ao<{^=|yQd5=9gVz`t=Xv`5zQ6Bb z`=jnho_9dYfL889dD0k^dJhXWjtD@NCR|^7v}KyuP`R<1x$hH5ua)?P5dv0Ass`N@ zA6WR&Q8#fDIVx4{)O_NxYVaiQ=OI6mQNNqSo-z(TBK4v7L;Rzw_&w;Pb)c_lVxT7} zP7nxA+lZyaQM3hoR__GIiGR~8j`jPbruQMxRYMs8+ojEdW zA36Y4<4ed8pFYk|Kn`99BkYMyfD%hO>qOMP!CS#o!$j#oZ)O0+2^+>P3u_xz*$~+8 zz&Vix)sd&IW8QbE<`?Kdkt_$&1GFomxs9WbUPu=2HU*I(W%2D^xqFeMI9M_gL25y# zWl?Hm#6D*IQ38-p!Ld?6%*`R;?tVQnQzLnEbb@?1$|Zk?0pIIu#nY|`awqxQ}GQbgc?4plMcV<7%{QedBvv7( z&d|=EH!VN@y?N3?j$HiSct8mO8$-Ij(S}j+G*?Y5n#KG&0qywqodf|9Zmz6_T4v4; zOq0Xeg>xV}hYP|3?dgcc$F^4j0%uWLk#yf&oSp1u>WR6*`!t~s3OF-=iaRZMw=W)f zvbjT#nK{qxXVd%!?dbA4yI*wN5cwem!qJwDRjtW@aOThpaGWX=Xn$kT&HhN(S=)VY ze1NR74O9@L;wI%E%`o7Q5M{j@nK99A1hN}=T5-$7A7$*HmAR27GsL}X>_^-Da6JD6MAN&bU>t55jU+4&>Y31ZI3vJ7jf{87a-K1??EFzK=aI z{%bCJE<$Vxw{*?@)shd*-e{oh%m3ac&g&CB{>k#A@5)XKu}o3~lFhLO$S(WTdi`l@ z;)LW*%B!!UQ5ij&NcpE_dJ(@z?6->tPCgtovH`Q7N-Kub$9Ckx$ILis4M_sB{yQvL zx|#qsdH$0DXy-ezunN??9Qo7eN3HNW=pvbf;`_nlz1XwPe&8SJtbxO)iKQg9Z={w5 z{Fykp$eT{xv4Pzwpq&$$O^*cajub6;v6|0%4+N|Jge*8J*vFwhugg z{rAJG4Yoa%yT2IOu9enN2e(y|)ZshY(sS%~{<2XJQ6P-OL4-VgRF=073eU6E{#XFB znL8qns0((CPuXiDQijsH?pice2%J_hTq^AlJ|#Pd9no4z0kX_no%2 zk7GN1uIgC-<6Fsc3OvQFJAmp2a;#QjGo6H*^)fN2{hva8N05Ijvw8-uK$YpV7&jhR+d=#@)yWaI71)fgfJLXBG)^7&W-ic@|dOsp^3A|ezolp%M%~$@>k^FSel=P(WOS+M8=Zf z(_ZlHZJW-{W2yREqB5dnkgJac-e05sVQ?nb4SG~Peo;$~Qv@`?Q;+MI+&ht%?~6+U zEwK@+?Td4Kij(rIB@fTLq=k8df5^Vh{EzIgr>d@gbaulAN*l)O46Dzy&wSdFp|{s} z9&F%!ezqNK&<_SZWN$lJ&+FyD78igoswcx~=)o@<2N^-n_r9 zm7Ere(yzy~@d^$TS(IL1v(!w>onmV#5>1qYu6@=%sLaqg4h4P7WU;a+C7Ym+wiZul zH8}b#07KmE02lnCJ8Cc@y_}hG=kvj5KONfOu92LU^~z-9AIt3=SwffQMt6)( zCrU){g1tk)%=@RS#0=|wpea4ZarORhvMaxAN8%KnIgX5Hb!1<>26Y1g+!j?2A?%`X zLBAQMWVJ$cwBrAg5)bc@1?a=ZQvXI%nDhnccT04ewByXs53cs#Wc9|#)AIsjf|xni z%y<01SBbImq;H)CT093P1~@c-?m=++eLLN;*qEZx5O*{DC82N38f#dnL^7Um;@1*b z9!w+#y=LjfhJ)XoNXZiJ9^c6MQ@dJ6%DuTvu*}ySYo`<6p{l z5h{nfO55DMAulb%Y3O9p#BsO}6aCOH`{OsfHLbQHG>N7)SnXaOf23#6?{CLONGkFR=a^`Fca>(`zi$gEqZVBQV6O@EwOIKYrPN+aqa3 zTD7Mt&BYEwnXXA+z}zCODWe1hS!8M%uG6mQq{)##fBf-AZ60&-ArSE?-GaEYs_3`_ zjccc?l|DtnQ-lbBoBac%@76(@ER8__q@K^JD7S{f`!wZN3BMcnXtv88dygW5VvW|BS#QETB!K6P$uGS zY6>^t*4VNf{(-~#1wx*Yf=CV2J^9z0PiDeDotE@}j2I=US3pXGqMQ(ga}vJ-@#(%B zk#S=Ybptwf#Ltepw?g9M@{wY*YDQ~L%R(SBq<*3P~TVRf7Lp3L^zbde{d)Ry{Z>n zLoGKk2B=DI=m|gOL+g?^{j-;(&S;bEyyl6-|8O^|S>moRnt?HesgFtOSppd0Y!m(H zDWz=G=uHeWqB#MT^T&T@zr1xU5;{?XcxWH2pd}QNT=P``MT~ZUq3ITSN*p*Pe&~eY zl}DP17p7)}8qxeBbDaaVDGbjyLO32RnW9a^UVHu~+NuB~o=FJuorwmxaT9Yn>;czC z6c7_OxW8Hq6Z#hm*?Lt?B!4SNpa%RH-;_#72Km=nQWt*fn zDb^7g1OTg1q2u(ZuE|vS>miC#DtQRM?;(otu{#yQ1R0h65pWo5`P6Mce|l)Q4#Ko* zjScRoUb2ny5Q9hP3bi2C4TxAJ;<-;$O-LO{`JcUj^=d<&r8WKE^{p52`UCg=_fO?8 zzId_J{oC{?Fp<|8Zo*9aD-pBQ5F)M)g5g4C5zV*%S;A1r|F^u2x=&pG$05YS@&Et% bmOvnXeo%k5%bwx{5HDR#Lqx5*Q~dt{Ca*G+ literal 27246 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 Date: Sat, 9 Jun 2018 18:01:30 +0200 Subject: [PATCH 300/595] Update de_DE.lang (#1337) Someone mixed up dusk and dawn --- .../assets/bloodmagic/lang/de_DE.lang | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/de_DE.lang b/src/main/resources/assets/bloodmagic/lang/de_DE.lang index 926a5efa..7417685a 100644 --- a/src/main/resources/assets/bloodmagic/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagic/lang/de_DE.lang @@ -26,8 +26,8 @@ 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: Morgendämmerung -item.bloodmagic.scribe.dawn.name=Elementar-Gravurwerkzeug: Abenddämmerung +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 @@ -105,8 +105,8 @@ item.bloodmagic.livingArmour.boots.name=Lebende Schuhe item.bloodmagic.altarMaker.name=Altarersteller item.bloodmagic.ritualDivinernormal.name=Ritualrute -item.bloodmagic.ritualDivinerdusk.name=Ritualrute [Morgendämmerung] -item.bloodmagic.ritualDivinerdawn.name=Ritualrute [Abenddämmerung] +item.bloodmagic.ritualDivinerdusk.name=Ritualrute [Abenddämmerung] +item.bloodmagic.ritualDivinerdawn.name=Ritualrute [Morgendämmerung] item.bloodmagic.arcaneAshes.name=Arkane Asche item.bloodmagic.upgradeTome.name=Thesis zur Verbesserung lebender Rüstung @@ -144,8 +144,8 @@ 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=Morgendämmerungsritualstein -tile.bloodmagic.ritualStone.dawn.name=Abenddämmerungsritualstein +tile.bloodmagic.ritualStone.dusk.name=Abenddämmerungsritualstein +tile.bloodmagic.ritualStone.dawn.name=Morgendämmerungsritualstein tile.bloodmagic.bloodstonebrick.large.name=Großer Blutsteinziegel tile.bloodmagic.bloodstonebrick.brick.name=Blutsteinziegel @@ -218,8 +218,8 @@ 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 Morgendämmerung: %d -tooltip.bloodmagic.diviner.dawnRune=Runen der Abenddämmerung: %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.currentDirection=Richtung: %s @@ -260,7 +260,7 @@ 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 gefederten Klinge +ritual.bloodmagic.featheredKnifeRitual=Ritual der gefiederten Klinge ritual.bloodmagic.regenerationRitual=Ritual der Regeneration ritual.bloodmagic.harvestRitual=Ritual der Mondernte ritual.bloodmagic.magneticRitual=Ritual des Magnetismus From 8bec2f3872f2f1f5c0841d0093a7b3a6b13dfb64 Mon Sep 17 00:00:00 2001 From: "Urey. Xue" Date: Tue, 12 Jun 2018 21:49:24 -0700 Subject: [PATCH 301/595] Update zh_CN.lang of blood magic guide (#1327) * Update zh_CN.lang of blood magic guide * Clarification * Clarification on Laputa Shard * "Messagner" -> "Child" * More fix --- .../assets/bloodmagicguide/lang/zh_CN.lang | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang index e6c42342..5cb7ba38 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang @@ -19,7 +19,7 @@ guide.bloodmagic.page.alchemyArray=炼金法阵 # Categories guide.bloodmagic.category.architect=缔造者 guide.bloodmagic.category.ritual=仪å¼å¤§å¸ˆ -guide.bloodmagic.category.demon=æ¶é­”使者 +guide.bloodmagic.category.demon=æ¶é­”ä¹‹å­ guide.bloodmagic.category.spell=战法师 guide.bloodmagic.category.alchemy=炼金术士 @@ -50,6 +50,7 @@ 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诸ä½è¯·å。ä¸è¦ç´§å¼ ï¼Œè¯•ç€åŽ»æ„Ÿå—è€ä¸€è¾ˆè¡€æ³•å¸ˆçš„æ•™è¯²ã€‚æˆ–è®¸ä¼šæ¯”ä½ è®¨ä»·è¿˜ä»·æ±‚åˆ°çš„ä¸œè¥¿è¿˜è¦æœ‰ç”¨ã€‚ @@ -81,6 +82,7 @@ guide.bloodmagic.entry.ritual.laying.info=å¾ˆå¤šæ—¶å€™ï¼Œè‡ªåŠ¨åŒ–ä»»åŠ¡éœ€è¦ 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=å‰è¨€ @@ -134,11 +136,13 @@ 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.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并输入到其主人的çµé­‚网络中去。它本身并éžç”µæ± ï¼Œç›¸åå®ƒå€’åƒæ˜¯ä¸€æ ¹å¯¼ç®¡ï¼Œå¯å°†ç”Ÿå‘½åŠ›è½¬åŒ–æˆè¡€é­”法师需è¦çš„魔法。 @@ -190,6 +194,8 @@ guide.bloodmagic.entry.architect.augmentedCapacity.info=和增容符文类似, 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=æ¶é­”æ„志与投网 @@ -209,7 +215,7 @@ 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.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物质嬗å˜çš„炼金术书ç±ï¼›åŒæ—¶æˆ‘è¿˜å’¨è¯¢äº†ä¸€äº›é€”ç»æˆ‘们这里的炼金术师,他们也慷慨地给了我一些解构物质和能é‡çš„æ–¹æ³•,以便进行深入研究。(啊,我必须承认我å分喜欢那些炼金术师的暗紫色盔甲——区区看一眼就会让人感觉è¦è¢«ä¸€ä¸ªè´¨é‡å·¨å¤§çš„ä¸œè¥¿æ‹‰è¿‡åŽ»ä¸€æ ·ã€‚å•Šæˆ‘æ²¡åœ¨è¯´ææ¯”ç•¥ï¼ï¼‰æˆ‘åˆ©ç”¨ä»…æœ‰çš„ç®€æ˜“ç‚¼é‡‘é˜µåˆ—ä»¥åŠæžå°‘釿 ·æœ¬ä¾¿æˆåŠŸä»Žæ¶é­”æ„志中抽å–到了能é‡ã€‚å‰©ä¸‹çš„äº‹æƒ…å°±åªæœ‰åˆé€‚的构造了。 @@ -225,7 +231,7 @@ guide.bloodmagic.entry.demon.sentientGem.info.1=几天åŽï¼Œé©¬æ ¼æ–¯å¼ºåˆ¶æ‰§ 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.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有两ç§å’Œæ™¶ç°‡çš„ç§æ¤å’Œæ”¶èŽ·ç›¸å…³çš„ä»ªå¼ï¼šå­¤é­‚集会和碎晶裂纹。具体用法å¯ä»¥å‚阅《仪å¼å¤§å¸ˆã€‹ä¸€å·ã€‚ @@ -244,13 +250,14 @@ 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.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=阵列会将接近中心的热é‡é›†ä¸­åˆ°ä¸‹é¢ï¼Œè¿›è€Œè½¯åŒ–地é¢ï¼Œå¹¶æœ€ç»ˆè½¬åŒ–为一ç§ç”±ç¢³å’Œæ°¢ç»„æˆçš„æ©¡èƒ¶çŠ¶ç‰©è´¨ã€‚è¿™ç§ç‰©è´¨ä¼šå°†ç”Ÿç‰©å¼¹è‡³ç©ºä¸­ï¼ŒåŒæ—¶ä¹Ÿèƒ½é¿å…掉è½ä¼¤å®³ã€‚潜行å³å¯é¿å…è¿™ç§ç¥žå¥‡ææ–™çš„å½±å“,当然这ä¸ä¼šå½±å“æ‘”è½ä¿æŠ¤çš„功能。 @@ -258,3 +265,6 @@ 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éœ€è¦æ³¨æ„的是,法阵生效时,所有å¯åŠ¨æ³•é˜µæ‰€ç”¨çš„ç‰©å“都会被消耗。 From 1096c697f4a8d25850d1ea017cfa0822fd1e7801 Mon Sep 17 00:00:00 2001 From: Arcaratus Date: Wed, 20 Jun 2018 21:43:33 -0400 Subject: [PATCH 302/595] Fix the Blood Tank BB (#1347) --- .../java/WayofTime/bloodmagic/block/BlockBloodTank.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 9140427b..47e03d74 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -48,14 +48,8 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB setLightOpacity(0); } - @Nullable @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { - return BOX; - } - - @Override - public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) { + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return BOX; } From b38c3022eef6ac450b4ce62e441bf752f1dd2de0 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 26 Jun 2018 16:32:07 -0700 Subject: [PATCH 303/595] Fix crafted inscription tools not having the proper durability (#1353) --- .../java/WayofTime/bloodmagic/ritual/EnumRuneType.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java index 1566d5b5..d827c436 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java @@ -2,7 +2,9 @@ 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.NBTTagCompound; import net.minecraft.util.IStringSerializable; import net.minecraft.util.text.TextFormatting; @@ -44,7 +46,11 @@ public enum EnumRuneType implements IStringSerializable, ISubItem { @Nonnull @Override public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, count, ordinal()); + ItemStack ret = new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, count, ordinal()); + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger(Constants.NBT.USES, 10); + ret.setTagCompound(tag); + return ret; } public static EnumRuneType byMetadata(int meta) { From 954f2c87e1bfd45681508ee70fd6be63849bdd92 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 26 Jun 2018 16:42:35 -0700 Subject: [PATCH 304/595] Fix bound orbs not allowing JEI interactions (#1349) --- .../bloodmagic/compat/jei/BloodMagicJEIPlugin.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index 0f183c45..7f82a21a 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -7,6 +7,8 @@ import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeJEI; import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; +import WayofTime.bloodmagic.orb.BloodOrb; +import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; @@ -89,8 +91,17 @@ public class BloodMagicJEIPlugin implements IModPlugin { @Override public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.UPGRADE_TOME); - subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.BLOOD_ORB); 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 From d1e77acc730af69265c68312e1e3d7825cab0146 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 26 Jun 2018 16:50:34 -0700 Subject: [PATCH 305/595] Bandaid crushing ritual to pass a valid player instance (#1345) This entire thing needs to be cleaned up. It's so bad right now :( --- .../bloodmagic/ritual/types/RitualCrushing.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index caefd268..01cab915 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -9,6 +9,7 @@ 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.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -19,6 +20,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; @@ -40,6 +44,7 @@ public class RitualCrushing extends Ritual { 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() { @@ -154,7 +159,7 @@ public class RitualCrushing extends Ritual { } } - if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, null)) { + if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, getFakePlayer((WorldServer) world))) { ItemStack checkStack = block.getItem(world, newPos, state); if (checkStack.isEmpty()) { continue; @@ -280,4 +285,8 @@ public class RitualCrushing extends Ritual { cuttingFluidLPMap.put(stack, lpDrain); cuttingFluidWillMap.put(stack, willDrain); } + + private FakePlayer getFakePlayer(WorldServer world) { + return fakePlayer == null ? fakePlayer = FakePlayerFactory.get(world, new GameProfile(null, BloodMagic.MODID + "_ritual_crushing")) : fakePlayer; + } } From 86f54886c59a838b1f95884612a7579eeda2707f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 26 Jun 2018 16:53:16 -0700 Subject: [PATCH 306/595] Mending should not work on potion flasks (#1332) --- .../bloodmagic/item/ItemPotionFlask.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index 0d7f9e01..12e0a2d4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -69,6 +69,11 @@ public class ItemPotionFlask extends Item implements IMeshProvider { return EnumAction.DRINK; } + @Override + public boolean isDamaged(ItemStack stack) { + return false; + } + @Override public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); @@ -108,16 +113,6 @@ public class ItemPotionFlask extends Item implements IMeshProvider { tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.potion.uses", stack.getMaxDamage() - stack.getItemDamage())); } -// @Override -// @SideOnly(Side.CLIENT) -// public void getSubItems(Item itemIn, CreativeTabs tab, List subItems) -// { -// for (PotionType potiontype : PotionType.REGISTRY) -// { -// subItems.add(PotionUtils.addPotionToItemStack(new ItemStack(itemIn), potiontype)); -// } -// } - @SideOnly(Side.CLIENT) @Override From 22e8290921c7cb375367436877ffd5e663ceb88a Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 26 Jun 2018 17:09:18 -0700 Subject: [PATCH 307/595] Teleposition Sigil should make sure a Teleposer is the destination (#1328) --- .../item/sigil/ItemSigilTeleposition.java | 114 ++++++++++++++---- 1 file changed, 90 insertions(+), 24 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 4a9566da..10e44dab 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.ISigil; import WayofTime.bloodmagic.teleport.TeleportQueue; import WayofTime.bloodmagic.util.helper.NBTHelper; @@ -12,18 +12,23 @@ import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; 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; public class ItemSigilTeleposition extends ItemSigilBase { + public ItemSigilTeleposition() { super("teleposition"); } @@ -33,14 +38,11 @@ public class ItemSigilTeleposition extends ItemSigilBase { public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { super.addInformation(stack, world, tooltip, flag); - if (!stack.hasTagCompound()) - return; - NBTTagCompound tag = stack.getTagCompound(); - - if (tag != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) { - tooltip.add(" "); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", getValue(tag, Constants.NBT.X_COORD), getValue(tag, Constants.NBT.Y_COORD), getValue(tag, Constants.NBT.Z_COORD))); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", getValue(tag, Constants.NBT.DIMENSION_ID))); + 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)); } } @@ -52,15 +54,23 @@ public class ItemSigilTeleposition extends ItemSigilBase { if (PlayerHelper.isFakePlayer(player)) return ActionResult.newResult(EnumActionResult.FAIL, stack); - if (!world.isRemote && NBTHelper.checkNBT(stack) != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) { - BlockPos blockPos = new BlockPos(getValue(stack.getTagCompound(), Constants.NBT.X_COORD), getValue(stack.getTagCompound(), Constants.NBT.Y_COORD), getValue(stack.getTagCompound(), Constants.NBT.Z_COORD)).up(); - if (world.provider.getDimension() == getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID)) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(blockPos, player, getBinding(stack).getOwnerId(), true)); + 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(); + if (world.provider.getDimension() == location.dim) { + TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(blockPos, player, binding.getOwnerId(), true)); + } + // FIXME - Fix cross-dimension teleports causing major desync +// } else { +// TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, getOwnerUUID(stack), world, getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID), true)); +// } + } } - // FIXME - Fix cross-dimension teleports causing major desync -// } else { -// TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, getOwnerUUID(stack), world, getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID), true)); -// } } return super.onItemRightClick(world, player, hand); } @@ -75,18 +85,74 @@ public class ItemSigilTeleposition extends ItemSigilBase { if (!world.isRemote && player.isSneaking() && NBTHelper.checkNBT(stack) != null) { if (world.getTileEntity(pos) != null && world.getTileEntity(pos) instanceof TileTeleposer) { - stack.getTagCompound().setInteger(Constants.NBT.DIMENSION_ID, world.provider.getDimension()); - stack.getTagCompound().setInteger(Constants.NBT.X_COORD, pos.getX()); - stack.getTagCompound().setInteger(Constants.NBT.Y_COORD, pos.getY()); - stack.getTagCompound().setInteger(Constants.NBT.Z_COORD, pos.getZ()); - + TeleportLocation teleportLocation = new TeleportLocation(world.provider.getDimension(), pos); + updateLocation(stack, teleportLocation); return EnumActionResult.SUCCESS; } } return EnumActionResult.FAIL; } - public int getValue(NBTTagCompound tag, String key) { - return tag.getInteger(key); + @Nullable + public TeleportLocation getTeleportLocation(ItemStack stack) { + if (!(stack.getItem() instanceof ItemSigilTeleposition)) + return null; + + if (!stack.hasTagCompound()) + return null; + + NBTTagCompound locationTag = stack.getSubCompound("tplocation"); + if (locationTag == null) + return null; + + return TeleportLocation.fromTag(locationTag); + } + + public void updateLocation(ItemStack stack, TeleportLocation location) { + NBTTagCompound tagCompound; + if (!stack.hasTagCompound()) + stack.setTagCompound(tagCompound = new NBTTagCompound()); + else + tagCompound = stack.getTagCompound(); + + tagCompound.setTag("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 NBTTagCompound serializeNBT() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("dim", dim); + tag.setLong("pos", pos.toLong()); + return tag; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) { + this.dim = nbt.getInteger("dim"); + this.pos = BlockPos.fromLong(nbt.getLong("pos")); + } + + public static TeleportLocation fromTag(NBTTagCompound tpTag) { + TeleportLocation location = new TeleportLocation(); + location.deserializeNBT(tpTag); + return location; + } } } From c8e42e32885e40ac17d05c7af35d4299d9e74dbe Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 26 Jun 2018 17:15:45 -0700 Subject: [PATCH 308/595] Fix lava crystal not syphoning LP (#1326) --- .../java/WayofTime/bloodmagic/item/ItemLavaCrystal.java | 2 +- .../WayofTime/bloodmagic/util/helper/NetworkHelper.java | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index cebbe121..3e3c07ba 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -43,7 +43,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide if (binding == null) return -1; - if (NetworkHelper.canSyphonFromContainer(stack, 25)) + if (NetworkHelper.syphonFromContainer(stack, 25)) return 200; else { EntityPlayer player = PlayerHelper.getPlayerFromUUID(binding.getOwnerId()); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index 279498e4..bdc7f096 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -13,7 +13,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.Event; import java.util.UUID; @@ -119,7 +118,7 @@ public class NetworkHelper { * @param toSyphon - Amount of LP to syphon * @return - If the syphon was successful. */ - public static boolean syphonFromContainer(ItemStack stack, int toSyphon) //TODO: Change to a String, int? + public static boolean syphonFromContainer(ItemStack stack, int toSyphon) { if (!(stack.getItem() instanceof IBindable)) return false; @@ -129,10 +128,9 @@ public class NetworkHelper { return false; SoulNetwork network = getSoulNetwork(binding); - SoulNetworkEvent.ItemDrainInContainerEvent event = new SoulNetworkEvent.ItemDrainInContainerEvent(stack, binding.getOwnerId(), toSyphon); - return !(MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) && network.syphon(event.syphon) >= toSyphon; + return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.syphon) >= toSyphon; } /** From 47b88b95b0f395387dc6a5d7f36041a43bb7a6e2 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 28 Jun 2018 18:24:17 -0700 Subject: [PATCH 309/595] Base work for ticket based syphoning To be used for providing a history. This commit breaks any usage of the network events. Heads up @TeamDMan @Arcaratus --- .../bloodmagic/core/data/SoulNetwork.java | 102 ++++++++----- .../bloodmagic/core/data/SoulTicket.java | 33 +++++ .../bloodmagic/event/SoulNetworkEvent.java | 139 ++++++++++-------- .../bloodmagic/util/BooleanResult.java | 24 +++ .../bloodmagic/util/helper/NetworkHelper.java | 9 +- 5 files changed, 203 insertions(+), 104 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java create mode 100644 src/main/java/WayofTime/bloodmagic/util/BooleanResult.java diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index 046c6b61..d0686067 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -1,24 +1,27 @@ package WayofTime.bloodmagic.core.data; -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.event.AddToNetworkEvent; 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.base.Strings; +import com.google.common.collect.EvictingQueue; +import com.google.common.collect.ImmutableList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nullable; +import java.util.List; +import java.util.Queue; import java.util.UUID; public class SoulNetwork implements INBTSerializable { + + private final Queue ticketHistory; private BMWorldSavedData parent; private EntityPlayer cachedPlayer; private UUID playerId; @@ -27,72 +30,93 @@ public class SoulNetwork implements INBTSerializable { private SoulNetwork() { // No-op - For creation via NBT only + ticketHistory = EvictingQueue.create(16); } - public int add(int toAdd, int maximum) { - AddToNetworkEvent event = new AddToNetworkEvent(playerId.toString(), toAdd, maximum); - + public int add(SoulTicket ticket, int maximum) { + SoulNetworkEvent.Fill event = new SoulNetworkEvent.Fill(this, ticket, maximum); if (MinecraftForge.EVENT_BUS.post(event)) return 0; - if (FMLCommonHandler.instance().getMinecraftServerInstance() == null) - return 0; - int currEss = getCurrentEssence(); - if (currEss >= event.maximum) + if (currEss >= event.getMaximum()) return 0; - int newEss = Math.min(event.maximum, currEss + event.addedAmount); - if (event.getResult() != Event.Result.DENY) - setCurrentEssence(newEss); + int newEss = Math.min(event.getMaximum(), currEss + event.getTicket().getAmount()); + setCurrentEssence(newEss); + ticketHistory.add(ticket); return newEss - currEss; } /** - * @deprecated - Please use {@link #add(int, int)} + * @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); } - public int syphon(int syphon) { + 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; + + int syphon = event.getTicket().getAmount(); if (getCurrentEssence() >= syphon) { setCurrentEssence(getCurrentEssence() - syphon); + ticketHistory.add(ticket); return syphon; } return 0; } - public boolean syphonAndDamage(EntityPlayer user, int toSyphon) { - if (user != null) { - if (user.getEntityWorld().isRemote) - return false; + /** + * @deprecated For future proofing, use {@link #syphon(SoulTicket)} instead. + */ + @Deprecated + public int syphon(int amount) { + return syphon(new SoulTicket(amount)); + } - if (!Strings.isNullOrEmpty(playerId.toString())) { - SoulNetworkEvent.ItemDrainNetworkEvent event = new SoulNetworkEvent.ItemDrainNetworkEvent(user, playerId, null, toSyphon); + public BooleanResult syphonAndDamage(EntityPlayer user, SoulTicket ticket) { + if (user.getEntityWorld().isRemote) + return BooleanResult.newResult(false, 0); - if (MinecraftForge.EVENT_BUS.post(event)) - return false; + SoulNetworkEvent.Syphon.User event = new SoulNetworkEvent.Syphon.User(this, ticket, user); - int drainAmount = syphon(event.syphon); + if (MinecraftForge.EVENT_BUS.post(event)) + return BooleanResult.newResult(false, 0); - if (drainAmount <= 0 || event.shouldDamage) - hurtPlayer(user, event.syphon); + int drainAmount = syphon(event.getTicket(), true); - return event.getResult() != Event.Result.DENY; - } + if (drainAmount <= 0 || event.shouldDamage()) + hurtPlayer(user, event.getTicket().getAmount()); - int amount = syphon(toSyphon); - hurtPlayer(user, toSyphon - amount); + ticketHistory.add(ticket); + return BooleanResult.newResult(true, event.getTicket().getAmount()); + } - return true; - } - - return false; + /** + * @deprecated Use {@link #syphonAndDamage(EntityPlayer, SoulTicket)} instead. + */ + @Deprecated + public boolean syphonAndDamage(EntityPlayer user, int amount) { + return syphonAndDamage(user, new SoulTicket(amount)).isSuccess(); } public void causeNausea() { @@ -180,6 +204,10 @@ public class SoulNetwork implements INBTSerializable { return this; } + public List getTicketHistory() { + return ImmutableList.copyOf(ticketHistory); + } + // INBTSerializable @Override diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java new file mode 100644 index 00000000..1f9c4c60 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java @@ -0,0 +1,33 @@ +package WayofTime.bloodmagic.core.data; + +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentString; + +public class SoulTicket { + + private static final ITextComponent EMPTY = new TextComponentString(""); + + private final ITextComponent description; + private final int amount; + + public SoulTicket(ITextComponent description, int amount) { + this.description = description; + this.amount = amount; + } + + public SoulTicket(int amount) { + this(EMPTY, amount); + } + + public boolean isSyphon() { + return amount < 0; + } + + public ITextComponent getDescription() { + return description; + } + + public int getAmount() { + return amount; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java index cb962fdd..560b19a5 100644 --- a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java @@ -1,86 +1,99 @@ package WayofTime.bloodmagic.event; +import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.core.data.SoulTicket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; -import javax.annotation.Nullable; -import java.util.UUID; - -/** - * Base event class for Soul Network related events. - *

        - * {@link #ownerUUID} contains the owner's UUID {@link #syphon} contains the - * amount of LP to be drained - */ public class SoulNetworkEvent extends Event { - public final UUID ownerUUID; - public int syphon; - public SoulNetworkEvent(UUID ownerUUID, int syphon) { - this.ownerUUID = ownerUUID; - this.syphon = syphon; + private final SoulNetwork network; + private SoulTicket ticket; + + public SoulNetworkEvent(SoulNetwork network, SoulTicket ticket) { + this.network = network; + this.ticket = ticket; } - /** - * This event is called when an - * {@link WayofTime.bloodmagic.iface.IBindable} is being drained - * inside of a {@link net.minecraft.tileentity.TileEntity}. - *

        - * If canceled, the drain will not be executed. - */ - @Cancelable - public static class ItemDrainInContainerEvent extends SoulNetworkEvent { - public ItemStack stack; + public SoulNetwork getNetwork() { + return network; + } - public ItemDrainInContainerEvent(ItemStack stack, UUID ownerId, int syphon) { - super(ownerId, syphon); - this.stack = stack; + public SoulTicket getTicket() { + return ticket; + } + + public void setTicket(SoulTicket ticket) { + this.ticket = ticket; + } + + @Cancelable + public static class Syphon extends SoulNetworkEvent { + + private boolean shouldDamage; + + public Syphon(SoulNetwork network, SoulTicket ticket) { + super(network, ticket); } - } - /** - * This event is called when a {@link EntityPlayer} drains the Soul Network - *

        - * If canceled, the drain will not be executed. - */ - @Cancelable - public static class PlayerDrainNetworkEvent extends SoulNetworkEvent { - public final EntityPlayer player; - // If true, will damage regardless of if the network had enough inside it - public boolean shouldDamage; + public boolean shouldDamage() { + return shouldDamage; + } - public PlayerDrainNetworkEvent(EntityPlayer player, UUID ownerId, int drainAmount) { - super(ownerId, drainAmount); - this.shouldDamage = false; - this.player = player; + public void setShouldDamage(boolean shouldDamage) { + this.shouldDamage = shouldDamage; + } + + public static class Item extends Syphon { + + private final ItemStack stack; + + public Item(SoulNetwork network, SoulTicket ticket, ItemStack stack) { + super(network, ticket); + + this.stack = stack; + } + + public ItemStack getStack() { + return stack; + } + } + + public static class User extends Syphon { + + private final EntityPlayer user; + + public User(SoulNetwork network, SoulTicket ticket, EntityPlayer user) { + super(network, ticket); + + this.user = user; + } + + public EntityPlayer getUser() { + return user; + } } } @Cancelable - public static class ItemDrainNetworkEvent extends PlayerDrainNetworkEvent { - @Nullable - public final ItemStack itemStack; - /** - * Amount of damage that would incur if the network could not drain - * properly - */ - public float damageAmount; + public static class Fill extends SoulNetworkEvent { - /** - * Set result to deny the action i.e. damage/drain anyways. Cancelling - * event prevents action without penalties - * - * @param player Player using the item - * @param ownerId Network that the item is tied to - * @param itemStack Item used - * @param drainAmount Original drain amount - change to alter cost - */ - public ItemDrainNetworkEvent(EntityPlayer player, UUID ownerId, @Nullable ItemStack itemStack, int drainAmount) { - super(player, ownerId, drainAmount); - this.itemStack = itemStack; - this.damageAmount = (float) (drainAmount) / 100.0f; + private int maximum; + + public Fill(SoulNetwork network, SoulTicket ticket, int maximum) { + super(network, ticket); + + this.maximum = maximum; + } + + public int getMaximum() { + return maximum; + } + + public void setMaximum(int maximum) { + this.maximum = maximum; } } } diff --git a/src/main/java/WayofTime/bloodmagic/util/BooleanResult.java b/src/main/java/WayofTime/bloodmagic/util/BooleanResult.java new file mode 100644 index 00000000..c4cb571f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/BooleanResult.java @@ -0,0 +1,24 @@ +package WayofTime.bloodmagic.util; + +public class BooleanResult { + + private final boolean result; + private final T value; + + private BooleanResult(boolean result, T value) { + this.result = result; + this.value = value; + } + + public boolean isSuccess() { + return result; + } + + public T getValue() { + return value; + } + + public static BooleanResult newResult(boolean success, T value) { + return new BooleanResult<>(success, value); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index bdc7f096..dbd07fc5 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -1,8 +1,9 @@ package WayofTime.bloodmagic.util.helper; import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IBindable; +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; @@ -97,7 +98,7 @@ public class NetworkHelper { * @param user - User of the item. * @param toSyphon - Amount of LP to syphon * @return - Whether the action should be performed. - * @deprecated Use {@link #getSoulNetwork(EntityPlayer)} and {@link SoulNetwork#syphonAndDamage(EntityPlayer, int)} + * @deprecated Use {@link #getSoulNetwork(EntityPlayer)} and {@link SoulNetwork#syphonAndDamage(EntityPlayer, SoulTicket)} */ @Deprecated public static boolean syphonAndDamage(SoulNetwork soulNetwork, EntityPlayer user, int toSyphon) { @@ -128,9 +129,9 @@ public class NetworkHelper { return false; SoulNetwork network = getSoulNetwork(binding); - SoulNetworkEvent.ItemDrainInContainerEvent event = new SoulNetworkEvent.ItemDrainInContainerEvent(stack, binding.getOwnerId(), toSyphon); + SoulNetworkEvent.Syphon.Item event = new SoulNetworkEvent.Syphon.Item(network, new SoulTicket(toSyphon), stack); - return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.syphon) >= toSyphon; + return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.getTicket(), true) >= toSyphon; } /** From e3d65a9e3a91989ef29eb2dc02121077c5e31bba Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 28 Jun 2018 20:37:53 -0700 Subject: [PATCH 310/595] Rework of HUD element system Allows configuration because that's probably a good thing. The values in the json config are percentages of the screen. --- .../java/WayofTime/bloodmagic/BloodMagic.java | 2 +- .../WayofTime/bloodmagic/client/Sprite.java | 2 + .../client/gui/GuiBloodMagicConfig.java | 63 ++++++ .../client/hud/ConfigEntryEditHUD.java | 39 ++++ .../bloodmagic/client/hud/ElementInfo.java | 39 ++++ .../client/hud/ElementRegistry.java | 148 +++++++++++++ .../bloodmagic/client/hud/Elements.java | 203 ++++++++++-------- .../bloodmagic/client/hud/GuiEditHUD.java | 183 ++++++++++++++++ .../bloodmagic/client/hud/HUDElement.java | 73 ------- .../client/hud/HUDElementCornerTile.java | 95 -------- .../ElementDemonAura.java} | 54 +++-- .../element/ElementDivinedInformation.java | 46 ++++ .../ElementHolding.java} | 43 ++-- .../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/proxy/ClientProxy.java | 2 +- .../util/handler/event/ClientHandler.java | 9 - .../assets/bloodmagic/lang/en_US.lang | 10 +- 21 files changed, 894 insertions(+), 311 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/ConfigEntryEditHUD.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/ElementInfo.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java rename src/main/java/WayofTime/bloodmagic/client/hud/{HUDElementDemonWillAura.java => element/ElementDemonAura.java} (52%) create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java rename src/main/java/WayofTime/bloodmagic/client/hud/{HUDElementHolding.java => element/ElementHolding.java} (60%) create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementSprite.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementTileInformation.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/HUDElement.java diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 630607c9..1374c78c 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -29,7 +29,7 @@ import org.apache.commons.lang3.tuple.Pair; import java.io.File; import java.util.List; -@Mod(modid = BloodMagic.MODID, name = BloodMagic.NAME, version = BloodMagic.VERSION, dependencies = BloodMagic.DEPEND) +@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"; diff --git a/src/main/java/WayofTime/bloodmagic/client/Sprite.java b/src/main/java/WayofTime/bloodmagic/client/Sprite.java index 795286a0..cb92dcd1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/Sprite.java +++ b/src/main/java/WayofTime/bloodmagic/client/Sprite.java @@ -1,5 +1,6 @@ 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; @@ -42,6 +43,7 @@ public class Sprite { } public void draw(int x, int y) { + Minecraft.getMinecraft().renderEngine.bindTexture(textureLocation); float f = 0.00390625F; float f1 = 0.00390625F; Tessellator tessellator = Tessellator.getInstance(); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java new file mode 100644 index 00000000..a13b950c --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java @@ -0,0 +1,63 @@ +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.GuiScreen; +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(GuiScreen 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()); + if (Minecraft.getMinecraft().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 GuiScreen createConfigGui(GuiScreen parentScreen) { + return new GuiBloodMagicConfig(parentScreen); + } + + @Override + public Set runtimeGuiCategories() { + return null; + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/ConfigEntryEditHUD.java b/src/main/java/WayofTime/bloodmagic/client/hud/ConfigEntryEditHUD.java new file mode 100644 index 00000000..d713e3b6 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/ConfigEntryEditHUD.java @@ -0,0 +1,39 @@ +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 new file mode 100644 index 00000000..9544dcdc --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/ElementInfo.java @@ -0,0 +1,39 @@ +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 new file mode 100644 index 00000000..d83cb03c --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java @@ -0,0 +1,148 @@ +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.getMinecraft()); + + for (HUDElement element : HUD_ELEMENTS.values()) { + if (!element.shouldRender(Minecraft.getMinecraft())) + 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 index 6c507d1a..cc11d92c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java @@ -2,100 +2,135 @@ 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 java.util.List; +import javax.vecmath.Vector2f; +import java.awt.Point; +import java.util.function.Consumer; import java.util.function.Function; public class Elements { - public static void createHUDElements() { - new HUDElementHolding(); - new HUDElementDemonWillAura(); - // Blood Altar with Divination Sigil - new HUDElementCornerTile.DivinedView(TileAltar.class, true) { - @Override - protected void addInformation(List>> information) { - // Current tier - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), - altar -> NumeralHelper.toRoman(altar.getTier().toInt()) - )); - // Stored/Capacity - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), - altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) - )); - } - }; - // Blood Altar with Seers Sigil - new HUDElementCornerTile.DivinedView(TileAltar.class, false) { - @Override - protected void addInformation(List>> information) { - // Current tier - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), - altar -> NumeralHelper.toRoman(altar.getTier().toInt()) - )); - // Stored/Capacity - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), - altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) - )); - // Crafting progress/Crafting requirement - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 32, 46, 16, 16), - altar -> { - if (!altar.isActive()) - return "Inactive"; // FIXME localize - int progress = altar.getProgress(); - int totalLiquidRequired = altar.getLiquidRequired() * altar.getStackInSlot(0).getCount(); - return String.format("%d/%d", progress, totalLiquidRequired); - } - )); - // Consumption rate - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 48, 46, 16, 16), - altar -> String.valueOf((int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1))) - )); - // Total charge - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 64, 46, 16, 16), - altar -> String.valueOf(altar.getTotalCharge()) - )); - } - }; - // Incense Altar - new HUDElementCornerTile.DivinedView(TileIncenseAltar.class, true) { - @Override - protected void addInformation(List>> information) { - // Current tranquility - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 80, 46, 16, 16), - incense -> String.valueOf((int) ((100D * (int) (100 * incense.tranquility)) / 100D)) - )); - // Sacrifice bonus - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 96, 46, 16, 16), - incense -> String.valueOf((int) (100 * incense.incenseAddition)) - )); - } - }; - // Inversion Pillar - new HUDElementCornerTile.DivinedView(TileInversionPillar.class, true) { - @Override - protected void addInformation(List>> information) { - // Current inversion - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 112, 46, 16, 16), - pillar -> String.valueOf(((int) (10 * pillar.getCurrentInversion())) / 10D) - )); - } - }; + 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 new file mode 100644 index 00000000..a25a5b6c --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java @@ -0,0 +1,183 @@ +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.GuiButton; +import net.minecraft.client.gui.GuiScreen; +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 GuiScreen { + + private static final int LINE_COLOR = 0x2D2D2D; + + private final GuiScreen parent; + private final Map currentOverrides = Maps.newHashMap(); + private HUDElement dragged; + public boolean changes; + + public GuiEditHUD(GuiScreen 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.getMinecraft()); + 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.getMinecraft()); + 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(GuiButton button) { + switch (button.id) { + case 0: { + Minecraft.getMinecraft().displayGuiScreen(parent); + break; + } + case 1: { + currentOverrides.clear(); + ElementRegistry.resetPos(); + changes = false; + break; + } + case 2: { + ElementRegistry.save(currentOverrides); + Minecraft.getMinecraft().displayGuiScreen(parent); + break; + } + case 3: { + currentOverrides.clear(); + Minecraft.getMinecraft().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/HUDElement.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java deleted file mode 100644 index c9a605a5..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElement.java +++ /dev/null @@ -1,73 +0,0 @@ -package WayofTime.bloodmagic.client.hud; - -import WayofTime.bloodmagic.util.handler.event.ClientHandler; -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.client.event.RenderGameOverlayEvent; - -public abstract class HUDElement { - private final int xOffsetDefault; - private final int yOffsetDefault; - private final RenderGameOverlayEvent.ElementType elementType; - private int xOffset; - private int yOffset; - - public HUDElement(int xOffset, int yOffset, RenderGameOverlayEvent.ElementType elementType) { - this.xOffset = xOffset; - this.xOffsetDefault = xOffset; - this.yOffset = yOffset; - this.yOffsetDefault = yOffset; - this.elementType = elementType; - - ClientHandler.hudElements.add(this); - } - - public abstract void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks); - - public abstract boolean shouldRender(Minecraft minecraft); - - public void onPositionChanged() { - - } - - public void resetToDefault() { - this.xOffset = xOffsetDefault; - this.yOffset = yOffsetDefault; - } - - public 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(); - } - - public int getXOffset() { - return xOffset; - } - - public int getYOffset() { - return yOffset; - } - - public int getXOffsetDefault() { - return xOffsetDefault; - } - - public int getYOffsetDefault() { - return yOffsetDefault; - } - - public RenderGameOverlayEvent.ElementType getElementType() { - return elementType; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java deleted file mode 100644 index fac02451..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java +++ /dev/null @@ -1,95 +0,0 @@ -package WayofTime.bloodmagic.client.hud; - -import WayofTime.bloodmagic.client.Sprite; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; -import com.google.common.collect.Lists; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.RayTraceResult; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import org.apache.commons.lang3.tuple.Pair; - -import java.awt.Color; -import java.util.List; -import java.util.function.Function; - -public abstract class HUDElementCornerTile extends HUDElement { - - protected final List>> information; - - public HUDElementCornerTile() { - super(5, 5, RenderGameOverlayEvent.ElementType.HOTBAR); - - this.information = Lists.newArrayList(); - addInformation(information); - } - - protected abstract void addInformation(List>> information); - - @SuppressWarnings("unchecked") - @Override - public void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) { - T tile = (T) Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); - - int yOffset = 0; - for (Pair> sprite : information) { - Minecraft.getMinecraft().renderEngine.bindTexture(sprite.getLeft().getTextureLocation()); - sprite.getLeft().draw(getXOffset(), getYOffset() + yOffset); - int textY = getYOffset() + yOffset + (sprite.getLeft().getTextureHeight() / 4); - Minecraft.getMinecraft().fontRenderer.drawStringWithShadow(sprite.getRight().apply(tile), getXOffset() + sprite.getLeft().getTextureWidth() + 2, textY, Color.WHITE.getRGB()); - yOffset += sprite.getLeft().getTextureHeight() + 2; - } - } - - public static abstract class DivinedView extends HUDElementCornerTile { - - private final Class tileClass; - private final boolean simple; - - public DivinedView(Class tileClass, boolean simple) { - this.tileClass = tileClass; - this.simple = simple; - } - - @Override - public boolean shouldRender(Minecraft minecraft) { - EntityPlayer player = Minecraft.getMinecraft().player; - ItemStack sigilStack = player.getHeldItem(EnumHand.MAIN_HAND); - boolean flag = false; - if (simple) { - if (sigilStack.getItem() instanceof ItemSigilDivination) - flag = true; - - if (!flag) { - sigilStack = player.getHeldItem(EnumHand.OFF_HAND); - if (sigilStack.getItem() instanceof ItemSigilDivination) - flag = true; - } - } else { - if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) - flag = true; - - if (!flag) { - sigilStack = player.getHeldItem(EnumHand.OFF_HAND); - if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) - flag = true; - } - } - - RayTraceResult trace = Minecraft.getMinecraft().objectMouseOver; - if (trace == null || trace.typeOfHit != RayTraceResult.Type.BLOCK) - return false; - - TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(trace.getBlockPos()); - if (tile == null || !tileClass.isAssignableFrom(tile.getClass())) - flag = false; - - return flag; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java similarity index 52% rename from src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java rename to src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java index 20003b61..29c7a889 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java @@ -1,51 +1,50 @@ -package WayofTime.bloodmagic.client.hud; +package WayofTime.bloodmagic.client.hud.element; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.soul.EnumDemonWillType; 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.EntityPlayer; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import java.util.ArrayList; import java.util.List; -public class HUDElementDemonWillAura extends HUDElement { - protected List barOrder = new ArrayList<>(); +public class ElementDemonAura extends HUDElement { - public HUDElementDemonWillAura() { - super(5, 5, RenderGameOverlayEvent.ElementType.HOTBAR); + private static final ResourceLocation BAR_LOCATION = new ResourceLocation(BloodMagic.MODID, "textures/hud/bars.png"); - barOrder.add(EnumDemonWillType.DEFAULT); - barOrder.add(EnumDemonWillType.CORROSIVE); - barOrder.add(EnumDemonWillType.STEADFAST); - barOrder.add(EnumDemonWillType.DESTRUCTIVE); - barOrder.add(EnumDemonWillType.VENGEFUL); + private final List orderedTypes = Lists.newArrayList( + EnumDemonWillType.DEFAULT, + EnumDemonWillType.CORROSIVE, + EnumDemonWillType.STEADFAST, + EnumDemonWillType.DESTRUCTIVE, + EnumDemonWillType.VENGEFUL + ); + + public ElementDemonAura() { + super(80, 46); } @Override - public void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) { + public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { + Minecraft minecraft = Minecraft.getMinecraft(); EntityPlayer player = minecraft.player; - if (!Utils.canPlayerSeeDemonWill(player)) { - return; - } - - minecraft.getTextureManager().bindTexture(new ResourceLocation(BloodMagic.MODID, "textures/hud/bars.png")); + minecraft.getTextureManager().bindTexture(BAR_LOCATION); GlStateManager.color(1.0F, 1.0F, 1.0F); - this.drawTexturedModalRect(getXOffset(), getYOffset(), 0, 105 * 2, 80, 46); + this.drawTexturedModalRect(drawX, drawY, 0, 210, 80, 46); double maxAmount = Utils.getDemonWillResolution(player); int i = 0; - for (EnumDemonWillType type : barOrder) { + for (EnumDemonWillType type : orderedTypes) { i++; GlStateManager.color(1.0F, 1.0F, 1.0F); - minecraft.getTextureManager().bindTexture(new ResourceLocation(BloodMagic.MODID, "textures/hud/bars.png")); + minecraft.getTextureManager().bindTexture(BAR_LOCATION); int textureXOffset = (i > 3) ? (i - 3) : (3 - i); int maxBarSize = 30 - 2 * textureXOffset; @@ -54,8 +53,8 @@ public class HUDElementDemonWillAura extends HUDElement { double width = maxBarSize * ratio * 2; double height = 2; - double x = getXOffset() + 2 * textureXOffset + 10; - double y = getYOffset() + 4 * i + 10; + double x = drawX + 2 * textureXOffset + 10; + double y = drawY + 4 * i + 10; double textureX = 2 * textureXOffset + 2 * 42; double textureY = 4 * i + 220; @@ -64,10 +63,9 @@ public class HUDElementDemonWillAura extends HUDElement { if (player.isSneaking()) { GlStateManager.pushMatrix(); - String value = "" + (int) amount; - GlStateManager.translate(x - 2 * textureXOffset - value.length() * 0 + 70, (y - 1), 0); + GlStateManager.translate(x - 2 * textureXOffset + 70, (y - 1), 0); GlStateManager.scale(0.5, 0.5, 1); - minecraft.fontRenderer.drawStringWithShadow("" + (int) amount, 0, 2, 0xffffff); + minecraft.fontRenderer.drawStringWithShadow(String.valueOf((int) amount), 0, 2, 0xffffff); GlStateManager.popMatrix(); } } @@ -75,6 +73,6 @@ public class HUDElementDemonWillAura extends HUDElement { @Override public boolean shouldRender(Minecraft minecraft) { - return true; + return Utils.canPlayerSeeDemonWill(Minecraft.getMinecraft().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 new file mode 100644 index 00000000..c8244775 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java @@ -0,0 +1,46 @@ +package WayofTime.bloodmagic.client.hud.element; + +import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumHand; + +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) { + EntityPlayer player = Minecraft.getMinecraft().player; + ItemStack sigilStack = player.getHeldItem(EnumHand.MAIN_HAND); + boolean flag = false; + if (simple) { + if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION) + flag = true; + + if (!flag) { + sigilStack = player.getHeldItem(EnumHand.OFF_HAND); + if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION) + flag = true; + } + } else { + if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) + flag = true; + + if (!flag) { + sigilStack = player.getHeldItem(EnumHand.OFF_HAND); + if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) + flag = true; + } + } + + return super.shouldRender(minecraft) && flag; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java similarity index 60% rename from src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java rename to src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java index 5524e074..d2656658 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java @@ -1,28 +1,34 @@ -package WayofTime.bloodmagic.client.hud; +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.Gui; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.RenderGameOverlayEvent; import java.util.List; -public class HUDElementHolding extends HUDElement { +public class ElementHolding extends HUDElement { - public HUDElementHolding() { - super(0, 0, RenderGameOverlayEvent.ElementType.HOTBAR); + 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 render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) { + 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.getMinecraft(); ItemStack sigilHolding = minecraft.player.getHeldItemMainhand(); // Check mainhand for Sigil of Holding if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) @@ -31,27 +37,28 @@ public class HUDElementHolding extends HUDElement { if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) return; - Gui ingameGui = minecraft.ingameGUI; - - minecraft.getTextureManager().bindTexture(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png")); - GlStateManager.color(1.0F, 1.0F, 1.0F); - ingameGui.drawTexturedModalRect(resolution.getScaledWidth() / 2 + 100 + getXOffset(), resolution.getScaledHeight() - 22 + getYOffset(), 0, 0, 102, 22); int currentSlot = ItemSigilHolding.getCurrentItemOrdinal(sigilHolding); - ingameGui.drawTexturedModalRect(resolution.getScaledWidth() / 2 + 99 + (currentSlot * 20) + getXOffset(), resolution.getScaledHeight() - 23 + getYOffset(), 0, 22, 24, 24); + SELECTED_OVERLAY.draw(drawX - 1 + (currentSlot * 20), drawY - 1); RenderHelper.enableGUIStandardItemLighting(); - List holdingInv = ItemSigilHolding.getInternalInventory(sigilHolding); + List inventory = ItemSigilHolding.getInternalInventory(sigilHolding); int xOffset = 0; - for (ItemStack sigil : holdingInv) { - renderHotbarItem(resolution.getScaledWidth() / 2 + 103 + xOffset + getXOffset(), resolution.getScaledHeight() - 18 + getYOffset(), partialTicks, minecraft.player, sigil); + for (ItemStack stack : inventory) { + renderHotbarItem(drawX + 3 + xOffset, drawY - 4, partialTicks, minecraft.player, stack); xOffset += 20; } - - RenderHelper.disableStandardItemLighting(); } @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; } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java new file mode 100644 index 00000000..5f783e55 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java @@ -0,0 +1,23 @@ +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.getMinecraft().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 new file mode 100644 index 00000000..e574ffef --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementSprite.java @@ -0,0 +1,20 @@ +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 new file mode 100644 index 00000000..419ebe25 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java @@ -0,0 +1,36 @@ +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.getMinecraft().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.getMinecraft().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.getMinecraft().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 new file mode 100644 index 00000000..f8092cf6 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementTileInformation.java @@ -0,0 +1,57 @@ +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.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); + + int yOffset = 0; + for (Pair> sprite : information) { + sprite.getLeft().draw(drawX, drawY + yOffset); + int textY = drawY + yOffset + (sprite.getLeft().getTextureHeight() / 4); + Minecraft.getMinecraft().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.getMinecraft().objectMouseOver; + if (trace == null || trace.typeOfHit != RayTraceResult.Type.BLOCK) + return false; + + TileEntity tile = Minecraft.getMinecraft().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 new file mode 100644 index 00000000..10eed1cd --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/HUDElement.java @@ -0,0 +1,58 @@ +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/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 87256a18..f8dd774e 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -132,7 +132,7 @@ public class ClientProxy extends CommonProxy @Override public void postInit() { - Elements.createHUDElements(); + Elements.registerElements(); } private void addElytraLayer() diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index ebc027cd..15575efb 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -7,7 +7,6 @@ import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.ritual.RitualRegistry; import WayofTime.bloodmagic.ritual.Ritual; import WayofTime.bloodmagic.ritual.RitualComponent; -import WayofTime.bloodmagic.client.hud.HUDElement; import WayofTime.bloodmagic.client.key.KeyBindings; import WayofTime.bloodmagic.client.render.block.RenderFakeBlocks; import WayofTime.bloodmagic.core.RegistrarBloodMagic; @@ -57,7 +56,6 @@ import java.util.*; 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 final List hudElements = new ArrayList<>(); public static TextureAtlasSprite ritualStoneBlank; public static TextureAtlasSprite ritualStoneWater; public static TextureAtlasSprite ritualStoneFire; @@ -175,13 +173,6 @@ public class ClientHandler { keyBinding.handleKeybind(); } - @SubscribeEvent - public static void onHudRender(RenderGameOverlayEvent.Pre event) { - for (HUDElement element : hudElements) - if (element.getElementType() == event.getType() && element.shouldRender(minecraft)) - element.render(minecraft, event.getResolution(), event.getPartialTicks()); - } - // Stolen from Chisel @SubscribeEvent public static void onModelBake(ModelBakeEvent event) { diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index b4b2e0b5..e9227fde 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -374,6 +374,9 @@ 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- @@ -828,8 +831,6 @@ commands.bind.remove.success=Unbinding successful commands.orb.usage=/bloodmagic orb [set|get] player [tier] commands.orb.help=Used to set or get the Player's max Blood Orb tier. -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 @@ -851,6 +852,11 @@ commands.soulnetwork.create.success=Successfully created %s's Soul Network (Orb # 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 From 42c69eb5571b1b7c0f8e222bcee87f4b41c32257 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 28 Jun 2018 21:56:25 -0700 Subject: [PATCH 311/595] Rework of ritual registration Moves to annotation based registration. Configs are handled for automatically --- .../java/WayofTime/bloodmagic/BloodMagic.java | 14 +- .../WayofTime/bloodmagic/ConfigHandler.java | 47 +----- .../block/BlockRitualController.java | 29 ++-- .../client/gui/GuiBloodMagicConfig.java | 1 + .../DataProviderRitualController.java | 9 +- .../bloodmagic/item/ItemRitualDiviner.java | 100 +++--------- .../bloodmagic/registry/ModRituals.java | 138 +--------------- .../WayofTime/bloodmagic/ritual/Ritual.java | 3 +- .../bloodmagic/ritual/RitualManager.java | 148 ++++++++++++++++++ .../bloodmagic/ritual/RitualRegister.java | 49 ++++++ .../bloodmagic/ritual/RitualRegistry.java | 124 --------------- .../ritual/imperfect/ImperfectRitual.java | 4 +- .../imperfect/ImperfectRitualRegistry.java | 99 ------------ .../ritual/types/RitualAltarBuilder.java | 6 +- .../ritual/types/RitualAnimalGrowth.java | 1 + .../ritual/types/RitualArmourEvolve.java | 1 + .../ritual/types/RitualCobblestone.java | 1 + .../ritual/types/RitualContainment.java | 1 + .../ritual/types/RitualCrushing.java | 1 + .../ritual/types/RitualCrystalHarvest.java | 1 + .../ritual/types/RitualCrystalSplit.java | 6 +- .../ritual/types/RitualEllipsoid.java | 7 +- .../ritual/types/RitualExpulsion.java | 1 + .../ritual/types/RitualFeatheredKnife.java | 1 + .../ritual/types/RitualFelling.java | 1 + .../ritual/types/RitualForsakenSoul.java | 1 + .../ritual/types/RitualFullStomach.java | 1 + .../ritual/types/RitualGreenGrove.java | 1 + .../ritual/types/RitualHarvest.java | 1 + .../ritual/types/RitualInterdiction.java | 1 + .../ritual/types/RitualJumping.java | 1 + .../bloodmagic/ritual/types/RitualLava.java | 1 + .../types/RitualLivingArmourDowngrade.java | 1 + .../bloodmagic/ritual/types/RitualMeteor.java | 1 + .../bloodmagic/ritual/types/RitualPlacer.java | 1 + .../bloodmagic/ritual/types/RitualPortal.java | 6 +- .../bloodmagic/ritual/types/RitualPump.java | 1 + .../ritual/types/RitualRegeneration.java | 1 + .../bloodmagic/ritual/types/RitualSpeed.java | 1 + .../ritual/types/RitualSuppression.java | 1 + .../ritual/types/RitualUpgradeRemove.java | 1 + .../bloodmagic/ritual/types/RitualWater.java | 1 + .../ritual/types/RitualWellOfSuffering.java | 1 + .../bloodmagic/ritual/types/RitualZephyr.java | 1 + .../types/imperfect/ImperfectRitualDay.java | 1 + .../types/imperfect/ImperfectRitualNight.java | 2 + .../types/imperfect/ImperfectRitualRain.java | 2 + .../imperfect/ImperfectRitualResistance.java | 2 + .../imperfect/ImperfectRitualZombie.java | 2 + .../tile/TileImperfectRitualStone.java | 8 +- .../tile/TileMasterRitualStone.java | 11 +- .../util/handler/event/ClientHandler.java | 3 +- .../bloodmagic/util/helper/RitualHelper.java | 40 ++--- .../assets/bloodmagic/lang/en_US.lang | 2 +- 54 files changed, 321 insertions(+), 569 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/RitualRegister.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRegistry.java diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 1374c78c..c132d776 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic; import WayofTime.bloodmagic.api.BloodMagicPlugin; import WayofTime.bloodmagic.api.IBloodMagicPlugin; import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.ritual.RitualRegistry; +import WayofTime.bloodmagic.ritual.RitualManager; import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; @@ -19,7 +19,9 @@ import com.google.common.collect.Lists; import net.minecraft.creativetab.CreativeTabs; 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.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.*; @@ -37,6 +39,7 @@ public class BloodMagic { 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 CreativeTabs TAB_BM = new CreativeTabs(MODID + ".creativeTab") { @Override public ItemStack getTabIconItem() { @@ -75,6 +78,7 @@ public class BloodMagic { ModTranquilityHandlers.init(); ModDungeons.init(); + RITUAL_MANAGER.discover(event.getAsmData()); proxy.preInit(); } @@ -86,8 +90,7 @@ public class BloodMagic { PluginUtil.handlePluginStep(PluginUtil.RegistrationStep.PLUGIN_REGISTER); ModRecipes.init(); - ModRituals.initRituals(); - ModRituals.initImperfectRituals(); + ModRituals.initHarvestHandlers(); MeteorConfigHandler.init(new File(configDir, "meteors")); ModArmourTrackers.init(); NetworkRegistry.INSTANCE.registerGuiHandler(BloodMagic.instance, new GuiHandler()); @@ -103,11 +106,6 @@ public class BloodMagic { proxy.postInit(); } - @Mod.EventHandler - public void loadComplete(FMLLoadCompleteEvent event) { - RitualRegistry.orderLookupList(); - } - @Mod.EventHandler public void modMapping(FMLModIdMappingEvent event) { diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index a16e13bc..4bed50be 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -18,8 +18,6 @@ public class ConfigHandler public static ConfigBlacklist blacklist = new ConfigBlacklist(); @Config.Comment({ "Value modifiers for various features" }) public static ConfigValues values = new ConfigValues(); - @Config.Comment({ "Toggles for all rituals" }) - public static ConfigRituals rituals = new ConfigRituals(); @Config.Comment({ "Settings that only pertain to the client" }) public static ConfigClient client = new ConfigClient(); @Config.Comment({ "Compatibility settings" }) @@ -31,6 +29,7 @@ public class ConfigHandler 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 } } @@ -69,50 +68,6 @@ public class ConfigHandler public boolean shouldResyncMeteors = true; } - public static class ConfigRituals - { - public boolean ritualAnimalGrowth = true; - public boolean ritualContainment = true; - public boolean ritualCrushing = true; - public boolean ritualExpulsion = true; - public boolean ritualFeatheredKnife = true; - public boolean ritualFullStomach = true; - public boolean ritualGreenGrove = true; - public boolean ritualHarvest = true; - public boolean ritualInterdiction = true; - public boolean ritualJumping = true; - public boolean ritualLava = true; - public boolean ritualMagnetic = true; - public boolean ritualRegeneration = true; - public boolean ritualSpeed = true; - public boolean ritualSuppression = true; - public boolean ritualWater = true; - public boolean ritualWellOfSuffering = true; - public boolean ritualZephyr = true; - public boolean ritualUpgradeRemove = true; - public boolean ritualArmourEvolve = true; - public boolean ritualForsakenSoul = true; - public boolean ritualCrystalHarvest = true; - public boolean ritualPlacer = true; - public boolean ritualFelling = true; - public boolean ritualPump = true; - public boolean ritualAltarBuilder = true; - public boolean ritualPortal = true; - public boolean ritualMeteor = true; - public boolean ritualDowngrade = true; - public boolean ritualEllipsoid = true; - public boolean ritualCrystalSplit = true; - public ConfigImperfectRituals imperfect = new ConfigImperfectRituals(); - } - - public static class ConfigImperfectRituals - { - public boolean imperfectRitualNight = true; - public boolean imperfectRitualRain = true; - public boolean imperfectRitualResistance = true; - public boolean imperfectRitualZombie = 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." }) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index e1c71e8f..d08eb08c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -4,8 +4,6 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.event.RitualEvent; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; -import WayofTime.bloodmagic.ritual.RitualRegistry; import WayofTime.bloodmagic.ritual.Ritual; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.util.helper.RitualHelper; @@ -56,13 +54,22 @@ public class BlockRitualController extends BlockEnum imple return false; String key = RitualHelper.getValidRitual(world, pos); - EnumFacing direction = RitualHelper.getDirectionOfRitual(world, pos, key); - // TODO: Give a message stating that this ritual is not a valid ritual. - if (!key.isEmpty() && direction != null && RitualHelper.checkValidRitual(world, pos, key, direction)) { - if (((TileMasterRitualStone) tile).activateRitual(heldItem, player, RitualRegistry.getRitualForId(key))) { - ((TileMasterRitualStone) tile).setDirection(direction); - if (state.getValue(getProperty()) == EnumRitualController.INVERTED) - ((TileMasterRitualStone) tile).setInverted(true); + if (!key.isEmpty()) { + Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(key); + if (ritual != null) { + EnumFacing 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 TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); + } + } else { + player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); } } else { player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); @@ -70,7 +77,7 @@ public class BlockRitualController extends BlockEnum imple } } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) { IBlockState ritualBlock = world.getBlockState(pos.up()); - ImperfectRitual ritual = ImperfectRitualRegistry.getRitualForBlock(ritualBlock); + ImperfectRitual ritual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(ritualBlock); if (ritual == null) return false; @@ -120,7 +127,7 @@ public class BlockRitualController extends BlockEnum imple else return new ResourceLocation("bloodmagic", "ritual_" + mrs.getCurrentRitual().getName()); } else if (state.getValue(getProperty()).equals(EnumRitualController.IMPERFECT)) { - ImperfectRitual imperfectRitual = ImperfectRitualRegistry.getRitualForBlock(world.getBlockState(pos.up())); + ImperfectRitual imperfectRitual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(world.getBlockState(pos.up())); if (imperfectRitual != null) return new ResourceLocation("bloodmagic", "ritual_" + imperfectRitual.getName()); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java index a13b950c..f96654ca 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java @@ -26,6 +26,7 @@ public class GuiBloodMagicConfig extends GuiConfig { List elements = Lists.newArrayList(); elements.addAll(ConfigElement.from(ConfigHandler.class).getChildElements()); + elements.add(new ConfigElement(BloodMagic.RITUAL_MANAGER.getConfig().getCategory("rituals"))); if (Minecraft.getMinecraft().world != null) elements.add(new DummyElementEditHUD(BloodMagic.NAME, "config." + BloodMagic.MODID + ".edit_hud")); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index 9b8c8c12..cadada2e 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -1,8 +1,7 @@ package WayofTime.bloodmagic.compat.waila.provider; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; -import WayofTime.bloodmagic.ritual.RitualRegistry; import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.tile.TileMasterRitualStone; @@ -64,15 +63,15 @@ public class DataProviderRitualController implements IWailaDataProvider { tag.setBoolean("active", mrs.isActive()); if (mrs.getOwner() != null) tag.setString("owner", PlayerHelper.getUsernameFromUUID(mrs.getOwner())); - tag.setBoolean("enabled", RitualRegistry.ritualEnabled(mrs.getCurrentRitual())); + tag.setBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(mrs.getCurrentRitual()), false)); } } else { tag.setBoolean("master", false); - ImperfectRitual ritual = ImperfectRitualRegistry.getRitualForBlock(world.getBlockState(pos.up())); + ImperfectRitual ritual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(world.getBlockState(pos.up())); if (ritual != null) { tag.setString("ritual", ritual.getUnlocalizedName()); - tag.setBoolean("enabled", ImperfectRitualRegistry.ritualEnabled(ritual)); + tag.setBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(ritual), false)); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index e55a482d..6d026756 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -6,10 +6,8 @@ import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.ritual.EnumRuneType; import WayofTime.bloodmagic.ritual.Ritual; import WayofTime.bloodmagic.ritual.RitualComponent; -import WayofTime.bloodmagic.ritual.RitualRegistry; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.handler.event.ClientHandler; @@ -40,6 +38,7 @@ 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 { @@ -63,7 +62,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { if (Strings.isNullOrEmpty(getCurrentRitual(stack))) return displayName; - Ritual ritual = RitualRegistry.getRitualForId(getCurrentRitual(stack)); + Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(getCurrentRitual(stack)); if (ritual == null) return displayName; @@ -114,7 +113,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileMasterRitualStone) { - Ritual ritual = RitualRegistry.getRitualForId(this.getCurrentRitual(stack)); + Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(this.getCurrentRitual(stack)); if (ritual != null) { EnumFacing direction = getDirection(stack); List components = Lists.newArrayList(); @@ -161,7 +160,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileMasterRitualStone) { - Ritual ritual = RitualRegistry.getRitualForId(this.getCurrentRitual(itemStack)); + Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(this.getCurrentRitual(itemStack)); TileMasterRitualStone masterRitualStone = (TileMasterRitualStone) tile; if (ritual != null) { @@ -207,9 +206,9 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { if (!stack.hasTagCompound()) return; - Ritual ritual = RitualRegistry.getRitualForId(this.getCurrentRitual(stack)); + Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(this.getCurrentRitual(stack)); if (ritual != null) { - tooltip.add(TextHelper.localize("tooltip.bloodmagic.diviner.currentRitual") + TextHelper.localize(ritual.getUnlocalizedName())); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.diviner.currentRitual", TextHelper.localize(ritual.getUnlocalizedName()))); boolean sneaking = Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); boolean extraInfo = sneaking && Keyboard.isKeyDown(Keyboard.KEY_M); @@ -303,7 +302,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { if (player.isSneaking()) { if (!world.isRemote) { - cycleRitual(stack, player); + cycleRitual(stack, player, false); } return new ActionResult<>(EnumActionResult.SUCCESS, stack); @@ -314,7 +313,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { @Override public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { - if (entityLiving instanceof EntityPlayer) { + if (!entityLiving.world.isRemote && entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entityLiving; RayTraceResult ray = this.rayTrace(player.getEntityWorld(), player, false); @@ -324,7 +323,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { if (!player.isSwingInProgress) { if (player.isSneaking()) { - cycleRitualBackwards(stack, player); + cycleRitual(stack, player, true); } else { cycleDirection(stack, player); } @@ -396,83 +395,36 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } /** - * Cycles the selected ritual to the next available ritual that is enabled. - * - * @param stack - The ItemStack of the ritual diviner - * @param player - The player using the ritual diviner + * Cycles the ritual forward or backward */ - public void cycleRitual(ItemStack stack, EntityPlayer player) { + public void cycleRitual(ItemStack stack, EntityPlayer player, boolean reverse) { String key = getCurrentRitual(stack); - List idList = RitualRegistry.getOrderedIds(); + List rituals = BloodMagic.RITUAL_MANAGER.getSortedRituals(); + if (reverse) + Collections.reverse(rituals = Lists.newArrayList(rituals)); + String firstId = ""; boolean foundId = false; boolean foundFirst = false; - for (String str : idList) { - Ritual ritual = RitualRegistry.getRitualForId(str); + for (Ritual ritual : rituals) { + String id = BloodMagic.RITUAL_MANAGER.getId(ritual); - if (!RitualRegistry.ritualEnabled(ritual) || !canDivinerPerformRitual(stack, ritual)) { + if (!BloodMagic.RITUAL_MANAGER.enabled(id, false) || !canDivinerPerformRitual(stack, ritual)) { continue; } if (!foundFirst) { - firstId = str; + firstId = id; foundFirst = true; } if (foundId) { - setCurrentRitual(stack, str); - notifyRitualChange(str, player); + setCurrentRitual(stack, id); + notifyRitualChange(id, player); return; - } else { - if (str.equals(key)) { - foundId = true; - continue; - } - } - } - - if (foundFirst) { - setCurrentRitual(stack, firstId); - notifyRitualChange(firstId, player); - } - } - - /** - * Does the same as cycleRitual but instead cycles backwards. - * - * @param stack - * @param player - */ - public void cycleRitualBackwards(ItemStack stack, EntityPlayer player) { - String key = getCurrentRitual(stack); - List idList = RitualRegistry.getOrderedIds(); - String firstId = ""; - boolean foundId = false; - boolean foundFirst = false; - - for (int i = idList.size() - 1; i >= 0; i--) { - String str = idList.get(i); - Ritual ritual = RitualRegistry.getRitualForId(str); - - if (!RitualRegistry.ritualEnabled(ritual) || !canDivinerPerformRitual(stack, ritual)) { - continue; - } - - if (!foundFirst) { - firstId = str; - foundFirst = true; - } - - if (foundId) { - setCurrentRitual(stack, str); - notifyRitualChange(str, player); - return; - } else { - if (str.equals(key)) { - foundId = true; - continue; - } + } else if (id.equals(key)) { + foundId = true; } } @@ -499,7 +451,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } public void notifyRitualChange(String key, EntityPlayer player) { - Ritual ritual = RitualRegistry.getRitualForId(key); + Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(key); if (ritual != null) { player.sendStatusMessage(new TextComponentTranslation(ritual.getUnlocalizedName()), true); } @@ -512,7 +464,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { NBTTagCompound tag = stack.getTagCompound(); - tag.setString(Constants.NBT.CURRENT_RITUAL, key); + tag.setString("current_ritual", key); } public String getCurrentRitual(ItemStack stack) { @@ -521,7 +473,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } NBTTagCompound tag = stack.getTagCompound(); - return tag.getString(Constants.NBT.CURRENT_RITUAL); + return tag.getString("current_ritual"); } public boolean canPlaceRitualStone(EnumRuneType rune, ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index c3da05f3..f33bbf22 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -1,150 +1,14 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.ritual.harvest.HarvestRegistry; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; -import WayofTime.bloodmagic.ritual.RitualRegistry; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerPlantable; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerStem; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerTall; -import WayofTime.bloodmagic.ritual.types.imperfect.ImperfectRitualNight; -import WayofTime.bloodmagic.ritual.types.imperfect.ImperfectRitualRain; -import WayofTime.bloodmagic.ritual.types.imperfect.ImperfectRitualResistance; -import WayofTime.bloodmagic.ritual.types.imperfect.ImperfectRitualZombie; -import WayofTime.bloodmagic.ritual.types.*; import net.minecraft.init.Blocks; public class ModRituals { - public static Ritual waterRitual; - public static Ritual lavaRitual; - public static Ritual greenGroveRitual; - public static Ritual jumpRitual; - public static Ritual sufferingRitual; - public static Ritual featheredKnifeRitual; - public static Ritual regenerationRitual; - public static Ritual animalGrowthRitual; - public static Ritual harvestRitual; - public static Ritual magneticRitual; - public static Ritual crushingRitual; - public static Ritual stomachRitual; - public static Ritual interdictionRitual; - public static Ritual containmentRitual; - public static Ritual speedRitual; - public static Ritual suppressionRitual; - public static Ritual expulsionRitual; - public static Ritual zephyrRitual; - public static Ritual upgradeRemoveRitual; - public static Ritual armourEvolveRitual; - public static Ritual forsakenSoulRitual; - public static Ritual crystalHarvestRitual; - - public static Ritual placerRitual; - public static Ritual fellingRitual; - public static Ritual pumpRitual; - public static Ritual altarBuilderRitual; - public static Ritual portalRitual; - - public static Ritual ellipsoidRitual; - public static Ritual crystalSplitRitual; - - public static Ritual meteorRitual; - - public static Ritual downgradeRitual; - - public static ImperfectRitual imperfectNight; - public static ImperfectRitual imperfectRain; - public static ImperfectRitual imperfectResistance; - public static ImperfectRitual imperfectZombie; - - public static void initRituals() - { - waterRitual = new RitualWater(); - RitualRegistry.registerRitual(waterRitual, ConfigHandler.rituals.ritualWater); - lavaRitual = new RitualLava(); - RitualRegistry.registerRitual(lavaRitual, ConfigHandler.rituals.ritualLava); - greenGroveRitual = new RitualGreenGrove(); - RitualRegistry.registerRitual(greenGroveRitual, ConfigHandler.rituals.ritualGreenGrove); - jumpRitual = new RitualJumping(); - RitualRegistry.registerRitual(jumpRitual, ConfigHandler.rituals.ritualJumping); - sufferingRitual = new RitualWellOfSuffering(); - RitualRegistry.registerRitual(sufferingRitual, ConfigHandler.rituals.ritualWellOfSuffering); - featheredKnifeRitual = new RitualFeatheredKnife(); - RitualRegistry.registerRitual(featheredKnifeRitual, ConfigHandler.rituals.ritualFeatheredKnife); - regenerationRitual = new RitualRegeneration(); - RitualRegistry.registerRitual(regenerationRitual, ConfigHandler.rituals.ritualRegeneration); - animalGrowthRitual = new RitualAnimalGrowth(); - RitualRegistry.registerRitual(animalGrowthRitual, ConfigHandler.rituals.ritualAnimalGrowth); - harvestRitual = new RitualHarvest(); - RitualRegistry.registerRitual(harvestRitual, ConfigHandler.rituals.ritualHarvest); - initHarvestHandlers(); - magneticRitual = new RitualMagnetic(); - RitualRegistry.registerRitual(magneticRitual, ConfigHandler.rituals.ritualMagnetic); - crushingRitual = new RitualCrushing(); - RitualRegistry.registerRitual(crushingRitual, ConfigHandler.rituals.ritualCrushing); - stomachRitual = new RitualFullStomach(); - RitualRegistry.registerRitual(stomachRitual, ConfigHandler.rituals.ritualFullStomach); - interdictionRitual = new RitualInterdiction(); - RitualRegistry.registerRitual(interdictionRitual, ConfigHandler.rituals.ritualInterdiction); - containmentRitual = new RitualContainment(); - RitualRegistry.registerRitual(containmentRitual, ConfigHandler.rituals.ritualContainment); - speedRitual = new RitualSpeed(); - RitualRegistry.registerRitual(speedRitual, ConfigHandler.rituals.ritualSpeed); - suppressionRitual = new RitualSuppression(); - RitualRegistry.registerRitual(suppressionRitual, ConfigHandler.rituals.ritualSuppression); - zephyrRitual = new RitualZephyr(); - RitualRegistry.registerRitual(zephyrRitual, ConfigHandler.rituals.ritualZephyr); - expulsionRitual = new RitualExpulsion(); - RitualRegistry.registerRitual(expulsionRitual, ConfigHandler.rituals.ritualExpulsion); - upgradeRemoveRitual = new RitualUpgradeRemove(); - RitualRegistry.registerRitual(upgradeRemoveRitual, ConfigHandler.rituals.ritualUpgradeRemove); - armourEvolveRitual = new RitualArmourEvolve(); - RitualRegistry.registerRitual(armourEvolveRitual, ConfigHandler.rituals.ritualArmourEvolve); - forsakenSoulRitual = new RitualForsakenSoul(); - RitualRegistry.registerRitual(forsakenSoulRitual, ConfigHandler.rituals.ritualForsakenSoul); - crystalHarvestRitual = new RitualCrystalHarvest(); - RitualRegistry.registerRitual(crystalHarvestRitual, ConfigHandler.rituals.ritualCrystalHarvest); - placerRitual = new RitualPlacer(); - RitualRegistry.registerRitual(placerRitual, ConfigHandler.rituals.ritualPlacer); - fellingRitual = new RitualFelling(); - RitualRegistry.registerRitual(fellingRitual, ConfigHandler.rituals.ritualFelling); - pumpRitual = new RitualPump(); - RitualRegistry.registerRitual(pumpRitual, ConfigHandler.rituals.ritualPump); - altarBuilderRitual = new RitualAltarBuilder(); - RitualRegistry.registerRitual(altarBuilderRitual, ConfigHandler.rituals.ritualAltarBuilder); - portalRitual = new RitualPortal(); - RitualRegistry.registerRitual(portalRitual, ConfigHandler.rituals.ritualPortal); - meteorRitual = new RitualMeteor(); - RitualRegistry.registerRitual(meteorRitual, ConfigHandler.rituals.ritualMeteor); - - downgradeRitual = new RitualLivingArmourDowngrade(); - RitualRegistry.registerRitual(downgradeRitual, ConfigHandler.rituals.ritualDowngrade); - - ellipsoidRitual = new RitualEllipsoid(); - RitualRegistry.registerRitual(ellipsoidRitual, ConfigHandler.rituals.ritualEllipsoid); - - crystalSplitRitual = new RitualCrystalSplit(); - RitualRegistry.registerRitual(crystalSplitRitual, ConfigHandler.rituals.ritualCrystalSplit); - - RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.BASIC.getStack(), 250, 0.5); - RitualCrushing.registerCuttingFluid(ItemCuttingFluid.FluidType.EXPLOSIVE.getStack(), 25, 0.05); - } - - public static void initImperfectRituals() - { - imperfectNight = new ImperfectRitualNight(); - ImperfectRitualRegistry.registerRitual(imperfectNight, ConfigHandler.rituals.imperfect.imperfectRitualNight); - imperfectRain = new ImperfectRitualRain(); - ImperfectRitualRegistry.registerRitual(imperfectRain, ConfigHandler.rituals.imperfect.imperfectRitualRain); - imperfectResistance = new ImperfectRitualResistance(); - ImperfectRitualRegistry.registerRitual(imperfectResistance, ConfigHandler.rituals.imperfect.imperfectRitualResistance); - imperfectZombie = new ImperfectRitualZombie(); - ImperfectRitualRegistry.registerRitual(imperfectZombie, ConfigHandler.rituals.imperfect.imperfectRitualZombie); - } - + // TODO Move elsewhere public static void initHarvestHandlers() { HarvestRegistry.registerRangeAmplifier(Blocks.DIAMOND_BLOCK.getDefaultState(), 15); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java index 472fa682..be545f56 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java @@ -18,8 +18,7 @@ import java.util.Map.Entry; import java.util.function.Consumer; /** - * Abstract class for creating new rituals. Rituals need be registered with - * {@link RitualRegistry#registerRitual(Ritual, String)} + * Abstract class for creating new rituals. Register your ritual by annotating it with {@link RitualRegister} */ public abstract class Ritual { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java new file mode 100644 index 00000000..e6e2287b --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java @@ -0,0 +1,148 @@ +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.state.IBlockState; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fml.common.discovery.ASMDataTable; + +import java.util.*; + +public class RitualManager { + + 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(IBlockState 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 new file mode 100644 index 00000000..b077056f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegister.java @@ -0,0 +1,49 @@ +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/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java deleted file mode 100644 index 66039e2b..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegistry.java +++ /dev/null @@ -1,124 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import WayofTime.bloodmagic.util.BMLog; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.Lists; - -import javax.annotation.Nullable; -import java.util.*; - -public class RitualRegistry { - public static final Map enabledRituals = new HashMap<>(); - private static final BiMap registry = HashBiMap.create(); - private static final List lookupList = new ArrayList<>(); - /** - * Ordered list for actions that depend on the order that the rituals were - * registered in - */ - private static final ArrayList orderedIdList = new ArrayList<>(); - - private static boolean locked; - - /** - * The safe way to register a new Ritual. - * - * @param ritual - The ritual to register. - * @param id - The ID for the ritual. Cannot be duplicated. - */ - public static void registerRitual(Ritual ritual, String id, boolean enabled) { - if (locked) { - BMLog.DEFAULT.error("This registry has been locked. Please register your ritual earlier."); - BMLog.DEFAULT.error("If you reflect this, I will hunt you down. - TehNut"); - return; - } - - if (ritual != null) { - if (registry.containsKey(id)) - BMLog.DEFAULT.error("Duplicate ritual id: {}", id); - else { - registry.put(id, ritual); - enabledRituals.put(ritual, enabled); - orderedIdList.add(id); - } - } - } - - public static void registerRitual(Ritual ritual, boolean enabled) { - registerRitual(ritual, ritual.getName(), enabled); - } - - public static void registerRitual(Ritual ritual, String id) { - registerRitual(ritual, id, true); - } - - public static void registerRitual(Ritual ritual) { - registerRitual(ritual, ritual.getName()); - } - - @Nullable - public static Ritual getRitualForId(String id) { - Ritual ritual = registry.get(id); - return ritual != null ? ritual.getNewCopy() : null; - } - - public static String getIdForRitual(Ritual ritual) { - return registry.inverse().get(ritual); - } - - public static boolean isMapEmpty() { - return registry.isEmpty(); - } - - public static int getMapSize() { - return registry.size(); - } - - public static boolean ritualEnabled(Ritual ritual) { - try { - return enabledRituals.get(ritual); - } catch (NullPointerException e) { - BMLog.DEFAULT.error("Invalid Ritual was called"); - return false; - } - } - - public static boolean ritualEnabled(String id) { - return ritualEnabled(getRitualForId(id)); - } - - public static BiMap getRegistry() { - return HashBiMap.create(registry); - } - - public static Map getEnabledMap() { - return new HashMap<>(enabledRituals); - } - - public static ArrayList getIds() { - return new ArrayList<>(lookupList); - } - - public static ArrayList getOrderedIds() { - return orderedIdList; - } - - public static ArrayList getRituals() { - return new ArrayList<>(registry.values()); - } - - public static void orderLookupList() { - locked = true; // Lock registry so no no rituals can be registered - lookupList.clear(); // Make sure it's empty - lookupList.addAll(registry.keySet()); - lookupList.sort((o1, o2) -> { - Ritual ritual1 = registry.get(o1); - Ritual ritual2 = registry.get(o2); - List first = Lists.newArrayList(); - ritual1.gatherComponents(first::add); - List second = Lists.newArrayList(); - ritual2.gatherComponents(second::add); - return first.size() > second.size() ? -1 : 0; // Put earlier if bigger - }); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java index dae1c461..6aa24daa 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java @@ -7,9 +7,7 @@ import net.minecraft.world.World; import java.util.function.Predicate; /** - * Abstract class for creating new imperfect rituals. ImperfectRituals need be - * registered with - * {@link ImperfectRitualRegistry#registerRitual(ImperfectRitual)} + * Abstract class for creating new imperfect rituals. To register, annotate your class with {@link WayofTime.bloodmagic.ritual.RitualRegister.Imperfect} */ public abstract class ImperfectRitual { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRegistry.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRegistry.java deleted file mode 100644 index 2417a24d..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitualRegistry.java +++ /dev/null @@ -1,99 +0,0 @@ -package WayofTime.bloodmagic.ritual.imperfect; - -import WayofTime.bloodmagic.util.BMLog; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import net.minecraft.block.state.IBlockState; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -public class ImperfectRitualRegistry { - public static final Map enabledRituals = new HashMap<>(); - private static final BiMap registry = HashBiMap.create(); - - /** - * The safe way to register a new Ritual. - * - * @param imperfectRitual - The imperfect ritual to register. - * @param id - The ID for the imperfect ritual. Cannot be duplicated. - */ - public static void registerRitual(ImperfectRitual imperfectRitual, String id, boolean enabled) { - if (imperfectRitual != null) { - if (registry.containsKey(id)) - BMLog.DEFAULT.error("Duplicate imperfect ritual id: {}", id); - else { - registry.put(id, imperfectRitual); - enabledRituals.put(imperfectRitual, enabled); - } - } - } - - public static void registerRitual(ImperfectRitual imperfectRitual, String id) { - registerRitual(imperfectRitual, id, true); - } - - public static void registerRitual(ImperfectRitual imperfectRitual, boolean enabled) { - registerRitual(imperfectRitual, imperfectRitual.getName(), enabled); - } - - public static void registerRitual(ImperfectRitual imperfectRitual) { - registerRitual(imperfectRitual, imperfectRitual.getName()); - } - - @Nullable - public static ImperfectRitual getRitualForBlock(IBlockState state) { - for (ImperfectRitual imperfectRitual : getRegistry().values()) - if (imperfectRitual.getBlockRequirement().test(state)) - return imperfectRitual; - - return null; - } - - public static ImperfectRitual getRitualForId(String id) { - return registry.get(id); - } - - public static String getIdForRitual(ImperfectRitual imperfectRitual) { - return registry.inverse().get(imperfectRitual); - } - - public static boolean isMapEmpty() { - return registry.isEmpty(); - } - - public static int getMapSize() { - return registry.size(); - } - - public static boolean ritualEnabled(ImperfectRitual imperfectRitual) { - try { - return enabledRituals.get(imperfectRitual); - } catch (NullPointerException e) { - BMLog.DEFAULT.error("Invalid Imperfect Ritual was called"); - return false; - } - } - - public static boolean ritualEnabled(String id) { - return ritualEnabled(getRitualForId(id)); - } - - public static BiMap getRegistry() { - return HashBiMap.create(registry); - } - - public static BiMap getEnabledMap() { - return HashBiMap.create(enabledRituals); - } - - public static ArrayList getIds() { - return new ArrayList<>(registry.keySet()); - } - - public static ArrayList getRituals() { - return new ArrayList<>(registry.values()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index c1572201..4c7783b4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -1,14 +1,11 @@ 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.ritual.EnumRuneType; -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.RitualComponent; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; @@ -29,6 +26,7 @@ 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.SIX.getAltarComponents()).iterator(); private boolean cycleDone = false; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java index f7724e6a..260447b2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java @@ -21,6 +21,7 @@ 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; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java index 90447806..175069ea 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java @@ -14,6 +14,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java index cf481fa9..ab8516e2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java @@ -12,6 +12,7 @@ import net.minecraft.world.World; import java.util.function.Consumer; +@RitualRegister("cobblestone") public class RitualCobblestone extends Ritual { public static final String COBBLESTONE_RANGE = "cobblestoneRange"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java index 4ad43168..51c8432e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java @@ -9,6 +9,7 @@ import net.minecraft.world.World; import java.util.function.Consumer; +@RitualRegister("containment") public class RitualContainment extends Ritual { public static final String CONTAINMENT_RANGE = "containmentRange"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 01cab915..1ad10719 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -32,6 +32,7 @@ import java.util.Map; import java.util.Map.Entry; 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java index 62d86acc..5f5e9be2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java @@ -10,6 +10,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java index 5930d6d9..a52f5181 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.ritual.types; import java.util.function.Consumer; +import WayofTime.bloodmagic.ritual.*; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -12,13 +13,10 @@ import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.RitualComponent; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.tile.TileDemonCrystal; +@RitualRegister("crystal_split") public class RitualCrystalSplit extends Ritual { public RitualCrystalSplit() diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java index e47a8c74..74bbdaa8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.ritual.types; import java.util.function.Consumer; +import WayofTime.bloodmagic.ritual.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemBlock; @@ -14,12 +15,8 @@ import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.RitualComponent; +@RitualRegister("ellipsoid") public class RitualEllipsoid extends Ritual { public static final String SPHEROID_RANGE = "spheroidRange"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java index 10209075..393645d2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java @@ -25,6 +25,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java index dd347421..ddddf20b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java @@ -26,6 +26,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java index c4b33b27..749ff388 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java @@ -18,6 +18,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java index ee49bbcd..c56ff474 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java @@ -20,6 +20,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java index f0a739ea..0b4153a6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java @@ -15,6 +15,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java index f2aa95ad..fdc69092 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java @@ -26,6 +26,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java index faa582ad..b04ba5b2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java @@ -30,6 +30,7 @@ import java.util.function.Consumer; * {@link HarvestRegistry#registerRangeAmplifier(net.minecraft.block.state.IBlockState, int)} to register a * new amplifier. */ +@RitualRegister("harvest") public class RitualHarvest extends Ritual { public static final String HARVEST_RANGE = "harvestRange"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java index a9eb84b3..861b2f32 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java @@ -9,6 +9,7 @@ import net.minecraft.world.World; import java.util.function.Consumer; +@RitualRegister("interdiction") public class RitualInterdiction extends Ritual { public static final String INTERDICTION_RANGE = "interdictionRange"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java index e34a008d..78c89219 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java @@ -11,6 +11,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index d81a2ace..ae953425 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -28,6 +28,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java index d0f9e4b5..35aa10ba 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java @@ -27,6 +27,7 @@ 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; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java index e8b9c652..0abb6a48 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java @@ -15,6 +15,7 @@ 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; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java index d18f1cb5..c421f794 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java @@ -15,6 +15,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java index fd3b83f4..8ec0b006 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java @@ -1,10 +1,7 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.RitualComponent; +import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.teleport.PortalLocation; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.ritual.portal.LocationsHandler; @@ -20,6 +17,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java index 50667a6a..e7d6b74c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java @@ -22,6 +22,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java index f480edc7..e851b8ad 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java @@ -18,6 +18,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java index cc9390f9..c40fb66a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java @@ -16,6 +16,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java index 8866eee8..5934ab9f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java @@ -11,6 +11,7 @@ import net.minecraft.world.World; import java.util.function.Consumer; +@RitualRegister("suppression") public class RitualSuppression extends Ritual { public static final String SUPPRESSION_RANGE = "suppressionRange"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java index 65120c45..ba9d5a04 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java @@ -21,6 +21,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java index 569998a1..c63b3b6d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java @@ -8,6 +8,7 @@ import net.minecraft.world.World; import java.util.function.Consumer; +@RitualRegister("water") public class RitualWater extends Ritual { public static final String WATER_RANGE = "waterRange"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index 8d07813f..a1c96a08 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -17,6 +17,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java index d21d4e8c..780e5061 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java @@ -13,6 +13,7 @@ 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"; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java index 8c6d4eda..9d2a87ed 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java @@ -6,6 +6,7 @@ import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.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"); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java index 504fe1a0..f5a8746b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java @@ -1,11 +1,13 @@ 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.EntityPlayer; import net.minecraft.init.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"); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java index 58e1ec6c..b7790a1e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java @@ -1,11 +1,13 @@ 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.EntityPlayer; import net.minecraft.init.Blocks; +@RitualRegister.Imperfect("rain") public class ImperfectRitualRain extends ImperfectRitual { public ImperfectRitualRain() { super("rain", s -> s.getBlock() == Blocks.WATER, 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.rain"); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java index 9bb7e0de..b0281f53 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java @@ -1,6 +1,7 @@ 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.EntityPlayer; @@ -8,6 +9,7 @@ import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; import net.minecraft.potion.PotionEffect; +@RitualRegister.Imperfect("resistance") public class ImperfectRitualResistance extends ImperfectRitual { public ImperfectRitualResistance() { super("resistance", s -> s.getBlock() == Blocks.BEDROCK, 5000, "ritual." + BloodMagic.MODID + ".imperfect.resistance"); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java index 4c539eb4..bc8cb7cf 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java @@ -1,6 +1,7 @@ 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.EntityZombie; @@ -9,6 +10,7 @@ import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; import net.minecraft.potion.PotionEffect; +@RitualRegister.Imperfect("zombie") public class ImperfectRitualZombie extends ImperfectRitual { public ImperfectRitualZombie() { super("zombie", s -> s.getBlock() == Blocks.COAL_BLOCK, 5000, "ritual." + BloodMagic.MODID + ".imperfect.zombie"); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java index 7e8b1d12..27b4e876 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitualRegistry; +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.util.helper.NetworkHelper; @@ -9,6 +10,7 @@ import WayofTime.bloodmagic.tile.base.TileBase; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import javax.annotation.Nullable; @@ -17,9 +19,9 @@ public class TileImperfectRitualStone extends TileBase implements IImperfectRitu @Override public boolean performRitual(World world, BlockPos pos, @Nullable ImperfectRitual imperfectRitual, EntityPlayer player) { - if (imperfectRitual != null && ImperfectRitualRegistry.ritualEnabled(imperfectRitual)) { + if (imperfectRitual != null && BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(imperfectRitual), true)) { if (!PlayerHelper.isFakePlayer(player) && !world.isRemote) { - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, imperfectRitual.getActivationCost()); + NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, new SoulTicket(new TextComponentTranslation(imperfectRitual.getUnlocalizedName()), imperfectRitual.getActivationCost())); if (imperfectRitual.onActivate(this, player)) { if (imperfectRitual.isLightShow()) getWorld().addWeatherEffect(new EntityLightningBolt(getWorld(), getPos().getX(), getPos().getY() + 2, getPos().getZ(), true)); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 182b2cf3..68f01766 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.RitualEvent; -import WayofTime.bloodmagic.ritual.RitualRegistry; import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.ritual.Ritual; import WayofTime.bloodmagic.core.data.SoulNetwork; @@ -23,7 +23,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nullable; import java.util.ArrayList; @@ -75,7 +74,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS owner = tag.hasUniqueId("owner") ? tag.getUniqueId("owner") : null; if (owner != null) cachedNetwork = NetworkHelper.getSoulNetwork(owner); - currentRitual = RitualRegistry.getRitualForId(tag.getString(Constants.NBT.CURRENT_RITUAL)); + currentRitual = BloodMagic.RITUAL_MANAGER.getRitual(tag.getString(Constants.NBT.CURRENT_RITUAL)); if (currentRitual != null) { NBTTagCompound ritualTag = tag.getCompoundTag(Constants.NBT.CURRENT_RITUAL_TAG); if (!ritualTag.hasNoTags()) { @@ -96,7 +95,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS @Override public NBTTagCompound serialize(NBTTagCompound tag) { - String ritualId = RitualRegistry.getIdForRitual(getCurrentRitual()); + String ritualId = BloodMagic.RITUAL_MANAGER.getId(getCurrentRitual()); if (owner != null) tag.setUniqueId("owner", owner); tag.setString(Constants.NBT.CURRENT_RITUAL, Strings.isNullOrEmpty(ritualId) ? "" : ritualId); @@ -177,8 +176,8 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS @Override public void performRitual(World world, BlockPos pos) { - if (!world.isRemote && getCurrentRitual() != null && RitualRegistry.ritualEnabled(getCurrentRitual())) { - if (RitualHelper.checkValidRitual(getWorld(), getPos(), RitualRegistry.getIdForRitual(currentRitual), getDirection())) { + if (!world.isRemote && getCurrentRitual() != null && BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(currentRitual), false)) { + if (RitualHelper.checkValidRitual(getWorld(), getPos(), currentRitual, getDirection())) { RitualEvent.RitualRunEvent event = new RitualEvent.RitualRunEvent(this, getOwner(), getCurrentRitual()); if (MinecraftForge.EVENT_BUS.post(event)) diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 15575efb..8f29bfab 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -4,7 +4,6 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.util.BMLog; import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.ritual.RitualRegistry; import WayofTime.bloodmagic.ritual.Ritual; import WayofTime.bloodmagic.ritual.RitualComponent; import WayofTime.bloodmagic.client.key.KeyBindings; @@ -246,7 +245,7 @@ public class ClientHandler { World world = player.getEntityWorld(); ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); EnumFacing direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); - Ritual ritual = RitualRegistry.getRitualForId(ritualDiviner.getCurrentRitual(player.inventory.getCurrentItem())); + Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(ritualDiviner.getCurrentRitual(player.inventory.getCurrentItem())); if (ritual == null) return; diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java index fa6e3963..eedf6f7c 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.ritual.RitualRegistry; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.EnumRuneType; import WayofTime.bloodmagic.ritual.IRitualStone; import WayofTime.bloodmagic.ritual.Ritual; @@ -22,21 +22,7 @@ public class RitualHelper { static Capability RUNE_CAPABILITY = null; public static boolean canCrystalActivate(Ritual ritual, int crystalLevel) { - return ritual.getCrystalLevel() <= crystalLevel && RitualRegistry.ritualEnabled(ritual); - } - - public static String getNextRitualKey(String currentKey) { - int currentIndex = RitualRegistry.getIds().indexOf(currentKey); - int nextIndex = RitualRegistry.getRituals().listIterator(currentIndex).nextIndex(); - - return RitualRegistry.getIds().get(nextIndex); - } - - public static String getPrevRitualKey(String currentKey) { - int currentIndex = RitualRegistry.getIds().indexOf(currentKey); - int previousIndex = RitualRegistry.getIds().listIterator(currentIndex).previousIndex(); - - return RitualRegistry.getIds().get(previousIndex); + return ritual.getCrystalLevel() <= crystalLevel && BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(ritual), false); } /** @@ -48,31 +34,26 @@ public class RitualHelper { * @return The ID of the valid ritual */ public static String getValidRitual(World world, BlockPos pos) { - for (String key : RitualRegistry.getIds()) { + for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { for (EnumFacing direction : EnumFacing.HORIZONTALS) { - boolean test = checkValidRitual(world, pos, key, direction); - if (test) { - return key; - } + if (checkValidRitual(world, pos, ritual, direction)) + return BloodMagic.RITUAL_MANAGER.getId(ritual); } } return ""; } - public static EnumFacing getDirectionOfRitual(World world, BlockPos pos, String key) { + public static EnumFacing getDirectionOfRitual(World world, BlockPos pos, Ritual ritual) { for (EnumFacing direction : EnumFacing.HORIZONTALS) { - boolean test = checkValidRitual(world, pos, key, direction); - if (test) { + if (checkValidRitual(world, pos, ritual, direction)) return direction; - } } return null; } - public static boolean checkValidRitual(World world, BlockPos pos, String ritualId, EnumFacing direction) { - Ritual ritual = RitualRegistry.getRitualForId(ritualId); + public static boolean checkValidRitual(World world, BlockPos pos, Ritual ritual, EnumFacing direction) { if (ritual == null) { return false; } @@ -82,11 +63,8 @@ public class RitualHelper { for (RitualComponent component : components) { BlockPos newPos = pos.add(component.getOffset(direction)); - if (isRuneType(world, newPos, component.getRuneType())) { - continue; - } else { + if (!isRuneType(world, newPos, component.getRuneType())) return false; - } } return true; diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index e9227fde..bacb10da 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -449,7 +449,7 @@ 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: +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 From a7fcfbd2d006c81342d82ccd3d6f4203658d870c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 16 Jul 2018 16:05:13 -0700 Subject: [PATCH 312/595] Laputa Array should not be able to move unbreakable blocks (#1360) --- .../bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java index 0a4dcbe5..ce64e7f3 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.alchemyArray; import java.util.Random; +import net.minecraft.block.state.IBlockState; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -83,9 +84,10 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect { BlockPos newPos = pos.add(i, j, k); BlockPos offsetPos = newPos.up(teleportHeightOffset); + IBlockState state = world.getBlockState(newPos); TeleposeEvent event = new TeleposeEvent(world, newPos, world, offsetPos); - if (Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos) && !MinecraftForge.EVENT_BUS.post(event)) + 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); From fb90656335b64770cc519df93607f95ca1c98f12 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 16 Jul 2018 16:42:10 -0700 Subject: [PATCH 313/595] Green Grove ritual should apply to Reeds and Cactus (#1359) --- .../bloodmagic/ritual/types/RitualGreenGrove.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java index fdc69092..ccbfca81 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java @@ -8,9 +8,7 @@ import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.Block; -import net.minecraft.block.BlockFarmland; -import net.minecraft.block.IGrowable; +import net.minecraft.block.*; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -93,11 +91,13 @@ public class RitualGreenGrove extends Ritual { IBlockState state = world.getBlockState(newPos); if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { - if (state.getBlock() instanceof IGrowable) { + boolean flag = state.getBlock() instanceof IGrowable || state.getBlock() instanceof BlockCactus || state.getBlock() instanceof BlockReed; + if (flag) { if (world.rand.nextDouble() < growthChance) { state.getBlock().updateTick(world, newPos, state, new Random()); IBlockState newState = world.getBlockState(newPos); if (!newState.equals(state)) { + world.playEvent(2005, newPos, 0); totalGrowths++; if (consumeRawWill) { rawWill -= rawWillDrain; From a28f6308aa55f20e2b88caee92c5cb6da31c9be8 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 16 Jul 2018 16:42:24 -0700 Subject: [PATCH 314/595] Update changelog + version --- changelog.txt | 26 ++++++++++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 9a176a06..75fdcfe3 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,29 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index eacbf839..c9f0bf43 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.2.12 +mod_version=2.3.0 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From 7aadc505abfb5907db158cea6d992fd765fa4173 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 22 Jul 2018 06:51:38 -0700 Subject: [PATCH 315/595] Fix Ritual of Magnetism not being registered --- .../java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index ba7fe38b..d5047838 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -13,6 +13,7 @@ import net.minecraftforge.oredict.OreDictionary; 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"; From 5ac52fa8c9dd58b7edcf80308f8233cbca6e64b3 Mon Sep 17 00:00:00 2001 From: KohaiKhaos Date: Sun, 22 Jul 2018 08:54:46 -0500 Subject: [PATCH 316/595] Mob Sacrifice Array no longer kills bosses or players (#1371) This is solving the issue I raised in https://github.com/WayofTime/BloodMagic/issues/1368 Added a single check to line 123 of src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java. The check makes sure the effective health of the currently targeted entity is above 0. So bosses and players are no longer set to -1 health when the array finishes crafting. --- .../alchemyArray/AlchemyArrayEffectMobSacrifice.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java index 6ed8fbcf..77224e58 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java @@ -120,7 +120,7 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect for (EntityLivingBase living : livingEntities) { double health = getEffectiveHealth(living); - if (healthAvailable > 0) + 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); @@ -230,4 +230,4 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { return new AlchemyArrayEffectMobSacrifice(key); } -} \ No newline at end of file +} From e82510d55324622c609ee67d6edb9d9ebf6bb452 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 22 Jul 2018 06:56:10 -0700 Subject: [PATCH 317/595] Fix will type serializer using lowercased names for lookups (#1369) --- src/main/java/WayofTime/bloodmagic/gson/Serializers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java index 3a77e208..a2171911 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -33,7 +33,7 @@ public class Serializers { @Override public EnumDemonWillType copyValue(EnumDemonWillType value) { - return EnumDemonWillType.valueOf(value.getName()); + return EnumDemonWillType.valueOf(value.name()); } }; From 6c5bbed348f70ea2fddb785090aac1b782d686d5 Mon Sep 17 00:00:00 2001 From: Arcaratus Date: Sun, 22 Jul 2018 10:07:27 -0400 Subject: [PATCH 318/595] Quick Fixes (#1362) * Add modid to command localizations to prevent conflicts * Corrected localizations of other lang files * Fixed the items not being drawn on the right Y-level for the Sigil of Holding HUD --- .../client/hud/element/ElementHolding.java | 2 +- .../command/sub/SubCommandBind.java | 8 +- .../command/sub/SubCommandNetwork.java | 38 +++---- .../bloodmagic/command/sub/SubCommandOrb.java | 16 +-- .../assets/bloodmagic/lang/en_US.lang | 94 +++++++++--------- .../assets/bloodmagic/lang/fr_FR.lang | 98 +++++++++---------- .../assets/bloodmagic/lang/ja_JP.lang | 98 +++++++++---------- .../assets/bloodmagic/lang/zh_CN.lang | 98 +++++++++---------- 8 files changed, 226 insertions(+), 226 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java index d2656658..9206f124 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java @@ -44,7 +44,7 @@ public class ElementHolding extends HUDElement { List inventory = ItemSigilHolding.getInternalInventory(sigilHolding); int xOffset = 0; for (ItemStack stack : inventory) { - renderHotbarItem(drawX + 3 + xOffset, drawY - 4, partialTicks, minecraft.player, stack); + renderHotbarItem(drawX + 3 + xOffset, drawY + 3, partialTicks, minecraft.player, stack); xOffset += 20; } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index 5547ac6d..f229ad5b 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -21,7 +21,7 @@ public class SubCommandBind extends CommandBase { @Override public String getUsage(ICommandSender commandSender) { - return TextHelper.localizeEffect("commands.bind.usage"); + return TextHelper.localizeEffect("commands.bloodmagic.bind.usage"); } @Override @@ -58,17 +58,17 @@ public class SubCommandBind extends CommandBase { if (bind) { Binding binding = new Binding(player.getGameProfile().getId(), player.getGameProfile().getName()); BindableHelper.applyBinding(held, binding); - commandSender.sendMessage(new TextComponentTranslation("commands.bind.success")); + commandSender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.success")); } else { Binding binding = ((IBindable) held.getItem()).getBinding(held); if (binding != null) { held.getTagCompound().removeTag("binding"); - commandSender.sendMessage(new TextComponentTranslation("commands.bind.remove.success")); + commandSender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.remove.success")); } } } } catch (PlayerNotFoundException e) { - commandSender.sendMessage(new TextComponentTranslation(TextHelper.localizeEffect("commands.error.404"))); + commandSender.sendMessage(new TextComponentTranslation(TextHelper.localizeEffect("commands.bloodmagic.error.404"))); } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 07a53b22..f5a279d8 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -23,7 +23,7 @@ public class SubCommandNetwork extends CommandBase { @Override public String getUsage(ICommandSender commandSender) { - return TextHelper.localizeEffect("commands.network.usage"); + return TextHelper.localizeEffect("commands.bloodmagic.network.usage"); } @Override @@ -50,12 +50,12 @@ public class SubCommandNetwork extends CommandBase { CommandBloodMagic.displayErrorString(commandSender, e.getLocalizedMessage()); } } else { - CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.missing"); } } private enum ValidCommands { - SYPHON("commands.network.syphon.help") { + SYPHON("commands.bloodmagic.network.syphon.help") { @Override public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { if (displayHelp) { @@ -67,16 +67,16 @@ public class SubCommandNetwork extends CommandBase { if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, amount); - CommandBloodMagic.displaySuccessString(sender, "commands.network.syphon.success", amount, player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.syphon.success", amount, player.getDisplayName().getFormattedText()); } else { - CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); + CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid"); } } else { - CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing"); } } }, - ADD("commands.network.add.help") { + ADD("commands.bloodmagic.network.add.help") { @Override public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { if (displayHelp) { @@ -90,16 +90,16 @@ public class SubCommandNetwork extends CommandBase { if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); - CommandBloodMagic.displaySuccessString(sender, "commands.network.add.success", network.add(amount, maxOrb), player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.add.success", network.add(amount, maxOrb), player.getDisplayName().getFormattedText()); } else { - CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); + CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid"); } } else { - CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing"); } } }, - SET("commands.network.set.help") { + SET("commands.bloodmagic.network.set.help") { @Override public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { if (displayHelp) { @@ -113,16 +113,16 @@ public class SubCommandNetwork extends CommandBase { if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); network.setCurrentEssence(amount); - CommandBloodMagic.displaySuccessString(sender, "commands.network.set.success", player.getDisplayName().getFormattedText(), amount); + CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.set.success", player.getDisplayName().getFormattedText(), amount); } else { - CommandBloodMagic.displayErrorString(sender, "commands.error.arg.invalid"); + CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid"); } } else { - CommandBloodMagic.displayErrorString(sender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing"); } } }, - GET("commands.network.get.help") { + GET("commands.bloodmagic.network.get.help") { @Override public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { if (displayHelp) { @@ -137,7 +137,7 @@ public class SubCommandNetwork extends CommandBase { } }, - FILL("commands.network.fill.help") { + FILL("commands.bloodmagic.network.fill.help") { @Override public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { if (displayHelp) { @@ -149,11 +149,11 @@ public class SubCommandNetwork extends CommandBase { if (args.length > 1) { network.setCurrentEssence(Integer.MAX_VALUE); - CommandBloodMagic.displaySuccessString(sender, "commands.network.fill.success", player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.fill.success", player.getDisplayName().getFormattedText()); } } }, - CAP("commands.network.cap.help") { + CAP("commands.bloodmagic.network.cap.help") { @Override public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { if (displayHelp) { @@ -166,7 +166,7 @@ public class SubCommandNetwork extends CommandBase { if (args.length > 1) { int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); network.setCurrentEssence(maxOrb); - CommandBloodMagic.displaySuccessString(sender, "commands.network.cap.success", player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.cap.success", player.getDisplayName().getFormattedText()); } } },; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java index 27a34df7..cdba93a2 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -24,7 +24,7 @@ public class SubCommandOrb extends CommandBase { @Override public String getUsage(ICommandSender commandSender) { - return TextHelper.localizeEffect("commands.orb.usage"); + return TextHelper.localizeEffect("commands.bloodmagic.orb.usage"); } @Override @@ -63,12 +63,12 @@ public class SubCommandOrb extends CommandBase { if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); network.setOrbTier(amount); - CommandBloodMagic.displaySuccessString(commandSender, "commands.success"); + CommandBloodMagic.displaySuccessString(commandSender, "commands.bloodmagic.success"); } else { - CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.invalid"); + CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.invalid"); } } else { - CommandBloodMagic.displayErrorString(commandSender, "commands.error.arg.missing"); + CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.missing"); } break; @@ -86,17 +86,17 @@ public class SubCommandOrb extends CommandBase { } } } catch (IllegalArgumentException e) { - CommandBloodMagic.displayErrorString(commandSender, "commands.error.404"); + CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.404"); } } catch (PlayerNotFoundException e) { - CommandBloodMagic.displayErrorString(commandSender, "commands.error.404"); + CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.404"); } } } private enum ValidCommands { - SET("commands.orb.set.help"), - GET("commands.orb.get.help"); + SET("commands.bloodmagic.orb.set.help"), + GET("commands.bloodmagic.orb.get.help"); public String help; diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index bacb10da..a8ec51ae 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -794,60 +794,60 @@ entity.bloodmagic.SentientSpecter.name=Sentient Specter entity.bloodmagic.Mimic.name=Mimic # Commands -commands.error.arg.invalid=Invalid arguments -commands.error.arg.missing=Not enough arguments -commands.error.arg.player.missing=You must specify which player you wish to perform this action on. -commands.error.404=Command not found! -commands.error.unknown=Unknown command! -commands.error.perm=You do not have permission to use this command. +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.success=Executed successfully +commands.bloodmagic.success=Executed successfully -commands.format.help=%s - %s -commands.format.error=%s - %s +commands.bloodmagic.format.help=%s - %s +commands.bloodmagic.format.error=%s - %s -commands.help.usage=/bloodmagic help -commands.help.help=Displays the help information for the "/bloodmagic" command. +commands.bloodmagic.help.usage=/bloodmagic help +commands.bloodmagic.help.help=Displays the help information for the "/bloodmagic" command. -commands.network.usage=/bloodmagic network [syphon|add|get|fill|cap] player [amount] -commands.network.help=LP network utilities -commands.network.syphon.help=Removes the given amount of LP from the given player's LP network. -commands.network.syphon.success=Successfully syphoned %d LP from %s. -commands.network.add.help=Adds the given amount of LP to the given player's LP network. Follows standard LP gain rules. -commands.network.add.success=Successfully added %d LP to %s's LP network. -commands.network.set.help=Sets the given player's LP to the given amount. -commands.network.set.success=Successfully set %s's LP network to %d LP. -commands.network.get.help=Returns the amount of LP in the given player's LP network. -commands.network.fill.help=Fills the given player's LP network to %d. -commands.network.fill.success=Successfully filled %s's LP network. -commands.network.cap.help=Fills the given player's LP network to the max that their highest Blood Orb can store. -commands.network.cap.success=Successfully capped off %s's LP network. +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.bind.usage=/bloodmagic bind [true|false] [player] -commands.bind.help=Attempts to (un)bind the currently held item. -commands.bind.success=Binding successful -commands.bind.remove.success=Unbinding successful +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.orb.usage=/bloodmagic orb [set|get] player [tier] -commands.orb.help=Used to set or get the Player's max Blood Orb tier. +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.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) +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) # GUI tile.bloodmagic.inputNode.name=Input Node diff --git a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang index 6f2638be..f75e010a 100644 --- a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang +++ b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang @@ -552,62 +552,62 @@ secret.bloodmagic.bread.bloody=&r&cBloody Bread secret.bloodmagic.bread.bloody.desc=Only for &odire &r&7emergencies. # Commands -commands.error.arg.invalid=Invalid arguments -commands.error.arg.missing=Not enough arguments -commands.error.arg.player.missing=You must specify which player you wish to perform this action on. -commands.error.404=Command not found! -commands.error.unknown=Unknown command! -commands.error.perm=You do not have permission to use this command. +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.success=Executed successfully +commands.bloodmagic.success=Executed successfully -commands.format.help=%s - %s -commands.format.error=%s - %s +commands.bloodmagic.format.help=%s - %s +commands.bloodmagic.format.error=%s - %s -commands.help.usage=/bloodmagic help -commands.help.help=Displays the help information for the "/bloodmagic" command. +commands.bloodmagic.help.usage=/bloodmagic help +commands.bloodmagic.help.help=Displays the help information for the "/bloodmagic" command. -commands.network.usage=/bloodmagic network [syphon|add|get|fill|cap] player [amount] -commands.network.help=LP network utilities -commands.network.syphon.help=Removes the given amount of LP from the given player's LP network. -commands.network.syphon.success=Successfully syphoned %d LP from %s. -commands.network.add.help=Adds the given amount of LP to the given player's LP network. Follows standard LP gain rules. -commands.network.add.success=Successfully added %d LP to %s's LP network. -commands.network.set.help=Sets the given player's LP to the given amount. -commands.network.set.success=Successfully set %s's LP network to %d LP. -commands.network.get.help=Returns the amount of LP in the given player's LP network. -commands.network.fill.help=Fills the given player's LP network to %d. -commands.network.fill.success=Successfully filled %s's LP network. -commands.network.cap.help=Fills the given player's LP network to the max that their highest Blood Orb can store. -commands.network.cap.success=Successfully capped off %s's LP network. +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.bind.usage=/bloodmagic bind [true|false] [player] -commands.bind.help=Attempts to (un)bind the currently held item. -commands.bind.success=Binding successful -commands.bind.remove.success=Unbinding successful +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.orb.usage=/bloodmagic orb [set|get] player [tier] -commands.orb.help=Used to set or get the Player's max Blood Orb tier. +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.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) +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 diff --git a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang index 6bc2153f..58d7b932 100644 --- a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang +++ b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang @@ -785,62 +785,62 @@ entity.bloodmagic.SentientSpecter.name=ç†åŠ›ã®éœŠé­‚ entity.bloodmagic.Mimic.name=ミミック # Commands -commands.error.arg.invalid=無効ãªå¼•æ•°ã§ã™ -commands.error.arg.missing=引数ãŒè¶³ã‚Šã¾ã›ã‚“ -commands.error.arg.player.missing=ã‚ãªãŸã¯å®Ÿè¡Œã™ã‚‹å¯¾è±¡ãƒ—レイヤーを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -commands.error.404=コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼ -commands.error.unknown=未知ã®ã‚³ãƒžãƒ³ãƒ‰ã§ã™ï¼ -commands.error.perm=ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 +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.success=正常ã«å®Ÿè¡Œã•れã¾ã—㟠+commands.bloodmagic.success=正常ã«å®Ÿè¡Œã•れã¾ã—㟠-commands.format.help=%s - %s -commands.format.error=%s - %s +commands.bloodmagic.format.help=%s - %s +commands.bloodmagic.format.error=%s - %s -commands.help.usage=/bloodmagic help -commands.help.help="/bloodmagic" コマンドã§ãƒ˜ãƒ«ãƒ—情報ãŒè¡¨ç¤ºã•れã¾ã™ã€‚ +commands.bloodmagic.help.usage=/bloodmagic help +commands.bloodmagic.help.help="/bloodmagic" コマンドã§ãƒ˜ãƒ«ãƒ—情報ãŒè¡¨ç¤ºã•れã¾ã™ã€‚ -commands.network.usage=/bloodmagic network [syphon|add|get|fill|cap] <プレイヤー> [é‡] -commands.network.help=LP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ -commands.network.syphon.help=指定ã—ãŸãƒ—レイヤーã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‹ã‚‰LPを削減ã—ã¾ã™ -commands.network.syphon.success=%d LPã ã‘ã€%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削減ã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ -commands.network.add.help=指定ã•れãŸãƒ—レイヤーã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®LPã‚’ã€LP増加ルールã®ç¯„囲内ã§å¢—加ã•ã›ã¾ã™ã€‚ -commands.network.add.success=%d LPã ã‘ã€%sã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’増加ã•ã›ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ -commands.network.set.help=指定ã—ãŸãƒ—レイヤーã®LPを設定ã—ã¾ã™ã€‚ -commands.network.set.success=%sã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’%d LPã«è¨­å®šã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ -commands.network.get.help=指定ã—ãŸãƒ—レイヤーã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®LPé‡ã‚’è¿”ã—ã¾ã™ã€‚ -commands.network.fill.help=指定ã—ãŸãƒ—レイヤーã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’%d LPã¾ã§æº€ãŸã—ã¾ã™ã€‚ -commands.network.fill.success=%sã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’最大ã¾ã§ä»˜ä¸Žã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ -commands.network.cap.help=プレイヤーãŒå…¥æ‰‹ã§ãる最高ä½ã®ãƒ–ラッドオーブã§è²¯è”µå¯èƒ½ãªæœ€å¤§å€¤ã®LPを付与ã—ã¾ã™ã€‚ -commands.network.cap.success=%sã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®é™ç•Œå€¤ã¾ã§LPを付与ã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ +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.bind.usage=/bloodmagic bind [true|false] [プレイヤー] -commands.bind.help=æ‰‹ã«æ‰€æŒã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’çµåˆï¼åˆ†é›¢ã—ã¾ã™ã€‚ -commands.bind.success=çµåˆã«æˆåŠŸã—ã¾ã—㟠-commands.bind.remove.success=åˆ†é›¢ã«æˆåŠŸã—ã¾ã—㟠+commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [プレイヤー] +commands.bloodmagic.bind.help=æ‰‹ã«æ‰€æŒã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’çµåˆï¼åˆ†é›¢ã—ã¾ã™ã€‚ +commands.bloodmagic.bind.success=çµåˆã«æˆåŠŸã—ã¾ã—㟠+commands.bloodmagic.bind.remove.success=åˆ†é›¢ã«æˆåŠŸã—ã¾ã—㟠-commands.orb.usage=/bloodmagic orb [set|get] <プレイヤー> [グレード] -commands.orb.help=対象プレイヤーã®ãƒ–ラッドオーブã®ã‚°ãƒ¬ãƒ¼ãƒ‰ã®æœ€å¤§å€¤ã‚’設定ã€å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚ +commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] <プレイヤー> [グレード] +commands.bloodmagic.orb.help=対象プレイヤーã®ãƒ–ラッドオーブã®ã‚°ãƒ¬ãƒ¼ãƒ‰ã®æœ€å¤§å€¤ã‚’設定ã€å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚ -commands.bind.usage=/bind <プレイヤー> -commands.bind.success=アイテムã®ç™»éŒ²ãŒæˆåŠŸã—ã¾ã—ãŸï¼ -commands.bind.failed.noPlayer=指定ã•れãŸãƒ—レイヤーã¯å­˜åœ¨ã—ã¾ã›ã‚“ -commands.bind.failed.alreadyBound=ã‚¢ã‚¤ãƒ†ãƒ ã¯æ—¢ã«ç™»éŒ²æ¸ˆã¿ã§ã™ï¼› /unbind コマンドã§ç™»éŒ²è§£é™¤ã—ã¦ãã ã•ã„ -commands.bind.failed.notBindable=アイテムã®ç™»éŒ²ãŒå‡ºæ¥ã¾ã›ã‚“ã§ã—㟠-commands.unbind.usage=/unbind -commands.unbind.success=アイテムã®ç™»éŒ²è§£é™¤ãŒæˆåŠŸã—ã¾ã—ãŸï¼ -commands.unbind.failed.notBindable=アイテムã®ç™»éŒ²è§£é™¤ãŒå‡ºæ¥ã¾ã›ã‚“ã§ã—㟠-commands.soulnetwork.usage=/soulnetwork <プレイヤー> [é‡] -commands.soulnetwork.add.success=%d LPã ã‘ã€%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’増加ã•ã›ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸï¼ -commands.soulnetwork.subtract.success=%d LPã ã‘ã€%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’減少ã•ã›ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸï¼ -commands.soulnetwork.fill.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’満ãŸã—ã¾ã—ãŸï¼ -commands.soulnetwork.empty.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’空ã«ã—ã¾ã—ãŸï¼ -commands.soulnetwork.get.success=%dã ã‘%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã¯LPãŒã‚りã¾ã™ï¼ -commands.soulnetwork.noPlayer=指定ã•れãŸãƒ—レイヤーã¯å­˜åœ¨ã—ã¾ã›ã‚“ -commands.soulnetwork.noCommand=指定ã•れãŸã‚³ãƒžãƒ³ãƒ‰ã¯ã‚りã¾ã›ã‚“ -commands.soulnetwork.notACommand=有効ãªã‚³ãƒžãƒ³ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“ -commands.soulnetwork.fillMax.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã‚ªãƒ¼ãƒ–ã®æœ€å¤§å€¤ã¾ã§LPを供給ã—ã¾ã—ãŸï¼ -commands.soulnetwork.create.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’構築ã—ã¾ã—ãŸ(オーブã®ã‚°ãƒ¬ãƒ¼ãƒ‰ï¼š %d) +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=入力ノード diff --git a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang index 5c76206c..6ccec15a 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang @@ -783,62 +783,62 @@ entity.bloodmagic.SentientSpecter.name=æ„ŸçŸ¥ä¹‹çµ entity.bloodmagic.Mimic.name=æ‹Ÿæ€ # Commands -commands.error.arg.invalid=æ— æ•ˆå‚æ•° -commands.error.arg.missing=傿•°ä¸è¶³ -commands.error.arg.player.missing=ä½ å¿…é¡»æŒ‡å®šä¸€ä¸ªçŽ©å®¶æ¥æ‰§è¡Œè¯¥å‘½ä»¤ã€‚ -commands.error.404=å‘½ä»¤æœªæ‰¾åˆ°ï¼ -commands.error.unknown=æœªçŸ¥çš„å‘½ä»¤ï¼ -commands.error.perm=你没有使用该命令的æƒé™ã€‚ +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.success=æˆåŠŸæ‰§è¡Œ +commands.bloodmagic.success=æˆåŠŸæ‰§è¡Œ -commands.format.help=%s - %s -commands.format.error=%s - %s +commands.bloodmagic.format.help=%s - %s +commands.bloodmagic.format.error=%s - %s -commands.help.usage=/bloodmagic help -commands.help.help=使用"/bloodmagic help"命令显示指令列表。 +commands.bloodmagic.help.usage=/bloodmagic help +commands.bloodmagic.help.help=使用"/bloodmagic help"命令显示指令列表。 -commands.network.usage=/bloodmagic network [å¸å–(syphon)|添加(add)|查看(get)|å¡«å……(fill)|填满(cap)] <玩家> [æ•°é‡] -commands.network.help=çµé­‚网络实用工具 -commands.network.syphon.help=从指定玩家的çµé­‚网络中移出指定的LP值。 -commands.network.syphon.success=æˆåŠŸä»Ž %s å¸å–出 %dLP。 -commands.network.add.help=添加指定的LP值到指定玩家的çµé­‚网络中。æœä»Žæ ‡å‡†çš„LP增加规则。 -commands.network.add.success=æˆåŠŸæ·»åŠ  %dLP 到 %s çš„çµé­‚网络。 -commands.network.set.help=将指定玩家的LP设置为所给数值。 -commands.network.set.success=æˆåŠŸå°† %s çµé­‚网络中的LP设置为 %d。 -commands.network.get.help=返还指定玩家çµé­‚网络中的LP值。 -commands.network.fill.help=将指定玩家的LP填充为 %d。 -commands.network.fill.success=æˆåŠŸå¡«å…… %s çš„çµé­‚网络。 -commands.network.cap.help=填充指定玩家的çµé­‚ç½‘ç»œè‡³å…¶æ‰€æŒæœ‰çš„æœ€é«˜é˜¶æ°”è¡€å®ç å®¹é‡çš„æœ€å¤§å€¼ã€‚ -commands.network.cap.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚网络。 +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.bind.usage=/bind <玩家> -commands.bind.help=用于设置/解除对手æŒç‰©å“的绑定情况。 -commands.bind.success=ç‰©å“æˆåŠŸç»‘å®šï¼ -commands.bind.remove.success=解除绑定æˆåŠŸ +commands.bloodmagic.bind.usage=/bind <玩家> +commands.bloodmagic.bind.help=用于设置/解除对手æŒç‰©å“的绑定情况。 +commands.bloodmagic.bind.success=ç‰©å“æˆåŠŸç»‘å®šï¼ +commands.bloodmagic.bind.remove.success=解除绑定æˆåŠŸ -commands.orb.usage=/bloodmagic orb [设置(set)|查看(get)] <玩家> [等级] -commands.orb.help=用于设置或查看玩家的最高血å®ç ç­‰çº§. +commands.bloodmagic.orb.usage=/bloodmagic orb [设置(set)|查看(get)] <玩家> [等级] +commands.bloodmagic.orb.help=用于设置或查看玩家的最高血å®ç ç­‰çº§. -commands.bind.usage=/bind <玩家> -commands.bind.success=ç‰©å“æˆåŠŸç»‘å®šï¼ -commands.bind.failed.noPlayer=没有指定玩家 -commands.bind.failed.alreadyBound=物å“å·²ç»è¢«ç»‘定;使用 /unbind æ¥è§£é™¤ç»‘定 -commands.bind.failed.notBindable=ç‰©å“æ— æ³•被绑定 -commands.unbind.usage=/unbind -commands.unbind.success=ç‰©å“æˆåŠŸè§£é™¤ç»‘å®šï¼ -commands.unbind.failed.notBindable=ç‰©å“æ— æ³•解除绑定 -commands.soulnetwork.usage=/soulnetwork <玩家> <添加(add)|å‡åŽ»(subtract)|填满(fill)|清空(empty)|查看(get)> [æ•°é‡] -commands.soulnetwork.add.success=æˆåŠŸæ·»åŠ  %dLP 到 %s çš„çµé­‚ç½‘ç»œï¼ -commands.soulnetwork.subtract.success=æˆåŠŸä»Ž %s çš„çµé­‚网络中å‡åŽ» %dLPï¼ -commands.soulnetwork.fill.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚ç½‘ç»œï¼ -commands.soulnetwork.empty.success=æˆåŠŸæ¸…ç©º %s çš„çµé­‚ç½‘ç»œï¼ -commands.soulnetwork.get.success=%s çš„çµé­‚网络中有 %dLPï¼ -commands.soulnetwork.noPlayer=没有指定玩家 -commands.soulnetwork.noCommand=è¿™ä¸ç¬¦å‘½ä»¤è§„定 -commands.soulnetwork.notACommand=è¿™ä¸æ˜¯æœ‰æ•ˆçš„命令 -commands.soulnetwork.fillMax.success=æˆåŠŸå°† %s çš„çµé­‚网络填满至其å®ç çš„æœ€å¤§å€¼ï¼ -commands.soulnetwork.create.success=创建 %s çš„çµé­‚网络æˆåŠŸï¼ˆå®ç ç­‰çº§ï¼š%d) +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=输入节点 From 093cfb13efaff3988f1588e8582aefa08365b851 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 22 Jul 2018 07:10:00 -0700 Subject: [PATCH 319/595] Changelog + version --- changelog.txt | 10 ++++++++++ gradle.properties | 2 +- .../java/WayofTime/bloodmagic/block/BlockAltar.java | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/changelog.txt b/changelog.txt index 75fdcfe3..3d8a9a5d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,13 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index c9f0bf43..b97442cd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.3.0 +mod_version=2.3.1 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 39fe58e1..3f979f47 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -57,7 +57,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl TileEntity tile = world.getTileEntity(pos); - if (tile != null && tile instanceof TileAltar) { + if (tile instanceof TileAltar) { TileAltar altar = (TileAltar) tile; ItemStack orbStack = altar.getStackInSlot(0); From b441e7fc1e0ce7587d70ae140c83681933994371 Mon Sep 17 00:00:00 2001 From: Arcaratus Date: Tue, 7 Aug 2018 18:27:12 -0400 Subject: [PATCH 320/595] SoulTicket internal implementation (#1372) * Fix the Blood Tank BB * Add modid to command localizations to prevent conflicts * Fixed the items not being drawn on the right Y-level for the Sigil of Holding HUD Corrected localizations of other lang files * SoulTicket internal implementation * do what TehNut says * implement hashCode() * Fix toggleable sigils draining on r-click when it shouldn't Also moved the ItemSigil and ItemSigilToggleable to the sigil package (why wasn't it there???) --- .../bloodmagic/altar/BloodAltar.java | 3 +- .../command/sub/SubCommandNetwork.java | 5 +- .../bloodmagic/core/data/SoulNetwork.java | 15 ++++++ .../bloodmagic/core/data/SoulTicket.java | 52 +++++++++++++++++++ .../WayofTime/bloodmagic/iface/ISigil.java | 2 +- .../bloodmagic/item/ItemBloodOrb.java | 5 +- .../bloodmagic/item/ItemBoundAxe.java | 3 +- .../bloodmagic/item/ItemBoundPickaxe.java | 7 ++- .../bloodmagic/item/ItemBoundShovel.java | 7 ++- .../bloodmagic/item/ItemBoundSword.java | 11 ++-- .../bloodmagic/item/ItemBoundTool.java | 3 +- .../bloodmagic/item/ItemLavaCrystal.java | 6 ++- .../item/armour/ItemLivingArmour.java | 3 +- .../item/{ => sigil}/ItemSigil.java | 2 +- .../bloodmagic/item/sigil/ItemSigilAir.java | 10 ++-- .../bloodmagic/item/sigil/ItemSigilBase.java | 1 - .../item/sigil/ItemSigilBloodLight.java | 19 +++---- .../item/sigil/ItemSigilDivination.java | 6 +-- .../item/sigil/ItemSigilGreenGrove.java | 4 +- .../bloodmagic/item/sigil/ItemSigilLava.java | 10 ++-- .../item/sigil/ItemSigilSuppression.java | 1 - .../item/{ => sigil}/ItemSigilToggleable.java | 9 ++-- .../item/sigil/ItemSigilToggleableBase.java | 1 - .../item/sigil/ItemSigilTransposition.java | 7 ++- .../bloodmagic/item/sigil/ItemSigilVoid.java | 14 +++-- .../bloodmagic/item/sigil/ItemSigilWater.java | 7 +-- .../bloodmagic/ritual/IMasterRitualStone.java | 5 ++ .../bloodmagic/ritual/portal/Teleports.java | 24 +++++---- .../ritual/types/RitualAltarBuilder.java | 8 +-- .../ritual/types/RitualAnimalGrowth.java | 2 +- .../ritual/types/RitualCobblestone.java | 2 +- .../ritual/types/RitualCrushing.java | 4 +- .../ritual/types/RitualCrystalHarvest.java | 2 +- .../ritual/types/RitualEllipsoid.java | 8 +-- .../ritual/types/RitualExpulsion.java | 2 +- .../ritual/types/RitualFeatheredKnife.java | 2 +- .../ritual/types/RitualFelling.java | 2 +- .../ritual/types/RitualForsakenSoul.java | 2 +- .../ritual/types/RitualFullStomach.java | 2 +- .../ritual/types/RitualGreenGrove.java | 2 +- .../ritual/types/RitualHarvest.java | 2 +- .../ritual/types/RitualJumping.java | 2 +- .../bloodmagic/ritual/types/RitualLava.java | 2 +- .../ritual/types/RitualMagnetic.java | 2 +- .../bloodmagic/ritual/types/RitualMeteor.java | 2 +- .../bloodmagic/ritual/types/RitualPlacer.java | 2 +- .../bloodmagic/ritual/types/RitualPump.java | 2 +- .../ritual/types/RitualRegeneration.java | 2 +- .../bloodmagic/ritual/types/RitualWater.java | 2 +- .../ritual/types/RitualWellOfSuffering.java | 2 +- .../bloodmagic/ritual/types/RitualZephyr.java | 2 +- .../bloodmagic/tile/TileAlchemyTable.java | 33 ++++++------ .../tile/TileImperfectRitualStone.java | 5 +- .../tile/TileMasterRitualStone.java | 2 +- .../bloodmagic/tile/TileTeleposer.java | 5 +- .../bloodmagic/util/helper/NetworkHelper.java | 10 ++-- 56 files changed, 210 insertions(+), 147 deletions(-) rename src/main/java/WayofTime/bloodmagic/item/{ => sigil}/ItemSigil.java (95%) rename src/main/java/WayofTime/bloodmagic/item/{ => sigil}/ItemSigilToggleable.java (89%) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 0a6fcdb9..8df2775c 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import WayofTime.bloodmagic.block.enums.BloodRuneType; import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.orb.BloodOrb; @@ -365,7 +366,7 @@ public class BloodAltar implements IFluidHandler 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(liquidDrained, (int) (orb.getCapacity() * this.orbCapacityMultiplier)); + 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 WorldServer) diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index f5a279d8..12db2d7f 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.command.sub; import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; @@ -66,7 +67,7 @@ public class SubCommandNetwork extends CommandBase { if (args.length == 3) { if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, amount); + NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.command(sender, "syphon", amount)); CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.syphon.success", amount, player.getDisplayName().getFormattedText()); } else { CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid"); @@ -90,7 +91,7 @@ public class SubCommandNetwork extends CommandBase { if (Utils.isInteger(args[2])) { int amount = Integer.parseInt(args[2]); int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); - CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.add.success", network.add(amount, maxOrb), player.getDisplayName().getFormattedText()); + CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.add.success", network.add(SoulTicket.command(sender, "add", amount), maxOrb), player.getDisplayName().getFormattedText()); } else { CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid"); } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index d0686067..4ba15109 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -33,6 +33,10 @@ public class SoulNetwork implements INBTSerializable { ticketHistory = EvictingQueue.create(16); } + 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)) @@ -46,7 +50,11 @@ public class SoulNetwork implements INBTSerializable { 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 + ticketHistory.add(ticket); + return newEss - currEss; } @@ -78,6 +86,9 @@ public class SoulNetwork implements INBTSerializable { int syphon = event.getTicket().getAmount(); if (getCurrentEssence() >= syphon) { setCurrentEssence(getCurrentEssence() - syphon); + if (ticketHistory.contains(ticket)) + ticketHistory.remove(ticket); + ticketHistory.add(ticket); return syphon; } @@ -107,7 +118,11 @@ public class SoulNetwork implements INBTSerializable { if (drainAmount <= 0 || event.shouldDamage()) hurtPlayer(user, event.getTicket().getAmount()); + if (ticketHistory.contains(ticket)) + ticketHistory.remove(ticket); + ticketHistory.add(ticket); + return BooleanResult.newResult(true, event.getTicket().getAmount()); } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java index 1f9c4c60..6d209dd5 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java @@ -1,7 +1,12 @@ package WayofTime.bloodmagic.core.data; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; +import net.minecraft.world.World; public class SoulTicket { @@ -30,4 +35,51 @@ public class SoulTicket { 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 TextComponentString("block|" + world.provider.getDimension() + "|" + 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 TextComponentString("item|" + itemStack.getItem().getRegistryName() + "|" + world.provider.getDimension() + "|" + entity.getPersistentID()), 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 TextComponentString("item|" + itemStack.getItem().getRegistryName() + "|" + world.provider.getDimension() + "|" + 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 TextComponentString("item|" + itemStack.getItem().getRegistryName()), amount); + } + + public static SoulTicket command(ICommandSender sender, String command, int amount) { + return new SoulTicket(new TextComponentString("command|" + command + "|" + sender.getName()), 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); + + return false; + } + + @Override + public int hashCode() { + return description.hashCode(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/iface/ISigil.java b/src/main/java/WayofTime/bloodmagic/iface/ISigil.java index 5912f52d..017df5c1 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/ISigil.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ISigil.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.iface; -import WayofTime.bloodmagic.item.ItemSigil; +import WayofTime.bloodmagic.item.sigil.ItemSigil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index c9e1b210..c8516244 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -1,8 +1,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.core.data.*; import WayofTime.bloodmagic.orb.BloodOrb; import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.util.helper.NetworkHelper; @@ -83,7 +82,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { if (binding.getOwnerId().equals(player.getGameProfile().getId())) ownerNetwork.setOrbTier(orb.getTier()); - ownerNetwork.add(200, orb.getCapacity()); // Add LP to owner's network + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index f4b092e0..14094b3d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -2,6 +2,7 @@ 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.BlockStack; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.util.helper.NetworkHelper; @@ -100,7 +101,7 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { } } - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, (int) (charge * charge * charge / 2.7)); + 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); dropStacks(drops, world, playerPos.add(0, 1, 0)); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index 8e7da20c..68b37547 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -2,12 +2,11 @@ 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.BlockStack; 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 com.google.common.collect.*; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -113,7 +112,7 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { } } - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, (int) (charge * charge * charge / 2.7)); + 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); dropStacks(drops, world, playerPos.add(0, 1, 0)); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index a1426e9e..3634012d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -2,12 +2,11 @@ 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.BlockStack; 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 com.google.common.collect.*; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -99,7 +98,7 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { } } - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, (int) (charge * charge * charge / 2.7)); + 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); dropStacks(drops, world, playerPos.add(0, 1, 0)); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 1c67b320..e9b30300 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -5,6 +5,7 @@ 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; @@ -16,17 +17,13 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.*; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -71,7 +68,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable } if (entity instanceof EntityPlayer && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) - NetworkHelper.getSoulNetwork(binding).syphonAndDamage((EntityPlayer) entity, 20); + NetworkHelper.getSoulNetwork(binding).syphonAndDamage((EntityPlayer) entity, SoulTicket.item(stack, world, entity, 20)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 4c39abdd..bdc791bf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.event.BoundToolEvent; import WayofTime.bloodmagic.iface.IActivatable; @@ -93,7 +94,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { } if (entity instanceof EntityPlayer && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) - NetworkHelper.getSoulNetwork(binding).syphonAndDamage((EntityPlayer) entity, 20); + NetworkHelper.getSoulNetwork(binding).syphonAndDamage((EntityPlayer) entity, SoulTicket.item(stack, world, entity, 20)); } protected int getHeldDownCount(ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index 3e3c07ba..ed4153a0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -3,6 +3,7 @@ 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; @@ -14,6 +15,7 @@ import net.minecraft.potion.PotionEffect; 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() { @@ -25,7 +27,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide public ItemStack getContainerItem(ItemStack stack) { Binding binding = getBinding(stack); if (binding != null) - NetworkHelper.getSoulNetwork(binding.getOwnerId()).syphon(25); + NetworkHelper.getSoulNetwork(binding.getOwnerId()).syphon(SoulTicket.item(stack, 25)); ItemStack returnStack = new ItemStack(this); returnStack.setTagCompound(stack.getTagCompound()); @@ -43,7 +45,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide if (binding == null) return -1; - if (NetworkHelper.syphonFromContainer(stack, 25)) + if (NetworkHelper.syphonFromContainer(stack, SoulTicket.item(stack, 25))) return 200; else { EntityPlayer player = PlayerHelper.getPlayerFromUUID(binding.getOwnerId()); diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index b976cb04..001b3264 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -4,6 +4,7 @@ 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; @@ -210,7 +211,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (entity.getEntityWorld().isRemote && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; SoulNetwork network = NetworkHelper.getSoulNetwork(player); - network.syphonAndDamage(player, damage * 100); + network.syphonAndDamage(player, SoulTicket.item(stack, entity.getEntityWorld(), entity, damage * 100)); } return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java similarity index 95% rename from src/main/java/WayofTime/bloodmagic/item/ItemSigil.java rename to src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java index 605c4bdc..70be6e84 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSigil.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.item; +package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.iface.IBindable; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index a8e50e25..da71b84d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -1,21 +1,19 @@ 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 WayofTime.bloodmagic.core.RegistrarBloodMagic; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; +import net.minecraft.util.*; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -51,7 +49,7 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP if (!world.isRemote) { if (!player.capabilities.isCreativeMode) - this.setUnusable(stack, !NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, getLpUsed())); + this.setUnusable(stack, !NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()); if (!unusable) player.fallDistance = 0; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index c9f5747b..c62a8ca8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.item.ItemSigil; import WayofTime.bloodmagic.util.helper.TextHelper; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 42b5f026..8c161786 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -1,19 +1,16 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; 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.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -56,7 +53,7 @@ public class ItemSigilBloodLight extends ItemSigilBase if (!world.isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); - network.syphonAndDamage(player, getLpUsed()); + network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); } resetCooldown(stack); player.swingArm(hand); @@ -68,7 +65,7 @@ public class ItemSigilBloodLight extends ItemSigilBase { SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); world.spawnEntity(new EntityBloodLight(world, player)); - network.syphonAndDamage(player, getLpUsed()); + network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); } resetCooldown(stack); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index a9a4b26f..a25a5122 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -3,15 +3,13 @@ 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 WayofTime.bloodmagic.util.ChatUtil; import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; +import net.minecraft.util.*; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java index 02a8a4d7..8f479995 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java @@ -1,6 +1,8 @@ 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.state.IBlockState; @@ -24,7 +26,7 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase { if (PlayerHelper.isFakePlayer(player)) return false; - if (applyBonemeal(world, blockPos, player, stack)) { + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index b02e3f3c..6b044a6d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -1,5 +1,6 @@ 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; @@ -8,10 +9,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -59,7 +57,7 @@ public class ItemSigilLava extends ItemSigilBase { return super.onItemRightClick(world, player, hand); } - if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) { + if (canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess() && tryPlaceLava(world, blockpos1)) { return super.onItemRightClick(world, player, hand); } } @@ -85,7 +83,7 @@ public class ItemSigilLava extends ItemSigilBase { FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000); int amount = handler.fill(fluid, false); - if (amount > 0 && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, getLpUsed())) { + if (amount > 0 && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { handler.fill(fluid, true); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java index 4b2d2180..16783af4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java @@ -47,5 +47,4 @@ public class ItemSigilSuppression extends ItemSigilToggleableBase { } } } - } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java similarity index 89% rename from src/main/java/WayofTime/bloodmagic/item/ItemSigilToggleable.java rename to src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java index 9b9bbe27..4a354186 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java @@ -1,6 +1,7 @@ -package WayofTime.bloodmagic.item; +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; @@ -53,7 +54,7 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable { if (!world.isRemote && !isUnusable(stack)) { if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); - if (getActivated(stack) && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) + if (getActivated(stack)) return super.onItemRightClick(world, player, hand); } @@ -70,7 +71,7 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable { if (binding == null || player.isSneaking()) // Make sure Sigils are bound before handling. Also ignores while toggling state return EnumActionResult.PASS; - return (NetworkHelper.getSoulNetwork(binding).syphonAndDamage(player, getLpUsed()) && onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ)) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + return onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; } public boolean onSigilUse(ItemStack itemStack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) { @@ -81,7 +82,7 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable { public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { if (!worldIn.isRemote && entityIn instanceof EntityPlayerMP && getActivated(stack)) { if (entityIn.ticksExisted % 100 == 0) { - if (!NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage((EntityPlayer) entityIn, getLpUsed())) { + if (!NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage((EntityPlayer) entityIn, SoulTicket.item(stack, worldIn, entityIn, getLpUsed())).isSuccess()) { setActivatedState(stack, false); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 6aa74856..08fb9dff 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -4,7 +4,6 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.item.ItemSigilToggleable; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index 6e3b00f4..4cba37ed 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -1,6 +1,7 @@ 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; @@ -12,9 +13,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTUtil; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityMobSpawner; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -89,7 +88,7 @@ public class ItemSigilTransposition extends ItemSigilBase { } stack.getTagCompound().setTag("stored", stored); - NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, cost); + NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, cost)); world.removeTileEntity(blockPos); world.setBlockToAir(blockPos); return EnumActionResult.SUCCESS; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index a2e20146..93796d8d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -1,16 +1,14 @@ package WayofTime.bloodmagic.item.sigil; 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.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -56,7 +54,7 @@ public class ItemSigilVoid extends ItemSigilBase { return super.onItemRightClick(world, player, hand); } - if (world.getBlockState(blockpos).getBlock().getMaterial(world.getBlockState(blockpos)).isLiquid() && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { + if (world.getBlockState(blockpos).getBlock().getMaterial(world.getBlockState(blockpos)).isLiquid() && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { world.setBlockToAir(blockpos); return super.onItemRightClick(world, player, hand); } @@ -66,7 +64,7 @@ public class ItemSigilVoid extends ItemSigilBase { } if (!player.capabilities.isCreativeMode) - this.setUnusable(stack, !NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())); + setUnusable(stack, !NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()); } return super.onItemRightClick(world, player, hand); @@ -92,7 +90,7 @@ public class ItemSigilVoid extends ItemSigilBase { IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); FluidStack amount = handler.drain(1000, false); - if (amount != null && amount.amount > 0 && network.syphonAndDamage(player, getLpUsed())) { + if (amount != null && amount.amount > 0 && network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { handler.drain(1000, true); return EnumActionResult.SUCCESS; } @@ -106,7 +104,7 @@ public class ItemSigilVoid extends ItemSigilBase { return EnumActionResult.FAIL; } - if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && network.syphonAndDamage(player, getLpUsed())) { + if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { world.setBlockToAir(newPos); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index 396c2aa5..5737fd32 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -1,5 +1,6 @@ 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; @@ -54,7 +55,7 @@ public class ItemSigilWater extends ItemSigilBase { if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) return super.onItemRightClick(world, player, hand); - if (this.canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceWater(world, blockpos1)) + if (canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess() && tryPlaceWater(world, blockpos1)) return super.onItemRightClick(world, player, hand); } } @@ -78,7 +79,7 @@ public class ItemSigilWater extends ItemSigilBase { FluidStack fluid = new FluidStack(FluidRegistry.WATER, 1000); int amount = handler.fill(fluid, false); - if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { + if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { handler.fill(fluid, true); return EnumActionResult.SUCCESS; } @@ -86,7 +87,7 @@ public class ItemSigilWater extends ItemSigilBase { return EnumActionResult.FAIL; } - if (world.getBlockState(blockPos).getBlock() == Blocks.CAULDRON && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) { + if (world.getBlockState(blockPos).getBlock() == Blocks.CAULDRON && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { world.setBlockState(blockPos, Blocks.CAULDRON.getDefaultState().withProperty(BlockCauldron.LEVEL, 3)); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index f6743a12..eb61019c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -1,6 +1,7 @@ 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.EntityPlayer; import net.minecraft.item.ItemStack; @@ -56,4 +57,8 @@ public interface IMasterRitualStone { boolean setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2); List getActiveWillConfig(); + + default SoulTicket ticket(int amount) { + return SoulTicket.block(getWorldObj(), getBlockPos(), amount); + } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index 5e24db13..79902bc7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -1,12 +1,11 @@ package WayofTime.bloodmagic.ritual.portal; -import WayofTime.bloodmagic.event.TeleposeEvent; import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.core.data.SoulTicket; +import WayofTime.bloodmagic.event.TeleposeEvent; import WayofTime.bloodmagic.teleport.Teleport; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.SoundEvents; @@ -15,6 +14,7 @@ import net.minecraft.network.play.server.SPacketUpdateHealth; import net.minecraft.server.MinecraftServer; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.MinecraftForge; @@ -49,10 +49,10 @@ public class Teleports { if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z)))) return; - network.syphon(getTeleportCost()); - EntityPlayerMP player = (EntityPlayerMP) 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 SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); @@ -70,10 +70,10 @@ public class Teleports { if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z)))) return; - network.syphon(getTeleportCost() / 10); - WorldServer world = (WorldServer) entity.getEntityWorld(); + network.syphon(ticket(world, entity, getTeleportCost() / 10)); + entity.setPosition(x + 0.5, y + 0.5, z + 0.5); entity.timeUntilPortal = 150; world.resetUpdateEntityTick(); @@ -128,7 +128,7 @@ public class Teleports { if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z)))) return; - network.syphon(getTeleportCost()); + network.syphon(ticket(oldWorld, player, getTeleportCost())); player.changeDimension(newWorldID); //TODO: UNTESTED // server.getConfigurationManager().transferPlayerToDimension(player, newWorldID, new TeleporterBloodMagic(newWorldServer)); @@ -148,7 +148,7 @@ public class Teleports { if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z)))) return; - network.syphon(getTeleportCost() / 10); + network.syphon(ticket(oldWorld, entity, getTeleportCost() / 10)); NBTTagCompound tag = new NBTTagCompound(); @@ -193,4 +193,8 @@ public class Teleports { return teleposer; } } + + public static SoulTicket ticket(World world, Entity entity, int amount) { + return new SoulTicket(new TextComponentString("teleport|" + world.provider.getDimension() + "|" + entity.getName() + "|" + entity.getPosition().toLong()), amount); + } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index 4c7783b4..1cf2f0ce 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -58,7 +58,7 @@ public class RitualAltarBuilder extends Ritual { 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(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); } if (altarComponentsIterator.hasNext()) { @@ -72,7 +72,7 @@ public class RitualAltarBuilder extends Ritual { if (blockStack != null) { world.setBlockState(currentPos, blockStack.getState(), 3); lightning(world, currentPos); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); } break; } @@ -81,7 +81,7 @@ public class RitualAltarBuilder extends Ritual { if (blockStack != null) { world.setBlockState(currentPos, blockStack.getState(), 3); lightning(world, currentPos); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); } break; } @@ -90,7 +90,7 @@ public class RitualAltarBuilder extends Ritual { if (hasItem(tileEntity, Item.getItemFromBlock(blockStack.getBlock()), blockStack.getMeta(), true)) { world.setBlockState(currentPos, blockStack.getState(), 3); lightning(world, currentPos); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); } break; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java index 260447b2..401398cc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java @@ -161,7 +161,7 @@ public class RitualAnimalGrowth extends Ritual { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveDrain, true); } - masterRitualStone.getOwnerNetwork().syphon(totalGrowths * getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(totalGrowths * getRefreshCost())); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java index ab8516e2..f9d0d6e9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java @@ -75,7 +75,7 @@ public class RitualCobblestone extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 1ad10719..8f1a5855 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -153,7 +153,7 @@ public class RitualCrushing extends Ritual { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, willDrain, true); corrosiveWill -= willDrain; - masterRitualStone.getOwnerNetwork().syphon(lpDrain); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(lpDrain)); currentEssence -= lpDrain; isBlockClaimed = true; @@ -211,7 +211,7 @@ public class RitualCrushing extends Ritual { } world.destroyBlock(newPos, false); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); hasOperated = true; if (consumeRawWill) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java index 5f5e9be2..a28c8433 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java @@ -54,7 +54,7 @@ public class RitualCrystalHarvest extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java index 74bbdaa8..636e5806 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.ritual.types; -import java.util.function.Consumer; - +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -14,7 +13,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.BloodMagic; + +import java.util.function.Consumer; @RitualRegister("ellipsoid") public class RitualEllipsoid extends Ritual @@ -133,7 +133,7 @@ public class RitualEllipsoid extends Ritual itemHandler.extractItem(blockSlot, 1, false); tileInventory.markDirty(); //TODO: - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); k++; this.currentPos = new BlockPos(i, j, k); return; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java index 393645d2..1294ea4f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java @@ -75,7 +75,7 @@ public class RitualExpulsion extends Ritual { continue; if (teleportRandomly(player, teleportDistance)) - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * 1000); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * 1000)); } whitelist.clear(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java index ddddf20b..eae72593 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java @@ -169,7 +169,7 @@ public class RitualFeatheredKnife extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); if (totalEffects > 0 && consumeRawWill) { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawWillDrain, true); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java index 749ff388..6e1f01e1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java @@ -67,7 +67,7 @@ public class RitualFelling extends Ritual { } if (blockPosIterator.hasNext() && tileInventory != null) { - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); currentPos = blockPosIterator.next(); IItemHandler inventory = Utils.getInventory(tileInventory, EnumFacing.DOWN); placeInInventory(world.getBlockState(currentPos), world, currentPos, inventory); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java index c56ff474..0e3207bc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java @@ -141,7 +141,7 @@ public class RitualForsakenSoul extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); } /** diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java index 0b4153a6..b803b810 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java @@ -80,7 +80,7 @@ public class RitualFullStomach extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java index ccbfca81..d8cdf397 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java @@ -194,7 +194,7 @@ public class RitualGreenGrove extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(totalGrowths * getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(totalGrowths * getRefreshCost())); } public double getPlantGrowthChanceForWill(double will) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java index b04ba5b2..fed3bb5b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java @@ -62,7 +62,7 @@ public class RitualHarvest extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * harvested); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * harvested)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java index 78c89219..975f84d7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java @@ -56,7 +56,7 @@ public class RitualJumping extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index ae953425..e7e064a8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -215,7 +215,7 @@ public class RitualLava extends Ritual { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrained, true); } - masterRitualStone.getOwnerNetwork().syphon(lpDrain); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(lpDrain)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index d5047838..cbd5cd20 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -72,7 +72,7 @@ public class RitualMagnetic extends Ritual { ItemStack checkStack = state.getBlock().getPickBlock(state, null, world, newPos, null); if (isBlockOre(checkStack)) { Utils.swapLocations(world, newPos, world, replacement); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); k++; this.lastPos = new BlockPos(i, j, k); return; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java index 0abb6a48..b9dbc916 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java @@ -61,7 +61,7 @@ public class RitualMeteor extends Ritual { entityItem.setDead(); if (destructiveWill >= destructiveWillDrain && currentEssence >= 1000000000) { - masterRitualStone.getOwnerNetwork().syphon(1000000); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(1000000)); } else { masterRitualStone.setActive(false); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java index c421f794..90469c94 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java @@ -67,7 +67,7 @@ public class RitualPlacer extends Ritual { world.setBlockState(blockPos, placeState); itemHandler.extractItem(invSlot, 1, false); tileEntity.markDirty(); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); break posLoop; // Break instead of return in case we add things later } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java index e7d6b74c..2fb5001a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java @@ -77,7 +77,7 @@ public class RitualPump extends Ritual { blockPosIterator = liquidsCache.iterator(); if (blockPosIterator.hasNext()) { Pair posInfo = blockPosIterator.next(); - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); fluidHandler.fill(posInfo.getRight(), true); world.setBlockState(posInfo.getLeft(), Blocks.STONE.getDefaultState()); world.notifyBlockUpdate(posInfo.getLeft(), tankState, tankState, 3); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java index e851b8ad..1f431459 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java @@ -140,7 +140,7 @@ public class RitualRegeneration extends Ritual { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrain, true); } - masterRitualStone.getOwnerNetwork().syphon(totalCost); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(totalCost)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java index c63b3b6d..c4f7d6b1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java @@ -44,7 +44,7 @@ public class RitualWater extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index a1c96a08..8e20ebf6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -105,7 +105,7 @@ public class RitualWellOfSuffering extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(getRefreshCost() * totalEffects); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java index 780e5061..9935e162 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java @@ -67,7 +67,7 @@ public class RitualZephyr extends Ritual { } } - masterRitualStone.getOwnerNetwork().syphon(this.getRefreshCost() * Math.min(count, 100)); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * Math.min(count, 100))); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 4871b0b5..b023c5c0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -1,8 +1,17 @@ package WayofTime.bloodmagic.tile; -import java.util.ArrayList; -import java.util.List; - +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.state.IBlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -15,22 +24,10 @@ 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 WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulNetwork; -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 java.util.ArrayList; +import java.util.List; public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable { @@ -446,7 +443,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, { if (orbStack.getItem() instanceof IBloodOrb) { - if (NetworkHelper.syphonFromContainer(orbStack, requested)) + if (NetworkHelper.syphonFromContainer(orbStack, SoulTicket.item(orbStack, world, pos, requested))) { return requested; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java index 27b4e876..e10d556e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java @@ -4,13 +4,12 @@ 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 WayofTime.bloodmagic.tile.base.TileBase; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import javax.annotation.Nullable; @@ -21,7 +20,7 @@ public class TileImperfectRitualStone extends TileBase implements IImperfectRitu public boolean performRitual(World world, BlockPos pos, @Nullable ImperfectRitual imperfectRitual, EntityPlayer 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, new SoulTicket(new TextComponentTranslation(imperfectRitual.getUnlocalizedName()), imperfectRitual.getActivationCost())); + NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.block(getWorld(), getPos(), imperfectRitual.getActivationCost())); if (imperfectRitual.onActivate(this, player)) { if (imperfectRitual.isLightShow()) getWorld().addWeatherEffect(new EntityLightningBolt(getWorld(), getPos().getX(), getPos().getY() + 2, getPos().getZ(), true)); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 68f01766..510e8932 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -147,7 +147,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (ritual.activateRitual(this, activator, binding.getOwnerId())) { if (!isRedstoned() && (activator != null && !activator.capabilities.isCreativeMode)) - network.syphon(ritual.getActivationCost()); + network.syphon(ticket(ritual.getActivationCost())); if (activator != null) activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.activate"), true); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index 9a4e955e..6c1c09b5 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.TeleposeEvent; import WayofTime.bloodmagic.teleport.TeleportQueue; @@ -75,7 +76,7 @@ public class TileTeleposer extends TileInventory implements ITickable { final int focusLevel = (getStackInSlot(0).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.getSoulNetwork(binding).syphonAndDamage(PlayerHelper.getPlayerFromUUID(binding.getOwnerId()), lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1))) { + if (NetworkHelper.getSoulNetwork(binding).syphonAndDamage(PlayerHelper.getPlayerFromUUID(binding.getOwnerId()), SoulTicket.block(world, pos, lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1))).isSuccess()) { int blocksTransported = 0; for (int i = -(focusLevel - 1); i <= (focusLevel - 1); i++) { @@ -89,7 +90,7 @@ public class TileTeleposer extends TileInventory implements ITickable { } } - NetworkHelper.syphonFromContainer(focusStack, lpToBeDrained * blocksTransported); + NetworkHelper.syphonFromContainer(focusStack, SoulTicket.item(focusStack, world, pos, lpToBeDrained * blocksTransported)); List originalWorldEntities; List focusWorldEntities; diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index dbd07fc5..bd79a435 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -98,7 +98,7 @@ public class NetworkHelper { * @param user - User of the item. * @param toSyphon - Amount of LP to syphon * @return - Whether the action should be performed. - * @deprecated Use {@link #getSoulNetwork(EntityPlayer)} and {@link SoulNetwork#syphonAndDamage(EntityPlayer, SoulTicket)} + * @deprecated Use {@link #getSoulNetwork(EntityPlayer)} and {@link SoulNetwork#syphonAndDamage$(EntityPlayer, SoulTicket)} */ @Deprecated public static boolean syphonAndDamage(SoulNetwork soulNetwork, EntityPlayer user, int toSyphon) { @@ -116,10 +116,10 @@ public class NetworkHelper { * Syphons a player from within a container. * * @param stack - ItemStack in the Container. - * @param toSyphon - Amount of LP to syphon + * @param ticket - SoulTicket to syphon * @return - If the syphon was successful. */ - public static boolean syphonFromContainer(ItemStack stack, int toSyphon) + public static boolean syphonFromContainer(ItemStack stack, SoulTicket ticket) { if (!(stack.getItem() instanceof IBindable)) return false; @@ -129,9 +129,9 @@ public class NetworkHelper { return false; SoulNetwork network = getSoulNetwork(binding); - SoulNetworkEvent.Syphon.Item event = new SoulNetworkEvent.Syphon.Item(network, new SoulTicket(toSyphon), stack); + SoulNetworkEvent.Syphon.Item event = new SoulNetworkEvent.Syphon.Item(network, ticket, stack); - return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.getTicket(), true) >= toSyphon; + return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.getTicket(),true) >= ticket.getAmount(); } /** From d30dcf1ae5d05f06cd007aeb6bf33cd7ffe89c44 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Wed, 8 Aug 2018 00:48:01 +0200 Subject: [PATCH 321/595] Sentient Sword to not attack players unless provoked/auto attack mobs (#1381) * Should close #1121 Not tested (yet) (because I haven't figured out how to launch the server with a fake player entity... yet). * will close #1121 Tested. Specters only attack players if they attack the owner or the specter. Spectres now autoattack every instance of EntityMob in range. //TODO: (fluff) make Bow Specter change angle based on target position (it currently always looks like it shoots into the ground) --- .../bloodmagic/entity/mob/EntitySentientSpecter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 1b13122c..c69b1e76 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -19,6 +19,7 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.*; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityTippedArrow; import net.minecraft.init.Enchantments; @@ -67,7 +68,7 @@ public class EntitySentientSpecter extends EntityDemonBase { this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); - this.targetTasks.addTask(3, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); + this.targetTasks.addTask(3, new EntityAINearestAttackableTarget<>(this, EntityMob.class, true)); this.targetTasks.addTask(4, new EntityAIHurtByTargetIgnoreTamed(this, false)); @@ -384,10 +385,9 @@ public class EntitySentientSpecter extends EntityDemonBase { @Override public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) { - return super.shouldAttackEntity(attacker, owner); - } else { + return super.shouldAttackEntity(attacker, owner); + } return false; - } } @Override From daa52f4d3d176963b7d780691310246e1575a7f6 Mon Sep 17 00:00:00 2001 From: "Urey. Xue" Date: Wed, 8 Aug 2018 06:52:11 +0800 Subject: [PATCH 322/595] Corrections of manual translation (#1386) * Update zh_CN.lang of blood magic guide * Clarification * Clarification on Laputa Shard * "Messagner" -> "Child" * More fix * Correct some misintepretations --- src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang index 5cb7ba38..37b61615 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang @@ -191,7 +191,7 @@ guide.bloodmagic.entry.architect.mimic.info.1=æ‹Ÿæ€æ˜¯ä¸€ç§å¯ä»¥æ¨¡ä»¿ä»»æ„ 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.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=众所周知,三级祭å›çš„结构中,四角的柱å­é¡¶éƒ¨éœ€è¦å››å—æ¥è‡ªä¸‹ç•Œçš„è§çŸ³ã€‚但有一个鲜为人知的事实:这四å—è§çŸ³å¯ä»¥ç”¨æµ·æ™¶ç¯ä»£æ›¿ã€‚如果地狱对你æ¥è¯´å¤ªè¿‡é¥è¿œï¼Œä½†ä½ å·²ç»æ‰¾åˆ°äº†æµ·æ´‹ç¥žæ®¿ï¼Œä½ å¯ä»¥é€šè¿‡è¿™ä¸ªæ–¹å¼æ¥æŽ¨è¿›ä½ çš„血魔法进程。 @@ -233,7 +233,7 @@ guide.bloodmagic.entry.demon.routing.info=血魔法的物å“传逿˜¯ä»¥æ¶é­” 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.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=你需è¦ä¸€ä¸ªæµ‹é‡ä»ªæ¥æµ‹å®šçµåŸŸä¸­çš„æ¶é­”æ„志浓度。åªéœ€è¦ä¸€ç›´æ”¾åœ¨ä½ çš„背包中,测é‡ä»ªä¾¿å¯å°†æµ“åº¦ä»¥äº”ä¸ªæŒ‡ç¤ºå™¨çš„å½¢å¼æ˜¾ç¤ºå‡ºæ¥ï¼ˆåœ¨å±å¹•左上角)。潜行时你还能得知具体数é‡ï¼Œä½†è¿™ä¸ªç»“果是ç»è¿‡å››èˆäº”入的。 From ce46de0d0a3dabaae2df3b939d7601ec5de478ce Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Wed, 8 Aug 2018 00:59:09 +0200 Subject: [PATCH 323/595] Fixed Crystal Cluster behavior. (#1390) * Players in creative mode can now add crystals to crystal blocks by right clicking them with an item demon crystal. Crystal block texture now updates on the next tick. The render update is only called when a new crystal has been added (by natural or unnatural means). Adding a crystal imitates a positive result of checkAndGrowCrystal() closes #1151 * fixed conditional to allow harvesting crystals if not in creative and holding crystal --- .../bloodmagic/block/BlockDemonCrystal.java | 30 +++++++++++++------ .../bloodmagic/tile/TileDemonCrystal.java | 15 +++++----- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 489e77ca..61b7073c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -2,6 +2,7 @@ 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; @@ -28,7 +29,6 @@ import net.minecraft.world.World; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.Random; public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvider { public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 6); @@ -48,17 +48,29 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - if (world.isRemote) - return true; + 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; - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileDemonCrystal) { - TileDemonCrystal crystal = (TileDemonCrystal) tile; + if (PlayerDemonWillHandler.getTotalDemonWill(EnumDemonWillType.DEFAULT, player) > 1024 && !(holdsCrystal && isCreative)) { + crystal.dropSingleCrystal(); - if (PlayerDemonWillHandler.getTotalDemonWill(EnumDemonWillType.DEFAULT, player) > 1024) - 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; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index 392b3ebf..d856cc42 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -1,17 +1,16 @@ package WayofTime.bloodmagic.tile; -import net.minecraft.block.state.IBlockState; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; 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.state.IBlockState; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.MathHelper; public class TileDemonCrystal extends TileTicking { @@ -36,6 +35,8 @@ public class TileDemonCrystal extends TileTicking { if (getWorld().isRemote) { + if(internalCounter % 20 == 0) + getWorld().markBlockRangeForRenderUpdate(pos, pos); return; } From e8ad057662bb1a195e3a4a9aad80f84b48f740c3 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Wed, 8 Aug 2018 01:02:22 +0200 Subject: [PATCH 324/595] Added RitualReader/Ritual Tinkerer to creative tab (#1393) --- src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index cdabfa3a..b6f7297d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -38,6 +38,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { super(); setUnlocalizedName(BloodMagic.MODID + ".ritualReader"); setMaxStackSize(1); + setCreativeTab(BloodMagic.TAB_BM); } @Override From 7954d04421d25a69203c32c9ca30e7f12987bcec Mon Sep 17 00:00:00 2001 From: KohaiKhaos Date: Tue, 7 Aug 2018 18:24:41 -0500 Subject: [PATCH 325/595] Fixed a null pointer exception with certain modded blocks with the Ritual of Magnetism (#1380) * Replaced a null RayTraceResult in Magnetism Ritual with a real one * Added a fake player to the code. No more passing nulls. --- .../bloodmagic/ritual/types/RitualMagnetic.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index cbd5cd20..8d9a662c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -7,9 +7,14 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.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.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; + import java.util.function.Consumer; @@ -18,6 +23,7 @@ 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"); @@ -28,6 +34,7 @@ public class RitualMagnetic extends Ritual { @Override public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); + Vec3d MRSpos = new Vec3d(masterRitualStone.getBlockPos()); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); if (currentEssence < getRefreshCost()) { @@ -68,8 +75,10 @@ public class RitualMagnetic extends Ritual { while (i <= radius) { while (k <= radius) { BlockPos newPos = pos.add(i, j, k); + Vec3d newPosVector = new Vec3d(newPos); IBlockState state = world.getBlockState(newPos); - ItemStack checkStack = state.getBlock().getPickBlock(state, null, world, newPos, null); + RayTraceResult fakeRayTrace = world.rayTraceBlocks(MRSpos, newPosVector, false); + ItemStack checkStack = state.getBlock().getPickBlock(state, fakeRayTrace, world, newPos, getFakePlayer((WorldServer) world)); if (isBlockOre(checkStack)) { Utils.swapLocations(world, newPos, world, replacement); masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); @@ -134,6 +143,10 @@ public class RitualMagnetic extends Ritual { return new RitualMagnetic(); } + private FakePlayer getFakePlayer(WorldServer 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; From ebfd8ce9a3a22da0b31cd1093a53c5db031856f0 Mon Sep 17 00:00:00 2001 From: KohaiKhaos Date: Tue, 7 Aug 2018 18:28:55 -0500 Subject: [PATCH 326/595] Several mimic fixes, with actually cleaned up commit history. (#1379) * Reimplemented a lot of mimic logic and did a first run of changing how mimics store their states. * Finished removing all metadata calls for blocks replaced by mimics. * Update EntityMimic.java * Update ItemBlockMimic.java * Update TileMimic.java * How did I even replace a semicolon with a slash. * Changed all tabs to 4 spaces. Changed Serializer to StateUtil * Fixed spacing again, hopefully for the last time --- .../api/impl/BloodMagicCorePlugin.java | 32 +--- .../bloodmagic/block/BlockMimic.java | 15 +- .../bloodmagic/entity/mob/EntityMimic.java | 15 +- .../bloodmagic/item/block/ItemBlockMimic.java | 144 ++++++++++++++++++ .../WayofTime/bloodmagic/tile/TileMimic.java | 47 ++++-- .../WayofTime/bloodmagic/util/StateUtil.java | 37 +++++ 6 files changed, 238 insertions(+), 52 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java create mode 100644 src/main/java/WayofTime/bloodmagic/util/StateUtil.java diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 633e2a40..3a0d0164 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -15,6 +15,7 @@ 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.properties.IProperty; import net.minecraft.block.state.BlockStateContainer; @@ -116,7 +117,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin if (blockData.length > 1) { // We have properties listed, so let's build a state. - api.getBlacklist().addTeleposer(parseState(value)); + api.getBlacklist().addTeleposer(StateUtil.parseState(value)); continue; } @@ -136,7 +137,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin if (blockData.length > 1) { // We have properties listed, so let's build a state. - api.getBlacklist().addTeleposer(parseState(value)); + api.getBlacklist().addTeleposer(StateUtil.parseState(value)); continue; } @@ -152,29 +153,4 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin api.getBlacklist().addWellOfSuffering(entityEntry.getRegistryName()); } } - - private static IBlockState parseState(String blockInfo) - { - String[] split = blockInfo.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])); // Find the block - if (block == Blocks.AIR) - return Blocks.AIR.getDefaultState(); // The block is air, so we're looking at invalid data - - BlockStateContainer blockState = block.getBlockState(); - IBlockState 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("="); // Separates property and value - IProperty property = blockState.getProperty(valueSplit[0]); - if (property != null) - returnState = returnState.withProperty(property, (Comparable) property.parseValue(valueSplit[1]).get()); // Force the property into the state - } - - return returnState; - } -} +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 33e6cb94..b0feb7eb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -8,6 +8,7 @@ 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.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -59,7 +60,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent if (mimicBlock == Blocks.AIR) { return FULL_BLOCK_AABB; } - IBlockState mimicState = mimicBlock.getStateFromMeta(tileMimic.metaOfReplacedBlock); + IBlockState mimicState = tileMimic.getReplacedState(); if (mimicBlock != this) { return mimicState.getCollisionBoundingBox(world, pos); } @@ -82,7 +83,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent if (mimicBlock == Blocks.AIR) { return FULL_BLOCK_AABB; } - IBlockState mimicState = mimicBlock.getStateFromMeta(tileMimic.getStackInSlot(0).getItemDamage()); + IBlockState mimicState = tileMimic.getReplacedState(); if (mimicBlock != this) { return mimicState.getSelectedBoundingBox(world, pos); } @@ -136,7 +137,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent ItemStack stack = mimic.getStackInSlot(0); if (stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); - IBlockState mimicState = block.getStateFromMeta(stack.getItemDamage()); + IBlockState mimicState = mimic.getReplacedState(); if (block != this) { if (block.getRenderType(mimicState) == EnumBlockRenderType.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) @@ -208,7 +209,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent if (stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); if (block instanceof IAltarComponent) { - return ((IAltarComponent) block).getType(world, block.getStateFromMeta(mimic.metaOfReplacedBlock), pos); + return ((IAltarComponent) block).getType(world, mimic.getReplacedState(), pos); } else { for (ComponentType altarComponent : ComponentType.values()) if (block == Utils.getBlockForComponent(altarComponent)) @@ -218,4 +219,10 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } return null; } + + @Override + public ItemBlock getItem() { + return new ItemBlockMimic(this); + } + } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index 0661115a..54e39197 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -4,6 +4,7 @@ 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.state.IBlockState; import net.minecraft.entity.EntityLivingBase; @@ -12,6 +13,7 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.*; import net.minecraft.entity.monster.EntityIronGolem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; import net.minecraft.init.SoundEvents; import net.minecraft.inventory.EntityEquipmentSlot; @@ -39,6 +41,7 @@ public class EntityMimic extends EntityDemonBase { public boolean dropItemsOnBreak = true; public NBTTagCompound tileTag = new NBTTagCompound(); public int metaOfReplacedBlock = 0; + public IBlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); public int playerCheckRadius = 5; public EntityMimic(World worldIn) { @@ -67,6 +70,7 @@ public class EntityMimic extends EntityDemonBase { tag.setTag("tileTag", tileTag); tag.setInteger("metaOfReplacedBlock", metaOfReplacedBlock); tag.setInteger("playerCheckRadius", playerCheckRadius); + tag.setString("stateOfReplacedBlock", stateOfReplacedBlock.toString()); } @Override @@ -77,6 +81,7 @@ public class EntityMimic extends EntityDemonBase { tileTag = tag.getCompoundTag("tileTag"); metaOfReplacedBlock = tag.getInteger("metaOfReplacedBlock"); playerCheckRadius = tag.getInteger("playerCheckRadius"); + stateOfReplacedBlock = StateUtil.parseState(tag.getString("stateOfReplacedBlock")); } public ItemStack getMimicItemStack() { @@ -88,7 +93,7 @@ public class EntityMimic extends EntityDemonBase { } public boolean spawnHeldBlockOnDeath(World world, BlockPos pos) { - return world.isAirBlock(pos) && TileMimic.replaceMimicWithBlockActual(world, pos, getMimicItemStack(), tileTag, metaOfReplacedBlock); + return world.isAirBlock(pos) && TileMimic.replaceMimicWithBlockActual(world, pos, getMimicItemStack(), tileTag, stateOfReplacedBlock); } public boolean spawnMimicBlockAtPosition(World world, BlockPos pos) { @@ -98,7 +103,7 @@ public class EntityMimic extends EntityDemonBase { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileMimic) { TileMimic mimic = (TileMimic) tile; - mimic.metaOfReplacedBlock = metaOfReplacedBlock; + mimic.setReplacedState(this.stateOfReplacedBlock); mimic.tileTag = tileTag; mimic.setInventorySlotContents(0, getMimicItemStack()); mimic.dropItemsOnBreak = dropItemsOnBreak; @@ -111,11 +116,11 @@ public class EntityMimic extends EntityDemonBase { return false; } - public void initializeMimic(ItemStack heldStack, NBTTagCompound tileTag, boolean dropItemsOnBreak, int metaOfReplacedBlock, int playerCheckRadius, BlockPos homePosition) { + public void initializeMimic(ItemStack heldStack, NBTTagCompound tileTag, boolean dropItemsOnBreak, IBlockState stateOfReplacedBlock, int playerCheckRadius, BlockPos homePosition) { this.setMimicItemStack(heldStack); this.tileTag = tileTag; this.dropItemsOnBreak = dropItemsOnBreak; - this.metaOfReplacedBlock = metaOfReplacedBlock; + this.stateOfReplacedBlock = stateOfReplacedBlock; this.playerCheckRadius = playerCheckRadius; this.setHomePosAndDistance(homePosition, 2); //TODO: Save this. } @@ -319,4 +324,4 @@ public class EntityMimic extends EntityDemonBase { super(spider, classTarget, true); } } -} \ No newline at end of file +} diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java new file mode 100644 index 00000000..7963d0f8 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java @@ -0,0 +1,144 @@ +package WayofTime.bloodmagic.item.block; + +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import WayofTime.bloodmagic.block.BlockMimic; +import WayofTime.bloodmagic.tile.TileMimic; +import WayofTime.bloodmagic.block.base.BlockEnum; +import WayofTime.bloodmagic.item.block.base.ItemBlockEnum; + +import WayofTime.bloodmagic.util.ChatUtil; + +public class ItemBlockMimic extends ItemBlockEnum +{ + public ItemBlockMimic(BlockEnum block) + { + super(block); + setHasSubtypes(true); + } + + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing 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 + IBlockState replacedBlockstate = world.getBlockState(pos); + Block replacedBlock = replacedBlockstate.getBlock(); + ItemStack replacedStack = replacedBlock.getItem(world, pos, replacedBlockstate); + + //Get the state for the mimic + IBlockState 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 EnumActionResult.FAIL; + } + + //If tile can be replaced, store info about the tile + NBTTagCompound tileTag = getTagFromTileEntity(tileReplaced); + if (tileReplaced != null) + { + NBTTagCompound voidTag = new NBTTagCompound(); + voidTag.setInteger("x", pos.getX()); + voidTag.setInteger("y", pos.getY()); + voidTag.setInteger("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 EnumActionResult.SUCCESS; + } + + return EnumActionResult.FAIL; + + } + + public boolean canReplaceTile(TileEntity tile) + { + if (tile instanceof TileEntityChest) + { + return true; + } + + return tile == null; + } + + public boolean canReplaceBlock(World world, BlockPos pos, IBlockState state) { + return state.getBlockHardness(world, pos) != -1.0F; + } + + public NBTTagCompound getTagFromTileEntity(TileEntity tile) + { + NBTTagCompound tag = new NBTTagCompound(); + + 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/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index 1076ba17..11b80f2e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -6,10 +6,12 @@ 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.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityPotion; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryHelper; @@ -39,8 +41,8 @@ public class TileMimic extends TileInventory implements ITickable { public boolean dropItemsOnBreak = true; public NBTTagCompound tileTag = new NBTTagCompound(); public TileEntity mimicedTile = null; - public int metaOfReplacedBlock = 0; - + IBlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); + public int playerCheckRadius = 5; public int potionSpawnRadius = 5; public int potionSpawnInterval = 40; @@ -134,6 +136,13 @@ public class TileMimic extends TileInventory implements ITickable { return false; Utils.insertItemToTile(this, player, 0); + ItemStack stack = getStackInSlot(0); + if(stateOfReplacedBlock == Blocks.AIR.getDefaultState()) { + if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { + Block block = ((ItemBlock) stack.getItem()).getBlock(); + stateOfReplacedBlock = block.getDefaultState(); + } + } this.refreshTileEntity(); if (player.capabilities.isCreativeMode) { @@ -220,7 +229,7 @@ public class TileMimic extends TileInventory implements ITickable { EntityMimic mimicEntity = new EntityMimic(getWorld()); mimicEntity.setPosition(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - mimicEntity.initializeMimic(getStackInSlot(0), tileTag, dropItemsOnBreak, metaOfReplacedBlock, playerCheckRadius, pos); + mimicEntity.initializeMimic(getStackInSlot(0), tileTag, dropItemsOnBreak, stateOfReplacedBlock, playerCheckRadius, pos); tileTag = null; mimicedTile = null; this.setInventorySlotContents(0, ItemStack.EMPTY); @@ -239,7 +248,7 @@ public class TileMimic extends TileInventory implements ITickable { if (mimicedTile != null) { dropMimicedTileInventory(); } - mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, metaOfReplacedBlock); + mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, stateOfReplacedBlock); } @Override @@ -248,8 +257,8 @@ public class TileMimic extends TileInventory implements ITickable { dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); tileTag = tag.getCompoundTag("tileTag"); - metaOfReplacedBlock = tag.getInteger("metaOfReplacedBlock"); - mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, metaOfReplacedBlock); + stateOfReplacedBlock = StateUtil.parseState(tag.getString("stateOfReplacedBlock")); + mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, stateOfReplacedBlock); playerCheckRadius = tag.getInteger("playerCheckRadius"); potionSpawnRadius = tag.getInteger("potionSpawnRadius"); potionSpawnInterval = Math.max(1, tag.getInteger("potionSpawnInterval")); @@ -261,10 +270,10 @@ public class TileMimic extends TileInventory implements ITickable { tag.setBoolean("dropItemsOnBreak", dropItemsOnBreak); tag.setTag("tileTag", tileTag); - tag.setInteger("metaOfReplacedBlock", metaOfReplacedBlock); tag.setInteger("playerCheckRadius", playerCheckRadius); tag.setInteger("potionSpawnRadius", potionSpawnRadius); tag.setInteger("potionSpawnInterval", potionSpawnInterval); + tag.setString("stateOfReplacedBlock",stateOfReplacedBlock.toString()); return tag; } @@ -284,6 +293,14 @@ public class TileMimic extends TileInventory implements ITickable { } } + public IBlockState getReplacedState() { + return stateOfReplacedBlock; + } + + public void setReplacedState(IBlockState state) { + stateOfReplacedBlock = state; + } + @Override public boolean isItemValidForSlot(int slot, ItemStack itemstack) { return slot == 0 && dropItemsOnBreak; @@ -293,13 +310,13 @@ public class TileMimic extends TileInventory implements ITickable { World world = mimic.getWorld(); BlockPos pos = mimic.getPos(); - replaceMimicWithBlockActual(world, pos, mimic.getStackInSlot(0), mimic.tileTag, mimic.metaOfReplacedBlock); + replaceMimicWithBlockActual(world, pos, mimic.getStackInSlot(0), mimic.tileTag, mimic.stateOfReplacedBlock); } - - public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, int replacedMeta) { + + public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, IBlockState replacementState) { if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); - IBlockState state = block.getStateFromMeta(replacedMeta); + IBlockState state = replacementState; if (world.setBlockState(pos, state, 3)) { TileEntity tile = world.getTileEntity(pos); if (tile != null) { @@ -317,10 +334,10 @@ public class TileMimic extends TileInventory implements ITickable { } @Nullable - public static TileEntity getTileFromStackWithTag(World world, BlockPos pos, ItemStack stack, @Nullable NBTTagCompound tag, int replacementMeta) { + public static TileEntity getTileFromStackWithTag(World world, BlockPos pos, ItemStack stack, @Nullable NBTTagCompound tag, IBlockState replacementState) { if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); - IBlockState state = block.getStateFromMeta(stack.getItemDamage()); + IBlockState state = replacementState; if (block.hasTileEntity(state)) { TileEntity tile = block.createTileEntity(world, state); @@ -338,7 +355,7 @@ public class TileMimic extends TileInventory implements ITickable { tile.setWorld(world); try { - _blockMetadata.setInt(tile, replacementMeta); + _blockMetadata.setInt(tile, block.getMetaFromState(replacementState)); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } @@ -349,4 +366,4 @@ public class TileMimic extends TileInventory implements ITickable { return null; } -} \ 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 new file mode 100644 index 00000000..03dce756 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/StateUtil.java @@ -0,0 +1,37 @@ +package WayofTime.bloodmagic.util; + +import net.minecraft.block.Block; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.ForgeRegistries; + +public class StateUtil +{ + public static IBlockState parseState(String blockInfo) + { + String[] split = blockInfo.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])); // Find the block + if (block == Blocks.AIR) + return Blocks.AIR.getDefaultState(); // The block is air, so we're looking at invalid data + + BlockStateContainer blockState = block.getBlockState(); + IBlockState 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("="); // Separates property and value + IProperty property = blockState.getProperty(valueSplit[0]); + if (property != null) + returnState = returnState.withProperty(property, (Comparable) property.parseValue(valueSplit[1]).get()); // Force the property into the state + } + + return returnState; + } +} \ No newline at end of file From 4941d0b361a158e0d160f9a2aa058d36391b6a11 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Wed, 8 Aug 2018 01:45:15 +0200 Subject: [PATCH 327/595] Language files en_US -> de_DE (FINISHED), minor language file edits (#1321) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixed downgrade level inconsistency * Squashed commit of the following: commit 7263e6fbc2a3411167a10fa7a931fb9a74832286 Author: PiscesdanAT <40119554+PiscesdanAT@users.noreply.github.com> Date: Sat Jun 9 18:01:30 2018 +0200 Update de_DE.lang (#1337) Someone mixed up dusk and dawn Updated de_DE.lang Added some missing stuff in en_US.lang * Update en_US.lang Fixed the typo I inserted with previous commit. * bloodmagic/.../de_DE.lang * more fitting translations bloodmagicguide/.../de_DE.lang * 1/3 finished .. en_US.lang Whitespaces Signed-off-by: Iorce * bloodmagic/.../de_DE.lang: - improved translations - again bloodmagicguide/.../en_US: - mudpack -> modpack (someone doesn't like them, it seems) - wares off -> wears off (Typo) bloodmagicguide/.../de_DE: - another batch of translations Signed-off-by: Iorce * bloodmagic/.../de_DE.lang: - improved translations - again bloodmagicguide/.../en_US: - mudpack -> modpack (someone doesn't like them, it seems) - wares off -> wears off (Typo) bloodmagicguide/.../de_DE: - another batch of translations - finished the "Ritual Master" Signed-off-by: Iorce * bloodmagic/.../de_DE.lang: - improved translations - a bit more literal for some while keeping variety (Suppression and Displacement can have the same translation) bloodmagicguide/.../de_DE: - translated architect entry texts / titles * bloodmagicguide/.../en_US.lang: consistency (was Sacrificial Knife, every occurrence of that item is now called "Sacrifical Dagger" bloodmagicguide/.../de_DE.lang: some more.... * bloodmagicguide/.../en_US.lang: corrected required Blood Altar tier from "greater than" to "greater than or equal to" bloodmagicguide/.../de_DE.lang: some more.... * bloodmagicguide/.../en_US.lang: added clarification for Incense Altar block range bloodmagicguide/.../de_DE.lang: changed "Wahrheitssiegel" to "Siegel der Weissagung" changed "Weihrauchaltar" to "Räucheraltar" some more.... * bloodmagicguide/.../en_US.lang: clarification for Sigil of the Fast Miner entry ("and" -> "at") bloodmagicguide/.../de_DE.lang: some more.... * bloodmagicguide/.../de_DE.lang: some more.... * Changed "Blutorb" to "Blutkugel" in translation. Might have missed some cases of severe german grammar. bloodmagicguide/.../en_US.lang: Removed a "my", if someone misses it, it myght be readded. bloodmagicguide/.../de_DE.lang: some more.... * long overdue: closes #1320 (the disorient thing that nobody cares about) bloodmagicguide/.../en_US.lang: people are now less warry and more wary about sentient mimics. bloodmagicguide/.../de_DE.lang: some more.... (just the mimic stuff, since I commit after every typo I fix :o ) * bloodmagicguide/.../de_DE.lang: some more.... Completed "The Architect" * bloodmagic/.../de_DE.lang: Leere Tafel -> Leere Schiefertafel (material clarification, remaining names unchanged to keep the names short) Rudimentäre Falle -> [...] Schlinge (item icon looks like the latter, word has multiple meanings) Ansammlung Kristalle [...] -> Kirstallansammlung (easier on the tongue, better text flow) bloodmagicguide/.../en_US.lang: fixed mistake in textflow bloodmagicguide/.../de_DE.lang: some more.... * bloodmagic/.../de_DE.lang: clarification Haupt- -> Meister bloodmagicguide/.../de_DE.lang: some more.... bloodmagicguide/.../en_US.lang: Updated entry to reflect the new mechanic for creating pure will types * bloodmagic/.../de_DE.lang: Ansammlung -> Gruppe bloodmagicguide/.../de_DE.lang: finished! bloodmagicguide/.../en_US.lang: fixed ritual name * Finalized de_DE.lang Ätzend -> Korrosiv Contains: -> Enthält: * Finalized de_DE.lang ätzend -> korrosiv * Update de_DE.lang * Update de_DE.lang Drained -> Verbraucht Item -> Gegenstand * Update de_DE.lang Knoten-Router -> Netzknoten-Router * Update de_DE.lang Changed the base names for demonic Will to "Willpower" -> clarification for the user that the residue is actualy willpower and the quality of said will is a measure of the potential -> not changing other occurrences or notions in the book as no sane person would repeat "willpower" at every occasion. * Applied quick fixes to de_DE.lang * Merge me! reverted a whitespace change in gradle.properties (no idea where that came from) and moved the disorient thingy to another PR) * Take No.2 at fixing whitespaces. * TAKE NO.3 (HOPEFULLY FINAL TAKE) --- .../assets/bloodmagic/lang/de_DE.lang | 674 ++++++++++++++++-- .../assets/bloodmagic/lang/en_US.lang | 18 +- .../assets/bloodmagicguide/lang/de_DE.lang | 270 +++++++ .../assets/bloodmagicguide/lang/en_US.lang | 23 +- 4 files changed, 920 insertions(+), 65 deletions(-) create mode 100644 src/main/resources/assets/bloodmagicguide/lang/de_DE.lang diff --git a/src/main/resources/assets/bloodmagic/lang/de_DE.lang b/src/main/resources/assets/bloodmagic/lang/de_DE.lang index 7417685a..d4d8ce84 100644 --- a/src/main/resources/assets/bloodmagic/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagic/lang/de_DE.lang @@ -34,18 +34,18 @@ 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 Tafel +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=Schwacher Blutorb -item.bloodmagic.orb.apprentice.name=Blutorb des Lehrlings -item.bloodmagic.orb.magician.name=Blutorb des Magiers -item.bloodmagic.orb.master.name=Blutorb des Meisters -item.bloodmagic.orb.archmage.name=Blutorb des Erzmagiers -item.bloodmagic.orb.transcendent.name=Transzendenter Blutorb +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 @@ -70,74 +70,150 @@ item.bloodmagic.baseComponent.reagentWater.name=Wasserreagenz item.bloodmagic.baseComponent.reagentLava.name=Lavareagenz item.bloodmagic.baseComponent.reagentAir.name=Luftreagenz item.bloodmagic.baseComponent.reagentFastMiner.name=Reagenz der Eile -item.bloodmagic.baseComponent.reagentVoid.name=reagenz der Leere +item.bloodmagic.baseComponent.reagentVoid.name=Reagenz der Leere item.bloodmagic.baseComponent.reagentGrowth.name=Wachstumsreagenz item.bloodmagic.baseComponent.reagentAffinity.name=Reagenz der elementaren Verbundenheit item.bloodmagic.baseComponent.reagentSight.name=Sichtreagenz item.bloodmagic.baseComponent.reagentBinding.name=Bindendes Reagenz -item.bloodmagic.baseComponent.reagentSuppression.name=Unterdrückendes Reagenz +item.bloodmagic.baseComponent.reagentSuppression.name=Verdrängendes Reagenz +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.monsterSoul.base.name=Dämonischer Wille +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.monsterSoul.base.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.bloodLight.name=Siegel der Blutlampe item.bloodmagic.sigil.compression.name=Siegel der Kompression -item.bloodmagic.sigil.divination.name=Wahrheitssiegel +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.greenGrove.name=Siegel des Grünen Hains +item.bloodmagic.sigil.greenGrove.name=Siegel des grünen Hains item.bloodmagic.sigil.elementalAffinity.name=Siegel der elementaren Verbundenheit item.bloodmagic.sigil.haste.name=Siegel der Hast -item.bloodmagic.sigil.suppression.name=Siegel der Unterdrückung +item.bloodmagic.sigil.suppression.name=Siegel der Verdrängung item.bloodmagic.sigil.magnetism.name=Siegel des Magnetismus item.bloodmagic.sigil.fastMiner.name=Siegel des Eile -item.bloodmagic.sigil.seer.name=Siegel der Sicht +item.bloodmagic.sigil.seer.name=Siegel des Sehers item.bloodmagic.sigil.phantomBridge.name=Siegel der Phantombrücke item.bloodmagic.sigil.whirlwind.name=Siegel des Wirbelwindes item.bloodmagic.sigil.enderSeverance.name=Siegel des Endertrennens +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.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.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=Thesis zur Verbesserung lebender Rüstung +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=Intelligentes Schwert + +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 Falle -item.bloodmagic.sentientBow.name=Intelligenter Bogen +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.stone.ritual.master.name=Haupt-Ritualstein +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.rune.blank.name=Blutrune +tile.bloodmagic.alchemyArray.name=&r&fAlchemische 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.selfSacrifice.name=Rune der Selbstopferung -tile.bloodmagic.rune.displacement.name=Rune der Deplazierung +tile.bloodmagic.rune.displacement.name=Rune der Verlagerung tile.bloodmagic.rune.capacity.name=Kapazitätsrune tile.bloodmagic.rune.augCapacity.name=Rune der erweiterten Kapazität -tile.bloodmagic.rune.orb.name=Orbrune +tile.bloodmagic.rune.orb.name=Rune der Blutkugel tile.bloodmagic.rune.acceleration.name=Beschleunigungsrune -tile.bloodmagic.rune.charging.name=Laderune +tile.bloodmagic.rune.charging.name=Aufladungsrune tile.bloodmagic.ritualStone.blank.name=Ritualstein tile.bloodmagic.ritualStone.water.name=Wasserritualstein @@ -154,15 +230,159 @@ tile.bloodmagic.crystal.brick.name=Kristallklumpenziegel tile.bloodmagic.bloodLight.name=Blutlampe tile.bloodmagic.spectralBlock.name=Spektralblock tile.bloodmagic.phantomBlock.name=Phantomblock +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 # 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=Ausbaustufe: %d +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 @@ -174,6 +394,9 @@ tooltip.bloodmagic.sigil.divination.desc=&oSpähe in die Seele 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®! @@ -191,18 +414,28 @@ 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.phantomBridge.desc=&oLaufen auf dünner Luft... tooltip.bloodmagic.sigil.whirlwind.desc=&oBesser keinen Rock tragen -tooltip.bloodmagic.sigil.enderSeverance.desc=&oBringt Enderman in Notlage +tooltip.bloodmagic.sigil.enderSeverance.desc=&oBringt Endermen in Notlage +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.bound.sword.desc=&oErlegen der Schwachen -tooltip.bloodmagic.bound.pickaxe.desc=&oZerstören von Stein ohne Erbarmen +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 an der Wand. +tooltip.bloodmagic.inscriber.desc=Die Zeichen sind an der Wand... tooltip.bloodmagic.pack.selfSacrifice.desc=Es scheuert richtig... tooltip.bloodmagic.pack.sacrifice.desc=Beschreibung @@ -222,30 +455,75 @@ 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.weak=Benutzt, um Blöcke zu verschieben -tooltip.bloodmagic.telepositionFocus.enhanced=Benutzt, um Blöcke zu verschieben -tooltip.bloodmagic.telepositionFocus.reinforced=Benutzt, um Blöcke zu verschieben +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=Giftungsresistenz +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 @@ -253,25 +531,219 @@ tooltip.bloodmagic.soulGem.greater=Ein Juwel, das eine größere Menge an Willen 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 gefiederten Klinge +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 Bauches +ritual.bloodmagic.fullStomachRitual=Ritual des gefüllten Magens ritual.bloodmagic.interdictionRitual=Ritual der Verbietung -ritual.bloodmagic.containmentRitual=Ritual des Einschlusses +ritual.bloodmagic.containmentRitual=Ritual der Eindämmung ritual.bloodmagic.speedRitual=Ritual der Geschwindigkeit -ritual.bloodmagic.suppressionRitual=Ritual der Unterdrückung +ritual.bloodmagic.suppressionRitual=Ritual der Verdrängung ritual.bloodmagic.expulsionRitual=Aura der Vertreibung -ritual.bloodmagic.zephyrRitual=Ruf des Zephir +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.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.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... # Chat chat.bloodmagic.altarMaker.setTier=Setze Ausbaustufe auf: %d @@ -286,25 +758,141 @@ 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.newUpgrade=Upgrade erworben! +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. + +# 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.404=Befehl nicht gefunden! +commands.bloodmagic.error.unknown=Unbekannter Befehl! +commands.bloodmagic.error.perm=Du hast keine Berechtigung, diesen Befehl zu nutzen! + +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=Erfolgreich gebunden +commands.bloodmagic.bind.remove.success=Bindung erfolgreich entfernt + +commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] Spieler [tier] +commands.bloodmagic.orb.help=Setzt oder zeigt die Blutkugel-Ausbaustufe des Spielers. + +commands.bloodmagic.bind.usage=/bind +commands.bloodmagic.bind.success=Gegenstand erfolgreich gebunden! +commands.bloodmagic.bind.failed.noPlayer=Kein Spieler angegeben +commands.bloodmagic.bind.failed.alreadyBound=Gegenstand ist schon gebunden; benutze /unbind um die Bindung zu entfernen +commands.bloodmagic.bind.failed.notBindable=Gegenstand kann nicht gebunden werden +commands.bloodmagic.unbind.usage=/unbind +commands.bloodmagic.unbind.success=Bindung erfolgreich entfernt. +commands.bloodmagic.unbind.failed.notBindable=Bindung kann nicht entfernt werden. +commands.bloodmagic.soulnetwork.usage=/soulnetwork [Menge] +commands.bloodmagic.soulnetwork.add.success=Erfolgreich %dLP zu %ss LP-Netzwerk hinzugefügt! +commands.bloodmagic.soulnetwork.subtract.success=Erfolgreich %dLP von %ss LP-Netzwerk entfernt! +commands.bloodmagic.soulnetwork.fill.success=Erfolgreich %ss LP-Netzwerk gefüllt! +commands.bloodmagic.soulnetwork.empty.success=Erfolgreich %ss LP-Netzwerk geleert! +commands.bloodmagic.soulnetwork.get.success=In %ss LP-Netzwerk sind %dLP! +commands.bloodmagic.soulnetwork.noPlayer=Kein Spieler angegeben +commands.bloodmagic.soulnetwork.noCommand=Kein Befehl angegeben +commands.bloodmagic.soulnetwork.notACommand=Das ist kein gültiger Befehl +commands.bloodmagic.soulnetwork.fillMax.success=%ss LP-Netzwerk erfolgreich zu deren Blutkugel-Maximum befüllt! +commands.bloodmagic.soulnetwork.create.success=%ss LP-Netzwerk erfolgreich erstellt! (Blutkugel-Ausbaustufe: %d) + +# 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=Bindungsritual +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.minimumSouls=Minimum: %d Wille -jei.bloodmagic.recipe.soulsDrained=Verbraucht: %d Wille +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 Item 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.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 index a8ec51ae..5545c19c 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -214,7 +214,6 @@ 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 @@ -644,7 +643,7 @@ ritual.bloodmagic.crushingRitual.info=Breaks blocks within its crushing range an 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 opperation. Currently only does one compression per operation. +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. @@ -673,8 +672,8 @@ ritual.bloodmagic.speedRitual.info=Launches players within its range in the dire 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.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. @@ -686,6 +685,7 @@ ritual.bloodmagic.portalRitual.info=Creates a portal network based on the activa 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. @@ -699,7 +699,7 @@ ritual.bloodmagic.wellOfSufferingRitual.altar.info=(Altar) This range defines th 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.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. @@ -711,7 +711,7 @@ ritual.bloodmagic.interdictionRitual.interdictionRange.info=(Push) The area of t 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.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. @@ -736,9 +736,9 @@ ritual.bloodmagic.downgradeRitual.dialogue.bow.300=If you lay an offering before 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. Wether this is a deal you think is worth taking is another matter entirely... +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 truely desire? +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. @@ -901,4 +901,4 @@ 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 \ No newline at end of file +button.bloodmagic.tooltip.fill=Fill network diff --git a/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang b/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang new file mode 100644 index 00000000..3715be0f --- /dev/null +++ b/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang @@ -0,0 +1,270 @@ +# 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 + +# 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.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 Weinstein 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 der leere Weinstein 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 einen Weinstein 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 index 222ea2ab..19683fb1 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -73,14 +73,14 @@ guide.bloodmagic.entry.ritual.wellOfSuffering.info=For those of you who prefer t 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 wares off as soon as they are pushed away. +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 mudpack or user. +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. @@ -141,14 +141,14 @@ 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 Knife 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.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 T3. A simple T1 altar would not do in this situation. +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. 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.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. @@ -163,7 +163,7 @@ guide.bloodmagic.entry.architect.holding.info.1=As you will start to realize, th 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 and a considerable speed. +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. @@ -187,7 +187,7 @@ guide.bloodmagic.entry.architect.severance.info.1=Teleportation is one of those 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 my 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 warry 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.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. @@ -223,7 +223,7 @@ guide.bloodmagic.entry.demon.forge.info.2=Just today, I managed to get a structu 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 health 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.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... @@ -231,10 +231,10 @@ guide.bloodmagic.entry.demon.sentientGem.info.1=After a few days of some "well n 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. When Will of the same type bump into each other in the Aura it tends to congregate similar to how impurities in an otherwise homogeneous liquid clump together. If a device is able to latch onto these clumps within the Raw Will in the Aura, chunks of pure Will of a particular type can be gathered. One such device 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 pray 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.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 Crash of the Crystal. In order to find out how to use them, please refer to The Ritual Master. +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. @@ -268,6 +268,3 @@ guide.bloodmagic.entry.alchemy.furnace.info=One of the many problems that you ma 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. - - - From c0570af36ff6265dcc01b769d223fa8e2c781907 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Wed, 8 Aug 2018 01:50:26 +0200 Subject: [PATCH 328/595] Disorient upgrade typo fix (#1320) (#1395) --- .../livingArmour/downgrade/LivingArmourUpgradeDisoriented.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java index c2a3d980..2d791898 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java @@ -9,7 +9,7 @@ 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.0010, 0.0012, 0.014}; + 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); From 2c92a9e0c1d813c6812dac0d6936f6f421187e12 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Wed, 8 Aug 2018 02:50:56 +0200 Subject: [PATCH 329/595] Crossdimensional Teleposition (including entities, into unloaded chunks etc) (#1385) * AWAITING ALLOWANCE FROM BRANDON3055 (PERMISSION TO USE CODE SNIPPET FOR INTERDIMENSIONAL/CROSSDIMENSIONAL TELEPORT) COPYRIGHT ALL RIGHTS RESERVED FOR BRANDON3055 (CODE SNIPPET) AWAITING ALLOWANCE FROM TEHNUT, WAYOFTIME TO USE FOREIGN CODE (AS IT NEEDS ALLOWANCE & POSSIBLE CREDITS) DO NOT USE. * Forgot something. Requires permission from Brandon3055 (copyright on code snippet) Requires permission from WayofTime, TehNut (because it uses foreign code that might need attribution) Do not use. * License permits usage. Sorry for bothering everyone involved. Don't merge. Teleposer broken. Teleposition sigil works though. * IT WORKS!!!! - re-enabled cross dimensional telepositioning - works even if target teleposer is unloaded at the time of activation (force loads the chunk so the teleposer can be found, releases ticket when player arrives) - entity teleposition works properly - I'm tired and slightly insane - nobody asked for this. closes #973 (rewrite might still be needed though) might be able to close the following issue: - #1198 (improved cross dimensional teleportation code thanks to brandon3055) * Zombies stop holding onto tickets now. * Oversight. --- .../item/sigil/ItemSigilTeleposition.java | 14 +-- .../bloodmagic/ritual/portal/Teleports.java | 85 ++++++++++++++----- .../bloodmagic/tile/TileTeleposer.java | 34 ++++---- 3 files changed, 90 insertions(+), 43 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 10e44dab..ebca00db 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -26,6 +26,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; import java.util.List; +import java.util.UUID; public class ItemSigilTeleposition extends ItemSigilBase { @@ -62,16 +63,17 @@ public class ItemSigilTeleposition extends ItemSigilBase { 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, binding.getOwnerId(), true)); + 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)); } - // FIXME - Fix cross-dimension teleports causing major desync -// } else { -// TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, getOwnerUUID(stack), world, getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID), true)); -// } + } } } - } + return super.onItemRightClick(world, player, hand); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index 79902bc7..5f253ca1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.ritual.portal; import WayofTime.bloodmagic.core.data.SoulNetwork; + import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.event.TeleposeEvent; import WayofTime.bloodmagic.teleport.Teleport; @@ -10,13 +11,20 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.SoundEvents; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.SPacketEntityEffect; +import net.minecraft.network.play.server.SPacketPlayerAbilities; +import net.minecraft.network.play.server.SPacketRespawn; import net.minecraft.network.play.server.SPacketUpdateHealth; +import net.minecraft.potion.PotionEffect; 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.TextComponentString; import net.minecraft.world.World; import net.minecraft.world.WorldServer; +import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -39,15 +47,16 @@ public class Teleports { @Override public void teleport() { if (entity != null) { + BlockPos targetTeleposer = new BlockPos(x,y,z); if (entity.timeUntilPortal <= 0) { if (entity instanceof EntityPlayer) { + SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); if (network.getCurrentEssence() < getTeleportCost()) return; - if (teleposer) - if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z)))) - return; + if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer))) + return; EntityPlayerMP player = (EntityPlayerMP) entity; @@ -60,15 +69,14 @@ public class Teleports { 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(), new BlockPos(x, y, z))); + 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) - if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), new BlockPos(x, y, z)))) - return; + if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer))) + return; WorldServer world = (WorldServer) entity.getEntityWorld(); @@ -80,7 +88,7 @@ public class Teleports { 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(), new BlockPos(x, y, z))); + MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer)); } } } @@ -115,28 +123,65 @@ public class Teleports { MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); WorldServer oldWorldServer = server.getWorld(entity.dimension); WorldServer 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 EntityPlayer) { EntityPlayerMP player = (EntityPlayerMP) entity; + if (!player.getEntityWorld().isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); if (network.getCurrentEssence() < getTeleportCost()) return; - if (teleposer) - if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z)))) + if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer))) return; network.syphon(ticket(oldWorld, player, getTeleportCost())); - player.changeDimension(newWorldID); //TODO: UNTESTED -// server.getConfigurationManager().transferPlayerToDimension(player, newWorldID, new TeleporterBloodMagic(newWorldServer)); - player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); - player.getEntityWorld().updateEntityWithOptionalForce(player, false); - player.connection.sendPacket(new SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); + + + /* begin brandon3055 "BrandonsCore" intedimensional teleportation code */ + + PlayerList playerList = server.getPlayerList(); + + player.dimension = newWorldID; + player.connection.sendPacket(new SPacketRespawn(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 SPacketPlayerAbilities(player.capabilities)); + + playerList.updateTimeAndWeatherForPlayer(player, newWorldServer); + playerList.syncPlayerInventory(player); + + for (PotionEffect potioneffect : player.getActivePotionEffects()) { + player.connection.sendPacket(new SPacketEntityEffect(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, new BlockPos(x, y, z))); + MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer)); } } else if (!entity.getEntityWorld().isRemote) { @@ -144,9 +189,8 @@ public class Teleports { if (network.getCurrentEssence() < (getTeleportCost() / 10)) return; - if (teleposer) - if (MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z)))) - 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)); @@ -168,10 +212,11 @@ public class Teleports { oldWorldServer.resetUpdateEntityTick(); newWorldServer.resetUpdateEntityTick(); if (teleposer) - MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, new BlockPos(x, y, z))); + MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer)); } entity.timeUntilPortal = entity instanceof EntityLiving ? 150 : 20; newWorldServer.playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); + ForgeChunkManager.releaseTicket(chunkTicket); } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index 6c1c09b5..aeff21a0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -22,6 +22,7 @@ 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? @@ -98,34 +99,33 @@ public class TileTeleposer extends TileInventory implements ITickable { 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, binding.getOwnerId(), true)); + 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, binding.getOwnerId(), true)); + 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)); } } } - // FIXME - Fix cross-dimension teleports causing major desync -// } 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), 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, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), focusWorld, getWorld().provider.getDimension(), true)); -// } -// } -// } } } } From ecebe75f333eff0f60d1afa15ea10c97dcde4fc7 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Wed, 8 Aug 2018 02:51:46 +0200 Subject: [PATCH 330/595] Third stage of "Dagger of Sacrifice"-glow (#1389) * Added Soul Fray check. Sacrificial dagger now glows even more if you're fully prepared! Added NBT field for maximum incense altar bonus from the last incense altar the player has encountered. (There is a case in which the dagger glows even if the player is not at maximum incense bonus: The player must have been at maximum incense bonus and then gone into the vincinity of a stronger incense altar. The maximum incense bonus data field only updates once the maximum bonus has been reached for efficiency.) * Multiplayer fixed. * Fixed weirdness that occurred during a phase I don't remember. --- .../item/ItemSacrificialDagger.java | 30 +++++++++++++------ .../WayofTime/bloodmagic/util/Constants.java | 2 ++ .../bloodmagic/util/helper/IncenseHelper.java | 24 +++++++++++++++ .../util/helper/PlayerSacrificeHelper.java | 5 +++- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 6dc81125..5410758f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -8,10 +8,7 @@ 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.NBTHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; +import WayofTime.bloodmagic.util.helper.*; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.util.ITooltipFlag; @@ -56,7 +53,8 @@ public class ItemSacrificialDagger extends ItemEnum Date: Fri, 17 Aug 2018 20:07:02 -0500 Subject: [PATCH 331/595] Allows custom arrows to work with the Sentient Bow. (#1404) - Checks if the arrow is the vanilla arrow, if it is then it continues with normal use. But, if arrow isn't the vanilla arrow it uses their custom arrow entity. --- .../bloodmagic/item/soul/ItemSentientBow.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 70e48450..f817d6a3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -22,6 +22,7 @@ import net.minecraft.init.Items; import net.minecraft.init.SoundEvents; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.IItemPropertyGetter; +import net.minecraft.item.ItemArrow; import net.minecraft.item.ItemBow; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -371,15 +372,17 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien this.recalculatePowers(stack, world, player); EnumDemonWillType type = this.getCurrentType(stack); - //Need to do some stuffs -// ItemArrow itemarrow = ((ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.arrow)); -// EntityArrow entityArrow = itemarrow.createArrow(world, itemstack, player); - + ItemArrow itemarrow = ((ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW)); + EntityArrow entityArrow; double amount = (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)); float newArrowVelocity = arrowVelocity * getVelocityOfArrow(stack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - EntitySentientArrow entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining)); + if (itemarrow == Items.ARROW) + { + double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); + entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining)); + } else + entityArrow = itemarrow.createArrow(world, itemstack, player); entityArrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); if (newArrowVelocity == 0) From 98e474b28763ffa3af1da7fe0a906a08777afeed Mon Sep 17 00:00:00 2001 From: KohaiKhaos Date: Fri, 17 Aug 2018 20:07:29 -0500 Subject: [PATCH 332/595] Someone missed an import (#1403) * Someone missed an import, how have you people even been compiling to test stuff since you added my commit * Missed GameProfile too apparently --- .../java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index 8d9a662c..1ad109a9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -3,6 +3,7 @@ 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.state.IBlockState; import net.minecraft.init.Blocks; @@ -11,6 +12,7 @@ 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.WorldServer; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayerFactory; From 92e333370179a448a5ed824d5da62aa99e97d1b3 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Sat, 18 Aug 2018 03:08:04 +0200 Subject: [PATCH 333/595] Splash potions now throwable! (#1401) --- .../util/handler/event/LivingArmourHandler.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 456482c3..d5750f89 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -24,6 +24,7 @@ import net.minecraft.init.Items; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemArrow; +import net.minecraft.item.ItemSplashPotion; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraft.world.World; @@ -160,13 +161,12 @@ public class LivingArmourHandler if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) { ItemStack drinkStack = event.getItemStack(); + if(!(drinkStack.getItem() instanceof ItemSplashPotion)) { + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); - //TODO: See if the item is a splash potion? Those should be usable. - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); - - if (upgrade instanceof LivingArmourUpgradeQuenched) - { - event.setCanceled(true); + if (upgrade instanceof LivingArmourUpgradeQuenched) { + event.setCanceled(true); + } } } } From 3d3ce53dddd1d8c79d5b93d78607e1652f5305c8 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Sat, 18 Aug 2018 03:13:00 +0200 Subject: [PATCH 334/595] Fix: Interaction Sigil of Holding + Seer/Divination Sigil (no render) (#1391) * Seer Sigil and Sigil of Divination now work properly when placed inside the Sigil of Holding closes #1285 * cleanup * Cleanup. --- .../element/ElementDivinedInformation.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java index c8244775..8563e015 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java @@ -1,12 +1,15 @@ 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.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumHand; +import java.util.List; + public abstract class ElementDivinedInformation extends ElementTileInformation { private final boolean simple; @@ -24,23 +27,38 @@ public abstract class ElementDivinedInformation extends El if (simple) { if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION) flag = true; + else flag = isFlagSigilHolding(sigilStack, true); if (!flag) { sigilStack = player.getHeldItem(EnumHand.OFF_HAND); if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION) 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(EnumHand.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; + } } From f5282bd767efdc895bc276deb63debe782f3ef49 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Sat, 18 Aug 2018 03:14:41 +0200 Subject: [PATCH 335/595] Phantom bridge (#1397) * Rework. Desyncs for no apparent reason. Apart from that, it works. Desyncing started after I implemented the "diagTemplate" methods. Can definitely be optimised, some advice for that would be good (lots of duplicated code for the "templates"). * Code cleanup. Reverted stuff that I didn't want to commit. * Some fine tuning for speed. playerVel is not very accurate still but this should work out for most stuff. Might need a lot of testing. Might still not work properly on servers. Diagonal templates are inconsistent, need variables switched. Will deal with that later (maybe). In any case, this works just fine unless you're speeding diagonally. * The occasional stuff that should not be pushed. Meaningless whitespaces or code reformatting. * The occasional stuff that should not be pushed. Meaningless whitespaces or code reformatting. Take 2. * MERGE ME I'M AWESOME * removed unused import * Refactoring, adding braces, renaming constants etc etc. done. * take 2 * take 2 * Removed one-liners they grew organically because I initially created every "bridge" with a unique for loop before I removed duplicate code by passing variables/ranges they were helpful until I found good names for the variables, now they've outlived their usefulness * tiny bit of fine tuning * various fluff / small fixes more fine tuning, code reformatting, meaningful variables, for loop fix (variable mismatch), shrinking a redundant method to a call to an advanced method --- .../bloodmagic/block/BlockPhantom.java | 2 +- .../item/sigil/ItemSigilPhantomBridge.java | 174 +++++++++++++++--- .../bloodmagic/tile/TilePhantomBlock.java | 15 +- 3 files changed, 164 insertions(+), 27 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java index bb6ad64a..084e6486 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java @@ -77,6 +77,6 @@ public class BlockPhantom extends Block implements IVariantProvider { @Nullable @Override public TileEntity createTileEntity(World world, IBlockState state) { - return new TilePhantomBlock(100); + return new TilePhantomBlock(20); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java index eb2d1431..856a971e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java @@ -1,7 +1,11 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.util.helper.PlayerHelper; 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.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -9,11 +13,44 @@ 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 { - private static final double EXPANSION_FACTOR = 2; - private static final int RANGE = 3; + public static final Predicate IS_PHANTOM_ACTIVE = (Entity entity) -> entity instanceof EntityPlayer && isPhantomActive((EntityPlayer) 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<>(); @@ -46,6 +83,7 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { 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; @@ -58,32 +96,122 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { int posY = playerPos.getY(); int posZ = playerPos.getZ(); - double offsetPosX = posX + EXPANSION_FACTOR * playerVelX; - double offsetPosZ = posZ + EXPANSION_FACTOR * playerVelZ; - double avgX = (posX + offsetPosX) / 2; - double avgZ = (posZ + offsetPosZ) / 2; - - double C = 2 * (RANGE + EXPANSION_FACTOR * totalVel) + 1; - int truncC = (int) C; - - //TODO: Make this for-loop better. - for (int ix = -truncC; ix <= truncC; ix++) { - for (int iz = -truncC; iz <= truncC; iz++) { - if (computeEllipse(ix + avgX, iz + avgZ, posX, posZ, offsetPosX, offsetPosZ) > C) { - continue; + //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 } - - BlockPos blockPos = new BlockPos(ix + posX, posY + verticalOffset, iz + posZ); - - if (world.isAirBlock(blockPos)) - world.setBlockState(blockPos, RegistrarBloodMagicBlocks.PHANTOM.getDefaultState()); + 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)); } - public static double computeEllipse(double x, double z, double focusX1, double focusZ1, double focusX2, double focusZ2) { - return Math.sqrt((x - focusX1) * (x - focusX1) + (z - focusZ1) * (z - focusZ1)) + Math.sqrt((x - focusX2) * (x - focusX2) + (z - focusZ2) * (z - focusZ2)); + 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(EntityPlayer 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/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index cdda27d8..c1d2007f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -1,7 +1,9 @@ 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.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; public class TilePhantomBlock extends TileTicking { @@ -27,11 +29,18 @@ public class TilePhantomBlock extends TileTicking { @Override public void onUpdate() { - ticksRemaining--; + if(!world.isRemote) { + EntityPlayer 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) { - getWorld().setBlockToAir(getPos()); - getWorld().removeTileEntity(getPos()); + world.setBlockToAir(getPos()); + world.removeTileEntity(getPos()); } + } } From 72eb314da80f2d475b508ecd0aeb0225764a6963 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Sun, 26 Aug 2018 21:16:14 +0200 Subject: [PATCH 336/595] Ritual Stones have been nerfed to be Rocky instead of Irony. (#1417) Their material strength has been adjusted to the one of the MRS. --- src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 905c8810..8ef70691 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -21,7 +21,7 @@ import java.util.List; public class BlockRitualStone extends BlockEnum implements IRitualStone { public BlockRitualStone() { - super(Material.IRON, EnumRuneType.class); + super(Material.ROCK, EnumRuneType.class); setUnlocalizedName(BloodMagic.MODID + ".ritualStone."); setCreativeTab(BloodMagic.TAB_BM); From 753958ac9cb09400e7a04e37a87eb986f26604c4 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Sun, 26 Aug 2018 21:50:02 +0200 Subject: [PATCH 337/595] Ritual portal delay / Bound Pickaxe fix/improvement (#1387) * Teleportation now works similar to the Nether Portal: if teleportation is attempted before the cooldown (10 ticks) is over, the cooldown gets reset. This way teleportation loops are prevented. You can now: - Stand on a loop of permanently activated (well, constantly refreshing through a high-speed redstone clock) Teleposers, only getting teleposed once per stepping on it - AFK in the Gate of the Fold without getting teleported constantly - and other things, I guess. * Bound Pickaxe AoE ability now destroys blocks properly. closes #1001 * Streamlined bound tool harvest code. Cleanup, duplicate code for bound tools moved as method to ItemBoundTool.sharedHarvest() Tested aoe harvest with Stone, Dirt/Grass and Oak trees. Same result as before. * silkTouch and fortuneLvl are now passed instead of recalculated on every block --- .../bloodmagic/item/ItemBoundAxe.java | 22 ++------------ .../bloodmagic/item/ItemBoundPickaxe.java | 20 ++----------- .../bloodmagic/item/ItemBoundShovel.java | 22 +++----------- .../bloodmagic/item/ItemBoundTool.java | 29 +++++++++++++++---- .../bloodmagic/ritual/portal/Teleports.java | 11 ++++--- 5 files changed, 40 insertions(+), 64 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 14094b3d..3e1e2610 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -10,7 +10,6 @@ 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.BlockLeaves; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; @@ -31,7 +30,6 @@ import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.List; import java.util.Set; import java.util.function.Consumer; @@ -57,8 +55,9 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { if (world.isRemote) return; - boolean silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0; 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(); @@ -81,22 +80,7 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) continue; - if (blockStack.getState().getBlockHardness(world, blockPos) != -1.0F) { - float strengthVsBlock = getDestroySpeed(stack, blockStack.getState()); - - if (strengthVsBlock > 1.1F || blockStack.getBlock() instanceof BlockLeaves && world.canMineBlockBody(player, blockPos)) { - if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) - drops.add(new ItemStackWrapper(blockStack)); - else { - List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); - - for (ItemStack stacks : itemDrops) - drops.add(ItemStackWrapper.getHolder(stacks)); - } - - world.setBlockToAir(blockPos); - } - } + sharedHarvest(stack, world, player, blockPos, blockStack, drops, silkTouch, fortuneLvl); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index 68b37547..eb2326a1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -28,7 +28,6 @@ import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.List; import java.util.Set; import java.util.function.Consumer; @@ -69,8 +68,9 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { if (world.isRemote) return; - boolean silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0; 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(); @@ -93,21 +93,7 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) continue; - if (blockStack.getBlock() != null && blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1) { - float strengthVsBlock = getDestroySpeed(stack, blockStack.getState()); - - if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { - if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) - drops.add(new ItemStackWrapper(blockStack)); - else { - List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); - for (ItemStack stacks : itemDrops) - drops.add(ItemStackWrapper.getHolder(stacks)); - } - - world.setBlockToAir(blockPos); - } - } + sharedHarvest(stack, world, player, blockPos, blockStack, drops, silkTouch, fortuneLvl); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index 3634012d..dba37f03 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -28,7 +28,6 @@ import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.List; import java.util.Set; import java.util.function.Consumer; @@ -53,15 +52,16 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { if (world.isRemote) return; - - boolean silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0; 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++) { @@ -79,21 +79,7 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) continue; - if (blockStack.getBlock() != null && blockStack.getBlock().getBlockHardness(blockStack.getState(), world, blockPos) != -1) { - float strengthVsBlock = getDestroySpeed(stack, blockStack.getState()); - - if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { - if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) - drops.add(new ItemStackWrapper(blockStack)); - else { - List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); - for (ItemStack stacks : itemDrops) - drops.add(ItemStackWrapper.getHolder(stacks)); - } - - world.setBlockToAir(blockPos); - } - } + sharedHarvest(stack, world, player, blockPos, blockStack, drops, silkTouch, fortuneLvl); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index bdc791bf..f2aea812 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -1,20 +1,19 @@ 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.util.ItemStackWrapper; import WayofTime.bloodmagic.event.BoundToolEvent; import WayofTime.bloodmagic.iface.IActivatable; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; +import WayofTime.bloodmagic.util.BlockStack; +import WayofTime.bloodmagic.util.ItemStackWrapper; 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 com.google.common.collect.Multiset; +import com.google.common.collect.*; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; @@ -251,4 +250,22 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(count))); } } + + protected void sharedHarvest(ItemStack stack, World world, EntityPlayer player, BlockPos blockPos, BlockStack blockStack, HashMultiset drops, boolean silkTouch, int fortuneLvl){ + + if (blockStack.getBlock() != null && blockStack.getState().getBlockHardness(world, blockPos) != -1.0F) { + float strengthVsBlock = getDestroySpeed(stack, blockStack.getState()); + + if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { + if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) + drops.add(new ItemStackWrapper(blockStack)); + else { + List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); + for (ItemStack stacks : itemDrops) + drops.add(ItemStackWrapper.getHolder(stacks)); + } + blockStack.getBlock().removedByPlayer(world.getBlockState(blockPos), world, blockPos,player, false); + } + } + } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index 5f253ca1..2fe03c47 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -49,6 +49,7 @@ public class Teleports { if (entity != null) { BlockPos targetTeleposer = new BlockPos(x,y,z); if (entity.timeUntilPortal <= 0) { + entity.timeUntilPortal = 10; if (entity instanceof EntityPlayer) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); @@ -65,7 +66,6 @@ public class Teleports { player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); player.getEntityWorld().updateEntityWithOptionalForce(player, false); player.connection.sendPacket(new SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); - player.timeUntilPortal = 150; player.getEntityWorld().playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); if (teleposer) @@ -83,13 +83,14 @@ public class Teleports { network.syphon(ticket(world, entity, getTeleportCost() / 10)); entity.setPosition(x + 0.5, y + 0.5, z + 0.5); - entity.timeUntilPortal = 150; 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; } } } @@ -120,6 +121,7 @@ public class Teleports { public void teleport() { if (entity != null) { if (entity.timeUntilPortal <= 0) { + entity.timeUntilPortal = 10; MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); WorldServer oldWorldServer = server.getWorld(entity.dimension); WorldServer newWorldServer = server.getWorld(newWorldID); @@ -206,7 +208,6 @@ public class Teleports { teleportedEntity.forceSpawn = true; newWorldServer.spawnEntity(teleportedEntity); teleportedEntity.setWorld(newWorldServer); - teleportedEntity.timeUntilPortal = teleportedEntity instanceof EntityPlayer ? 150 : 20; } oldWorldServer.resetUpdateEntityTick(); @@ -214,8 +215,10 @@ public class Teleports { if (teleposer) MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer)); } - entity.timeUntilPortal = entity instanceof EntityLiving ? 150 : 20; newWorldServer.playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); + + }else{ + entity.timeUntilPortal = 10; ForgeChunkManager.releaseTicket(chunkTicket); } } From 7942465edcfc7714f25cd41aa0e0250eb3221e93 Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Sun, 26 Aug 2018 21:55:23 +0200 Subject: [PATCH 338/595] Well of Suffering item drop control (#1388) * Added a new DamageSource for the Well of Suffering Added an event handler for death through Well of Suffering Added a config option to enable (true) or disable (false) Well of Suffering Mob drops. * Moved the DamageSource creation to RitualManager Renamed the new DamageSource to "RITUAL_DAMAGE" DamageSource "RITUAL_DAMAGE" is now used by RitualForsakenSoul and RitualWellOfSuffering Added death message string for "RITUAL_DAMAGE" for en_US and de_DE * Cleanup, removed the ability to damage entities in creative mode (creative mode should be considered as having infinite health, the rituals only damage mobs anyways). * Update GenericHandler.java --- .../WayofTime/bloodmagic/ConfigHandler.java | 2 + .../bloodmagic/ritual/RitualManager.java | 8 +++- .../ritual/types/RitualForsakenSoul.java | 3 +- .../ritual/types/RitualWellOfSuffering.java | 3 +- .../util/handler/event/GenericHandler.java | 43 +++++++++++++------ .../assets/bloodmagic/lang/de_DE.lang | 3 ++ .../assets/bloodmagic/lang/en_US.lang | 5 +++ 7 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 4bed50be..85b20776 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -66,6 +66,8 @@ public class ConfigHandler 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java index e6e2287b..ff8aa0bc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java @@ -6,12 +6,17 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import net.minecraft.block.state.IBlockState; +import net.minecraft.util.DamageSource; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.fml.common.discovery.ASMDataTable; -import java.util.*; +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; @@ -20,6 +25,7 @@ public class RitualManager { private final Map imperfectRitualsReverse; private final Configuration config; + public RitualManager(Configuration config) { this.rituals = Maps.newTreeMap(); this.ritualsReverse = Maps.newHashMap(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java index 0e3207bc..7caf6c88 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java @@ -9,7 +9,6 @@ import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -110,7 +109,7 @@ public class RitualForsakenSoul extends Ritual { continue; if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { - if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) { + if (entity.attackEntityFrom(RitualManager.RITUAL_DAMAGE, 1)) { if (!entity.isEntityAlive()) { int uniqueness = calculateUniqueness(entity); double modifier = 1; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index 8e20ebf6..7a27fce3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -7,7 +7,6 @@ import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -89,7 +88,7 @@ public class RitualWellOfSuffering extends Ritual { continue; if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { - if (entity.attackEntityFrom(DamageSource.OUT_OF_WORLD, 1)) { + if (entity.attackEntityFrom(RitualManager.RITUAL_DAMAGE, 1)) { if (entity.isChild()) lifeEssenceRatio *= 0.5F; 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 0dff68cc..9dbc6711 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -3,37 +3,40 @@ 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.util.Constants; +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.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.block.BlockAltar; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; 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.util.ChatUtil; +import WayofTime.bloodmagic.ritual.RitualManager; +import WayofTime.bloodmagic.soul.DemonWillHolder; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.*; +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.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; @@ -79,7 +82,10 @@ import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class GenericHandler { @@ -405,6 +411,15 @@ public class GenericHandler { } } + @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) { diff --git a/src/main/resources/assets/bloodmagic/lang/de_DE.lang b/src/main/resources/assets/bloodmagic/lang/de_DE.lang index d4d8ce84..0cb12242 100644 --- a/src/main/resources/assets/bloodmagic/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagic/lang/de_DE.lang @@ -857,6 +857,9 @@ bloodmagic.keybind.open_holding=Öffne Siegel der Aufbewahrung bloodmagic.keybind.cycle_holding_pos=Siegelrotation (+) bloodmagic.keybind.cycle_holding_neg=Siegelrotation (-) +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. + # JustEnoughItems jei.bloodmagic.recipe.altar=Blutaltar jei.bloodmagic.recipe.binding=Alchemische Anordnung (Bindung) diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 5545c19c..4e51e06b 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -789,6 +789,9 @@ chat.bloodmagic.mimic.detectRadius.down=Player detection radius has been decreas 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 @@ -849,6 +852,8 @@ 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) + + # GUI tile.bloodmagic.inputNode.name=Input Node tile.bloodmagic.outputNode.name=Output Node From 81047734a610750b531ad6ddadf2860a1a8bd4a6 Mon Sep 17 00:00:00 2001 From: KohaiKhaos Date: Sun, 26 Aug 2018 14:59:41 -0500 Subject: [PATCH 339/595] Changed the lava, water, and void sigils to work with fluid tanks better (#1406) * Modified sigils of lava, water, and void to interact with tanks correctly. * Fixed up some formatting errors * Fixed? * Reimplemented necessary fluid code as extensible functions in ItemSigilFluidBase and made the fluid sigils draw functions from there rather than FluidUtil * Fixed up formatting and used an actual IDE for once. --- .../item/sigil/ItemSigilFluidBase.java | 128 ++++++++++++++++++ .../bloodmagic/item/sigil/ItemSigilLava.java | 108 +++++---------- .../bloodmagic/item/sigil/ItemSigilVoid.java | 104 ++++---------- .../bloodmagic/item/sigil/ItemSigilWater.java | 128 +++++------------- 4 files changed, 222 insertions(+), 246 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java new file mode 100644 index 00000000..614f87f4 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java @@ -0,0 +1,128 @@ +package WayofTime.bloodmagic.item.sigil; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +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 { + //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 EnumFacing side) { + IBlockState 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(EntityPlayer 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 + IBlockState 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); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index 6b044a6d..2c235b1a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -4,24 +4,23 @@ 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.material.Material; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -public class ItemSigilLava extends ItemSigilBase { + +public class ItemSigilLava extends ItemSigilFluidBase { + public ItemSigilLava() { - super("lava", 1000); + super("lava", 1000, new FluidStack(FluidRegistry.LAVA, 1000)); } @Override @@ -35,79 +34,38 @@ public class ItemSigilLava extends ItemSigilBase { if (!world.isRemote && !isUnusable(stack)) { RayTraceResult rayTrace = this.rayTrace(world, player, false); - if (rayTrace != null) { - ActionResult ret = ForgeEventFactory.onBucketUse(player, world, stack, rayTrace); - if (ret != null) - return ret; + if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) { + return ActionResult.newResult(EnumActionResult.PASS, stack); + } - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { - BlockPos blockpos = rayTrace.getBlockPos(); + BlockPos blockPos = rayTrace.getBlockPos(); - if (!world.isBlockModifiable(player, blockpos)) { - return super.onItemRightClick(world, player, hand); - } - - if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) { - return super.onItemRightClick(world, player, hand); - } - - BlockPos blockpos1 = blockpos.offset(rayTrace.sideHit); - - if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) { - return super.onItemRightClick(world, player, hand); - } - - if (canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess() && tryPlaceLava(world, blockpos1)) { - return super.onItemRightClick(world, player, hand); + 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(EnumActionResult.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(EnumActionResult.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(EnumActionResult.SUCCESS, stack); } } } } - return super.onItemRightClick(world, player, hand); } - - @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (world.isRemote || player.isSneaking() || isUnusable(stack)) { - return EnumActionResult.FAIL; - } - if (!world.canMineBlockBody(player, blockPos)) { - return EnumActionResult.FAIL; - } - - TileEntity tile = world.getTileEntity(blockPos); - if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { - IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); - FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000); - int amount = handler.fill(fluid, false); - - if (amount > 0 && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - handler.fill(fluid, true); - return EnumActionResult.SUCCESS; - } - - return EnumActionResult.FAIL; - } - - return EnumActionResult.FAIL; - } - - public boolean canPlaceLava(World world, BlockPos blockPos) { - if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isSolid()) { - return false; - } else if ((world.getBlockState(blockPos).getBlock() == Blocks.LAVA || world.getBlockState(blockPos).getBlock() == Blocks.FLOWING_LAVA) && world.getBlockState(blockPos).getBlock().getMetaFromState(world.getBlockState(blockPos)) == 0) { - return false; - } else { - world.setBlockState(blockPos, Blocks.FLOWING_LAVA.getBlockState().getBaseState(), 3); - return true; - } - } - - public boolean tryPlaceLava(World world, BlockPos pos) { - Material material = world.getBlockState(pos).getBlock().getMaterial(world.getBlockState(pos)); - - return world.isAirBlock(pos) && !material.isSolid(); - } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 93796d8d..702e692c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -1,26 +1,22 @@ package WayofTime.bloodmagic.item.sigil; -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.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidBlock; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -public class ItemSigilVoid extends ItemSigilBase { +public class ItemSigilVoid extends ItemSigilFluidBase { public ItemSigilVoid() { - super("void", 50); + super("void", 50, null); } @Override @@ -34,81 +30,29 @@ public class ItemSigilVoid extends ItemSigilBase { if (!world.isRemote && !isUnusable(stack)) { RayTraceResult rayTrace = this.rayTrace(world, player, true); - if (rayTrace != null) { - ActionResult ret = ForgeEventFactory.onBucketUse(player, world, stack, rayTrace); - if (ret != null) - return ret; - - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { - BlockPos blockpos = rayTrace.getBlockPos(); - - if (!world.isBlockModifiable(player, blockpos)) { - return super.onItemRightClick(world, player, hand); - } - - if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) { - return super.onItemRightClick(world, player, hand); - } - - if (!player.canPlayerEdit(blockpos, rayTrace.sideHit, stack)) { - return super.onItemRightClick(world, player, hand); - } - - if (world.getBlockState(blockpos).getBlock().getMaterial(world.getBlockState(blockpos)).isLiquid() && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - world.setBlockToAir(blockpos); - return super.onItemRightClick(world, player, hand); - } - } - } else { - return super.onItemRightClick(world, player, hand); + if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) { + return ActionResult.newResult(EnumActionResult.PASS, stack); } - if (!player.capabilities.isCreativeMode) - setUnusable(stack, !NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()); + 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(EnumActionResult.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(EnumActionResult.SUCCESS, stack); + } + } } return super.onItemRightClick(world, player, hand); } - - @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (PlayerHelper.isFakePlayer(player)) - return EnumActionResult.FAIL; - - if (world.isRemote || player.isSneaking() || isUnusable(stack)) { - return EnumActionResult.FAIL; - } - - if (!world.canMineBlockBody(player, blockPos)) { - return EnumActionResult.FAIL; - } - - SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); - TileEntity tile = world.getTileEntity(blockPos); - if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { - IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); - FluidStack amount = handler.drain(1000, false); - - if (amount != null && amount.amount > 0 && network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - handler.drain(1000, true); - return EnumActionResult.SUCCESS; - } - - return EnumActionResult.FAIL; - } - - BlockPos newPos = blockPos.offset(side); - - if (!player.canPlayerEdit(newPos, side, stack)) { - return EnumActionResult.FAIL; - } - - if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - world.setBlockToAir(newPos); - return EnumActionResult.SUCCESS; - } - - return EnumActionResult.FAIL; - } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index 5737fd32..6e71a24d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -5,24 +5,22 @@ import WayofTime.bloodmagic.iface.ISigil; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.PlayerHelper; import net.minecraft.block.BlockCauldron; -import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; 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.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -public class ItemSigilWater extends ItemSigilBase { +public class ItemSigilWater extends ItemSigilFluidBase { public ItemSigilWater() { - super("water", 100); + super("water", 100, new FluidStack(FluidRegistry.WATER, 1000)); } @Override @@ -36,98 +34,46 @@ public class ItemSigilWater extends ItemSigilBase { if (!world.isRemote && !isUnusable(stack)) { RayTraceResult rayTrace = this.rayTrace(world, player, false); - if (rayTrace != null) { - ActionResult ret = net.minecraftforge.event.ForgeEventFactory.onBucketUse(player, world, stack, rayTrace); - if (ret != null) - return ret; + if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) { + return ActionResult.newResult(EnumActionResult.PASS, stack); + } - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { - BlockPos blockpos = rayTrace.getBlockPos(); + BlockPos blockPos = rayTrace.getBlockPos(); - if (!world.isBlockModifiable(player, blockpos)) - return super.onItemRightClick(world, player, hand); + 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(EnumActionResult.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(EnumActionResult.SUCCESS, stack); + } - if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) - return super.onItemRightClick(world, player, hand); + //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(BlockCauldron.LEVEL, 3)); + return ActionResult.newResult(EnumActionResult.SUCCESS, stack); + } - BlockPos blockpos1 = blockpos.offset(rayTrace.sideHit); - - if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) - return super.onItemRightClick(world, player, hand); - - if (canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess() && tryPlaceWater(world, blockpos1)) - return super.onItemRightClick(world, player, hand); + //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(EnumActionResult.SUCCESS, stack); + } } } } return super.onItemRightClick(world, player, hand); } - - @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (world.isRemote || player.isSneaking() || isUnusable(stack)) - return EnumActionResult.FAIL; - - if (!world.canMineBlockBody(player, blockPos)) - return EnumActionResult.FAIL; - - TileEntity tile = world.getTileEntity(blockPos); - if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { - IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); - FluidStack fluid = new FluidStack(FluidRegistry.WATER, 1000); - int amount = handler.fill(fluid, false); - - if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - handler.fill(fluid, true); - return EnumActionResult.SUCCESS; - } - - return EnumActionResult.FAIL; - } - - if (world.getBlockState(blockPos).getBlock() == Blocks.CAULDRON && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - world.setBlockState(blockPos, Blocks.CAULDRON.getDefaultState().withProperty(BlockCauldron.LEVEL, 3)); - return EnumActionResult.SUCCESS; - } - - return EnumActionResult.FAIL; - } - - public boolean canPlaceWater(World world, BlockPos blockPos) { - if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isSolid()) - return false; - else if ((world.getBlockState(blockPos).getBlock() == Blocks.WATER || world.getBlockState(blockPos).getBlock() == Blocks.FLOWING_WATER) && world.getBlockState(blockPos).getBlock().getMetaFromState(world.getBlockState(blockPos)) == 0) - return false; - else - return true; - } - - public boolean tryPlaceWater(World worldIn, BlockPos pos) { - - Material material = worldIn.getBlockState(pos).getBlock().getMaterial(worldIn.getBlockState(pos)); - boolean notSolid = !material.isSolid(); - - if (!worldIn.isAirBlock(pos) && !notSolid) { - return false; - } else { - if (worldIn.provider.doesWaterVaporize()) { - int i = pos.getX(); - int j = pos.getY(); - int k = pos.getZ(); - worldIn.playSound(null, i, j, k, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (worldIn.rand.nextFloat() - worldIn.rand.nextFloat()) * 0.8F); - - for (int l = 0; l < 8; ++l) - worldIn.spawnParticle(EnumParticleTypes.SMOKE_LARGE, (double) i + Math.random(), (double) j + Math.random(), (double) k + Math.random(), 0.0D, 0.0D, 0.0D, 0); - } else { - if (!worldIn.isRemote && notSolid && !material.isLiquid()) - worldIn.destroyBlock(pos, true); - - worldIn.setBlockState(pos, Blocks.FLOWING_WATER.getDefaultState(), 3); - } - - return true; - } - } } From 9440d3c0b9187cca3f85424ae3e53bf2db824799 Mon Sep 17 00:00:00 2001 From: KohaiKhaos Date: Sun, 26 Aug 2018 15:00:07 -0500 Subject: [PATCH 340/595] This should fix a few existing issues with Teleposers, they no longer syphon from the bound player. (#1414) --- .../java/WayofTime/bloodmagic/tile/TileTeleposer.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index aeff21a0..8aaf092f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -1,16 +1,15 @@ package WayofTime.bloodmagic.tile; +import WayofTime.bloodmagic.block.BlockTeleposer; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.TeleposeEvent; -import WayofTime.bloodmagic.teleport.TeleportQueue; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.block.BlockTeleposer; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.ritual.portal.Teleports; +import WayofTime.bloodmagic.teleport.TeleportQueue; +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.NBTTagCompound; @@ -77,7 +76,7 @@ public class TileTeleposer extends TileInventory implements ITickable { final int focusLevel = (getStackInSlot(0).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.getSoulNetwork(binding).syphonAndDamage(PlayerHelper.getPlayerFromUUID(binding.getOwnerId()), SoulTicket.block(world, pos, lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1))).isSuccess()) { + 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++) { From 1f392721fa7596485125e4a11b851892116f3cbd Mon Sep 17 00:00:00 2001 From: AEon - Tobias Date: Sun, 26 Aug 2018 22:05:30 +0200 Subject: [PATCH 341/595] Reinstated Compression sigil. (#1374) * Reinstated Compression sigil. - does not compress wooden planks into crafting tables - searches for reversible 3x3/2x2 recipes with a single material type - probably has a lot of redundant stuff and looks silly - uses try/catch (might want to find a different approach, some people scoff at this) - should probably have spent the night sleeping, I'm taking exams tomorrow and will probably sleep the whole day through. * Learned how to properly handle the "NullPointerException"-situation. * Update BaseCompressionHandler.java * Update CompressionRegistry.java * Removed (almost) all code comments (only a one-liner remains that serves as pointer to a completly commented-out class (StorageBlockCraftingRecipeAssimilator)). Made methods and variables for long function calls to be more efficient. Fixed an oversight that resulted in a NullPointerException after removing redundant checks that were made to prevent exactly that. Rearranged and reformatted code. * corrected something that could be considered a typo but was an oversight * This should be it. An Array should be more efficient but you can correct me if I'm wrong. In either case it does what it is supposed to do. * Fixed. Needed a seperate inventory for the reversible check (or clear the previously used one, but then I'd had to repopulate again and that would just have been messy) * Forgot one of my lines. * Fix and cleanup. Could definitely clean more but that should suffice for now. --- .../compress/AdvancedCompressionHandler.java | 187 ++++++++---------- .../compress/BaseCompressionHandler.java | 57 +----- .../compress/CompressionHandler.java | 46 ++++- .../compress/CompressionRegistry.java | 12 +- .../compress/StorageBlockCraftingManager.java | 26 ++- .../item/sigil/ItemSigilCompression.java | 2 - .../bloodmagic/registry/ModRecipes.java | 3 +- 7 files changed, 153 insertions(+), 180 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java index 2050f6b7..b5d78913 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java @@ -4,31 +4,98 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; + public class AdvancedCompressionHandler extends CompressionHandler { - @Override - public ItemStack compressInventory(ItemStack[] inv, World world) { - return test(inv, true, world); + + private static InventoryCrafting[] inventoryCrafting = { + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, + 3, 3), + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, + 2, 2), + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, + 1, 1) + + }; + + private static ItemStack reversibleCheck; + + 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 ItemStack test(ItemStack[] inv, boolean doDrain, World world) { + public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) { + StorageBlockCraftingManager craftingManagerSB = StorageBlockCraftingManager.getInstance(); + InventoryCrafting 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; + } + return ItemStack.EMPTY; + } + + public static ItemStack getNNRecipeOutput(InventoryCrafting 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 ItemStack compressInventory(ItemStack[] inv, World world) { for (ItemStack invStack : inv) { if (invStack.isEmpty()) { continue; } - for (int i = 2; i <= 3; i++) { + for (int i = 3; i >= 2; i--) { + reversibleCheck = invStack; ItemStack stack = getRecipe(invStack, world, i); if (!stack.isEmpty()) { - int threshold = CompressionRegistry.getItemThreshold(invStack); - int needed = i * i; - int neededLeft = iterateThroughInventory(invStack, threshold + invStack.getMaxStackSize() - needed, inv, needed, false); - if (neededLeft <= 0) { - iterateThroughInventory(invStack, 0, inv, needed, true); + int needed = (i == 2 ? 4 : 9); + int remaining = iterateThroughInventory(invStack, invStack.getMaxStackSize() - needed, inv, needed, true); // if more than needed gets consumed at any point, the simulate test was needed after all + if (remaining <= 0) return stack; - } } } } @@ -36,103 +103,5 @@ public class AdvancedCompressionHandler extends CompressionHandler { return ItemStack.EMPTY; } - public int iterateThroughInventory(ItemStack required, int kept, ItemStack[] inv, int needed, boolean doDrain) { - int i = -1; - 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); - if (doDrain) { - invStack.setCount(remainingFromStack + used); - if (invStack.isEmpty()) { - inv[i] = ItemStack.EMPTY; - } - } - - needed -= (stackSize - used - remainingFromStack); - } - - if (needed <= 0) { - return 0; - } - } - } - - return needed; - } - - public static boolean isResultStackReversible(ItemStack stack, int gridSize, World world) { - if (stack.isEmpty()) { - return false; - } - InventoryCrafting inventory = new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, 2, 2); - - inventory.setInventorySlotContents(0, stack); - - ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world); - if (returnStack.isEmpty()) { - return false; - } - - ItemStack compressedStack = ItemStack.EMPTY; - switch (gridSize) { - case 2: - compressedStack = get22Recipe(returnStack, world); - break; - case 3: - compressedStack = get33Recipe(returnStack, world); - break; - } - - return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); - } - - public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) { - InventoryCrafting inventory = new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, gridSize, gridSize); - for (int i = 0; i < inventory.getSizeInventory(); i++) { - inventory.setInventorySlotContents(i, stack); - } - - return StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world); - } - - public static boolean has22Recipe(ItemStack stack, World world) { - return !get22Recipe(stack, world).isEmpty(); - } - - public static ItemStack get22Recipe(ItemStack stack, World world) { - return getRecipe(stack, world, 2); - } - - public static boolean has33Recipe(ItemStack stack, World world) { - return !get33Recipe(stack, world).isEmpty(); - } - - public static ItemStack get33Recipe(ItemStack stack, World world) { - return getRecipe(stack, world, 3); - } } diff --git a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java index 1af4b63b..94b4ddf6 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java @@ -8,11 +8,11 @@ public class BaseCompressionHandler extends CompressionHandler { private final ItemStack result; private final int leftover; - public BaseCompressionHandler(ItemStack requested, ItemStack result, int leftover) { + public BaseCompressionHandler(ItemStack input, ItemStack output, int remainder) { super(); - this.required = requested; - this.result = result; - this.leftover = leftover; + this.required = input; + this.result = output; + this.leftover = remainder; } public ItemStack getResultStack() { @@ -35,57 +35,18 @@ public class BaseCompressionHandler extends CompressionHandler { } public int getRemainingNeeded(ItemStack[] inv) { - return iterateThroughInventory(inv, false); + int needed = this.required.getCount(); + int kept = this.getLeftover(); + return iterateThroughInventory(this.required, kept, inv, needed, true); } public int drainInventory(ItemStack[] inv) { - return iterateThroughInventory(inv, true); - } - - public int iterateThroughInventory(ItemStack[] inv, boolean doDrain) { int needed = this.required.getCount(); int kept = this.getLeftover(); - int i = -1; - - for (ItemStack invStack : inv) { - i++; - - if (invStack == null) { - continue; - } - - if (invStack.isItemEqual(this.required) && (invStack.getTagCompound() == null ? this.required.getTagCompound() == null : invStack.getTagCompound().equals(this.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); - if (doDrain) { - invStack.setCount(remainingFromStack + used); - if (invStack.isEmpty()) { - inv[i] = ItemStack.EMPTY; - } - } - - needed -= (stackSize - used - remainingFromStack); - } - - if (needed <= 0) { - return 0; - } - } - } - - return needed; + 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 index b7da216d..2cd74d14 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java @@ -12,4 +12,48 @@ public abstract class CompressionHandler { * @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 i = -1; + + 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; // 0 + + if (kept <= 0 && needed > 0) { + int remainingFromStack = Math.max(stackSize - used - needed, 0); + if (doDrain) { + invStack.setCount(remainingFromStack + used); + if (invStack.isEmpty()) { + inv[i] = ItemStack.EMPTY; + } + } + + needed -= (stackSize - used - remainingFromStack); + } + + 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 index 2d975531..8c10fa3a 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java @@ -38,7 +38,7 @@ public class CompressionRegistry { public static ItemStack compressInventory(ItemStack[] inv, World world) { for (CompressionHandler handler : compressionRegistry) { ItemStack stack = handler.compressInventory(inv, world); - if (stack != null) { + if (!stack.isEmpty()) { return stack; } } @@ -78,16 +78,10 @@ public class CompressionRegistry { } public static int getItemThreshold(ItemStack stack) { - for (Map.Entry entry : thresholdMap.entrySet()) { - if (areItemStacksEqual(entry.getKey(), stack)) { - return entry.getValue(); - } - } - - return 0; + return stack.getItem().getItemStackLimit(stack); //this should work according to the guide, leaving behind a full stack of the source item (unless otherwise specified with a BaseCompressionHandler recipe) } 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 index 19e06bb4..96d31140 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -14,11 +14,17 @@ import java.util.List; public class StorageBlockCraftingManager { private static final StorageBlockCraftingManager instance = new StorageBlockCraftingManager(); - private List recipes = new LinkedList(); + private List recipes = new LinkedList<>(); + 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(); + //this.recipes = new StorageBlockCraftingRecipeAssimilator().getPackingRecipes(); BMLog.DEBUG.info("Total number of compression recipes: " + this.recipes.size()); } @@ -26,7 +32,7 @@ public class StorageBlockCraftingManager { return this.findMatchingRecipe(craftingInventory, world, this.recipes); } - private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, List list) { + private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, List list) { int i = 0; ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack1 = ItemStack.EMPTY; @@ -62,7 +68,7 @@ public class StorageBlockCraftingManager { return new ItemStack(itemstack.getItem(), 1, i1); } else { for (j = 0; j < list.size(); ++j) { - IRecipe irecipe = (IRecipe) list.get(j); + IRecipe irecipe = list.get(j); if (irecipe.matches(craftingInventory, world)) { return irecipe.getCraftingResult(craftingInventory); @@ -77,7 +83,7 @@ public class StorageBlockCraftingManager { return instance; } - private static boolean isResultStackReversible(ItemStack stack, int gridSize, World world, List list) { + private static boolean isResultStackReversible(ItemStack stack, int gridSize, World world, List list) { if (stack.isEmpty()) { return false; } @@ -107,7 +113,7 @@ public class StorageBlockCraftingManager { return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); } - private static ItemStack getRecipe(ItemStack stack, World world, int gridSize, List list) { + private static ItemStack getRecipe(ItemStack stack, World world, int gridSize, List list) { InventoryCrafting inventory = new InventoryCrafting(new Container() { public boolean canInteractWith(EntityPlayer player) { return false; @@ -120,19 +126,19 @@ public class StorageBlockCraftingManager { return StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); } - private static boolean has22Recipe(ItemStack stack, World world, List list) { + private static boolean has22Recipe(ItemStack stack, World world, List list) { return !get22Recipe(stack, world, list).isEmpty(); } - private static ItemStack get22Recipe(ItemStack stack, World world, List list) { + private static ItemStack get22Recipe(ItemStack stack, World world, List list) { return getRecipe(stack, world, 2, list); } - private static boolean has33Recipe(ItemStack stack, World world, List list) { + private static boolean has33Recipe(ItemStack stack, World world, List list) { return !get33Recipe(stack, world, list).isEmpty(); } - private static ItemStack get33Recipe(ItemStack stack, World world, List list) { + private static ItemStack get33Recipe(ItemStack stack, World world, List list) { return getRecipe(stack, world, 3, list); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java index d23ced18..1359167a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java @@ -17,8 +17,6 @@ public class ItemSigilCompression extends ItemSigilToggleableBase { @Override public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { - if (true) - return; // TODO - Rewrite compression system if (PlayerHelper.isFakePlayer(player)) return; diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 25d54dd2..688c588a 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -85,6 +85,7 @@ public class ModRecipes addAlchemyTableRecipes(); addPotionRecipes(); addLivingArmourDowngradeRecipes(); + addCompressionHandlers(); } public static void initOreDict() @@ -140,11 +141,11 @@ public class ModRecipes { 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()); - CompressionRegistry.registerItemThreshold(new ItemStack(Blocks.COBBLESTONE), 64); stopwatch.stop(); BMLog.DEBUG.info("Added compression recipes in {}", stopwatch); From 70cf5d2beae9694c26852b0a7226872e0c30fa38 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 26 Aug 2018 13:12:49 -0700 Subject: [PATCH 342/595] Low tier altars should not be able to fill high tier orbs --- src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 8df2775c..2f9b794f 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -197,8 +197,8 @@ public class BloodAltar implements IFluidHandler } } else if (input.getItem() instanceof IBloodOrb) { - this.isActive = true; - this.canBeFilled = true; + BloodOrb orb = ((IBloodOrb) input.getItem()).getOrb(input); + this.isActive = canBeFilled = orb != null && altarTier.ordinal() >= orb.getTier(); return; } } From 8e16e590eaac5b0ffb25b7a94c4956216b572339 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 26 Aug 2018 13:40:40 -0700 Subject: [PATCH 343/595] Sentient tools should use the proper material and have a repair material crystals are used to repair --- .../WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java | 2 ++ .../java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java | 2 +- .../WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java | 2 +- .../java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index caa7f823..78d38d5f 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -60,6 +60,8 @@ public class RegistrarBloodMagicRecipes 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) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 9f9bb426..7da46137 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -72,7 +72,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public final double baseAttackSpeed = -3; public ItemSentientAxe() { - super(Item.ToolMaterial.IRON); + super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL, 8.0F, 3.1F); setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index f939b4e3..511dc6a1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -72,7 +72,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public final double baseAttackSpeed = -2.8; public ItemSentientPickaxe() { - super(Item.ToolMaterial.IRON); + super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index 995f80ac..c784998a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -72,7 +72,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public final double baseAttackSpeed = -2.8; public ItemSentientShovel() { - super(Item.ToolMaterial.IRON); + super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); From 6062b6866135ce9fdbeb2f82d8cadce146a85086 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 26 Aug 2018 13:49:02 -0700 Subject: [PATCH 344/595] Fixed placement of chunk ticket release due to scoping Added in missing ticket releases --- .../bloodmagic/ritual/portal/Teleports.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java index 2fe03c47..43e738dc 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.ritual.portal; import WayofTime.bloodmagic.core.data.SoulNetwork; - import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.event.TeleposeEvent; import WayofTime.bloodmagic.teleport.Teleport; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.entity.*; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.SoundEvents; @@ -47,7 +47,7 @@ public class Teleports { @Override public void teleport() { if (entity != null) { - BlockPos targetTeleposer = new BlockPos(x,y,z); + BlockPos targetTeleposer = new BlockPos(x, y, z); if (entity.timeUntilPortal <= 0) { entity.timeUntilPortal = 10; if (entity instanceof EntityPlayer) { @@ -89,7 +89,7 @@ public class Teleports { if (teleposer) MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer)); } - }else{ + } else { entity.timeUntilPortal = 10; } } @@ -125,10 +125,10 @@ public class Teleports { MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); WorldServer oldWorldServer = server.getWorld(entity.dimension); WorldServer newWorldServer = server.getWorld(newWorldID); - BlockPos targetTeleposer = new BlockPos(x,y,z); + 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); + ForgeChunkManager.forceChunk(chunkTicket, teleposerChunk); if (entity instanceof EntityPlayer) { EntityPlayerMP player = (EntityPlayerMP) entity; @@ -136,16 +136,18 @@ public class Teleports { if (!player.getEntityWorld().isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); - if (network.getCurrentEssence() < getTeleportCost()) + if (network.getCurrentEssence() < getTeleportCost()) { + ForgeChunkManager.releaseTicket(chunkTicket); return; + } - if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer))) - 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" intedimensional teleportation code */ PlayerList playerList = server.getPlayerList(); @@ -217,9 +219,9 @@ public class Teleports { } newWorldServer.playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); - }else{ - entity.timeUntilPortal = 10; ForgeChunkManager.releaseTicket(chunkTicket); + } else { + entity.timeUntilPortal = 10; } } } From 6d43e416e4cd5014a4f8501f60210fd96fa1da25 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 26 Aug 2018 14:05:25 -0700 Subject: [PATCH 345/595] *Now* sentient repairing is proper --- .../WayofTime/bloodmagic/item/soul/ItemSentientAxe.java | 6 ------ .../WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java | 6 ------ .../WayofTime/bloodmagic/item/soul/ItemSentientShovel.java | 6 ------ 3 files changed, 18 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 7da46137..1f7404cc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -29,7 +29,6 @@ import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.Item; import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -90,11 +89,6 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } } - @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, EntityPlayer player) { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 511dc6a1..e8d45479 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -29,7 +29,6 @@ import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.Item; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -90,11 +89,6 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } } - @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); - } - public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index c784998a..c8b219b4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -29,7 +29,6 @@ import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.Item; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -90,11 +89,6 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } } - @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, EntityPlayer player) { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); From c5d3f8012c7a242f884c165258d8172fed34ea67 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 26 Aug 2018 14:05:41 -0700 Subject: [PATCH 346/595] Update changelog + version --- build.gradle | 2 +- changelog.txt | 30 ++++++++++++++++++++++++++++++ gradle.properties | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 9947af35..9f71091d 100644 --- a/build.gradle +++ b/build.gradle @@ -171,7 +171,7 @@ curseforge { project { id = "${curse_id}" changelog = getChangelogText() - releaseType = 'alpha' + releaseType = 'beta' relations curseRelations diff --git a/changelog.txt b/changelog.txt index 3d8a9a5d..770a2682 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,33 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index b97442cd..a138a96c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.3.1 +mod_version=2.3.2 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From 6ba4a02c4875547bc181690beb6acc8618c84fc7 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 26 Aug 2018 14:13:07 -0700 Subject: [PATCH 347/595] I love when Curse breaks their API so my buildscript fai;s --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9f71091d..0ad1ff65 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { plugins { id "net.minecraftforge.gradle.forge" version "2.0.2" - id 'com.matthewprenger.cursegradle' version '1.0.10' + id 'com.matthewprenger.cursegradle' version '1.1.0' id 'maven-publish' } From 39087ccf70bf651e0d62b526dcc1c65c993eff86 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 27 Aug 2018 21:30:03 -0700 Subject: [PATCH 348/595] Fix obo causing altars to not fill orbs of the same tier (#1423) --- src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 2f9b794f..f92049e7 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -198,7 +198,7 @@ public class BloodAltar implements IFluidHandler } else if (input.getItem() instanceof IBloodOrb) { BloodOrb orb = ((IBloodOrb) input.getItem()).getOrb(input); - this.isActive = canBeFilled = orb != null && altarTier.ordinal() >= orb.getTier(); + this.isActive = canBeFilled = orb != null && altarTier.toInt() >= orb.getTier(); return; } } From 2b587e84af9049a46e0fa311a66edb94d19ff090 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Tue, 28 Aug 2018 21:51:59 -0700 Subject: [PATCH 349/595] Update changelog + version --- changelog.txt | 6 ++++++ gradle.properties | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 770a2682..5109324a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +------------------------------------------------------ +Version 2.3.3 +------------------------------------------------------ + +- Fixed Altars not filling orbs of their own tier + ------------------------------------------------------ Version 2.3.2 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index a138a96c..48dbcb74 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.3.2 +mod_version=2.3.3 mc_version=1.12.2 forge_version=14.23.2.2611 curse_id=224791 From d54c828fba3c673a4401c470a93040f03e0eb2c1 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 3 Sep 2018 11:35:15 -0700 Subject: [PATCH 350/595] Fix Harvest Moon not working with Pumpkins (#1432) --- .../ritual/harvest/HarvestHandlerStem.java | 19 +++++++++++-------- .../ritual/harvest/HarvestRegistry.java | 6 +++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java index 2e7bb2fd..7a0ef364 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -10,6 +10,7 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import java.util.Collection; import java.util.List; /** @@ -29,19 +30,21 @@ public class HarvestHandlerStem implements IHarvestHandler { @Override public boolean harvest(World world, BlockPos pos, IBlockState state, List drops) { - EnumFacing cropDir = state.getBlock().getActualState(state, world, pos).getValue(BlockStem.FACING); + EnumFacing cropDir = state.getActualState(world, pos).getValue(BlockStem.FACING); if (cropDir != EnumFacing.UP) { BlockPos cropPos = pos.offset(cropDir); IBlockState probableCrop = world.getBlockState(cropPos); - IBlockState registeredCrop = HarvestRegistry.getStemCrops().get(state); + Collection registeredCrops = HarvestRegistry.getStemCrops().get(state); - if (registeredCrop == probableCrop) { - NonNullList blockDrops = NonNullList.create(); - probableCrop.getBlock().getDrops(blockDrops, world, cropPos, probableCrop, 0); - drops.addAll(blockDrops); - world.destroyBlock(cropPos, false); - return true; + for (IBlockState 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; + } } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java index c5deba16..82c403e6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java @@ -14,7 +14,7 @@ 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 Map STEM_CROPS = Maps.newHashMap(); + private static final Multimap STEM_CROPS = ArrayListMultimap.create(); private static final Map AMPLIFIERS = Maps.newHashMap(); /** @@ -95,8 +95,8 @@ public class HarvestRegistry { return ImmutableSet.copyOf(TALL_CROPS); } - public static Map getStemCrops() { - return ImmutableMap.copyOf(STEM_CROPS); + public static Multimap getStemCrops() { + return ImmutableMultimap.copyOf(STEM_CROPS); } public static Map getAmplifiers() { From fd0326576475c137bc3f7ca73c2e3167aa1f8575 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 16 Sep 2018 11:13:25 -0700 Subject: [PATCH 351/595] Fix "how do i get tier 6" questions --- .../WayofTime/bloodmagic/altar/AltarTier.java | 51 ++++++++++--------- .../api/impl/BloodMagicCorePlugin.java | 4 +- .../block/enums/EnumDecorative.java | 5 +- .../bloodmagic/core/RegistrarBloodMagic.java | 8 +-- .../core/RegistrarBloodMagicRecipes.java | 4 +- .../ritual/types/RitualAltarBuilder.java | 4 +- 6 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java index d940e6ab..105efae2 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java @@ -100,31 +100,32 @@ public enum AltarTier { } } }, - SIX() { - @Override - public void buildComponents(Consumer components) { - FIVE.getAltarComponents().forEach(components); - - 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(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 = -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()); - } - } - }; +// SIX() { +// @Override +// public void buildComponents(Consumer components) { +// FIVE.getAltarComponents().forEach(components); +// +// 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(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 = -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()); +// } +// } +// }, + ; public static final int MAXTIERS = values().length; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 3a0d0164..e8d2e44d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -76,8 +76,8 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin 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()); - 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()); +// 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()) diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java index d9cdcdff..b0b31622 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java @@ -7,8 +7,9 @@ import java.util.Locale; public enum EnumDecorative implements IStringSerializable { BLOODSTONE_TILE, BLOODSTONE_BRICK, - CRYSTAL_TILE, - CRYSTAL_BRICK,; +// CRYSTAL_TILE, +// CRYSTAL_BRICK, + ; @Override public String toString() { diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index c039399d..2b352d8b 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -47,8 +47,8 @@ public class RegistrarBloodMagic 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; +// @GameRegistry.ObjectHolder("transcendent") +// public static final BloodOrb ORB_TRANSCENDENT = ORB_DEF; public static final Potion BOOST = MobEffects.HASTE; public static final Potion WHIRLWIND = MobEffects.HASTE; @@ -75,8 +75,8 @@ public class RegistrarBloodMagic 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"), - new BloodOrb("transcendent", 6, 30000000, 50).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") + new BloodOrb("archmage", 5, 10000000, 50).withModel(new ModelResourceLocation(orb, "type=archmage")).setRegistryName("archmage") +// new BloodOrb("transcendent", 6, 30000000, 50).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") ); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 78d38d5f..fb416608 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -98,8 +98,8 @@ public class RegistrarBloodMagicRecipes registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.DEMONIC.getStack()), ItemSlate.SlateType.ETHEREAL.getStack(), AltarTier.FIVE.ordinal(), 30000, 40, 100); // SIX - 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); +// 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) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index 1cf2f0ce..64242e37 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -28,7 +28,7 @@ import java.util.function.Consumer; @RitualRegister("altar_builder") public class RitualAltarBuilder extends Ritual { - private Iterator altarComponentsIterator = new ArrayList<>(AltarTier.SIX.getAltarComponents()).iterator(); + private Iterator altarComponentsIterator = new ArrayList<>(AltarTier.values()[AltarTier.MAXTIERS - 1].getAltarComponents()).iterator(); private boolean cycleDone = false; private AltarComponent currentComponent; @@ -52,7 +52,7 @@ public class RitualAltarBuilder extends Ritual { } if (cycleDone) { - altarComponentsIterator = new ArrayList<>(AltarTier.SIX.getAltarComponents()).iterator(); + 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)) { From b59d5ce5b43892044b0d86c78ebf606473a1da0c Mon Sep 17 00:00:00 2001 From: TeamDman Date: Wed, 2 May 2018 00:20:49 -0400 Subject: [PATCH 352/595] fixed typo in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c945030e..a6ddd467 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ This mod requires "Minecraft Forge" in order to operate. It is incredibly easy t **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. +**A**: This has been suggested several times. It is 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! From 259b631f7d3cd08825b07fcf1fdeae77235adc60 Mon Sep 17 00:00:00 2001 From: TeamDman Date: Wed, 5 Dec 2018 15:47:30 -0500 Subject: [PATCH 353/595] added unregisterAltarComponent method --- .../bloodmagic/api/IBloodMagicAPI.java | 20 +++++++++++++++++++ .../bloodmagic/api/impl/BloodMagicAPI.java | 16 +++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java index 11ce4bce..99ab8b7b 100644 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java +++ b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java @@ -54,4 +54,24 @@ public interface IBloodMagicAPI { * @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: + *

        + * + * @param state The state to register + * @param componentType The type of Blood Altar component to unregister from. + */ + void unregisterAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType); + + } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index a779da4b..528f99ab 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -60,6 +60,22 @@ public class BloodMagicAPI implements IBloodMagicAPI { } else BMLog.API.warn("Invalid Altar component type: {}.", componentType); } + @Override + public void unregisterAltarComponent(@Nonnull IBlockState 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("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); From 54a2b053d0c71a9f5532d13a30f8ec51a050512a Mon Sep 17 00:00:00 2001 From: TeamDman Date: Wed, 5 Dec 2018 16:25:58 -0500 Subject: [PATCH 354/595] Fix Binding::fromStack returning null on stacks with binding tags Added Binding::toString --- .../java/WayofTime/bloodmagic/core/data/Binding.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java index e8182e9a..f288d6ae 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java @@ -57,9 +57,12 @@ public class Binding implements INBTSerializable { @Nullable public static Binding fromStack(ItemStack stack) { - if (!stack.hasTagCompound()) // Definitely hasn't been bound yet. +// if (!stack.hasTagCompound()) // Definitely hasn't been bound yet. +// return null; + if (stack.getTagCompound() == null) // hasTagCompound doesn't work on empty stacks with tags return null; + NBTBase bindingTag = stack.getTagCompound().getTag("binding"); if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.hasNoTags()) // Make sure it's both a tag compound and that it has actual data. return null; @@ -68,4 +71,9 @@ public class Binding implements INBTSerializable { binding.deserializeNBT((NBTTagCompound) bindingTag); return binding; } + + @Override + public String toString() { + return "Binding{" + "uuid=" + uuid + ", name='" + name + '\'' + '}'; + } } From 6f8741694c6277b4ade332916e5bd8f61ecd69f0 Mon Sep 17 00:00:00 2001 From: TeamDman Date: Thu, 6 Dec 2018 18:57:24 -0500 Subject: [PATCH 355/595] Reenable tier 6 with config option Revert of fd0326576475c137bc3f7ca73c2e3167aa1f8575 --- .../WayofTime/bloodmagic/ConfigHandler.java | 3 ++ .../WayofTime/bloodmagic/altar/AltarTier.java | 54 +++++++++---------- .../api/impl/BloodMagicCorePlugin.java | 11 ++-- .../bloodmagic/block/BlockDecorative.java | 13 +++++ .../block/enums/EnumDecorative.java | 5 +- .../compat/jei/BloodMagicJEIPlugin.java | 30 ++++++++--- .../bloodmagic/core/RegistrarBloodMagic.java | 34 ++++++------ .../core/RegistrarBloodMagicRecipes.java | 15 +++--- .../bloodmagic/item/ItemInscriptionTool.java | 7 +-- 9 files changed, 102 insertions(+), 70 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 85b20776..3681b7af 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -42,6 +42,9 @@ public class ConfigHandler 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 diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java index 105efae2..906c61e3 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.altar; +import WayofTime.bloodmagic.ConfigHandler; import com.google.common.collect.Lists; import net.minecraft.util.math.BlockPos; @@ -100,34 +101,33 @@ public enum AltarTier { } } }, -// SIX() { -// @Override -// public void buildComponents(Consumer components) { -// FIVE.getAltarComponents().forEach(components); -// -// 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(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 = -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()); -// } -// } -// }, - ; + SIX() { + @Override + public void buildComponents(Consumer components) { + FIVE.getAltarComponents().forEach(components); - public static final int MAXTIERS = values().length; + 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(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 = -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()); + } + } + }; + + public static final int MAXTIERS = ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent ? values().length : values().length-1; private List altarComponents; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index e8d2e44d..1725d095 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -2,10 +2,10 @@ 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.altar.ComponentType; import WayofTime.bloodmagic.api.IBloodMagicRecipeRegistrar; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockDecorative; @@ -17,9 +17,6 @@ import WayofTime.bloodmagic.incense.EnumTranquilityType; import WayofTime.bloodmagic.incense.TranquilityStack; import WayofTime.bloodmagic.util.StateUtil; import net.minecraft.block.Block; -import net.minecraft.block.properties.IProperty; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.EntityEntry; @@ -76,8 +73,10 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin 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()); -// 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()); + 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()) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java index 281b4fb5..76ae3392 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java @@ -1,10 +1,14 @@ 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.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; public class BlockDecorative extends BlockEnum { public BlockDecorative() { @@ -17,4 +21,13 @@ public class BlockDecorative extends BlockEnum { setSoundType(SoundType.STONE); setHarvestLevel("pickaxe", 2); } + + @Override + public void getSubBlocks(CreativeTabs 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/enums/EnumDecorative.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java index b0b31622..7bceae13 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java @@ -7,9 +7,8 @@ import java.util.Locale; public enum EnumDecorative implements IStringSerializable { BLOODSTONE_TILE, BLOODSTONE_BRICK, -// CRYSTAL_TILE, -// CRYSTAL_BRICK, - ; + CRYSTAL_TILE, + CRYSTAL_BRICK; @Override public String toString() { diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index 7f82a21a..d615e21d 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -1,22 +1,17 @@ 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.compat.jei.alchemyTable.AlchemyTableRecipeJEI; -import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; +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; @@ -29,6 +24,14 @@ 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 net.minecraft.item.ItemStack; @@ -86,6 +89,17 @@ public class BloodMagicJEIPlugin implements IModPlugin { 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) { + for (ItemStack stack : new ItemStack[]{ +// OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), //unregistered elsewhere + new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, EnumDecorative.CRYSTAL_TILE.ordinal()), + new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, EnumDecorative.CRYSTAL_BRICK.ordinal()), + new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, 1, EnumRuneType.DAWN.ordinal()) + }) { + jeiHelper.getIngredientBlacklist().addIngredientToBlacklist(stack); + } + } } @Override diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 2b352d8b..613d8fcc 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -1,5 +1,15 @@ 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.block.model.ModelResourceLocation; import net.minecraft.init.MobEffects; import net.minecraft.potion.Potion; @@ -16,20 +26,6 @@ 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; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; -import WayofTime.bloodmagic.entity.mob.EntityMimic; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -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; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @@ -47,8 +43,8 @@ public class RegistrarBloodMagic 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; + @GameRegistry.ObjectHolder("transcendent") + public static final BloodOrb ORB_TRANSCENDENT = ORB_DEF; public static final Potion BOOST = MobEffects.HASTE; public static final Potion WHIRLWIND = MobEffects.HASTE; @@ -76,8 +72,12 @@ public class RegistrarBloodMagic 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") -// new BloodOrb("transcendent", 6, 30000000, 50).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") ); + if (ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent) { + event.getRegistry().register( + new BloodOrb("transcendent", 6, 30000000, 50).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") + ); + } } @SubscribeEvent diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index fb416608..cbb2c54a 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -1,17 +1,18 @@ package WayofTime.bloodmagic.core; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.impl.BloodMagicRecipeRegistrar; +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.ritual.EnumRuneType; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.block.BlockLifeEssence; 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.init.Blocks; @@ -98,8 +99,10 @@ public class RegistrarBloodMagicRecipes registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.DEMONIC.getStack()), ItemSlate.SlateType.ETHEREAL.getStack(), AltarTier.FIVE.ordinal(), 30000, 40, 100); // SIX -// 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); + 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) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 67e87565..6f4bb703 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -1,11 +1,12 @@ 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.util.Constants; import WayofTime.bloodmagic.ritual.EnumRuneType; +import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.block.BlockRitualStone; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; @@ -41,7 +42,7 @@ public class ItemInscriptionTool extends ItemEnum.Variant implemen return; for (EnumRuneType runeType : types) { - if (runeType == EnumRuneType.BLANK) + if (runeType == EnumRuneType.BLANK || !ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent && runeType == EnumRuneType.DAWN) continue; ItemStack stack = new ItemStack(this, 1, runeType.ordinal()); From b8f57eca32dfde47df3b5b66f29a3f741fec38af Mon Sep 17 00:00:00 2001 From: TeamDman Date: Fri, 7 Dec 2018 01:18:02 -0500 Subject: [PATCH 356/595] Fix javadoc typo --- src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java index 99ab8b7b..ba7258e4 100644 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java +++ b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java @@ -68,7 +68,7 @@ public interface IBloodMagicAPI { *
      9. NOTAIR
      10. * * - * @param state The state to register + * @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); From 88e72ee0130dbcd44428a248133e190647a74512 Mon Sep 17 00:00:00 2001 From: TeamDman Date: Fri, 7 Dec 2018 01:19:54 -0500 Subject: [PATCH 357/595] Revert "fixed typo in readme" This reverts commit c6980fba --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6ddd467..c945030e 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ This mod requires "Minecraft Forge" in order to operate. It is incredibly easy t **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 is 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. +**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! From 002f23c53dfdedb9a5585671a13371925bba62c3 Mon Sep 17 00:00:00 2001 From: TeamDman Date: Fri, 7 Dec 2018 01:57:41 -0500 Subject: [PATCH 358/595] Changed LavaCrystal getBinding behaviour, cleaned up JEI hiding --- .../bloodmagic/compat/jei/BloodMagicJEIPlugin.java | 13 ++++--------- .../WayofTime/bloodmagic/core/data/Binding.java | 5 +---- .../WayofTime/bloodmagic/item/ItemLavaCrystal.java | 13 ++++++++++++- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index d615e21d..dce7a1c2 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -91,15 +91,10 @@ public class BloodMagicJEIPlugin implements IModPlugin { registry.addRecipeCatalyst(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE); if (!ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent) { - for (ItemStack stack : new ItemStack[]{ -// OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), //unregistered elsewhere - new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, EnumDecorative.CRYSTAL_TILE.ordinal()), - new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, EnumDecorative.CRYSTAL_BRICK.ordinal()), - new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, 1, EnumRuneType.DAWN.ordinal()) - }) { - jeiHelper.getIngredientBlacklist().addIngredientToBlacklist(stack); - } - } + 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 diff --git a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java index f288d6ae..3d7b8e2a 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java @@ -57,12 +57,9 @@ public class Binding implements INBTSerializable { @Nullable public static Binding fromStack(ItemStack stack) { -// if (!stack.hasTagCompound()) // Definitely hasn't been bound yet. -// return null; - if (stack.getTagCompound() == null) // hasTagCompound doesn't work on empty stacks with tags + if (!stack.hasTagCompound()) // Definitely hasn't been bound yet. return null; - NBTBase bindingTag = stack.getTagCompound().getTag("binding"); if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.hasNoTags()) // Make sure it's both a tag compound and that it has actual data. return null; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index ed4153a0..1b47e612 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -10,6 +10,9 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTUtil; import net.minecraft.potion.PotionEffect; import javax.annotation.Nonnull; @@ -59,7 +62,15 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide @Nullable @Override public Binding getBinding(ItemStack stack) { - return Binding.fromStack(stack); + if (stack.getTagCompound() == null) // hasTagCompound doesn't work on empty stacks with tags + return null; + + NBTBase bindingTag = stack.getTagCompound().getTag("binding"); + if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.hasNoTags()) // Make sure it's both a tag compound and that it has actual data. + return null; + + NBTTagCompound nbt = (NBTTagCompound) bindingTag; + return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")),nbt.getString("name")); } @Override From 8b9764036a496a5e1730a0668f7519df0977a7d8 Mon Sep 17 00:00:00 2001 From: Bunsan Date: Tue, 11 Dec 2018 13:54:37 +1030 Subject: [PATCH 359/595] Fix for small demon stone brick recipe so that it outputs 4 blocks as expected. (#1486) --- .../demon_decor/demon_brick_2_smallbrick_corrosive.json | 3 ++- .../demon_decor/demon_brick_2_smallbrick_destructive.json | 3 ++- .../recipes/demon_decor/demon_brick_2_smallbrick_raw.json | 3 ++- .../demon_decor/demon_brick_2_smallbrick_steadfast.json | 3 ++- .../recipes/demon_decor/demon_brick_2_smallbrick_vengeful.json | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) 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 index 11e92c0e..b67262f1 100644 --- 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 @@ -1,7 +1,8 @@ { "result": { "item": "bloodmagic:demon_brick_2", - "data": 1 + "data": 1, + "count": 4 }, "pattern": [ "ss", 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 index b3956493..aff6baa3 100644 --- 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 @@ -1,7 +1,8 @@ { "result": { "item": "bloodmagic:demon_brick_2", - "data": 2 + "data": 2, + "count": 4 }, "pattern": [ "ss", 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 index 7137a604..951faf2e 100644 --- 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 @@ -1,7 +1,8 @@ { "result": { "item": "bloodmagic:demon_brick_2", - "data": 0 + "data": 0, + "count": 4 }, "pattern": [ "ss", 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 index 24142cf4..3d1cc8d7 100644 --- 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 @@ -1,7 +1,8 @@ { "result": { "item": "bloodmagic:demon_brick_2", - "data": 4 + "data": 4, + "count": 4 }, "pattern": [ "ss", 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 index 6a889c25..405fe6f5 100644 --- 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 @@ -1,7 +1,8 @@ { "result": { "item": "bloodmagic:demon_brick_2", - "data": 3 + "data": 3, + "count": 4 }, "pattern": [ "ss", From 7435d498245840f9a72ade48c30d23879489b35a Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Mon, 31 Dec 2018 01:11:54 +0100 Subject: [PATCH 360/595] Refactored Cry of Eternal Soul for BM2. (#1488) * Refactored Cry of Eternal Soul for BM2. * Added entries for the english translation strings * Ticket handling fix * Using more comprehensive `addOffsetRunes` instead of `addRune`'s * Update src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java Co-Authored-By: Iorce * Update src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java Co-Authored-By: Iorce * Cleanup round 1 * cleanup round 2 --- .../ritual/types/RitualEternalSoul.java | 124 ++++++++++++++++++ .../assets/bloodmagic/lang/en_US.lang | 4 + 2 files changed, 128 insertions(+) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java new file mode 100644 index 00000000..01ff6e08 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java @@ -0,0 +1,124 @@ +package WayofTime.bloodmagic.ritual.types; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.altar.IBloodAltar; +import WayofTime.bloodmagic.block.BlockLifeEssence; +import WayofTime.bloodmagic.ritual.*; +import WayofTime.bloodmagic.util.helper.NetworkHelper; +import WayofTime.bloodmagic.util.helper.PlayerHelper; +import net.minecraft.entity.player.EntityPlayer; +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.IFluidHandler; + +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; + +@RitualRegister("eternal_soul") +public class RitualEternalSoul extends Ritual { + + + private IBloodAltar altar = null; + + public RitualEternalSoul() { + super("ritualEternalSoul", 2, 2000000, "ritual." + BloodMagic.MODID + ".eternalSoulRitual"); + } + + @Override + public void performRitual(IMasterRitualStone masterRitualStone) { + UUID owner = masterRitualStone.getOwner(); + int currentEssence = NetworkHelper.getSoulNetwork(owner).getCurrentEssence(); + World world = masterRitualStone.getWorldObj(); + BlockPos pos = masterRitualStone.getBlockPos(); + + if (this.altar == null) { + for (int i = -5; i <= 5; i++) { + for (int j = -5; j <= 5; j++) { + for (int k = -10; k <= 10; k++) { + if (world.getTileEntity(new BlockPos(pos.getX() + i, pos.getY() + j, pos.getZ() + k)) instanceof IBloodAltar) { + this.altar = (IBloodAltar) world.getTileEntity(new BlockPos(pos.getX() + i, pos.getY() + j, pos.getZ() + k)); + } + } + } + } + } + if (!(this.altar instanceof IFluidHandler)) + return; + + int horizontalRange = 15; + int verticalRange = 20; + + List list = world.getEntitiesWithinAABB(EntityPlayer.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)); + + EntityPlayer entityOwner = null; + for (EntityPlayer player : list) { + if (PlayerHelper.getUUIDFromPlayer(player) == owner) + entityOwner = player; + } + + int fillAmount = Math.min(currentEssence / 2, ((IFluidHandler) this.altar).fill(new FluidStack(BlockLifeEssence.getLifeEssence(), 10000), false)); + + ((IFluidHandler) this.altar).fill(new FluidStack(BlockLifeEssence.getLifeEssence(), fillAmount), true); + + if (entityOwner != null && entityOwner.getHealth() > 2.0f && fillAmount != 0) + entityOwner.setHealth(2.0f); + + 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, 0, 1, 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/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 4e51e06b..a1a159b0 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -618,6 +618,7 @@ 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.eternalSoulRitual=Cry of the Eternal Soul 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. @@ -748,6 +749,9 @@ ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=Unlike my comrades, I of 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.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 From 03d087595f1c60cc556cd68a049e332a2ccef813 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Mon, 31 Dec 2018 01:13:13 +0100 Subject: [PATCH 361/595] Reverence of the Condor port (#1490) * Ported Reverence of the Condor from 1.7.10. * Ported Reverence of the Condor from 1.7.10. * Removed my shame --- .../bloodmagic/ritual/types/RitualCondor.java | 89 +++++++++++++++++++ .../assets/bloodmagic/lang/en_US.lang | 2 + 2 files changed, 91 insertions(+) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java new file mode 100644 index 00000000..bc4232c0 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java @@ -0,0 +1,89 @@ +package WayofTime.bloodmagic.ritual.types; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.ritual.*; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +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(0, 0, 0), new BlockPos(10, 30, 10))); + setMaximumVolumeAndDistanceOfRange(FLIGHT_RANGE, 0, 100, 200); + } + + @Override + public void performRitual(IMasterRitualStone masterRitualStone) { + AxisAlignedBB aabb = getBlockRange(FLIGHT_RANGE).getAABB(masterRitualStone.getBlockPos()).expand(-10, 0, -10); + World world = masterRitualStone.getWorldObj(); + + int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); + + List entityPlayers = world.getEntitiesWithinAABB(EntityPlayer.class, aabb); + int entityCount = entityPlayers.size(); + + if (currentEssence < getRefreshCost() * entityCount) { + masterRitualStone.getOwnerNetwork().causeNausea(); + return; + } else { + entityCount = 0; + for (EntityPlayer player : entityPlayers) { + player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FLIGHT, 20, 0)); + } + } + + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * entityCount)); + } + + @Override + public int getRefreshTime() { + return 10; + } + + @Override + public int getRefreshCost() { + return getBlockRange(FLIGHT_RANGE).getVolume() / 10000; // cost of 2 LP per second per player with default configuration + } + + @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/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index a1a159b0..03702e15 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -618,6 +618,7 @@ 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.waterRitual.info=Generates a source of water from the master ritual stone. @@ -749,6 +750,7 @@ ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=Unlike my comrades, I of 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.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. From 6b1e9f401453dd78c0ece5432c9f7f754e025f00 Mon Sep 17 00:00:00 2001 From: iPopstop <26607111+iPopstop@users.noreply.github.com> Date: Mon, 31 Dec 2018 03:13:46 +0300 Subject: [PATCH 362/595] Update ru_RU.lang (#1473) * Update ru_RU.lang Minor grammar fixes * Update ru_RU.lang * Update Added: - alchemic_vial - baseComponent.catalyst_length_1 - baseComponent.catalyst_power_1 - bloodmagic.extraInfo (tooltip) - commands.bloodmagic.error.* Fixed: - bloodmagic.blood_shard - baseComponent.sulfur - bloodmagic.monster_soul.raw - bloodmagic.path.woodtile - bloodmagic.path.stonetile - bloodmagic.path.wornstonetile - bloodmagic.path.obsidiantile Updated: - bloodmagic.sanguineBook --- .../assets/bloodmagic/lang/ru_RU.lang | 322 +++++++++++++----- 1 file changed, 245 insertions(+), 77 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang index db0f46b8..0a76a026 100644 --- a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang +++ b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang @@ -3,17 +3,17 @@ itemGroup.bloodmagic.creativeTab=Blood Magic itemGroup.bloodmagic.creativeTabTome=Blood Magic Upgrade Tomes #Items -item.bloodmagic.activationCrystal.weak.name=Слабый криÑтал активации -item.bloodmagic.activationCrystal.awakened.name=Пробуждённый криÑтал активации -item.bloodmagic.activationCrystal.creative.name=ТворчеÑкий криÑтал активации +item.bloodmagic.activation_crystal.weak.name=Слабый криÑталл активации +item.bloodmagic.activation_crystal.awakened.name=Пробуждённый криÑталл активации +item.bloodmagic.activation_crystal.creative.name=ТворчеÑкий криÑталл активации -item.bloodmagic.sacrificialDagger.normal.name=Жертвенный кинжал -item.bloodmagic.sacrificialDagger.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.lavaCrystal.name=Лавовый криÑталл item.bloodmagic.bound.sword.name=СвÑзанный клинок item.bloodmagic.bound.pickaxe.name=СвÑÐ·Ð°Ð½Ð½Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° @@ -63,50 +63,81 @@ item.bloodmagic.reagent.virtus.name=Virtus item.bloodmagic.reagent.reductus.name=Reductus item.bloodmagic.reagent.potentia.name=Potentia -item.bloodmagic.bloodShard.weak.name=Слабый кровавый оÑколок -item.bloodmagic.bloodShard.demon.name=ДемоничеÑкий кровавый оÑколок +item.bloodmagic.blood_shard.weak.name=Слабый кровавый оÑколок +item.bloodmagic.blood_shard.demonic.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.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.reagentTeleposition.name=Реагент телепозиции -item.bloodmagic.baseComponent.reagentTransposition.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.monsterSoul.base.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.bloodLight.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.greenGrove.name=Сигил зеленой рощи -item.bloodmagic.sigil.elementalAffinity.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.fastMiner.name=Сигил быÑтрого ÐºÐ¾Ð¿Ð°Ñ‚ÐµÐ»Ñ +item.bloodmagic.sigil.fast_miner.name=Сигил быÑтрого ÐºÐ¾Ð¿Ð°Ñ‚ÐµÐ»Ñ item.bloodmagic.sigil.seer.name=Сигил Ð·Ñ€ÐµÐ½Ð¸Ñ -item.bloodmagic.sigil.phantomBridge.name=Сигил призрачного моÑта +item.bloodmagic.sigil.phantom_bridge.name=Сигил призрачного моÑта item.bloodmagic.sigil.whirlwind.name=Сигил Ð²Ð¸Ñ…Ñ€Ñ -item.bloodmagic.sigil.enderSeverance.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=Сигил транÑпозиции @@ -119,18 +150,20 @@ item.bloodmagic.sentientArmour.chest.name=Ð Ð°Ð·ÑƒÐ¼Ð½Ð°Ñ ÐºÐ¸Ñ€Ð°Ñа item.bloodmagic.sentientArmour.legs.name=Разумные поножи item.bloodmagic.sentientArmour.boots.name=Разумные ботинки -item.bloodmagic.altarMaker.name=Altar Maker +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.petty.name=Маленький адÑкий камень item.bloodmagic.soulGem.lesser.name=Ðебольшой адÑкий камень item.bloodmagic.soulGem.common.name=Обычный адÑкий камень item.bloodmagic.soulGem.greater.name=Большой адÑкий камень @@ -138,18 +171,33 @@ 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=&r&fÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° @@ -158,15 +206,14 @@ 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.self_sacrifice.name=Руна ÑÐ°Ð¼Ð¾Ð¿Ð¾Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ tile.bloodmagic.rune.displacement.name=Руна Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ tile.bloodmagic.rune.capacity.name=Руна ёмкоÑти -tile.bloodmagic.rune.augCapacity.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=Ритуальный камень Ð¾Ð³Ð½Ñ @@ -175,10 +222,10 @@ 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.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=Призрачный блок @@ -186,7 +233,10 @@ 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 @@ -194,29 +244,54 @@ 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.woodtile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ Ð´ÐµÑ€ÐµÐ²ÑÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° tile.bloodmagic.path.stone.name=ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.stoneTile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° +tile.bloodmagic.path.stonetile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° tile.bloodmagic.path.wornstone.name=Ð¡Ñ‚Ð°Ñ€Ð°Ñ ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.wornstoneTile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ ÑÑ‚Ð°Ñ€Ð°Ñ ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° +tile.bloodmagic.path.wornstonetile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ ÑÑ‚Ð°Ñ€Ð°Ñ ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° tile.bloodmagic.path.obsidian.name=ОбÑÐ¸Ð´Ð¸Ð°Ð½Ð¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.obsidianTile.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.config.disabled=Отключено в наÑтройках +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.blood_light.desc=&oЯ вижу Ñвет! tooltip.bloodmagic.sigil.compression.desc=&oКучи алмазов tooltip.bloodmagic.sigil.divination.desc=&oВзглÑд в душу tooltip.bloodmagic.sigil.divination.otherNetwork=ЗаглÑнем в душу %s @@ -224,15 +299,16 @@ 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.greenGrove.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=&oПоÑле 42 чашек кофе... -tooltip.bloodmagic.sigil.fastMiner.desc=&oÐ’Ñе глубже и глубже... +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 @@ -245,11 +321,15 @@ 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.whirlwind.desc=&oЛучше не надевать юбку tooltip.bloodmagic.sigil.enderSeverance.desc=&oÐеприÑтноÑти Ð´Ð»Ñ Ñтранников КраÑ! - tooltip.bloodmagic.sigil.teleposition.desc=Я очень близок к возможноÑти перемещениÑ. -tooltip.bloodmagic.sigil.transposition.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БезжалоÑтное уничтожение ÐºÐ°Ð¼Ð½Ñ @@ -260,30 +340,32 @@ tooltip.bloodmagic.sacrificialDagger.desc=Ðебольшой надрез на tooltip.bloodmagic.slate.desc=Камень, наполненный в кровавом алтаре tooltip.bloodmagic.inscriber.desc=ÐадпиÑи на Ñтене... -tooltip.bloodmagic.pack.selfSacrifice.desc=This pack really chafes... +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.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=Shift Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации +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=Может перемещать блоки @@ -295,7 +377,7 @@ 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.health=Здоровый tooltip.bloodmagic.livingArmour.upgrade.meleeDamage=Свирепый удар tooltip.bloodmagic.livingArmour.upgrade.arrowShot=Меткий Ñтрелок tooltip.bloodmagic.livingArmour.upgrade.stepAssist=Ð’Ñ‹Ñокий шаг @@ -303,11 +385,38 @@ 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=Этот камень может хранить Ñреднее количеÑтво Ñнергии @@ -324,6 +433,32 @@ 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=Ритуал вызова родника @@ -345,7 +480,11 @@ 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=ДровоÑек @@ -353,16 +492,24 @@ 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.damageSource=Душа %s Ñлишком оÑлабла -chat.bloodmagic.ritual.weak=Ð’Ñ‹ чувÑтвуете толчок, но Ñлишком Ñлабый, чтобы выполнить ритуал. -chat.bloodmagic.ritual.prevent=Ритуал ÑопротивлÑетÑÑ Ð²Ð°ÑˆÐµÐ¼Ñƒ воздейÑтвию! +chat.bloodmagic.ritual.weak=Ð’Ñ‹ Ñлишком Ñлабы, чтобы активировать ритуал. +chat.bloodmagic.ritual.prevent=Ритуал ÑопротивлÑетÑÑ Ð’Ð°Ð¼! chat.bloodmagic.ritual.activate=Потоки Ñнергии текут через ритуал! chat.bloodmagic.ritual.notValid=Ð’Ñ‹ чувÑтвуете, что руны ÑтоÑÑ‚ неправильно... @@ -370,11 +517,28 @@ chat.bloodmagic.livingArmour.upgrade.poisonRemove=You are starting to feel bette 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 @@ -382,15 +546,16 @@ jei.bloodmagic.recipe.drainRate=Потери: %d LP/t jei.bloodmagic.recipe.minimumSouls=Минимум: %1$,.2f Ñнергии jei.bloodmagic.recipe.soulsDrained=Затраты: %1$,.2f Ñнергии -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.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=&oSneak for Information +waila.bloodmagic.sneak=&oShift Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ информации waila.bloodmagic.array.reagent=Реагент: %s waila.bloodmagic.array.catalyst=Катализатор: %s -option.bloodmagic.bypassSneak=Bypass Sneak +option.bloodmagic.bypassSneak=ÐŸÐ¾Ð»Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±ÐµÐ· Shift option.bloodmagic.bloodAltar=Кровавый алтарь +option.bloodmagic.bloodTank=Резервуар крови option.bloodmagic.ritualController=Ритуальные камни option.bloodmagic.teleposer=Телепозер option.bloodmagic.array=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° @@ -402,3 +567,6 @@ tc.research_category.BLOODMAGIC=Sanguine Arcana 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=Заполнить Ñеть From 297771af815302e38141a5225df9e96a0f0a06ce Mon Sep 17 00:00:00 2001 From: Andrew Fontaine Date: Sun, 30 Dec 2018 19:14:27 -0500 Subject: [PATCH 363/595] Add Handlers for Ritual of Crushing (#1469) * Add Handlers for Ritual of Crushing Fixes the crushing ritual's corrosive will augment. * Simplify Handler Class Use Primitives, ensure return value is non-null * Make the Handler Handle Draining Per Use * Revert "Make the Handler Handle Draining Per Use" This reverts commit bacaa610febc5a609a7a891ceed41b0e0fb2f05d. --- .../java/WayofTime/bloodmagic/BloodMagic.java | 1 + .../bloodmagic/registry/ModRituals.java | 9 ++++ .../crushing/CrushingHandlerCuttingFluid.java | 49 +++++++++++++++++++ .../ritual/crushing/CrushingRegistry.java | 20 ++++++++ .../ritual/crushing/ICrushingHandler.java | 14 ++++++ .../ritual/types/RitualCrushing.java | 33 +++++-------- 6 files changed, 106 insertions(+), 20 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingHandlerCuttingFluid.java create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingRegistry.java create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index c132d776..c0413361 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -91,6 +91,7 @@ public class BloodMagic { ModRecipes.init(); ModRituals.initHarvestHandlers(); + ModRituals.initCuttingFluids(); MeteorConfigHandler.init(new File(configDir, "meteors")); ModArmourTrackers.init(); NetworkRegistry.INSTANCE.registerGuiHandler(BloodMagic.instance, new GuiHandler()); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index f33bbf22..8b1822e9 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -1,5 +1,8 @@ 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; @@ -19,4 +22,10 @@ public class ModRituals 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/ritual/crushing/CrushingHandlerCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingHandlerCuttingFluid.java new file mode 100644 index 00000000..6263059c --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingHandlerCuttingFluid.java @@ -0,0 +1,49 @@ +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 new file mode 100644 index 00000000..696663ea --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingRegistry.java @@ -0,0 +1,20 @@ +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 new file mode 100644 index 00000000..fb99faf7 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java @@ -0,0 +1,14 @@ +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/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 8f1a5855..49940c87 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -5,6 +5,8 @@ import WayofTime.bloodmagic.compress.CompressionRegistry; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; 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; @@ -117,29 +119,19 @@ public class RitualCrushing extends Ritual { ItemStack copyStack = checkStack.copy(); - for (Entry entry : cuttingFluidLPMap.entrySet()) { - ItemStack cuttingStack = entry.getKey(); - int lpDrain = entry.getValue(); - double willDrain = cuttingFluidWillMap.containsKey(cuttingStack) ? cuttingFluidWillMap.get(cuttingStack) : 0; + for (ICrushingHandler handler : CrushingRegistry.getCrushingHandlerList()) { + int lpDrain = handler.getLpDrain(); + double willDrain = handler.getWillDrain(); - if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) { - continue; - } + if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) { + continue; + } - cuttingStack = cuttingStack.copy(); - List input = new ArrayList<>(); - input.add(cuttingStack); - input.add(copyStack); + ItemStack result = handler.getRecipeOutput(copyStack, world, pos); - AlchemyTableRecipe recipe = AlchemyTableRecipeRegistry.getMatchingRecipe(input, world, pos); - if (recipe == null) { - continue; - } - - ItemStack result = recipe.getRecipeOutput(input); - if (result.isEmpty()) { - continue; - } + if (result.isEmpty()) { + continue; + } if (tile != null) { result = Utils.insertStackIntoTile(result, tile, EnumFacing.DOWN); @@ -158,6 +150,7 @@ public class RitualCrushing extends Ritual { isBlockClaimed = true; } + } if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, getFakePlayer((WorldServer) world))) { From 4f04fde1272ce29c23ab5f191f6166ac97674289 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Thu, 3 Jan 2019 06:59:46 +0100 Subject: [PATCH 364/595] Optimized and updated Bound Tools (#1500) Signed-off-by: tobias --- .../bloodmagic/item/ItemBoundAxe.java | 12 +++--- .../bloodmagic/item/ItemBoundPickaxe.java | 18 +++----- .../bloodmagic/item/ItemBoundShovel.java | 18 ++++---- .../bloodmagic/item/ItemBoundTool.java | 43 ++++++------------- 4 files changed, 35 insertions(+), 56 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 3e1e2610..903ce710 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -3,7 +3,6 @@ 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.BlockStack; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.util.helper.NetworkHelper; import com.google.common.collect.HashMultiset; @@ -68,26 +67,25 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { for (int j = 0; j <= 2 * range; j++) { for (int k = -range; k <= range; k++) { BlockPos blockPos = playerPos.add(i, j, k); - BlockStack blockStack = BlockStack.getStackFromPos(world, blockPos); + IBlockState blockState = world.getBlockState(blockPos); - if (blockStack.getBlock().isAir(blockStack.getState(), world, blockPos)) + if (world.isAirBlock(blockPos)) continue; - if (blockStack.getState().getMaterial() != Material.WOOD && !EFFECTIVE_ON.contains(blockStack.getBlock())) + if (blockState.getMaterial() != Material.WOOD && !EFFECTIVE_ON.contains(blockState.getBlock())) continue; - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, blockPos, blockStack.getState(), player); + 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, blockStack, drops, silkTouch, fortuneLvl); + 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); - dropStacks(drops, world, playerPos.add(0, 1, 0)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index eb2326a1..4b422e55 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -3,10 +3,9 @@ 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.BlockStack; -import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import com.google.common.collect.*; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -73,34 +72,31 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { 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); - BlockStack blockStack = BlockStack.getStackFromPos(world, blockPos); + IBlockState blockState = world.getBlockState(blockPos); - if (blockStack.getBlock().isAir(blockStack.getState(), world, blockPos)) + if (world.isAirBlock(blockPos)) continue; - if (blockStack.getState().getMaterial() != Material.ROCK && !EFFECTIVE_ON.contains(blockStack.getBlock())) + if (blockState.getMaterial() != Material.ROCK && !EFFECTIVE_ON.contains(blockState.getBlock())) continue; - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, blockPos, blockStack.getState(), player); + 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, blockStack, drops, silkTouch, fortuneLvl); + 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); - dropStacks(drops, world, playerPos.add(0, 1, 0)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index dba37f03..ec4b630e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -3,10 +3,11 @@ 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.BlockStack; import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import com.google.common.collect.*; +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.material.Material; import net.minecraft.block.state.IBlockState; @@ -66,27 +67,26 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { for (int j = 0; j <= 2 * range; j++) { for (int k = -range; k <= range; k++) { BlockPos blockPos = playerPos.add(i, j, k); - BlockStack blockStack = BlockStack.getStackFromPos(world, blockPos); + IBlockState blockState = world.getBlockState(blockPos); - if (blockStack.getBlock().isAir(blockStack.getState(), world, blockPos)) + if (world.isAirBlock(blockPos)) continue; - Material material = blockStack.getState().getMaterial(); - if (material != Material.GROUND && material != Material.CLAY && material != Material.GRASS && !EFFECTIVE_ON.contains(blockStack.getBlock())) + 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, blockStack.getState(), player); + 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, blockStack, drops, silkTouch, fortuneLvl); + 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); - dropStacks(drops, world, playerPos.add(0, 1, 0)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index f2aea812..eb89458c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -4,16 +4,15 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.event.BoundToolEvent; import WayofTime.bloodmagic.iface.IActivatable; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.util.ItemStackWrapper; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.NetworkHelper; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.*; +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.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; @@ -21,10 +20,10 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import net.minecraft.util.ActionResult; @@ -36,6 +35,7 @@ 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; @@ -235,36 +235,21 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { return chargeTime; } - protected static void dropStacks(Multiset drops, World world, BlockPos posToDrop) { - for (Multiset.Entry entry : drops.entrySet()) { - int count = entry.getCount(); - ItemStackWrapper stack = entry.getElement(); - int maxStackSize = stack.item.getItemStackLimit(stack.toStack(1)); + protected void sharedHarvest(ItemStack stack, World world, EntityPlayer player, BlockPos blockPos, IBlockState blockState, boolean silkTouch, int fortuneLvl) { - while (count >= maxStackSize) { - world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(maxStackSize))); - count -= maxStackSize; - } - - if (count > 0) - world.spawnEntity(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(count))); - } - } - - protected void sharedHarvest(ItemStack stack, World world, EntityPlayer player, BlockPos blockPos, BlockStack blockStack, HashMultiset drops, boolean silkTouch, int fortuneLvl){ - - if (blockStack.getBlock() != null && blockStack.getState().getBlockHardness(world, blockPos) != -1.0F) { - float strengthVsBlock = getDestroySpeed(stack, blockStack.getState()); + if (blockState.getBlockHardness(world, blockPos) != -1.0F) { + float strengthVsBlock = getDestroySpeed(stack, blockState); if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { - if (silkTouch && blockStack.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) - drops.add(new ItemStackWrapper(blockStack)); + if (silkTouch && blockState.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) + ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(Item.getItemFromBlock(blockState.getBlock()))); else { - List itemDrops = blockStack.getBlock().getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl); + NonNullList itemDrops = new NonNullList<>(); + blockState.getBlock().getDrops(itemDrops, world, blockPos, world.getBlockState(blockPos), fortuneLvl); for (ItemStack stacks : itemDrops) - drops.add(ItemStackWrapper.getHolder(stacks)); + ItemHandlerHelper.giveItemToPlayer(player, stacks); } - blockStack.getBlock().removedByPlayer(world.getBlockState(blockPos), world, blockPos,player, false); + blockState.getBlock().removedByPlayer(world.getBlockState(blockPos), world, blockPos, player, false); } } } From fa87ed0e17ffce8c097cbadc54f5a01877a270a3 Mon Sep 17 00:00:00 2001 From: tommyTT <3993801+tommyTT@users.noreply.github.com> Date: Sat, 5 Jan 2019 18:34:45 +0100 Subject: [PATCH 365/595] Bugfix attempt to remove render lag (see WayofTime#1457) (#1458) Simplified the whole branch since it got really messed up --- .../java/WayofTime/bloodmagic/tile/TileDemonCrystal.java | 8 ++++++-- .../java/WayofTime/bloodmagic/tile/base/TileBase.java | 8 ++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index d856cc42..052e8e2a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -35,8 +35,6 @@ public class TileDemonCrystal extends TileTicking { if (getWorld().isRemote) { - if(internalCounter % 20 == 0) - getWorld().markBlockRangeForRenderUpdate(pos, pos); return; } @@ -208,4 +206,10 @@ public class TileDemonCrystal extends TileTicking { 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/base/TileBase.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java index e39ba05f..18344853 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java @@ -97,6 +97,14 @@ public class TileBase extends TileEntity { public final void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { super.onDataPacket(net, pkt); readFromNBT(pkt.getNbtCompound()); + onDataPacketClientReceived(); + } + + /** + * Hook for performing client side updates after data packets are received and processed + */ + protected void onDataPacketClientReceived() { + // noop } @Override From 7e2251b8e5c25059ba15b23ba55e27e77724374a Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Sun, 20 Jan 2019 23:50:31 +0100 Subject: [PATCH 366/595] Hymn of Syphoning (pump) tank render fix (#1521) * Hymn of Syphoning (pump) tank render fix Every Hymn of Syphoning (RitualPump) filling of the IFluidHandler now also triggers a block update for the block above the MRS, rerendering the tank contents to be up to date with the new fill status immediatly. * Stonestate for replaced blocks --- .../java/WayofTime/bloodmagic/ritual/types/RitualPump.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java index 2fb5001a..c713721a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java @@ -80,7 +80,8 @@ public class RitualPump extends Ritual { masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); fluidHandler.fill(posInfo.getRight(), true); world.setBlockState(posInfo.getLeft(), Blocks.STONE.getDefaultState()); - world.notifyBlockUpdate(posInfo.getLeft(), tankState, tankState, 3); + world.notifyBlockUpdate(posInfo.getLeft(), Blocks.STONE.getDefaultState(), Blocks.STONE.getDefaultState(), 3); + world.notifyBlockUpdate(tileEntity.getPos(), tankState, tankState, 3); blockPosIterator.remove(); } } From c6a315a51c21c1a101264f612dfeebbbce2f3cf6 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Mon, 21 Jan 2019 00:16:22 +0100 Subject: [PATCH 367/595] Fixed compile-time fatal error (#1510) Added Creative handling --- .../bloodmagic/item/ItemBoundTool.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index eb89458c..128751c6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -241,14 +241,15 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { float strengthVsBlock = getDestroySpeed(stack, blockState); if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { - if (silkTouch && blockState.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) - ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(Item.getItemFromBlock(blockState.getBlock()))); - else { - NonNullList itemDrops = new NonNullList<>(); - blockState.getBlock().getDrops(itemDrops, world, blockPos, world.getBlockState(blockPos), fortuneLvl); - for (ItemStack stacks : itemDrops) - ItemHandlerHelper.giveItemToPlayer(player, stacks); - } + 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); } } From ffdf627c187124507020fe39a7d4b1f526f150cd Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Mon, 21 Jan 2019 00:17:00 +0100 Subject: [PATCH 368/595] Added simple GuideBook documentation for all rituals (#1515) * Added simple GuideBook documentation for all rituals (including coming ups from PRs) without Lore (added an info at the top of each entry that it requires lore (##REQ-LORE##)). This should enable everyone that uses the GuideBook to use the rituals. * Reverted Bound tool change --- .../compat/guideapi/book/CategoryRitual.java | 19 ++++++++++-- .../assets/bloodmagicguide/lang/en_US.lang | 30 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index 0a82b197..d94d2717 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.ritual.EnumRuneType; 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; @@ -116,6 +116,21 @@ public class CategoryRitual 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); for (Entry entry : entries.entrySet()) { diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index 19683fb1..4107efc8 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -51,6 +51,21 @@ 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 # 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. @@ -83,6 +98,21 @@ guide.bloodmagic.entry.ritual.timberman.info=Got wood? This ritual has you cover 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\ŧ 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 # Architect Entries guide.bloodmagic.entry.architect.intro=Foreword From 31c606495c276ea66cefd8a347b2e6a63c09a2d5 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Mon, 21 Jan 2019 00:20:03 +0100 Subject: [PATCH 369/595] Mark of the Falling Tower meteor costs are now configurable (#1518) * Mark of the Falling Tower meteor costs are now configurable via an additonal field "cost" in the .json config files if BM is updated from an old version, this would require meteor configuration to be regenerated or costs to be added manually; meteors would be for free (LP-wise) otherwise. These are the new default costs: IRON: 1,000,000 (same as before) GOLD: 2,500,000 DIAMOND: 5,000,000 (requires Archmage Blood Orb) * Meteor version update * Reverted Bound tool change * Probably proper preconfigured power proposition --- .../WayofTime/bloodmagic/meteor/Meteor.java | 9 ++++++ .../meteor/MeteorConfigHandler.java | 9 ++++-- .../bloodmagic/ritual/types/RitualMeteor.java | 29 +++++++++++++------ 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java index f547c205..55f5728f 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java @@ -18,6 +18,7 @@ public class Meteor { 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; @@ -103,4 +104,12 @@ public class Meteor { 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/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index c6e1b65c..e72de2e3 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -109,7 +109,8 @@ public class MeteorConfigHandler { 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(2); + ironMeteor.setVersion(3); + ironMeteor.setCost(1000000); // Gold List goldMeteorList = Lists.newArrayList(); @@ -122,7 +123,8 @@ public class MeteorConfigHandler { 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(3); + goldMeteor.setVersion(4); + goldMeteor.setCost(2500000); // Diamond List diamondMeteorList = Lists.newArrayList(); @@ -134,7 +136,8 @@ public class MeteorConfigHandler { 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(3); + diamondMeteor.setVersion(4); + diamondMeteor.setCost(5000000); holders.add(Pair.of("iron", ironMeteor)); DEFAULT_METEORS.put("iron", ironMeteor); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java index b9dbc916..1a5258d8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java @@ -1,12 +1,13 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.EnumDemonWillType; +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.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -21,7 +22,7 @@ public class RitualMeteor extends Ritual { public static final double destructiveWillDrain = 50; public RitualMeteor() { - super("ritualMeteor", 0, 1000000, "ritual." + BloodMagic.MODID + ".meteorRitual"); + super("ritualMeteor", 0, 0, "ritual." + BloodMagic.MODID + ".meteorRitual"); addBlockRange(ITEM_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); setMaximumVolumeAndDistanceOfRange(ITEM_RANGE, 0, 10, 10); } @@ -53,15 +54,25 @@ public class RitualMeteor extends Ritual { for (EntityItem entityItem : itemList) { ItemStack stack = entityItem.getItem(); Meteor meteor = MeteorRegistry.getMeteorForItem(stack); - if (meteor != null) { - 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 (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) { - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(1000000)); + network.syphon(masterRitualStone.ticket(cost / 10)); } else { masterRitualStone.setActive(false); } From 399c2723d342b0477de592d41de72d41e24889b5 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Mon, 21 Jan 2019 00:24:28 +0100 Subject: [PATCH 370/595] Capable fluid sigils (#1517) * Inital commit. Water Sigil can now be used as infinite water tank item to fill machines with water (as long as you have LP) (Doesn't use LP yet). * Should now work for all fluid sigils. * Reverted Bound tool change * Moved the code out of the spacey loft IDE said it's ok... or something --- .../item/sigil/ItemSigilFluidBase.java | 52 +++++++++++- .../bloodmagic/item/sigil/ItemSigilVoid.java | 41 +++++++++- .../bloodmagic/util/ISigilFluidItem.java | 12 +++ .../bloodmagic/util/SigilFluidWrapper.java | 81 +++++++++++++++++++ 4 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java create mode 100644 src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java index 614f87f4..ac1ef35b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java @@ -1,14 +1,23 @@ 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.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; 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; @@ -20,7 +29,7 @@ import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper; import javax.annotation.Nullable; -public abstract class ItemSigilFluidBase extends ItemSigilBase { +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; @@ -125,4 +134,45 @@ public abstract class ItemSigilFluidBase extends ItemSigilBase { 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, NBTTagCompound nbt) { + return new SigilFluidWrapper(stack, this); + } + } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 702e692c..8b321eb4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -1,5 +1,7 @@ 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; @@ -12,6 +14,7 @@ import net.minecraft.util.EnumHand; 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 { @@ -52,7 +55,43 @@ public class ItemSigilVoid extends ItemSigilFluidBase { } } } - 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/util/ISigilFluidItem.java b/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java new file mode 100644 index 00000000..920b21de --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java @@ -0,0 +1,12 @@ +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/SigilFluidWrapper.java b/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java new file mode 100644 index 00000000..51319174 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java @@ -0,0 +1,81 @@ +package WayofTime.bloodmagic.util; + +import WayofTime.bloodmagic.item.sigil.ItemSigilFluidBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +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, EnumFacing from) { + return capability == CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY; + } + + @Override + public T getCapability(Capability capability, final EnumFacing 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 From 415d3f1f4284bbd62a0239abbfa274dbbe16daca Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Tue, 22 Jan 2019 00:06:38 +0100 Subject: [PATCH 371/595] Fixed RitualReader (RitualTinkerer) area setting ability. (#1505) * Fixed RitualReader (RitualTinkerer) area setting ability. Signed-off-by: tobias * Update TileMasterRitualStone.java * Interface tidied up --- .../bloodmagic/ritual/IMasterRitualStone.java | 10 +++ .../WayofTime/bloodmagic/ritual/Ritual.java | 16 +---- .../ritual/types/RitualAnimalGrowth.java | 4 +- .../ritual/types/RitualArmourEvolve.java | 2 +- .../ritual/types/RitualCobblestone.java | 2 +- .../bloodmagic/ritual/types/RitualCondor.java | 4 +- .../ritual/types/RitualContainment.java | 2 +- .../ritual/types/RitualCrushing.java | 4 +- .../ritual/types/RitualCrystalHarvest.java | 2 +- .../ritual/types/RitualEllipsoid.java | 4 +- .../ritual/types/RitualExpulsion.java | 2 +- .../ritual/types/RitualFeatheredKnife.java | 4 +- .../ritual/types/RitualFelling.java | 4 +- .../ritual/types/RitualForsakenSoul.java | 4 +- .../ritual/types/RitualFullStomach.java | 4 +- .../ritual/types/RitualGreenGrove.java | 6 +- .../ritual/types/RitualHarvest.java | 2 +- .../ritual/types/RitualInterdiction.java | 2 +- .../ritual/types/RitualJumping.java | 2 +- .../bloodmagic/ritual/types/RitualLava.java | 10 +-- .../types/RitualLivingArmourDowngrade.java | 2 +- .../ritual/types/RitualMagnetic.java | 2 +- .../bloodmagic/ritual/types/RitualMeteor.java | 2 +- .../bloodmagic/ritual/types/RitualPlacer.java | 4 +- .../bloodmagic/ritual/types/RitualPump.java | 2 +- .../ritual/types/RitualRegeneration.java | 4 +- .../bloodmagic/ritual/types/RitualSpeed.java | 2 +- .../ritual/types/RitualSuppression.java | 2 +- .../ritual/types/RitualUpgradeRemove.java | 2 +- .../bloodmagic/ritual/types/RitualWater.java | 2 +- .../ritual/types/RitualWellOfSuffering.java | 2 +- .../bloodmagic/ritual/types/RitualZephyr.java | 4 +- .../tile/TileMasterRitualStone.java | 64 ++++++++++++++----- 33 files changed, 106 insertions(+), 78 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index eb61019c..2fec7fa8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -9,7 +9,9 @@ import net.minecraft.util.EnumFacing; 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.UUID; /** @@ -22,6 +24,8 @@ public interface IMasterRitualStone { SoulNetwork getOwnerNetwork(); + Map modableRangeMap = new HashMap<>(); + boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator, Ritual ritual); void performRitual(World world, BlockPos pos); @@ -61,4 +65,10 @@ public interface IMasterRitualStone { 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java index be545f56..7e642e6c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java @@ -15,6 +15,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.*; import java.util.Map.Entry; +import java.util.function.BiFunction; import java.util.function.Consumer; /** @@ -185,20 +186,7 @@ public abstract class Ritual { return rangeList.get(0); } - public boolean setBlockRangeByBounds(String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2) { - AreaDescriptor descriptor = this.getBlockRange(range); - World world = master.getWorldObj(); - BlockPos masterPos = master.getBlockPos(); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, masterPos); - if (canBlockRangeBeModified(range, descriptor, master, offset1, offset2, holder)) { - descriptor.modifyAreaByBlockPositions(offset1, offset2); - return true; - } - - return false; - } - - protected boolean canBlockRangeBeModified(String range, AreaDescriptor descriptor, IMasterRitualStone master, BlockPos offset1, BlockPos offset2, DemonWillHolder holder) { + public boolean 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java index 401398cc..f92b2db3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java @@ -56,7 +56,7 @@ public class RitualAnimalGrowth extends Ritual { int totalGrowths = 0; BlockPos pos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity chest = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); IItemHandler itemHandler = null; if (chest != null) { @@ -83,7 +83,7 @@ public class RitualAnimalGrowth extends Ritual { boolean breedAnimals = steadfastWill >= steadfastWillDrain && itemHandler != null; boolean kamikaze = destructiveWill >= destructiveWillDrain; - AreaDescriptor growingRange = getBlockRange(GROWTH_RANGE); + AreaDescriptor growingRange = masterRitualStone.getBlockRange(GROWTH_RANGE); AxisAlignedBB axis = growingRange.getAABB(masterRitualStone.getBlockPos()); List animalList = world.getEntitiesWithinAABB(EntityAnimal.class, axis); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java index 175069ea..77251191 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java @@ -33,7 +33,7 @@ public class RitualArmourEvolve extends Ritual { BlockPos pos = masterRitualStone.getBlockPos(); - AreaDescriptor checkRange = getBlockRange(CHECK_RANGE); + AreaDescriptor checkRange = masterRitualStone.getBlockRange(CHECK_RANGE); List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, checkRange.getAABB(pos)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java index f9d0d6e9..34321638 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java @@ -37,7 +37,7 @@ public class RitualCobblestone extends Ritual { int maxEffects = currentEssence / getRefreshCost(); int totalEffects = 0; - AreaDescriptor cobblestoneRange = getBlockRange(COBBLESTONE_RANGE); + AreaDescriptor cobblestoneRange = masterRitualStone.getBlockRange(COBBLESTONE_RANGE); if (tileEntity != null && tileEntity instanceof TileAlchemyArray) { TileAlchemyArray alchemyArray = (TileAlchemyArray) tileEntity; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java index bc4232c0..a7f4b618 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java @@ -24,7 +24,7 @@ public class RitualCondor extends Ritual { @Override public void performRitual(IMasterRitualStone masterRitualStone) { - AxisAlignedBB aabb = getBlockRange(FLIGHT_RANGE).getAABB(masterRitualStone.getBlockPos()).expand(-10, 0, -10); + AxisAlignedBB aabb = masterRitualStone.getBlockRange(FLIGHT_RANGE).getAABB(masterRitualStone.getBlockPos()).expand(-10, 0, -10); World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); @@ -52,7 +52,7 @@ public class RitualCondor extends Ritual { @Override public int getRefreshCost() { - return getBlockRange(FLIGHT_RANGE).getVolume() / 10000; // cost of 2 LP per second per player with default configuration + return 5; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java index 51c8432e..a8224955 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java @@ -29,7 +29,7 @@ public class RitualContainment extends Ritual { return; } - AreaDescriptor containmentRange = getBlockRange(CONTAINMENT_RANGE); + AreaDescriptor containmentRange = masterRitualStone.getBlockRange(CONTAINMENT_RANGE); for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, containmentRange.getAABB(masterRitualStone.getBlockPos()))) { if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || ((EntityPlayer) entity).getGameProfile().getId().equals(masterRitualStone.getOwner()))) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 49940c87..2d56e16f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -70,7 +70,7 @@ public class RitualCrushing extends Ritual { } BlockPos pos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); if (tile != null && Utils.getNumberOfFreeSlots(tile, EnumFacing.DOWN) < 1) { @@ -94,7 +94,7 @@ public class RitualCrushing extends Ritual { int fortune = destructiveWill > 0 ? 3 : 0; - AreaDescriptor crushingRange = getBlockRange(CRUSHING_RANGE); + AreaDescriptor crushingRange = masterRitualStone.getBlockRange(CRUSHING_RANGE); boolean hasOperated = false; double rawDrain = 0; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java index a28c8433..7382f09f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java @@ -35,7 +35,7 @@ public class RitualCrystalHarvest extends Ritual { int maxEffects = 1; int totalEffects = 0; - AreaDescriptor crystalRange = getBlockRange(CRYSTAL_RANGE); + AreaDescriptor crystalRange = masterRitualStone.getBlockRange(CRYSTAL_RANGE); crystalRange.resetIterator(); while (crystalRange.hasNext()) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java index 636e5806..ad04ccfd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -42,7 +42,7 @@ public class RitualEllipsoid extends Ritual int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); if (currentEssence < getRefreshCost()) @@ -51,7 +51,7 @@ public class RitualEllipsoid extends Ritual return; } - AreaDescriptor sphereRange = getBlockRange(SPHEROID_RANGE); + 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; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java index 1294ea4f..358925b5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java @@ -48,7 +48,7 @@ public class RitualExpulsion extends Ritual { if (masterRitualStone.getWorldObj().isRemote) return; - AreaDescriptor expulsionRange = getBlockRange(EXPULSION_RANGE); + AreaDescriptor expulsionRange = masterRitualStone.getBlockRange(EXPULSION_RANGE); List whitelist = Lists.newArrayList(); BlockPos masterPos = masterRitualStone.getBlockPos(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java index eae72593..7706e112 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java @@ -80,7 +80,7 @@ public class RitualFeatheredKnife extends Ritual { TileEntity tile = world.getTileEntity(altarPos); - AreaDescriptor altarRange = getBlockRange(ALTAR_RANGE); + AreaDescriptor altarRange = masterRitualStone.getBlockRange(ALTAR_RANGE); if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof IBloodAltar)) { for (BlockPos newPos : altarRange.getContainedPositions(pos)) { @@ -100,7 +100,7 @@ public class RitualFeatheredKnife extends Ritual { if (tile instanceof IBloodAltar) { IBloodAltar tileAltar = (IBloodAltar) tile; - AreaDescriptor damageRange = getBlockRange(DAMAGE_RANGE); + AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); AxisAlignedBB range = damageRange.getAABB(pos); double destructiveDrain = 0; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java index 6e1f01e1..c116c0b5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java @@ -46,7 +46,7 @@ public class RitualFelling extends Ritual { int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); if (currentEssence < getRefreshCost()) { @@ -55,7 +55,7 @@ public class RitualFelling extends Ritual { } if (!cached || treePartsCache.isEmpty()) { - for (BlockPos blockPos : getBlockRange(FELLING_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java index 7caf6c88..ea908c27 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java @@ -86,7 +86,7 @@ public class RitualForsakenSoul extends Ritual { List crystalList = new ArrayList<>(); - AreaDescriptor crystalRange = getBlockRange(CRYSTAL_RANGE); + AreaDescriptor crystalRange = masterRitualStone.getBlockRange(CRYSTAL_RANGE); crystalRange.resetIterator(); while (crystalRange.hasNext()) { @@ -97,7 +97,7 @@ public class RitualForsakenSoul extends Ritual { } } - AreaDescriptor damageRange = getBlockRange(DAMAGE_RANGE); + AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); AxisAlignedBB range = damageRange.getAABB(pos); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, range); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java index b803b810..0618d119 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java @@ -39,14 +39,14 @@ public class RitualFullStomach extends Ritual { int maxEffects = currentEssence / getRefreshCost(); int totalEffects = 0; - AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + 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 = getBlockRange(FILL_RANGE); + AreaDescriptor fillingRange = masterRitualStone.getBlockRange(FILL_RANGE); List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, fillingRange.getAABB(pos)); for (EntityPlayer player : playerList) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java index d8cdf397..19bd678b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java @@ -80,7 +80,7 @@ public class RitualGreenGrove extends Ritual { double rawDrain = 0; double vengefulDrain = 0; - AreaDescriptor growingRange = getBlockRange(GROW_RANGE); + 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)) { @@ -126,7 +126,7 @@ public class RitualGreenGrove extends Ritual { WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrain, true); } - AreaDescriptor hydrateRange = getBlockRange(HYDRATE_RANGE); + AreaDescriptor hydrateRange = masterRitualStone.getBlockRange(HYDRATE_RANGE); double steadfastDrain = 0; if (steadfastWill > steadfastWillDrain) { @@ -167,7 +167,7 @@ public class RitualGreenGrove extends Ritual { double corrosiveDrain = 0; if (corrosiveWill > corrosiveWillDrain) { - AreaDescriptor leechRange = getBlockRange(LEECH_RANGE); + AreaDescriptor leechRange = masterRitualStone.getBlockRange(LEECH_RANGE); AxisAlignedBB mobArea = leechRange.getAABB(pos); List entityList = world.getEntitiesWithinAABB(EntityLivingBase.class, mobArea); for (EntityLivingBase entityLiving : entityList) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java index fed3bb5b..78722805 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java @@ -52,7 +52,7 @@ public class RitualHarvest extends Ritual { int harvested = 0; - AreaDescriptor harvestArea = getBlockRange(HARVEST_RANGE); + AreaDescriptor harvestArea = masterRitualStone.getBlockRange(HARVEST_RANGE); harvestArea.resetIterator(); while (harvestArea.hasNext()) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java index 861b2f32..a1a38ea0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java @@ -29,7 +29,7 @@ public class RitualInterdiction extends Ritual { return; } - AreaDescriptor interdictionRange = getBlockRange(INTERDICTION_RANGE); + AreaDescriptor interdictionRange = masterRitualStone.getBlockRange(INTERDICTION_RANGE); for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, interdictionRange.getAABB(masterRitualStone.getBlockPos()))) { if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || ((EntityPlayer) entity).getGameProfile().getId().equals(masterRitualStone.getOwner()))) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java index 975f84d7..0321bd79 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java @@ -34,7 +34,7 @@ public class RitualJumping extends Ritual { int maxEffects = currentEssence / getRefreshCost(); int totalEffects = 0; - AreaDescriptor jumpRange = getBlockRange(JUMP_RANGE); + AreaDescriptor jumpRange = masterRitualStone.getBlockRange(JUMP_RANGE); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, jumpRange.getAABB(masterRitualStone.getBlockPos())); for (EntityLivingBase entity : entities) { if (totalEffects >= maxEffects) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index e7e064a8..b247bcab 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -76,7 +76,7 @@ public class RitualLava extends Ritual { double rawDrained = 0; DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, pos); - AreaDescriptor lavaRange = getBlockRange(LAVA_RANGE); + 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)) { @@ -102,7 +102,7 @@ public class RitualLava extends Ritual { } if (rawWill > 0) { - AreaDescriptor chestRange = getBlockRange(LAVA_TANK_RANGE); + AreaDescriptor chestRange = masterRitualStone.getBlockRange(LAVA_TANK_RANGE); TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); double drain = getWillCostForRawWill(rawWill); int lpCost = getLPCostForRawWill(rawWill); @@ -131,7 +131,7 @@ public class RitualLava extends Ritual { if (vengefulWill >= vengefulWillDrain) { double vengefulDrained = 0; - AreaDescriptor fuseRange = getBlockRange(FIRE_FUSE_RANGE); + AreaDescriptor fuseRange = masterRitualStone.getBlockRange(FIRE_FUSE_RANGE); AxisAlignedBB fuseArea = fuseRange.getAABB(pos); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, fuseArea); @@ -160,7 +160,7 @@ public class RitualLava extends Ritual { if (steadfastWill >= steadfastWillDrain) { double steadfastDrained = 0; - AreaDescriptor resistRange = getBlockRange(FIRE_RESIST_RANGE); + AreaDescriptor resistRange = masterRitualStone.getBlockRange(FIRE_RESIST_RANGE); int duration = getFireResistForWill(steadfastWill); @@ -186,7 +186,7 @@ public class RitualLava extends Ritual { if (timer % corrosiveRefreshTime == 0 && corrosiveWill >= corrosiveWillDrain) { double corrosiveDrained = 0; - AreaDescriptor resistRange = getBlockRange(FIRE_DAMAGE_RANGE); + AreaDescriptor resistRange = masterRitualStone.getBlockRange(FIRE_DAMAGE_RANGE); float damage = getCorrosiveDamageForWill(corrosiveWill); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java index 35aa10ba..ea2da47c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java @@ -49,7 +49,7 @@ public class RitualLivingArmourDowngrade extends Ritual { BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor downgradeRange = getBlockRange(DOWNGRADE_RANGE); + AreaDescriptor downgradeRange = masterRitualStone.getBlockRange(DOWNGRADE_RANGE); boolean isActivatorPresent = false; for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, downgradeRange.getAABB(masterRitualStone.getBlockPos()))) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index 1ad109a9..108b7c50 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -46,7 +46,7 @@ public class RitualMagnetic extends Ritual { BlockPos pos = masterRitualStone.getBlockPos(); - AreaDescriptor placementRange = getBlockRange(PLACEMENT_RANGE); + AreaDescriptor placementRange = masterRitualStone.getBlockRange(PLACEMENT_RANGE); BlockPos replacement = pos; boolean replace = false; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java index 1a5258d8..9cffa010 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java @@ -42,7 +42,7 @@ public class RitualMeteor extends Ritual { double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - AreaDescriptor itemDetectionRange = getBlockRange(ITEM_RANGE); + AreaDescriptor itemDetectionRange = masterRitualStone.getBlockRange(ITEM_RANGE); List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDetectionRange.getAABB(pos)); double radiusModifier = getRadiusModifier(rawWill); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java index 90469c94..5407b258 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java @@ -33,7 +33,7 @@ public class RitualPlacer extends Ritual { public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity tileEntity = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); @@ -43,7 +43,7 @@ public class RitualPlacer extends Ritual { return; } - AreaDescriptor areaDescriptor = getBlockRange(PLACER_RANGE); + AreaDescriptor areaDescriptor = masterRitualStone.getBlockRange(PLACER_RANGE); if (tileEntity != null) { if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java index c713721a..957145c0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java @@ -56,7 +56,7 @@ public class RitualPump extends Ritual { if (fluidHandler.getTankProperties()[0].getContents() != null && fluidHandler.getTankProperties()[0].getContents().amount >= maxDrain) return; - for (BlockPos pos : getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) { + for (BlockPos pos : masterRitualStone.getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) { IBlockState state = world.getBlockState(pos); IFluidHandler blockHandler = null; if (state.getBlock() instanceof BlockLiquid) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java index 1f431459..50db44a2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java @@ -71,10 +71,10 @@ public class RitualRegeneration extends Ritual { float absorptionRate = 1; int maxAbsorption = 20; - AreaDescriptor healArea = getBlockRange(HEAL_RANGE); + AreaDescriptor healArea = masterRitualStone.getBlockRange(HEAL_RANGE); AxisAlignedBB healRange = healArea.getAABB(pos); - AreaDescriptor damageArea = getBlockRange(VAMPIRE_RANGE); + AreaDescriptor damageArea = masterRitualStone.getBlockRange(VAMPIRE_RANGE); AxisAlignedBB damageRange = damageArea.getAABB(pos); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, healRange); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java index c40fb66a..5a1eb618 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java @@ -50,7 +50,7 @@ public class RitualSpeed extends Ritual { double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - AreaDescriptor speedRange = getBlockRange(SPEED_RANGE); + AreaDescriptor speedRange = masterRitualStone.getBlockRange(SPEED_RANGE); double vengefulDrain = 0; double destructiveDrain = 0; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java index 5934ab9f..bbf02e04 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java @@ -31,7 +31,7 @@ public class RitualSuppression extends Ritual { } final int refresh = 100; - AreaDescriptor suppressionRange = getBlockRange(SUPPRESSION_RANGE); + AreaDescriptor suppressionRange = masterRitualStone.getBlockRange(SUPPRESSION_RANGE); for (BlockPos blockPos : suppressionRange.getContainedPositions(masterRitualStone.getBlockPos())) { IBlockState state = world.getBlockState(blockPos); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java index ba9d5a04..c8e210ef 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java @@ -40,7 +40,7 @@ public class RitualUpgradeRemove extends Ritual { BlockPos pos = masterRitualStone.getBlockPos(); - AreaDescriptor checkRange = getBlockRange(CHECK_RANGE); + AreaDescriptor checkRange = masterRitualStone.getBlockRange(CHECK_RANGE); List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, checkRange.getAABB(pos)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java index c4f7d6b1..27a7b7fd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java @@ -31,7 +31,7 @@ public class RitualWater extends Ritual { int maxEffects = currentEssence / getRefreshCost(); int totalEffects = 0; - AreaDescriptor waterRange = getBlockRange(WATER_RANGE); + AreaDescriptor waterRange = masterRitualStone.getBlockRange(WATER_RANGE); for (BlockPos newPos : waterRange.getContainedPositions(masterRitualStone.getBlockPos())) { if (world.isAirBlock(newPos)) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index 7a27fce3..302af3cd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -53,7 +53,7 @@ public class RitualWellOfSuffering extends Ritual { TileEntity tile = world.getTileEntity(altarPos); - AreaDescriptor altarRange = getBlockRange(ALTAR_RANGE); + AreaDescriptor altarRange = masterRitualStone.getBlockRange(ALTAR_RANGE); if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof TileAltar)) { for (BlockPos newPos : altarRange.getContainedPositions(pos)) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java index 9935e162..1690ac88 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java @@ -32,7 +32,7 @@ public class RitualZephyr extends Ritual { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); if (!masterRitualStone.getWorldObj().isRemote && tileInventory != null) { if (currentEssence < getRefreshCost()) { @@ -40,7 +40,7 @@ public class RitualZephyr extends Ritual { return; } - AreaDescriptor zephyrRange = getBlockRange(ZEPHYR_RANGE); + AreaDescriptor zephyrRange = masterRitualStone.getBlockRange(ZEPHYR_RANGE); List itemList = world.getEntitiesWithinAABB(EntityItem.class, zephyrRange.getAABB(masterRitualStone.getBlockPos())); int count = 0; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 510e8932..1383ae47 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -2,7 +2,10 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.ritual.AreaDescriptor; +import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.RitualEvent; import WayofTime.bloodmagic.ritual.IMasterRitualStone; @@ -25,9 +28,8 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.awt.geom.Area; +import java.util.*; public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone { private UUID owner; @@ -40,6 +42,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS private EnumFacing direction = EnumFacing.NORTH; private boolean inverted; private List currentActiveWillConfig = new ArrayList<>(); + protected final Map modableRangeMap = new HashMap<>(); @Override public void onUpdate() { @@ -157,6 +160,9 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS this.cachedNetwork = network; this.currentRitual = ritual; + if(!checkBlockRanges(ritual.getModableRangeMap())) + addBlockRanges(ritual.getModableRangeMap()); + notifyUpdate(); return true; } @@ -298,22 +304,14 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS public void setActiveWillConfig(EntityPlayer player, List typeList) { this.currentActiveWillConfig = typeList; } - + @Override public boolean setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2) { - if (this.currentRitual != null) { - boolean allowed = this.currentRitual.setBlockRangeByBounds(range, this, offset1, offset2); - if (player != null && !allowed) { - ChatUtil.sendNoSpam(player, this.currentRitual.getErrorForBlockRangeOnFail(player, range, this, offset1, offset2)); - } else { - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.success")); - } - - return allowed; - } - - if (player != null) { - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.blockRange.inactive")); + AreaDescriptor descriptor = this.getBlockRange(range); + DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, getBlockPos()); + if (this.currentRitual.canBlockRangeBeModified(range, descriptor, this, offset1, offset2, holder)) { + descriptor.modifyAreaByBlockPositions(offset1, offset2); + return true; } return false; @@ -408,4 +406,36 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS 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; + } + + public void addBlockRange(String range, AreaDescriptor defaultRange) { + modableRangeMap.put(range, defaultRange); + } + + public void addBlockRanges(Map blockRanges){ + for (Map.Entry entry : blockRanges.entrySet()) { + modableRangeMap.put(entry.getKey(), entry.getValue()); + } + } + + public boolean checkBlockRanges(Map blockRanges){ + for (Map.Entry entry : blockRanges.entrySet()) { + if (modableRangeMap.get(entry.getKey()) == null) + return false; + } + return true; + } } From 9af6b4fbfaa3c5d382a5a1f97c34679e63818bb5 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 21 Jan 2019 15:18:34 -0800 Subject: [PATCH 372/595] Remove unnecessary field declaration from IMasterRitualStone --- .../java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index 2fec7fa8..8f338258 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -9,7 +9,6 @@ import net.minecraft.util.EnumFacing; 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.UUID; @@ -24,8 +23,6 @@ public interface IMasterRitualStone { SoulNetwork getOwnerNetwork(); - Map modableRangeMap = new HashMap<>(); - boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator, Ritual ritual); void performRitual(World world, BlockPos pos); From e001943c41dd16786d643e3e91243ef5d9f3b80a Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Tue, 22 Jan 2019 19:09:08 +0100 Subject: [PATCH 373/595] Seer Sigil can now be used in place of divination sigil in additon to it's own functions for HUD elements (#1527) (not sure if there might be edge cases that it tries to display both the divination sigil and seer sigil information at the same time (as could be possible for the blood altar), however it doesn't seem to be the case as removing elements from blood_altar_adv removes them from the seer sigil view) --- .../client/hud/element/ElementDivinedInformation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java index 8563e015..c072b646 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java @@ -25,13 +25,13 @@ public abstract class ElementDivinedInformation extends El ItemStack sigilStack = player.getHeldItem(EnumHand.MAIN_HAND); boolean flag = false; if (simple) { - if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION) + if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION || sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) flag = true; else flag = isFlagSigilHolding(sigilStack, true); if (!flag) { sigilStack = player.getHeldItem(EnumHand.OFF_HAND); - if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION) + if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION || sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) flag = true; else flag = isFlagSigilHolding(sigilStack, true); } From 74436a1338cc8b3033610b4be04d409adbf2350c Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Wed, 23 Jan 2019 04:34:03 +0100 Subject: [PATCH 374/595] This should do it but I would like you to test it again just in case (not sure if I would have gotten the NPE to begin with) (#1522) --- .../tile/TileMasterRitualStone.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 1383ae47..e21ff121 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -1,22 +1,22 @@ 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.iface.IBindable; -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.event.RitualEvent; +import WayofTime.bloodmagic.iface.IBindable; +import WayofTime.bloodmagic.item.ItemActivationCrystal; +import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.core.data.SoulNetwork; +import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.helper.*; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.ItemActivationCrystal; 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.EntityPlayer; import net.minecraft.item.ItemStack; @@ -28,7 +28,6 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import javax.annotation.Nullable; -import java.awt.geom.Area; import java.util.*; public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone { @@ -184,11 +183,14 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS 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())) { - RitualEvent.RitualRunEvent event = new RitualEvent.RitualRunEvent(this, getOwner(), getCurrentRitual()); + Ritual ritual = getCurrentRitual(); + RitualEvent.RitualRunEvent event = new RitualEvent.RitualRunEvent(this, getOwner(), ritual); if (MinecraftForge.EVENT_BUS.post(event)) return; + if (!checkBlockRanges(ritual.getModableRangeMap())) + addBlockRanges(ritual.getModableRangeMap()); getCurrentRitual().performRitual(this); } else { stopRitual(Ritual.BreakType.BREAK_STONE); From 3751a5193583ed7369e27cdcbe8c398353a9f3e6 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Wed, 23 Jan 2019 19:04:25 +0100 Subject: [PATCH 375/595] Fixed Ritual area (#1532) --- .../java/WayofTime/bloodmagic/ritual/types/RitualCondor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java index a7f4b618..36d31b14 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java @@ -18,13 +18,13 @@ public class RitualCondor extends Ritual { public RitualCondor() { super("ritualCondor", 0, 1000000, "ritual." + BloodMagic.MODID + ".condorRitual"); - addBlockRange(FLIGHT_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), new BlockPos(10, 30, 10))); + 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()).expand(-10, 0, -10); + AxisAlignedBB aabb = masterRitualStone.getBlockRange(FLIGHT_RANGE).getAABB(masterRitualStone.getBlockPos()); World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); From 5b4e624d443a76820779960c40e52f4249164f1b Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 01:22:00 +0100 Subject: [PATCH 376/595] Make Movement & Updraft arrays stronger by adding more of their ingredients! (#1520) * Make Movement & Updraft arrays stronger by adding more of their ingredients! Reduced base motion for Movement & Updraft arrays * Reverted Bound Tool change * Readability & using tailored methods --- .../AlchemyArrayEffectMovement.java | 10 ++++++- .../AlchemyArrayEffectUpdraft.java | 8 +++++- .../bloodmagic/block/BlockAlchemyArray.java | 27 +++++++++++++++++-- .../bloodmagic/tile/TileAlchemyArray.java | 17 +++++++----- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java index 3bf96427..92728c9d 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.iface.IAlchemyArray; +import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; @@ -22,8 +23,15 @@ public class AlchemyArrayEffectMovement extends AlchemyArrayEffect { @Override public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { double motionY = 0.5; - double speed = 3; + double motionYGlowstoneMod = 0.05; + double speed = 1.5; + double speedRedstoneMod = 0.15; + EnumFacing 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; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java index f2cb4612..c73d7da1 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.iface.IAlchemyArray; +import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; @@ -20,9 +21,14 @@ public class AlchemyArrayEffectUpdraft extends AlchemyArrayEffect { @Override public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { - double motionY = 1.5; + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java index 1e02ef13..4f706b6f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java @@ -1,6 +1,8 @@ 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; @@ -9,6 +11,7 @@ import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; @@ -88,11 +91,16 @@ public class BlockAlchemyArray extends Block { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - //TODO: Right click should rotate it TileAlchemyArray array = (TileAlchemyArray) world.getTileEntity(pos); - if (array == null || player.isSneaking()) + 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); @@ -105,6 +113,21 @@ public class BlockAlchemyArray extends Block { } 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); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index c1c82c2c..828f2891 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,5 +1,12 @@ 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.state.IBlockState; import net.minecraft.entity.Entity; @@ -9,19 +16,13 @@ import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -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; public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray { public boolean isActive = false; public int activeCounter = 0; public EnumFacing rotation = EnumFacing.HORIZONTALS[0]; + public int rotateCooldown = 0; private String key = "empty"; public AlchemyArrayEffect arrayEffect; @@ -110,6 +111,8 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche arrayEffect = null; key = "empty"; } + if (rotateCooldown > 0) + rotateCooldown--; } /** From 05446742efad6a70530e101957d0097005e7cff2 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 01:25:18 +0100 Subject: [PATCH 377/595] Ported RitualDismantler (#1499) * Ported RitualDismantler Signed-off-by: tobias * Added Hellfire Forge recipe Destructive Will Crystal, Destructive Will Crystal, Ritual Diviner (default), Weak Blood Shard Requires a minimum of 500 will and consumes 100 will to craft * Changed costs (lazy proposal): - 50 LP per normal Ritual Stone - discount cost of 200 LP for a whole ritual (smallest ritual has 4 ritual stones) - 100 LP for an MRS --- .../core/RegistrarBloodMagicItems.java | 103 +++++------------- .../core/RegistrarBloodMagicRecipes.java | 1 + .../bloodmagic/item/ItemRitualDismantler.java | 78 +++++++++++++ .../assets/bloodmagic/lang/en_US.lang | 1 + .../models/item/ritual_dismantler.json | 6 + 5 files changed, 111 insertions(+), 78 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java create mode 100644 src/main/resources/assets/bloodmagic/models/item/ritual_dismantler.json diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index fd76818f..e45190fb 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -1,11 +1,28 @@ 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 java.util.List; -import java.util.Set; - import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.init.Items; import net.minecraft.inventory.EntityEquipmentSlot; @@ -20,81 +37,9 @@ 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 WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.IBMBlock; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.ItemActivationCrystal; -import WayofTime.bloodmagic.item.ItemAlchemicVial; -import WayofTime.bloodmagic.item.ItemAltarMaker; -import WayofTime.bloodmagic.item.ItemArcaneAshes; -import WayofTime.bloodmagic.item.ItemBloodOrb; -import WayofTime.bloodmagic.item.ItemBoundAxe; -import WayofTime.bloodmagic.item.ItemBoundPickaxe; -import WayofTime.bloodmagic.item.ItemBoundShovel; -import WayofTime.bloodmagic.item.ItemBoundSword; -import WayofTime.bloodmagic.item.ItemDaggerOfSacrifice; -import WayofTime.bloodmagic.item.ItemDemonCrystal; -import WayofTime.bloodmagic.item.ItemDemonWillGauge; -import WayofTime.bloodmagic.item.ItemEnum; -import WayofTime.bloodmagic.item.ItemExperienceBook; -import WayofTime.bloodmagic.item.ItemInscriptionTool; -import WayofTime.bloodmagic.item.ItemLavaCrystal; -import WayofTime.bloodmagic.item.ItemPotionFlask; -import WayofTime.bloodmagic.item.ItemRitualDiviner; -import WayofTime.bloodmagic.item.ItemRitualReader; -import WayofTime.bloodmagic.item.ItemSacrificialDagger; -import WayofTime.bloodmagic.item.ItemSanguineBook; -import WayofTime.bloodmagic.item.ItemSlate; -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.item.ItemUpgradeTome; -import WayofTime.bloodmagic.item.ItemUpgradeTrainer; -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.ItemSigilAir; -import WayofTime.bloodmagic.item.sigil.ItemSigilBloodLight; -import WayofTime.bloodmagic.item.sigil.ItemSigilBounce; -import WayofTime.bloodmagic.item.sigil.ItemSigilClaw; -import WayofTime.bloodmagic.item.sigil.ItemSigilCompression; -import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; -import WayofTime.bloodmagic.item.sigil.ItemSigilElementalAffinity; -import WayofTime.bloodmagic.item.sigil.ItemSigilEnderSeverance; -import WayofTime.bloodmagic.item.sigil.ItemSigilFastMiner; -import WayofTime.bloodmagic.item.sigil.ItemSigilFrost; -import WayofTime.bloodmagic.item.sigil.ItemSigilGreenGrove; -import WayofTime.bloodmagic.item.sigil.ItemSigilHaste; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.item.sigil.ItemSigilLava; -import WayofTime.bloodmagic.item.sigil.ItemSigilMagnetism; -import WayofTime.bloodmagic.item.sigil.ItemSigilPhantomBridge; -import WayofTime.bloodmagic.item.sigil.ItemSigilSuppression; -import WayofTime.bloodmagic.item.sigil.ItemSigilTeleposition; -import WayofTime.bloodmagic.item.sigil.ItemSigilTransposition; -import WayofTime.bloodmagic.item.sigil.ItemSigilVoid; -import WayofTime.bloodmagic.item.sigil.ItemSigilWater; -import WayofTime.bloodmagic.item.sigil.ItemSigilWhirlwind; -import WayofTime.bloodmagic.item.soul.ItemMonsterSoul; -import WayofTime.bloodmagic.item.soul.ItemSentientArmourGem; -import WayofTime.bloodmagic.item.soul.ItemSentientAxe; -import WayofTime.bloodmagic.item.soul.ItemSentientBow; -import WayofTime.bloodmagic.item.soul.ItemSentientPickaxe; -import WayofTime.bloodmagic.item.soul.ItemSentientShovel; -import WayofTime.bloodmagic.item.soul.ItemSentientSword; -import WayofTime.bloodmagic.item.soul.ItemSoulGem; -import WayofTime.bloodmagic.item.soul.ItemSoulSnare; -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 java.util.List; +import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @@ -111,6 +56,7 @@ public class RegistrarBloodMagicItems 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; @@ -203,6 +149,7 @@ public class RegistrarBloodMagicItems 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"), diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index cbb2c54a..05f40732 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -213,6 +213,7 @@ public class RegistrarBloodMagicRecipes 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) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java new file mode 100644 index 00000000..744b7129 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java @@ -0,0 +1,78 @@ +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.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +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() { + setUnlocalizedName(BloodMagic.MODID + ".ritualDismantler"); + setCreativeTab(BloodMagic.TAB_BM); + setMaxStackSize(1); + } + + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing 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; + EnumFacing 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 EnumActionResult.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 EnumActionResult.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 EnumActionResult.SUCCESS; + } + + return EnumActionResult.FAIL; + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 03702e15..0fcd5be5 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -152,6 +152,7 @@ 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] diff --git a/src/main/resources/assets/bloodmagic/models/item/ritual_dismantler.json b/src/main/resources/assets/bloodmagic/models/item/ritual_dismantler.json new file mode 100644 index 00000000..dc88c182 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/item/ritual_dismantler.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "bloodmagic:items/ritual_dismantler" + } +} \ No newline at end of file From 6b25caa06df3dce862a0fd5e6ea30611d94c8a4e Mon Sep 17 00:00:00 2001 From: Phillip Date: Thu, 31 Jan 2019 19:28:36 -0500 Subject: [PATCH 378/595] Fixing the previous PR mess. (#1467) --- .../WayofTime/bloodmagic/item/soul/ItemSentientBow.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index f817d6a3..fc9b195f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -47,6 +47,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien 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() { @@ -117,7 +118,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien // setStaticDropOfActivatedSword(stack, level >= 0 ? staticDrop[level] : 1); // setDropOfActivatedSword(stack, level >= 0 ? soulDrop[level] : 0); - setVelocityOfArrow(stack, level >= 0 ? 3 + getVelocityModifier(type, level) : 0); + setVelocityOfArrow(stack, level >= 0 ? 3 + getVelocityModifier(type, level) : soullessShotVelocity); setDamageAdded(stack, level >= 0 ? getDamageModifier(type, level) : 0); } @@ -385,10 +386,9 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien entityArrow = itemarrow.createArrow(world, itemstack, player); entityArrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); - if (newArrowVelocity == 0) + if (Float.compare(getVelocityOfArrow(stack), soullessShotVelocity) < Float.MIN_NORMAL) { world.playSound(null, player.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); - return; } if (arrowVelocity == 1.0F) From 865968a4b83ae377d10e63301302494096f4626f Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 01:29:51 +0100 Subject: [PATCH 379/595] Ported Ritual of the Feathered Earth to BM2. (#1492) * Ported Ritual of the Feathered Earth to BM2. * Changed maximum area * Feathered Earth Hurt timer fall damage negation based on Set part1 * Part 2, switched to handling through potions, digging into area descriptor range bug * Fixed Ritual area * Update gradle.properties --- gradle.properties | 2 +- .../bloodmagic/core/RegistrarBloodMagic.java | 4 +- .../potion/PotionEventHandlers.java | 23 +++-- .../ritual/types/RitualFeatheredEarth.java | 93 +++++++++++++++++++ .../tile/TileMasterRitualStone.java | 7 +- .../util/handler/event/GenericHandler.java | 7 +- .../assets/bloodmagic/lang/en_US.lang | 4 +- 7 files changed, 122 insertions(+), 18 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java diff --git a/gradle.properties b/gradle.properties index 48dbcb74..2b89fa29 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ mappings_version=snapshot_20180201 jei_version=4.8.5.147 waila_version=1.8.23-B38_1.12 -guideapi_version=1.12-2.1.4-57 \ No newline at end of file +guideapi_version=1.12-2.1.4-57 diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 613d8fcc..d3f3ebcc 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -59,6 +59,7 @@ public class RegistrarBloodMagic public static final Potion CLING = MobEffects.HASTE; public static final Potion SACRIFICIAL_LAMB = MobEffects.HASTE; public static final Potion FLIGHT = MobEffects.HASTE; + public static final Potion FEATHERED = MobEffects.SPEED; public static IForgeRegistry BLOOD_ORBS = null; @@ -95,7 +96,8 @@ public class RegistrarBloodMagic 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("Flight", false, 0x000000, 4, 0).setRegistryName("flight"), + new PotionBloodMagic("Feathered", false, 0x000000, 0, 0).setRegistryName("feathered") ); } diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 2ffb368b..d875c4d3 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -1,27 +1,27 @@ package WayofTime.bloodmagic.potion; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; import net.minecraft.entity.Entity; import net.minecraft.entity.IProjectile; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingDamageEvent; import net.minecraftforge.event.entity.living.LivingEvent; 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 WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; + +import java.util.ArrayList; +import java.util.List; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class PotionEventHandlers @@ -169,4 +169,11 @@ public class PotionEventHandlers 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/ritual/types/RitualFeatheredEarth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java new file mode 100644 index 00000000..823ceb1b --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java @@ -0,0 +1,93 @@ +package WayofTime.bloodmagic.ritual.types; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import WayofTime.bloodmagic.ritual.*; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.potion.PotionEffect; +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 EntityLightningBolt(world, x + 4, y + 5, z + 4, false)); + world.addWeatherEffect(new EntityLightningBolt(world, x + 4, y + 5, z - 4, false)); + world.addWeatherEffect(new EntityLightningBolt(world, x - 4, y + 5, z - 4, false)); + world.addWeatherEffect(new EntityLightningBolt(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(EntityLivingBase.class, fallProtBB); + + for (EntityLivingBase entity : entities) { + if (totalEffects >= maxEffects) { + break; + } + entity.addPotionEffect(new PotionEffect(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/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index e21ff121..e27f53b4 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -188,9 +188,10 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (MinecraftForge.EVENT_BUS.post(event)) return; - - if (!checkBlockRanges(ritual.getModableRangeMap())) - addBlockRanges(ritual.getModableRangeMap()); + + if (!checkBlockRanges(getCurrentRitual().getModableRangeMap())) + addBlockRanges(getCurrentRitual().getModableRangeMap()); + getCurrentRitual().performRitual(this); } else { stopRitual(Ritual.BreakType.BREAK_STONE); 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 9dbc6711..46a7180a 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -29,6 +29,7 @@ import WayofTime.bloodmagic.network.DemonAuraPacketProcessor; import WayofTime.bloodmagic.orb.BloodOrb; import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.potion.BMPotionUtils; +import WayofTime.bloodmagic.ritual.IMasterRitualStone; import WayofTime.bloodmagic.ritual.RitualManager; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.util.Constants; @@ -82,10 +83,7 @@ import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityRegistry; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; +import java.util.*; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class GenericHandler { @@ -93,6 +91,7 @@ public class GenericHandler { public static Map filledHandMap = new HashMap<>(); private static Map targetTaskMap = new HashMap<>(); private static Map attackTaskMap = new HashMap<>(); + public static Set featherRitualSet; @SubscribeEvent public static void onEntityFall(LivingFallEvent event) { diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 0fcd5be5..a7aea094 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -621,6 +621,7 @@ 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.featheredEarthRitual=Ritual of the Feathered Earth 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. @@ -751,10 +752,11 @@ ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=Unlike my comrades, I of 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 From 827ee85e81d7b3530f872bc2b973f964240e997d Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 01:33:46 +0100 Subject: [PATCH 380/595] Implemented Ritual of Grounding, a Ritual to change gravity behavior (#1501) * Implemented Ritual of Grounding, a Ritual to change gravity behavior [x] <- x are new potion effects - (NoMod) moves entities towards the ground, prevents jumping [Grounded] - (Raw) affects players - (Corrosive) disables gravity [Suspension] - (Destructive) increases fall damage [Heavy Heart] - (Steadfast) affects bosses - (Vengeful) stronger effects, (+Corrosive) applies levitation (+Destructive) stronger effect [Grounded] prevents jumping and moves entities towards the ground, higher amplifiers cause a faster descend, interesting interaction with Sigil of Air [Suspension] disables gravity (keeps movement) [Heavy Heart] increases fall height and fall damage multiplier by 1 per level. Fixed a possible division by 0 in RitualConder. Saved event entity variable in PotionEventHandlers. Made rune configuration more readable in RitualHarvest. Signed-off-by: tobias * Fixed Ritual area * Lists are cleared on world unload. --- .../bloodmagic/core/RegistrarBloodMagic.java | 16 +- .../item/sigil/ItemSigilFilledHand.java | 4 +- .../potion/PotionEventHandlers.java | 125 ++++++----- .../ritual/types/RitualGrounding.java | 199 ++++++++++++++++++ .../ritual/types/RitualHarvest.java | 30 +-- .../util/handler/event/GenericHandler.java | 40 +++- .../assets/bloodmagic/lang/en_US.lang | 16 +- 7 files changed, 335 insertions(+), 95 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index d3f3ebcc..948835d3 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -59,7 +59,10 @@ public class RegistrarBloodMagic public static final Potion CLING = MobEffects.HASTE; public static final Potion SACRIFICIAL_LAMB = MobEffects.HASTE; public static final Potion FLIGHT = MobEffects.HASTE; - public static final Potion FEATHERED = MobEffects.SPEED; + public static final Potion GROUNDED = MobEffects.HASTE; + public static final Potion HEAVY_HEART = MobEffects.HASTE; + public static final Potion SUSPENDED = MobEffects.HASTE; + public static final Potion FEATHERED = MobEffects.HASTE; public static IForgeRegistry BLOOD_ORBS = null; @@ -73,10 +76,10 @@ public class RegistrarBloodMagic 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") + new BloodOrb("transcendent", 6, 30000000, 50).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") ); } } @@ -97,8 +100,11 @@ public class RegistrarBloodMagic 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 @@ -117,7 +123,7 @@ public class RegistrarBloodMagic 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 diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java index 72f428a0..a79affe5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.util.handler.event.GenericHandler; +import WayofTime.bloodmagic.util.helper.PlayerHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -15,6 +15,6 @@ public class ItemSigilFilledHand extends ItemSigilToggleableBase { public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - GenericHandler.filledHandMap.put(player, 4); + GenericHandler.filledHandMapMap.get(world).put(player, 4); } } diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index d875c4d3..57f68fc2 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IProjectile; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; @@ -11,57 +12,67 @@ import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.world.World; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingDamageEvent; import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.event.entity.living.LivingFallEvent; 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.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.ArrayList; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class PotionEventHandlers -{ - public static List flightList = new ArrayList(); +public class PotionEventHandlers { + public static Map> flightListMap = new HashMap<>(); + public static Map> noGravityListMap = new HashMap<>(); @SubscribeEvent - public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) - { - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) - { - int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); - event.getEntityLiving().motionY += (0.1f) * (2 + i); + public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) { + EntityLivingBase eventEntityLiving = event.getEntityLiving(); + + if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.BOOST)) { + int i = eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); + eventEntityLiving.motionY += (0.1f) * (2 + i); } - // if (event.getEntityLiving().isPotionActive(ModPotions.heavyHeart)) { - // event.getEntityLiving().motionY = 0; - // } + if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.GROUNDED)) + eventEntityLiving.motionY = 0; } @SubscribeEvent - public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (!player.world.isRemote) - { - if (player.isPotionActive(RegistrarBloodMagic.FLIGHT)) - { - if (!player.isSpectator() && !player.capabilities.allowFlying) - { + public static void onLivingFall(LivingFallEvent event) { + EntityLivingBase 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) { + EntityLivingBase eventEntityLiving = event.getEntityLiving(); + List flightList = flightListMap.get(eventEntityLiving.getEntityWorld()); + + if (eventEntityLiving instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) 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)) - { + } else { + if (flightList.contains(player)) { player.capabilities.allowFlying = false; player.capabilities.isFlying = false; player.sendPlayerAbilities(); @@ -70,30 +81,42 @@ public class PotionEventHandlers } } } -// if (event.getEntityLiving().isPotionActive(ModPotions.boost)) +// if (eventEntityLiving.isPotionActive(ModPotions.boost)) // { -// int i = event.getEntityLiving().getActivePotionEffect(ModPotions.boost).getAmplifier(); +// int i = eventEntityLiving.getActivePotionEffect(ModPotions.boost).getAmplifier(); // { // float percentIncrease = (i + 1) * 0.05f; // -// if (event.getEntityLiving() instanceof EntityPlayer) +// if (eventEntityLiving instanceof EntityPlayer) // { -// EntityPlayer entityPlayer = (EntityPlayer) event.getEntityLiving(); +// 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.get(event.getEntityLiving().getEntityWorld()); + if ((!(eventEntityLiving instanceof EntityPlayer) || !((EntityPlayer) eventEntityLiving).isSpectator()) && eventEntityLiving.isPotionActive(RegistrarBloodMagic.SUSPENDED)) { + eventEntityLiving.setNoGravity(true); + noGravityList.add(eventEntityLiving); + } else { + eventEntityLiving.setNoGravity(false); + noGravityList.remove(eventEntityLiving); + } - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.WHIRLWIND)) - { + if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.GROUNDED)) + if (eventEntityLiving instanceof EntityPlayer && ((EntityPlayer) 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(event.getEntityLiving().posX - 0.5, event.getEntityLiving().posY - 0.5, event.getEntityLiving().posZ - 0.5, event.getEntityLiving().posX + 0.5, event.getEntityLiving().posY + 0.5, event.getEntityLiving().posZ + 0.5).expand(d0, d0, d0); - List entityList = event.getEntityLiving().getEntityWorld().getEntitiesWithinAABB(Entity.class, axisAlignedBB); + 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) - { + for (Entity projectile : entityList) { if (projectile == null) continue; if (!(projectile instanceof IProjectile)) @@ -106,12 +129,12 @@ public class PotionEventHandlers else if (projectile instanceof EntityThrowable) throwingEntity = ((EntityThrowable) projectile).getThrower(); - if (throwingEntity != null && throwingEntity.equals(event.getEntityLiving())) + if (throwingEntity != null && throwingEntity.equals(eventEntityLiving)) continue; - double delX = projectile.posX - event.getEntityLiving().posX; - double delY = projectile.posY - event.getEntityLiving().posY; - double delZ = projectile.posZ - event.getEntityLiving().posZ; + 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)); @@ -120,8 +143,7 @@ public class PotionEventHandlers if (angle < 3 * (Math.PI / 4)) continue; // angle is < 135 degrees - if (throwingEntity != null) - { + if (throwingEntity != null) { delX = -projectile.posX + throwingEntity.posX; delY = -projectile.posY + (throwingEntity.posY + throwingEntity.getEyeHeight()); delZ = -projectile.posZ + throwingEntity.posZ; @@ -141,31 +163,26 @@ public class PotionEventHandlers } @SubscribeEvent - public static void onPlayerRespawn(PlayerEvent.Clone event) - { + public static void onPlayerRespawn(PlayerEvent.Clone event) { if (event.isWasDeath()) event.getEntityPlayer().addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, 400)); } @SubscribeEvent - public static void onSacrificeKnifeUsed(SacrificeKnifeUsedEvent event) - { + 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) - { + 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()) - { + public static void onEndermanTeleportEvent(EnderTeleportEvent event) { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.PLANAR_BINDING) && event.isCancelable()) { event.setCanceled(true); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java new file mode 100644 index 00000000..5a8795c0 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java @@ -0,0 +1,199 @@ +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.EntityLivingBase; +import net.minecraft.entity.MoverType; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.entity.boss.EntityWither; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.MobEffects; +import net.minecraft.potion.PotionEffect; +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 = getBlockRange(GROUNDING_RANGE); + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, groundingRange.getAABB(pos)); + for (EntityLivingBase entity : entities) { + if (totalEffects >= maxEffects) { + break; + } + + if (entity instanceof EntityPlayer && ((EntityPlayer) entity).isCreative()) + continue; + + totalEffects++; + + + if (entity instanceof EntityPlayer) { + /* 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 EntityWither || entity instanceof EntityDragon) + 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, EntityLivingBase 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 PotionEffect(MobEffects.LEVITATION, 20, 10)); + vengefulDrained += willDrain; + corrosiveDrained += willDrain; + + /* Corrosive will effect: Suspension */ + } else if (corrosiveWill >= willDrain) { + + entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SUSPENDED, 20, 0)); + corrosiveDrained += willDrain; + + /* Vengeful will effect: Stronger effect */ + } else if (vengefulWill >= willDrain) { + + vengefulDrained += willDrain; + entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.GROUNDED, 40, 20)); + + } else + + entity.addPotionEffect(new PotionEffect(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 PotionEffect(RegistrarBloodMagic.HEAVY_HEART, 200, 2)); + } + + } else if (world.getTotalWorldTime() % 50 == 0) + entity.addPotionEffect(new PotionEffect(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 index 78722805..7376d7e7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.ritual.harvest.IHarvestHandler; import WayofTime.bloodmagic.ritual.harvest.HarvestRegistry; +import WayofTime.bloodmagic.ritual.harvest.IHarvestHandler; import com.google.common.collect.Lists; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.InventoryHelper; @@ -77,30 +77,10 @@ public class RitualHarvest extends Ritual { @Override public void gatherComponents(Consumer components) { - components.accept(new RitualComponent(new BlockPos(1, 0, 1), EnumRuneType.DUSK)); - components.accept(new RitualComponent(new BlockPos(1, 0, -1), EnumRuneType.DUSK)); - components.accept(new RitualComponent(new BlockPos(-1, 0, -1), EnumRuneType.DUSK)); - components.accept(new RitualComponent(new BlockPos(-1, 0, 1), EnumRuneType.DUSK)); - components.accept(new RitualComponent(new BlockPos(2, 0, 0), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(-2, 0, 0), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(0, 0, 2), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(0, 0, -2), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(3, 0, 1), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(3, 0, -1), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(-3, 0, 1), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(-3, 0, -1), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(1, 0, 3), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(-1, 0, 3), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(1, 0, -3), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(-1, 0, -3), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(2, 0, 3), EnumRuneType.WATER)); - components.accept(new RitualComponent(new BlockPos(3, 0, 2), EnumRuneType.WATER)); - components.accept(new RitualComponent(new BlockPos(2, 0, -3), EnumRuneType.WATER)); - components.accept(new RitualComponent(new BlockPos(-3, 0, 2), EnumRuneType.WATER)); - components.accept(new RitualComponent(new BlockPos(-2, 0, 3), EnumRuneType.WATER)); - components.accept(new RitualComponent(new BlockPos(3, 0, -2), EnumRuneType.WATER)); - components.accept(new RitualComponent(new BlockPos(-2, 0, -3), EnumRuneType.WATER)); - components.accept(new RitualComponent(new BlockPos(-3, 0, -2), EnumRuneType.WATER)); + 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 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 46a7180a..fda8d9da 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -29,6 +29,7 @@ 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.IMasterRitualStone; import WayofTime.bloodmagic.ritual.RitualManager; import WayofTime.bloodmagic.soul.DemonWillHolder; @@ -76,6 +77,7 @@ 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.Mod; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -87,10 +89,10 @@ import java.util.*; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class GenericHandler { - public static Map bounceMap = new HashMap<>(); - public static Map filledHandMap = new HashMap<>(); - private static Map targetTaskMap = new HashMap<>(); - private static Map attackTaskMap = new HashMap<>(); + 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 Set featherRitualSet; @SubscribeEvent @@ -103,7 +105,7 @@ public class GenericHandler { if (player.getEntityWorld().isRemote) { player.motionY *= -0.9; player.fallDistance = 0; - bounceMap.put(player, player.motionY); + bounceMapMap.get(player.getEntityWorld()).put(player, player.motionY); } else { player.fallDistance = 0; event.setCanceled(true); @@ -114,10 +116,13 @@ public class GenericHandler { @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; @@ -217,6 +222,9 @@ public class GenericHandler { sendPlayerDemonWillAura((EntityPlayer) entity); } + World world = entity.getEntityWorld(); + Map targetTaskMap = targetTaskMapMap.get(world); + Map attackTaskMap = attackTaskMapMap.get(world); if (event.getEntityLiving() instanceof EntityAnimal) { EntityAnimal animal = (EntityAnimal) event.getEntityLiving(); if (animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { @@ -449,4 +457,26 @@ public class GenericHandler { private static int durabilityToXp(int durability) { return durability / 2; } + + @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<>()); + 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.get(world).clear(); + filledHandMapMap.get(world).clear(); + attackTaskMapMap.get(world).clear(); + targetTaskMapMap.get(world).clear(); + PotionEventHandlers.flightListMap.get(world).clear(); + PotionEventHandlers.noGravityListMap.get(world).clear(); + } } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index a7aea094..83614e9a 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -621,6 +621,7 @@ 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.waterRitual.info=Generates a source of water from the master ritual stone. @@ -667,6 +668,14 @@ ritual.bloodmagic.animalGrowthRitual.steadfast.info=(Steadfast) Automatically br 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. @@ -713,7 +722,7 @@ ritual.bloodmagic.fullStomachRitual.fillRange.info=(Feeding) The range that the 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.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. @@ -724,11 +733,11 @@ ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Crystal) Demon Crystals in th 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.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.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. @@ -756,7 +765,6 @@ 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 From a04e4d7a09558d1e1a92c569e05e6635b12b503c Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 01:36:31 +0100 Subject: [PATCH 381/595] SolarPowered logic fix. (#1454) Need to see the sky AND needs to be day, instead of or. Before: - Solar Powered works at night - Solar Powered works at day underground After: - Solar Powered works only during daytime if the sky is in line of sight, as well --- .../livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java index d285c11d..fea3748c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -26,7 +26,7 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { @Override public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { - if (wearer.getEntityWorld().canSeeSky(wearer.getPosition()) || wearer.getEntityWorld().provider.isDaytime()) { + if (wearer.getEntityWorld().canSeeSky(wearer.getPosition()) && wearer.getEntityWorld().provider.isDaytime()) { return protectionLevel[this.level]; } @@ -36,7 +36,7 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { @Override public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { counter++; - if (world.canSeeSky(player.getPosition()) || world.provider.isDaytime()) { + if (world.canSeeSky(player.getPosition()) && world.provider.isDaytime()) { if (counter % regenCooldown[this.level] == 0 && player.getHealth() < player.getMaxHealth()) { player.heal(1); } From 2a8e1f1271c022e34934089591db3e1e58b60eaf Mon Sep 17 00:00:00 2001 From: Saurabh Totey Date: Thu, 31 Jan 2019 17:36:55 -0700 Subject: [PATCH 382/595] Fixed Sigil of Magnetism attraction area for #1315 (#1453) --- .../WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java index 7a1333fa..93d66134 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java @@ -25,8 +25,8 @@ public class ItemSigilMagnetism extends ItemSigilToggleableBase { float posX = Math.round(player.posX); float posY = (float) (player.posY - player.getEyeHeight()); float posZ = Math.round(player.posZ); - List entities = player.getEntityWorld().getEntitiesWithinAABB(EntityItem.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(EntityXPOrb.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 entities = player.getEntityWorld().getEntitiesWithinAABB(EntityItem.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(EntityXPOrb.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 (EntityItem entity : entities) { if (entity != null && !world.isRemote && !entity.isDead) { From 95d99c0a01e4e14473186cd442dc1072403a9a4b Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 01:46:02 +0100 Subject: [PATCH 383/595] Command rework (#1434) * Network part finished. * Should be more reasonable now * This should be good enough. * Orb finished, needs strings * Bind finished. Needs strings. * Reformat & Help subcommand * Cleanup, strings, no negative amounts * Removed TODOs * Added missing MaxTier check for Blood Orbs. Added TODO: Test with custom Blood Orbs. * Ritual commands finished. Check for valid placement might be optimized. (TODO) * Access modifiers, moved TODO * Added TODOs for localized strings * DrainUtils postponed until the necessary functionality is available with SoulTickets (telling SoulTicket network from soul ticket, a list of all registered soul tickets per network) * Replaced all occurrences of TextHelper with TextComponentTranslation in the commands section * - Moved Teleports.java to teleport package - added teleposer command - added missing strings - cleanup * Fixed spelling of "Successful(ly)" * getUsage() now returns translation keys. getInfo() is now an explicit String ritual creation command now has proper tab completions help is an additional argument with "-h" or "?" cleanup * teleposerSet final cleanup. * Removed ritual removal command Signed-off-by: tobias * Check if the tile has a ritual first Signed-off-by: tobias * A bit more optimisation Signed-off-by: tobias * Cleanup part 1 Signed-off-by: tobias * Cleanup part 2 Signed-off-by: tobias * Part 3 Signed-off-by: tobias * Part 4 Signed-off-by: tobias * Updated language file to reflect cleanup & continuity changes. Signed-off-by: tobias * Change to use an abstract class that gets called instead of calling super on overriden execute() for commands Signed-off-by: tobias * Use player facing for ritual creation. Signed-off-by: tobias --- .../block/BlockDimensionalPortal.java | 6 +- .../bloodmagic/block/BlockTeleposer.java | 5 +- .../bloodmagic/command/CommandBloodMagic.java | 22 +- .../command/sub/SubCommandBind.java | 103 +++--- .../command/sub/SubCommandNetwork.java | 344 ++++++++++-------- .../bloodmagic/command/sub/SubCommandOrb.java | 164 +++++---- .../command/sub/SubCommandRitual.java | 144 ++++++++ .../command/sub/SubCommandTeleposer.java | 329 +++++++++++++++++ .../item/sigil/ItemSigilTeleposition.java | 4 +- .../portal => teleport}/Teleports.java | 5 +- .../bloodmagic/tile/TileTeleposer.java | 20 +- .../bloodmagic/util/helper/RitualHelper.java | 97 ++++- .../assets/bloodmagic/lang/en_US.lang | 70 ++-- 13 files changed, 990 insertions(+), 323 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java create mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java rename src/main/java/WayofTime/bloodmagic/{ritual/portal => teleport}/Teleports.java (98%) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 8939e5f5..658a87f6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -1,12 +1,12 @@ 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.block.base.BlockInteger; -import WayofTime.bloodmagic.ritual.portal.LocationsHandler; -import WayofTime.bloodmagic.ritual.portal.Teleports; +import WayofTime.bloodmagic.teleport.Teleports; import WayofTime.bloodmagic.tile.TileDimensionalPortal; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index 22fb0307..24978953 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -2,6 +2,7 @@ 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; @@ -48,8 +49,10 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, @Override public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { TileTeleposer tileTeleposer = (TileTeleposer) world.getTileEntity(blockPos); - if (tileTeleposer != null) + if (tileTeleposer != null) { tileTeleposer.dropItems(); + SubCommandTeleposer.teleposerSet.remove(tileTeleposer); + } super.breakBlock(world, blockPos, blockState); } diff --git a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java index 81eb9063..5c143101 100644 --- a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java @@ -1,18 +1,19 @@ package WayofTime.bloodmagic.command; -import WayofTime.bloodmagic.command.sub.SubCommandBind; -import WayofTime.bloodmagic.command.sub.SubCommandNetwork; -import WayofTime.bloodmagic.command.sub.SubCommandOrb; -import WayofTime.bloodmagic.util.helper.TextHelper; +import WayofTime.bloodmagic.command.sub.*; import net.minecraft.command.ICommandSender; -import net.minecraft.util.text.TextComponentString; 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 @@ -30,15 +31,4 @@ public class CommandBloodMagic extends CommandTreeBase { return 2; } - public static void displayHelpString(ICommandSender commandSender, String display, Object... info) { - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } - - public static void displayErrorString(ICommandSender commandSender, String display, Object... info) { - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } - - public static void displaySuccessString(ICommandSender commandSender, String display, Object... info) { - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect(display, info))); - } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index f229ad5b..2d99578a 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -3,17 +3,26 @@ package WayofTime.bloodmagic.command.sub; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.util.helper.BindableHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; -import net.minecraft.command.PlayerNotFoundException; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentTranslation; +import net.minecraftforge.server.command.CommandTreeBase; +import net.minecraftforge.server.command.CommandTreeHelp; + +public class SubCommandBind extends CommandTreeBase { + public EntityPlayerMP player; + + public SubCommandBind() { + addSubcommand(new CommandTreeHelp(this)); + } + + public String getInfo() { + return player.getName(); + } -public class SubCommandBind extends CommandBase { @Override public String getName() { return "bind"; @@ -21,7 +30,11 @@ public class SubCommandBind extends CommandBase { @Override public String getUsage(ICommandSender commandSender) { - return TextHelper.localizeEffect("commands.bloodmagic.bind.usage"); + return "commands.bloodmagic.bind.usage"; + } + + public String getHelp() { + return "commands.bloodmagic.bind.help"; } @Override @@ -30,49 +43,49 @@ public class SubCommandBind extends CommandBase { } @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { - if (commandSender.getEntityWorld().isRemote) + 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 TextComponentTranslation(getHelp())); return; - - try { - EntityPlayer player = CommandBase.getCommandSenderAsPlayer(commandSender); - ItemStack held = player.getHeldItemMainhand(); - boolean bind = true; - - if (held.getItem() instanceof IBindable) { - if (args.length > 0) { - - if (args[0].equalsIgnoreCase("help")) - return; - - if (isBoolean(args[0])) { - bind = Boolean.parseBoolean(args[0]); - - if (args.length > 2) - player = CommandBase.getPlayer(server, commandSender, args[1]); - } else { - player = CommandBase.getPlayer(server, commandSender, args[0]); - } - } - - if (bind) { - Binding binding = new Binding(player.getGameProfile().getId(), player.getGameProfile().getName()); - BindableHelper.applyBinding(held, binding); - commandSender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.success")); - } else { - Binding binding = ((IBindable) held.getItem()).getBinding(held); - if (binding != null) { - held.getTagCompound().removeTag("binding"); - commandSender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.remove.success")); - } - } - } - } catch (PlayerNotFoundException e) { - commandSender.sendMessage(new TextComponentTranslation(TextHelper.localizeEffect("commands.bloodmagic.error.404"))); } + if (sender.getEntityWorld().isRemote) + return; + EntityPlayerMP 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 TextComponentTranslation("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 TextComponentTranslation("commands.bloodmagic.bind.success", getInfo())); + } else { + if (binding == null) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.error.notBound")); + } + held.getTagCompound().removeTag("binding"); + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.remove.success")); + } + } else + sender.sendMessage(new TextComponentTranslation("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 index 12db2d7f..a96cef8a 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -2,21 +2,33 @@ package WayofTime.bloodmagic.command.sub; import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.CommandBase; +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.command.PlayerNotFoundException; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraftforge.server.command.CommandTreeBase; +import net.minecraftforge.server.command.CommandTreeHelp; -import java.util.Locale; +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)); + } -public class SubCommandNetwork extends CommandBase { @Override public String getName() { return "network"; @@ -24,160 +36,190 @@ public class SubCommandNetwork extends CommandBase { @Override public String getUsage(ICommandSender commandSender) { - return TextHelper.localizeEffect("commands.bloodmagic.network.usage"); + return "commands.bloodmagic.network.usage"; } @Override public int getRequiredPermissionLevel() { - return 2; + return 0; } - @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { - if (args.length > 1) { - if (args[0].equalsIgnoreCase("help")) + abstract class NetworkCommand extends CommandTreeBase { + + public EntityPlayerMP player; + public SoulNetwork network; + public String uuid; + + 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 TextComponentTranslation("commands.bloodmagic.error.arg.invalid")); + sender.sendMessage(new TextComponentTranslation(this.getUsage(sender))); + return null; + } + if (amount < 0) { + sender.sendMessage(new TextComponentTranslation("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 (!getName().equals("get")) { + if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { + sender.sendMessage(new TextComponentTranslation(getHelp())); + return; + } + 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; - - try { - EntityPlayer player = CommandBase.getPlayer(server, commandSender, args[1]); - - try { - ValidCommands command = ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH)); - command.run(player, commandSender, args.length > 0 && args.length < 2, args); - } catch (IllegalArgumentException e) { - - } - } catch (PlayerNotFoundException e) { - CommandBloodMagic.displayErrorString(commandSender, e.getLocalizedMessage()); + int currE = network.getCurrentEssence(); + if (amount > currE) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.syphon.amountTooHigh")); + if (currE == 0) + return; + amount = Math.min(amount, currE); } - } else { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.missing"); + network.syphonAndDamage(player, SoulTicket.command(sender, this.getName(), amount)); + int newE = network.getCurrentEssence(); + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.syphon.success", currE - newE, player.getDisplayName().getFormattedText())); } } - private enum ValidCommands { - SYPHON("commands.bloodmagic.network.syphon.help") { - @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { - if (displayHelp) { - CommandBloodMagic.displayHelpString(sender, this.help); - return; - } - - if (args.length == 3) { - if (Utils.isInteger(args[2])) { - int amount = Integer.parseInt(args[2]); - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.command(sender, "syphon", amount)); - CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.syphon.success", amount, player.getDisplayName().getFormattedText()); - } else { - CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid"); - } - } else { - CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing"); - } - } - }, - ADD("commands.bloodmagic.network.add.help") { - @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { - if (displayHelp) { - CommandBloodMagic.displayHelpString(sender, this.help); - return; - } - - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - - if (args.length == 3) { - if (Utils.isInteger(args[2])) { - int amount = Integer.parseInt(args[2]); - int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); - CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.add.success", network.add(SoulTicket.command(sender, "add", amount), maxOrb), player.getDisplayName().getFormattedText()); - } else { - CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid"); - } - } else { - CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing"); - } - } - }, - SET("commands.bloodmagic.network.set.help") { - @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { - if (displayHelp) { - CommandBloodMagic.displayHelpString(sender, this.help); - return; - } - - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - - if (args.length == 3) { - if (Utils.isInteger(args[2])) { - int amount = Integer.parseInt(args[2]); - network.setCurrentEssence(amount); - CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.set.success", player.getDisplayName().getFormattedText(), amount); - } else { - CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.invalid"); - } - } else { - CommandBloodMagic.displayErrorString(sender, "commands.bloodmagic.error.arg.missing"); - } - } - }, - GET("commands.bloodmagic.network.get.help") { - @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { - if (displayHelp) { - CommandBloodMagic.displayHelpString(sender, this.help); - return; - } - - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - - if (args.length > 1) - sender.sendMessage(new TextComponentString(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence()))); - - } - }, - FILL("commands.bloodmagic.network.fill.help") { - @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { - if (displayHelp) { - CommandBloodMagic.displayHelpString(sender, this.help, Integer.MAX_VALUE); - return; - } - - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - - if (args.length > 1) { - network.setCurrentEssence(Integer.MAX_VALUE); - CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.fill.success", player.getDisplayName().getFormattedText()); - } - } - }, - CAP("commands.bloodmagic.network.cap.help") { - @Override - public void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args) { - if (displayHelp) { - CommandBloodMagic.displayHelpString(sender, this.help); - return; - } - - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - - if (args.length > 1) { - int maxOrb = NetworkHelper.getMaximumForTier(network.getOrbTier()); - network.setCurrentEssence(maxOrb); - CommandBloodMagic.displaySuccessString(sender, "commands.bloodmagic.network.cap.success", player.getDisplayName().getFormattedText()); - } - } - },; - - public String help; - - ValidCommands(String help) { - this.help = help; + class Add extends NetworkCommand { + @Override + public String getName() { + return "add"; } - public abstract void run(EntityPlayer player, ICommandSender sender, boolean displayHelp, String... args); + @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 TextComponentTranslation("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 TextComponentTranslation("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 { + if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { + sender.sendMessage(new TextComponentTranslation(getHelp())); + return; + } + this.player = args.length < 1 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); + sender.sendMessage(new TextComponentString((player != sender ? player.getDisplayName().getFormattedText() + " " : "" + new TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("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 index cdba93a2..816c828b 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -1,22 +1,25 @@ 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 WayofTime.bloodmagic.command.CommandBloodMagic; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; -import net.minecraft.command.PlayerNotFoundException; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraftforge.server.command.CommandTreeBase; +import net.minecraftforge.server.command.CommandTreeHelp; -import java.util.Locale; +public class SubCommandOrb extends CommandTreeBase { + public SubCommandOrb() { + addSubcommand(new Get()); + addSubcommand(new Set()); + addSubcommand(new CommandTreeHelp(this)); + } -public class SubCommandOrb extends CommandBase { @Override public String getName() { return "orb"; @@ -24,7 +27,7 @@ public class SubCommandOrb extends CommandBase { @Override public String getUsage(ICommandSender commandSender) { - return TextHelper.localizeEffect("commands.bloodmagic.orb.usage"); + return "commands.bloodmagic.orb.usage"; } @Override @@ -32,76 +35,93 @@ public class SubCommandOrb extends CommandBase { return 2; } - @Override - public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException { - if (args.length > 0) { + abstract class OrbCommand extends CommandTreeBase { - if (args[0].equalsIgnoreCase("help")) + public EntityPlayerMP 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 TextComponentTranslation(getHelp())); return; - - try { - String givenName = commandSender.getName(); - - if (args.length > 1) - givenName = args[1]; - - EntityPlayer player = CommandBase.getPlayer(server, commandSender, givenName); - String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); - SoulNetwork network = NetworkHelper.getSoulNetwork(uuid); - - boolean displayHelp = args.length > 0 && args.length < 2; - - try { - switch (ValidCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH))) { - case SET: { - if (displayHelp) { - CommandBloodMagic.displayHelpString(commandSender, ValidCommands.SET.help); - break; - } - - if (args.length == 3) { - if (Utils.isInteger(args[2])) { - int amount = Integer.parseInt(args[2]); - network.setOrbTier(amount); - CommandBloodMagic.displaySuccessString(commandSender, "commands.bloodmagic.success"); - } else { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.invalid"); - } - } else { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.arg.missing"); - } - - break; - } - case GET: { - if (displayHelp) { - CommandBloodMagic.displayHelpString(commandSender, ValidCommands.GET.help); - break; - } - - if (args.length > 1) - commandSender.sendMessage(new TextComponentString(TextHelper.localizeEffect("message.orb.currenttier", network.getOrbTier()))); - - break; - } - } - } catch (IllegalArgumentException e) { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.404"); - } - } catch (PlayerNotFoundException e) { - CommandBloodMagic.displayErrorString(commandSender, "commands.bloodmagic.error.404"); } + 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 TextComponentTranslation("commands.bloodmagic.orb.currenttier", network.getOrbTier())); } } - private enum ValidCommands { - SET("commands.bloodmagic.orb.set.help"), - GET("commands.bloodmagic.orb.get.help"); + class Set extends OrbCommand { + //TODO: check whether maxTier check works with custom Blood Orbs + int maxTier = OrbRegistry.getTierMap().size() - 1; - public String help; + @Override + public String getInfo() { + return "" + maxTier; + } - ValidCommands(String help) { - this.help = help; + @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 TextComponentTranslation("commands.bloodmagic.error.arg.invalid")); + sender.sendMessage(new TextComponentTranslation(this.getUsage(sender))); + return; + } + if (targetTier < 0) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.negative")); + return; + } else if (targetTier > maxTier) { + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.orb.error.tierTooHigh", getInfo())); + return; + } + network.setOrbTier(targetTier); + sender.sendMessage(new TextComponentTranslation("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 new file mode 100644 index 00000000..b527ed5f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java @@ -0,0 +1,144 @@ +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.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; +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 TextComponentTranslation("commands.blooodmagic.ritual.create.noRitual")); + return; + } else if (args.length == 2 && (args[1].equals("help") || args[1].equals("?"))) { + sender.sendMessage(new TextComponentTranslation(BloodMagic.RITUAL_MANAGER.getRitual(args[0]).getUnlocalizedName() + ".info")); + return; + } + EntityPlayerMP 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(); + EnumFacing direction = player.getHorizontalFacing(); + + if (RitualHelper.createRitual(world, pos, direction, BloodMagic.RITUAL_MANAGER.getRitual(args[0]), safe)) + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + else if (!safe) + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); + else + sender.sendMessage(new TextComponentTranslation("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 { + EntityPlayerMP 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 TextComponentTranslation("commands.bloodmagic.success")); + else if (!safe) + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); + else + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritaul.create.error.unsafe")); + else + sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.error.noMRS")); + } + + } +} diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java new file mode 100644 index 00000000..8f74b045 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java @@ -0,0 +1,329 @@ +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.EntityPlayer; +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.TextComponentString; +import net.minecraft.util.text.TextComponentTranslation; +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 EntityPlayer 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(EntityPlayer 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, EntityPlayer 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 TextComponentString(i + new TextComponentTranslation("commands.bloodmagic.teleposer.anddimension").getFormattedText() + teleposerArray[i].getWorld().provider.getDimension() + " " + teleposerArray[i].getPos() + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.focusanddim").getFormattedText() + " " + focus.getWorld(stack).provider.getDimension() + " " + focus.getBlockPos(stack) + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.owner").getFormattedText() + " " + name)); + } else + sender.sendMessage(new TextComponentString(i + new TextComponentTranslation("commands.bloodmagic.teleposer.anddimension").getFormattedText() + teleposerArray[i].getWorld().provider.getDimension() + " " + teleposerArray[i].getPos() + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.focusanddim").getFormattedText() + " " + focus.getWorld(stack).provider.getDimension() + " " + focus.getBlockPos(stack) + " " + new TextComponentTranslation("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 TextComponentTranslation("commands.bloodmagic.error.arg.invalid")); + sender.sendMessage(new TextComponentTranslation(this.getUsage(sender))); + return null; + } + if (teleposerID < 0) { + sender.sendMessage(new TextComponentTranslation("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 TextComponentTranslation(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 TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("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 TextComponentTranslation("commands.bloodmagic.success")); + + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index ebca00db..5a9ea8f0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -3,10 +3,10 @@ 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.ritual.portal.Teleports; -import WayofTime.bloodmagic.tile.TileTeleposer; import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java b/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java similarity index 98% rename from src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java rename to src/main/java/WayofTime/bloodmagic/teleport/Teleports.java index 43e738dc..646480f3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java @@ -1,9 +1,8 @@ -package WayofTime.bloodmagic.ritual.portal; +package WayofTime.bloodmagic.teleport; import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.event.TeleposeEvent; -import WayofTime.bloodmagic.teleport.Teleport; import WayofTime.bloodmagic.util.helper.NetworkHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; @@ -148,7 +147,7 @@ public class Teleports { network.syphon(ticket(oldWorld, player, getTeleportCost())); - /* begin brandon3055 "BrandonsCore" intedimensional teleportation code */ + /* begin brandon3055 "BrandonsCore" interdimensional teleportation code */ PlayerList playerList = server.getPlayerList(); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index 8aaf092f..d3c7caf3 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -1,12 +1,13 @@ 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.ritual.portal.Teleports; 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; @@ -56,6 +57,17 @@ public class TileTeleposer extends TileInventory implements ITickable { } 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); + } } } @@ -66,14 +78,14 @@ public class TileTeleposer extends TileInventory implements ITickable { Binding binding = focus.getBinding(focusStack); if (binding == null) return; - BlockPos focusPos = focus.getBlockPos(getStackInSlot(0)); - World focusWorld = focus.getWorld(getStackInSlot(0)); + 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 = (getStackInSlot(0).getItemDamage() + 1); + 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)))) { diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java index eedf6f7c..b9da4f00 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java @@ -1,10 +1,12 @@ 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.state.IBlockState; @@ -14,6 +16,7 @@ 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; @@ -96,10 +99,8 @@ public class RitualHelper { return true; else if (tile instanceof IRitualStone.Tile) return true; - else if (tile != null && tile.hasCapability(RUNE_CAPABILITY, null)) - return true; + else return tile != null && tile.hasCapability(RUNE_CAPABILITY, null); - return false; } public static void setRuneType(World world, BlockPos pos, EnumRuneType type) { @@ -117,4 +118,94 @@ public class RitualHelper { world.notifyBlockUpdate(pos, state, state, 3); } } + + public static boolean createRitual(World world, BlockPos pos, EnumFacing direction, Ritual ritual, boolean safe) { + + List components = Lists.newArrayList(); + ritual.gatherComponents(components::add); + + if (abortConstruction(world, pos, direction, safe, components)) return false; + + IBlockState mrs = RegistrarBloodMagicBlocks.RITUAL_CONTROLLER.getDefaultState(); + world.setBlockState(pos, mrs); + + setRitualStones(direction, world, pos, components); + return true; + } + + public static boolean abortConstruction(World world, BlockPos pos, EnumFacing 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(); + EnumFacing 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(EnumFacing 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(); + IBlockState 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(); + EnumFacing possibleDirection = tile.getDirection(); + int highestCount = 0; + + if (possibleRitual == null || possibleDirection == null) + for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { + for (EnumFacing direction : EnumFacing.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/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 83614e9a..82c23c2e 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -817,9 +817,8 @@ entity.bloodmagic.Mimic.name=Mimic 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.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 @@ -833,42 +832,67 @@ commands.bloodmagic.network.usage=/bloodmagic network [syphon|add|get|fill|cap] 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.bind.usage=/bloodmagic bind [true|false] [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=Binding successful +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] +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.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) +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 From e8eb44632dbc4011e0a5c98e4cbf04ce7b07be7e Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 02:11:32 +0100 Subject: [PATCH 384/595] Ritual Reader Quality of Life (#1528) * Groundwork for Reader part 1 * More Ritual Reader information & more intuitive to use. * Added `getCurrentRitual()` to `IMasterRitualStone` RitualReader can now only be used on MRS with a set Ritual (this prevents a (caught) NPE). * Refactored * Added Enum --- gradle.properties | 2 +- .../bloodmagic/item/ItemRitualReader.java | 36 ++++++++++++++++--- .../potion/PotionEventHandlers.java | 7 +--- .../ritual/EnumReaderBoundaries.java | 22 ++++++++++++ .../bloodmagic/ritual/IMasterRitualStone.java | 4 ++- .../WayofTime/bloodmagic/ritual/Ritual.java | 7 ++-- .../tile/TileMasterRitualStone.java | 25 ++++++------- 7 files changed, 74 insertions(+), 29 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/EnumReaderBoundaries.java diff --git a/gradle.properties b/gradle.properties index 2b89fa29..48dbcb74 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ mappings_version=snapshot_20180201 jei_version=4.8.5.147 waila_version=1.8.23-B38_1.12 -guideapi_version=1.12-2.1.4-57 +guideapi_version=1.12-2.1.4-57 \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index b6f7297d..bceeb86e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; 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; @@ -20,6 +21,7 @@ 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.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -90,6 +92,8 @@ public class ItemRitualReader extends Item implements IVariantProvider { 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); @@ -99,7 +103,8 @@ public class ItemRitualReader extends Item implements IVariantProvider { break; case SET_AREA: String range = this.getCurrentBlockRange(stack); - if (player.isSneaking()) { + + if (range == null || player.isSneaking()) { String newRange = master.getNextBlockRange(range); range = newRange; this.setCurrentBlockRange(stack, newRange); @@ -136,16 +141,37 @@ public class ItemRitualReader extends Item implements IVariantProvider { if (!masterPos.equals(BlockPos.ORIGIN)) { BlockPos containedPos = getBlockPos(stack); if (containedPos.equals(BlockPos.ORIGIN)) { - this.setBlockPos(stack, pos.subtract(masterPos)); + BlockPos pos1 = pos.subtract(masterPos); + this.setBlockPos(stack, pos1); player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.firstBlock"), true); - //TODO: Notify player. + player.sendMessage(new TextComponentString(pos1.toString())); } else { tile = world.getTileEntity(masterPos); if (tile instanceof IMasterRitualStone) { IMasterRitualStone master = (IMasterRitualStone) tile; - master.setBlockRangeByBounds(player, this.getCurrentBlockRange(stack), containedPos, pos.subtract(masterPos)); - } + BlockPos pos2 = pos.subtract(masterPos); + String range = this.getCurrentBlockRange(stack); + Ritual ritual = master.getCurrentRitual(); + //TODO: Fix AreaDescriptor area handling to be inclusive, then remove the "-1" for range calculation below. + int maxHorizontalRange = ritual.getMaxHorizontalRadiusForRange(range, null, null) - 1; + int maxVerticalRange = ritual.getMaxVerticalRadiusForRange(range, null, null) - 1; + int maxVolume = ritual.getMaxVolumeForRange(range, null, null); + switch (master.setBlockRangeByBounds(player, range, containedPos, pos2)) { + case SUCCESS: + player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.success"), true); + break; + case NOT_WITHIN_BOUNDARIES: + player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.tooFar", maxVerticalRange, maxHorizontalRange), false); + break; + case VOLUME_TOO_LARGE: + player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.tooBig", maxVolume), false); + break; + default: + player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.noRange"), false); + break; + } + } this.setBlockPos(stack, BlockPos.ORIGIN); } } diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 57f68fc2..46b12fc1 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -13,11 +13,7 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.World; -import net.minecraftforge.event.entity.living.EnderTeleportEvent; -import net.minecraftforge.event.entity.living.LivingAttackEvent; -import net.minecraftforge.event.entity.living.LivingDamageEvent; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.event.entity.living.LivingFallEvent; +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; @@ -26,7 +22,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.ArrayList; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class PotionEventHandlers { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/EnumReaderBoundaries.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumReaderBoundaries.java new file mode 100644 index 00000000..0f69f17c --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/EnumReaderBoundaries.java @@ -0,0 +1,22 @@ +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/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index 8f338258..6ed5924b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -55,7 +55,7 @@ public interface IMasterRitualStone { void setActiveWillConfig(EntityPlayer player, List typeList); - boolean setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2); + EnumReaderBoundaries setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2); List getActiveWillConfig(); @@ -68,4 +68,6 @@ public interface IMasterRitualStone { void addBlockRanges(Map blockRanges); void addBlockRange(String range, AreaDescriptor defaultRange); + + Ritual getCurrentRitual(); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java index 7e642e6c..95504bce 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -15,7 +15,6 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.*; import java.util.Map.Entry; -import java.util.function.BiFunction; import java.util.function.Consumer; /** @@ -186,13 +185,13 @@ public abstract class Ritual { return rangeList.get(0); } - public boolean canBlockRangeBeModified(String range, AreaDescriptor descriptor, IMasterRitualStone master, BlockPos offset1, BlockPos offset2, DemonWillHolder holder) { + 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); + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index e27f53b4..1f803f26 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -9,6 +9,7 @@ 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; @@ -159,7 +160,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS this.cachedNetwork = network; this.currentRitual = ritual; - if(!checkBlockRanges(ritual.getModableRangeMap())) + if (!checkBlockRanges(ritual.getModableRangeMap())) addBlockRanges(ritual.getModableRangeMap()); notifyUpdate(); @@ -188,10 +189,10 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (MinecraftForge.EVENT_BUS.post(event)) return; - + if (!checkBlockRanges(getCurrentRitual().getModableRangeMap())) addBlockRanges(getCurrentRitual().getModableRangeMap()); - + getCurrentRitual().performRitual(this); } else { stopRitual(Ritual.BreakType.BREAK_STONE); @@ -307,17 +308,17 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS public void setActiveWillConfig(EntityPlayer player, List typeList) { this.currentActiveWillConfig = typeList; } - + @Override - public boolean setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2) { + public EnumReaderBoundaries setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2) { AreaDescriptor descriptor = this.getBlockRange(range); DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, getBlockPos()); - if (this.currentRitual.canBlockRangeBeModified(range, descriptor, this, offset1, offset2, holder)) { - descriptor.modifyAreaByBlockPositions(offset1, offset2); - return true; - } - return false; + EnumReaderBoundaries modificationType = currentRitual.canBlockRangeBeModified(range, descriptor, this, offset1, offset2, holder); + if (modificationType == EnumReaderBoundaries.SUCCESS) + descriptor.modifyAreaByBlockPositions(offset1, offset2); + + return modificationType; } @Override @@ -428,13 +429,13 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS modableRangeMap.put(range, defaultRange); } - public void addBlockRanges(Map blockRanges){ + public void addBlockRanges(Map blockRanges) { for (Map.Entry entry : blockRanges.entrySet()) { modableRangeMap.put(entry.getKey(), entry.getValue()); } } - public boolean checkBlockRanges(Map blockRanges){ + public boolean checkBlockRanges(Map blockRanges) { for (Map.Entry entry : blockRanges.entrySet()) { if (modableRangeMap.get(entry.getKey()) == null) return false; From 4bf8e94d26378243b331a10d08652120e0310ff0 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 02:13:24 +0100 Subject: [PATCH 385/595] Changed required Activation Crystal levels for Ritual Activation (#1456) These Rituals will require an Awakened Activation Crystal: From 1.7.10: - RitualMeteor (Mark of the falling Tower) New: - all Living Armor related Rituals (because it is the most end-game/powerful stuff right now). I changed the Activation Crystal level for the Living Armor related rituals based on the (old) Bound Armor related rituals. Remaining (non-ported) Rituals (from 1.7.10) that require an Awakened Activation Crystal: NOTE: Some of those Rituals represent an outdated concept, don't assume that they will be ported. - DrillOfTheDead (Sanguimancy - More powerful version of Well of Suffering) - AW016FeatheredEarth (no fall damage?); "Ritual of the Feathered Earth" - AW017Gaia (no idea); "Ritual of Gaia's Transformation" - AW018Condor (localized creative flight); "Ritual of the Condor" - AW025Conduit (transferring LP from network to Altar); "Cry of the Eternal Soul" - AW031Convocation (how do I get Tier6?); "Convocation of the Damned" - AW032Symmetry (Omega upgrade for Bound Armor); "Symmetry of the Omega" - AW033Stalling (permanent Omega upgrade?); "Duet of the Fused Souls" - AW036SphereIsland (Shard of Laputa alike); "Blood of the New Moon" --- .../bloodmagic/ritual/types/RitualArmourEvolve.java | 2 +- .../ritual/types/RitualLivingArmourDowngrade.java | 6 +++--- .../WayofTime/bloodmagic/ritual/types/RitualMeteor.java | 3 ++- .../bloodmagic/ritual/types/RitualUpgradeRemove.java | 8 ++++---- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java index 77251191..8f2ed0a5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java @@ -19,7 +19,7 @@ public class RitualArmourEvolve extends Ritual { public static final String CHECK_RANGE = "fillRange"; public RitualArmourEvolve() { - super("ritualArmourEvolve", 0, 50000, "ritual." + BloodMagic.MODID + ".armourEvolveRitual"); + super("ritualArmourEvolve", 2, 50000, "ritual." + BloodMagic.MODID + ".armourEvolveRitual"); addBlockRange(CHECK_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1, 2, 1)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java index ea2da47c..0d633b79 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; 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; @@ -33,7 +33,7 @@ public class RitualLivingArmourDowngrade extends Ritual { private int internalTimer = 0; public RitualLivingArmourDowngrade() { - super("ritualDowngrade", 0, 10000, "ritual." + BloodMagic.MODID + ".downgradeRitual"); + super("ritualDowngrade", 2, 10000, "ritual." + BloodMagic.MODID + ".downgradeRitual"); addBlockRange(DOWNGRADE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-3, 0, -3), 7)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java index 9cffa010..9579495f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java @@ -22,7 +22,8 @@ public class RitualMeteor extends Ritual { public static final double destructiveWillDrain = 50; public RitualMeteor() { - super("ritualMeteor", 0, 0, "ritual." + BloodMagic.MODID + ".meteorRitual"); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java index c8e210ef..1addb3c6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java @@ -1,13 +1,13 @@ 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 WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; import com.google.common.collect.Iterables; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; @@ -26,7 +26,7 @@ public class RitualUpgradeRemove extends Ritual { public static final String CHECK_RANGE = "fillRange"; public RitualUpgradeRemove() { - super("ritualUpgradeRemove", 0, 25000, "ritual." + BloodMagic.MODID + ".upgradeRemoveRitual"); + super("ritualUpgradeRemove", 2, 25000, "ritual." + BloodMagic.MODID + ".upgradeRemoveRitual"); addBlockRange(CHECK_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1, 2, 1)); } From 95464ca509fb8c753e585dfc007921db2f6573b7 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 02:15:11 +0100 Subject: [PATCH 386/595] Bounding boxes / Collision boxes rework (#1464) * Bounding boxes, first part: - BlockDemonCrystal ATTACHED "UP" (facing upwards) (AABB_UP) finished all ages - BlockDemonCrystal Age 0 finished for all ATTACHED values TODO: Remaining ATTACHED/AGE values, making it look a bit more tidy. - BlockIncenseAltar: changed bounding box to the closest full pixel - BlockDemonPylon: Made bounding box a bit higher TODO: remaining blocks that are visually higher or smaller than a full block, how should values be displayed: "x / 16F" or "0.X" * Bounding boxes, second part: - up to EAST, age 1 TODO: Remaining ATTACHED/AGE values. TODO: remaining blocks that are visually higher or smaller than a full block, how should values be displayed: "x / 16F" or "0.X" * Finished EAST, started WEST * finished WEST * Changed Bounding and Collision boxes for: BlockAlchemyTable - lowered by 2 pixels (fits with base model without "accessoires" on the table) BlockAltar - lowered by 4 pixels (fits with base model) BlockDemonCrucible - seperated into ARMS, BODY and LEGS, each with their own collision boxes. Uses BODY as Bounding box BlockDemonPylon - seperated into BODY and LEGS, uses BODY as Bounding box. * Alchemy Table BB --- .../bloodmagic/block/BlockAlchemyTable.java | 8 +- .../bloodmagic/block/BlockAltar.java | 12 +- .../bloodmagic/block/BlockDemonCrucible.java | 70 +++++++ .../bloodmagic/block/BlockDemonCrystal.java | 195 +++++++++++++++--- .../bloodmagic/block/BlockDemonPylon.java | 66 ++++++ .../bloodmagic/block/BlockIncenseAltar.java | 2 +- 6 files changed, 325 insertions(+), 28 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java index 8d9c9b8f..6e6fe841 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; 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.material.Material; import net.minecraft.block.properties.PropertyBool; @@ -17,6 +17,7 @@ import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -26,6 +27,7 @@ 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", EnumFacing.class); + private static final AxisAlignedBB BODY = new AxisAlignedBB(0, 0, 0, 16 / 16F, 13 / 16F, 16 / 16F); public BlockAlchemyTable() { super(Material.ROCK); @@ -40,6 +42,10 @@ public class BlockAlchemyTable extends Block implements IBMBlock { // setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); } + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return BODY; + } + @Override public boolean isOpaqueCube(IBlockState state) { return false; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 3f979f47..136f7801 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -1,7 +1,10 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.*; +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; @@ -23,6 +26,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; @@ -35,6 +39,8 @@ import java.util.ArrayList; import java.util.List; public class BlockAltar extends Block implements IVariantProvider, IDocumentedBlock, IBMBlock { + private static final AxisAlignedBB BODY = new AxisAlignedBB(0, 0, 0, 16 / 16F, 12 / 16F, 16 / 16F); + public BlockAltar() { super(Material.ROCK); @@ -45,6 +51,10 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl setHarvestLevel("pickaxe", 1); } + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return BODY; + } + @Override public boolean hasComparatorInputOverride(IBlockState state) { return true; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 5627ce9d..b4d5c1d2 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -6,9 +6,11 @@ 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.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -16,13 +18,34 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +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); @@ -35,6 +58,18 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl // setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); } + private static List getCollisionBoxList(IBlockState state) { + ArrayList collBox = new ArrayList<>(Arrays.asList(ARMS)); + collBox.add(BODY); + collBox.addAll(Arrays.asList(FEET)); + return collBox; + } + + @Override + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return BODY; + } + @Override public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; @@ -99,4 +134,39 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl public ItemBlock getItem() { return new ItemBlock(this); } + + @Override + public RayTraceResult collisionRayTrace(IBlockState 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(IBlockState 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 index 61b7073c..78a54ba5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -7,6 +7,7 @@ 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.material.Material; @@ -15,6 +16,7 @@ import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -23,17 +25,81 @@ import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; 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", EnumFacing.class); + private static final EnumMap bounds = new EnumMap<>(EnumFacing.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); @@ -46,6 +112,72 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid 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(IBlockState 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(IBlockState 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, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { @@ -62,7 +194,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid if (!crystal.getWorld().isRemote && isCreative && holdsCrystal) { if (crystal.crystalCount < 7) { crystal.internalCounter = 0; - if(crystal.progressToNextCrystal > 0) + if (crystal.progressToNextCrystal > 0) crystal.progressToNextCrystal--; crystal.crystalCount++; crystal.markDirty(); @@ -167,6 +299,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid @Override public int getMetaFromState(IBlockState state) { + return state.getValue(TYPE).ordinal(); } @@ -186,30 +319,6 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid return new TileDemonCrystal(); } - 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; - } - @Override public ItemBlock getItem() { return new ItemBlockDemonCrystal(this); @@ -220,4 +329,40 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid for (EnumDemonWillType willType : EnumDemonWillType.values()) variants.put(willType.ordinal(), "age=3,attached=up,type=" + willType.getName()); } + + @Override + public RayTraceResult collisionRayTrace(IBlockState 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(IBlockState 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/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java index 60fdafea..38a64240 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -3,17 +3,36 @@ 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.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; +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 BlockContainer 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); @@ -26,6 +45,18 @@ public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVarian // setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); } + private static List getCollisionBoxList(IBlockState state) { + ArrayList collBox = new ArrayList<>(Arrays.asList(ARMS)); + collBox.add(BODY); + collBox.addAll(Arrays.asList(FEET)); + return collBox; + } + + @Override + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return BODY; + } + @Override public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { return false; @@ -60,4 +91,39 @@ public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVarian public ItemBlock getItem() { return new ItemBlock(this); } + + @Override + public RayTraceResult collisionRayTrace(IBlockState 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(IBlockState 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/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java index e77d0982..12d9d77e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -17,7 +17,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlock { - protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); + protected static final AxisAlignedBB AABB = new AxisAlignedBB(5 / 16F, 0F, 5 / 16F, 12 / 16F, 1F, 11 / 16F); public BlockIncenseAltar() { super(Material.ROCK); From 05f0bb733bc378ff2e2db51ee0c3c78aee7e6b8c Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 02:16:02 +0100 Subject: [PATCH 387/595] Removed some redundant stuff for Bindable items, improved inheritance (#1455) * Added explicit Tooltip for unbound items and restructured Bindable inheritance - Added a "Item is not bound" tooltip to ItemBindableBase - Streamlined inheritance. All Sigils now extend ItemBindableBase at some point. - removed redundant hasTextCompound check * Removed TextHelper usages in the affected files. * Nobody likes tooltips. * Forgot the translation entry. * Reverted change --- .../WayofTime/bloodmagic/item/ItemBindableBase.java | 4 ++-- .../WayofTime/bloodmagic/item/sigil/ItemSigil.java | 7 +++---- .../bloodmagic/item/sigil/ItemSigilBase.java | 13 +++---------- .../item/sigil/ItemSigilToggleableBase.java | 9 ++------- 4 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index 71bafcd7..fa5d84e8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -3,10 +3,10 @@ package WayofTime.bloodmagic.item; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -29,6 +29,6 @@ public class ItemBindableBase extends Item implements IBindable { Binding binding = getBinding(stack); if (binding != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); + tooltip.add(new TextComponentTranslation("tooltip.bloodmagic.currentOwner", binding.getOwnerName()).getFormattedText()); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java index 70be6e84..496958e1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java @@ -1,16 +1,15 @@ package WayofTime.bloodmagic.item.sigil; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.iface.IBindable; 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.Item; import net.minecraft.item.ItemStack; /** * Base class for all (static) sigils. */ -public class ItemSigil extends Item implements IBindable, ISigil { +public class ItemSigil extends ItemBindableBase implements ISigil { private int lpUsed; public ItemSigil(int lpUsed) { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index c62a8ca8..dd4471dc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -2,14 +2,15 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.data.Binding; 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.util.text.TextComponentTranslation; 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; @@ -24,7 +25,6 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider { super(lpUsed); setUnlocalizedName(BloodMagic.MODID + ".sigil." + name); - setCreativeTab(BloodMagic.TAB_BM); this.name = name; this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; @@ -38,14 +38,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider { @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (TextHelper.canTranslate(tooltipBase + "desc")) - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(tooltipBase + "desc")))); - - if (!stack.hasTagCompound()) - return; - - Binding binding = getBinding(stack); - if (binding != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); + tooltip.addAll(Arrays.asList(WordUtils.wrap(new TextComponentTranslation(tooltipBase + "desc").getFormattedText(), 30, "/cut", false).split("/cut"))); super.addInformation(stack, world, tooltip, flag); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 08fb9dff..2586e266 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -3,11 +3,10 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -38,11 +37,7 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes if (!stack.hasTagCompound()) return; - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated"))); - - Binding binding = getBinding(stack); - if (binding != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); + tooltip.add(new TextComponentTranslation("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated")).getFormattedText()); } @Override From 1426e49164325d2880496b9370ed06635bdb8525 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Fri, 1 Feb 2019 02:17:00 +0100 Subject: [PATCH 388/595] Potion tipped & modded arrows now get the will effects applied alongside them. (#1424) * Potion tipped arrows now get the will effects applied alongside them - Destructive releases a splash potion at the target location - potion amplifiers are increased if the potion effect is already applied by the will type (poison, levitation, slowness) * On hold for now, I'll do the commands first (I've had enough of arrows for this week). * Revert Sentient Bow/Arrow to handle only potion arrows and fire regular modded arrows. * Removed last remnants of modded arrow creation code. * arrowHit() now supports modded Arrows (onUpdate() has the issue of TNT arrows exploding indefinitely atm) * Crashes when firing a TNT arrow from the SimplyArrows mod with destructive will infused sentient bow * Fixed potion arrows. Modded arrows now work fully when hitting the ground (no splash visual effect). * Added scaling for explosive potion arrows + cleanup --- .../projectile/EntitySentientArrow.java | 320 +++++++++++++----- .../bloodmagic/item/soul/ItemSentientBow.java | 241 ++++++------- 2 files changed, 330 insertions(+), 231 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index 1e91024e..aa90eaa3 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -1,59 +1,94 @@ package WayofTime.bloodmagic.entity.projectile; -import java.util.Locale; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityTippedArrow; -import net.minecraft.init.Items; -import net.minecraft.init.MobEffects; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.util.Constants; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.entity.projectile.EntityTippedArrow; +import net.minecraft.init.Items; +import net.minecraft.init.MobEffects; +import net.minecraft.init.PotionTypes; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.PotionType; +import net.minecraft.potion.PotionUtils; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.World; -public class EntitySentientArrow extends EntityTippedArrow -{ +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 EntityTippedArrow { + public PotionType potion = PotionTypes.EMPTY; public double reimbursedAmountOnHit = 0; public EnumDemonWillType type = EnumDemonWillType.DEFAULT; public int currentLevel = 0; - 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 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 EntityArrow specialEntity; + public MethodHandle specialHitMH; + public Method specialHit; - public EntitySentientArrow(World worldIn) - { + public EntitySentientArrow(World worldIn) { super(worldIn); } - public EntitySentientArrow(World worldIn, double x, double y, double z) - { + public EntitySentientArrow(World worldIn, double x, double y, double z) { super(worldIn, x, y, z); } - public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reinburseAmount, int currentLevel) - { + public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel) { super(worldIn, shooter); - this.reimbursedAmountOnHit = reinburseAmount; + this.reimbursedAmountOnHit = reimburseAmount; this.type = type; this.currentLevel = currentLevel; } - public void reimbursePlayer(EntityLivingBase hitEntity, float damage) - { - if (this.shootingEntity instanceof EntityPlayer) - { - if (hitEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) - { + public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, PotionType potion) { + super(worldIn, shooter); + this.reimbursedAmountOnHit = reimburseAmount; + this.type = type; + this.currentLevel = currentLevel; + this.potion = potion; + } + + public EntitySentientArrow(World worldIn, EntityLivingBase 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, EntityLivingBase shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, EntityArrow specialArrow) { + super(worldIn, shooter); + this.reimbursedAmountOnHit = reimburseAmount; + this.type = type; + this.currentLevel = currentLevel; + this.specialEntity = specialArrow; + this.specialArrowClass = specialArrow.getClass(); + } + + public void reimbursePlayer(EntityLivingBase hitEntity, float damage) { + if (this.shootingEntity instanceof EntityPlayer) { + if (hitEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) { return; } @@ -62,68 +97,169 @@ public class EntitySentientArrow extends EntityTippedArrow } @Override - protected void arrowHit(EntityLivingBase living) - { - super.arrowHit(living); - - switch (type) - { - case CORROSIVE: - living.addPotionEffect(new PotionEffect(MobEffects.POISON, currentLevel >= 0 ? poisonDuration[currentLevel] : 0, currentLevel >= 0 ? poisonLevel[currentLevel] : 0)); - break; - case DEFAULT: - break; - case DESTRUCTIVE: - this.world.createExplosion(this, this.posX, this.posY, this.posZ, currentLevel >= 0 ? destructiveExplosionRadius[currentLevel] : 0, false); - break; - case STEADFAST: - living.addPotionEffect(new PotionEffect(MobEffects.LEVITATION, currentLevel >= 0 ? levitationDuration[currentLevel] : 0, currentLevel >= 0 ? levitationLevel[currentLevel] : 0)); - break; - case VENGEFUL: - living.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, currentLevel >= 0 ? slownessDuration[currentLevel] : 0, currentLevel >= 0 ? slownessLevel[currentLevel] : 0)); - break; - default: - break; - } - } - - @Override - public void onUpdate() - { - super.onUpdate(); - - if (!this.world.isRemote && this.inGround && this.timeInGround > 0) - { - switch (type) - { - case DESTRUCTIVE: - this.world.createExplosion(this, this.posX, this.posY, this.posZ, currentLevel >= 0 ? destructiveExplosionRadius[currentLevel] : 0, false); - this.setDead(); - break; + protected void arrowHit(EntityLivingBase living) { + int amp = -1; + switch (type) { case CORROSIVE: + if (this.potion != null) + for (PotionEffect i : this.potion.getEffects()) { + if (i.getEffectName().equals("poison")) { + amp = i.getAmplifier(); + continue; + } + living.addPotionEffect(new PotionEffect(i.getPotion(), i.getDuration(), i.getAmplifier())); + } + living.addPotionEffect(new PotionEffect(MobEffects.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 (PotionEffect i : this.potion.getEffects()) { + living.addPotionEffect(new PotionEffect(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 (PotionEffect i : this.potion.getEffects()) { + if (i.getEffectName().equals("levitation")) { + amp = i.getAmplifier(); + continue; + } + living.addPotionEffect(new PotionEffect(i.getPotion(), i.getDuration(), i.getAmplifier())); + } + living.addPotionEffect(new PotionEffect(MobEffects.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 (PotionEffect i : this.potion.getEffects()) { + if (i.getEffectName().equals("slowness")) { + amp = i.getAmplifier(); + continue; + } + living.addPotionEffect(new PotionEffect(i.getPotion(), i.getDuration(), i.getAmplifier())); + } + living.addPotionEffect(new PotionEffect(MobEffects.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", EntityLivingBase.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(); + } } } -// else if (this.inGround && this.timeInGround != 0 && !this.customPotionEffects.isEmpty() && this.timeInGround >= 600) -// { -// this.world.setEntityState(this, (byte)0); -// this.potion = PotionTypes.EMPTY; -// this.customPotionEffects.clear(); -// this.dataManager.set(COLOR, Integer.valueOf(-1)); -// } } @Override - public void writeEntityToNBT(NBTTagCompound tag) - { + public void onUpdate() { + super.onUpdate(); + 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; + } + + 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.setDead(); + this.specialEntity.setDead(); + } + } + } + } + + //TODO: Potion splash (for destructive will fired tipped arrows) currently does not have a visual effect. + private void createPotionFromArrow(EntityLivingBase 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(EntityLivingBase.class, axisalignedbb); + + if (!list.isEmpty()) { + for (EntityLivingBase 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 (PotionEffect potioneffect : this.potion.getEffects()) { + Potion 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 PotionEffect(potion, i, potioneffect.getAmplifier(), potioneffect.getIsAmbient(), potioneffect.doesShowParticles())); + } + } + } + } + } + } + } + } + } + + @Override + public void writeEntityToNBT(NBTTagCompound tag) { super.writeEntityToNBT(tag); tag.setDouble("reimbursement", reimbursedAmountOnHit); @@ -132,8 +268,7 @@ public class EntitySentientArrow extends EntityTippedArrow } @Override - public void readEntityFromNBT(NBTTagCompound tag) - { + public void readEntityFromNBT(NBTTagCompound tag) { super.readEntityFromNBT(tag); reimbursedAmountOnHit = tag.getDouble("reimbursement"); @@ -142,8 +277,21 @@ public class EntitySentientArrow extends EntityTippedArrow } @Override - protected ItemStack getArrowStack() - { + 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/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index fc9b195f..e6df6969 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -19,6 +19,7 @@ import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityTippedArrow; import net.minecraft.init.Enchantments; import net.minecraft.init.Items; +import net.minecraft.init.MobEffects; import net.minecraft.init.SoundEvents; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.IItemPropertyGetter; @@ -26,6 +27,8 @@ import net.minecraft.item.ItemArrow; import net.minecraft.item.ItemBow; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.PotionType; import net.minecraft.stats.StatList; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; @@ -41,67 +44,56 @@ import java.util.Locale; public class ItemSentientBow extends ItemBow 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 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() - { + public ItemSentientBow() { + super(); setUnlocalizedName(BloodMagic.MODID + ".sentientBow"); setCreativeTab(BloodMagic.TAB_BM); - this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() - { + this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) - { - if (entityIn == null) - { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { + if (entityIn == null) { return 0.0F; - } else - { + } 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() - { + this.addPropertyOverride(new ResourceLocation("pulling"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) - { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { return entityIn != null && entityIn.isHandActive() && entityIn.getActiveItemStack() == stack ? 1.0F : 0.0F; } }); - this.addPropertyOverride(new ResourceLocation("type"), new IItemPropertyGetter() - { + this.addPropertyOverride(new ResourceLocation("type"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) - { + public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { return ((ItemSentientBow) RegistrarBloodMagicItems.SENTIENT_BOW).getCurrentType(stack).ordinal(); } }); } @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) - { + 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, EntityPlayer player) - { + public void recalculatePowers(ItemStack stack, World world, EntityPlayer 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) - { + public void recalculatePowers(ItemStack stack, EnumDemonWillType type, double will) { this.setCurrentType(stack, will > 0 ? type : EnumDemonWillType.DEFAULT); int level = getLevel(will); // @@ -122,13 +114,10 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien setDamageAdded(stack, level >= 0 ? getDamageModifier(type, level) : 0); } - private int getLevel(double soulsRemaining) - { + private int getLevel(double soulsRemaining) { int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) - { - if (soulsRemaining >= soulBracket[i]) - { + for (int i = 0; i < soulBracket.length; i++) { + if (soulsRemaining >= soulBracket[i]) { lvl = i; } } @@ -137,49 +126,42 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public EnumDemonWillType getCurrentType(ItemStack stack) - { + public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) - { + 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]; + 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 float getVelocityModifier(EnumDemonWillType type, int willBracket) { + switch (type) { + case VENGEFUL: + return velocityAdded[willBracket]; + default: + return 0; } } - public void setDamageAdded(ItemStack stack, double damage) - { + public void setDamageAdded(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -187,8 +169,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble("damage", damage); } - public double getDamageAdded(ItemStack stack) - { + public double getDamageAdded(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -196,8 +177,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien return tag.getDouble("damage"); } - public void setVelocityOfArrow(ItemStack stack, float velocity) - { + public void setVelocityOfArrow(ItemStack stack, float velocity) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -205,22 +185,19 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setFloat("velocity", velocity); } - public float getVelocityOfArrow(ItemStack stack) - { + public float getVelocityOfArrow(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); - if (tag.hasKey("velocity")) - { + if (tag.hasKey("velocity")) { return tag.getFloat("velocity"); } return 3; } - public void setCurrentType(ItemStack stack, EnumDemonWillType type) - { + public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -228,16 +205,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } - public double getDrainOfActivatedBow(ItemStack stack) - { + public double getDrainOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } - public void setDrainOfActivatedBow(ItemStack stack, double drain) - { + public void setDrainOfActivatedBow(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -245,16 +220,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } - public double getStaticDropOfActivatedBow(ItemStack stack) - { + public double getStaticDropOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } - public void setStaticDropOfActivatedBow(ItemStack stack, double drop) - { + public void setStaticDropOfActivatedBow(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -262,16 +235,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } - public double getDropOfActivatedBow(ItemStack stack) - { + public double getDropOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } - public void setDropOfActivatedBow(ItemStack stack, double drop) - { + public void setDropOfActivatedBow(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); NBTTagCompound tag = stack.getTagCompound(); @@ -280,28 +251,25 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); this.recalculatePowers(stack, world, player); return super.onItemRightClick(world, player, hand); } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) - { + public void gatherVariants(@Nonnull Int2ObjectMap variants) { variants.put(0, "inventory"); } - public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) - { + public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) { EnumDemonWillType type = this.getCurrentType(stack); double amount = user instanceof EntityPlayer ? (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)) : 0; float newArrowVelocity = velocity * getVelocityOfArrow(stack); double soulsRemaining = user instanceof EntityPlayer ? (PlayerDemonWillHandler.getTotalDemonWill(type, (EntityPlayer) user)) : 0; - EntitySentientArrow entityArrow = new EntitySentientArrow(world, user, type, amount, getLevel(soulsRemaining)); + EntitySentientArrow entityArrow = new EntitySentientArrow(world, user, type, amount, getLevel(soulsRemaining), (PotionType) null); double d0 = target.posX - user.posX; double d1 = target.getEntityBoundingBox().minY + (double) (target.height / 3.0F) - entityArrow.posY; @@ -309,14 +277,12 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); entityArrow.shoot(d0, d1 + d3 * 0.05, d2, newArrowVelocity, 0); - if (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) - { + if (velocity == 1.0F) { entityArrow.setIsCritical(true); } @@ -326,13 +292,11 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - if (k > 0) - { + if (k > 0) { entityArrow.setKnockbackStrength(k); } - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) - { + if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) { entityArrow.setFire(100); } @@ -342,10 +306,8 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) - { - if (entityLiving instanceof EntityPlayer) - { + public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) { + if (entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entityLiving; boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0; ItemStack itemstack = this.getFiredArrow(player); @@ -355,21 +317,17 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien if (i < 0) return; - if (itemstack != null || flag) - { - if (itemstack == null) - { + if (itemstack != null || flag) { + if (itemstack == null) { itemstack = new ItemStack(Items.ARROW); } float arrowVelocity = getArrowVelocity(i); - if ((double) arrowVelocity >= 0.1D) - { + if ((double) arrowVelocity >= 0.1D) { boolean flag1 = flag && itemstack.getItem() == Items.ARROW; //Forge: Fix consuming custom arrows. - if (!world.isRemote) - { + if (!world.isRemote) { this.recalculatePowers(stack, world, player); EnumDemonWillType type = this.getCurrentType(stack); @@ -378,12 +336,20 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien double amount = (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)); float newArrowVelocity = arrowVelocity * getVelocityOfArrow(stack); - if (itemarrow == Items.ARROW) - { + if (itemarrow == Items.ARROW) { double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining)); - } else - entityArrow = itemarrow.createArrow(world, itemstack, player); + entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining), (PotionType) 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 PotionType(new PotionEffect(MobEffects.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) @@ -391,8 +357,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien world.playSound(null, player.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); } - if (arrowVelocity == 1.0F) - { + if (arrowVelocity == 1.0F) { entityArrow.setIsCritical(true); } @@ -402,20 +367,17 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - if (k > 0) - { + if (k > 0) { entityArrow.setKnockbackStrength(k); } - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) - { + if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) { entityArrow.setFire(100); } stack.damageItem(1, player); - if (flag1) - { + if (flag1) { entityArrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; } @@ -424,12 +386,10 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien 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) - { + if (!flag1) { itemstack.shrink(1); - if (itemstack.isEmpty()) - { + if (itemstack.isEmpty()) { player.inventory.deleteStack(itemstack); } } @@ -440,22 +400,16 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } } - protected ItemStack getFiredArrow(EntityPlayer player) - { - if (this.isArrow(player.getHeldItem(EnumHand.OFF_HAND))) - { + protected ItemStack getFiredArrow(EntityPlayer player) { + if (this.isArrow(player.getHeldItem(EnumHand.OFF_HAND))) { return player.getHeldItem(EnumHand.OFF_HAND); - } else if (this.isArrow(player.getHeldItem(EnumHand.MAIN_HAND))) - { + } else if (this.isArrow(player.getHeldItem(EnumHand.MAIN_HAND))) { return player.getHeldItem(EnumHand.MAIN_HAND); - } else - { - for (int i = 0; i < player.inventory.getSizeInventory(); ++i) - { + } else { + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { ItemStack itemstack = player.inventory.getStackInSlot(i); - if (this.isArrow(itemstack)) - { + if (this.isArrow(itemstack)) { return itemstack; } } @@ -465,17 +419,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) - { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { World world = player.getEntityWorld(); - if (!world.isRemote) - { + if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); EnumDemonWillType type = this.getCurrentType(droppedStack); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) - { + if (soulsRemaining < 1024) { return false; } From 83f0eefa152a878fe2e8cd690cf3813a247689f5 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 31 Jan 2019 19:10:37 -0800 Subject: [PATCH 389/595] Update mappings + dependencies --- gradle.properties | 10 +++++----- .../java/WayofTime/bloodmagic/BloodMagic.java | 4 ++-- .../alchemyArray/AlchemyCircleRenderer.java | 2 +- .../bloodmagic/block/BlockAlchemyArray.java | 6 +++--- .../bloodmagic/block/BlockAlchemyTable.java | 2 +- .../bloodmagic/block/BlockAltar.java | 2 +- .../bloodmagic/block/BlockBloodLight.java | 4 ++-- .../bloodmagic/block/BlockBloodRune.java | 2 +- .../bloodmagic/block/BlockBloodTank.java | 8 ++++---- .../bloodmagic/block/BlockDecorative.java | 2 +- .../bloodmagic/block/BlockDemonBase.java | 2 +- .../bloodmagic/block/BlockDemonCrucible.java | 2 +- .../bloodmagic/block/BlockDemonCrystal.java | 2 +- .../block/BlockDemonCrystallizer.java | 2 +- .../bloodmagic/block/BlockDemonLight.java | 2 +- .../block/BlockDemonPillarBase.java | 2 +- .../block/BlockDemonPillarCapBase.java | 2 +- .../bloodmagic/block/BlockDemonPylon.java | 2 +- .../block/BlockDemonStairsBase.java | 2 +- .../bloodmagic/block/BlockDemonWallBase.java | 2 +- .../block/BlockDimensionalPortal.java | 6 +++--- .../bloodmagic/block/BlockIncenseAltar.java | 2 +- .../block/BlockInputRoutingNode.java | 2 +- .../block/BlockInversionPillar.java | 2 +- .../block/BlockInversionPillarEnd.java | 2 +- .../block/BlockItemRoutingNode.java | 2 +- .../bloodmagic/block/BlockLifeEssence.java | 4 ++-- .../block/BlockMasterRoutingNode.java | 2 +- .../bloodmagic/block/BlockMimic.java | 2 +- .../block/BlockOutputRoutingNode.java | 2 +- .../WayofTime/bloodmagic/block/BlockPath.java | 2 +- .../bloodmagic/block/BlockPhantom.java | 4 ++-- .../block/BlockRitualController.java | 4 ++-- .../bloodmagic/block/BlockRitualStone.java | 2 +- .../bloodmagic/block/BlockSoulForge.java | 2 +- .../bloodmagic/block/BlockSpectral.java | 4 ++-- .../bloodmagic/block/BlockTeleposer.java | 2 +- .../block/base/BlockEnumPillarCap.java | 2 +- .../block/base/BlockEnumStairs.java | 2 +- .../client/gui/GuiItemRoutingNode.java | 2 +- .../AttractorAlchemyCircleRenderer.java | 2 +- .../BindingAlchemyCircleRenderer.java | 2 +- .../DualAlchemyCircleRenderer.java | 2 +- .../MobSacrificeAlchemyCircleRenderer.java | 2 +- .../SingleAlchemyCircleRenderer.java | 2 +- .../StaticAlchemyCircleRenderer.java | 2 +- .../TurretAlchemyCircleRenderer.java | 2 +- .../render/entity/RenderEntityMimic.java | 2 +- .../command/sub/SubCommandRitual.java | 2 +- .../DataProviderRitualController.java | 4 ++-- .../bloodmagic/core/data/Binding.java | 2 +- .../demonAura/WorldDemonWillHandler.java | 2 +- .../entity/mob/EntitySentientSpecter.java | 2 +- .../bloodmagic/gson/Serializers.java | 4 ++-- .../bloodmagic/item/ItemAltarMaker.java | 2 +- .../bloodmagic/item/ItemArcaneAshes.java | 2 +- .../bloodmagic/item/ItemBloodOrb.java | 10 +++++----- .../bloodmagic/item/ItemBoundSword.java | 2 +- .../bloodmagic/item/ItemBoundTool.java | 2 +- .../item/ItemDaggerOfSacrifice.java | 2 +- .../bloodmagic/item/ItemDemonWillGauge.java | 2 +- .../WayofTime/bloodmagic/item/ItemEnum.java | 6 +++--- .../bloodmagic/item/ItemExperienceBook.java | 2 +- .../bloodmagic/item/ItemLavaCrystal.java | 4 ++-- .../bloodmagic/item/ItemPotionFlask.java | 2 +- .../bloodmagic/item/ItemRitualDismantler.java | 2 +- .../bloodmagic/item/ItemRitualDiviner.java | 20 +++++++++---------- .../bloodmagic/item/ItemRitualReader.java | 2 +- .../bloodmagic/item/ItemSanguineBook.java | 2 +- .../bloodmagic/item/ItemUpgradeTome.java | 10 +++++----- .../bloodmagic/item/ItemUpgradeTrainer.java | 4 ++-- .../item/armour/ItemLivingArmour.java | 10 +++++----- .../item/armour/ItemSentientArmour.java | 6 +++--- .../item/block/ItemBlockAlchemyTable.java | 2 +- .../item/block/ItemBlockDemonCrystal.java | 4 ++-- .../item/block/base/ItemBlockEnum.java | 4 ++-- .../item/block/base/ItemBlockInteger.java | 4 ++-- .../item/gear/ItemPackSacrifice.java | 2 +- .../item/gear/ItemPackSelfSacrifice.java | 2 +- .../item/routing/ItemFluidRouterFilter.java | 6 +++--- .../item/routing/ItemNodeRouter.java | 2 +- .../item/routing/ItemRouterFilter.java | 6 +++--- .../bloodmagic/item/sigil/ItemSigilBase.java | 2 +- .../item/sigil/ItemSigilHolding.java | 2 +- .../item/sigil/ItemSigilToggleableBase.java | 2 +- .../item/soul/ItemSentientArmourGem.java | 2 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 2 +- .../bloodmagic/item/soul/ItemSentientBow.java | 2 +- .../item/soul/ItemSentientPickaxe.java | 2 +- .../item/soul/ItemSentientShovel.java | 2 +- .../item/soul/ItemSentientSword.java | 2 +- .../bloodmagic/item/soul/ItemSoulGem.java | 6 +++--- .../bloodmagic/item/soul/ItemSoulSnare.java | 6 +++--- .../item/soulBreath/ItemFlightScroll.java | 2 +- .../bloodmagic/livingArmour/LivingArmour.java | 2 +- .../livingArmour/LivingArmourUpgrade.java | 2 +- .../LivingArmourUpgradeBattleHungry.java | 2 +- .../LivingArmourUpgradeCrippledArm.java | 2 +- .../LivingArmourUpgradeDigSlowdown.java | 2 +- .../LivingArmourUpgradeDisoriented.java | 2 +- .../LivingArmourUpgradeMeleeDecrease.java | 2 +- .../LivingArmourUpgradeQuenched.java | 2 +- .../LivingArmourUpgradeSlippery.java | 2 +- .../LivingArmourUpgradeSlowHeal.java | 2 +- .../LivingArmourUpgradeSlowness.java | 2 +- .../LivingArmourUpgradeStormTrooper.java | 2 +- .../LivingArmourUpgradeArrowProtect.java | 2 +- .../upgrade/LivingArmourUpgradeArrowShot.java | 2 +- .../LivingArmourUpgradeCriticalStrike.java | 2 +- .../upgrade/LivingArmourUpgradeDigging.java | 2 +- .../upgrade/LivingArmourUpgradeElytra.java | 2 +- .../LivingArmourUpgradeExperience.java | 2 +- .../LivingArmourUpgradeFallProtect.java | 2 +- .../LivingArmourUpgradeFireResist.java | 2 +- .../LivingArmourUpgradeGraveDigger.java | 2 +- .../LivingArmourUpgradeGrimReaperSprint.java | 2 +- .../LivingArmourUpgradeHealthboost.java | 2 +- .../upgrade/LivingArmourUpgradeJump.java | 2 +- .../LivingArmourUpgradeKnockbackResist.java | 2 +- .../LivingArmourUpgradeMeleeDamage.java | 2 +- .../LivingArmourUpgradeNightSight.java | 2 +- .../LivingArmourUpgradePhysicalProtect.java | 2 +- .../LivingArmourUpgradePoisonResist.java | 2 +- .../upgrade/LivingArmourUpgradeRepairing.java | 2 +- .../LivingArmourUpgradeSelfSacrifice.java | 2 +- .../LivingArmourUpgradeSolarPowered.java | 2 +- .../upgrade/LivingArmourUpgradeSpeed.java | 2 +- .../LivingArmourUpgradeSprintAttack.java | 2 +- .../LivingArmourUpgradeStepAssist.java | 2 +- .../WayofTime/bloodmagic/ritual/Ritual.java | 8 ++++---- .../ritual/imperfect/ImperfectRitual.java | 2 +- .../ritual/types/RitualAnimalGrowth.java | 12 +++++------ .../ritual/types/RitualCrushing.java | 12 +++++------ .../ritual/types/RitualCrystalSplit.java | 2 +- .../ritual/types/RitualFeatheredKnife.java | 2 +- .../ritual/types/RitualGreenGrove.java | 2 +- .../bloodmagic/ritual/types/RitualLava.java | 2 +- .../bloodmagic/ritual/types/RitualSpeed.java | 2 +- .../structures/DungeonRoomLoader.java | 6 +++--- .../bloodmagic/tile/TileAlchemyTable.java | 2 +- .../bloodmagic/tile/TileDemonCrystal.java | 2 +- .../tile/TileMasterRitualStone.java | 2 +- .../tile/routing/TileRoutingNode.java | 2 +- .../bloodmagic/util/GhostItemHelper.java | 2 +- .../bloodmagic/util/ItemStackWrapper.java | 2 +- .../java/WayofTime/bloodmagic/util/Utils.java | 7 ++++--- .../util/handler/event/ClientHandler.java | 6 +++--- 147 files changed, 224 insertions(+), 223 deletions(-) diff --git a/gradle.properties b/gradle.properties index 48dbcb74..85df68d7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,11 +2,11 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic mod_version=2.3.3 mc_version=1.12.2 -forge_version=14.23.2.2611 +forge_version=14.23.5.2808 curse_id=224791 -mappings_version=snapshot_20180201 +mappings_version=stable_39 -jei_version=4.8.5.147 -waila_version=1.8.23-B38_1.12 -guideapi_version=1.12-2.1.4-57 \ No newline at end of file +jei_version=4.14.4.264 +waila_version=1.8.26-B41_1.12.2 +guideapi_version=1.12-2.1.8-63 \ 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 c0413361..4f763a30 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -42,13 +42,13 @@ public class BloodMagic { public static final RitualManager RITUAL_MANAGER = new RitualManager(new Configuration(new File(Loader.instance().getConfigDir(), MODID + "/" + "rituals.cfg"))); public static final CreativeTabs TAB_BM = new CreativeTabs(MODID + ".creativeTab") { @Override - public ItemStack getTabIconItem() { + public ItemStack createIcon() { return OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK); } }; public static CreativeTabs TAB_TOMES = new CreativeTabs(MODID + ".creativeTabTome") { @Override - public ItemStack getTabIconItem() { + public ItemStack createIcon() { return new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java index 89b0e042..51782a6b 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java @@ -89,7 +89,7 @@ public class AlchemyCircleRenderer { EnumFacing sideHit = EnumFacing.UP; EnumFacing rotation = tileArray.getRotation(); - GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { case DOWN: diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java index 4f706b6f..589c8b16 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java @@ -36,7 +36,7 @@ public class BlockAlchemyArray extends Block { public BlockAlchemyArray() { super(Material.CLOTH); - setUnlocalizedName(BloodMagic.MODID + ".alchemyArray"); + setTranslationKey(BloodMagic.MODID + ".alchemyArray"); setHardness(0.1f); } @@ -46,7 +46,7 @@ public class BlockAlchemyArray extends Block { } @Override - public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) { + public void onEntityCollision(World world, BlockPos pos, IBlockState state, Entity entity) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileAlchemyArray) { ((TileAlchemyArray) tile).onEntityCollidedWithBlock(state, entity); @@ -60,7 +60,7 @@ public class BlockAlchemyArray extends Block { @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() { + public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.CUTOUT; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java index 6e6fe841..c8867b87 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -33,7 +33,7 @@ public class BlockAlchemyTable extends Block implements IBMBlock { super(Material.ROCK); // this.setDefaultState(this.blockState.getBaseState().withProperty(DIRECTION, EnumFacing.DOWN).withProperty(INVISIBLE, false)); - setUnlocalizedName(BloodMagic.MODID + ".alchemyTable"); + setTranslationKey(BloodMagic.MODID + ".alchemyTable"); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 136f7801..73923dcb 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -44,7 +44,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl public BlockAltar() { super(Material.ROCK); - setUnlocalizedName(BloodMagic.MODID + ".altar"); + setTranslationKey(BloodMagic.MODID + ".altar"); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java index 7076f77f..99b5a6e2 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -28,7 +28,7 @@ public class BlockBloodLight extends Block { public BlockBloodLight() { super(Material.CLOTH); - setUnlocalizedName(BloodMagic.MODID + ".bloodLight"); + setTranslationKey(BloodMagic.MODID + ".bloodLight"); } @Override @@ -49,7 +49,7 @@ public class BlockBloodLight extends Block { @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() { + public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.CUTOUT; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java index 471bc99d..538385b8 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java @@ -22,7 +22,7 @@ public class BlockBloodRune extends BlockEnum implements IBloodRu public BlockBloodRune() { super(Material.ROCK, BloodRuneType.class); - setUnlocalizedName(BloodMagic.MODID + ".rune."); + setTranslationKey(BloodMagic.MODID + ".rune."); setCreativeTab(BloodMagic.TAB_BM); setSoundType(SoundType.STONE); setHardness(2.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 47e03d74..7dfa8ce2 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -39,7 +39,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB public BlockBloodTank() { super(Material.IRON, TileBloodTank.CAPACITIES.length - 1, "tier"); - setUnlocalizedName(BloodMagic.MODID + ".bloodTank"); + setTranslationKey(BloodMagic.MODID + ".bloodTank"); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.GLASS); @@ -60,7 +60,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() { + public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.CUTOUT_MIPPED; } @@ -91,7 +91,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB if (success) { world.checkLight(blockPos); world.updateComparatorOutputLevel(blockPos, this); - world.markAndNotifyBlock(blockPos, world.getChunkFromBlockCoords(blockPos), state, state, 3); + world.markAndNotifyBlock(blockPos, world.getChunk(blockPos), state, state, 3); return true; } @@ -138,7 +138,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB world.checkLight(pos); world.updateComparatorOutputLevel(pos, this); - world.markAndNotifyBlock(pos, world.getChunkFromBlockCoords(pos), blockState, blockState, 3); + world.markAndNotifyBlock(pos, world.getChunk(pos), blockState, blockState, 3); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java index 76ae3392..065f340e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java @@ -14,7 +14,7 @@ public class BlockDecorative extends BlockEnum { public BlockDecorative() { super(Material.ROCK, EnumDecorative.class); - setUnlocalizedName(BloodMagic.MODID + "."); + setTranslationKey(BloodMagic.MODID + "."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java index 782758fa..0fbe5fd7 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java @@ -11,7 +11,7 @@ public class BlockDemonBase & IStringSerializable> extends Blo public BlockDemonBase(String baseName, Class enumClass) { super(Material.ROCK, enumClass); - setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setTranslationKey(BloodMagic.MODID + "." + baseName + "."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index b4d5c1d2..69b59a5a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -49,7 +49,7 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl public BlockDemonCrucible() { super(Material.ROCK); - setUnlocalizedName(BloodMagic.MODID + ".demonCrucible"); + setTranslationKey(BloodMagic.MODID + ".demonCrucible"); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 78a54ba5..9463e459 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -105,7 +105,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid super(Material.ROCK); this.setDefaultState(this.blockState.getBaseState().withProperty(TYPE, EnumDemonWillType.DEFAULT).withProperty(ATTACHED, EnumFacing.UP)); - setUnlocalizedName(BloodMagic.MODID + ".demonCrystal."); + setTranslationKey(BloodMagic.MODID + ".demonCrystal."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java index 26ecfb88..b5dd79c5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java @@ -21,7 +21,7 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr public BlockDemonCrystallizer() { super(Material.ROCK); - setUnlocalizedName(BloodMagic.MODID + ".demonCrystallizer"); + setTranslationKey(BloodMagic.MODID + ".demonCrystallizer"); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java index f78e7266..45c5f9cc 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java @@ -10,7 +10,7 @@ public class BlockDemonLight extends BlockEnum { public BlockDemonLight() { super(Material.ROCK, EnumSubWillType.class); - setUnlocalizedName(BloodMagic.MODID + ".demonlight."); + setTranslationKey(BloodMagic.MODID + ".demonlight."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java index 5db379bb..10fb1fa0 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java @@ -14,7 +14,7 @@ public class BlockDemonPillarBase & IStringSerializable> exten public BlockDemonPillarBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); - setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setTranslationKey(BloodMagic.MODID + "." + baseName + "."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java index b31b09b1..7621d7ca 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java @@ -14,7 +14,7 @@ public class BlockDemonPillarCapBase & IStringSerializable> ex public BlockDemonPillarCapBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); - setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setTranslationKey(BloodMagic.MODID + "." + baseName + "."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java index 38a64240..5fb6a912 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -36,7 +36,7 @@ public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVarian public BlockDemonPylon() { super(Material.ROCK); - setUnlocalizedName(BloodMagic.MODID + ".demonPylon"); + setTranslationKey(BloodMagic.MODID + ".demonPylon"); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java index 05bd1d75..1402fe47 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java @@ -11,7 +11,7 @@ public class BlockDemonStairsBase & IStringSerializable> exten public BlockDemonStairsBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); - setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setTranslationKey(BloodMagic.MODID + "." + baseName + "."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java index ba6699fa..158ebdb9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java @@ -11,7 +11,7 @@ public class BlockDemonWallBase & IStringSerializable> extends public BlockDemonWallBase(String baseName, Material materialIn, Class enumClass) { super(materialIn, enumClass); - setUnlocalizedName(BloodMagic.MODID + "." + baseName + "."); + setTranslationKey(BloodMagic.MODID + "." + baseName + "."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 658a87f6..50f69dbc 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -32,7 +32,7 @@ public class BlockDimensionalPortal extends BlockInteger { public BlockDimensionalPortal() { super(Material.PORTAL, 2); - setUnlocalizedName(BloodMagic.MODID + ".dimensionalPortal"); + setTranslationKey(BloodMagic.MODID + ".dimensionalPortal"); setBlockUnbreakable(); setResistance(2000); setLightOpacity(0); @@ -72,7 +72,7 @@ public class BlockDimensionalPortal extends BlockInteger { } @Override - public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState blockState, Entity entity) { + public void onEntityCollision(World world, BlockPos pos, IBlockState blockState, Entity entity) { if (!world.isRemote && world.getTileEntity(pos) instanceof TileDimensionalPortal) { TileDimensionalPortal tile = (TileDimensionalPortal) world.getTileEntity(pos); @@ -129,7 +129,7 @@ public class BlockDimensionalPortal extends BlockInteger { @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() { + public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.TRANSLUCENT; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java index 12d9d77e..c97d1861 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -22,7 +22,7 @@ public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlo public BlockIncenseAltar() { super(Material.ROCK); - setUnlocalizedName(BloodMagic.MODID + ".incenseAltar"); + setTranslationKey(BloodMagic.MODID + ".incenseAltar"); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java index 85aab8ae..15ed0f5a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -17,7 +17,7 @@ public class BlockInputRoutingNode extends BlockRoutingNode { public BlockInputRoutingNode() { super(); - setUnlocalizedName(BloodMagic.MODID + ".inputRouting"); + setTranslationKey(BloodMagic.MODID + ".inputRouting"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java index f9c17e29..70c68a04 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java @@ -20,7 +20,7 @@ public class BlockInversionPillar extends BlockEnum { public BlockInversionPillar() { super(Material.ROCK, EnumSubWillType.class); - setUnlocalizedName(BloodMagic.MODID + ".inversionpillar."); + setTranslationKey(BloodMagic.MODID + ".inversionpillar."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java index 54193ee9..0b233797 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java @@ -16,7 +16,7 @@ public class BlockInversionPillarEnd extends BlockEnum impleme public BlockInversionPillarEnd() { super(Material.ROCK, EnumInversionCap.class); - setUnlocalizedName(BloodMagic.MODID + ".inversionpillarend."); + setTranslationKey(BloodMagic.MODID + ".inversionpillarend."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java index 1bb62034..805e9d9c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java @@ -14,7 +14,7 @@ public class BlockItemRoutingNode extends BlockRoutingNode { public BlockItemRoutingNode() { super(); - setUnlocalizedName(BloodMagic.MODID + ".itemRouting"); + setTranslationKey(BloodMagic.MODID + ".itemRouting"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java index 8828d7c0..e94badd6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java @@ -21,7 +21,7 @@ public class BlockLifeEssence extends BlockFluidClassic { public BlockLifeEssence() { super(LIFE_ESSENCE, Material.WATER); - setUnlocalizedName(BloodMagic.MODID + ".fluid.lifeEssence"); + setTranslationKey(BloodMagic.MODID + ".fluid.lifeEssence"); getLifeEssence().setBlock(this); } @@ -36,7 +36,7 @@ public class BlockLifeEssence extends BlockFluidClassic { } @Override - public BlockRenderLayer getBlockLayer() { + public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.SOLID; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java index d04ab3f2..c69e9caa 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java @@ -12,7 +12,7 @@ public class BlockMasterRoutingNode extends BlockRoutingNode { public BlockMasterRoutingNode() { super(); - setUnlocalizedName(BloodMagic.MODID + ".masterRouting"); + setTranslationKey(BloodMagic.MODID + ".masterRouting"); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index b0feb7eb..38b9ac62 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -37,7 +37,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent public BlockMimic() { super(Material.ROCK, EnumMimic.class); - setUnlocalizedName(BloodMagic.MODID + ".mimic."); + setTranslationKey(BloodMagic.MODID + ".mimic."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java index 5882dc30..204db890 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -17,7 +17,7 @@ public class BlockOutputRoutingNode extends BlockRoutingNode { public BlockOutputRoutingNode() { super(); - setUnlocalizedName(BloodMagic.MODID + ".outputRouting"); + setTranslationKey(BloodMagic.MODID + ".outputRouting"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 92fae1bf..779c1389 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -20,7 +20,7 @@ public class BlockPath extends BlockEnum implements IIncensePath { public BlockPath() { super(Material.ROCK, EnumPath.class); - setUnlocalizedName(BloodMagic.MODID + ".path."); + setTranslationKey(BloodMagic.MODID + ".path."); setCreativeTab(BloodMagic.TAB_BM); setHardness(2.0F); setResistance(5.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java index 084e6486..bfcedb11 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java @@ -23,7 +23,7 @@ public class BlockPhantom extends Block implements IVariantProvider { public BlockPhantom() { super(Material.CLOTH); - setUnlocalizedName(BloodMagic.MODID + ".phantom"); + setTranslationKey(BloodMagic.MODID + ".phantom"); setCreativeTab(BloodMagic.TAB_BM); } @@ -54,7 +54,7 @@ public class BlockPhantom extends Block implements IVariantProvider { @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() { + public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.TRANSLUCENT; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java index d08eb08c..f6a09218 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -35,7 +35,7 @@ public class BlockRitualController extends BlockEnum imple public BlockRitualController() { super(Material.ROCK, EnumRitualController.class); - setUnlocalizedName(BloodMagic.MODID + ".stone.ritual."); + setTranslationKey(BloodMagic.MODID + ".stone.ritual."); setCreativeTab(BloodMagic.TAB_BM); setSoundType(SoundType.STONE); setHardness(2.0F); @@ -97,7 +97,7 @@ public class BlockRitualController extends BlockEnum imple } @Override - public void onBlockDestroyedByExplosion(World world, BlockPos pos, Explosion explosion) { + public void onExplosionDestroy(World world, BlockPos pos, Explosion explosion) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileMasterRitualStone) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 8ef70691..432861d3 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -23,7 +23,7 @@ public class BlockRitualStone extends BlockEnum implements IRitual public BlockRitualStone() { super(Material.ROCK, EnumRuneType.class); - setUnlocalizedName(BloodMagic.MODID + ".ritualStone."); + setTranslationKey(BloodMagic.MODID + ".ritualStone."); setCreativeTab(BloodMagic.TAB_BM); setSoundType(SoundType.STONE); setHardness(2.0F); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index 4f93536b..d8eb932d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -27,7 +27,7 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock public BlockSoulForge() { super(Material.IRON); - setUnlocalizedName(BloodMagic.MODID + ".soulForge"); + setTranslationKey(BloodMagic.MODID + ".soulForge"); setHardness(2.0F); setResistance(5.0F); setSoundType(SoundType.METAL); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java index 6802804b..c6f8985c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -28,7 +28,7 @@ public class BlockSpectral extends Block { public BlockSpectral() { super(Material.CLOTH); - setUnlocalizedName(BloodMagic.MODID + ".spectral"); + setTranslationKey(BloodMagic.MODID + ".spectral"); } @Override @@ -58,7 +58,7 @@ public class BlockSpectral extends Block { @SideOnly(Side.CLIENT) @Override - public BlockRenderLayer getBlockLayer() { + public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.TRANSLUCENT; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java index 24978953..37bad79e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -24,7 +24,7 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, super(Material.ROCK); setCreativeTab(BloodMagic.TAB_BM); - setUnlocalizedName(BloodMagic.MODID + ".teleposer"); + setTranslationKey(BloodMagic.MODID + ".teleposer"); setHardness(2.0F); setResistance(5.0F); } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java index 365dd875..d4998c28 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java @@ -32,7 +32,7 @@ public class BlockEnumPillarCap & IStringSerializable> extends @Override public IBlockState getStateFromMeta(int meta) { IBlockState state = getBlockState().getBaseState().withProperty(this.getProperty(), getTypes()[meta % 2]); - return state.withProperty(FACING, EnumFacing.getFront(meta / 2)); + return state.withProperty(FACING, EnumFacing.byIndex(meta / 2)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java index 7a0203c4..f34b2e76 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java @@ -116,7 +116,7 @@ public class BlockEnumStairs & IStringSerializable> extends Bl @Override public IBlockState getStateFromMeta(int meta) { IBlockState state = getBlockState().getBaseState().withProperty(BlockStairs.HALF, (meta & 8) > 0 ? BlockStairs.EnumHalf.TOP : BlockStairs.EnumHalf.BOTTOM); - state = state.withProperty(FACING, EnumFacing.getFront(5 - (meta & 6) / 2)).withProperty(this.getProperty(), getTypes()[meta % 2]); + state = state.withProperty(FACING, EnumFacing.byIndex(5 - (meta & 6) / 2)).withProperty(this.getProperty(), getTypes()[meta % 2]); return state; } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java index e879512a..2a9d0590 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -41,7 +41,7 @@ public class GuiItemRoutingNode extends GuiContainer { } private int getCurrentActiveSlotPriority() { - EnumFacing direction = EnumFacing.getFront(inventory.currentActiveSlot); + EnumFacing direction = EnumFacing.byIndex(inventory.currentActiveSlot); if (direction != null) { return inventory.getPriority(direction); } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java index 4e330f9e..348bc98f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -81,7 +81,7 @@ public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer { EnumFacing sideHit = EnumFacing.UP; EnumFacing rotation = tileArray.getRotation(); - GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { case DOWN: diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index 699916ca..191fde6f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -109,7 +109,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer { // Specify which face this "circle" is located on EnumFacing sideHit = EnumFacing.UP; - GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { case DOWN: diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java index 29f03cbb..d6fc3741 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java @@ -67,7 +67,7 @@ public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer { EnumFacing sideHit = EnumFacing.UP; EnumFacing rotation = tileArray.getRotation(); - GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { case DOWN: diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java index d4590a5d..2f5bdfc7 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java @@ -92,7 +92,7 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer EnumFacing sideHit = EnumFacing.UP; EnumFacing rotation = tileArray.getRotation(); - GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java index f409062a..cafb9b63 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java @@ -65,7 +65,7 @@ public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer { EnumFacing sideHit = EnumFacing.UP; EnumFacing rotation = tileArray.getRotation(); - GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { case DOWN: diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java index a1e2b461..5153f6b8 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java @@ -70,7 +70,7 @@ public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer { EnumFacing sideHit = EnumFacing.UP; EnumFacing rotation = tileArray.getRotation(); - GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { case DOWN: diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java index 967b4638..35702b83 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java @@ -101,7 +101,7 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer EnumFacing sideHit = EnumFacing.UP; EnumFacing rotation = tileArray.getRotation(); - GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java index 27a39056..2612345a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java @@ -69,7 +69,7 @@ public class RenderEntityMimic extends RenderLiving { String s = nbttagcompound.getString("SkullOwner"); if (!StringUtils.isNullOrEmpty(s)) { - gameprofile = TileEntitySkull.updateGameprofile(new GameProfile(null, s)); + gameprofile = TileEntitySkull.updateGameProfile(new GameProfile(null, s)); nbttagcompound.setTag("SkullOwner", NBTUtil.writeGameProfile(new NBTTagCompound(), gameprofile)); } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java index b527ed5f..bf1a7dca 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java @@ -71,7 +71,7 @@ public class SubCommandRitual extends CommandTreeBase { sender.sendMessage(new TextComponentTranslation("commands.blooodmagic.ritual.create.noRitual")); return; } else if (args.length == 2 && (args[1].equals("help") || args[1].equals("?"))) { - sender.sendMessage(new TextComponentTranslation(BloodMagic.RITUAL_MANAGER.getRitual(args[0]).getUnlocalizedName() + ".info")); + sender.sendMessage(new TextComponentTranslation(BloodMagic.RITUAL_MANAGER.getRitual(args[0]).getTranslationKey() + ".info")); return; } EntityPlayerMP player = args.length < 3 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[1]); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index cadada2e..da4d5b21 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -59,7 +59,7 @@ public class DataProviderRitualController implements IWailaDataProvider { TileMasterRitualStone mrs = (TileMasterRitualStone) te; tag.setBoolean("master", true); if (mrs.getCurrentRitual() != null) { - tag.setString("ritual", mrs.getCurrentRitual().getUnlocalizedName()); + tag.setString("ritual", mrs.getCurrentRitual().getTranslationKey()); tag.setBoolean("active", mrs.isActive()); if (mrs.getOwner() != null) tag.setString("owner", PlayerHelper.getUsernameFromUUID(mrs.getOwner())); @@ -70,7 +70,7 @@ public class DataProviderRitualController implements IWailaDataProvider { ImperfectRitual ritual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(world.getBlockState(pos.up())); if (ritual != null) { - tag.setString("ritual", ritual.getUnlocalizedName()); + tag.setString("ritual", ritual.getTranslationKey()); tag.setBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(ritual), false)); } } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java index 3d7b8e2a..671f6a1b 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java @@ -61,7 +61,7 @@ public class Binding implements INBTSerializable { return null; NBTBase bindingTag = stack.getTagCompound().getTag("binding"); - if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.hasNoTags()) // Make sure it's both a tag compound and that it has actual data. + if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.isEmpty()) // Make sure it's both a tag compound and that it has actual data. return null; Binding binding = new Binding(); diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index bd37857a..06639138 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -138,7 +138,7 @@ public class WorldDemonWillHandler { 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.getChunkFromBlockCoords(pos); + Chunk chunk = world.getChunk(pos); generateWill(chunk); willChunk = getWillChunk(world.provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index c69b1e76..21d5b273 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -413,7 +413,7 @@ public class EntitySentientSpecter extends EntityDemonBase { 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().getDifficultyId() * 0.11F)); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java index a2171911..1f940d2e 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -65,8 +65,8 @@ public class Serializers { @Override public JsonElement serialize(ResourceLocation src, Type typeOfSrc, JsonSerializationContext context) { JsonObject object = new JsonObject(); - object.addProperty("domain", src.getResourceDomain()); - object.addProperty("path", src.getResourcePath()); + object.addProperty("domain", src.getNamespace()); + object.addProperty("path", src.getPath()); return object; } }; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index e1da3b10..9800cce6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -33,7 +33,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP public ItemAltarMaker() { super(); - setUnlocalizedName(BloodMagic.MODID + ".altarMaker"); + setTranslationKey(BloodMagic.MODID + ".altarMaker"); setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); setFull3D(); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index 41ebf298..12524c89 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -23,7 +23,7 @@ import java.util.List; public class ItemArcaneAshes extends Item implements IVariantProvider { public ItemArcaneAshes() { - setUnlocalizedName(BloodMagic.MODID + ".arcaneAshes"); + setTranslationKey(BloodMagic.MODID + ".arcaneAshes"); setMaxStackSize(1); setMaxDamage(19); //Allows for 20 uses setCreativeTab(BloodMagic.TAB_BM); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index c8516244..9e31e607 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -24,18 +24,18 @@ import java.util.List; public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { public ItemBloodOrb() { - setUnlocalizedName(BloodMagic.MODID + ".orb"); + setTranslationKey(BloodMagic.MODID + ".orb"); this.setMaxDamage(0); setHasSubtypes(true); } @Override - public String getUnlocalizedName(ItemStack stack) { + public String getTranslationKey(ItemStack stack) { BloodOrb orb = getOrb(stack); if (orb == null) - return super.getUnlocalizedName(stack); + return super.getTranslationKey(stack); - return super.getUnlocalizedName(stack) + "." + orb.getName(); + return super.getTranslationKey(stack) + "." + orb.getName(); } @Override @@ -94,7 +94,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { BloodOrb orb = getOrb(stack); if (flag.isAdvanced() && orb != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", orb.getRegistryName().getResourceDomain())); + tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", orb.getRegistryName().getNamespace())); super.addInformation(stack, world, tooltip, flag); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index e9b30300..935395da 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -36,7 +36,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable public ItemBoundSword() { super(RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL); - setUnlocalizedName(BloodMagic.MODID + ".bound.sword"); + setTranslationKey(BloodMagic.MODID + ".bound.sword"); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 128751c6..4031565f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -51,7 +51,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { public ItemBoundTool(String name, float damage, Set effectiveBlocks) { super(damage, 1, RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL, effectiveBlocks); - setUnlocalizedName(BloodMagic.MODID + ".bound." + name); + setTranslationKey(BloodMagic.MODID + ".bound." + name); setCreativeTab(BloodMagic.TAB_BM); setHarvestLevel(name, 4); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index c3b3ecfd..919a3039 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -25,7 +25,7 @@ import javax.annotation.Nonnull; public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { public ItemDaggerOfSacrifice() { super(); - setUnlocalizedName(BloodMagic.MODID + ".daggerOfSacrifice"); + setTranslationKey(BloodMagic.MODID + ".daggerOfSacrifice"); setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); setFull3D(); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index bc8448ea..a2649334 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -19,7 +19,7 @@ import java.util.List; public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemonWillViewer { public ItemDemonWillGauge() { - setUnlocalizedName(BloodMagic.MODID + ".willGauge"); + setTranslationKey(BloodMagic.MODID + ".willGauge"); setMaxStackSize(1); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java index 0fed5b36..1881a7d6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java @@ -21,14 +21,14 @@ public class ItemEnum & ISubItem> extends Item { this.types = enumClass.getEnumConstants(); - setUnlocalizedName(BloodMagic.MODID + "." + baseName); + setTranslationKey(BloodMagic.MODID + "." + baseName); setHasSubtypes(types.length > 1); setCreativeTab(BloodMagic.TAB_BM); } @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + "." + getItemType(stack).getInternalName(); + public String getTranslationKey(ItemStack stack) { + return super.getTranslationKey(stack) + "." + getItemType(stack).getInternalName(); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 5d8bc69e..381d817c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -24,7 +24,7 @@ import java.util.List; public class ItemExperienceBook extends Item implements IVariantProvider { public ItemExperienceBook() { - setUnlocalizedName(BloodMagic.MODID + ".experienceTome"); + setTranslationKey(BloodMagic.MODID + ".experienceTome"); setMaxStackSize(1); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index 1b47e612..a537d1ec 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -23,7 +23,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide public ItemLavaCrystal() { super(); - setUnlocalizedName(BloodMagic.MODID + ".lavaCrystal"); + setTranslationKey(BloodMagic.MODID + ".lavaCrystal"); } @Override @@ -66,7 +66,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide return null; NBTBase bindingTag = stack.getTagCompound().getTag("binding"); - if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.hasNoTags()) // Make sure it's both a tag compound and that it has actual data. + if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.isEmpty()) // Make sure it's both a tag compound and that it has actual data. return null; NBTTagCompound nbt = (NBTTagCompound) bindingTag; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index 12e0a2d4..098a2b62 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -28,7 +28,7 @@ import java.util.function.Consumer; public class ItemPotionFlask extends Item implements IMeshProvider { public ItemPotionFlask() { - setUnlocalizedName(BloodMagic.MODID + ".potionFlask"); + setTranslationKey(BloodMagic.MODID + ".potionFlask"); setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); setMaxDamage(8); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java index 744b7129..f79d8bc1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java @@ -27,7 +27,7 @@ import java.util.List; public class ItemRitualDismantler extends Item implements IVariantProvider { public ItemRitualDismantler() { - setUnlocalizedName(BloodMagic.MODID + ".ritualDismantler"); + setTranslationKey(BloodMagic.MODID + ".ritualDismantler"); setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index 6d026756..05601f00 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -46,15 +46,15 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { public static String[] names = {"normal", "dusk", "dawn"}; public ItemRitualDiviner() { - setUnlocalizedName(BloodMagic.MODID + ".ritualDiviner"); + setTranslationKey(BloodMagic.MODID + ".ritualDiviner"); setCreativeTab(BloodMagic.TAB_BM); setHasSubtypes(true); setMaxStackSize(1); } @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + public String getTranslationKey(ItemStack stack) { + return super.getTranslationKey(stack) + names[stack.getItemDamage()]; } @Override @@ -66,7 +66,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { if (ritual == null) return displayName; - return displayName + ": " + TextHelper.localize(ritual.getUnlocalizedName()); + return displayName + ": " + TextHelper.localize(ritual.getTranslationKey()); } @Override @@ -208,7 +208,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(this.getCurrentRitual(stack)); if (ritual != null) { - tooltip.add(TextHelper.localize("tooltip.bloodmagic.diviner.currentRitual", TextHelper.localize(ritual.getUnlocalizedName()))); + 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); @@ -217,8 +217,8 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { tooltip.add(""); for (EnumDemonWillType type : EnumDemonWillType.values()) { - if (TextHelper.canTranslate(ritual.getUnlocalizedName() + "." + type.getName().toLowerCase() + ".info")) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(ritual.getUnlocalizedName() + "." + type.getName().toLowerCase() + ".info")))); + 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) { @@ -281,8 +281,8 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { tooltip.add(TextHelper.localize(tooltipBase + "totalRune", totalRunes)); } else { tooltip.add(""); - if (TextHelper.canTranslate(ritual.getUnlocalizedName() + ".info")) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(ritual.getUnlocalizedName() + ".info")))); + if (TextHelper.canTranslate(ritual.getTranslationKey() + ".info")) { + tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(ritual.getTranslationKey() + ".info")))); tooltip.add(""); } @@ -453,7 +453,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { public void notifyRitualChange(String key, EntityPlayer player) { Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(key); if (ritual != null) { - player.sendStatusMessage(new TextComponentTranslation(ritual.getUnlocalizedName()), true); + player.sendStatusMessage(new TextComponentTranslation(ritual.getTranslationKey()), true); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index bceeb86e..f96afc24 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -38,7 +38,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { public ItemRitualReader() { super(); - setUnlocalizedName(BloodMagic.MODID + ".ritualReader"); + setTranslationKey(BloodMagic.MODID + ".ritualReader"); setMaxStackSize(1); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index ca2d37f9..9dc458f5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -38,7 +38,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa private AltarTier currentDisplayedTier = AltarTier.ONE; public ItemSanguineBook() { - setUnlocalizedName(BloodMagic.MODID + ".sanguineBook"); + setTranslationKey(BloodMagic.MODID + ".sanguineBook"); setCreativeTab(BloodMagic.TAB_BM); setMaxStackSize(1); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java index dc7d64b3..8563c02b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java @@ -31,7 +31,7 @@ public class ItemUpgradeTome extends Item implements IVariantProvider { super(); setCreativeTab(BloodMagic.TAB_TOMES); - setUnlocalizedName(BloodMagic.MODID + ".upgradeTome"); + setTranslationKey(BloodMagic.MODID + ".upgradeTome"); setHasSubtypes(true); setMaxStackSize(1); } @@ -65,15 +65,15 @@ public class ItemUpgradeTome extends Item implements IVariantProvider { } @Override - public String getUnlocalizedName(ItemStack stack) { + public String getTranslationKey(ItemStack stack) { if (!stack.hasTagCompound()) - return super.getUnlocalizedName(stack); + return super.getTranslationKey(stack); LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); if (upgrade != null && upgrade.isDowngrade()) return "item." + BloodMagic.MODID + ".downgradeTome"; - return super.getUnlocalizedName(stack); + return super.getTranslationKey(stack); } @Override @@ -106,7 +106,7 @@ public class ItemUpgradeTome extends Item implements IVariantProvider { return; LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); if (upgrade != null) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getUnlocalizedName()), upgrade.getUpgradeLevel() + 1)); + 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 index cef99437..f37785d1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -27,7 +27,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian super(); setCreativeTab(BloodMagic.TAB_TOMES); - setUnlocalizedName(BloodMagic.MODID + ".upgradeTrainer"); + setTranslationKey(BloodMagic.MODID + ".upgradeTrainer"); setHasSubtypes(true); setMaxStackSize(1); } @@ -55,7 +55,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian return; LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); if (upgrade != null) { - tooltip.add(TextHelper.localize(upgrade.getUnlocalizedName())); + tooltip.add(TextHelper.localize(upgrade.getTranslationKey())); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 001b3264..2d7ab288 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -62,7 +62,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP public ItemLivingArmour(EntityEquipmentSlot armorType) { super(ItemArmor.ArmorMaterial.IRON, 0, armorType); - setUnlocalizedName(BloodMagic.MODID + ".livingArmour."); + setTranslationKey(BloodMagic.MODID + ".livingArmour."); // setMaxDamage(250); setMaxDamage((int) (getMaxDamage() * 1.5)); setCreativeTab(BloodMagic.TAB_BM); @@ -259,10 +259,10 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (tracker != null) { double progress = tracker.getProgress(armour, upgrade.getUpgradeLevel()); - tooltip.add(TextHelper.localize("tooltip.bloodmagic.livingArmour.upgrade.progress", TextHelper.localize(upgrade.getUnlocalizedName()), MathHelper.clamp((int) (progress * 100D), 0, 100))); + 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.getUnlocalizedName()), upgrade.getUpgradeLevel() + 1)); + tooltip.add(TextHelper.localize("tooltip.bloodmagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getTranslationKey()), upgrade.getUpgradeLevel() + 1)); } } } @@ -344,8 +344,8 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[3 - armorType.getIndex()]; + public String getTranslationKey(ItemStack stack) { + return super.getTranslationKey(stack) + names[3 - armorType.getIndex()]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index 5b043282..35261f98 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -56,7 +56,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public ItemSentientArmour(EntityEquipmentSlot armorType) { super(ItemArmor.ArmorMaterial.IRON, 0, armorType); - setUnlocalizedName(BloodMagic.MODID + ".sentientArmour."); + setTranslationKey(BloodMagic.MODID + ".sentientArmour."); setMaxDamage(250); setCreativeTab(BloodMagic.TAB_BM); } @@ -268,8 +268,8 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[3 - armorType.getIndex()]; + public String getTranslationKey(ItemStack stack) { + return super.getTranslationKey(stack) + names[3 - armorType.getIndex()]; } public void revertArmour(EntityPlayer player, ItemStack itemStack) { diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java index 3a42a40e..25cc5b0b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java @@ -23,7 +23,7 @@ public class ItemBlockAlchemyTable extends ItemBlock implements IVariantProvider float yaw = player.rotationYaw; EnumFacing direction = EnumFacing.fromAngle(yaw); - if (direction.getFrontOffsetY() != 0) { + if (direction.getYOffset() != 0) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java index 75ab9457..0d72a4a5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java @@ -21,8 +21,8 @@ public class ItemBlockDemonCrystal extends ItemBlock { } @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + EnumDemonWillType.values()[stack.getItemDamage()].toString().toLowerCase(Locale.ENGLISH); + public String getTranslationKey(ItemStack stack) { + return super.getTranslationKey(stack) + EnumDemonWillType.values()[stack.getItemDamage()].toString().toLowerCase(Locale.ENGLISH); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java index 25f7375d..c7555739 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java @@ -22,8 +22,8 @@ public class ItemBlockEnum & IStringSerializable> extends Item } @Override - public String getUnlocalizedName(ItemStack stack) { - return getBlock().getUnlocalizedName() + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, getBlock().getTypes().length - 1)].getName(); + public String getTranslationKey(ItemStack stack) { + return getBlock().getTranslationKey() + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, getBlock().getTypes().length - 1)].getName(); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java index 038c4e22..1797aa60 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java @@ -20,8 +20,8 @@ public class ItemBlockInteger extends ItemBlock { } @Override - public String getUnlocalizedName(ItemStack stack) { - return getBlock().getUnlocalizedName() + "." + stack.getItemDamage(); + public String getTranslationKey(ItemStack stack) { + return getBlock().getTranslationKey() + "." + stack.getItemDamage(); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index 31dfe5b2..2033e618 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -31,7 +31,7 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I public ItemPackSacrifice() { super(ArmorMaterial.CHAIN, 0, EntityEquipmentSlot.CHEST); - setUnlocalizedName(BloodMagic.MODID + ".pack.sacrifice"); + setTranslationKey(BloodMagic.MODID + ".pack.sacrifice"); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index a0c08a87..15508082 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -47,7 +47,7 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato public ItemPackSelfSacrifice() { super(ArmorMaterial.CHAIN, 0, EntityEquipmentSlot.CHEST); - setUnlocalizedName(BloodMagic.MODID + ".pack.selfSacrifice"); + setTranslationKey(BloodMagic.MODID + ".pack.selfSacrifice"); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index a72dfd3f..aa6ca4a1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -31,15 +31,15 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, { super(); - setUnlocalizedName(BloodMagic.MODID + ".fluidFilter."); + setTranslationKey(BloodMagic.MODID + ".fluidFilter."); setHasSubtypes(true); setCreativeTab(BloodMagic.TAB_BM); } @Override - public String getUnlocalizedName(ItemStack stack) + public String getTranslationKey(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + return super.getTranslationKey(stack) + names[stack.getItemDamage()]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index 7994c36b..4ea9be03 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -30,7 +30,7 @@ import java.util.List; public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvider { public ItemNodeRouter() { - setUnlocalizedName(BloodMagic.MODID + ".nodeRouter"); + setTranslationKey(BloodMagic.MODID + ".nodeRouter"); setMaxStackSize(1); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index f80cf9aa..e62a77be 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -30,15 +30,15 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari { super(); - setUnlocalizedName(BloodMagic.MODID + ".itemFilter."); + setTranslationKey(BloodMagic.MODID + ".itemFilter."); setHasSubtypes(true); setCreativeTab(BloodMagic.TAB_BM); } @Override - public String getUnlocalizedName(ItemStack stack) + public String getTranslationKey(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + return super.getTranslationKey(stack) + names[stack.getItemDamage()]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index dd4471dc..650ff280 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -24,7 +24,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider { public ItemSigilBase(String name, int lpUsed) { super(lpUsed); - setUnlocalizedName(BloodMagic.MODID + ".sigil." + name); + setTranslationKey(BloodMagic.MODID + ".sigil." + name); this.name = name; this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index 6399e817..b3fb15da 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -248,7 +248,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl NBTTagList tagList = tagCompound.getTagList(Constants.NBT.ITEMS, 10); - if (tagList.hasNoTags()) { + if (tagList.isEmpty()) { return NonNullList.withSize(inventorySize, ItemStack.EMPTY); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java index 2586e266..ce7517a9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -23,7 +23,7 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes public ItemSigilToggleableBase(String name, int lpUsed) { super(lpUsed); - setUnlocalizedName(BloodMagic.MODID + ".sigil." + name); + setTranslationKey(BloodMagic.MODID + ".sigil." + name); setCreativeTab(BloodMagic.TAB_BM); this.name = name; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index 9cb62f6d..c1442db8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -26,7 +26,7 @@ public class ItemSentientArmourGem extends Item implements IMeshProvider { super(); setCreativeTab(BloodMagic.TAB_BM); - setUnlocalizedName(BloodMagic.MODID + ".sentientArmourGem"); + setTranslationKey(BloodMagic.MODID + ".sentientArmourGem"); setMaxStackSize(1); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index 1f7404cc..db43014d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -75,7 +75,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); - setUnlocalizedName(BloodMagic.MODID + ".sentientAxe"); + setTranslationKey(BloodMagic.MODID + ".sentientAxe"); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index e6df6969..71092325 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -55,7 +55,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public ItemSentientBow() { super(); - setUnlocalizedName(BloodMagic.MODID + ".sentientBow"); + setTranslationKey(BloodMagic.MODID + ".sentientBow"); setCreativeTab(BloodMagic.TAB_BM); this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index e8d45479..47f3491e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -75,7 +75,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); - setUnlocalizedName(BloodMagic.MODID + ".sentientPickaxe"); + setTranslationKey(BloodMagic.MODID + ".sentientPickaxe"); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index c8b219b4..644b0b9e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -75,7 +75,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I setMaxDamage(getMaxDamage() * 2); // super(ModItems.soulToolMaterial); - setUnlocalizedName(BloodMagic.MODID + ".sentientShovel"); + setTranslationKey(BloodMagic.MODID + ".sentientShovel"); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index d97cab1c..3f932d34 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -68,7 +68,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public ItemSentientSword() { super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); - setUnlocalizedName(BloodMagic.MODID + ".sentientSword"); + setTranslationKey(BloodMagic.MODID + ".sentientSword"); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index aa678159..62948034 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -37,15 +37,15 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I public ItemSoulGem() { super(); - setUnlocalizedName(BloodMagic.MODID + ".soulGem."); + setTranslationKey(BloodMagic.MODID + ".soulGem."); setHasSubtypes(true); setMaxStackSize(1); setCreativeTab(BloodMagic.TAB_BM); } @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + public String getTranslationKey(ItemStack stack) { + return super.getTranslationKey(stack) + names[stack.getItemDamage()]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index 50971b17..c9483d33 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -26,7 +26,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider { public ItemSoulSnare() { super(); - setUnlocalizedName(BloodMagic.MODID + ".soulSnare."); + setTranslationKey(BloodMagic.MODID + ".soulSnare."); setCreativeTab(BloodMagic.TAB_BM); setHasSubtypes(true); setMaxStackSize(16); @@ -51,8 +51,8 @@ public class ItemSoulSnare extends Item implements IVariantProvider { } @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + public String getTranslationKey(ItemStack stack) { + return super.getTranslationKey(stack) + names[stack.getItemDamage()]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java index a4878215..12073a87 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java @@ -42,7 +42,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr public ItemFlightScroll() { super(); - setUnlocalizedName(BloodMagic.MODID + ".icarusScroll"); + setTranslationKey(BloodMagic.MODID + ".icarusScroll"); setCreativeTab(BloodMagic.TAB_BM); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index 19f9a7a1..ab2fe989 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -239,7 +239,7 @@ public class LivingArmour implements ILivingArmour { StatTracker tracker = (StatTracker) obj; String key = tracker.getUniqueIdentifier(); NBTTagCompound trackerTag = tag.getCompoundTag(key); - if (!trackerTag.hasNoTags()) { + if (!trackerTag.isEmpty()) { tracker.readFromNBT(trackerTag); } trackerMap.put(key, tracker); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java index c160c6cd..41cfb72e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java @@ -55,7 +55,7 @@ public abstract class LivingArmourUpgrade { public abstract String getUniqueIdentifier(); - public abstract String getUnlocalizedName(); + public abstract String getTranslationKey(); public abstract int getMaxTier(); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java index fe02490a..e7aec23e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java @@ -60,7 +60,7 @@ public class LivingArmourUpgradeBattleHungry extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "battleHunger"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java index 88b31e64..0467e0a7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java @@ -43,7 +43,7 @@ public class LivingArmourUpgradeCrippledArm extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "crippledArm"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java index 6c1dece3..69d041ee 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java @@ -54,7 +54,7 @@ public class LivingArmourUpgradeDigSlowdown extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "digSlowdown"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java index 2d791898..25daaaf4 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java @@ -52,7 +52,7 @@ public class LivingArmourUpgradeDisoriented extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "disoriented"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java index a67a5cfb..0e59b0ba 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -63,7 +63,7 @@ public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "meleeDecrease"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java index 9272cd48..1294fe29 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java @@ -43,7 +43,7 @@ public class LivingArmourUpgradeQuenched extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "quenched"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java index afca233c..413eac26 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java @@ -80,7 +80,7 @@ public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "slippery"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java index 0b964731..f7d0c6ba 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java @@ -51,7 +51,7 @@ public class LivingArmourUpgradeSlowHeal extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "slowHeal"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java index db12a7ac..a36c48b3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -61,7 +61,7 @@ public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "slowness"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java index d90aa3e5..5f9ed0fa 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java @@ -48,7 +48,7 @@ public class LivingArmourUpgradeStormTrooper extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "stormTrooper"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java index f50e5d59..94ccca9a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java @@ -49,7 +49,7 @@ public class LivingArmourUpgradeArrowProtect extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 64e99f67..a83e62ad 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java @@ -46,7 +46,7 @@ public class LivingArmourUpgradeArrowShot extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "arrowShot"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java index 64b1ff05..5f82954e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java @@ -57,7 +57,7 @@ public class LivingArmourUpgradeCriticalStrike extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index a88e42c9..8e977049 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java @@ -65,7 +65,7 @@ public class LivingArmourUpgradeDigging extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "digging"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java index d1699406..9e1c4a3a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java @@ -45,7 +45,7 @@ public class LivingArmourUpgradeElytra extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index ba5abaaa..e36e05bf 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java @@ -42,7 +42,7 @@ public class LivingArmourUpgradeExperience extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index c394a4af..56971eb9 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -49,7 +49,7 @@ public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index a4725a05..1e0a465c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java @@ -63,7 +63,7 @@ public class LivingArmourUpgradeFireResist extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 69a58009..1c1ec121 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java @@ -55,7 +55,7 @@ public class LivingArmourUpgradeGraveDigger extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 1e8fdfd3..92fba1a7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java @@ -59,7 +59,7 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "grimReaper"; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java index 08ecc06c..4b3a82bf 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -63,7 +63,7 @@ public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 4bb03e62..723ef2ab 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java @@ -57,7 +57,7 @@ public class LivingArmourUpgradeJump extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 8909473e..39a34a08 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -61,7 +61,7 @@ public class LivingArmourUpgradeKnockbackResist extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 22e206f8..7a4fc138 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -63,7 +63,7 @@ public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index b9171625..3493b8e1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java @@ -71,7 +71,7 @@ public class LivingArmourUpgradeNightSight extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 9b755a27..52a60199 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java @@ -49,7 +49,7 @@ public class LivingArmourUpgradePhysicalProtect extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 49bd19c0..08c75b19 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java @@ -64,7 +64,7 @@ public class LivingArmourUpgradePoisonResist extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 80f7093d..d9d00733 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java @@ -67,7 +67,7 @@ public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 0c3a6db7..4b68bb79 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java @@ -43,7 +43,7 @@ public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index fea3748c..114508d2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -73,7 +73,7 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index d0392eec..8b9288a6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -98,7 +98,7 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade } @Override - public String getUnlocalizedName() + 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 index 49504483..e4963af3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java @@ -68,7 +68,7 @@ public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + 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 index 83d414d4..9392f6ec 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java @@ -45,7 +45,7 @@ public class LivingArmourUpgradeStepAssist extends LivingArmourUpgrade { } @Override - public String getUnlocalizedName() { + public String getTranslationKey() { return tooltipBase + "stepAssist"; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java index 95504bce..d357c6c5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java @@ -51,7 +51,7 @@ public abstract class Ritual { public void readFromNBT(NBTTagCompound tag) { NBTTagList tags = tag.getTagList("areas", 10); - if (tags.hasNoTags()) { + if (tags.isEmpty()) { return; } @@ -237,12 +237,12 @@ public abstract class Ritual { } public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info")}; + return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info")}; } public ITextComponent provideInformationOfRangeToPlayer(EntityPlayer player, String range) { if (getListOfRanges().contains(range)) { - return new TextComponentTranslation(this.getUnlocalizedName() + "." + range + ".info"); + return new TextComponentTranslation(this.getTranslationKey() + "." + range + ".info"); } else { return new TextComponentTranslation("ritual.bloodmagic.blockRange.noRange"); } @@ -301,7 +301,7 @@ public abstract class Ritual { return renderer; } - public String getUnlocalizedName() { + public String getTranslationKey() { return unlocalizedName; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java index 6aa24daa..3a314984 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java @@ -60,7 +60,7 @@ public abstract class ImperfectRitual { return lightShow; } - public String getUnlocalizedName() { + public String getTranslationKey() { return unlocalizedName; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java index f92b2db3..15bb17ac 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java @@ -192,12 +192,12 @@ public class RitualAnimalGrowth extends Ritual { @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { return new ITextComponent[]{ - new TextComponentTranslation(this.getUnlocalizedName() + ".info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") + new TextComponentTranslation(this.getTranslationKey() + ".info"), + new TextComponentTranslation(this.getTranslationKey() + ".default.info"), + new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), + new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), + new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), + new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info") }; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 2d56e16f..271ddac4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -261,12 +261,12 @@ public class RitualCrushing extends Ritual { @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { return new ITextComponent[]{ - new TextComponentTranslation(this.getUnlocalizedName() + ".info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), - new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info") + new TextComponentTranslation(this.getTranslationKey() + ".info"), + new TextComponentTranslation(this.getTranslationKey() + ".default.info"), + new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), + new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), + new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), + new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info") }; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java index a52f5181..d5f666be 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java @@ -185,6 +185,6 @@ public class RitualCrystalSplit extends Ritual @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info") }; + return new ITextComponent[] { new TextComponentTranslation(this.getTranslationKey() + ".info") }; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java index 7706e112..352725a3 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java @@ -203,7 +203,7 @@ public class RitualFeatheredKnife extends Ritual { @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info")}; + return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info"), new TextComponentTranslation(this.getTranslationKey() + ".default.info"), new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info")}; } public double getLPModifierForWill(double destructiveWill) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java index 19bd678b..4bfddd31 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java @@ -267,7 +267,7 @@ public class RitualGreenGrove extends Ritual { @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info")}; + return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info"), new TextComponentTranslation(this.getTranslationKey() + ".default.info"), new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info")}; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index b247bcab..d9c67d1a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -230,7 +230,7 @@ public class RitualLava extends Ritual { @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info")}; + return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info"), new TextComponentTranslation(this.getTranslationKey() + ".default.info"), new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info")}; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java index 5a1eb618..244c038e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java @@ -171,7 +171,7 @@ public class RitualSpeed extends Ritual { @Override public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".default.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".vengeful.info")}; + return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info"), new TextComponentTranslation(this.getTranslationKey() + ".default.info"), new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info")}; } public double getVerticalSpeedForWill(double rawWill) { diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java index a8b3038f..2b712a20 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java @@ -54,8 +54,8 @@ public class DungeonRoomLoader { public static void test() { ResourceLocation id = new ResourceLocation(BloodMagic.MODID, "testGson"); - String s = id.getResourceDomain(); - String s1 = id.getResourcePath(); + String s = id.getNamespace(); + String s1 = id.getPath(); InputStream inputstream = null; try { @@ -70,6 +70,6 @@ public class DungeonRoomLoader { } public static String resLocToResourcePath(ResourceLocation resourceLocation) { - return "/assets/" + resourceLocation.getResourceDomain() + "/schematics/" + resourceLocation.getResourcePath() + ".json"; + return "/assets/" + resourceLocation.getNamespace() + "/schematics/" + resourceLocation.getPath() + ".json"; } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index b023c5c0..57d7d8e1 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -81,7 +81,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, super.deserialize(tag); isSlave = tag.getBoolean("isSlave"); - direction = EnumFacing.getFront(tag.getInteger(Constants.NBT.DIRECTION)); + direction = EnumFacing.byIndex(tag.getInteger(Constants.NBT.DIRECTION)); connectedPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD)); burnTime = tag.getInteger("burnTime"); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index 052e8e2a..827e31b0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -173,7 +173,7 @@ public class TileDemonCrystal extends TileTicking { holder.readFromNBT(tag, "Will"); crystalCount = tag.getInteger("crystalCount"); - placement = EnumFacing.getFront(tag.getInteger("placement")); + placement = EnumFacing.byIndex(tag.getInteger("placement")); progressToNextCrystal = tag.getDouble("progress"); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 1f803f26..46e6332d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -80,7 +80,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS currentRitual = BloodMagic.RITUAL_MANAGER.getRitual(tag.getString(Constants.NBT.CURRENT_RITUAL)); if (currentRitual != null) { NBTTagCompound ritualTag = tag.getCompoundTag(Constants.NBT.CURRENT_RITUAL_TAG); - if (!ritualTag.hasNoTags()) { + if (!ritualTag.isEmpty()) { currentRitual.readFromNBT(ritualTag); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java index 66c6b4df..0062ce60 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -30,7 +30,7 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte @Override public void update() { if (!getWorld().isRemote) { - currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); + currentInput = getWorld().getRedstonePowerFromNeighbors(pos); // currentInput = getWorld().getStrongPower(pos); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java index 6c454ba8..54a2e614 100644 --- a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java @@ -46,7 +46,7 @@ public class GhostItemHelper { NBTTagCompound tag = newStack.getTagCompound(); int amount = getItemGhostAmount(ghostStack); tag.removeTag(Constants.NBT.GHOST_STACK_SIZE); - if (tag.hasNoTags()) { + if (tag.isEmpty()) { newStack.setTagCompound(null); } newStack.setCount(amount); diff --git a/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java index d1d648d0..70b19397 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java @@ -56,7 +56,7 @@ public class ItemStackWrapper { @Override public String toString() { - return stackSize + "x" + item.getUnlocalizedName() + "@" + this.meta; + return stackSize + "x" + item.getTranslationKey() + "@" + this.meta; } public ItemStack toStack(int count) { diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 3e6fecc0..90f1d312 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -41,6 +41,7 @@ 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.fml.relauncher.ReflectionHelper; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -59,7 +60,7 @@ public class Utils { static { try { - Field colorValue = ReflectionHelper.findField(EnumDyeColor.class, "field_193351_w", "colorValue"); + Field colorValue = ObfuscationReflectionHelper.findField(EnumDyeColor.class, "field_193351_w"); colorValue.setAccessible(true); for (EnumDyeColor color : EnumDyeColor.values()) { DYE_COLOR_VALUES.put(color, (int) colorValue.get(color)); @@ -130,7 +131,7 @@ public class Utils { 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); EnumFacing dir = EnumFacing.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.getFrontOffsetX() * 0.4, pos.getY() + 0.5 + dir.getFrontOffsetY() * 0.4, pos.getZ() + 0.5 + dir.getFrontOffsetZ() * 0.4), false, true, true); + 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()); } @@ -967,7 +968,7 @@ public class Utils { if (player instanceof EntityPlayerMP) reachDistance = ((EntityPlayerMP) player).interactionManager.getBlockReachDistance(); - Vec3d reachPosition = eyePosition.addVector((double) f6 * reachDistance, (double) f5 * reachDistance, (double) f7 * reachDistance); + Vec3d reachPosition = eyePosition.add((double) f6 * reachDistance, (double) f5 * reachDistance, (double) f7 * reachDistance); return player.getEntityWorld().rayTraceBlocks(eyePosition, reachPosition, useLiquids, !useLiquids, false); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 8f29bfab..b929e0e9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -185,13 +185,13 @@ public class ClientHandler { // Collect all Blood Magic model errors List errored = new ArrayList<>(); for (ResourceLocation modelError : modelErrors.keySet()) - if (modelError.getResourceDomain().equalsIgnoreCase(BloodMagic.MODID)) + 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.getResourceDomain().equalsIgnoreCase(BloodMagic.MODID)) + if (missingVariant.getNamespace().equalsIgnoreCase(BloodMagic.MODID)) missing.add(missingVariant); // Remove discovered model errors @@ -226,7 +226,7 @@ public class ClientHandler { if (missingTextures.containsKey(mc)) { Set missingMCTextures = missingTextures.get(mc); for (ResourceLocation texture : missingMCTextures) - if (texture.getResourcePath().equalsIgnoreCase(String.format(format, "node")) || texture.getResourcePath().equalsIgnoreCase(String.format(format, "crystal"))) + if (texture.getPath().equalsIgnoreCase(String.format(format, "node")) || texture.getPath().equalsIgnoreCase(String.format(format, "crystal"))) toRemove.add(texture); } From 465a2beadeb165b37a045e11fbcbeea9a9123bf6 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 31 Jan 2019 19:42:42 -0800 Subject: [PATCH 390/595] Update changelog + version --- changelog.txt | 46 ++++++++++++++++++++++++++++++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 5109324a..0595047d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,49 @@ +------------------------------------------------------ +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 ------------------------------------------------------ diff --git a/gradle.properties b/gradle.properties index 85df68d7..0e38a009 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.3.3 +mod_version=2.4.0 mc_version=1.12.2 forge_version=14.23.5.2808 curse_id=224791 From 0e4f6c0fb9f80fcb6e0377fd54a671cac6d9266e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 31 Jan 2019 19:45:47 -0800 Subject: [PATCH 391/595] Let's start pushing to curse under my name so people stop blaming Way --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0ad1ff65..947187be 100644 --- a/build.gradle +++ b/build.gradle @@ -165,7 +165,7 @@ def curseRelations = { } curseforge { - if (project.hasProperty('curse_key_WayofTime')) + if (project.hasProperty('curse_key_TehNut')) apiKey = project.curse_key_WayofTime project { From 5903cc7e0ad410e67ddf270f63c2e6fb6ac32693 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 31 Jan 2019 19:53:46 -0800 Subject: [PATCH 392/595] big kek --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 947187be..35276bea 100644 --- a/build.gradle +++ b/build.gradle @@ -166,7 +166,7 @@ def curseRelations = { curseforge { if (project.hasProperty('curse_key_TehNut')) - apiKey = project.curse_key_WayofTime + apiKey = project.curse_key_TehNut project { id = "${curse_id}" From 2c49be1bddd1748a093dc78b9cedcc4d1839cd1c Mon Sep 17 00:00:00 2001 From: Phil Date: Fri, 8 Feb 2019 13:04:41 -0500 Subject: [PATCH 393/595] Trickshot Arrows to reset hurtresistancetime. (#1487) (#1535) * Added a tag to arrows created through Living Armor's Trickshot Ability. Added a subscribeevent method for the onProjectileImpact event that removes the tag and sets the hurtresistanttime to zero. * Formatted trickshot arrow tags to snake_case --- .../handler/event/LivingArmourHandler.java | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index d5750f89..daa87642 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -29,6 +29,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; 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.LivingHealEvent; @@ -161,10 +162,12 @@ public class LivingArmourHandler if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) { ItemStack drinkStack = event.getItemStack(); - if(!(drinkStack.getItem() instanceof ItemSplashPotion)) { + if (!(drinkStack.getItem() instanceof ItemSplashPotion)) + { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); - if (upgrade instanceof LivingArmourUpgradeQuenched) { + if (upgrade instanceof LivingArmourUpgradeQuenched) + { event.setCanceled(true); } } @@ -341,7 +344,7 @@ public class LivingArmourHandler ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); EntityArrow 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; @@ -372,4 +375,19 @@ public class LivingArmourHandler } } } + + // 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; + } + } + } } From 28b5caa5aaccbfd90df78f1bf753fd82d0e3f91e Mon Sep 17 00:00:00 2001 From: Phil Date: Fri, 8 Feb 2019 22:34:41 -0500 Subject: [PATCH 394/595] (#1415) Soft Fall / fallProtect Implementation (#1536) * Fixed softFall / fallProtect upgrade for living armour. Previously it relied on regular armor properties, which fall damage bypasses by being marked is unblockable. Created a method subscribed to onPlayerFall which applies the damage multiplier and the fallProtect stat-tracker. Removed the armorProperties method of LivingAmourUpgradeFallProtect.java and replaced it with getDamageMultiplier. * Fixed formatting issues. [1+1 vs 1 + 1, 1.0F instead of 1.0f] --- .../LivingArmourUpgradeFallProtect.java | 12 +++----- .../handler/event/LivingArmourHandler.java | 28 ++++++++++++++++++- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java index 56971eb9..66b48fdc 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -8,19 +8,15 @@ import net.minecraft.util.DamageSource; public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade { public static final int[] costs = new int[]{2, 5, 9, 15, 25}; - public static final double[] protectionLevel = new double[]{0.2, 0.4, 0.6, 0.8, 1}; + public static final float[] protectionLevel = new float[]{0.2F, 0.4F, 0.6F, 0.8F, 1F}; public LivingArmourUpgradeFallProtect(int level) { super(level); } - @Override - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { - if (source.equals(DamageSource.FALL)) { - return protectionLevel[this.level]; - } - - return 0; + + public float getDamageMultiplier() { + return 1 - protectionLevel[this.level]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index daa87642..81b60284 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -11,6 +11,7 @@ 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.*; @@ -32,6 +33,7 @@ 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; @@ -374,8 +376,32 @@ public class LivingArmourHandler } } } - } + } + // Applies: Softfall + @SubscribeEvent + public static void onPlayerFall(LivingFallEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + if (LivingArmour.hasFullSet(player)) + { + + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.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) From cb69f84ed63d7d248253eede2ab19f79d3978619 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 8 Feb 2019 20:21:59 -0800 Subject: [PATCH 395/595] Fix oredict filter passing invalid stacks to oredict (#1481) --- .../java/WayofTime/bloodmagic/routing/OreDictItemFilter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java index 812c4cc3..aa209492 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java @@ -17,6 +17,9 @@ public class OreDictItemFilter extends TestItemFilter { @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); From 8e2a93fa34f54e2e3d6feae60d1b408b2d930454 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 8 Feb 2019 20:33:43 -0800 Subject: [PATCH 396/595] Improve nocturnal prowess behavior (#1461) No more flickering. If you're in the dark, it will apply a max duration effect. If you're in the light and (as far as it can tell) the effect was applied by the armor, the effect will be removed. --- .../upgrade/LivingArmourUpgradeNightSight.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java index 3493b8e1..e18b3c1b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java @@ -31,17 +31,13 @@ public class LivingArmourUpgradeNightSight extends LivingArmourUpgrade { public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { if (world.getLight(player.getPosition(), false) <= 9) { isActive = true; - if (player.isPotionActive(MobEffects.NIGHT_VISION)) { - int dur = player.getActivePotionEffect(MobEffects.NIGHT_VISION).getDuration(); - if (dur > 100 && dur < 20 * 60 * 20) { - //Don't override the potion effect if the other potion effect is sufficiently long. - return; - } - } + if (player.isPotionActive(MobEffects.NIGHT_VISION)) + return; - player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, Constants.Misc.NIGHT_VISION_CONSTANT_BEGIN, 0, false, false)); - } else { + player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false)); + } else if (isActive) { isActive = false; + player.removePotionEffect(MobEffects.NIGHT_VISION); } } From 77ca407630c4b8e90a362a66d3065d3bf704d39a Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Mon, 11 Feb 2019 02:29:57 +0100 Subject: [PATCH 397/595] no idea why I didn't put it before the switch statement to begin with; (#1538) that would just have been too logical #1537 --- .../projectile/EntitySentientArrow.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index aa90eaa3..fe91c8ac 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -168,6 +168,18 @@ public class EntitySentientArrow extends EntityTippedArrow { @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) { @@ -177,8 +189,8 @@ public class EntitySentientArrow extends EntityTippedArrow { 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(); } + this.setDead(); } break; case CORROSIVE: @@ -204,19 +216,7 @@ public class EntitySentientArrow extends EntityTippedArrow { break; } - 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.setDead(); - this.specialEntity.setDead(); - } - } - } } //TODO: Potion splash (for destructive will fired tipped arrows) currently does not have a visual effect. From 4a59dede53c098dd98a7fe0e1ba5f7ab5c06e6b8 Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 13 Feb 2019 18:59:56 -0500 Subject: [PATCH 398/595] Fixed an error where firing a tipped arrow with a sentient bow without (#1542) demon will would still result in the effect of the tipped arrow being multiplied. --- .../WayofTime/bloodmagic/item/soul/ItemSentientBow.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 71092325..031f5a57 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -334,9 +334,12 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien ItemArrow itemarrow = ((ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW)); EntityArrow entityArrow; double amount = (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)); - + float newArrowVelocity = arrowVelocity * getVelocityOfArrow(stack); - if (itemarrow == Items.ARROW) { + + 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), (PotionType) null); } else if (itemarrow == Items.TIPPED_ARROW) { From 2d49fab8931c7a6bbb921e605c955a3150c3ef5f Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 13 Feb 2019 19:27:41 -0500 Subject: [PATCH 399/595] Trickshot - Sentient Arrows Implementation (#1540) * The onArrowFire event handler for LivingArmour now checks whether the arrows were fired from a sentient bow, and if they are it calls a getDuplicateArrows method in ItemSentientBow. Said method gets the will and potion types, without changing the bow's durability or consuming will or arrows. * Extra line breaks removed --- .../bloodmagic/item/soul/ItemSentientBow.java | 27 +++++++++++++++++++ .../handler/event/LivingArmourHandler.java | 14 ++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 031f5a57..1b804351 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -305,6 +305,33 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien return entityArrow; } + public EntitySentientArrow getDuplicateArrow(ItemStack bowStack, World world, EntityPlayer player, double reimburseMultiplier) { + + EnumDemonWillType willType = this.getCurrentType(bowStack); + ItemStack arrow = this.getFiredArrow(player); + + ItemArrow itemarrow = ((ItemArrow) (arrow.getItem() instanceof ItemArrow ? 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), (PotionType) 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 PotionType(new PotionEffect(MobEffects.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(StatList.getObjectUseStats(this)); + return entityArrow; + } + @Override public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) { if (entityLiving instanceof EntityPlayer) { diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 81b60284..1bff2668 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -5,6 +5,7 @@ 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; @@ -314,6 +315,7 @@ public class LivingArmourHandler World world = event.getEntityPlayer().getEntityWorld(); ItemStack stack = event.getBow(); EntityPlayer player = event.getEntityPlayer(); + boolean sentientShot = false; if (world.isRemote) return; @@ -338,13 +340,21 @@ public class LivingArmourHandler 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); ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); - EntityArrow entityarrow = itemarrow.createArrow(world, arrowStack, player); + EntityArrow 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; From 069051bf3bb416765723c8e453d40c5836359826 Mon Sep 17 00:00:00 2001 From: Phil Date: Sun, 17 Feb 2019 16:45:57 -0500 Subject: [PATCH 400/595] Modified Living Armour's Step Assist to only apply when the player is not sneaking. (#1545) --- .../util/handler/event/LivingArmourHandler.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 1bff2668..6a701a0f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -265,8 +265,14 @@ public class LivingArmourHandler if (upgrade instanceof LivingArmourUpgradeStepAssist) { - player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); - hasAssist = true; + if (!player.isSneaking()) + { + player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); + hasAssist = true; + } else + { + player.stepHeight = 0.6F; + } } } } From 22ac5b0da5c24f61b028ebe37886193ce5319245 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Wed, 20 Feb 2019 22:28:04 +0000 Subject: [PATCH 401/595] Tested everything again, noticed 2 oversights that didn't have any impact. (#1548) Usable in both SSP (creative mode) and SMP (op). Required permission level for commands is 2 (server's "op" permission level can be seen and changed in the server.properties). --- .../WayofTime/bloodmagic/command/sub/SubCommandNetwork.java | 2 +- .../WayofTime/bloodmagic/command/sub/SubCommandRitual.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index a96cef8a..1cf0b421 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -41,7 +41,7 @@ public class SubCommandNetwork extends CommandTreeBase { @Override public int getRequiredPermissionLevel() { - return 0; + return 2; } abstract class NetworkCommand extends CommandTreeBase { diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java index bf1a7dca..db0ec96d 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java @@ -141,4 +141,9 @@ public class SubCommandRitual extends CommandTreeBase { } } + + @Override + public int getRequiredPermissionLevel() { + return 2; + } } From c8b004c9b6d5798adf404f7f97b41c63b2d0bc99 Mon Sep 17 00:00:00 2001 From: Phil Date: Thu, 28 Feb 2019 15:13:48 -0500 Subject: [PATCH 402/595] Added Whirlwind to the potion registry - fixing a bug where the fast miner sigil would also cause the whirlwind effect. Increased the effect of the fast miner sigil to haste 2, to correspond with what the Sanguine Scientium states. (#1552) --- .../java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java | 1 + .../WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 948835d3..83a0a0e1 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -89,6 +89,7 @@ public class RegistrarBloodMagic { 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"), diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java index 6297abde..090dc98b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -21,7 +21,7 @@ public class ItemSigilFastMiner extends ItemSigilToggleableBase { public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(MobEffects.HASTE, 2, 0, true, false)); + player.addPotionEffect(new PotionEffect(MobEffects.HASTE, 2, 1, true, false)); } @Override From bc168a3937c2e0f372576bdf6fa1b5e6d7a20728 Mon Sep 17 00:00:00 2001 From: Richard Freimer Date: Sun, 3 Mar 2019 02:16:25 -0500 Subject: [PATCH 403/595] Use TextFormatting rather than including color codes in block lang name (#1546) --- .../compat/waila/provider/DataProviderAlchemyArray.java | 3 ++- src/main/resources/assets/bloodmagic/lang/de_DE.lang | 2 +- src/main/resources/assets/bloodmagic/lang/en_US.lang | 2 +- src/main/resources/assets/bloodmagic/lang/fr_FR.lang | 2 +- src/main/resources/assets/bloodmagic/lang/ja_JP.lang | 2 +- src/main/resources/assets/bloodmagic/lang/ru_RU.lang | 2 +- src/main/resources/assets/bloodmagic/lang/zh_CN.lang | 2 +- src/main/resources/assets/bloodmagic/lang/zh_TW.lang | 2 +- 8 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index bc8ade1c..abfe0957 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -13,6 +13,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; 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; @@ -25,7 +26,7 @@ public class DataProviderAlchemyArray implements IWailaDataProvider { @Nonnull @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES).setStackDisplayName(TextHelper.getFormattedText(RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getLocalizedName())); + return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES).setStackDisplayName(TextFormatting.WHITE + RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getLocalizedName()); } @Nonnull diff --git a/src/main/resources/assets/bloodmagic/lang/de_DE.lang b/src/main/resources/assets/bloodmagic/lang/de_DE.lang index 0cb12242..db60bfb1 100644 --- a/src/main/resources/assets/bloodmagic/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagic/lang/de_DE.lang @@ -201,7 +201,7 @@ 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=&r&fAlchemische Anordnung +tile.bloodmagic.alchemyArray.name=Alchemische Anordnung tile.bloodmagic.rune.blank.name=Leere Rune tile.bloodmagic.rune.speed.name=Geschwindigkeitsrune diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 82c23c2e..f5cc5ff4 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -201,7 +201,7 @@ 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=&r&fAlchemy Array +tile.bloodmagic.alchemyArray.name=Alchemy Array tile.bloodmagic.rune.blank.name=Blank Rune tile.bloodmagic.rune.speed.name=Speed Rune diff --git a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang index f75e010a..3493e25d 100644 --- a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang +++ b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang @@ -181,7 +181,7 @@ 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=&r&fÉtalage d'Alchimie +tile.bloodmagic.alchemyArray.name=Étalage d'Alchimie tile.bloodmagic.rune.blank.name=Rune de Sang tile.bloodmagic.rune.speed.name=Rune de Vitesse diff --git a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang index 58d7b932..5cffaa40 100644 --- a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang +++ b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang @@ -201,7 +201,7 @@ tile.bloodmagic.stone.ritual.imperfect.name=簡易儀å¼çŸ³ tile.bloodmagic.stone.ritual.inverted.name=å転マスター儀å¼çŸ³ tile.bloodmagic.altar.name=è¡€ã®ç¥­å£‡ -tile.bloodmagic.alchemyArray.name=&r&f錬金術魔法陣 +tile.bloodmagic.alchemyArray.name=錬金術魔法陣 tile.bloodmagic.rune.blank.name=空ã®ãƒ«ãƒ¼ãƒ³ tile.bloodmagic.rune.speed.name=速度ã®ãƒ«ãƒ¼ãƒ³ diff --git a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang index 0a76a026..a91e66e9 100644 --- a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang +++ b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang @@ -200,7 +200,7 @@ tile.bloodmagic.stone.ritual.imperfect.name=Ðеполноценный риту tile.bloodmagic.stone.ritual.inverted.name=Инвертированный ритуальный камень tile.bloodmagic.altar.name=Кровавый алтарь -tile.bloodmagic.alchemyArray.name=&r&fÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° +tile.bloodmagic.alchemyArray.name=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° tile.bloodmagic.rune.blank.name=ЧиÑÑ‚Ð°Ñ Ñ€ÑƒÐ½Ð° tile.bloodmagic.rune.speed.name=Руна ÑкороÑти diff --git a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang index 6ccec15a..d27f9496 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang @@ -198,7 +198,7 @@ tile.bloodmagic.stone.ritual.imperfect.name=ä¸å®Œå–„的仪å¼çŸ³ tile.bloodmagic.stone.ritual.inverted.name=å转的主仪å¼çŸ³ tile.bloodmagic.altar.name=è¡€ä¹‹ç¥­å› -tile.bloodmagic.alchemyArray.name=&r&f炼金矩阵 +tile.bloodmagic.alchemyArray.name=炼金矩阵 tile.bloodmagic.rune.blank.name=空白符文 tile.bloodmagic.rune.speed.name=速度符文 diff --git a/src/main/resources/assets/bloodmagic/lang/zh_TW.lang b/src/main/resources/assets/bloodmagic/lang/zh_TW.lang index 3632a10a..bdabcb85 100644 --- a/src/main/resources/assets/bloodmagic/lang/zh_TW.lang +++ b/src/main/resources/assets/bloodmagic/lang/zh_TW.lang @@ -152,7 +152,7 @@ tile.bloodmagic.stone.ritual.master.name=魔導師儀å¼çŸ³ tile.bloodmagic.stone.ritual.imperfect.name=次級儀å¼çŸ³ tile.bloodmagic.altar.name=血祭壇 -tile.bloodmagic.alchemyArray.name=&r&f煉金矩陣 +tile.bloodmagic.alchemyArray.name=煉金矩陣 tile.bloodmagic.rune.blank.name=空白符文石 tile.bloodmagic.rune.speed.name=速度符文石 From dea733a76eb3a91b27ed4ecf9722643400902a5a Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Sun, 10 Mar 2019 21:52:42 +0000 Subject: [PATCH 404/595] Fixed Sigil tooltip formatting (#1559) --- .../java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java index 650ff280..26b44789 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java @@ -6,7 +6,6 @@ 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.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -38,7 +37,7 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider { @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(new TextComponentTranslation(tooltipBase + "desc").getFormattedText(), 30, "/cut", false).split("/cut"))); + tooltip.addAll(Arrays.asList(WordUtils.wrap(TextHelper.localizeEffect(tooltipBase + "desc"), 30, "/cut", false).split("/cut"))); super.addInformation(stack, world, tooltip, flag); } From 6b176bebf3cd2869b05d836a99fdc9bd9ac6a785 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Sun, 31 Mar 2019 21:53:35 +0000 Subject: [PATCH 405/595] Block range fixes (#1571) * Veil of Evil class creation Signed-off-by: tobias * Some getBlockRange() oversights. * Delete RitualVeilOfEvil.java should not be in this branch. * Removed TODO. --- .../java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java | 2 +- .../bloodmagic/ritual/types/RitualWellOfSuffering.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java index 5a8795c0..2aa7a7d1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java @@ -64,7 +64,7 @@ public class RitualGrounding extends Ritual { double vengefulDrained = 0; /* Actual ritual stuff begins here */ - AreaDescriptor groundingRange = getBlockRange(GROUNDING_RANGE); + AreaDescriptor groundingRange = masterRitualStone.getBlockRange(GROUNDING_RANGE); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, groundingRange.getAABB(pos)); for (EntityLivingBase entity : entities) { if (totalEffects >= maxEffects) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index 302af3cd..921963ff 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -71,7 +71,7 @@ public class RitualWellOfSuffering extends Ritual { if (tile instanceof TileAltar) { TileAltar tileAltar = (TileAltar) tile; - AreaDescriptor damageRange = getBlockRange(DAMAGE_RANGE); + AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); AxisAlignedBB range = damageRange.getAABB(pos); List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, range); From 7c1565a68cddd5cc31660dd51e4d86545bfe9c8d Mon Sep 17 00:00:00 2001 From: Phil Date: Fri, 5 Apr 2019 17:26:18 -0400 Subject: [PATCH 406/595] Quick fix for ritual of grounding, which was applying gravity to every entity. (#1576) Added a check to determine if an entity already has no gravity, in which case it would not track them. --- .../java/WayofTime/bloodmagic/potion/PotionEventHandlers.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 46b12fc1..18d12e9c 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -92,10 +92,10 @@ public class PotionEventHandlers { // } // } List noGravityList = noGravityListMap.get(event.getEntityLiving().getEntityWorld()); - if ((!(eventEntityLiving instanceof EntityPlayer) || !((EntityPlayer) eventEntityLiving).isSpectator()) && eventEntityLiving.isPotionActive(RegistrarBloodMagic.SUSPENDED)) { + if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.SUSPENDED) && !eventEntityLiving.hasNoGravity()) { eventEntityLiving.setNoGravity(true); noGravityList.add(eventEntityLiving); - } else { + } else if (noGravityList.contains(eventEntityLiving)) { eventEntityLiving.setNoGravity(false); noGravityList.remove(eventEntityLiving); } From 53b6030ba948e71f408223f2fcf9cefec4b86606 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 14 Apr 2019 08:22:42 -0700 Subject: [PATCH 407/595] Run code formatter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🦀 Way is gone 🦀 --- .../WayofTime/bloodmagic/ConfigHandler.java | 78 ++--- .../AlchemyArrayEffectArrowTurret.java | 102 ++---- .../AlchemyArrayEffectFurnaceFuel.java | 72 ++-- .../AlchemyArrayEffectLaputa.java | 60 ++-- .../AlchemyArrayEffectMobSacrifice.java | 84 ++--- .../alchemyArray/AlchemyArrayEffectSpike.java | 24 +- .../AlchemyArrayEffectTeleport.java | 42 +-- .../WayofTime/bloodmagic/altar/AltarTier.java | 2 +- .../bloodmagic/altar/BloodAltar.java | 260 +++++---------- .../api/impl/BloodMagicCorePlugin.java | 33 +- .../api/impl/BloodMagicRecipeRegistrar.java | 135 +++----- .../api/impl/recipe/RecipeSacrificeCraft.java | 15 +- .../bloodmagic/block/BlockDecorative.java | 2 +- .../bloodmagic/block/BlockMimic.java | 2 +- .../block/enums/EnumRitualController.java | 3 +- .../client/hud/ElementRegistry.java | 3 +- .../bloodmagic/client/hud/GuiEditHUD.java | 4 +- .../element/ElementDivinedInformation.java | 2 +- .../bloodmagic/client/key/KeyBindings.java | 3 +- .../LowAlchemyCircleRenderer.java | 12 +- .../LowStaticAlchemyCircleRenderer.java | 15 +- .../MobSacrificeAlchemyCircleRenderer.java | 160 ++++----- .../TurretAlchemyCircleRenderer.java | 143 +++----- .../command/sub/SubCommandRitual.java | 1 + .../compress/BaseCompressionHandler.java | 4 +- .../compress/StorageBlockCraftingManager.java | 2 +- .../bloodmagic/core/RegistrarBloodMagic.java | 21 +- .../core/RegistrarBloodMagicItems.java | 11 +- .../core/RegistrarBloodMagicRecipes.java | 36 +- .../entity/mob/EntitySentientSpecter.java | 6 +- .../item/ItemActivationCrystal.java | 3 +- .../bloodmagic/item/ItemAlchemicVial.java | 9 +- .../bloodmagic/item/ItemBloodOrb.java | 2 +- .../bloodmagic/item/ItemLavaCrystal.java | 2 +- .../item/ItemSacrificialDagger.java | 12 +- .../WayofTime/bloodmagic/item/ItemSlate.java | 3 +- .../item/ItemTelepositionFocus.java | 3 +- .../bloodmagic/item/block/ItemBlockMimic.java | 73 ++-- .../item/routing/ItemFluidRouterFilter.java | 70 ++-- .../item/routing/ItemRouterFilter.java | 106 +++--- .../item/sigil/ItemSigilBloodLight.java | 39 +-- .../item/sigil/ItemSigilTeleposition.java | 2 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 3 +- .../bloodmagic/item/soul/ItemSentientBow.java | 21 +- .../item/soulBreath/ItemFlightScroll.java | 159 +++------ .../soulBreath/ItemSoulBreathContainer.java | 30 +- .../item/types/AlchemicVialType.java | 24 +- .../bloodmagic/item/types/ComponentTypes.java | 3 +- .../bloodmagic/item/types/ShardType.java | 3 +- .../LivingArmourUpgradeFallProtect.java | 2 +- .../upgrade/LivingArmourUpgradeSpeed.java | 54 ++- .../bloodmagic/proxy/ClientProxy.java | 39 +-- .../bloodmagic/registry/ModRecipes.java | 114 +++---- .../bloodmagic/registry/ModRituals.java | 9 +- .../ritual/crushing/ICrushingHandler.java | 2 + .../ritual/types/RitualAltarBuilder.java | 2 +- .../ritual/types/RitualCobblestone.java | 10 +- .../ritual/types/RitualCrushing.java | 18 +- .../ritual/types/RitualCrystalSplit.java | 104 +++--- .../ritual/types/RitualEllipsoid.java | 69 ++-- .../routing/RoutingFluidFilter.java | 108 ++---- .../bloodmagic/soul/ISoulBreathContainer.java | 3 +- .../bloodmagic/tile/TileAlchemyArray.java | 90 ++--- .../bloodmagic/tile/TileAlchemyTable.java | 314 +++++++----------- .../bloodmagic/tile/TileDemonCrystal.java | 94 ++---- .../tile/TileDemonCrystallizer.java | 72 ++-- .../WayofTime/bloodmagic/tile/TileMimic.java | 12 +- .../bloodmagic/tile/TilePhantomBlock.java | 2 +- .../tile/routing/TileMasterRoutingNode.java | 255 +++++--------- .../WayofTime/bloodmagic/util/Constants.java | 18 +- .../bloodmagic/util/ISigilFluidItem.java | 2 + .../WayofTime/bloodmagic/util/PluginUtil.java | 5 +- .../util/handler/event/GenericHandler.java | 8 +- .../handler/event/LivingArmourHandler.java | 197 ++++------- .../bloodmagic/util/helper/IncenseHelper.java | 3 +- .../bloodmagic/util/helper/NetworkHelper.java | 9 +- .../util/helper/PlayerSacrificeHelper.java | 2 +- 77 files changed, 1289 insertions(+), 2232 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 3681b7af..c00b81d5 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -9,90 +9,82 @@ 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 { - @Config.Comment({ "General settings" }) + @Config.Comment({"General settings"}) public static ConfigGeneral general = new ConfigGeneral(); - @Config.Comment({ "Blacklist options for various features" }) + @Config.Comment({"Blacklist options for various features"}) public static ConfigBlacklist blacklist = new ConfigBlacklist(); - @Config.Comment({ "Value modifiers for various features" }) + @Config.Comment({"Value modifiers for various features"}) public static ConfigValues values = new ConfigValues(); - @Config.Comment({ "Settings that only pertain to the client" }) + @Config.Comment({"Settings that only pertain to the client"}) public static ConfigClient client = new ConfigClient(); - @Config.Comment({ "Compatibility settings" }) + @Config.Comment({"Compatibility settings"}) public static ConfigCompat compat = new ConfigCompat(); @SubscribeEvent - public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) - { - if (event.getModID().equals(BloodMagic.MODID)) - { + 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 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." }) + @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." }) + @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.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 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." }) + 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.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." }) + @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?"}) + @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 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." }) + @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." }) + @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 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 - { + public enum AltarDisplayMode { ALWAYS, SIGIL_HELD, - SIGIL_CONTAINED, ; + SIGIL_CONTAINED, + ; } } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java index ccebac1f..67dc2ac6 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java @@ -22,8 +22,7 @@ import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.util.Utils; -public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { public EntityLiving target; public int arrowTimer; public static final int ARROW_WINDUP = 50; @@ -34,49 +33,39 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect private double yaw = 0; private double lastYaw = 0; - public AlchemyArrayEffectArrowTurret(String key) - { + public AlchemyArrayEffectArrowTurret(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + 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) - { + if (chestTile == null) { return false; } IItemHandler itemHandler = Utils.getInventory(chestTile, EnumFacing.UP); - if (itemHandler == null) - { + if (itemHandler == null) { return false; } ItemStack arrowStack = new ItemStack(Items.AIR); - if (lastChestSlot >= 0 && lastChestSlot < itemHandler.getSlots()) - { + if (lastChestSlot >= 0 && lastChestSlot < itemHandler.getSlots()) { ItemStack testStack = itemHandler.extractItem(lastChestSlot, 1, true); - if (testStack.isEmpty() || !(testStack.getItem() instanceof ItemArrow)) - { + if (testStack.isEmpty() || !(testStack.getItem() instanceof ItemArrow)) { lastChestSlot = -1; - } else - { + } else { arrowStack = testStack; } } - if (lastChestSlot < 0) - { - for (int i = 0; i < itemHandler.getSlots(); i++) - { + if (lastChestSlot < 0) { + for (int i = 0; i < itemHandler.getSlots(); i++) { ItemStack testStack = itemHandler.extractItem(i, 1, true); - if (!testStack.isEmpty() && testStack.getItem() instanceof ItemArrow) - { + if (!testStack.isEmpty() && testStack.getItem() instanceof ItemArrow) { arrowStack = testStack; lastChestSlot = i; break; @@ -85,13 +74,11 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect } - if (lastChestSlot < 0) - { + if (lastChestSlot < 0) { return false; //No arrows in the chest. Welp! } - if (canFireOnMob(world, pos, target)) - { + if (canFireOnMob(world, pos, target)) { Vector2d pitchYaw = getPitchYaw(pos, target); lastPitch = pitch; lastYaw = yaw; @@ -99,27 +86,23 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect yaw = pitchYaw.y; arrowTimer++; - if (arrowTimer >= ARROW_WINDUP) - { + if (arrowTimer >= ARROW_WINDUP) { // ItemStack arrowStack = new ItemStack(Items.ARROW); fireOnTarget(world, pos, arrowStack, target); - if (!world.isRemote) - { + if (!world.isRemote) { itemHandler.extractItem(lastChestSlot, 1, false); } arrowTimer = 0; } return false; - } else - { + } else { target = null; arrowTimer = -1; } List mobsInRange = world.getEntitiesWithinAABB(EntityMob.class, getBounds(pos)); - for (EntityMob entity : mobsInRange) - { + for (EntityMob entity : mobsInRange) { if (canFireOnMob(world, pos, entity))// && isMobInFilter(ent)) { target = entity; @@ -133,34 +116,27 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect return false; } - public double getPitch() - { + public double getPitch() { return pitch; } - public double getLastPitch() - { + public double getLastPitch() { return lastPitch; } - public double getYaw() - { + public double getYaw() { return yaw; } - public double getLastYaw() - { + public double getLastYaw() { return lastYaw; } - public void fireOnTarget(World world, BlockPos pos, ItemStack arrowStack, EntityLiving targetMob) - { + public void fireOnTarget(World world, BlockPos pos, ItemStack arrowStack, EntityLiving targetMob) { float vel = 3f; double damage = 2; - if (!world.isRemote) - { - if (arrowStack.getItem() instanceof ItemArrow) - { + if (!world.isRemote) { + if (arrowStack.getItem() instanceof ItemArrow) { // ItemArrow arrow = (ItemArrow) arrowStack.getItem(); // EntityArrow entityarrow = arrow.createArrow(world, arrowStack, targetMob); EntityTippedArrow entityarrow = new EntityTippedArrow(world); @@ -180,10 +156,8 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect } } - public static Vector2d getPitchYaw(BlockPos pos, Entity entityIn) - { - if (entityIn == null) - { + public static Vector2d getPitchYaw(BlockPos pos, Entity entityIn) { + if (entityIn == null) { return new Vector2d(0, 0); } @@ -197,46 +171,38 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect return new Vector2d(pitch, yaw); } - public boolean canEntityBeSeen(World world, BlockPos pos, Entity entityIn) - { + 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) - { + 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) - { + public AxisAlignedBB getBounds(BlockPos pos) { return new AxisAlignedBB(pos).grow(getRange(), getRange(), getRange()); } - public float getRange() - { + public float getRange() { return 32; } - public float getMinRange() - { + public float getMinRange() { return 3; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectArrowTurret(key); } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java index c21135ac..16ce80b1 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java @@ -17,25 +17,21 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect -{ +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) - { + public AlchemyArrayEffectFurnaceFuel(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { BlockPos pos = tile.getPos(); World world = tile.getWorld(); EntityPlayer sacrifice = null; - for (EnumFacing face : EnumFacing.VALUES) - { + for (EnumFacing face : EnumFacing.VALUES) { BlockPos furnacePos = pos.offset(face); Block block = world.getBlockState(furnacePos).getBlock(); if (block != Blocks.FURNACE) //This will only work vanilla furnaces. No others! @@ -44,33 +40,25 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect } TileEntity bottomTile = world.getTileEntity(furnacePos); - if (bottomTile instanceof TileEntityFurnace) - { + if (bottomTile instanceof TileEntityFurnace) { TileEntityFurnace furnaceTile = (TileEntityFurnace) bottomTile; - if (canFurnaceSmelt(furnaceTile) && !furnaceTile.isBurning()) - { - if (sacrifice == null || sacrifice.isDead) - { + if (canFurnaceSmelt(furnaceTile) && !furnaceTile.isBurning()) { + if (sacrifice == null || sacrifice.isDead) { AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, bb); - for (EntityPlayer player : playerList) - { - if (!player.isDead) - { + for (EntityPlayer player : playerList) { + if (!player.isDead) { sacrifice = player; } } } - if (sacrifice == null || sacrifice.isDead) - { + if (sacrifice == null || sacrifice.isDead) { return false; } - if (addFuelTime(furnaceTile, world, furnacePos, burnTicksAdded)) - { - if (!sacrifice.capabilities.isCreativeMode) - { + if (addFuelTime(furnaceTile, world, furnacePos, burnTicksAdded)) { + if (!sacrifice.capabilities.isCreativeMode) { sacrifice.hurtResistantTime = 0; sacrifice.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); //No. } @@ -82,41 +70,32 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect return false; } - public static boolean addFuelTime(TileEntityFurnace furnaceTile, World world, BlockPos furnacePos, int cookTime) - { + public static boolean addFuelTime(TileEntityFurnace furnaceTile, World world, BlockPos furnacePos, int cookTime) { furnaceTile.setField(0, cookTime); BlockFurnace.setState(true, world, furnacePos); return true; } - public static boolean canFurnaceSmelt(TileEntityFurnace furnaceTile) - { + public static boolean canFurnaceSmelt(TileEntityFurnace furnaceTile) { ItemStack burnStack = furnaceTile.getStackInSlot(0); - if (burnStack.isEmpty()) - { + if (burnStack.isEmpty()) { return false; - } else - { + } else { ItemStack resultStack = FurnaceRecipes.instance().getSmeltingResult(burnStack); - if (resultStack.isEmpty()) - { + if (resultStack.isEmpty()) { return false; - } else - { + } else { ItemStack finishStack = furnaceTile.getStackInSlot(2); - if (finishStack.isEmpty()) - { + if (finishStack.isEmpty()) { return true; - } else if (!finishStack.isItemEqual(resultStack)) - { + } 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 - { + } else { return finishStack.getCount() + resultStack.getCount() <= resultStack.getMaxStackSize(); // Forge fix: make furnace respect stack sizes in furnace recipes } } @@ -124,20 +103,17 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + 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 index ce64e7f3..1368cb50 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java @@ -13,8 +13,7 @@ import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.Utils; -public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect { public static final int TELEPOSE_DELAY = 4; private BlockPos currentPos = BlockPos.ORIGIN; @@ -22,20 +21,16 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect private int radius = -1; private int teleportHeightOffset = 5; - public AlchemyArrayEffectLaputa(String key) - { + public AlchemyArrayEffectLaputa(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { - if (ticksActive >= 100) - { + public boolean update(TileEntity tile, int ticksActive) { + if (ticksActive >= 100) { World world = tile.getWorld(); - if (radius == -1) - { + if (radius == -1) { ((TileAlchemyArray) tile).setItemDrop(false); radius = getRandomRadius(world.rand); teleportHeightOffset = getRandomHeightOffset(world.rand); @@ -43,8 +38,7 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect } BlockPos pos = tile.getPos(); - if (world.isRemote) - { + if (world.isRemote) { return false; } @@ -52,8 +46,7 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect int i = -radius; int k = -radius; - if (currentPos != null) - { + if (currentPos != null) { j = currentPos.getY(); i = currentPos.getX(); k = currentPos.getZ(); @@ -61,34 +54,27 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect int checks = 0; int maxChecks = 100; - while (j <= radius) - { - while (i <= radius) - { - while (k <= radius) - { - if (i == 0 && j == 0 && k == 0) - { + while (j <= radius) { + while (i <= radius) { + while (k <= radius) { + if (i == 0 && j == 0 && k == 0) { k++; continue; } checks++; - if (checks >= maxChecks) - { + if (checks >= maxChecks) { this.currentPos = new BlockPos(i, j, k); return false; } - if (checkIfSphere(radius, i, j, k)) - { + if (checkIfSphere(radius, i, j, k)) { BlockPos newPos = pos.add(i, j, k); BlockPos offsetPos = newPos.up(teleportHeightOffset); IBlockState 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)) - { + 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); @@ -112,25 +98,21 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect return false; } - public boolean checkIfSphere(float radius, float xOff, float yOff, float zOff) - { + 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) - { + public int getRandomRadius(Random rand) { return rand.nextInt(5) + 4; } - public int getRandomHeightOffset(Random rand) - { + public int getRandomHeightOffset(Random rand) { return radius * 2 + 1 + rand.nextInt(5); } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { tag.setInteger("radius", radius); tag.setInteger("teleportHeightOffset", teleportHeightOffset); tag.setInteger(Constants.NBT.X_COORD, currentPos.getX()); @@ -139,16 +121,14 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { radius = tag.getInteger("radius"); teleportHeightOffset = tag.getInteger("teleportHeightOffset"); currentPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD)); } @Override - public AlchemyArrayEffect getNewCopy() - { + 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 index 77224e58..d0b08483 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java @@ -29,29 +29,24 @@ import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.util.helper.PurificationHelper; -public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect -{ +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) - { + public AlchemyArrayEffectMobSacrifice(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { World world = tile.getWorld(); - if (world.isRemote && ticksActive < 200 && ticksActive > 40) - { + if (world.isRemote && ticksActive < 200 && ticksActive > 40) { BlockPos pos = tile.getPos(); Random rand = world.rand; - for (int i = 0; i < 2; i++) - { + 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; @@ -61,26 +56,22 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect //We need to do the check on both sides to correctly do particles. - if (ticksActive >= 200) - { + if (ticksActive >= 200) { BlockPos pos = tile.getPos(); List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDescriptor.getAABB(pos)); List inputList = new ArrayList(); - for (EntityItem entityItem : itemList) - { - if (entityItem.isDead || entityItem.getItem().isEmpty()) - { + for (EntityItem entityItem : itemList) { + if (entityItem.isDead || entityItem.getItem().isEmpty()) { continue; } inputList.add(entityItem.getItem().copy()); } - if (inputList.isEmpty()) - { + if (inputList.isEmpty()) { return false; } @@ -90,52 +81,42 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect } RecipeSacrificeCraft recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getSacrificeCraft(inputList); - if (recipe != null) - { + if (recipe != null) { double healthRequired = recipe.getHealthRequired(); double healthAvailable = 0; List livingEntities = world.getEntitiesWithinAABB(EntityLivingBase.class, mobDescriptor.getAABB(pos)); - for (EntityLivingBase living : livingEntities) - { + for (EntityLivingBase living : livingEntities) { double health = getEffectiveHealth(living); - if (health > 0) - { + if (health > 0) { healthAvailable += health; } } - if (healthAvailable < healthRequired) - { + if (healthAvailable < healthRequired) { craftTime = 0; return false; } craftTime++; - if (craftTime >= REQUIRED_CRAFT_TIME) - { - if (!world.isRemote) - { - for (EntityLivingBase living : livingEntities) - { + if (craftTime >= REQUIRED_CRAFT_TIME) { + if (!world.isRemote) { + for (EntityLivingBase living : livingEntities) { double health = getEffectiveHealth(living); - if (healthAvailable > 0 && health > 0) - { + 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) - { + if (healthAvailable <= 0) { break; } } - for (EntityItem itemEntity : itemList) - { + for (EntityItem itemEntity : itemList) { itemEntity.getItem().setCount(itemEntity.getItem().getCount() - 1); if (itemEntity.getItem().isEmpty()) //TODO: Check container { @@ -146,13 +127,10 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect world.spawnEntity(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5, recipe.getOutput())); craftTime = 0; } - } else - { - if (world.isRemote) - { + } else { + if (world.isRemote) { Vec3d spawnPosition = new Vec3d(pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5); - for (EntityItem itemEntity : itemList) - { + for (EntityItem itemEntity : itemList) { ItemStack stack = itemEntity.getItem(); double velocityFactor = 0.1; @@ -168,11 +146,9 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect // world.spawnParticle(EnumParticleTypes.ITEM_CRACK, spawnPosition.x, spawnPosition.y, spawnPosition.z, velVec2.x, velVec2.y, velVec2.z, Item.getIdFromItem(stack.getItem()), stack.getMetadata()); } - for (EntityLivingBase living : livingEntities) - { + for (EntityLivingBase living : livingEntities) { double health = getEffectiveHealth(living); - if (health <= 0) - { + if (health <= 0) { continue; } double d0 = (double) living.posX + (world.rand.nextDouble() - 0.5D) * 0.5D; @@ -189,8 +165,7 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect } //Future-proofing in case I want to make different mobs give different effective health - public double getEffectiveHealth(EntityLivingBase living) - { + public double getEffectiveHealth(EntityLivingBase living) { if (living == null) return 0; @@ -214,20 +189,17 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectMobSacrifice(key); } } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java index a0bbf514..57d7f774 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java @@ -10,43 +10,35 @@ 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) - { +public class AlchemyArrayEffectSpike extends AlchemyArrayEffect { + public AlchemyArrayEffectSpike(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { return false; } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) - { - if (entity instanceof EntityLivingBase) - { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { + if (entity instanceof EntityLivingBase) { entity.attackEntityFrom(DamageSource.CACTUS, 2); } } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + 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 index 9437e86b..82b16d12 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java @@ -17,58 +17,47 @@ import net.minecraft.world.WorldServer; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.iface.IAlchemyArray; -public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect -{ +public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect { public static final int MAX_SEARCH = 20; public static final int TELEPORT_DELAY = 40; - public AlchemyArrayEffectTeleport(String key) - { + public AlchemyArrayEffectTeleport(String key) { super(key); } @Override - public boolean update(TileEntity tile, int ticksActive) - { + public boolean update(TileEntity tile, int ticksActive) { return false; } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) - { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { EnumFacing direction = array.getRotation(); teleportEntityInDirection(world, pos, entity, direction); } - public void teleportEntityInDirection(World world, BlockPos currentPos, Entity entity, EnumFacing direction) - { - if (entity != null && entity.timeUntilPortal <= 0) - { - for (int i = 1; i <= MAX_SEARCH; i++) - { + public void teleportEntityInDirection(World world, BlockPos currentPos, Entity entity, EnumFacing 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) - { + 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 EntityPlayer) - { + if (!world.isRemote) { + if (entity instanceof EntityPlayer) { EntityPlayerMP player = (EntityPlayerMP) entity; player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); player.getEntityWorld().updateEntityWithOptionalForce(player, false); player.connection.sendPacket(new SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); - } else - { + } else { WorldServer worldServer = (WorldServer) entity.getEntityWorld(); entity.setPosition(x + 0.5, y + 0.5, z + 0.5); @@ -82,20 +71,17 @@ public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { } @Override - public AlchemyArrayEffect getNewCopy() - { + public AlchemyArrayEffect getNewCopy() { return new AlchemyArrayEffectTeleport(key); } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java index 906c61e3..a347fa15 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java @@ -127,7 +127,7 @@ public enum AltarTier { } }; - public static final int MAXTIERS = ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent ? values().length : values().length-1; + public static final int MAXTIERS = ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent ? values().length : values().length - 1; private List altarComponents; diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index f92049e7..7a111dd0 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -31,8 +31,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.ItemHandlerHelper; -public class BloodAltar implements IFluidHandler -{ +public class BloodAltar implements IFluidHandler { public boolean isActive; protected FluidStack fluidOutput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); @@ -69,15 +68,12 @@ public class BloodAltar implements IFluidHandler private RecipeBloodAltar recipe; private AltarTier currentTierDisplayed = AltarTier.ONE; - public BloodAltar(TileAltar tileAltar) - { + public BloodAltar(TileAltar tileAltar) { this.tileAltar = tileAltar; } - public void readFromNBT(NBTTagCompound tagCompound) - { - if (!tagCompound.hasKey(Constants.NBT.EMPTY)) - { + public void readFromNBT(NBTTagCompound tagCompound) { + if (!tagCompound.hasKey(Constants.NBT.EMPTY)) { FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagCompound); if (fluid != null) @@ -120,8 +116,7 @@ public class BloodAltar implements IFluidHandler currentTierDisplayed = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(AltarTier.ONE); } - public void writeToNBT(NBTTagCompound tagCompound) - { + public void writeToNBT(NBTTagCompound tagCompound) { if (fluid != null) fluid.writeToNBT(tagCompound); @@ -164,8 +159,7 @@ public class BloodAltar implements IFluidHandler tagCompound.setString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED, currentTierDisplayed.name()); } - public void startCycle() - { + public void startCycle() { if (tileAltar.getWorld() != null) tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); @@ -179,14 +173,11 @@ public class BloodAltar implements IFluidHandler ItemStack input = tileAltar.getStackInSlot(0); - if (!input.isEmpty()) - { + if (!input.isEmpty()) { // Do recipes RecipeBloodAltar recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getBloodAltar(input); - if (recipe != null) - { - if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) - { + if (recipe != null) { + if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) { this.isActive = true; this.recipe = recipe; this.liquidRequired = recipe.getSyphon(); @@ -195,8 +186,7 @@ public class BloodAltar implements IFluidHandler this.canBeFilled = false; return; } - } else if (input.getItem() instanceof IBloodOrb) - { + } else if (input.getItem() instanceof IBloodOrb) { BloodOrb orb = ((IBloodOrb) input.getItem()).getOrb(input); this.isActive = canBeFilled = orb != null && altarTier.toInt() >= orb.getTier(); return; @@ -206,8 +196,7 @@ public class BloodAltar implements IFluidHandler isActive = false; } - public void update() - { + public void update() { World world = tileAltar.getWorld(); BlockPos pos = tileAltar.getPos(); @@ -220,17 +209,14 @@ public class BloodAltar implements IFluidHandler if (lockdownDuration > 0) lockdownDuration--; - if (internalCounter % 20 == 0) - { - for (EnumFacing facing : EnumFacing.VALUES) - { + if (internalCounter % 20 == 0) { + for (EnumFacing facing : EnumFacing.VALUES) { BlockPos newPos = pos.offset(facing); IBlockState block = world.getBlockState(newPos); block.getBlock().onNeighborChange(world, newPos, pos); } } - if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) - { + if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) { int syphonMax = (int) (20 * this.dislocationMultiplier); int fluidInputted; int fluidOutputted; @@ -245,8 +231,7 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) - { + if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) { int chargeInputted = Math.min(chargingRate, this.fluid.amount); chargeInputted = Math.min(chargeInputted, maxCharge - totalCharge); totalCharge += chargeInputted; @@ -260,17 +245,14 @@ public class BloodAltar implements IFluidHandler updateAltar(); } - private void updateAltar() - { - if (!isActive) - { + private void updateAltar() { + if (!isActive) { if (cooldownAfterCrafting > 0) cooldownAfterCrafting--; return; } - if (!canBeFilled && recipe == null) - { + if (!canBeFilled && recipe == null) { startCycle(); return; } @@ -286,13 +268,11 @@ public class BloodAltar implements IFluidHandler if (world.isRemote) return; - if (!canBeFilled) - { + if (!canBeFilled) { boolean hasOperated = false; int stackSize = input.getCount(); - if (totalCharge > 0) - { + if (totalCharge > 0) { int chargeDrained = Math.min(liquidRequired * stackSize - progress, totalCharge); totalCharge -= chargeDrained; @@ -300,8 +280,7 @@ public class BloodAltar implements IFluidHandler hasOperated = true; } - if (fluid != null && fluid.amount >= 1) - { + 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)) @@ -312,27 +291,22 @@ public class BloodAltar implements IFluidHandler hasOperated = true; - if (internalCounter % 4 == 0 && world instanceof WorldServer) - { + if (internalCounter % 4 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) 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) - { + } else if (!hasOperated && progress > 0) { progress -= (int) (efficiencyMultiplier * drainRate); - if (internalCounter % 2 == 0 && world instanceof WorldServer) - { + if (internalCounter % 2 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) 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) - { + if (hasOperated) { + if (progress >= liquidRequired * stackSize) { ItemStack result = ItemHandlerHelper.copyStackWithSize(recipe.getOutput(), stackSize); BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(result, input.copy()); @@ -340,8 +314,7 @@ public class BloodAltar implements IFluidHandler tileAltar.setInventorySlotContents(0, event.getOutput()); progress = 0; - if (world instanceof WorldServer) - { + if (world instanceof WorldServer) { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 40, 0.3, 0, 0.3, 0); } @@ -350,8 +323,7 @@ public class BloodAltar implements IFluidHandler this.isActive = false; } } - } else - { + } else { ItemStack contained = tileAltar.getStackInSlot(0); if (contained.isEmpty() || !(contained.getItem() instanceof IBloodOrb) || !(contained.getItem() instanceof IBindable)) @@ -363,14 +335,12 @@ public class BloodAltar implements IFluidHandler if (binding == null || orb == null) return; - if (fluid != null && fluid.amount >= 1) - { + 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 WorldServer) - { + if (drain > 0 && internalCounter % 4 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; server.spawnParticle(EnumParticleTypes.SPELL_WITCH, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0, 0, 0, 0.001); } @@ -380,8 +350,7 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - public void checkTier() - { + public void checkTier() { AltarTier tier = AltarUtil.getTier(tileAltar.getWorld(), tileAltar.getPos()); this.altarTier = tier; @@ -390,8 +359,7 @@ public class BloodAltar implements IFluidHandler if (tier.equals(currentTierDisplayed)) currentTierDisplayed = AltarTier.ONE; - if (tier.equals(AltarTier.ONE)) - { + if (tier.equals(AltarTier.ONE)) { upgrade = null; isUpgraded = false; this.consumptionMultiplier = 0; @@ -407,8 +375,7 @@ public class BloodAltar implements IFluidHandler this.maxCharge = 0; this.totalCharge = 0; return; - } else if (!tier.equals(AltarTier.ONE)) - { + } else if (!tier.equals(AltarTier.ONE)) { this.isUpgraded = true; this.accelerationUpgrades = upgrade.getLevel(BloodRuneType.ACCELERATION); this.consumptionMultiplier = (float) (0.20 * upgrade.getLevel(BloodRuneType.SPEED)); @@ -438,128 +405,103 @@ public class BloodAltar implements IFluidHandler tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); } - public int fillMainTank(int amount) - { + 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) - { + 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 - { + } else { fluid.amount += Math.min(capacity - fluid.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount); } } - public void setMainFluid(FluidStack fluid) - { + public void setMainFluid(FluidStack fluid) { this.fluid = fluid; } - public void setOutputFluid(FluidStack fluid) - { + public void setOutputFluid(FluidStack fluid) { this.fluidOutput = fluid; } - public void setInputFluid(FluidStack fluid) - { + public void setInputFluid(FluidStack fluid) { this.fluidInput = fluid; } - public AltarUpgrade getUpgrade() - { + public AltarUpgrade getUpgrade() { return upgrade; } - public void setUpgrade(AltarUpgrade upgrade) - { + public void setUpgrade(AltarUpgrade upgrade) { this.upgrade = upgrade; } - public int getCapacity() - { + public int getCapacity() { return capacity; } - public FluidStack getFluid() - { + public FluidStack getFluid() { return fluid; } - public int getFluidAmount() - { + public int getFluidAmount() { return fluid.amount; } - public int getCurrentBlood() - { + public int getCurrentBlood() { return getFluidAmount(); } - public AltarTier getTier() - { + public AltarTier getTier() { return altarTier; } - public void setTier(AltarTier tier) - { + public void setTier(AltarTier tier) { this.altarTier = tier; } - public int getProgress() - { + public int getProgress() { return progress; } - public float getSacrificeMultiplier() - { + public float getSacrificeMultiplier() { return sacrificeEfficiencyMultiplier; } - public float getSelfSacrificeMultiplier() - { + public float getSelfSacrificeMultiplier() { return selfSacrificeEfficiencyMultiplier; } - public float getOrbMultiplier() - { + public float getOrbMultiplier() { return orbCapacityMultiplier; } - public float getDislocationMultiplier() - { + public float getDislocationMultiplier() { return dislocationMultiplier; } - public float getConsumptionMultiplier() - { + public float getConsumptionMultiplier() { return consumptionMultiplier; } - public float getConsumptionRate() - { + public float getConsumptionRate() { return consumptionRate; } - public int getLiquidRequired() - { + public int getLiquidRequired() { return liquidRequired; } - public int getBufferCapacity() - { + public int getBufferCapacity() { return bufferCapacity; } - public boolean setCurrentTierDisplayed(AltarTier altarTier) - { + public boolean setCurrentTierDisplayed(AltarTier altarTier) { if (currentTierDisplayed == altarTier) return false; else @@ -567,99 +509,79 @@ public class BloodAltar implements IFluidHandler return true; } - public void addToDemonBloodDuration(int dur) - { + public void addToDemonBloodDuration(int dur) { this.demonBloodDuration += dur; } - public boolean hasDemonBlood() - { + public boolean hasDemonBlood() { return this.demonBloodDuration > 0; } - public void decrementDemonBlood() - { + public void decrementDemonBlood() { this.demonBloodDuration = Math.max(0, this.demonBloodDuration - 1); } - public void setActive() - { - if (tileAltar.getStackInSlot(0).isEmpty()) - { + public void setActive() { + if (tileAltar.getStackInSlot(0).isEmpty()) { isActive = false; } } - public boolean isActive() - { + public boolean isActive() { return isActive; } - public void requestPauseAfterCrafting(int amount) - { - if (this.isActive) - { + public void requestPauseAfterCrafting(int amount) { + if (this.isActive) { this.cooldownAfterCrafting = amount; } } - public int getChargingRate() - { + public int getChargingRate() { return chargingRate; } - public int getTotalCharge() - { + public int getTotalCharge() { return totalCharge; } - public int getChargingFrequency() - { + public int getChargingFrequency() { return chargingFrequency == 0 ? 1 : chargingFrequency; } @Override - public int fill(FluidStack resource, boolean doFill) - { - if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) - { + public int fill(FluidStack resource, boolean doFill) { + if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) { return 0; } - if (!doFill) - { - if (fluidInput == null) - { + if (!doFill) { + if (fluidInput == null) { return Math.min(bufferCapacity, resource.amount); } - if (!fluidInput.isFluidEqual(resource)) - { + if (!fluidInput.isFluidEqual(resource)) { return 0; } return Math.min(bufferCapacity - fluidInput.amount, resource.amount); } - if (fluidInput == null) - { + if (fluidInput == null) { fluidInput = new FluidStack(resource, Math.min(bufferCapacity, resource.amount)); return fluidInput.amount; } - if (!fluidInput.isFluidEqual(resource)) - { + if (!fluidInput.isFluidEqual(resource)) { return 0; } int filled = bufferCapacity - fluidInput.amount; - if (resource.amount < filled) - { + if (resource.amount < filled) { fluidInput.amount += resource.amount; filled = resource.amount; - } else - { + } else { fluidInput.amount = bufferCapacity; } @@ -667,45 +589,37 @@ public class BloodAltar implements IFluidHandler } @Override - public FluidStack drain(FluidStack resource, boolean doDrain) - { - if (resource == null || !resource.isFluidEqual(fluidOutput)) - { + 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) - { + public FluidStack drain(int maxDrain, boolean doDrain) { + if (fluidOutput == null) { return null; } int drained = maxDrain; - if (fluidOutput.amount < drained) - { + if (fluidOutput.amount < drained) { drained = fluidOutput.amount; } FluidStack stack = new FluidStack(fluidOutput, drained); - if (doDrain) - { + if (doDrain) { fluidOutput.amount -= drained; } return stack; } @Override - public IFluidTankProperties[] getTankProperties() - { - return new IFluidTankProperties[] { new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity)) }; + public IFluidTankProperties[] getTankProperties() { + return new IFluidTankProperties[]{new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity))}; } - public AltarTier getCurrentTierDisplayed() - { + public AltarTier getCurrentTierDisplayed() { return currentTierDisplayed; } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 1725d095..c59bbbe6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -23,12 +23,10 @@ import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.ForgeRegistries; @BloodMagicPlugin -public class BloodMagicCorePlugin implements IBloodMagicPlugin -{ +public class BloodMagicCorePlugin implements IBloodMagicPlugin { @Override - public void register(IBloodMagicAPI apiInterface) - { + public void register(IBloodMagicAPI apiInterface) { BloodMagicAPI api = (BloodMagicAPI) apiInterface; // Add forced blacklistings api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE); @@ -84,8 +82,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin } @Override - public void registerRecipes(IBloodMagicRecipeRegistrar recipeRegistrar) - { + public void registerRecipes(IBloodMagicRecipeRegistrar recipeRegistrar) { RegistrarBloodMagicRecipes.registerAltarRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); RegistrarBloodMagicRecipes.registerAlchemyTableRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); RegistrarBloodMagicRecipes.registerTartaricForgeRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); @@ -93,10 +90,8 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin RegistrarBloodMagicRecipes.registerSacrificeCraftRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); } - private static void handleConfigValues(BloodMagicAPI api) - { - for (String value : ConfigHandler.values.sacrificialValues) - { + private static void handleConfigValues(BloodMagicAPI api) { + for (String value : ConfigHandler.values.sacrificialValues) { String[] split = value.split(";"); if (split.length != 2) // Not valid format continue; @@ -104,18 +99,15 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin api.getValueManager().setSacrificialValue(new ResourceLocation(split[0]), Integer.parseInt(split[1])); } - for (String value : ConfigHandler.blacklist.teleposer) - { + 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. + 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. + if (blockData.length > 1) { // We have properties listed, so let's build a state. api.getBlacklist().addTeleposer(StateUtil.parseState(value)); continue; } @@ -127,15 +119,13 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin api.getBlacklist().addTeleposer(entityEntry.getRegistryName()); } - for (String value : ConfigHandler.blacklist.transposer) - { + 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. + if (blockData.length > 1) { // We have properties listed, so let's build a state. api.getBlacklist().addTeleposer(StateUtil.parseState(value)); continue; } @@ -143,8 +133,7 @@ public class BloodMagicCorePlugin implements IBloodMagicPlugin api.getBlacklist().addTeleposer(block); } - for (String value : ConfigHandler.blacklist.wellOfSuffering) - { + for (String value : ConfigHandler.blacklist.wellOfSuffering) { EntityEntry entityEntry = ForgeRegistries.ENTITIES.getValue(new ResourceLocation(value)); if (entityEntry == null) // Not a valid entity continue; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index 776d762d..215f3981 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -27,8 +27,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar -{ +public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { private final Set altarRecipes; private final Set alchemyRecipes; @@ -36,8 +35,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar private final Set alchemyArrayRecipes; private final Set sacrificeCraftRecipes; - public BloodMagicRecipeRegistrar() - { + public BloodMagicRecipeRegistrar() { this.altarRecipes = Sets.newHashSet(); this.alchemyRecipes = Sets.newHashSet(); this.tartaricForgeRecipes = Sets.newHashSet(); @@ -46,8 +44,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate) - { + 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."); @@ -59,16 +56,14 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public boolean removeBloodAltar(@Nonnull ItemStack input) - { + 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) - { + 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."); @@ -79,8 +74,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar 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) - { + 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."); @@ -88,10 +82,8 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar Preconditions.checkNotNull(input, "input cannot be null."); List ingredients = Lists.newArrayList(); - for (Object object : input) - { - if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) - { + 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; } @@ -102,14 +94,12 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar addAlchemyTable(output, syphon, ticks, minimumTier, ingredients.toArray(new Ingredient[0])); } - public void addAlchemyTable(RecipeAlchemyTable recipe) - { + public void addAlchemyTable(RecipeAlchemyTable recipe) { alchemyRecipes.add(recipe); } @Override - public boolean removeAlchemyTable(@Nonnull ItemStack... input) - { + public boolean removeAlchemyTable(@Nonnull ItemStack... input) { Preconditions.checkNotNull(input, "inputs cannot be null."); for (ItemStack stack : input) @@ -119,8 +109,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Ingredient... input) - { + 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."); @@ -131,8 +120,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public boolean removeTartaricForge(@Nonnull ItemStack... input) - { + public boolean removeTartaricForge(@Nonnull ItemStack... input) { Preconditions.checkNotNull(input, "inputs cannot be null."); for (ItemStack stack : input) @@ -141,18 +129,15 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar return tartaricForgeRecipes.remove(getTartaricForge(Lists.newArrayList(input))); } - public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Object... 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) - { + 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; } @@ -164,8 +149,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) - { + 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."); @@ -174,16 +158,14 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) - { + 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) - { + 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."); @@ -191,17 +173,14 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar addAlchemyArray(Ingredient.fromStacks(input), Ingredient.fromStacks(catalyst), output, circleTexture); } - public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Object... input) - { + 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) - { + 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; } @@ -213,8 +192,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public boolean removeSacrificeCraft(@Nonnull ItemStack... input) - { + public boolean removeSacrificeCraft(@Nonnull ItemStack... input) { Preconditions.checkNotNull(input, "inputs cannot be null."); for (ItemStack stack : input) @@ -224,8 +202,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Override - public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Ingredient... input) - { + 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."); @@ -235,8 +212,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeBloodAltar getBloodAltar(@Nonnull ItemStack input) - { + public RecipeBloodAltar getBloodAltar(@Nonnull ItemStack input) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; @@ -249,27 +225,23 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeAlchemyTable getAlchemyTable(@Nonnull List input) - { + public RecipeAlchemyTable getAlchemyTable(@Nonnull List input) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; - mainLoop: for (RecipeAlchemyTable recipe : alchemyRecipes) - { + 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++) - { + for (int i = 0; i < input.size(); i++) { boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) - { + for (int j = 0; j < recipeInput.size(); j++) { Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) - { + if (ingredient.apply(input.get(i))) { matched = true; recipeInput.remove(j); break; @@ -287,27 +259,23 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeTartaricForge getTartaricForge(@Nonnull List input) - { + public RecipeTartaricForge getTartaricForge(@Nonnull List input) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; - mainLoop: for (RecipeTartaricForge recipe : tartaricForgeRecipes) - { + 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++) - { + for (int i = 0; i < input.size(); i++) { boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) - { + for (int j = 0; j < recipeInput.size(); j++) { Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) - { + if (ingredient.apply(input.get(i))) { matched = true; recipeInput.remove(j); break; @@ -325,27 +293,23 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeSacrificeCraft getSacrificeCraft(@Nonnull List input) - { + public RecipeSacrificeCraft getSacrificeCraft(@Nonnull List input) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; - mainLoop: for (RecipeSacrificeCraft recipe : sacrificeCraftRecipes) - { + 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++) - { + for (int i = 0; i < input.size(); i++) { boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) - { + for (int j = 0; j < recipeInput.size(); j++) { Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) - { + if (ingredient.apply(input.get(i))) { matched = true; recipeInput.remove(j); break; @@ -363,8 +327,7 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar } @Nullable - public RecipeAlchemyArray getAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) - { + public RecipeAlchemyArray getAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) { Preconditions.checkNotNull(input, "input cannot be null."); if (input.isEmpty()) return null; @@ -376,23 +339,19 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar return null; } - public Set getAltarRecipes() - { + public Set getAltarRecipes() { return ImmutableSet.copyOf(altarRecipes); } - public Set getAlchemyRecipes() - { + public Set getAlchemyRecipes() { return ImmutableSet.copyOf(alchemyRecipes); } - public Set getTartaricForgeRecipes() - { + public Set getTartaricForgeRecipes() { return ImmutableSet.copyOf(tartaricForgeRecipes); } - public Set getAlchemyArrayRecipes() - { + public Set getAlchemyArrayRecipes() { return ImmutableSet.copyOf(alchemyArrayRecipes); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java index 95bf3354..f2e000f6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java @@ -8,8 +8,7 @@ import net.minecraft.util.NonNullList; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; -public class RecipeSacrificeCraft -{ +public class RecipeSacrificeCraft { @Nonnull private final NonNullList input; @Nonnull @@ -17,8 +16,7 @@ public class RecipeSacrificeCraft @Nonnegative private final double healthRequired; - public RecipeSacrificeCraft(@Nonnull NonNullList input, @Nonnull ItemStack output, @Nonnegative 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."); @@ -29,20 +27,17 @@ public class RecipeSacrificeCraft } @Nonnull - public final NonNullList getInput() - { + public final NonNullList getInput() { return input; } @Nonnull - public final ItemStack getOutput() - { + public final ItemStack getOutput() { return output; } @Nonnegative - public final double getHealthRequired() - { + public final double getHealthRequired() { return healthRequired; } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java index 065f340e..12a14983 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java @@ -24,7 +24,7 @@ public class BlockDecorative extends BlockEnum { @Override public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { - for (EnumDecorative type : EnumDecorative.values()){ + 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/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 38b9ac62..6675b63e 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -219,7 +219,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } return null; } - + @Override public ItemBlock getItem() { return new ItemBlockMimic(this); diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java index 531ab6a2..bfc67190 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java @@ -7,7 +7,8 @@ import java.util.Locale; public enum EnumRitualController implements IStringSerializable { MASTER, IMPERFECT, - INVERTED,; + INVERTED, + ; @Override public String toString() { diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java b/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java index d83cb03c..9c62ee31 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java @@ -98,7 +98,8 @@ public class ElementRegistry { return; try (FileReader reader = new FileReader(CONFIG)) { - Map toLoad = GSON.fromJson(reader, new TypeToken>() {}.getType()); + 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) diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java index a25a5b6c..94531576 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java @@ -34,7 +34,9 @@ public class GuiEditHUD extends GuiScreen { 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(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"))); diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java index c072b646..0d9beb6c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java @@ -55,7 +55,7 @@ public abstract class ElementDivinedInformation extends El if (sigilStack.getItem() instanceof ItemSigilHolding) { List internalInv = ItemSigilHolding.getInternalInventory(sigilStack); int currentSlot = ItemSigilHolding.getCurrentItemOrdinal(sigilStack); - if(internalInv != null && !internalInv.get(currentSlot).isEmpty()) { + if (internalInv != null && !internalInv.get(currentSlot).isEmpty()) { return (internalInv.get(currentSlot).getItem() == RegistrarBloodMagicItems.SIGIL_SEER && !simple) || (internalInv.get(currentSlot).getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION && simple); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java index a9d8a8af..6fa069bd 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java @@ -46,7 +46,8 @@ public enum KeyBindings { if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, 1); } - },; + }, + ; // @formatter:on private final IKeyConflictContext keyConflictContext; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java index bce8f30f..687ecdc8 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java @@ -2,21 +2,17 @@ package WayofTime.bloodmagic.client.render.alchemyArray; import net.minecraft.util.ResourceLocation; -public class LowAlchemyCircleRenderer extends SingleAlchemyCircleRenderer -{ - public LowAlchemyCircleRenderer() - { +public class LowAlchemyCircleRenderer extends SingleAlchemyCircleRenderer { + public LowAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png")); } - public LowAlchemyCircleRenderer(ResourceLocation arrayResource) - { + public LowAlchemyCircleRenderer(ResourceLocation arrayResource) { super(arrayResource); } @Override - public float getVerticalOffset(float craftTime) - { + 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 index 0256ec93..8b57713b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java @@ -2,25 +2,20 @@ package WayofTime.bloodmagic.client.render.alchemyArray; import net.minecraft.util.ResourceLocation; -public class LowStaticAlchemyCircleRenderer extends LowAlchemyCircleRenderer -{ - public LowStaticAlchemyCircleRenderer() - { +public class LowStaticAlchemyCircleRenderer extends LowAlchemyCircleRenderer { + public LowStaticAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png")); } - public LowStaticAlchemyCircleRenderer(ResourceLocation arrayResource) - { + public LowStaticAlchemyCircleRenderer(ResourceLocation arrayResource) { super(arrayResource); } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 2; float duration = 180; - if (craftTime >= offset && craftTime < offset + duration) - { + if (craftTime >= offset && craftTime < offset + duration) { float modifier = (craftTime - offset) * 2f; return modifier * 1f; } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java index 2f5bdfc7..76a98ab3 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java @@ -13,41 +13,33 @@ import net.minecraft.world.World; import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer -{ +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) - { + public MobSacrificeAlchemyCircleRenderer(ResourceLocation location) { super(location); } - public MobSacrificeAlchemyCircleRenderer() - { + public MobSacrificeAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/mobsacrifice.png")); } @Override - public float getSizeModifier(float craftTime) - { - if (craftTime < 40) - { + public float getSizeModifier(float craftTime) { + if (craftTime < 40) { return 0; - } else if (craftTime > 40 && craftTime < 100) - { + } else if (craftTime > 40 && craftTime < 100) { return (craftTime - 40) / 60f; } return 1; } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 50; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (craftTime - offset) * 5f; return modifier * 1f; } @@ -55,16 +47,13 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public float getSecondaryRotation(float craftTime) - { + 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)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -94,30 +83,29 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer 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; + 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(); @@ -136,8 +124,7 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer // 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++) - { + for (int i = 1; i <= 3; i++) { GlStateManager.pushMatrix(); Minecraft.getMinecraft().renderEngine.bindTexture(bottomArrayResource); translateAndRotateFloatingArray(tessellator, wr, size, rot, craftTime, i); @@ -153,11 +140,9 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer //Render the swirlz float swirlSize = 3; - if (craftTime <= 40) - { + if (craftTime <= 40) { swirlSize = 0; - } else if (craftTime <= 100) - { + } else if (craftTime <= 100) { swirlSize = 3 * (craftTime - 40) / 60; } GlStateManager.pushMatrix(); @@ -180,66 +165,58 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.popMatrix(); } - public float getStartupPitchYawRatio(float craftTime) - { - if (craftTime <= 80) - { + public float getStartupPitchYawRatio(float craftTime) { + if (craftTime <= 80) { return 0; - } else if (craftTime > 80 && craftTime < 140) - { + } 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) - { + 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) - { + if (craftTime >= 40) { primaryRotation = (craftTime - 40) * 4f; secondaryRotation = (craftTime - 40) * 2f; } float translationOffset = 1; - if (craftTime < 80) - { + if (craftTime < 80) { translationOffset = 0; - } else if (craftTime < 140) - { + } 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); + 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((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((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); @@ -249,8 +226,7 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer renderStandardCircle(tessellator, builder, size); } - private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) - { + private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) { double var31 = 0.0D; double var33 = 1.0D; double var35 = 0; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java index 35702b83..b9967d3a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java @@ -15,33 +15,27 @@ import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectArrowTurret; import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; -public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer -{ +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) - { + public TurretAlchemyCircleRenderer(ResourceLocation location) { super(location); } - public TurretAlchemyCircleRenderer() - { + public TurretAlchemyCircleRenderer() { this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png")); } @Override - public float getSizeModifier(float craftTime) - { + public float getSizeModifier(float craftTime) { return 1; } @Override - public float getRotation(float craftTime) - { + public float getRotation(float craftTime) { float offset = 50; - if (craftTime >= offset) - { + if (craftTime >= offset) { float modifier = (craftTime - offset) * 5f; return modifier * 1f; } @@ -49,16 +43,13 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer } @Override - public float getSecondaryRotation(float craftTime) - { + 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)) - { + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { + if (!(tile instanceof TileAlchemyArray)) { return; } @@ -69,8 +60,7 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer double pitch = 0; double yaw = 0; int arrowTimer = -1; - if (effect instanceof AlchemyArrayEffectArrowTurret) - { + if (effect instanceof AlchemyArrayEffectArrowTurret) { AlchemyArrayEffectArrowTurret turretEffect = (AlchemyArrayEffectArrowTurret) effect; pitch = (turretEffect.getPitch() - turretEffect.getLastPitch()) * f + turretEffect.getLastPitch(); yaw = (turretEffect.getYaw() - turretEffect.getLastYaw()) * f + turretEffect.getLastYaw(); @@ -103,30 +93,29 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer 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; + 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(); @@ -177,93 +166,71 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer GlStateManager.popMatrix(); } - public float getStartupPitchYawRatio(float craftTime) - { - if (craftTime <= 80) - { + public float getStartupPitchYawRatio(float craftTime) { + if (craftTime <= 80) { return 0; - } else if (craftTime > 80 && craftTime < 140) - { + } else if (craftTime > 80 && craftTime < 140) { return (craftTime - 80) / 60f; } return 1; } - public double getBottomHeightOffset(double craftTime, double arrowAnimation) - { - if (craftTime <= 40) - { + public double getBottomHeightOffset(double craftTime, double arrowAnimation) { + if (craftTime <= 40) { return 0; - } else if (craftTime > 40 && craftTime < 100) - { + } else if (craftTime > 40 && craftTime < 100) { return -0.4 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) - { + } else if (craftTime >= 100 && craftTime < 140) { return -0.4 * (140 - craftTime) / 40d; } - if (arrowAnimation > 0 && arrowAnimation < 45) - { + if (arrowAnimation > 0 && arrowAnimation < 45) { return -0.4 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) - { + } else if (arrowAnimation >= 45 && arrowAnimation < 50) { return -0.4 * (50 - arrowAnimation) / 5; } return 0; } - public double getMiddleHeightOffset(double craftTime, double arrowAnimation) - { - if (craftTime <= 40) - { + public double getMiddleHeightOffset(double craftTime, double arrowAnimation) { + if (craftTime <= 40) { return 0; - } else if (craftTime > 40 && craftTime < 100) - { + } else if (craftTime > 40 && craftTime < 100) { return 0.1 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) - { + } else if (craftTime >= 100 && craftTime < 140) { return 0.1 * (140 - craftTime) / 40d; } - if (arrowAnimation > 0 && arrowAnimation < 45) - { + if (arrowAnimation > 0 && arrowAnimation < 45) { return 0.1 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) - { + } else if (arrowAnimation >= 45 && arrowAnimation < 50) { return 0.1 * (50 - arrowAnimation) / 5; } return 0; } - public double getTopHeightOffset(double craftTime, double arrowAnimation) - { - if (craftTime <= 40) - { + public double getTopHeightOffset(double craftTime, double arrowAnimation) { + if (craftTime <= 40) { return 0; - } else if (craftTime > 40 && craftTime < 100) - { + } else if (craftTime > 40 && craftTime < 100) { return 0.4 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) - { + } else if (craftTime >= 100 && craftTime < 140) { return 0.4 * (140 - craftTime) / 40d; } - if (arrowAnimation > 0 && arrowAnimation < 45) - { + if (arrowAnimation > 0 && arrowAnimation < 45) { return 0.4 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) - { + } else if (arrowAnimation >= 45 && arrowAnimation < 50) { return 0.4 * (50 - arrowAnimation) / 5; } return 0; } - private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) - { + private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) { double var31 = 0.0D; double var33 = 1.0D; double var35 = 0; diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java index db0ec96d..b64efcf9 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java @@ -49,6 +49,7 @@ public class SubCommandRitual extends CommandTreeBase { 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)); diff --git a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java index 94b4ddf6..59530a63 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java @@ -37,13 +37,13 @@ public class BaseCompressionHandler extends CompressionHandler { public int getRemainingNeeded(ItemStack[] inv) { int needed = this.required.getCount(); int kept = this.getLeftover(); - return iterateThroughInventory(this.required, kept, inv, needed, true); + 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); + return iterateThroughInventory(this.required, kept, inv, needed, true); } public int getLeftover() { diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 96d31140..cfe039c1 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -16,7 +16,7 @@ public class StorageBlockCraftingManager { private static final StorageBlockCraftingManager instance = new StorageBlockCraftingManager(); private List recipes = new LinkedList<>(); - public void addRecipe(IRecipe recipe){ + public void addRecipe(IRecipe recipe) { this.recipes.add(recipe); } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index 83a0a0e1..fb6269d2 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -29,8 +29,7 @@ import net.minecraftforge.registries.RegistryBuilder; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) -public class RegistrarBloodMagic -{ +public class RegistrarBloodMagic { private static final BloodOrb ORB_DEF = new BloodOrb("", 0, 0, 0); @GameRegistry.ObjectHolder("weak") @@ -67,8 +66,7 @@ public class RegistrarBloodMagic public static IForgeRegistry BLOOD_ORBS = null; @SubscribeEvent - public static void registerBloodOrbs(RegistryEvent.Register event) - { + 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"), @@ -85,8 +83,7 @@ public class RegistrarBloodMagic } @SubscribeEvent - public static void registerPotions(RegistryEvent.Register event) - { + 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"), @@ -109,8 +106,7 @@ public class RegistrarBloodMagic } @SubscribeEvent - public static void registerEntities(RegistryEvent.Register event) - { + public static void registerEntities(RegistryEvent.Register event) { int entities = 0; event.getRegistry().registerAll( @@ -128,8 +124,7 @@ public class RegistrarBloodMagic } @SubscribeEvent - public static void onRegistryCreation(RegistryEvent.NewRegistry event) - { + public static void onRegistryCreation(RegistryEvent.NewRegistry event) { BLOOD_ORBS = new RegistryBuilder() .setName(new ResourceLocation(BloodMagic.MODID, "blood_orb")) .setIDRange(0, Short.MAX_VALUE) @@ -140,10 +135,8 @@ public class RegistrarBloodMagic @SideOnly(Side.CLIENT) @SubscribeEvent - public static void registerModels(ModelRegistryEvent event) - { - for (BloodOrb orb : BLOOD_ORBS) - { + public static void registerModels(ModelRegistryEvent event) { + for (BloodOrb orb : BLOOD_ORBS) { ModelResourceLocation modelLocation = orb.getModelLocation(); if (modelLocation == null) modelLocation = new ModelResourceLocation(orb.getRegistryName(), "inventory"); diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index e45190fb..0938c425 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -44,8 +44,7 @@ import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) @GameRegistry.ObjectHolder(BloodMagic.MODID) @SuppressWarnings("unchecked") -public class RegistrarBloodMagicItems -{ +public class RegistrarBloodMagicItems { public static final Item BLOOD_ORB = Items.AIR; public static final Item ACTIVATION_CRYSTAL = Items.AIR; @@ -129,8 +128,7 @@ public class RegistrarBloodMagicItems public static List items; @SubscribeEvent - public static void registerItems(RegistryEvent.Register event) - { + public static void registerItems(RegistryEvent.Register event) { items = Lists.newArrayList(); RegistrarBloodMagicBlocks.blocks.stream().filter(block -> block instanceof IBMBlock && ((IBMBlock) block).getItem() != null).forEach(block -> @@ -215,15 +213,14 @@ public class RegistrarBloodMagicItems 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) - { + public static void registerRenders(ModelRegistryEvent event) { items.stream().filter(i -> i instanceof IVariantProvider).forEach(i -> { Int2ObjectMap variants = new Int2ObjectOpenHashMap<>(); diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 05f40732..d967e0b8 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -37,16 +37,12 @@ import java.util.List; import java.util.Set; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class RegistrarBloodMagicRecipes -{ +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()) - { + 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); @@ -65,8 +61,7 @@ public class RegistrarBloodMagicRecipes RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL.setRepairItem(EnumDemonWillType.DEFAULT.getStack()); } - public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) - { + 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); @@ -105,8 +100,7 @@ public class RegistrarBloodMagicRecipes } } - public static void registerAlchemyTableRecipes(BloodMagicRecipeRegistrar registrar) - { + 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); @@ -139,16 +133,13 @@ public class RegistrarBloodMagicRecipes 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)) - { + 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()) - { + 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()); @@ -158,8 +149,7 @@ public class RegistrarBloodMagicRecipes } } - public static void registerTartaricForgeRecipes(BloodMagicRecipeRegistrar registrar) - { + 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()); @@ -216,8 +206,7 @@ public class RegistrarBloodMagicRecipes 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) - { + 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")); @@ -244,8 +233,7 @@ public class RegistrarBloodMagicRecipes } - public static void registerSacrificeCraftRecipes(BloodMagicRecipeRegistrar registrar) - { + public static void registerSacrificeCraftRecipes(BloodMagicRecipeRegistrar registrar) { registrar.addSacrificeCraft(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER), 10, Items.REDSTONE); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 21d5b273..321f3d30 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -385,9 +385,9 @@ public class EntitySentientSpecter extends EntityDemonBase { @Override public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) { - return super.shouldAttackEntity(attacker, owner); - } - return false; + return super.shouldAttackEntity(attacker, owner); + } + return false; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java index 65c0c354..ca52fadd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java @@ -47,7 +47,8 @@ public class ItemActivationCrystal extends ItemEnum.Variant -{ - public ItemAlchemicVial() - { +public class ItemAlchemicVial extends ItemEnum.Variant { + public ItemAlchemicVial() { super(AlchemicVialType.class, "alchemic_vial"); } @Override - public void gatherVariants(Int2ObjectMap variants) - { + public void gatherVariants(Int2ObjectMap variants) { for (AlchemicVialType type : types) variants.put(type.ordinal(), "type=normal"); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index 9e31e607..71d20e33 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -82,7 +82,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { 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.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); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index a537d1ec..f99408df 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -70,7 +70,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide return null; NBTTagCompound nbt = (NBTTagCompound) bindingTag; - return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")),nbt.getString("name")); + return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")), nbt.getString("name")); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 5410758f..960b52a0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -53,7 +53,7 @@ public class ItemSacrificialDagger extends ItemEnum { REINFORCED, IMBUED, DEMONIC, - ETHEREAL,; + ETHEREAL, + ; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 2d645ba2..1cce2154 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -93,7 +93,8 @@ public class ItemTelepositionFocus extends ItemEnum.Variant list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -55,35 +51,30 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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) - { + public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { IFluidFilter testFilter; - switch (filterStack.getMetadata()) - { - case 0: - testFilter = new RoutingFluidFilter(); - break; + switch (filterStack.getMetadata()) { + case 0: + testFilter = new RoutingFluidFilter(); + break; - default: - testFilter = new RoutingFluidFilter(); + default: + testFilter = new RoutingFluidFilter(); } List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } @@ -96,32 +87,27 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) - { + public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { IFluidFilter testFilter; - switch (filterStack.getMetadata()) - { - case 0: - testFilter = new RoutingFluidFilter(); - break; + switch (filterStack.getMetadata()) { + case 0: + testFilter = new RoutingFluidFilter(); + break; - default: - testFilter = new RoutingFluidFilter(); + 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++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) - { + if (ghostStack.isEmpty()) { ghostStack.setCount(Integer.MAX_VALUE); } @@ -133,14 +119,12 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) - { + public void gatherVariants(@Nonnull Int2ObjectMap variants) { variants.put(0, "type=exact"); } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) - { + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index e62a77be..70e55aec 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -22,12 +22,10 @@ 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 class ItemRouterFilter extends Item implements IItemFilterProvider, IVariantProvider { + public static String[] names = {"exact", "ignoreNBT", "modItems", "oreDict"}; - public ItemRouterFilter() - { + public ItemRouterFilter() { super(); setTranslationKey(BloodMagic.MODID + ".itemFilter."); @@ -36,15 +34,13 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public String getTranslationKey(ItemStack stack) - { + public String getTranslationKey(ItemStack stack) { return super.getTranslationKey(stack) + names[stack.getItemDamage()]; } @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) - { + public void getSubItems(CreativeTabs creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -54,44 +50,39 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) - { + 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) - { + 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; + 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(); + default: + testFilter = new DefaultItemFilter(); } List filteredList = new ArrayList<>(); ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } @@ -105,42 +96,37 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) - { + 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; + 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(); + 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++) - { + for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) - { + if (stack.isEmpty()) { continue; } ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) - { + if (ghostStack.isEmpty()) { ghostStack.setCount(Integer.MAX_VALUE); } @@ -152,8 +138,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) - { + public void gatherVariants(@Nonnull Int2ObjectMap variants) { variants.put(0, "type=exact"); variants.put(1, "type=ignorenbt"); variants.put(2, "type=moditems"); @@ -161,8 +146,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) - { + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 8c161786..957187bc 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -15,23 +15,19 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -public class ItemSigilBloodLight extends ItemSigilBase -{ - public ItemSigilBloodLight() - { +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) - { + 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, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (stack.getItem() instanceof ISigil.Holding) stack = ((Holding) stack.getItem()).getHeldItem(stack, player); @@ -43,15 +39,12 @@ public class ItemSigilBloodLight extends ItemSigilBase if (getCooldownRemainder(stack) > 0) return super.onItemRightClick(world, player, hand); - if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) - { + if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { BlockPos blockPos = mop.getBlockPos().offset(mop.sideHit); - if (world.isAirBlock(blockPos)) - { + if (world.isAirBlock(blockPos)) { world.setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); - if (!world.isRemote) - { + if (!world.isRemote) { SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); } @@ -59,10 +52,8 @@ public class ItemSigilBloodLight extends ItemSigilBase player.swingArm(hand); return super.onItemRightClick(world, player, hand); } - } else - { - if (!world.isRemote) - { + } 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())); @@ -74,23 +65,19 @@ public class ItemSigilBloodLight extends ItemSigilBase } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) - { + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return oldStack.getItem() != newStack.getItem(); } - public int getCooldownRemainder(ItemStack stack) - { + public int getCooldownRemainder(ItemStack stack) { return NBTHelper.checkNBT(stack).getTagCompound().getInteger(Constants.NBT.TICKS_REMAINING); } - public void reduceCooldown(ItemStack stack) - { + public void reduceCooldown(ItemStack stack) { NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.TICKS_REMAINING, getCooldownRemainder(stack) - 1); } - public void resetCooldown(ItemStack stack) - { + 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/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 5a9ea8f0..7d25804c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -71,8 +71,8 @@ public class ItemSigilTeleposition extends ItemSigilBase { TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, bindingOwnerID, world, tile.getWorld().provider.getDimension(), true)); } } - } } + } return super.onItemRightClick(world, player, hand); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index 6e83eb7e..487f80a2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -104,7 +104,8 @@ public class ItemMonsterSoul extends ItemEnum.Variant CORROSIVE, DESTRUCTIVE, VENGEFUL, - STEADFAST,; + STEADFAST, + ; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 1b804351..4d72a199 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -44,12 +44,12 @@ import java.util.Locale; public class ItemSentientBow extends ItemBow 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 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() { @@ -331,7 +331,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien player.addStat(StatList.getObjectUseStats(this)); return entityArrow; } - + @Override public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) { if (entityLiving instanceof EntityPlayer) { @@ -361,9 +361,9 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien ItemArrow itemarrow = ((ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW)); EntityArrow 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) { @@ -382,8 +382,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien entityArrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); - if (Float.compare(getVelocityOfArrow(stack), soullessShotVelocity) < Float.MIN_NORMAL) - { + if (Float.compare(getVelocityOfArrow(stack), soullessShotVelocity) < Float.MIN_NORMAL) { world.playSound(null, player.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); } diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java index 12073a87..b16fe78a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java @@ -32,31 +32,26 @@ 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 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() - { + public ItemFlightScroll() { super(); setTranslationKey(BloodMagic.MODID + ".icarusScroll"); setCreativeTab(BloodMagic.TAB_BM); } @Override - public boolean getActivated(ItemStack stack) - { + 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()) - { + public ItemStack setActivatedState(ItemStack stack, boolean activated) { + if (!stack.isEmpty()) { NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); return stack; } @@ -65,27 +60,20 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) - { + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); - if (!world.isRemote) - { - if (player.isSneaking()) - { - if (!getActivated(stack)) - { + if (!world.isRemote) { + if (player.isSneaking()) { + if (!getActivated(stack)) { double drainNeeded = getBreathCostPerSecond(stack); - if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) - { + if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) { setActivatedState(stack, true); } - } else - { + } else { setActivatedState(stack, false); } - } else - { + } 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. } @@ -95,27 +83,21 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Override - public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, EnumHand hand) - { - if (entity.world.isRemote) - { + public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, EnumHand 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()) - { + if (player.isSneaking()) { //TODO: Release entity completely? removeEntity(player, entity); - } else - { + } else { EntityLivingBase heldEntity = getHeldEntity(player); - if (heldEntity != null && heldEntity.equals(entity)) - { + if (heldEntity != null && heldEntity.equals(entity)) { heldEntityMap.remove(player); - } else - { + } else { holdEntity(player, entity); //Hold the entity so you can place it around yourself where needed. } } @@ -124,18 +106,13 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) - { - if (!world.isRemote && entity instanceof EntityPlayerMP && getActivated(stack)) - { - if (entity.ticksExisted % 20 == 0) - { + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + if (!world.isRemote && entity instanceof EntityPlayerMP && getActivated(stack)) { + if (entity.ticksExisted % 20 == 0) { double drainNeeded = getBreathCostPerSecond(stack); - if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) - { + if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) { this.drainBreath(stack, drainNeeded, true); - } else - { + } else { this.setActivatedState(stack, false); } } @@ -143,40 +120,32 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr onEffectUpdate(stack, world, (EntityPlayer) entity, itemSlot, isSelected); } - if (!world.isRemote) - { - if (entity instanceof EntityPlayer) - { + if (!world.isRemote) { + if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; updateHeldEntityPosition(player); - if (floatMap.containsKey(player)) - { + if (floatMap.containsKey(player)) { Map entityMap = floatMap.get(player); - if (entityMap == null) - { + if (entityMap == null) { return; } List removalList = new ArrayList(); - for (Entry entry : entityMap.entrySet()) - { + for (Entry entry : entityMap.entrySet()) { EntityLivingBase floatingEntity = entry.getKey(); - if (floatingEntity == null || floatingEntity.isDead || floatingEntity.dimension != player.dimension) - { + if (floatingEntity == null || floatingEntity.isDead || floatingEntity.dimension != player.dimension) { removalList.add(floatingEntity); } followOwner(player, floatingEntity, entry.getValue()); } - for (EntityLivingBase livingEntity : removalList) - { + for (EntityLivingBase livingEntity : removalList) { entityMap.remove(livingEntity); } - if (entityMap.isEmpty()) - { + if (entityMap.isEmpty()) { floatMap.remove(player); } @@ -185,16 +154,13 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } } - public static boolean updateEntityOffset(EntityPlayer player, EntityLivingBase living, Vector3d updatedOffset) - { + public static boolean updateEntityOffset(EntityPlayer player, EntityLivingBase living, Vector3d updatedOffset) { //TODO: Check if this entity is contained in another player's map to prevent weird things. - if (floatMap.containsKey(player)) - { + if (floatMap.containsKey(player)) { Map entityMap = floatMap.get(player); entityMap.put(living, updatedOffset); return true; - } else - { + } else { Map entityMap = new HashMap(); entityMap.put(living, updatedOffset); floatMap.put(player, entityMap); @@ -203,28 +169,23 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Nullable - public static EntityLivingBase getHeldEntity(EntityPlayer player) - { - if (heldEntityMap.containsKey(player)) - { + public static EntityLivingBase getHeldEntity(EntityPlayer player) { + if (heldEntityMap.containsKey(player)) { return heldEntityMap.get(player); } return null; } - public static double getHeldEntityOffset(EntityPlayer player) - { - if (heldEntityMap.containsKey(player)) - { + public static double getHeldEntityOffset(EntityPlayer player) { + if (heldEntityMap.containsKey(player)) { return heldEntityOffsetMap.get(player); } return 1; } - public static void holdEntity(EntityPlayer player, EntityLivingBase entityLiving) - { + public static void holdEntity(EntityPlayer player, EntityLivingBase entityLiving) { float distance = player.getDistance(entityLiving); Vec3d lookVec = player.getLookVec(); heldEntityMap.put(player, entityLiving); @@ -232,41 +193,33 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr updateEntityOffset(player, entityLiving, new Vector3d(lookVec.x * distance, lookVec.y * distance, lookVec.z * distance)); } - public static void updateHeldEntityPosition(EntityPlayer player) - { + public static void updateHeldEntityPosition(EntityPlayer player) { EntityLivingBase entityLiving = getHeldEntity(player); - if (entityLiving != null) - { + 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(EntityPlayer player, EntityLivingBase living) - { - if (living == null) - { + public static void removeEntity(EntityPlayer player, EntityLivingBase living) { + if (living == null) { return; } - if (floatMap.containsKey(player)) - { + if (floatMap.containsKey(player)) { Map entityMap = floatMap.get(player); - if (entityMap.containsKey(living)) - { + if (entityMap.containsKey(living)) { entityMap.remove(living); } - if (entityMap.isEmpty()) - { + if (entityMap.isEmpty()) { floatMap.remove(player); } } } - public void followOwner(EntityPlayer owner, EntityLivingBase livingEntity, Vector3d offset) - { + public void followOwner(EntityPlayer owner, EntityLivingBase livingEntity, Vector3d offset) { double offsetX = offset.x; double offsetY = offset.y; double offsetZ = offset.z; @@ -287,40 +240,34 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr vec.normalize(); - if (speed <= 0.00001) - { + if (speed <= 0.00001) { return; } livingEntity.setVelocity(vec.x * speed, vec.y * speed, vec.z * speed); } - public void onEffectUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) - { + public void onEffectUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FLIGHT, 2, 0)); } @Override - public int getMaxBreath(ItemStack stack) - { + public int getMaxBreath(ItemStack stack) { return 20; } - public double getBreathCostPerSecond(ItemStack stack) - { + public double getBreathCostPerSecond(ItemStack stack) { return 0.01; } @Override @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() - { + public ItemMeshDefinition getMeshDefinition() { return new CustomMeshDefinitionActivatable("icarus_scroll"); } @Override - public void gatherVariants(Consumer variants) - { + 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 index 1dfb41cd..43c3b3ed 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java @@ -6,33 +6,28 @@ import net.minecraft.nbt.NBTTagCompound; import WayofTime.bloodmagic.soul.ISoulBreathContainer; import WayofTime.bloodmagic.util.Constants; -public abstract class ItemSoulBreathContainer extends Item implements ISoulBreathContainer -{ +public abstract class ItemSoulBreathContainer extends Item implements ISoulBreathContainer { @Override - public double getBreath(ItemStack stack) - { + public double getBreath(ItemStack stack) { NBTTagCompound tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.BREATH); } @Override - public void setBreath(ItemStack stack, double amount) - { + public void setBreath(ItemStack stack, double amount) { NBTTagCompound tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.BREATH, amount); } @Override - public double drainBreath(ItemStack stack, double drainAmount, boolean doDrain) - { + public double drainBreath(ItemStack stack, double drainAmount, boolean doDrain) { double breath = getBreath(stack); double breathDrained = Math.min(drainAmount, breath); - if (doDrain) - { + if (doDrain) { setBreath(stack, breath - breathDrained); } @@ -40,15 +35,13 @@ public abstract class ItemSoulBreathContainer extends Item implements ISoulBreat } @Override - public double fillBreath(ItemStack stack, double fillAmount, boolean doFill) - { + 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) - { + if (doFill) { this.setBreath(stack, filled + current); } @@ -56,17 +49,14 @@ public abstract class ItemSoulBreathContainer extends Item implements ISoulBreat } @Override - public boolean showDurabilityBar(ItemStack stack) - { + public boolean showDurabilityBar(ItemStack stack) { return true; } @Override - public double getDurabilityForDisplay(ItemStack stack) - { + public double getDurabilityForDisplay(ItemStack stack) { double maxWill = getMaxBreath(stack); - if (maxWill <= 0) - { + 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 index db637b99..1539372c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java @@ -6,44 +6,36 @@ import net.minecraft.item.ItemStack; import javax.annotation.Nonnull; import java.util.Locale; -public enum AlchemicVialType implements ISubItem -{ +public enum AlchemicVialType implements ISubItem { BASE(0x2e35ff); final int potionColour; - AlchemicVialType(int colour1) - { + AlchemicVialType(int colour1) { potionColour = colour1; } @Nonnull @Override - public String getInternalName() - { + public String getInternalName() { return name().toLowerCase(Locale.ROOT); } @Nonnull @Override - public ItemStack getStack(int count) - { + public ItemStack getStack(int count) { return new ItemStack(RegistrarBloodMagicItems.ALCHEMIC_VIAL, count, ordinal()); } - public int getColourForLayer(int layer) - { - if (layer == 0) - { + 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) - { + public static int getColourForLayer(int variant, int layer) { + if (variant >= AlchemicVialType.values().length) { return -1; } diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java index 89474201..c49aa09b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java @@ -40,7 +40,8 @@ public enum ComponentTypes implements ISubItem { CATALYST_POWER_1, REAGENT_CLAW, REAGENT_BOUNCE, - REAGENT_FROST,; + REAGENT_FROST, + ; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java index f3ca9233..d3edd6e3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java +++ b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java @@ -9,7 +9,8 @@ import java.util.Locale; public enum ShardType implements ISubItem { WEAK, - DEMONIC,; + DEMONIC, + ; @Nonnull @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java index 66b48fdc..79368bdb 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -14,7 +14,7 @@ public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade { super(level); } - + public float getDamageMultiplier() { return 1 - protectionLevel[this.level]; } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 8b9288a6..3a0a2890 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -16,45 +16,37 @@ import org.apache.commons.codec.binary.StringUtils; import java.util.UUID; -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 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) - { + public LivingArmourUpgradeSpeed(int level) { super(level); } - public double getSpeedModifier() - { + public double getSpeedModifier() { return speedModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) - { - if (player.isSprinting()) - { - if (sprintSpeedTime[this.level] > 0) - { + public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + if (player.isSprinting()) { + if (sprintSpeedTime[this.level] > 0) { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, sprintSpeedTime[this.level], sprintSpeedLevel[this.level], false, false)); } - if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) - { + if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) { player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, sprintRegenTime[this.level], 0, false, false)); } } } @Override - public Multimap getAttributeModifiers() - { + 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)); @@ -68,38 +60,32 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade } @Override - public String getUniqueIdentifier() - { + public String getUniqueIdentifier() { return BloodMagic.MODID + ".upgrade.movement"; } @Override - public int getMaxTier() - { + public int getMaxTier() { return 10; } @Override - public int getCostOfUpgrade() - { + public int getCostOfUpgrade() { return costs[this.level]; } @Override - public void writeToNBT(NBTTagCompound tag) - { + public void writeToNBT(NBTTagCompound tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) - { + public void readFromNBT(NBTTagCompound tag) { // EMPTY } @Override - public String getTranslationKey() - { + public String getTranslationKey() { return tooltipBase + "speed"; } } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index f8dd774e..204d1db4 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -40,22 +40,18 @@ import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import java.awt.Color; import java.util.Map; -public class ClientProxy extends CommonProxy -{ +public class ClientProxy extends CommonProxy { public static DemonWillHolder currentAura = new DemonWillHolder(); @Override - public void preInit() - { + public void preInit() { super.preInit(); OBJLoader.INSTANCE.addDomain(BloodMagic.MODID); - ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() - { + ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() { @Override - public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) - { + public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) { chest.handleEvents(time, pastEvents); } }); @@ -73,8 +69,7 @@ public class ClientProxy extends CommonProxy } @Override - public void registerRenderers() - { + public void registerRenderers() { RenderingRegistry.registerEntityRenderingHandler(EntitySoulSnare.class, new SoulSnareRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntitySentientArrow.class, new SentientArrowRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntityBloodLight.class, new BloodLightRenderFactory()); @@ -90,18 +85,15 @@ public class ClientProxy extends CommonProxy } @Override - public void init() - { + public void init() { super.init(); Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> { - try - { + 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) - { + } catch (NumberFormatException e) { return -1; } return -1; @@ -130,29 +122,24 @@ public class ClientProxy extends CommonProxy } @Override - public void postInit() - { + public void postInit() { Elements.registerElements(); } - private void addElytraLayer() - { + private void addElytraLayer() { RenderManager renderManager = Minecraft.getMinecraft().getRenderManager(); - try - { + try { Map skinMap = ObfuscationReflectionHelper.getPrivateValue(RenderManager.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) - { + } 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) - { + public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) { return ModelLoaderRegistry.loadASM(location, parameters); } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 688c588a..6a748789 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -70,14 +70,12 @@ import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Stopwatch; -public class ModRecipes -{ +public class ModRecipes { static ItemStack mundaneLengtheningStack = ComponentTypes.CATALYST_LENGTH_1.getStack(); static ItemStack mundanePowerStack = ComponentTypes.CATALYST_POWER_1.getStack(); - public static void init() - { + public static void init() { initOreDict(); addFurnaceRecipes(); addAltarRecipes(); @@ -88,8 +86,7 @@ public class ModRecipes addCompressionHandlers(); } - public static void initOreDict() - { + 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()); @@ -97,19 +94,16 @@ public class ModRecipes OreDictionary.registerOre("dustSaltpeter", ComponentTypes.SALTPETER.getStack()); } - public static void addFurnaceRecipes() - { + 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 addAltarRecipes() { } - public static void addAlchemyArrayRecipes() - { + 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)))); @@ -137,8 +131,7 @@ public class ModRecipes } - public static void addCompressionHandlers() - { + public static void addCompressionHandlers() { Stopwatch stopwatch = Stopwatch.createStarted(); StorageBlockCraftingManager.getInstance().addStorageBlockRecipes(); @@ -151,13 +144,11 @@ public class ModRecipes BMLog.DEBUG.info("Added compression recipes in {}", stopwatch); } - public static void addAlchemyTableRecipes() - { + public static void addAlchemyTableRecipes() { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING))); } - public static void addPotionRecipes() - { + public static void addPotionRecipes() { addPotionRecipe(1000, 1, new ItemStack(Items.GHAST_TEAR), new PotionEffect(MobEffects.REGENERATION, 450)); addPotionRecipe(1000, 1, new ItemStack(Items.GOLDEN_CARROT), new PotionEffect(MobEffects.NIGHT_VISION, 2 * 60 * 20)); addPotionRecipe(1000, 1, new ItemStack(Items.MAGMA_CREAM), new PotionEffect(MobEffects.FIRE_RESISTANCE, 2 * 60 * 20)); @@ -181,8 +172,7 @@ public class ModRecipes addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new PotionEffect(RegistrarBloodMagic.DEAFNESS, 450)); } - public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) - { + public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) { AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(lpDrained, 100, tier, inputStack, baseEffect)); List lengtheningList = new ArrayList<>(); @@ -196,8 +186,7 @@ public class ModRecipes AlchemyTableRecipeRegistry.registerRecipe(BMPotionUtils.getPowerAugmentRecipe(lpDrained, 100, tier, powerList, baseEffect, 1)); } - public static void addLivingArmourDowngradeRecipes() - { + public static void addLivingArmourDowngradeRecipes() { String messageBase = "ritual.bloodmagic.downgradeRitual.dialogue."; ItemStack bowStack = new ItemStack(Items.BOW); @@ -211,18 +200,16 @@ public class ModRecipes 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 })); + 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()) - { + for (Entry> entry : dialogueMap.entrySet()) { ItemStack keyStack = entry.getKey(); String str = entry.getValue().getKey(); Map> textMap = new HashMap<>(); - for (int tick : entry.getValue().getValue()) - { + for (int tick : entry.getValue().getValue()) { List textList = new ArrayList<>(); textList.add(new TextComponentTranslation("\u00A74%s", new TextComponentTranslation(messageBase + str + "." + tick))); textMap.put(tick, textList); @@ -240,8 +227,7 @@ public class ModRecipes LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeQuenched(0), bottleStack, Items.DRAGON_BREATH); LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeCrippledArm(0), shieldStack, "gemDiamond"); - for (int i = 0; i < 10; i++) - { + 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); @@ -251,39 +237,37 @@ public class ModRecipes } } - 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)); + 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 index 8b1822e9..57f5d24a 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -9,11 +9,9 @@ import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerStem; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerTall; import net.minecraft.init.Blocks; -public class ModRituals -{ +public class ModRituals { // TODO Move elsewhere - public static void initHarvestHandlers() - { + 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); @@ -23,8 +21,7 @@ public class ModRituals HarvestRegistry.registerHandler(new HarvestHandlerStem()); } - public static void initCuttingFluids() - { + 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/ritual/crushing/ICrushingHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java index fb99faf7..10d586cb 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java @@ -9,6 +9,8 @@ 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/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index 64242e37..9e3592b9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -160,7 +160,7 @@ public class RitualAltarBuilder extends Ritual { } /* - * + * * These methods are utilities for this ritual. They support both the old * forge inventory system, and the new one. */ diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java index 34321638..f0617d47 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java @@ -53,11 +53,11 @@ public class RitualCobblestone extends Ritual { alchemyArray.decrStackSize(0, 1); world.setBlockToAir(alchemyArray.getPos()); break; - /* - * case 4: block = Blocks.end_stone; - * 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; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 271ddac4..4b6d7955 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -120,18 +120,18 @@ public class RitualCrushing extends Ritual { ItemStack copyStack = checkStack.copy(); for (ICrushingHandler handler : CrushingRegistry.getCrushingHandlerList()) { - int lpDrain = handler.getLpDrain(); - double willDrain = handler.getWillDrain(); + int lpDrain = handler.getLpDrain(); + double willDrain = handler.getWillDrain(); - if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) { - continue; - } + if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) { + continue; + } - ItemStack result = handler.getRecipeOutput(copyStack, world, pos); + ItemStack result = handler.getRecipeOutput(copyStack, world, pos); - if (result.isEmpty()) { - continue; - } + if (result.isEmpty()) { + continue; + } if (tile != null) { result = Utils.insertStackIntoTile(result, tile, EnumFacing.DOWN); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java index d5f666be..70b683f9 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java @@ -17,21 +17,17 @@ import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.tile.TileDemonCrystal; @RitualRegister("crystal_split") -public class RitualCrystalSplit extends Ritual -{ - public RitualCrystalSplit() - { +public class RitualCrystalSplit extends Ritual { + public RitualCrystalSplit() { super("ritualCrystalSplit", 0, 20000, "ritual." + BloodMagic.MODID + ".crystalSplitRitual"); } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -41,16 +37,14 @@ public class RitualCrystalSplit extends Ritual BlockPos rawPos = pos.up(2); TileEntity tile = world.getTileEntity(rawPos); - if (!(tile instanceof TileDemonCrystal) || ((TileDemonCrystal) tile).getType() != EnumDemonWillType.DEFAULT) - { + if (!(tile instanceof TileDemonCrystal) || ((TileDemonCrystal) tile).getType() != EnumDemonWillType.DEFAULT) { return; } IBlockState rawState = world.getBlockState(rawPos); TileDemonCrystal rawTile = (TileDemonCrystal) tile; - if (rawTile.crystalCount >= 5) - { + if (rawTile.crystalCount >= 5) { BlockPos vengefulPos = pos.offset(rotateFacing(EnumFacing.NORTH, direction)).up(); BlockPos corrosivePos = pos.offset(rotateFacing(EnumFacing.EAST, direction)).up(); BlockPos steadfastPos = pos.offset(rotateFacing(EnumFacing.SOUTH, direction)).up(); @@ -62,50 +56,38 @@ public class RitualCrystalSplit extends Ritual int destructiveCrystals = 0; tile = world.getTileEntity(vengefulPos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.VENGEFUL && ((TileDemonCrystal) tile).crystalCount < 7) - { + 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)) - { + } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(vengefulPos)) { // #donothing, no point setting the crystal to 0 again - } else - { + } else { return; } tile = world.getTileEntity(corrosivePos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.CORROSIVE && ((TileDemonCrystal) tile).crystalCount < 7) - { + 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 if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(corrosivePos)) { - } else - { + } else { return; } tile = world.getTileEntity(steadfastPos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.STEADFAST && ((TileDemonCrystal) tile).crystalCount < 7) - { + 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 if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(steadfastPos)) { - } else - { + } else { return; } tile = world.getTileEntity(destructivePos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.DESTRUCTIVE && ((TileDemonCrystal) tile).crystalCount < 7) - { + 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 if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(destructivePos)) { - } else - { + } else { return; } @@ -120,29 +102,24 @@ public class RitualCrystalSplit extends Ritual } } - public EnumFacing rotateFacing(EnumFacing facing, EnumFacing 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 EnumFacing rotateFacing(EnumFacing facing, EnumFacing 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) - { + 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 - { + } else { TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); tile.crystalCount++; tile.markDirty(); @@ -152,20 +129,17 @@ public class RitualCrystalSplit extends Ritual } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 20; } @Override - public int getRefreshCost() - { + public int getRefreshCost() { return 1000; } @Override - public void gatherComponents(Consumer components) - { + 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); @@ -177,14 +151,12 @@ public class RitualCrystalSplit extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualCrystalSplit(); } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) - { - return new ITextComponent[] { new TextComponentTranslation(this.getTranslationKey() + ".info") }; + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + return new ITextComponent[]{new TextComponentTranslation(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 index ad04ccfd..cece930d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -17,16 +17,14 @@ import net.minecraftforge.items.IItemHandler; import java.util.function.Consumer; @RitualRegister("ellipsoid") -public class RitualEllipsoid extends Ritual -{ +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() - { + 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)); @@ -36,8 +34,7 @@ public class RitualEllipsoid extends Ritual } @Override - public void performRitual(IMasterRitualStone masterRitualStone) - { + public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); @@ -45,8 +42,7 @@ public class RitualEllipsoid extends Ritual AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - if (currentEssence < getRefreshCost()) - { + if (currentEssence < getRefreshCost()) { masterRitualStone.getOwnerNetwork().causeNausea(); return; } @@ -60,20 +56,16 @@ public class RitualEllipsoid extends Ritual 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, EnumFacing.DOWN)) - { + if (tileInventory != null) { + if (tileInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { IItemHandler itemHandler = tileInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); - if (itemHandler.getSlots() <= 0) - { + if (itemHandler.getSlots() <= 0) { return; } int blockSlot = -1; - for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) - { + for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) { ItemStack stack = itemHandler.extractItem(invSlot, 1, true); if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) continue; @@ -82,8 +74,7 @@ public class RitualEllipsoid extends Ritual break; } - if (blockSlot == -1) - { + if (blockSlot == -1) { return; } @@ -95,8 +86,7 @@ public class RitualEllipsoid extends Ritual int i = -minY; int k = -minZ; - if (currentPos != null) - { + if (currentPos != null) { j = currentPos.getY(); i = Math.min(xR, Math.max(-minX, currentPos.getX())); k = Math.min(zR, Math.max(-minZ, currentPos.getZ())); @@ -104,25 +94,19 @@ public class RitualEllipsoid extends Ritual int checks = 0; int maxChecks = 100; - while (j <= maxY) - { - while (i <= maxX) - { - while (k <= maxZ) - { + while (j <= maxY) { + while (i <= maxX) { + while (k <= maxZ) { checks++; - if (checks >= maxChecks) - { + if (checks >= maxChecks) { this.currentPos = new BlockPos(i, j, k); return; } - if (checkIfEllipsoidShell(xR, yR, zR, i, j, k)) - { + if (checkIfEllipsoidShell(xR, yR, zR, i, j, k)) { BlockPos newPos = masterPos.add(i, j, k); // - if (!world.getBlockState(newPos).getBlock().isReplaceable(world, newPos)) - { + if (!world.getBlockState(newPos).getBlock().isReplaceable(world, newPos)) { k++; continue; } @@ -156,11 +140,9 @@ public class RitualEllipsoid extends Ritual } } - public boolean checkIfEllipsoidShell(int xR, int yR, int zR, int xOff, int yOff, int zOff) - { + 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)) - { + if (!checkIfEllipsoid(xR, yR, zR, xOff, yOff, zOff)) { return false; } @@ -186,21 +168,18 @@ public class RitualEllipsoid extends Ritual // return false; } - public boolean checkIfEllipsoid(float xR, float yR, float zR, float xOff, float yOff, float zOff) - { + 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() - { + public int getRefreshCost() { return 5; } @Override - public int getRefreshTime() - { + public int getRefreshTime() { return 1; } @@ -212,8 +191,7 @@ public class RitualEllipsoid extends Ritual // } @Override - public void gatherComponents(Consumer components) - { + public void gatherComponents(Consumer components) { addCornerRunes(components, 1, 0, EnumRuneType.DUSK); addRune(components, 4, 0, 0, EnumRuneType.FIRE); @@ -254,8 +232,7 @@ public class RitualEllipsoid extends Ritual } @Override - public Ritual getNewCopy() - { + public Ritual getNewCopy() { return new RitualEllipsoid(); } } diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java index 6ff9f8d9..9f4b47a7 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -15,54 +15,42 @@ import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; -public class RoutingFluidFilter implements IFluidFilter -{ +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) - { + public void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput) { this.accessedTile = tile; this.fluidHandler = fluidHandler; - if (isFilterOutput) - { + if (isFilterOutput) { //The requestList contains a list of how much can be extracted. requestList = new ArrayList<>(); - for (ItemStack filterStack : filteredList) - { + for (ItemStack filterStack : filteredList) { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) - { + if (fluidFilterStack != null) { requestList.add(fluidFilterStack); } } IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - for (IFluidTankProperties property : properties) - { + for (IFluidTankProperties property : properties) { FluidStack containedStack = property.getContents(); - if (containedStack != null) - { - for (FluidStack fluidFilterStack : requestList) - { - if (doStacksMatch(fluidFilterStack, containedStack)) - { + if (containedStack != null) { + for (FluidStack fluidFilterStack : requestList) { + if (doStacksMatch(fluidFilterStack, containedStack)) { fluidFilterStack.amount = Math.max(fluidFilterStack.amount - containedStack.amount, 0); } } } } - } else - { + } else { requestList = new ArrayList<>(); - for (ItemStack filterStack : filteredList) - { + for (ItemStack filterStack : filteredList) { FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) - { + if (fluidFilterStack != null) { fluidFilterStack.amount *= -1; requestList.add(fluidFilterStack); } @@ -70,15 +58,11 @@ public class RoutingFluidFilter implements IFluidFilter IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - for (IFluidTankProperties property : properties) - { + for (IFluidTankProperties property : properties) { FluidStack containedStack = property.getContents(); - if (containedStack != null) - { - for (FluidStack fluidFilterStack : requestList) - { - if (doStacksMatch(fluidFilterStack, containedStack)) - { + if (containedStack != null) { + for (FluidStack fluidFilterStack : requestList) { + if (doStacksMatch(fluidFilterStack, containedStack)) { fluidFilterStack.amount += containedStack.amount; } } @@ -91,20 +75,16 @@ public class RoutingFluidFilter implements IFluidFilter * Gives the remainder~ */ @Override - public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) - { + public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) { int allowedAmount = 0; - for (FluidStack filterStack : requestList) - { - if (doStacksMatch(filterStack, fluidStack)) - { + for (FluidStack filterStack : requestList) { + if (doStacksMatch(filterStack, fluidStack)) { allowedAmount = Math.min(filterStack.amount, fluidStack.amount); break; } } - if (allowedAmount <= 0) - { + if (allowedAmount <= 0) { return fluidStack; } @@ -113,14 +93,11 @@ public class RoutingFluidFilter implements IFluidFilter copyStack.amount = fluidStack.amount - filledAmount; Iterator itr = requestList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) - { + if (doStacksMatch(filterStack, copyStack)) { filterStack.amount -= filledAmount; - if (filterStack.amount <= 0) - { + if (filterStack.amount <= 0) { itr.remove(); } } @@ -134,13 +111,10 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) - { - for (FluidStack filterFluidStack : requestList) - { + public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) { + for (FluidStack filterFluidStack : requestList) { int allowedAmount = Math.min(filterFluidStack.amount, maxTransfer); - if (allowedAmount <= 0) - { + if (allowedAmount <= 0) { continue; } @@ -152,8 +126,7 @@ public class RoutingFluidFilter implements IFluidFilter FluidStack remainderStack = outputFilter.transferStackThroughOutputFilter(drainStack); int drained = remainderStack == null ? copyStack.amount : (copyStack.amount - remainderStack.amount); - if (drained > 0) - { + if (drained > 0) { drainStack.amount = drained; fluidHandler.drain(drainStack, true); @@ -161,14 +134,11 @@ public class RoutingFluidFilter implements IFluidFilter } Iterator itr = requestList.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) - { + if (doStacksMatch(filterStack, copyStack)) { filterStack.amount -= drained; - if (filterStack.amount <= 0) - { + if (filterStack.amount <= 0) { itr.remove(); } } @@ -186,12 +156,9 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public boolean doesStackMatchFilter(FluidStack testStack) - { - for (FluidStack filterStack : requestList) - { - if (doStacksMatch(filterStack, testStack)) - { + public boolean doesStackMatchFilter(FluidStack testStack) { + for (FluidStack filterStack : requestList) { + if (doStacksMatch(filterStack, testStack)) { return true; } } @@ -200,17 +167,14 @@ public class RoutingFluidFilter implements IFluidFilter } @Override - public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) - { + public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) { return testStack != null && filterStack.getFluid() == testStack.getFluid(); } @Nullable - public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) - { + public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) { boolean isEmpty = false; - if (inputStack.getCount() == 0) - { + if (inputStack.getCount() == 0) { isEmpty = true; inputStack.setCount(1); } diff --git a/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java b/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java index f8b9b137..da0f4d07 100644 --- a/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java +++ b/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java @@ -2,8 +2,7 @@ package WayofTime.bloodmagic.soul; import net.minecraft.item.ItemStack; -public interface ISoulBreathContainer -{ +public interface ISoulBreathContainer { double getBreath(ItemStack stack); void setBreath(ItemStack stack, double amount); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 828f2891..4173ca2c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -17,8 +17,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray -{ +public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray { public boolean isActive = false; public int activeCounter = 0; public EnumFacing rotation = EnumFacing.HORIZONTALS[0]; @@ -28,22 +27,18 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche public AlchemyArrayEffect arrayEffect; private boolean doDropIngredients = true; - public TileAlchemyArray() - { + public TileAlchemyArray() { super(2, "alchemyArray"); } - public void onEntityCollidedWithBlock(IBlockState state, Entity entity) - { - if (arrayEffect != null) - { + public void onEntityCollidedWithBlock(IBlockState state, Entity entity) { + if (arrayEffect != null) { arrayEffect.onEntityCollidedWithBlock(this, getWorld(), pos, state, entity); } } @Override - public void deserialize(NBTTagCompound tagCompound) - { + public void deserialize(NBTTagCompound tagCompound) { super.deserialize(tagCompound); this.isActive = tagCompound.getBoolean("isActive"); this.activeCounter = tagCompound.getInteger("activeCounter"); @@ -51,23 +46,20 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche if (!tagCompound.hasKey("doDropIngredients")) //Check if the array is old { this.doDropIngredients = true; - } else - { + } else { this.doDropIngredients = tagCompound.getBoolean("doDropIngredients"); } this.rotation = EnumFacing.HORIZONTALS[tagCompound.getInteger(Constants.NBT.DIRECTION)]; NBTTagCompound arrayTag = tagCompound.getCompoundTag("arrayTag"); arrayEffect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(key); - if (arrayEffect != null) - { + if (arrayEffect != null) { arrayEffect.readFromNBT(arrayTag); } } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) - { + public NBTTagCompound serialize(NBTTagCompound tagCompound) { super.serialize(tagCompound); tagCompound.setBoolean("isActive", isActive); tagCompound.setInteger("activeCounter", activeCounter); @@ -76,8 +68,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche tagCompound.setInteger(Constants.NBT.DIRECTION, rotation.getHorizontalIndex()); NBTTagCompound arrayTag = new NBTTagCompound(); - if (arrayEffect != null) - { + if (arrayEffect != null) { arrayEffect.writeToNBT(arrayTag); } tagCompound.setTag("arrayTag", arrayTag); @@ -86,25 +77,20 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 1; } //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) - { + public void setItemDrop(boolean dropItems) { this.doDropIngredients = dropItems; } @Override - public void update() - { - if (isActive && attemptCraft()) - { + public void update() { + if (isActive && attemptCraft()) { activeCounter++; - } else - { + } else { isActive = false; doDropIngredients = true; activeCounter = 0; @@ -119,61 +105,48 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche * This occurs when the block is destroyed. */ @Override - public void dropItems() - { - if (arrayEffect == null || doDropIngredients) - { + public void dropItems() { + if (arrayEffect == null || doDropIngredients) { super.dropItems(); } } - public boolean attemptCraft() - { + public boolean attemptCraft() { AlchemyArrayEffect effect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(this.getStackInSlot(0), this.getStackInSlot(1)); - if (effect != null) - { - if (arrayEffect == null) - { + if (effect != null) { + if (arrayEffect == null) { arrayEffect = effect; key = effect.getKey(); - } else - { + } else { String effectKey = effect.getKey(); - if (effectKey.equals(key)) - { + if (effectKey.equals(key)) { //Good! Moving on. - } else - { + } else { //Something has changed, therefore we have to move our stuffs. //TODO: Add an AlchemyArrayEffect.onBreak(); ? arrayEffect = effect; key = effect.getKey(); } } - } else - { + } else { RecipeAlchemyArray recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArray(getStackInSlot(0), getStackInSlot(1)); if (recipe == null) return false; AlchemyArrayEffect newEffect = new AlchemyArrayEffectCraftingNew(recipe); - if (arrayEffect == null) - { + if (arrayEffect == null) { arrayEffect = newEffect; key = newEffect.key; - } else if (!newEffect.key.equals(key)) - { + } else if (!newEffect.key.equals(key)) { arrayEffect = newEffect; key = newEffect.key; } } - if (arrayEffect != null) - { + if (arrayEffect != null) { isActive = true; - if (arrayEffect.update(this, this.activeCounter)) - { + if (arrayEffect.update(this, this.activeCounter)) { this.decrStackSize(0, 1); this.decrStackSize(1, 1); this.getWorld().setBlockToAir(getPos()); @@ -186,20 +159,17 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public EnumFacing getRotation() - { + public EnumFacing getRotation() { return rotation; } - public void setRotation(EnumFacing rotation) - { + public void setRotation(EnumFacing rotation) { this.rotation = rotation; } @Override @SideOnly(Side.CLIENT) - public AxisAlignedBB getRenderBoundingBox() - { + public AxisAlignedBB getRenderBoundingBox() { return Block.FULL_BLOCK_AABB.offset(getPos()); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 57d7d8e1..ac701257 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -29,8 +29,7 @@ import org.apache.commons.lang3.ArrayUtils; import java.util.ArrayList; import java.util.List; -public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable -{ +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; @@ -41,43 +40,36 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public int ticksRequired = 1; public BlockPos connectedPos = BlockPos.ORIGIN; - public boolean[] blockedSlots = new boolean[] { false, false, false, false, false, false }; + public boolean[] blockedSlots = new boolean[]{false, false, false, false, false, false}; - public TileAlchemyTable() - { + public TileAlchemyTable() { super(9, "alchemyTable"); } - public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) - { + public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) { this.isSlave = isSlave; this.connectedPos = connectedPos; - if (!isSlave) - { + if (!isSlave) { this.direction = direction; } } - public boolean isInvisible() - { + public boolean isInvisible() { return isSlave(); } - public boolean isInputSlotAccessible(int slot) - { + public boolean isInputSlotAccessible(int slot) { return !(slot < 6 && slot >= 0) || !blockedSlots[slot]; } - public void toggleInputSlotAccessible(int slot) - { + public void toggleInputSlotAccessible(int slot) { if (slot < 6 && slot >= 0) blockedSlots[slot] = !blockedSlots[slot]; } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); isSlave = tag.getBoolean("isSlave"); @@ -93,8 +85,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); tag.setBoolean("isSlave", isSlave); @@ -116,19 +107,14 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, @SuppressWarnings("unchecked") @Override - public T getCapability(Capability capability, EnumFacing facing) - { - if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) - { - if (this.isSlave()) - { + public T getCapability(Capability capability, EnumFacing facing) { + if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + if (this.isSlave()) { TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) - { + if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) { return (T) tile.getCapability(capability, facing); } - } else - { + } else { return super.getCapability(capability, facing); } } @@ -137,89 +123,70 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public int[] getSlotsForFace(EnumFacing 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 }; + public int[] getSlotsForFace(EnumFacing 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, EnumFacing 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); + public boolean canInsertItem(int index, ItemStack stack, EnumFacing 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; } - } - return getAccessibleInputSlots(direction).contains(index); + 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, EnumFacing 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); + public boolean canExtractItem(int index, ItemStack stack, EnumFacing 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; } - } - return getAccessibleInputSlots(direction).contains(index); + 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(EnumFacing direction) - { + public List getAccessibleInputSlots(EnumFacing direction) { List list = new ArrayList<>(); - for (int i = 0; i < 6; i++) - { - if (isInputSlotAccessible(i)) - { + for (int i = 0; i < 6; i++) { + if (isInputSlotAccessible(i)) { list.add(i); } } @@ -228,19 +195,15 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public void update() - { - if (isSlave()) - { + public void update() { + if (isSlave()) { return; } List inputList = new ArrayList<>(); - for (int i = 0; i < 6; i++) - { - if (!getStackInSlot(i).isEmpty()) - { + for (int i = 0; i < 6; i++) { + if (!getStackInSlot(i).isEmpty()) { inputList.add(getStackInSlot(i)); } } @@ -249,31 +212,24 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, // 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 (recipe != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) { if (burnTime == 1) notifyUpdate(); - if (canCraft(recipe.getRecipeOutput(inputList))) - { + if (canCraft(recipe.getRecipeOutput(inputList))) { ticksRequired = recipe.getTicksRequired(); burnTime++; - if (burnTime == ticksRequired) - { - if (!getWorld().isRemote) - { + if (burnTime == ticksRequired) { + if (!getWorld().isRemote) { int requiredLp = recipe.getLpDrained(); - if (requiredLp > 0) - { - if (!getWorld().isRemote) - { + if (requiredLp > 0) { + if (!getWorld().isRemote) { consumeLp(requiredLp); } } - if (!getWorld().isRemote) - { + if (!getWorld().isRemote) { craftItem(inputList, recipe); } } @@ -282,34 +238,25 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, IBlockState state = getWorld().getBlockState(pos); getWorld().notifyBlockUpdate(getPos(), state, state, 3); - } else if (burnTime > ticksRequired + 10) - { + } else if (burnTime > ticksRequired + 10) { burnTime = 0; } - } else - { + } else { burnTime = 0; } - } else - { // Simple recipes + } else { // Simple recipes RecipeAlchemyTable recipeAlchemyTable = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyTable(inputList); - if (recipeAlchemyTable != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipeAlchemyTable.getMinimumTier() && getContainedLp() >= recipeAlchemyTable.getSyphon()))) - { + if (recipeAlchemyTable != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipeAlchemyTable.getMinimumTier() && getContainedLp() >= recipeAlchemyTable.getSyphon()))) { if (burnTime == 1) notifyUpdate(); - if (canCraft(recipeAlchemyTable.getOutput())) - { + if (canCraft(recipeAlchemyTable.getOutput())) { ticksRequired = recipeAlchemyTable.getTicks(); burnTime++; - if (burnTime >= ticksRequired) - { - if (!getWorld().isRemote) - { - if (recipeAlchemyTable.getSyphon() > 0) - { - if (consumeLp(recipeAlchemyTable.getSyphon()) < recipeAlchemyTable.getSyphon()) - { + 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(); @@ -330,8 +277,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, else outputSlotStack.grow(event.getOutput().getCount()); - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { ItemStack currentStack = getStackInSlot(i); if (currentStack.getItem().hasContainerItem(currentStack)) setInventorySlotContents(i, currentStack.getItem().getContainerItem(currentStack)); @@ -346,20 +292,17 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } } - } else - { + } else { burnTime = 0; } } } - public double getProgressForGui() - { + public double getProgressForGui() { return ((double) burnTime) / ticksRequired; } - private boolean canCraft(ItemStack output) - { + private boolean canCraft(ItemStack output) { ItemStack currentOutputStack = getStackInSlot(outputSlot); if (output.isEmpty()) return false; @@ -371,13 +314,10 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); } - public int getTierOfOrb() - { + public int getTierOfOrb() { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) - { - if (orbStack.getItem() instanceof IBloodOrb) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); return orb == null ? 0 : orb.getTier(); } @@ -386,16 +326,12 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public int getContainedLp() - { + public int getContainedLp() { ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) - { - if (orbStack.getItem() instanceof IBloodOrb) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { Binding binding = ((IBindable) orbStack.getItem()).getBinding(orbStack); - if (binding == null) - { + if (binding == null) { return 0; } @@ -408,11 +344,9 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void craftItem(List inputList, AlchemyTableRecipe recipe) - { + public void craftItem(List inputList, AlchemyTableRecipe recipe) { ItemStack outputStack = recipe.getRecipeOutput(inputList); - if (this.canCraft(outputStack)) - { + if (this.canCraft(outputStack)) { ItemStack currentOutputStack = getStackInSlot(outputSlot); ItemStack[] inputs = new ItemStack[0]; @@ -423,11 +357,9 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, MinecraftForge.EVENT_BUS.post(event); outputStack = event.getOutput(); - if (currentOutputStack.isEmpty()) - { + if (currentOutputStack.isEmpty()) { setInventorySlotContents(outputSlot, outputStack); - } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) - { + } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) { currentOutputStack.grow(outputStack.getCount()); } @@ -435,16 +367,12 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } - public int consumeLp(int requested) - { + 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))) - { + if (!orbStack.isEmpty()) { + if (orbStack.getItem() instanceof IBloodOrb) { + if (NetworkHelper.syphonFromContainer(orbStack, SoulTicket.item(orbStack, world, pos, requested))) { return requested; } } @@ -453,64 +381,52 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void consumeInventory(AlchemyTableRecipe recipe) - { + public void consumeInventory(AlchemyTableRecipe recipe) { ItemStack[] input = new ItemStack[6]; - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { input[i] = getStackInSlot(i); } ItemStack[] result = recipe.getRemainingItems(input); - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { setInventorySlotContents(i, result[i]); } } - public EnumFacing getDirection() - { + public EnumFacing getDirection() { return direction; } - public boolean isSlave() - { + public boolean isSlave() { return isSlave; } - public int getBurnTime() - { + public int getBurnTime() { return burnTime; } - public int getTicksRequired() - { + public int getTicksRequired() { return ticksRequired; } - public BlockPos getConnectedPos() - { + public BlockPos getConnectedPos() { return connectedPos; } - public boolean[] getBlockedSlots() - { + public boolean[] getBlockedSlots() { return blockedSlots; } - public static int getOrbSlot() - { + public static int getOrbSlot() { return orbSlot; } - public static int getToolSlot() - { + public static int getToolSlot() { return toolSlot; } - public static int getOutputSlot() - { + public static int getOutputSlot() { return outputSlot; } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index 827e31b0..9d2e5c4e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -12,8 +12,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.MathHelper; -public class TileDemonCrystal extends TileTicking -{ +public class TileDemonCrystal extends TileTicking { public static final double sameWillConversionRate = 50; public static final double defaultWillConversionRate = 100; public static final double timeDelayForWrongWill = 0.6; @@ -25,45 +24,35 @@ public class TileDemonCrystal extends TileTicking public int crystalCount = 1; public EnumFacing placement = EnumFacing.UP; //Side that this crystal is placed on. - public TileDemonCrystal() - { + public TileDemonCrystal() { this.crystalCount = 1; } @Override - public void onUpdate() - { - if (getWorld().isRemote) - { + public void onUpdate() { + if (getWorld().isRemote) { return; } internalCounter++; - if (internalCounter % 20 == 0 && crystalCount < 7) - { + if (internalCounter % 20 == 0 && crystalCount < 7) { EnumDemonWillType type = getType(); double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (type != EnumDemonWillType.DEFAULT) - { - if (value >= 0.5) - { + if (type != EnumDemonWillType.DEFAULT) { + if (value >= 0.5) { double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; - } else - { + } else { value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT); - if (value > 0.5) - { + 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) - { + } else { + if (value > 0.5) { double nextProgress = getCrystalGrowthPerSecond(value); progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; @@ -84,17 +73,14 @@ public class TileDemonCrystal extends TileTicking * 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 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) - { + public double growCrystalWithWillAmount(double willDrain, double progressPercentage) { + if (crystalCount >= 7) { return 0; } @@ -104,8 +90,7 @@ public class TileDemonCrystal extends TileTicking double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); double percentDrain = willDrain <= 0 ? 1 : Math.min(1, value / willDrain); - if (percentDrain <= 0) - { + if (percentDrain <= 0) { return 0; } @@ -118,15 +103,12 @@ public class TileDemonCrystal extends TileTicking return percentDrain * progressPercentage; } - public EnumDemonWillType getType() - { + public EnumDemonWillType getType() { return EnumDemonWillType.values()[this.getBlockMetadata()]; } - public void checkAndGrowCrystal() - { - if (progressToNextCrystal >= 1 && internalCounter % 100 == 0) - { + public void checkAndGrowCrystal() { + if (progressToNextCrystal >= 1 && internalCounter % 100 == 0) { progressToNextCrystal--; crystalCount++; markDirty(); @@ -134,20 +116,16 @@ public class TileDemonCrystal extends TileTicking } } - public double getMaxWillForCrystal() - { + public double getMaxWillForCrystal() { return 50; } - public boolean dropSingleCrystal() - { - if (!getWorld().isRemote && crystalCount > 1) - { + public boolean dropSingleCrystal() { + if (!getWorld().isRemote && crystalCount > 1) { IBlockState state = getWorld().getBlockState(pos); EnumDemonWillType type = state.getValue(BlockDemonCrystal.TYPE); ItemStack stack = BlockDemonCrystal.getItemStackDropped(type, 1); - if (!stack.isEmpty()) - { + if (!stack.isEmpty()) { crystalCount--; InventoryHelper.spawnItemStack(getWorld(), pos.getX(), pos.getY(), pos.getZ(), stack); notifyUpdate(); @@ -158,19 +136,16 @@ public class TileDemonCrystal extends TileTicking return false; } - public double getCrystalGrowthPerSecond(double will) - { + public double getCrystalGrowthPerSecond(double will) { return 1.0 / 200 * Math.sqrt(will / 200); } - public int getCrystalCountForRender() - { + public int getCrystalCountForRender() { return MathHelper.clamp(crystalCount - 1, 0, 6); } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { holder.readFromNBT(tag, "Will"); crystalCount = tag.getInteger("crystalCount"); placement = EnumFacing.byIndex(tag.getInteger("placement")); @@ -178,8 +153,7 @@ public class TileDemonCrystal extends TileTicking } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { holder.writeToNBT(tag, "Will"); tag.setInteger("crystalCount", crystalCount); tag.setInteger("placement", placement.getIndex()); @@ -187,23 +161,19 @@ public class TileDemonCrystal extends TileTicking return tag; } - public int getCrystalCount() - { + public int getCrystalCount() { return crystalCount; } - public void setCrystalCount(int crystalCount) - { + public void setCrystalCount(int crystalCount) { this.crystalCount = crystalCount; } - public EnumFacing getPlacement() - { + public EnumFacing getPlacement() { return placement; } - public void setPlacement(EnumFacing placement) - { + public void setPlacement(EnumFacing placement) { this.placement = placement; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index 0fd56f0c..e462b767 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -11,8 +11,7 @@ import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.soul.IDemonWillConduit; import WayofTime.bloodmagic.tile.base.TileTicking; -public class TileDemonCrystallizer extends TileTicking implements IDemonWillConduit -{ +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; @@ -21,16 +20,13 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond public DemonWillHolder holder = new DemonWillHolder(); public double internalCounter = 0; - public TileDemonCrystallizer() - { + public TileDemonCrystallizer() { } @Override - public void onUpdate() - { - if (getWorld().isRemote) - { + public void onUpdate() { + if (getWorld().isRemote) { return; } @@ -39,15 +35,11 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond { EnumDemonWillType highestType = WorldDemonWillHandler.getHighestDemonWillType(getWorld(), pos); double amount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, highestType); - if (amount >= willToFormCrystal) - { + if (amount >= willToFormCrystal) { internalCounter += getCrystalFormationRate(amount); - if (internalCounter >= totalFormationTime) - { - if (WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) - { - if (formCrystal(highestType, offsetPos)) - { + 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; } @@ -57,12 +49,10 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } } - public boolean formCrystal(EnumDemonWillType type, BlockPos position) - { + 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) - { + if (tile instanceof TileDemonCrystal) { ((TileDemonCrystal) tile).setPlacement(EnumFacing.UP); return true; } @@ -70,21 +60,18 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond return false; } - public double getCrystalFormationRate(double currentWill) - { + public double getCrystalFormationRate(double currentWill) { return 1; } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { holder.readFromNBT(tag, "Will"); internalCounter = tag.getDouble("internalCounter"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { holder.writeToNBT(tag, "Will"); tag.setDouble("internalCounter", internalCounter); return tag; @@ -93,26 +80,21 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond // IDemonWillConduit @Override - public int getWeight() - { + public int getWeight() { return 10; } @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) - { - if (amount <= 0) - { + public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { + if (amount <= 0) { return 0; } - if (!canFill(type)) - { + if (!canFill(type)) { return 0; } - if (!doFill) - { + if (!doFill) { return Math.min(maxWill - holder.getWill(type), amount); } @@ -120,17 +102,14 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) - { + public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { double drained = amount; double current = holder.getWill(type); - if (current < drained) - { + if (current < drained) { drained = current; } - if (doDrain) - { + if (doDrain) { return holder.drainWill(type, amount); } @@ -138,20 +117,17 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public boolean canFill(EnumDemonWillType type) - { + public boolean canFill(EnumDemonWillType type) { return true; } @Override - public boolean canDrain(EnumDemonWillType type) - { + public boolean canDrain(EnumDemonWillType type) { return true; } @Override - public double getCurrentWill(EnumDemonWillType type) - { + public double getCurrentWill(EnumDemonWillType type) { return holder.getWill(type); } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index 11b80f2e..ea0558b6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -42,7 +42,7 @@ public class TileMimic extends TileInventory implements ITickable { public NBTTagCompound tileTag = new NBTTagCompound(); public TileEntity mimicedTile = null; IBlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); - + public int playerCheckRadius = 5; public int potionSpawnRadius = 5; public int potionSpawnInterval = 40; @@ -137,7 +137,7 @@ public class TileMimic extends TileInventory implements ITickable { Utils.insertItemToTile(this, player, 0); ItemStack stack = getStackInSlot(0); - if(stateOfReplacedBlock == Blocks.AIR.getDefaultState()) { + if (stateOfReplacedBlock == Blocks.AIR.getDefaultState()) { if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); stateOfReplacedBlock = block.getDefaultState(); @@ -273,7 +273,7 @@ public class TileMimic extends TileInventory implements ITickable { tag.setInteger("playerCheckRadius", playerCheckRadius); tag.setInteger("potionSpawnRadius", potionSpawnRadius); tag.setInteger("potionSpawnInterval", potionSpawnInterval); - tag.setString("stateOfReplacedBlock",stateOfReplacedBlock.toString()); + tag.setString("stateOfReplacedBlock", stateOfReplacedBlock.toString()); return tag; } @@ -296,11 +296,11 @@ public class TileMimic extends TileInventory implements ITickable { public IBlockState getReplacedState() { return stateOfReplacedBlock; } - + public void setReplacedState(IBlockState state) { stateOfReplacedBlock = state; } - + @Override public boolean isItemValidForSlot(int slot, ItemStack itemstack) { return slot == 0 && dropItemsOnBreak; @@ -312,7 +312,7 @@ public class TileMimic extends TileInventory implements ITickable { replaceMimicWithBlockActual(world, pos, mimic.getStackInSlot(0), mimic.tileTag, mimic.stateOfReplacedBlock); } - + public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, IBlockState replacementState) { if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index c1d2007f..fc9552ad 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -29,7 +29,7 @@ public class TilePhantomBlock extends TileTicking { @Override public void onUpdate() { - if(!world.isRemote) { + if (!world.isRemote) { EntityPlayer player = world.getClosestPlayer(getPos().getX(), getPos().getY(), getPos().getZ(), 10.0D, ItemSigilPhantomBridge.IS_PHANTOM_ACTIVE); if (player != null && !player.isSneaking()) return; diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index 51318fdc..afbb3410 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -16,8 +16,7 @@ import net.minecraft.world.World; import java.util.*; import java.util.Map.Entry; -public class TileMasterRoutingNode extends TileInventory implements IMasterRoutingNode, ITickable -{ +public class TileMasterRoutingNode extends TileInventory implements IMasterRoutingNode, ITickable { public static final int tickRate = 20; private int currentInput; // A list of connections @@ -26,16 +25,13 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti private List outputNodeList = new LinkedList<>(); private List inputNodeList = new LinkedList<>(); - public TileMasterRoutingNode() - { + public TileMasterRoutingNode() { super(0, "masterRoutingNode"); } @Override - public void update() - { - if (!getWorld().isRemote) - { + public void update() { + if (!getWorld().isRemote) { // currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); currentInput = getWorld().getStrongPower(pos); @@ -50,31 +46,23 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti Map> outputMap = new TreeMap<>(); Map> outputFluidMap = new TreeMap<>(); - for (BlockPos outputPos : outputNodeList) - { + for (BlockPos outputPos : outputNodeList) { TileEntity outputTile = getWorld().getTileEntity(outputPos); - if (this.isConnected(new LinkedList<>(), outputPos)) - { - if (outputTile instanceof IOutputItemRoutingNode) - { + if (this.isConnected(new LinkedList<>(), outputPos)) { + if (outputTile instanceof IOutputItemRoutingNode) { IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) { continue; } IItemFilter filter = outputNode.getOutputFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) - { + if (outputMap.containsKey(priority)) { outputMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList<>(); filterList.add(filter); outputMap.put(priority, filterList); @@ -83,26 +71,20 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - if (outputTile instanceof IOutputFluidRoutingNode) - { + if (outputTile instanceof IOutputFluidRoutingNode) { IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) { continue; } IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = outputNode.getPriority(facing); - if (outputFluidMap.containsKey(priority)) - { + if (outputFluidMap.containsKey(priority)) { outputFluidMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList<>(); filterList.add(filter); outputFluidMap.put(priority, filterList); @@ -116,31 +98,23 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti Map> inputMap = new TreeMap<>(); Map> inputFluidMap = new TreeMap<>(); - for (BlockPos inputPos : inputNodeList) - { + for (BlockPos inputPos : inputNodeList) { TileEntity inputTile = getWorld().getTileEntity(inputPos); - if (this.isConnected(new LinkedList<>(), inputPos)) - { - if (inputTile instanceof IInputItemRoutingNode) - { + if (this.isConnected(new LinkedList<>(), inputPos)) { + if (inputTile instanceof IInputItemRoutingNode) { IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) { continue; } IItemFilter filter = inputNode.getInputFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) - { + if (inputMap.containsKey(priority)) { inputMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList<>(); filterList.add(filter); inputMap.put(priority, filterList); @@ -149,26 +123,20 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - if (inputTile instanceof IInputFluidRoutingNode) - { + if (inputTile instanceof IInputFluidRoutingNode) { IInputFluidRoutingNode inputNode = (IInputFluidRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) - { + for (EnumFacing facing : EnumFacing.VALUES) { + if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) { continue; } IFluidFilter filter = inputNode.getInputFluidFilterForSide(facing); - if (filter != null) - { + if (filter != null) { int priority = inputNode.getPriority(facing); - if (inputFluidMap.containsKey(priority)) - { + if (inputFluidMap.containsKey(priority)) { inputFluidMap.get(priority).add(filter); - } else - { + } else { List filterList = new LinkedList<>(); filterList.add(filter); inputFluidMap.put(priority, filterList); @@ -182,19 +150,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT)); int maxFluidTransfer = 1000; - for (Entry> outputEntry : outputMap.entrySet()) - { + for (Entry> outputEntry : outputMap.entrySet()) { List outputList = outputEntry.getValue(); - for (IItemFilter outputFilter : outputList) - { - for (Entry> inputEntry : inputMap.entrySet()) - { + for (IItemFilter outputFilter : outputList) { + for (Entry> inputEntry : inputMap.entrySet()) { List inputList = inputEntry.getValue(); - for (IItemFilter inputFilter : inputList) - { + for (IItemFilter inputFilter : inputList) { maxTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxTransfer); - if (maxTransfer <= 0) - { + if (maxTransfer <= 0) { return; } } @@ -202,19 +165,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - for (Entry> outputEntry : outputFluidMap.entrySet()) - { + for (Entry> outputEntry : outputFluidMap.entrySet()) { List outputList = outputEntry.getValue(); - for (IFluidFilter outputFilter : outputList) - { - for (Entry> inputEntry : inputFluidMap.entrySet()) - { + for (IFluidFilter outputFilter : outputList) { + for (Entry> inputEntry : inputFluidMap.entrySet()) { List inputList = inputEntry.getValue(); - for (IFluidFilter inputFilter : inputList) - { + for (IFluidFilter inputFilter : inputList) { maxFluidTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxFluidTransfer); - if (maxFluidTransfer <= 0) - { + if (maxFluidTransfer <= 0) { return; } } @@ -223,18 +181,15 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } - public int getMaxTransferForDemonWill(double will) - { + public int getMaxTransferForDemonWill(double will) { return 64; } @Override - public NBTTagCompound serialize(NBTTagCompound tag) - { + public NBTTagCompound serialize(NBTTagCompound tag) { super.serialize(tag); NBTTagList tags = new NBTTagList(); - for (BlockPos pos : generalNodeList) - { + for (BlockPos pos : generalNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -244,8 +199,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti tag.setTag(Constants.NBT.ROUTING_MASTER_GENERAL, tags); tags = new NBTTagList(); - for (BlockPos pos : inputNodeList) - { + for (BlockPos pos : inputNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -255,8 +209,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti tag.setTag(Constants.NBT.ROUTING_MASTER_INPUT, tags); tags = new NBTTagList(); - for (BlockPos pos : outputNodeList) - { + for (BlockPos pos : outputNodeList) { NBTTagCompound posTag = new NBTTagCompound(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); @@ -268,29 +221,25 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void deserialize(NBTTagCompound tag) - { + public void deserialize(NBTTagCompound tag) { super.deserialize(tag); NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); generalNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_INPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); inputNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) - { + for (int i = 0; i < tags.tagCount(); i++) { NBTTagCompound blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); outputNodeList.add(newPos); @@ -298,16 +247,14 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public boolean isConnected(List path, BlockPos nodePos) - { + 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)) - { + if (!(tile instanceof IRoutingNode)) { // connectionMap.remove(nodePos); return false; } @@ -316,22 +263,17 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti List connectionList = node.getConnected(); // List testPath = path.subList(0, path.size()); path.add(nodePos); - for (BlockPos testPos : connectionList) - { - if (path.contains(testPos)) - { + for (BlockPos testPos : connectionList) { + if (path.contains(testPos)) { continue; } - if (testPos.equals(this.getPos()) && node.isConnectionEnabled(testPos)) - { + 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)) - { + } else if (NodeHelper.isNodeConnectionEnabled(getWorld(), node, testPos)) { + if (isConnected(path, testPos)) { // path.clear(); // path.addAll(testPath); return true; @@ -343,56 +285,44 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public boolean isConnectionEnabled(BlockPos testPos) - { + public boolean isConnectionEnabled(BlockPos testPos) { return currentInput <= 0; } @Override - public void addNodeToList(IRoutingNode node) - { + public void addNodeToList(IRoutingNode node) { BlockPos newPos = node.getBlockPos(); - if (!generalNodeList.contains(newPos)) - { + if (!generalNodeList.contains(newPos)) { generalNodeList.add(newPos); } - if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) - { + if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) { inputNodeList.add(newPos); } - if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) - { + if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) { outputNodeList.add(newPos); } } @Override - public void addConnections(BlockPos pos, List connectionList) - { - for (BlockPos testPos : connectionList) - { + 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)) - { + public void addConnection(BlockPos pos1, BlockPos pos2) { + if (connectionMap.containsKey(pos1) && !connectionMap.get(pos1).contains(pos2)) { connectionMap.get(pos1).add(pos2); - } else - { + } else { List list = new LinkedList<>(); list.add(pos2); connectionMap.put(pos1, list); } - if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) - { + if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) { connectionMap.get(pos2).add(pos1); - } else - { + } else { List list = new LinkedList<>(); list.add(pos1); connectionMap.put(pos2, list); @@ -400,84 +330,69 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void removeConnection(BlockPos pos1, BlockPos pos2) - { - if (connectionMap.containsKey(pos1)) - { + public void removeConnection(BlockPos pos1, BlockPos pos2) { + if (connectionMap.containsKey(pos1)) { List posList = connectionMap.get(pos1); posList.remove(pos2); - if (posList.isEmpty()) - { + if (posList.isEmpty()) { connectionMap.remove(pos1); } } - if (connectionMap.containsKey(pos2)) - { + if (connectionMap.containsKey(pos2)) { List posList = connectionMap.get(pos2); posList.remove(pos1); - if (posList.isEmpty()) - { + if (posList.isEmpty()) { connectionMap.remove(pos2); } } } @Override - public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) - { + public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) { return; } @Override - public BlockPos getBlockPos() - { + public BlockPos getBlockPos() { return this.getPos(); } @Override - public List getConnected() - { + public List getConnected() { return new LinkedList<>(); } @Override - public BlockPos getMasterPos() - { + public BlockPos getMasterPos() { return this.getPos(); } @Override - public boolean isMaster(IMasterRoutingNode master) - { + public boolean isMaster(IMasterRoutingNode master) { return false; } @Override - public void addConnection(BlockPos pos1) - { + public void addConnection(BlockPos pos1) { // Empty } @Override - public void removeConnection(BlockPos pos1) - { + public void removeConnection(BlockPos pos1) { generalNodeList.remove(pos1); inputNodeList.remove(pos1); outputNodeList.remove(pos1); } @Override - public void removeAllConnections() - { + public void removeAllConnections() { List list = generalNodeList.subList(0, generalNodeList.size()); Iterator itr = list.iterator(); - while (itr.hasNext()) - { + while (itr.hasNext()) { BlockPos testPos = itr.next(); TileEntity tile = getWorld().getTileEntity(testPos); - if (tile instanceof IRoutingNode) - { + if (tile instanceof IRoutingNode) { ((IRoutingNode) tile).removeConnection(pos); getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(testPos), getWorld().getBlockState(testPos), 3); } diff --git a/src/main/java/WayofTime/bloodmagic/util/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java index b368bf9c..7e5eb83f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -7,10 +7,8 @@ import net.minecraftforge.fml.common.registry.ForgeRegistries; import java.util.Locale; -public class Constants -{ - public static class NBT - { +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"; @@ -133,13 +131,11 @@ public class Constants public static final String BREATH = "breath"; } - public static class Mod - { + public static class Mod { public static final String DOMAIN = BloodMagic.MODID.toLowerCase(Locale.ENGLISH) + ":"; } - public static final class Gui - { + 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; @@ -148,8 +144,7 @@ public class Constants public static final int SIGIL_HOLDING_GUI = 5; } - public static class Compat - { + 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"; @@ -166,8 +161,7 @@ public class Constants public static final Item THAUMCRAFT_GOGGLES = ForgeRegistries.ITEMS.getValue(new ResourceLocation("Thaumcraft", "goggles")); } - public static class Misc - { + 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; diff --git a/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java b/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java index 920b21de..f035728e 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java +++ b/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java @@ -5,8 +5,10 @@ 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/PluginUtil.java b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java index aeed6037..1297d964 100644 --- a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java @@ -45,7 +45,7 @@ public class PluginUtil { // Bring core plugin up to top discoveredAnnotations.sort((o1, o2) -> { if (o1.getLeft().getClass() == BloodMagicCorePlugin.class) - return -1; + return -1; return o1.getClass().getCanonicalName().compareToIgnoreCase(o2.getClass().getCanonicalName()); }); @@ -120,8 +120,7 @@ public class PluginUtil { public enum RegistrationStep { PLUGIN_REGISTER(p -> p.getLeft().register(BloodMagicAPI.INSTANCE)), - RECIPE_REGISTER(p -> p.getLeft().registerRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar())) - ; + RECIPE_REGISTER(p -> p.getLeft().registerRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar())); private final Consumer> consumer; 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 fda8d9da..bcd12000 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -360,7 +360,7 @@ public class GenericHandler { 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. + // 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); @@ -419,9 +419,9 @@ public class GenericHandler { } @SubscribeEvent - public static void onRitualDeath(LivingDropsEvent event){ - if(!ConfigHandler.values.wellOfSufferingDrops){ - if(event.getSource().equals(RitualManager.RITUAL_DAMAGE)) { + public static void onRitualDeath(LivingDropsEvent event) { + if (!ConfigHandler.values.wellOfSufferingDrops) { + if (event.getSource().equals(RitualManager.RITUAL_DAMAGE)) { event.getDrops().clear(); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 6a701a0f..447fffa0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -45,31 +45,24 @@ import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class LivingArmourHandler -{ +public class LivingArmourHandler { @SubscribeEvent - public static void onEntityHealed(LivingHealEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public static void onEntityHealed(LivingHealEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntity(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { double modifier = 1; LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.slowHeal", chestStack); - if (upgrade instanceof LivingArmourUpgradeSlowHeal) - { + if (upgrade instanceof LivingArmourUpgradeSlowHeal) { modifier *= ((LivingArmourUpgradeSlowHeal) upgrade).getHealingModifier(); } - if (modifier != 1) - { + if (modifier != 1) { event.setAmount((float) (event.getAmount() * modifier)); } } @@ -78,23 +71,18 @@ public class LivingArmourHandler } @SubscribeEvent - public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) - { + public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { double modifier = 1; - for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) - { + for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) { modifier *= upgrade.getMiningSpeedModifier(player); } - if (modifier != 1) - { + if (modifier != 1) { event.setNewSpeed((float) (event.getOriginalSpeed() * modifier)); } } @@ -103,31 +91,24 @@ public class LivingArmourHandler // Applies: Storm Trooper @SubscribeEvent - public static void onEntityJoinedWorld(EntityJoinWorldEvent event) - { + public static void onEntityJoinedWorld(EntityJoinWorldEvent event) { Entity owner = null; - if (event.getEntity() instanceof EntityArrow) - { + if (event.getEntity() instanceof EntityArrow) { owner = ((EntityArrow) event.getEntity()).shootingEntity; - } else if (event.getEntity() instanceof EntityThrowable) - { + } else if (event.getEntity() instanceof EntityThrowable) { owner = ((EntityThrowable) event.getEntity()).getThrower(); } - if (owner instanceof EntityPlayer) - { + if (owner instanceof EntityPlayer) { Entity projectile = event.getEntity(); EntityPlayer player = (EntityPlayer) owner; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stormTrooper", chestStack); - if (upgrade instanceof LivingArmourUpgradeStormTrooper) - { + 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; @@ -140,37 +121,28 @@ public class LivingArmourHandler } @SubscribeEvent - public static void onPlayerClick(PlayerInteractEvent event) - { - if (event.isCancelable()) - { + public static void onPlayerClick(PlayerInteractEvent event) { + if (event.isCancelable()) { EntityPlayer player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { - if (event.getHand() == EnumHand.OFF_HAND) - { + if (armour != null) { + if (event.getHand() == EnumHand.OFF_HAND) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.crippledArm", chestStack); - if (upgrade instanceof LivingArmourUpgradeCrippledArm) - { + if (upgrade instanceof LivingArmourUpgradeCrippledArm) { event.setCanceled(true); } } - if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) - { + if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) { ItemStack drinkStack = event.getItemStack(); - if (!(drinkStack.getItem() instanceof ItemSplashPotion)) - { + if (!(drinkStack.getItem() instanceof ItemSplashPotion)) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); - if (upgrade instanceof LivingArmourUpgradeQuenched) - { + if (upgrade instanceof LivingArmourUpgradeQuenched) { event.setCanceled(true); } } @@ -182,24 +154,19 @@ public class LivingArmourHandler // Applies: Grim Reaper @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onEntityDeath(LivingDeathEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public static void onEntityDeath(LivingDeathEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerGrimReaperSprint.incrementCounter(armour); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.grimReaper", chestStack); - if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) - { + if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) { ((LivingArmourUpgradeGrimReaperSprint) upgrade).applyEffectOnRebirth(player); event.setCanceled(true); event.setResult(Event.Result.DENY); @@ -213,26 +180,20 @@ public class LivingArmourHandler // Applies: Jump @SubscribeEvent - public static void onJumpEvent(LivingEvent.LivingJumpEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public static void onJumpEvent(LivingEvent.LivingJumpEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerJump.incrementCounter(armour); - if (!player.isSneaking()) - { + if (!player.isSneaking()) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.jump", chestStack); - if (upgrade instanceof LivingArmourUpgradeJump) - { + if (upgrade instanceof LivingArmourUpgradeJump) { player.motionY += ((LivingArmourUpgradeJump) upgrade).getJumpModifier(); } } @@ -243,34 +204,25 @@ public class LivingArmourHandler // Applies: Step Assist, Speed Boost @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { + public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); boolean hasAssist = false; - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) - { + if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { hasAssist = true; player.stepHeight = Constants.Misc.ALTERED_STEP_HEIGHT; - } else - { - if (LivingArmour.hasFullSet(player)) - { + } else { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stepAssist", chestStack); - if (upgrade instanceof LivingArmourUpgradeStepAssist) - { - if (!player.isSneaking()) - { + if (upgrade instanceof LivingArmourUpgradeStepAssist) { + if (!player.isSneaking()) { player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); hasAssist = true; - } else - { + } else { player.stepHeight = 0.6F; } } @@ -283,31 +235,26 @@ public class LivingArmourHandler float percentIncrease = 0; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) - { + if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.movement", chestStack); - if (upgrade instanceof LivingArmourUpgradeSpeed) - { + if (upgrade instanceof LivingArmourUpgradeSpeed) { percentIncrease += ((LivingArmourUpgradeSpeed) upgrade).getSpeedModifier(); } } } - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) - { + 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)) - { + 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); } } @@ -316,8 +263,7 @@ public class LivingArmourHandler // Applies: Arrow Shot // Tracks: Arrow Shot @SubscribeEvent - public static void onArrowFire(ArrowLooseEvent event) - { + public static void onArrowFire(ArrowLooseEvent event) { World world = event.getEntityPlayer().getEntityWorld(); ItemStack stack = event.getBow(); EntityPlayer player = event.getEntityPlayer(); @@ -326,17 +272,14 @@ public class LivingArmourHandler if (world.isRemote) return; - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerArrowShot.incrementCounter(armour); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.arrowShot", chestStack); - if (upgrade instanceof LivingArmourUpgradeArrowShot) - { + if (upgrade instanceof LivingArmourUpgradeArrowShot) { int charge = event.getCharge(); float velocity = (float) charge / 20.0F; velocity = (velocity * velocity + velocity * 2.0F) / 3.0F; @@ -350,8 +293,7 @@ public class LivingArmourHandler sentientShot = true; } int extraArrows = ((LivingArmourUpgradeArrowShot) upgrade).getExtraArrows(); - for (int n = 0; n < extraArrows; n++) - { + for (int n = 0; n < extraArrows; n++) { ItemStack arrowStack = new ItemStack(Items.ARROW); ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); EntityArrow entityarrow; @@ -392,21 +334,19 @@ public class LivingArmourHandler } } } - } + } + // Applies: Softfall @SubscribeEvent public static void onPlayerFall(LivingFallEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) - { + if (event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (LivingArmour.hasFullSet(player)) - { + if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { + if (armour != null) { StatTrackerFallProtect.incrementCounter(armour, event.getDamageMultiplier() * (event.getDistance() - 3)); LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.fallProtect", chestStack); if (upgrade instanceof LivingArmourUpgradeFallProtect) { @@ -417,17 +357,14 @@ public class LivingArmourHandler } } } - + // Applies: Arrow Shot @SubscribeEvent - public static void onProjectileImpact(ProjectileImpactEvent.Arrow event) - { - if (event.getArrow().removeTag("arrow_shot")) - { + public static void onProjectileImpact(ProjectileImpactEvent.Arrow event) { + if (event.getArrow().removeTag("arrow_shot")) { Entity entity = event.getRayTraceResult().entityHit; - if (entity != null) - { + if (entity != null) { entity.hurtResistantTime = 0; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java index 559690ee..5059d631 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java @@ -21,7 +21,7 @@ public class IncenseHelper { data.setDouble(Constants.NBT.CURRENT_INCENSE, amount); } - public static void setMaxIncense(EntityPlayer player, double amount){ + public static void setMaxIncense(EntityPlayer player, double amount) { NBTTagCompound data = player.getEntityData(); data.setDouble(Constants.NBT.MAX_INCENSE, amount); } @@ -38,6 +38,7 @@ public class IncenseHelper { 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); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index bd79a435..c87b8209 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -115,12 +115,11 @@ public class NetworkHelper { /** * Syphons a player from within a container. * - * @param stack - ItemStack in the Container. - * @param ticket - SoulTicket to syphon + * @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) - { + public static boolean syphonFromContainer(ItemStack stack, SoulTicket ticket) { if (!(stack.getItem() instanceof IBindable)) return false; @@ -131,7 +130,7 @@ public class NetworkHelper { 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(); } /** diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java index 1fc54b05..6498132d 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java @@ -35,7 +35,7 @@ public class PlayerSacrificeHelper { amount = amount + Math.min(increment, incenseAddition - amount); setPlayerIncense(player, amount); - if(amount == incenseAddition) { + if (amount == incenseAddition) { IncenseHelper.setMaxIncense(player, incenseAddition); } // System.out.println("Amount of incense: " + amount + ", Increment: " + From f832103386b9afbc9a5a47ecd795abfda9f74e76 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 14 Apr 2019 08:23:02 -0700 Subject: [PATCH 408/595] Fix state parsing (#1573) --- .../WayofTime/bloodmagic/util/StateUtil.java | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/StateUtil.java b/src/main/java/WayofTime/bloodmagic/util/StateUtil.java index 03dce756..5c3d35b9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/StateUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/StateUtil.java @@ -8,30 +8,31 @@ import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; -public class StateUtil -{ - public static IBlockState parseState(String blockInfo) - { - String[] split = blockInfo.split("\\["); - split[1] = split[1].substring(0, split[1].lastIndexOf("]")); // Make sure brackets are removed from state +public class StateUtil { + public static IBlockState 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])); // Find the block - if (block == Blocks.AIR) - return Blocks.AIR.getDefaultState(); // The block is air, so we're looking at invalid data + Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(split[0])); + if (block == Blocks.AIR) + return block.getDefaultState(); - BlockStateContainer blockState = block.getBlockState(); - IBlockState returnState = blockState.getBaseState(); + BlockStateContainer blockState = block.getBlockState(); + IBlockState 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("="); // Separates property and value - IProperty property = blockState.getProperty(valueSplit[0]); - if (property != null) - returnState = returnState.withProperty(property, (Comparable) property.parseValue(valueSplit[1]).get()); // Force the property into the state + // 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(); } - - return returnState; } } \ No newline at end of file From eec64695b5e0f21d3df237aee07d8be628d4bd9c Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 14 Apr 2019 08:28:46 -0700 Subject: [PATCH 409/595] Fix Blood Letter's Pack and Coat of Arms passing the wrong hand (#1582) --- .../WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java | 4 ++-- .../WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index 2033e618..9c01900b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -44,13 +44,13 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I RayTraceResult rayTrace = this.rayTrace(world, player, false); if (rayTrace == null) { - return super.onItemRightClick(world, player, EnumHand.MAIN_HAND); + 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, EnumHand.MAIN_HAND); + return super.onItemRightClick(world, player, hand); LPContainer.tryAndFillAltar((IBloodAltar) tile, stack, world, rayTrace.getBlockPos()); } diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index 15508082..cc15fe1f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -60,13 +60,13 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato RayTraceResult position = this.rayTrace(world, player, false); if (position == null) { - return super.onItemRightClick(world, player, EnumHand.MAIN_HAND); + 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, EnumHand.MAIN_HAND); + return super.onItemRightClick(world, player, hand); LPContainer.tryAndFillAltar((IBloodAltar) tile, stack, world, position.getBlockPos()); } From 7c767b3bbf13805b7a9e180cbd19b702f2e16371 Mon Sep 17 00:00:00 2001 From: Phil Date: Sun, 14 Apr 2019 11:29:51 -0400 Subject: [PATCH 410/595] Stop insertions into Demon Crucible if the inventory is not empty (#1567) --- src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index 7685e0fc..52ff0be5 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -204,7 +204,7 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo @Override public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) { - return !stack.isEmpty() && (stack.getItem() instanceof IDemonWillGem || stack.getItem() instanceof IDiscreteDemonWill); + return !stack.isEmpty() && inventory.get(0).isEmpty() && (stack.getItem() instanceof IDemonWillGem || stack.getItem() instanceof IDiscreteDemonWill); } @Override From 572d8eff4f44bfc89e7f4b6219b03a5b4d58dac8 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Sun, 14 Apr 2019 15:38:17 +0000 Subject: [PATCH 411/595] Possible fix to (many of the) abnormal death events concerning the sacrificial Dagger (#1554) * Possible fix to (many of the) abnormal death events concerning the sacrifical dagger. => #1444 Works with Grim Reaper's Sprint, not tested for anything else. * Being special, players can survive massive blood loss up until 1 heart remains. (Math.floor() caused players to die when they sacrificed with 3 health remaining) --- .../bloodmagic/item/ItemSacrificialDagger.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 5410758f..a67cbced 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -94,14 +94,16 @@ public class ItemSacrificialDagger extends ItemEnum Date: Sun, 14 Apr 2019 08:48:47 -0700 Subject: [PATCH 412/595] Fix incompatibility with Unmending mod (#1566) --- .../bloodmagic/util/handler/event/GenericHandler.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 bcd12000..d1431db8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -78,6 +78,7 @@ 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.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -433,10 +434,12 @@ public class GenericHandler { EntityPlayer player = event.getEntityPlayer(); ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); - 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 (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) { From f997aee8917176d39d92bd80aea1ff6cbcc452fb Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 14 Apr 2019 08:49:26 -0700 Subject: [PATCH 413/595] Fix crash on world unload Don't know how to reproduce, but this will make sure we don't call clear on null --- .../util/handler/event/GenericHandler.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 d1431db8..7d094f3e 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -475,11 +475,11 @@ public class GenericHandler { @SubscribeEvent public static void onWorldUnload(WorldEvent.Unload event) { World world = event.getWorld(); - bounceMapMap.get(world).clear(); - filledHandMapMap.get(world).clear(); - attackTaskMapMap.get(world).clear(); - targetTaskMapMap.get(world).clear(); - PotionEventHandlers.flightListMap.get(world).clear(); - PotionEventHandlers.noGravityListMap.get(world).clear(); + bounceMapMap.getOrDefault(world, Collections.emptyMap()).clear(); + filledHandMapMap.getOrDefault(world, Collections.emptyMap()).clear(); + attackTaskMapMap.getOrDefault(world, Collections.emptyMap()).clear(); + targetTaskMapMap.getOrDefault(world, Collections.emptyMap()).clear(); + PotionEventHandlers.flightListMap.getOrDefault(world, Collections.emptyList()).clear(); + PotionEventHandlers.noGravityListMap.getOrDefault(world, Collections.emptyList()).clear(); } } From 73d2459c6c92f53a71e5504a383d22c7d74abae7 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 14 Apr 2019 08:59:21 -0700 Subject: [PATCH 414/595] angery --- .../WayofTime/bloodmagic/util/handler/event/GenericHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7d094f3e..09416dcf 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -434,7 +434,7 @@ public class GenericHandler { EntityPlayer player = event.getEntityPlayer(); ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); - if (Loader.isModLoaded("unmending")) { + if (!Loader.isModLoaded("unmending")) { if (!itemstack.isEmpty() && itemstack.isItemDamaged()) { int i = Math.min(xpToDurability(event.getOrb().xpValue), itemstack.getItemDamage()); event.getOrb().xpValue -= durabilityToXp(i); From 21f3b9047cd238d045df61c94866e3e62d74f2c9 Mon Sep 17 00:00:00 2001 From: Tobias Gremeyer Date: Thu, 25 Apr 2019 07:09:15 +0000 Subject: [PATCH 415/595] Made teleposers a bit more foolproof (#1592) Fixed an issue where a teleposer that somehow got filled with nasty items would crash on tick because the teleposer throws a fit at that nasty item. --- src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index d3c7caf3..b9d665e8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -49,7 +49,7 @@ public class TileTeleposer extends TileInventory implements ITickable { @Override public void update() { - if (!getWorld().isRemote) { + if (!getWorld().isRemote && canInitiateTeleport()) { int currentInput = getWorld().getStrongPower(pos); if (previousInput == 0 && currentInput != 0) { From 0090ec0a567b71a83ec329db8ab58d070f90efc6 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 19 May 2019 15:03:49 +0000 Subject: [PATCH 416/595] Lava will not replaced with lava anymore unless it's flowing lava. (#1599) * Lava will not replaced with lava anymore unless it's flowing lava. * Fixed Flowing Liquid detection * Removed unnecessary function arguments --- .../WayofTime/bloodmagic/ritual/types/RitualLava.java | 10 +++++----- src/main/java/WayofTime/bloodmagic/util/Utils.java | 10 ++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index d9c67d1a..2bddc06b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; 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.state.IBlockState; import net.minecraft.entity.EntityLivingBase; @@ -85,7 +85,7 @@ public class RitualLava extends Ritual { for (BlockPos newPos : lavaRange.getContainedPositions(pos)) { IBlockState state = world.getBlockState(newPos); - if (world.isAirBlock(newPos) || Utils.isFlowingLiquid(world, newPos, state)) { + if (world.isAirBlock(newPos) || Utils.isFlowingLiquid(state)) { int lpCost = getLPCostForRawWill(rawWill); if (currentEssence < lpCost) { break; diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 90f1d312..26a42fa4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,16 +1,15 @@ package WayofTime.bloodmagic.util; import WayofTime.bloodmagic.altar.ComponentType; -import WayofTime.bloodmagic.iface.IDemonWillViewer; -import WayofTime.bloodmagic.util.helper.NBTHelper; 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.BlockLiquid; import net.minecraft.block.BlockPortal; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; @@ -42,7 +41,6 @@ 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.fml.relauncher.ReflectionHelper; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; @@ -799,9 +797,9 @@ public class Utils { return (state instanceof IFluidBlock || state.getMaterial().isLiquid()); } - public static boolean isFlowingLiquid(World world, BlockPos pos, IBlockState state) { + public static boolean isFlowingLiquid(IBlockState state) { Block block = state.getBlock(); - return ((block instanceof IFluidBlock && Math.abs(((IFluidBlock) block).getFilledPercentage(world, pos)) == 1) || (block instanceof BlockLiquid && block.getMetaFromState(state) != 0)); + return isBlockLiquid(state) && !(state == block.getDefaultState()); } public static boolean spawnStackAtBlock(World world, BlockPos pos, @Nullable EnumFacing pushDirection, ItemStack stack) { From bf35baac77363fa5ccd06134ef89258a78b230ad Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 19 May 2019 15:34:04 +0000 Subject: [PATCH 417/595] Improved Compression Sigil performance & fixed leftover eating bug (#1603) * Performance improvements, small cleanup * Moved the saved stacks to class scope to have an actual effect. * Variable scope change (no effect) * Saving known recipes to a Map in CompressionRegistry now, allowing quick lookup as long as the server has not been restarted for all but the first compression recipe of every itemstack type encountered. Fixed compression process consuming items even though the compression would not finish. --- .../compress/AdvancedCompressionHandler.java | 96 +++--------- .../compress/CompressionHandler.java | 23 ++- .../compress/CompressionRegistry.java | 22 ++- .../compress/StorageBlockCraftingManager.java | 146 ++++++++++-------- 4 files changed, 135 insertions(+), 152 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java index b5d78913..e2dc02d1 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java @@ -1,86 +1,12 @@ package WayofTime.bloodmagic.compress; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.Tuple; import net.minecraft.world.World; public class AdvancedCompressionHandler extends CompressionHandler { - private static InventoryCrafting[] inventoryCrafting = { - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, - 3, 3), - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, - 2, 2), - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, - 1, 1) - - }; - - private static ItemStack reversibleCheck; - - 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 = StorageBlockCraftingManager.getInstance(); - InventoryCrafting 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; - } - return ItemStack.EMPTY; - } - - public static ItemStack getNNRecipeOutput(InventoryCrafting 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 ItemStack compressInventory(ItemStack[] inv, World world) { for (ItemStack invStack : inv) { if (invStack.isEmpty()) { @@ -88,12 +14,26 @@ public class AdvancedCompressionHandler extends CompressionHandler { } for (int i = 3; i >= 2; i--) { - reversibleCheck = invStack; - ItemStack stack = getRecipe(invStack, world, 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, invStack.getMaxStackSize() - needed, inv, needed, true); // if more than needed gets consumed at any point, the simulate test was needed after all + int remaining = iterateThroughInventory(invStack, CompressionRegistry.getItemThreshold(invStack, needed), inv, needed, true); if (remaining <= 0) return stack; } diff --git a/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java index 2cd74d14..715a7b19 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java @@ -3,6 +3,9 @@ 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 @@ -14,7 +17,9 @@ public abstract class CompressionHandler { 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++; @@ -31,26 +36,32 @@ public abstract class CompressionHandler { used += stackSize - remainingFromStack; } - kept -= used; // 0 + kept -= used; if (kept <= 0 && needed > 0) { int remainingFromStack = Math.max(stackSize - used - needed, 0); - if (doDrain) { + 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; } } - - needed -= (stackSize - used - remainingFromStack); } - if (needed <= 0) { return 0; } } } - return needed; diff --git a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java index 8c10fa3a..fb1de055 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java @@ -3,6 +3,7 @@ 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; @@ -18,8 +19,9 @@ import java.util.Map; * form. */ public class CompressionRegistry { - public static List compressionRegistry = new ArrayList<>(); + 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); @@ -77,10 +79,24 @@ public class CompressionRegistry { return Pair.of(ItemStack.EMPTY, false); } - public static int getItemThreshold(ItemStack stack) { - return stack.getItem().getItemStackLimit(stack); //this should work according to the guide, leaving behind a full stack of the source item (unless otherwise specified with a BaseCompressionHandler recipe) + + 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())); } diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index cfe039c1..71b6120e 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -6,15 +6,89 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; 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.LinkedList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; public class StorageBlockCraftingManager { private static final StorageBlockCraftingManager instance = new StorageBlockCraftingManager(); - private List recipes = new LinkedList<>(); + private static InventoryCrafting[] inventoryCrafting = { + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, + 3, 3), + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, + 2, 2), + new InventoryCrafting(new Container() { + public boolean canInteractWith(EntityPlayer 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; + } + InventoryCrafting 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(InventoryCrafting 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); @@ -32,7 +106,7 @@ public class StorageBlockCraftingManager { return this.findMatchingRecipe(craftingInventory, world, this.recipes); } - private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, List list) { + private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, HashSet list) { int i = 0; ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack1 = ItemStack.EMPTY; @@ -67,11 +141,10 @@ public class StorageBlockCraftingManager { return new ItemStack(itemstack.getItem(), 1, i1); } else { - for (j = 0; j < list.size(); ++j) { - IRecipe irecipe = list.get(j); + for (IRecipe iRecipe : list) { - if (irecipe.matches(craftingInventory, world)) { - return irecipe.getCraftingResult(craftingInventory); + if (iRecipe.matches(craftingInventory, world)) { + return iRecipe.getCraftingResult(craftingInventory); } } @@ -83,62 +156,5 @@ public class StorageBlockCraftingManager { return instance; } - private static boolean isResultStackReversible(ItemStack stack, int gridSize, World world, List list) { - if (stack.isEmpty()) { - return false; - } - InventoryCrafting inventory = new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, 2, 2); - inventory.setInventorySlotContents(0, stack); - - ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); - if (returnStack.isEmpty()) { - return false; - } - - ItemStack compressedStack = ItemStack.EMPTY; - switch (gridSize) { - case 2: - compressedStack = get22Recipe(returnStack, world, list); - break; - case 3: - compressedStack = get33Recipe(returnStack, world, list); - break; - } - - return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack); - } - - private static ItemStack getRecipe(ItemStack stack, World world, int gridSize, List list) { - InventoryCrafting inventory = new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { - return false; - } - }, gridSize, gridSize); - for (int i = 0; i < inventory.getSizeInventory(); i++) { - inventory.setInventorySlotContents(i, stack); - } - - return StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world, list); - } - - private static boolean has22Recipe(ItemStack stack, World world, List list) { - return !get22Recipe(stack, world, list).isEmpty(); - } - - private static ItemStack get22Recipe(ItemStack stack, World world, List list) { - return getRecipe(stack, world, 2, list); - } - - private static boolean has33Recipe(ItemStack stack, World world, List list) { - return !get33Recipe(stack, world, list).isEmpty(); - } - - private static ItemStack get33Recipe(ItemStack stack, World world, List list) { - return getRecipe(stack, world, 3, list); - } } From 7f5a5a24ff3238dbf7211d2ed75d9f7e10aa9ba3 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 19 May 2019 15:35:38 +0000 Subject: [PATCH 418/595] Veil of Evil & Ward of Sacrosanctity (#1578) * Veil of Evil class creation Signed-off-by: tobias * Transplanted legacy code. * VeilOfEvil and WardOfSacrosanctity base finished. Added isActive() to IMasterRitualStone * Renaming, commented out arimethric error * make it static to make it work * removed sout & renamed rituals * Finished up base Veil of Evil & Ward of Sacrosanctity. Temporarily removed Gaia's Transformation. --- .../compat/guideapi/book/CategoryRitual.java | 2 + .../bloodmagic/ritual/IMasterRitualStone.java | 2 + .../ritual/types/RitualVeilOfEvil.java | 102 +++++++++++++++++ .../types/RitualWardOfSacrosanctity.java | 105 ++++++++++++++++++ .../util/handler/event/GenericHandler.java | 83 ++++++++++++++ .../assets/bloodmagic/lang/en_US.lang | 2 + .../assets/bloodmagicguide/lang/en_US.lang | 12 +- 7 files changed, 304 insertions(+), 4 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java create mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java index d94d2717..35a2adb3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java @@ -131,6 +131,8 @@ public class CategoryRitual addRitualPagesToEntries("condor", entries); addRitualPagesToEntries("featheredEarth", entries); addRitualPagesToEntries("grounding", entries); + addRitualPagesToEntries("veilOfEvil", entries); + addRitualPagesToEntries("wardOfSacrosanctity", entries); for (Entry entry : entries.entrySet()) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index 6ed5924b..1ce20d8b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -33,6 +33,8 @@ public interface IMasterRitualStone { void setCooldown(int cooldown); + boolean isActive(); + void setActive(boolean active); EnumFacing getDirection(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java new file mode 100644 index 00000000..df962827 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java @@ -0,0 +1,102 @@ +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 new file mode 100644 index 00000000..8e631f4c --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java @@ -0,0 +1,105 @@ +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/util/handler/event/GenericHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java index 09416dcf..30479efe 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -30,8 +30,11 @@ 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; @@ -73,6 +76,7 @@ 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; @@ -80,6 +84,7 @@ import net.minecraftforge.event.world.ExplosionEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.Loader; 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; @@ -94,6 +99,8 @@ public class GenericHandler { 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 @@ -461,6 +468,80 @@ public class GenericHandler { return durability / 2; } + // VeilOfEvil, WardOfSacrosanctity + @SubscribeEvent + public static void onLivingSpawnEvent(LivingSpawnEvent.CheckSpawn event) { + World world = event.getWorld(); + + if (!(event.getEntityLiving() instanceof EntityMob)) { + 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(); + System.out.println("found a map"); + + if (masterRitualStone != null && masterRitualStone.isActive() && masterRitualStone.getCurrentRitual() instanceof RitualVeilOfEvil) { + System.out.println("is active"); + if (blockRange.offset(masterRitualStone.getBlockPos()).isWithinArea(new BlockPos(event.getX(), event.getY(), event.getZ()))) { + System.out.println("is in"); + 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(); @@ -468,6 +549,8 @@ public class GenericHandler { 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<>()); } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index f5cc5ff4..2ee80af3 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -623,6 +623,8 @@ 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. diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index 4107efc8..eb1d180a 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -66,15 +66,17 @@ 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.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.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! @@ -84,7 +86,7 @@ guide.bloodmagic.entry.ritual.magnetism.info=The Ritual of Magnetism is the brea 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.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. @@ -112,7 +114,9 @@ guide.bloodmagic.entry.ritual.fullStomach.info=##REQ-LORE##\n\t The Ritual of th 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\ŧ 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.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 From a5a5899b7cc8b31757e97f6d7ba77517df64094b Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 19 May 2019 15:36:05 +0000 Subject: [PATCH 419/595] Fixed `/bloodmagic network get` not having a network to get from, (#1604) added translation keys for tickethistory --- .../command/sub/SubCommandNetwork.java | 16 +++++++--------- .../resources/assets/bloodmagic/lang/en_US.lang | 4 +++- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 1cf0b421..236d3014 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -85,11 +85,11 @@ public class SubCommandNetwork extends CommandTreeBase { @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 TextComponentTranslation(getHelp())); + return; + } if (!getName().equals("get")) { - if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { - sender.sendMessage(new TextComponentTranslation(getHelp())); - return; - } this.player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); this.uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); this.network = NetworkHelper.getSoulNetwork(uuid); @@ -164,11 +164,9 @@ public class SubCommandNetwork extends CommandTreeBase { @Override public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { - sender.sendMessage(new TextComponentTranslation(getHelp())); - return; - } 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 TextComponentString((player != sender ? player.getDisplayName().getFormattedText() + " " : "" + new TextComponentTranslation("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence()).getFormattedText()))); } } @@ -216,7 +214,7 @@ public class SubCommandNetwork extends CommandTreeBase { @Override public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { List tickethistory = network.getTicketHistory(); - if (tickethistory.isEmpty()) + if (!tickethistory.isEmpty()) for (SoulTicket i : network.getTicketHistory()) sender.sendMessage(i.getDescription()); sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success", player.getDisplayName().getFormattedText())); diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 2ee80af3..0d4c026d 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -832,6 +832,7 @@ commands.bloodmagic.help.help=Displays the help information for the "/bloodmagic 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] @@ -850,7 +851,8 @@ 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. From 39f1ac0c7dbb07a38c91a5d3904090d8d95115d4 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 19 May 2019 15:37:21 +0000 Subject: [PATCH 420/595] Added JEI recipes for repairing Sentient Tools & Living Armor (#1606) * Added sentient tool repair recipes to JEI. * Added living armor repair recipes to JEI. --- .../compat/jei/BloodMagicJEIPlugin.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index dce7a1c2..2384c305 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -34,9 +34,15 @@ 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 net.minecraft.item.ItemStack; import javax.annotation.Nonnull; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; import java.util.Map; @JEIPlugin @@ -58,6 +64,8 @@ public class BloodMagicJEIPlugin implements IModPlugin { registry.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyRecipes(), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); registry.addRecipes(AlchemyTableRecipeRegistry.getRecipeList(), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); + registry.addRecipes(getAnvilRecipes(), VanillaRecipeCategoryUid.ANVIL); + 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); @@ -127,4 +135,98 @@ public class BloodMagicJEIPlugin implements IModPlugin { 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; + } } From 6420c2635e92c99345a163f0ddd9fd62d8ae599f Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 19 May 2019 09:04:20 -0700 Subject: [PATCH 421/595] Fix tough palms being trainable without an altar nearby (#1588) *When using an empowered sacrificial dagger --- .../util/helper/PlayerSacrificeHelper.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java index 6498132d..54ceea6a 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java @@ -66,11 +66,15 @@ public class PlayerSacrificeHelper { float sacrificedHealth = health - maxHealth / 10.0f; int lpAdded = (int) (sacrificedHealth * ConfigHandler.values.sacrificialDaggerConversion * getModifier(amount)); - SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, (int) sacrificedHealth, lpAdded); - if (MinecraftForge.EVENT_BUS.post(evt)) - return false; + 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; + + altar.sacrificialDaggerCall(evt.lpAdded, false); + altar.startCycle(); - if (findAndFillAltar(player.getEntityWorld(), player, evt.lpAdded, false)) { player.setHealth(maxHealth / 10.0f); setPlayerIncense(player, 0); player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, soulFrayDuration)); From f87a63ba995b5747054a57eb6d3c2f309477ce20 Mon Sep 17 00:00:00 2001 From: Big Energy Date: Sun, 19 May 2019 19:23:49 +0300 Subject: [PATCH 422/595] Add russian guide book (#1607) * Create tussian guide book * Delete English phrases --- .../assets/bloodmagicguide/lang/ru_RU.lang | 239 ++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang diff --git a/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang b/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang new file mode 100644 index 00000000..236db6e7 --- /dev/null +++ b/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang @@ -0,0 +1,239 @@ +# 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Следует отметить, что как только начнетÑÑ Ñффект, вÑе Ñлементы, иÑпользуемые Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ маÑÑива, будут потерÑны. From 28057bd3f6dde04ca20a8c2decab273203dd2d68 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 19 May 2019 09:40:48 -0700 Subject: [PATCH 423/595] Fix sigil of holding saving data to the wrong inventory tag (#1584) --- .../bloodmagic/item/sigil/ItemSigilHolding.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index b3fb15da..7238a07d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -131,10 +131,10 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl public void saveInventory(ItemStack itemStack, List inventory) { NBTTagCompound itemTag = itemStack.getTagCompound(); - if (itemTag == null) { - itemStack.setTagCompound(new NBTTagCompound()); - } + if (itemTag == null) + itemStack.setTagCompound(itemTag = new NBTTagCompound()); + NBTTagCompound inventoryTag = new NBTTagCompound(); NBTTagList itemList = new NBTTagList(); for (int i = 0; i < inventorySize; i++) { @@ -146,7 +146,8 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } } - itemTag.setTag(Constants.NBT.ITEMS, itemList); + inventoryTag.setTag(Constants.NBT.ITEMS, itemList); + itemTag.setTag(Constants.NBT.ITEM_INVENTORY, inventoryTag); } @Override @@ -246,7 +247,8 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl return NonNullList.withSize(inventorySize, ItemStack.EMPTY); } - NBTTagList tagList = tagCompound.getTagList(Constants.NBT.ITEMS, 10); + NBTTagCompound inventoryTag = tagCompound.getCompoundTag(Constants.NBT.ITEM_INVENTORY); + NBTTagList tagList = inventoryTag.getTagList(Constants.NBT.ITEMS, 10); if (tagList.isEmpty()) { return NonNullList.withSize(inventorySize, ItemStack.EMPTY); From 1d52a137d51ffb8019185735bef0e19a5a568719 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 19 May 2019 16:59:25 +0000 Subject: [PATCH 424/595] Added getHeight() to AreaDescriptor, Jumping power modifyable (#1608) --- .../bloodmagic/ritual/AreaDescriptor.java | 20 +++++++++++++++++++ .../ritual/types/RitualJumping.java | 7 +++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java index b6bcdd7d..b6f5dc83 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java @@ -41,6 +41,8 @@ public abstract class AreaDescriptor implements Iterator { public abstract int getVolume(); + public abstract int getHeight(); + public abstract boolean isWithinRange(int verticalLimit, int horizontalLimit); /** @@ -115,6 +117,11 @@ public abstract class AreaDescriptor implements Iterator { return tempAABB.offset(pos.getX(), pos.getY(), pos.getZ()); } + @Override + public int getHeight() { + return this.maximumOffset.getY() - this.minimumOffset.getY(); + } + /** * Sets the offsets of the AreaDescriptor in a safe way that will make * minimumOffset the lowest corner @@ -270,6 +277,13 @@ public abstract class AreaDescriptor implements Iterator { blockPosCache = new ArrayList<>(); } + + @Override + public int getHeight() { + return this.radius * 2; + } + + @Override public List getContainedPositions(BlockPos pos) { if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { @@ -403,6 +417,12 @@ public abstract class AreaDescriptor implements Iterator { this.blockPosCache = new ArrayList<>(); } + @Override + public int getHeight() { + return this.size * 2 + 1; + } + + @Override public List getContainedPositions(BlockPos pos) { if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java index 0321bd79..d38f2085 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java @@ -14,11 +14,14 @@ 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 @@ -41,7 +44,7 @@ public class RitualJumping extends Ritual { break; } - double motionY = 1.5; + double motionY = masterRitualStone.getBlockRange(JUMP_POWER).getHeight() * 0.3; entity.fallDistance = 0; if (entity.isSneaking()) { @@ -66,7 +69,7 @@ public class RitualJumping extends Ritual { @Override public int getRefreshCost() { - return 5; + return getBlockRange(JUMP_POWER).getHeight(); } @Override From 1250f1015ef45308192881d4e5698b7cdb2934d1 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 19 May 2019 17:06:01 +0000 Subject: [PATCH 425/595] Changelog. (#1601) * Changelog. Some stuff still pending. * "Unbending" mod has been renamed to "Unmending" * Clarifications & Formatting * Update * Added Compression Sigil PR * Update changelog.txt * Added Network command PR change * Added JEI Recipes PR * Update changelog.txt * Removed empty bugfix category. From V2.0.0 * Update changelog.txt * Moved pending PR texts, added RitualJumping PR text, bumped version number * forgot version number * Remove pending merges --- changelog.txt | 59 ++++++++++++++++++++++++++++++++++++++++++++++- gradle.properties | 2 +- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/changelog.txt b/changelog.txt index 0595047d..11ab26ad 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,60 @@ +------------------------------------------------------ +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 + + +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 ------------------------------------------------------ @@ -1107,4 +1164,4 @@ Changed - 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 -- \ No newline at end of file +- diff --git a/gradle.properties b/gradle.properties index 0e38a009..21145a3d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.4.0 +mod_version=2.4.1 mc_version=1.12.2 forge_version=14.23.5.2808 curse_id=224791 From f34a89efa77ca3dd93fa6ff577d2c63c541c7e10 Mon Sep 17 00:00:00 2001 From: Tobias Date: Wed, 7 Aug 2019 17:29:38 +0200 Subject: [PATCH 426/595] Level 4 StormTrooper downgrade to correctly cost -65 upgrade points (was 65) (#1631) --- .../livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java index 5f9ed0fa..61252106 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java @@ -8,7 +8,7 @@ import net.minecraft.nbt.NBTTagCompound; 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 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) { From a6a5704a42e158995b563154d2ca8fe9a50f40f6 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 11 Aug 2019 20:49:30 +0200 Subject: [PATCH 427/595] Removed overseen debug print statements from Rituals veil of evel & ward of sacrosanctity (#1639) --- .../bloodmagic/util/handler/event/GenericHandler.java | 3 --- 1 file changed, 3 deletions(-) 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 30479efe..e2548df8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -517,12 +517,9 @@ public class GenericHandler { for (Map.Entry entry : fMap.entrySet()) { IMasterRitualStone masterRitualStone = entry.getKey(); AreaDescriptor blockRange = entry.getValue(); - System.out.println("found a map"); if (masterRitualStone != null && masterRitualStone.isActive() && masterRitualStone.getCurrentRitual() instanceof RitualVeilOfEvil) { - System.out.println("is active"); if (blockRange.offset(masterRitualStone.getBlockPos()).isWithinArea(new BlockPos(event.getX(), event.getY(), event.getZ()))) { - System.out.println("is in"); switch (event.getResult()) { case DEFAULT: event.setResult(Result.ALLOW); From cbefc14f72f7dcc7bfdba2fafdde6dab14f42268 Mon Sep 17 00:00:00 2001 From: Tobias Date: Wed, 4 Sep 2019 17:38:42 +0200 Subject: [PATCH 428/595] Fixes `/bloodmagic network` command permissions required for executing the command. (#1613) Inheriting from CommandTreeBase, the required permission level was 4. All other BloodMagic commands had a required permission level of 2. This resulted in network command not able to be executed from a Command Block, which have a permission level of 2. --- .../WayofTime/bloodmagic/command/sub/SubCommandNetwork.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index 236d3014..ff1038c8 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -50,6 +50,11 @@ public class SubCommandNetwork extends CommandTreeBase { 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) From 65870682960ea4b4ecd6499895ba6c84a6c8b7d1 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Wed, 4 Sep 2019 17:39:25 +0200 Subject: [PATCH 429/595] Fix GLSL shader compilation with certain graphics drivers (fixes #1325) (#1624) --- src/main/resources/assets/bloodmagic/shaders/beam-broken.frag | 2 +- src/main/resources/assets/bloodmagic/shaders/beam.frag | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag b/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag index 63693c95..e3b2e255 100644 --- a/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag +++ b/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag @@ -4,7 +4,7 @@ void main() { vec2 texcoord = vec2(gl_TexCoord[0]); vec4 color = texture2D(bgl_RenderedTexture, texcoord); - float r = sin(texcoord.x * 6 - 1.5 + sin(texcoord.y - time / 3.0)) * 1.1; //(sin((texcoord.x - texcoord.y) * 4 - time) + 1) / 2; + 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 index 62741dfc..2ccc5dcd 100644 --- a/src/main/resources/assets/bloodmagic/shaders/beam.frag +++ b/src/main/resources/assets/bloodmagic/shaders/beam.frag @@ -5,8 +5,8 @@ vec2 texcoord = vec2(gl_TexCoord[0]); vec4 color = texture2D(bgl_RenderedTexture, texcoord); - float gs = (color.r + color.g + color.b) / 3; - float r = sin(texcoord.x * 6 - 1.5 + sin(texcoord.y - time / 3.0)) * 1.1; //(sin((texcoord.x - texcoord.y) * 4 - time) + 1) / 2; + 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); } From 3cdf4517a80253c419d6db94370c78a69edb37a4 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 03:38:52 +0200 Subject: [PATCH 430/595] Fixed some black magic that occurred when a mob was summoned in a world that was loaded but didn't have a list entry that is supposed to be generated on world load. (#1618) --- .../bloodmagic/potion/PotionEventHandlers.java | 5 +++-- .../util/handler/event/GenericHandler.java | 12 ++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index 18d12e9c..a2805904 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -3,6 +3,7 @@ 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.EntityLivingBase; import net.minecraft.entity.IProjectile; @@ -55,7 +56,7 @@ public class PotionEventHandlers { @SubscribeEvent public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { EntityLivingBase eventEntityLiving = event.getEntityLiving(); - List flightList = flightListMap.get(eventEntityLiving.getEntityWorld()); + List flightList = flightListMap.getOrDefault(eventEntityLiving.getEntityWorld(), Lists.newArrayList()); if (eventEntityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) eventEntityLiving; @@ -91,7 +92,7 @@ public class PotionEventHandlers { // } // } // } - List noGravityList = noGravityListMap.get(event.getEntityLiving().getEntityWorld()); + List noGravityList = noGravityListMap.getOrDefault(event.getEntityLiving().getEntityWorld(), Lists.newArrayList()); if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.SUSPENDED) && !eventEntityLiving.hasNoGravity()) { eventEntityLiving.setNoGravity(true); noGravityList.add(eventEntityLiving); 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 e2548df8..9a2c457d 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -555,11 +555,11 @@ public class GenericHandler { @SubscribeEvent public static void onWorldUnload(WorldEvent.Unload event) { World world = event.getWorld(); - bounceMapMap.getOrDefault(world, Collections.emptyMap()).clear(); - filledHandMapMap.getOrDefault(world, Collections.emptyMap()).clear(); - attackTaskMapMap.getOrDefault(world, Collections.emptyMap()).clear(); - targetTaskMapMap.getOrDefault(world, Collections.emptyMap()).clear(); - PotionEventHandlers.flightListMap.getOrDefault(world, Collections.emptyList()).clear(); - PotionEventHandlers.noGravityListMap.getOrDefault(world, Collections.emptyList()).clear(); + bounceMapMap.remove(world); + filledHandMapMap.remove(world); + attackTaskMapMap.remove(world); + targetTaskMapMap.remove(world); + PotionEventHandlers.flightListMap.remove(world); + PotionEventHandlers.noGravityListMap.remove(world); } } From 97d4967d3116ce6bc58c7a1340ae6766d75a95b2 Mon Sep 17 00:00:00 2001 From: Sam Kirby Date: Thu, 5 Sep 2019 03:39:54 +0200 Subject: [PATCH 431/595] Fixes for Ritual of the Eternal Soul (#1633) * Fixes for Ritual of the Eternal Soul * Use the same code to determine altar location and only cache its offset as is done in Well of Suffering. This prevents keeping a TileEntity loaded after it has been removed from the world, and also means the ritual will function if there are multiple master ritual stones using it in the world. * Use getCapability to obtain the BloodAltar which implements IFluidHandler, and fill that instead of trying to fill the tile entity. * Change the structure to match that found in previous versions. * Set owner HP to 2 (1 heart) if within ritual vincinity. * Add Soul Fray to every player in the vincinity of the ritual. --- .../ritual/types/RitualEternalSoul.java | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java index 01ff6e08..e2b668a1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java @@ -1,17 +1,21 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.IBloodAltar; +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.EntityPlayer; +import net.minecraft.potion.PotionEffect; +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.IFluidHandler; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import java.util.List; import java.util.UUID; @@ -19,12 +23,15 @@ import java.util.function.Consumer; @RitualRegister("eternal_soul") public class RitualEternalSoul extends Ritual { + public static final String ALTAR_RANGE = "altar"; - - private IBloodAltar altar = null; + 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 @@ -33,20 +40,29 @@ public class RitualEternalSoul extends Ritual { int currentEssence = NetworkHelper.getSoulNetwork(owner).getCurrentEssence(); World world = masterRitualStone.getWorldObj(); BlockPos pos = masterRitualStone.getBlockPos(); + BlockPos altarPos = pos.add(altarOffsetPos); - if (this.altar == null) { - for (int i = -5; i <= 5; i++) { - for (int j = -5; j <= 5; j++) { - for (int k = -10; k <= 10; k++) { - if (world.getTileEntity(new BlockPos(pos.getX() + i, pos.getY() + j, pos.getZ() + k)) instanceof IBloodAltar) { - this.altar = (IBloodAltar) world.getTileEntity(new BlockPos(pos.getX() + i, pos.getY() + j, pos.getZ() + k)); - } - } + 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 (!(this.altar instanceof IFluidHandler)) + + if (!(tile instanceof TileAltar)) { return; + } + + BloodAltar altar = (BloodAltar) tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null); int horizontalRange = 15; int verticalRange = 20; @@ -54,21 +70,20 @@ public class RitualEternalSoul extends Ritual { List list = world.getEntitiesWithinAABB(EntityPlayer.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(horizontalRange, verticalRange, horizontalRange).expand(0, -verticalRange, 0)); - EntityPlayer entityOwner = null; - for (EntityPlayer player : list) { - if (PlayerHelper.getUUIDFromPlayer(player) == owner) - entityOwner = player; - } + EntityPlayer entityOwner = PlayerHelper.getPlayerFromUUID(owner); - int fillAmount = Math.min(currentEssence / 2, ((IFluidHandler) this.altar).fill(new FluidStack(BlockLifeEssence.getLifeEssence(), 10000), false)); + int fillAmount = Math.min(currentEssence / 2, altar.fill(new FluidStack(BlockLifeEssence.getLifeEssence(), 10000), false)); - ((IFluidHandler) this.altar).fill(new FluidStack(BlockLifeEssence.getLifeEssence(), fillAmount), true); + altar.fill(new FluidStack(BlockLifeEssence.getLifeEssence(), fillAmount), true); - if (entityOwner != null && entityOwner.getHealth() > 2.0f && fillAmount != 0) + if (entityOwner != null && list.contains(entityOwner) && entityOwner.getHealth() > 2.0f && fillAmount != 0) entityOwner.setHealth(2.0f); + for (EntityPlayer player : list) + player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, 100)); + masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(fillAmount * 2)); } @@ -86,7 +101,7 @@ public class RitualEternalSoul extends Ritual { @Override public void gatherComponents(Consumer components) { - addCornerRunes(components, 0, 1, EnumRuneType.FIRE); + addCornerRunes(components, 1, 0, EnumRuneType.FIRE); for (int i = 0; i < 4; i++) { addCornerRunes(components, 2, i, EnumRuneType.AIR); From 845ca65cabc419c22b88bcc5922d5a562b08f926 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 03:48:54 +0200 Subject: [PATCH 432/595] Changed SoundType and visible Material of wooden path blocks from stone/rock to wood (#1638) * Changed SoundType and visible Material of wooden path blocks from stone/rock to wood. Breaking wooden path blocks is now effective & faster with an axe and slow with a pickaxe type tool. * Moved hacky to getter. * Cleanup unneeded override * Using Enums instead of meta IDs --- .../WayofTime/bloodmagic/block/BlockPath.java | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java index 779c1389..fc60a3b5 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -9,10 +9,12 @@ import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; 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 { @@ -26,14 +28,14 @@ public class BlockPath extends BlockEnum implements IIncensePath { setResistance(5.0F); setSoundType(SoundType.STONE); - setHarvestLevel("axe", 0, getStateFromMeta(0)); - setHarvestLevel("axe", 0, getStateFromMeta(1)); - setHarvestLevel("pickaxe", 0, getStateFromMeta(2)); - setHarvestLevel("pickaxe", 0, getStateFromMeta(3)); - setHarvestLevel("pickaxe", 0, getStateFromMeta(4)); - setHarvestLevel("pickaxe", 0, getStateFromMeta(5)); - setHarvestLevel("pickaxe", 3, getStateFromMeta(6)); - setHarvestLevel("pickaxe", 3, getStateFromMeta(7)); + 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 @@ -42,6 +44,24 @@ public class BlockPath extends BlockEnum implements IIncensePath { super.addInformation(stack, world, tooltip, tooltipFlag); } + @Override + public Material getMaterial(IBlockState 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(IBlockState 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, IBlockState state) { switch (this.getMetaFromState(state)) { From 0cbaa13cfcdede86f5fee09345462b3c428d7767 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 03:49:05 +0200 Subject: [PATCH 433/595] Some fixes to the German translation because of the translation keys got changed. (#1640) * Some fixes to the German translation because of the translation keys got changed. Added chapter title translation to newly documented rituals but not the chapters itself. * Changed Tartaric Gem translation from "Weinstein" -> "Tartarisches Juwel" --- .../assets/bloodmagic/lang/de_DE.lang | 149 +++++++++--------- .../assets/bloodmagicguide/lang/de_DE.lang | 26 ++- 2 files changed, 100 insertions(+), 75 deletions(-) diff --git a/src/main/resources/assets/bloodmagic/lang/de_DE.lang b/src/main/resources/assets/bloodmagic/lang/de_DE.lang index db60bfb1..c6627a6c 100644 --- a/src/main/resources/assets/bloodmagic/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagic/lang/de_DE.lang @@ -1,20 +1,18 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=Blood Magic +# Creative Tab itemGroup.bloodmagic.creativeTabTome=Blood Magic - Upgrades -#Items -item.bloodmagic.activationCrystal.weak.name=Schwacher Aktivierungskristall -item.bloodmagic.activationCrystal.awakened.name=Erweckter Aktivierungskristall -item.bloodmagic.activationCrystal.creative.name=Kreativer Aktivierungskristall +# Items -item.bloodmagic.sacrificialDagger.normal.name=Opferdolch -item.bloodmagic.sacrificialDagger.creative.name=Kreativer Opferdolch 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 @@ -63,19 +61,21 @@ item.bloodmagic.reagent.virtus.name=Virtus item.bloodmagic.reagent.reductus.name=Reductus item.bloodmagic.reagent.potentia.name=Potentia -item.bloodmagic.bloodShard.weak.name=Schwache Blutscherbe -item.bloodmagic.bloodShard.demon.name=Dämonische Blutscherbe +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.reagentWater.name=Wasserreagenz -item.bloodmagic.baseComponent.reagentLava.name=Lavareagenz -item.bloodmagic.baseComponent.reagentAir.name=Luftreagenz -item.bloodmagic.baseComponent.reagentFastMiner.name=Reagenz der Eile -item.bloodmagic.baseComponent.reagentVoid.name=Reagenz der Leere -item.bloodmagic.baseComponent.reagentGrowth.name=Wachstumsreagenz -item.bloodmagic.baseComponent.reagentAffinity.name=Reagenz der elementaren Verbundenheit -item.bloodmagic.baseComponent.reagentSight.name=Sichtreagenz -item.bloodmagic.baseComponent.reagentBinding.name=Bindendes Reagenz -item.bloodmagic.baseComponent.reagentSuppression.name=Verdrängendes Reagenz +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 @@ -110,29 +110,23 @@ item.bloodmagic.demonCrystal.destructive.name=Kristall zerstörender dämonische item.bloodmagic.demonCrystal.vengeful.name=Kristall rachsüchtiger dämonischer Willenskraft item.bloodmagic.demonCrystal.steadfast.name=Kristall standhafter dämonischer Willenskraft -item.bloodmagic.monsterSoul.base.name=Dämonische 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.bloodLight.name=Siegel der Blutlampe 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.greenGrove.name=Siegel des grünen Hains -item.bloodmagic.sigil.elementalAffinity.name=Siegel der elementaren Verbundenheit 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.fastMiner.name=Siegel des Eile item.bloodmagic.sigil.seer.name=Siegel des Sehers -item.bloodmagic.sigil.phantomBridge.name=Siegel der Phantombrücke item.bloodmagic.sigil.whirlwind.name=Siegel des Wirbelwindes -item.bloodmagic.sigil.enderSeverance.name=Siegel des Endertrennens item.bloodmagic.sigil.holding.name=Siegel der Aufbewahrung item.bloodmagic.sigil.holding.display=&r%s: &o&n%s item.bloodmagic.sigil.teleposition.name=Telepositionssiegel @@ -140,6 +134,12 @@ 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 @@ -152,6 +152,7 @@ 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] @@ -162,7 +163,6 @@ 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 @@ -196,6 +196,14 @@ 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 @@ -207,13 +215,13 @@ 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.selfSacrifice.name=Rune der Selbstopferung tile.bloodmagic.rune.displacement.name=Rune der Verlagerung tile.bloodmagic.rune.capacity.name=Kapazitätsrune -tile.bloodmagic.rune.augCapacity.name=Rune der erweiterten Kapazität 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 @@ -223,13 +231,8 @@ tile.bloodmagic.ritualStone.air.name=Luftritualstein tile.bloodmagic.ritualStone.dusk.name=Abenddämmerungsritualstein tile.bloodmagic.ritualStone.dawn.name=Morgendämmerungsritualstein -tile.bloodmagic.bloodstonebrick.large.name=Großer Blutsteinziegel -tile.bloodmagic.bloodstonebrick.brick.name=Blutsteinziegel -tile.bloodmagic.crystal.large.name=Kristallklumpen -tile.bloodmagic.crystal.brick.name=Kristallklumpenziegel tile.bloodmagic.bloodLight.name=Blutlampe tile.bloodmagic.spectralBlock.name=Spektralblock -tile.bloodmagic.phantomBlock.name=Phantomblock tile.bloodmagic.incenseAltar.name=Räucheraltar tile.bloodmagic.teleposer.name=Teleposer @@ -374,6 +377,9 @@ 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- @@ -387,10 +393,14 @@ 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.bloodLight.desc=&oIch sehe ein Licht! 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 @@ -400,11 +410,9 @@ 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.greenGrove.desc=&oUmweltverträglich 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.fastMiner.desc=&oHacke wie ein Weltmeister 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 @@ -416,14 +424,17 @@ 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.phantomBridge.desc=&oLaufen auf dünner Luft... tooltip.bloodmagic.sigil.whirlwind.desc=&oBesser keinen Rock tragen -tooltip.bloodmagic.sigil.enderSeverance.desc=&oBringt Endermen in Notlage 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. @@ -441,9 +452,6 @@ tooltip.bloodmagic.pack.selfSacrifice.desc=Es scheuert richtig... tooltip.bloodmagic.pack.sacrifice.desc=Beschreibung tooltip.bloodmagic.pack.stored=Enthält: %d LP -tooltip.bloodmagic.activationCrystal.weak=Aktiviert niedrig-levelige Rituale -tooltip.bloodmagic.activationCrystal.awakened=Aktiviert mächtigere Rituale -tooltip.bloodmagic.activationCrystal.creative=Kreativmodus: Aktiviert jedes Ritual tooltip.bloodmagic.diviner.currentRitual=Ritual: tooltip.bloodmagic.diviner.blankRune=Leere Runen: %d @@ -470,6 +478,7 @@ 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 @@ -518,7 +527,6 @@ 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 @@ -615,6 +623,12 @@ 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. @@ -660,6 +674,14 @@ ritual.bloodmagic.animalGrowthRitual.steadfast.info=(Standhaft) Züchtet Erwachs 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. @@ -745,6 +767,8 @@ ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=Anders als meine Brüder 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 @@ -786,6 +810,9 @@ chat.bloodmagic.mimic.detectRadius.down=Spieler-Erfassungsradius wurde verringer 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 @@ -794,9 +821,8 @@ entity.bloodmagic.Mimic.name=Mimik 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.404=Befehl nicht gefunden! -commands.bloodmagic.error.unknown=Unbekannter Befehl! -commands.bloodmagic.error.perm=Du hast keine Berechtigung, diesen Befehl zu nutzen! +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 @@ -808,6 +834,7 @@ 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. @@ -822,32 +849,15 @@ 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=Erfolgreich gebunden +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. -commands.bloodmagic.bind.usage=/bind -commands.bloodmagic.bind.success=Gegenstand erfolgreich gebunden! -commands.bloodmagic.bind.failed.noPlayer=Kein Spieler angegeben -commands.bloodmagic.bind.failed.alreadyBound=Gegenstand ist schon gebunden; benutze /unbind um die Bindung zu entfernen -commands.bloodmagic.bind.failed.notBindable=Gegenstand kann nicht gebunden werden -commands.bloodmagic.unbind.usage=/unbind -commands.bloodmagic.unbind.success=Bindung erfolgreich entfernt. -commands.bloodmagic.unbind.failed.notBindable=Bindung kann nicht entfernt werden. -commands.bloodmagic.soulnetwork.usage=/soulnetwork [Menge] -commands.bloodmagic.soulnetwork.add.success=Erfolgreich %dLP zu %ss LP-Netzwerk hinzugefügt! -commands.bloodmagic.soulnetwork.subtract.success=Erfolgreich %dLP von %ss LP-Netzwerk entfernt! -commands.bloodmagic.soulnetwork.fill.success=Erfolgreich %ss LP-Netzwerk gefüllt! -commands.bloodmagic.soulnetwork.empty.success=Erfolgreich %ss LP-Netzwerk geleert! -commands.bloodmagic.soulnetwork.get.success=In %ss LP-Netzwerk sind %dLP! -commands.bloodmagic.soulnetwork.noPlayer=Kein Spieler angegeben -commands.bloodmagic.soulnetwork.noCommand=Kein Befehl angegeben -commands.bloodmagic.soulnetwork.notACommand=Das ist kein gültiger Befehl -commands.bloodmagic.soulnetwork.fillMax.success=%ss LP-Netzwerk erfolgreich zu deren Blutkugel-Maximum befüllt! -commands.bloodmagic.soulnetwork.create.success=%ss LP-Netzwerk erfolgreich erstellt! (Blutkugel-Ausbaustufe: %d) - # GUI tile.bloodmagic.inputNode.name=Eingangsknoten tile.bloodmagic.outputNode.name=Ausgangsknoten @@ -857,9 +867,6 @@ bloodmagic.keybind.open_holding=Öffne Siegel der Aufbewahrung bloodmagic.keybind.cycle_holding_pos=Siegelrotation (+) bloodmagic.keybind.cycle_holding_neg=Siegelrotation (-) -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. - # JustEnoughItems jei.bloodmagic.recipe.altar=Blutaltar jei.bloodmagic.recipe.binding=Alchemische Anordnung (Bindung) diff --git a/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang b/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang index 3715be0f..21cf0a86 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang @@ -51,6 +51,23 @@ 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. @@ -136,7 +153,7 @@ guide.bloodmagic.entry.architect.augmentedCapacity=Rune der erweiterten Kapazit 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" +# //--// 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 @@ -177,6 +194,7 @@ guide.bloodmagic.entry.architect.peritia.info.1=Bestimmte Aktionen in der Welt b 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... @@ -224,8 +242,8 @@ guide.bloodmagic.entry.demon.petty.info.1=Ich ging auf eines meiner nun allnäch 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 Weinstein 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 der leere Weinstein 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.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! @@ -234,7 +252,7 @@ guide.bloodmagic.entry.demon.aura.info=Wenn ein Wesen normal getötet wird, verd 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 einen Weinstein 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.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. From 24b3552b60d96f8468f1826cdbedc3d472a16e65 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 03:50:21 +0200 Subject: [PATCH 434/595] Guide capacity recipe, rearranged some entries (#1641) * Fix meta ID's (recipes shown) in the guide book for Displacement and Capacity * Rearranged topics to be closer to a natural progression. --- .../compat/guideapi/book/CategoryAlchemy.java | 31 +++--- .../guideapi/book/CategoryArchitect.java | 105 +++++++++--------- 2 files changed, 65 insertions(+), 71 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java index 307cc083..f0b66b63 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java @@ -1,12 +1,12 @@ 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.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; @@ -63,6 +63,20 @@ public class CategoryAlchemy 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"); @@ -123,21 +137,6 @@ public class CategoryAlchemy laputaPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "laputa" + ".info"), 370)); entries.put(new ResourceLocation(keyBase + "laputa"), new EntryText(laputaPages, TextHelper.localize(keyBase + "laputa"), 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)); - for (Entry entry : entries.entrySet()) { for (IPage page : entry.getValue().pageList) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index ac330963..005e7ced 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -1,9 +1,6 @@ package WayofTime.bloodmagic.compat.guideapi.book; import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.core.registry.OrbRegistry; import WayofTime.bloodmagic.compat.guideapi.BookUtils; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; @@ -12,7 +9,10 @@ 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; @@ -60,6 +60,16 @@ public class CategoryArchitect 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)); @@ -206,17 +216,6 @@ public class CategoryArchitect 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 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 runeSacrificePages = new ArrayList<>(); IRecipe runeSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3)); @@ -359,7 +358,7 @@ public class CategoryArchitect List capacityPages = new ArrayList<>(); - IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); + IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 6)); if (capacityRecipe != null) { capacityPages.add(BookUtils.getPageForRecipe(capacityRecipe)); @@ -370,7 +369,7 @@ public class CategoryArchitect List displacementPages = new ArrayList<>(); - IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); + IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 5)); if (displacementRecipe != null) { displacementPages.add(BookUtils.getPageForRecipe(displacementRecipe)); @@ -486,6 +485,41 @@ public class CategoryArchitect 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)); @@ -503,45 +537,6 @@ public class CategoryArchitect 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 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 masterOrbPages = new ArrayList<>(); AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER)); From 4f1308874d1507cfa1e47d56d2f0abcc92f4b701 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 03:51:25 +0200 Subject: [PATCH 435/595] Fixes BloodAltar being able to obtain negative progress. (#1649) * Fixes BloodAltar being able to obtain negative progress. * Updated to use Math.max() --- src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 7a111dd0..66b1d2f2 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -3,16 +3,16 @@ 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.BlockLifeEssence; import WayofTime.bloodmagic.block.enums.BloodRuneType; import WayofTime.bloodmagic.core.data.Binding; import WayofTime.bloodmagic.core.data.SoulTicket; import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.orb.BloodOrb; import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.block.BlockLifeEssence; 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.state.IBlockState; import net.minecraft.item.ItemStack; @@ -297,7 +297,7 @@ public class BloodAltar implements IFluidHandler { } } else if (!hasOperated && progress > 0) { - progress -= (int) (efficiencyMultiplier * drainRate); + progress = Math.max(0, progress - (int) (efficiencyMultiplier * drainRate)); if (internalCounter % 2 == 0 && world instanceof WorldServer) { WorldServer server = (WorldServer) world; From a23cd355565ec8531f9161a9e1e354a6bb5de5dd Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 03:55:53 +0200 Subject: [PATCH 436/595] Implemented BloodAltar modification with redstone lamp below altar (#1635) * Implemented BloodAltar modification with redstone lamp below altar - strong and weak Redstone signal of power 15 (similar to BlockLever) - activates when crafting finishes and a BlockRedstoneLight is directly below the altar - deactivates when the next crafting cycle is about to begin Use case: - Redstone-controlled automatic ejection of crafted goods * Removed Docs * Meta to use 0 for off, 1 for on * Syntactic sugar & storing value --- .../bloodmagic/altar/BloodAltar.java | 19 ++++++++- .../bloodmagic/block/BlockAltar.java | 41 +++++++++++++++++++ .../assets/bloodmagic/blockstates/altar.json | 8 ++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 66b1d2f2..5dda98bc 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -3,8 +3,10 @@ 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; @@ -14,6 +16,7 @@ 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.BlockRedstoneLight; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -239,8 +242,15 @@ public class BloodAltar implements IFluidHandler { 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)) + if (internalCounter % 100 == 0 && (this.isActive || this.cooldownAfterCrafting <= 0)) { + /* Redstone Lamp below altar: Switch Off */ + IBlockState 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(); } @@ -319,6 +329,13 @@ public class BloodAltar implements IFluidHandler { 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 BlockRedstoneLight) { + world.setBlockState(pos, world.getBlockState(pos).cycleProperty(BlockAltar.POWERED), 3); + world.notifyNeighborsOfStateChange(pos, RegistrarBloodMagicBlocks.ALTAR, false); + } + this.cooldownAfterCrafting = 30; this.isActive = false; } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index 73923dcb..712adb94 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -18,7 +18,10 @@ import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.helper.NetworkHelper; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -39,10 +42,13 @@ 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); @@ -180,4 +186,39 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl public ItemBlock getItem() { return new ItemBlock(this); } + + /* Redstone code, taken from BlockLever */ + + public int getWeakPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { + return blockState.getValue(POWERED) ? 15 : 0; + } + + public int getStrongPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { + if (!blockState.getValue(POWERED)) { + return 0; + } else { + return 15; + } + } + + public boolean canProvidePower(IBlockState state) { + return true; + } + + public IBlockState getStateFromMeta(int meta) { + return this.getDefaultState().withProperty(POWERED, meta > 0); + } + + public int getMetaFromState(IBlockState state) { + return state.getValue(POWERED) ? 1 : 0; + } + + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, POWERED); + } + + public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { + + return this.getDefaultState().withProperty(POWERED, false); + } } diff --git a/src/main/resources/assets/bloodmagic/blockstates/altar.json b/src/main/resources/assets/bloodmagic/blockstates/altar.json index 24191a55..7fa4988e 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/altar.json +++ b/src/main/resources/assets/bloodmagic/blockstates/altar.json @@ -8,6 +8,14 @@ }, "variants": { "normal": [{ + } + ], + "powered=true": [ + { + } + ], + "powered=false": [ + { }] } From 1155be6d6bfc286404f1e6a96e3109a5f29c7ade Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 03:58:45 +0200 Subject: [PATCH 437/595] Fixed Ritual Tinkerer & added range reset (#1636) * Add getMinimumOffset() and getMaximumOffset to AreaDescriptor Add the ability to reset BlockRanges to the Ritual Tinkerer * Added copy-constructors and functions to AreaDescriptor Added the ability to reset BlockRanges to the Ritual Tinkerer - Mode: Define Area, with BloodOrb in offhand & sneaking, right click on MRS Changed "addBlockRange" and "addBlockRanges" to use .putIfAbsent Added "setBlockRange" and "setBlockRanges" to IMasterRitualStone - reference implementation in TileMasterRitualStone is identical to old "addBlockRange" and "addBlockRanges" Fixed range setting for good. Tested behavior with RitualWater. * Minor cleanup * Remove TODO --- .../bloodmagic/item/ItemRitualReader.java | 26 ++++++++++---- .../bloodmagic/ritual/AreaDescriptor.java | 34 +++++++++++++++++++ .../bloodmagic/ritual/IMasterRitualStone.java | 4 +++ .../tile/TileMasterRitualStone.java | 20 +++++++++-- 4 files changed, 75 insertions(+), 9 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index f96afc24..6358762a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -2,6 +2,7 @@ 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; @@ -21,7 +22,6 @@ 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.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -100,11 +100,21 @@ public class ItemRitualReader extends Item implements IVariantProvider { switch (state) { case INFORMATION: master.provideInformationOfRitualToPlayer(player); + break; case SET_AREA: + if (player.isSneaking() && player.getHeldItem(EnumHand.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 || player.isSneaking()) { + if (range == null || range.isEmpty() || player.isSneaking()) { String newRange = master.getNextBlockRange(range); range = newRange; this.setCurrentBlockRange(stack, newRange); @@ -144,17 +154,21 @@ public class ItemRitualReader extends Item implements IVariantProvider { BlockPos pos1 = pos.subtract(masterPos); this.setBlockPos(stack, pos1); player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.firstBlock"), true); - player.sendMessage(new TextComponentString(pos1.toString())); } 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(); - //TODO: Fix AreaDescriptor area handling to be inclusive, then remove the "-1" for range calculation below. - int maxHorizontalRange = ritual.getMaxHorizontalRadiusForRange(range, null, null) - 1; - int maxVerticalRange = ritual.getMaxVerticalRadiusForRange(range, null, null) - 1; + + 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)) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java index b6f5dc83..e51a062d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java @@ -35,6 +35,8 @@ public abstract class AreaDescriptor implements Iterator { } + public abstract AreaDescriptor copy(); + public abstract int getVolumeForOffsets(BlockPos offset1, BlockPos offset2); public abstract boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit); @@ -91,6 +93,14 @@ public abstract class AreaDescriptor implements Iterator { 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()) { @@ -122,6 +132,14 @@ public abstract class AreaDescriptor implements Iterator { 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 @@ -271,6 +289,14 @@ public abstract class AreaDescriptor implements Iterator { 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; @@ -417,6 +443,14 @@ public abstract class AreaDescriptor implements Iterator { 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; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index 1ce20d8b..1ba75a6f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -71,5 +71,9 @@ public interface IMasterRitualStone { 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/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 46e6332d..88ae398b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -32,6 +32,7 @@ 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; @@ -42,7 +43,6 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS private EnumFacing direction = EnumFacing.NORTH; private boolean inverted; private List currentActiveWillConfig = new ArrayList<>(); - protected final Map modableRangeMap = new HashMap<>(); @Override public void onUpdate() { @@ -425,13 +425,27 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS return null; } + @Override public void addBlockRange(String range, AreaDescriptor defaultRange) { - modableRangeMap.put(range, defaultRange); + modableRangeMap.putIfAbsent(range, defaultRange.copy()); } + @Override public void addBlockRanges(Map blockRanges) { for (Map.Entry entry : blockRanges.entrySet()) { - modableRangeMap.put(entry.getKey(), entry.getValue()); + 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()); } } From 39cdc0c42ff4cf77446277cbf18bc7dee0d14fc7 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 04:02:39 +0200 Subject: [PATCH 438/595] Lava Crystals can now set things on fire! (#1652) * Lava Crystals can now set things on fire! * Remove unecessary else --- .../bloodmagic/item/ItemLavaCrystal.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index f99408df..f4144990 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -7,13 +7,23 @@ 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.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; +import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTUtil; import net.minecraft.potion.PotionEffect; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -73,6 +83,26 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")), nbt.getString("name")); } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + pos = pos.offset(facing); + ItemStack itemstack = player.getHeldItem(hand); + + if (!player.canPlayerEdit(pos, facing, itemstack)) + return EnumActionResult.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 EnumActionResult.FAIL; + + if (player instanceof EntityPlayerMP) + CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP) player, pos, itemstack); + + return EnumActionResult.SUCCESS; + } + @Override public void gatherVariants(@Nonnull Int2ObjectMap variants) { variants.put(0, "type=normal"); From 5cb3ff5af54b34f364a9e4e5c306e14d36e2c595 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 5 Sep 2019 04:24:43 +0200 Subject: [PATCH 439/595] Tentative changelog for next version (#1610) * Tentative changelog for next version * Updated changelog to feature all PRs since the last changelog PR. Added PR #s for every change. * Added the Sentient sword sigil buffs PR to the changelog * Added NPE World load/unload PR * Added changes from most recent PRs * Removed duplicate sentient sword sigil effect PR. Moved 2 commits to "Technical stuff", as they have been committed * Updated changelog * Updated changelog + flavor * Remove Gaia Transformation note --- changelog.txt | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 11ab26ad..4c070f99 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,32 @@ +------------------------------------------------------ +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 ------------------------------------------------------ @@ -43,7 +72,7 @@ Misc: - 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 From 1caae69992618c1b7a5bba60a79c4ea664717a91 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 4 Sep 2019 19:25:07 -0700 Subject: [PATCH 440/595] Bump version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 21145a3d..04505448 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.4.1 +mod_version=2.4.2 mc_version=1.12.2 forge_version=14.23.5.2808 curse_id=224791 From 4035d911514900467b33abcdf2a0a349591cf14d Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 22 Sep 2019 12:55:43 -0700 Subject: [PATCH 441/595] Run migration mappings Everything is still broken, but at least we reduced the amount of errors by hundreds, if not thousands. --- build.gradle | 93 +++++------ gradle.properties | 13 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../java/WayofTime/bloodmagic/BloodMagic.java | 6 +- .../alchemyArray/AlchemyArrayEffect.java | 10 +- .../AlchemyArrayEffectArrowTurret.java | 36 ++-- .../AlchemyArrayEffectAttractor.java | 100 +++++------ .../AlchemyArrayEffectBinding.java | 14 +- .../AlchemyArrayEffectBounce.java | 14 +- .../AlchemyArrayEffectCrafting.java | 10 +- .../AlchemyArrayEffectCraftingNew.java | 10 +- .../AlchemyArrayEffectFurnaceFuel.java | 34 ++-- .../AlchemyArrayEffectLaputa.java | 10 +- .../AlchemyArrayEffectMobSacrifice.java | 41 +++-- .../AlchemyArrayEffectMovement.java | 14 +- .../alchemyArray/AlchemyArrayEffectSigil.java | 6 +- .../AlchemyArrayEffectSkeletonTurret.java | 42 ++--- .../alchemyArray/AlchemyArrayEffectSpike.java | 14 +- .../AlchemyArrayEffectTeleport.java | 34 ++-- .../AlchemyArrayEffectUpdraft.java | 10 +- .../alchemyArray/AlchemyCircleRenderer.java | 6 +- .../WayofTime/bloodmagic/altar/AltarUtil.java | 12 +- .../bloodmagic/altar/BloodAltar.java | 38 ++--- .../bloodmagic/altar/IAltarComponent.java | 4 +- .../bloodmagic/api/impl/BloodMagicAPI.java | 12 +- .../api/impl/BloodMagicBlacklist.java | 26 +-- .../api/impl/BloodMagicCorePlugin.java | 2 +- .../api/impl/BloodMagicValueManager.java | 10 +- .../bloodmagic/block/BlockAlchemyArray.java | 40 ++--- .../bloodmagic/block/BlockAlchemyTable.java | 48 +++--- .../bloodmagic/block/BlockAltar.java | 62 +++---- .../bloodmagic/block/BlockBloodLight.java | 26 +-- .../bloodmagic/block/BlockBloodRune.java | 4 +- .../bloodmagic/block/BlockBloodTank.java | 58 +++---- .../bloodmagic/block/BlockDecorative.java | 4 +- .../bloodmagic/block/BlockDemonCrucible.java | 42 ++--- .../bloodmagic/block/BlockDemonCrystal.java | 72 ++++---- .../block/BlockDemonCrystallizer.java | 32 ++-- .../block/BlockDemonPillarBase.java | 4 +- .../block/BlockDemonPillarCapBase.java | 6 +- .../bloodmagic/block/BlockDemonPylon.java | 34 ++-- .../block/BlockDimensionalPortal.java | 22 +-- .../bloodmagic/block/BlockIncenseAltar.java | 30 ++-- .../block/BlockInputRoutingNode.java | 16 +- .../block/BlockInversionPillar.java | 25 ++- .../block/BlockInversionPillarEnd.java | 16 +- .../block/BlockItemRoutingNode.java | 8 +- .../block/BlockMasterRoutingNode.java | 6 +- .../bloodmagic/block/BlockMimic.java | 67 ++++---- .../block/BlockOutputRoutingNode.java | 16 +- .../WayofTime/bloodmagic/block/BlockPath.java | 8 +- .../bloodmagic/block/BlockPhantom.java | 24 +-- .../block/BlockRitualController.java | 32 ++-- .../bloodmagic/block/BlockRitualStone.java | 10 +- .../bloodmagic/block/BlockRoutingNode.java | 44 ++--- .../bloodmagic/block/BlockSoulForge.java | 38 ++--- .../bloodmagic/block/BlockSpectral.java | 30 ++-- .../bloodmagic/block/BlockTeleposer.java | 28 ++-- .../WayofTime/bloodmagic/block/IBMBlock.java | 4 +- .../bloodmagic/block/base/BlockEnum.java | 16 +- .../block/base/BlockEnumPillar.java | 54 +++--- .../block/base/BlockEnumPillarCap.java | 26 +-- .../block/base/BlockEnumStairs.java | 154 ++++++++--------- .../bloodmagic/block/base/BlockEnumWall.java | 40 ++--- .../bloodmagic/block/base/BlockInteger.java | 12 +- .../client/gui/GuiAlchemyTable.java | 10 +- .../client/gui/GuiBloodMagicConfig.java | 6 +- .../bloodmagic/client/gui/GuiHandler.java | 10 +- .../bloodmagic/client/gui/GuiHolding.java | 14 +- .../client/gui/GuiItemRoutingNode.java | 42 ++--- .../client/gui/GuiMasterRoutingNode.java | 8 +- .../bloodmagic/client/gui/GuiSoulForge.java | 8 +- .../bloodmagic/client/gui/GuiTeleposer.java | 8 +- .../bloodmagic/client/hud/GuiEditHUD.java | 12 +- .../client/hud/element/ElementDemonAura.java | 4 +- .../element/ElementDivinedInformation.java | 12 +- .../client/hud/element/ElementHolding.java | 4 +- .../bloodmagic/client/key/IKeybindable.java | 4 +- .../bloodmagic/client/key/KeyBindings.java | 6 +- .../mesh/CustomMeshDefinitionActivatable.java | 2 +- .../mesh/CustomMeshDefinitionMultiWill.java | 2 +- .../mesh/CustomMeshDefinitionWillGem.java | 2 +- .../client/render/LayerBloodElytra.java | 20 +-- .../AttractorAlchemyCircleRenderer.java | 6 +- .../BindingAlchemyCircleRenderer.java | 4 +- .../DualAlchemyCircleRenderer.java | 6 +- .../MobSacrificeAlchemyCircleRenderer.java | 6 +- .../SingleAlchemyCircleRenderer.java | 6 +- .../StaticAlchemyCircleRenderer.java | 6 +- .../TurretAlchemyCircleRenderer.java | 6 +- .../render/block/RenderAlchemyArray.java | 4 +- .../client/render/block/RenderAltar.java | 16 +- .../client/render/block/RenderBloodTank.java | 8 +- .../render/block/RenderDemonCrucible.java | 14 +- .../client/render/block/RenderFakeBlocks.java | 4 +- .../render/block/RenderItemRoutingNode.java | 4 +- .../client/render/block/RenderMimic.java | 4 +- .../entity/BloodLightRenderFactory.java | 6 +- .../entity/CorruptedChickenRenderFactory.java | 6 +- .../entity/CorruptedSheepRenderFactory.java | 6 +- .../entity/CorruptedSpiderRenderFactory.java | 6 +- .../entity/CorruptedZombieRenderFactory.java | 6 +- .../render/entity/MeteorRenderFactory.java | 6 +- .../render/entity/MimicRenderFactory.java | 6 +- .../render/entity/RenderCorruptedChicken.java | 8 +- .../render/entity/RenderCorruptedSheep.java | 8 +- .../render/entity/RenderCorruptedSpider.java | 8 +- .../render/entity/RenderCorruptedZombie.java | 23 ++- .../render/entity/RenderEntityBloodLight.java | 20 +-- .../render/entity/RenderEntityMeteor.java | 8 +- .../render/entity/RenderEntityMimic.java | 34 ++-- .../entity/RenderEntitySentientArrow.java | 8 +- .../render/entity/RenderEntitySoulSnare.java | 20 +-- .../render/entity/RenderSentientSpecter.java | 40 ++--- .../entity/SentientArrowRenderFactory.java | 6 +- .../entity/SentientSpecterRenderFactory.java | 6 +- .../render/entity/SoulSnareRenderFactory.java | 6 +- .../entity/layer/LayerCorruptedSheepWool.java | 8 +- .../client/render/entity/layer/LayerWill.java | 6 +- .../render/model/ModelCorruptedSheep.java | 4 +- .../render/model/ModelCorruptedSheep2.java | 4 +- .../command/sub/SubCommandBind.java | 20 +-- .../command/sub/SubCommandNetwork.java | 32 ++-- .../bloodmagic/command/sub/SubCommandOrb.java | 20 +-- .../command/sub/SubCommandRitual.java | 30 ++-- .../command/sub/SubCommandTeleposer.java | 42 ++--- .../compat/guideapi/GuideBloodMagic.java | 2 +- .../compat/guideapi/page/PageAltarRecipe.java | 2 +- .../page/PageTartaricForgeRecipe.java | 2 +- .../provider/DataProviderAlchemyArray.java | 6 +- .../provider/DataProviderBloodAltar.java | 18 +- .../waila/provider/DataProviderBloodTank.java | 8 +- .../waila/provider/DataProviderMimic.java | 12 +- .../DataProviderRitualController.java | 8 +- .../waila/provider/DataProviderTeleposer.java | 10 +- .../compress/StorageBlockCraftingManager.java | 28 ++-- .../bloodmagic/core/RegistrarBloodMagic.java | 42 ++--- .../core/RegistrarBloodMagicBlocks.java | 8 +- .../core/RegistrarBloodMagicItems.java | 22 +-- .../core/RegistrarBloodMagicRecipes.java | 10 +- .../core/data/BMWorldSavedData.java | 18 +- .../bloodmagic/core/data/Binding.java | 12 +- .../bloodmagic/core/data/SoulNetwork.java | 34 ++-- .../bloodmagic/core/data/SoulTicket.java | 14 +- .../core/recipe/IngredientBloodOrb.java | 2 +- .../recipe/IngredientBloodOrbFactory.java | 4 +- .../bloodmagic/core/registry/OrbRegistry.java | 4 +- .../entity/ai/EntityAIAttackRangedBow.java | 18 +- .../entity/ai/EntityAIAttackStealthMelee.java | 18 +- .../entity/ai/EntityAIEatAndCorruptBlock.java | 10 +- .../entity/ai/EntityAIFollowOwner.java | 28 ++-- .../ai/EntityAIGrabEffectsFromOwner.java | 28 ++-- .../ai/EntityAIHurtByTargetIgnoreTamed.java | 12 +- .../entity/ai/EntityAIMimicReform.java | 4 +- .../entity/ai/EntityAIOwnerHurtByTarget.java | 12 +- .../entity/ai/EntityAIOwnerHurtTarget.java | 12 +- .../entity/ai/EntityAIPickUpAlly.java | 18 +- .../entity/ai/EntityAIProtectAlly.java | 14 +- .../entity/ai/EntityAIRetreatToHeal.java | 12 +- .../entity/ai/EntityAIStealthRetreat.java | 12 +- .../ai/EntityAIStealthTowardsTarget.java | 20 +-- .../entity/mob/EntityAspectedDemonBase.java | 16 +- .../entity/mob/EntityCorruptedChicken.java | 38 ++--- .../entity/mob/EntityCorruptedSheep.java | 98 +++++------ .../entity/mob/EntityCorruptedSpider.java | 46 +++--- .../entity/mob/EntityCorruptedZombie.java | 52 +++--- .../entity/mob/EntityDemonBase.java | 68 ++++---- .../bloodmagic/entity/mob/EntityMimic.java | 78 ++++----- .../entity/mob/EntitySentientSpecter.java | 155 +++++++++-------- .../entity/projectile/EntityBloodLight.java | 30 ++-- .../entity/projectile/EntityMeteor.java | 16 +- .../projectile/EntitySentientArrow.java | 88 +++++----- .../entity/projectile/EntitySoulSnare.java | 14 +- .../bloodmagic/event/BoundToolEvent.java | 10 +- .../bloodmagic/event/ItemBindEvent.java | 8 +- .../bloodmagic/event/RitualEvent.java | 16 +- .../event/SacrificeKnifeUsedEvent.java | 6 +- .../bloodmagic/event/SoulNetworkEvent.java | 8 +- .../bloodmagic/event/TeleposeEvent.java | 6 +- .../fakePlayer/FakeNetHandlerPlayServer.java | 74 ++++----- .../bloodmagic/fakePlayer/FakePlayerBM.java | 12 +- .../bloodmagic/gson/Serializers.java | 16 +- .../bloodmagic/iface/IActivatable.java | 4 +- .../bloodmagic/iface/IAlchemyArray.java | 4 +- .../WayofTime/bloodmagic/iface/IBindable.java | 4 +- .../bloodmagic/iface/IBloodRune.java | 4 +- .../bloodmagic/iface/IDemonWillViewer.java | 6 +- .../bloodmagic/iface/IDocumentedBlock.java | 6 +- .../iface/ISentientSwordEffectProvider.java | 4 +- .../bloodmagic/iface/ISentientTool.java | 4 +- .../WayofTime/bloodmagic/iface/ISigil.java | 4 +- .../bloodmagic/incense/IIncensePath.java | 4 +- .../incense/ITranquilityHandler.java | 4 +- .../incense/IncenseAltarComponent.java | 16 +- .../incense/IncenseAltarHandler.java | 10 +- .../incense/IncenseTranquilityRegistry.java | 4 +- .../inversion/CorruptionHandler.java | 20 +-- .../bloodmagic/item/ItemAltarMaker.java | 24 +-- .../bloodmagic/item/ItemArcaneAshes.java | 16 +- .../bloodmagic/item/ItemBindableBase.java | 4 +- .../bloodmagic/item/ItemBloodOrb.java | 16 +- .../bloodmagic/item/ItemBoundAxe.java | 24 +-- .../bloodmagic/item/ItemBoundPickaxe.java | 28 ++-- .../bloodmagic/item/ItemBoundShovel.java | 24 +-- .../bloodmagic/item/ItemBoundSword.java | 28 ++-- .../bloodmagic/item/ItemBoundTool.java | 57 +++---- .../item/ItemDaggerOfSacrifice.java | 20 +-- .../bloodmagic/item/ItemDemonWillGauge.java | 6 +- .../WayofTime/bloodmagic/item/ItemEnum.java | 4 +- .../bloodmagic/item/ItemExperienceBook.java | 28 ++-- .../bloodmagic/item/ItemInscriptionTool.java | 26 +-- .../bloodmagic/item/ItemLavaCrystal.java | 39 +++-- .../bloodmagic/item/ItemPotionFlask.java | 36 ++-- .../bloodmagic/item/ItemRitualDismantler.java | 20 +-- .../bloodmagic/item/ItemRitualDiviner.java | 108 ++++++------ .../bloodmagic/item/ItemRitualReader.java | 50 +++--- .../item/ItemSacrificialDagger.java | 38 ++--- .../bloodmagic/item/ItemSanguineBook.java | 21 ++- .../item/ItemTelepositionFocus.java | 12 +- .../bloodmagic/item/ItemUpgradeTome.java | 14 +- .../bloodmagic/item/ItemUpgradeTrainer.java | 4 +- .../item/alchemy/ItemCuttingFluid.java | 6 +- .../ItemLivingArmourPointsUpgrade.java | 34 ++-- .../item/armour/ItemLivingArmour.java | 80 ++++----- .../item/armour/ItemSentientArmour.java | 130 +++++++-------- .../item/block/ItemBlockAlchemyTable.java | 16 +- .../item/block/ItemBlockBloodTank.java | 12 +- .../item/block/ItemBlockDemonCrystal.java | 12 +- .../bloodmagic/item/block/ItemBlockMimic.java | 43 +++-- .../item/block/base/ItemBlockEnum.java | 4 +- .../item/block/base/ItemBlockInteger.java | 4 +- .../item/gear/ItemPackSacrifice.java | 22 +-- .../item/gear/ItemPackSelfSacrifice.java | 22 +-- .../item/inventory/ContainerHolding.java | 24 +-- .../item/inventory/InventoryHolding.java | 12 +- .../item/inventory/ItemInventory.java | 34 ++-- .../item/routing/ItemFluidRouterFilter.java | 4 +- .../item/routing/ItemNodeRouter.java | 62 +++---- .../item/routing/ItemRouterFilter.java | 4 +- .../bloodmagic/item/sigil/ItemSigilAir.java | 18 +- .../item/sigil/ItemSigilBloodLight.java | 6 +- .../item/sigil/ItemSigilBounce.java | 8 +- .../bloodmagic/item/sigil/ItemSigilClaw.java | 8 +- .../item/sigil/ItemSigilCompression.java | 8 +- .../item/sigil/ItemSigilDivination.java | 12 +- .../sigil/ItemSigilElementalAffinity.java | 12 +- .../item/sigil/ItemSigilEnderSeverance.java | 12 +- .../item/sigil/ItemSigilFastMiner.java | 18 +- .../item/sigil/ItemSigilFilledHand.java | 4 +- .../item/sigil/ItemSigilFluidBase.java | 18 +- .../bloodmagic/item/sigil/ItemSigilFrost.java | 8 +- .../item/sigil/ItemSigilGreenGrove.java | 24 +-- .../bloodmagic/item/sigil/ItemSigilHaste.java | 8 +- .../item/sigil/ItemSigilHolding.java | 46 +++--- .../bloodmagic/item/sigil/ItemSigilLava.java | 18 +- .../item/sigil/ItemSigilMagnetism.java | 16 +- .../item/sigil/ItemSigilPhantomBridge.java | 10 +- .../item/sigil/ItemSigilSuppression.java | 8 +- .../item/sigil/ItemSigilTeleposition.java | 40 ++--- .../item/sigil/ItemSigilToggleable.java | 30 ++-- .../item/sigil/ItemSigilToggleableBase.java | 4 +- .../item/sigil/ItemSigilTransposition.java | 48 +++--- .../bloodmagic/item/sigil/ItemSigilVoid.java | 16 +- .../bloodmagic/item/sigil/ItemSigilWater.java | 26 +-- .../item/sigil/ItemSigilWhirlwind.java | 8 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 6 +- .../item/soul/ItemSentientArmourGem.java | 15 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 96 +++++------ .../bloodmagic/item/soul/ItemSentientBow.java | 124 +++++++------- .../item/soul/ItemSentientPickaxe.java | 96 +++++------ .../item/soul/ItemSentientShovel.java | 96 +++++------ .../item/soul/ItemSentientSword.java | 88 +++++----- .../bloodmagic/item/soul/ItemSoulGem.java | 27 ++- .../bloodmagic/item/soul/ItemSoulSnare.java | 12 +- .../item/soulBreath/ItemFlightScroll.java | 70 ++++---- .../soulBreath/ItemSoulBreathContainer.java | 6 +- .../livingArmour/ILivingArmour.java | 22 +-- .../bloodmagic/livingArmour/LivingArmour.java | 58 +++---- .../livingArmour/LivingArmourHandler.java | 4 +- .../livingArmour/LivingArmourUpgrade.java | 20 +-- .../bloodmagic/livingArmour/StatTracker.java | 12 +- .../LivingArmourUpgradeBattleHungry.java | 10 +- .../LivingArmourUpgradeCrippledArm.java | 10 +- .../LivingArmourUpgradeDigSlowdown.java | 12 +- .../LivingArmourUpgradeDisoriented.java | 10 +- .../LivingArmourUpgradeMeleeDecrease.java | 10 +- .../LivingArmourUpgradeQuenched.java | 10 +- .../LivingArmourUpgradeSlippery.java | 10 +- .../LivingArmourUpgradeSlowHeal.java | 10 +- .../LivingArmourUpgradeSlowness.java | 10 +- .../LivingArmourUpgradeStormTrooper.java | 12 +- .../tracker/StatTrackerArrowProtect.java | 12 +- .../tracker/StatTrackerArrowShot.java | 12 +- .../tracker/StatTrackerCriticalStrike.java | 12 +- .../tracker/StatTrackerDigging.java | 12 +- .../tracker/StatTrackerExperience.java | 12 +- .../tracker/StatTrackerFallProtect.java | 12 +- .../tracker/StatTrackerFireResist.java | 12 +- .../livingArmour/tracker/StatTrackerFood.java | 14 +- .../tracker/StatTrackerGraveDigger.java | 12 +- .../tracker/StatTrackerGrimReaperSprint.java | 12 +- .../tracker/StatTrackerHealthboost.java | 12 +- .../livingArmour/tracker/StatTrackerJump.java | 12 +- .../tracker/StatTrackerMeleeDamage.java | 12 +- .../tracker/StatTrackerMovement.java | 16 +- .../tracker/StatTrackerNightSight.java | 16 +- .../tracker/StatTrackerPhysicalProtect.java | 12 +- .../tracker/StatTrackerPoison.java | 16 +- .../tracker/StatTrackerRepairing.java | 12 +- .../tracker/StatTrackerSelfSacrifice.java | 12 +- .../tracker/StatTrackerSolarPowered.java | 12 +- .../tracker/StatTrackerSprintAttack.java | 12 +- .../tracker/StatTrackerStepAssist.java | 16 +- .../LivingArmourUpgradeArrowProtect.java | 10 +- .../upgrade/LivingArmourUpgradeArrowShot.java | 10 +- .../LivingArmourUpgradeCriticalStrike.java | 16 +- .../upgrade/LivingArmourUpgradeDigging.java | 18 +- .../upgrade/LivingArmourUpgradeElytra.java | 10 +- .../LivingArmourUpgradeExperience.java | 6 +- .../LivingArmourUpgradeFallProtect.java | 8 +- .../LivingArmourUpgradeFireResist.java | 20 +-- .../LivingArmourUpgradeGraveDigger.java | 16 +- .../LivingArmourUpgradeGrimReaperSprint.java | 26 +-- .../LivingArmourUpgradeHealthboost.java | 10 +- .../upgrade/LivingArmourUpgradeJump.java | 10 +- .../LivingArmourUpgradeKnockbackResist.java | 6 +- .../LivingArmourUpgradeMeleeDamage.java | 10 +- .../LivingArmourUpgradeNightSight.java | 25 ++- .../LivingArmourUpgradePhysicalProtect.java | 10 +- .../LivingArmourUpgradePoisonResist.java | 24 +-- .../upgrade/LivingArmourUpgradeRepairing.java | 14 +- .../LivingArmourUpgradeSelfSacrifice.java | 6 +- .../LivingArmourUpgradeSolarPowered.java | 20 +-- .../upgrade/LivingArmourUpgradeSpeed.java | 24 ++- .../LivingArmourUpgradeSprintAttack.java | 14 +- .../LivingArmourUpgradeStepAssist.java | 6 +- .../WayofTime/bloodmagic/meteor/Meteor.java | 12 +- .../bloodmagic/meteor/MeteorComponent.java | 14 +- .../meteor/MeteorConfigHandler.java | 2 +- .../bloodmagic/meteor/MeteorRegistry.java | 4 +- .../network/BloodMagicPacketHandler.java | 4 +- .../bloodmagic/network/KeyProcessor.java | 4 +- .../PlayerFallDistancePacketProcessor.java | 4 +- .../PlayerVelocityPacketProcessor.java | 4 +- .../WayofTime/bloodmagic/orb/BloodOrb.java | 2 +- .../bloodmagic/potion/BMPotionUtils.java | 46 +++--- .../bloodmagic/potion/PotionBloodMagic.java | 22 +-- .../potion/PotionEventHandlers.java | 40 ++--- .../bloodmagic/proxy/ClientProxy.java | 8 +- .../AlchemyTableDyeableRecipe.java | 16 +- .../AlchemyTablePotionAugmentRecipe.java | 30 ++-- .../AlchemyTablePotionRecipe.java | 16 +- .../registry/ModCorruptionBlocks.java | 2 +- .../bloodmagic/registry/ModRecipes.java | 54 +++--- .../bloodmagic/registry/ModRituals.java | 2 +- .../registry/ModTranquilityHandlers.java | 16 +- .../bloodmagic/ritual/AreaDescriptor.java | 14 +- .../bloodmagic/ritual/CapabilityRuneType.java | 12 +- .../bloodmagic/ritual/EnumRuneType.java | 4 +- .../bloodmagic/ritual/IMasterRitualStone.java | 18 +- .../WayofTime/bloodmagic/ritual/Ritual.java | 46 +++--- .../bloodmagic/ritual/RitualComponent.java | 8 +- .../bloodmagic/ritual/RitualManager.java | 4 +- .../harvest/HarvestHandlerPlantable.java | 12 +- .../ritual/harvest/HarvestHandlerStem.java | 32 ++-- .../ritual/harvest/HarvestHandlerTall.java | 20 +-- .../ritual/harvest/HarvestRegistry.java | 26 +-- .../ritual/harvest/IHarvestHandler.java | 14 +- .../imperfect/IImperfectRitualStone.java | 4 +- .../ritual/imperfect/ImperfectRitual.java | 16 +- .../ritual/types/RitualAltarBuilder.java | 30 ++-- .../ritual/types/RitualAnimalGrowth.java | 28 ++-- .../ritual/types/RitualArmourEvolve.java | 10 +- .../ritual/types/RitualCobblestone.java | 2 +- .../bloodmagic/ritual/types/RitualCondor.java | 10 +- .../ritual/types/RitualContainment.java | 8 +- .../ritual/types/RitualCrushing.java | 56 +++---- .../ritual/types/RitualCrystalHarvest.java | 4 +- .../ritual/types/RitualCrystalSplit.java | 28 ++-- .../ritual/types/RitualEllipsoid.java | 14 +- .../ritual/types/RitualEternalSoul.java | 12 +- .../ritual/types/RitualExpulsion.java | 26 +-- .../ritual/types/RitualFeatheredEarth.java | 20 +-- .../ritual/types/RitualFeatheredKnife.java | 20 +-- .../ritual/types/RitualFelling.java | 12 +- .../ritual/types/RitualForsakenSoul.java | 22 +-- .../ritual/types/RitualFullStomach.java | 6 +- .../ritual/types/RitualGreenGrove.java | 36 ++-- .../ritual/types/RitualGrounding.java | 36 ++-- .../ritual/types/RitualHarvest.java | 12 +- .../ritual/types/RitualInterdiction.java | 10 +- .../ritual/types/RitualJumping.java | 12 +- .../bloodmagic/ritual/types/RitualLava.java | 40 ++--- .../types/RitualLivingArmourDowngrade.java | 32 ++-- .../ritual/types/RitualMagnetic.java | 14 +- .../bloodmagic/ritual/types/RitualMeteor.java | 6 +- .../bloodmagic/ritual/types/RitualPlacer.java | 14 +- .../bloodmagic/ritual/types/RitualPortal.java | 44 ++--- .../bloodmagic/ritual/types/RitualPump.java | 14 +- .../ritual/types/RitualRegeneration.java | 30 ++-- .../bloodmagic/ritual/types/RitualSpeed.java | 22 +-- .../ritual/types/RitualSuppression.java | 4 +- .../ritual/types/RitualUpgradeRemove.java | 14 +- .../bloodmagic/ritual/types/RitualWater.java | 2 +- .../ritual/types/RitualWellOfSuffering.java | 10 +- .../bloodmagic/ritual/types/RitualZephyr.java | 10 +- .../types/imperfect/ImperfectRitualDay.java | 6 +- .../types/imperfect/ImperfectRitualNight.java | 6 +- .../types/imperfect/ImperfectRitualRain.java | 6 +- .../imperfect/ImperfectRitualResistance.java | 12 +- .../imperfect/ImperfectRitualZombie.java | 20 +-- .../bloodmagic/routing/IFluidRoutingNode.java | 6 +- .../routing/IInputFluidRoutingNode.java | 6 +- .../routing/IInputItemRoutingNode.java | 6 +- .../bloodmagic/routing/IItemRoutingNode.java | 6 +- .../routing/IOutputFluidRoutingNode.java | 6 +- .../routing/IOutputItemRoutingNode.java | 6 +- .../bloodmagic/soul/DemonWillHolder.java | 10 +- .../bloodmagic/soul/IDemonWillWeapon.java | 4 +- .../soul/PlayerDemonWillHandler.java | 16 +- .../structures/BuildTestStructure.java | 10 +- .../bloodmagic/structures/Dungeon.java | 30 ++-- .../bloodmagic/structures/DungeonRoom.java | 18 +- .../structures/DungeonStructure.java | 10 +- .../bloodmagic/structures/DungeonTester.java | 6 +- .../bloodmagic/structures/DungeonUtil.java | 12 +- .../bloodmagic/teleport/PortalLocation.java | 10 +- .../teleport/TeleporterBloodMagic.java | 4 +- .../bloodmagic/teleport/Teleports.java | 49 +++--- .../bloodmagic/tile/TileAlchemyArray.java | 24 +-- .../bloodmagic/tile/TileAlchemyTable.java | 30 ++-- .../WayofTime/bloodmagic/tile/TileAltar.java | 16 +- .../bloodmagic/tile/TileBloodTank.java | 14 +- .../bloodmagic/tile/TileDemonCrucible.java | 14 +- .../bloodmagic/tile/TileDemonCrystal.java | 22 +-- .../tile/TileDemonCrystallizer.java | 12 +- .../bloodmagic/tile/TileDemonPylon.java | 10 +- .../tile/TileDimensionalPortal.java | 6 +- .../tile/TileImperfectRitualStone.java | 8 +- .../bloodmagic/tile/TileIncenseAltar.java | 28 ++-- .../bloodmagic/tile/TileInventory.java | 46 +++--- .../bloodmagic/tile/TileInversionPillar.java | 26 +-- .../tile/TileMasterRitualStone.java | 52 +++--- .../WayofTime/bloodmagic/tile/TileMimic.java | 100 +++++------ .../bloodmagic/tile/TilePhantomBlock.java | 10 +- .../tile/TilePurificationAltar.java | 18 +- .../bloodmagic/tile/TileSoulForge.java | 6 +- .../bloodmagic/tile/TileSpectralBlock.java | 12 +- .../bloodmagic/tile/TileTeleposer.java | 6 +- .../bloodmagic/tile/base/TileBase.java | 38 ++--- .../bloodmagic/tile/base/TileTicking.java | 6 +- .../tile/container/ContainerAlchemyTable.java | 20 +-- .../container/ContainerItemRoutingNode.java | 22 +-- .../container/ContainerMasterRoutingNode.java | 10 +- .../tile/container/ContainerSoulForge.java | 14 +- .../tile/container/ContainerTeleposer.java | 14 +- .../tile/routing/TileFilteredRoutingNode.java | 32 ++-- .../tile/routing/TileInputRoutingNode.java | 12 +- .../tile/routing/TileMasterRoutingNode.java | 38 ++--- .../tile/routing/TileOutputRoutingNode.java | 12 +- .../tile/routing/TileRoutingNode.java | 26 +-- .../WayofTime/bloodmagic/util/BlockStack.java | 8 +- .../WayofTime/bloodmagic/util/ChatUtil.java | 56 +++---- .../util/DamageSourceBloodMagic.java | 8 +- .../bloodmagic/util/GhostItemHelper.java | 10 +- .../bloodmagic/util/ItemStackWrapper.java | 8 +- .../bloodmagic/util/SigilFluidWrapper.java | 6 +- .../WayofTime/bloodmagic/util/StateUtil.java | 8 +- .../java/WayofTime/bloodmagic/util/Utils.java | 156 +++++++++--------- .../util/handler/event/ClientHandler.java | 38 ++--- .../util/handler/event/CraftingHandler.java | 21 ++- .../util/handler/event/GenericHandler.java | 132 +++++++-------- .../handler/event/LivingArmourHandler.java | 92 +++++------ .../handler/event/StatTrackerHandler.java | 48 +++--- .../util/handler/event/WillHandler.java | 38 ++--- .../util/helper/BindableHelper.java | 8 +- .../bloodmagic/util/helper/IncenseHelper.java | 22 +-- .../bloodmagic/util/helper/ItemHelper.java | 10 +- .../bloodmagic/util/helper/NBTHelper.java | 4 +- .../bloodmagic/util/helper/NetworkHelper.java | 8 +- .../bloodmagic/util/helper/PlayerHelper.java | 10 +- .../util/helper/PlayerSacrificeHelper.java | 24 +-- .../util/helper/PurificationHelper.java | 14 +- .../bloodmagic/util/helper/RitualHelper.java | 34 ++-- 484 files changed, 4924 insertions(+), 4962 deletions(-) diff --git a/build.gradle b/build.gradle index 35276bea..b3c27f49 100644 --- a/build.gradle +++ b/build.gradle @@ -1,27 +1,23 @@ buildscript { repositories { + maven { url = 'https://files.minecraftforge.net/maven' } + jcenter() mavenCentral() - maven { url "http://files.minecraftforge.net/maven" } - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true } } plugins { - id "net.minecraftforge.gradle.forge" version "2.0.2" - id 'com.matthewprenger.cursegradle' version '1.1.0' - id 'maven-publish' + id "com.matthewprenger.cursegradle" version "1.3.0" + id "maven-publish" } -def build_number = 'CUSTOM' -if (System.getenv('BUILD_NUMBER') != null) - build_number = System.getenv('BUILD_NUMBER') +apply plugin: 'net.minecraftforge.gradle' -def username = "${mod_name}" -if (project.hasProperty('dev_username')) - username = "${dev_username}" +def build_number = System.getenv('BUILD_NUMBER') != null ? System.getenv('BUILD_NUMBER') : 'CUSTOM' +def username = project.hasProperty('dev_username') ? "${dev_username}" : "${mod_name}" group = package_group archivesBaseName = mod_name @@ -33,38 +29,54 @@ repositories { } dependencies { - deobfCompile "mezz.jei:jei_${mc_version}:${jei_version}" - deobfCompile "mcp.mobius.waila:Hwyla:${waila_version}" - deobfCompile "info.amerifrance.guideapi:Guide-API:${guideapi_version}" + 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}") } minecraft { - version = "${mc_version}-${forge_version}" - runDir = "run" + mappings channel: "snapshot", version: "20190912-1.14.3" - replace "@VERSION@", project.version - replaceIn "BloodMagic.java" + runs { + client { + workingDirectory project.file('run') + property 'forge.logging.markers', '' + property 'forge.logging.console.level', 'info' + property 'username', username - clientRunArgs += "--username=${username}" + mods { + bloodmagic { + source sourceSets.main + } + } + } - if (project.hasProperty('mappings_version')) - mappings = project.mappings_version + server { + workingDirectory project.file('run/server') + property 'forge.logging.markers', '' + property 'forge.logging.console.level', 'info' + + mods { + bloodmagic { + source sourceSets.main + } + } + } + } } +apply from: "gradle/process_mod_info.gradle" + processResources { inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version from(sourceSets.main.resources.srcDirs) { - include '**/*.info' - include '**/*.properties' + include '**/*.toml' - expand 'version': project.version, 'mcversion': project.minecraft.version + expand 'version': project.version } - from(sourceSets.main.resources.srcDirs) { - exclude '**/*.info' - exclude '**/*.properties' + exclude '**/*.toml' } } @@ -77,7 +89,6 @@ allprojects { jar { classifier = '' from sourceSets.main.output - from sourceSets.api.output manifest.mainAttributes( "Built-By": System.getProperty('user.name'), "Created-By": "${System.getProperty('java.vm.version')} + (${System.getProperty('java.vm.vendor')})", @@ -87,28 +98,21 @@ jar { ) } +// API jar task apiJar(type: Jar) { classifier = 'api' - from sourceSets.api.output - - // TODO: when FG bug is fixed, remove allJava from the api jar. - // https://github.com/MinecraftForge/ForgeGradle/issues/369 - // Gradle should be able to pull them from the -sources jar. - from sourceSets.api.allJava -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - from javadoc.destinationDir - classifier = 'javadoc' + include 'com/WayofTime/bloodmagic/api/**/*' + exclude 'com/WayofTime/bloodmagic/api/impl/**/*' + from sourceSets.main.allSource + from sourceSets.main.output } task sourcesJar(type: Jar) { classifier = 'sources' from sourceSets.main.allJava - from sourceSets.api.allJava } -tasks.build.dependsOn javadoc, javadocJar, apiJar, sourcesJar +tasks.build.dependsOn apiJar, sourcesJar tasks.withType(JavaCompile) { task -> task.options.encoding = 'UTF-8' @@ -119,7 +123,6 @@ publishing { publications { mavenJava(MavenPublication) { artifact jar - artifact javadocJar artifact sourcesJar artifact apiJar } @@ -161,7 +164,6 @@ String getChangelogText() { def curseRelations = { optionalLibrary 'jei' optionalLibrary 'hwyla' - requiredLibrary 'guide-api' } curseforge { @@ -175,7 +177,6 @@ curseforge { relations curseRelations - addArtifact javadocJar addArtifact sourcesJar addArtifact apiJar } diff --git a/gradle.properties b/gradle.properties index 04505448..2e6ce016 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,13 @@ mod_name=BloodMagic package_group=com.wayoftime.bloodmagic -mod_version=2.4.2 -mc_version=1.12.2 -forge_version=14.23.5.2808 +mod_version=2.5.0 +mc_version=1.14.4 +forge_version=28.1.1 curse_id=224791 -mappings_version=stable_39 +mapping_channel=snapshot +mapping_version=20190912-1.14.3 -jei_version=4.14.4.264 -waila_version=1.8.26-B41_1.12.2 +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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a5ffca25..9d7c377b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 4f763a30..19437999 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -16,7 +16,7 @@ import WayofTime.bloodmagic.structures.ModDungeons; import WayofTime.bloodmagic.util.PluginUtil; import WayofTime.bloodmagic.util.handler.IMCHandler; import com.google.common.collect.Lists; -import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.launchwrapper.Launch; import net.minecraftforge.common.config.Configuration; @@ -40,13 +40,13 @@ public class BloodMagic { 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 CreativeTabs TAB_BM = new CreativeTabs(MODID + ".creativeTab") { + public static final ItemGroup TAB_BM = new ItemGroup(MODID + ".creativeTab") { @Override public ItemStack createIcon() { return OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK); } }; - public static CreativeTabs TAB_TOMES = new CreativeTabs(MODID + ".creativeTabTome") { + public static ItemGroup TAB_TOMES = new ItemGroup(MODID + ".creativeTabTome") { @Override public ItemStack createIcon() { return new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java index 6bac1e53..3db3f305 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.iface.IAlchemyArray; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -17,13 +17,13 @@ public abstract class AlchemyArrayEffect { public abstract boolean update(TileEntity tile, int ticksActive); - public abstract void writeToNBT(NBTTagCompound tag); + public abstract void writeToNBT(CompoundNBT tag); - public abstract void readFromNBT(NBTTagCompound tag); + public abstract void readFromNBT(CompoundNBT tag); public abstract AlchemyArrayEffect getNewCopy(); - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, BlockState state, Entity entity) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java index 67dc2ac6..1f234cd9 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java @@ -5,15 +5,15 @@ import java.util.List; import javax.vecmath.Vector2d; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.projectile.EntityTippedArrow; -import net.minecraft.init.Items; -import net.minecraft.item.ItemArrow; +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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -23,7 +23,7 @@ import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.util.Utils; public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { - public EntityLiving target; + public MobEntity target; public int arrowTimer; public static final int ARROW_WINDUP = 50; private int lastChestSlot = -1; @@ -47,7 +47,7 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { if (chestTile == null) { return false; } - IItemHandler itemHandler = Utils.getInventory(chestTile, EnumFacing.UP); + IItemHandler itemHandler = Utils.getInventory(chestTile, Direction.UP); if (itemHandler == null) { return false; } @@ -55,7 +55,7 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { 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 ItemArrow)) { + if (testStack.isEmpty() || !(testStack.getItem() instanceof ArrowItem)) { lastChestSlot = -1; } else { arrowStack = testStack; @@ -65,7 +65,7 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { if (lastChestSlot < 0) { for (int i = 0; i < itemHandler.getSlots(); i++) { ItemStack testStack = itemHandler.extractItem(i, 1, true); - if (!testStack.isEmpty() && testStack.getItem() instanceof ItemArrow) { + if (!testStack.isEmpty() && testStack.getItem() instanceof ArrowItem) { arrowStack = testStack; lastChestSlot = i; break; @@ -100,9 +100,9 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { arrowTimer = -1; } - List mobsInRange = world.getEntitiesWithinAABB(EntityMob.class, getBounds(pos)); + List mobsInRange = world.getEntitiesWithinAABB(MonsterEntity.class, getBounds(pos)); - for (EntityMob entity : mobsInRange) { + for (MonsterEntity entity : mobsInRange) { if (canFireOnMob(world, pos, entity))// && isMobInFilter(ent)) { target = entity; @@ -132,14 +132,14 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { return lastYaw; } - public void fireOnTarget(World world, BlockPos pos, ItemStack arrowStack, EntityLiving targetMob) { + public void fireOnTarget(World world, BlockPos pos, ItemStack arrowStack, MobEntity targetMob) { float vel = 3f; double damage = 2; if (!world.isRemote) { - if (arrowStack.getItem() instanceof ItemArrow) { + if (arrowStack.getItem() instanceof ArrowItem) { // ItemArrow arrow = (ItemArrow) arrowStack.getItem(); // EntityArrow entityarrow = arrow.createArrow(world, arrowStack, targetMob); - EntityTippedArrow entityarrow = new EntityTippedArrow(world); + ArrowEntity entityarrow = new ArrowEntity(world); entityarrow.setPotionEffect(arrowStack); entityarrow.posX = pos.getX() + 0.5; entityarrow.posY = pos.getY() + 0.5; @@ -192,12 +192,12 @@ public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java index 9d8d63d5..3be0cbb8 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -5,12 +5,12 @@ import WayofTime.bloodmagic.fakePlayer.FakePlayerBM; import WayofTime.bloodmagic.tile.TileAlchemyArray; import com.mojang.authlib.GameProfile; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.ai.EntityAITasks; -import net.minecraft.entity.ai.EntityAITasks.EntityAITaskEntry; +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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.pathfinding.Path; import net.minecraft.pathfinding.PathFinder; import net.minecraft.pathfinding.WalkNodeProcessor; @@ -28,7 +28,7 @@ import java.util.*; */ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { private FakePlayer target; - private Set tracking = new HashSet<>(); + private Set tracking = new HashSet<>(); private int counter = 0; private int maxMobsAttracted = 10000; @@ -48,7 +48,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { BlockPos pos = tile.getPos(); counter++; if (counter < 10) { - for (EntityLiving ent : tracking) { + for (MobEntity ent : tracking) { onEntityTick(pos, ent); } @@ -59,10 +59,10 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { World world = tile.getWorld(); - Set trackingThisTick = new HashSet<>(); - List entsInBounds = world.getEntitiesWithinAABB(EntityLiving.class, getBounds(pos)); + Set trackingThisTick = new HashSet<>(); + List entsInBounds = world.getEntitiesWithinAABB(MobEntity.class, getBounds(pos)); - for (EntityLiving ent : entsInBounds) { + for (MobEntity ent : entsInBounds) { if (!ent.isDead)// && isMobInFilter(ent)) { double x = (pos.getX() + 0.5D - ent.posX); @@ -92,7 +92,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { } } - for (EntityLiving e : tracking) { + for (MobEntity e : tracking) { if (!trackingThisTick.contains(e)) { onUntracked(e); } @@ -103,7 +103,7 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { return false; } - public boolean canEntityBeTracked(BlockPos pos, EntityLiving entity) { + public boolean canEntityBeTracked(BlockPos pos, MobEntity entity) { return getEntityCooldown(pos, entity) <= 0; } @@ -111,15 +111,15 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { return "BMAttractor:" + pos; } - public int getEntityCooldown(BlockPos pos, EntityLiving entity) { + public int getEntityCooldown(BlockPos pos, MobEntity entity) { return entity.getEntityData().getInteger(getPosKey(pos)); } - public void setEntityCooldown(BlockPos pos, EntityLiving entity, int cooldown) { + public void setEntityCooldown(BlockPos pos, MobEntity entity, int cooldown) { entity.getEntityData().setInteger(getPosKey(pos), cooldown); } - public void decrementEntityCooldown(BlockPos pos, EntityLiving entity) { + public void decrementEntityCooldown(BlockPos pos, MobEntity entity) { int cooldown = getEntityCooldown(pos, entity); if (cooldown > 0) { setEntityCooldown(pos, entity, cooldown - 1); @@ -134,29 +134,29 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { return 10; } - private void onUntracked(EntityLiving e) { - if (e instanceof EntityEnderman) { + private void onUntracked(MobEntity e) { + if (e instanceof EndermanEntity) { e.getEntityData().setBoolean("BM:tracked", false); } } - private void onTracked(EntityLiving e) { - if (e instanceof EntityEnderman) { + private void onTracked(MobEntity e) { + if (e instanceof EndermanEntity) { e.getEntityData().setBoolean("BM:tracked", true); } } - private void onEntityTick(BlockPos pos, EntityLiving ent) { - if (ent instanceof EntitySlime) { + 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 EntitySilverfish) { + } else if (ent instanceof SilverfishEntity) { if (counter < 10) { return; } - EntitySilverfish sf = (EntitySilverfish) ent; + SilverfishEntity sf = (SilverfishEntity) ent; Path pathentity = getPathEntityToEntity(ent, getTarget(ent.getEntityWorld(), pos), getRange()); sf.getNavigator().setPath(pathentity, sf.getAIMoveSpeed()); - } else if (ent instanceof EntityBlaze) { + } 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); @@ -169,21 +169,21 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { } ent.motionZ += z / distance * speed; } - } else if (ent instanceof EntityPigZombie || ent instanceof EntitySpider) { + } else if (ent instanceof ZombiePigmanEntity || ent instanceof SpiderEntity) { forceMove(pos, ent); // ent.setAttackTarget(target); - } else if (ent instanceof EntityEnderman) { + } else if (ent instanceof EndermanEntity) { ent.setAttackTarget(getTarget(ent.getEntityWorld(), pos)); } } - private void forceMove(BlockPos pos, EntityLiving ent) { + 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) { - EntityMob mod = (EntityMob) ent; + MonsterEntity mod = (MonsterEntity) ent; mod.faceEntity(getTarget(ent.getEntityWorld(), pos), 180, 0); mod.getMoveHelper().strafe(0, 0.3f); if (mod.posY < pos.getY()) { @@ -200,10 +200,10 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { int targZ = MathHelper.floor(targetEntity.posZ); PathFinder pf = new PathFinder(new WalkNodeProcessor()); - return pf.findPath(targetEntity.getEntityWorld(), (EntityLiving) entity, new BlockPos(targX, targY, targZ), range); + return pf.findPath(targetEntity.getEntityWorld(), (MobEntity) entity, new BlockPos(targX, targY, targZ), range); } - private boolean trackMob(BlockPos pos, EntityLiving ent) { + private boolean trackMob(BlockPos pos, MobEntity ent) { //TODO: Figure out if this crud is needed if (useSetTarget(ent)) { ent.setAttackTarget(getTarget(ent.getEntityWorld(), pos)); @@ -215,13 +215,13 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { } } - private boolean useSetTarget(EntityLiving ent) { - return ent instanceof EntityPigZombie || ent instanceof EntitySpider || ent instanceof EntitySilverfish; + private boolean useSetTarget(MobEntity ent) { + return ent instanceof ZombiePigmanEntity || ent instanceof SpiderEntity || ent instanceof SilverfishEntity; } - public void removeAssignedAITask(BlockPos pos, EntityLiving ent) { + public void removeAssignedAITask(BlockPos pos, MobEntity ent) { Set entries = ent.tasks.taskEntries; - EntityAIBase remove = null; + Goal remove = null; for (EntityAITaskEntry entry : entries) { if (entry.action instanceof AttractTask) { AttractTask at = (AttractTask) entry.action; @@ -237,11 +237,11 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { } } - private boolean attractUsingAITask(BlockPos pos, EntityLiving ent) { + private boolean attractUsingAITask(BlockPos pos, MobEntity ent) { tracking.add(ent); Set entries = ent.tasks.taskEntries; // boolean hasTask = false; - EntityAIBase remove = null; + Goal remove = null; // boolean isTracked; for (EntityAITaskEntry entry : entries) { if (entry.action instanceof AttractTask) { @@ -263,10 +263,10 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { return true; } - private void cancelCurrentTasks(EntityLiving ent) { + private void cancelCurrentTasks(MobEntity ent) { Iterator iterator = ent.tasks.taskEntries.iterator(); - List currentTasks = new ArrayList<>(); + List currentTasks = new ArrayList<>(); while (iterator.hasNext()) { EntityAITaskEntry entityaitaskentry = iterator.next(); if (entityaitaskentry != null) { @@ -285,24 +285,24 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { } } - private boolean applySpecialCase(BlockPos pos, EntityLiving ent) { - if (ent instanceof EntitySlime) { + 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 EntitySilverfish) { - EntitySilverfish es = (EntitySilverfish) ent; + } 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 EntityBlaze) { + } else if (ent instanceof BlazeEntity) { return true; } return false; } - private boolean useSpecialCase(EntityLiving ent) { - return ent instanceof EntitySlime || ent instanceof EntitySilverfish || ent instanceof EntityBlaze; + private boolean useSpecialCase(MobEntity ent) { + return ent instanceof SlimeEntity || ent instanceof SilverfishEntity || ent instanceof BlazeEntity; } public FakePlayer getTarget(World world, BlockPos pos) { @@ -315,12 +315,12 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } @@ -329,15 +329,15 @@ public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { return new AlchemyArrayEffectAttractor(key); } - private static class AttractTask extends EntityAIBase { - private EntityLiving mob; + private static class AttractTask extends Goal { + private MobEntity mob; private BlockPos coord; private FakePlayer target; private int updatesSincePathing; private boolean started = false; - private AttractTask(EntityLiving mob, FakePlayer target, BlockPos coord) { + private AttractTask(MobEntity mob, FakePlayer target, BlockPos coord) { this.mob = mob; this.coord = coord; this.target = target; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java index d3e9849c..6659fbf1 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.effect.LightningBoltEntity; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -30,7 +30,7 @@ public class AlchemyArrayEffectBinding extends AlchemyArrayEffectCrafting { BlockPos pos = tile.getPos(); ItemStack output = outputStack.copy(); - EntityItem outputEntity = new EntityItem(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); + ItemEntity outputEntity = new ItemEntity(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); tile.getWorld().spawnEntity(outputEntity); @@ -49,18 +49,18 @@ public class AlchemyArrayEffectBinding extends AlchemyArrayEffectCrafting { double dispX = distance * Math.sin(angle); double dispZ = -distance * Math.cos(angle); - EntityLightningBolt lightning = new EntityLightningBolt(world, pos.getX() + dispX, pos.getY(), pos.getZ() + dispZ, true); + LightningBoltEntity lightning = new LightningBoltEntity(world, pos.getX() + dispX, pos.getY(), pos.getZ() + dispZ, true); world.spawnEntity(lightning); } } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { //EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { //EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java index cd35b720..69f5be05 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.iface.IAlchemyArray; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -20,13 +20,13 @@ public class AlchemyArrayEffectBounce extends AlchemyArrayEffect { } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { + 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 EntityLivingBase)) { + if (!(entity instanceof LivingEntity)) { entity.motionY *= 0.8D; } @@ -35,12 +35,12 @@ public class AlchemyArrayEffectBounce extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java index 9f658335..df9ee547 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.alchemyArray; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -36,7 +36,7 @@ public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect { ItemStack output = outputStack.copy(); - EntityItem outputEntity = new EntityItem(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); + ItemEntity outputEntity = new ItemEntity(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); tile.getWorld().spawnEntity(outputEntity); @@ -47,12 +47,12 @@ public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java index b96c9052..34f2eae3 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -31,7 +31,7 @@ public class AlchemyArrayEffectCraftingNew extends AlchemyArrayEffect { ItemStack output = recipe.getOutput().copy(); - EntityItem outputEntity = new EntityItem(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); + ItemEntity outputEntity = new ItemEntity(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); tile.getWorld().spawnEntity(outputEntity); @@ -42,12 +42,12 @@ public class AlchemyArrayEffectCraftingNew extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java index 16ce80b1..73d8c090 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java @@ -4,15 +4,15 @@ import java.util.List; import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import net.minecraft.block.Block; -import net.minecraft.block.BlockFurnace; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; +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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.FurnaceTileEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -29,9 +29,9 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect { public boolean update(TileEntity tile, int ticksActive) { BlockPos pos = tile.getPos(); World world = tile.getWorld(); - EntityPlayer sacrifice = null; + PlayerEntity sacrifice = null; - for (EnumFacing face : EnumFacing.VALUES) { + 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! @@ -40,13 +40,13 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect { } TileEntity bottomTile = world.getTileEntity(furnacePos); - if (bottomTile instanceof TileEntityFurnace) { - TileEntityFurnace furnaceTile = (TileEntityFurnace) bottomTile; + 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(EntityPlayer.class, bb); - for (EntityPlayer player : playerList) { + List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, bb); + for (PlayerEntity player : playerList) { if (!player.isDead) { sacrifice = player; } @@ -70,13 +70,13 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect { return false; } - public static boolean addFuelTime(TileEntityFurnace furnaceTile, World world, BlockPos furnacePos, int cookTime) { + public static boolean addFuelTime(FurnaceTileEntity furnaceTile, World world, BlockPos furnacePos, int cookTime) { furnaceTile.setField(0, cookTime); - BlockFurnace.setState(true, world, furnacePos); + FurnaceBlock.setState(true, world, furnacePos); return true; } - public static boolean canFurnaceSmelt(TileEntityFurnace furnaceTile) { + public static boolean canFurnaceSmelt(FurnaceTileEntity furnaceTile) { ItemStack burnStack = furnaceTile.getStackInSlot(0); if (burnStack.isEmpty()) { return false; @@ -103,12 +103,12 @@ public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java index 1368cb50..ad2de048 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.alchemyArray; import java.util.Random; -import net.minecraft.block.state.IBlockState; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -71,7 +71,7 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect { if (checkIfSphere(radius, i, j, k)) { BlockPos newPos = pos.add(i, j, k); BlockPos offsetPos = newPos.up(teleportHeightOffset); - IBlockState state = world.getBlockState(newPos); + 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)) { @@ -112,7 +112,7 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger("radius", radius); tag.setInteger("teleportHeightOffset", teleportHeightOffset); tag.setInteger(Constants.NBT.X_COORD, currentPos.getX()); @@ -121,7 +121,7 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { radius = tag.getInteger("radius"); teleportHeightOffset = tag.getInteger("teleportHeightOffset"); currentPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD)); diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java index d0b08483..8277ff93 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java @@ -4,30 +4,27 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.SoundEvents; +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.nbt.NBTTagCompound; 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.WorldServer; +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; -import WayofTime.bloodmagic.util.helper.PurificationHelper; public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { public static final AreaDescriptor itemDescriptor = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11); @@ -59,11 +56,11 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { if (ticksActive >= 200) { BlockPos pos = tile.getPos(); - List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDescriptor.getAABB(pos)); + List itemList = world.getEntitiesWithinAABB(ItemEntity.class, itemDescriptor.getAABB(pos)); List inputList = new ArrayList(); - for (EntityItem entityItem : itemList) { + for (ItemEntity entityItem : itemList) { if (entityItem.isDead || entityItem.getItem().isEmpty()) { continue; } @@ -85,8 +82,8 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { double healthRequired = recipe.getHealthRequired(); double healthAvailable = 0; - List livingEntities = world.getEntitiesWithinAABB(EntityLivingBase.class, mobDescriptor.getAABB(pos)); - for (EntityLivingBase living : livingEntities) { + List livingEntities = world.getEntitiesWithinAABB(LivingEntity.class, mobDescriptor.getAABB(pos)); + for (LivingEntity living : livingEntities) { double health = getEffectiveHealth(living); if (health > 0) { healthAvailable += health; @@ -102,7 +99,7 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { if (craftTime >= REQUIRED_CRAFT_TIME) { if (!world.isRemote) { - for (EntityLivingBase living : livingEntities) { + for (LivingEntity living : livingEntities) { double health = getEffectiveHealth(living); if (healthAvailable > 0 && health > 0) { healthAvailable -= health; @@ -116,7 +113,7 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { } } - for (EntityItem itemEntity : itemList) { + for (ItemEntity itemEntity : itemList) { itemEntity.getItem().setCount(itemEntity.getItem().getCount() - 1); if (itemEntity.getItem().isEmpty()) //TODO: Check container { @@ -124,13 +121,13 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { } } - world.spawnEntity(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5, recipe.getOutput())); + 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 (EntityItem itemEntity : itemList) { + for (ItemEntity itemEntity : itemList) { ItemStack stack = itemEntity.getItem(); double velocityFactor = 0.1; @@ -146,7 +143,7 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { // world.spawnParticle(EnumParticleTypes.ITEM_CRACK, spawnPosition.x, spawnPosition.y, spawnPosition.z, velVec2.x, velVec2.y, velVec2.z, Item.getIdFromItem(stack.getItem()), stack.getMetadata()); } - for (EntityLivingBase living : livingEntities) { + for (LivingEntity living : livingEntities) { double health = getEffectiveHealth(living); if (health <= 0) { continue; @@ -165,14 +162,14 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { } //Future-proofing in case I want to make different mobs give different effective health - public double getEffectiveHealth(EntityLivingBase living) { + public double getEffectiveHealth(LivingEntity living) { if (living == null) return 0; if (!living.isNonBoss()) return 0; - if (living instanceof EntityPlayer) + if (living instanceof PlayerEntity) return 0; if (living.isChild() && !(living instanceof IMob)) @@ -189,12 +186,12 @@ public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java index 92728c9d..c626a085 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.iface.IAlchemyArray; import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -21,13 +21,13 @@ public class AlchemyArrayEffectMovement extends AlchemyArrayEffect { } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { + 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; - EnumFacing direction = array.getRotation(); + Direction direction = array.getRotation(); TileAlchemyArray tileArray = (TileAlchemyArray) array; motionY += motionYGlowstoneMod * (tileArray.getStackInSlot(0).getCount() - 1); @@ -66,12 +66,12 @@ public class AlchemyArrayEffectMovement extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java index beb4ba46..2188ff18 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.iface.ISigil; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; public class AlchemyArrayEffectSigil extends AlchemyArrayEffect { @@ -23,12 +23,12 @@ public class AlchemyArrayEffectSigil extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java index d297eb60..170877e6 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java @@ -2,15 +2,15 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.tile.TileAlchemyArray; import com.google.common.base.Predicate; -import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.MobEntity; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAITasks; -import net.minecraft.entity.ai.EntityAITasks.EntityAITaskEntry; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -25,8 +25,8 @@ 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 EntitySkeleton); - private EntitySkeleton turret; + public static Predicate checkSkeleton = input -> !(input instanceof SkeletonEntity); + private SkeletonEntity turret; public AlchemyArrayEffectSkeletonTurret(String key) { super(key); @@ -55,9 +55,9 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { World world = tile.getWorld(); - List skeletonsInRange = world.getEntitiesWithinAABB(EntitySkeleton.class, getBounds(pos)); + List skeletonsInRange = world.getEntitiesWithinAABB(SkeletonEntity.class, getBounds(pos)); - for (EntitySkeleton entity : skeletonsInRange) { + for (SkeletonEntity entity : skeletonsInRange) { if (!entity.isDead)// && isMobInFilter(ent)) { modifyAITargetTasks(entity); @@ -87,20 +87,20 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { // e.getEntityData().setBoolean("BM:tracked", true); // } - private boolean modifyAITargetTasks(EntitySkeleton entity) { + private boolean modifyAITargetTasks(SkeletonEntity entity) { cancelCurrentTargetTasks(entity); // entity.setCombatTask(); - entity.targetTasks.addTask(1, new EntityAINearestAttackableTarget(entity, EntityMob.class, 10, true, false, checkSkeleton)); + 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(EntityLiving entity) { + private void cancelCurrentTargetTasks(MobEntity entity) { Iterator iterator = entity.targetTasks.taskEntries.iterator(); - List currentTasks = new ArrayList<>(); + List currentTasks = new ArrayList<>(); while (iterator.hasNext()) { EntityAITaskEntry entityaitaskentry = iterator.next(); if (entityaitaskentry != null)// && entityaitaskentry.action instanceof EntityAITarget) @@ -115,12 +115,12 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } @@ -129,15 +129,15 @@ public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { return new AlchemyArrayEffectSkeletonTurret(key); } - private static class AttractTask extends EntityAIBase { - private EntityLiving mob; + private static class AttractTask extends Goal { + private MobEntity mob; private BlockPos coord; private FakePlayer target; private int updatesSincePathing; private boolean started = false; - private AttractTask(EntityLiving mob, FakePlayer target, BlockPos coord) { + private AttractTask(MobEntity mob, FakePlayer target, BlockPos coord) { this.mob = mob; this.coord = coord; this.target = target; diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java index 57d7f774..47d36731 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.alchemyArray; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -21,19 +21,19 @@ public class AlchemyArrayEffectSpike extends AlchemyArrayEffect { } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { - if (entity instanceof EntityLivingBase) { + 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(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java index 82b16d12..04fee39c 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java @@ -1,19 +1,19 @@ package WayofTime.bloodmagic.alchemyArray; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.SoundEvents; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.play.server.SPacketUpdateHealth; +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.EnumFacing; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ServerWorld; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.iface.IAlchemyArray; @@ -31,13 +31,13 @@ public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect { } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { - EnumFacing direction = array.getRotation(); + 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, EnumFacing 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); @@ -50,15 +50,15 @@ public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect { 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 EntityPlayer) { - EntityPlayerMP player = (EntityPlayerMP) entity; + 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 SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); + player.connection.sendPacket(new SUpdateHealthPacket(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); } else { - WorldServer worldServer = (WorldServer) entity.getEntityWorld(); + ServerWorld worldServer = (ServerWorld) entity.getEntityWorld(); entity.setPosition(x + 0.5, y + 0.5, z + 0.5); worldServer.resetUpdateEntityTick(); @@ -71,12 +71,12 @@ public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java index c73d7da1..dfd9f1be 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java @@ -2,9 +2,9 @@ package WayofTime.bloodmagic.alchemyArray; import WayofTime.bloodmagic.iface.IAlchemyArray; import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -20,7 +20,7 @@ public class AlchemyArrayEffectUpdraft extends AlchemyArrayEffect { } @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, IBlockState state, Entity entity) { + public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, BlockState state, Entity entity) { double motionY = 1; double motionYGlowstoneMod = 0.1; double motionYFeatherMod = 0.05; @@ -34,12 +34,12 @@ public class AlchemyArrayEffectUpdraft extends AlchemyArrayEffect { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java index 51782a6b..0f24ac37 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java @@ -7,7 +7,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; public class AlchemyCircleRenderer { @@ -86,8 +86,8 @@ public class AlchemyCircleRenderer { GlStateManager.translate(x, y, z); // Specify which face this "circle" is located on - EnumFacing sideHit = EnumFacing.UP; - EnumFacing rotation = tileArray.getRotation(); + Direction sideHit = Direction.UP; + Direction rotation = tileArray.getRotation(); GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java index acde6d6d..abbf30c4 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.altar; 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.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -26,7 +26,7 @@ public class AltarUtil { for (AltarTier tier : AltarTier.values()) { for (AltarComponent component : tier.getAltarComponents()) { BlockPos componentPos = pos.add(component.getOffset()); - IBlockState worldState = world.getBlockState(componentPos); + BlockState worldState = world.getBlockState(componentPos); if (worldState.getBlock() instanceof IAltarComponent) if (((IAltarComponent) worldState.getBlock()).getType(world, worldState, componentPos) == component.getComponent()) @@ -35,7 +35,7 @@ public class AltarUtil { if (component.getComponent() == ComponentType.NOTAIR && worldState.getMaterial() != Material.AIR && !worldState.getMaterial().isLiquid()) continue; - List validStates = BloodMagicAPI.INSTANCE.getComponentStates(component.getComponent()); + List validStates = BloodMagicAPI.INSTANCE.getComponentStates(component.getComponent()); if (!validStates.contains(worldState)) return lastCheck; } @@ -55,7 +55,7 @@ public class AltarUtil { continue; BlockPos componentPos = pos.add(component.getOffset()); - IBlockState state = world.getBlockState(componentPos); + BlockState state = world.getBlockState(componentPos); if (state.getBlock() instanceof BlockBloodRune) upgrades.upgrade(((BlockBloodRune) state.getBlock()).getBloodRune(world, componentPos, state)); } @@ -71,11 +71,11 @@ public class AltarUtil { for (AltarTier tier : AltarTier.values()) { for (AltarComponent component : tier.getAltarComponents()) { BlockPos componentPos = pos.add(component.getOffset()); - IBlockState worldState = world.getBlockState(componentPos); + 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()); + List validStates = BloodMagicAPI.INSTANCE.getComponentStates(component.getComponent()); if (!validStates.contains(worldState)) return Pair.of(componentPos, component.getComponent()); } diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 5dda98bc..7d13dc2e 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -16,15 +16,15 @@ 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.BlockRedstoneLight; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; +import net.minecraft.block.RedstoneLampBlock; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +import net.minecraft.nbt.CompoundNBT; +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.WorldServer; +import net.minecraft.world.ServerWorld; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; @@ -75,7 +75,7 @@ public class BloodAltar implements IFluidHandler { this.tileAltar = tileAltar; } - public void readFromNBT(NBTTagCompound tagCompound) { + public void readFromNBT(CompoundNBT tagCompound) { if (!tagCompound.hasKey(Constants.NBT.EMPTY)) { FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagCompound); @@ -119,7 +119,7 @@ public class BloodAltar implements IFluidHandler { currentTierDisplayed = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(AltarTier.ONE); } - public void writeToNBT(NBTTagCompound tagCompound) { + public void writeToNBT(CompoundNBT tagCompound) { if (fluid != null) fluid.writeToNBT(tagCompound); @@ -213,9 +213,9 @@ public class BloodAltar implements IFluidHandler { lockdownDuration--; if (internalCounter % 20 == 0) { - for (EnumFacing facing : EnumFacing.VALUES) { + for (Direction facing : Direction.VALUES) { BlockPos newPos = pos.offset(facing); - IBlockState block = world.getBlockState(newPos); + BlockState block = world.getBlockState(newPos); block.getBlock().onNeighborChange(world, newPos, pos); } } @@ -244,7 +244,7 @@ public class BloodAltar implements IFluidHandler { if (internalCounter % 100 == 0 && (this.isActive || this.cooldownAfterCrafting <= 0)) { /* Redstone Lamp below altar: Switch Off */ - IBlockState state = world.getBlockState(pos); + BlockState state = world.getBlockState(pos); if (state.getValue(BlockAltar.POWERED)) { world.setBlockState(pos, state.cycleProperty(BlockAltar.POWERED), 3); world.notifyNeighborsOfStateChange(pos, RegistrarBloodMagicBlocks.ALTAR, false); @@ -301,16 +301,16 @@ public class BloodAltar implements IFluidHandler { hasOperated = true; - if (internalCounter % 4 == 0 && world instanceof WorldServer) { - WorldServer server = (WorldServer) world; + 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 WorldServer) { - WorldServer server = (WorldServer) world; + 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); } } @@ -324,14 +324,14 @@ public class BloodAltar implements IFluidHandler { tileAltar.setInventorySlotContents(0, event.getOutput()); progress = 0; - if (world instanceof WorldServer) { - WorldServer server = (WorldServer) world; + 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 BlockRedstoneLight) { + if (world.getBlockState(pos.down()).getBlock() instanceof RedstoneLampBlock) { world.setBlockState(pos, world.getBlockState(pos).cycleProperty(BlockAltar.POWERED), 3); world.notifyNeighborsOfStateChange(pos, RegistrarBloodMagicBlocks.ALTAR, false); } @@ -357,8 +357,8 @@ public class BloodAltar implements IFluidHandler { 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 WorldServer) { - WorldServer server = (WorldServer) world; + 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); } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java index 6a96dc66..b1b4635a 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.altar; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -8,5 +8,5 @@ import javax.annotation.Nullable; public interface IAltarComponent { @Nullable - ComponentType getType(World world, IBlockState state, BlockPos pos); + ComponentType getType(World world, BlockState state, BlockPos pos); } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index 528f99ab..8401afe0 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -5,7 +5,7 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import javax.annotation.Nonnull; import java.util.List; @@ -17,7 +17,7 @@ public class BloodMagicAPI implements IBloodMagicAPI { private final BloodMagicBlacklist blacklist; private final BloodMagicRecipeRegistrar recipeRegistrar; private final BloodMagicValueManager valueManager; - private final Multimap altarComponents; + private final Multimap altarComponents; public BloodMagicAPI() { this.blacklist = new BloodMagicBlacklist(); @@ -45,7 +45,7 @@ public class BloodMagicAPI implements IBloodMagicAPI { } @Override - public void registerAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType) { + public void registerAltarComponent(@Nonnull BlockState state, @Nonnull String componentType) { ComponentType component = null; for (ComponentType type : ComponentType.VALUES) { if (type.name().equalsIgnoreCase(componentType)) { @@ -61,7 +61,7 @@ public class BloodMagicAPI implements IBloodMagicAPI { } @Override - public void unregisterAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType) { + public void unregisterAltarComponent(@Nonnull BlockState state, @Nonnull String componentType) { ComponentType component = null; for (ComponentType type : ComponentType.VALUES) { if (type.name().equalsIgnoreCase(componentType)) { @@ -77,7 +77,7 @@ public class BloodMagicAPI implements IBloodMagicAPI { } @Nonnull - public List getComponentStates(ComponentType component) { - return (List) altarComponents.get(component); + public List getComponentStates(ComponentType component) { + return (List) altarComponents.get(component); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java index 18029c71..74a668fc 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java @@ -5,7 +5,7 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.util.ResourceLocation; import javax.annotation.Nonnull; @@ -13,10 +13,10 @@ import java.util.Set; public class BloodMagicBlacklist implements IBloodMagicBlacklist { - private final Set teleposer; + private final Set teleposer; private final Set teleposerEntities; - private final Set transposition; - private final Set greenGrove; + private final Set transposition; + private final Set greenGrove; private final Set sacrifice; public BloodMagicBlacklist() { @@ -28,7 +28,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { } @Override - public void addTeleposer(@Nonnull IBlockState state) { + public void addTeleposer(@Nonnull BlockState state) { if (!teleposer.contains(state)) { BMLog.API_VERBOSE.info("Blacklist: Added {} to the Teleposer blacklist.", state); teleposer.add(state); @@ -36,7 +36,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { } public void addTeleposer(@Nonnull Block block) { - for (IBlockState state : block.getBlockState().getValidStates()) + for (BlockState state : block.getBlockState().getValidStates()) addTeleposer(state); } @@ -49,7 +49,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { } @Override - public void addTransposition(@Nonnull IBlockState state) { + public void addTransposition(@Nonnull BlockState state) { if (!transposition.contains(state)) { BMLog.API_VERBOSE.info("Blacklist: Added {} to the Transposition blacklist.", state); transposition.add(state); @@ -57,12 +57,12 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { } public void addTransposition(@Nonnull Block block) { - for (IBlockState state : block.getBlockState().getValidStates()) + for (BlockState state : block.getBlockState().getValidStates()) addTransposition(state); } @Override - public void addGreenGrove(@Nonnull IBlockState state) { + 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); @@ -70,7 +70,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { } public void addGreenGrove(@Nonnull Block block) { - for (IBlockState state : block.getBlockState().getValidStates()) + for (BlockState state : block.getBlockState().getValidStates()) addGreenGrove(state); } @@ -84,7 +84,7 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { // Internal use getters - public Set getTeleposer() { + public Set getTeleposer() { return ImmutableSet.copyOf(teleposer); } @@ -92,11 +92,11 @@ public class BloodMagicBlacklist implements IBloodMagicBlacklist { return ImmutableSet.copyOf(teleposerEntities); } - public Set getTransposition() { + public Set getTransposition() { return ImmutableSet.copyOf(transposition); } - public Set getGreenGrove() { + public Set getGreenGrove() { return ImmutableSet.copyOf(greenGrove); } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index c59bbbe6..5f4bb3d3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -17,7 +17,7 @@ import WayofTime.bloodmagic.incense.EnumTranquilityType; import WayofTime.bloodmagic.incense.TranquilityStack; import WayofTime.bloodmagic.util.StateUtil; import net.minecraft.block.Block; -import net.minecraft.init.Blocks; +import net.minecraft.block.Blocks; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.ForgeRegistries; diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java index 5c894574..830db0c3 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java @@ -7,7 +7,7 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.util.ResourceLocation; import javax.annotation.Nonnull; @@ -16,7 +16,7 @@ import java.util.Map; public class BloodMagicValueManager implements IBloodMagicValueManager { private final Map sacrificial; - private final Map tranquility; + private final Map tranquility; public BloodMagicValueManager() { this.sacrificial = Maps.newHashMap(); @@ -30,7 +30,7 @@ public class BloodMagicValueManager implements IBloodMagicValueManager { } @Override - public void setTranquility(@Nonnull IBlockState state, @Nonnull String tranquilityType, double value) { + public void setTranquility(@Nonnull BlockState state, @Nonnull String tranquilityType, double value) { EnumTranquilityType tranquility = null; for (EnumTranquilityType type : EnumTranquilityType.values()) { if (type.name().equalsIgnoreCase(tranquilityType)) { @@ -46,7 +46,7 @@ public class BloodMagicValueManager implements IBloodMagicValueManager { } public void setTranquility(Block block, TranquilityStack tranquilityStack) { - for (IBlockState state : block.getBlockState().getValidStates()) { + 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); } @@ -56,7 +56,7 @@ public class BloodMagicValueManager implements IBloodMagicValueManager { return ImmutableMap.copyOf(sacrificial); } - public Map getTranquility() { + public Map getTranquility() { return ImmutableMap.copyOf(tranquility); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java index 589c8b16..95ed17c9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java @@ -7,17 +7,17 @@ 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.block.state.IBlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; +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.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -41,12 +41,12 @@ public class BlockAlchemyArray extends Block { } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean p_185477_7_) { + 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, IBlockState state, Entity entity) { + 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); @@ -54,7 +54,7 @@ public class BlockAlchemyArray extends Block { } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return ARRAY_AABB; } @@ -65,32 +65,32 @@ public class BlockAlchemyArray extends Block { } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.INVISIBLE; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.INVISIBLE; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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) @@ -135,7 +135,7 @@ public class BlockAlchemyArray extends Block { } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { + public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES); } @@ -145,7 +145,7 @@ public class BlockAlchemyArray extends Block { } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { + public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { TileAlchemyArray alchemyArray = (TileAlchemyArray) world.getTileEntity(blockPos); if (alchemyArray != null) alchemyArray.dropItems(); @@ -154,13 +154,13 @@ public class BlockAlchemyArray extends Block { } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + 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 index c8867b87..2520e983 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java @@ -5,18 +5,18 @@ 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.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +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.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -26,7 +26,7 @@ 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", EnumFacing.class); + 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() { @@ -42,42 +42,42 @@ public class BlockAlchemyTable extends Block implements IBMBlock { // setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); } - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return BODY; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override - public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { + public boolean canRenderInLayer(BlockState state, BlockRenderLayer layer) { return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.TRANSLUCENT; } @Override - public IBlockState getStateFromMeta(int meta) { + public BlockState getStateFromMeta(int meta) { return this.getDefaultState(); } @@ -85,12 +85,12 @@ public class BlockAlchemyTable extends Block implements IBMBlock { * Convert the BlockState into the correct metadata value */ @Override - public int getMetaFromState(IBlockState state) { + public int getMetaFromState(BlockState state) { return 0; } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { + 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()); @@ -105,7 +105,7 @@ public class BlockAlchemyTable extends Block implements IBMBlock { } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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) { @@ -124,7 +124,7 @@ public class BlockAlchemyTable extends Block implements IBMBlock { } @Override - public void breakBlock(World world, BlockPos pos, IBlockState blockState) { + public void breakBlock(World world, BlockPos pos, BlockState blockState) { TileAlchemyTable tile = (TileAlchemyTable) world.getTileEntity(pos); if (tile != null && !tile.isSlave()) { tile.dropItems(); @@ -134,18 +134,18 @@ public class BlockAlchemyTable extends Block implements IBMBlock { } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileAlchemyTable(); } @Override - public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { + 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(); @@ -158,7 +158,7 @@ public class BlockAlchemyTable extends Block implements IBMBlock { } @Override - public ItemBlock getItem() { + 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 index 712adb94..60482da1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -17,22 +17,22 @@ 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.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +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.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import org.apache.commons.lang3.tuple.Pair; @@ -57,17 +57,17 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl setHarvestLevel("pickaxe", 1); } - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return BODY; } @Override - public boolean hasComparatorInputOverride(IBlockState state) { + public boolean hasComparatorInputOverride(BlockState state) { return true; } @Override - public int getComparatorInputOverride(IBlockState state, World world, BlockPos pos) { + public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { if (world.isRemote) return 0; @@ -102,32 +102,32 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return true; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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()) @@ -150,7 +150,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { + public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { TileEntity tile = world.getTileEntity(blockPos); if (tile instanceof TileAltar) ((TileAltar) tile).dropItems(); @@ -159,41 +159,41 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileAltar(); } // IDocumentedBlock @Override - public List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state) { + 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 TextComponentTranslation("chat.bloodmagic.altar.nextTier", new TextComponentTranslation(missingBlock.getRight().getKey()), Utils.prettifyBlockPosString(missingBlock.getLeft()))); + docs.add(new TranslationTextComponent("chat.bloodmagic.altar.nextTier", new TranslationTextComponent(missingBlock.getRight().getKey()), Utils.prettifyBlockPosString(missingBlock.getLeft()))); return docs; } @Override - public ItemBlock getItem() { - return new ItemBlock(this); + public BlockItem getItem() { + return new BlockItem(this); } /* Redstone code, taken from BlockLever */ - public int getWeakPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { + public int getWeakPower(BlockState blockState, IBlockAccess blockAccess, BlockPos pos, Direction side) { return blockState.getValue(POWERED) ? 15 : 0; } - public int getStrongPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { + public int getStrongPower(BlockState blockState, IBlockAccess blockAccess, BlockPos pos, Direction side) { if (!blockState.getValue(POWERED)) { return 0; } else { @@ -201,15 +201,15 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl } } - public boolean canProvidePower(IBlockState state) { + public boolean canProvidePower(BlockState state) { return true; } - public IBlockState getStateFromMeta(int meta) { + public BlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(POWERED, meta > 0); } - public int getMetaFromState(IBlockState state) { + public int getMetaFromState(BlockState state) { return state.getValue(POWERED) ? 1 : 0; } @@ -217,7 +217,7 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl return new BlockStateContainer(this, POWERED); } - public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { + 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 index 99b5a6e2..cfa597dc 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -3,14 +3,14 @@ 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.block.state.IBlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; +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.EnumHand; +import net.minecraft.util.Hand; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -32,13 +32,13 @@ public class BlockBloodLight extends Block { } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Nullable @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { + public AxisAlignedBB getCollisionBoundingBox(BlockState blockState, IBlockAccess worldIn, BlockPos pos) { return NULL_AABB; } @@ -54,27 +54,27 @@ public class BlockBloodLight extends Block { } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public int getLightValue(IBlockState state) { + public int getLightValue(BlockState state) { return 15; } @@ -90,12 +90,12 @@ public class BlockBloodLight extends Block { @Override @SideOnly(Side.CLIENT) - public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) { - EntityPlayerSP player = Minecraft.getMinecraft().player; + public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random rand) { + ClientPlayerEntity player = Minecraft.getMinecraft().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(EnumHand.MAIN_HAND); + ItemStack heldItem = player.getHeldItem(Hand.MAIN_HAND); if (heldItem.isEmpty() || heldItem.getItem() != RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT) return; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java index 538385b8..2f1d3a77 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java @@ -5,9 +5,9 @@ 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.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -32,7 +32,7 @@ public class BlockBloodRune extends BlockEnum implements IBloodRu @Nullable @Override - public BloodRuneType getBloodRune(IBlockAccess world, BlockPos pos, IBlockState state) { + public BloodRuneType getBloodRune(IBlockAccess world, BlockPos pos, BlockState state) { return state.getValue(getProperty()); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 7dfa8ce2..a3bdfd77 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -6,19 +6,19 @@ 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.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -49,13 +49,13 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return BOX; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override @@ -65,28 +65,28 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity tile, ItemStack stack) { + 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(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) { + 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, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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); @@ -99,23 +99,23 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) { + 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, IBlockState blockState, int fortune) { + 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()); - NBTTagCompound fluidTag = new NBTTagCompound(); + CompoundNBT fluidTag = new CompoundNBT(); if (bloodTank.getTank().getFluid() != null) { bloodTank.getTank().getFluid().writeToNBT(fluidTag); - NBTTagCompound dropTag = new NBTTagCompound(); + CompoundNBT dropTag = new CompoundNBT(); dropTag.setTag("Fluid", fluidTag); drop.setTagCompound(dropTag); } @@ -125,11 +125,11 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public void onBlockPlacedBy(World world, BlockPos pos, IBlockState blockState, EntityLivingBase placer, ItemStack stack) { + 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; - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (stack.hasTagCompound() && stack.getTagCompound().hasKey("Fluid")) { FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag("Fluid")); bloodTank.getTank().setFluid(fluidStack); @@ -142,7 +142,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) { + public int getLightValue(BlockState state, IBlockAccess world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBloodTank) { FluidStack fluidStack = ((TileBloodTank) tile).getTank().getFluid(); @@ -153,17 +153,17 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { + public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { return new ItemStack(this, 1, getMetaFromState(state)); } @Override - public boolean hasComparatorInputOverride(IBlockState state) { + public boolean hasComparatorInputOverride(BlockState state) { return true; } @Override - public int getComparatorInputOverride(IBlockState state, World world, BlockPos pos) { + public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBloodTank) return ((TileBloodTank) tile).getComparatorOutput(); @@ -171,17 +171,17 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB } @Override - public TileEntity createTileEntity(World worldIn, IBlockState blockState) { + public TileEntity createTileEntity(World worldIn, BlockState blockState) { return new TileBloodTank(getMetaFromState(blockState)); } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Override - public ItemBlock getItem() { + public BlockItem getItem() { return new ItemBlockBloodTank(this); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java index 12a14983..13c04c99 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java @@ -6,7 +6,7 @@ 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.creativetab.CreativeTabs; +import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; @@ -23,7 +23,7 @@ public class BlockDecorative extends BlockEnum { } @Override - public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { + 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; diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java index 69b59a5a..52df7b4d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java @@ -8,16 +8,16 @@ 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.block.state.IBlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +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.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -58,7 +58,7 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl // setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); } - private static List getCollisionBoxList(IBlockState state) { + private static List getCollisionBoxList(BlockState state) { ArrayList collBox = new ArrayList<>(Arrays.asList(ARMS)); collBox.add(BODY); collBox.addAll(Arrays.asList(FEET)); @@ -66,32 +66,32 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return BODY; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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); @@ -111,7 +111,7 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { + public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { TileDemonCrucible tile = (TileDemonCrucible) world.getTileEntity(blockPos); if (tile != null) tile.dropItems(); @@ -120,23 +120,23 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileDemonCrucible(); } @Override - public ItemBlock getItem() { - return new ItemBlock(this); + public BlockItem getItem() { + return new BlockItem(this); } @Override - public RayTraceResult collisionRayTrace(IBlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { + public RayTraceResult collisionRayTrace(BlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { List list = Lists.newArrayList(); @@ -162,7 +162,7 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { + 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)) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java index 9463e459..a98e8d43 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java @@ -10,20 +10,20 @@ 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.block.state.IBlockState; -import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemGroup; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -42,8 +42,8 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid 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", EnumFacing.class); - private static final EnumMap bounds = new EnumMap<>(EnumFacing.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 = { @@ -103,7 +103,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid public BlockDemonCrystal() { super(Material.ROCK); - this.setDefaultState(this.blockState.getBaseState().withProperty(TYPE, EnumDemonWillType.DEFAULT).withProperty(ATTACHED, EnumFacing.UP)); + this.setDefaultState(this.blockState.getBaseState().withProperty(TYPE, EnumDemonWillType.DEFAULT).withProperty(ATTACHED, Direction.UP)); setTranslationKey(BloodMagic.MODID + ".demonCrystal."); setCreativeTab(BloodMagic.TAB_BM); @@ -137,7 +137,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } // collects a sublist from 0 to age for the collision boxes - private static List getCollisionBoxList(IBlockState state) { + private static List getCollisionBoxList(BlockState state) { int age = state.getValue(BlockDemonCrystal.AGE) + 1; switch (state.getValue(BlockDemonCrystal.ATTACHED)) { case DOWN: @@ -157,7 +157,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { TileEntity tile = source.getTileEntity(pos); if (tile != null) state = getActualState(state, tile.getWorld(), pos); @@ -179,7 +179,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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) { @@ -207,7 +207,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public void getDrops(NonNullList drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { + 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); @@ -218,7 +218,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { + public BlockState getActualState(BlockState state, IBlockAccess world, BlockPos pos) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileDemonCrystal) { TileDemonCrystal crystal = (TileDemonCrystal) tile; @@ -229,13 +229,13 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { + 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; - EnumFacing placement = crystal.getPlacement(); + Direction placement = crystal.getPlacement(); BlockPos offsetPos = pos.offset(placement.getOpposite()); - IBlockState offsetState = world.getBlockState(offsetPos); + BlockState offsetState = world.getBlockState(offsetPos); if (!offsetState.isSideSolid(world, offsetPos, placement)) world.destroyBlock(pos, true); @@ -243,62 +243,62 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side) { + public boolean canPlaceBlockOnSide(World world, BlockPos pos, Direction side) { BlockPos offsetPos = pos.offset(side.getOpposite()); - IBlockState offsetState = world.getBlockState(offsetPos); + BlockState offsetState = world.getBlockState(offsetPos); return offsetState.isSideSolid(world, offsetPos, side) && this.canPlaceBlockAt(world, pos); } @Override - public void getSubBlocks(CreativeTabs creativeTabs, NonNullList list) { + 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, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity tile, ItemStack stack) { + 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(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) { + 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(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override - public IBlockState getStateFromMeta(int meta) { + public BlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(TYPE, EnumDemonWillType.values()[meta]); } @Override - public int getMetaFromState(IBlockState state) { + public int getMetaFromState(BlockState state) { return state.getValue(TYPE).ordinal(); } @@ -309,18 +309,18 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileDemonCrystal(); } @Override - public ItemBlock getItem() { + public BlockItem getItem() { return new ItemBlockDemonCrystal(this); } @@ -331,7 +331,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public RayTraceResult collisionRayTrace(IBlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { + public RayTraceResult collisionRayTrace(BlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { List list = Lists.newArrayList(); @@ -357,7 +357,7 @@ public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvid } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { + 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)) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java index b5dd79c5..099f13f6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java @@ -4,20 +4,20 @@ 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.BlockContainer; +import net.minecraft.block.BlockState; +import net.minecraft.block.ContainerBlock; import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.ItemBlock; +import net.minecraft.item.BlockItem; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; +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 BlockContainer implements IVariantProvider, IBMBlock { +public class BlockDemonCrystallizer extends ContainerBlock implements IVariantProvider, IBMBlock { public BlockDemonCrystallizer() { super(Material.ROCK); @@ -31,33 +31,33 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr } @Override - public boolean isSideSolid(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { - return side == EnumFacing.UP; + public boolean isSideSolid(BlockState state, IBlockAccess world, BlockPos pos, Direction side) { + return side == Direction.UP; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override @@ -71,7 +71,7 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr } @Override - public ItemBlock getItem() { - return new ItemBlock(this); + public BlockItem getItem() { + return new BlockItem(this); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java index 10fb1fa0..9ee5eca8 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java @@ -5,7 +5,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.IStringSerializable; import javax.annotation.Nonnull; @@ -24,7 +24,7 @@ public class BlockDemonPillarBase & IStringSerializable> exten @Override public void gatherVariants(@Nonnull Int2ObjectMap variants) { - EnumFacing.Axis[] axis = new EnumFacing.Axis[]{EnumFacing.Axis.Y, EnumFacing.Axis.X, EnumFacing.Axis.Z}; + 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++) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java index 7621d7ca..ddf7253b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java @@ -5,7 +5,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.IStringSerializable; import javax.annotation.Nonnull; @@ -24,8 +24,8 @@ public class BlockDemonPillarCapBase & IStringSerializable> ex @Override public void gatherVariants(@Nonnull Int2ObjectMap variants) { - for (int i = 0; i < EnumFacing.values().length; i++) + for (int i = 0; i < Direction.values().length; i++) for (int j = 0; j < this.getTypes().length; j++) - variants.put(i * 2 + j, "facing=" + EnumFacing.values()[i] + ",type=" + this.getTypes()[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 index 5fb6a912..e1cca4d9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java @@ -4,13 +4,13 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileDemonPylon; import com.google.common.collect.Lists; -import net.minecraft.block.BlockContainer; +import net.minecraft.block.BlockState; +import net.minecraft.block.ContainerBlock; import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; -import net.minecraft.item.ItemBlock; +import net.minecraft.item.BlockItem; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumBlockRenderType; +import net.minecraft.block.BlockRenderType; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; @@ -23,7 +23,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVariantProvider { +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 @@ -45,7 +45,7 @@ public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVarian // setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); } - private static List getCollisionBoxList(IBlockState state) { + private static List getCollisionBoxList(BlockState state) { ArrayList collBox = new ArrayList<>(Arrays.asList(ARMS)); collBox.add(BODY); collBox.addAll(Arrays.asList(FEET)); @@ -53,33 +53,33 @@ public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVarian } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return BODY; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override @@ -88,12 +88,12 @@ public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVarian } @Override - public ItemBlock getItem() { - return new ItemBlock(this); + public BlockItem getItem() { + return new BlockItem(this); } @Override - public RayTraceResult collisionRayTrace(IBlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { + public RayTraceResult collisionRayTrace(BlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { List list = Lists.newArrayList(); @@ -119,7 +119,7 @@ public class BlockDemonPylon extends BlockContainer implements IBMBlock, IVarian } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { + 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)) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java index 50f69dbc..7c4471d1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java @@ -8,8 +8,8 @@ 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.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; @@ -39,22 +39,22 @@ public class BlockDimensionalPortal extends BlockInteger { } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { + public AxisAlignedBB getCollisionBoundingBox(BlockState state, IBlockAccess world, BlockPos pos) { return null; } @@ -67,12 +67,12 @@ public class BlockDimensionalPortal extends BlockInteger { } @Override - public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) { + public int getLightValue(BlockState state, IBlockAccess world, BlockPos pos) { return 12; } @Override - public void onEntityCollision(World world, BlockPos pos, IBlockState blockState, Entity entity) { + 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); @@ -109,7 +109,7 @@ public class BlockDimensionalPortal extends BlockInteger { } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess world, BlockPos pos) { int meta = state.getBlock().getMetaFromState(state); if (meta == 0) { return AABB_0; @@ -135,18 +135,18 @@ public class BlockDimensionalPortal extends BlockInteger { @Override @SideOnly(Side.CLIENT) - public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) { + public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random rand) { this.spawnParticles(world, pos.getX(), pos.getY(), pos.getZ()); } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileDimensionalPortal(); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java index c97d1861..e4c22de3 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java @@ -4,11 +4,11 @@ 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.block.state.IBlockState; -import net.minecraft.item.ItemBlock; +import net.minecraft.item.BlockItem; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -30,37 +30,37 @@ public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlo } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { + public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { TileIncenseAltar TileIncenseAltar = (TileIncenseAltar) world.getTileEntity(blockPos); if (TileIncenseAltar != null) TileIncenseAltar.dropItems(); @@ -69,18 +69,18 @@ public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlo } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileIncenseAltar(); } @Override - public ItemBlock getItem() { - return new ItemBlock(this); + 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 index 15ed0f5a..7e52286f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -3,11 +3,11 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -22,7 +22,7 @@ public class BlockInputRoutingNode extends BlockRoutingNode { @Override //TODO: Combine BlockInputRoutingNode and BlockInputRoutingNode so they have the same superclass - public void breakBlock(World world, BlockPos pos, IBlockState state) { + public void breakBlock(World world, BlockPos pos, BlockState state) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileInputRoutingNode) { ((TileInputRoutingNode) tile).removeAllConnections(); @@ -32,7 +32,7 @@ public class BlockInputRoutingNode extends BlockRoutingNode { } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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()); } @@ -41,13 +41,13 @@ public class BlockInputRoutingNode extends BlockRoutingNode { } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + 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 index 70c68a04..ec8f6737 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java @@ -8,13 +8,12 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumBlockRenderType; +import net.minecraft.block.BlockRenderType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.property.Properties; public class BlockInversionPillar extends BlockEnum { public BlockInversionPillar() { @@ -29,7 +28,7 @@ public class BlockInversionPillar extends BlockEnum { } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { + public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { TileEntity tile = world.getTileEntity(blockPos); if (tile instanceof TileInversionPillar) { TileInversionPillar tilePillar = (TileInversionPillar) world.getTileEntity(blockPos); @@ -40,33 +39,33 @@ public class BlockInversionPillar extends BlockEnum { } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { + public BlockState getActualState(BlockState state, IBlockAccess world, BlockPos pos) { return super.getActualState(state, world, pos).withProperty(Properties.StaticProperty, true); } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override @@ -76,12 +75,12 @@ public class BlockInversionPillar extends BlockEnum { } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileInversionPillar(state.getValue(getProperty()).getType()); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java index 0b233797..d373d242 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java @@ -5,10 +5,10 @@ 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.block.state.IBlockState; -import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -25,28 +25,28 @@ public class BlockInversionPillarEnd extends BlockEnum impleme } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java index 805e9d9c..585a11b4 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.tile.routing.TileItemRoutingNode; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -18,7 +18,7 @@ public class BlockItemRoutingNode extends BlockRoutingNode { } @Override - public void breakBlock(World world, BlockPos pos, IBlockState state) { + public void breakBlock(World world, BlockPos pos, BlockState state) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileRoutingNode) { ((TileRoutingNode) tile).removeAllConnections(); @@ -27,13 +27,13 @@ public class BlockItemRoutingNode extends BlockRoutingNode { } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileItemRoutingNode(); } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java index c69e9caa..c985563d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -20,13 +20,13 @@ public class BlockMasterRoutingNode extends BlockRoutingNode { } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileMasterRoutingNode(); } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index 6675b63e..a3e10e77 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -9,19 +9,18 @@ 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.Block; -import net.minecraft.block.SoundType; +import net.minecraft.block.*; import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemBlock; +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.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -48,7 +47,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent @Nullable @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { + public AxisAlignedBB getCollisionBoundingBox(BlockState state, IBlockAccess world, BlockPos pos) { switch (this.getMetaFromState(state)) { case 1: case 2: @@ -60,7 +59,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent if (mimicBlock == Blocks.AIR) { return FULL_BLOCK_AABB; } - IBlockState mimicState = tileMimic.getReplacedState(); + BlockState mimicState = tileMimic.getReplacedState(); if (mimicBlock != this) { return mimicState.getCollisionBoundingBox(world, pos); } @@ -76,14 +75,14 @@ public class BlockMimic extends BlockEnum implements IAltarComponent @Override @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World world, BlockPos pos) { + 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; } - IBlockState mimicState = tileMimic.getReplacedState(); + BlockState mimicState = tileMimic.getReplacedState(); if (mimicBlock != this) { return mimicState.getSelectedBoundingBox(world, pos); } @@ -93,7 +92,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public int getLightOpacity(IBlockState state) { + public int getLightOpacity(BlockState state) { switch (this.getMetaFromState(state)) { case 2: case 4: @@ -104,7 +103,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public int getLightValue(IBlockState state) { + public int getLightValue(BlockState state) { switch (this.getMetaFromState(state)) { case 3: return 15; @@ -114,7 +113,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public int getMetaFromState(IBlockState state) { + public int getMetaFromState(BlockState state) { if (state.getBlock() == this) { return super.getMetaFromState(state); } @@ -123,23 +122,23 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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 IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { + 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 ItemBlock) { - Block block = ((ItemBlock) stack.getItem()).getBlock(); - IBlockState mimicState = mimic.getReplacedState(); + if (stack.getItem() instanceof BlockItem) { + Block block = ((BlockItem) stack.getItem()).getBlock(); + BlockState mimicState = mimic.getReplacedState(); if (block != this) { - if (block.getRenderType(mimicState) == EnumBlockRenderType.ENTITYBLOCK_ANIMATED) { + 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) } @@ -151,32 +150,32 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { + public boolean canRenderInLayer(BlockState state, BlockRenderLayer layer) { return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.CUTOUT; } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { + public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { TileEntity tile = world.getTileEntity(blockPos); if (tile instanceof TileMimic) { TileMimic TileMimic = (TileMimic) world.getTileEntity(blockPos); @@ -188,12 +187,12 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileMimic(); } @@ -201,13 +200,13 @@ public class BlockMimic extends BlockEnum implements IAltarComponent @Nullable @Override - public ComponentType getType(World world, IBlockState state, BlockPos pos) { + 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 ItemBlock) { - Block block = ((ItemBlock) stack.getItem()).getBlock(); + if (stack.getItem() instanceof BlockItem) { + Block block = ((BlockItem) stack.getItem()).getBlock(); if (block instanceof IAltarComponent) { return ((IAltarComponent) block).getType(world, mimic.getReplacedState(), pos); } else { @@ -221,7 +220,7 @@ public class BlockMimic extends BlockEnum implements IAltarComponent } @Override - public ItemBlock getItem() { + 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 index 204db890..cc4eda8b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -3,11 +3,11 @@ package WayofTime.bloodmagic.block; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -22,7 +22,7 @@ public class BlockOutputRoutingNode extends BlockRoutingNode { @Override //TODO: Combine BlockOutputRoutingNode and BlockInputRoutingNode so they have the same superclass - public void breakBlock(World world, BlockPos pos, IBlockState state) { + public void breakBlock(World world, BlockPos pos, BlockState state) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileOutputRoutingNode) { ((TileOutputRoutingNode) tile).removeAllConnections(); @@ -32,7 +32,7 @@ public class BlockOutputRoutingNode extends BlockRoutingNode { } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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()); } @@ -41,13 +41,13 @@ public class BlockOutputRoutingNode extends BlockRoutingNode { } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + 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 index fc60a3b5..97ba5250 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java @@ -5,9 +5,9 @@ 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.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; @@ -45,7 +45,7 @@ public class BlockPath extends BlockEnum implements IIncensePath { } @Override - public Material getMaterial(IBlockState state) { + public Material getMaterial(BlockState state) { EnumPath path = state.getValue(getProperty()); if (path.equals(EnumPath.WOOD) || path.equals(EnumPath.WOODTILE)) return Material.WOOD; @@ -54,7 +54,7 @@ public class BlockPath extends BlockEnum implements IIncensePath { } @Override - public SoundType getSoundType(IBlockState state, World world, BlockPos pos, @Nullable Entity entity) { + 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; @@ -63,7 +63,7 @@ public class BlockPath extends BlockEnum implements IIncensePath { } @Override - public int getLevelOfPath(World world, BlockPos pos, IBlockState state) { + public int getLevelOfPath(World world, BlockPos pos, BlockState state) { switch (this.getMetaFromState(state)) { case 0: case 1: diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java index bfcedb11..81281cbc 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java @@ -4,12 +4,12 @@ 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.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; +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; @@ -28,28 +28,28 @@ public class BlockPhantom extends Block implements IVariantProvider { } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override @@ -60,7 +60,7 @@ public class BlockPhantom extends Block implements IVariantProvider { @Override @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { + 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); } @@ -70,13 +70,13 @@ public class BlockPhantom extends Block implements IVariantProvider { } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + 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 index f6a09218..7c896b63 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java @@ -13,17 +13,17 @@ 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.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -44,7 +44,7 @@ public class BlockRitualController extends BlockEnum imple } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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); @@ -57,7 +57,7 @@ public class BlockRitualController extends BlockEnum imple if (!key.isEmpty()) { Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(key); if (ritual != null) { - EnumFacing direction = RitualHelper.getDirectionOfRitual(world, pos, ritual); + 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))) { @@ -66,17 +66,17 @@ public class BlockRitualController extends BlockEnum imple ((TileMasterRitualStone) tile).setInverted(true); } } else { - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); } } else { - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); } } else { - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); } } } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) { - IBlockState ritualBlock = world.getBlockState(pos.up()); + BlockState ritualBlock = world.getBlockState(pos.up()); ImperfectRitual ritual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(ritualBlock); if (ritual == null) return false; @@ -89,7 +89,7 @@ public class BlockRitualController extends BlockEnum imple } @Override - public void onBlockHarvested(World world, BlockPos pos, IBlockState state, EntityPlayer player) { + public void onBlockHarvested(World world, BlockPos pos, BlockState state, PlayerEntity player) { TileEntity tile = world.getTileEntity(pos); if (getMetaFromState(state) == 0 && tile instanceof TileMasterRitualStone) @@ -105,12 +105,12 @@ public class BlockRitualController extends BlockEnum imple } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return state.getValue(getProperty()) != EnumRitualController.IMPERFECT ? new TileMasterRitualStone() : new TileImperfectRitualStone(); } @@ -118,8 +118,8 @@ public class BlockRitualController extends BlockEnum imple @Override @Nullable - public ResourceLocation getLinkedEntry(World world, BlockPos pos, EntityPlayer player, ItemStack stack) { - IBlockState state = world.getBlockState(pos); + 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) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 432861d3..33ddfd90 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -8,9 +8,9 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -39,12 +39,12 @@ public class BlockRitualStone extends BlockEnum implements IRitual } @Override - public int damageDropped(IBlockState state) { + public int damageDropped(BlockState state) { return 0; } @Override - public boolean canSilkHarvest(World world, BlockPos pos, IBlockState state, EntityPlayer player) { + public boolean canSilkHarvest(World world, BlockPos pos, BlockState state, PlayerEntity player) { return false; } @@ -56,7 +56,7 @@ public class BlockRitualStone extends BlockEnum implements IRitual @Override public void setRuneType(World world, BlockPos pos, EnumRuneType runeType) { int meta = runeType.ordinal(); - IBlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); + 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 index bb26cf20..be4adeb1 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java @@ -6,15 +6,15 @@ 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.block.state.IBlockState; -import net.minecraft.item.ItemBlock; +import net.minecraft.item.BlockItem; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -43,47 +43,47 @@ public class BlockRoutingNode extends Block implements IBMBlock, IVariantProvide } @Override - public boolean canConnectRedstone(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { + public boolean canConnectRedstone(BlockState state, IBlockAccess world, BlockPos pos, Direction side) { return true; } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override - public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { + public boolean canRenderInLayer(BlockState state, BlockRenderLayer layer) { return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.TRANSLUCENT; } @Override - public IBlockState getStateFromMeta(int meta) { + public BlockState getStateFromMeta(int meta) { return this.getDefaultState(); } @@ -91,13 +91,13 @@ public class BlockRoutingNode extends Block implements IBMBlock, IVariantProvide * Convert the BlockState into the correct metadata value */ @Override - public int getMetaFromState(IBlockState state) { + public int getMetaFromState(BlockState state) { return 0; } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { - return state.withProperty(UP, this.shouldConnect(state, worldIn, pos.up(), EnumFacing.DOWN)).withProperty(DOWN, this.shouldConnect(state, worldIn, pos.down(), EnumFacing.UP)).withProperty(NORTH, this.shouldConnect(state, worldIn, pos.north(), EnumFacing.SOUTH)).withProperty(EAST, this.shouldConnect(state, worldIn, pos.east(), EnumFacing.WEST)).withProperty(SOUTH, this.shouldConnect(state, worldIn, pos.south(), EnumFacing.NORTH)).withProperty(WEST, this.shouldConnect(state, worldIn, pos.west(), EnumFacing.EAST)); + 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 @@ -105,14 +105,14 @@ public class BlockRoutingNode extends Block implements IBMBlock, IVariantProvide return new BlockStateContainer(this, UP, DOWN, NORTH, EAST, WEST, SOUTH); } - public boolean shouldConnect(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing attachedSide) { - IBlockState blockState = world.getBlockState(pos); + 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, IBlockState blockState) { + public void breakBlock(World world, BlockPos pos, BlockState blockState) { if (!world.isRemote) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileRoutingNode) { @@ -126,8 +126,8 @@ public class BlockRoutingNode extends Block implements IBMBlock, IVariantProvide } @Override - public ItemBlock getItem() { - return new ItemBlock(this); + public BlockItem getItem() { + return new BlockItem(this); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java index d8eb932d..bdfbc5f6 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java @@ -5,15 +5,15 @@ 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.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -36,37 +36,37 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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()); @@ -74,7 +74,7 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { + public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { TileSoulForge tileSoulForge = (TileSoulForge) world.getTileEntity(blockPos); if (tileSoulForge != null) tileSoulForge.dropItems(); @@ -83,18 +83,18 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + public TileEntity createTileEntity(World world, BlockState state) { return new TileSoulForge(); } @Override - public ItemBlock getItem() { - return new ItemBlock(this); + 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 index c6f8985c..7602a807 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java @@ -4,13 +4,13 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -32,27 +32,27 @@ public class BlockSpectral extends Block { } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { return AABB; } @Override - public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public boolean causesSuffocation(IBlockState state) { + public boolean causesSuffocation(BlockState state) { return false; } @@ -63,18 +63,18 @@ public class BlockSpectral extends Block { } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return ConfigHandler.client.invisibleSpectralBlocks ? EnumBlockRenderType.INVISIBLE : EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return ConfigHandler.client.invisibleSpectralBlocks ? BlockRenderType.INVISIBLE : BlockRenderType.MODEL; } @Override @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { + 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(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity, boolean bool) { + public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity, boolean bool) { } @Override @@ -88,18 +88,18 @@ public class BlockSpectral extends Block { } @Override - public boolean isAir(IBlockState state, IBlockAccess world, BlockPos blockPos) { + public boolean isAir(BlockState state, IBlockAccess world, BlockPos blockPos) { return true; } @Override - public boolean hasTileEntity(IBlockState state) { + public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override - public TileEntity createTileEntity(World world, IBlockState state) { + 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 index 37bad79e..5dac961b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java @@ -6,20 +6,20 @@ 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.BlockContainer; +import net.minecraft.block.ContainerBlock; import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +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.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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 BlockContainer implements IVariantProvider, IBMBlock { +public class BlockTeleposer extends ContainerBlock implements IVariantProvider, IBMBlock { public BlockTeleposer() { super(Material.ROCK); @@ -30,12 +30,12 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, } @Override - public EnumBlockRenderType getRenderType(IBlockState state) { - return EnumBlockRenderType.MODEL; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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) @@ -47,7 +47,7 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, } @Override - public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) { + public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { TileTeleposer tileTeleposer = (TileTeleposer) world.getTileEntity(blockPos); if (tileTeleposer != null) { tileTeleposer.dropItems(); @@ -63,7 +63,7 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider, } @Override - public ItemBlock getItem() { - return new ItemBlock(this); + 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 index 7dd5b818..7c4b1e51 100644 --- a/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java +++ b/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.block; -import net.minecraft.item.ItemBlock; +import net.minecraft.item.BlockItem; public interface IBMBlock { - ItemBlock getItem(); + BlockItem getItem(); } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java index 0734740e..79a1fb0b 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java @@ -5,12 +5,12 @@ 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.block.state.IBlockState; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.ItemBlock; +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; @@ -46,22 +46,22 @@ public class BlockEnum & IStringSerializable> extends Block im } @Override - public IBlockState getStateFromMeta(int meta) { + public BlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(property, types[meta]); } @Override - public int getMetaFromState(IBlockState state) { + public int getMetaFromState(BlockState state) { return state.getValue(property).ordinal(); } @Override - public int damageDropped(IBlockState state) { + public int damageDropped(BlockState state) { return getMetaFromState(state); } @Override - public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { + public void getSubBlocks(ItemGroup tab, NonNullList subBlocks) { for (E type : types) subBlocks.add(new ItemStack(this, 1, type.ordinal())); } @@ -71,7 +71,7 @@ public class BlockEnum & IStringSerializable> extends Block im } @Override - public ItemBlock getItem() { + public BlockItem getItem() { return new ItemBlockEnum<>(this); } diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java index 418c8de7..b85224e7 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java @@ -1,15 +1,15 @@ package WayofTime.bloodmagic.block.base; -import net.minecraft.block.BlockRotatedPillar; +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.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -28,25 +28,25 @@ public class BlockEnumPillar & IStringSerializable> extends Bl @Override protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(getProperty(), BlockRotatedPillar.AXIS).build(); + return new BlockStateContainer.Builder(this).add(getProperty(), RotatedPillarBlock.AXIS).build(); } @Override - public IBlockState getStateFromMeta(int meta) { - IBlockState state = getBlockState().getBaseState().withProperty(this.getProperty(), getTypes()[meta % 5]); + public BlockState getStateFromMeta(int meta) { + BlockState state = getBlockState().getBaseState().withProperty(this.getProperty(), getTypes()[meta % 5]); switch (meta / 5) { case 0: - state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Y); + state = state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.Y); break; case 1: - state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.X); + state = state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.X); break; case 2: - state = state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Z); + state = state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.Z); break; default: - state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Y); + state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.Y); break; } @@ -54,16 +54,16 @@ public class BlockEnumPillar & IStringSerializable> extends Bl } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { + 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(IBlockState state) { + public int getMetaFromState(BlockState state) { int i = ArrayUtils.indexOf(getTypes(), state.getValue(getProperty())); - switch (state.getValue(BlockRotatedPillar.AXIS)) { + switch (state.getValue(RotatedPillarBlock.AXIS)) { case X: i = i + 5; break; @@ -76,10 +76,10 @@ public class BlockEnumPillar & IStringSerializable> extends Bl } @Override - public boolean rotateBlock(World world, BlockPos pos, EnumFacing axis) { - IBlockState state = world.getBlockState(pos); + public boolean rotateBlock(World world, BlockPos pos, Direction axis) { + BlockState state = world.getBlockState(pos); for (IProperty prop : state.getProperties().keySet()) { - if (prop == BlockRotatedPillar.AXIS) { + if (prop == RotatedPillarBlock.AXIS) { world.setBlockState(pos, state.cycleProperty(prop)); return true; } @@ -88,15 +88,15 @@ public class BlockEnumPillar & IStringSerializable> extends Bl } @Override - public IBlockState withRotation(IBlockState state, Rotation rot) { + public BlockState withRotation(BlockState state, Rotation rot) { switch (rot) { case COUNTERCLOCKWISE_90: case CLOCKWISE_90: - switch (state.getValue(BlockRotatedPillar.AXIS)) { + switch (state.getValue(RotatedPillarBlock.AXIS)) { case X: - return state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.Z); + return state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.Z); case Z: - return state.withProperty(BlockRotatedPillar.AXIS, EnumFacing.Axis.X); + return state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.X); default: return state; } @@ -107,18 +107,18 @@ public class BlockEnumPillar & IStringSerializable> extends Bl } @Override - protected ItemStack getSilkTouchDrop(IBlockState state) { + protected ItemStack getSilkTouchDrop(BlockState state) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { - return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(BlockRotatedPillar.AXIS, facing.getAxis()); + 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(IBlockState state) { + 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 index d4998c28..3d4a02b3 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java @@ -1,11 +1,11 @@ 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.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -30,44 +30,44 @@ public class BlockEnumPillarCap & IStringSerializable> extends } @Override - public IBlockState getStateFromMeta(int meta) { - IBlockState state = getBlockState().getBaseState().withProperty(this.getProperty(), getTypes()[meta % 2]); - return state.withProperty(FACING, EnumFacing.byIndex(meta / 2)); + 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(IBlockState state) { + public int getMetaFromState(BlockState state) { int i = ArrayUtils.indexOf(getTypes(), state.getValue(getProperty())); return i + 2 * state.getValue(FACING).getIndex(); } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { + public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public IBlockState withRotation(IBlockState state, Rotation rot) { + public BlockState withRotation(BlockState state, Rotation rot) { return state.withProperty(FACING, rot.rotate(state.getValue(FACING))); } @Override - public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { + public BlockState withMirror(BlockState state, Mirror mirrorIn) { return state.withRotation(mirrorIn.toRotation(state.getValue(FACING))); } @Override - protected ItemStack getSilkTouchDrop(IBlockState state) { + protected ItemStack getSilkTouchDrop(BlockState state) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { + 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(IBlockState state) { + 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 index f34b2e76..b21d89ab 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java @@ -1,17 +1,17 @@ package WayofTime.bloodmagic.block.base; import com.google.common.collect.Lists; -import net.minecraft.block.BlockHorizontal; -import net.minecraft.block.BlockStairs; -import net.minecraft.block.BlockStairs.EnumHalf; -import net.minecraft.block.BlockStairs.EnumShape; +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.block.state.IBlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -27,7 +27,7 @@ import javax.annotation.Nullable; import java.util.List; public class BlockEnumStairs & IStringSerializable> extends BlockEnum { - public static final PropertyDirection FACING = BlockHorizontal.FACING; + 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); @@ -58,11 +58,11 @@ public class BlockEnumStairs & IStringSerializable> extends Bl @Override protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(getProperty(), FACING, BlockStairs.HALF, BlockStairs.SHAPE).build(); + return new BlockStateContainer.Builder(this).add(getProperty(), FACING, StairsBlock.HALF, StairsBlock.SHAPE).build(); } @Override - public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { + 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)) { @@ -71,24 +71,24 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } @Override - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @Override - public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) { - IBlockState state = super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand); - state = state.withProperty(FACING, placer.getHorizontalFacing()).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.STRAIGHT); - return facing != EnumFacing.DOWN && (facing == EnumFacing.UP || (double) hitY <= 0.5D) ? state.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.BOTTOM) : state.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.TOP); + 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(IBlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { + 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))) { @@ -114,18 +114,18 @@ public class BlockEnumStairs & IStringSerializable> extends Bl // Meta looks like: {1|11|1} = {HALF|FACING|TYPE} @Override - public IBlockState getStateFromMeta(int meta) { - IBlockState state = getBlockState().getBaseState().withProperty(BlockStairs.HALF, (meta & 8) > 0 ? BlockStairs.EnumHalf.TOP : BlockStairs.EnumHalf.BOTTOM); - state = state.withProperty(FACING, EnumFacing.byIndex(5 - (meta & 6) / 2)).withProperty(this.getProperty(), getTypes()[meta % 2]); + 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(IBlockState state) { + public int getMetaFromState(BlockState state) { int i = 0; - if (state.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.TOP) { + if (state.getValue(StairsBlock.HALF) == StairsBlock.EnumHalf.TOP) { i |= 4; } @@ -134,34 +134,34 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { - return state.withProperty(BlockStairs.SHAPE, getStairsShape(state, worldIn, pos)); + public BlockState getActualState(BlockState state, IBlockAccess worldIn, BlockPos pos) { + return state.withProperty(StairsBlock.SHAPE, getStairsShape(state, worldIn, pos)); } @Override - public IBlockState withRotation(IBlockState state, Rotation rot) { + public BlockState withRotation(BlockState state, Rotation rot) { return state.withProperty(FACING, rot.rotate(state.getValue(FACING))); } @SuppressWarnings("incomplete-switch") @Override - public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { - EnumFacing facing = state.getValue(FACING); - BlockStairs.EnumShape stairShape = state.getValue(BlockStairs.SHAPE); + 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() == EnumFacing.Axis.Z) { + if (facing.getAxis() == Direction.Axis.Z) { switch (stairShape) { case OUTER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_RIGHT); + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.OUTER_RIGHT); case OUTER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_LEFT); + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.OUTER_LEFT); case INNER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_LEFT); + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.INNER_LEFT); case INNER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_RIGHT); + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.INNER_RIGHT); default: return state.withRotation(Rotation.CLOCKWISE_180); } @@ -170,16 +170,16 @@ public class BlockEnumStairs & IStringSerializable> extends Bl break; case FRONT_BACK: - if (facing.getAxis() == EnumFacing.Axis.X) { + if (facing.getAxis() == Direction.Axis.X) { switch (stairShape) { case OUTER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_RIGHT); + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.OUTER_RIGHT); case OUTER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.OUTER_LEFT); + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.OUTER_LEFT); case INNER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(BlockStairs.SHAPE, BlockStairs.EnumShape.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(BlockStairs.SHAPE, BlockStairs.EnumShape.INNER_LEFT); + return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.INNER_LEFT); case STRAIGHT: return state.withRotation(Rotation.CLOCKWISE_180); } @@ -190,22 +190,22 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } @Override - protected ItemStack getSilkTouchDrop(IBlockState state) { + protected ItemStack getSilkTouchDrop(BlockState state) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public int damageDropped(IBlockState state) { + public int damageDropped(BlockState state) { return super.getMetaFromState(state); } @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { + public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) { + public boolean doesSideBlockRendering(BlockState state, IBlockAccess world, BlockPos pos, Direction face) { if (ForgeModContainer.disableStairSlabCulling) return super.doesSideBlockRendering(state, world, pos, face); @@ -214,12 +214,12 @@ public class BlockEnumStairs & IStringSerializable> extends Bl state = this.getActualState(state, world, pos); - EnumHalf half = state.getValue(BlockStairs.HALF); - EnumFacing side = state.getValue(FACING); - EnumShape shape = state.getValue(BlockStairs.SHAPE); - if (face == EnumFacing.UP) + 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 == EnumFacing.DOWN) + if (face == Direction.DOWN) return half == EnumHalf.BOTTOM; if (shape == EnumShape.OUTER_LEFT || shape == EnumShape.OUTER_RIGHT) return false; @@ -232,25 +232,25 @@ public class BlockEnumStairs & IStringSerializable> extends Bl return false; } - private static List getCollisionBoxList(IBlockState state) { + private static List getCollisionBoxList(BlockState state) { List list = Lists.newArrayList(); - boolean flag = state.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.TOP; + boolean flag = state.getValue(StairsBlock.HALF) == StairsBlock.EnumHalf.TOP; list.add(flag ? AABB_SLAB_TOP : AABB_SLAB_BOTTOM); - BlockStairs.EnumShape stairShape = state.getValue(BlockStairs.SHAPE); + StairsBlock.EnumShape stairShape = state.getValue(StairsBlock.SHAPE); - if (stairShape == BlockStairs.EnumShape.STRAIGHT || stairShape == BlockStairs.EnumShape.INNER_LEFT || stairShape == BlockStairs.EnumShape.INNER_RIGHT) { + if (stairShape == StairsBlock.EnumShape.STRAIGHT || stairShape == StairsBlock.EnumShape.INNER_LEFT || stairShape == StairsBlock.EnumShape.INNER_RIGHT) { list.add(getCollQuarterBlock(state)); } - if (stairShape != BlockStairs.EnumShape.STRAIGHT) { + if (stairShape != StairsBlock.EnumShape.STRAIGHT) { list.add(getCollEighthBlock(state)); } return list; } - private static AxisAlignedBB getCollQuarterBlock(IBlockState state) { - boolean flag = state.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.TOP; + private static AxisAlignedBB getCollQuarterBlock(BlockState state) { + boolean flag = state.getValue(StairsBlock.HALF) == StairsBlock.EnumHalf.TOP; switch (state.getValue(FACING)) { case NORTH: @@ -265,11 +265,11 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } } - private static AxisAlignedBB getCollEighthBlock(IBlockState state) { - EnumFacing facing = state.getValue(FACING); - EnumFacing newFacing; + private static AxisAlignedBB getCollEighthBlock(BlockState state) { + Direction facing = state.getValue(FACING); + Direction newFacing; - switch (state.getValue(BlockStairs.SHAPE)) { + switch (state.getValue(StairsBlock.SHAPE)) { case OUTER_LEFT: default: newFacing = facing; @@ -284,7 +284,7 @@ public class BlockEnumStairs & IStringSerializable> extends Bl newFacing = facing.rotateYCCW(); } - boolean isTop = state.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.TOP; + boolean isTop = state.getValue(StairsBlock.HALF) == StairsBlock.EnumHalf.TOP; switch (newFacing) { case NORTH: @@ -299,45 +299,45 @@ public class BlockEnumStairs & IStringSerializable> extends Bl } } - private static BlockStairs.EnumShape getStairsShape(IBlockState state, IBlockAccess world, BlockPos pos) { - EnumFacing facing = state.getValue(FACING); - IBlockState offsetState = world.getBlockState(pos.offset(facing)); + 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(BlockStairs.HALF) == offsetState.getValue(BlockStairs.HALF)) { - EnumFacing offsetFacing = offsetState.getValue(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 BlockStairs.EnumShape.OUTER_LEFT; + return StairsBlock.EnumShape.OUTER_LEFT; } - return BlockStairs.EnumShape.OUTER_RIGHT; + return StairsBlock.EnumShape.OUTER_RIGHT; } } - IBlockState oppositeOffsetState = world.getBlockState(pos.offset(facing.getOpposite())); + BlockState oppositeOffsetState = world.getBlockState(pos.offset(facing.getOpposite())); - if (isBlockStairs(oppositeOffsetState) && state.getValue(BlockStairs.HALF) == oppositeOffsetState.getValue(BlockStairs.HALF)) { - EnumFacing oppositeOffsetFacing = oppositeOffsetState.getValue(FACING); + 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 BlockStairs.EnumShape.INNER_LEFT; + return StairsBlock.EnumShape.INNER_LEFT; } - return BlockStairs.EnumShape.INNER_RIGHT; + return StairsBlock.EnumShape.INNER_RIGHT; } } - return BlockStairs.EnumShape.STRAIGHT; + return StairsBlock.EnumShape.STRAIGHT; } - private static boolean isDifferentStairs(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing facing) { - IBlockState offsetState = world.getBlockState(pos.offset(facing)); - return !isBlockStairs(offsetState) || offsetState.getValue(FACING) != state.getValue(FACING) || offsetState.getValue(BlockStairs.HALF) != state.getValue(BlockStairs.HALF); + 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(IBlockState state) { - return state.getBlock() instanceof BlockStairs || state.getBlock() instanceof BlockEnumStairs; + 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 index 325689e6..60b2523c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.block.base; import net.minecraft.block.Block; -import net.minecraft.block.BlockFenceGate; +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.state.IBlockState; -import net.minecraft.init.Blocks; +import net.minecraft.block.Blocks; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -42,18 +42,18 @@ public class BlockEnumWall & IStringSerializable> extends Bloc } @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { state = state.getActualState(source, pos); return AABB_BY_INDEX[getAABBIndex(state)]; } @Override - public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { + public AxisAlignedBB getCollisionBoundingBox(BlockState blockState, IBlockAccess worldIn, BlockPos pos) { blockState = blockState.getActualState(worldIn, pos); return CLIP_AABB_BY_INDEX[getAABBIndex(blockState)]; } - public boolean isFullCube(IBlockState state) { + public boolean isFullCube(BlockState state) { return false; } @@ -62,24 +62,24 @@ public class BlockEnumWall & IStringSerializable> extends Bloc } @Override - public boolean isOpaqueCube(IBlockState state) { + public boolean isOpaqueCube(BlockState state) { return false; } private boolean canConnectTo(IBlockAccess worldIn, BlockPos pos) { - IBlockState worldState = worldIn.getBlockState(pos); + BlockState worldState = worldIn.getBlockState(pos); Block block = worldState.getBlock(); - return block != Blocks.BARRIER && (!(block != this && !(block instanceof BlockFenceGate)) || ((worldState.getMaterial().isOpaque() && worldState.isFullCube()) && worldState.getMaterial() != Material.GOURD)); + 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(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { - return side != EnumFacing.DOWN || super.shouldSideBeRendered(blockState, blockAccess, pos, side); + public boolean shouldSideBeRendered(BlockState blockState, IBlockAccess blockAccess, BlockPos pos, Direction side) { + return side != Direction.DOWN || super.shouldSideBeRendered(blockState, blockAccess, pos, side); } @Override - public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { + 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()); @@ -89,32 +89,32 @@ public class BlockEnumWall & IStringSerializable> extends Bloc } @Override - protected ItemStack getSilkTouchDrop(IBlockState state) { + protected ItemStack getSilkTouchDrop(BlockState state) { return new ItemStack(this, 1, damageDropped(state)); } @Override - public int damageDropped(IBlockState state) { + public int damageDropped(BlockState state) { return super.getMetaFromState(state); } - private static int getAABBIndex(IBlockState state) { + private static int getAABBIndex(BlockState state) { int i = 0; if (state.getValue(NORTH)) { - i |= 1 << EnumFacing.NORTH.getHorizontalIndex(); + i |= 1 << Direction.NORTH.getHorizontalIndex(); } if (state.getValue(EAST)) { - i |= 1 << EnumFacing.EAST.getHorizontalIndex(); + i |= 1 << Direction.EAST.getHorizontalIndex(); } if (state.getValue(SOUTH)) { - i |= 1 << EnumFacing.SOUTH.getHorizontalIndex(); + i |= 1 << Direction.SOUTH.getHorizontalIndex(); } if (state.getValue(WEST)) { - i |= 1 << EnumFacing.WEST.getHorizontalIndex(); + 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 index 3e2a13f9..0427e11a 100644 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java +++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java @@ -4,8 +4,8 @@ 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.state.IBlockState; -import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; @@ -43,22 +43,22 @@ public class BlockInteger extends Block { } @Override - public IBlockState getStateFromMeta(int meta) { + public BlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(property, meta); } @Override - public int getMetaFromState(IBlockState state) { + public int getMetaFromState(BlockState state) { return state.getValue(property); } @Override - public int damageDropped(IBlockState state) { + public int damageDropped(BlockState state) { return getMetaFromState(state); } @Override - public void getSubBlocks(CreativeTabs tab, NonNullList subBlocks) { + public void getSubBlocks(ItemGroup tab, NonNullList subBlocks) { for (int i = 0; i < maxMeta; i++) subBlocks.add(new ItemStack(this, 1, i)); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java index 3392b3f3..3a203214 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java @@ -4,20 +4,20 @@ 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.inventory.GuiContainer; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; +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 GuiContainer { +public class GuiAlchemyTable extends ContainerScreen { public IInventory tileTable; - public GuiAlchemyTable(InventoryPlayer playerInventory, IInventory tileTable) { + public GuiAlchemyTable(PlayerInventory playerInventory, IInventory tileTable) { super(new ContainerAlchemyTable(playerInventory, tileTable)); this.tileTable = tileTable; this.xSize = 176; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java index f96654ca..b4f55629 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java @@ -5,7 +5,7 @@ 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.GuiScreen; +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; @@ -18,7 +18,7 @@ import java.util.Set; public class GuiBloodMagicConfig extends GuiConfig { - public GuiBloodMagicConfig(GuiScreen parentScreen) { + public GuiBloodMagicConfig(Screen parentScreen) { super(parentScreen, getElements(), BloodMagic.MODID, false, false, BloodMagic.NAME); } @@ -52,7 +52,7 @@ public class GuiBloodMagicConfig extends GuiConfig { } @Override - public GuiScreen createConfigGui(GuiScreen parentScreen) { + public Screen createConfigGui(Screen parentScreen) { return new GuiBloodMagicConfig(parentScreen); } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java index 80705ac1..a942839d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java @@ -9,15 +9,15 @@ 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.multiplayer.WorldClient; -import net.minecraft.entity.player.EntityPlayer; +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, EntityPlayer player, World world, int x, int y, int z) { + public Object getServerGuiElement(int id, PlayerEntity player, World world, int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); switch (id) { @@ -39,8 +39,8 @@ public class GuiHandler implements IGuiHandler { } @Override - public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { - if (world instanceof WorldClient) { + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java index 95fbd50f..d20cb33e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java @@ -6,21 +6,21 @@ 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.inventory.GuiContainer; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumHand; +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 GuiContainer { +public class GuiHolding extends ContainerScreen { private ResourceLocation texture = new ResourceLocation(BloodMagic.MODID, "gui/SigilHolding.png"); - private EntityPlayer player; + private PlayerEntity player; - public GuiHolding(EntityPlayer player, InventoryHolding inventoryHolding) { + public GuiHolding(PlayerEntity player, InventoryHolding inventoryHolding) { super(new ContainerHolding(player, inventoryHolding)); xSize = 176; ySize = 121; @@ -48,7 +48,7 @@ public class GuiHolding extends GuiContainer { int x = (width - xSize) / 2; int y = (height - ySize) / 2; this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize); - ItemStack held = player.getHeldItem(EnumHand.MAIN_HAND); + 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 index 2a9d0590..72ffef7b 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -8,15 +8,15 @@ 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.GuiButton; -import net.minecraft.client.gui.GuiTextField; -import net.minecraft.client.gui.inventory.GuiContainer; +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.InventoryPlayer; +import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -24,15 +24,15 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.io.IOException; @SideOnly(Side.CLIENT) -public class GuiItemRoutingNode extends GuiContainer { - private GuiTextField textBox; +public class GuiItemRoutingNode extends ContainerScreen { + private TextFieldWidget textBox; private TileFilteredRoutingNode inventory; private ContainerItemRoutingNode container; private int left, top; - public GuiItemRoutingNode(InventoryPlayer playerInventory, IInventory tileRoutingNode) { + public GuiItemRoutingNode(PlayerInventory playerInventory, IInventory tileRoutingNode) { super(new ContainerItemRoutingNode(playerInventory, tileRoutingNode)); this.xSize = 201; this.ySize = 169; @@ -41,7 +41,7 @@ public class GuiItemRoutingNode extends GuiContainer { } private int getCurrentActiveSlotPriority() { - EnumFacing direction = EnumFacing.byIndex(inventory.currentActiveSlot); + Direction direction = Direction.byIndex(inventory.currentActiveSlot); if (direction != null) { return inventory.getPriority(direction); } @@ -56,17 +56,17 @@ public class GuiItemRoutingNode extends GuiContainer { top = (this.height - this.ySize) / 2; this.buttonList.clear(); - this.buttonList.add(new GuiButton(0, left + 176, top + 14, 18, 18, "D")); - this.buttonList.add(new GuiButton(1, left + 176, top + 32, 18, 18, "U")); - this.buttonList.add(new GuiButton(2, left + 176, top + 50, 18, 18, "N")); - this.buttonList.add(new GuiButton(3, left + 176, top + 68, 18, 18, "S")); - this.buttonList.add(new GuiButton(4, left + 176, top + 86, 18, 18, "W")); - this.buttonList.add(new GuiButton(5, left + 176, top + 104, 18, 18, "E")); - this.buttonList.add(new GuiButton(6, left + 160, top + 50, 10, 18, ">")); - this.buttonList.add(new GuiButton(7, left + 132, top + 50, 10, 18, "<")); + 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 GuiTextField(0, this.fontRenderer, left + 94, top + 37, 70, 12); + this.textBox = new TextFieldWidget(0, this.fontRenderer, left + 94, top + 37, 70, 12); this.textBox.setEnableBackgroundDrawing(false); this.textBox.setText(""); } @@ -137,7 +137,7 @@ public class GuiItemRoutingNode extends GuiContainer { * for buttons) */ @Override - protected void actionPerformed(GuiButton button) throws IOException { + 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) { @@ -149,7 +149,7 @@ public class GuiItemRoutingNode extends GuiContainer { } private void enableAllDirectionalButtons() { - for (GuiButton button : this.buttonList) { + for (Button button : this.buttonList) { button.enabled = true; } } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java index c64d1b21..f8693ba3 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java @@ -2,18 +2,18 @@ package WayofTime.bloodmagic.client.gui; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.tile.container.ContainerMasterRoutingNode; -import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.InventoryPlayer; +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 GuiContainer { +public class GuiMasterRoutingNode extends ContainerScreen { - public GuiMasterRoutingNode(InventoryPlayer playerInventory, IInventory tileRoutingNode) { + public GuiMasterRoutingNode(PlayerInventory playerInventory, IInventory tileRoutingNode) { super(new ContainerMasterRoutingNode(playerInventory, tileRoutingNode)); this.xSize = 216; this.ySize = 216; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java index 6a1d85b0..3e890f88 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java @@ -4,19 +4,19 @@ 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.inventory.GuiContainer; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.InventoryPlayer; +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 GuiContainer { +public class GuiSoulForge extends ContainerScreen { public IInventory tileSoulForge; - public GuiSoulForge(InventoryPlayer playerInventory, IInventory tileSoulForge) { + public GuiSoulForge(PlayerInventory playerInventory, IInventory tileSoulForge) { super(new ContainerSoulForge(playerInventory, tileSoulForge)); this.tileSoulForge = tileSoulForge; this.xSize = 176; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java index e5db4c67..be9cde2e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java @@ -3,17 +3,17 @@ 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.inventory.GuiContainer; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.InventoryPlayer; +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 GuiContainer { - public GuiTeleposer(InventoryPlayer playerInventory, IInventory tileTeleposer) { +public class GuiTeleposer extends ContainerScreen { + public GuiTeleposer(PlayerInventory playerInventory, IInventory tileTeleposer) { super(new ContainerTeleposer(playerInventory, tileTeleposer)); } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java index 94531576..c14d65c4 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java @@ -3,8 +3,8 @@ 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.GuiButton; -import net.minecraft.client.gui.GuiScreen; +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; @@ -17,16 +17,16 @@ import javax.vecmath.Vector2f; import java.awt.Point; import java.util.Map; -public class GuiEditHUD extends GuiScreen { +public class GuiEditHUD extends Screen { private static final int LINE_COLOR = 0x2D2D2D; - private final GuiScreen parent; + private final Screen parent; private final Map currentOverrides = Maps.newHashMap(); private HUDElement dragged; public boolean changes; - public GuiEditHUD(GuiScreen parent) { + public GuiEditHUD(Screen parent) { this.parent = parent; } @@ -102,7 +102,7 @@ public class GuiEditHUD extends GuiScreen { } @Override - protected void actionPerformed(GuiButton button) { + protected void actionPerformed(Button button) { switch (button.id) { case 0: { Minecraft.getMinecraft().displayGuiScreen(parent); diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java index 29c7a889..a039b541 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java @@ -8,7 +8,7 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ResourceLocation; import java.util.List; @@ -32,7 +32,7 @@ public class ElementDemonAura extends HUDElement { @Override public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { Minecraft minecraft = Minecraft.getMinecraft(); - EntityPlayer player = minecraft.player; + PlayerEntity player = minecraft.player; minecraft.getTextureManager().bindTexture(BAR_LOCATION); GlStateManager.color(1.0F, 1.0F, 1.0F); diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java index 0d9beb6c..4854f312 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java @@ -3,10 +3,10 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumHand; +import net.minecraft.util.Hand; import java.util.List; @@ -21,8 +21,8 @@ public abstract class ElementDivinedInformation extends El @Override public boolean shouldRender(Minecraft minecraft) { - EntityPlayer player = Minecraft.getMinecraft().player; - ItemStack sigilStack = player.getHeldItem(EnumHand.MAIN_HAND); + PlayerEntity player = Minecraft.getMinecraft().player; + ItemStack sigilStack = player.getHeldItem(Hand.MAIN_HAND); boolean flag = false; if (simple) { if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION || sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) @@ -30,7 +30,7 @@ public abstract class ElementDivinedInformation extends El else flag = isFlagSigilHolding(sigilStack, true); if (!flag) { - sigilStack = player.getHeldItem(EnumHand.OFF_HAND); + sigilStack = player.getHeldItem(Hand.OFF_HAND); if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION || sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) flag = true; else flag = isFlagSigilHolding(sigilStack, true); @@ -42,7 +42,7 @@ public abstract class ElementDivinedInformation extends El else flag = isFlagSigilHolding(sigilStack, false); if (!flag) { - sigilStack = player.getHeldItem(EnumHand.OFF_HAND); + sigilStack = player.getHeldItem(Hand.OFF_HAND); if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) flag = true; else flag = isFlagSigilHolding(sigilStack, 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 index 9206f124..c83e9966 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java @@ -8,7 +8,7 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -62,7 +62,7 @@ public class ElementHolding extends HUDElement { return true; } - protected void renderHotbarItem(int x, int y, float partialTicks, EntityPlayer player, ItemStack stack) { + protected void renderHotbarItem(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack) { if (!stack.isEmpty()) { float animation = (float) stack.getAnimationsToGo() - partialTicks; diff --git a/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java b/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java index c325019f..a7fe5286 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.client.key; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; public interface IKeybindable { - void onKeyPressed(ItemStack stack, EntityPlayer player, KeyBindings key, boolean showInChat); + void onKeyPressed(ItemStack stack, PlayerEntity player, KeyBindings key, boolean showInChat); } diff --git a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java index 6fa069bd..8d7b86d4 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java @@ -6,7 +6,7 @@ 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.EntityPlayerSP; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.settings.KeyBinding; import net.minecraft.item.ItemStack; import net.minecraftforge.client.settings.IKeyConflictContext; @@ -33,7 +33,7 @@ public enum KeyBindings { @SideOnly(Side.CLIENT) @Override public void handleKeybind() { - EntityPlayerSP player = Minecraft.getMinecraft().player; + ClientPlayerEntity player = Minecraft.getMinecraft().player; if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, -1); } @@ -42,7 +42,7 @@ public enum KeyBindings { @SideOnly(Side.CLIENT) @Override public void handleKeybind() { - EntityPlayerSP player = Minecraft.getMinecraft().player; + ClientPlayerEntity player = Minecraft.getMinecraft().player; if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, 1); } diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java index a674b457..bf43d69a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java @@ -3,7 +3,7 @@ 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.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java index 58f7fc64..0b3a91b9 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java @@ -4,7 +4,7 @@ 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.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java index a1e3af67..ec857e14 100644 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java @@ -5,7 +5,7 @@ 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.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java b/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java index 25a9d228..ca303032 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java @@ -3,30 +3,30 @@ 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.AbstractClientPlayer; +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.RenderPlayer; -import net.minecraft.client.renderer.entity.layers.LayerArmorBase; +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.EntityEquipmentSlot; +import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -public class LayerBloodElytra implements LayerRenderer { +public class LayerBloodElytra implements LayerRenderer { private static final ResourceLocation TEXTURE_BLOOD_ELYTRA = new ResourceLocation("bloodmagic", "textures/entities/bloodElytra.png"); - private final RenderPlayer renderPlayer; + private final PlayerRenderer renderPlayer; private final ModelElytra modelElytra = new ModelElytra(); - public LayerBloodElytra(RenderPlayer renderPlayer) { + public LayerBloodElytra(PlayerRenderer renderPlayer) { this.renderPlayer = renderPlayer; } @Override - public void doRenderLayer(AbstractClientPlayer clientPlayer, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { + 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(EntityEquipmentSlot.CHEST); + 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(); @@ -39,7 +39,7 @@ public class LayerBloodElytra implements LayerRenderer { modelElytra.render(clientPlayer, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); if (chestStack.isItemEnchanted()) - LayerArmorBase.renderEnchantedGlint(this.renderPlayer, clientPlayer, this.modelElytra, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw, headPitch, scale); + ArmorLayer.renderEnchantedGlint(this.renderPlayer, clientPlayer, this.modelElytra, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw, headPitch, scale); GlStateManager.popMatrix(); } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java index 348bc98f..057ee09d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -8,7 +8,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer { @@ -78,8 +78,8 @@ public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.translate(x, y, z); // Specify which face this "circle" is located on - EnumFacing sideHit = EnumFacing.UP; - EnumFacing rotation = tileArray.getRotation(); + Direction sideHit = Direction.UP; + Direction rotation = tileArray.getRotation(); GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index 191fde6f..6fc89ccb 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -7,7 +7,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer { @@ -108,7 +108,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.translate(x, y, z); // Specify which face this "circle" is located on - EnumFacing sideHit = EnumFacing.UP; + Direction sideHit = Direction.UP; GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); switch (sideHit) { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java index d6fc3741..ec483fc2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java @@ -8,7 +8,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer { @@ -64,8 +64,8 @@ public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.translate(x, y, z); // Specify which face this "circle" is located on - EnumFacing sideHit = EnumFacing.UP; - EnumFacing rotation = tileArray.getRotation(); + Direction sideHit = Direction.UP; + Direction rotation = tileArray.getRotation(); GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java index 76a98ab3..8c84e8f1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java @@ -6,7 +6,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -78,8 +78,8 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.translate(x, y, z); // Specify which face this "circle" is located on - EnumFacing sideHit = EnumFacing.UP; - EnumFacing rotation = tileArray.getRotation(); + Direction sideHit = Direction.UP; + Direction rotation = tileArray.getRotation(); GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java index cafb9b63..26472bb5 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java @@ -8,7 +8,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer { @@ -62,8 +62,8 @@ public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.translate(x, y, z); // Specify which face this "circle" is located on - EnumFacing sideHit = EnumFacing.UP; - EnumFacing rotation = tileArray.getRotation(); + Direction sideHit = Direction.UP; + Direction rotation = tileArray.getRotation(); GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java index 5153f6b8..36652fc6 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java @@ -8,7 +8,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer { @@ -67,8 +67,8 @@ public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.translate(x, y, z); // Specify which face this "circle" is located on - EnumFacing sideHit = EnumFacing.UP; - EnumFacing rotation = tileArray.getRotation(); + Direction sideHit = Direction.UP; + Direction rotation = tileArray.getRotation(); GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java index b9967d3a..0603abc8 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java @@ -6,7 +6,7 @@ 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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -88,8 +88,8 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.translate(x, y, z); // Specify which face this "circle" is located on - EnumFacing sideHit = EnumFacing.UP; - EnumFacing rotation = tileArray.getRotation(); + Direction sideHit = Direction.UP; + Direction rotation = tileArray.getRotation(); GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); 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 b954ce52..fecc0a15 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java @@ -5,10 +5,10 @@ import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.item.ItemStack; -public class RenderAlchemyArray extends TileEntitySpecialRenderer { +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); 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 2dba9db8..5b8d2cc4 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -6,12 +6,12 @@ import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.util.handler.event.ClientHandler; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.block.model.ItemCameraTransforms; +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.texture.TextureMap; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -20,7 +20,7 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import org.lwjgl.opengl.GL11; -public class RenderAltar extends TileEntitySpecialRenderer { +public class RenderAltar extends TileEntityRenderer { private static final float MIN_HEIGHT = 0.499f; private static final float MAX_HEIGHT = 0.745f; @@ -58,7 +58,7 @@ public class RenderAltar extends TileEntitySpecialRenderer { int fluidColor = fluid.getColor(fluidStack); - Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); + Minecraft.getMinecraft().renderEngine.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); setGLColorFromInt(fluidColor); double uMin = (double) fluidStillSprite.getMinU(); @@ -78,7 +78,7 @@ public class RenderAltar extends TileEntitySpecialRenderer { } private void renderItem(ItemStack stack) { - RenderItem itemRenderer = Minecraft.getMinecraft().getRenderItem(); + ItemRenderer itemRenderer = Minecraft.getMinecraft().getRenderItem(); if (!stack.isEmpty()) { GlStateManager.translate(0.5, 1, 0.5); GlStateManager.pushMatrix(); @@ -100,7 +100,7 @@ public class RenderAltar extends TileEntitySpecialRenderer { } private void renderHologram(TileAltar altar, AltarTier tier, float partialTicks) { - EntityPlayerSP player = Minecraft.getMinecraft().player; + ClientPlayerEntity player = Minecraft.getMinecraft().player; World world = player.world; if (tier == AltarTier.ONE) diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java index 235fb836..5dd1e340 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java @@ -6,9 +6,9 @@ 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.texture.TextureMap; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +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; @@ -16,7 +16,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) -public class RenderBloodTank extends TileEntitySpecialRenderer { +public class RenderBloodTank extends TileEntityRenderer { private static final Minecraft mc = Minecraft.getMinecraft(); @Override @@ -30,7 +30,7 @@ public class RenderBloodTank extends TileEntitySpecialRenderer { GlStateManager.pushMatrix(); - bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); + bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); renderFluid(bloodTank.getRenderHeight(), renderFluid, x, y, z); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java index 439b9618..a7fceec7 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java @@ -4,15 +4,15 @@ 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.RenderItem; -import net.minecraft.client.renderer.block.model.ItemCameraTransforms; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.entity.item.EntityItem; +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 TileEntitySpecialRenderer { +public class RenderDemonCrucible extends TileEntityRenderer { public static Minecraft mc = Minecraft.getMinecraft(); public static ResourceLocation resource = new ResourceLocation("bloodmagic", "textures/blocks/lifeEssenceStill.png"); public static float minHeight = 0.6497f; @@ -29,10 +29,10 @@ public class RenderDemonCrucible extends TileEntitySpecialRenderer { +public class RenderItemRoutingNode extends TileEntityRenderer { private static final ResourceLocation beamTexture = new ResourceLocation(BloodMagic.MODID, "textures/entities/nodeBeam.png"); private static final Minecraft mc = Minecraft.getMinecraft(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java index 8909df07..b4b6f66d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java @@ -2,13 +2,13 @@ package WayofTime.bloodmagic.client.render.block; import WayofTime.bloodmagic.tile.TileMimic; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +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 TileEntitySpecialRenderer { +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; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java index 1237c0c7..272972c9 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index 6429a137..59944834 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedChickenRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedChickenRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index 20c9c2c9..35c041ba 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSheepRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSheepRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index 95debc39..51ced8ba 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSpiderRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSpiderRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index 2e29c50e..3532162d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedZombieRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedZombieRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index 5b57d12d..50c24346 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/MeteorRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/MeteorRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index bc015688..6fb47c9a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/MimicRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/MimicRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.mob.EntityMimic; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index 6db0f642..10c028e3 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java @@ -3,18 +3,18 @@ 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.RenderLiving; -import net.minecraft.client.renderer.entity.RenderManager; +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 RenderLiving { +public class RenderCorruptedChicken extends MobRenderer { private static final ResourceLocation CHICKEN_TEXTURES = new ResourceLocation("textures/entity/chicken.png"); - public RenderCorruptedChicken(RenderManager renderManagerIn) { + public RenderCorruptedChicken(EntityRendererManager renderManagerIn) { super(renderManagerIn, new ModelCorruptedChicken(0), 0.3f); this.addLayer(new LayerWill<>(this, new ModelCorruptedChicken(1.1f))); } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java index d8024973..744c1e78 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java @@ -6,17 +6,17 @@ 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.RenderLiving; -import net.minecraft.client.renderer.entity.RenderManager; +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 RenderLiving { +public class RenderCorruptedSheep extends MobRenderer { private static final ResourceLocation SHEARED_SHEEP_TEXTURES = new ResourceLocation("textures/entity/sheep/sheep.png"); - public RenderCorruptedSheep(RenderManager renderManagerIn) { + 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))); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java index bef6c894..e57c3094 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java @@ -5,17 +5,17 @@ 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.RenderLiving; -import net.minecraft.client.renderer.entity.RenderManager; +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 RenderLiving { +public class RenderCorruptedSpider extends MobRenderer { private static final ResourceLocation SPIDER_TEXTURES = new ResourceLocation("textures/entity/spider/spider.png"); - public RenderCorruptedSpider(RenderManager renderManagerIn) { + public RenderCorruptedSpider(EntityRendererManager renderManagerIn) { super(renderManagerIn, new ModelSpider(), 1.0F); this.addLayer(new LayerCorruptedSpiderEyes(this)); this.addLayer(new LayerWill<>(this, new ModelCorruptedSpider(1.1f))); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java index f7ffad16..cc4bfdb3 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java @@ -4,27 +4,26 @@ 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.RenderBiped; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.layers.LayerBipedArmor; -import net.minecraft.client.renderer.entity.layers.LayerCustomHead; -import net.minecraft.client.renderer.entity.layers.LayerHeldItem; -import net.minecraft.client.renderer.entity.layers.LayerRenderer; +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 RenderBiped { +public class RenderCorruptedZombie extends BipedRenderer { private static final ResourceLocation ZOMBIE_TEXTURES = new ResourceLocation("textures/entity/zombie/zombie.png"); private final ModelZombieVillager zombieVillagerModel; - public RenderCorruptedZombie(RenderManager renderManagerIn) { + public RenderCorruptedZombie(EntityRendererManager renderManagerIn) { super(renderManagerIn, new ModelZombie(), 0.5F); LayerRenderer layerrenderer = this.layerRenderers.get(0); this.zombieVillagerModel = new ModelZombieVillager(); - this.addLayer(new LayerHeldItem(this)); - LayerBipedArmor layerbipedarmor = new LayerBipedArmor(this) { + 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); @@ -32,9 +31,9 @@ public class RenderCorruptedZombie extends RenderBiped { }; this.addLayer(layerbipedarmor); - if (layerrenderer instanceof LayerCustomHead) { + if (layerrenderer instanceof HeadLayer) { layerRenderers.remove(layerrenderer); - this.addLayer(new LayerCustomHead(this.zombieVillagerModel.bipedHead)); + this.addLayer(new HeadLayer(this.zombieVillagerModel.bipedHead)); } this.layerRenderers.remove(layerbipedarmor); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java index 64430836..45214ac1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java @@ -4,17 +4,17 @@ 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.RenderItem; -import net.minecraft.client.renderer.block.model.ItemCameraTransforms; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.texture.TextureMap; +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 Render { - private final RenderItem renderItem = Minecraft.getMinecraft().getRenderItem(); +public class RenderEntityBloodLight extends EntityRenderer { + private final ItemRenderer renderItem = Minecraft.getMinecraft().getRenderItem(); - public RenderEntityBloodLight(RenderManager renderManagerIn) { + public RenderEntityBloodLight(EntityRendererManager renderManagerIn) { super(renderManagerIn); } @@ -25,7 +25,7 @@ public class RenderEntityBloodLight extends Render { 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(TextureMap.LOCATION_BLOCKS_TEXTURE); + this.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); this.renderItem.renderItem(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), ItemCameraTransforms.TransformType.GROUND); GlStateManager.disableRescaleNormal(); GlStateManager.popMatrix(); @@ -33,6 +33,6 @@ public class RenderEntityBloodLight extends Render { } protected ResourceLocation getEntityTexture(EntityBloodLight entity) { - return TextureMap.LOCATION_BLOCKS_TEXTURE; + 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 index 77c9cdbc..e9752d3d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java @@ -5,18 +5,18 @@ 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.Render; -import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.util.ResourceLocation; -public class RenderEntityMeteor extends Render { +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(RenderManager renderManagerIn) { + public RenderEntityMeteor(EntityRendererManager renderManagerIn) { super(renderManagerIn); } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java index 2612345a..6cde4204 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java @@ -5,30 +5,30 @@ 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.block.model.ItemCameraTransforms; -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer; -import net.minecraft.init.Items; -import net.minecraft.inventory.EntityEquipmentSlot; +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.ItemArmor; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; -import net.minecraft.tileentity.TileEntitySkull; -import net.minecraft.util.EnumFacing; +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 RenderLiving { +public class RenderEntityMimic extends MobRenderer { private static final ResourceLocation SPIDER_TEXTURES = new ResourceLocation("textures/entity/spider/spider.png"); Minecraft minecraft = Minecraft.getMinecraft(); - public RenderEntityMimic(RenderManager renderManagerIn) { + public RenderEntityMimic(EntityRendererManager renderManagerIn) { super(renderManagerIn, new ModelMimic(), 1.0F); } @@ -61,7 +61,7 @@ public class RenderEntityMimic extends RenderLiving { GameProfile gameprofile = null; if (itemstack.hasTagCompound()) { - NBTTagCompound nbttagcompound = itemstack.getTagCompound(); + CompoundNBT nbttagcompound = itemstack.getTagCompound(); if (nbttagcompound.hasKey("SkullOwner", 10)) { gameprofile = NBTUtil.readGameProfileFromNBT(nbttagcompound.getCompoundTag("SkullOwner")); @@ -69,14 +69,14 @@ public class RenderEntityMimic extends RenderLiving { String s = nbttagcompound.getString("SkullOwner"); if (!StringUtils.isNullOrEmpty(s)) { - gameprofile = TileEntitySkull.updateGameProfile(new GameProfile(null, s)); - nbttagcompound.setTag("SkullOwner", NBTUtil.writeGameProfile(new NBTTagCompound(), gameprofile)); + gameprofile = SkullTileEntity.updateGameProfile(new GameProfile(null, s)); + nbttagcompound.setTag("SkullOwner", NBTUtil.writeGameProfile(new CompoundNBT(), gameprofile)); } } } - TileEntitySkullRenderer.instance.renderSkull(-0.5F, 0.0F, -0.5F, EnumFacing.UP, 180.0F, itemstack.getMetadata(), gameprofile, -1, 0); - } else if (!(item instanceof ItemArmor) || ((ItemArmor) item).getEquipmentSlot() != EntityEquipmentSlot.HEAD) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java index 3e522850..53721ceb 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java @@ -4,8 +4,8 @@ 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.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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; @@ -14,14 +14,14 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) -public class RenderEntitySentientArrow extends Render { +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(RenderManager renderManagerIn) { + public RenderEntitySentientArrow(EntityRendererManager renderManagerIn) { super(renderManagerIn); } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java index cfe46aed..106ec48e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java @@ -4,18 +4,18 @@ 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.RenderItem; -import net.minecraft.client.renderer.block.model.ItemCameraTransforms; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.texture.TextureMap; +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 Render { - private final RenderItem renderItem = Minecraft.getMinecraft().getRenderItem(); +public class RenderEntitySoulSnare extends EntityRenderer { + private final ItemRenderer renderItem = Minecraft.getMinecraft().getRenderItem(); - public RenderEntitySoulSnare(RenderManager renderManagerIn) { + public RenderEntitySoulSnare(EntityRendererManager renderManagerIn) { super(renderManagerIn); } @@ -26,7 +26,7 @@ public class RenderEntitySoulSnare extends Render { 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(TextureMap.LOCATION_BLOCKS_TEXTURE); + this.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); this.renderItem.renderItem(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE), ItemCameraTransforms.TransformType.GROUND); GlStateManager.disableRescaleNormal(); GlStateManager.popMatrix(); @@ -34,6 +34,6 @@ public class RenderEntitySoulSnare extends Render { } protected ResourceLocation getEntityTexture(EntitySoulSnare entity) { - return TextureMap.LOCATION_BLOCKS_TEXTURE; + 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 index 4c8ab7fe..1275180d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java @@ -3,29 +3,29 @@ 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.RenderBiped; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.layers.LayerArrow; -import net.minecraft.client.renderer.entity.layers.LayerBipedArmor; -import net.minecraft.client.renderer.entity.layers.LayerCustomHead; -import net.minecraft.client.renderer.entity.layers.LayerHeldItem; -import net.minecraft.item.EnumAction; +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.EnumHandSide; +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 RenderBiped { +public class RenderSentientSpecter extends BipedRenderer { public static final ResourceLocation texture = new ResourceLocation("bloodmagic", "textures/entities/specter.png"); - public RenderSentientSpecter(RenderManager renderManager) { + public RenderSentientSpecter(EntityRendererManager renderManager) { super(renderManager, new ModelBiped(0.0F), 0); - this.addLayer(new LayerBipedArmor(this)); - this.addLayer(new LayerHeldItem(this)); - this.addLayer(new LayerArrow(this)); - this.addLayer(new LayerCustomHead(this.getMainModel().bipedHead)); + 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() { @@ -55,11 +55,11 @@ public class RenderSentientSpecter extends RenderBiped { modelbiped$armpose = ModelBiped.ArmPose.ITEM; if (clientPlayer.getItemInUseCount() > 0) { - EnumAction enumaction = itemstack.getItemUseAction(); + UseAction enumaction = itemstack.getItemUseAction(); - if (enumaction == EnumAction.BLOCK) { + if (enumaction == UseAction.BLOCK) { modelbiped$armpose = ModelBiped.ArmPose.BLOCK; - } else if (enumaction == EnumAction.BOW) { + } else if (enumaction == UseAction.BOW) { modelbiped$armpose = ModelBiped.ArmPose.BOW_AND_ARROW; } } @@ -69,15 +69,15 @@ public class RenderSentientSpecter extends RenderBiped { modelbiped$armpose1 = ModelBiped.ArmPose.ITEM; if (clientPlayer.getItemInUseCount() > 0) { - EnumAction enumaction1 = itemstack1.getItemUseAction(); + UseAction enumaction1 = itemstack1.getItemUseAction(); - if (enumaction1 == EnumAction.BLOCK) { + if (enumaction1 == UseAction.BLOCK) { modelbiped$armpose1 = ModelBiped.ArmPose.BLOCK; } } } - if (clientPlayer.getPrimaryHand() == EnumHandSide.RIGHT) { + if (clientPlayer.getPrimaryHand() == HandSide.RIGHT) { modelplayer.rightArmPose = modelbiped$armpose; modelplayer.leftArmPose = modelbiped$armpose1; } else { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java index 49ec7093..15003afb 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index 8e92253c..0048ddcb 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + 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 index 0ced4e40..cada7206 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SoulSnareRenderFactory.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/SoulSnareRenderFactory.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.client.render.entity; import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; +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 Render createRenderFor(RenderManager manager) { + public EntityRenderer createRenderFor(EntityRendererManager manager) { return new RenderEntitySoulSnare(manager); } } 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 index 92c55940..e95e027e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSheepWool.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSheepWool.java @@ -5,7 +5,7 @@ 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.EnumDyeColor; +import net.minecraft.item.DyeColor; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -27,12 +27,12 @@ public class LayerCorruptedSheepWool implements LayerRenderer implements LayerRenderer { private static final ResourceLocation RAW_TEXTURE = new ResourceLocation("bloodmagic", "textures/entities/overlay/overlay_raw.png"); - private final RenderLiving renderer; + private final MobRenderer renderer; private final ModelBase model; - public LayerWill(RenderLiving rendererIn, ModelBase model) { + public LayerWill(MobRenderer rendererIn, ModelBase model) { this.renderer = rendererIn; this.model = model; } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java index a1c27e01..14b72d05 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java @@ -4,7 +4,7 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -40,7 +40,7 @@ public class ModelCorruptedSheep extends ModelQuadruped { * float params here are the same second and third as in the * setRotationAngles method. */ - public void setLivingAnimations(EntityLivingBase entitylivingbaseIn, float p_78086_2_, float p_78086_3_, float partialTickTime) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java index fb5d5497..d80c4205 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java @@ -4,7 +4,7 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -27,7 +27,7 @@ public class ModelCorruptedSheep2 extends ModelQuadruped { * float params here are the same second and third as in the * setRotationAngles method. */ - public void setLivingAnimations(EntityLivingBase entitylivingbaseIn, float p_78086_2_, float p_78086_3_, float partialTickTime) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java index 2d99578a..7eedd178 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java @@ -5,15 +5,15 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.server.command.CommandTreeBase; import net.minecraftforge.server.command.CommandTreeHelp; public class SubCommandBind extends CommandTreeBase { - public EntityPlayerMP player; + public ServerPlayerEntity player; public SubCommandBind() { addSubcommand(new CommandTreeHelp(this)); @@ -45,12 +45,12 @@ public class SubCommandBind extends CommandTreeBase { @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 TextComponentTranslation(getHelp())); + sender.sendMessage(new TranslationTextComponent(getHelp())); return; } if (sender.getEntityWorld().isRemote) return; - EntityPlayerMP player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); + ServerPlayerEntity player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); ItemStack held = player.getHeldItemMainhand(); boolean bind = true; if (held.getItem() instanceof IBindable) { @@ -65,22 +65,22 @@ public class SubCommandBind extends CommandTreeBase { player = getPlayer(server, sender, args[0]); if (bind) { if (binding.getOwnerName().equals(player.getName())) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.error.ownerEqualsTarget")); + 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 TextComponentTranslation("commands.bloodmagic.bind.success", getInfo())); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.success", getInfo())); } else { if (binding == null) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.error.notBound")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.error.notBound")); } held.getTagCompound().removeTag("binding"); - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.remove.success")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.remove.success")); } } else - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.bind.error.notBindable")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.error.notBindable")); } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java index ff1038c8..230dbf08 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java @@ -7,10 +7,10 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.server.command.CommandTreeBase; import net.minecraftforge.server.command.CommandTreeHelp; @@ -46,7 +46,7 @@ public class SubCommandNetwork extends CommandTreeBase { abstract class NetworkCommand extends CommandTreeBase { - public EntityPlayerMP player; + public ServerPlayerEntity player; public SoulNetwork network; public String uuid; @@ -64,12 +64,12 @@ public class SubCommandNetwork extends CommandTreeBase { else if (args.length > 1 && Utils.isInteger(args[1])) amount = Integer.parseInt(args[1]); else { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.arg.invalid")); - sender.sendMessage(new TextComponentTranslation(this.getUsage(sender))); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.arg.invalid")); + sender.sendMessage(new TranslationTextComponent(this.getUsage(sender))); return null; } if (amount < 0) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.negative")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.negative")); return null; } return amount; @@ -91,7 +91,7 @@ public class SubCommandNetwork extends CommandTreeBase { @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 TextComponentTranslation(getHelp())); + sender.sendMessage(new TranslationTextComponent(getHelp())); return; } if (!getName().equals("get")) { @@ -118,14 +118,14 @@ public class SubCommandNetwork extends CommandTreeBase { return; int currE = network.getCurrentEssence(); if (amount > currE) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.syphon.amountTooHigh")); + 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 TextComponentTranslation("commands.bloodmagic.network.syphon.success", currE - newE, player.getDisplayName().getFormattedText())); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.syphon.success", currE - newE, player.getDisplayName().getFormattedText())); } } @@ -140,7 +140,7 @@ public class SubCommandNetwork extends CommandTreeBase { Integer amount = commandHelperAmount(server, sender, args); if (amount == null) return; - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.add.success", network.add(SoulTicket.command(sender, getName(), amount), NetworkHelper.getMaximumForTier(network.getOrbTier())), player.getDisplayName().getFormattedText())); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.add.success", network.add(SoulTicket.command(sender, getName(), amount), NetworkHelper.getMaximumForTier(network.getOrbTier())), player.getDisplayName().getFormattedText())); } } @@ -156,7 +156,7 @@ public class SubCommandNetwork extends CommandTreeBase { if (amount == null) return; network.setCurrentEssence(amount); - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.set.success", player.getDisplayName().getFormattedText(), amount)); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.set.success", player.getDisplayName().getFormattedText(), amount)); } } @@ -172,7 +172,7 @@ public class SubCommandNetwork extends CommandTreeBase { 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 TextComponentString((player != sender ? player.getDisplayName().getFormattedText() + " " : "" + new TextComponentTranslation("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence()).getFormattedText()))); + sender.sendMessage(new StringTextComponent((player != sender ? player.getDisplayName().getFormattedText() + " " : "" + new TranslationTextComponent("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence()).getFormattedText()))); } } @@ -186,7 +186,7 @@ public class SubCommandNetwork extends CommandTreeBase { @Override public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { network.setCurrentEssence(NetworkHelper.getMaximumForTier(network.getOrbTier())); - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.cap.success", player.getDisplayName().getFormattedText())); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.cap.success", player.getDisplayName().getFormattedText())); } } @@ -205,7 +205,7 @@ public class SubCommandNetwork extends CommandTreeBase { @Override public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { network.setCurrentEssence(Integer.MAX_VALUE); - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.network.fill.success", player.getDisplayName().getFormattedText())); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.fill.success", player.getDisplayName().getFormattedText())); } } @@ -222,7 +222,7 @@ public class SubCommandNetwork extends CommandTreeBase { if (!tickethistory.isEmpty()) for (SoulTicket i : network.getTicketHistory()) sender.sendMessage(i.getDescription()); - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success", player.getDisplayName().getFormattedText())); + 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 index 816c828b..10b01fb0 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java @@ -7,9 +7,9 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.server.command.CommandTreeBase; import net.minecraftforge.server.command.CommandTreeHelp; @@ -37,7 +37,7 @@ public class SubCommandOrb extends CommandTreeBase { abstract class OrbCommand extends CommandTreeBase { - public EntityPlayerMP player; + public ServerPlayerEntity player; public String uuid; public SoulNetwork network; public Object info; @@ -58,7 +58,7 @@ public class SubCommandOrb extends CommandTreeBase { @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 TextComponentTranslation(getHelp())); + sender.sendMessage(new TranslationTextComponent(getHelp())); return; } player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); @@ -81,7 +81,7 @@ public class SubCommandOrb extends CommandTreeBase { @Override public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { super.execute(server, sender, args); - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.orb.currenttier", network.getOrbTier())); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.orb.currenttier", network.getOrbTier())); } } @@ -109,19 +109,19 @@ public class SubCommandOrb extends CommandTreeBase { else if (args.length == 2 && Utils.isInteger(args[1])) targetTier = Integer.parseInt(args[1]); else { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.arg.invalid")); - sender.sendMessage(new TextComponentTranslation(this.getUsage(sender))); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.arg.invalid")); + sender.sendMessage(new TranslationTextComponent(this.getUsage(sender))); return; } if (targetTier < 0) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.negative")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.negative")); return; } else if (targetTier > maxTier) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.orb.error.tierTooHigh", getInfo())); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.orb.error.tierTooHigh", getInfo())); return; } network.setOrbTier(targetTier); - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + 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 index b64efcf9..e531cf29 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java @@ -6,12 +6,12 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.server.command.CommandTreeBase; import net.minecraftforge.server.command.CommandTreeHelp; @@ -69,13 +69,13 @@ public class SubCommandRitual extends CommandTreeBase { @Override public void execute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException { if (args.length == 0) { - sender.sendMessage(new TextComponentTranslation("commands.blooodmagic.ritual.create.noRitual")); + 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 TextComponentTranslation(BloodMagic.RITUAL_MANAGER.getRitual(args[0]).getTranslationKey() + ".info")); + sender.sendMessage(new TranslationTextComponent(BloodMagic.RITUAL_MANAGER.getRitual(args[0]).getTranslationKey() + ".info")); return; } - EntityPlayerMP player = args.length < 3 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[1]); + 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; @@ -89,14 +89,14 @@ public class SubCommandRitual extends CommandTreeBase { BlockPos pos = player.getPosition().down(); World world = player.getEntityWorld(); - EnumFacing direction = player.getHorizontalFacing(); + Direction direction = player.getHorizontalFacing(); if (RitualHelper.createRitual(world, pos, direction, BloodMagic.RITUAL_MANAGER.getRitual(args[0]), safe)) - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); else if (!safe) - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); else - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritaul.create.error.unsafe")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritaul.create.error.unsafe")); } @@ -120,7 +120,7 @@ public class SubCommandRitual extends CommandTreeBase { @Override public void execute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException { - EntityPlayerMP player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); + 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) { @@ -132,13 +132,13 @@ public class SubCommandRitual extends CommandTreeBase { } if (tile != null) if (RitualHelper.repairRitualFromRuins(tile, safe)) - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); else if (!safe) - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); else - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritaul.create.error.unsafe")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritaul.create.error.unsafe")); else - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.ritual.error.noMRS")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritual.error.noMRS")); } } diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java index 8f74b045..3187aeeb 100644 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java @@ -7,13 +7,13 @@ 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.EntityPlayer; +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.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; +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; @@ -52,7 +52,7 @@ public class SubCommandTeleposer extends CommandTreeBase { } abstract class TeleposeHelper extends CommandTreeBase { - public EntityPlayer player; + public PlayerEntity player; @Override public String getUsage(ICommandSender sender) { @@ -72,7 +72,7 @@ public class SubCommandTeleposer extends CommandTreeBase { return 2; } - public TileTeleposer[] cleanUpAndCreateArrayFromTeleposerList(EntityPlayer player) { + public TileTeleposer[] cleanUpAndCreateArrayFromTeleposerList(PlayerEntity player) { if (player == null) for (TileTeleposer i : teleposerSet) { if (i == null || i.isInvalid() || i.isEmpty()) { @@ -98,7 +98,7 @@ public class SubCommandTeleposer extends CommandTreeBase { } - public void sendOwnedTeleposerList(ICommandSender sender, EntityPlayer player) { + public void sendOwnedTeleposerList(ICommandSender sender, PlayerEntity player) { teleposerArray = cleanUpAndCreateArrayFromTeleposerList(player); for (int i = 0; i < teleposerArray.length; i++) { ItemStack stack = teleposerArray[i].getStackInSlot(0); @@ -108,9 +108,9 @@ public class SubCommandTeleposer extends CommandTreeBase { String name = binding.getOwnerName(); if (player != null) { if (name.equals(player.getName())) - sender.sendMessage(new TextComponentString(i + new TextComponentTranslation("commands.bloodmagic.teleposer.anddimension").getFormattedText() + teleposerArray[i].getWorld().provider.getDimension() + " " + teleposerArray[i].getPos() + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.focusanddim").getFormattedText() + " " + focus.getWorld(stack).provider.getDimension() + " " + focus.getBlockPos(stack) + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.owner").getFormattedText() + " " + name)); + 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 TextComponentString(i + new TextComponentTranslation("commands.bloodmagic.teleposer.anddimension").getFormattedText() + teleposerArray[i].getWorld().provider.getDimension() + " " + teleposerArray[i].getPos() + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.focusanddim").getFormattedText() + " " + focus.getWorld(stack).provider.getDimension() + " " + focus.getBlockPos(stack) + " " + new TextComponentTranslation("commands.bloodmagic.teleposer.owner").getFormattedText() + " " + name)); + 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)); } } } @@ -126,12 +126,12 @@ public class SubCommandTeleposer extends CommandTreeBase { else if (args.length > 1 && Utils.isInteger(args[1])) teleposerID = Integer.parseInt(args[1]); else { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.arg.invalid")); - sender.sendMessage(new TextComponentTranslation(this.getUsage(sender))); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.arg.invalid")); + sender.sendMessage(new TranslationTextComponent(this.getUsage(sender))); return null; } if (teleposerID < 0) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.negative")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.negative")); return null; } return teleposerID; @@ -140,7 +140,7 @@ public class SubCommandTeleposer extends CommandTreeBase { @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 TextComponentTranslation(getHelp())); + sender.sendMessage(new TranslationTextComponent(getHelp())); return; } if (!(getName().equals("rmrf") || getName().equals("remove"))) { @@ -179,7 +179,7 @@ public class SubCommandTeleposer extends CommandTreeBase { sendOwnedTeleposerList(sender, null); else if (!sender.getEntityWorld().isRemote) { if (teleposerID > teleposerArray.length) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.error.outofbounds")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.outofbounds")); return; } TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! @@ -192,7 +192,7 @@ public class SubCommandTeleposer extends CommandTreeBase { } else return; - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); } } @@ -210,7 +210,7 @@ public class SubCommandTeleposer extends CommandTreeBase { sendOwnedTeleposerList(sender, null); else if (!sender.getEntityWorld().isRemote) { if (teleposerID > teleposerArray.length) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.outofbounds")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.outofbounds")); return; } TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! @@ -225,7 +225,7 @@ public class SubCommandTeleposer extends CommandTreeBase { } else return; - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); } } @@ -242,7 +242,7 @@ public class SubCommandTeleposer extends CommandTreeBase { sendOwnedTeleposerList(sender, null); else if (!sender.getEntityWorld().isRemote) { if (teleposerID > teleposerArray.length) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.outofbounds")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.outofbounds")); return; } TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! @@ -253,7 +253,7 @@ public class SubCommandTeleposer extends CommandTreeBase { } else return; - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); } } @@ -270,7 +270,7 @@ public class SubCommandTeleposer extends CommandTreeBase { sendOwnedTeleposerList(sender, null); else if (!sender.getEntityWorld().isRemote) { if (teleposerID > teleposerArray.length) { - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.outofbounds")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.outofbounds")); return; } TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! @@ -298,7 +298,7 @@ public class SubCommandTeleposer extends CommandTreeBase { } else return; - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); } } @@ -322,7 +322,7 @@ public class SubCommandTeleposer extends CommandTreeBase { } cleanUpAndCreateArrayFromTeleposerList(null); - sender.sendMessage(new TextComponentTranslation("commands.bloodmagic.success")); + sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java index e1ba4eee..fadb82ea 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java @@ -12,7 +12,7 @@ import amerifrance.guideapi.api.GuideBook; import amerifrance.guideapi.api.IGuideBook; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.category.CategoryItemStack; -import net.minecraft.init.Items; +import net.minecraft.item.Items; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java index eca0eff2..2d661567 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java @@ -9,9 +9,9 @@ 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.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java index a26dd233..64302417 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java @@ -9,9 +9,9 @@ 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.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index abfe0957..95109a73 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -8,9 +8,9 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; @@ -45,7 +45,7 @@ public class DataProviderAlchemyArray implements IWailaDataProvider { @Nonnull @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { TileAlchemyArray alchemyArray = (TileAlchemyArray) te; if (!alchemyArray.getStackInSlot(0).isEmpty()) tag.setString("reagent", alchemyArray.getStackInSlot(0).getDisplayName()); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java index 1614bee5..d144fb3f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -9,10 +9,10 @@ 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.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -36,7 +36,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider { return currenttip; if (accessor.getNBTData().hasKey("altar")) { - NBTTagCompound altarData = accessor.getNBTData().getCompoundTag("altar"); + CompoundNBT altarData = accessor.getNBTData().getCompoundTag("altar"); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarTier", altarData.getInteger("tier"))); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarCapacity", altarData.getInteger("capacity"))); currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentEssence", altarData.getInteger("stored"))); @@ -52,7 +52,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider { @Nonnull @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { TileAltar altar = (TileAltar) te; boolean hasSigil = false; @@ -78,7 +78,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider { if (!hasSeer && !hasSigil) return tag; - NBTTagCompound altarData = new NBTTagCompound(); + CompoundNBT altarData = new CompoundNBT(); altarData.setInteger("tier", altar.getTier().toInt()); altarData.setInteger("capacity", altar.getCapacity()); altarData.setInteger("stored", altar.getCurrentBlood()); @@ -92,7 +92,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider { return tag; } - public static boolean hasStack(ItemStack stack, EntityPlayer player) { + public static boolean hasStack(ItemStack stack, PlayerEntity player) { for (ItemStack inventoryStack : player.inventory.mainInventory) if (inventoryStack != null && inventoryStack.isItemEqual(stack)) return true; @@ -100,7 +100,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider { return false; } - private static boolean holdingSeerSigil(EntityPlayer player) { + private static boolean holdingSeerSigil(PlayerEntity player) { if (player.getHeldItemMainhand().getItem() == RegistrarBloodMagicItems.SIGIL_SEER) return true; @@ -110,7 +110,7 @@ public class DataProviderBloodAltar implements IWailaDataProvider { return false; } - private static boolean holdingDivinationSigil(EntityPlayer player) { + private static boolean holdingDivinationSigil(PlayerEntity player) { if (player.getHeldItemMainhand().getItem() instanceof ItemSigilDivination) return true; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index b664531c..ed35e77b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -6,9 +6,9 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -40,12 +40,12 @@ public class DataProviderBloodTank implements IWailaDataProvider { @Nonnull @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { TileBloodTank tank = (TileBloodTank) te; tag.setInteger("tier", tank.getBlockMetadata() + 1); tag.setInteger("capacity", tank.capacity); if (tank.getTank().getFluid() != null) - tag.setTag("fluid", tank.getTank().getFluid().writeToNBT(new NBTTagCompound())); + tag.setTag("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 index e4bf0264..43d11f75 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java @@ -4,10 +4,10 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -24,7 +24,7 @@ public class DataProviderMimic implements IWailaDataProvider { @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { if (accessor.getNBTData().hasKey("mimiced")) { - NBTTagCompound mimiced = accessor.getNBTData().getCompoundTag("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); @@ -39,14 +39,14 @@ public class DataProviderMimic implements IWailaDataProvider { @Nonnull @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + 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()) { - NBTTagCompound item = new NBTTagCompound(); + CompoundNBT item = new CompoundNBT(); item.setString("id", mimiced.getItem().getRegistryName().toString()); item.setInteger("data", mimiced.getMetadata()); - NBTTagCompound shareTag = mimiced.getItem().getNBTShareTag(mimiced); + CompoundNBT shareTag = mimiced.getItem().getNBTShareTag(mimiced); if (shareTag != null) item.setTag("nbt", shareTag); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java index da4d5b21..4cf4ca0b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -9,9 +9,9 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -29,7 +29,7 @@ public class DataProviderRitualController implements IWailaDataProvider { if (!config.getConfig(Constants.Compat.WAILA_CONFIG_RITUAL)) return currenttip; - NBTTagCompound tag = accessor.getNBTData(); + CompoundNBT tag = accessor.getNBTData(); if (tag.getBoolean("master")) { if (tag.hasKey("ritual")) { currenttip.add(TextHelper.localizeEffect(tag.getString("ritual"))); @@ -53,7 +53,7 @@ public class DataProviderRitualController implements IWailaDataProvider { @Nonnull @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { if (te instanceof TileMasterRitualStone) { TileMasterRitualStone mrs = (TileMasterRitualStone) te; diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java index 8f21ea90..d30b65d4 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java @@ -7,9 +7,9 @@ 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.EntityPlayerMP; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -31,7 +31,7 @@ public class DataProviderTeleposer implements IWailaDataProvider { return currenttip; if (accessor.getNBTData().hasKey("focus")) { - NBTTagCompound focusData = accessor.getNBTData().getCompoundTag("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("_", " ")); @@ -43,12 +43,12 @@ public class DataProviderTeleposer implements IWailaDataProvider { } @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + 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(); - NBTTagCompound focusData = new NBTTagCompound(); + CompoundNBT focusData = new CompoundNBT(); focusData.setTag("pos", NBTUtil.createPosTag(focus.getBlockPos(contained))); focusData.setInteger("dim", contained.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID)); tag.setTag("focus", focusData); diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java index 71b6120e..4b61f7e0 100644 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.compress; import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.InventoryCrafting; +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; @@ -15,21 +15,21 @@ import java.util.Set; public class StorageBlockCraftingManager { private static final StorageBlockCraftingManager instance = new StorageBlockCraftingManager(); - private static InventoryCrafting[] inventoryCrafting = { - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { + private static CraftingInventory[] inventoryCrafting = { + new CraftingInventory(new Container() { + public boolean canInteractWith(PlayerEntity player) { return false; } }, 3, 3), - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { + new CraftingInventory(new Container() { + public boolean canInteractWith(PlayerEntity player) { return false; } }, 2, 2), - new InventoryCrafting(new Container() { - public boolean canInteractWith(EntityPlayer player) { + new CraftingInventory(new Container() { + public boolean canInteractWith(PlayerEntity player) { return false; } }, @@ -56,7 +56,7 @@ public class StorageBlockCraftingManager { if (craftingManagerSB.blacklist.contains(stack)) { return ItemStack.EMPTY; } - InventoryCrafting inventory = inventoryCrafting[3 - gridSize]; + CraftingInventory inventory = inventoryCrafting[3 - gridSize]; for (int i = 0; i < inventory.getSizeInventory(); i++) { inventory.setInventorySlotContents(i, stack); } @@ -74,7 +74,7 @@ public class StorageBlockCraftingManager { return ItemStack.EMPTY; } - public static ItemStack getNNRecipeOutput(InventoryCrafting inventory, World world) { + public static ItemStack getNNRecipeOutput(CraftingInventory inventory, World world) { IRecipe checkForNull = CraftingManager.findMatchingRecipe(inventory, world); if (checkForNull != null) { return checkForNull.getRecipeOutput(); @@ -102,11 +102,11 @@ public class StorageBlockCraftingManager { BMLog.DEBUG.info("Total number of compression recipes: " + this.recipes.size()); } - public ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world) { + public ItemStack findMatchingRecipe(CraftingInventory craftingInventory, World world) { return this.findMatchingRecipe(craftingInventory, world, this.recipes); } - private ItemStack findMatchingRecipe(InventoryCrafting craftingInventory, World world, HashSet list) { + private ItemStack findMatchingRecipe(CraftingInventory craftingInventory, World world, HashSet list) { int i = 0; ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack1 = ItemStack.EMPTY; diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index fb6269d2..e5aaa84a 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -10,9 +10,9 @@ 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.block.model.ModelResourceLocation; -import net.minecraft.init.MobEffects; -import net.minecraft.potion.Potion; +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; @@ -45,23 +45,23 @@ public class RegistrarBloodMagic { @GameRegistry.ObjectHolder("transcendent") public static final BloodOrb ORB_TRANSCENDENT = ORB_DEF; - public static final Potion BOOST = MobEffects.HASTE; - public static final Potion WHIRLWIND = MobEffects.HASTE; - public static final Potion PLANAR_BINDING = MobEffects.HASTE; - public static final Potion SOUL_SNARE = MobEffects.HASTE; - public static final Potion SOUL_FRAY = MobEffects.HASTE; - public static final Potion FIRE_FUSE = MobEffects.HASTE; - public static final Potion CONSTRICT = MobEffects.HASTE; - public static final Potion PLANT_LEECH = MobEffects.HASTE; - public static final Potion DEAFNESS = MobEffects.HASTE; - public static final Potion BOUNCE = MobEffects.HASTE; - public static final Potion CLING = MobEffects.HASTE; - public static final Potion SACRIFICIAL_LAMB = MobEffects.HASTE; - public static final Potion FLIGHT = MobEffects.HASTE; - public static final Potion GROUNDED = MobEffects.HASTE; - public static final Potion HEAVY_HEART = MobEffects.HASTE; - public static final Potion SUSPENDED = MobEffects.HASTE; - public static final Potion FEATHERED = MobEffects.HASTE; + 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 IForgeRegistry BLOOD_ORBS = null; @@ -83,7 +83,7 @@ public class RegistrarBloodMagic { } @SubscribeEvent - public static void registerPotions(RegistryEvent.Register event) { + 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"), diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java index 7838a879..62815e21 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java @@ -10,11 +10,11 @@ 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.block.state.IBlockState; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.block.statemap.StateMapperBase; -import net.minecraft.init.Blocks; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.event.RegistryEvent; @@ -134,7 +134,7 @@ public class RegistrarBloodMagicBlocks { public static void registerModels(ModelRegistryEvent event) { ModelLoader.setCustomStateMapper(LIFE_ESSENCE, new StateMapperBase() { @Override - protected ModelResourceLocation getModelResourceLocation(IBlockState state) { + protected ModelResourceLocation getModelResourceLocation(BlockState state) { return new ModelResourceLocation(state.getBlock().getRegistryName(), "fluid"); } }); diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java index 0938c425..c4421b41 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java @@ -23,9 +23,9 @@ 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.block.model.ModelResourceLocation; -import net.minecraft.init.Items; -import net.minecraft.inventory.EntityEquipmentSlot; +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; @@ -182,14 +182,14 @@ public class RegistrarBloodMagicItems { new ItemTelepositionFocus().setRegistryName("teleposition_focus"), new ItemExperienceBook().setRegistryName("experience_tome"), new ItemEnum.Variant<>(ShardType.class, "blood_shard").setRegistryName("blood_shard"), - new ItemLivingArmour(EntityEquipmentSlot.HEAD).setRegistryName("living_armour_helmet"), - new ItemLivingArmour(EntityEquipmentSlot.CHEST).setRegistryName("living_armour_chest"), - new ItemLivingArmour(EntityEquipmentSlot.LEGS).setRegistryName("living_armour_leggings"), - new ItemLivingArmour(EntityEquipmentSlot.FEET).setRegistryName("living_armour_boots"), - new ItemSentientArmour(EntityEquipmentSlot.HEAD).setRegistryName("sentient_armour_helmet"), - new ItemSentientArmour(EntityEquipmentSlot.CHEST).setRegistryName("sentient_armour_chest"), - new ItemSentientArmour(EntityEquipmentSlot.LEGS).setRegistryName("sentient_armour_leggings"), - new ItemSentientArmour(EntityEquipmentSlot.FEET).setRegistryName("sentient_armour_boots"), + 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"), diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index d967e0b8..1b4cbdd3 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -15,9 +15,9 @@ import WayofTime.bloodmagic.ritual.EnumRuneType; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.util.PluginUtil; import com.google.common.collect.Sets; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.init.PotionTypes; +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; @@ -114,7 +114,7 @@ public class RegistrarBloodMagicRecipes { 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), PotionTypes.WATER)); + 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()); @@ -127,7 +127,7 @@ public class RegistrarBloodMagicRecipes { 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), PotionTypes.WATER), "cropNetherWart", "dustRedstone", "dustGlowstone"); + 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"); diff --git a/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java index 70338a16..c7de2d48 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.core.data; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.world.storage.WorldSavedData; import java.util.HashMap; @@ -23,7 +23,7 @@ public class BMWorldSavedData extends WorldSavedData { this(ID); } - public SoulNetwork getNetwork(EntityPlayer player) { + public SoulNetwork getNetwork(PlayerEntity player) { return getNetwork(PlayerHelper.getUUIDFromPlayer(player)); } @@ -34,11 +34,11 @@ public class BMWorldSavedData extends WorldSavedData { } @Override - public void readFromNBT(NBTTagCompound tagCompound) { - NBTTagList networkData = tagCompound.getTagList("networkData", 10); + public void readFromNBT(CompoundNBT tagCompound) { + ListNBT networkData = tagCompound.getTagList("networkData", 10); for (int i = 0; i < networkData.tagCount(); i++) { - NBTTagCompound data = networkData.getCompoundTagAt(i); + CompoundNBT data = networkData.getCompoundTagAt(i); SoulNetwork network = SoulNetwork.fromNBT(data); network.setParent(this); soulNetworks.put(network.getPlayerId(), network); @@ -46,8 +46,8 @@ public class BMWorldSavedData extends WorldSavedData { } @Override - public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) { - NBTTagList networkData = new NBTTagList(); + public CompoundNBT writeToNBT(CompoundNBT tagCompound) { + ListNBT networkData = new ListNBT(); for (SoulNetwork soulNetwork : soulNetworks.values()) networkData.appendTag(soulNetwork.serializeNBT()); diff --git a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java index 671f6a1b..4d107cef 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java @@ -1,15 +1,15 @@ package WayofTime.bloodmagic.core.data; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTUtil; import net.minecraftforge.common.util.INBTSerializable; import javax.annotation.Nullable; import java.util.UUID; -public class Binding implements INBTSerializable { +public class Binding implements INBTSerializable { private UUID uuid; private String name; @@ -24,15 +24,15 @@ public class Binding implements INBTSerializable { } @Override - public NBTTagCompound serializeNBT() { - NBTTagCompound tag = new NBTTagCompound(); + public CompoundNBT serializeNBT() { + CompoundNBT tag = new CompoundNBT(); tag.setTag("id", NBTUtil.createUUIDTag(uuid)); tag.setString("name", name); return tag; } @Override - public void deserializeNBT(NBTTagCompound nbt) { + public void deserializeNBT(CompoundNBT nbt) { this.uuid = NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")); this.name = nbt.getString("name"); } @@ -65,7 +65,7 @@ public class Binding implements INBTSerializable { return null; Binding binding = new Binding(); - binding.deserializeNBT((NBTTagCompound) bindingTag); + binding.deserializeNBT((CompoundNBT) bindingTag); return binding; } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index 4ba15109..e4eacb8f 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -7,10 +7,10 @@ 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.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +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; @@ -19,11 +19,11 @@ 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 EntityPlayer cachedPlayer; + private PlayerEntity cachedPlayer; private UUID playerId; private int currentEssence; private int orbTier; @@ -104,7 +104,7 @@ public class SoulNetwork implements INBTSerializable { return syphon(new SoulTicket(amount)); } - public BooleanResult syphonAndDamage(EntityPlayer user, SoulTicket ticket) { + public BooleanResult syphonAndDamage(PlayerEntity user, SoulTicket ticket) { if (user.getEntityWorld().isRemote) return BooleanResult.newResult(false, 0); @@ -127,16 +127,16 @@ public class SoulNetwork implements INBTSerializable { } /** - * @deprecated Use {@link #syphonAndDamage(EntityPlayer, SoulTicket)} instead. + * @deprecated Use {@link #syphonAndDamage(PlayerEntity, SoulTicket)} instead. */ @Deprecated - public boolean syphonAndDamage(EntityPlayer user, int amount) { + public boolean syphonAndDamage(PlayerEntity user, int amount) { return syphonAndDamage(user, new SoulTicket(amount)).isSuccess(); } public void causeNausea() { if (getPlayer() != null) - getPlayer().addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 99)); + getPlayer().addPotionEffect(new EffectInstance(Effects.NAUSEA, 99)); } /** @@ -147,7 +147,7 @@ public class SoulNetwork implements INBTSerializable { causeNausea(); } - public void hurtPlayer(EntityPlayer user, float syphon) { + public void hurtPlayer(PlayerEntity user, float syphon) { if (user != null) { if (syphon < 100 && syphon > 0) { if (!user.capabilities.isCreativeMode) { @@ -174,7 +174,7 @@ public class SoulNetwork implements INBTSerializable { } @Nullable - public EntityPlayer getPlayer() { + public PlayerEntity getPlayer() { if (cachedPlayer == null) cachedPlayer = PlayerHelper.getPlayerFromUUID(playerId); @@ -191,7 +191,7 @@ public class SoulNetwork implements INBTSerializable { return this; } - public EntityPlayer getCachedPlayer() { + public PlayerEntity getCachedPlayer() { return cachedPlayer; } @@ -226,8 +226,8 @@ public class SoulNetwork implements INBTSerializable { // INBTSerializable @Override - public NBTTagCompound serializeNBT() { - NBTTagCompound tagCompound = new NBTTagCompound(); + public CompoundNBT serializeNBT() { + CompoundNBT tagCompound = new CompoundNBT(); tagCompound.setString("playerId", getPlayerId().toString()); tagCompound.setInteger("currentEssence", getCurrentEssence()); tagCompound.setInteger("orbTier", getOrbTier()); @@ -235,13 +235,13 @@ public class SoulNetwork implements INBTSerializable { } @Override - public void deserializeNBT(NBTTagCompound nbt) { + public void deserializeNBT(CompoundNBT nbt) { this.playerId = UUID.fromString(nbt.getString("playerId")); this.currentEssence = nbt.getInteger("currentEssence"); this.orbTier = nbt.getInteger("orbTier"); } - public static SoulNetwork fromNBT(NBTTagCompound tagCompound) { + public static SoulNetwork fromNBT(CompoundNBT tagCompound) { SoulNetwork soulNetwork = new SoulNetwork(); soulNetwork.deserializeNBT(tagCompound); return soulNetwork; diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java index 6d209dd5..5c04038b 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java @@ -5,12 +5,12 @@ import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; public class SoulTicket { - private static final ITextComponent EMPTY = new TextComponentString(""); + private static final ITextComponent EMPTY = new StringTextComponent(""); private final ITextComponent description; private final int amount; @@ -40,32 +40,32 @@ public class SoulTicket { * @return A description in the format block|dimensionID|pos */ public static SoulTicket block(World world, BlockPos pos, int amount) { - return new SoulTicket(new TextComponentString("block|" + world.provider.getDimension() + "|" + pos.toLong()), amount); + return new SoulTicket(new StringTextComponent("block|" + world.provider.getDimension() + "|" + 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 TextComponentString("item|" + itemStack.getItem().getRegistryName() + "|" + world.provider.getDimension() + "|" + entity.getPersistentID()), amount); + return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName() + "|" + world.provider.getDimension() + "|" + entity.getPersistentID()), 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 TextComponentString("item|" + itemStack.getItem().getRegistryName() + "|" + world.provider.getDimension() + "|" + pos.toLong()), amount); + return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName() + "|" + world.provider.getDimension() + "|" + 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 TextComponentString("item|" + itemStack.getItem().getRegistryName()), amount); + return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName()), amount); } public static SoulTicket command(ICommandSender sender, String command, int amount) { - return new SoulTicket(new TextComponentString("command|" + command + "|" + sender.getName()), amount); + return new SoulTicket(new StringTextComponent("command|" + command + "|" + sender.getName()), amount); } // TODO maybe make it check the amount?? diff --git a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java index c61289d9..aab60d48 100644 --- a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java @@ -6,7 +6,7 @@ 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.client.util.RecipeItemHelper; +import net.minecraft.item.crafting.RecipeItemHelper; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.NonNullList; diff --git a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java index bd7060ee..4c6ab978 100644 --- a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java +++ b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java @@ -3,7 +3,7 @@ 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.JSONUtils; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.crafting.IIngredientFactory; import net.minecraftforge.common.crafting.JsonContext; @@ -15,7 +15,7 @@ public class IngredientBloodOrbFactory implements IIngredientFactory { @Nonnull @Override public Ingredient parse(JsonContext context, JsonObject json) { - ResourceLocation orb = new ResourceLocation(JsonUtils.getString(json, "orb")); + 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/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java index 81267670..497d90fc 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java @@ -5,7 +5,7 @@ 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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraftforge.fml.common.registry.GameRegistry; import java.util.ArrayList; @@ -50,7 +50,7 @@ public class OrbRegistry { public static ItemStack getOrbStack(BloodOrb orb) { ItemStack ret = new ItemStack(ORB_ITEM); - NBTTagCompound tag = new NBTTagCompound(); + CompoundNBT tag = new CompoundNBT(); tag.setString("orb", orb.getRegistryName().toString()); ret.setTagCompound(tag); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java index f6eb575c..c776b47a 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.item.ItemBow; -import net.minecraft.util.EnumHand; +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 EntityAIBase { +public class EntityAIAttackRangedBow extends Goal { private final EntityDemonBase entity; private final double moveSpeedAmp; private final float maxAttackDistance; @@ -37,7 +37,7 @@ public class EntityAIAttackRangedBow extends EntityAIBase { } protected boolean isBowInMainhand() { - return this.entity.getHeldItemMainhand().getItem() instanceof ItemBow; + return this.entity.getHeldItemMainhand().getItem() instanceof BowItem; } /** @@ -68,7 +68,7 @@ public class EntityAIAttackRangedBow extends EntityAIBase { * Updates the task */ public void updateTask() { - EntityLivingBase entitylivingbase = this.entity.getAttackTarget(); + LivingEntity entitylivingbase = this.entity.getAttackTarget(); if (entitylivingbase != null) { double d0 = this.entity.getDistanceSq(entitylivingbase.posX, entitylivingbase.getEntityBoundingBox().minY, entitylivingbase.posZ); @@ -126,12 +126,12 @@ public class EntityAIAttackRangedBow extends EntityAIBase { if (i >= 20) { this.entity.resetActiveHand(); - this.entity.attackEntityWithRangedAttack(entitylivingbase, ItemBow.getArrowVelocity(i)); + this.entity.attackEntityWithRangedAttack(entitylivingbase, BowItem.getArrowVelocity(i)); this.attackTime = this.attackCooldown; } } } else if (--this.attackTime <= 0 && this.seeTime >= -60) { - this.entity.setActiveHand(EnumHand.MAIN_HAND); + this.entity.setActiveHand(Hand.MAIN_HAND); } } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java index 0a2df18c..08ecf2d4 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.goal.Goal; import net.minecraft.pathfinding.Path; -import net.minecraft.util.EnumHand; +import net.minecraft.util.Hand; import net.minecraft.world.World; -public class EntityAIAttackStealthMelee extends EntityAIBase { +public class EntityAIAttackStealthMelee extends Goal { protected final int attackInterval = 20; protected EntityCorruptedChicken chicken; /** @@ -50,7 +50,7 @@ public class EntityAIAttackStealthMelee extends EntityAIBase { return false; } - EntityLivingBase entitylivingbase = this.chicken.getAttackTarget(); + LivingEntity entitylivingbase = this.chicken.getAttackTarget(); if (entitylivingbase == null) { return false; @@ -85,7 +85,7 @@ public class EntityAIAttackStealthMelee extends EntityAIBase { @Override public void updateTask() { - EntityLivingBase entitylivingbase = this.chicken.getAttackTarget(); + 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; @@ -124,19 +124,19 @@ public class EntityAIAttackStealthMelee extends EntityAIBase { this.attackEntity(entitylivingbase, d0); } - protected void attackEntity(EntityLivingBase attacked, double distance) { + protected void attackEntity(LivingEntity attacked, double distance) { double d0 = this.getAttackReachSqr(attacked); if (distance <= d0 && this.attackTick <= 0) { this.attackTick = 20; - this.chicken.swingArm(EnumHand.MAIN_HAND); + this.chicken.swingArm(Hand.MAIN_HAND); this.chicken.attackEntityAsMob(attacked); chicken.attackStateMachine = 2; } } - protected double getAttackReachSqr(EntityLivingBase attackTarget) { + 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 index a7718a6b..0f6d167a 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java @@ -3,12 +3,12 @@ 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.state.IBlockState; -import net.minecraft.entity.ai.EntityAIBase; +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 EntityAIBase { +public class EntityAIEatAndCorruptBlock extends Goal { /** * The entity owner of this AITask */ @@ -36,7 +36,7 @@ public class EntityAIEatAndCorruptBlock extends EntityAIBase { return false; } else { BlockPos pos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ).down(); - IBlockState offsetState = world.getBlockState(pos); + BlockState offsetState = world.getBlockState(pos); Block offsetBlock = offsetState.getBlock(); return CorruptionHandler.isBlockCorruptible(world, grassEaterEntity.getType(), pos, offsetState, offsetBlock); } @@ -82,7 +82,7 @@ public class EntityAIEatAndCorruptBlock extends EntityAIBase { BlockPos blockpos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ); BlockPos offsetPos = blockpos.down(); - IBlockState offsetState = world.getBlockState(offsetPos); + BlockState offsetState = world.getBlockState(offsetPos); Block offsetBlock = offsetState.getBlock(); if (CorruptionHandler.isBlockCorruptible(world, grassEaterEntity.getType(), offsetPos, offsetState, offsetBlock)) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java index cd82198d..6fe42c3b 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java @@ -2,26 +2,26 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityDemonBase; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.pathfinding.PathNavigate; -import net.minecraft.pathfinding.PathNavigateGround; +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 EntityAIBase { +public class EntityAIFollowOwner extends Goal { World theWorld; float maxDist; float minDist; private EntityDemonBase thePet; - private EntityLivingBase theOwner; + private LivingEntity theOwner; private double followSpeed; - private PathNavigate petPathfinder; + private PathNavigator petPathfinder; private int timeToRecalcPath; private float oldWaterCost; @@ -34,7 +34,7 @@ public class EntityAIFollowOwner extends EntityAIBase { this.maxDist = maxDistIn; this.setMutexBits(3); - if (!(thePetIn.getNavigator() instanceof PathNavigateGround)) { + if (!(thePetIn.getNavigator() instanceof GroundPathNavigator)) { throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); } } @@ -43,11 +43,11 @@ public class EntityAIFollowOwner extends EntityAIBase { * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute() { - EntityLivingBase entitylivingbase = this.thePet.getOwner(); + LivingEntity entitylivingbase = this.thePet.getOwner(); if (entitylivingbase == null) { return false; - } else if (entitylivingbase instanceof EntityPlayer && ((EntityPlayer) entitylivingbase).isSpectator()) { + } else if (entitylivingbase instanceof PlayerEntity && ((PlayerEntity) entitylivingbase).isSpectator()) { return false; } else if (this.thePet.isStationary()) { return false; @@ -85,7 +85,7 @@ public class EntityAIFollowOwner extends EntityAIBase { } private boolean isEmptyBlock(BlockPos pos) { - IBlockState iblockstate = this.theWorld.getBlockState(pos); + BlockState iblockstate = this.theWorld.getBlockState(pos); Block block = iblockstate.getBlock(); return block == Blocks.AIR || !iblockstate.isFullCube(); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java index 3b42eec1..83092001 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java @@ -2,25 +2,25 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.pathfinding.PathNavigate; -import net.minecraft.pathfinding.PathNavigateGround; +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 EntityAIBase { +public class EntityAIGrabEffectsFromOwner extends Goal { World theWorld; float minDist; private EntitySentientSpecter thePet; - private EntityLivingBase theOwner; + private LivingEntity theOwner; private double followSpeed; - private PathNavigate petPathfinder; + private PathNavigator petPathfinder; private int timeToRecalcPath; private float oldWaterCost; @@ -36,7 +36,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { this.minDist = minDistIn; this.setMutexBits(3); - if (!(thePetIn.getNavigator() instanceof PathNavigateGround)) { + if (!(thePetIn.getNavigator() instanceof GroundPathNavigator)) { throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); } } @@ -45,11 +45,11 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute() { - EntityLivingBase entitylivingbase = this.thePet.getOwner(); + LivingEntity entitylivingbase = this.thePet.getOwner(); if (entitylivingbase == null) { return false; - } else if (entitylivingbase instanceof EntityPlayer && ((EntityPlayer) entitylivingbase).isSpectator()) { + } else if (entitylivingbase instanceof PlayerEntity && ((PlayerEntity) entitylivingbase).isSpectator()) { return false; } else if (this.thePet.isStationary()) { return false; @@ -90,7 +90,7 @@ public class EntityAIGrabEffectsFromOwner extends EntityAIBase { } private boolean isEmptyBlock(BlockPos pos) { - IBlockState iblockstate = this.theWorld.getBlockState(pos); + BlockState iblockstate = this.theWorld.getBlockState(pos); Block block = iblockstate.getBlock(); return block == Blocks.AIR || !iblockstate.isFullCube(); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java index 371ed1be..44690ec5 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java @@ -1,19 +1,19 @@ package WayofTime.bloodmagic.entity.ai; -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.IEntityOwnable; -import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.goal.HurtByTargetGoal; import java.util.UUID; -public class EntityAIHurtByTargetIgnoreTamed extends EntityAIHurtByTarget { - public EntityAIHurtByTargetIgnoreTamed(EntityCreature creatureIn, boolean entityCallsForHelpIn, Class... targetClassesIn) { +public class EntityAIHurtByTargetIgnoreTamed extends HurtByTargetGoal { + public EntityAIHurtByTargetIgnoreTamed(CreatureEntity creatureIn, boolean entityCallsForHelpIn, Class... targetClassesIn) { super(creatureIn, true, targetClassesIn); } @Override - public boolean isSuitableTarget(EntityLivingBase target, boolean includeInvincibles) { + 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(); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java index cf35ee3b..787dcaec 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityMimic; -import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.ai.goal.Goal; import net.minecraft.util.math.BlockPos; -public class EntityAIMimicReform extends EntityAIBase { +public class EntityAIMimicReform extends Goal { private final EntityMimic theEntity; public EntityAIMimicReform(EntityMimic creatureIn) { diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java index 42bfb5fa..371c3b4c 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAITarget; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.goal.TargetGoal; -public class EntityAIOwnerHurtByTarget extends EntityAITarget { +public class EntityAIOwnerHurtByTarget extends TargetGoal { EntityDemonBase theDefendingTameable; - EntityLivingBase theOwnerAttacker; + LivingEntity theOwnerAttacker; private int timestamp; public EntityAIOwnerHurtByTarget(EntityDemonBase theDefendingTameableIn) { @@ -22,7 +22,7 @@ public class EntityAIOwnerHurtByTarget extends EntityAITarget { if (!this.theDefendingTameable.isTamed()) { return false; } else { - EntityLivingBase owner = this.theDefendingTameable.getOwner(); + LivingEntity owner = this.theDefendingTameable.getOwner(); if (owner == null) { return false; @@ -39,7 +39,7 @@ public class EntityAIOwnerHurtByTarget extends EntityAITarget { */ public void startExecuting() { this.taskOwner.setAttackTarget(this.theOwnerAttacker); - EntityLivingBase owner = this.theDefendingTameable.getOwner(); + LivingEntity owner = this.theDefendingTameable.getOwner(); if (owner != null) { this.timestamp = owner.getRevengeTimer(); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java index 20ee7204..61433ccd 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAITarget; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.goal.TargetGoal; -public class EntityAIOwnerHurtTarget extends EntityAITarget { +public class EntityAIOwnerHurtTarget extends TargetGoal { EntityDemonBase theEntityDemonBase; - EntityLivingBase theTarget; + LivingEntity theTarget; private int timestamp; public EntityAIOwnerHurtTarget(EntityDemonBase theEntityDemonBaseIn) { @@ -22,7 +22,7 @@ public class EntityAIOwnerHurtTarget extends EntityAITarget { if (!this.theEntityDemonBase.isTamed()) { return false; } else { - EntityLivingBase entitylivingbase = this.theEntityDemonBase.getOwner(); + LivingEntity entitylivingbase = this.theEntityDemonBase.getOwner(); if (entitylivingbase == null) { return false; @@ -39,7 +39,7 @@ public class EntityAIOwnerHurtTarget extends EntityAITarget { */ public void startExecuting() { this.taskOwner.setAttackTarget(this.theTarget); - EntityLivingBase entitylivingbase = this.theEntityDemonBase.getOwner(); + LivingEntity entitylivingbase = this.theEntityDemonBase.getOwner(); if (entitylivingbase != null) { this.timestamp = entitylivingbase.getLastAttackedEntityTime(); diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java index eb69d601..77e9f9d9 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java @@ -2,15 +2,15 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; +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 EntityAIBase { +public class EntityAIPickUpAlly extends Goal { protected final int attackInterval = 20; protected EntityAspectedDemonBase entity; /** @@ -39,7 +39,7 @@ public class EntityAIPickUpAlly extends EntityAIBase { private int failedPathFindingPenalty = 0; private boolean canPenalize = false; - private EntityLivingBase pickupTarget = null; + private LivingEntity pickupTarget = null; public EntityAIPickUpAlly(EntityAspectedDemonBase creature, double speedIn, boolean useLongMemory) { this.entity = creature; @@ -58,8 +58,8 @@ public class EntityAIPickUpAlly extends EntityAIBase { } 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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (EntityLivingBase testEntity : list) { + 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) { @@ -100,7 +100,7 @@ public class EntityAIPickUpAlly extends EntityAIBase { * Updates the task */ public void updateTask() { - EntityLivingBase entitylivingbase = this.pickupTarget; + 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; @@ -139,7 +139,7 @@ public class EntityAIPickUpAlly extends EntityAIBase { this.pickUpEntity(entitylivingbase, d0); } - protected void pickUpEntity(EntityLivingBase potentialPickup, double distance) { + protected void pickUpEntity(LivingEntity potentialPickup, double distance) { double d0 = this.getAttackReachSqr(potentialPickup); if (distance <= d0 && this.attackTick <= 0 && !potentialPickup.isRiding()) { @@ -148,7 +148,7 @@ public class EntityAIPickUpAlly extends EntityAIBase { } } - protected double getAttackReachSqr(EntityLivingBase attackTarget) { + 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 index d831c487..5f7b7981 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java @@ -2,14 +2,14 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; +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 EntityAIBase { +public class EntityAIProtectAlly extends Goal { /** * The entity owner of this AITask */ @@ -39,8 +39,8 @@ public class EntityAIProtectAlly extends EntityAIBase { @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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (EntityLivingBase testEntity : list) { + 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; @@ -85,8 +85,8 @@ public class EntityAIProtectAlly extends EntityAIBase { 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(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (EntityLivingBase testEntity : list) { + 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; diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java index a2468fbe..76d47389 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java @@ -4,16 +4,16 @@ 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.EntityAIBase; +import net.minecraft.entity.ai.goal.Goal; import net.minecraft.entity.ai.RandomPositionGenerator; import net.minecraft.pathfinding.Path; -import net.minecraft.pathfinding.PathNavigate; -import net.minecraft.util.EntitySelectors; +import net.minecraft.pathfinding.PathNavigator; +import net.minecraft.util.EntityPredicates; import net.minecraft.util.math.Vec3d; import java.util.List; -public class EntityAIRetreatToHeal extends EntityAIBase { +public class EntityAIRetreatToHeal extends Goal { private final Predicate canBeSeenSelector; /** * The entity we are attached to @@ -31,7 +31,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase { /** * The PathNavigate of our entity */ - private PathNavigate entityPathNavigate; + private PathNavigator entityPathNavigate; private Class classToAvoid; private Predicate avoidTargetSelector; @@ -61,7 +61,7 @@ public class EntityAIRetreatToHeal extends EntityAIBase { } //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(EntitySelectors.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector)); + 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 diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java index 51600496..43d4e275 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java @@ -1,21 +1,21 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; +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.PathNavigate; +import net.minecraft.pathfinding.PathNavigator; import net.minecraft.util.math.Vec3d; -public class EntityAIStealthRetreat extends EntityAIBase { +public class EntityAIStealthRetreat extends Goal { private final double farSpeed; private final double nearSpeed; private final float avoidDistance; /** * The PathNavigate of our entity */ - private final PathNavigate entityPathNavigate; + private final PathNavigator entityPathNavigate; /** * The entity we are attached to */ @@ -38,7 +38,7 @@ public class EntityAIStealthRetreat extends EntityAIBase { @Override public boolean shouldExecute() { if (this.entity.attackStateMachine == 2) { - EntityLivingBase attacked = this.entity.getAttackTarget(); + LivingEntity attacked = this.entity.getAttackTarget(); if (attacked == null) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java index 74dd9ba6..7e25dd39 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java +++ b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.entity.ai; import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; +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 EntityAIBase { +public class EntityAIStealthTowardsTarget extends Goal { private final EntityCorruptedChicken entity; private final double speed; private double xPosition; @@ -27,10 +27,10 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase { return false; } - EntityLivingBase target = this.entity.getAttackTarget(); + LivingEntity target = this.entity.getAttackTarget(); Vec3d vec3d = null; - if (target instanceof EntityCreature) { - vec3d = RandomPositionGenerator.findRandomTarget((EntityCreature) target, 10, 7); + if (target instanceof CreatureEntity) { + vec3d = RandomPositionGenerator.findRandomTarget((CreatureEntity) target, 10, 7); } else { vec3d = RandomPositionGenerator.findRandomTarget(this.entity, 10, 7); } @@ -61,10 +61,10 @@ public class EntityAIStealthTowardsTarget extends EntityAIBase { this.entity.cloak(); if (this.entity.getNavigator().noPath()) { - EntityLivingBase target = this.entity.getAttackTarget(); + LivingEntity target = this.entity.getAttackTarget(); Vec3d vec3d; - if (target instanceof EntityCreature) { - vec3d = RandomPositionGenerator.findRandomTarget((EntityCreature) target, 10, 7); + if (target instanceof CreatureEntity) { + vec3d = RandomPositionGenerator.findRandomTarget((CreatureEntity) target, 10, 7); } else { vec3d = RandomPositionGenerator.findRandomTarget(this.entity, 10, 7); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java index 47f9cf1d..d47c1e68 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java @@ -4,9 +4,9 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.util.DamageSource; @@ -182,14 +182,14 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase { } @Override - public void writeEntityToNBT(NBTTagCompound tag) { + public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); tag.setString(Constants.NBT.WILL_TYPE, this.getType().toString()); } @Override - public void readEntityFromNBT(NBTTagCompound tag) { + public void readEntityFromNBT(CompoundNBT tag) { super.readEntityFromNBT(tag); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { @@ -200,7 +200,7 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase { } //Returns true if the inputted mob is on the same team. - public static class WillTypePredicate implements Predicate { + public static class WillTypePredicate implements Predicate { private final EnumDemonWillType type; public WillTypePredicate(EnumDemonWillType type) { @@ -209,7 +209,7 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase { //Returns true if this mob is the same type. @Override - public boolean apply(EntityLivingBase input) { + public boolean apply(LivingEntity input) { if (input instanceof EntityAspectedDemonBase) { if (((EntityAspectedDemonBase) input).getType() == type) { return true; @@ -220,7 +220,7 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase { } } - public class TeamAttackPredicate implements Predicate { + public class TeamAttackPredicate implements Predicate { private final EntityAspectedDemonBase demon; public TeamAttackPredicate(EntityAspectedDemonBase demon) { @@ -229,7 +229,7 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase { //Returns true if this mob can attack the inputted mob. @Override - public boolean apply(EntityLivingBase input) { + public boolean apply(LivingEntity input) { if (input instanceof EntityAspectedDemonBase) { if (((EntityAspectedDemonBase) input).getType() == demon.getType()) { return false; diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java index 450bb4f9..1ea7e265 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java @@ -6,15 +6,15 @@ 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.EntityLivingBase; -import net.minecraft.entity.ai.*; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; -import net.minecraft.nbt.NBTTagCompound; +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.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -55,16 +55,16 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase { } protected void initEntityAI() { - this.tasks.addTask(0, new EntityAISwimming(this)); + 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 EntityAIWander(this, 1.0D)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); + 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 EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(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 @@ -78,7 +78,7 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase { } public void cloak() { - this.addPotionEffect(new PotionEffect(MobEffects.INVISIBILITY, 50, 0, false, false)); + this.addPotionEffect(new EffectInstance(Effects.INVISIBILITY, 50, 0, false, false)); } @Override @@ -172,7 +172,7 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase { } @Override - public void readEntityFromNBT(NBTTagCompound compound) { + public void readEntityFromNBT(CompoundNBT compound) { super.readEntityFromNBT(compound); if (compound.hasKey("EggLayTime")) { @@ -181,7 +181,7 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase { } @Override - public void writeEntityToNBT(NBTTagCompound compound) { + public void writeEntityToNBT(CompoundNBT compound) { super.writeEntityToNBT(compound); compound.setInteger("EggLayTime", this.timeUntilNextEgg); } @@ -195,8 +195,8 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase { 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 EntityLivingBase) { - ((EntityLivingBase) passenger).renderYawOffset = this.renderYawOffset; + 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 index bd12e3e9..621b1a63 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java @@ -5,21 +5,21 @@ 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.EntityLivingBase; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.ai.*; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.EnumDyeColor; +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.nbt.NBTTagCompound; import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -38,26 +38,26 @@ 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(EnumDyeColor.class); + 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(EnumDyeColor.WHITE, new float[]{1.0F, 1.0F, 1.0F}); - DYE_TO_RGB.put(EnumDyeColor.ORANGE, new float[]{0.85F, 0.5F, 0.2F}); - DYE_TO_RGB.put(EnumDyeColor.MAGENTA, new float[]{0.7F, 0.3F, 0.85F}); - DYE_TO_RGB.put(EnumDyeColor.LIGHT_BLUE, new float[]{0.4F, 0.6F, 0.85F}); - DYE_TO_RGB.put(EnumDyeColor.YELLOW, new float[]{0.9F, 0.9F, 0.2F}); - DYE_TO_RGB.put(EnumDyeColor.LIME, new float[]{0.5F, 0.8F, 0.1F}); - DYE_TO_RGB.put(EnumDyeColor.PINK, new float[]{0.95F, 0.5F, 0.65F}); - DYE_TO_RGB.put(EnumDyeColor.GRAY, new float[]{0.3F, 0.3F, 0.3F}); - DYE_TO_RGB.put(EnumDyeColor.SILVER, new float[]{0.6F, 0.6F, 0.6F}); - DYE_TO_RGB.put(EnumDyeColor.CYAN, new float[]{0.3F, 0.5F, 0.6F}); - DYE_TO_RGB.put(EnumDyeColor.PURPLE, new float[]{0.5F, 0.25F, 0.7F}); - DYE_TO_RGB.put(EnumDyeColor.BLUE, new float[]{0.2F, 0.3F, 0.7F}); - DYE_TO_RGB.put(EnumDyeColor.BROWN, new float[]{0.4F, 0.3F, 0.2F}); - DYE_TO_RGB.put(EnumDyeColor.GREEN, new float[]{0.4F, 0.5F, 0.2F}); - DYE_TO_RGB.put(EnumDyeColor.RED, new float[]{0.6F, 0.2F, 0.2F}); - DYE_TO_RGB.put(EnumDyeColor.BLACK, new float[]{0.1F, 0.1F, 0.1F}); + 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; @@ -70,7 +70,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh private int castTimer = 0; private EntityAIEatAndCorruptBlock entityAIEatGrass; private EntityAIProtectAlly entityAIProtectAlly; - private EntityAIAttackMelee aiAttackOnCollide; + private MeleeAttackGoal aiAttackOnCollide; public EntityCorruptedSheep(World world) { this(world, EnumDemonWillType.DEFAULT); @@ -87,15 +87,15 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh this.entityAIEatGrass = new EntityAIEatAndCorruptBlock(this); this.entityAIProtectAlly = new EntityAIProtectAlly(this); - this.tasks.addTask(0, new EntityAISwimming(this)); + this.tasks.addTask(0, new SwimGoal(this)); this.tasks.addTask(2, entityAIProtectAlly); this.tasks.addTask(5, this.entityAIEatGrass); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); + 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 EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(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 @@ -104,7 +104,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh this.tasks.removeTask(aiAttackOnCollide); } - aiAttackOnCollide = new EntityAIAttackMelee(this, this.getBaseSprintModifier(getType()), false); + aiAttackOnCollide = new MeleeAttackGoal(this, this.getBaseSprintModifier(getType()), false); this.tasks.addTask(attackPriority, aiAttackOnCollide); } @@ -130,13 +130,13 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh super.onLivingUpdate(); } - public boolean canProtectAlly(EntityLivingBase entity) { - return this.protectionCooldown <= 0 && entity.getHealth() < entity.getMaxHealth() && !entity.isPotionActive(MobEffects.RESISTANCE); + public boolean canProtectAlly(LivingEntity entity) { + return this.protectionCooldown <= 0 && entity.getHealth() < entity.getMaxHealth() && !entity.isPotionActive(Effects.RESISTANCE); } - public boolean applyProtectionToAlly(EntityLivingBase entity) { + public boolean applyProtectionToAlly(LivingEntity entity) { if (canProtectAlly(entity)) { - entity.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, 20 * 20, 3)); + entity.addPotionEffect(new EffectInstance(Effects.RESISTANCE, 20 * 20, 3)); this.protectionCooldown = maxProtectionCooldown; } @@ -212,7 +212,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh } @Override - public void writeEntityToNBT(NBTTagCompound tag) { + public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); tag.setBoolean("Sheared", this.getSheared()); tag.setByte("Color", (byte) this.getFleeceColor().getMetadata()); @@ -220,10 +220,10 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh } @Override - public void readEntityFromNBT(NBTTagCompound tag) { + public void readEntityFromNBT(CompoundNBT tag) { super.readEntityFromNBT(tag); this.setSheared(tag.getBoolean("Sheared")); - this.setFleeceColor(EnumDyeColor.byMetadata(tag.getByte("Color"))); + this.setFleeceColor(DyeColor.byMetadata(tag.getByte("Color"))); this.protectionCooldown = tag.getInteger("protection"); } @@ -255,14 +255,14 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh /** * Gets the wool color of this sheep. */ - public EnumDyeColor getFleeceColor() { - return EnumDyeColor.byMetadata(this.dataManager.get(DYE_COLOR) & 15); + public DyeColor getFleeceColor() { + return DyeColor.byMetadata(this.dataManager.get(DYE_COLOR) & 15); } /** * Sets the wool color of this sheep */ - public void setFleeceColor(EnumDyeColor color) { + public void setFleeceColor(DyeColor color) { byte b0 = this.dataManager.get(DYE_COLOR); this.dataManager.set(DYE_COLOR, (byte) (b0 & 240 | color.getMetadata() & 15)); } @@ -307,7 +307,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh * from nbt. Mainly used for initializing attributes and inventory */ @Override - public IEntityLivingData onInitialSpawn(DifficultyInstance difficulty, @Nullable IEntityLivingData livingdata) { + public ILivingEntityData onInitialSpawn(DifficultyInstance difficulty, @Nullable ILivingEntityData livingdata) { livingdata = super.onInitialSpawn(difficulty, livingdata); this.setFleeceColor(getRandomSheepColor(this.getEntityWorld().rand)); return livingdata; @@ -340,15 +340,15 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh return castTimer; } - public static float[] getDyeRgb(EnumDyeColor dyeColor) { + public static float[] getDyeRgb(DyeColor dyeColor) { return DYE_TO_RGB.get(dyeColor); } /** * Chooses a "vanilla" sheep color based on the provided random. */ - public static EnumDyeColor getRandomSheepColor(Random random) { + public static DyeColor getRandomSheepColor(Random random) { int i = random.nextInt(100); - return i < 5 ? EnumDyeColor.BLACK : (i < 10 ? EnumDyeColor.GRAY : (i < 15 ? EnumDyeColor.SILVER : (i < 18 ? EnumDyeColor.BROWN : (random.nextInt(500) == 0 ? EnumDyeColor.PINK : EnumDyeColor.WHITE)))); + 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 index 589f6e72..1a35bddd 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java @@ -3,18 +3,18 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.ai.*; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; +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.pathfinding.PathNavigate; -import net.minecraft.pathfinding.PathNavigateClimber; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -34,17 +34,17 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase { } protected void initEntityAI() { - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + 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 EntityAIWander(this, 0.8D)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); + 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 EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityLivingBase.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(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 @@ -78,8 +78,8 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase { } @Override - protected PathNavigate createNavigator(World worldIn) { - return new PathNavigateClimber(this, worldIn); + protected PathNavigator createNavigator(World worldIn) { + return new ClimberPathNavigator(this, worldIn); } @Override @@ -137,8 +137,8 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase { } @Override - public boolean isPotionApplicable(PotionEffect potioneffectIn) { - return potioneffectIn.getPotion() != MobEffects.POISON && super.isPotionApplicable(potioneffectIn); + public boolean isPotionApplicable(EffectInstance potioneffectIn) { + return potioneffectIn.getPotion() != Effects.POISON && super.isPotionApplicable(potioneffectIn); } public boolean isBesideClimbableBlock() { @@ -162,7 +162,7 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase { return 0.65F; } - static class AISpiderAttack extends EntityAIAttackMelee { + static class AISpiderAttack extends MeleeAttackGoal { public AISpiderAttack(EntityCorruptedSpider spider) { super(spider, 1.0D, true); } @@ -181,12 +181,12 @@ public class EntityCorruptedSpider extends EntityAspectedDemonBase { } } - protected double getAttackReachSqr(EntityLivingBase attackTarget) { + protected double getAttackReachSqr(LivingEntity attackTarget) { return (double) (4.0F + attackTarget.width); } } - static class AISpiderTarget extends EntityAINearestAttackableTarget { + static class AISpiderTarget extends NearestAttackableTargetGoal { public AISpiderTarget(EntityCorruptedSpider spider, Class classTarget) { super(spider, classTarget, true); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java index f9927f48..cae520a3 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java @@ -4,27 +4,27 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.*; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntityGhast; -import net.minecraft.entity.monster.EntityIronGolem; -import net.minecraft.entity.monster.EntityPigZombie; -import net.minecraft.entity.passive.EntityVillager; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.ItemBow; +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.EnumDifficulty; +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 EntityAIAttackMelee aiAttackOnCollide = new EntityAIAttackMelee(this, 1.0D, false); + private final MeleeAttackGoal aiAttackOnCollide = new MeleeAttackGoal(this, 1.0D, false); private final int attackPriority = 3; @@ -32,18 +32,18 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase { super(worldIn); this.setSize(0.6F, 1.95F); // ((PathNavigateGround) getNavigator()).setCanSwim(false); - this.tasks.addTask(0, new EntityAISwimming(this)); + this.tasks.addTask(0, new SwimGoal(this)); this.tasks.addTask(attackPriority, aiAttackOnCollide); - this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); + 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 EntityAIMoveThroughVillage(this, 1.0D, false)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true, EntityPigZombie.class)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); - this.targetTasks.addTask(3, new EntityAINearestAttackableTarget<>(this, EntityVillager.class, false)); - this.targetTasks.addTask(3, new EntityAINearestAttackableTarget<>(this, EntityIronGolem.class, true)); + 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))); @@ -66,10 +66,10 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase { this.tasks.removeTask(this.aiArrowAttack); ItemStack itemstack = this.getHeldItemMainhand(); - if (!itemstack.isEmpty() && itemstack.getItem() instanceof ItemBow) { + if (!itemstack.isEmpty() && itemstack.getItem() instanceof BowItem) { int i = 20; - if (this.getEntityWorld().getDifficulty() != EnumDifficulty.HARD) { + if (this.getEntityWorld().getDifficulty() != Difficulty.HARD) { i = 40; } @@ -146,8 +146,8 @@ public class EntityCorruptedZombie extends EntityAspectedDemonBase { //TODO: Change to fit the given AI @Override - public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { - return !(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast) && super.shouldAttackEntity(attacker, owner); + public boolean shouldAttackEntity(LivingEntity attacker, LivingEntity owner) { + return !(attacker instanceof CreeperEntity) && !(attacker instanceof GhastEntity) && super.shouldAttackEntity(attacker, owner); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java index b82cfc8d..5f0d0245 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java @@ -5,21 +5,21 @@ 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.EntityCreeper; -import net.minecraft.entity.monster.EntityGhast; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.passive.EntityHorse; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.init.SoundEvents; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemAxe; +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.nbt.NBTTagCompound; import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.potion.PotionEffect; import net.minecraft.server.management.PreYggdrasilConverter; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; @@ -28,12 +28,12 @@ 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.WorldServer; +import net.minecraft.world.ServerWorld; import javax.annotation.Nullable; import java.util.UUID; -public class EntityDemonBase extends EntityCreature implements IEntityOwnable { +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); @@ -59,7 +59,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } @Override - public boolean isPotionApplicable(PotionEffect effect) { + public boolean isPotionApplicable(EffectInstance effect) { return super.isPotionApplicable(effect); } @@ -83,8 +83,8 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { float f = (float) this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getAttributeValue(); int i = 0; - if (attackedEntity instanceof EntityLivingBase) { - f += EnchantmentHelper.getModifierForCreature(this.getHeldItemMainhand(), ((EntityLivingBase) attackedEntity).getCreatureAttribute()); + if (attackedEntity instanceof LivingEntity) { + f += EnchantmentHelper.getModifierForCreature(this.getHeldItemMainhand(), ((LivingEntity) attackedEntity).getCreatureAttribute()); i += EnchantmentHelper.getKnockbackModifier(this); } @@ -92,7 +92,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { if (flag) { if (i > 0) { - ((EntityLivingBase) attackedEntity).knockBack(this, (float) i * 0.5F, (double) MathHelper.sin(this.rotationYaw * 0.017453292F), (double) (-MathHelper.cos(this.rotationYaw * 0.017453292F))); + ((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; } @@ -103,12 +103,12 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { attackedEntity.setFire(j * 4); } - if (attackedEntity instanceof EntityPlayer) { - EntityPlayer entityplayer = (EntityPlayer) attackedEntity; + 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 ItemAxe && itemstack1.getItem() == Items.SHIELD) { + 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) { @@ -125,10 +125,10 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } @Override - public void setItemStackToSlot(EntityEquipmentSlot slotIn, ItemStack stack) { + public void setItemStackToSlot(EquipmentSlotType slotIn, ItemStack stack) { super.setItemStackToSlot(slotIn, stack); - if (!this.getEntityWorld().isRemote && slotIn == EntityEquipmentSlot.MAINHAND) { + if (!this.getEntityWorld().isRemote && slotIn == EquipmentSlotType.MAINHAND) { this.setCombatTask(); } } @@ -144,8 +144,8 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { public void performEmergencyHeal(double toHeal) { this.heal((float) toHeal); - if (getEntityWorld() instanceof WorldServer) { - WorldServer server = (WorldServer) getEntityWorld(); + 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); } } @@ -160,7 +160,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } @Override - public void writeEntityToNBT(NBTTagCompound tag) { + public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); if (this.getOwnerId() == null) { @@ -172,7 +172,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } @Override - public void readEntityFromNBT(NBTTagCompound tag) { + public void readEntityFromNBT(CompoundNBT tag) { super.readEntityFromNBT(tag); String s; @@ -197,8 +197,8 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } //TODO: Change to fit the given AI - public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { - if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) { + public boolean shouldAttackEntity(LivingEntity attacker, LivingEntity owner) { + if (!(attacker instanceof CreeperEntity) && !(attacker instanceof GhastEntity)) { if (attacker instanceof IEntityOwnable) { IEntityOwnable entityOwnable = (IEntityOwnable) attacker; @@ -207,13 +207,13 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } } - return !(attacker instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) attacker)) && (!(attacker instanceof EntityHorse) || !((EntityHorse) attacker).isTame()); + return !(attacker instanceof PlayerEntity && owner instanceof PlayerEntity && !((PlayerEntity) owner).canAttackPlayer((PlayerEntity) attacker)) && (!(attacker instanceof HorseEntity) || !((HorseEntity) attacker).isTame()); } else { return false; } } - public void attackEntityWithRangedAttack(EntityLivingBase target, float velocity) { + public void attackEntityWithRangedAttack(LivingEntity target, float velocity) { } @@ -276,7 +276,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } @Override - public EntityLivingBase getOwner() { + public LivingEntity getOwner() { try { UUID uuid = this.getOwnerId(); return uuid == null ? null : this.getEntityWorld().getPlayerEntityByUUID(uuid); @@ -285,11 +285,11 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } } - public void setOwner(EntityPlayer player) { + public void setOwner(PlayerEntity player) { setOwnerId(player.getUniqueID()); } - public class TargetPredicate implements Predicate { + public class TargetPredicate implements Predicate { EntityDemonBase entity; public TargetPredicate(EntityDemonBase entity) { @@ -297,7 +297,7 @@ public class EntityDemonBase extends EntityCreature implements IEntityOwnable { } @Override - public boolean apply(EntityMob input) { + public boolean apply(MonsterEntity input) { return entity.shouldAttackEntity(input, this.entity.getOwner()); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index 54e39197..41361017 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -6,30 +6,30 @@ 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.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; +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.*; -import net.minecraft.entity.monster.EntityIronGolem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; -import net.minecraft.inventory.EntityEquipmentSlot; +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.NBTTagCompound; +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.pathfinding.PathNavigate; -import net.minecraft.pathfinding.PathNavigateClimber; -import net.minecraft.potion.PotionEffect; +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.EnumDifficulty; +import net.minecraft.world.Difficulty; import net.minecraft.world.World; public class EntityMimic extends EntityDemonBase { @@ -39,31 +39,31 @@ public class EntityMimic extends EntityDemonBase { private static final DataParameter CLIMBING = EntityDataManager.createKey(EntityMimic.class, DataSerializers.BYTE); public boolean dropItemsOnBreak = true; - public NBTTagCompound tileTag = new NBTTagCompound(); + public CompoundNBT tileTag = new CompoundNBT(); public int metaOfReplacedBlock = 0; - public IBlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); + 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 EntityAISwimming(this)); - this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + 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 EntityAIMoveTowardsRestriction(this, 1)); - this.tasks.addTask(6, new EntityAIWander(this, 0.8D)); - this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(8, new EntityAILookIdle(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 EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityMimic.AISpiderTarget(this, EntityPlayer.class)); - this.targetTasks.addTask(3, new EntityMimic.AISpiderTarget(this, EntityIronGolem.class)); + 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(NBTTagCompound tag) { + public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); tag.setBoolean("dropItemsOnBreak", dropItemsOnBreak); @@ -74,7 +74,7 @@ public class EntityMimic extends EntityDemonBase { } @Override - public void readEntityFromNBT(NBTTagCompound tag) { + public void readEntityFromNBT(CompoundNBT tag) { super.readEntityFromNBT(tag); dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); @@ -85,11 +85,11 @@ public class EntityMimic extends EntityDemonBase { } public ItemStack getMimicItemStack() { - return this.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + return this.getItemStackFromSlot(EquipmentSlotType.CHEST); } public void setMimicItemStack(ItemStack stack) { - this.setItemStackToSlot(EntityEquipmentSlot.CHEST, stack); + this.setItemStackToSlot(EquipmentSlotType.CHEST, stack); } public boolean spawnHeldBlockOnDeath(World world, BlockPos pos) { @@ -98,7 +98,7 @@ public class EntityMimic extends EntityDemonBase { public boolean spawnMimicBlockAtPosition(World world, BlockPos pos) { if (world.isAirBlock(pos)) { - IBlockState mimicState = RegistrarBloodMagicBlocks.MIMIC.getStateFromMeta(BlockMimic.sentientMimicMeta); + BlockState mimicState = RegistrarBloodMagicBlocks.MIMIC.getStateFromMeta(BlockMimic.sentientMimicMeta); world.setBlockState(pos, mimicState, 3); TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileMimic) { @@ -116,7 +116,7 @@ public class EntityMimic extends EntityDemonBase { return false; } - public void initializeMimic(ItemStack heldStack, NBTTagCompound tileTag, boolean dropItemsOnBreak, IBlockState stateOfReplacedBlock, int playerCheckRadius, BlockPos homePosition) { + public void initializeMimic(ItemStack heldStack, CompoundNBT tileTag, boolean dropItemsOnBreak, BlockState stateOfReplacedBlock, int playerCheckRadius, BlockPos homePosition) { this.setMimicItemStack(heldStack); this.tileTag = tileTag; this.dropItemsOnBreak = dropItemsOnBreak; @@ -195,8 +195,8 @@ public class EntityMimic extends EntityDemonBase { * Returns new PathNavigateGround instance */ @Override - protected PathNavigate createNavigator(World worldIn) { - return new PathNavigateClimber(this, worldIn); + protected PathNavigator createNavigator(World worldIn) { + return new ClimberPathNavigator(this, worldIn); } @Override @@ -211,7 +211,7 @@ public class EntityMimic extends EntityDemonBase { */ @Override public void onUpdate() { - if (!this.getEntityWorld().isRemote && this.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL) { + if (!this.getEntityWorld().isRemote && this.getEntityWorld().getDifficulty() == Difficulty.PEACEFUL) { if (reformIntoMimicBlock(this.getPosition())) { this.setDead(); } @@ -276,8 +276,8 @@ public class EntityMimic extends EntityDemonBase { } @Override - public boolean isPotionApplicable(PotionEffect potioneffectIn) { - return potioneffectIn.getPotion() != MobEffects.POISON && super.isPotionApplicable(potioneffectIn); + public boolean isPotionApplicable(EffectInstance potioneffectIn) { + return potioneffectIn.getPotion() != Effects.POISON && super.isPotionApplicable(potioneffectIn); } /** @@ -308,18 +308,18 @@ public class EntityMimic extends EntityDemonBase { return 0.65F; } - static class AISpiderAttack extends EntityAIAttackMelee { + static class AISpiderAttack extends MeleeAttackGoal { public AISpiderAttack(EntityMimic spider) { super(spider, 1.0D, true); } @Override - protected double getAttackReachSqr(EntityLivingBase attackTarget) { + protected double getAttackReachSqr(LivingEntity attackTarget) { return (double) (4.0F + attackTarget.width); } } - static class AISpiderTarget extends EntityAINearestAttackableTarget { + 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 index 321f3d30..6ec43ae9 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -12,35 +12,32 @@ 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.Entity; -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.*; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntityGhast; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityTippedArrow; -import net.minecraft.init.Enchantments; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemBow; +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.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumHand; +import net.minecraft.potion.Effect; +import net.minecraft.util.Hand; import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.SoundEvent; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.Explosion; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; +import net.minecraft.world.*; +import net.minecraft.world.Difficulty; +import net.minecraft.world.ServerWorld; import java.util.ArrayList; import java.util.List; @@ -48,7 +45,7 @@ import java.util.Locale; public class EntitySentientSpecter extends EntityDemonBase { private final EntityAIAttackRangedBow aiArrowAttack = new EntityAIAttackRangedBow(this, 1.0D, 20, 15.0F); - private final EntityAIAttackMelee aiAttackOnCollide = new EntityAIAttackMelee(this, 1.0D, false); + private final MeleeAttackGoal aiAttackOnCollide = new MeleeAttackGoal(this, 1.0D, false); private final int attackPriority = 3; protected EnumDemonWillType type = EnumDemonWillType.DESTRUCTIVE; protected boolean wasGivenSentientArmour = false; @@ -57,18 +54,18 @@ public class EntitySentientSpecter extends EntityDemonBase { super(worldIn); this.setSize(0.6F, 1.95F); // ((PathNavigateGround) getNavigator()).setCanSwim(false); - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIRetreatToHeal<>(this, EntityCreature.class, 6.0F, 1.0D, 1.2D)); + 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 EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); + 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 EntityAINearestAttackableTarget<>(this, EntityMob.class, true)); + this.targetTasks.addTask(3, new NearestAttackableTargetGoal<>(this, MonsterEntity.class, true)); this.targetTasks.addTask(4, new EntityAIHurtByTargetIgnoreTamed(this, false)); @@ -91,10 +88,10 @@ public class EntitySentientSpecter extends EntityDemonBase { this.tasks.removeTask(this.aiArrowAttack); ItemStack itemstack = this.getHeldItemMainhand(); - if (!itemstack.isEmpty() && itemstack.getItem() instanceof ItemBow) { + if (!itemstack.isEmpty() && itemstack.getItem() instanceof BowItem) { int i = 20; - if (this.getEntityWorld().getDifficulty() != EnumDifficulty.HARD) { + if (this.getEntityWorld().getDifficulty() != Difficulty.HARD) { i = 40; } @@ -107,23 +104,23 @@ public class EntitySentientSpecter extends EntityDemonBase { } @Override - public boolean isPotionApplicable(PotionEffect effect) { - Potion potion = effect.getPotion(); + public boolean isPotionApplicable(EffectInstance effect) { + Effect potion = effect.getPotion(); //Specter cannot be healed by normal means - return !(potion == MobEffects.REGENERATION || potion == MobEffects.INSTANT_HEALTH) && super.isPotionApplicable(effect); + return !(potion == Effects.REGENERATION || potion == Effects.INSTANT_HEALTH) && super.isPotionApplicable(effect); } - public boolean canStealEffectFromOwner(EntityLivingBase owner, PotionEffect effect) { + public boolean canStealEffectFromOwner(LivingEntity owner, EffectInstance effect) { return effect.getPotion().isBadEffect() && this.type == EnumDemonWillType.CORROSIVE; } - public boolean canStealEffectFromOwner(EntityLivingBase owner) { + public boolean canStealEffectFromOwner(LivingEntity owner) { if (this.type != EnumDemonWillType.CORROSIVE) { return false; } - for (PotionEffect eff : owner.getActivePotionEffects()) { + for (EffectInstance eff : owner.getActivePotionEffects()) { if (canStealEffectFromOwner(owner, eff)) { return true; } @@ -132,23 +129,23 @@ public class EntitySentientSpecter extends EntityDemonBase { return false; } - public boolean stealEffectsFromOwner(EntityLivingBase owner) { + public boolean stealEffectsFromOwner(LivingEntity owner) { if (this.type != EnumDemonWillType.CORROSIVE) { return false; } boolean hasStolenEffect = false; - List removedEffects = new ArrayList<>(); + List removedEffects = new ArrayList<>(); - for (PotionEffect eff : owner.getActivePotionEffects()) { + for (EffectInstance eff : owner.getActivePotionEffects()) { if (canStealEffectFromOwner(owner, eff)) { removedEffects.add(eff); hasStolenEffect = true; } } - for (PotionEffect eff : removedEffects) { + for (EffectInstance eff : removedEffects) { owner.removePotionEffect(eff.getPotion()); this.addPotionEffect(eff); } @@ -156,16 +153,16 @@ public class EntitySentientSpecter extends EntityDemonBase { return hasStolenEffect; } - public boolean applyNegativeEffectsToAttacked(EntityLivingBase attackedEntity, float percentTransmitted) { + public boolean applyNegativeEffectsToAttacked(LivingEntity attackedEntity, float percentTransmitted) { boolean hasProvidedEffect = false; - List removedEffects = new ArrayList<>(); - for (PotionEffect eff : this.getActivePotionEffects()) { + 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 { - PotionEffect activeEffect = attackedEntity.getActivePotionEffect(eff.getPotion()); + EffectInstance activeEffect = attackedEntity.getActivePotionEffect(eff.getPotion()); if (activeEffect.getAmplifier() < eff.getAmplifier() || activeEffect.getDuration() < eff.getDuration() * percentTransmitted) { removedEffects.add(eff); hasProvidedEffect = true; @@ -174,21 +171,21 @@ public class EntitySentientSpecter extends EntityDemonBase { } } - for (PotionEffect eff : removedEffects) { + for (EffectInstance eff : removedEffects) { if (!attackedEntity.isPotionActive(eff.getPotion())) { - PotionEffect newEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); + EffectInstance newEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); attackedEntity.addPotionEffect(newEffect); - PotionEffect newSentientEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); + 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 { - PotionEffect activeEffect = attackedEntity.getActivePotionEffect(eff.getPotion()); + EffectInstance activeEffect = attackedEntity.getActivePotionEffect(eff.getPotion()); - PotionEffect newEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), activeEffect.getIsAmbient(), activeEffect.doesShowParticles()); + EffectInstance newEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), activeEffect.getIsAmbient(), activeEffect.doesShowParticles()); attackedEntity.addPotionEffect(newEffect); - PotionEffect newSentientEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); + EffectInstance newSentientEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); this.removePotionEffect(eff.getPotion()); this.addPotionEffect(newSentientEffect); } @@ -197,25 +194,25 @@ public class EntitySentientSpecter extends EntityDemonBase { return hasProvidedEffect; } - public List getPotionEffectsForArrowRemovingDuration(float percentTransmitted) { - List arrowEffects = new ArrayList<>(); + public List getPotionEffectsForArrowRemovingDuration(float percentTransmitted) { + List arrowEffects = new ArrayList<>(); if (type != EnumDemonWillType.CORROSIVE) { return arrowEffects; } - List removedEffects = new ArrayList<>(); - for (PotionEffect eff : this.getActivePotionEffects()) { + List removedEffects = new ArrayList<>(); + for (EffectInstance eff : this.getActivePotionEffects()) { if (eff.getPotion().isBadEffect()) { removedEffects.add(eff); } } - for (PotionEffect eff : removedEffects) { - PotionEffect newEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); + for (EffectInstance eff : removedEffects) { + EffectInstance newEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); arrowEffects.add(newEffect); - PotionEffect newSentientEffect = new PotionEffect(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); + EffectInstance newSentientEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); this.removePotionEffect(eff.getPotion()); this.addPotionEffect(newSentientEffect); } @@ -236,9 +233,9 @@ public class EntitySentientSpecter extends EntityDemonBase { boolean flag = super.attackEntityAsMob(attackedEntity); if (flag) { - if (this.type == EnumDemonWillType.CORROSIVE && attackedEntity instanceof EntityLivingBase) { + if (this.type == EnumDemonWillType.CORROSIVE && attackedEntity instanceof LivingEntity) { // ((EntityLivingBase) attackedEntity).addPotionEffect(new PotionEffect(MobEffects.WITHER, 200)); - applyNegativeEffectsToAttacked((EntityLivingBase) attackedEntity, 1); + applyNegativeEffectsToAttacked((LivingEntity) attackedEntity, 1); } return true; @@ -264,7 +261,7 @@ public class EntitySentientSpecter extends EntityDemonBase { @Override public boolean absorbExplosion(Explosion explosion) { if (this.type == EnumDemonWillType.DESTRUCTIVE) { - this.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, 600, 1)); + this.addPotionEffect(new EffectInstance(Effects.STRENGTH, 600, 1)); explosion.doExplosionB(true); @@ -275,9 +272,9 @@ public class EntitySentientSpecter extends EntityDemonBase { } @Override - public boolean processInteract(EntityPlayer player, EnumHand hand) { + public boolean processInteract(PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); - if (this.isTamed() && player.equals(this.getOwner()) && hand == EnumHand.MAIN_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) { @@ -309,8 +306,8 @@ public class EntitySentientSpecter extends EntityDemonBase { public void performEmergencyHeal(double toHeal) { this.heal((float) toHeal); - if (getEntityWorld() instanceof WorldServer) { - WorldServer server = (WorldServer) getEntityWorld(); + 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); } } @@ -358,7 +355,7 @@ public class EntitySentientSpecter extends EntityDemonBase { } @Override - public void writeEntityToNBT(NBTTagCompound tag) { + public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); @@ -367,7 +364,7 @@ public class EntitySentientSpecter extends EntityDemonBase { } @Override - public void readEntityFromNBT(NBTTagCompound tag) { + public void readEntityFromNBT(CompoundNBT tag) { super.readEntityFromNBT(tag); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { @@ -383,21 +380,21 @@ public class EntitySentientSpecter extends EntityDemonBase { //TODO: Change to fit the given AI @Override - public boolean shouldAttackEntity(EntityLivingBase attacker, EntityLivingBase owner) { - if (!(attacker instanceof EntityCreeper) && !(attacker instanceof EntityGhast)) { + 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(EntityLivingBase target, float velocity) { - ItemStack heldStack = this.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); + public void attackEntityWithRangedAttack(LivingEntity target, float velocity) { + ItemStack heldStack = this.getItemStackFromSlot(EquipmentSlotType.MAINHAND); if (!heldStack.isEmpty() && heldStack.getItem() == RegistrarBloodMagicItems.SENTIENT_BOW) { - EntityTippedArrow arrowEntity = ((ItemSentientBow) heldStack.getItem()).getArrowEntity(getEntityWorld(), heldStack, target, this, velocity); + ArrowEntity arrowEntity = ((ItemSentientBow) heldStack.getItem()).getArrowEntity(getEntityWorld(), heldStack, target, this, velocity); if (arrowEntity != null) { - List effects = getPotionEffectsForArrowRemovingDuration(0.2f); - for (PotionEffect eff : effects) { + List effects = getPotionEffectsForArrowRemovingDuration(0.2f); + for (EffectInstance eff : effects) { arrowEntity.addEffect(eff); } @@ -405,7 +402,7 @@ public class EntitySentientSpecter extends EntityDemonBase { this.getEntityWorld().spawnEntity(arrowEntity); } } else { - EntityTippedArrow entitytippedarrow = new EntityTippedArrow(this.getEntityWorld(), this); //TODO: Change to an arrow created by the Sentient Bow + 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; @@ -432,7 +429,7 @@ public class EntitySentientSpecter extends EntityDemonBase { if (true) //TODO: Add potion effects to the arrows { - entitytippedarrow.addEffect(new PotionEffect(MobEffects.SLOWNESS, 600)); + entitytippedarrow.addEffect(new EffectInstance(Effects.SLOWNESS, 600)); } this.playSound(SoundEvents.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index 5e2e4e43..1ed0d6ef 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -3,13 +3,13 @@ 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.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; +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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; @@ -17,8 +17,8 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.common.registry.IThrowableEntity; -public class EntityBloodLight extends EntityThrowable implements IThrowableEntity, IEntityAdditionalSpawnData { - public EntityLivingBase shootingEntity; +public class EntityBloodLight extends ThrowableEntity implements IThrowableEntity, IEntityAdditionalSpawnData { + public LivingEntity shootingEntity; protected int ticksInAir = 0; protected int maxTicksInAir = 600; @@ -33,7 +33,7 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit this.setPosition(x, y, z); } - public EntityBloodLight(World world, EntityLivingBase player) { + public EntityBloodLight(World world, LivingEntity player) { super(world, player); shootingEntity = player; float par3 = 0.8F; @@ -91,7 +91,7 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit this.onImpact(mop.entityHit); } else if (mop.typeOfHit == RayTraceResult.Type.BLOCK) { - EnumFacing sideHit = mop.sideHit; + Direction sideHit = mop.sideHit; BlockPos blockPos = mop.getBlockPos().offset(sideHit); if (getEntityWorld().isAirBlock(blockPos)) { @@ -107,8 +107,8 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); this.setDead(); } else { - if (mop instanceof EntityLivingBase) { - ((EntityLivingBase) mop).setRevengeTarget(shootingEntity); + if (mop instanceof LivingEntity) { + ((LivingEntity) mop).setRevengeTarget(shootingEntity); doDamage(1, mop); } } @@ -140,14 +140,14 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit } @Override - public void writeEntityToNBT(NBTTagCompound nbt) { + public void writeEntityToNBT(CompoundNBT nbt) { super.writeEntityToNBT(nbt); nbt.setInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir); nbt.setInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir); } @Override - public void readEntityFromNBT(NBTTagCompound nbt) { + public void readEntityFromNBT(CompoundNBT nbt) { super.readEntityFromNBT(nbt); ticksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR); maxTicksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); @@ -165,7 +165,7 @@ public class EntityBloodLight extends EntityThrowable implements IThrowableEntit @Override public void setThrower(Entity entity) { - if (entity instanceof EntityLivingBase) - this.shootingEntity = (EntityLivingBase) entity; + if (entity instanceof LivingEntity) + this.shootingEntity = (LivingEntity) entity; } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index 4c701ace..7fd8ae60 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -3,18 +3,18 @@ package WayofTime.bloodmagic.entity.projectile; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.meteor.MeteorRegistry; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Blocks; +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.NBTTagCompound; +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 EntityThrowable implements IThrowableEntity { +public class EntityMeteor extends ThrowableEntity implements IThrowableEntity { public ItemStack meteorStack = ItemStack.EMPTY; protected int ticksInAir = 0; protected int maxTicksInAir = 600; @@ -63,7 +63,7 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity { } protected void onImpact(Entity mop) { - if (mop instanceof EntityLivingBase) { + if (mop instanceof LivingEntity) { doDamage(100, mop); } @@ -86,7 +86,7 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity { } @Override - public void writeEntityToNBT(NBTTagCompound nbt) { + public void writeEntityToNBT(CompoundNBT nbt) { super.writeEntityToNBT(nbt); nbt.setInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir); nbt.setInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir); @@ -100,7 +100,7 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity { } @Override - public void readEntityFromNBT(NBTTagCompound nbt) { + public void readEntityFromNBT(CompoundNBT nbt) { super.readEntityFromNBT(nbt); ticksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR); maxTicksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index fe91c8ac..6fc72e52 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -3,23 +3,21 @@ package WayofTime.bloodmagic.entity.projectile; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.util.Constants; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.entity.projectile.EntityTippedArrow; -import net.minecraft.init.Items; -import net.minecraft.init.MobEffects; -import net.minecraft.init.PotionTypes; +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.nbt.NBTTagCompound; +import net.minecraft.potion.Effects; +import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.potion.PotionType; -import net.minecraft.potion.PotionUtils; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.Difficulty; import net.minecraft.world.World; import java.lang.invoke.MethodHandle; @@ -28,13 +26,13 @@ import java.lang.reflect.Method; import java.util.List; import java.util.Locale; -public class EntitySentientArrow extends EntityTippedArrow { - public PotionType potion = PotionTypes.EMPTY; +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 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}; @@ -42,7 +40,7 @@ public class EntitySentientArrow extends EntityTippedArrow { 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 EntityArrow specialEntity; + public AbstractArrowEntity specialEntity; public MethodHandle specialHitMH; public Method specialHit; @@ -54,14 +52,14 @@ public class EntitySentientArrow extends EntityTippedArrow { super(worldIn, x, y, z); } - public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel) { + 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, EntityLivingBase shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, PotionType potion) { + public EntitySentientArrow(World worldIn, LivingEntity shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, Potion potion) { super(worldIn, shooter); this.reimbursedAmountOnHit = reimburseAmount; this.type = type; @@ -69,7 +67,7 @@ public class EntitySentientArrow extends EntityTippedArrow { this.potion = potion; } - public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, ItemStack itemStack) { + public EntitySentientArrow(World worldIn, LivingEntity shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, ItemStack itemStack) { super(worldIn, shooter); this.reimbursedAmountOnHit = reimburseAmount; this.type = type; @@ -77,7 +75,7 @@ public class EntitySentientArrow extends EntityTippedArrow { this.potion = PotionUtils.getPotionFromItem(itemStack); } - public EntitySentientArrow(World worldIn, EntityLivingBase shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, EntityArrow specialArrow) { + public EntitySentientArrow(World worldIn, LivingEntity shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, AbstractArrowEntity specialArrow) { super(worldIn, shooter); this.reimbursedAmountOnHit = reimburseAmount; this.type = type; @@ -86,35 +84,35 @@ public class EntitySentientArrow extends EntityTippedArrow { this.specialArrowClass = specialArrow.getClass(); } - public void reimbursePlayer(EntityLivingBase hitEntity, float damage) { - if (this.shootingEntity instanceof EntityPlayer) { - if (hitEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(hitEntity instanceof IMob)) { + 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, (EntityPlayer) this.shootingEntity, reimbursedAmountOnHit * damage / 20f); + PlayerDemonWillHandler.addDemonWill(type, (PlayerEntity) this.shootingEntity, reimbursedAmountOnHit * damage / 20f); } } @Override - protected void arrowHit(EntityLivingBase living) { + protected void arrowHit(LivingEntity living) { int amp = -1; switch (type) { case CORROSIVE: if (this.potion != null) - for (PotionEffect i : this.potion.getEffects()) { + for (EffectInstance i : this.potion.getEffects()) { if (i.getEffectName().equals("poison")) { amp = i.getAmplifier(); continue; } - living.addPotionEffect(new PotionEffect(i.getPotion(), i.getDuration(), i.getAmplifier())); + living.addPotionEffect(new EffectInstance(i.getPotion(), i.getDuration(), i.getAmplifier())); } - living.addPotionEffect(new PotionEffect(MobEffects.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)); + 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 (PotionEffect i : this.potion.getEffects()) { - living.addPotionEffect(new PotionEffect(i.getPotion(), i.getDuration(), i.getAmplifier())); + for (EffectInstance i : this.potion.getEffects()) { + living.addPotionEffect(new EffectInstance(i.getPotion(), i.getDuration(), i.getAmplifier())); } break; case DESTRUCTIVE: @@ -123,32 +121,32 @@ public class EntitySentientArrow extends EntityTippedArrow { break; case STEADFAST: if (this.potion != null) - for (PotionEffect i : this.potion.getEffects()) { + for (EffectInstance i : this.potion.getEffects()) { if (i.getEffectName().equals("levitation")) { amp = i.getAmplifier(); continue; } - living.addPotionEffect(new PotionEffect(i.getPotion(), i.getDuration(), i.getAmplifier())); + living.addPotionEffect(new EffectInstance(i.getPotion(), i.getDuration(), i.getAmplifier())); } - living.addPotionEffect(new PotionEffect(MobEffects.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)); + 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 (PotionEffect i : this.potion.getEffects()) { + for (EffectInstance i : this.potion.getEffects()) { if (i.getEffectName().equals("slowness")) { amp = i.getAmplifier(); continue; } - living.addPotionEffect(new PotionEffect(i.getPotion(), i.getDuration(), i.getAmplifier())); + living.addPotionEffect(new EffectInstance(i.getPotion(), i.getDuration(), i.getAmplifier())); } - living.addPotionEffect(new PotionEffect(MobEffects.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)); + 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", EntityLivingBase.class); + this.specialHit = this.specialArrowClass.getMethod("arrowHit", LivingEntity.class); this.specialHitMH = MethodHandles.lookup().unreflect(this.specialHit).bindTo(this.specialEntity); } catch (IllegalAccessException e) { e.printStackTrace(); @@ -220,14 +218,14 @@ public class EntitySentientArrow extends EntityTippedArrow { } //TODO: Potion splash (for destructive will fired tipped arrows) currently does not have a visual effect. - private void createPotionFromArrow(EntityLivingBase living) { + 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(EntityLivingBase.class, axisalignedbb); + List list = this.world.getEntitiesWithinAABB(LivingEntity.class, axisalignedbb); if (!list.isEmpty()) { - for (EntityLivingBase entitylivingbase : list) { + for (LivingEntity entitylivingbase : list) { if (entitylivingbase.canBeHitWithPotion()) { double d0 = this.getDistanceSq(entitylivingbase); @@ -238,8 +236,8 @@ public class EntitySentientArrow extends EntityTippedArrow { d1 = 1.0D; } - for (PotionEffect potioneffect : this.potion.getEffects()) { - Potion potion = potioneffect.getPotion(); + for (EffectInstance potioneffect : this.potion.getEffects()) { + Effect potion = potioneffect.getPotion(); if (potion.isInstant()) { potion.affectEntity(this, this.shootingEntity, entitylivingbase, potioneffect.getAmplifier(), d1); @@ -247,7 +245,7 @@ public class EntitySentientArrow extends EntityTippedArrow { int i = (int) (d1 * (double) potioneffect.getDuration() + 0.5D); if (i > 20) { - entitylivingbase.addPotionEffect(new PotionEffect(potion, i, potioneffect.getAmplifier(), potioneffect.getIsAmbient(), potioneffect.doesShowParticles())); + entitylivingbase.addPotionEffect(new EffectInstance(potion, i, potioneffect.getAmplifier(), potioneffect.getIsAmbient(), potioneffect.doesShowParticles())); } } } @@ -259,7 +257,7 @@ public class EntitySentientArrow extends EntityTippedArrow { } @Override - public void writeEntityToNBT(NBTTagCompound tag) { + public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); tag.setDouble("reimbursement", reimbursedAmountOnHit); @@ -268,7 +266,7 @@ public class EntitySentientArrow extends EntityTippedArrow { } @Override - public void readEntityFromNBT(NBTTagCompound tag) { + public void readEntityFromNBT(CompoundNBT tag) { super.readEntityFromNBT(tag); reimbursedAmountOnHit = tag.getDouble("reimbursement"); diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java index f0a5ef66..5fc9ff13 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java @@ -1,21 +1,21 @@ package WayofTime.bloodmagic.entity.projectile; import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.potion.PotionEffect; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.projectile.ThrowableEntity; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -public class EntitySoulSnare extends EntityThrowable { +public class EntitySoulSnare extends ThrowableEntity { public EntitySoulSnare(World worldIn) { super(worldIn); } - public EntitySoulSnare(World worldIn, EntityLivingBase throwerIn) { + public EntitySoulSnare(World worldIn, LivingEntity throwerIn) { super(worldIn, throwerIn); } @@ -28,9 +28,9 @@ public class EntitySoulSnare extends EntityThrowable { if (result.entityHit == this.getThrower() || this.ticksExisted < 2 || getEntityWorld().isRemote) return; - if (result.entityHit instanceof EntityLivingBase) { + if (result.entityHit instanceof LivingEntity) { if (result.entityHit.getEntityWorld().rand.nextDouble() < 0.25) - ((EntityLivingBase) result.entityHit).addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_SNARE, 300, 0)); + ((LivingEntity) result.entityHit).addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_SNARE, 300, 0)); result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), (float) 0); } diff --git a/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java b/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java index 66c70ea9..68a94aa6 100644 --- a/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.event; -import net.minecraft.entity.player.EntityPlayer; +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 EntityPlayer player; + public PlayerEntity player; - public BoundToolEvent(EntityPlayer player) { + public BoundToolEvent(PlayerEntity player) { this.player = player; } @@ -23,7 +23,7 @@ public class BoundToolEvent extends Event { public static class Charge extends BoundToolEvent { public ItemStack result; - public Charge(EntityPlayer player, ItemStack result) { + public Charge(PlayerEntity player, ItemStack result) { super(player); this.result = result; } @@ -41,7 +41,7 @@ public class BoundToolEvent extends Event { public final ItemStack boundTool; public int charge; - public Release(EntityPlayer player, ItemStack boundTool, 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 e5cf73c5..ec613007 100644 --- a/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.event; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -8,7 +8,7 @@ import net.minecraftforge.fml.common.eventhandler.Event; @Cancelable public class ItemBindEvent extends Event { - private final EntityPlayer player; + private final PlayerEntity player; private final ItemStack itemStack; /** @@ -20,12 +20,12 @@ public class ItemBindEvent extends Event { *

        * This event is {@link Cancelable}.
        */ - public ItemBindEvent(EntityPlayer player, ItemStack itemStack) { + public ItemBindEvent(PlayerEntity player, ItemStack itemStack) { this.player = player; this.itemStack = itemStack; } - public EntityPlayer getNewOwner() { + public PlayerEntity getNewOwner() { return player; } diff --git a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java index 08d94f85..2a5d5536 100644 --- a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java @@ -4,7 +4,7 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.fml.common.eventhandler.Cancelable; @@ -40,16 +40,16 @@ public class RitualEvent extends Event { * This event is called when a ritual is activated. If cancelled, it will * not activate. *

        - * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#activateRitual(ItemStack, EntityPlayer, Ritual)} + * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#activateRitual(ItemStack, PlayerEntity, Ritual)} */ @Cancelable public static class RitualActivatedEvent extends RitualEvent { - private final EntityPlayer player; + private final PlayerEntity player; private final ItemStack crystalStack; private final int crystalTier; - public RitualActivatedEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual, EntityPlayer player, ItemStack activationCrystal, int crystalTier) { + public RitualActivatedEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual, PlayerEntity player, ItemStack activationCrystal, int crystalTier) { super(mrs, ownerId, ritual); this.player = player; @@ -57,7 +57,7 @@ public class RitualEvent extends Event { this.crystalTier = crystalTier; } - public EntityPlayer getPlayer() { + public PlayerEntity getPlayer() { return player; } @@ -109,10 +109,10 @@ public class RitualEvent extends Event { public static class ImperfectRitualActivatedEvent extends Event { private final IImperfectRitualStone ims; - private final EntityPlayer activator; + private final PlayerEntity activator; private final ImperfectRitual imperfectRitual; - public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, EntityPlayer activator, ImperfectRitual imperfectRitual) { + public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, PlayerEntity activator, ImperfectRitual imperfectRitual) { this.ims = ims; this.activator = activator; this.imperfectRitual = imperfectRitual; @@ -122,7 +122,7 @@ public class RitualEvent extends Event { return ims; } - public EntityPlayer getActivator() { + public PlayerEntity getActivator() { return activator; } diff --git a/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java b/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java index 982166b7..0893883f 100644 --- a/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.event; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; @Cancelable public class SacrificeKnifeUsedEvent extends Event { - public final EntityPlayer player; + public final PlayerEntity player; public final int healthDrained; public int lpAdded; public boolean shouldDrainHealth; @@ -25,7 +25,7 @@ public class SacrificeKnifeUsedEvent extends Event { *

        * This event is {@link Cancelable}.
        */ - public SacrificeKnifeUsedEvent(EntityPlayer player, boolean shouldDrainHealth, boolean shouldFillAltar, int hp, int lpAdded) { + public SacrificeKnifeUsedEvent(PlayerEntity player, boolean shouldDrainHealth, boolean shouldFillAltar, int hp, int lpAdded) { this.player = player; this.shouldDrainHealth = shouldDrainHealth; this.shouldFillAltar = shouldFillAltar; diff --git a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java index 560b19a5..0aae8212 100644 --- a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.event; import WayofTime.bloodmagic.core.data.SoulNetwork; import WayofTime.bloodmagic.core.data.SoulTicket; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -63,15 +63,15 @@ public class SoulNetworkEvent extends Event { public static class User extends Syphon { - private final EntityPlayer user; + private final PlayerEntity user; - public User(SoulNetwork network, SoulTicket ticket, EntityPlayer user) { + public User(SoulNetwork network, SoulTicket ticket, PlayerEntity user) { super(network, ticket); this.user = user; } - public EntityPlayer getUser() { + public PlayerEntity getUser() { return user; } } diff --git a/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java b/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java index 856c9917..527f9e19 100644 --- a/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.event; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -17,11 +17,11 @@ import net.minecraftforge.fml.common.eventhandler.Event; public class TeleposeEvent extends Event { public final World initalWorld; public final BlockPos initialBlockPos; - public final IBlockState initialState; + public final BlockState initialState; public final World finalWorld; public final BlockPos finalBlockPos; - public final IBlockState finalState; + public final BlockState finalState; public TeleposeEvent(World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) { this.initalWorld = initialWorld; diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java index eb33e3fe..92508702 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.fakePlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.network.EnumPacketDirection; -import net.minecraft.network.NetHandlerPlayServer; +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.Packet; import net.minecraft.network.play.client.*; -import net.minecraft.network.play.server.SPacketPlayerPosLook; +import net.minecraft.network.play.server.SPlayerPositionLookPacket; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -15,9 +15,9 @@ import java.util.Set; /** * All credits for this go to CrazyPants, from EIO */ -public class FakeNetHandlerPlayServer extends NetHandlerPlayServer { - public FakeNetHandlerPlayServer(EntityPlayerMP p_i1530_3_) { - super(FMLCommonHandler.instance().getMinecraftServerInstance(), new net.minecraft.network.NetworkManager(EnumPacketDirection.CLIENTBOUND), p_i1530_3_); +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 @@ -34,39 +34,39 @@ public class FakeNetHandlerPlayServer extends NetHandlerPlayServer { } @Override - public void processVehicleMove(CPacketVehicleMove packetIn) { + public void processVehicleMove(CMoveVehiclePacket packetIn) { } @Override - public void processConfirmTeleport(CPacketConfirmTeleport packetIn) { + public void processConfirmTeleport(CConfirmTeleportPacket packetIn) { } @Override - public void setPlayerLocation(double x, double y, double z, float yaw, float pitch, Set relativeSet) { + public void setPlayerLocation(double x, double y, double z, float yaw, float pitch, Set relativeSet) { } @Override - public void processTryUseItemOnBlock(CPacketPlayerTryUseItemOnBlock packetIn) { + public void processTryUseItemOnBlock(CPlayerTryUseItemOnBlockPacket packetIn) { } @Override - public void processTryUseItem(CPacketPlayerTryUseItem packetIn) { + public void processTryUseItem(CPlayerTryUseItemPacket packetIn) { } @Override - public void processSteerBoat(CPacketSteerBoat packetIn) { + public void processSteerBoat(CSteerBoatPacket packetIn) { } @Override - public void processCustomPayload(CPacketCustomPayload packetIn) { + public void processCustomPayload(CCustomPayloadPacket packetIn) { } @Override - public void processInput(CPacketInput p_147358_1_) { + public void processInput(CInputPacket p_147358_1_) { } @Override - public void processPlayer(CPacketPlayer p_147347_1_) { + public void processPlayer(CPlayerPacket p_147347_1_) { } @Override @@ -74,7 +74,7 @@ public class FakeNetHandlerPlayServer extends NetHandlerPlayServer { } @Override - public void processPlayerDigging(CPacketPlayerDigging p_147345_1_) { + public void processPlayerDigging(CPlayerDiggingPacket p_147345_1_) { } @Override @@ -82,79 +82,79 @@ public class FakeNetHandlerPlayServer extends NetHandlerPlayServer { } @Override - public void sendPacket(Packet p_147359_1_) { + public void sendPacket(IPacket p_147359_1_) { } @Override - public void processHeldItemChange(CPacketHeldItemChange p_147355_1_) { + public void processHeldItemChange(CHeldItemChangePacket p_147355_1_) { } @Override - public void processChatMessage(CPacketChatMessage p_147354_1_) { + public void processChatMessage(CChatMessagePacket p_147354_1_) { } @Override - public void handleAnimation(CPacketAnimation packetIn) { + public void handleAnimation(CAnimateHandPacket packetIn) { } @Override - public void processEntityAction(CPacketEntityAction p_147357_1_) { + public void processEntityAction(CEntityActionPacket p_147357_1_) { } @Override - public void processUseEntity(CPacketUseEntity p_147340_1_) { + public void processUseEntity(CUseEntityPacket p_147340_1_) { } @Override - public void processClientStatus(CPacketClientStatus p_147342_1_) { + public void processClientStatus(CClientStatusPacket p_147342_1_) { } @Override - public void processCloseWindow(CPacketCloseWindow p_147356_1_) { + public void processCloseWindow(CCloseWindowPacket p_147356_1_) { } @Override - public void processClickWindow(CPacketClickWindow p_147351_1_) { + public void processClickWindow(CClickWindowPacket p_147351_1_) { } @Override - public void processEnchantItem(CPacketEnchantItem p_147338_1_) { + public void processEnchantItem(CEnchantItemPacket p_147338_1_) { } @Override - public void processCreativeInventoryAction(CPacketCreativeInventoryAction p_147344_1_) { + public void processCreativeInventoryAction(CCreativeInventoryActionPacket p_147344_1_) { } @Override - public void processConfirmTransaction(CPacketConfirmTransaction p_147339_1_) { + public void processConfirmTransaction(CConfirmTransactionPacket p_147339_1_) { } @Override - public void processUpdateSign(CPacketUpdateSign p_147343_1_) { + public void processUpdateSign(CUpdateSignPacket p_147343_1_) { } @Override - public void processKeepAlive(CPacketKeepAlive p_147353_1_) { + public void processKeepAlive(CKeepAlivePacket p_147353_1_) { } @Override - public void processPlayerAbilities(CPacketPlayerAbilities p_147348_1_) { + public void processPlayerAbilities(CPlayerAbilitiesPacket p_147348_1_) { } @Override - public void processTabComplete(CPacketTabComplete p_147341_1_) { + public void processTabComplete(CTabCompletePacket p_147341_1_) { } @Override - public void processClientSettings(CPacketClientSettings p_147352_1_) { + public void processClientSettings(CClientSettingsPacket p_147352_1_) { } @Override - public void handleSpectate(CPacketSpectate packetIn) { + public void handleSpectate(CSpectatePacket packetIn) { } @Override - public void handleResourcePackStatus(CPacketResourcePackStatus packetIn) { + 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 index 03fc7b83..e8436777 100644 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.fakePlayer; import com.mojang.authlib.GameProfile; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; +import net.minecraft.world.ServerWorld; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -17,7 +17,7 @@ import javax.annotation.Nullable; @SuppressWarnings("EntityConstructor") public class FakePlayerBM extends FakePlayer { - public FakePlayerBM(WorldServer world, GameProfile name) { + public FakePlayerBM(ServerWorld world, GameProfile name) { super(world, name); } @@ -30,15 +30,15 @@ public class FakePlayerBM extends FakePlayer { } @Override - protected void onNewPotionEffect(PotionEffect p_70670_1_) { + protected void onNewPotionEffect(EffectInstance p_70670_1_) { } @Override - protected void onChangedPotionEffect(PotionEffect effect, boolean p_70695_2_) { + protected void onChangedPotionEffect(EffectInstance effect, boolean p_70695_2_) { } @Override - protected void onFinishedPotionEffect(PotionEffect effect) { + protected void onFinishedPotionEffect(EffectInstance effect) { } protected void playEquipSound(@Nullable ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java index 1f940d2e..543c3e38 100644 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -5,9 +5,9 @@ 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.DataSerializer; +import net.minecraft.network.datasync.IDataSerializer; import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; @@ -15,7 +15,7 @@ import java.lang.reflect.Type; public class Serializers { // Data serializers - public static final DataSerializer WILL_TYPE_SERIALIZER = new DataSerializer() { + public static final IDataSerializer WILL_TYPE_SERIALIZER = new IDataSerializer() { @Override public void write(PacketBuffer buf, EnumDemonWillType value) { buf.writeEnumValue(value); @@ -38,15 +38,15 @@ public class Serializers { }; // Serializers - public static final SerializerBase FACING_SERIALIZER = new SerializerBase() { + public static final SerializerBase FACING_SERIALIZER = new SerializerBase() { @Override - public Class getType() { - return EnumFacing.class; + public Class getType() { + return Direction.class; } @Override - public EnumFacing deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return EnumFacing.byName(json.getAsString()); + public Direction deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + return Direction.byName(json.getAsString()); } }; public static final SerializerBase RESOURCELOCATION_SERIALIZER = new SerializerBase() { diff --git a/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java b/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java index e5ee95e9..f5435580 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.iface; import WayofTime.bloodmagic.util.Constants; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import javax.annotation.Nonnull; @@ -16,7 +16,7 @@ public interface IActivatable { default ItemStack setActivatedState(ItemStack stack, boolean activated) { if (!stack.isEmpty()) { if (!stack.hasTagCompound()) - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); stack.getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); } diff --git a/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java index f8026ce3..4b3321c6 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.iface; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; public interface IAlchemyArray { - EnumFacing getRotation(); + Direction getRotation(); } diff --git a/src/main/java/WayofTime/bloodmagic/iface/IBindable.java b/src/main/java/WayofTime/bloodmagic/iface/IBindable.java index cc2dad03..6253c37b 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IBindable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IBindable.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.iface; import WayofTime.bloodmagic.core.data.Binding; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import javax.annotation.Nullable; @@ -32,7 +32,7 @@ public interface IBindable { * @param stack - The ItemStack to attempt binding * @return If binding was successful. */ - default boolean onBind(EntityPlayer player, ItemStack stack) { + default boolean onBind(PlayerEntity player, ItemStack stack) { return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java b/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java index 39863d68..51ae4323 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.iface; import WayofTime.bloodmagic.block.enums.BloodRuneType; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -11,5 +11,5 @@ import javax.annotation.Nullable; public interface IBloodRune { @Nullable - BloodRuneType getBloodRune(IBlockAccess world, BlockPos pos, IBlockState state); + BloodRuneType getBloodRune(IBlockAccess world, BlockPos pos, BlockState state); } diff --git a/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java b/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java index 10c58212..2647c6f6 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.iface; -import net.minecraft.entity.player.EntityPlayer; +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, EntityPlayer player); + boolean canSeeDemonWillAura(World world, ItemStack stack, PlayerEntity player); - int getDemonWillAuraResolution(World world, ItemStack stack, EntityPlayer 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 index 7a991bab..5038d0a0 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.iface; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -28,5 +28,5 @@ public interface IDocumentedBlock { * Provide an empty list if there is no available documentation. */ @Nonnull - List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state); + List getDocumentation(PlayerEntity player, World world, BlockPos pos, BlockState state); } diff --git a/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java b/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java index db74ba4a..e620478f 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.iface; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; public interface ISentientSwordEffectProvider { - boolean applyOnHitEffect(EnumDemonWillType type, ItemStack swordStack, ItemStack providerStack, EntityLivingBase attacker, EntityLivingBase target); + 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 index 3f9693ab..a36935e2 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.iface; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; public interface ISentientTool { - boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player); + 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 017df5c1..683fdf3c 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/ISigil.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ISigil.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.iface; import WayofTime.bloodmagic.item.sigil.ItemSigil; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -24,6 +24,6 @@ public interface ISigil { interface Holding { @Nonnull - ItemStack getHeldItem(ItemStack holdingStack, EntityPlayer player); + ItemStack getHeldItem(ItemStack holdingStack, PlayerEntity player); } } diff --git a/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java b/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java index fa747980..77efdb42 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.incense; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -10,5 +10,5 @@ public interface IIncensePath { * 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, IBlockState state); + 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 index 6f4cef45..af9e425c 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java +++ b/src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.incense; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; +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, IBlockState state); + 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 index b9ef76f0..ebdd88ca 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java @@ -1,33 +1,33 @@ package WayofTime.bloodmagic.incense; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.EnumFacing; +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 IBlockState state; + public final BlockState state; - public IncenseAltarComponent(BlockPos offsetPos, Block block, IBlockState state) { + public IncenseAltarComponent(BlockPos offsetPos, Block block, BlockState state) { this.offsetPos = offsetPos; this.block = block; this.state = state; } - public boolean doesBlockMatch(Block block, IBlockState 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(EnumFacing rotation) { + public BlockPos getOffset(Direction rotation) { return new BlockPos(this.getX(rotation), offsetPos.getY(), this.getZ(rotation)); } - public int getX(EnumFacing direction) { + public int getX(Direction direction) { switch (direction) { case EAST: return -this.offsetPos.getZ(); @@ -40,7 +40,7 @@ public class IncenseAltarComponent { } } - public int getZ(EnumFacing direction) { + public int getZ(Direction direction) { switch (direction) { case EAST: return this.offsetPos.getX(); diff --git a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java index f41928c1..ad8a1659 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.incense; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.EnumFacing; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -28,7 +28,7 @@ public class IncenseAltarHandler { } } - public static void registerIncenseComponent(int altarLevel, BlockPos offsetPos, Block block, IBlockState state) { + public static void registerIncenseComponent(int altarLevel, BlockPos offsetPos, Block block, BlockState state) { registerIncenseComponent(altarLevel, new IncenseAltarComponent(offsetPos, block, state)); } @@ -42,8 +42,8 @@ public class IncenseAltarHandler { } else { boolean hasAllComponentsThisTier = true; for (IncenseAltarComponent component : incenseComponentMap.get(i)) { - BlockPos offsetPos = pos.add(component.getOffset(EnumFacing.NORTH)); - IBlockState state = world.getBlockState(offsetPos); + BlockPos offsetPos = pos.add(component.getOffset(Direction.NORTH)); + BlockState state = world.getBlockState(offsetPos); Block block = state.getBlock(); if (component.doesBlockMatch(block, state)) { hasAllComponentsThisTier = false; diff --git a/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java index e291bbf9..8273d848 100644 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.incense; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -15,7 +15,7 @@ public class IncenseTranquilityRegistry { handlerList.add(handler); } - public static TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state) { + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java index 1e916933..baad0d7b 100644 --- a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java +++ b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.inversion; import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.apache.commons.lang3.tuple.Pair; @@ -11,36 +11,36 @@ import java.util.HashMap; import java.util.Map; public class CorruptionHandler { - public static Map, Map> corruptBlockMap = new HashMap<>(); + public static Map, Map> corruptBlockMap = new HashMap<>(); - public static void registerBlockCorruption(EnumDemonWillType type, Block block, int meta, IBlockState corruptedState) { + 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); + Map stateMap = corruptBlockMap.get(pair); stateMap.put(type, corruptedState); } else { - Map stateMap = new HashMap<>(); + Map stateMap = new HashMap<>(); stateMap.put(type, corruptedState); corruptBlockMap.put(pair, stateMap); } } - public static boolean isBlockCorruptible(World world, EnumDemonWillType type, BlockPos pos, IBlockState state, Block block) { + 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); + Map stateMap = corruptBlockMap.get(pair); return stateMap.containsKey(type); } return false; } - public static boolean corruptBlock(World world, EnumDemonWillType type, BlockPos pos, IBlockState state, Block block) { + 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); + Map stateMap = corruptBlockMap.get(pair); if (stateMap.containsKey(type)) { return world.setBlockState(pos, stateMap.get(type)); } @@ -75,7 +75,7 @@ public class CorruptionHandler { } BlockPos offsetPos = centerPos.add(i, j, k); - IBlockState offsetState = world.getBlockState(offsetPos); + BlockState offsetState = world.getBlockState(offsetPos); Block offsetBlock = offsetState.getBlock(); corruptBlock(world, type, offsetPos, offsetState, offsetBlock); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java index 9800cce6..8ed4f7b7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java @@ -10,17 +10,17 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; +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.EnumHand; +import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -48,13 +48,13 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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 TextComponentTranslation("chat.bloodmagic.altarMaker.creativeOnly"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.altarMaker.creativeOnly"), true); return super.onItemRightClick(world, player, hand); } @@ -67,7 +67,7 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP 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 TextComponentTranslation("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)), true); + 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); } @@ -75,9 +75,9 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) return super.onItemRightClick(world, player, hand); - IBlockState state = world.getBlockState(rayTrace.getBlockPos()); + BlockState state = world.getBlockState(rayTrace.getBlockPos()); if (state.getBlock() instanceof BlockAltar) { - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.altarMaker.building", NumeralHelper.toRoman(tierToBuild.toInt())), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.altarMaker.building", NumeralHelper.toRoman(tierToBuild.toInt())), true); buildAltar(world, rayTrace.getBlockPos()); world.notifyBlockUpdate(rayTrace.getBlockPos(), state, state, 3); @@ -115,14 +115,14 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP ((IBloodAltar) world.getTileEntity(pos)).checkTier(); } - public String destroyAltar(EntityPlayer player) { + public String destroyAltar(PlayerEntity player) { World world = player.getEntityWorld(); if (world.isRemote) return ""; RayTraceResult rayTrace = rayTrace(world, player, false); BlockPos pos = rayTrace.getBlockPos(); - IBlockState state = world.getBlockState(pos); + BlockState state = world.getBlockState(pos); AltarTier altarTier = AltarUtil.getTier(world, pos); if (altarTier.equals(AltarTier.ONE)) diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java index 12524c89..df8f3037 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java @@ -7,13 +7,13 @@ 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.EntityPlayer; +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.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -36,13 +36,13 @@ public class ItemArcaneAshes extends Item implements IVariantProvider { } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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) { - EnumFacing rotation = EnumFacing.fromAngle(player.getRotationYawHead()); + Direction rotation = Direction.fromAngle(player.getRotationYawHead()); world.setBlockState(newPos, RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getDefaultState()); TileEntity tile = world.getTileEntity(newPos); if (tile instanceof TileAlchemyArray) { @@ -52,10 +52,10 @@ public class ItemArcaneAshes extends Item implements IVariantProvider { stack.damageItem(1, player); } - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } - return EnumActionResult.FAIL; + return ActionResultType.FAIL; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java index fa5d84e8..fb39ec76 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java @@ -6,7 +6,7 @@ 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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -29,6 +29,6 @@ public class ItemBindableBase extends Item implements IBindable { Binding binding = getBinding(stack); if (binding != null) - tooltip.add(new TextComponentTranslation("tooltip.bloodmagic.currentOwner", binding.getOwnerName()).getFormattedText()); + 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 index 71d20e33..a343b514 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -9,11 +9,11 @@ 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.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.SoundEvents; +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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -39,13 +39,13 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { } @Override - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; for (BloodOrb orb : RegistrarBloodMagic.BLOOD_ORBS) { ItemStack orbStack = new ItemStack(this); - NBTTagCompound tag = new NBTTagCompound(); + CompoundNBT tag = new CompoundNBT(); tag.setString("orb", orb.getRegistryName().toString()); orbStack.setTagCompound(tag); list.add(orbStack); @@ -53,12 +53,12 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); BloodOrb orb = getOrb(stack); if (orb == null) - return ActionResult.newResult(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); if (world == null) return super.onItemRightClick(world, player, hand); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java index 903ce710..934a4efd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java @@ -9,17 +9,17 @@ 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.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EntityLivingBase; +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.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Enchantments; -import net.minecraft.inventory.EntityEquipmentSlot; +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; @@ -40,17 +40,17 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { return true; } @Override - public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) { + public boolean onBlockDestroyed(ItemStack stack, World world, BlockState block, BlockPos pos, LivingEntity entityLiving) { return true; } @Override - protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { + protected void onBoundRelease(ItemStack stack, World world, PlayerEntity player, int charge) { if (world.isRemote) return; @@ -67,7 +67,7 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { for (int j = 0; j <= 2 * range; j++) { for (int k = -range; k <= range; k++) { BlockPos blockPos = playerPos.add(i, j, k); - IBlockState blockState = world.getBlockState(blockPos); + BlockState blockState = world.getBlockState(blockPos); if (world.isAirBlock(blockPos)) continue; @@ -89,9 +89,9 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { + public Multimap getAttributeModifiers(EquipmentSlotType equipmentSlot, ItemStack stack) { Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { + 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)); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java index 4b422e55..9c648e11 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java @@ -7,17 +7,17 @@ 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.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EntityLivingBase; +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.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Enchantments; -import net.minecraft.inventory.EntityEquipmentSlot; +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; @@ -38,24 +38,24 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { return true; } @Override - public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) { + public boolean onBlockDestroyed(ItemStack stack, World world, BlockState block, BlockPos pos, LivingEntity entityLiving) { return true; } @Override - public boolean canHarvestBlock(IBlockState blockIn) { + 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, IBlockState state) { + public float getDestroySpeed(ItemStack stack, BlockState state) { if (!getActivated(stack)) return 1.0F; @@ -63,7 +63,7 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { } @Override - protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { + protected void onBoundRelease(ItemStack stack, World world, PlayerEntity player, int charge) { if (world.isRemote) return; @@ -78,7 +78,7 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { for (int j = 0; j <= 2 * range; j++) { for (int k = -range; k <= range; k++) { BlockPos blockPos = playerPos.add(i, j, k); - IBlockState blockState = world.getBlockState(blockPos); + BlockState blockState = world.getBlockState(blockPos); if (world.isAirBlock(blockPos)) continue; @@ -100,9 +100,9 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { + public Multimap getAttributeModifiers(EquipmentSlotType equipmentSlot, ItemStack stack) { Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { + 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)); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java index ec4b630e..1606f0e5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java @@ -9,17 +9,17 @@ 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.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Enchantments; -import net.minecraft.inventory.EntityEquipmentSlot; +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; @@ -40,17 +40,17 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { return true; } @Override - public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) { + public boolean onBlockDestroyed(ItemStack stack, World world, BlockState block, BlockPos pos, LivingEntity entityLiving) { return true; } @Override - protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { + protected void onBoundRelease(ItemStack stack, World world, PlayerEntity player, int charge) { if (world.isRemote) return; int fortuneLvl = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack); @@ -67,7 +67,7 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { for (int j = 0; j <= 2 * range; j++) { for (int k = -range; k <= range; k++) { BlockPos blockPos = playerPos.add(i, j, k); - IBlockState blockState = world.getBlockState(blockPos); + BlockState blockState = world.getBlockState(blockPos); if (world.isAirBlock(blockPos)) continue; @@ -90,9 +90,9 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { } @Override - public Multimap getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot) { + public Multimap getItemAttributeModifiers(EquipmentSlotType equipmentSlot) { Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { + 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)); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java index 935395da..d3536283 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java @@ -13,16 +13,16 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; +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.entity.player.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; +import net.minecraft.item.SwordItem; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -32,7 +32,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; import java.util.function.Consumer; -public class ItemBoundSword extends ItemSword implements IBindable, IActivatable, IMeshProvider { +public class ItemBoundSword extends SwordItem implements IBindable, IActivatable, IMeshProvider { public ItemBoundSword() { super(RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL); @@ -41,7 +41,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); @@ -67,17 +67,17 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable return; } - if (entity instanceof EntityPlayer && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) - NetworkHelper.getSoulNetwork(binding).syphonAndDamage((EntityPlayer) entity, SoulTicket.item(stack, world, entity, 20)); + 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, EntityLivingBase target, EntityLivingBase attacker) { + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { return true; } @Override - public boolean onBlockDestroyed(ItemStack stack, World world, IBlockState block, BlockPos pos, EntityLivingBase entityLiving) { + public boolean onBlockDestroyed(ItemStack stack, World world, BlockState block, BlockPos pos, LivingEntity entityLiving) { return true; } @@ -88,7 +88,7 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs tab, NonNullList subItems) { + public void getSubItems(ItemGroup tab, NonNullList subItems) { if (!isInCreativeTab(tab)) return; @@ -112,9 +112,9 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { + public Multimap getAttributeModifiers(EquipmentSlotType equipmentSlot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { + 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)); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java index 4031565f..83bedf2d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java @@ -14,21 +14,18 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; +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.EntityLivingBase; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemTool; +import net.minecraft.item.ToolItem; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; +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; @@ -42,7 +39,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { +public class ItemBoundTool extends ToolItem implements IBindable, IActivatable { public final int chargeTime = 30; protected final String tooltipBase; private final String name; @@ -60,7 +57,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { } @Override - public float getDestroySpeed(ItemStack stack, IBlockState state) { + public float getDestroySpeed(ItemStack stack, BlockState state) { return getActivated(stack) ? toolMaterial.getEfficiency() : 1.0F; } @@ -70,7 +67,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { } @Override - public void getSubItems(CreativeTabs tab, NonNullList subItems) { + public void getSubItems(ItemGroup tab, NonNullList subItems) { if (!isInCreativeTab(tab)) return; @@ -85,15 +82,15 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { return; } - if (entity instanceof EntityPlayer && getActivated(stack) && isSelected && getBeingHeldDown(stack) && stack == ((EntityPlayer) entity).getActiveItemStack()) { - EntityPlayer player = (EntityPlayer) entity; + 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 EntityPlayer && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) - NetworkHelper.getSoulNetwork(binding).syphonAndDamage((EntityPlayer) entity, SoulTicket.item(stack, world, entity, 20)); + 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) { @@ -119,7 +116,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (player.isSneaking()) setActivatedState(stack, !getActivated(stack)); @@ -127,19 +124,19 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { 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); + return new ActionResult<>(ActionResultType.FAIL, event.result); player.setActiveHand(hand); - return new ActionResult<>(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(ActionResultType.SUCCESS, stack); } return super.onItemRightClick(world, player, hand); } @Override - public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft) { - if (entityLiving instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entityLiving; + 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); @@ -154,12 +151,12 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { } } - protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) { + protected void onBoundRelease(ItemStack stack, World world, PlayerEntity player, int charge) { } @Override - public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entityLiving) { + public ItemStack onItemUseFinish(ItemStack stack, World world, LivingEntity entityLiving) { return stack; } @@ -169,8 +166,8 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { } @Override - public EnumAction getItemUseAction(ItemStack stack) { - return EnumAction.BOW; + public UseAction getItemUseAction(ItemStack stack) { + return UseAction.BOW; } @Override @@ -201,7 +198,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { return ImmutableSet.of(name); } - public Multimap getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot) { + public Multimap getItemAttributeModifiers(EquipmentSlotType equipmentSlot) { return ArrayListMultimap.create(); // No-op } @@ -235,7 +232,7 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable { return chargeTime; } - protected void sharedHarvest(ItemStack stack, World world, EntityPlayer player, BlockPos blockPos, IBlockState blockState, boolean silkTouch, int fortuneLvl) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index 919a3039..3d4f6c19 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -7,12 +7,12 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.SoundEvents; +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; @@ -32,17 +32,17 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + 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 EntityPlayer && !(attacker instanceof EntityPlayerMP))) + if (target == null || attacker == null || attacker.getEntityWorld().isRemote || (attacker instanceof PlayerEntity && !(attacker instanceof ServerPlayerEntity))) return false; if (!target.isNonBoss()) return false; - if (target instanceof EntityPlayer) + if (target instanceof PlayerEntity) return false; if (target.isChild() && !(target instanceof IMob)) @@ -60,8 +60,8 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { return false; int lifeEssence = (int) (lifeEssenceRatio * target.getHealth()); - if (target instanceof EntityAnimal) { - lifeEssence = (int) (lifeEssence * (1 + PurificationHelper.getCurrentPurity((EntityAnimal) target))); + if (target instanceof AnimalEntity) { + lifeEssence = (int) (lifeEssence * (1 + PurificationHelper.getCurrentPurity((AnimalEntity) target))); } if (target.isChild()) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java index a2649334..e26e7d49 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java @@ -6,7 +6,7 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -36,12 +36,12 @@ public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemon } @Override - public boolean canSeeDemonWillAura(World world, ItemStack stack, EntityPlayer player) { + public boolean canSeeDemonWillAura(World world, ItemStack stack, PlayerEntity player) { return true; } @Override - public int getDemonWillAuraResolution(World world, ItemStack stack, EntityPlayer player) { + 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 index 1881a7d6..bec6de84 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java @@ -4,7 +4,7 @@ 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.creativetab.CreativeTabs; +import net.minecraft.item.ItemGroup; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; @@ -33,7 +33,7 @@ public class ItemEnum & ISubItem> extends Item { @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs tab, NonNullList subItems) { + public void getSubItems(ItemGroup tab, NonNullList subItems) { if (!isInCreativeTab(tab)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 381d817c..3ca9e276 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -7,14 +7,14 @@ 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.EntityPlayer; -import net.minecraft.init.SoundEvents; +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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; +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; @@ -50,7 +50,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (!world.isRemote) { if (player.isSneaking()) @@ -59,7 +59,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { giveOneLevelExpToPlayer(stack, player); } - return new ActionResult<>(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(ActionResultType.SUCCESS, stack); } @Override @@ -67,7 +67,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { variants.put(0, "type=experiencetome"); } - public void giveOneLevelExpToPlayer(ItemStack stack, EntityPlayer player) { + public void giveOneLevelExpToPlayer(ItemStack stack, PlayerEntity player) { float progress = player.experience; int expToNext = getExperienceForNextLevel(player.experienceLevel); @@ -90,7 +90,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { } } - public void absorbOneLevelExpFromPlayer(ItemStack stack, EntityPlayer player) { + public void absorbOneLevelExpFromPlayer(ItemStack stack, PlayerEntity player) { float progress = player.experience; if (progress > 0) { @@ -107,11 +107,11 @@ public class ItemExperienceBook extends Item implements IVariantProvider { } // Credits to Ender IO for some of the experience code, although now modified slightly for my convenience. - public static int getPlayerXP(EntityPlayer player) { + public static int getPlayerXP(PlayerEntity player) { return (int) (getExperienceForLevel(player.experienceLevel) + (player.experience * player.xpBarCap())); } - public static void addPlayerXP(EntityPlayer player, int amount) { + public static void addPlayerXP(PlayerEntity player, int amount) { int experience = Math.max(0, getPlayerXP(player) + amount); player.experienceTotal = experience; player.experienceLevel = getLevelForExperience(experience); @@ -122,7 +122,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { public static void setStoredExperience(ItemStack stack, double exp) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble("experience", exp); } @@ -130,7 +130,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { public static double getStoredExperience(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble("experience"); } @@ -164,7 +164,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { return res; } - public static double getExperienceAcquiredToNext(EntityPlayer player) { + public static double getExperienceAcquiredToNext(PlayerEntity player) { return player.experience * player.xpBarCap(); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 6f4bb703..26f900c8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -8,15 +8,15 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemGroup; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -37,7 +37,7 @@ public class ItemInscriptionTool extends ItemEnum.Variant implemen @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -46,7 +46,7 @@ public class ItemInscriptionTool extends ItemEnum.Variant implemen continue; ItemStack stack = new ItemStack(this, 1, runeType.ordinal()); - NBTTagCompound tag = new NBTTagCompound(); + CompoundNBT tag = new CompoundNBT(); tag.setInteger(Constants.NBT.USES, 10); stack.setTagCompound(tag); list.add(stack); @@ -54,9 +54,9 @@ public class ItemInscriptionTool extends ItemEnum.Variant implemen } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { ItemStack stack = player.getHeldItem(hand); - IBlockState state = world.getBlockState(pos); + BlockState state = world.getBlockState(pos); if (state.getBlock() instanceof BlockRitualStone && !((BlockRitualStone) state.getBlock()).isRuneType(world, pos, getItemType(stack))) { stack = NBTHelper.checkNBT(stack); @@ -68,10 +68,10 @@ public class ItemInscriptionTool extends ItemEnum.Variant implemen if (uses <= 0) player.inventory.setInventorySlotContents(player.inventory.currentItem, ItemStack.EMPTY); } - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } - return EnumActionResult.FAIL; + return ActionResultType.FAIL; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index f4144990..78ebbe37 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -8,20 +8,19 @@ 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.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; +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.NBTBase; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTUtil; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; +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; @@ -61,9 +60,9 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide if (NetworkHelper.syphonFromContainer(stack, SoulTicket.item(stack, 25))) return 200; else { - EntityPlayer player = PlayerHelper.getPlayerFromUUID(binding.getOwnerId()); + PlayerEntity player = PlayerHelper.getPlayerFromUUID(binding.getOwnerId()); if (player != null) - player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 99)); + player.addPotionEffect(new EffectInstance(Effects.NAUSEA, 99)); } return -1; @@ -79,28 +78,28 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.isEmpty()) // Make sure it's both a tag compound and that it has actual data. return null; - NBTTagCompound nbt = (NBTTagCompound) bindingTag; + CompoundNBT nbt = (CompoundNBT) bindingTag; return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")), nbt.getString("name")); } @Override - public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + 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 EnumActionResult.FAIL; + 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 EnumActionResult.FAIL; + return ActionResultType.FAIL; - if (player instanceof EntityPlayerMP) - CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP) player, pos, itemstack); + if (player instanceof ServerPlayerEntity) + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity) player, pos, itemstack); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java index 098a2b62..b97c9313 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java @@ -6,15 +6,15 @@ 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.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.EnumAction; +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.PotionEffect; import net.minecraft.potion.PotionUtils; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; @@ -36,8 +36,8 @@ public class ItemPotionFlask extends Item implements IMeshProvider { } @Override - public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entityLiving) { - EntityPlayer player = entityLiving instanceof EntityPlayer ? (EntityPlayer) entityLiving : null; + 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) { @@ -51,8 +51,8 @@ public class ItemPotionFlask extends Item implements IMeshProvider { } if (!world.isRemote) { - for (PotionEffect potioneffect : PotionUtils.getEffectsFromStack(stack)) { - entityLiving.addPotionEffect(new PotionEffect(potioneffect)); + for (EffectInstance potioneffect : PotionUtils.getEffectsFromStack(stack)) { + entityLiving.addPotionEffect(new EffectInstance(potioneffect)); } } @@ -65,8 +65,8 @@ public class ItemPotionFlask extends Item implements IMeshProvider { } @Override - public EnumAction getItemUseAction(ItemStack stack) { - return EnumAction.DRINK; + public UseAction getItemUseAction(ItemStack stack) { + return UseAction.DRINK; } @Override @@ -75,34 +75,34 @@ public class ItemPotionFlask extends Item implements IMeshProvider { } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + 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 EnumActionResult.PASS; + 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 EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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<>(EnumActionResult.PASS, stack); + return new ActionResult<>(ActionResultType.PASS, stack); } player.setActiveHand(hand); - return new ActionResult<>(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(ActionResultType.SUCCESS, stack); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java index f79d8bc1..af90c890 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java @@ -12,13 +12,13 @@ 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.EntityPlayer; +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.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -33,14 +33,14 @@ public class ItemRitualDismantler extends Item implements IVariantProvider { } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + 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; - EnumFacing direction = masterRitualStone.getDirection(); + Direction direction = masterRitualStone.getDirection(); String ritualName = RitualHelper.getValidRitual(world, pos); masterRitualStone.setActive(false); @@ -49,7 +49,7 @@ public class ItemRitualDismantler extends Item implements IVariantProvider { world.setBlockToAir(pos); ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER)); NetworkHelper.getSoulNetwork(player).syphon(SoulTicket.item(stack, 100)); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(ritualName); @@ -64,15 +64,15 @@ public class ItemRitualDismantler extends Item implements IVariantProvider { } NetworkHelper.getSoulNetwork(player).syphon(SoulTicket.item(stack, 200)); // smallest Ritual has 4 stones - return EnumActionResult.SUCCESS; + 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 EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } - return EnumActionResult.FAIL; + 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 index 05601f00..6f2e534a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -17,20 +17,20 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +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.ItemBlock; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -71,7 +71,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -80,24 +80,24 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + 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 EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } else if (addRuneToRitual(stack, world, pos, player)) { if (world.isRemote) { spawnParticles(world, pos.up(), 15); } - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; // TODO: Have the diviner automagically build the ritual } - return EnumActionResult.PASS; + return ActionResultType.PASS; } /** @@ -109,13 +109,13 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { * @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, EntityPlayer player) { + 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) { - EnumFacing direction = getDirection(stack); + Direction direction = getDirection(stack); List components = Lists.newArrayList(); ritual.gatherComponents(components::add); for (RitualComponent component : components) { @@ -124,7 +124,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } BlockPos offset = component.getOffset(direction); BlockPos newPos = pos.add(offset); - IBlockState state = world.getBlockState(newPos); + BlockState state = world.getBlockState(newPos); Block block = state.getBlock(); if (RitualHelper.isRune(world, newPos)) { if (RitualHelper.isRuneType(world, newPos, component.getRuneType())) { @@ -141,7 +141,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { return false; } int meta = component.getRuneType().ordinal(); - IBlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); + BlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); world.setBlockState(newPos, newState); return true; } else { @@ -164,7 +164,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { TileMasterRitualStone masterRitualStone = (TileMasterRitualStone) tile; if (ritual != null) { - EnumFacing direction = getDirection(itemStack); + Direction direction = getDirection(itemStack); ClientHandler.setRitualHolo(masterRitualStone, ritual, direction, true); } } @@ -176,7 +176,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } // TODO: Make this work for any IRitualStone - public boolean consumeStone(ItemStack stack, World world, EntityPlayer player) { + public boolean consumeStone(ItemStack stack, World world, PlayerEntity player) { if (player.capabilities.isCreativeMode) { return true; } @@ -188,8 +188,8 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { continue; } Item item = newStack.getItem(); - if (item instanceof ItemBlock) { - Block block = ((ItemBlock) item).getBlock(); + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); if (block == RegistrarBloodMagicBlocks.RITUAL_STONE) { newStack.shrink(1); return true; @@ -293,11 +293,11 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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<>(EnumActionResult.PASS, stack); + return new ActionResult<>(ActionResultType.PASS, stack); } if (player.isSneaking()) { @@ -305,16 +305,16 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { cycleRitual(stack, player, false); } - return new ActionResult<>(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(ActionResultType.SUCCESS, stack); } - return new ActionResult<>(EnumActionResult.PASS, stack); + return new ActionResult<>(ActionResultType.PASS, stack); } @Override - public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { - if (!entityLiving.world.isRemote && entityLiving instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entityLiving; + 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) { @@ -340,64 +340,64 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { variants.put(2, "type=dawn"); } - public void cycleDirection(ItemStack stack, EntityPlayer player) { - EnumFacing direction = getDirection(stack); - EnumFacing newDirection; + public void cycleDirection(ItemStack stack, PlayerEntity player) { + Direction direction = getDirection(stack); + Direction newDirection; switch (direction) { case NORTH: - newDirection = EnumFacing.EAST; + newDirection = Direction.EAST; break; case EAST: - newDirection = EnumFacing.SOUTH; + newDirection = Direction.SOUTH; break; case SOUTH: - newDirection = EnumFacing.WEST; + newDirection = Direction.WEST; break; case WEST: - newDirection = EnumFacing.NORTH; + newDirection = Direction.NORTH; break; default: - newDirection = EnumFacing.NORTH; + newDirection = Direction.NORTH; } setDirection(stack, newDirection); notifyDirectionChange(newDirection, player); } - public void notifyDirectionChange(EnumFacing direction, EntityPlayer player) { - player.sendStatusMessage(new TextComponentTranslation(tooltipBase + "currentDirection", Utils.toFancyCasing(direction.name())), true); + public void notifyDirectionChange(Direction direction, PlayerEntity player) { + player.sendStatusMessage(new TranslationTextComponent(tooltipBase + "currentDirection", Utils.toFancyCasing(direction.name())), true); } - public void setDirection(ItemStack stack, EnumFacing direction) { + public void setDirection(ItemStack stack, Direction direction) { if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); } - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setInteger(Constants.NBT.DIRECTION, direction.getIndex()); } - public EnumFacing getDirection(ItemStack stack) { + public Direction getDirection(ItemStack stack) { if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); - return EnumFacing.NORTH; + stack.setTagCompound(new CompoundNBT()); + return Direction.NORTH; } - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); int dir = tag.getInteger(Constants.NBT.DIRECTION); if (dir == 0) { - return EnumFacing.NORTH; + return Direction.NORTH; } - return EnumFacing.VALUES[tag.getInteger(Constants.NBT.DIRECTION)]; + return Direction.VALUES[tag.getInteger(Constants.NBT.DIRECTION)]; } /** * Cycles the ritual forward or backward */ - public void cycleRitual(ItemStack stack, EntityPlayer player, boolean reverse) { + public void cycleRitual(ItemStack stack, PlayerEntity player, boolean reverse) { String key = getCurrentRitual(stack); List rituals = BloodMagic.RITUAL_MANAGER.getSortedRituals(); if (reverse) @@ -450,29 +450,29 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { return true; } - public void notifyRitualChange(String key, EntityPlayer player) { + public void notifyRitualChange(String key, PlayerEntity player) { Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(key); if (ritual != null) { - player.sendStatusMessage(new TextComponentTranslation(ritual.getTranslationKey()), true); + player.sendStatusMessage(new TranslationTextComponent(ritual.getTranslationKey()), true); } } public void setCurrentRitual(ItemStack stack, String key) { if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); } - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString("current_ritual", key); } public String getCurrentRitual(ItemStack stack) { if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); } - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getString("current_ritual"); } @@ -495,7 +495,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { } public static void spawnParticles(World worldIn, BlockPos pos, int amount) { - IBlockState state = worldIn.getBlockState(pos); + BlockState state = worldIn.getBlockState(pos); Block block = worldIn.getBlockState(pos).getBlock(); if (block.isAir(state, worldIn, pos)) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index 6358762a..ae919cb9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -14,15 +14,15 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -66,11 +66,11 @@ public class ItemRitualReader extends Item implements IVariantProvider { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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<>(EnumActionResult.PASS, stack); + return new ActionResult<>(ActionResultType.PASS, stack); } if (player.isSneaking()) { @@ -78,14 +78,14 @@ public class ItemRitualReader extends Item implements IVariantProvider { cycleReader(stack, player); } - return new ActionResult<>(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(ActionResultType.SUCCESS, stack); } - return new ActionResult<>(EnumActionResult.PASS, stack); + return new ActionResult<>(ActionResultType.PASS, stack); } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + 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); @@ -103,7 +103,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { break; case SET_AREA: - if (player.isSneaking() && player.getHeldItem(EnumHand.OFF_HAND).getItem() instanceof ItemBloodOrb) { + 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); @@ -144,7 +144,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { break; } - return EnumActionResult.FAIL; + return ActionResultType.FAIL; } else { if (state == EnumRitualReaderState.SET_AREA) { BlockPos masterPos = this.getMasterBlockPos(stack); @@ -153,7 +153,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { if (containedPos.equals(BlockPos.ORIGIN)) { BlockPos pos1 = pos.subtract(masterPos); this.setBlockPos(stack, pos1); - player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.firstBlock"), true); + player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.firstBlock"), true); } else { tile = world.getTileEntity(masterPos); if (tile instanceof IMasterRitualStone) { @@ -173,16 +173,16 @@ public class ItemRitualReader extends Item implements IVariantProvider { switch (master.setBlockRangeByBounds(player, range, containedPos, pos2)) { case SUCCESS: - player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.success"), true); + player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.success"), true); break; case NOT_WITHIN_BOUNDARIES: - player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.tooFar", maxVerticalRange, maxHorizontalRange), false); + player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.tooFar", maxVerticalRange, maxHorizontalRange), false); break; case VOLUME_TOO_LARGE: - player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.tooBig", maxVolume), false); + player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.tooBig", maxVolume), false); break; default: - player.sendStatusMessage(new TextComponentTranslation("ritual.bloodmagic.blockRange.noRange"), false); + player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.noRange"), false); break; } } @@ -203,7 +203,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { public ItemStack setBlockPos(ItemStack stack, BlockPos pos) { stack = NBTHelper.checkNBT(stack); - NBTTagCompound itemTag = stack.getTagCompound(); + CompoundNBT itemTag = stack.getTagCompound(); itemTag.setInteger(Constants.NBT.X_COORD, pos.getX()); itemTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); itemTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); @@ -217,7 +217,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { public ItemStack setMasterBlockPos(ItemStack stack, BlockPos pos) { stack = NBTHelper.checkNBT(stack); - NBTTagCompound itemTag = stack.getTagCompound(); + CompoundNBT itemTag = stack.getTagCompound(); itemTag.setInteger(Constants.NBT.X_COORD + "master", pos.getX()); itemTag.setInteger(Constants.NBT.Y_COORD + "master", pos.getY()); itemTag.setInteger(Constants.NBT.Z_COORD + "master", pos.getZ()); @@ -227,7 +227,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { public String getCurrentBlockRange(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getString("range"); } @@ -235,12 +235,12 @@ public class ItemRitualReader extends Item implements IVariantProvider { public void setCurrentBlockRange(ItemStack stack, String range) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString("range", range); } - public void cycleReader(ItemStack stack, EntityPlayer player) { + 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; @@ -250,25 +250,25 @@ public class ItemRitualReader extends Item implements IVariantProvider { notifyPlayerOfStateChange(nextState, player); } - public void notifyPlayerOfStateChange(EnumRitualReaderState state, EntityPlayer player) { - ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentState", new TextComponentTranslation(tooltipBase + state.toString().toLowerCase()))); + 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); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setInteger(Constants.NBT.RITUAL_READER, state.ordinal()); } public EnumRitualReaderState getState(ItemStack stack) { if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); return EnumRitualReaderState.INFORMATION; } - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return EnumRitualReaderState.values()[tag.getInteger(Constants.NBT.RITUAL_READER)]; } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java index 62632247..657724c0 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java @@ -10,13 +10,13 @@ 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.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.EnumAction; +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.*; @@ -51,10 +51,10 @@ public class ItemSacrificialDagger extends ItemEnum onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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<>(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(ActionResultType.SUCCESS, stack); } int lpAdded = ConfigHandler.values.sacrificialDaggerConversion * 2; @@ -131,19 +131,19 @@ public class ItemSacrificialDagger extends ItemEnum 0); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java index 9dc458f5..a3088076 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -12,20 +12,19 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; +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.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -44,11 +43,11 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + 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); - IBlockState hitState = world.getBlockState(pos); + BlockState hitState = world.getBlockState(pos); if (player.isSneaking()) { if (hitState.getBlock() instanceof IDocumentedBlock) { trySetDisplayedTier(world, pos); @@ -65,7 +64,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote) return super.onItemRightClick(world, player, hand); @@ -80,7 +79,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa 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 TextComponentTranslation("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)), true); + 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); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 1cce2154..4f45001a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -8,11 +8,11 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; +import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -34,7 +34,7 @@ public class ItemTelepositionFocus extends ItemEnum.Variant onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { if (player.isSneaking()) { RayTraceResult mop = rayTrace(world, player, false); @@ -59,7 +59,7 @@ public class ItemTelepositionFocus extends ItemEnum.Variant onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote) { return super.onItemRightClick(world, player, hand); @@ -48,7 +48,7 @@ public class ItemUpgradeTome extends Item implements IVariantProvider { return super.onItemRightClick(world, player, hand); } - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); if (chestStack.getItem() instanceof ItemLivingArmour) { LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); if (armour == null) { @@ -78,7 +78,7 @@ public class ItemUpgradeTome extends Item implements IVariantProvider { @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java index f37785d1..aad3bc39 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java @@ -9,7 +9,7 @@ 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.creativetab.CreativeTabs; +import net.minecraft.item.ItemGroup; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; @@ -34,7 +34,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java index c53c6da0..1c450ccf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java @@ -8,7 +8,7 @@ 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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -36,14 +36,14 @@ public class ItemCuttingFluid extends ItemEnum.Variant onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { + public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand hand) { playerIn.setActiveHand(hand); - return new ActionResult<>(EnumActionResult.SUCCESS, playerIn.getHeldItem(hand)); + return new ActionResult<>(ActionResultType.SUCCESS, playerIn.getHeldItem(hand)); } @Override - public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityLivingBase entityLiving) { - if (!(entityLiving instanceof EntityPlayer)) + public ItemStack onItemUseFinish(ItemStack stack, World worldIn, LivingEntity entityLiving) { + if (!(entityLiving instanceof PlayerEntity)) return super.onItemUseFinish(stack, worldIn, entityLiving); - EntityPlayer player = (EntityPlayer) entityLiving; + PlayerEntity player = (PlayerEntity) entityLiving; if (!player.capabilities.isCreativeMode) stack.shrink(1); if (!worldIn.isRemote) { - player.addPotionEffect(new PotionEffect(MobEffects.WITHER, 300, 5)); - player.addPotionEffect(new PotionEffect(MobEffects.POISON, 300, 5)); - player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 400, 1)); + 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]; @@ -81,8 +81,8 @@ public class ItemLivingArmourPointsUpgrade extends ItemEnum.Variant FLAGS = null; - public ItemLivingArmour(EntityEquipmentSlot armorType) { - super(ItemArmor.ArmorMaterial.IRON, 0, armorType); + public ItemLivingArmour(EquipmentSlotType armorType) { + super(ArmorItem.ArmorMaterial.IRON, 0, armorType); setTranslationKey(BloodMagic.MODID + ".livingArmour."); // setMaxDamage(250); setMaxDamage((int) (getMaxDamage() * 1.5)); @@ -69,14 +69,14 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public void onCreated(ItemStack stack, World world, EntityPlayer player) { + 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, EntityEquipmentSlot slot, String type) { + 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"; } @@ -106,7 +106,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public ArmorProperties getProperties(EntityLivingBase player, ItemStack stack, DamageSource source, double damage, int slot) { + public ArmorProperties getProperties(LivingEntity player, ItemStack stack, DamageSource source, double damage, int slot) { double armourReduction = 0.0; double damageAmount = 0.25; @@ -133,9 +133,9 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { armourReduction = 0.24 / 0.64; // This values puts it at iron level - ItemStack helmet = player.getItemStackFromSlot(EntityEquipmentSlot.HEAD); - ItemStack leggings = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); - ItemStack boots = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); + 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); @@ -178,7 +178,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { + public int getArmorDisplay(PlayerEntity player, ItemStack armor, int slot) { if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) { return 3; } @@ -199,7 +199,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + 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()) { @@ -208,8 +208,8 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (damage > this.getMaxDamage(stack) - this.getDamage(stack)) { //TODO: Syphon a load of LP. - if (entity.getEntityWorld().isRemote && entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entity; + 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)); } @@ -220,8 +220,8 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP stack.damageItem(damage, entity); int receivedDamage = stack.getItemDamage() - preDamage; - if (entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entity; + if (entity instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) entity; if (LivingArmour.hasFullSet(player)) { LivingArmour armour = ItemLivingArmour.getLivingArmour(stack); if (armour != null) { @@ -277,13 +277,13 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { + 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 EntityPlayerSP) //Sanity check + if (player instanceof ClientPlayerEntity) //Sanity check { - EntityPlayerSP spPlayer = (EntityPlayerSP) player; + ClientPlayerEntity spPlayer = (ClientPlayerEntity) player; if (FLAGS == null) { try { @@ -295,7 +295,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP if (FLAGS != null) { if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + 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) { @@ -333,8 +333,8 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST && isEnabled(stack) && slot == EntityEquipmentSlot.CHEST) { + 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(); @@ -377,7 +377,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP } public void setLivingArmour(ItemStack stack, LivingArmour armour, boolean forceWrite) { - NBTTagCompound livingTag = new NBTTagCompound(); + CompoundNBT livingTag = new CompoundNBT(); if (!forceWrite) { livingTag = getArmourTag(stack); @@ -389,43 +389,43 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP setArmourTag(stack, livingTag); } - public void setArmourTag(ItemStack stack, NBTTagCompound livingTag) { + public void setArmourTag(ItemStack stack, CompoundNBT livingTag) { if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); } - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setTag(Constants.NBT.LIVING_ARMOUR, livingTag); } public void setIsEnabled(ItemStack stack, boolean bool) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setBoolean("enabled", bool); } public boolean isEnabled(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getBoolean("enabled"); } public void setIsElytra(ItemStack stack, boolean bool) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setBoolean("elytra", bool); } public boolean isElytra(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getBoolean("elytra"); } @Nullable public static LivingArmour getLivingArmourFromStack(ItemStack stack) { - NBTTagCompound livingTag = getArmourTag(stack); + CompoundNBT livingTag = getArmourTag(stack); LivingArmour livingArmour = new LivingArmour(); livingArmour.readFromNBT(livingTag); @@ -433,12 +433,12 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return livingArmour; } - public static NBTTagCompound getArmourTag(ItemStack stack) { + public static CompoundNBT getArmourTag(ItemStack stack) { if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); } - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getCompoundTag(Constants.NBT.LIVING_ARMOUR); } diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java index 35261f98..de559ee6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java @@ -11,20 +11,20 @@ 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.block.model.ModelResourceLocation; +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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemArmor; +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.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.DamageSource; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; @@ -38,7 +38,7 @@ import java.util.Map; import java.util.UUID; import java.util.function.Consumer; -public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMeshProvider, IMultiWillTool { +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}; @@ -54,15 +54,15 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public static double[] speedBonus = new double[]{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4}; - public ItemSentientArmour(EntityEquipmentSlot armorType) { - super(ItemArmor.ArmorMaterial.IRON, 0, armorType); + 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, EntityEquipmentSlot slot, String type) { + 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: @@ -99,16 +99,16 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { - if (this.armorType == EntityEquipmentSlot.CHEST) { + 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(MobEffects.POISON)) { - player.removeActivePotionEffect(MobEffects.POISON); + if (player.isPotionActive(Effects.POISON)) { + player.removeActivePotionEffect(Effects.POISON); } - if (player.isPotionActive(MobEffects.WITHER)) { - player.removeActivePotionEffect(MobEffects.WITHER); + if (player.isPotionActive(Effects.WITHER)) { + player.removeActivePotionEffect(Effects.WITHER); } break; default: @@ -116,14 +116,14 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } } - public void onPlayerAttacked(ItemStack stack, DamageSource source, EntityPlayer attackedPlayer) { - if (source.getTrueSource() instanceof EntityLivingBase) { - EntityLivingBase attacker = (EntityLivingBase) source.getTrueSource(); + 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 PotionEffect(MobEffects.POISON, 100)); //TODO: customize duration + attacker.addPotionEffect(new EffectInstance(Effects.POISON, 100)); //TODO: customize duration } break; case DEFAULT: @@ -139,7 +139,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public ArmorProperties getProperties(EntityLivingBase player, ItemStack stack, DamageSource source, double damage, int slot) { + public ArmorProperties getProperties(LivingEntity player, ItemStack stack, DamageSource source, double damage, int slot) { double armourReduction = 0.0; double damageAmount = 0.25; @@ -166,9 +166,9 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { armourReduction = 0.24 / 0.64; // This values puts it at iron level - ItemStack helmet = player.getItemStackFromSlot(EntityEquipmentSlot.HEAD); - ItemStack leggings = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); - ItemStack boots = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); + 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); @@ -201,7 +201,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { + public int getArmorDisplay(PlayerEntity player, ItemStack armor, int slot) { if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) { return 3; } @@ -222,9 +222,9 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { - if (entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entity; + 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); @@ -241,28 +241,28 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public double getCostModifier(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble("costModifier"); } public void setCostModifier(ItemStack stack, double modifier) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble("costModifier", modifier); } public double getArmourModifier(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble("armourModifier"); } public void setArmourModifier(ItemStack stack, double modifier) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble("armourModifier", modifier); } @@ -272,7 +272,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes return super.getTranslationKey(stack) + names[3 - armorType.getIndex()]; } - public void revertArmour(EntityPlayer player, ItemStack itemStack) { + public void revertArmour(PlayerEntity player, ItemStack itemStack) { ItemStack stack = this.getContainedArmourStack(itemStack); player.setItemStackToSlot(armorType, stack); } @@ -312,9 +312,9 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { + public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.CHEST) { + 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)); @@ -329,12 +329,12 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes return; } - NBTTagCompound tag = new NBTTagCompound(); + CompoundNBT tag = new CompoundNBT(); previousArmour.writeToNBT(tag); - NBTTagCompound omegaTag = newArmour.getTagCompound(); + CompoundNBT omegaTag = newArmour.getTagCompound(); if (omegaTag == null) { - omegaTag = new NBTTagCompound(); + omegaTag = new CompoundNBT(); newArmour.setTagCompound(omegaTag); } @@ -344,12 +344,12 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } public ItemStack getContainedArmourStack(ItemStack newArmour) { - NBTTagCompound omegaTag = newArmour.getTagCompound(); + CompoundNBT omegaTag = newArmour.getTagCompound(); if (omegaTag == null) { return null; } - NBTTagCompound tag = omegaTag.getCompoundTag("armour"); + CompoundNBT tag = omegaTag.getCompoundTag("armour"); return new ItemStack(tag); } @@ -366,7 +366,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { return EnumDemonWillType.DEFAULT; @@ -378,7 +378,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public void setCurrentType(EnumDemonWillType type, ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } @@ -391,7 +391,7 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes this.setCostModifier(armourStack, recurringCost); this.setCurrentType(type, armourStack); - if (this.armorType == EntityEquipmentSlot.CHEST) { + if (this.armorType == EquipmentSlotType.CHEST) { this.setArmourModifier(armourStack, getArmourModifier(type, willBracket)); this.setHealthBonus(armourStack, this.getHealthModifier(type, willBracket)); this.setKnockbackResistance(armourStack, getKnockbackModifier(type, willBracket)); @@ -459,14 +459,14 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public double getHealthBonus(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } public void setHealthBonus(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } @@ -474,14 +474,14 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public double getKnockbackResistance(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble("knockback"); } public void setKnockbackResistance(ItemStack stack, double kb) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble("knockback", kb); } @@ -489,14 +489,14 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public double getSpeedBoost(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble("speed"); } public void setSpeedBoost(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble("speed", speed); } @@ -504,14 +504,14 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public double getDamageBoost(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble("damage"); } public void setDamageBoost(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble("damage", damage); } @@ -519,19 +519,19 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes public double getAttackSpeedBoost(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble("attackSpeed"); } public void setAttackSpeedBoost(ItemStack stack, double attackSpeed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble("attackSpeed", attackSpeed); } - public static void revertAllArmour(EntityPlayer player) { + public static void revertAllArmour(PlayerEntity player) { NonNullList armourInventory = player.inventory.armorInventory; for (ItemStack stack : armourInventory) { if (stack != null && stack.getItem() instanceof ItemSentientArmour) { @@ -540,15 +540,15 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes } } - public static boolean convertPlayerArmour(EnumDemonWillType type, double will, EntityPlayer player) { + public static boolean convertPlayerArmour(EnumDemonWillType type, double will, PlayerEntity player) { if (!canSustainArmour(type, will)) { return false; } - ItemStack helmetStack = player.getItemStackFromSlot(EntityEquipmentSlot.HEAD); - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - ItemStack leggingsStack = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); - ItemStack bootsStack = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); + 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); @@ -556,10 +556,10 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes ItemStack omegaLeggingsStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS).getSubstituteStack(type, will, leggingsStack); ItemStack omegaBootsStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS).getSubstituteStack(type, will, bootsStack); - player.setItemStackToSlot(EntityEquipmentSlot.HEAD, omegaHelmetStack); - player.setItemStackToSlot(EntityEquipmentSlot.CHEST, omegaChestStack); - player.setItemStackToSlot(EntityEquipmentSlot.LEGS, omegaLeggingsStack); - player.setItemStackToSlot(EntityEquipmentSlot.FEET, omegaBootsStack); + player.setItemStackToSlot(EquipmentSlotType.HEAD, omegaHelmetStack); + player.setItemStackToSlot(EquipmentSlotType.CHEST, omegaChestStack); + player.setItemStackToSlot(EquipmentSlotType.LEGS, omegaLeggingsStack); + player.setItemStackToSlot(EquipmentSlotType.FEET, omegaBootsStack); return true; } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java index 25cc5b0b..9715a33d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java @@ -4,24 +4,24 @@ 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.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class ItemBlockAlchemyTable extends ItemBlock implements IVariantProvider { +public class ItemBlockAlchemyTable extends BlockItem implements IVariantProvider { public ItemBlockAlchemyTable(Block block) { super(block); } @Override - public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) { + 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; - EnumFacing direction = EnumFacing.fromAngle(yaw); + Direction direction = Direction.fromAngle(yaw); if (direction.getYOffset() != 0) { return false; @@ -41,7 +41,7 @@ public class ItemBlockAlchemyTable extends ItemBlock implements IVariantProvider return false; } - IBlockState state = world.getBlockState(pos); + BlockState state = world.getBlockState(pos); if (state.getBlock() == this.block) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileAlchemyTable) { diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index f614ed34..f0e80c1d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -5,10 +5,10 @@ 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.creativetab.CreativeTabs; -import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.NonNullList; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; @@ -21,7 +21,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; -public class ItemBlockBloodTank extends ItemBlock { +public class ItemBlockBloodTank extends BlockItem { public ItemBlockBloodTank(Block block) { super(block); @@ -58,7 +58,7 @@ public class ItemBlockBloodTank extends ItemBlock { @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -72,7 +72,7 @@ public class ItemBlockBloodTank extends ItemBlock { } @Override - public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) { + 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 index 0d72a4a5..7aed772a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java @@ -3,18 +3,18 @@ package WayofTime.bloodmagic.item.block; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.tile.TileDemonCrystal; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.Locale; -public class ItemBlockDemonCrystal extends ItemBlock { +public class ItemBlockDemonCrystal extends BlockItem { public ItemBlockDemonCrystal(Block block) { super(block); setHasSubtypes(true); @@ -31,7 +31,7 @@ public class ItemBlockDemonCrystal extends ItemBlock { } @Override - public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) { + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java index 3e4218bb..242e2974 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java @@ -1,27 +1,22 @@ package WayofTime.bloodmagic.item.block; import net.minecraft.block.Block; +import net.minecraft.block.BlockState; import net.minecraft.block.SoundType; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; +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.block.BlockMimic; import WayofTime.bloodmagic.tile.TileMimic; import WayofTime.bloodmagic.block.base.BlockEnum; import WayofTime.bloodmagic.item.block.base.ItemBlockEnum; -import WayofTime.bloodmagic.util.ChatUtil; - public class ItemBlockMimic extends ItemBlockEnum { public ItemBlockMimic(BlockEnum block) { super(block); @@ -29,7 +24,7 @@ public class ItemBlockMimic extends ItemBlockEnum { } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + 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 @@ -40,12 +35,12 @@ public class ItemBlockMimic extends ItemBlockEnum { //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 - IBlockState replacedBlockstate = world.getBlockState(pos); + BlockState replacedBlockstate = world.getBlockState(pos); Block replacedBlock = replacedBlockstate.getBlock(); ItemStack replacedStack = replacedBlock.getItem(world, pos, replacedBlockstate); //Get the state for the mimic - IBlockState mimicBlockstate = this.getBlock().getStateFromMeta(stack.getMetadata()); + BlockState mimicBlockstate = this.getBlock().getStateFromMeta(stack.getMetadata()); //Check if the block can be replaced @@ -57,13 +52,13 @@ public class ItemBlockMimic extends ItemBlockEnum { //Check if the tile entity, if any, can be replaced TileEntity tileReplaced = world.getTileEntity(pos); if (!canReplaceTile(tileReplaced)) { - return EnumActionResult.FAIL; + return ActionResultType.FAIL; } //If tile can be replaced, store info about the tile - NBTTagCompound tileTag = getTagFromTileEntity(tileReplaced); + CompoundNBT tileTag = getTagFromTileEntity(tileReplaced); if (tileReplaced != null) { - NBTTagCompound voidTag = new NBTTagCompound(); + CompoundNBT voidTag = new CompoundNBT(); voidTag.setInteger("x", pos.getX()); voidTag.setInteger("y", pos.getY()); voidTag.setInteger("z", pos.getZ()); @@ -93,27 +88,27 @@ public class ItemBlockMimic extends ItemBlockEnum { mimic.dropItemsOnBreak = false; } } - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } - return EnumActionResult.FAIL; + return ActionResultType.FAIL; } public boolean canReplaceTile(TileEntity tile) { - if (tile instanceof TileEntityChest) { + if (tile instanceof ChestTileEntity) { return true; } return tile == null; } - public boolean canReplaceBlock(World world, BlockPos pos, IBlockState state) { + public boolean canReplaceBlock(World world, BlockPos pos, BlockState state) { return state.getBlockHardness(world, pos) != -1.0F; } - public NBTTagCompound getTagFromTileEntity(TileEntity tile) { - NBTTagCompound tag = new NBTTagCompound(); + public CompoundNBT getTagFromTileEntity(TileEntity tile) { + CompoundNBT tag = new CompoundNBT(); if (tile != null) { return tile.writeToNBT(tag); diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java index c7555739..4739bec2 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.item.block.base; import WayofTime.bloodmagic.block.base.BlockEnum; -import net.minecraft.item.ItemBlock; +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 ItemBlock { +public class ItemBlockEnum & IStringSerializable> extends BlockItem { public ItemBlockEnum(BlockEnum block) { super(block); diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java index 1797aa60..20f656cd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item.block.base; import WayofTime.bloodmagic.block.base.BlockInteger; -import net.minecraft.item.ItemBlock; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; -public class ItemBlockInteger extends ItemBlock { +public class ItemBlockInteger extends BlockItem { public ItemBlockInteger(BlockInteger block) { super(block); diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java index 9c01900b..116c1c22 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java @@ -11,35 +11,35 @@ 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.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemArmor; +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.EnumActionResult; -import net.minecraft.util.EnumHand; +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 ItemArmor implements IAltarManipulator, IItemLPContainer, IVariantProvider { +public class ItemPackSacrifice extends ArmorItem implements IAltarManipulator, IItemLPContainer, IVariantProvider { public final int CAPACITY = 10000; // Max LP storage public ItemPackSacrifice() { - super(ArmorMaterial.CHAIN, 0, EntityEquipmentSlot.CHEST); + super(ArmorMaterial.CHAIN, 0, EquipmentSlotType.CHEST); setTranslationKey(BloodMagic.MODID + ".pack.sacrifice"); setCreativeTab(BloodMagic.TAB_BM); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote) - return ActionResult.newResult(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); RayTraceResult rayTrace = this.rayTrace(world, player, false); @@ -56,11 +56,11 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I } } - return ActionResult.newResult(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); } @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { + public void onArmorTick(World world, PlayerEntity player, ItemStack stack) { if (getStoredLP(stack) > CAPACITY) setStoredLP(stack, CAPACITY); } diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java index cc15fe1f..4c70b592 100644 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java @@ -12,21 +12,21 @@ 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.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemArmor; +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.EnumActionResult; -import net.minecraft.util.EnumHand; +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 ItemArmor implements IAltarManipulator, IItemLPContainer, IVariantProvider { +public class ItemPackSelfSacrifice extends ArmorItem implements IAltarManipulator, IItemLPContainer, IVariantProvider { /** * How much LP per half heart */ @@ -45,17 +45,17 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato public final float HEALTHREQ = 0.5f; public ItemPackSelfSacrifice() { - super(ArmorMaterial.CHAIN, 0, EntityEquipmentSlot.CHEST); + super(ArmorMaterial.CHAIN, 0, EquipmentSlotType.CHEST); setTranslationKey(BloodMagic.MODID + ".pack.selfSacrifice"); setCreativeTab(BloodMagic.TAB_BM); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (world.isRemote) - return ActionResult.newResult(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); RayTraceResult position = this.rayTrace(world, player, false); @@ -72,11 +72,11 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato } } - return ActionResult.newResult(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); } @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { + public void onArmorTick(World world, PlayerEntity player, ItemStack stack) { if (world.isRemote || player.capabilities.isCreativeMode) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java index ed9d22cf..d4608ab9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.item.inventory; import WayofTime.bloodmagic.iface.ISigil; import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.container.Container; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -13,9 +13,9 @@ 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 EntityPlayer player; + private final PlayerEntity player; - public ContainerHolding(EntityPlayer player, InventoryHolding inventoryHolding) { + public ContainerHolding(PlayerEntity player, InventoryHolding inventoryHolding) { this.player = player; this.inventoryHolding = inventoryHolding; int currentSlotHeldIn = player.inventory.currentItem; @@ -40,12 +40,12 @@ public class ContainerHolding extends Container { } @Override - public boolean canInteractWith(EntityPlayer entityPlayer) { + public boolean canInteractWith(PlayerEntity entityPlayer) { return true; } @Override - public void onContainerClosed(EntityPlayer entityPlayer) { + public void onContainerClosed(PlayerEntity entityPlayer) { super.onContainerClosed(entityPlayer); if (!entityPlayer.getEntityWorld().isRemote) { @@ -63,7 +63,7 @@ public class ContainerHolding extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer entityPlayer, int slotIndex) { + public ItemStack transferStackInSlot(PlayerEntity entityPlayer, int slotIndex) { ItemStack stack = ItemStack.EMPTY; Slot slotObject = inventorySlots.get(slotIndex); int slots = inventorySlots.size(); @@ -106,15 +106,15 @@ public class ContainerHolding extends Container { return stack; } - public void saveInventory(EntityPlayer entityPlayer) { + public void saveInventory(PlayerEntity entityPlayer) { inventoryHolding.onGuiSaved(entityPlayer); } private class SlotHolding extends Slot { - private final EntityPlayer player; + private final PlayerEntity player; private ContainerHolding containerHolding; - public SlotHolding(ContainerHolding containerHolding, IInventory inventory, EntityPlayer player, int slotIndex, int x, int y) { + 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; @@ -146,7 +146,7 @@ public class ContainerHolding extends Container { } @Override - public boolean canTakeStack(EntityPlayer player) { + 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 index 133d341e..a6eb1973 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java @@ -4,9 +4,9 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import java.util.UUID; @@ -17,7 +17,7 @@ public class InventoryHolding extends ItemInventory { super(itemStack, ItemSigilHolding.inventorySize, "SigilOfHolding"); } - public void onGuiSaved(EntityPlayer entityPlayer) { + public void onGuiSaved(PlayerEntity entityPlayer) { masterStack = findParentStack(entityPlayer); if (!masterStack.isEmpty()) { @@ -25,7 +25,7 @@ public class InventoryHolding extends ItemInventory { } } - public ItemStack findParentStack(EntityPlayer entityPlayer) { + 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++) { @@ -43,10 +43,10 @@ public class InventoryHolding extends ItemInventory { } public void save() { - NBTTagCompound nbtTagCompound = masterStack.getTagCompound(); + CompoundNBT nbtTagCompound = masterStack.getTagCompound(); if (nbtTagCompound == null) { - nbtTagCompound = new NBTTagCompound(); + nbtTagCompound = new CompoundNBT(); UUID uuid = UUID.randomUUID(); nbtTagCompound.setLong(Constants.NBT.MOST_SIG, uuid.getMostSignificantBits()); diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java index 0a08e330..329f5aea 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java @@ -2,14 +2,14 @@ package WayofTime.bloodmagic.item.inventory; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.helper.NBTHelper; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; +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.TextComponentString; +import net.minecraft.util.text.StringTextComponent; public class ItemInventory implements IInventory { protected int[] syncedSlots = new int[0]; @@ -43,13 +43,13 @@ public class ItemInventory implements IInventory { return false; } - public void readFromNBT(NBTTagCompound tagCompound) { - NBTTagList tags = tagCompound.getTagList(Constants.NBT.ITEMS, 10); + 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)) { - NBTTagCompound data = tags.getCompoundTagAt(i); + CompoundNBT data = tags.getCompoundTagAt(i); byte j = data.getByte(Constants.NBT.SLOT); if (j >= 0 && j < inventory.size()) { @@ -59,12 +59,12 @@ public class ItemInventory implements IInventory { } } - public void writeToNBT(NBTTagCompound tagCompound) { - NBTTagList tags = new NBTTagList(); + public void writeToNBT(CompoundNBT tagCompound) { + ListNBT tags = new ListNBT(); for (int i = 0; i < inventory.size(); i++) { if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) { - NBTTagCompound data = new NBTTagCompound(); + CompoundNBT data = new CompoundNBT(); data.setByte(Constants.NBT.SLOT, (byte) i); inventory.get(i).writeToNBT(data); tags.appendTag(data); @@ -77,7 +77,7 @@ public class ItemInventory implements IInventory { public void readFromStack(ItemStack masterStack) { if (masterStack != null) { NBTHelper.checkNBT(masterStack); - NBTTagCompound tag = masterStack.getTagCompound(); + CompoundNBT tag = masterStack.getTagCompound(); readFromNBT(tag.getCompoundTag(Constants.NBT.ITEM_INVENTORY)); } } @@ -85,8 +85,8 @@ public class ItemInventory implements IInventory { public void writeToStack(ItemStack masterStack) { if (masterStack != null) { NBTHelper.checkNBT(masterStack); - NBTTagCompound tag = masterStack.getTagCompound(); - NBTTagCompound invTag = new NBTTagCompound(); + CompoundNBT tag = masterStack.getTagCompound(); + CompoundNBT invTag = new CompoundNBT(); writeToNBT(invTag); tag.setTag(Constants.NBT.ITEM_INVENTORY, invTag); } @@ -152,17 +152,17 @@ public class ItemInventory implements IInventory { } @Override - public boolean isUsableByPlayer(EntityPlayer player) { + public boolean isUsableByPlayer(PlayerEntity player) { return true; } @Override - public void openInventory(EntityPlayer player) { + public void openInventory(PlayerEntity player) { } @Override - public void closeInventory(EntityPlayer player) { + public void closeInventory(PlayerEntity player) { } @@ -203,7 +203,7 @@ public class ItemInventory implements IInventory { @Override public ITextComponent getDisplayName() { - return new TextComponentString(getName()); + return new StringTextComponent(getName()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java index 1a263103..45a7f63d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -9,7 +9,7 @@ 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.creativetab.CreativeTabs; +import net.minecraft.item.ItemGroup; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -41,7 +41,7 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index 4ea9be03..6665b7fd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -10,16 +10,16 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -40,7 +40,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { if (!stack.hasTagCompound()) return; - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); BlockPos coords = getBlockPos(stack); if (coords != null && tag != null) { @@ -49,10 +49,10 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } @Override - public EnumActionResult onItemUseFirst(EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand) { + 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 EnumActionResult.PASS; + return ActionResultType.PASS; } TileEntity tileHit = world.getTileEntity(pos); @@ -62,17 +62,17 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi BlockPos containedPos = getBlockPos(stack); if (!containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, BlockPos.ORIGIN); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.remove"), true); - return EnumActionResult.FAIL; + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.remove"), true); + return ActionResultType.FAIL; } - return EnumActionResult.FAIL; + return ActionResultType.FAIL; } IRoutingNode node = (IRoutingNode) tileHit; BlockPos containedPos = getBlockPos(stack); if (containedPos.equals(BlockPos.ORIGIN)) { this.setBlockPos(stack, pos); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.set"), true); - return EnumActionResult.SUCCESS; + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.set"), true); + return ActionResultType.SUCCESS; } else { TileEntity pastTile = world.getTileEntity(containedPos); if (pastTile instanceof IRoutingNode) { @@ -87,16 +87,16 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi master.addConnection(pos, containedPos); master.addNodeToList(node); node.addConnection(containedPos); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } } else { master.addConnection(pos, containedPos); node.addConnection(containedPos); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } } else if (node instanceof IMasterRoutingNode) { @@ -109,16 +109,16 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi master.addConnection(pos, containedPos); pastNode.addConnection(pos); master.addNodeToList(pastNode); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } } else { master.addConnection(pos, containedPos); pastNode.addConnection(pos); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } } else { //Both nodes are not master nodes, so normal linking @@ -132,9 +132,9 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link.master"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); this.setBlockPos(stack, BlockPos.ORIGIN); - return EnumActionResult.SUCCESS; + 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()); @@ -146,9 +146,9 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link"), true); this.setBlockPos(stack, BlockPos.ORIGIN); - return EnumActionResult.SUCCESS; + 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()); @@ -160,18 +160,18 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi } pastNode.addConnection(pos); node.addConnection(containedPos); - player.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.routing.link"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link"), true); this.setBlockPos(stack, BlockPos.ORIGIN); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } else { this.setBlockPos(stack, BlockPos.ORIGIN); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } } } } - return EnumActionResult.FAIL; + return ActionResultType.FAIL; } @Override @@ -186,7 +186,7 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi public ItemStack setBlockPos(ItemStack stack, BlockPos pos) { NBTHelper.checkNBT(stack); - NBTTagCompound itemTag = stack.getTagCompound(); + CompoundNBT itemTag = stack.getTagCompound(); itemTag.setInteger(Constants.NBT.X_COORD, pos.getX()); itemTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); itemTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 70e55aec..b5f1da4e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -8,7 +8,7 @@ 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.creativetab.CreativeTabs; +import net.minecraft.item.ItemGroup; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -40,7 +40,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java index da71b84d..e849c0c5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java @@ -7,12 +7,12 @@ 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.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; +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.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.*; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -23,12 +23,12 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); boolean unusable = isUnusable(stack); if (world.isRemote && !unusable) { @@ -59,8 +59,8 @@ public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectP } @Override - public boolean applyOnHitEffect(EnumDemonWillType type, ItemStack swordStack, ItemStack providerStack, EntityLivingBase attacker, EntityLivingBase target) { - target.addPotionEffect(new PotionEffect(MobEffects.LEVITATION, 200, 0)); + public boolean applyOnHitEffect(EnumDemonWillType type, ItemStack swordStack, ItemStack providerStack, LivingEntity attacker, LivingEntity target) { + target.addPotionEffect(new EffectInstance(Effects.LEVITATION, 200, 0)); return true; } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java index 957187bc..db5c1c32 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java @@ -8,7 +8,7 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; @@ -27,12 +27,12 @@ public class ItemSigilBloodLight extends ItemSigilBase { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); RayTraceResult mop = this.rayTrace(world, player, false); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java index a209952d..9e6359d9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java @@ -2,9 +2,9 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.world.World; public class ItemSigilBounce extends ItemSigilToggleableBase { @@ -13,10 +13,10 @@ public class ItemSigilBounce extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.BOUNCE, 2, 0, true, false)); + 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 index 49358bcd..d69e9a40 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java @@ -2,9 +2,9 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.world.World; public class ItemSigilClaw extends ItemSigilToggleableBase { @@ -13,10 +13,10 @@ public class ItemSigilClaw extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.CLING, 2, 0, true, false)); + 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 index 1359167a..e0cb5d17 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.compress.CompressionRegistry; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -16,7 +16,7 @@ public class ItemSigilCompression extends ItemSigilToggleableBase { // TODO for now, there is a semi-working system in place @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; @@ -24,7 +24,7 @@ public class ItemSigilCompression extends ItemSigilToggleableBase { ItemStack compressedStack = CompressionRegistry.compressInventory(player.inventory.mainInventory.toArray(new ItemStack[player.inventory.mainInventory.size()]), world); if (compressedStack != null) { - EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, compressedStack); + 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 index a25a5122..89f8663c 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -7,11 +7,11 @@ 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.EntityPlayer; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import java.util.List; @@ -23,12 +23,12 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); if (!world.isRemote) { super.onItemRightClick(world, player, hand); @@ -38,8 +38,8 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { int currentEssence = NetworkHelper.getSoulNetwork(binding).getCurrentEssence(); List toSend = Lists.newArrayList(); if (!binding.getOwnerId().equals(player.getGameProfile().getId())) - toSend.add(new TextComponentTranslation(tooltipBase + "otherNetwork", binding.getOwnerName())); - toSend.add(new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence)); + toSend.add(new TranslationTextComponent(tooltipBase + "otherNetwork", binding.getOwnerName())); + toSend.add(new TranslationTextComponent(tooltipBase + "currentEssence", currentEssence)); ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java index 8de0be57..96061711 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effects; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; public class ItemSigilElementalAffinity extends ItemSigilToggleableBase { @@ -13,13 +13,13 @@ public class ItemSigilElementalAffinity extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + 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 PotionEffect(MobEffects.FIRE_RESISTANCE, 2, 1, true, false)); - player.addPotionEffect(new PotionEffect(MobEffects.WATER_BREATHING, 2, 0, true, false)); + 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 index 8b445fe3..26855657 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java @@ -3,10 +3,10 @@ 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.EntityEnderman; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.monster.EndermanEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.world.World; import java.util.List; @@ -17,14 +17,14 @@ public class ItemSigilEnderSeverance extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + 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 EntityEnderman) - ((EntityEnderman) entity).addPotionEffect(new PotionEffect(RegistrarBloodMagic.PLANAR_BINDING, 40, 0)); + 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 index 090dc98b..bedc2c06 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effects; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -18,10 +18,10 @@ public class ItemSigilFastMiner extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(MobEffects.HASTE, 2, 1, true, false)); + player.addPotionEffect(new EffectInstance(Effects.HASTE, 2, 1, true, false)); } @Override @@ -31,10 +31,10 @@ public class ItemSigilFastMiner extends ItemSigilToggleableBase { int potionPotency = 2; AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); - List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, bb); - for (EntityPlayer player : playerList) { - if (!player.isPotionActive(MobEffects.HASTE) || (player.isPotionActive(MobEffects.HASTE) && player.getActivePotionEffect(MobEffects.HASTE).getAmplifier() < potionPotency)) { - player.addPotionEffect(new PotionEffect(MobEffects.HASTE, ticks, potionPotency)); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java index a79affe5..67a0d430 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.handler.event.GenericHandler; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -12,7 +12,7 @@ public class ItemSigilFilledHand extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + 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 index ac1ef35b..f9ef8238 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java @@ -8,13 +8,13 @@ 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.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.ICapabilityProvider; @@ -57,8 +57,8 @@ public abstract class ItemSigilFluidBase extends ItemSigilBase implements ISigil * This one is literally identical to the FluidUtil method of the same signature. */ @Nullable - protected IFluidHandler getFluidHandler(World world, BlockPos blockPos, @Nullable EnumFacing side) { - IBlockState state = world.getBlockState(blockPos); + 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) { @@ -96,7 +96,7 @@ public abstract class ItemSigilFluidBase extends ItemSigilBase implements ISigil * 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(EntityPlayer player, World world, BlockPos blockPos) { + protected boolean tryPlaceSigilFluid(PlayerEntity player, World world, BlockPos blockPos) { //Make sure world coordinants are valid if (world == null || blockPos == null) { @@ -109,7 +109,7 @@ public abstract class ItemSigilFluidBase extends ItemSigilBase implements ISigil } //Check if the block is an air block or otherwise replaceable - IBlockState state = world.getBlockState(blockPos); + BlockState state = world.getBlockState(blockPos); Material mat = state.getMaterial(); boolean isDestSolid = mat.isSolid(); boolean isDestReplaceable = state.getBlock().isReplaceable(world, blockPos); @@ -171,7 +171,7 @@ public abstract class ItemSigilFluidBase extends ItemSigilBase implements ISigil } @Override - public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) { + public ICapabilityProvider initCapabilities(ItemStack stack, CompoundNBT nbt) { return new SigilFluidWrapper(stack, this); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java index 23e6bfa8..0f4b8118 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.enchantment.EnchantmentFrostWalker; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.enchantment.FrostWalkerEnchantment; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -12,10 +12,10 @@ public class ItemSigilFrost extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - EnchantmentFrostWalker.freezeNearby(player, world, player.getPosition(), 1); + 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 index 8f479995..41faf9ba 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java @@ -5,11 +5,11 @@ 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.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -22,7 +22,7 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase { } @Override - public boolean onSigilUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) { + 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; @@ -37,7 +37,7 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World worldIn, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World worldIn, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; @@ -51,15 +51,15 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase { 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); - IBlockState state = worldIn.getBlockState(blockPos); + BlockState state = worldIn.getBlockState(blockPos); if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { if (state.getBlock() instanceof IGrowable) { if (worldIn.rand.nextInt(50) == 0) { - IBlockState preBlockState = worldIn.getBlockState(blockPos); + BlockState preBlockState = worldIn.getBlockState(blockPos); state.getBlock().updateTick(worldIn, blockPos, state, worldIn.rand); - IBlockState newState = worldIn.getBlockState(blockPos); + BlockState newState = worldIn.getBlockState(blockPos); if (!newState.equals(preBlockState) && !worldIn.isRemote) worldIn.playEvent(2005, blockPos, 0); } @@ -70,10 +70,10 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase { } } - private boolean applyBonemeal(World worldIn, BlockPos target, EntityPlayer player, ItemStack sigilStack) { - IBlockState iblockstate = worldIn.getBlockState(target); + private boolean applyBonemeal(World worldIn, BlockPos target, PlayerEntity player, ItemStack sigilStack) { + BlockState iblockstate = worldIn.getBlockState(target); - BonemealEvent event = new BonemealEvent(player, worldIn, target, iblockstate, EnumHand.MAIN_HAND, sigilStack); + 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) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java index 06d6de8e..ddd1937e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java @@ -2,9 +2,9 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.world.World; public class ItemSigilHaste extends ItemSigilToggleableBase { @@ -13,10 +13,10 @@ public class ItemSigilHaste extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.BOOST, 2, 0, true, false)); + 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 index 7238a07d..18a8c3a8 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -15,13 +15,13 @@ 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.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; +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; @@ -41,7 +41,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } @Override - public void onKeyPressed(ItemStack stack, EntityPlayer player, KeyBindings key, boolean showInChat) { + 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); @@ -84,62 +84,62 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + 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 EnumActionResult.FAIL; + 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 EnumActionResult.PASS; + return ActionResultType.PASS; - EnumActionResult result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); + ActionResultType result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); saveInventory(stack, inv); return result; } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(EnumActionResult.FAIL, stack); + 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(EnumActionResult.PASS, stack); + return ActionResult.newResult(ActionResultType.PASS, stack); itemUsing.getItem().onItemRightClick(world, player, hand); saveInventory(stack, inv); - return ActionResult.newResult(EnumActionResult.PASS, stack); + return ActionResult.newResult(ActionResultType.PASS, stack); } @Nonnull @Override - public ItemStack getHeldItem(ItemStack holdingStack, EntityPlayer player) { + public ItemStack getHeldItem(ItemStack holdingStack, PlayerEntity player) { return getInternalInventory(holdingStack).get(getCurrentItemOrdinal(holdingStack)); } public void saveInventory(ItemStack itemStack, List inventory) { - NBTTagCompound itemTag = itemStack.getTagCompound(); + CompoundNBT itemTag = itemStack.getTagCompound(); if (itemTag == null) - itemStack.setTagCompound(itemTag = new NBTTagCompound()); + itemStack.setTagCompound(itemTag = new CompoundNBT()); - NBTTagCompound inventoryTag = new NBTTagCompound(); - NBTTagList itemList = new NBTTagList(); + CompoundNBT inventoryTag = new CompoundNBT(); + ListNBT itemList = new ListNBT(); for (int i = 0; i < inventorySize; i++) { if (!inventory.get(i).isEmpty()) { - NBTTagCompound tag = new NBTTagCompound(); + CompoundNBT tag = new CompoundNBT(); tag.setByte(Constants.NBT.SLOT, (byte) i); inventory.get(i).writeToNBT(tag); itemList.appendTag(tag); @@ -241,14 +241,14 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl public static List getInternalInventory(ItemStack stack) { initModeTag(stack); - NBTTagCompound tagCompound = stack.getTagCompound(); + CompoundNBT tagCompound = stack.getTagCompound(); if (tagCompound == null) { return NonNullList.withSize(inventorySize, ItemStack.EMPTY); } - NBTTagCompound inventoryTag = tagCompound.getCompoundTag(Constants.NBT.ITEM_INVENTORY); - NBTTagList tagList = inventoryTag.getTagList(Constants.NBT.ITEMS, 10); + CompoundNBT inventoryTag = tagCompound.getCompoundTag(Constants.NBT.ITEM_INVENTORY); + ListNBT tagList = inventoryTag.getTagList(Constants.NBT.ITEMS, 10); if (tagList.isEmpty()) { return NonNullList.withSize(inventorySize, ItemStack.EMPTY); @@ -257,7 +257,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl List inv = NonNullList.withSize(inventorySize, ItemStack.EMPTY); for (int i = 0; i < tagList.tagCount(); i++) { - NBTTagCompound data = tagList.getCompoundTagAt(i); + CompoundNBT data = tagList.getCompoundTagAt(i); byte j = data.getByte(Constants.NBT.SLOT); if (j >= 0 && j < inv.size()) { diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java index 2c235b1a..9d259798 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java @@ -4,11 +4,11 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; +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; @@ -24,18 +24,18 @@ public class ItemSigilLava extends ItemSigilFluidBase { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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(EnumActionResult.FAIL, stack); + 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(EnumActionResult.PASS, stack); + return ActionResult.newResult(ActionResultType.PASS, stack); } BlockPos blockPos = rayTrace.getBlockPos(); @@ -47,21 +47,21 @@ public class ItemSigilLava extends ItemSigilFluidBase { 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(EnumActionResult.SUCCESS, stack); + 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(EnumActionResult.SUCCESS, stack); + 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(EnumActionResult.SUCCESS, stack); + return ActionResult.newResult(ActionResultType.SUCCESS, stack); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java index 93d66134..6bf62a91 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.item.EntityXPOrb; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -16,7 +16,7 @@ public class ItemSigilMagnetism extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; @@ -25,16 +25,16 @@ public class ItemSigilMagnetism extends ItemSigilToggleableBase { float posX = Math.round(player.posX); float posY = (float) (player.posY - player.getEyeHeight()); float posZ = Math.round(player.posZ); - List entities = player.getEntityWorld().getEntitiesWithinAABB(EntityItem.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(EntityXPOrb.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 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 (EntityItem entity : entities) { + for (ItemEntity entity : entities) { if (entity != null && !world.isRemote && !entity.isDead) { entity.onCollideWithPlayer(player); } } - for (EntityXPOrb xpOrb : xpOrbs) { + 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 index 856a971e..5edc3928 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java @@ -6,7 +6,7 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -17,7 +17,7 @@ import java.util.List; import java.util.Map; public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { - public static final Predicate IS_PHANTOM_ACTIVE = (Entity entity) -> entity instanceof EntityPlayer && isPhantomActive((EntityPlayer) entity); + public static final Predicate IS_PHANTOM_ACTIVE = (Entity entity) -> entity instanceof PlayerEntity && isPhantomActive((PlayerEntity) entity); public static final String[] CIRCLE7X7 = new String[]{ " XXX ", @@ -52,14 +52,14 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { // <--X }; - private Map> prevPositionMap = new HashMap<>(); + private Map> prevPositionMap = new HashMap<>(); public ItemSigilPhantomBridge() { super("phantom_bridge", 100); } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; @@ -197,7 +197,7 @@ public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { } } - public static boolean isPhantomActive(EntityPlayer entity) { + 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) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java index 16783af4..686e57eb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java @@ -3,8 +3,8 @@ 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.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -16,7 +16,7 @@ public class ItemSigilSuppression extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; @@ -34,7 +34,7 @@ public class ItemSigilSuppression extends ItemSigilToggleableBase { } BlockPos blockPos = new BlockPos(x + i, y + j, z + k); - IBlockState state = world.getBlockState(blockPos); + BlockState state = world.getBlockState(blockPos); if (Utils.isBlockLiquid(state) && world.getTileEntity(blockPos) == null) TileSpectralBlock.createSpectralBlock(world, blockPos, refresh); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 7d25804c..4303d3fd 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -9,14 +9,14 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -48,12 +48,12 @@ public class ItemSigilTeleposition extends ItemSigilBase { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); TeleportLocation location = getTeleportLocation(stack); Binding binding = getBinding(stack); @@ -78,21 +78,21 @@ public class ItemSigilTeleposition extends ItemSigilBase { } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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 EnumActionResult.FAIL; + 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 EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } } - return EnumActionResult.FAIL; + return ActionResultType.FAIL; } @Nullable @@ -103,7 +103,7 @@ public class ItemSigilTeleposition extends ItemSigilBase { if (!stack.hasTagCompound()) return null; - NBTTagCompound locationTag = stack.getSubCompound("tplocation"); + CompoundNBT locationTag = stack.getSubCompound("tplocation"); if (locationTag == null) return null; @@ -111,16 +111,16 @@ public class ItemSigilTeleposition extends ItemSigilBase { } public void updateLocation(ItemStack stack, TeleportLocation location) { - NBTTagCompound tagCompound; + CompoundNBT tagCompound; if (!stack.hasTagCompound()) - stack.setTagCompound(tagCompound = new NBTTagCompound()); + stack.setTagCompound(tagCompound = new CompoundNBT()); else tagCompound = stack.getTagCompound(); tagCompound.setTag("tplocation", location.serializeNBT()); } - public static class TeleportLocation implements INBTSerializable { + public static class TeleportLocation implements INBTSerializable { private int dim; private BlockPos pos; @@ -138,20 +138,20 @@ public class ItemSigilTeleposition extends ItemSigilBase { } @Override - public NBTTagCompound serializeNBT() { - NBTTagCompound tag = new NBTTagCompound(); + public CompoundNBT serializeNBT() { + CompoundNBT tag = new CompoundNBT(); tag.setInteger("dim", dim); tag.setLong("pos", pos.toLong()); return tag; } @Override - public void deserializeNBT(NBTTagCompound nbt) { + public void deserializeNBT(CompoundNBT nbt) { this.dim = nbt.getInteger("dim"); this.pos = BlockPos.fromLong(nbt.getLong("pos")); } - public static TeleportLocation fromTag(NBTTagCompound tpTag) { + 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 index 4a354186..bb21d6d6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java @@ -9,13 +9,13 @@ 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.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; +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.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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; @@ -44,12 +44,12 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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(EnumActionResult.FAIL, stack); + return ActionResult.newResult(ActionResultType.FAIL, stack); if (!world.isRemote && !isUnusable(stack)) { if (player.isSneaking()) @@ -62,35 +62,35 @@ public class ItemSigilToggleable extends ItemSigil implements IActivatable { } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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 EnumActionResult.PASS; + return ActionResultType.PASS; - return onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + return onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ) ? ActionResultType.SUCCESS : ActionResultType.FAIL; } - public boolean onSigilUse(ItemStack itemStack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) { + 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 EntityPlayerMP && getActivated(stack)) { + if (!worldIn.isRemote && entityIn instanceof ServerPlayerEntity && getActivated(stack)) { if (entityIn.ticksExisted % 100 == 0) { - if (!NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage((EntityPlayer) entityIn, SoulTicket.item(stack, worldIn, entityIn, getLpUsed())).isSuccess()) { + if (!NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage((PlayerEntity) entityIn, SoulTicket.item(stack, worldIn, entityIn, getLpUsed())).isSuccess()) { setActivatedState(stack, false); } } - onSigilUpdate(stack, worldIn, (EntityPlayer) entityIn, itemSlot, isSelected); + onSigilUpdate(stack, worldIn, (PlayerEntity) entityIn, itemSlot, isSelected); } } - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean 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 index ce7517a9..190e8b98 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java @@ -6,7 +6,7 @@ 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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -37,7 +37,7 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes if (!stack.hasTagCompound()) return; - tooltip.add(new TextComponentTranslation("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated")).getFormattedText()); + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated")).getFormattedText()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index 4cba37ed..a2dc3b3d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -5,14 +5,14 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityMobSpawner; +import net.minecraft.tileentity.MobSpawnerTileEntity; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -35,7 +35,7 @@ public class ItemSigilTransposition extends ItemSigilBase { if (!stack.hasTagCompound()) return; - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (tag.hasKey("stored")) { tooltip.add(" "); @@ -49,7 +49,7 @@ public class ItemSigilTransposition extends ItemSigilBase { if (!stack.hasTagCompound()) return super.getItemStackDisplayName(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (tag.hasKey("stored")) return super.getItemStackDisplayName(stack) + " (" + tag.getCompoundTag("stored").getString("display") + ")"; @@ -57,32 +57,32 @@ public class ItemSigilTransposition extends ItemSigilBase { } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + 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 EnumActionResult.FAIL; + return ActionResultType.FAIL; - IBlockState state = world.getBlockState(blockPos); + BlockState state = world.getBlockState(blockPos); if (!world.isRemote) { if (BloodMagicAPI.INSTANCE.getBlacklist().getTransposition().contains(state)) - return EnumActionResult.FAIL; + 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(); - NBTTagCompound stored = new NBTTagCompound(); - stored.setTag("state", NBTUtil.writeBlockState(new NBTTagCompound(), state)); + 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 NBTTagCompound())); + stored.setTag("tileData", tile.writeToNBT(new CompoundNBT())); - if (world.getTileEntity(blockPos) instanceof TileEntityMobSpawner) + if (world.getTileEntity(blockPos) instanceof MobSpawnerTileEntity) cost *= 6; } } @@ -91,13 +91,13 @@ public class ItemSigilTransposition extends ItemSigilBase { NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, cost)); world.removeTileEntity(blockPos); world.setBlockToAir(blockPos); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } } else if (stack.hasTagCompound() && stack.getTagCompound().hasKey("stored")) { - IBlockState worldState = world.getBlockState(blockPos); - NBTTagCompound storedTag = stack.getTagCompound().getCompoundTag("stored"); - IBlockState storedState = NBTUtil.readBlockState(storedTag.getCompoundTag("state")); - NBTTagCompound tileData = storedTag.hasKey("tileData") ? storedTag.getCompoundTag("tileData") : null; + BlockState worldState = world.getBlockState(blockPos); + CompoundNBT storedTag = stack.getTagCompound().getCompoundTag("stored"); + BlockState storedState = NBTUtil.readBlockState(storedTag.getCompoundTag("state")); + CompoundNBT tileData = storedTag.hasKey("tileData") ? storedTag.getCompoundTag("tileData") : null; if (!worldState.getBlock().isReplaceable(world, blockPos)) blockPos = blockPos.offset(side); @@ -117,23 +117,23 @@ public class ItemSigilTransposition extends ItemSigilBase { world.notifyBlockUpdate(blockPos, state, state, 3); stack.getTagCompound().removeTag("stored"); - return EnumActionResult.SUCCESS; + return ActionResultType.SUCCESS; } } } } - return EnumActionResult.FAIL; + 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 NBTTagCompound getNBTShareTag(ItemStack stack) { + public CompoundNBT getNBTShareTag(ItemStack stack) { if (!stack.hasTagCompound() || !stack.getTagCompound().hasKey("stored")) return super.getNBTShareTag(stack); - NBTTagCompound shareTag = stack.getTagCompound().copy(); - NBTTagCompound storedTag = shareTag.getCompoundTag("stored"); + CompoundNBT shareTag = stack.getTagCompound().copy(); + CompoundNBT storedTag = shareTag.getCompoundTag("stored"); storedTag.removeTag("state"); storedTag.removeTag("stored"); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java index 8b321eb4..809042d1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java @@ -6,11 +6,11 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; +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; @@ -23,18 +23,18 @@ public class ItemSigilVoid extends ItemSigilFluidBase { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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(EnumActionResult.FAIL, stack); + 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(EnumActionResult.PASS, stack); + return ActionResult.newResult(ActionResultType.PASS, stack); } BlockPos blockPos = rayTrace.getBlockPos(); @@ -45,13 +45,13 @@ public class ItemSigilVoid extends ItemSigilFluidBase { 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(EnumActionResult.SUCCESS, stack); + 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(EnumActionResult.SUCCESS, stack); + return ActionResult.newResult(ActionResultType.SUCCESS, stack); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java index 6e71a24d..9417adc1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java @@ -4,13 +4,13 @@ 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.BlockCauldron; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; +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.EnumActionResult; -import net.minecraft.util.EnumHand; +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; @@ -24,18 +24,18 @@ public class ItemSigilWater extends ItemSigilFluidBase { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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(EnumActionResult.FAIL, stack); + 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(EnumActionResult.PASS, stack); + return ActionResult.newResult(ActionResultType.PASS, stack); } BlockPos blockPos = rayTrace.getBlockPos(); @@ -47,20 +47,20 @@ public class ItemSigilWater extends ItemSigilFluidBase { 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(EnumActionResult.SUCCESS, stack); + 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(EnumActionResult.SUCCESS, stack); + 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(BlockCauldron.LEVEL, 3)); - return ActionResult.newResult(EnumActionResult.SUCCESS, stack); + 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 @@ -68,7 +68,7 @@ public class ItemSigilWater extends ItemSigilFluidBase { 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(EnumActionResult.SUCCESS, stack); + return ActionResult.newResult(ActionResultType.SUCCESS, stack); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java index 9577fd78..fffbb349 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java @@ -2,9 +2,9 @@ package WayofTime.bloodmagic.item.sigil; import WayofTime.bloodmagic.util.helper.PlayerHelper; import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.world.World; public class ItemSigilWhirlwind extends ItemSigilToggleableBase { @@ -13,10 +13,10 @@ public class ItemSigilWhirlwind extends ItemSigilToggleableBase { } @Override - public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { if (PlayerHelper.isFakePlayer(player)) return; - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.WHIRLWIND, 2, 0, true, false)); + 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 index 487f80a2..c96bda23 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -10,7 +10,7 @@ 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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -50,7 +50,7 @@ public class ItemMonsterSoul extends ItemEnum.Variant NBTHelper.checkNBT(soulStack); - NBTTagCompound tag = soulStack.getTagCompound(); + CompoundNBT tag = soulStack.getTagCompound(); return tag.getDouble(Constants.NBT.SOULS); } @@ -59,7 +59,7 @@ public class ItemMonsterSoul extends ItemEnum.Variant public void setWill(EnumDemonWillType type, ItemStack soulStack, double souls) { NBTHelper.checkNBT(soulStack); - NBTTagCompound tag = soulStack.getTagCompound(); + CompoundNBT tag = soulStack.getTagCompound(); soulStack.setItemDamage(type.ordinal()); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index c1442db8..a7c64efa 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -7,14 +7,13 @@ 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.block.model.ModelResourceLocation; -import net.minecraft.entity.player.EntityPlayer; +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.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; +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; @@ -35,7 +34,7 @@ public class ItemSentientArmourGem extends Item implements IMeshProvider { } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { boolean hasSentientArmour = false; NonNullList armourInventory = player.inventory.armorInventory; for (ItemStack armourStack : armourInventory) { @@ -54,7 +53,7 @@ public class ItemSentientArmourGem extends Item implements IMeshProvider { ItemSentientArmour.convertPlayerArmour(type, will, player); } - return new ActionResult<>(EnumActionResult.PASS, player.getHeldItem(hand)); + return new ActionResult<>(ActionResultType.PASS, player.getHeldItem(hand)); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index db43014d..f6ca9758 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -17,25 +17,25 @@ 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.state.IBlockState; +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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.monster.SlimeEntity; import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemAxe; +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.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.world.EnumDifficulty; +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; @@ -43,7 +43,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.*; import java.util.function.Consumer; -public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { +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}; @@ -80,7 +80,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public float getDestroySpeed(ItemStack stack, IBlockState state) { + public float getDestroySpeed(ItemStack stack, BlockState state) { float value = super.getDestroySpeed(stack, state); if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); @@ -89,7 +89,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } } - public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { + 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); @@ -166,10 +166,10 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer attacker) { + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, LivingEntity target, PlayerEntity attacker) { switch (type) { case CORROSIVE: - target.addPotionEffect(new PotionEffect(MobEffects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); + target.addPotionEffect(new EffectInstance(Effects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); break; case DEFAULT: break; @@ -178,7 +178,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP case STEADFAST: if (!target.isEntityAlive()) { float absorption = attacker.getAbsorptionAmount(); - attacker.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, absorptionTime[willBracket], 127)); + attacker.addPotionEffect(new EffectInstance(Effects.ABSORPTION, absorptionTime[willBracket], 127)); attacker.setAbsorptionAmount((float) Math.min(absorption + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); } break; @@ -188,10 +188,10 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { if (super.hitEntity(stack, target, attacker)) { - if (attacker instanceof EntityPlayer) { - EntityPlayer attackerPlayer = (EntityPlayer) 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); @@ -199,7 +199,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP applyEffectToEntity(type, willBracket, target, attackerPlayer); - ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); + ItemStack offStack = attackerPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND); if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); if (provider.providesEffectForWill(type)) { @@ -218,7 +218,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { return EnumDemonWillType.DEFAULT; @@ -230,13 +230,13 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { recalculatePowers(player.getHeldItem(hand), world, player); return super.onItemRightClick(world, player, hand); @@ -269,7 +269,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { + public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) { recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); @@ -300,14 +300,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP } @Override - public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { + public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) { List soulList = new ArrayList<>(); - if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { + if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } - double willModifier = killedEntity instanceof EntitySlime ? 0.67 : 1; + double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); @@ -325,9 +325,9 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP //TODO: Change attack speed. @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { + public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.MAINHAND) { + 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)); @@ -340,14 +340,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public double getDamageOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); } public void setDamageOfActivatedSword(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } @@ -355,14 +355,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public double getDrainOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } public void setDrainOfActivatedSword(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } @@ -370,14 +370,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public double getStaticDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } @@ -385,14 +385,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public double getDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } public void setDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } @@ -400,14 +400,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public double getHealthBonusOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } public void setHealthBonusOfSword(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } @@ -415,14 +415,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public double getAttackSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); } public void setAttackSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } @@ -430,14 +430,14 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public double getSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); } public void setSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } @@ -445,20 +445,20 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP public double getDigSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); } public void setDigSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -475,7 +475,7 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP specterEntity.setPosition(player.posX, player.posY, player.posZ); world.spawnEntity(specterEntity); - specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); + specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); specterEntity.setType(this.getCurrentType(droppedStack)); specterEntity.setOwner(player); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 4d72a199..9516da29 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -13,25 +13,23 @@ 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.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.entity.projectile.EntityTippedArrow; -import net.minecraft.init.Enchantments; -import net.minecraft.init.Items; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.IItemPropertyGetter; -import net.minecraft.item.ItemArrow; -import net.minecraft.item.ItemBow; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.potion.PotionType; -import net.minecraft.stats.StatList; +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.EnumHand; +import net.minecraft.util.Hand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.MathHelper; @@ -42,7 +40,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; import java.util.Locale; -public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentientTool, IVariantProvider//, IMeshProvider +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}; @@ -59,7 +57,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien setCreativeTab(BloodMagic.TAB_BM); this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { + public float apply(ItemStack stack, World world, LivingEntity entityIn) { if (entityIn == null) { return 0.0F; } else { @@ -70,13 +68,13 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien }); this.addPropertyOverride(new ResourceLocation("pulling"), new IItemPropertyGetter() { @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, EntityLivingBase entityIn) { + 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, EntityLivingBase entityIn) { + public float apply(ItemStack stack, World world, LivingEntity entityIn) { return ((ItemSentientBow) RegistrarBloodMagicItems.SENTIENT_BOW).getCurrentType(stack).ordinal(); } }); @@ -87,7 +85,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } - public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { + public void recalculatePowers(ItemStack stack, World world, PlayerEntity player) { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); recalculatePowers(stack, type, soulsRemaining); @@ -129,7 +127,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { return EnumDemonWillType.DEFAULT; @@ -164,7 +162,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public void setDamageAdded(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble("damage", damage); } @@ -172,7 +170,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public double getDamageAdded(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble("damage"); } @@ -180,7 +178,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public void setVelocityOfArrow(ItemStack stack, float velocity) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setFloat("velocity", velocity); } @@ -188,7 +186,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public float getVelocityOfArrow(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (tag.hasKey("velocity")) { return tag.getFloat("velocity"); @@ -200,7 +198,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } @@ -208,14 +206,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public double getDrainOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } public void setDrainOfActivatedBow(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } @@ -223,14 +221,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public double getStaticDropOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } public void setStaticDropOfActivatedBow(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } @@ -238,20 +236,20 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien public double getDropOfActivatedBow(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } public void setDropOfActivatedBow(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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); @@ -262,14 +260,14 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien variants.put(0, "inventory"); } - public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) { + public ArrowEntity getArrowEntity(World world, ItemStack stack, LivingEntity target, LivingEntity user, float velocity) { EnumDemonWillType type = this.getCurrentType(stack); - double amount = user instanceof EntityPlayer ? (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)) : 0; + double amount = user instanceof PlayerEntity ? (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)) : 0; float newArrowVelocity = velocity * getVelocityOfArrow(stack); - double soulsRemaining = user instanceof EntityPlayer ? (PlayerDemonWillHandler.getTotalDemonWill(type, (EntityPlayer) user)) : 0; - EntitySentientArrow entityArrow = new EntitySentientArrow(world, user, type, amount, getLevel(soulsRemaining), (PotionType) null); + 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; @@ -300,47 +298,47 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien entityArrow.setFire(100); } - entityArrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; + entityArrow.pickupStatus = AbstractArrowEntity.PickupStatus.CREATIVE_ONLY; return entityArrow; } - public EntitySentientArrow getDuplicateArrow(ItemStack bowStack, World world, EntityPlayer player, double reimburseMultiplier) { + public EntitySentientArrow getDuplicateArrow(ItemStack bowStack, World world, PlayerEntity player, double reimburseMultiplier) { EnumDemonWillType willType = this.getCurrentType(bowStack); ItemStack arrow = this.getFiredArrow(player); - ItemArrow itemarrow = ((ItemArrow) (arrow.getItem() instanceof ItemArrow ? arrow.getItem() : Items.ARROW)); + 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), (PotionType) null); + 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 PotionType(new PotionEffect(MobEffects.GLOWING, 200, 0))); + 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(StatList.getObjectUseStats(this)); + player.addStat(Stats.getObjectUseStats(this)); return entityArrow; } @Override - public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase entityLiving, int timeLeft) { - if (entityLiving instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entityLiving; + 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, (EntityPlayer) entityLiving, i, itemstack != null || flag); + i = net.minecraftforge.event.ForgeEventFactory.onArrowLoose(stack, world, (PlayerEntity) entityLiving, i, itemstack != null || flag); if (i < 0) return; @@ -358,8 +356,8 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien this.recalculatePowers(stack, world, player); EnumDemonWillType type = this.getCurrentType(stack); - ItemArrow itemarrow = ((ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW)); - EntityArrow entityArrow; + 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); @@ -368,13 +366,13 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien 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), (PotionType) null); + 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 PotionType(new PotionEffect(MobEffects.GLOWING, 200, 0))); + 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)); @@ -407,7 +405,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien stack.damageItem(1, player); if (flag1) { - entityArrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; + entityArrow.pickupStatus = AbstractArrowEntity.PickupStatus.CREATIVE_ONLY; } world.spawnEntity(entityArrow); @@ -423,17 +421,17 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } } - player.addStat(StatList.getObjectUseStats(this)); + player.addStat(Stats.getObjectUseStats(this)); } } } } - protected ItemStack getFiredArrow(EntityPlayer player) { - if (this.isArrow(player.getHeldItem(EnumHand.OFF_HAND))) { - return player.getHeldItem(EnumHand.OFF_HAND); - } else if (this.isArrow(player.getHeldItem(EnumHand.MAIN_HAND))) { - return player.getHeldItem(EnumHand.MAIN_HAND); + 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); @@ -448,7 +446,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -465,7 +463,7 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien specterEntity.setPosition(player.posX, player.posY, player.posZ); world.spawnEntity(specterEntity); - specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); + specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); specterEntity.setType(this.getCurrentType(droppedStack)); specterEntity.setOwner(player); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index 47f3491e..a2714804 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -17,25 +17,25 @@ 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.state.IBlockState; +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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.monster.SlimeEntity; import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemPickaxe; +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.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.world.EnumDifficulty; +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; @@ -43,7 +43,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.*; import java.util.function.Consumer; -public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { +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}; @@ -80,7 +80,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public float getDestroySpeed(ItemStack stack, IBlockState state) { + public float getDestroySpeed(ItemStack stack, BlockState state) { float value = super.getDestroySpeed(stack, state); if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); @@ -89,7 +89,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } } - public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { + 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); @@ -166,10 +166,10 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer attacker) { + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, LivingEntity target, PlayerEntity attacker) { switch (type) { case CORROSIVE: - target.addPotionEffect(new PotionEffect(MobEffects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); + target.addPotionEffect(new EffectInstance(Effects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); break; case DEFAULT: break; @@ -178,7 +178,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon case STEADFAST: if (!target.isEntityAlive()) { float absorption = attacker.getAbsorptionAmount(); - attacker.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, absorptionTime[willBracket], 127)); + attacker.addPotionEffect(new EffectInstance(Effects.ABSORPTION, absorptionTime[willBracket], 127)); attacker.setAbsorptionAmount((float) Math.min(absorption + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); } break; @@ -188,10 +188,10 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { if (super.hitEntity(stack, target, attacker)) { - if (attacker instanceof EntityPlayer) { - EntityPlayer attackerPlayer = (EntityPlayer) 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); @@ -199,7 +199,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon applyEffectToEntity(type, willBracket, target, attackerPlayer); - ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); + ItemStack offStack = attackerPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND); if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); if (provider.providesEffectForWill(type)) { @@ -218,7 +218,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { return EnumDemonWillType.DEFAULT; @@ -230,13 +230,13 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { recalculatePowers(player.getHeldItem(hand), world, player); return super.onItemRightClick(world, player, hand); } @@ -268,7 +268,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { + public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) { recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); @@ -299,14 +299,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon } @Override - public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { + public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) { List soulList = new ArrayList<>(); - if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { + if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } - double willModifier = killedEntity instanceof EntitySlime ? 0.67 : 1; + double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); @@ -324,9 +324,9 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon //TODO: Change attack speed. @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { + public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.MAINHAND) { + 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)); @@ -339,14 +339,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public double getDamageOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); } public void setDamageOfActivatedSword(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } @@ -354,14 +354,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public double getDrainOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } public void setDrainOfActivatedSword(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } @@ -369,14 +369,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public double getStaticDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } @@ -384,14 +384,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public double getDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } public void setDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } @@ -399,14 +399,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public double getHealthBonusOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } public void setHealthBonusOfSword(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } @@ -414,14 +414,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public double getAttackSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); } public void setAttackSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } @@ -429,14 +429,14 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public double getSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); } public void setSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } @@ -444,20 +444,20 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon public double getDigSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); } public void setDigSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -474,7 +474,7 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon specterEntity.setPosition(player.posX, player.posY, player.posZ); world.spawnEntity(specterEntity); - specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); + specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); specterEntity.setType(this.getCurrentType(droppedStack)); specterEntity.setOwner(player); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index 644b0b9e..5bb7104f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -17,25 +17,25 @@ 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.state.IBlockState; +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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.monster.SlimeEntity; import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemSpade; +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.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.world.EnumDifficulty; +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; @@ -43,7 +43,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.*; import java.util.function.Consumer; -public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { +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}; @@ -80,7 +80,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public float getDestroySpeed(ItemStack stack, IBlockState state) { + public float getDestroySpeed(ItemStack stack, BlockState state) { float value = super.getDestroySpeed(stack, state); if (value > 1) { return (float) (value + getDigSpeedOfSword(stack)); @@ -89,7 +89,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } } - public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { + 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); @@ -166,10 +166,10 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer attacker) { + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, LivingEntity target, PlayerEntity attacker) { switch (type) { case CORROSIVE: - target.addPotionEffect(new PotionEffect(MobEffects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); + target.addPotionEffect(new EffectInstance(Effects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); break; case DEFAULT: break; @@ -178,7 +178,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I case STEADFAST: if (!target.isEntityAlive()) { float absorption = attacker.getAbsorptionAmount(); - attacker.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, absorptionTime[willBracket], 127)); + attacker.addPotionEffect(new EffectInstance(Effects.ABSORPTION, absorptionTime[willBracket], 127)); attacker.setAbsorptionAmount((float) Math.min(absorption + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); } break; @@ -188,10 +188,10 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { if (super.hitEntity(stack, target, attacker)) { - if (attacker instanceof EntityPlayer) { - EntityPlayer attackerPlayer = (EntityPlayer) 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); @@ -199,7 +199,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I applyEffectToEntity(type, willBracket, target, attackerPlayer); - ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); + ItemStack offStack = attackerPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND); if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); if (provider.providesEffectForWill(type)) { @@ -218,7 +218,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { return EnumDemonWillType.DEFAULT; @@ -230,13 +230,13 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { recalculatePowers(player.getHeldItem(hand), world, player); return super.onItemRightClick(world, player, hand); @@ -269,7 +269,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { + public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) { recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); @@ -300,14 +300,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I } @Override - public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { + public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) { List soulList = new ArrayList<>(); - if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { + if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } - double willModifier = killedEntity instanceof EntitySlime ? 0.67 : 1; + double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); @@ -325,9 +325,9 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I //TODO: Change attack speed. @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { + public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.MAINHAND) { + 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)); @@ -340,14 +340,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public double getDamageOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); } public void setDamageOfActivatedSword(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } @@ -355,14 +355,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public double getDrainOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } public void setDrainOfActivatedSword(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } @@ -370,14 +370,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public double getStaticDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } @@ -385,14 +385,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public double getDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } public void setDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } @@ -400,14 +400,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public double getHealthBonusOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } public void setHealthBonusOfSword(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } @@ -415,14 +415,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public double getAttackSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); } public void setAttackSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } @@ -430,14 +430,14 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public double getSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); } public void setSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } @@ -445,20 +445,20 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I public double getDigSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); } public void setDigSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -475,7 +475,7 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I specterEntity.setPosition(player.posX, player.posY, player.posZ); world.spawnEntity(specterEntity); - specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); + specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); specterEntity.setType(this.getCurrentType(droppedStack)); specterEntity.setOwner(player); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 3f932d34..befbfd10 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -20,21 +20,21 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.monster.SlimeEntity; import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; +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.ItemSword; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +import net.minecraft.item.SwordItem; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.world.EnumDifficulty; +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; @@ -42,7 +42,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.*; import java.util.function.Consumer; -public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { +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}; @@ -77,7 +77,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); } - public void recalculatePowers(ItemStack stack, World world, EntityPlayer player) { + public void recalculatePowers(ItemStack stack, World world, PlayerEntity player) { EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); recalculatePowers(stack, type, soulsRemaining); @@ -148,10 +148,10 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityLivingBase attacker) { + 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])); + target.addPotionEffect(new EffectInstance(Effects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); break; case DEFAULT: break; @@ -160,7 +160,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM case STEADFAST: if (!target.isEntityAlive()) { float absorption = attacker.getAbsorptionAmount(); - attacker.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, absorptionTime[willBracket], 127)); + attacker.addPotionEffect(new EffectInstance(Effects.ABSORPTION, absorptionTime[willBracket], 127)); attacker.setAbsorptionAmount((float) Math.min(absorption + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); } break; @@ -170,10 +170,10 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { if (super.hitEntity(stack, target, attacker)) { - if (attacker instanceof EntityPlayer) { - EntityPlayer attackerPlayer = (EntityPlayer) 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); @@ -181,7 +181,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM applyEffectToEntity(type, willBracket, target, attackerPlayer); - ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); + ItemStack offStack = attackerPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND); if (offStack.getItem() instanceof ISentientSwordEffectProvider) { ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); if (provider.providesEffectForWill(type)) { @@ -200,7 +200,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public EnumDemonWillType getCurrentType(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { return EnumDemonWillType.DEFAULT; @@ -212,13 +212,13 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public void setCurrentType(ItemStack stack, EnumDemonWillType type) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { recalculatePowers(player.getHeldItem(hand), world, player); return super.onItemRightClick(world, player, hand); } @@ -250,7 +250,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { + public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) { recalculatePowers(stack, player.getEntityWorld(), player); double drain = this.getDrainOfActivatedSword(stack); @@ -281,14 +281,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } @Override - public List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting) { + public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) { List soulList = new ArrayList<>(); - if (killedEntity.getEntityWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(killedEntity instanceof IMob)) { + if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) { return soulList; } - double willModifier = killedEntity instanceof EntitySlime ? 0.67 : 1; + double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); @@ -306,9 +306,9 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM //TODO: Change attack speed. @Override - public Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { + public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { Multimap multimap = HashMultimap.create(); - if (slot == EntityEquipmentSlot.MAINHAND) { + 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)); @@ -321,14 +321,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public double getDamageOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); } public void setDamageOfActivatedSword(ItemStack stack, double damage) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } @@ -336,14 +336,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public double getDrainOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); } public void setDrainOfActivatedSword(ItemStack stack, double drain) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } @@ -351,14 +351,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public double getStaticDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); } public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } @@ -366,14 +366,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public double getDropOfActivatedSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); } public void setDropOfActivatedSword(ItemStack stack, double drop) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } @@ -381,14 +381,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public double getHealthBonusOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); } public void setHealthBonusOfSword(ItemStack stack, double hp) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } @@ -396,14 +396,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public double getAttackSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); } public void setAttackSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } @@ -411,20 +411,20 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public double getSpeedOfSword(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); } public void setSpeedOfSword(ItemStack stack, double speed) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, EntityPlayer player) { + public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { World world = player.getEntityWorld(); if (!world.isRemote) { this.recalculatePowers(droppedStack, world, player); @@ -441,7 +441,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM specterEntity.setPosition(player.posX, player.posY, player.posZ); world.spawnEntity(specterEntity); - specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, droppedStack.copy()); + specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); specterEntity.setType(this.getCurrentType(droppedStack)); specterEntity.setOwner(player); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index 62948034..2df52e4f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -13,15 +13,14 @@ 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.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; +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.NBTTagCompound; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; +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; @@ -49,7 +48,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + 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); @@ -57,7 +56,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I double filled = PlayerDemonWillHandler.addDemonWill(type, player, drain, stack); this.drainWill(type, stack, filled, true); - return new ActionResult<>(EnumActionResult.PASS, stack); + return new ActionResult<>(ActionResultType.PASS, stack); } @Override @@ -78,7 +77,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I } @Override - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; @@ -166,7 +165,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I return 0; } - NBTTagCompound tag = soulGemStack.getTagCompound(); + CompoundNBT tag = soulGemStack.getTagCompound(); return tag.getDouble(Constants.NBT.SOULS); } @@ -175,7 +174,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I public void setWill(EnumDemonWillType type, ItemStack soulGemStack, double souls) { setCurrentType(type, soulGemStack); - NBTTagCompound tag = soulGemStack.getTagCompound(); + CompoundNBT tag = soulGemStack.getTagCompound(); tag.setDouble(Constants.NBT.SOULS, souls); } @@ -223,7 +222,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I public EnumDemonWillType getCurrentType(ItemStack soulGemStack) { NBTHelper.checkNBT(soulGemStack); - NBTTagCompound tag = soulGemStack.getTagCompound(); + CompoundNBT tag = soulGemStack.getTagCompound(); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { return EnumDemonWillType.DEFAULT; @@ -235,7 +234,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I public void setCurrentType(EnumDemonWillType type, ItemStack soulGemStack) { NBTHelper.checkNBT(soulGemStack); - NBTTagCompound tag = soulGemStack.getTagCompound(); + CompoundNBT tag = soulGemStack.getTagCompound(); if (type == EnumDemonWillType.DEFAULT) { if (tag.hasKey(Constants.NBT.WILL_TYPE)) { diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java index c9483d33..83ee8e05 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java @@ -6,9 +6,9 @@ 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.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.SoundEvents; +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.*; @@ -33,7 +33,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider { } @Override - public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { + public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand hand) { ItemStack stack = playerIn.getHeldItem(hand); if (!playerIn.capabilities.isCreativeMode) { stack.shrink(1); @@ -47,7 +47,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider { worldIn.spawnEntity(snare); } - return new ActionResult<>(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(ActionResultType.SUCCESS, stack); } @Override @@ -57,7 +57,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider { @Override @SideOnly(Side.CLIENT) - public void getSubItems(CreativeTabs creativeTab, NonNullList list) { + public void getSubItems(ItemGroup creativeTab, NonNullList list) { if (!isInCreativeTab(creativeTab)) return; diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java index b16fe78a..42a33ceb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java @@ -12,14 +12,14 @@ import javax.vecmath.Vector3d; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.MobEffects; +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.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumHand; +import net.minecraft.util.Hand; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -33,9 +33,9 @@ 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(); + 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() { @@ -60,7 +60,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (!world.isRemote) { @@ -83,7 +83,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Override - public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, EnumHand hand) { + public boolean itemInteractionForEntity(ItemStack stack, PlayerEntity player, LivingEntity entity, Hand hand) { if (entity.world.isRemote) { return false; } @@ -94,7 +94,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr //TODO: Release entity completely? removeEntity(player, entity); } else { - EntityLivingBase heldEntity = getHeldEntity(player); + LivingEntity heldEntity = getHeldEntity(player); if (heldEntity != null && heldEntity.equals(entity)) { heldEntityMap.remove(player); } else { @@ -107,7 +107,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr @Override public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { - if (!world.isRemote && entity instanceof EntityPlayerMP && getActivated(stack)) { + if (!world.isRemote && entity instanceof ServerPlayerEntity && getActivated(stack)) { if (entity.ticksExisted % 20 == 0) { double drainNeeded = getBreathCostPerSecond(stack); if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) { @@ -117,23 +117,23 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } } - onEffectUpdate(stack, world, (EntityPlayer) entity, itemSlot, isSelected); + onEffectUpdate(stack, world, (PlayerEntity) entity, itemSlot, isSelected); } if (!world.isRemote) { - if (entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entity; + if (entity instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) entity; updateHeldEntityPosition(player); if (floatMap.containsKey(player)) { - Map entityMap = floatMap.get(player); + Map entityMap = floatMap.get(player); if (entityMap == null) { return; } - List removalList = new ArrayList(); + List removalList = new ArrayList(); - for (Entry entry : entityMap.entrySet()) { - EntityLivingBase floatingEntity = entry.getKey(); + for (Entry entry : entityMap.entrySet()) { + LivingEntity floatingEntity = entry.getKey(); if (floatingEntity == null || floatingEntity.isDead || floatingEntity.dimension != player.dimension) { removalList.add(floatingEntity); } @@ -141,7 +141,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr followOwner(player, floatingEntity, entry.getValue()); } - for (EntityLivingBase livingEntity : removalList) { + for (LivingEntity livingEntity : removalList) { entityMap.remove(livingEntity); } @@ -154,14 +154,14 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } } - public static boolean updateEntityOffset(EntityPlayer player, EntityLivingBase living, Vector3d updatedOffset) { + 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); + Map entityMap = floatMap.get(player); entityMap.put(living, updatedOffset); return true; } else { - Map entityMap = new HashMap(); + Map entityMap = new HashMap(); entityMap.put(living, updatedOffset); floatMap.put(player, entityMap); return true; @@ -169,7 +169,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } @Nullable - public static EntityLivingBase getHeldEntity(EntityPlayer player) { + public static LivingEntity getHeldEntity(PlayerEntity player) { if (heldEntityMap.containsKey(player)) { return heldEntityMap.get(player); } @@ -177,7 +177,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr return null; } - public static double getHeldEntityOffset(EntityPlayer player) { + public static double getHeldEntityOffset(PlayerEntity player) { if (heldEntityMap.containsKey(player)) { return heldEntityOffsetMap.get(player); } @@ -185,7 +185,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr return 1; } - public static void holdEntity(EntityPlayer player, EntityLivingBase entityLiving) { + public static void holdEntity(PlayerEntity player, LivingEntity entityLiving) { float distance = player.getDistance(entityLiving); Vec3d lookVec = player.getLookVec(); heldEntityMap.put(player, entityLiving); @@ -193,8 +193,8 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr updateEntityOffset(player, entityLiving, new Vector3d(lookVec.x * distance, lookVec.y * distance, lookVec.z * distance)); } - public static void updateHeldEntityPosition(EntityPlayer player) { - EntityLivingBase entityLiving = getHeldEntity(player); + public static void updateHeldEntityPosition(PlayerEntity player) { + LivingEntity entityLiving = getHeldEntity(player); if (entityLiving != null) { double offset = getHeldEntityOffset(player); Vec3d lookVec = player.getLookVec(); @@ -202,13 +202,13 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } } - public static void removeEntity(EntityPlayer player, EntityLivingBase living) { + public static void removeEntity(PlayerEntity player, LivingEntity living) { if (living == null) { return; } if (floatMap.containsKey(player)) { - Map entityMap = floatMap.get(player); + Map entityMap = floatMap.get(player); if (entityMap.containsKey(living)) { entityMap.remove(living); } @@ -219,7 +219,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr } } - public void followOwner(EntityPlayer owner, EntityLivingBase livingEntity, Vector3d offset) { + public void followOwner(PlayerEntity owner, LivingEntity livingEntity, Vector3d offset) { double offsetX = offset.x; double offsetY = offset.y; double offsetZ = offset.z; @@ -228,7 +228,7 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr double speed = Math.max(ownerSpeed * 20, 2); //May just want to call it a day and set this to "2" - livingEntity.addPotionEffect(new PotionEffect(MobEffects.LEVITATION, 20, 0, false, true)); + livingEntity.addPotionEffect(new EffectInstance(Effects.LEVITATION, 20, 0, false, true)); double wantedX = owner.posX + offsetX; double wantedY = owner.posY + offsetY; @@ -247,8 +247,8 @@ public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshPr livingEntity.setVelocity(vec.x * speed, vec.y * speed, vec.z * speed); } - public void onEffectUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) { - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FLIGHT, 2, 0)); + public void onEffectUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { + player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.FLIGHT, 2, 0)); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java index 43c3b3ed..de5180bf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java @@ -2,21 +2,21 @@ package WayofTime.bloodmagic.item.soulBreath; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +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) { - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getDouble(Constants.NBT.BREATH); } @Override public void setBreath(ItemStack stack, double amount) { - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setDouble(Constants.NBT.BREATH, amount); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/ILivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/ILivingArmour.java index af259cb3..414a920d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/ILivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/ILivingArmour.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.livingArmour; import com.google.common.collect.Multimap; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; /** @@ -14,13 +14,13 @@ import net.minecraft.world.World; public interface ILivingArmour { Multimap getAttributeModifiers(); - boolean canApplyUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade); + boolean canApplyUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade); - boolean upgradeArmour(EntityPlayer user, LivingArmourUpgrade upgrade); + boolean upgradeArmour(PlayerEntity user, LivingArmourUpgrade upgrade); - boolean removeUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade); + boolean removeUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade); - void notifyPlayerOfUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade); + void notifyPlayerOfUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade); /** * Ticks the upgrades and stat trackers, passing in the world and player as @@ -29,11 +29,11 @@ public interface ILivingArmour { * @param world - The World * @param player - The player wearing the Armour */ - void onTick(World world, EntityPlayer player); + void onTick(World world, PlayerEntity player); - void readFromNBT(NBTTagCompound tag); + void readFromNBT(CompoundNBT tag); - void writeToNBT(NBTTagCompound tag, boolean forceWrite); + void writeToNBT(CompoundNBT tag, boolean forceWrite); /** * Writes the LivingArmour to the NBTTag. This will only write the trackers @@ -41,7 +41,7 @@ public interface ILivingArmour { * * @param tag - The NBT tag to write to */ - void writeDirtyToNBT(NBTTagCompound tag); + void writeDirtyToNBT(CompoundNBT tag); - void writeToNBT(NBTTagCompound 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 index ab2fe989..8144dbfd 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -5,14 +5,14 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.text.TextComponentString; +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; @@ -33,7 +33,7 @@ public class LivingArmour implements ILivingArmour { return trackerMap.get(key); } - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + 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); @@ -42,7 +42,7 @@ public class LivingArmour implements ILivingArmour { return total; } - public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + public double getKnockbackOnHit(PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { double total = 0; for (Entry entry : upgradeMap.entrySet()) { total += entry.getValue().getKnockbackOnHit(wearer, hitEntity, weapon); @@ -74,7 +74,7 @@ public class LivingArmour implements ILivingArmour { } @Override - public boolean upgradeArmour(EntityPlayer user, LivingArmourUpgrade upgrade) { + 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 @@ -112,7 +112,7 @@ public class LivingArmour implements ILivingArmour { } @Override - public boolean canApplyUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) { + 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 @@ -136,8 +136,8 @@ public class LivingArmour implements ILivingArmour { } @Override - public void notifyPlayerOfUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) { - user.sendStatusMessage(new TextComponentString(TextHelper.localizeEffect(chatBase + "newUpgrade")), true); + public void notifyPlayerOfUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade) { + user.sendStatusMessage(new StringTextComponent(TextHelper.localizeEffect(chatBase + "newUpgrade")), true); } /** @@ -148,7 +148,7 @@ public class LivingArmour implements ILivingArmour { * @param player */ @Override - public void onTick(World world, EntityPlayer player) { + public void onTick(World world, PlayerEntity player) { for (Entry entry : upgradeMap.entrySet()) { LivingArmourUpgrade upgrade = entry.getValue(); @@ -211,16 +211,16 @@ public class LivingArmour implements ILivingArmour { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { maxUpgradePoints = Math.max(100, tag.getInteger("maxUpgradePoints")); - NBTTagList upgradeTags = tag.getTagList("upgrades", 10); + ListNBT upgradeTags = tag.getTagList("upgrades", 10); if (upgradeTags != null) { for (int i = 0; i < upgradeTags.tagCount(); i++) { - NBTTagCompound upgradeTag = upgradeTags.getCompoundTagAt(i); + CompoundNBT upgradeTag = upgradeTags.getCompoundTagAt(i); String key = upgradeTag.getString("key"); int level = upgradeTag.getInteger("level"); - NBTTagCompound nbtTag = upgradeTag.getCompoundTag("upgrade"); + CompoundNBT nbtTag = upgradeTag.getCompoundTag("upgrade"); LivingArmourUpgrade upgrade = LivingArmourHandler.generateUpgradeFromKey(key, level, nbtTag); if (upgrade != null) { upgradeMap.put(key, upgrade); @@ -238,7 +238,7 @@ public class LivingArmour implements ILivingArmour { } StatTracker tracker = (StatTracker) obj; String key = tracker.getUniqueIdentifier(); - NBTTagCompound trackerTag = tag.getCompoundTag(key); + CompoundNBT trackerTag = tag.getCompoundTag(key); if (!trackerTag.isEmpty()) { tracker.readFromNBT(trackerTag); } @@ -250,16 +250,16 @@ public class LivingArmour implements ILivingArmour { } @Override - public void writeToNBT(NBTTagCompound tag, boolean forceWrite) { + public void writeToNBT(CompoundNBT tag, boolean forceWrite) { tag.setInteger("maxUpgradePoints", maxUpgradePoints); - NBTTagList tags = new NBTTagList(); + ListNBT tags = new ListNBT(); for (Entry entry : upgradeMap.entrySet()) { - NBTTagCompound upgradeTag = new NBTTagCompound(); + CompoundNBT upgradeTag = new CompoundNBT(); LivingArmourUpgrade upgrade = entry.getValue(); - NBTTagCompound nbtTag = new NBTTagCompound(); + CompoundNBT nbtTag = new CompoundNBT(); upgrade.writeToNBT(nbtTag); upgradeTag.setString("key", upgrade.getUniqueIdentifier()); @@ -281,7 +281,7 @@ public class LivingArmour implements ILivingArmour { String key = tracker.getUniqueIdentifier(); if (forceWrite || tracker.isDirty()) { - NBTTagCompound trackerTag = new NBTTagCompound(); + CompoundNBT trackerTag = new CompoundNBT(); tracker.writeToNBT(trackerTag); tag.setTag(key, trackerTag); @@ -298,17 +298,17 @@ public class LivingArmour implements ILivingArmour { * @param tag */ @Override - public void writeDirtyToNBT(NBTTagCompound tag) { + public void writeDirtyToNBT(CompoundNBT tag) { writeToNBT(tag, false); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { writeToNBT(tag, true); } @Override - public boolean removeUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade) { + public boolean removeUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade) { String key = upgrade.getUniqueIdentifier(); if (upgradeMap.containsKey(key)) { upgradeMap.remove(key); @@ -319,9 +319,9 @@ public class LivingArmour implements ILivingArmour { return false; } - public static boolean hasFullSet(EntityPlayer player) { - for (EntityEquipmentSlot slot : EntityEquipmentSlot.values()) { - if (slot.getSlotType() != EntityEquipmentSlot.Type.ARMOR) { + public static boolean hasFullSet(PlayerEntity player) { + for (EquipmentSlotType slot : EquipmentSlotType.values()) { + if (slot.getSlotType() != EquipmentSlotType.Type.ARMOR) { continue; } ItemStack slotStack = player.getItemStackFromSlot(slot); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java index c15afafb..6fbb06ca 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour; import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import java.lang.reflect.Constructor; import java.util.ArrayList; @@ -45,7 +45,7 @@ public class LivingArmourHandler { return generateUpgradeFromKey(key, level, null); } - public static LivingArmourUpgrade generateUpgradeFromKey(String key, int level, NBTTagCompound tag) { + public static LivingArmourUpgrade generateUpgradeFromKey(String key, int level, CompoundNBT tag) { Constructor ctor = upgradeConstructorMap.get(key); if (ctor != null) { try { diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java index 41cfb72e..46a13263 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.livingArmour; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.DamageSource; import net.minecraft.world.World; @@ -31,11 +31,11 @@ public abstract class LivingArmourUpgrade { this.level = Math.min(level, getMaxTier() - 1); } - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { return 0; } - public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + public double getKnockbackOnHit(PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { return 0; } @@ -45,7 +45,7 @@ public abstract class LivingArmourUpgrade { * * @return 0 for no damage blocked, 1 for full damage blocked */ - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { + public double getArmourProtection(LivingEntity wearer, DamageSource source) { return 0; } @@ -61,20 +61,20 @@ public abstract class LivingArmourUpgrade { public abstract int getCostOfUpgrade(); - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } public Multimap getAttributeModifiers() { return HashMultimap.create(); } - public double getMiningSpeedModifier(EntityPlayer player) { + public double getMiningSpeedModifier(PlayerEntity player) { return 1; } - public abstract void writeToNBT(NBTTagCompound tag); + public abstract void writeToNBT(CompoundNBT tag); - public abstract void readFromNBT(NBTTagCompound tag); + public abstract void readFromNBT(CompoundNBT tag); public int getRunicShielding() { return 0; diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java b/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java index c9d4d182..02f5f971 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.livingArmour; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.List; @@ -17,9 +17,9 @@ public abstract class StatTracker { */ public abstract void resetTracker(); - public abstract void readFromNBT(NBTTagCompound tag); + public abstract void readFromNBT(CompoundNBT tag); - public abstract void writeToNBT(NBTTagCompound tag); + public abstract void writeToNBT(CompoundNBT tag); /** * Called each tick to update the tracker's information. Called in @@ -30,9 +30,9 @@ public abstract class StatTracker { * @param livingArmour The equipped LivingArmour * @return True if there is a new upgrade unlocked this tick. */ - public abstract boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour); + public abstract boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour); - public abstract void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour); + public abstract void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour); public abstract List getUpgrades(); diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java index e7aec23e..37c20df3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeBattleHungry extends LivingArmourUpgrade { @@ -23,7 +23,7 @@ public class LivingArmourUpgradeBattleHungry extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { if (timer > 0) { timer--; return; @@ -50,12 +50,12 @@ public class LivingArmourUpgradeBattleHungry extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger("timer", timer); } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { timer = tag.getInteger("timer"); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java index 0467e0a7..8a01bc0b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeCrippledArm extends LivingArmourUpgrade { @@ -15,7 +15,7 @@ public class LivingArmourUpgradeCrippledArm extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -35,11 +35,11 @@ public class LivingArmourUpgradeCrippledArm extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java index 69d041ee..e3b250e3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.HashMap; @@ -19,12 +19,12 @@ public class LivingArmourUpgradeDigSlowdown extends LivingArmourUpgrade { } @Override - public double getMiningSpeedModifier(EntityPlayer player) { + public double getMiningSpeedModifier(PlayerEntity player) { return digSpeedModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -44,12 +44,12 @@ public class LivingArmourUpgradeDigSlowdown extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java index 25daaaf4..1c8fe54d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeDisoriented extends LivingArmourUpgrade { @@ -16,7 +16,7 @@ public class LivingArmourUpgradeDisoriented extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + 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; @@ -44,11 +44,11 @@ public class LivingArmourUpgradeDisoriented extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java index 0e59b0ba..cbccbfde 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java @@ -7,8 +7,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import org.apache.commons.codec.binary.StringUtils; @@ -23,7 +23,7 @@ public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -53,12 +53,12 @@ public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java index 1294fe29..edf6dc1c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeQuenched extends LivingArmourUpgrade { @@ -15,7 +15,7 @@ public class LivingArmourUpgradeQuenched extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -35,11 +35,11 @@ public class LivingArmourUpgradeQuenched extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java index 413eac26..3d694dbf 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -17,7 +17,7 @@ public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { if (world.isRemote && player.onGround) { // if (player.moveForward == 0) { @@ -72,11 +72,11 @@ public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java index f7d0c6ba..ac3fb774 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeSlowHeal extends LivingArmourUpgrade { @@ -21,7 +21,7 @@ public class LivingArmourUpgradeSlowHeal extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -41,12 +41,12 @@ public class LivingArmourUpgradeSlowHeal extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java index a36c48b3..75d40db8 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java @@ -7,8 +7,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import org.apache.commons.codec.binary.StringUtils; @@ -33,7 +33,7 @@ public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -53,11 +53,11 @@ public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java index 61252106..464c408b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.downgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeStormTrooper extends LivingArmourUpgrade { @@ -16,11 +16,11 @@ public class LivingArmourUpgradeStormTrooper extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } - public float getArrowJiggle(EntityPlayer player) { + public float getArrowJiggle(PlayerEntity player) { return inaccuracy[this.level]; } @@ -40,11 +40,11 @@ public class LivingArmourUpgradeStormTrooper extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java index 51671858..65f9706f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerArrowProtect extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.arrowProtect"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.arrowProtect", totalDamage); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerArrowProtect extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java index ed0e225d..1b9550f5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerArrowShot extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalShots = tag.getInteger(BloodMagic.MODID + ".tracker.trickShot"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.trickShot", totalShots); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { int change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerArrowShot extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java index fef5ed19..9096e539 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerCriticalStrike extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.criticalStrike"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.criticalStrike", totalDamageDealt); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerCriticalStrike extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java index c04c1951..9b407907 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerDigging extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalBlocksDug = tag.getInteger(BloodMagic.MODID + ".tracker.digging"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.digging", totalBlocksDug); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { int change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerDigging extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java index 379d3631..09f2c95e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerExperience extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalExperienceGained = tag.getDouble(BloodMagic.MODID + ".tracker.experienced"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.experienced", totalExperienceGained); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerExperience extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java index 76f6248d..481a91f0 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerFallProtect extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.fallProtect"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.fallProtect", totalDamage); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerFallProtect extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java index c6e467d1..fcbcd93c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -28,17 +28,17 @@ public class StatTrackerFireResist extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalFireTicks = tag.getInteger(BloodMagic.MODID + ".tracker.fire"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.fire", totalFireTicks); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (player.isBurning()) { totalFireTicks++; this.markDirty(); @@ -49,7 +49,7 @@ public class StatTrackerFireResist extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java index b00fbb71..757de371 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; public class StatTrackerFood extends StatTracker { - public static Map lastFoodEatenMap = new HashMap<>(); + public static Map lastFoodEatenMap = new HashMap<>(); public static int[] foodRequired = new int[]{100, 200, 300, 500, 1000}; @@ -33,18 +33,18 @@ public class StatTrackerFood extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { foodEaten = tag.getInteger(BloodMagic.MODID + ".tracker.foodEaten"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.foodEaten", foodEaten); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (!lastFoodEatenMap.containsKey(player)) { lastFoodEatenMap.put(player, 20); return false; @@ -66,7 +66,7 @@ public class StatTrackerFood extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (lastFoodEatenMap.containsKey(player)) { lastFoodEatenMap.remove(player); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java index 209a8316..0797ba9c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerGraveDigger extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.graveDigger"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.graveDigger", totalDamageDealt); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerGraveDigger extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java index 0234bbf2..9b2e087b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java @@ -7,8 +7,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -31,17 +31,17 @@ public class StatTrackerGrimReaperSprint extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDeaths = tag.getInteger(BloodMagic.MODID + ".tracker.grimReaper"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.grimReaper", totalDeaths); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -59,7 +59,7 @@ public class StatTrackerGrimReaperSprint extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java index 666cf88f..56aa43c5 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerHealthboost extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalHealthGenned = tag.getDouble(BloodMagic.MODID + ".tracker.health"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.health", totalHealthGenned); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerHealthboost extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java index d5214fa6..cd9ac778 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -31,18 +31,18 @@ public class StatTrackerJump extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalJumps = tag.getInteger(BloodMagic.MODID + ".tracker.jump"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.jump", totalJumps); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { int change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -60,7 +60,7 @@ public class StatTrackerJump extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java index a7172372..82b7ece1 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerMeleeDamage extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.meleeDamage"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.meleeDamage", totalDamageDealt); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerMeleeDamage extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java index 49a598d1..0b68e699 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -16,8 +16,8 @@ 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 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}; @@ -34,18 +34,18 @@ public class StatTrackerMovement extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalMovement = tag.getDouble(BloodMagic.MODID + ".tracker.movement"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.movement", totalMovement); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (!lastPosX.containsKey(player)) { lastPosX.put(player, player.posX); lastPosZ.put(player, player.posZ); @@ -76,7 +76,7 @@ public class StatTrackerMovement extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java index ca2a181b..12791b42 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java @@ -6,9 +6,9 @@ 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.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -34,19 +34,19 @@ public class StatTrackerNightSight extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.nightSight"); totalNightVision = tag.getInteger(BloodMagic.MODID + ".tracker.nightSightVision"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.nightSight", totalDamageDealt); tag.setInteger(BloodMagic.MODID + ".tracker.nightSightVision", totalNightVision); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { boolean test = false; if (changeMap.containsKey(livingArmour)) { @@ -60,7 +60,7 @@ public class StatTrackerNightSight extends StatTracker { } } - if (world.getLight(player.getPosition()) <= 9 && player.isPotionActive(MobEffects.NIGHT_VISION)) { + if (world.getLight(player.getPosition()) <= 9 && player.isPotionActive(Effects.NIGHT_VISION)) { totalNightVision++; test = true; } @@ -73,7 +73,7 @@ public class StatTrackerNightSight extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java index 7fca6648..e60c6788 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerPhysicalProtect extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.physicalProtect"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.physicalProtect", totalDamage); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerPhysicalProtect extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java index fb002e49..94c394d6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java @@ -6,9 +6,9 @@ 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.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -29,18 +29,18 @@ public class StatTrackerPoison extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalPoisonTicks = tag.getInteger(BloodMagic.MODID + ".tracker.poison"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.poison", totalPoisonTicks); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { - if (player.isPotionActive(MobEffects.POISON)) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { + if (player.isPotionActive(Effects.POISON)) { totalPoisonTicks++; this.markDirty(); return true; @@ -50,7 +50,7 @@ public class StatTrackerPoison extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java index 458b5eb6..981f349f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerRepairing extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamage = tag.getDouble(BloodMagic.MODID + ".tracker.repair"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.repair", totalDamage); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerRepairing extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java index 631ac1d2..d62f2f47 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -31,18 +31,18 @@ public class StatTrackerSelfSacrifice extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalSacrifices = tag.getInteger(BloodMagic.MODID + ".tracker.selfSacrifice"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.selfSacrifice", totalSacrifices); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { int change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -60,7 +60,7 @@ public class StatTrackerSelfSacrifice extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java index 29d656ac..87be975d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerSolarPowered extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalHealthGenned = tag.getDouble(BloodMagic.MODID + ".tracker.solarPowered"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.solarPowered", totalHealthGenned); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerSolarPowered extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java index 09d2f220..ae828d2e 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java @@ -6,8 +6,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -30,17 +30,17 @@ public class StatTrackerSprintAttack extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.sprintAttack"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.sprintAttack", totalDamageDealt); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { double change = Math.abs(changeMap.get(livingArmour)); if (change > 0) { @@ -58,7 +58,7 @@ public class StatTrackerSprintAttack extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (changeMap.containsKey(livingArmour)) { changeMap.remove(livingArmour); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java index 77ad3f12..657edb74 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java @@ -5,8 +5,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import java.util.ArrayList; @@ -15,8 +15,8 @@ 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 Map lastPosX = new HashMap<>(); + public static Map lastPosZ = new HashMap<>(); public static int blocksRequired = 1000; @@ -33,18 +33,18 @@ public class StatTrackerStepAssist extends StatTracker { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { totalMovement = tag.getDouble(BloodMagic.MODID + ".tracker.stepAssist"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setDouble(BloodMagic.MODID + ".tracker.stepAssist", totalMovement); } @Override - public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { if (!lastPosX.containsKey(player)) { lastPosX.put(player, player.posX); lastPosZ.put(player, player.posZ); @@ -76,7 +76,7 @@ public class StatTrackerStepAssist extends StatTracker { } @Override - public void onDeactivatedTick(World world, EntityPlayer player, LivingArmour livingArmour) { + public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java index 94ccca9a..994091cc 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.LivingEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.DamageSource; public class LivingArmourUpgradeArrowProtect extends LivingArmourUpgrade { @@ -15,7 +15,7 @@ public class LivingArmourUpgradeArrowProtect extends LivingArmourUpgrade { } @Override - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { + public double getArmourProtection(LivingEntity wearer, DamageSource source) { if (source.isProjectile()) { return protectionLevel[this.level]; } @@ -39,12 +39,12 @@ public class LivingArmourUpgradeArrowProtect extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java index a83e62ad..ca457179 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeArrowShot extends LivingArmourUpgrade { @@ -16,7 +16,7 @@ public class LivingArmourUpgradeArrowShot extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -36,12 +36,12 @@ public class LivingArmourUpgradeArrowShot extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java index 5f82954e..2254a320 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; +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; -import net.minecraft.nbt.NBTTagCompound; public class LivingArmourUpgradeCriticalStrike extends LivingArmourUpgrade { public static final int[] costs = new int[]{5, 12, 22, 35, 49}; @@ -17,8 +17,8 @@ public class LivingArmourUpgradeCriticalStrike extends LivingArmourUpgrade { } @Override - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { - boolean flag = wearer.fallDistance > 0.0F && !wearer.onGround && !wearer.isOnLadder() && !wearer.isInWater() && !wearer.isPotionActive(MobEffects.BLINDNESS) && !wearer.isRiding() && !wearer.isSprinting(); + 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; @@ -47,12 +47,12 @@ public class LivingArmourUpgradeCriticalStrike extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java index 8e977049..559fc941 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java @@ -4,10 +4,10 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.livingArmour.LivingArmour; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +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; @@ -24,17 +24,17 @@ public class LivingArmourUpgradeDigging extends LivingArmourUpgrade { } @Override - public double getMiningSpeedModifier(EntityPlayer player) { + public double getMiningSpeedModifier(PlayerEntity player) { return digSpeedModifier[this.level]; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + 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 PotionEffect(MobEffects.SPEED, digSpeedTime[this.level], digSpeedLevel[this.level], false, false)); + player.addPotionEffect(new EffectInstance(Effects.SPEED, digSpeedTime[this.level], digSpeedLevel[this.level], false, false)); } } } @@ -55,12 +55,12 @@ public class LivingArmourUpgradeDigging extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java index 9e1c4a3a..695df8f6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeElytra extends LivingArmourUpgrade { @@ -15,7 +15,7 @@ public class LivingArmourUpgradeElytra extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -35,12 +35,12 @@ public class LivingArmourUpgradeElytra extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java index e36e05bf..92719265 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.nbt.NBTTagCompound; +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}; @@ -32,12 +32,12 @@ public class LivingArmourUpgradeExperience extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java index 79368bdb..d831435c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java @@ -2,9 +2,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; +import net.minecraft.nbt.CompoundNBT; public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade { public static final int[] costs = new int[]{2, 5, 9, 15, 25}; @@ -35,12 +33,12 @@ public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java index 1e0a465c..827bc8c8 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java @@ -5,11 +5,11 @@ 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.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.text.TextComponentString; +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 { @@ -24,13 +24,13 @@ public class LivingArmourUpgradeFireResist extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { if (player.isBurning() && fireCooldown <= 0) { - player.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, fireResistDuration[this.level])); + player.addPotionEffect(new EffectInstance(Effects.FIRE_RESISTANCE, fireResistDuration[this.level])); fireCooldown = fireCooldownTime[this.level]; - player.sendStatusMessage(new TextComponentString(TextHelper.localizeEffect(chatBase + "fireRemove")), true); + player.sendStatusMessage(new StringTextComponent(TextHelper.localizeEffect(chatBase + "fireRemove")), true); } else if (fireCooldown > 0) { fireCooldown--; @@ -53,12 +53,12 @@ public class LivingArmourUpgradeFireResist extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(Constants.NBT.UPGRADE_FIRE_TIMER, fireCooldown); } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { fireCooldown = tag.getInteger(Constants.NBT.UPGRADE_FIRE_TIMER); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java index 1c1ec121..b3b984d2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemSpade; +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.NBTTagCompound; +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}; @@ -17,8 +17,8 @@ public class LivingArmourUpgradeGraveDigger extends LivingArmourUpgrade { } @Override - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { - if (!weapon.isEmpty() && weapon.getItem() instanceof ItemSpade) { + public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { + if (!weapon.isEmpty() && weapon.getItem() instanceof ShovelItem) { return getDamageModifier(); } @@ -45,12 +45,12 @@ public class LivingArmourUpgradeGraveDigger extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java index 92fba1a7..6e198169 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java @@ -4,11 +4,11 @@ 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.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.text.TextComponentString; +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 { @@ -27,7 +27,7 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { if (deathTimer > 0) { deathTimer--; } @@ -49,12 +49,12 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { deathTimer = tag.getInteger(BloodMagic.MODID + ".tracker.grimReaper"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.grimReaper", deathTimer); } @@ -63,24 +63,24 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade { return tooltipBase + "grimReaper"; } - public void applyEffectOnRebirth(EntityPlayer player) { + public void applyEffectOnRebirth(PlayerEntity player) { player.setHealth(player.getMaxHealth() * healthOnRevive[this.level]); int strDur = strengthDuration[this.level]; if (strDur > 0) { - player.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, strDur, strengthValue[this.level])); + player.addPotionEffect(new EffectInstance(Effects.STRENGTH, strDur, strengthValue[this.level])); } int resDur = resistanceDuration[this.level]; if (resDur > 0) { - player.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, resDur, resistanceValue[this.level])); + player.addPotionEffect(new EffectInstance(Effects.RESISTANCE, resDur, resistanceValue[this.level])); } deathTimer = rebirthDelay[this.level]; - player.sendStatusMessage(new TextComponentString(TextHelper.localizeEffect(chatBase + "grimReaper")), true); + player.sendStatusMessage(new StringTextComponent(TextHelper.localizeEffect(chatBase + "grimReaper")), true); } - public boolean canSavePlayer(EntityPlayer player) { + 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 index 4b3a82bf..3a1aaf13 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java @@ -7,8 +7,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import org.apache.commons.codec.binary.StringUtils; @@ -23,7 +23,7 @@ public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -53,12 +53,12 @@ public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java index 723ef2ab..3fc4e734 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeJump extends LivingArmourUpgrade { @@ -31,7 +31,7 @@ public class LivingArmourUpgradeJump extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { if (!world.isRemote) { double motionY = player.motionY; @@ -47,12 +47,12 @@ public class LivingArmourUpgradeJump extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java index 39a34a08..15914a0f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java @@ -6,7 +6,7 @@ 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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import org.apache.commons.codec.binary.StringUtils; import java.util.UUID; @@ -51,12 +51,12 @@ public class LivingArmourUpgradeKnockbackResist extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java index 7a4fc138..d08722fd 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java @@ -7,8 +7,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; import org.apache.commons.codec.binary.StringUtils; @@ -23,7 +23,7 @@ public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { } @@ -53,12 +53,12 @@ public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java index e18b3c1b..a33a241a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java @@ -1,15 +1,14 @@ 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 net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; +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.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; public class LivingArmourUpgradeNightSight extends LivingArmourUpgrade { @@ -23,21 +22,21 @@ public class LivingArmourUpgradeNightSight extends LivingArmourUpgrade { } @Override - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { return isActive ? meleeDamage[this.level] : 0; } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { if (world.getLight(player.getPosition(), false) <= 9) { isActive = true; - if (player.isPotionActive(MobEffects.NIGHT_VISION)) + if (player.isPotionActive(Effects.NIGHT_VISION)) return; - player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false)); + player.addPotionEffect(new EffectInstance(Effects.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false)); } else if (isActive) { isActive = false; - player.removePotionEffect(MobEffects.NIGHT_VISION); + player.removePotionEffect(Effects.NIGHT_VISION); } } @@ -57,12 +56,12 @@ public class LivingArmourUpgradeNightSight extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java index 52a60199..1b69b807 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.LivingEntity; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.DamageSource; public class LivingArmourUpgradePhysicalProtect extends LivingArmourUpgrade { @@ -15,7 +15,7 @@ public class LivingArmourUpgradePhysicalProtect extends LivingArmourUpgrade { } @Override - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { + public double getArmourProtection(LivingEntity wearer, DamageSource source) { if (source.getTrueSource() != null && !source.isMagicDamage() && !source.isProjectile()) { return protectionLevel[this.level]; } @@ -39,12 +39,12 @@ public class LivingArmourUpgradePhysicalProtect extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java index 08c75b19..23620d2a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java @@ -5,11 +5,11 @@ 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.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.text.TextComponentString; +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 { @@ -24,14 +24,14 @@ public class LivingArmourUpgradePoisonResist extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { - if (player.isPotionActive(MobEffects.POISON) && poisonCooldown <= 0) { - PotionEffect eff = player.getActivePotionEffect(MobEffects.POISON); + 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(MobEffects.POISON); + player.removePotionEffect(Effects.POISON); poisonCooldown = poisonCooldownTime[this.level]; - player.sendStatusMessage(new TextComponentString(TextHelper.localize(chatBase + "poisonRemove")), true); + player.sendStatusMessage(new StringTextComponent(TextHelper.localize(chatBase + "poisonRemove")), true); } } else if (poisonCooldown > 0) { poisonCooldown--; @@ -54,12 +54,12 @@ public class LivingArmourUpgradePoisonResist extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(Constants.NBT.UPGRADE_POISON_TIMER, poisonCooldown); } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { poisonCooldown = tag.getInteger(Constants.NBT.UPGRADE_POISON_TIMER); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java index d9d00733..71e0f1ff 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java @@ -3,10 +3,10 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade { @@ -22,11 +22,11 @@ public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { if (delay <= 0) { delay = repairDelay[this.level]; - EntityEquipmentSlot randomSlot = EntityEquipmentSlot.values()[2 + world.rand.nextInt(4)]; + EquipmentSlotType randomSlot = EquipmentSlotType.values()[2 + world.rand.nextInt(4)]; ItemStack repairStack = player.getItemStackFromSlot(randomSlot); if (!repairStack.isEmpty()) { if (repairStack.isItemStackDamageable() && repairStack.isItemDamaged()) { @@ -57,12 +57,12 @@ public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger("repairingDelay", delay); } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { delay = tag.getInteger("repairingDelay"); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java index 4b68bb79..997a72ab 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade { //TODO: Add extra effects for higher levels @@ -33,12 +33,12 @@ public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java index 114508d2..810a9673 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -3,11 +3,11 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.ILivingArmour; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +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; @@ -25,7 +25,7 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { } @Override - public double getArmourProtection(EntityLivingBase wearer, DamageSource source) { + public double getArmourProtection(LivingEntity wearer, DamageSource source) { if (wearer.getEntityWorld().canSeeSky(wearer.getPosition()) && wearer.getEntityWorld().provider.isDaytime()) { return protectionLevel[this.level]; } @@ -34,7 +34,7 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + 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()) { @@ -42,7 +42,7 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { } if (fireResistTime[this.level] != 0 && counter % fireResistCooldown[this.level] == 0) { - player.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, fireResistTime[this.level], 0, false, false)); + player.addPotionEffect(new EffectInstance(Effects.FIRE_RESISTANCE, fireResistTime[this.level], 0, false, false)); } } } @@ -63,12 +63,12 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(BloodMagic.MODID + ".tracker.solarPowered", counter); } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { counter = tag.getInteger(BloodMagic.MODID + ".tracker.solarPowered"); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java index 3a0a2890..4b595b5b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java @@ -5,16 +5,12 @@ 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.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +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; -import org.apache.commons.codec.binary.StringUtils; - -import java.util.UUID; public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade { public static final int[] costs = new int[]{3, 7, 13, 26, 42, 60, 90, 130, 180, 250}; @@ -33,14 +29,14 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade { } @Override - public void onTick(World world, EntityPlayer player, ILivingArmour livingArmour) { + public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { if (player.isSprinting()) { if (sprintSpeedTime[this.level] > 0) { - player.addPotionEffect(new PotionEffect(MobEffects.SPEED, sprintSpeedTime[this.level], sprintSpeedLevel[this.level], false, false)); + player.addPotionEffect(new EffectInstance(Effects.SPEED, sprintSpeedTime[this.level], sprintSpeedLevel[this.level], false, false)); } - if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(MobEffects.REGENERATION)) { - player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, sprintRegenTime[this.level], 0, false, false)); + if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(Effects.REGENERATION)) { + player.addPotionEffect(new EffectInstance(Effects.REGENERATION, sprintRegenTime[this.level], 0, false, false)); } } } @@ -75,12 +71,12 @@ public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java index e4963af3..4b9fa00b 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java @@ -2,10 +2,10 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade { public static final int[] costs = new int[]{3, 7, 15, 25, 40}; @@ -17,7 +17,7 @@ public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade { } @Override - public double getAdditionalDamageOnHit(double damage, EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { if (wearer.isSprinting()) { return getDamageModifier(); } @@ -26,7 +26,7 @@ public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade { } @Override - public double getKnockbackOnHit(EntityPlayer wearer, EntityLivingBase hitEntity, ItemStack weapon) { + public double getKnockbackOnHit(PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { if (wearer.isSprinting()) { return getKnockbackModifier(); } @@ -58,12 +58,12 @@ public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java index 9392f6ec..26cdf8e3 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.livingArmour.upgrade; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; public class LivingArmourUpgradeStepAssist extends LivingArmourUpgrade { public static final int[] costs = new int[]{20}; @@ -35,12 +35,12 @@ public class LivingArmourUpgradeStepAssist extends LivingArmourUpgrade { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { // EMPTY } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { // EMPTY } diff --git a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java index 55f5728f..bd5d9158 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.meteor; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -32,7 +32,7 @@ public class Meteor { this.maxWeight = weight; } - public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) { + 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; @@ -45,10 +45,10 @@ public class Meteor { } BlockPos newPos = pos.add(i, j, k); - IBlockState state = world.getBlockState(newPos); + BlockState state = world.getBlockState(newPos); if (world.isAirBlock(newPos) || Utils.isBlockLiquid(state)) { - IBlockState placedState = getRandomOreFromComponents(fillerBlock, fillerChance); + BlockState placedState = getRandomOreFromComponents(fillerBlock, fillerChance); if (placedState != null) { world.setBlockState(newPos, placedState); } @@ -59,13 +59,13 @@ public class Meteor { } //fillerChance is the chance that the filler block will NOT be placed - public IBlockState getRandomOreFromComponents(IBlockState fillerBlock, double fillerChance) { + public BlockState getRandomOreFromComponents(BlockState fillerBlock, double fillerChance) { int goal = RAND.nextInt(getMaxWeight()); for (MeteorComponent component : getComponents()) { goal -= component.getWeight(); if (goal < 0) { - IBlockState state = component.getStateFromOre(); + BlockState state = component.getStateFromOre(); if (state != null) { return state; } else { diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java index df810fe5..5e820a31 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java @@ -2,9 +2,9 @@ package WayofTime.bloodmagic.meteor; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemBlock; +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; @@ -21,7 +21,7 @@ public class MeteorComponent { this.oreName = oreName; } - public IBlockState getStateFromOre() { + public BlockState getStateFromOre() { if (oreName.contains(":")) { String[] stringList = oreName.split(":"); String domain = stringList[0]; @@ -40,9 +40,9 @@ public class MeteorComponent { List list = OreDictionary.getOres(oreName); if (list != null && !list.isEmpty()) { for (ItemStack stack : list) { - if (stack != null && stack.getItem() instanceof ItemBlock) { - Block block = ((ItemBlock) stack.getItem()).getBlock(); - IBlockState state = block.getStateFromMeta(stack.getItemDamage()); + if (stack != null && stack.getItem() instanceof BlockItem) { + Block block = ((BlockItem) stack.getItem()).getBlock(); + BlockState state = block.getStateFromMeta(stack.getItemDamage()); return state; } diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java index e72de2e3..0be375e3 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -6,7 +6,7 @@ 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.init.Blocks; +import net.minecraft.block.Blocks; import net.minecraft.item.ItemStack; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.filefilter.FileFilterUtils; diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java index aaf4d0b3..a74f5c43 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.meteor; import com.google.common.collect.Maps; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -36,7 +36,7 @@ public class MeteorRegistry { return null; } - public static void generateMeteorForItem(ItemStack stack, World world, BlockPos pos, IBlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) { + 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 98856381..06f2c1a0 100644 --- a/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java +++ b/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.network; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.util.ChatUtil; -import net.minecraft.entity.player.EntityPlayerMP; +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; @@ -31,7 +31,7 @@ public class BloodMagicPacketHandler { sendToAllAround(message, te, 64); } - public static void sendTo(IMessage message, EntityPlayerMP player) { + public static void sendTo(IMessage message, ServerPlayerEntity player) { INSTANCE.sendTo(message, player); } } diff --git a/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java b/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java index d3620782..513e56cc 100644 --- a/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java @@ -3,7 +3,7 @@ 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.EntityPlayer; +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; @@ -35,7 +35,7 @@ public class KeyProcessor implements IMessage, IMessageHandler effects) { + public static ItemStack setEffects(ItemStack stack, Collection effects) { if (effects.isEmpty()) { return stack; } else { - NBTTagCompound nbttagcompound = stack.hasTagCompound() ? stack.getTagCompound() : new NBTTagCompound(); - NBTTagList nbttaglist = new NBTTagList(); + CompoundNBT nbttagcompound = stack.hasTagCompound() ? stack.getTagCompound() : new CompoundNBT(); + ListNBT nbttaglist = new ListNBT(); - for (PotionEffect potioneffect : effects) { - nbttaglist.appendTag(potioneffect.writeCustomPotionEffectToNBT(new NBTTagCompound())); + for (EffectInstance potioneffect : effects) { + nbttaglist.appendTag(potioneffect.writeCustomPotionEffectToNBT(new CompoundNBT())); } nbttagcompound.setTag("CustomPotionEffects", nbttaglist); @@ -119,19 +119,19 @@ public class BMPotionUtils { } } - public static AlchemyTablePotionAugmentRecipe getLengthAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect, double lengthAugment) { + 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, PotionEffect baseEffect, int powerAugment) { + 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, PotionEffect baseEffect, double lengthAugment) { + 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, PotionEffect baseEffect, int powerAugment) { + 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 d9d552b5..4aa8bb2c 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java @@ -2,14 +2,14 @@ package WayofTime.bloodmagic.potion; import WayofTime.bloodmagic.BloodMagic; import net.minecraft.client.Minecraft; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; +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; -public class PotionBloodMagic extends Potion { +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) { @@ -19,22 +19,22 @@ public class PotionBloodMagic extends Potion { } @Override - public boolean shouldRenderInvText(PotionEffect effect) { + public boolean shouldRenderInvText(EffectInstance effect) { return true; } - public PotionEffect apply(EntityLivingBase entity, int duration) { + public EffectInstance apply(LivingEntity entity, int duration) { return apply(entity, duration, 0); } - public PotionEffect apply(EntityLivingBase entity, int duration, int level) { - PotionEffect effect = new PotionEffect(this, duration, level, false, false); + 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(EntityLivingBase entity) { - PotionEffect effect = entity.getActivePotionEffect(this); + public int getLevel(LivingEntity entity) { + EffectInstance effect = entity.getActivePotionEffect(this); if (effect != null) { return effect.getAmplifier(); } @@ -42,7 +42,7 @@ public class PotionBloodMagic extends Potion { } @Override - public boolean shouldRender(PotionEffect effect) { + public boolean shouldRender(EffectInstance effect) { return true; } diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java index a2805904..a2ce2462 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java @@ -5,12 +5,12 @@ 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.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.IProjectile; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.potion.PotionEffect; +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; @@ -26,12 +26,12 @@ import java.util.Map; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) public class PotionEventHandlers { - public static Map> flightListMap = new HashMap<>(); - public static Map> noGravityListMap = new HashMap<>(); + public static Map> flightListMap = new HashMap<>(); + public static Map> noGravityListMap = new HashMap<>(); @SubscribeEvent public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) { - EntityLivingBase eventEntityLiving = event.getEntityLiving(); + LivingEntity eventEntityLiving = event.getEntityLiving(); if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.BOOST)) { int i = eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); @@ -44,7 +44,7 @@ public class PotionEventHandlers { @SubscribeEvent public static void onLivingFall(LivingFallEvent event) { - EntityLivingBase eventEntityLiving = event.getEntityLiving(); + LivingEntity eventEntityLiving = event.getEntityLiving(); if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.HEAVY_HEART)) { int i = eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.HEAVY_HEART).getAmplifier() + 1; @@ -55,11 +55,11 @@ public class PotionEventHandlers { @SubscribeEvent public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { - EntityLivingBase eventEntityLiving = event.getEntityLiving(); - List flightList = flightListMap.getOrDefault(eventEntityLiving.getEntityWorld(), Lists.newArrayList()); + LivingEntity eventEntityLiving = event.getEntityLiving(); + List flightList = flightListMap.getOrDefault(eventEntityLiving.getEntityWorld(), Lists.newArrayList()); - if (eventEntityLiving instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) eventEntityLiving; + if (eventEntityLiving instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) eventEntityLiving; if (!player.world.isRemote) { if (player.isPotionActive(RegistrarBloodMagic.FLIGHT)) { if (!player.isSpectator() && !player.capabilities.allowFlying) { @@ -92,7 +92,7 @@ public class PotionEventHandlers { // } // } // } - List noGravityList = noGravityListMap.getOrDefault(event.getEntityLiving().getEntityWorld(), Lists.newArrayList()); + List noGravityList = noGravityListMap.getOrDefault(event.getEntityLiving().getEntityWorld(), Lists.newArrayList()); if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.SUSPENDED) && !eventEntityLiving.hasNoGravity()) { eventEntityLiving.setNoGravity(true); noGravityList.add(eventEntityLiving); @@ -102,7 +102,7 @@ public class PotionEventHandlers { } if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.GROUNDED)) - if (eventEntityLiving instanceof EntityPlayer && ((EntityPlayer) eventEntityLiving).capabilities.isFlying) + 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; @@ -120,10 +120,10 @@ public class PotionEventHandlers { Entity throwingEntity = null; - if (projectile instanceof EntityArrow) - throwingEntity = ((EntityArrow) projectile).shootingEntity; - else if (projectile instanceof EntityThrowable) - throwingEntity = ((EntityThrowable) projectile).getThrower(); + if (projectile instanceof AbstractArrowEntity) + throwingEntity = ((AbstractArrowEntity) projectile).shootingEntity; + else if (projectile instanceof ThrowableEntity) + throwingEntity = ((ThrowableEntity) projectile).getThrower(); if (throwingEntity != null && throwingEntity.equals(eventEntityLiving)) continue; @@ -161,7 +161,7 @@ public class PotionEventHandlers { @SubscribeEvent public static void onPlayerRespawn(PlayerEvent.Clone event) { if (event.isWasDeath()) - event.getEntityPlayer().addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, 400)); + event.getEntityPlayer().addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_FRAY, 400)); } @SubscribeEvent diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 204d1db4..31c3d98e 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -23,8 +23,8 @@ import WayofTime.bloodmagic.util.Constants; import com.google.common.collect.ImmutableMap; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.RenderPlayer; +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; @@ -127,9 +127,9 @@ public class ClientProxy extends CommonProxy { } private void addElytraLayer() { - RenderManager renderManager = Minecraft.getMinecraft().getRenderManager(); + EntityRendererManager renderManager = Minecraft.getMinecraft().getRenderManager(); try { - Map skinMap = ObfuscationReflectionHelper.getPrivateValue(RenderManager.class, renderManager, "skinMap", "field_178636_l"); + 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"); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java index 93c0feb9..0ea30ab0 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java @@ -2,11 +2,11 @@ package WayofTime.bloodmagic.recipe.alchemyTable; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.init.Items; -import net.minecraft.item.EnumDyeColor; -import net.minecraft.item.ItemBanner; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -65,16 +65,16 @@ public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe { if (tagOrDyeStack.getItem() == Items.NAME_TAG) { if (!outputStack.hasTagCompound()) { - outputStack.setTagCompound(new NBTTagCompound()); + outputStack.setTagCompound(new CompoundNBT()); } outputStack.getTagCompound().setString(Constants.NBT.COLOR, tagOrDyeStack.getDisplayName()); return outputStack; } else { - EnumDyeColor dyeColor = ItemBanner.getBaseColor(tagOrDyeStack); + DyeColor dyeColor = BannerItem.getBaseColor(tagOrDyeStack); if (!outputStack.hasTagCompound()) { - outputStack.setTagCompound(new NBTTagCompound()); + outputStack.setTagCompound(new CompoundNBT()); } outputStack.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(Utils.DYE_COLOR_VALUES.getOrDefault(dyeColor, 0))); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java index 17162a39..9d6c401d 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.recipe.alchemyTable; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.potion.BMPotionUtils; import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.Effect; +import net.minecraft.potion.EffectInstance; import net.minecraft.potion.PotionUtils; import java.util.ArrayList; @@ -14,9 +14,9 @@ import java.util.List; public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { protected double lengthAugment = 0; protected int powerAugment = 0; - protected Potion wantedPotion; + protected Effect wantedPotion; - public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect, double lengthAugment, int powerAugment) { + 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<>(); @@ -30,14 +30,14 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { this.powerAugment = powerAugment; } - public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect baseEffect, double lengthAugment, int 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 (PotionEffect eff : effectList) { + List effectList = PotionUtils.getEffectsFromStack(stack); + for (EffectInstance eff : effectList) { if (eff.getPotion() == wantedPotion) { double currentAugment = BMPotionUtils.getLengthAugment(stack, wantedPotion); @@ -53,9 +53,9 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { if (inputStack.isEmpty()) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - List effectList = new ArrayList<>(); + List effectList = new ArrayList<>(); int potionLength = wantedPotion.isInstant() ? 1 : BMPotionUtils.getAugmentedLength(baseEffect.getDuration(), lengthAugment, powerAugment - baseEffect.getAmplifier()); - effectList.add(new PotionEffect(wantedPotion, potionLength, powerAugment - baseEffect.getAmplifier())); + effectList.add(new EffectInstance(wantedPotion, potionLength, powerAugment - baseEffect.getAmplifier())); BMPotionUtils.setEffects(outputStack, effectList); @@ -64,15 +64,15 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { ItemStack outputStack = inputStack.copy(); - List effectList = PotionUtils.getEffectsFromStack(outputStack); - List newEffectList = new ArrayList<>(); + List effectList = PotionUtils.getEffectsFromStack(outputStack); + List newEffectList = new ArrayList<>(); - for (PotionEffect effect : effectList) { + 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 PotionEffect(wantedPotion, potionLength, currentPowerAugment)); + newEffectList.add(new EffectInstance(wantedPotion, potionLength, currentPowerAugment)); BMPotionUtils.setLengthAugment(outputStack, wantedPotion, currentLengthAugment); } else { newEffectList.add(effect); @@ -84,10 +84,10 @@ public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { return outputStack; } - public static ItemStack getAugmentedPotionFlask(PotionEffect baseEffect) { + public static ItemStack getAugmentedPotionFlask(EffectInstance baseEffect) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - List effectList = new ArrayList<>(); + List effectList = new ArrayList<>(); effectList.add(baseEffect); BMPotionUtils.setEffects(outputStack, effectList); diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java index 172af124..6a7874d9 100644 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.recipe.alchemyTable; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.EffectInstance; import net.minecraft.potion.PotionUtils; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -16,10 +16,10 @@ 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 PotionEffect baseEffect; + protected EffectInstance baseEffect; protected double baseAddedImpurity = 5; - public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, PotionEffect baseEffect) { + public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, EffectInstance baseEffect) { super(basePotionFlaskStack, lpDrained, ticksRequired, tierRequired); ArrayList recipe = new ArrayList<>(); @@ -30,7 +30,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { this.baseEffect = baseEffect; } - public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, PotionEffect baseEffect) { + public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, EffectInstance baseEffect) { this(lpDrained, ticksRequired, tierRequired, Collections.singletonList(inputItem), baseEffect); } @@ -101,12 +101,12 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { } public boolean isPotionFlaskValidInput(ItemStack stack) { - List effectList = PotionUtils.getEffectsFromStack(stack); + List effectList = PotionUtils.getEffectsFromStack(stack); if (effectList.size() >= temporaryMaximumEffectsOnThePotionFlaskYesThisIsALongFieldItIsJustSoIRemember) { return false; } - for (PotionEffect eff : effectList) { + for (EffectInstance eff : effectList) { if (eff.getPotion() == baseEffect.getPotion()) { return false; } @@ -119,7 +119,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { if (inputStack.isEmpty()) { ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - List effectList = new ArrayList<>(); + List effectList = new ArrayList<>(); effectList.add(baseEffect); PotionUtils.appendEffects(outputStack, effectList); @@ -129,7 +129,7 @@ public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { ItemStack outputStack = inputStack.copy(); - List effectList = PotionUtils.getEffectsFromStack(outputStack); + List effectList = PotionUtils.getEffectsFromStack(outputStack); effectList.add(baseEffect); PotionUtils.appendEffects(outputStack, effectList); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java index 80525583..c18f6f11 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.registry; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.inversion.CorruptionHandler; -import net.minecraft.init.Blocks; +import net.minecraft.block.Blocks; public class ModCorruptionBlocks { public static void init() { diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 6a748789..0d7ee452 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -6,15 +6,15 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.init.MobEffects; +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.potion.PotionEffect; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.tuple.Pair; @@ -149,30 +149,30 @@ public class ModRecipes { } public static void addPotionRecipes() { - addPotionRecipe(1000, 1, new ItemStack(Items.GHAST_TEAR), new PotionEffect(MobEffects.REGENERATION, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.GOLDEN_CARROT), new PotionEffect(MobEffects.NIGHT_VISION, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.MAGMA_CREAM), new PotionEffect(MobEffects.FIRE_RESISTANCE, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.WATER_BUCKET), new PotionEffect(MobEffects.WATER_BREATHING, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.SUGAR), new PotionEffect(MobEffects.SPEED, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.SPECKLED_MELON), new PotionEffect(MobEffects.INSTANT_HEALTH, 1)); - addPotionRecipe(1000, 1, new ItemStack(Items.SPIDER_EYE), new PotionEffect(MobEffects.POISON, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.DYE, 1, 0), new PotionEffect(MobEffects.BLINDNESS, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.FERMENTED_SPIDER_EYE), new PotionEffect(MobEffects.WEAKNESS, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.BLAZE_POWDER), new PotionEffect(MobEffects.STRENGTH, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.FEATHER), new PotionEffect(MobEffects.JUMP_BOOST, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.CLAY_BALL), new PotionEffect(MobEffects.SLOWNESS, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.REDSTONE), new PotionEffect(MobEffects.HASTE, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.GLASS_BOTTLE), new PotionEffect(MobEffects.INVISIBILITY, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.POISONOUS_POTATO), new PotionEffect(MobEffects.SATURATION, 1)); - addPotionRecipe(1000, 1, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0), new PotionEffect(MobEffects.HEALTH_BOOST, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Blocks.SLIME_BLOCK), new PotionEffect(RegistrarBloodMagic.BOUNCE, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.STRING), new PotionEffect(RegistrarBloodMagic.CLING, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.CAKE), new PotionEffect(RegistrarBloodMagic.FLIGHT, 2 * 60 * 20)); + 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 PotionEffect(RegistrarBloodMagic.DEAFNESS, 450)); + addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new EffectInstance(RegistrarBloodMagic.DEAFNESS, 450)); } - public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, PotionEffect baseEffect) { + 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<>(); @@ -211,7 +211,7 @@ public class ModRecipes { Map> textMap = new HashMap<>(); for (int tick : entry.getValue().getValue()) { List textList = new ArrayList<>(); - textList.add(new TextComponentTranslation("\u00A74%s", new TextComponentTranslation(messageBase + str + "." + tick))); + textList.add(new TranslationTextComponent("\u00A74%s", new TranslationTextComponent(messageBase + str + "." + tick))); textMap.put(tick, textList); } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index 57f5d24a..548b58b4 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -7,7 +7,7 @@ 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.init.Blocks; +import net.minecraft.block.Blocks; public class ModRituals { // TODO Move elsewhere diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java index d4fd77b7..e8d5b9d3 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java @@ -4,18 +4,18 @@ 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.BlockFire; -import net.minecraft.block.BlockGrass; -import net.minecraft.block.BlockLeaves; -import net.minecraft.block.BlockLog; +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 BlockLeaves ? new TranquilityStack(EnumTranquilityType.PLANT, 1.0D) : null); - IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof BlockFire ? new TranquilityStack(EnumTranquilityType.FIRE, 1.0D) : null); - IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof BlockGrass ? new TranquilityStack(EnumTranquilityType.EARTHEN, 0.5D) : null); - IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof BlockLog ? new TranquilityStack(EnumTranquilityType.TREE, 1.0D) : null); + 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 index e51a062d..cba24d19 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.util.Constants; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.Template; import java.util.ArrayList; import java.util.Collections; @@ -27,11 +27,11 @@ public abstract class AreaDescriptor implements Iterator { public abstract void resetIterator(); - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { } - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { } @@ -205,13 +205,13 @@ public abstract class AreaDescriptor implements Iterator { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { minimumOffset = new BlockPos(tag.getInteger(Constants.NBT.X_COORD + "min"), tag.getInteger(Constants.NBT.Y_COORD + "min"), tag.getInteger(Constants.NBT.Z_COORD + "min")); maximumOffset = new BlockPos(tag.getInteger(Constants.NBT.X_COORD + "max"), tag.getInteger(Constants.NBT.Y_COORD + "max"), tag.getInteger(Constants.NBT.Z_COORD + "max")); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { tag.setInteger(Constants.NBT.X_COORD + "min", minimumOffset.getX()); tag.setInteger(Constants.NBT.Y_COORD + "min", minimumOffset.getY()); tag.setInteger(Constants.NBT.Z_COORD + "min", minimumOffset.getZ()); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java index c8800b94..cebfc676 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.ritual; +import net.minecraft.nbt.ByteNBT; import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagByte; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraftforge.common.capabilities.Capability; import java.util.concurrent.Callable; @@ -10,13 +10,13 @@ import java.util.concurrent.Callable; public final class CapabilityRuneType { public static class RuneTypeStorage implements Capability.IStorage { @Override - public NBTBase writeNBT(Capability capability, IRitualStone.Tile instance, EnumFacing side) { - return new NBTTagByte((byte) instance.getRuneType().ordinal()); + public NBTBase writeNBT(Capability capability, IRitualStone.Tile instance, Direction side) { + return new ByteNBT((byte) instance.getRuneType().ordinal()); } @Override - public void readNBT(Capability capability, IRitualStone.Tile instance, EnumFacing side, NBTBase nbt) { - instance.setRuneType(EnumRuneType.byMetadata(((NBTTagByte) nbt).getByte())); + public void readNBT(Capability capability, IRitualStone.Tile instance, Direction side, NBTBase nbt) { + instance.setRuneType(EnumRuneType.byMetadata(((ByteNBT) nbt).getByte())); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java index d827c436..eb0734d6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java @@ -4,7 +4,7 @@ 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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.IStringSerializable; import net.minecraft.util.text.TextFormatting; @@ -47,7 +47,7 @@ public enum EnumRuneType implements IStringSerializable, ISubItem { @Override public ItemStack getStack(int count) { ItemStack ret = new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, count, ordinal()); - NBTTagCompound tag = new NBTTagCompound(); + CompoundNBT tag = new CompoundNBT(); tag.setInteger(Constants.NBT.USES, 10); ret.setTagCompound(tag); return ret; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java index 1ba75a6f..64e64175 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java @@ -3,9 +3,9 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -23,7 +23,7 @@ public interface IMasterRitualStone { SoulNetwork getOwnerNetwork(); - boolean activateRitual(ItemStack activationCrystal, EntityPlayer activator, Ritual ritual); + boolean activateRitual(ItemStack activationCrystal, PlayerEntity activator, Ritual ritual); void performRitual(World world, BlockPos pos); @@ -37,7 +37,7 @@ public interface IMasterRitualStone { void setActive(boolean active); - EnumFacing getDirection(); + Direction getDirection(); boolean areTanksEmpty(); @@ -49,15 +49,15 @@ public interface IMasterRitualStone { String getNextBlockRange(String range); - void provideInformationOfRitualToPlayer(EntityPlayer player); + void provideInformationOfRitualToPlayer(PlayerEntity player); - void provideInformationOfRangeToPlayer(EntityPlayer player, String range); + void provideInformationOfRangeToPlayer(PlayerEntity player, String range); - void provideInformationOfWillConfigToPlayer(EntityPlayer player, List typeList); + void provideInformationOfWillConfigToPlayer(PlayerEntity player, List typeList); - void setActiveWillConfig(EntityPlayer player, List typeList); + void setActiveWillConfig(PlayerEntity player, List typeList); - EnumReaderBoundaries setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2); + EnumReaderBoundaries setBlockRangeByBounds(PlayerEntity player, String range, BlockPos offset1, BlockPos offset2); List getActiveWillConfig(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java index d357c6c5..26d7f834 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java @@ -3,13 +3,13 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -49,17 +49,17 @@ public abstract class Ritual { this(name, crystalLevel, activationCost, null, unlocalizedName); } - public void readFromNBT(NBTTagCompound tag) { - NBTTagList tags = tag.getTagList("areas", 10); + public void readFromNBT(CompoundNBT tag) { + ListNBT tags = tag.getTagList("areas", 10); if (tags.isEmpty()) { return; } for (int i = 0; i < tags.tagCount(); i++) { - NBTTagCompound newTag = tags.getCompoundTagAt(i); + CompoundNBT newTag = tags.getCompoundTagAt(i); String rangeKey = newTag.getString("key"); - NBTTagCompound storedTag = newTag.getCompoundTag("area"); + CompoundNBT storedTag = newTag.getCompoundTag("area"); AreaDescriptor desc = this.getBlockRange(rangeKey); if (desc != null) { desc.readFromNBT(storedTag); @@ -67,13 +67,13 @@ public abstract class Ritual { } } - public void writeToNBT(NBTTagCompound tag) { - NBTTagList tags = new NBTTagList(); + public void writeToNBT(CompoundNBT tag) { + ListNBT tags = new ListNBT(); for (Entry entry : modableRangeMap.entrySet()) { - NBTTagCompound newTag = new NBTTagCompound(); + CompoundNBT newTag = new CompoundNBT(); newTag.setString("key", entry.getKey()); - NBTTagCompound storedTag = new NBTTagCompound(); + CompoundNBT storedTag = new CompoundNBT(); entry.getValue().writeToNBT(storedTag); @@ -88,7 +88,7 @@ public abstract class Ritual { /** * Called when the player attempts to activate the ritual. *

        - * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#activateRitual(ItemStack, EntityPlayer, 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 @@ -96,7 +96,7 @@ public abstract class Ritual { * owner of the ritual if being reactivated. * @return - Whether activation was successful */ - public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, UUID owner) { + public boolean activateRitual(IMasterRitualStone masterRitualStone, PlayerEntity player, UUID owner) { return true; } @@ -216,10 +216,10 @@ public abstract class Ritual { return horizontalRangeMap.get(range); } - public ITextComponent getErrorForBlockRangeOnFail(EntityPlayer player, String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2) { + public ITextComponent getErrorForBlockRangeOnFail(PlayerEntity player, String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2) { AreaDescriptor descriptor = this.getBlockRange(range); if (descriptor == null) { - return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooBig", "?"); + return new TranslationTextComponent("ritual.bloodmagic.blockRange.tooBig", "?"); } List willConfig = master.getActiveWillConfig(); @@ -230,21 +230,21 @@ public abstract class Ritual { int maxHorizontal = this.getMaxHorizontalRadiusForRange(range, willConfig, holder); if (maxVolume > 0 && descriptor.getVolumeForOffsets(offset1, offset2) > maxVolume) { - return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooBig", maxVolume); + return new TranslationTextComponent("ritual.bloodmagic.blockRange.tooBig", maxVolume); } else { - return new TextComponentTranslation("ritual.bloodmagic.blockRange.tooFar", maxVertical, maxHorizontal); + return new TranslationTextComponent("ritual.bloodmagic.blockRange.tooFar", maxVertical, maxHorizontal); } } - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info")}; + public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { + return new ITextComponent[]{new TranslationTextComponent(this.getTranslationKey() + ".info")}; } - public ITextComponent provideInformationOfRangeToPlayer(EntityPlayer player, String range) { + public ITextComponent provideInformationOfRangeToPlayer(PlayerEntity player, String range) { if (getListOfRanges().contains(range)) { - return new TextComponentTranslation(this.getTranslationKey() + "." + range + ".info"); + return new TranslationTextComponent(this.getTranslationKey() + "." + range + ".info"); } else { - return new TextComponentTranslation("ritual.bloodmagic.blockRange.noRange"); + return new TranslationTextComponent("ritual.bloodmagic.blockRange.noRange"); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java index 92feb8ec..9af0c1ab 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; /** @@ -16,7 +16,7 @@ public class RitualComponent { this.runeType = runeType; } - public int getX(EnumFacing direction) { + public int getX(Direction direction) { switch (direction) { case EAST: return -this.getOffset().getZ(); @@ -33,7 +33,7 @@ public class RitualComponent { return this.getOffset().getY(); } - public int getZ(EnumFacing direction) { + public int getZ(Direction direction) { switch (direction) { case EAST: return this.getOffset().getX(); @@ -46,7 +46,7 @@ public class RitualComponent { } } - public BlockPos getOffset(EnumFacing direction) { + public BlockPos getOffset(Direction direction) { return new BlockPos(getX(direction), offset.getY(), getZ(direction)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java index ff8aa0bc..70e5b951 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java @@ -5,7 +5,7 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.util.DamageSource; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.fml.common.discovery.ASMDataTable; @@ -107,7 +107,7 @@ public class RitualManager { return ritualsReverse.get(ritual); } - public ImperfectRitual getImperfectRitual(IBlockState state) { + public ImperfectRitual getImperfectRitual(BlockState state) { for (ImperfectRitual ritual : imperfectRituals.values()) if (ritual.getBlockRequirement().test(state)) return ritual; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java index 38a405f9..ca4ecf43 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java @@ -2,9 +2,9 @@ package WayofTime.bloodmagic.ritual.harvest; import WayofTime.bloodmagic.util.BMLog; import net.minecraft.block.Block; -import net.minecraft.block.BlockCrops; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; +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; @@ -51,7 +51,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler { } @Override - public boolean harvest(World world, BlockPos pos, IBlockState state, List drops) { + 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; @@ -84,7 +84,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler { } @Override - public boolean test(World world, BlockPos pos, IBlockState state) { + public boolean test(World world, BlockPos pos, BlockState state) { return HarvestRegistry.getStandardCrops().containsKey(state.getBlock()) && state.getBlock().getMetaFromState(state) == HarvestRegistry.getStandardCrops().get(state.getBlock()); } @@ -106,7 +106,7 @@ public class HarvestHandlerPlantable implements IHarvestHandler { Field names = pamRegistry.getDeclaredField("cropNames"); Method getCrop = pamRegistry.getMethod("getCrop", String.class); for (String name : (String[]) names.get(null)) { - BlockCrops crop = (BlockCrops) getCrop.invoke(null, name); + CropsBlock crop = (CropsBlock) getCrop.invoke(null, name); HarvestRegistry.registerStandardCrop(crop, crop.getMaxAge()); } } catch (ClassNotFoundException e) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java index 7a0ef364..582b1dff 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.ritual.harvest; -import net.minecraft.block.BlockPumpkin; -import net.minecraft.block.BlockStem; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; +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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -17,27 +17,27 @@ 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(IBlockState, IBlockState)} + * {@link HarvestRegistry#registerStemCrop(BlockState, BlockState)} */ public class HarvestHandlerStem implements IHarvestHandler { public HarvestHandlerStem() { - for (EnumFacing facing : EnumFacing.HORIZONTALS) - HarvestRegistry.registerStemCrop(Blocks.PUMPKIN.getDefaultState().withProperty(BlockPumpkin.FACING, facing), Blocks.PUMPKIN_STEM.getDefaultState().withProperty(BlockStem.AGE, 7)); + 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(BlockStem.AGE, 7)); + HarvestRegistry.registerStemCrop(Blocks.MELON_BLOCK.getDefaultState(), Blocks.MELON_STEM.getDefaultState().withProperty(StemBlock.AGE, 7)); } @Override - public boolean harvest(World world, BlockPos pos, IBlockState state, List drops) { - EnumFacing cropDir = state.getActualState(world, pos).getValue(BlockStem.FACING); + public boolean harvest(World world, BlockPos pos, BlockState state, List drops) { + Direction cropDir = state.getActualState(world, pos).getValue(StemBlock.FACING); - if (cropDir != EnumFacing.UP) { + if (cropDir != Direction.UP) { BlockPos cropPos = pos.offset(cropDir); - IBlockState probableCrop = world.getBlockState(cropPos); - Collection registeredCrops = HarvestRegistry.getStemCrops().get(state); + BlockState probableCrop = world.getBlockState(cropPos); + Collection registeredCrops = HarvestRegistry.getStemCrops().get(state); - for (IBlockState registeredCrop : registeredCrops) { + for (BlockState registeredCrop : registeredCrops) { if (registeredCrop == probableCrop) { NonNullList blockDrops = NonNullList.create(); probableCrop.getBlock().getDrops(blockDrops, world, cropPos, probableCrop, 0); @@ -52,7 +52,7 @@ public class HarvestHandlerStem implements IHarvestHandler { } @Override - public boolean test(World world, BlockPos pos, IBlockState state) { + 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 index 544a3d83..7f75934d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.ritual.harvest; -import net.minecraft.block.BlockCactus; -import net.minecraft.block.BlockReed; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; +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; @@ -14,20 +14,20 @@ 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(IBlockState)} + * {@link HarvestRegistry#registerTallCrop(BlockState)} */ public class HarvestHandlerTall implements IHarvestHandler { public HarvestHandlerTall() { for (int i = 0; i < 15; i++) { - HarvestRegistry.registerTallCrop(Blocks.REEDS.getDefaultState().withProperty(BlockReed.AGE, i)); - HarvestRegistry.registerTallCrop(Blocks.CACTUS.getDefaultState().withProperty(BlockCactus.AGE, 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, IBlockState state, List drops) { - IBlockState up = world.getBlockState(pos.up()); + 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); @@ -40,7 +40,7 @@ public class HarvestHandlerTall implements IHarvestHandler { } @Override - public boolean test(World world, BlockPos pos, IBlockState state) { + 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 index 82c403e6..2338a34a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.ritual.harvest; import com.google.common.collect.*; import net.minecraft.block.Block; -import net.minecraft.block.BlockStem; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; +import net.minecraft.block.StemBlock; import java.util.List; import java.util.Map; @@ -13,9 +13,9 @@ 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(); + 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. @@ -49,7 +49,7 @@ public class HarvestRegistry { * * @param crop - The crop block to handle. */ - public static void registerTallCrop(IBlockState crop) { + public static void registerTallCrop(BlockState crop) { if (!TALL_CROPS.contains(crop)) TALL_CROPS.add(crop); } @@ -62,13 +62,13 @@ public class HarvestRegistry { * Use {@link net.minecraftforge.oredict.OreDictionary#WILDCARD_VALUE} to * accept any meta for the crop block. *

        - * The Stem must be instanceof {@link BlockStem} + * 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(IBlockState crop, IBlockState stem) { - if (!STEM_CROPS.containsKey(crop) && stem.getBlock() instanceof BlockStem) + public static void registerStemCrop(BlockState crop, BlockState stem) { + if (!STEM_CROPS.containsKey(crop) && stem.getBlock() instanceof StemBlock) STEM_CROPS.put(stem, crop); } @@ -78,7 +78,7 @@ public class HarvestRegistry { * @param block - The block for the amplifier. * @param range - The range the amplifier provides. */ - public static void registerRangeAmplifier(IBlockState block, int range) { + public static void registerRangeAmplifier(BlockState block, int range) { if (!AMPLIFIERS.containsKey(block)) AMPLIFIERS.put(block, range); } @@ -91,15 +91,15 @@ public class HarvestRegistry { return ImmutableMap.copyOf(STANDARD_CROPS); } - public static Set getTallCrops() { + public static Set getTallCrops() { return ImmutableSet.copyOf(TALL_CROPS); } - public static Multimap getStemCrops() { + public static Multimap getStemCrops() { return ImmutableMultimap.copyOf(STEM_CROPS); } - public static Map getAmplifiers() { + 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 index b8b49316..e2e50824 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/IHarvestHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/harvest/IHarvestHandler.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual.harvest; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -18,20 +18,20 @@ public interface IHarvestHandler { * Add the items to be dropped to the drops list.
        * * @param world - The world - * @param pos - The position of the {@link IBlockState} being checked - * @param state - The {@link IBlockState} being checked + * @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, IBlockState state, List drops); + 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 IBlockState} being checked - * @param state The {@link IBlockState} being checked + * @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, IBlockState state); + 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 index 205bdf87..e18477ed 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.ritual.imperfect; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -11,7 +11,7 @@ import net.minecraft.world.World; */ public interface IImperfectRitualStone { - boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, EntityPlayer player); + boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, PlayerEntity player); World getRitualWorld(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java index 3a314984..5f2169a1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual.imperfect; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.World; import java.util.function.Predicate; @@ -12,12 +12,12 @@ import java.util.function.Predicate; public abstract class ImperfectRitual { private final String name; - private final Predicate blockRequirement; + 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) { + public ImperfectRitual(String name, Predicate blockRequirement, int activationCost, boolean lightShow, String unlocalizedName) { this.name = name; this.blockRequirement = blockRequirement; this.activationCost = activationCost; @@ -30,25 +30,25 @@ public abstract class ImperfectRitual { * @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) { + 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, EntityPlayer)} + * {@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, EntityPlayer player); + public abstract boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player); public String getName() { return name; } - public Predicate getBlockRequirement() { + public Predicate getBlockRequirement() { return blockRequirement; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java index 9e3592b9..f28025da 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java @@ -10,13 +10,13 @@ import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.Block; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.init.Blocks; +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.item.ItemBlock; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; @@ -156,7 +156,7 @@ public class RitualAltarBuilder extends Ritual { } public void lightning(World world, BlockPos blockPos) { - world.addWeatherEffect(new EntityLightningBolt(world, blockPos.getX(), blockPos.getY(), blockPos.getZ(), true)); + world.addWeatherEffect(new LightningBoltEntity(world, blockPos.getX(), blockPos.getY(), blockPos.getZ(), true)); } /* @@ -166,8 +166,8 @@ public class RitualAltarBuilder extends Ritual { */ public boolean hasItem(TileEntity tileEntity, Item item, int damage, boolean consumeItem) { if (tileEntity != null) { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + 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; @@ -195,15 +195,15 @@ public class RitualAltarBuilder extends Ritual { public BlockStack getBloodRune(TileEntity tileEntity) { if (tileEntity != null) { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + 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 ItemBlock && Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune && itemHandler.extractItem(i, 1, true) != null) { + 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; @@ -212,7 +212,7 @@ public class RitualAltarBuilder extends Ritual { } 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 ItemBlock && Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune) { + 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; @@ -225,15 +225,15 @@ public class RitualAltarBuilder extends Ritual { public BlockStack getMundaneBlock(TileEntity tileEntity) { if (tileEntity != null) { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + 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 ItemBlock && !(Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune) && !itemHandler.extractItem(i, 1, true).isEmpty()) { + 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()); @@ -245,7 +245,7 @@ public class RitualAltarBuilder extends Ritual { } 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 ItemBlock && !(Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune)) { + 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()); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java index 15bb17ac..a6b61133 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java @@ -6,15 +6,15 @@ 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.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; @@ -85,11 +85,11 @@ public class RitualAnimalGrowth extends Ritual { AreaDescriptor growingRange = masterRitualStone.getBlockRange(GROWTH_RANGE); AxisAlignedBB axis = growingRange.getAABB(masterRitualStone.getBlockPos()); - List animalList = world.getEntitiesWithinAABB(EntityAnimal.class, axis); + List animalList = world.getEntitiesWithinAABB(AnimalEntity.class, axis); boolean performedEffect = false; - for (EntityAnimal animal : animalList) { + for (AnimalEntity animal : animalList) { if (animal.getGrowingAge() < 0) { animal.addGrowth(5); totalGrowths++; @@ -109,7 +109,7 @@ public class RitualAnimalGrowth extends Ritual { if (kamikaze) { if (destructiveWill >= destructiveWillDrain) { if (!animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { - animal.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SACRIFICIAL_LAMB, 1200)); + animal.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SACRIFICIAL_LAMB, 1200)); destructiveDrain += destructiveWillDrain; destructiveWill -= destructiveWillDrain; performedEffect = true; @@ -190,14 +190,14 @@ public class RitualAnimalGrowth extends Ritual { } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { return new ITextComponent[]{ - new TextComponentTranslation(this.getTranslationKey() + ".info"), - new TextComponentTranslation(this.getTranslationKey() + ".default.info"), - new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), - new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), - new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), - new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info") + 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") }; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java index 8f2ed0a5..482acf7c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java @@ -5,8 +5,8 @@ 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.EntityLightningBolt; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -35,9 +35,9 @@ public class RitualArmourEvolve extends Ritual { AreaDescriptor checkRange = masterRitualStone.getBlockRange(CHECK_RANGE); - List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, checkRange.getAABB(pos)); + List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, checkRange.getAABB(pos)); - for (EntityPlayer player : playerList) { + for (PlayerEntity player : playerList) { if (LivingArmour.hasFullSet(player)) { ItemStack chestStack = Iterables.toArray(player.getArmorInventoryList(), ItemStack.class)[2]; LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); @@ -48,7 +48,7 @@ public class RitualArmourEvolve extends Ritual { masterRitualStone.setActive(false); - world.spawnEntity(new EntityLightningBolt(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); + world.spawnEntity(new LightningBoltEntity(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java index f0617d47..2e91a184 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java @@ -5,7 +5,7 @@ import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileAlchemyArray; import net.minecraft.block.Block; -import net.minecraft.init.Blocks; +import net.minecraft.block.Blocks; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java index 36d31b14..a126275b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.potion.PotionEffect; +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; @@ -29,7 +29,7 @@ public class RitualCondor extends Ritual { int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - List entityPlayers = world.getEntitiesWithinAABB(EntityPlayer.class, aabb); + List entityPlayers = world.getEntitiesWithinAABB(PlayerEntity.class, aabb); int entityCount = entityPlayers.size(); if (currentEssence < getRefreshCost() * entityCount) { @@ -37,8 +37,8 @@ public class RitualCondor extends Ritual { return; } else { entityCount = 0; - for (EntityPlayer player : entityPlayers) { - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FLIGHT, 20, 0)); + for (PlayerEntity player : entityPlayers) { + player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.FLIGHT, 20, 0)); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java index a8224955..d458bd29 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -31,8 +31,8 @@ public class RitualContainment extends Ritual { AreaDescriptor containmentRange = masterRitualStone.getBlockRange(CONTAINMENT_RANGE); - for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, containmentRange.getAABB(masterRitualStone.getBlockPos()))) { - if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || ((EntityPlayer) entity).getGameProfile().getId().equals(masterRitualStone.getOwner()))) + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java index 4b6d7955..99cc2548 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java @@ -2,8 +2,6 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.compress.CompressionRegistry; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; -import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.ritual.crushing.CrushingRegistry; import WayofTime.bloodmagic.ritual.crushing.ICrushingHandler; @@ -13,25 +11,23 @@ import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; import com.mojang.authlib.GameProfile; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; +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.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.function.Consumer; @RitualRegister("crushing") @@ -73,7 +69,7 @@ public class RitualCrushing extends Ritual { AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); - if (tile != null && Utils.getNumberOfFreeSlots(tile, EnumFacing.DOWN) < 1) { + if (tile != null && Utils.getNumberOfFreeSlots(tile, Direction.DOWN) < 1) { return; } @@ -104,7 +100,7 @@ public class RitualCrushing extends Ritual { continue; } - IBlockState state = world.getBlockState(newPos); + 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; @@ -134,12 +130,12 @@ public class RitualCrushing extends Ritual { } if (tile != null) { - result = Utils.insertStackIntoTile(result, tile, EnumFacing.DOWN); + result = Utils.insertStackIntoTile(result, tile, Direction.DOWN); if (!result.isEmpty()) { - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, result); + Utils.spawnStackAtBlock(world, pos, Direction.UP, result); } } else { - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, result); + Utils.spawnStackAtBlock(world, pos, Direction.UP, result); } WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, willDrain, true); @@ -153,7 +149,7 @@ public class RitualCrushing extends Ritual { } - if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, getFakePlayer((WorldServer) world))) { + if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, getFakePlayer((ServerWorld) world))) { ItemStack checkStack = block.getItem(world, newPos, state); if (checkStack.isEmpty()) { continue; @@ -169,12 +165,12 @@ public class RitualCrushing extends Ritual { } if (tile != null) - copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + copyStack = Utils.insertStackIntoTile(copyStack, tile, Direction.DOWN); else - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); + Utils.spawnStackAtBlock(world, pos, Direction.UP, copyStack); if (!copyStack.isEmpty()) { - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); + Utils.spawnStackAtBlock(world, pos, Direction.UP, copyStack); } } else if (!isBlockClaimed) { if (fortune > 0 && destructiveWill < destructiveWillDrain) { @@ -187,13 +183,13 @@ public class RitualCrushing extends Ritual { ItemStack copyStack = item.copy(); if (tile != null) { - copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + copyStack = Utils.insertStackIntoTile(copyStack, tile, Direction.DOWN); } else { - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); + Utils.spawnStackAtBlock(world, pos, Direction.UP, copyStack); continue; } if (!copyStack.isEmpty()) { - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); + Utils.spawnStackAtBlock(world, pos, Direction.UP, copyStack); } } @@ -220,7 +216,7 @@ public class RitualCrushing extends Ritual { if (pair.getRight()) { ItemStack returned = pair.getLeft(); if (returned != null) { - Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, returned); + Utils.spawnStackAtBlock(world, pos, Direction.UP, returned); } WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulWillDrain, true); @@ -259,14 +255,14 @@ public class RitualCrushing extends Ritual { } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { + public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { return new ITextComponent[]{ - new TextComponentTranslation(this.getTranslationKey() + ".info"), - new TextComponentTranslation(this.getTranslationKey() + ".default.info"), - new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), - new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), - new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), - new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info") + 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") }; } @@ -280,7 +276,7 @@ public class RitualCrushing extends Ritual { cuttingFluidWillMap.put(stack, willDrain); } - private FakePlayer getFakePlayer(WorldServer world) { + 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 index 7382f09f..2e66f058 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileDemonCrystal; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -44,7 +44,7 @@ public class RitualCrystalHarvest extends Ritual { if (tile instanceof TileDemonCrystal) { TileDemonCrystal demonCrystal = (TileDemonCrystal) tile; if (demonCrystal.dropSingleCrystal()) { - IBlockState state = world.getBlockState(nextPos); + BlockState state = world.getBlockState(nextPos); world.notifyBlockUpdate(nextPos, state, state, 3); totalEffects++; if (totalEffects >= maxEffects) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java index 70b683f9..7a74317f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java @@ -3,13 +3,13 @@ package WayofTime.bloodmagic.ritual.types; import java.util.function.Consumer; import WayofTime.bloodmagic.ritual.*; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; @@ -33,7 +33,7 @@ public class RitualCrystalSplit extends Ritual { } BlockPos pos = masterRitualStone.getBlockPos(); - EnumFacing direction = masterRitualStone.getDirection(); + Direction direction = masterRitualStone.getDirection(); BlockPos rawPos = pos.up(2); TileEntity tile = world.getTileEntity(rawPos); @@ -41,14 +41,14 @@ public class RitualCrystalSplit extends Ritual { return; } - IBlockState rawState = world.getBlockState(rawPos); + BlockState rawState = world.getBlockState(rawPos); TileDemonCrystal rawTile = (TileDemonCrystal) tile; if (rawTile.crystalCount >= 5) { - BlockPos vengefulPos = pos.offset(rotateFacing(EnumFacing.NORTH, direction)).up(); - BlockPos corrosivePos = pos.offset(rotateFacing(EnumFacing.EAST, direction)).up(); - BlockPos steadfastPos = pos.offset(rotateFacing(EnumFacing.SOUTH, direction)).up(); - BlockPos destructivePos = pos.offset(rotateFacing(EnumFacing.WEST, direction)).up(); + 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; @@ -102,7 +102,7 @@ public class RitualCrystalSplit extends Ritual { } } - public EnumFacing rotateFacing(EnumFacing facing, EnumFacing rotation) { + public Direction rotateFacing(Direction facing, Direction rotation) { switch (rotation) { case EAST: return facing.rotateY(); @@ -123,7 +123,7 @@ public class RitualCrystalSplit extends Ritual { TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); tile.crystalCount++; tile.markDirty(); - IBlockState state = world.getBlockState(pos); + BlockState state = world.getBlockState(pos); world.notifyBlockUpdate(pos, state, state, 3); } } @@ -156,7 +156,7 @@ public class RitualCrystalSplit extends Ritual { } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info")}; + 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 index cece930d..9e6a33bd 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java @@ -3,11 +3,11 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.ItemBlock; +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -57,8 +57,8 @@ public class RitualEllipsoid extends Ritual { int maxZ = (int) (sphereBB.maxZ - masterPos.getZ()) - 1; if (tileInventory != null) { - if (tileInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler itemHandler = tileInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + if (tileInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN)) { + IItemHandler itemHandler = tileInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN); if (itemHandler.getSlots() <= 0) { return; @@ -67,7 +67,7 @@ public class RitualEllipsoid extends Ritual { int blockSlot = -1; for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) { ItemStack stack = itemHandler.extractItem(invSlot, 1, true); - if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) + if (stack.isEmpty() || !(stack.getItem() instanceof BlockItem)) continue; blockSlot = invSlot; @@ -111,7 +111,7 @@ public class RitualEllipsoid extends Ritual { continue; } - IBlockState placeState = Block.getBlockFromItem(itemHandler.getStackInSlot(blockSlot).getItem()).getStateFromMeta(itemHandler.getStackInSlot(blockSlot).getItemDamage()); + BlockState placeState = Block.getBlockFromItem(itemHandler.getStackInSlot(blockSlot).getItem()).getStateFromMeta(itemHandler.getStackInSlot(blockSlot).getItemDamage()); world.setBlockState(newPos, placeState); itemHandler.extractItem(blockSlot, 1, false); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java index e2b668a1..5c03479f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java @@ -8,8 +8,8 @@ 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.EntityPlayer; -import net.minecraft.potion.PotionEffect; +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; @@ -67,12 +67,12 @@ public class RitualEternalSoul extends Ritual { int horizontalRange = 15; int verticalRange = 20; - List list = world.getEntitiesWithinAABB(EntityPlayer.class, + 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)); - EntityPlayer entityOwner = PlayerHelper.getPlayerFromUUID(owner); + PlayerEntity entityOwner = PlayerHelper.getPlayerFromUUID(owner); int fillAmount = Math.min(currentEssence / 2, altar.fill(new FluidStack(BlockLifeEssence.getLifeEssence(), 10000), false)); @@ -81,8 +81,8 @@ public class RitualEternalSoul extends Ritual { if (entityOwner != null && list.contains(entityOwner) && entityOwner.getHealth() > 2.0f && fillAmount != 0) entityOwner.setHealth(2.0f); - for (EntityPlayer player : list) - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, 100)); + for (PlayerEntity player : list) + player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_FRAY, 100)); masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(fillAmount * 2)); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java index 358925b5..0ec231d5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java @@ -6,10 +6,10 @@ import WayofTime.bloodmagic.iface.IBindable; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; import com.google.common.collect.Lists; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; +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; @@ -70,7 +70,7 @@ public class RitualExpulsion extends Ritual { final int teleportDistance = 100; - for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, expulsionRange.getAABB(masterRitualStone.getBlockPos()))) { + 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; @@ -81,9 +81,9 @@ public class RitualExpulsion extends Ritual { whitelist.clear(); } - public boolean teleportRandomly(EntityLivingBase entityLiving, double distance) { - if (entityLiving instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entityLiving; + public boolean teleportRandomly(LivingEntity entityLiving, double distance) { + if (entityLiving instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) entityLiving; if (player.capabilities.isCreativeMode) return false; } @@ -107,7 +107,7 @@ public class RitualExpulsion extends Ritual { return i >= 100; } - public boolean teleportTo(EntityLivingBase entityLiving, double par1, double par3, double par5, double lastX, double lastY, double lastZ) { + 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)) { @@ -125,7 +125,7 @@ public class RitualExpulsion extends Ritual { boolean flag1 = false; while (!flag1 && j > 0) { - IBlockState state = entityLiving.getEntityWorld().getBlockState(new BlockPos(i, j - 1, k)); + BlockState state = entityLiving.getEntityWorld().getBlockState(new BlockPos(i, j - 1, k)); if (state.getMaterial().blocksMovement()) { flag1 = true; @@ -163,9 +163,9 @@ public class RitualExpulsion extends Ritual { } } - public void moveEntityViaTeleport(EntityLivingBase entityLiving, double x, double y, double z) { - if (entityLiving instanceof EntityPlayerMP) { - EntityPlayerMP player = (EntityPlayerMP) entityLiving; + 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); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java index 823ceb1b..ea4d70e8 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java @@ -3,9 +3,9 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.potion.PotionEffect; +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; @@ -42,22 +42,22 @@ public class RitualFeatheredEarth extends Ritual { int totalEffects = 0; if (masterRitualStone.getCooldown() > 0) { - world.addWeatherEffect(new EntityLightningBolt(world, x + 4, y + 5, z + 4, false)); - world.addWeatherEffect(new EntityLightningBolt(world, x + 4, y + 5, z - 4, false)); - world.addWeatherEffect(new EntityLightningBolt(world, x - 4, y + 5, z - 4, false)); - world.addWeatherEffect(new EntityLightningBolt(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)); + 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(EntityLivingBase.class, fallProtBB); + List entities = world.getEntitiesWithinAABB(LivingEntity.class, fallProtBB); - for (EntityLivingBase entity : entities) { + for (LivingEntity entity : entities) { if (totalEffects >= maxEffects) { break; } - entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FEATHERED, 20, 0)); + entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.FEATHERED, 20, 0)); totalEffects++; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java index 352725a3..9fe7fa5a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java @@ -12,15 +12,15 @@ 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.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import java.util.List; @@ -105,9 +105,9 @@ public class RitualFeatheredKnife extends Ritual { double destructiveDrain = 0; - List entities = world.getEntitiesWithinAABB(EntityPlayer.class, range); + List entities = world.getEntitiesWithinAABB(PlayerEntity.class, range); - for (EntityPlayer player : entities) { + for (PlayerEntity player : entities) { float healthThreshold = steadfastWill >= steadfastWillThreshold ? 0.7f : 0.3f; if (vengefulWill >= vengefulWillThreshold && !player.getGameProfile().getId().equals(masterRitualStone.getOwner())) { @@ -128,7 +128,7 @@ public class RitualFeatheredKnife extends Ritual { lpModifier *= PlayerSacrificeHelper.getModifier(incenseAmount); PlayerSacrificeHelper.setPlayerIncense(player, 0); - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, PlayerSacrificeHelper.soulFrayDuration)); + player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_FRAY, PlayerSacrificeHelper.soulFrayDuration)); } if (destructiveWill >= destructiveWillDrain * sacrificedHealth) { @@ -138,7 +138,7 @@ public class RitualFeatheredKnife extends Ritual { } if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.selfSacrifice", chestStack); @@ -202,8 +202,8 @@ public class RitualFeatheredKnife extends Ritual { } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info"), new TextComponentTranslation(this.getTranslationKey() + ".default.info"), new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info")}; + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java index c116c0b5..78a31db5 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java @@ -3,11 +3,11 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.item.EntityItem; +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.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; @@ -69,7 +69,7 @@ public class RitualFelling extends Ritual { if (blockPosIterator.hasNext() && tileInventory != null) { masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); currentPos = blockPosIterator.next(); - IItemHandler inventory = Utils.getInventory(tileInventory, EnumFacing.DOWN); + IItemHandler inventory = Utils.getInventory(tileInventory, Direction.DOWN); placeInInventory(world.getBlockState(currentPos), world, currentPos, inventory); world.setBlockToAir(currentPos); blockPosIterator.remove(); @@ -97,14 +97,14 @@ public class RitualFelling extends Ritual { return new RitualFelling(); } - private void placeInInventory(IBlockState choppedState, World world, BlockPos choppedPos, @Nullable IItemHandler inventory) { + 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 EntityItem(world, choppedPos.getX() + 0.4, choppedPos.getY() + 2, choppedPos.getZ() + 0.4, remainder)); + 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 index ea908c27..a77b9506 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java @@ -4,10 +4,10 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileDemonCrystal; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -42,7 +42,7 @@ public class RitualForsakenSoul extends Ritual { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { super.readFromNBT(tag); willBuffer = tag.getDouble("willBuffer"); @@ -58,7 +58,7 @@ public class RitualForsakenSoul extends Ritual { } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { super.writeToNBT(tag); tag.setDouble("willBuffer", willBuffer); @@ -100,20 +100,20 @@ public class RitualForsakenSoul extends Ritual { AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); AxisAlignedBB range = damageRange.getAABB(pos); - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, range); + List entities = world.getEntitiesWithinAABB(LivingEntity.class, range); - for (EntityLivingBase entity : entities) { + 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 EntityPlayer)) { + 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 EntityAnimal && !((EntityAnimal) entity).collided) { + if (entity instanceof AnimalEntity && !((AnimalEntity) entity).collided) { modifier = 4; } @@ -147,7 +147,7 @@ public class RitualForsakenSoul extends Ritual { * @param mob * @return The amount of uniqueness to the last 10 mobs killed */ - public int calculateUniqueness(EntityLivingBase mob) { + public int calculateUniqueness(LivingEntity mob) { int key = mob.getClass().hashCode(); keyList.add(key); if (keyList.size() > MAX_UNIQUENESS) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java index 0618d119..3a193e91 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -47,9 +47,9 @@ public class RitualFullStomach extends Ritual { IItemHandler inventory = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); int lastSlot = 0; AreaDescriptor fillingRange = masterRitualStone.getBlockRange(FILL_RANGE); - List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, fillingRange.getAABB(pos)); + List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, fillingRange.getAABB(pos)); - for (EntityPlayer player : playerList) { + for (PlayerEntity player : playerList) { FoodStats foodStats = player.getFoodStats(); float satLevel = foodStats.getSaturationLevel(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java index 4bfddd31..f1ff9f71 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java @@ -9,15 +9,15 @@ import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; import net.minecraft.block.*; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.potion.PotionEffect; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import java.util.List; @@ -36,7 +36,7 @@ public class RitualGreenGrove extends Ritual { public static double steadfastWillDrain = 0.05; public static int defaultRefreshTime = 20; public static double defaultGrowthChance = 0.3; - public static IBlockState farmlandState = Blocks.FARMLAND.getDefaultState().withProperty(BlockFarmland.MOISTURE, 7); + public static BlockState farmlandState = Blocks.FARMLAND.getDefaultState().withProperty(FarmlandBlock.MOISTURE, 7); public int refreshTime = 20; public RitualGreenGrove() { @@ -88,14 +88,14 @@ public class RitualGreenGrove extends Ritual { } for (BlockPos newPos : growingRange.getContainedPositions(pos)) { - IBlockState state = world.getBlockState(newPos); + BlockState state = world.getBlockState(newPos); if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { - boolean flag = state.getBlock() instanceof IGrowable || state.getBlock() instanceof BlockCactus || state.getBlock() instanceof BlockReed; + 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()); - IBlockState newState = world.getBlockState(newPos); + BlockState newState = world.getBlockState(newPos); if (!newState.equals(state)) { world.playEvent(2005, newPos, 0); totalGrowths++; @@ -139,7 +139,7 @@ public class RitualGreenGrove extends Ritual { break; } - IBlockState state = world.getBlockState(newPos); + BlockState state = world.getBlockState(newPos); Block block = state.getBlock(); boolean hydratedBlock = false; @@ -169,21 +169,21 @@ public class RitualGreenGrove extends Ritual { if (corrosiveWill > corrosiveWillDrain) { AreaDescriptor leechRange = masterRitualStone.getBlockRange(LEECH_RANGE); AxisAlignedBB mobArea = leechRange.getAABB(pos); - List entityList = world.getEntitiesWithinAABB(EntityLivingBase.class, mobArea); - for (EntityLivingBase entityLiving : entityList) { + List entityList = world.getEntitiesWithinAABB(LivingEntity.class, mobArea); + for (LivingEntity entityLiving : entityList) { if (corrosiveWill < corrosiveWillDrain) { break; } - if (entityLiving instanceof EntityPlayer) { + if (entityLiving instanceof PlayerEntity) { continue; } - if (entityLiving.isPotionActive(RegistrarBloodMagic.PLANT_LEECH) || !entityLiving.isPotionApplicable(new PotionEffect(RegistrarBloodMagic.PLANT_LEECH))) { + if (entityLiving.isPotionActive(RegistrarBloodMagic.PLANT_LEECH) || !entityLiving.isPotionApplicable(new EffectInstance(RegistrarBloodMagic.PLANT_LEECH))) { continue; } - entityLiving.addPotionEffect(new PotionEffect(RegistrarBloodMagic.PLANT_LEECH, 200, 0)); + entityLiving.addPotionEffect(new EffectInstance(RegistrarBloodMagic.PLANT_LEECH, 200, 0)); corrosiveWill -= corrosiveWillDrain; corrosiveDrain += corrosiveWillDrain; @@ -266,8 +266,8 @@ public class RitualGreenGrove extends Ritual { } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info"), new TextComponentTranslation(this.getTranslationKey() + ".default.info"), new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info")}; + 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java index 2aa7a7d1..f3ee4078 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java @@ -6,13 +6,13 @@ import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.MoverType; -import net.minecraft.entity.boss.EntityDragon; -import net.minecraft.entity.boss.EntityWither; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.potion.PotionEffect; +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; @@ -65,19 +65,19 @@ public class RitualGrounding extends Ritual { /* Actual ritual stuff begins here */ AreaDescriptor groundingRange = masterRitualStone.getBlockRange(GROUNDING_RANGE); - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, groundingRange.getAABB(pos)); - for (EntityLivingBase entity : entities) { + List entities = world.getEntitiesWithinAABB(LivingEntity.class, groundingRange.getAABB(pos)); + for (LivingEntity entity : entities) { if (totalEffects >= maxEffects) { break; } - if (entity instanceof EntityPlayer && ((EntityPlayer) entity).isCreative()) + if (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative()) continue; totalEffects++; - if (entity instanceof EntityPlayer) { + if (entity instanceof PlayerEntity) { /* Raw will effect: Affects players */ if (world.getTotalWorldTime() % 10 == 0) { if (rawWill >= willDrain) { @@ -104,7 +104,7 @@ public class RitualGrounding extends Ritual { (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 EntityWither || entity instanceof EntityDragon) + 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; @@ -156,29 +156,29 @@ public class RitualGrounding extends Ritual { return new RitualGrounding(); } - public double[] sharedWillEffects(World world, EntityLivingBase entity, double corrosiveWill, double destructiveWill, double vengefulWill, double corrosiveDrained, double destructiveDrained, double vengefulDrained) { + 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 PotionEffect(MobEffects.LEVITATION, 20, 10)); + entity.addPotionEffect(new EffectInstance(Effects.LEVITATION, 20, 10)); vengefulDrained += willDrain; corrosiveDrained += willDrain; /* Corrosive will effect: Suspension */ } else if (corrosiveWill >= willDrain) { - entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SUSPENDED, 20, 0)); + entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SUSPENDED, 20, 0)); corrosiveDrained += willDrain; /* Vengeful will effect: Stronger effect */ } else if (vengefulWill >= willDrain) { vengefulDrained += willDrain; - entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.GROUNDED, 40, 20)); + entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.GROUNDED, 40, 20)); } else - entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.GROUNDED, 20, 10)); + entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.GROUNDED, 20, 10)); /* Destructive will effect: Increased fall damage */ if (destructiveWill >= willDrain) { @@ -188,11 +188,11 @@ public class RitualGrounding extends Ritual { if (vengefulWill >= willDrain + vengefulDrained) { if (world.getTotalWorldTime() % 100 == 0) { vengefulDrained += willDrain; - entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.HEAVY_HEART, 200, 2)); + entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.HEAVY_HEART, 200, 2)); } } else if (world.getTotalWorldTime() % 50 == 0) - entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.HEAVY_HEART, 100, 1)); + entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.HEAVY_HEART, 100, 1)); } return new double[]{corrosiveDrained, destructiveDrained, vengefulDrained}; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java index 7376d7e7..73cb2ed2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java @@ -5,11 +5,11 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; @@ -27,7 +27,7 @@ import java.util.function.Consumer; *

        * This ritual includes a way to change the range based on what block is above * the MasterRitualStone. You can use - * {@link HarvestRegistry#registerRangeAmplifier(net.minecraft.block.state.IBlockState, int)} to register a + * {@link HarvestRegistry#registerRangeAmplifier(BlockState, int)} to register a * new amplifier. */ @RitualRegister("harvest") @@ -89,11 +89,11 @@ public class RitualHarvest extends Ritual { } public static boolean harvestBlock(World world, BlockPos cropPos, BlockPos controllerPos) { - IBlockState harvestState = world.getBlockState(cropPos); + BlockState harvestState = world.getBlockState(cropPos); TileEntity potentialInventory = world.getTileEntity(controllerPos.up()); IItemHandler itemHandler = null; - if (potentialInventory != null && potentialInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) - itemHandler = potentialInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + 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)) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java index a1a38ea0..56d3323b 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -31,8 +31,8 @@ public class RitualInterdiction extends Ritual { AreaDescriptor interdictionRange = masterRitualStone.getBlockRange(INTERDICTION_RANGE); - for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, interdictionRange.getAABB(masterRitualStone.getBlockPos()))) { - if (entity instanceof EntityPlayer && (((EntityPlayer) entity).capabilities.isCreativeMode || ((EntityPlayer) entity).getGameProfile().getId().equals(masterRitualStone.getOwner()))) + 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); @@ -44,7 +44,7 @@ public class RitualInterdiction extends Ritual { entity.motionZ = 0.1 * zDif; entity.fallDistance = 0; - if (entity instanceof EntityPlayer) { + if (entity instanceof PlayerEntity) { entity.velocityChanged = true; } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java index d38f2085..bfc32dc2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java @@ -3,8 +3,8 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -38,8 +38,8 @@ public class RitualJumping extends Ritual { int totalEffects = 0; AreaDescriptor jumpRange = masterRitualStone.getBlockRange(JUMP_RANGE); - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, jumpRange.getAABB(masterRitualStone.getBlockPos())); - for (EntityLivingBase entity : entities) { + List entities = world.getEntitiesWithinAABB(LivingEntity.class, jumpRange.getAABB(masterRitualStone.getBlockPos())); + for (LivingEntity entity : entities) { if (totalEffects >= maxEffects) { break; } @@ -54,8 +54,8 @@ public class RitualJumping extends Ritual { entity.motionY = motionY; totalEffects++; - if (entity instanceof EntityPlayer) { - Utils.setPlayerSpeedFromServer((EntityPlayer) entity, entity.motionX, entity.motionY, entity.motionZ); + if (entity instanceof PlayerEntity) { + Utils.setPlayerSpeedFromServer((PlayerEntity) entity, entity.motionX, entity.motionY, entity.motionZ); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java index 2bddc06b..4c1f8d11 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java @@ -8,17 +8,17 @@ import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.potion.PotionEffect; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; @@ -84,7 +84,7 @@ public class RitualLava extends Ritual { } for (BlockPos newPos : lavaRange.getContainedPositions(pos)) { - IBlockState state = world.getBlockState(newPos); + BlockState state = world.getBlockState(newPos); if (world.isAirBlock(newPos) || Utils.isFlowingLiquid(state)) { int lpCost = getLPCostForRawWill(rawWill); if (currentEssence < lpCost) { @@ -134,19 +134,19 @@ public class RitualLava extends Ritual { AreaDescriptor fuseRange = masterRitualStone.getBlockRange(FIRE_FUSE_RANGE); AxisAlignedBB fuseArea = fuseRange.getAABB(pos); - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, fuseArea); + List entities = world.getEntitiesWithinAABB(LivingEntity.class, fuseArea); - for (EntityLivingBase entity : entities) { + for (LivingEntity entity : entities) { if (vengefulWill < vengefulWillDrain) { break; } - if (entity instanceof EntityPlayer) { + if (entity instanceof PlayerEntity) { continue; } if (!entity.isPotionActive(RegistrarBloodMagic.FIRE_FUSE)) { - entity.addPotionEffect(new PotionEffect(RegistrarBloodMagic.FIRE_FUSE, 100, 0)); + entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.FIRE_FUSE, 100, 0)); vengefulDrained += vengefulWillDrain; vengefulWill -= vengefulWillDrain; @@ -165,14 +165,14 @@ public class RitualLava extends Ritual { int duration = getFireResistForWill(steadfastWill); AxisAlignedBB resistArea = resistRange.getAABB(pos); - List entities = world.getEntitiesWithinAABB(EntityPlayer.class, resistArea); + List entities = world.getEntitiesWithinAABB(PlayerEntity.class, resistArea); - for (EntityPlayer entity : entities) { + for (PlayerEntity entity : entities) { if (steadfastWill < steadfastWillDrain) { break; } - if (!entity.isPotionActive(MobEffects.FIRE_RESISTANCE) || (entity.getActivePotionEffect(MobEffects.FIRE_RESISTANCE).getDuration() < 2)) { - entity.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, 100, 0)); + 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; @@ -191,9 +191,9 @@ public class RitualLava extends Ritual { float damage = getCorrosiveDamageForWill(corrosiveWill); AxisAlignedBB damageArea = resistRange.getAABB(pos); - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, damageArea); + List entities = world.getEntitiesWithinAABB(LivingEntity.class, damageArea); - for (EntityLivingBase entity : entities) { + for (LivingEntity entity : entities) { if (corrosiveWill < corrosiveWillDrain) { break; } @@ -229,8 +229,8 @@ public class RitualLava extends Ritual { } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info"), new TextComponentTranslation(this.getTranslationKey() + ".default.info"), new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info")}; + 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java index 0d633b79..dcf2d4d7 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java @@ -9,14 +9,14 @@ import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.item.EntityItemFrame; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; +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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; @@ -52,7 +52,7 @@ public class RitualLivingArmourDowngrade extends Ritual { AreaDescriptor downgradeRange = masterRitualStone.getBlockRange(DOWNGRADE_RANGE); boolean isActivatorPresent = false; - for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, downgradeRange.getAABB(masterRitualStone.getBlockPos()))) { + 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()) { @@ -67,12 +67,12 @@ public class RitualLivingArmourDowngrade extends Ritual { internalTimer++; if (player.isSneaking()) { - double distance2 = masterPos.offset(EnumFacing.UP).distanceSqToCenter(player.posX, player.posY, player.posZ); + 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(EnumFacing.UP); + BlockPos chestPos = masterPos.offset(masterRitualStone.getDirection(), 2).offset(Direction.UP); TileEntity tile = world.getTileEntity(chestPos); if (tile == null) { return; @@ -91,7 +91,7 @@ public class RitualLivingArmourDowngrade extends Ritual { if (recipe != null) { LivingArmourUpgrade upgrade = recipe.getRecipeOutput(); if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { if (armour.canApplyUpgrade(player, upgrade)) { @@ -100,7 +100,7 @@ public class RitualLivingArmourDowngrade extends Ritual { recipe.consumeInventory(inv); - EntityLightningBolt lightning = new EntityLightningBolt(world, chestPos.getX(), chestPos.getY(), chestPos.getZ(), true); + LightningBoltEntity lightning = new LightningBoltEntity(world, chestPos.getX(), chestPos.getY(), chestPos.getZ(), true); world.spawnEntity(lightning); masterRitualStone.setActive(false); @@ -125,26 +125,26 @@ public class RitualLivingArmourDowngrade extends Ritual { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { super.readFromNBT(tag); this.internalTimer = tag.getInteger("internalTimer"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { super.writeToNBT(tag); tag.setInteger("internalTimer", internalTimer); } - public ItemStack getStackFromItemFrame(World world, BlockPos masterPos, EnumFacing direction) { + 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(EntityItemFrame.class, bb); - for (EntityItemFrame frame : frames) { + List frames = world.getEntitiesWithinAABB(ItemFrameEntity.class, bb); + for (ItemFrameEntity frame : frames) { if (!frame.getDisplayedItem().isEmpty()) { return frame.getDisplayedItem(); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java index 108b7c50..5be8d54a 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java @@ -5,14 +5,14 @@ import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; import com.mojang.authlib.GameProfile; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; +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.WorldServer; +import net.minecraft.world.ServerWorld; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayerFactory; @@ -59,7 +59,7 @@ public class RitualMagnetic extends Ritual { } } - IBlockState downState = world.getBlockState(pos.down()); + BlockState downState = world.getBlockState(pos.down()); int radius = getRadius(downState.getBlock()); if (replace) { @@ -78,9 +78,9 @@ public class RitualMagnetic extends Ritual { while (k <= radius) { BlockPos newPos = pos.add(i, j, k); Vec3d newPosVector = new Vec3d(newPos); - IBlockState state = world.getBlockState(newPos); + BlockState state = world.getBlockState(newPos); RayTraceResult fakeRayTrace = world.rayTraceBlocks(MRSpos, newPosVector, false); - ItemStack checkStack = state.getBlock().getPickBlock(state, fakeRayTrace, world, newPos, getFakePlayer((WorldServer) world)); + 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())); @@ -145,7 +145,7 @@ public class RitualMagnetic extends Ritual { return new RitualMagnetic(); } - private FakePlayer getFakePlayer(WorldServer world) { + private FakePlayer getFakePlayer(ServerWorld world) { return fakePlayer == null ? fakePlayer = FakePlayerFactory.get(world, new GameProfile(null, BloodMagic.MODID + "_ritual_magnetic")) : fakePlayer; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java index 9579495f..38919ab6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java @@ -8,7 +8,7 @@ import WayofTime.bloodmagic.meteor.Meteor; import WayofTime.bloodmagic.meteor.MeteorRegistry; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -44,7 +44,7 @@ public class RitualMeteor extends Ritual { double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); AreaDescriptor itemDetectionRange = masterRitualStone.getBlockRange(ITEM_RANGE); - List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDetectionRange.getAABB(pos)); + List itemList = world.getEntitiesWithinAABB(ItemEntity.class, itemDetectionRange.getAABB(pos)); double radiusModifier = getRadiusModifier(rawWill); double explosionModifier = getExplosionModifier(steadfastWill); @@ -52,7 +52,7 @@ public class RitualMeteor extends Ritual { boolean successful = false; - for (EntityItem entityItem : itemList) { + for (ItemEntity entityItem : itemList) { ItemStack stack = entityItem.getItem(); Meteor meteor = MeteorRegistry.getMeteorForItem(stack); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java index 5407b258..a5173a28 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java @@ -3,11 +3,11 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.ItemBlock; +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; @@ -46,8 +46,8 @@ public class RitualPlacer extends Ritual { AreaDescriptor areaDescriptor = masterRitualStone.getBlockRange(PLACER_RANGE); if (tileEntity != null) { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.DOWN); + if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN)) { + IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN); if (itemHandler.getSlots() <= 0) { return; @@ -60,10 +60,10 @@ public class RitualPlacer extends Ritual { for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) { ItemStack stack = itemHandler.extractItem(invSlot, 1, true); - if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) + if (stack.isEmpty() || !(stack.getItem() instanceof BlockItem)) continue; - IBlockState placeState = Block.getBlockFromItem(itemHandler.getStackInSlot(invSlot).getItem()).getStateFromMeta(itemHandler.getStackInSlot(invSlot).getItemDamage()); + BlockState placeState = Block.getBlockFromItem(itemHandler.getStackInSlot(invSlot).getItem()).getStateFromMeta(itemHandler.getStackInSlot(invSlot).getItemDamage()); world.setBlockState(blockPos, placeState); itemHandler.extractItem(invSlot, 1, false); tileEntity.markDirty(); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java index 8ec0b006..c64a1713 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java @@ -6,10 +6,10 @@ 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.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +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; @@ -22,28 +22,28 @@ public class RitualPortal extends Ritual { public static final String PORTAL_NBT_TAG = "PortalRitualTag"; public static final String PORTAL_ID_TAG = "PortalRitualID"; - private NBTTagCompound portalRitualTag; + private CompoundNBT portalRitualTag; public RitualPortal() { super("ritualPortal", 0, 50000, "ritual." + BloodMagic.MODID + ".portalRitual"); - portalRitualTag = new NBTTagCompound(); + portalRitualTag = new CompoundNBT(); } @Override - public boolean activateRitual(IMasterRitualStone masterRitualStone, EntityPlayer player, UUID owner) { + 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(); - EnumFacing direction = masterRitualStone.getDirection(); + Direction direction = masterRitualStone.getDirection(); String name = owner.toString(); - IBlockState blockState; + BlockState blockState; if (!world.isRemote) { portalRitualTag.removeTag(PORTAL_ID_TAG); - if (direction == EnumFacing.NORTH || direction == EnumFacing.SOUTH) { + 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)) { @@ -64,7 +64,7 @@ public class RitualPortal extends Ritual { name = addStringToEnd(name, ForgeRegistries.BLOCKS.getKey(blockState.getBlock()) + String.valueOf(blockState.getBlock().getMetaFromState(blockState))); } } - } else if (direction == EnumFacing.EAST || direction == EnumFacing.WEST) { + } 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)) { @@ -105,15 +105,15 @@ public class RitualPortal extends Ritual { int x = masterRitualStone.getBlockPos().getX(); int y = masterRitualStone.getBlockPos().getY(); int z = masterRitualStone.getBlockPos().getZ(); - EnumFacing direction = masterRitualStone.getDirection(); + Direction direction = masterRitualStone.getDirection(); - if (direction == EnumFacing.NORTH || direction == EnumFacing.SOUTH) { + 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)) { - IBlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(0); + BlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(0); world.setBlockState(tempPos, blockState, 3); if (world.getTileEntity(tempPos) != null && world.getTileEntity(tempPos) instanceof TileDimensionalPortal) { @@ -124,12 +124,12 @@ public class RitualPortal extends Ritual { } } } - } else if (direction == EnumFacing.EAST || direction == EnumFacing.WEST) { + } 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)) { - IBlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(1); + BlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(1); world.setBlockState(tempPos, blockState, 3); if (world.getTileEntity(tempPos) != null && world.getTileEntity(tempPos) instanceof TileDimensionalPortal) { @@ -150,11 +150,11 @@ public class RitualPortal extends Ritual { int x = masterRitualStone.getBlockPos().getX(); int y = masterRitualStone.getBlockPos().getY(); int z = masterRitualStone.getBlockPos().getZ(); - EnumFacing direction = masterRitualStone.getDirection(); + Direction direction = masterRitualStone.getDirection(); LocationsHandler.getLocationsHandler().removeLocation(portalRitualTag.getString(PORTAL_ID_TAG), new PortalLocation(x, y + 1, z, world.provider.getDimension())); - if (direction == EnumFacing.NORTH || direction == EnumFacing.SOUTH) { + 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) { @@ -162,7 +162,7 @@ public class RitualPortal extends Ritual { } } } - } else if (direction == EnumFacing.EAST || direction == EnumFacing.WEST) { + } 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) { @@ -207,20 +207,20 @@ public class RitualPortal extends Ritual { } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(CompoundNBT tag) { super.readFromNBT(tag); portalRitualTag = tag.getCompoundTag(PORTAL_NBT_TAG); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(CompoundNBT tag) { super.writeToNBT(tag); tag.setTag(PORTAL_NBT_TAG, portalRitualTag); } - public IBlockState getBlockState(World world, int x, int y, int z) { + public BlockState getBlockState(World world, int x, int y, int z) { return world.getBlockState(new BlockPos(x, y, z)); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java index 957145c0..c98e359d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java @@ -4,10 +4,10 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import com.google.common.collect.Lists; import net.minecraft.block.BlockLiquid; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; @@ -48,16 +48,16 @@ public class RitualPump extends Ritual { return; } - if (tileEntity != null && tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN)) { - IFluidHandler fluidHandler = tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN); - IBlockState tankState = world.getBlockState(masterRitualStone.getBlockPos().up()); + 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())) { - IBlockState state = world.getBlockState(pos); + BlockState state = world.getBlockState(pos); IFluidHandler blockHandler = null; if (state.getBlock() instanceof BlockLiquid) blockHandler = new BlockLiquidWrapper((BlockLiquid) state.getBlock(), world, pos); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java index 50db44a2..fcd279d0 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java @@ -6,10 +6,10 @@ import WayofTime.bloodmagic.util.DamageSourceBloodMagic; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.potion.PotionEffect; +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; @@ -77,17 +77,17 @@ public class RitualRegeneration extends Ritual { AreaDescriptor damageArea = masterRitualStone.getBlockRange(VAMPIRE_RANGE); AxisAlignedBB damageRange = damageArea.getAABB(pos); - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, healRange); - List players = world.getEntitiesWithinAABB(EntityPlayer.class, healRange); - List damagedEntities = world.getEntitiesWithinAABB(EntityLivingBase.class, damageRange); + List entities = world.getEntitiesWithinAABB(LivingEntity.class, healRange); + List players = world.getEntitiesWithinAABB(PlayerEntity.class, healRange); + List damagedEntities = world.getEntitiesWithinAABB(LivingEntity.class, damageRange); if (syphonHealth) { - for (EntityPlayer player : players) { + for (PlayerEntity player : players) { if (player.getHealth() <= player.getMaxHealth() - 1) { float syphonedHealthAmount = getSyphonAmountForWill(corrosiveWill); Collections.shuffle(damagedEntities); - for (EntityLivingBase damagedEntity : damagedEntities) { - if (damagedEntity instanceof EntityPlayer) { + for (LivingEntity damagedEntity : damagedEntities) { + if (damagedEntity instanceof PlayerEntity) { continue; } @@ -108,11 +108,11 @@ public class RitualRegeneration extends Ritual { } } - for (EntityLivingBase entity : entities) { + for (LivingEntity entity : entities) { float health = entity.getHealth(); if (health <= entity.getMaxHealth() - 1) { - if (entity.isPotionApplicable(new PotionEffect(MobEffects.REGENERATION))) { - if (entity instanceof EntityPlayer) { + if (entity.isPotionApplicable(new EffectInstance(Effects.REGENERATION))) { + if (entity instanceof PlayerEntity) { totalCost += getRefreshCost(); currentEssence -= getRefreshCost(); } else { @@ -120,7 +120,7 @@ public class RitualRegeneration extends Ritual { currentEssence -= getRefreshCost() / 10; } - entity.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 50, 0, false, false)); + entity.addPotionEffect(new EffectInstance(Effects.REGENERATION, 50, 0, false, false)); totalEffects++; @@ -129,7 +129,7 @@ public class RitualRegeneration extends Ritual { } } } - if (applyAbsorption && entity instanceof EntityPlayer) { + if (applyAbsorption && entity instanceof PlayerEntity) { if (applyAbsorption) { float added = Utils.addAbsorptionToMaximum(entity, absorptionRate, maxAbsorption, 1000); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java index 244c038e..38ecde78 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java @@ -5,12 +5,12 @@ import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.EnumFacing; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import java.util.List; @@ -60,7 +60,7 @@ public class RitualSpeed extends Ritual { rawWill = 0; //Simplifies later calculations } - for (EntityLivingBase entity : world.getEntitiesWithinAABB(EntityLivingBase.class, speedRange.getAABB(masterRitualStone.getBlockPos()))) { + for (LivingEntity entity : world.getEntitiesWithinAABB(LivingEntity.class, speedRange.getAABB(masterRitualStone.getBlockPos()))) { if (entity.isSneaking()) continue; @@ -71,7 +71,7 @@ public class RitualSpeed extends Ritual { continue; } - if (entity instanceof EntityPlayer && (transportChildren ^ transportAdults)) { + if (entity instanceof PlayerEntity && (transportChildren ^ transportAdults)) { continue; } @@ -87,7 +87,7 @@ public class RitualSpeed extends Ritual { double motionY = getVerticalSpeedForWill(rawWill); double speed = getHorizontalSpeedForWill(rawWill); - EnumFacing direction = masterRitualStone.getDirection(); + Direction direction = masterRitualStone.getDirection(); if (rawWill >= rawWillDrain) { rawWill -= rawWillDrain; @@ -125,8 +125,8 @@ public class RitualSpeed extends Ritual { break; } - if (entity instanceof EntityPlayer) { - Utils.setPlayerSpeedFromServer((EntityPlayer) entity, entity.motionX, entity.motionY, entity.motionZ); + if (entity instanceof PlayerEntity) { + Utils.setPlayerSpeedFromServer((PlayerEntity) entity, entity.motionX, entity.motionY, entity.motionZ); } } @@ -170,8 +170,8 @@ public class RitualSpeed extends Ritual { } @Override - public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new ITextComponent[]{new TextComponentTranslation(this.getTranslationKey() + ".info"), new TextComponentTranslation(this.getTranslationKey() + ".default.info"), new TextComponentTranslation(this.getTranslationKey() + ".corrosive.info"), new TextComponentTranslation(this.getTranslationKey() + ".steadfast.info"), new TextComponentTranslation(this.getTranslationKey() + ".destructive.info"), new TextComponentTranslation(this.getTranslationKey() + ".vengeful.info")}; + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java index bbf02e04..157bd08d 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java @@ -4,7 +4,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileSpectralBlock; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -34,7 +34,7 @@ public class RitualSuppression extends Ritual { AreaDescriptor suppressionRange = masterRitualStone.getBlockRange(SUPPRESSION_RANGE); for (BlockPos blockPos : suppressionRange.getContainedPositions(masterRitualStone.getBlockPos())) { - IBlockState state = world.getBlockState(blockPos); + BlockState state = world.getBlockState(blockPos); if (Utils.isBlockLiquid(state) && world.getTileEntity(blockPos) == null) TileSpectralBlock.createSpectralBlock(world, blockPos, refresh); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java index 1addb3c6..e322fec6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java @@ -9,9 +9,9 @@ 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.EntityLightningBolt; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -42,9 +42,9 @@ public class RitualUpgradeRemove extends Ritual { AreaDescriptor checkRange = masterRitualStone.getBlockRange(CHECK_RANGE); - List playerList = world.getEntitiesWithinAABB(EntityPlayer.class, checkRange.getAABB(pos)); + List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, checkRange.getAABB(pos)); - for (EntityPlayer player : playerList) { + for (PlayerEntity player : playerList) { if (LivingArmour.hasFullSet(player)) { boolean removedUpgrade = false; @@ -66,7 +66,7 @@ public class RitualUpgradeRemove extends Ritual { if (successful) { removedUpgrade = true; - world.spawnEntity(new EntityItem(world, player.posX, player.posY, player.posZ, upgradeStack)); + 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) { @@ -85,7 +85,7 @@ public class RitualUpgradeRemove extends Ritual { masterRitualStone.setActive(false); - world.spawnEntity(new EntityLightningBolt(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); + world.spawnEntity(new LightningBoltEntity(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java index 27a7b7fd..a06bbfcb 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; -import net.minecraft.init.Blocks; +import net.minecraft.block.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java index 921963ff..96637f32 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java @@ -4,8 +4,8 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.impl.BloodMagicAPI; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.tile.TileAltar; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +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; @@ -74,9 +74,9 @@ public class RitualWellOfSuffering extends Ritual { AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); AxisAlignedBB range = damageRange.getAABB(pos); - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, range); + List entities = world.getEntitiesWithinAABB(LivingEntity.class, range); - for (EntityLivingBase entity : entities) { + for (LivingEntity entity : entities) { EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); if (entityEntry == null || BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) @@ -87,7 +87,7 @@ public class RitualWellOfSuffering extends Ritual { if (lifeEssenceRatio <= 0) continue; - if (entity.isEntityAlive() && !(entity instanceof EntityPlayer)) { + if (entity.isEntityAlive() && !(entity instanceof PlayerEntity)) { if (entity.attackEntityFrom(RitualManager.RITUAL_DAMAGE, 1)) { if (entity.isChild()) lifeEssenceRatio *= 0.5F; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java index 1690ac88..5ca867d6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java @@ -3,10 +3,10 @@ package WayofTime.bloodmagic.ritual.types; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -42,17 +42,17 @@ public class RitualZephyr extends Ritual { AreaDescriptor zephyrRange = masterRitualStone.getBlockRange(ZEPHYR_RANGE); - List itemList = world.getEntitiesWithinAABB(EntityItem.class, zephyrRange.getAABB(masterRitualStone.getBlockPos())); + List itemList = world.getEntitiesWithinAABB(ItemEntity.class, zephyrRange.getAABB(masterRitualStone.getBlockPos())); int count = 0; - for (EntityItem entityItem : itemList) { + for (ItemEntity entityItem : itemList) { if (entityItem.isDead) { continue; } ItemStack copyStack = entityItem.getItem().copy(); int originalAmount = copyStack.getCount(); - ItemStack newStack = Utils.insertStackIntoTile(copyStack, tileInventory, EnumFacing.DOWN); + ItemStack newStack = Utils.insertStackIntoTile(copyStack, tileInventory, Direction.DOWN); if (!newStack.isEmpty() && newStack.getCount() < originalAmount) { count++; diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java index 9d2a87ed..674232c4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java @@ -3,8 +3,8 @@ 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.EntityPlayer; -import net.minecraft.init.Blocks; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.block.Blocks; //@RitualRegister.Imperfect("day") public class ImperfectRitualDay extends ImperfectRitual { @@ -13,7 +13,7 @@ public class ImperfectRitualDay extends ImperfectRitual { } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { if (!imperfectRitualStone.getRitualWorld().isRemote) imperfectRitualStone.getRitualWorld().setWorldTime((imperfectRitualStone.getRitualWorld().getWorldTime() / 24000) * 24000); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java index f5a8746b..31fa5e29 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java @@ -4,8 +4,8 @@ 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.EntityPlayer; -import net.minecraft.init.Blocks; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.block.Blocks; @RitualRegister.Imperfect("night") public class ImperfectRitualNight extends ImperfectRitual { @@ -14,7 +14,7 @@ public class ImperfectRitualNight extends ImperfectRitual { } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { if (!imperfectRitualStone.getRitualWorld().isRemote) imperfectRitualStone.getRitualWorld().setWorldTime((imperfectRitualStone.getRitualWorld().getWorldTime() / 24000) * 24000 + 13800); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java index b7790a1e..963a77f2 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java @@ -4,8 +4,8 @@ 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.EntityPlayer; -import net.minecraft.init.Blocks; +import net.minecraft.block.Blocks; +import net.minecraft.entity.player.PlayerEntity; @RitualRegister.Imperfect("rain") public class ImperfectRitualRain extends ImperfectRitual { @@ -14,7 +14,7 @@ public class ImperfectRitualRain extends ImperfectRitual { } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { if (!imperfectRitualStone.getRitualWorld().isRemote) { imperfectRitualStone.getRitualWorld().getWorldInfo().setRaining(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 index b0281f53..6ba7d951 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java @@ -4,10 +4,10 @@ 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.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.potion.PotionEffect; +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 { @@ -16,9 +16,9 @@ public class ImperfectRitualResistance extends ImperfectRitual { } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { + public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { - player.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, 1200, 1)); + 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 index bc8cb7cf..a0fc85ec 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java @@ -4,11 +4,11 @@ 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.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.potion.PotionEffect; +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 { @@ -17,12 +17,12 @@ public class ImperfectRitualZombie extends ImperfectRitual { } @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, EntityPlayer player) { - EntityZombie zombie = new EntityZombie(imperfectRitualStone.getRitualWorld()); + 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 PotionEffect(MobEffects.FIRE_RESISTANCE, 2000)); - zombie.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, 20000, 7)); - zombie.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, 20000, 3)); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java index 97bfdb01..0c795a44 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.routing; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; public interface IFluidRoutingNode extends IRoutingNode { - boolean isTankConnectedToSide(EnumFacing side); + boolean isTankConnectedToSide(Direction side); - int getPriority(EnumFacing 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 index 8f8e7a6d..697df7dc 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.routing; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; public interface IInputFluidRoutingNode extends IFluidRoutingNode { - boolean isFluidInput(EnumFacing side); + boolean isFluidInput(Direction side); - IFluidFilter getInputFluidFilterForSide(EnumFacing 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 index 6e833a54..1d19cfa8 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.routing; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; public interface IInputItemRoutingNode extends IItemRoutingNode { - boolean isInput(EnumFacing side); + boolean isInput(Direction side); - IItemFilter getInputFilterForSide(EnumFacing side); + IItemFilter getInputFilterForSide(Direction side); } diff --git a/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java index d52126a0..21dee0c6 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.routing; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; public interface IItemRoutingNode extends IRoutingNode { - boolean isInventoryConnectedToSide(EnumFacing side); + boolean isInventoryConnectedToSide(Direction side); - int getPriority(EnumFacing side); + int getPriority(Direction side); } diff --git a/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java index 08c3ce67..5ef76540 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.routing; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; public interface IOutputFluidRoutingNode extends IFluidRoutingNode { - boolean isFluidOutput(EnumFacing side); + boolean isFluidOutput(Direction side); - IFluidFilter getOutputFluidFilterForSide(EnumFacing 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 index 819e2813..8bf50ec4 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.routing; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; public interface IOutputItemRoutingNode extends IItemRoutingNode { - boolean isOutput(EnumFacing side); + boolean isOutput(Direction side); - IItemFilter getOutputFilterForSide(EnumFacing side); + IItemFilter getOutputFilterForSide(Direction side); } diff --git a/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java index 5ac2397d..84c06e33 100644 --- a/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java +++ b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.soul; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import java.util.HashMap; import java.util.Map.Entry; @@ -53,8 +53,8 @@ public class DemonWillHolder { return 0; } - public void readFromNBT(NBTTagCompound tag, String key) { - NBTTagCompound willTag = tag.getCompoundTag(key); + public void readFromNBT(CompoundNBT tag, String key) { + CompoundNBT willTag = tag.getCompoundTag(key); willMap.clear(); @@ -66,8 +66,8 @@ public class DemonWillHolder { } } - public void writeToNBT(NBTTagCompound tag, String key) { - NBTTagCompound willTag = new NBTTagCompound(); + public void writeToNBT(CompoundNBT tag, String key) { + CompoundNBT willTag = new CompoundNBT(); for (Entry entry : willMap.entrySet()) { willTag.setDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); } diff --git a/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java index f90c2c98..3a56b4c4 100644 --- a/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java +++ b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.soul; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import java.util.List; public interface IDemonWillWeapon { - List getRandomDemonWillDrop(EntityLivingBase killedEntity, EntityLivingBase attackingEntity, ItemStack stack, int looting); + List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting); } diff --git a/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java index 89d3b97a..51f080d8 100644 --- a/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.soul; import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; @@ -19,7 +19,7 @@ public class PlayerDemonWillHandler { * @param player - The player to check the will of * @return - The amount of will the player contains */ - public static double getTotalDemonWill(EnumDemonWillType type, EntityPlayer player) { + public static double getTotalDemonWill(EnumDemonWillType type, PlayerEntity player) { NonNullList inventory = player.inventory.mainInventory; double souls = 0; @@ -34,7 +34,7 @@ public class PlayerDemonWillHandler { return souls; } - public static EnumDemonWillType getLargestWillType(EntityPlayer player) { + public static EnumDemonWillType getLargestWillType(PlayerEntity player) { EnumDemonWillType type = EnumDemonWillType.DEFAULT; double max = getTotalDemonWill(type, player); @@ -55,7 +55,7 @@ public class PlayerDemonWillHandler { * @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, EntityPlayer player) { + public static boolean isDemonWillFull(EnumDemonWillType type, PlayerEntity player) { NonNullList inventory = player.inventory.mainInventory; boolean hasGem = false; @@ -77,7 +77,7 @@ public class PlayerDemonWillHandler { * @param amount - The amount of will to consume * @return - The amount of will consumed. */ - public static double consumeDemonWill(EnumDemonWillType type, EntityPlayer player, double amount) { + public static double consumeDemonWill(EnumDemonWillType type, PlayerEntity player, double amount) { double consumed = 0; NonNullList inventory = player.inventory.mainInventory; @@ -107,7 +107,7 @@ public class PlayerDemonWillHandler { * @param willStack - ItemStack that contains an IDemonWill to be added * @return - The modified willStack */ - public static ItemStack addDemonWill(EntityPlayer player, ItemStack willStack) { + public static ItemStack addDemonWill(PlayerEntity player, ItemStack willStack) { if (willStack.isEmpty()) return ItemStack.EMPTY; @@ -133,7 +133,7 @@ public class PlayerDemonWillHandler { * @param amount - The amount of will to add * @return - The amount of will added */ - public static double addDemonWill(EnumDemonWillType type, EntityPlayer player, double amount) { + public static double addDemonWill(EnumDemonWillType type, PlayerEntity player, double amount) { NonNullList inventory = player.inventory.mainInventory; double remaining = amount; @@ -158,7 +158,7 @@ public class PlayerDemonWillHandler { * @param ignored - A stack to ignore * @return - The amount of will added */ - public static double addDemonWill(EnumDemonWillType type, EntityPlayer player, double amount, ItemStack ignored) { + public static double addDemonWill(EnumDemonWillType type, PlayerEntity player, double amount, ItemStack ignored) { NonNullList inventory = player.inventory.mainInventory; double remaining = amount; diff --git a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java index bf1d7826..a9897ce0 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java @@ -7,15 +7,15 @@ 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.WorldServer; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; +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, WorldServer world, BlockPos pos, int iteration) { + public boolean placeStructureAtPosition(Random rand, Rotation baseRotation, ServerWorld world, BlockPos pos, int iteration) { if (pos == null) return false; diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index dab32935..0575197a 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -2,22 +2,22 @@ package WayofTime.bloodmagic.structures; import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.util.EnumFacing; +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.WorldServer; -import net.minecraft.world.gen.structure.template.PlacementSettings; +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, WorldServer world, BlockPos pos) { + 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. + 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 @@ -37,7 +37,7 @@ public class Dungeon { DungeonRoom room = getRandomRoom(rand); roomMap.put(pos, Pair.of(room, settings.copy())); descriptorList.addAll(room.getAreaDescriptors(settings, pos)); - for (EnumFacing facing : EnumFacing.VALUES) { + for (Direction facing : Direction.VALUES) { if (availableDoorMap.containsKey(facing)) { List doorList = availableDoorMap.get(facing); doorList.addAll(room.getDoorOffsetsForFacing(settings, facing, pos)); @@ -49,8 +49,8 @@ public class Dungeon { //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()) { + List facingList = new ArrayList<>(); + for (Entry> entry : availableDoorMap.entrySet()) { if (entry.getValue() != null && !entry.getValue().isEmpty()) { facingList.add(entry.getKey()); } @@ -58,12 +58,12 @@ public class Dungeon { Collections.shuffle(facingList); //Shuffle the list so that it is random what is chosen - Pair removedDoor1 = null; - Pair removedDoor2 = null; + Pair removedDoor1 = null; + Pair removedDoor2 = null; BlockPos roomLocation = null; - for (EnumFacing doorFacing : facingList) { - EnumFacing oppositeDoorFacing = doorFacing.getOpposite(); + for (Direction doorFacing : facingList) { + Direction oppositeDoorFacing = doorFacing.getOpposite(); List availableDoorList = availableDoorMap.get(doorFacing); //May need to copy here Collections.shuffle(availableDoorList); @@ -105,7 +105,7 @@ public class Dungeon { } if (removedDoor1 != null) { - for (EnumFacing facing : EnumFacing.VALUES) { + for (Direction facing : Direction.VALUES) { if (availableDoorMap.containsKey(facing)) { List doorList = availableDoorMap.get(facing); doorList.addAll(room.getDoorOffsetsForFacing(settings, facing, roomLocation)); @@ -115,14 +115,14 @@ public class Dungeon { } } - EnumFacing face = removedDoor1.getKey(); + Direction face = removedDoor1.getKey(); if (availableDoorMap.containsKey(face)) { availableDoorMap.get(face).remove(removedDoor1.getRight()); } } if (removedDoor2 != null) { - EnumFacing face = removedDoor2.getKey(); + Direction face = removedDoor2.getKey(); if (availableDoorMap.containsKey(face)) { availableDoorMap.get(face).remove(removedDoor2.getRight()); } diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java index cef16685..76b242bd 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.structures; import WayofTime.bloodmagic.ritual.AreaDescriptor; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldServer; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; +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; @@ -15,10 +15,10 @@ 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 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) { + public DungeonRoom(Map structureMap, Map> doorMap, List descriptorList) { this.structureMap = structureMap; this.doorMap = doorMap; this.descriptorList = descriptorList; @@ -34,10 +34,10 @@ public class DungeonRoom { return newList; } - public List getDoorOffsetsForFacing(PlacementSettings settings, EnumFacing facing, BlockPos offset) { + public List getDoorOffsetsForFacing(PlacementSettings settings, Direction facing, BlockPos offset) { List offsetList = new ArrayList<>(); - EnumFacing originalFacing = DungeonUtil.reverseRotate(settings.getMirror(), settings.getRotation(), facing); + Direction originalFacing = DungeonUtil.reverseRotate(settings.getMirror(), settings.getRotation(), facing); if (doorMap.containsKey(originalFacing)) { List doorList = doorMap.get(originalFacing); for (BlockPos doorPos : doorList) { @@ -48,7 +48,7 @@ public class DungeonRoom { return offsetList; } - public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, WorldServer world, BlockPos pos) { + 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); diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java index 198869e6..7f5b8705 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java @@ -4,10 +4,10 @@ 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.WorldServer; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; +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; @@ -18,7 +18,7 @@ public class DungeonStructure { this.resource = resource; } - public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, WorldServer world, BlockPos pos) { + public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, ServerWorld world, BlockPos pos) { if (pos == null) return false; diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java index 70bc4aaf..68483ead 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java @@ -1,16 +1,16 @@ package WayofTime.bloodmagic.structures; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldServer; +import net.minecraft.world.ServerWorld; import java.util.Random; public class DungeonTester { - public static void testDungeonGeneration(WorldServer world, BlockPos pos) { + public static void testDungeonGeneration(ServerWorld world, BlockPos pos) { } - public static void testDungeonElementWithOutput(WorldServer 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"); // diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java index ddf6c518..31cbbb1c 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java @@ -1,25 +1,25 @@ package WayofTime.bloodmagic.structures; -import net.minecraft.util.EnumFacing; +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.structure.template.PlacementSettings; +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 EnumFacing rotate(Mirror mirror, Rotation rotation, EnumFacing original) { + public static Direction rotate(Mirror mirror, Rotation rotation, Direction original) { return rotation.rotate(mirror.mirror(original)); } - public static EnumFacing reverseRotate(Mirror mirror, Rotation rotation, EnumFacing original) { + public static Direction reverseRotate(Mirror mirror, Rotation rotation, Direction original) { return mirror.mirror(getOppositeRotation(rotation).rotate(original)); } - public static EnumFacing getFacingForSettings(PlacementSettings settings, EnumFacing original) { + public static Direction getFacingForSettings(PlacementSettings settings, Direction original) { return rotate(settings.getMirror(), settings.getRotation(), original); } @@ -34,7 +34,7 @@ public class DungeonUtil { } } - public static void addRoom(Map> doorMap, EnumFacing facing, BlockPos offsetPos) { + public static void addRoom(Map> doorMap, Direction facing, BlockPos offsetPos) { if (doorMap.containsKey(facing)) { doorMap.get(facing).add(offsetPos); } else { diff --git a/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java b/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java index ccb55eeb..37460c8f 100644 --- a/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.teleport; import WayofTime.bloodmagic.util.Constants; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; import java.io.Serializable; @@ -23,8 +23,8 @@ public class PortalLocation implements Serializable { this(blockPos.getX(), blockPos.getY(), blockPos.getZ(), dimension); } - public NBTTagCompound writeToNBT(NBTTagCompound tag) { - NBTTagCompound locationTag = new NBTTagCompound(); + public CompoundNBT writeToNBT(CompoundNBT tag) { + CompoundNBT locationTag = new CompoundNBT(); locationTag.setInteger(Constants.NBT.X_COORD, x); locationTag.setInteger(Constants.NBT.Y_COORD, y); @@ -80,9 +80,9 @@ public class PortalLocation implements Serializable { return dimension; } - public static PortalLocation readFromNBT(NBTTagCompound tag) { + public static PortalLocation readFromNBT(CompoundNBT tag) { if (tag.hasKey(Constants.NBT.PORTAL_LOCATION)) { - NBTTagCompound locationTag = tag.getCompoundTag(Constants.NBT.PORTAL_LOCATION); + CompoundNBT locationTag = tag.getCompoundTag(Constants.NBT.PORTAL_LOCATION); return new PortalLocation(locationTag.getInteger(Constants.NBT.X_COORD), locationTag.getInteger(Constants.NBT.Y_COORD), locationTag.getInteger(Constants.NBT.Z_COORD), locationTag.getInteger(Constants.NBT.DIMENSION_ID)); } return null; diff --git a/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java b/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java index 4a02d90a..8ff084ce 100644 --- a/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java @@ -3,10 +3,10 @@ package WayofTime.bloodmagic.teleport; import net.minecraft.entity.Entity; import net.minecraft.util.math.MathHelper; import net.minecraft.world.Teleporter; -import net.minecraft.world.WorldServer; +import net.minecraft.world.ServerWorld; public class TeleporterBloodMagic extends Teleporter { - public TeleporterBloodMagic(WorldServer worldServer) { + public TeleporterBloodMagic(ServerWorld worldServer) { super(worldServer); } diff --git a/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java b/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java index 646480f3..e5ff2b56 100644 --- a/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java @@ -6,23 +6,22 @@ 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.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.SoundEvents; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.play.server.SPacketEntityEffect; -import net.minecraft.network.play.server.SPacketPlayerAbilities; -import net.minecraft.network.play.server.SPacketRespawn; -import net.minecraft.network.play.server.SPacketUpdateHealth; -import net.minecraft.potion.PotionEffect; +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.TextComponentString; +import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; +import net.minecraft.world.ServerWorld; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -49,7 +48,7 @@ public class Teleports { BlockPos targetTeleposer = new BlockPos(x, y, z); if (entity.timeUntilPortal <= 0) { entity.timeUntilPortal = 10; - if (entity instanceof EntityPlayer) { + if (entity instanceof PlayerEntity) { SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); if (network.getCurrentEssence() < getTeleportCost()) @@ -58,13 +57,13 @@ public class Teleports { if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer))) return; - EntityPlayerMP player = (EntityPlayerMP) entity; + 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 SPacketUpdateHealth(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); + 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) @@ -77,7 +76,7 @@ public class Teleports { if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer))) return; - WorldServer world = (WorldServer) entity.getEntityWorld(); + ServerWorld world = (ServerWorld) entity.getEntityWorld(); network.syphon(ticket(world, entity, getTeleportCost() / 10)); @@ -122,15 +121,15 @@ public class Teleports { if (entity.timeUntilPortal <= 0) { entity.timeUntilPortal = 10; MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); - WorldServer oldWorldServer = server.getWorld(entity.dimension); - WorldServer newWorldServer = server.getWorld(newWorldID); + 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 EntityPlayer) { - EntityPlayerMP player = (EntityPlayerMP) entity; + if (entity instanceof PlayerEntity) { + ServerPlayerEntity player = (ServerPlayerEntity) entity; if (!player.getEntityWorld().isRemote) { @@ -152,7 +151,7 @@ public class Teleports { PlayerList playerList = server.getPlayerList(); player.dimension = newWorldID; - player.connection.sendPacket(new SPacketRespawn(player.dimension, newWorldServer.getDifficulty(), newWorldServer.getWorldInfo().getTerrainType(), player.interactionManager.getGameType())); + player.connection.sendPacket(new SRespawnPacket(player.dimension, newWorldServer.getDifficulty(), newWorldServer.getWorldInfo().getTerrainType(), player.interactionManager.getGameType())); playerList.updatePermissionLevel(player); oldWorldServer.removeEntityDangerously(player); player.isDead = false; @@ -170,13 +169,13 @@ public class Teleports { 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 SPacketPlayerAbilities(player.capabilities)); + player.connection.sendPacket(new SPlayerAbilitiesPacket(player.capabilities)); playerList.updateTimeAndWeatherForPlayer(player, newWorldServer); playerList.syncPlayerInventory(player); - for (PotionEffect potioneffect : player.getActivePotionEffects()) { - player.connection.sendPacket(new SPacketEntityEffect(player.getEntityId(), potioneffect)); + 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); @@ -197,7 +196,7 @@ public class Teleports { network.syphon(ticket(oldWorld, entity, getTeleportCost() / 10)); - NBTTagCompound tag = new NBTTagCompound(); + CompoundNBT tag = new CompoundNBT(); entity.writeToNBTOptional(tag); entity.setDead(); @@ -244,6 +243,6 @@ public class Teleports { } public static SoulTicket ticket(World world, Entity entity, int amount) { - return new SoulTicket(new TextComponentString("teleport|" + world.provider.getDimension() + "|" + entity.getName() + "|" + entity.getPosition().toLong()), 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 4173ca2c..8f753ecf 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -8,10 +8,10 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.fml.relauncher.Side; @@ -20,7 +20,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray { public boolean isActive = false; public int activeCounter = 0; - public EnumFacing rotation = EnumFacing.HORIZONTALS[0]; + public Direction rotation = Direction.HORIZONTALS[0]; public int rotateCooldown = 0; private String key = "empty"; @@ -31,14 +31,14 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche super(2, "alchemyArray"); } - public void onEntityCollidedWithBlock(IBlockState state, Entity entity) { + public void onEntityCollidedWithBlock(BlockState state, Entity entity) { if (arrayEffect != null) { arrayEffect.onEntityCollidedWithBlock(this, getWorld(), pos, state, entity); } } @Override - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { super.deserialize(tagCompound); this.isActive = tagCompound.getBoolean("isActive"); this.activeCounter = tagCompound.getInteger("activeCounter"); @@ -49,9 +49,9 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } else { this.doDropIngredients = tagCompound.getBoolean("doDropIngredients"); } - this.rotation = EnumFacing.HORIZONTALS[tagCompound.getInteger(Constants.NBT.DIRECTION)]; + this.rotation = Direction.HORIZONTALS[tagCompound.getInteger(Constants.NBT.DIRECTION)]; - NBTTagCompound arrayTag = tagCompound.getCompoundTag("arrayTag"); + CompoundNBT arrayTag = tagCompound.getCompoundTag("arrayTag"); arrayEffect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(key); if (arrayEffect != null) { arrayEffect.readFromNBT(arrayTag); @@ -59,7 +59,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { super.serialize(tagCompound); tagCompound.setBoolean("isActive", isActive); tagCompound.setInteger("activeCounter", activeCounter); @@ -67,7 +67,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche tagCompound.setBoolean("doDropIngredients", doDropIngredients); tagCompound.setInteger(Constants.NBT.DIRECTION, rotation.getHorizontalIndex()); - NBTTagCompound arrayTag = new NBTTagCompound(); + CompoundNBT arrayTag = new CompoundNBT(); if (arrayEffect != null) { arrayEffect.writeToNBT(arrayTag); } @@ -159,11 +159,11 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } @Override - public EnumFacing getRotation() { + public Direction getRotation() { return rotation; } - public void setRotation(EnumFacing rotation) { + public void setRotation(Direction rotation) { this.rotation = rotation; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index ac701257..9b9aec1a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -12,12 +12,12 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.MinecraftForge; @@ -34,7 +34,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public static final int toolSlot = 7; public static final int outputSlot = 8; - public EnumFacing direction = EnumFacing.NORTH; + public Direction direction = Direction.NORTH; public boolean isSlave = false; public int burnTime = 0; public int ticksRequired = 1; @@ -46,7 +46,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, super(9, "alchemyTable"); } - public void setInitialTableParameters(EnumFacing direction, boolean isSlave, BlockPos connectedPos) { + public void setInitialTableParameters(Direction direction, boolean isSlave, BlockPos connectedPos) { this.isSlave = isSlave; this.connectedPos = connectedPos; @@ -69,11 +69,11 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); isSlave = tag.getBoolean("isSlave"); - direction = EnumFacing.byIndex(tag.getInteger(Constants.NBT.DIRECTION)); + direction = Direction.byIndex(tag.getInteger(Constants.NBT.DIRECTION)); connectedPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD)); burnTime = tag.getInteger("burnTime"); @@ -85,7 +85,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); tag.setBoolean("isSlave", isSlave); @@ -107,7 +107,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, @SuppressWarnings("unchecked") @Override - public T getCapability(Capability capability, EnumFacing facing) { + public T getCapability(Capability capability, Direction facing) { if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { if (this.isSlave()) { TileEntity tile = getWorld().getTileEntity(connectedPos); @@ -123,7 +123,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public int[] getSlotsForFace(EnumFacing side) { + public int[] getSlotsForFace(Direction side) { switch (side) { case DOWN: return new int[]{outputSlot}; @@ -135,7 +135,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) { + public boolean canInsertItem(int index, ItemStack stack, Direction direction) { switch (direction) { case DOWN: return index != outputSlot && index != orbSlot && index != toolSlot; @@ -159,7 +159,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } @Override - public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) { + public boolean canExtractItem(int index, ItemStack stack, Direction direction) { switch (direction) { case DOWN: return index == outputSlot; @@ -182,7 +182,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } - public List getAccessibleInputSlots(EnumFacing direction) { + public List getAccessibleInputSlots(Direction direction) { List list = new ArrayList<>(); for (int i = 0; i < 6; i++) { @@ -236,7 +236,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, burnTime = 0; - IBlockState state = getWorld().getBlockState(pos); + BlockState state = getWorld().getBlockState(pos); getWorld().notifyBlockUpdate(getPos(), state, state, 3); } else if (burnTime > ticksRequired + 10) { burnTime = 0; @@ -394,7 +394,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, } } - public EnumFacing getDirection() { + public Direction getDirection() { return direction; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java index b0ecd0c9..35dc8cdf 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java @@ -4,8 +4,8 @@ import WayofTime.bloodmagic.altar.BloodAltar; import WayofTime.bloodmagic.altar.AltarTier; import WayofTime.bloodmagic.altar.IBloodAltar; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +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; @@ -22,19 +22,19 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable { } @Override - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { super.deserialize(tagCompound); - NBTTagCompound altarTag = tagCompound.getCompoundTag("bloodAltar"); + CompoundNBT altarTag = tagCompound.getCompoundTag("bloodAltar"); this.bloodAltar.readFromNBT(altarTag); } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { super.serialize(tagCompound); - NBTTagCompound altarTag = new NBTTagCompound(); + CompoundNBT altarTag = new CompoundNBT(); this.bloodAltar.writeToNBT(altarTag); tagCompound.setTag("bloodAltar", altarTag); @@ -170,7 +170,7 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable { } @Override - public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + public boolean hasCapability(@Nonnull Capability capability, @Nullable Direction facing) { if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { return true; } @@ -180,7 +180,7 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable { @SuppressWarnings("unchecked") @Override - public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + public T getCapability(@Nonnull Capability capability, @Nullable Direction facing) { if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { return (T) bloodAltar; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java index f0b0b41a..8a7cfe0d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java @@ -2,8 +2,8 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.tile.base.TileBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +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; @@ -25,7 +25,7 @@ public class TileBloodTank extends TileBase { } @Override - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { super.deserialize(tagCompound); tank.readFromNBT(tagCompound.getCompoundTag(Constants.NBT.TANK)); capacity = tagCompound.getInteger(Constants.NBT.ALTAR_CAPACITY); @@ -33,10 +33,10 @@ public class TileBloodTank extends TileBase { } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { super.serialize(tagCompound); if (tank.getFluidAmount() != 0) - tagCompound.setTag(Constants.NBT.TANK, tank.writeToNBT(new NBTTagCompound())); + tagCompound.setTag(Constants.NBT.TANK, tank.writeToNBT(new CompoundNBT())); tagCompound.setInteger(Constants.NBT.ALTAR_CAPACITY, capacity); return tagCompound; } @@ -66,13 +66,13 @@ public class TileBloodTank extends TileBase { } @Override - public boolean hasCapability(Capability capability, EnumFacing facing) { + 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, EnumFacing facing) { + 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 index 52ff0be5..6f4ba7f7 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -7,8 +7,8 @@ import WayofTime.bloodmagic.soul.IDiscreteDemonWill; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; import net.minecraft.util.ITickable; import java.util.HashMap; @@ -89,7 +89,7 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); willMap.clear(); @@ -103,7 +103,7 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); for (Entry entry : willMap.entrySet()) { @@ -198,17 +198,17 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo } @Override - public int[] getSlotsForFace(EnumFacing side) { + public int[] getSlotsForFace(Direction side) { return new int[]{0}; } @Override - public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) { + 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, EnumFacing direction) { + 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 index 9d2e5c4e..125d3557 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -5,11 +5,11 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; import net.minecraft.util.math.MathHelper; public class TileDemonCrystal extends TileTicking { @@ -22,7 +22,7 @@ public class TileDemonCrystal extends TileTicking { public double progressToNextCrystal = 0; public int internalCounter = 0; public int crystalCount = 1; - public EnumFacing placement = EnumFacing.UP; //Side that this crystal is placed on. + public Direction placement = Direction.UP; //Side that this crystal is placed on. public TileDemonCrystal() { this.crystalCount = 1; @@ -84,7 +84,7 @@ public class TileDemonCrystal extends TileTicking { return 0; } - IBlockState state = getWorld().getBlockState(pos); + BlockState state = getWorld().getBlockState(pos); int meta = this.getBlockType().getMetaFromState(state); EnumDemonWillType type = EnumDemonWillType.values()[meta]; @@ -122,7 +122,7 @@ public class TileDemonCrystal extends TileTicking { public boolean dropSingleCrystal() { if (!getWorld().isRemote && crystalCount > 1) { - IBlockState state = getWorld().getBlockState(pos); + BlockState state = getWorld().getBlockState(pos); EnumDemonWillType type = state.getValue(BlockDemonCrystal.TYPE); ItemStack stack = BlockDemonCrystal.getItemStackDropped(type, 1); if (!stack.isEmpty()) { @@ -145,15 +145,15 @@ public class TileDemonCrystal extends TileTicking { } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { holder.readFromNBT(tag, "Will"); crystalCount = tag.getInteger("crystalCount"); - placement = EnumFacing.byIndex(tag.getInteger("placement")); + placement = Direction.byIndex(tag.getInteger("placement")); progressToNextCrystal = tag.getDouble("progress"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { holder.writeToNBT(tag, "Will"); tag.setInteger("crystalCount", crystalCount); tag.setInteger("placement", placement.getIndex()); @@ -169,11 +169,11 @@ public class TileDemonCrystal extends TileTicking { this.crystalCount = crystalCount; } - public EnumFacing getPlacement() { + public Direction getPlacement() { return placement; } - public void setPlacement(EnumFacing placement) { + public void setPlacement(Direction placement) { this.placement = placement; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index e462b767..fe9137c4 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -1,8 +1,8 @@ package WayofTime.bloodmagic.tile; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; @@ -30,7 +30,7 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond return; } - BlockPos offsetPos = pos.offset(EnumFacing.UP); + BlockPos offsetPos = pos.offset(Direction.UP); if (getWorld().isAirBlock(offsetPos)) //Room for a crystal to grow { EnumDemonWillType highestType = WorldDemonWillHandler.getHighestDemonWillType(getWorld(), pos); @@ -53,7 +53,7 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond getWorld().setBlockState(position, RegistrarBloodMagicBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal())); TileEntity tile = getWorld().getTileEntity(position); if (tile instanceof TileDemonCrystal) { - ((TileDemonCrystal) tile).setPlacement(EnumFacing.UP); + ((TileDemonCrystal) tile).setPlacement(Direction.UP); return true; } @@ -65,13 +65,13 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { holder.readFromNBT(tag, "Will"); internalCounter = tag.getDouble("internalCounter"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { holder.writeToNBT(tag, "Will"); tag.setDouble("internalCounter", internalCounter); return tag; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java index 80817ce6..dc4c7def 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java @@ -5,8 +5,8 @@ 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.NBTTagCompound; -import net.minecraft.util.EnumFacing; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; public class TileDemonPylon extends TileTicking implements IDemonWillConduit { @@ -27,7 +27,7 @@ public class TileDemonPylon extends TileTicking implements IDemonWillConduit { for (EnumDemonWillType type : EnumDemonWillType.values()) { double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - for (EnumFacing side : EnumFacing.HORIZONTALS) { + for (Direction side : Direction.HORIZONTALS) { BlockPos offsetPos = pos.offset(side, 16); double sideAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), offsetPos, type); if (sideAmount > currentAmount) { @@ -40,12 +40,12 @@ public class TileDemonPylon extends TileTicking implements IDemonWillConduit { } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { holder.readFromNBT(tag, "Will"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { holder.writeToNBT(tag, "Will"); return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java index c58a02be..afabdfe7 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java @@ -3,7 +3,7 @@ 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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; public class TileDimensionalPortal extends TileBase { @@ -12,7 +12,7 @@ public class TileDimensionalPortal extends TileBase { public int masterStoneY; public int masterStoneZ; - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { portalID = tagCompound.getString(RitualPortal.PORTAL_ID_TAG); masterStoneX = tagCompound.getInteger("masterStoneX"); @@ -20,7 +20,7 @@ public class TileDimensionalPortal extends TileBase { masterStoneZ = tagCompound.getInteger("masterStoneZ"); } - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { tagCompound.setString(RitualPortal.PORTAL_ID_TAG, Strings.isNullOrEmpty(portalID) ? "" : portalID); tagCompound.setInteger("masterStoneX", masterStoneX); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java index e10d556e..222dce55 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java @@ -7,8 +7,8 @@ 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.EntityLightningBolt; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.effect.LightningBoltEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -17,13 +17,13 @@ import javax.annotation.Nullable; public class TileImperfectRitualStone extends TileBase implements IImperfectRitualStone { @Override - public boolean performRitual(World world, BlockPos pos, @Nullable ImperfectRitual imperfectRitual, EntityPlayer player) { + 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 EntityLightningBolt(getWorld(), getPos().getX(), getPos().getY() + 2, getPos().getZ(), true)); + getWorld().addWeatherEffect(new LightningBoltEntity(getWorld(), getPos().getX(), getPos().getY() + 2, getPos().getZ(), true)); return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index f0da8c4a..1f645991 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -4,15 +4,15 @@ import WayofTime.bloodmagic.ritual.AreaDescriptor; import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; import WayofTime.bloodmagic.incense.*; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +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.WorldServer; +import net.minecraft.world.ServerWorld; import java.util.HashMap; import java.util.List; @@ -35,7 +35,7 @@ public class TileIncenseAltar extends TileInventory implements ITickable { @Override public void update() { AxisAlignedBB aabb = incenseArea.getAABB(getPos()); - List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, aabb); + List playerList = getWorld().getEntitiesWithinAABB(PlayerEntity.class, aabb); if (playerList.isEmpty()) { return; } @@ -46,29 +46,29 @@ public class TileIncenseAltar extends TileInventory implements ITickable { boolean hasPerformed = false; - for (EntityPlayer player : playerList) { + for (PlayerEntity player : playerList) { if (PlayerSacrificeHelper.incrementIncense(player, 0, incenseAddition, incenseAddition / 100)) { hasPerformed = true; } } if (hasPerformed) { - if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) { - WorldServer server = (WorldServer) getWorld(); + 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(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); tranquility = tag.getDouble("tranquility"); incenseAddition = tag.getDouble("incenseAddition"); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); tag.setDouble("tranquility", tranquility); tag.setDouble("incenseAddition", incenseAddition); @@ -90,11 +90,11 @@ public class TileIncenseAltar extends TileInventory implements ITickable { canFormRoad = true; level: - for (EnumFacing horizontalFacing : EnumFacing.HORIZONTALS) { + 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); - IBlockState state = getWorld().getBlockState(offsetPos); + BlockState state = getWorld().getBlockState(offsetPos); Block block = state.getBlock(); if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(getWorld(), offsetPos, state) >= currentDistance - 2)) { canFormRoad = false; @@ -118,7 +118,7 @@ public class TileIncenseAltar extends TileInventory implements ITickable { for (int y = yOffset; y <= 2 + yOffset; y++) { BlockPos offsetPos = pos.add(i, y, j); - IBlockState state = getWorld().getBlockState(offsetPos); + BlockState state = getWorld().getBlockState(offsetPos); Block block = state.getBlock(); TranquilityStack stack = IncenseTranquilityRegistry.getTranquilityOfBlock(getWorld(), offsetPos, block, state); if (stack != null) { diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index 11e2edf3..5d6607f0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -2,17 +2,17 @@ package WayofTime.bloodmagic.tile; import WayofTime.bloodmagic.tile.base.TileBase; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.EnumFacing; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.util.Direction; import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -50,14 +50,14 @@ public class TileInventory extends TileBase implements IInventory { } @Override - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { super.deserialize(tagCompound); - NBTTagList tags = tagCompound.getTagList("Items", 10); + ListNBT tags = tagCompound.getTagList("Items", 10); inventory = NonNullList.withSize(size, ItemStack.EMPTY); for (int i = 0; i < tags.tagCount(); i++) { if (!isSyncedSlot(i)) { - NBTTagCompound data = tags.getCompoundTagAt(i); + CompoundNBT data = tags.getCompoundTagAt(i); byte j = data.getByte("Slot"); if (j >= 0 && j < inventory.size()) { @@ -68,13 +68,13 @@ public class TileInventory extends TileBase implements IInventory { } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { super.serialize(tagCompound); - NBTTagList tags = new NBTTagList(); + ListNBT tags = new ListNBT(); for (int i = 0; i < inventory.size(); i++) { if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) { - NBTTagCompound data = new NBTTagCompound(); + CompoundNBT data = new CompoundNBT(); data.setByte("Slot", (byte) i); inventory.get(i).writeToNBT(data); tags.appendTag(data); @@ -146,12 +146,12 @@ public class TileInventory extends TileBase implements IInventory { } @Override - public void openInventory(EntityPlayer player) { + public void openInventory(PlayerEntity player) { } @Override - public void closeInventory(EntityPlayer player) { + public void closeInventory(PlayerEntity player) { } @@ -192,7 +192,7 @@ public class TileInventory extends TileBase implements IInventory { } @Override - public boolean isUsableByPlayer(EntityPlayer player) { + public boolean isUsableByPlayer(PlayerEntity player) { return true; } @@ -208,17 +208,17 @@ public class TileInventory extends TileBase implements IInventory { @Override public ITextComponent getDisplayName() { - return new TextComponentString(getName()); + return new StringTextComponent(getName()); } protected void initializeItemHandlers() { if (this instanceof ISidedInventory) { - handlerDown = new SidedInvWrapper((ISidedInventory) this, EnumFacing.DOWN); - handlerUp = new SidedInvWrapper((ISidedInventory) this, EnumFacing.UP); - handlerNorth = new SidedInvWrapper((ISidedInventory) this, EnumFacing.NORTH); - handlerSouth = new SidedInvWrapper((ISidedInventory) this, EnumFacing.SOUTH); - handlerWest = new SidedInvWrapper((ISidedInventory) this, EnumFacing.WEST); - handlerEast = new SidedInvWrapper((ISidedInventory) this, EnumFacing.EAST); + 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; @@ -231,7 +231,7 @@ public class TileInventory extends TileBase implements IInventory { @SuppressWarnings("unchecked") @Override - public T getCapability(Capability capability, EnumFacing facing) { + public T getCapability(Capability capability, Direction facing) { if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { switch (facing) { case DOWN: @@ -255,7 +255,7 @@ public class TileInventory extends TileBase implements IInventory { } @Override - public boolean hasCapability(Capability capability, EnumFacing facing) { + public boolean hasCapability(Capability capability, Direction facing) { return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index a947fda7..41ee1d2f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -10,10 +10,10 @@ 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.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +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; @@ -133,9 +133,9 @@ public class TileInversionPillar extends TileTicking { BlockPos candidatePos = findCandidatePositionForPillar(getWorld(), type, pos, allConnectedPos, 5, 10); if (!candidatePos.equals(BlockPos.ORIGIN)) { currentInversion = 0; - IBlockState pillarState = RegistrarBloodMagicBlocks.INVERSION_PILLAR.getStateFromMeta(type.ordinal()); - IBlockState bottomState = RegistrarBloodMagicBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2); - IBlockState topState = RegistrarBloodMagicBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2 + 1); + 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); @@ -166,7 +166,7 @@ public class TileInversionPillar extends TileTicking { return; } - for (EnumFacing side : EnumFacing.HORIZONTALS) { + for (Direction side : Direction.HORIZONTALS) { BlockPos offsetPos = pos.offset(side, 16); double sideAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), offsetPos, type); if (currentAmount > sideAmount) { @@ -194,7 +194,7 @@ public class TileInversionPillar extends TileTicking { } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { @@ -211,7 +211,7 @@ public class TileInversionPillar extends TileTicking { } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); tag.setString(Constants.NBT.WILL_TYPE, type.toString()); @@ -282,7 +282,7 @@ public class TileInversionPillar extends TileTicking { return 1; //Invalid block (itself!) } - IBlockState state = getWorld().getBlockState(offsetPos); + BlockState state = getWorld().getBlockState(offsetPos); if (!state.getBlock().isAir(state, getWorld(), offsetPos)) { //Consume Will and set this block Block block = state.getBlock(); @@ -314,7 +314,7 @@ public class TileInversionPillar extends TileTicking { } @Override - public boolean hasCapability(Capability capability, EnumFacing side) { + public boolean hasCapability(Capability capability, Direction side) { if (capability == CapabilityAnimation.ANIMATION_CAPABILITY) { return true; } @@ -322,7 +322,7 @@ public class TileInversionPillar extends TileTicking { } @Override - public T getCapability(Capability capability, EnumFacing side) { + public T getCapability(Capability capability, Direction side) { if (capability == CapabilityAnimation.ANIMATION_CAPABILITY) { return CapabilityAnimation.ANIMATION_CAPABILITY.cast(asm); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index 88ae398b..ac7531db 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -19,12 +19,12 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -40,7 +40,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS private int activeTime; private int cooldown; private Ritual currentRitual; - private EnumFacing direction = EnumFacing.NORTH; + private Direction direction = Direction.NORTH; private boolean inverted; private List currentActiveWillConfig = new ArrayList<>(); @@ -73,20 +73,20 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public void deserialize(NBTTagCompound tag) { + 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) { - NBTTagCompound ritualTag = tag.getCompoundTag(Constants.NBT.CURRENT_RITUAL_TAG); + CompoundNBT ritualTag = tag.getCompoundTag(Constants.NBT.CURRENT_RITUAL_TAG); if (!ritualTag.isEmpty()) { currentRitual.readFromNBT(ritualTag); } } active = tag.getBoolean(Constants.NBT.IS_RUNNING); activeTime = tag.getInteger(Constants.NBT.RUNTIME); - direction = EnumFacing.VALUES[tag.getInteger(Constants.NBT.DIRECTION)]; + direction = Direction.VALUES[tag.getInteger(Constants.NBT.DIRECTION)]; redstoned = tag.getBoolean(Constants.NBT.IS_REDSTONED); for (EnumDemonWillType type : EnumDemonWillType.values()) { @@ -97,13 +97,13 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { String ritualId = BloodMagic.RITUAL_MANAGER.getId(getCurrentRitual()); if (owner != null) tag.setUniqueId("owner", owner); tag.setString(Constants.NBT.CURRENT_RITUAL, Strings.isNullOrEmpty(ritualId) ? "" : ritualId); if (currentRitual != null) { - NBTTagCompound ritualTag = new NBTTagCompound(); + CompoundNBT ritualTag = new CompoundNBT(); currentRitual.writeToNBT(ritualTag); tag.setTag(Constants.NBT.CURRENT_RITUAL_TAG, ritualTag); } @@ -120,7 +120,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public boolean activateRitual(ItemStack activationCrystal, @Nullable EntityPlayer activator, Ritual ritual) { + public boolean activateRitual(ItemStack activationCrystal, @Nullable PlayerEntity activator, Ritual ritual) { if (PlayerHelper.isFakePlayer(activator)) return false; @@ -133,7 +133,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS SoulNetwork network = NetworkHelper.getSoulNetwork(binding); if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && (activator != null && !activator.capabilities.isCreativeMode)) { - activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.weak"), true); + activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.weak"), true); return false; } @@ -144,7 +144,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS if (MinecraftForge.EVENT_BUS.post(event)) { if (activator != null) - activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.prevent"), true); + activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.prevent"), true); return false; } @@ -153,7 +153,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS network.syphon(ticket(ritual.getActivationCost())); if (activator != null) - activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.activate"), true); + activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.activate"), true); this.active = true; this.owner = binding.getOwnerId(); @@ -174,7 +174,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } } else { if (activator != null) - activator.sendStatusMessage(new TextComponentTranslation("chat.bloodmagic.ritual.notValid"), true); + activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); } return false; @@ -229,11 +229,11 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public EnumFacing getDirection() { + public Direction getDirection() { return direction; } - public void setDirection(EnumFacing direction) { + public void setDirection(Direction direction) { this.direction = direction; } @@ -291,26 +291,26 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public void provideInformationOfRitualToPlayer(EntityPlayer player) { + public void provideInformationOfRitualToPlayer(PlayerEntity player) { if (this.currentRitual != null) { ChatUtil.sendNoSpam(player, this.currentRitual.provideInformationOfRitualToPlayer(player)); } } @Override - public void provideInformationOfRangeToPlayer(EntityPlayer player, String range) { + 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(EntityPlayer player, List typeList) { + public void setActiveWillConfig(PlayerEntity player, List typeList) { this.currentActiveWillConfig = typeList; } @Override - public EnumReaderBoundaries setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2) { + public EnumReaderBoundaries setBlockRangeByBounds(PlayerEntity player, String range, BlockPos offset1, BlockPos offset2) { AreaDescriptor descriptor = this.getBlockRange(range); DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, getBlockPos()); @@ -327,10 +327,10 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } @Override - public void provideInformationOfWillConfigToPlayer(EntityPlayer player, List typeList) { + 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 TextComponentTranslation[typeList.size()]; + Object[] translations = new TranslationTextComponent[typeList.size()]; StringBuilder constructedString = new StringBuilder("%s"); for (int i = 1; i < typeList.size(); i++) { @@ -338,12 +338,12 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } for (int i = 0; i < typeList.size(); i++) { - translations[i] = new TextComponentTranslation("tooltip.bloodmagic.currentBaseType." + typeList.get(i).name.toLowerCase()); + translations[i] = new TranslationTextComponent("tooltip.bloodmagic.currentBaseType." + typeList.get(i).name.toLowerCase()); } - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.set", new TextComponentTranslation(constructedString.toString(), translations))); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("ritual.bloodmagic.willConfig.set", new TranslationTextComponent(constructedString.toString(), translations))); } else { - ChatUtil.sendNoSpam(player, new TextComponentTranslation("ritual.bloodmagic.willConfig.void")); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("ritual.bloodmagic.willConfig.void")); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index ea0558b6..88829e15 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -8,26 +8,26 @@ import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.StateUtil; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityPotion; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; +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.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.potion.EffectInstance; import net.minecraft.potion.PotionUtils; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; +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.TextComponentTranslation; -import net.minecraft.world.EnumDifficulty; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.Difficulty; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.ReflectionHelper; @@ -39,9 +39,9 @@ public class TileMimic extends TileInventory implements ITickable { private static Field _blockMetadata = ReflectionHelper.findField(TileEntity.class, "blockMetadata", "field_145847_g"); public boolean dropItemsOnBreak = true; - public NBTTagCompound tileTag = new NBTTagCompound(); + public CompoundNBT tileTag = new CompoundNBT(); public TileEntity mimicedTile = null; - IBlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); + BlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); public int playerCheckRadius = 5; public int potionSpawnRadius = 5; @@ -64,9 +64,9 @@ public class TileMimic extends TileInventory implements ITickable { ItemStack potionStack = this.getStackInSlot(1); if (!potionStack.isEmpty()) { AxisAlignedBB bb = new AxisAlignedBB(this.getPos()).expand(playerCheckRadius, playerCheckRadius, playerCheckRadius); - List playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, bb); + List playerList = getWorld().getEntitiesWithinAABB(PlayerEntity.class, bb); - for (EntityPlayer player : playerList) { + 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; @@ -75,7 +75,7 @@ public class TileMimic extends TileInventory implements ITickable { ItemStack newStack = new ItemStack(potionStack.getItem() == RegistrarBloodMagicItems.POTION_FLASK ? Items.SPLASH_POTION : potionStack.getItem()); newStack.setTagCompound(potionStack.getTagCompound()); - EntityPotion potionEntity = new EntityPotion(getWorld(), posX, posY, posZ, newStack); + PotionEntity potionEntity = new PotionEntity(getWorld(), posX, posY, posZ, newStack); getWorld().spawnEntity(potionEntity); break; @@ -84,11 +84,11 @@ public class TileMimic extends TileInventory implements ITickable { } } - if (this.getBlockMetadata() == BlockMimic.sentientMimicMeta && getWorld().getDifficulty() != EnumDifficulty.PEACEFUL && !(mimicedTile instanceof IInventory)) { + 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(EntityPlayer.class, bb); + List playerList = getWorld().getEntitiesWithinAABB(PlayerEntity.class, bb); - for (EntityPlayer player : playerList) { + for (PlayerEntity player : playerList) { if (!player.capabilities.isCreativeMode && Utils.canEntitySeeBlock(getWorld(), player, getPos())) { spawnMimicEntity(player); break; @@ -98,14 +98,14 @@ public class TileMimic extends TileInventory implements ITickable { } - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side) { + 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); + 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 TextComponentTranslation("chat.bloodmagic.mimic.potionSet")); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionSet")); } return true; } else if (heldItem.getItem() == RegistrarBloodMagicItems.POTION_FLASK) { @@ -113,7 +113,7 @@ public class TileMimic extends TileInventory implements ITickable { if (!world.isRemote) { setInventorySlotContents(1, ItemStack.EMPTY); world.notifyBlockUpdate(pos, state, state, 3); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionRemove")); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionRemove")); } return true; } @@ -138,8 +138,8 @@ public class TileMimic extends TileInventory implements ITickable { Utils.insertItemToTile(this, player, 0); ItemStack stack = getStackInSlot(0); if (stateOfReplacedBlock == Blocks.AIR.getDefaultState()) { - if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { - Block block = ((ItemBlock) stack.getItem()).getBlock(); + if (!stack.isEmpty() && stack.getItem() instanceof BlockItem) { + Block block = ((BlockItem) stack.getItem()).getBlock(); stateOfReplacedBlock = block.getDefaultState(); } } @@ -153,16 +153,16 @@ public class TileMimic extends TileInventory implements ITickable { return true; } - public boolean performSpecialAbility(EntityPlayer player, EnumFacing sideHit) { + 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 TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); } else { playerCheckRadius++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.up", playerCheckRadius)); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.detectRadius.up", playerCheckRadius)); } return false; @@ -180,30 +180,30 @@ public class TileMimic extends TileInventory implements ITickable { case WEST: if (player.isSneaking()) { potionSpawnRadius = Math.max(potionSpawnRadius - 1, 0); - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionSpawnRadius.down", potionSpawnRadius)); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionSpawnRadius.down", potionSpawnRadius)); } else { potionSpawnRadius++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionSpawnRadius.up", 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 TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); } else { playerCheckRadius++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.detectRadius.up", 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 TextComponentTranslation("chat.bloodmagic.mimic.potionInterval.down", potionSpawnInterval)); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionInterval.down", potionSpawnInterval)); } else { potionSpawnInterval++; - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.bloodmagic.mimic.potionInterval.up", potionSpawnInterval)); + ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionInterval.up", potionSpawnInterval)); } break; default: @@ -217,8 +217,8 @@ public class TileMimic extends TileInventory implements ITickable { return false; } - public boolean spawnMimicEntity(EntityPlayer target) { - if (this.getWorld().getDifficulty() == EnumDifficulty.PEACEFUL) { + public boolean spawnMimicEntity(PlayerEntity target) { + if (this.getWorld().getDifficulty() == Difficulty.PEACEFUL) { return false; } @@ -252,7 +252,7 @@ public class TileMimic extends TileInventory implements ITickable { } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); @@ -265,7 +265,7 @@ public class TileMimic extends TileInventory implements ITickable { } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); tag.setBoolean("dropItemsOnBreak", dropItemsOnBreak); @@ -293,11 +293,11 @@ public class TileMimic extends TileInventory implements ITickable { } } - public IBlockState getReplacedState() { + public BlockState getReplacedState() { return stateOfReplacedBlock; } - public void setReplacedState(IBlockState state) { + public void setReplacedState(BlockState state) { stateOfReplacedBlock = state; } @@ -313,10 +313,10 @@ public class TileMimic extends TileInventory implements ITickable { replaceMimicWithBlockActual(world, pos, mimic.getStackInSlot(0), mimic.tileTag, mimic.stateOfReplacedBlock); } - public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, IBlockState replacementState) { - if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { - Block block = ((ItemBlock) stack.getItem()).getBlock(); - IBlockState state = replacementState; + 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) { @@ -334,10 +334,10 @@ public class TileMimic extends TileInventory implements ITickable { } @Nullable - public static TileEntity getTileFromStackWithTag(World world, BlockPos pos, ItemStack stack, @Nullable NBTTagCompound tag, IBlockState replacementState) { - if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock) { - Block block = ((ItemBlock) stack.getItem()).getBlock(); - IBlockState state = replacementState; + 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); @@ -345,7 +345,7 @@ public class TileMimic extends TileInventory implements ITickable { return null; if (tag != null) { - NBTTagCompound copyTag = tag.copy(); + CompoundNBT copyTag = tag.copy(); copyTag.setInteger("x", pos.getX()); copyTag.setInteger("y", pos.getY()); copyTag.setInteger("z", pos.getZ()); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index fc9552ad..b9e2ad30 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -3,8 +3,8 @@ 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.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; public class TilePhantomBlock extends TileTicking { private int ticksRemaining = 10; @@ -17,12 +17,12 @@ public class TilePhantomBlock extends TileTicking { } @Override - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { this.ticksRemaining = tagCompound.getInteger(Constants.NBT.TICKS_REMAINING); } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { tagCompound.setInteger(Constants.NBT.TICKS_REMAINING, ticksRemaining); return tagCompound; } @@ -30,7 +30,7 @@ public class TilePhantomBlock extends TileTicking { @Override public void onUpdate() { if (!world.isRemote) { - EntityPlayer player = world.getClosestPlayer(getPos().getX(), getPos().getY(), getPos().getZ(), 10.0D, ItemSigilPhantomBridge.IS_PHANTOM_ACTIVE); + PlayerEntity player = world.getClosestPlayer(getPos().getX(), getPos().getY(), getPos().getZ(), 10.0D, ItemSigilPhantomBridge.IS_PHANTOM_ACTIVE); if (player != null && !player.isSneaking()) return; ticksRemaining--; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java index fdcab9f4..e4a74df2 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -3,14 +3,14 @@ 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.EntityAnimal; +import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +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.WorldServer; +import net.minecraft.world.ServerWorld; import java.util.List; @@ -39,14 +39,14 @@ public class TilePurificationAltar extends TileInventory implements ITickable { } AxisAlignedBB aabb = purityArea.getAABB(getPos()); - List animalList = getWorld().getEntitiesWithinAABB(EntityAnimal.class, aabb); + List animalList = getWorld().getEntitiesWithinAABB(AnimalEntity.class, aabb); if (animalList.isEmpty()) { return; } boolean hasPerformed = false; - for (EntityAnimal animal : animalList) { + for (AnimalEntity animal : animalList) { double added = PurificationHelper.addPurity(animal, Math.min(purityRate, totalPurity), maxPurity); if (added > 0) { totalPurity -= purityRate; @@ -55,15 +55,15 @@ public class TilePurificationAltar extends TileInventory implements ITickable { } if (hasPerformed) { - if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) { - WorldServer server = (WorldServer) getWorld(); + 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(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); totalPurity = tag.getDouble("totalPurity"); maxPurity = tag.getDouble("maxPurity"); @@ -71,7 +71,7 @@ public class TilePurificationAltar extends TileInventory implements ITickable { } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); tag.setDouble("totalPurity", totalPurity); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 4e737ae9..1ceab097 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -10,7 +10,7 @@ import WayofTime.bloodmagic.soul.IDemonWillConduit; import WayofTime.bloodmagic.soul.IDemonWillGem; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.ITickable; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.items.ItemHandlerHelper; @@ -34,14 +34,14 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); burnTime = tag.getInteger(Constants.NBT.SOUL_FORGE_BURN); } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); tag.setInteger(Constants.NBT.SOUL_FORGE_BURN, burnTime); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java index d2d41e2d..54475123 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java @@ -5,8 +5,8 @@ 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.state.IBlockState; -import net.minecraft.nbt.NBTTagCompound; +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; @@ -21,14 +21,14 @@ public class TileSpectralBlock extends TileTicking { } @Override - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { ticksRemaining = tagCompound.getInteger(Constants.NBT.TICKS_REMAINING); containedBlockName = tagCompound.getString(Constants.NBT.CONTAINED_BLOCK_NAME); containedBlockMeta = tagCompound.getInteger(Constants.NBT.CONTAINED_BLOCK_META); } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { tagCompound.setInteger(Constants.NBT.TICKS_REMAINING, ticksRemaining); tagCompound.setString(Constants.NBT.CONTAINED_BLOCK_NAME, Strings.isNullOrEmpty(containedBlockName) ? "" : containedBlockName); tagCompound.setInteger(Constants.NBT.CONTAINED_BLOCK_META, containedBlockMeta); @@ -48,7 +48,7 @@ public class TileSpectralBlock extends TileTicking { } } - private void setContainedBlockInfo(IBlockState blockState) { + private void setContainedBlockInfo(BlockState blockState) { containedBlockName = blockState.getBlock().getRegistryName().toString(); containedBlockMeta = blockState.getBlock().getMetaFromState(blockState); } @@ -75,7 +75,7 @@ public class TileSpectralBlock extends TileTicking { public static void createSpectralBlock(World world, BlockPos blockPos, int duration) { if (world.isAirBlock(blockPos)) return; - IBlockState cachedState = world.getBlockState(blockPos); + BlockState cachedState = world.getBlockState(blockPos); world.setBlockState(blockPos, RegistrarBloodMagicBlocks.SPECTRAL.getDefaultState()); TileSpectralBlock tile = (TileSpectralBlock) world.getTileEntity(blockPos); tile.setContainedBlockInfo(cachedState); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index b9d665e8..30009812 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -13,7 +13,7 @@ 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.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; @@ -35,13 +35,13 @@ public class TileTeleposer extends TileInventory implements ITickable { } @Override - public void deserialize(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { super.deserialize(tagCompound); previousInput = tagCompound.getInteger(Constants.NBT.PREVIOUS_INPUT); } @Override - public NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { super.serialize(tagCompound); tagCompound.setInteger(Constants.NBT.PREVIOUS_INPUT, previousInput); return tagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java index 18344853..8a05ad0e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.tile.base; -import net.minecraft.block.state.IBlockState; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.block.BlockState; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.NetworkManager; -import net.minecraft.network.play.server.SPacketUpdateTileEntity; +import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -17,27 +17,27 @@ import net.minecraftforge.fml.relauncher.SideOnly; */ public class TileBase extends TileEntity { @Override - public final void readFromNBT(NBTTagCompound compound) { + public final void readFromNBT(CompoundNBT compound) { super.readFromNBT(compound); deserializeBase(compound); deserialize(compound); } @Override - public final NBTTagCompound writeToNBT(NBTTagCompound compound) { + public final CompoundNBT writeToNBT(CompoundNBT compound) { super.writeToNBT(compound); serializeBase(compound); return serialize(compound); } /** - * Called by {@link #readFromNBT(NBTTagCompound)} + * Called by {@link #readFromNBT(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(NBTTagCompound tagCompound) { + public void deserialize(CompoundNBT tagCompound) { } @@ -47,19 +47,19 @@ public class TileBase extends TileEntity { * @param tagCompound - The tag compound to read from * @see TileTicking */ - void deserializeBase(NBTTagCompound tagCompound) { + void deserializeBase(CompoundNBT tagCompound) { } /** - * Called by {@link #writeToNBT(NBTTagCompound)} + * 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 NBTTagCompound serialize(NBTTagCompound tagCompound) { + public CompoundNBT serialize(CompoundNBT tagCompound) { return tagCompound; } @@ -71,30 +71,30 @@ public class TileBase extends TileEntity { * @return the modified tag compound * @see TileTicking */ - NBTTagCompound serializeBase(NBTTagCompound tagCompound) { + CompoundNBT serializeBase(CompoundNBT tagCompound) { return tagCompound; } public void notifyUpdate() { - IBlockState state = getWorld().getBlockState(getPos()); + BlockState state = getWorld().getBlockState(getPos()); getWorld().notifyBlockUpdate(getPos(), state, state, 3); } // Data syncing @Override - public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newState) { + public boolean shouldRefresh(World world, BlockPos pos, BlockState oldState, BlockState newState) { return oldState.getBlock() != newState.getBlock(); } @Override - public final SPacketUpdateTileEntity getUpdatePacket() { - return new SPacketUpdateTileEntity(getPos(), -999, writeToNBT(new NBTTagCompound())); + public final SUpdateTileEntityPacket getUpdatePacket() { + return new SUpdateTileEntityPacket(getPos(), -999, writeToNBT(new CompoundNBT())); } @Override @SideOnly(Side.CLIENT) - public final void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { + public final void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { super.onDataPacket(net, pkt); readFromNBT(pkt.getNbtCompound()); onDataPacketClientReceived(); @@ -108,12 +108,12 @@ public class TileBase extends TileEntity { } @Override - public final NBTTagCompound getUpdateTag() { - return writeToNBT(new NBTTagCompound()); + public final CompoundNBT getUpdateTag() { + return writeToNBT(new CompoundNBT()); } @Override - public final void handleUpdateTag(NBTTagCompound tag) { + public final void handleUpdateTag(CompoundNBT tag) { readFromNBT(tag); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java index f0a532ad..33c18025 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.tile.base; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.ITickable; /** @@ -20,13 +20,13 @@ public abstract class TileTicking extends TileBase implements ITickable { } @Override - void deserializeBase(NBTTagCompound tagCompound) { + void deserializeBase(CompoundNBT tagCompound) { this.ticksExisted = tagCompound.getInteger("ticksExisted"); this.shouldTick = tagCompound.getBoolean("shouldTick"); } @Override - NBTTagCompound serializeBase(NBTTagCompound tagCompound) { + CompoundNBT serializeBase(CompoundNBT tagCompound) { tagCompound.setInteger("ticksExisted", getTicksExisted()); tagCompound.setBoolean("shouldTick", shouldTick()); return tagCompound; diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java index 879a0ed3..5c3f2801 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java @@ -2,18 +2,18 @@ package WayofTime.bloodmagic.tile.container; import WayofTime.bloodmagic.orb.IBloodOrb; import WayofTime.bloodmagic.tile.TileAlchemyTable; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.ClickType; -import net.minecraft.inventory.Container; +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.Slot; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; public class ContainerAlchemyTable extends Container { private final IInventory tileTable; - public ContainerAlchemyTable(InventoryPlayer inventoryPlayer, 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)); @@ -37,8 +37,8 @@ public class ContainerAlchemyTable extends Container { } @Override - public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) { - InventoryPlayer inventoryPlayer = player.inventory; + 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); @@ -51,7 +51,7 @@ public class ContainerAlchemyTable extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); @@ -95,7 +95,7 @@ public class ContainerAlchemyTable extends Container { } @Override - public boolean canInteractWith(EntityPlayer playerIn) { + public boolean canInteractWith(PlayerEntity playerIn) { return this.tileTable.isUsableByPlayer(playerIn); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java index fa230b5a..d8441416 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java @@ -4,12 +4,12 @@ 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.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.ClickType; -import net.minecraft.inventory.Container; +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.Slot; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import javax.annotation.Nullable; @@ -21,7 +21,7 @@ public class ContainerItemRoutingNode extends Container { // private final ItemInventory itemInventory; private int slotsOccupied; - public ContainerItemRoutingNode(InventoryPlayer inventoryPlayer, IInventory tileItemRoutingNode) { + public ContainerItemRoutingNode(PlayerInventory inventoryPlayer, IInventory tileItemRoutingNode) { this.tileItemRoutingNode = tileItemRoutingNode; inventory = (TileFilteredRoutingNode) tileItemRoutingNode; @@ -55,8 +55,8 @@ public class ContainerItemRoutingNode extends Container { * Overridden in order to handle ghost item slots. */ @Override - public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) { - InventoryPlayer inventoryPlayer = player.inventory; + public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { + PlayerInventory inventoryPlayer = player.inventory; // if (!player.worldObj.isRemote) { if (slotId >= 0) { @@ -111,7 +111,7 @@ public class ContainerItemRoutingNode extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); @@ -154,7 +154,7 @@ public class ContainerItemRoutingNode extends Container { } @Override - public boolean canInteractWith(EntityPlayer playerIn) { + public boolean canInteractWith(PlayerEntity playerIn) { return this.tileItemRoutingNode.isUsableByPlayer(playerIn); } @@ -218,7 +218,7 @@ public class ContainerItemRoutingNode extends Container { } @Override - public boolean canTakeStack(EntityPlayer playerIn) { + public boolean canTakeStack(PlayerEntity playerIn) { return false; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java index a9959c27..806f657e 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java @@ -1,20 +1,20 @@ package WayofTime.bloodmagic.tile.container; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.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(InventoryPlayer inventoryPlayer, IInventory tileMasterRoutingNode) { + public ContainerMasterRoutingNode(PlayerInventory inventoryPlayer, IInventory tileMasterRoutingNode) { this.tileMasterRoutingNode = tileMasterRoutingNode; } @Override - public boolean canInteractWith(EntityPlayer playerIn) { + 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 index a86e82d4..457cb101 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java @@ -3,17 +3,17 @@ 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.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; +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.Slot; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; public class ContainerSoulForge extends Container { private final IInventory tileForge; - public ContainerSoulForge(InventoryPlayer inventoryPlayer, 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)); @@ -34,7 +34,7 @@ public class ContainerSoulForge extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); @@ -77,7 +77,7 @@ public class ContainerSoulForge extends Container { } @Override - public boolean canInteractWith(EntityPlayer playerIn) { + public boolean canInteractWith(PlayerEntity playerIn) { return this.tileForge.isUsableByPlayer(playerIn); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java index 82588b45..7852a260 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java @@ -1,17 +1,17 @@ package WayofTime.bloodmagic.tile.container; import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; +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.Slot; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; public class ContainerTeleposer extends Container { private final IInventory tileTeleposer; - public ContainerTeleposer(InventoryPlayer inventoryPlayer, IInventory tileTeleposer) { + public ContainerTeleposer(PlayerInventory inventoryPlayer, IInventory tileTeleposer) { this.tileTeleposer = tileTeleposer; this.addSlotToContainer(new SlotTeleposer(tileTeleposer, 0, 80, 33)); @@ -27,7 +27,7 @@ public class ContainerTeleposer extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer player, int slot) { + public ItemStack transferStackInSlot(PlayerEntity player, int slot) { ItemStack stack = ItemStack.EMPTY; Slot slotObject = inventorySlots.get(slot); int slots = inventorySlots.size(); @@ -63,7 +63,7 @@ public class ContainerTeleposer extends Container { } @Override - public boolean canInteractWith(EntityPlayer playerIn) { + public boolean canInteractWith(PlayerEntity playerIn) { return this.tileTeleposer.isUsableByPlayer(playerIn); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java index 7fb17330..ccadc1e4 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java @@ -3,12 +3,12 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.EnumFacing; +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 { @@ -21,7 +21,7 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn super(size, name); } - public ItemStack getFilterStack(EnumFacing side) { + public ItemStack getFilterStack(Direction side) { int index = side.getIndex(); return getStackInSlot(index); @@ -37,12 +37,12 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn } @Override - public boolean isInventoryConnectedToSide(EnumFacing side) { + public boolean isInventoryConnectedToSide(Direction side) { return true; } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); currentActiveSlot = tag.getInteger("currentSlot"); priorities = tag.getIntArray(Constants.NBT.ROUTING_PRIORITY); @@ -51,11 +51,11 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn } if (!tag.getBoolean("updated")) { - NBTTagList tags = tag.getTagList("Items", 10); + ListNBT tags = tag.getTagList("Items", 10); inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); for (int i = 0; i < tags.tagCount(); i++) { if (!isSyncedSlot(i)) { - NBTTagCompound data = tags.getCompoundTagAt(i); + CompoundNBT data = tags.getCompoundTagAt(i); byte j = data.getByte("Slot"); if (j == 0) { @@ -71,7 +71,7 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); tag.setInteger("currentSlot", currentActiveSlot); tag.setIntArray(Constants.NBT.ROUTING_PRIORITY, priorities); @@ -86,34 +86,34 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn } @Override - public int[] getSlotsForFace(EnumFacing side) { + public int[] getSlotsForFace(Direction side) { return new int[0]; } @Override - public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction) { + public boolean canInsertItem(int index, ItemStack itemStackIn, Direction direction) { return false; } @Override - public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) { + public boolean canExtractItem(int index, ItemStack stack, Direction direction) { return false; } @Override - public int getPriority(EnumFacing side) { + public int getPriority(Direction side) { return priorities[side.getIndex()]; } public void incrementCurrentPriotiryToMaximum(int max) { priorities[currentActiveSlot] = Math.min(priorities[currentActiveSlot] + 1, max); - IBlockState state = getWorld().getBlockState(pos); + BlockState state = getWorld().getBlockState(pos); getWorld().notifyBlockUpdate(pos, state, state, 3); } public void decrementCurrentPriority() { priorities[currentActiveSlot] = Math.max(priorities[currentActiveSlot] - 1, 0); - IBlockState state = getWorld().getBlockState(pos); + 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 index d758f2b5..bdc0c21c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java @@ -6,7 +6,7 @@ import WayofTime.bloodmagic.routing.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; @@ -17,12 +17,12 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn } @Override - public boolean isInput(EnumFacing side) { + public boolean isInput(Direction side) { return true; } @Override - public IItemFilter getInputFilterForSide(EnumFacing side) { + public IItemFilter getInputFilterForSide(Direction side) { TileEntity tile = getWorld().getTileEntity(pos.offset(side)); if (tile != null) { IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); @@ -46,12 +46,12 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn } @Override - public boolean isFluidInput(EnumFacing side) { + public boolean isFluidInput(Direction side) { return true; } @Override - public IFluidFilter getInputFluidFilterForSide(EnumFacing side) { + 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); @@ -67,7 +67,7 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn } @Override - public boolean isTankConnectedToSide(EnumFacing side) { + public boolean isTankConnectedToSide(Direction side) { return true; } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index afbb3410..a0457aee 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -5,10 +5,10 @@ import WayofTime.bloodmagic.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.routing.*; import WayofTime.bloodmagic.tile.TileInventory; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -52,7 +52,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (outputTile instanceof IOutputItemRoutingNode) { IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) { + for (Direction facing : Direction.VALUES) { if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) { continue; } @@ -74,7 +74,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (outputTile instanceof IOutputFluidRoutingNode) { IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; - for (EnumFacing facing : EnumFacing.VALUES) { + for (Direction facing : Direction.VALUES) { if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) { continue; } @@ -104,7 +104,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (inputTile instanceof IInputItemRoutingNode) { IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) { + for (Direction facing : Direction.VALUES) { if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) { continue; } @@ -126,7 +126,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti if (inputTile instanceof IInputFluidRoutingNode) { IInputFluidRoutingNode inputNode = (IInputFluidRoutingNode) inputTile; - for (EnumFacing facing : EnumFacing.VALUES) { + for (Direction facing : Direction.VALUES) { if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) { continue; } @@ -186,11 +186,11 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); - NBTTagList tags = new NBTTagList(); + ListNBT tags = new ListNBT(); for (BlockPos pos : generalNodeList) { - NBTTagCompound posTag = new NBTTagCompound(); + CompoundNBT posTag = new CompoundNBT(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); @@ -198,9 +198,9 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } tag.setTag(Constants.NBT.ROUTING_MASTER_GENERAL, tags); - tags = new NBTTagList(); + tags = new ListNBT(); for (BlockPos pos : inputNodeList) { - NBTTagCompound posTag = new NBTTagCompound(); + CompoundNBT posTag = new CompoundNBT(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); @@ -208,9 +208,9 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } tag.setTag(Constants.NBT.ROUTING_MASTER_INPUT, tags); - tags = new NBTTagList(); + tags = new ListNBT(); for (BlockPos pos : outputNodeList) { - NBTTagCompound posTag = new NBTTagCompound(); + CompoundNBT posTag = new CompoundNBT(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); @@ -221,26 +221,26 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); - NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); + ListNBT tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); for (int i = 0; i < tags.tagCount(); i++) { - NBTTagCompound blockTag = tags.getCompoundTagAt(i); + CompoundNBT blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); generalNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_INPUT, 10); for (int i = 0; i < tags.tagCount(); i++) { - NBTTagCompound blockTag = tags.getCompoundTagAt(i); + CompoundNBT blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); inputNodeList.add(newPos); } tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); for (int i = 0; i < tags.tagCount(); i++) { - NBTTagCompound blockTag = tags.getCompoundTagAt(i); + CompoundNBT blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); outputNodeList.add(newPos); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java index 9c57f30c..e52757bd 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java @@ -6,7 +6,7 @@ import WayofTime.bloodmagic.routing.*; import WayofTime.bloodmagic.util.Utils; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; @@ -17,12 +17,12 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO } @Override - public boolean isOutput(EnumFacing side) { + public boolean isOutput(Direction side) { return true; } @Override - public IItemFilter getOutputFilterForSide(EnumFacing side) { + public IItemFilter getOutputFilterForSide(Direction side) { TileEntity tile = getWorld().getTileEntity(pos.offset(side)); if (tile != null) { IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); @@ -46,12 +46,12 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO } @Override - public boolean isFluidOutput(EnumFacing side) { + public boolean isFluidOutput(Direction side) { return true; } @Override - public IFluidFilter getOutputFluidFilterForSide(EnumFacing side) { + 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); @@ -67,7 +67,7 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO } @Override - public boolean isTankConnectedToSide(EnumFacing side) { + 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 index 0062ce60..fb402861 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -5,10 +5,10 @@ import WayofTime.bloodmagic.routing.IItemRoutingNode; import WayofTime.bloodmagic.routing.IMasterRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; import WayofTime.bloodmagic.tile.TileInventory; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -36,17 +36,17 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte } @Override - public NBTTagCompound serialize(NBTTagCompound tag) { + public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); - NBTTagCompound masterTag = new NBTTagCompound(); + CompoundNBT masterTag = new CompoundNBT(); masterTag.setInteger(Constants.NBT.X_COORD, masterPos.getX()); masterTag.setInteger(Constants.NBT.Y_COORD, masterPos.getY()); masterTag.setInteger(Constants.NBT.Z_COORD, masterPos.getZ()); tag.setTag(Constants.NBT.ROUTING_MASTER, masterTag); - NBTTagList tags = new NBTTagList(); + ListNBT tags = new ListNBT(); for (BlockPos pos : connectionList) { - NBTTagCompound posTag = new NBTTagCompound(); + CompoundNBT posTag = new CompoundNBT(); posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); @@ -57,15 +57,15 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte } @Override - public void deserialize(NBTTagCompound tag) { + public void deserialize(CompoundNBT tag) { super.deserialize(tag); connectionList.clear(); - NBTTagCompound masterTag = tag.getCompoundTag(Constants.NBT.ROUTING_MASTER); + CompoundNBT masterTag = tag.getCompoundTag(Constants.NBT.ROUTING_MASTER); masterPos = new BlockPos(masterTag.getInteger(Constants.NBT.X_COORD), masterTag.getInteger(Constants.NBT.Y_COORD), masterTag.getInteger(Constants.NBT.Z_COORD)); - NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_CONNECTION, 10); + ListNBT tags = tag.getTagList(Constants.NBT.ROUTING_CONNECTION, 10); for (int i = 0; i < tags.tagCount(); i++) { - NBTTagCompound blockTag = tags.getCompoundTagAt(i); + CompoundNBT blockTag = tags.getCompoundTagAt(i); BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); connectionList.add(newPos); } @@ -159,12 +159,12 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte } @Override - public boolean isInventoryConnectedToSide(EnumFacing side) { + public boolean isInventoryConnectedToSide(Direction side) { return false; } @Override - public int getPriority(EnumFacing side) { + public int getPriority(Direction side) { return 0; } diff --git a/src/main/java/WayofTime/bloodmagic/util/BlockStack.java b/src/main/java/WayofTime/bloodmagic/util/BlockStack.java index 85428c4d..426b43fd 100644 --- a/src/main/java/WayofTime/bloodmagic/util/BlockStack.java +++ b/src/main/java/WayofTime/bloodmagic/util/BlockStack.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.util; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -10,7 +10,7 @@ import net.minecraft.world.World; public class BlockStack { private final Block block; private final int meta; - private final IBlockState state; + private final BlockState state; public BlockStack(Block block, int meta) { this.block = block; @@ -34,7 +34,7 @@ public class BlockStack { return meta; } - public IBlockState getState() { + public BlockState getState() { return state; } @@ -62,7 +62,7 @@ public class BlockStack { } public static BlockStack getStackFromPos(World world, BlockPos pos) { - IBlockState state = world.getBlockState(pos); + BlockState state = world.getBlockState(pos); return new BlockStack(state.getBlock(), state.getBlock().getMetaFromState(state)); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java index b82710f9..68428f47 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java @@ -4,12 +4,12 @@ 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.GuiNewChat; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.client.gui.NewChatGui; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; +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; @@ -20,7 +20,7 @@ public class ChatUtil { private static int lastAdded; private static void sendNoSpamMessages(ITextComponent[] messages) { - GuiNewChat chat = Minecraft.getMinecraft().ingameGUI.getChatGUI(); + NewChatGui chat = Minecraft.getMinecraft().ingameGUI.getChatGUI(); for (int i = DELETION_ID + messages.length - 1; i <= lastAdded; i++) { chat.deleteChatLine(i); } @@ -31,14 +31,14 @@ public class ChatUtil { } /** - * Returns a standard {@link TextComponentString} for the given + * 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 TextComponentString(s); + return new StringTextComponent(s); } /** @@ -60,7 +60,7 @@ public class ChatUtil { * @param args The args to apply to the format */ public static ITextComponent wrapFormatted(String s, Object... args) { - return new TextComponentTranslation(s, args); + return new TranslationTextComponent(s, args); } /** @@ -69,16 +69,16 @@ public class ChatUtil { * @param player The player to send the chat to * @param lines The lines to send */ - public static void sendChat(EntityPlayer player, String... lines) { + public static void sendChat(PlayerEntity player, String... lines) { sendChat(player, wrap(lines)); } /** * Localizes the lines before sending them. * - * @see #sendChat(EntityPlayer, String...) + * @see #sendChat(PlayerEntity, String...) */ - public static void sendChatUnloc(EntityPlayer player, String... unlocLines) { + public static void sendChatUnloc(PlayerEntity player, String... unlocLines) { sendChat(player, TextHelper.localizeAll(unlocLines)); } @@ -88,7 +88,7 @@ public class ChatUtil { * @param player The player to send the chat lines to. * @param lines The {@link ITextComponent chat components} to send.yes */ - public static void sendChat(EntityPlayer player, ITextComponent... lines) { + public static void sendChat(PlayerEntity player, ITextComponent... lines) { for (ITextComponent c : lines) { player.sendMessage(c); } @@ -117,7 +117,7 @@ public class ChatUtil { /** * Skips the packet sending, unsafe to call on servers. * - * @see #sendNoSpam(EntityPlayerMP, ITextComponent...) + * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) */ public static void sendNoSpamClient(ITextComponent... lines) { sendNoSpamMessages(lines); @@ -126,46 +126,46 @@ public class ChatUtil { /** * Localizes the strings before sending them. * - * @see #sendNoSpam(EntityPlayer, String...) + * @see #sendNoSpam(PlayerEntity, String...) */ - public static void sendNoSpamUnloc(EntityPlayer player, String... unlocLines) { + public static void sendNoSpamUnloc(PlayerEntity player, String... unlocLines) { sendNoSpam(player, TextHelper.localizeAll(unlocLines)); } /** * @see #wrap(String) - * @see #sendNoSpam(EntityPlayer, ITextComponent...) + * @see #sendNoSpam(PlayerEntity, ITextComponent...) */ - public static void sendNoSpam(EntityPlayer player, String... lines) { + public static void sendNoSpam(PlayerEntity player, String... lines) { sendNoSpam(player, wrap(lines)); } /** - * First checks if the player is instanceof {@link EntityPlayerMP} before + * First checks if the player is instanceof {@link ServerPlayerEntity} before * casting. * - * @see #sendNoSpam(EntityPlayerMP, ITextComponent...) + * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) */ - public static void sendNoSpam(EntityPlayer player, ITextComponent... lines) { - if (player instanceof EntityPlayerMP) { - sendNoSpam((EntityPlayerMP) player, lines); + public static void sendNoSpam(PlayerEntity player, ITextComponent... lines) { + if (player instanceof ServerPlayerEntity) { + sendNoSpam((ServerPlayerEntity) player, lines); } } /** * Localizes the strings before sending them. * - * @see #sendNoSpam(EntityPlayerMP, String...) + * @see #sendNoSpam(ServerPlayerEntity, String...) */ - public static void sendNoSpamUnloc(EntityPlayerMP player, String... unlocLines) { + public static void sendNoSpamUnloc(ServerPlayerEntity player, String... unlocLines) { sendNoSpam(player, TextHelper.localizeAll(unlocLines)); } /** * @see #wrap(String) - * @see #sendNoSpam(EntityPlayerMP, ITextComponent...) + * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) */ - public static void sendNoSpam(EntityPlayerMP player, String... lines) { + public static void sendNoSpam(ServerPlayerEntity player, String... lines) { sendNoSpam(player, wrap(lines)); } @@ -178,7 +178,7 @@ public class ChatUtil { * @param player The player to send the chat message to * @param lines The chat lines to send. */ - public static void sendNoSpam(EntityPlayerMP player, ITextComponent... lines) { + public static void sendNoSpam(ServerPlayerEntity player, ITextComponent... lines) { if (lines.length > 0) BloodMagicPacketHandler.INSTANCE.sendTo(new PacketNoSpamChat(lines), player); } diff --git a/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java index 28a29658..3025075b 100644 --- a/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java @@ -1,10 +1,10 @@ package WayofTime.bloodmagic.util; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.LivingEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.StringTextComponent; public class DamageSourceBloodMagic extends DamageSource { @@ -18,7 +18,7 @@ public class DamageSourceBloodMagic extends DamageSource { } @Override - public ITextComponent getDeathMessage(EntityLivingBase livingBase) { - return new TextComponentString(TextHelper.localizeEffect("chat.bloodmagic.damageSource", livingBase.getName())); + public ITextComponent getDeathMessage(LivingEntity livingBase) { + return new StringTextComponent(TextHelper.localizeEffect("chat.bloodmagic.damageSource", livingBase.getName())); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java index 54a2e614..cb1ef51b 100644 --- a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java @@ -2,19 +2,19 @@ package WayofTime.bloodmagic.util; import WayofTime.bloodmagic.util.helper.NBTHelper; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; public class GhostItemHelper { public static void setItemGhostAmount(ItemStack stack, int amount) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setInteger(Constants.NBT.GHOST_STACK_SIZE, amount); } public static int getItemGhostAmount(ItemStack stack) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getInteger(Constants.NBT.GHOST_STACK_SIZE); } @@ -24,7 +24,7 @@ public class GhostItemHelper { return false; } - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.hasKey(Constants.NBT.GHOST_STACK_SIZE); } @@ -43,7 +43,7 @@ public class GhostItemHelper { public static ItemStack getStackFromGhost(ItemStack ghostStack) { ItemStack newStack = ghostStack.copy(); NBTHelper.checkNBT(newStack); - NBTTagCompound tag = newStack.getTagCompound(); + CompoundNBT tag = newStack.getTagCompound(); int amount = getItemGhostAmount(ghostStack); tag.removeTag(Constants.NBT.GHOST_STACK_SIZE); if (tag.isEmpty()) { diff --git a/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java index 70b19397..771492c2 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java @@ -3,7 +3,7 @@ package WayofTime.bloodmagic.util; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import javax.annotation.Nullable; import java.util.ArrayList; @@ -14,7 +14,7 @@ public class ItemStackWrapper { public final Item item; public final int stackSize; public final int meta; - public NBTTagCompound nbtTag; + public CompoundNBT nbtTag; public ItemStackWrapper(Item item, int stackSize, int meta) { this.item = item; @@ -77,11 +77,11 @@ public class ItemStackWrapper { return meta; } - public NBTTagCompound getNbtTag() { + public CompoundNBT getNbtTag() { return nbtTag; } - public void setNbtTag(NBTTagCompound nbtTag) { + public void setNbtTag(CompoundNBT nbtTag) { this.nbtTag = nbtTag; } diff --git a/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java b/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java index 51319174..fb2342a5 100644 --- a/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java +++ b/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.util; import WayofTime.bloodmagic.item.sigil.ItemSigilFluidBase; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.fluids.FluidStack; @@ -36,12 +36,12 @@ public class SigilFluidWrapper implements ICapabilityProvider { } @Override - public boolean hasCapability(Capability capability, EnumFacing from) { + public boolean hasCapability(Capability capability, Direction from) { return capability == CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY; } @Override - public T getCapability(Capability capability, final EnumFacing from) { + public T getCapability(Capability capability, final Direction from) { if (!hasCapability(capability, from)) { return null; } diff --git a/src/main/java/WayofTime/bloodmagic/util/StateUtil.java b/src/main/java/WayofTime/bloodmagic/util/StateUtil.java index 5c3d35b9..ba653735 100644 --- a/src/main/java/WayofTime/bloodmagic/util/StateUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/StateUtil.java @@ -1,15 +1,15 @@ 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.block.state.IBlockState; -import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.ForgeRegistries; public class StateUtil { - public static IBlockState parseState(String state) { + 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 @@ -19,7 +19,7 @@ public class StateUtil { return block.getDefaultState(); BlockStateContainer blockState = block.getBlockState(); - IBlockState returnState = blockState.getBaseState(); + BlockState returnState = blockState.getBaseState(); // Force our values into the state String[] stateValues = split[1].split(","); // Splits up each value diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 26a42fa4..c78454d9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -10,30 +10,28 @@ 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.BlockPortal; -import net.minecraft.block.state.IBlockState; +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.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; +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.EnumDyeColor; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; +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.DamageSource; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.SoundCategory; +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; @@ -54,13 +52,13 @@ import java.util.*; public class Utils { - public static final EnumMap DYE_COLOR_VALUES = Maps.newEnumMap(EnumDyeColor.class); + public static final EnumMap DYE_COLOR_VALUES = Maps.newEnumMap(DyeColor.class); static { try { - Field colorValue = ObfuscationReflectionHelper.findField(EnumDyeColor.class, "field_193351_w"); + Field colorValue = ObfuscationReflectionHelper.findField(DyeColor.class, "field_193351_w"); colorValue.setAccessible(true); - for (EnumDyeColor color : EnumDyeColor.values()) { + for (DyeColor color : DyeColor.values()) { DYE_COLOR_VALUES.put(color, (int) colorValue.get(color)); } } catch (IllegalAccessException e) { @@ -68,7 +66,7 @@ public class Utils { } } - public static float addAbsorptionToMaximum(EntityLivingBase entity, float added, int maximum, int duration) { + public static float addAbsorptionToMaximum(LivingEntity entity, float added, int maximum, int duration) { float currentAmount = entity.getAbsorptionAmount(); added = Math.min(maximum - currentAmount, added); @@ -78,7 +76,7 @@ public class Utils { if (duration > 0) { int potionLevel = (int) ((currentAmount + added) / 4); - entity.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, duration, potionLevel, true, false)); + entity.addPotionEffect(new EffectInstance(Effects.ABSORPTION, duration, potionLevel, true, false)); } entity.setAbsorptionAmount(currentAmount + added); @@ -86,21 +84,21 @@ public class Utils { return added; } - public static boolean isImmuneToFireDamage(EntityLivingBase entity) { - return entity.isImmuneToFire() || entity.isPotionActive(MobEffects.FIRE_RESISTANCE); + public static boolean isImmuneToFireDamage(LivingEntity entity) { + return entity.isImmuneToFire() || entity.isPotionActive(Effects.FIRE_RESISTANCE); } - public static boolean isPlayerBesideSolidBlockFace(EntityPlayer player) { + public static boolean isPlayerBesideSolidBlockFace(PlayerEntity player) { World world = player.getEntityWorld(); double minimumDistanceFromAxis = 0.7; BlockPos centralPos = player.getPosition(); - for (EnumFacing facing : EnumFacing.HORIZONTALS) { + 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; } - IBlockState state = world.getBlockState(offsetPos); + BlockState state = world.getBlockState(offsetPos); if (state.isSideSolid(world, offsetPos, facing.getOpposite())) { return true; } @@ -109,7 +107,7 @@ public class Utils { return false; } - public static boolean canPlayerSeeDemonWill(EntityPlayer player) { + public static boolean canPlayerSeeDemonWill(PlayerEntity player) { IItemHandler inventory = new PlayerMainInvWrapper(player.inventory); for (int i = 0; i < inventory.getSlots(); i++) { @@ -128,16 +126,16 @@ public class Utils { 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); - EnumFacing dir = EnumFacing.getFacingFromVector((float) relativePosition.x, (float) relativePosition.y, (float) relativePosition.z); + 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(EntityItem.class, aabb); + List itemEntities = world.getEntitiesWithinAABB(ItemEntity.class, aabb); - for (EntityItem itemEntity : itemEntities) { + for (ItemEntity itemEntity : itemEntities) { placedBlocks += plantEntityItem(itemEntity, horizontalRadius, verticalRadius); } @@ -167,10 +165,10 @@ public class Utils { BlockPos newPos = centralPos.add(i, j, k); if (world.isAirBlock(newPos)) { - BlockPos offsetPos = newPos.offset(EnumFacing.DOWN); - IBlockState state = world.getBlockState(offsetPos); - if (state.getBlock().canSustainPlant(state, world, offsetPos, EnumFacing.UP, (IPlantable) item)) { - IBlockState plantState = ((IPlantable) item).getPlant(world, 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); @@ -189,7 +187,7 @@ public class Utils { return planted; } - public static int plantEntityItem(EntityItem itemEntity, int horizontalRadius, int verticalRadius) { + public static int plantEntityItem(ItemEntity itemEntity, int horizontalRadius, int verticalRadius) { if (itemEntity == null || itemEntity.isDead) { return 0; } @@ -207,7 +205,7 @@ public class Utils { return planted; } - public static int getDemonWillResolution(EntityPlayer player) { + public static int getDemonWillResolution(PlayerEntity player) { IItemHandler inventory = new PlayerMainInvWrapper(player.inventory); for (int i = 0; i < inventory.getSlots(); i++) { @@ -224,22 +222,22 @@ public class Utils { return 1; } - public static NBTTagCompound getPersistentDataTag(EntityPlayer player) { - NBTTagCompound forgeData = player.getEntityData().getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG); - NBTTagCompound beaconData = forgeData.getCompoundTag("BloodMagic"); + 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(EntityPlayer.PERSISTED_NBT_TAG)) - player.getEntityData().setTag(EntityPlayer.PERSISTED_NBT_TAG, forgeData); + if (!player.getEntityData().hasKey(PlayerEntity.PERSISTED_NBT_TAG)) + player.getEntityData().setTag(PlayerEntity.PERSISTED_NBT_TAG, forgeData); return beaconData; } - public static void setPlayerSpeedFromServer(EntityPlayer player, double motionX, double motionY, double motionZ) { - if (!player.getEntityWorld().isRemote && player instanceof EntityPlayerMP) { - BloodMagicPacketHandler.sendTo(new PlayerVelocityPacketProcessor(motionX, motionY, motionZ), (EntityPlayerMP) player); + 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); } } @@ -266,9 +264,9 @@ public class Utils { * @param player - The player to take the item from. * @return {@code true} if the ItemStack is inserted, {@code false} * otherwise - * @see #insertItemToTile(TileInventory, EntityPlayer, int) + * @see #insertItemToTile(TileInventory, PlayerEntity, int) */ - public static boolean insertItemToTile(TileInventory tile, EntityPlayer player) { + public static boolean insertItemToTile(TileInventory tile, PlayerEntity player) { return insertItemToTile(tile, player, 0); } @@ -284,7 +282,7 @@ public class Utils { * @return {@code true} if the ItemStack is inserted, {@code false} * otherwise */ - public static boolean insertItemToTile(TileInventory tile, EntityPlayer player, int slot) { + 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(); @@ -311,9 +309,9 @@ public class Utils { } @Nullable - public static IItemHandler getInventory(TileEntity tile, @Nullable EnumFacing facing) { + public static IItemHandler getInventory(TileEntity tile, @Nullable Direction facing) { if (facing == null) - facing = EnumFacing.DOWN; + facing = Direction.DOWN; IItemHandler itemHandler = null; @@ -358,7 +356,7 @@ public class Utils { } } - public static float getModifiedDamage(EntityLivingBase attackedEntity, DamageSource source, float amount) { + public static float getModifiedDamage(LivingEntity attackedEntity, DamageSource source, float amount) { if (!attackedEntity.isEntityInvulnerable(source)) { if (amount <= 0) return 0; @@ -374,7 +372,7 @@ public class Utils { return 0; } - public static float applyArmor(EntityLivingBase entity, ItemStack[] inventory, DamageSource source, double damage) { + 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++) { @@ -386,8 +384,8 @@ public class Utils { 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 ItemArmor && !source.isUnblockable()) { - ItemArmor armor = (ItemArmor) stack.getItem(); + } 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) { @@ -414,8 +412,8 @@ public class Utils { return (float) (damage / 25.0F); } - public static float applyPotionDamageCalculations(EntityLivingBase attackedEntity, DamageSource source, float damage) { - Potion resistance = MobEffects.RESISTANCE; + public static float applyPotionDamageCalculations(LivingEntity attackedEntity, DamageSource source, float damage) { + Effect resistance = Effects.RESISTANCE; if (source.isDamageAbsolute()) { return damage; @@ -513,7 +511,7 @@ public class Utils { return returned; } - public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, EnumFacing dir) { + 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); @@ -525,7 +523,7 @@ public class Utils { return stack; } - public static int getNumberOfFreeSlots(TileEntity tile, EnumFacing dir) { + public static int getNumberOfFreeSlots(TileEntity tile, Direction dir) { int slots = 0; if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) { @@ -572,7 +570,7 @@ public class Utils { * @param limit * @return */ - public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, EnumFacing dir, int limit) { + 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(); @@ -622,7 +620,7 @@ public class Utils { return stack; } - public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir) { + public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, Direction dir) { if (stack.isEmpty()) { return ItemStack.EMPTY; } @@ -657,11 +655,11 @@ public class Utils { return stack; } - public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir) { + 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, EnumFacing dir, boolean fillToLimit, int limit) { + public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, Direction dir, boolean fillToLimit, int limit) { if (stack.isEmpty()) { return true; } @@ -734,7 +732,7 @@ public class Utils { * @param limit * @return */ - public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir, int limit) { + public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, Direction dir, int limit) { if (stack.isEmpty()) { return ItemStack.EMPTY; } @@ -793,17 +791,17 @@ public class Utils { return stack; } - public static boolean isBlockLiquid(IBlockState state) { + public static boolean isBlockLiquid(BlockState state) { return (state instanceof IFluidBlock || state.getMaterial().isLiquid()); } - public static boolean isFlowingLiquid(IBlockState state) { + 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 EnumFacing pushDirection, ItemStack stack) { - EntityItem entityItem = new EntityItem(world); + 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) { @@ -854,17 +852,17 @@ public class Utils { public static boolean swapLocations(World initialWorld, BlockPos initialPos, World finalWorld, BlockPos finalPos, boolean playSound) { TileEntity initialTile = initialWorld.getTileEntity(initialPos); TileEntity finalTile = finalWorld.getTileEntity(finalPos); - NBTTagCompound initialTag = new NBTTagCompound(); - NBTTagCompound finalTag = new NBTTagCompound(); + CompoundNBT initialTag = new CompoundNBT(); + CompoundNBT finalTag = new CompoundNBT(); if (initialTile != null) initialTile.writeToNBT(initialTag); if (finalTile != null) finalTile.writeToNBT(finalTag); - IBlockState initialState = initialWorld.getBlockState(initialPos); - IBlockState finalState = finalWorld.getBlockState(finalPos); + BlockState initialState = initialWorld.getBlockState(initialPos); + BlockState finalState = finalWorld.getBlockState(finalPos); - if ((initialState.getBlock().equals(Blocks.AIR) && finalState.getBlock().equals(Blocks.AIR)) || initialState.getBlock() instanceof BlockPortal || finalState.getBlock() instanceof BlockPortal) + if ((initialState.getBlock().equals(Blocks.AIR) && finalState.getBlock().equals(Blocks.AIR)) || initialState.getBlock() instanceof NetherPortalBlock || finalState.getBlock() instanceof NetherPortalBlock) return false; if (playSound) { @@ -879,8 +877,8 @@ public class Utils { initialWorld.removeTileEntity(initialPos); //TILES CLEARED - IBlockState initialBlockState = initialWorld.getBlockState(initialPos); - IBlockState finalBlockState = finalWorld.getBlockState(finalPos); + BlockState initialBlockState = initialWorld.getBlockState(initialPos); + BlockState finalBlockState = finalWorld.getBlockState(finalPos); finalWorld.setBlockState(finalPos, initialBlockState, 3); if (initialTile != null) { @@ -950,7 +948,7 @@ public class Utils { } } - public static RayTraceResult rayTrace(EntityPlayer player, boolean useLiquids) { + 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); @@ -963,8 +961,8 @@ public class Utils { float f7 = f2 * f4; double reachDistance = 5.0D; - if (player instanceof EntityPlayerMP) - reachDistance = ((EntityPlayerMP) player).interactionManager.getBlockReachDistance(); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index b929e0e9..b8bddf1f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -20,20 +20,20 @@ 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.EntityPlayerSP; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.model.ModelResourceLocation; +import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.entity.player.EntityPlayer; +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.EnumFacing; +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.TextComponentString; +import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; import net.minecraftforge.client.event.*; import net.minecraftforge.client.event.sound.PlaySoundEvent; @@ -71,7 +71,7 @@ public class ClientHandler { public static Minecraft minecraft = Minecraft.getMinecraft(); private static TileMasterRitualStone mrsHoloTile; private static Ritual mrsHoloRitual; - private static EnumFacing mrsHoloDirection; + private static Direction mrsHoloDirection; private static boolean mrsHoloDisplay; @SubscribeEvent @@ -93,7 +93,7 @@ public class ClientHandler { @SubscribeEvent public static void onSoundEvent(PlaySoundEvent event) { - EntityPlayer player = Minecraft.getMinecraft().player; + PlayerEntity player = Minecraft.getMinecraft().player; if (player != null && player.isPotionActive(RegistrarBloodMagic.DEAFNESS)) { event.setResultSound(null); } @@ -121,7 +121,7 @@ public class ClientHandler { @SubscribeEvent public static void render(RenderWorldLastEvent event) { - EntityPlayerSP player = minecraft.player; + ClientPlayerEntity player = minecraft.player; World world = player.getEntityWorld(); if (mrsHoloTile != null) { @@ -146,7 +146,7 @@ public class ClientHandler { @SubscribeEvent public static void onMouseEvent(MouseEvent event) { - EntityPlayerSP player = Minecraft.getMinecraft().player; + ClientPlayerEntity player = Minecraft.getMinecraft().player; if (event.getDwheel() != 0 && player != null && player.isSneaking()) { ItemStack stack = player.getHeldItemMainhand(); @@ -241,10 +241,10 @@ public class ClientHandler { BMLog.DEBUG.info("Suppressed required texture errors in {}", stopwatch.stop()); } - private static void renderRitualStones(EntityPlayerSP player, float partialTicks) { + private static void renderRitualStones(ClientPlayerEntity player, float partialTicks) { World world = player.getEntityWorld(); ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); - EnumFacing direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); + Direction direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(ritualDiviner.getCurrentRitual(player.inventory.getCurrentItem())); if (ritual == null) @@ -303,7 +303,7 @@ public class ClientHandler { GlStateManager.popMatrix(); } - public static void cycleSigil(ItemStack stack, EntityPlayer player, int dWheel) { + public static void cycleSigil(ItemStack stack, PlayerEntity player, int dWheel) { int mode = dWheel; if (!ConfigHandler.client.sigilHoldingSkipsEmptySlots) { mode = ItemSigilHolding.getCurrentItemOrdinal(stack); @@ -313,17 +313,17 @@ public class ClientHandler { 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 TextComponentString("") : newStack.getTextComponent(), true); + player.sendStatusMessage(newStack.isEmpty() ? new StringTextComponent("") : newStack.getTextComponent(), true); } - private static TextureAtlasSprite forName(TextureMap textureMap, String name, String dir) { + 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) { - EntityPlayerSP player = minecraft.player; + ClientPlayerEntity player = minecraft.player; World world = player.getEntityWorld(); - EnumFacing direction = mrsHoloDirection; + Direction direction = mrsHoloDirection; Ritual ritual = mrsHoloRitual; if (ritual == null) @@ -382,7 +382,7 @@ public class ClientHandler { GlStateManager.popMatrix(); } - public static void setRitualHolo(TileMasterRitualStone masterRitualStone, Ritual ritual, EnumFacing direction, boolean displayed) { + public static void setRitualHolo(TileMasterRitualStone masterRitualStone, Ritual ritual, Direction direction, boolean displayed) { mrsHoloDisplay = displayed; mrsHoloTile = masterRitualStone; mrsHoloRitual = ritual; @@ -393,6 +393,6 @@ public class ClientHandler { mrsHoloDisplay = false; mrsHoloTile = null; mrsHoloRitual = null; - mrsHoloDirection = EnumFacing.NORTH; + 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 index 4d97a8d4..72f4cec8 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -12,12 +12,11 @@ import WayofTime.bloodmagic.util.helper.NBTHelper; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.ItemInscriptionTool; -import net.minecraft.init.Items; -import net.minecraft.item.EnumDyeColor; -import net.minecraft.item.ItemBanner; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityFurnace; +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; @@ -46,7 +45,7 @@ public class CraftingHandler { } if (event.getOutput().getItem() == ForgeModContainer.getInstance().universalBucket && event.getAltarRecipe().getSyphon() == 1000) { - NBTTagCompound bucketTags = FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)).getTagCompound(); + CompoundNBT bucketTags = FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)).getTagCompound(); event.getOutput().setTagCompound(bucketTags); } } @@ -73,7 +72,7 @@ public class CraftingHandler { if (event.getRight().getItem() == Items.NAME_TAG) { ItemStack output = event.getLeft().copy(); if (!output.hasTagCompound()) - output.setTagCompound(new NBTTagCompound()); + output.setTagCompound(new CompoundNBT()); output.getTagCompound().setString(Constants.NBT.COLOR, event.getRight().getDisplayName()); event.setCost(1); @@ -83,10 +82,10 @@ public class CraftingHandler { } if (event.getRight().getItem() == Items.DYE) { - EnumDyeColor dyeColor = ItemBanner.getBaseColor(event.getRight()); + DyeColor dyeColor = BannerItem.getBaseColor(event.getRight()); ItemStack output = event.getLeft().copy(); if (!output.hasTagCompound()) - output.setTagCompound(new NBTTagCompound()); + output.setTagCompound(new CompoundNBT()); output.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(Utils.DYE_COLOR_VALUES.getOrDefault(dyeColor, 0))); event.setCost(1); @@ -145,6 +144,6 @@ public class CraftingHandler { @SubscribeEvent public static void handleFuelLevel(FurnaceFuelBurnTimeEvent event) { if (ItemStack.areItemsEqual(event.getItemStack(), ComponentTypes.SAND_COAL.getStack())) - event.setBurnTime(TileEntityFurnace.getItemBurnTime(new ItemStack(Items.COAL))); + 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 9a2c457d..23165c69 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -43,31 +43,31 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIAttackMelee; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAITarget; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Enchantments; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; +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.EnumHand; +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.TextComponentTranslation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -95,18 +95,18 @@ 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> 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 EntityPlayer) { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + if (event.getEntityLiving() instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) event.getEntityLiving(); if (player.isPotionActive(RegistrarBloodMagic.BOUNCE) && !player.isSneaking() && event.getDistance() > 2) { event.setDamageMultiplier(0); @@ -125,12 +125,12 @@ public class GenericHandler { @SubscribeEvent public static void playerTickPost(TickEvent.PlayerTickEvent event) { World world = event.player.getEntityWorld(); - Map bounceMap = bounceMapMap.get(world); + 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); + Map filledHandMap = filledHandMapMap.get(world); if (event.phase == TickEvent.Phase.END) { if (filledHandMap.containsKey(event.player)) { int value = filledHandMap.get(event.player) - 1; @@ -146,9 +146,9 @@ public class GenericHandler { @SubscribeEvent public static void onPlayerClick(PlayerInteractEvent event) { if (event.isCancelable() && event.getEntityPlayer().isPotionActive(RegistrarBloodMagic.CONSTRICT)) { - EntityPlayer player = event.getEntityPlayer(); + PlayerEntity player = event.getEntityPlayer(); int level = player.getActivePotionEffect(RegistrarBloodMagic.CONSTRICT).getAmplifier(); - if (event.getHand() == EnumHand.OFF_HAND || level > 1) { + if (event.getHand() == Hand.OFF_HAND || level > 1) { event.setCanceled(true); } } @@ -156,7 +156,7 @@ public class GenericHandler { @SubscribeEvent public static void onPlayerDropItem(ItemTossEvent event) { - EntityItem itemEntity = event.getEntityItem(); + ItemEntity itemEntity = event.getEntityItem(); if (itemEntity != null) { ItemStack stack = itemEntity.getItem(); Item item = stack.getItem(); @@ -192,22 +192,22 @@ public class GenericHandler { if (event.getEntity().getEntityWorld().isRemote) return; - if (event.getSource().getTrueSource() instanceof EntityPlayer && !PlayerHelper.isFakePlayer((EntityPlayer) event.getSource().getTrueSource())) { - EntityPlayer player = (EntityPlayer) event.getSource().getTrueSource(); + if (event.getSource().getTrueSource() instanceof PlayerEntity && !PlayerHelper.isFakePlayer((PlayerEntity) event.getSource().getTrueSource())) { + PlayerEntity player = (PlayerEntity) event.getSource().getTrueSource(); - if (!player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).isEmpty() && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() instanceof ItemPackSacrifice) { - ItemPackSacrifice pack = (ItemPackSacrifice) player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem(); + 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(EntityEquipmentSlot.CHEST)) < pack.CAPACITY; + 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(EntityEquipmentSlot.CHEST), totalLP, pack.CAPACITY); + ItemHelper.LPContainer.addLPToItem(player.getItemStackFromSlot(EquipmentSlotType.CHEST), totalLP, pack.CAPACITY); } if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { @@ -224,21 +224,21 @@ public class GenericHandler { @SubscribeEvent public static void onLivingUpdate(LivingUpdateEvent event) { if (!event.getEntityLiving().getEntityWorld().isRemote) { - EntityLivingBase entity = event.getEntityLiving(); - if (entity instanceof EntityPlayer && entity.ticksExisted % 50 == 0) //TODO: Change to an incremental counter + LivingEntity entity = event.getEntityLiving(); + if (entity instanceof PlayerEntity && entity.ticksExisted % 50 == 0) //TODO: Change to an incremental counter { - sendPlayerDemonWillAura((EntityPlayer) entity); + sendPlayerDemonWillAura((PlayerEntity) entity); } World world = entity.getEntityWorld(); - Map targetTaskMap = targetTaskMapMap.get(world); - Map attackTaskMap = attackTaskMapMap.get(world); - if (event.getEntityLiving() instanceof EntityAnimal) { - EntityAnimal animal = (EntityAnimal) event.getEntityLiving(); + 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)) { - EntityAITarget task = new EntityAINearestAttackableTarget<>(animal, EntityMob.class, false); - EntityAIBase attackTask = new EntityAIAttackMelee(animal, 1.0D, false); + 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); @@ -257,10 +257,10 @@ public class GenericHandler { } } - EntityLivingBase entity = event.getEntityLiving(); + LivingEntity entity = event.getEntityLiving(); - if (entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entity; + 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; @@ -272,10 +272,10 @@ public class GenericHandler { } } - if (entity.isPotionActive(MobEffects.NIGHT_VISION)) { - int duration = entity.getActivePotionEffect(MobEffects.NIGHT_VISION).getDuration(); + if (entity.isPotionActive(Effects.NIGHT_VISION)) { + int duration = entity.getActivePotionEffect(Effects.NIGHT_VISION).getDuration(); if (duration == Constants.Misc.NIGHT_VISION_CONSTANT_END) { - entity.removePotionEffect(MobEffects.NIGHT_VISION); + entity.removePotionEffect(Effects.NIGHT_VISION); } } @@ -301,14 +301,14 @@ public class GenericHandler { } // @SideOnly(Side.SERVER) - public static void sendPlayerDemonWillAura(EntityPlayer player) { - if (player instanceof EntityPlayerMP) { + 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), (EntityPlayerMP) player); + BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(holder), (ServerPlayerEntity) player); } else { - BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(new DemonWillHolder()), (EntityPlayerMP) player); + BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(new DemonWillHolder()), (ServerPlayerEntity) player); } } } @@ -316,11 +316,11 @@ public class GenericHandler { // Handles destroying altar @SubscribeEvent public static void harvestEvent(PlayerEvent.HarvestCheck event) { - IBlockState state = event.getTargetBlock(); + BlockState state = event.getTargetBlock(); Block block = state.getBlock(); - if (block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && !event.getEntityPlayer().getHeldItemMainhand().isEmpty() && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) { + 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 TextComponentTranslation("chat.bloodmagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer())), true); + event.getEntityPlayer().sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer())), true); } } @@ -351,7 +351,7 @@ public class GenericHandler { if (event.getWorld().isRemote) return; - EntityPlayer player = event.getEntityPlayer(); + PlayerEntity player = event.getEntityPlayer(); if (PlayerHelper.isFakePlayer(player)) return; @@ -390,10 +390,10 @@ public class GenericHandler { @SubscribeEvent public static void selfSacrificeEvent(SacrificeKnifeUsedEvent event) { - EntityPlayer player = event.player; + PlayerEntity player = event.player; if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { StatTrackerSelfSacrifice.incrementCounter(armour, event.healthDrained / 2); @@ -411,18 +411,18 @@ public class GenericHandler { // Drop Blood Shards @SubscribeEvent public static void onLivingDrops(LivingDropsEvent event) { - EntityLivingBase attackedEntity = event.getEntityLiving(); + LivingEntity attackedEntity = event.getEntityLiving(); DamageSource source = event.getSource(); Entity entity = source.getTrueSource(); - if (entity != null && entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entity; + if (entity != null && entity instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) entity; ItemStack heldStack = player.getHeldItemMainhand(); - if (!heldStack.isEmpty() && heldStack.getItem() == RegistrarBloodMagicItems.BOUND_SWORD && !(attackedEntity instanceof EntityAnimal)) + 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 EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0))); + event.getDrops().add(new ItemEntity(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0))); } } @@ -438,7 +438,7 @@ public class GenericHandler { // Experience Tome @SubscribeEvent(priority = EventPriority.LOWEST) public static void onExperiencePickup(PlayerPickupXpEvent event) { - EntityPlayer player = event.getEntityPlayer(); + PlayerEntity player = event.getEntityPlayer(); ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); if (!Loader.isModLoaded("unmending")) { @@ -473,7 +473,7 @@ public class GenericHandler { public static void onLivingSpawnEvent(LivingSpawnEvent.CheckSpawn event) { World world = event.getWorld(); - if (!(event.getEntityLiving() instanceof EntityMob)) { + if (!(event.getEntityLiving() instanceof MonsterEntity)) { return; } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java index 447fffa0..5c65682b 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -18,17 +18,17 @@ 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.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Enchantments; -import net.minecraft.init.Items; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemArrow; -import net.minecraft.item.ItemSplashPotion; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumHand; +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; @@ -49,10 +49,10 @@ public class LivingArmourHandler { @SubscribeEvent public static void onEntityHealed(LivingHealEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) event.getEntity(); + if (event.getEntityLiving() instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) event.getEntity(); if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { double modifier = 1; @@ -72,9 +72,9 @@ public class LivingArmourHandler { @SubscribeEvent public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) { - EntityPlayer player = event.getEntityPlayer(); + PlayerEntity player = event.getEntityPlayer(); if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { double modifier = 1; @@ -93,17 +93,17 @@ public class LivingArmourHandler { @SubscribeEvent public static void onEntityJoinedWorld(EntityJoinWorldEvent event) { Entity owner = null; - if (event.getEntity() instanceof EntityArrow) { - owner = ((EntityArrow) event.getEntity()).shootingEntity; - } else if (event.getEntity() instanceof EntityThrowable) { - owner = ((EntityThrowable) event.getEntity()).getThrower(); + if (event.getEntity() instanceof AbstractArrowEntity) { + owner = ((AbstractArrowEntity) event.getEntity()).shootingEntity; + } else if (event.getEntity() instanceof ThrowableEntity) { + owner = ((ThrowableEntity) event.getEntity()).getThrower(); } - if (owner instanceof EntityPlayer) { + if (owner instanceof PlayerEntity) { Entity projectile = event.getEntity(); - EntityPlayer player = (EntityPlayer) owner; + PlayerEntity player = (PlayerEntity) owner; if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stormTrooper", chestStack); @@ -123,13 +123,13 @@ public class LivingArmourHandler { @SubscribeEvent public static void onPlayerClick(PlayerInteractEvent event) { if (event.isCancelable()) { - EntityPlayer player = event.getEntityPlayer(); + PlayerEntity player = event.getEntityPlayer(); if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { - if (event.getHand() == EnumHand.OFF_HAND) { + if (event.getHand() == Hand.OFF_HAND) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.crippledArm", chestStack); if (upgrade instanceof LivingArmourUpgradeCrippledArm) { @@ -137,9 +137,9 @@ public class LivingArmourHandler { } } - if (event.getItemStack().getItemUseAction() == EnumAction.DRINK) { + if (event.getItemStack().getItemUseAction() == UseAction.DRINK) { ItemStack drinkStack = event.getItemStack(); - if (!(drinkStack.getItem() instanceof ItemSplashPotion)) { + if (!(drinkStack.getItem() instanceof SplashPotionItem)) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); if (upgrade instanceof LivingArmourUpgradeQuenched) { @@ -155,11 +155,11 @@ public class LivingArmourHandler { // Applies: Grim Reaper @SubscribeEvent(priority = EventPriority.HIGHEST) public static void onEntityDeath(LivingDeathEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + if (event.getEntityLiving() instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) event.getEntityLiving(); if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { StatTrackerGrimReaperSprint.incrementCounter(armour); @@ -181,11 +181,11 @@ public class LivingArmourHandler { // Applies: Jump @SubscribeEvent public static void onJumpEvent(LivingEvent.LivingJumpEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + if (event.getEntityLiving() instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) event.getEntityLiving(); if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { StatTrackerJump.incrementCounter(armour); @@ -205,15 +205,15 @@ public class LivingArmourHandler { // Applies: Step Assist, Speed Boost @SubscribeEvent(priority = EventPriority.HIGHEST) public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + 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(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stepAssist", chestStack); @@ -236,7 +236,7 @@ public class LivingArmourHandler { float percentIncrease = 0; if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.movement", chestStack); @@ -266,14 +266,14 @@ public class LivingArmourHandler { public static void onArrowFire(ArrowLooseEvent event) { World world = event.getEntityPlayer().getEntityWorld(); ItemStack stack = event.getBow(); - EntityPlayer player = event.getEntityPlayer(); + PlayerEntity player = event.getEntityPlayer(); boolean sentientShot = false; if (world.isRemote) return; if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { StatTrackerArrowShot.incrementCounter(armour); @@ -295,8 +295,8 @@ public class LivingArmourHandler { int extraArrows = ((LivingArmourUpgradeArrowShot) upgrade).getExtraArrows(); for (int n = 0; n < extraArrows; n++) { ItemStack arrowStack = new ItemStack(Items.ARROW); - ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); - EntityArrow entityarrow; + 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); @@ -327,7 +327,7 @@ public class LivingArmourHandler { if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) entityarrow.setFire(100); - entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; + entityarrow.pickupStatus = AbstractArrowEntity.PickupStatus.CREATIVE_ONLY; world.spawnEntity(entityarrow); } @@ -339,12 +339,12 @@ public class LivingArmourHandler { // Applies: Softfall @SubscribeEvent public static void onPlayerFall(LivingFallEvent event) { - if (event.getEntityLiving() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + if (event.getEntityLiving() instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) event.getEntityLiving(); if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { StatTrackerFallProtect.incrementCounter(armour, event.getDamageMultiplier() * (event.getDistance() - 3)); diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java index a894a655..163e3ef9 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -10,11 +10,11 @@ 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.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemSpade; +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; @@ -35,10 +35,10 @@ public class StatTrackerHandler { // Tracks: Digging, DigSlowdown @SubscribeEvent public static void blockBreakEvent(BlockEvent.BreakEvent event) { - EntityPlayer player = event.getPlayer(); + PlayerEntity player = event.getPlayer(); if (player != null) { if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); if (chestStack.getItem() instanceof ItemLivingArmour) { LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); @@ -54,15 +54,15 @@ public class StatTrackerHandler { // Tracks: Health Boost @SubscribeEvent public static void onEntityHealed(LivingHealEvent event) { - EntityLivingBase healedEntity = event.getEntityLiving(); - if (!(healedEntity instanceof EntityPlayer)) { + LivingEntity healedEntity = event.getEntityLiving(); + if (!(healedEntity instanceof PlayerEntity)) { return; } - EntityPlayer player = (EntityPlayer) healedEntity; + PlayerEntity player = (PlayerEntity) healedEntity; if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { StatTrackerHealthboost.incrementCounter(armour, event.getAmount()); @@ -83,15 +83,15 @@ public class StatTrackerHandler { public static void entityHurt(LivingHurtEvent event) { DamageSource source = event.getSource(); Entity sourceEntity = event.getSource().getTrueSource(); - EntityLivingBase attackedEntity = event.getEntityLiving(); + LivingEntity attackedEntity = event.getEntityLiving(); - if (attackedEntity instanceof EntityPlayer) { - EntityPlayer attackedPlayer = (EntityPlayer) attackedEntity; + 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(EntityEquipmentSlot.CHEST); + ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { if (sourceEntity != null && !source.isMagicDamage() && !source.isProjectile()) @@ -104,7 +104,7 @@ public class StatTrackerHandler { StatTrackerArrowProtect.incrementCounter(armour, amount); } } else { - ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EquipmentSlotType.CHEST); if (chestStack.getItem() instanceof ItemSentientArmour) { ItemSentientArmour armour = (ItemSentientArmour) chestStack.getItem(); armour.onPlayerAttacked(chestStack, source, attackedPlayer); @@ -112,15 +112,15 @@ public class StatTrackerHandler { } } - if (sourceEntity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) sourceEntity; + if (sourceEntity instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) sourceEntity; // Living Armor Handling if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { - ItemStack mainWeapon = player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); + ItemStack mainWeapon = player.getItemStackFromSlot(EquipmentSlotType.MAINHAND); event.setAmount((float) (event.getAmount() + lastPlayerSwingStrength * armour.getAdditionalDamageOnHit(event.getAmount(), player, attackedEntity, mainWeapon))); @@ -132,13 +132,13 @@ public class StatTrackerHandler { if (player.getEntityWorld().getLight(player.getPosition()) <= 9) StatTrackerNightSight.incrementCounter(armour, amount); - if (mainWeapon.getItem() instanceof ItemSpade) + 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(MobEffects.BLINDNESS) && !player.isRiding() && !player.isSprinting(); + 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); @@ -154,10 +154,10 @@ public class StatTrackerHandler { // Tracks: Experienced @SubscribeEvent(priority = EventPriority.LOW) public static void onExperiencePickup(PlayerPickupXpEvent event) { - EntityPlayer player = event.getEntityPlayer(); + PlayerEntity player = event.getEntityPlayer(); if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); if (armour != null) { LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.experienced", chestStack); 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 4b735090..acfda0d0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -9,18 +9,18 @@ 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.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; +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.NBTTagCompound; -import net.minecraft.potion.PotionEffect; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.potion.EffectInstance; import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSourceIndirect; +import net.minecraft.util.IndirectEntityDamageSource; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.EnumDifficulty; +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; @@ -44,7 +44,7 @@ public class WillHandler { public static void onItemPickup(EntityItemPickupEvent event) { ItemStack stack = event.getItem().getItem(); if (stack.getItem() instanceof IDemonWill) { - EntityPlayer player = event.getEntityPlayer(); + PlayerEntity player = event.getEntityPlayer(); EnumDemonWillType pickupType = ((IDemonWill) stack.getItem()).getType(stack); ItemStack remainder = PlayerDemonWillHandler.addDemonWill(player, stack); @@ -57,7 +57,7 @@ public class WillHandler { @SubscribeEvent public static void onEntityAttacked(LivingDeathEvent event) { - if (event.getSource() instanceof EntityDamageSourceIndirect) { + if (event.getSource() instanceof IndirectEntityDamageSource) { Entity sourceEntity = event.getSource().getImmediateSource(); if (sourceEntity instanceof EntitySentientArrow) { @@ -69,21 +69,21 @@ public class WillHandler { // Add/Drop Demon Will for Player @SubscribeEvent public static void onLivingDrops(LivingDropsEvent event) { - EntityLivingBase attackedEntity = event.getEntityLiving(); + LivingEntity attackedEntity = event.getEntityLiving(); DamageSource source = event.getSource(); Entity entity = source.getTrueSource(); - if (attackedEntity.isPotionActive(RegistrarBloodMagic.SOUL_SNARE) && (attackedEntity instanceof EntityMob || attackedEntity.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL)) { - PotionEffect eff = attackedEntity.getActivePotionEffect(RegistrarBloodMagic.SOUL_SNARE); + 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) * 5; ItemStack soulStack = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL).createWill(0, amountOfSouls); - event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); + event.getDrops().add(new ItemEntity(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); } - if (entity != null && entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entity; + 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(); @@ -96,7 +96,7 @@ public class WillHandler { if (!remainder.isEmpty()) { EnumDemonWillType pickupType = ((IDemonWill) remainder.getItem()).getType(remainder); if (((IDemonWill) remainder.getItem()).getWill(pickupType, remainder) >= 0.0001) { - event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder)); + event.getDrops().add(new ItemEntity(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder)); } } } @@ -138,7 +138,7 @@ public class WillHandler { int dim = event.getWorld().provider.getDimension(); ChunkPos loc = event.getChunk().getPos(); - NBTTagCompound nbt = new NBTTagCompound(); + CompoundNBT nbt = new CompoundNBT(); event.getData().setTag("BloodMagic", nbt); WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.x, loc.z); @@ -154,7 +154,7 @@ public class WillHandler { public static void chunkLoad(ChunkDataEvent.Load event) { int dim = event.getWorld().provider.getDimension(); if (event.getData().getCompoundTag("BloodMagic").hasKey("base")) { - NBTTagCompound nbt = event.getData().getCompoundTag("BloodMagic"); + CompoundNBT nbt = event.getData().getCompoundTag("BloodMagic"); short base = nbt.getShort("base"); DemonWillHolder current = new DemonWillHolder(); current.readFromNBT(nbt, "current"); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java index 2606eae9..63b7dc3b 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java @@ -3,20 +3,20 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; public class BindableHelper { - public static void applyBinding(ItemStack stack, EntityPlayer player) { + 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 NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); stack.getTagCompound().setTag("binding", binding.serializeNBT()); } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java index 5059d631..9e5796f5 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.util.helper; import WayofTime.bloodmagic.util.Constants; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; public class IncenseHelper { - public static double getCurrentIncense(EntityPlayer player) { - NBTTagCompound data = player.getEntityData(); + public static double getCurrentIncense(PlayerEntity player) { + CompoundNBT data = player.getEntityData(); if (data.hasKey(Constants.NBT.CURRENT_INCENSE)) { return data.getDouble(Constants.NBT.CURRENT_INCENSE); } @@ -16,25 +16,25 @@ public class IncenseHelper { return 0; } - public static void setCurrentIncense(EntityPlayer player, double amount) { - NBTTagCompound data = player.getEntityData(); + public static void setCurrentIncense(PlayerEntity player, double amount) { + CompoundNBT data = player.getEntityData(); data.setDouble(Constants.NBT.CURRENT_INCENSE, amount); } - public static void setMaxIncense(EntityPlayer player, double amount) { - NBTTagCompound data = player.getEntityData(); + public static void setMaxIncense(PlayerEntity player, double amount) { + CompoundNBT data = player.getEntityData(); data.setDouble(Constants.NBT.MAX_INCENSE, amount); } - public static double getMaxIncense(EntityPlayer player) { - NBTTagCompound data = player.getEntityData(); + 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, EntityPlayer player, boolean isMax) { + public static void setHasMaxIncense(ItemStack stack, PlayerEntity player, boolean isMax) { stack = NBTHelper.checkNBT(stack); stack.getTagCompound().setBoolean(Constants.NBT.HAS_MAX_INCENSE, isMax); } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java index 24912b87..760bf085 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java @@ -7,7 +7,7 @@ import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.item.ItemUpgradeTome; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -91,7 +91,7 @@ public class ItemHelper { public static void setKey(ItemStack stack, String key) { if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setString("key", key); } @@ -100,7 +100,7 @@ public class ItemHelper { public static String getKey(ItemStack stack) { if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getString("key"); } @@ -111,7 +111,7 @@ public class ItemHelper { public static void setLevel(ItemStack stack, int level) { if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); tag.setInteger("level", level); } @@ -120,7 +120,7 @@ public class ItemHelper { public static int getLevel(ItemStack stack) { if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { NBTHelper.checkNBT(stack); - NBTTagCompound tag = stack.getTagCompound(); + CompoundNBT tag = stack.getTagCompound(); return tag.getInteger("level"); } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java index 59a73f3e..691fb556 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.util.helper; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; public class NBTHelper { public static ItemStack checkNBT(ItemStack stack) { if (stack.getTagCompound() == null) - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundNBT()); return stack; } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index c87b8209..b16d47b2 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -9,7 +9,7 @@ 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.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; @@ -53,7 +53,7 @@ public class NetworkHelper { * @param player - The Player * @see NetworkHelper#getSoulNetwork(String) */ - public static SoulNetwork getSoulNetwork(EntityPlayer player) { + public static SoulNetwork getSoulNetwork(PlayerEntity player) { return getSoulNetwork(PlayerHelper.getUUIDFromPlayer(player)); } @@ -98,10 +98,10 @@ public class NetworkHelper { * @param user - User of the item. * @param toSyphon - Amount of LP to syphon * @return - Whether the action should be performed. - * @deprecated Use {@link #getSoulNetwork(EntityPlayer)} and {@link SoulNetwork#syphonAndDamage$(EntityPlayer, SoulTicket)} + * @deprecated Use {@link #getSoulNetwork(PlayerEntity)} and {@link SoulNetwork#syphonAndDamage$(PlayerEntity, SoulTicket)} */ @Deprecated - public static boolean syphonAndDamage(SoulNetwork soulNetwork, EntityPlayer user, int toSyphon) { + public static boolean syphonAndDamage(SoulNetwork soulNetwork, PlayerEntity user, int toSyphon) { // if (soulNetwork.getNewOwner() == null) // { diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java index 601a9240..505ffbee 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.util.helper; import com.google.common.collect.Lists; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraftforge.common.UsernameCache; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -18,18 +18,18 @@ public class PlayerHelper { */ private static final ArrayList knownFakePlayers = Lists.newArrayList(); - public static EntityPlayer getPlayerFromId(UUID uuid) { + public static PlayerEntity getPlayerFromId(UUID uuid) { if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) return null; return FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayerByUUID(uuid); } - public static EntityPlayer getPlayerFromUUID(UUID uuid) { + public static PlayerEntity getPlayerFromUUID(UUID uuid) { return getPlayerFromId(uuid); } - public static UUID getUUIDFromPlayer(EntityPlayer player) { + public static UUID getUUIDFromPlayer(PlayerEntity player) { return player.getGameProfile().getId(); } @@ -43,7 +43,7 @@ public class PlayerHelper { * @param player - The player in question * @return If the player is fake or not */ - public static boolean isFakePlayer(EntityPlayer player) { + public static boolean isFakePlayer(PlayerEntity player) { return player instanceof FakePlayer || (player != null && knownFakePlayers.contains(player.getClass().getCanonicalName())); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java index 54ceea6a..da4312d2 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java @@ -4,10 +4,10 @@ import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.altar.IBloodAltar; import WayofTime.bloodmagic.core.RegistrarBloodMagic; import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.potion.Effect; +import net.minecraft.potion.EffectInstance; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -16,17 +16,17 @@ import net.minecraftforge.common.MinecraftForge; public class PlayerSacrificeHelper { public static float scalingOfSacrifice = 1f; public static int soulFrayDuration = 400; - public static Potion soulFrayId; + public static Effect soulFrayId; - public static double getPlayerIncense(EntityPlayer player) { + public static double getPlayerIncense(PlayerEntity player) { return IncenseHelper.getCurrentIncense(player); } - public static void setPlayerIncense(EntityPlayer player, double amount) { + public static void setPlayerIncense(PlayerEntity player, double amount) { IncenseHelper.setCurrentIncense(player, amount); } - public static boolean incrementIncense(EntityPlayer player, double min, double incenseAddition, double increment) { + public static boolean incrementIncense(PlayerEntity player, double min, double incenseAddition, double increment) { double amount = getPlayerIncense(player); if (amount < min || amount >= incenseAddition) { return false; @@ -51,7 +51,7 @@ public class PlayerSacrificeHelper { * @param player - The player sacrificing * @return Whether or not the health sacrificing succeeded */ - public static boolean sacrificePlayerHealth(EntityPlayer player) { + public static boolean sacrificePlayerHealth(PlayerEntity player) { if (player.isPotionActive(soulFrayId)) { return false; } @@ -77,7 +77,7 @@ public class PlayerSacrificeHelper { player.setHealth(maxHealth / 10.0f); setPlayerIncense(player, 0); - player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, soulFrayDuration)); + player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_FRAY, soulFrayDuration)); return true; } @@ -96,12 +96,12 @@ public class PlayerSacrificeHelper { * * @param world - The world * @param sacrificingEntity - The entity having the sacrifice done on (can be - * {@link EntityPlayer} for self-sacrifice) + * {@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, EntityLivingBase sacrificingEntity, int amount, boolean isSacrifice) { + public static boolean findAndFillAltar(World world, LivingEntity sacrificingEntity, int amount, boolean isSacrifice) { IBloodAltar altarEntity = getAltar(world, sacrificingEntity.getPosition()); if (altarEntity == null) diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java index 49057296..40695916 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java @@ -1,12 +1,12 @@ package WayofTime.bloodmagic.util.helper; import WayofTime.bloodmagic.util.Constants; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.nbt.CompoundNBT; public class PurificationHelper { - public static double getCurrentPurity(EntityAnimal animal) { - NBTTagCompound data = animal.getEntityData(); + public static double getCurrentPurity(AnimalEntity animal) { + CompoundNBT data = animal.getEntityData(); if (data.hasKey(Constants.NBT.CURRENT_PURITY)) { return data.getDouble(Constants.NBT.CURRENT_PURITY); } @@ -14,12 +14,12 @@ public class PurificationHelper { return 0; } - public static void setCurrentPurity(EntityAnimal animal, double amount) { - NBTTagCompound data = animal.getEntityData(); + public static void setCurrentPurity(AnimalEntity animal, double amount) { + CompoundNBT data = animal.getEntityData(); data.setDouble(Constants.NBT.CURRENT_PURITY, amount); } - public static double addPurity(EntityAnimal animal, double added, double max) { + public static double addPurity(AnimalEntity animal, double added, double max) { double currentPurity = getCurrentPurity(animal); double newAmount = Math.min(max, currentPurity + added); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java index b9da4f00..ef5e7bfe 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java @@ -9,9 +9,9 @@ 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.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; @@ -38,7 +38,7 @@ public class RitualHelper { */ public static String getValidRitual(World world, BlockPos pos) { for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { - for (EnumFacing direction : EnumFacing.HORIZONTALS) { + for (Direction direction : Direction.HORIZONTALS) { if (checkValidRitual(world, pos, ritual, direction)) return BloodMagic.RITUAL_MANAGER.getId(ritual); } @@ -47,8 +47,8 @@ public class RitualHelper { return ""; } - public static EnumFacing getDirectionOfRitual(World world, BlockPos pos, Ritual ritual) { - for (EnumFacing direction : EnumFacing.HORIZONTALS) { + public static Direction getDirectionOfRitual(World world, BlockPos pos, Ritual ritual) { + for (Direction direction : Direction.HORIZONTALS) { if (checkValidRitual(world, pos, ritual, direction)) return direction; } @@ -56,7 +56,7 @@ public class RitualHelper { return null; } - public static boolean checkValidRitual(World world, BlockPos pos, Ritual ritual, EnumFacing direction) { + public static boolean checkValidRitual(World world, BlockPos pos, Ritual ritual, Direction direction) { if (ritual == null) { return false; } @@ -106,7 +106,7 @@ public class RitualHelper { public static void setRuneType(World world, BlockPos pos, EnumRuneType type) { if (world == null) return; - IBlockState state = world.getBlockState(pos); + BlockState state = world.getBlockState(pos); TileEntity tile = world.getTileEntity(pos); if (state.getBlock() instanceof IRitualStone) @@ -119,21 +119,21 @@ public class RitualHelper { } } - public static boolean createRitual(World world, BlockPos pos, EnumFacing direction, Ritual ritual, boolean safe) { + 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; - IBlockState mrs = RegistrarBloodMagicBlocks.RITUAL_CONTROLLER.getDefaultState(); + 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, EnumFacing direction, boolean safe, List components) { + 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); @@ -146,8 +146,8 @@ public class RitualHelper { public static boolean repairRitualFromRuins(TileMasterRitualStone tile, boolean safe) { Ritual ritual = tile.getCurrentRitual(); - EnumFacing direction; - Pair pair; + Direction direction; + Pair pair; if (ritual == null) { pair = getRitualFromRuins(tile); ritual = pair.getKey(); @@ -167,27 +167,27 @@ public class RitualHelper { return true; } - public static void setRitualStones(EnumFacing direction, World world, BlockPos pos, List gatheredComponents) { + 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(); - IBlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); + BlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); world.setBlockState(newPos, newState); } } - public static Pair getRitualFromRuins(TileMasterRitualStone tile) { + public static Pair getRitualFromRuins(TileMasterRitualStone tile) { BlockPos pos = tile.getPos(); World world = tile.getWorld(); Ritual possibleRitual = tile.getCurrentRitual(); - EnumFacing possibleDirection = tile.getDirection(); + Direction possibleDirection = tile.getDirection(); int highestCount = 0; if (possibleRitual == null || possibleDirection == null) for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { - for (EnumFacing direction : EnumFacing.HORIZONTALS) { + for (Direction direction : Direction.HORIZONTALS) { List components = Lists.newArrayList(); ritual.gatherComponents(components::add); int currentCount = 0; From c8996c8fba736d0cc7620a24640da1f2f752a32b Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 23 Sep 2019 09:51:22 -0700 Subject: [PATCH 442/595] Sweeping changes, mainly NBT related --- .../AlchemyArrayEffectLaputa.java | 16 ++-- .../alchemyArray/AlchemyCircleRenderer.java | 2 +- .../bloodmagic/altar/BloodAltar.java | 96 +++++++++---------- .../bloodmagic/block/BlockBloodLight.java | 2 +- .../bloodmagic/block/BlockBloodTank.java | 4 +- .../WayofTime/bloodmagic/client/Sprite.java | 2 +- .../client/gui/GuiBloodMagicConfig.java | 2 +- .../client/gui/GuiItemRoutingNode.java | 2 +- .../client/hud/ElementRegistry.java | 4 +- .../bloodmagic/client/hud/GuiEditHUD.java | 10 +- .../client/hud/element/ElementDemonAura.java | 4 +- .../element/ElementDivinedInformation.java | 2 +- .../client/hud/element/ElementHolding.java | 6 +- .../client/hud/element/ElementItemStack.java | 2 +- .../client/hud/element/ElementString.java | 6 +- .../hud/element/ElementTileInformation.java | 8 +- .../bloodmagic/client/key/KeyBindings.java | 4 +- .../AttractorAlchemyCircleRenderer.java | 2 +- .../BindingAlchemyCircleRenderer.java | 4 +- .../DualAlchemyCircleRenderer.java | 4 +- .../MobSacrificeAlchemyCircleRenderer.java | 8 +- .../SingleAlchemyCircleRenderer.java | 2 +- .../StaticAlchemyCircleRenderer.java | 2 +- .../TurretAlchemyCircleRenderer.java | 8 +- .../client/render/block/RenderAltar.java | 8 +- .../client/render/block/RenderBloodTank.java | 4 +- .../render/block/RenderDemonCrucible.java | 2 +- .../client/render/block/RenderFakeBlocks.java | 2 +- .../render/block/RenderItemRoutingNode.java | 2 +- .../render/entity/RenderEntityBloodLight.java | 2 +- .../render/entity/RenderEntityMimic.java | 6 +- .../render/entity/RenderEntitySoulSnare.java | 2 +- .../entity/layer/LayerAlchemyCircle.java | 2 +- .../compat/guideapi/entry/EntryText.java | 2 +- .../guideapi/page/PageAlchemyArray.java | 4 +- .../compat/guideapi/page/PageAltarRecipe.java | 2 +- .../page/PageTartaricForgeRecipe.java | 2 +- .../compat/waila/BloodMagicHwylaPlugin.java | 14 ++- .../provider/DataProviderAlchemyArray.java | 4 +- .../provider/DataProviderBloodAltar.java | 64 ++++++------- .../waila/provider/DataProviderBloodTank.java | 6 +- .../waila/provider/DataProviderMimic.java | 2 +- .../DataProviderRitualController.java | 16 ++-- .../waila/provider/DataProviderTeleposer.java | 2 +- .../core/data/BMWorldSavedData.java | 14 +-- .../bloodmagic/core/data/Binding.java | 14 +-- .../bloodmagic/core/data/SoulNetwork.java | 14 +-- .../bloodmagic/core/data/SoulTicket.java | 12 +-- .../bloodmagic/core/registry/OrbRegistry.java | 2 +- .../entity/mob/EntityAspectedDemonBase.java | 2 +- .../entity/mob/EntityCorruptedChicken.java | 4 +- .../entity/mob/EntityCorruptedSheep.java | 8 +- .../entity/mob/EntityDemonBase.java | 4 +- .../bloodmagic/entity/mob/EntityMimic.java | 16 ++-- .../entity/mob/EntitySentientSpecter.java | 4 +- .../entity/projectile/EntityBloodLight.java | 8 +- .../entity/projectile/EntityMeteor.java | 16 ++-- .../projectile/EntitySentientArrow.java | 8 +- .../bloodmagic/event/SoulNetworkEvent.java | 4 +- .../bloodmagic/item/ItemBloodOrb.java | 2 +- .../bloodmagic/item/ItemExperienceBook.java | 2 +- .../bloodmagic/item/ItemInscriptionTool.java | 2 +- .../bloodmagic/item/ItemLavaCrystal.java | 6 +- .../bloodmagic/item/ItemRitualDiviner.java | 8 +- .../bloodmagic/item/ItemRitualReader.java | 18 ++-- .../item/ItemTelepositionFocus.java | 10 +- .../item/alchemy/ItemCuttingFluid.java | 4 +- .../item/armour/ItemLivingArmour.java | 8 +- .../item/armour/ItemSentientArmour.java | 20 ++-- .../bloodmagic/item/block/ItemBlockMimic.java | 6 +- .../item/inventory/InventoryHolding.java | 4 +- .../item/inventory/ItemInventory.java | 8 +- .../item/routing/ItemNodeRouter.java | 6 +- .../item/sigil/ItemSigilHolding.java | 8 +- .../item/sigil/ItemSigilTeleposition.java | 8 +- .../item/sigil/ItemSigilTransposition.java | 10 +- .../bloodmagic/item/soul/ItemMonsterSoul.java | 2 +- .../item/soul/ItemSentientArmourGem.java | 2 +- .../bloodmagic/item/soul/ItemSentientAxe.java | 18 ++-- .../bloodmagic/item/soul/ItemSentientBow.java | 12 +-- .../item/soul/ItemSentientPickaxe.java | 18 ++-- .../item/soul/ItemSentientShovel.java | 18 ++-- .../item/soul/ItemSentientSword.java | 16 ++-- .../bloodmagic/item/soul/ItemSoulGem.java | 4 +- .../soulBreath/ItemSoulBreathContainer.java | 2 +- .../bloodmagic/livingArmour/LivingArmour.java | 24 ++--- .../LivingArmourUpgradeBattleHungry.java | 4 +- .../tracker/StatTrackerArrowProtect.java | 4 +- .../tracker/StatTrackerArrowShot.java | 4 +- .../tracker/StatTrackerCriticalStrike.java | 2 +- .../tracker/StatTrackerDigging.java | 4 +- .../tracker/StatTrackerExperience.java | 2 +- .../tracker/StatTrackerFallProtect.java | 4 +- .../tracker/StatTrackerFireResist.java | 4 +- .../livingArmour/tracker/StatTrackerFood.java | 4 +- .../tracker/StatTrackerGraveDigger.java | 2 +- .../tracker/StatTrackerGrimReaperSprint.java | 4 +- .../tracker/StatTrackerHealthboost.java | 2 +- .../livingArmour/tracker/StatTrackerJump.java | 4 +- .../tracker/StatTrackerMeleeDamage.java | 2 +- .../tracker/StatTrackerMovement.java | 2 +- .../tracker/StatTrackerNightSight.java | 6 +- .../tracker/StatTrackerPhysicalProtect.java | 4 +- .../tracker/StatTrackerPoison.java | 4 +- .../tracker/StatTrackerRepairing.java | 2 +- .../tracker/StatTrackerSelfSacrifice.java | 4 +- .../tracker/StatTrackerSolarPowered.java | 2 +- .../tracker/StatTrackerSprintAttack.java | 2 +- .../tracker/StatTrackerStepAssist.java | 2 +- .../LivingArmourUpgradeFireResist.java | 4 +- .../LivingArmourUpgradeGrimReaperSprint.java | 4 +- .../LivingArmourUpgradePoisonResist.java | 4 +- .../upgrade/LivingArmourUpgradeRepairing.java | 4 +- .../LivingArmourUpgradeSolarPowered.java | 4 +- .../PlayerVelocityPacketProcessor.java | 2 +- .../bloodmagic/potion/BMPotionUtils.java | 4 +- .../bloodmagic/potion/PotionBloodMagic.java | 2 +- .../bloodmagic/proxy/ClientProxy.java | 8 +- .../bloodmagic/ritual/AreaDescriptor.java | 16 ++-- .../bloodmagic/ritual/CapabilityRuneType.java | 6 +- .../bloodmagic/ritual/EnumRuneType.java | 2 +- .../WayofTime/bloodmagic/ritual/Ritual.java | 16 ++-- .../bloodmagic/ritual/RitualRenderer.java | 2 +- .../ritual/types/RitualForsakenSoul.java | 8 +- .../types/RitualLivingArmourDowngrade.java | 4 +- .../bloodmagic/ritual/types/RitualPortal.java | 6 +- .../bloodmagic/soul/DemonWillHolder.java | 6 +- .../bloodmagic/soul/EnumDemonWillType.java | 2 +- .../bloodmagic/teleport/PortalLocation.java | 14 +-- .../bloodmagic/tile/TileAlchemyArray.java | 16 ++-- .../bloodmagic/tile/TileAlchemyTable.java | 24 ++--- .../WayofTime/bloodmagic/tile/TileAltar.java | 2 +- .../bloodmagic/tile/TileBloodTank.java | 6 +- .../bloodmagic/tile/TileDemonCrucible.java | 2 +- .../bloodmagic/tile/TileDemonCrystal.java | 10 +- .../tile/TileDemonCrystallizer.java | 2 +- .../tile/TileDimensionalPortal.java | 14 +-- .../bloodmagic/tile/TileIncenseAltar.java | 4 +- .../bloodmagic/tile/TileInventory.java | 4 +- .../bloodmagic/tile/TileInversionPillar.java | 14 +-- .../tile/TileMasterRitualStone.java | 22 ++--- .../WayofTime/bloodmagic/tile/TileMimic.java | 32 +++---- .../bloodmagic/tile/TilePhantomBlock.java | 4 +- .../tile/TilePurificationAltar.java | 6 +- .../bloodmagic/tile/TileSoulForge.java | 4 +- .../bloodmagic/tile/TileSpectralBlock.java | 10 +- .../bloodmagic/tile/TileTeleposer.java | 4 +- .../bloodmagic/tile/base/TileBase.java | 29 +++--- .../bloodmagic/tile/base/TileTicking.java | 12 +-- .../tile/routing/TileFilteredRoutingNode.java | 12 +-- .../tile/routing/TileMasterRoutingNode.java | 42 ++++---- .../tile/routing/TileRoutingNode.java | 30 +++--- .../WayofTime/bloodmagic/util/ChatUtil.java | 4 +- .../bloodmagic/util/GhostItemHelper.java | 4 +- .../util/handler/event/ClientHandler.java | 6 +- .../util/handler/event/WillHandler.java | 2 +- .../bloodmagic/util/helper/ItemHelper.java | 6 +- 157 files changed, 622 insertions(+), 623 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java index ad2de048..73030287 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java @@ -113,18 +113,18 @@ public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect { @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger("radius", radius); - tag.setInteger("teleportHeightOffset", teleportHeightOffset); - tag.setInteger(Constants.NBT.X_COORD, currentPos.getX()); - tag.setInteger(Constants.NBT.Y_COORD, currentPos.getY()); - tag.setInteger(Constants.NBT.Z_COORD, currentPos.getZ()); + 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.getInteger("radius"); - teleportHeightOffset = tag.getInteger("teleportHeightOffset"); - currentPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD)); + 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 diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java index 0f24ac37..1c80f949 100644 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java @@ -77,7 +77,7 @@ public class AlchemyCircleRenderer { float size = 1.0F * getSizeModifier(craftTime); // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.disableCull(); GlStateManager.enableBlend(); diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 7d13dc2e..036aea15 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -82,21 +82,21 @@ public class BloodAltar implements IFluidHandler { if (fluid != null) setMainFluid(fluid); - FluidStack fluidOut = new FluidStack(BlockLifeEssence.getLifeEssence(), tagCompound.getInteger(Constants.NBT.OUTPUT_AMOUNT)); + FluidStack fluidOut = new FluidStack(BlockLifeEssence.getLifeEssence(), tagCompound.getInt(Constants.NBT.OUTPUT_AMOUNT)); setOutputFluid(fluidOut); - FluidStack fluidIn = new FluidStack(BlockLifeEssence.getLifeEssence(), tagCompound.getInteger(Constants.NBT.INPUT_AMOUNT)); + FluidStack fluidIn = new FluidStack(BlockLifeEssence.getLifeEssence(), tagCompound.getInt(Constants.NBT.INPUT_AMOUNT)); setInputFluid(fluidIn); } - internalCounter = tagCompound.getInteger("internalCounter"); + 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.getInteger(Constants.NBT.ALTAR_LIQUID_REQ); + liquidRequired = tagCompound.getInt(Constants.NBT.ALTAR_LIQUID_REQ); canBeFilled = tagCompound.getBoolean(Constants.NBT.ALTAR_FILLABLE); isUpgraded = tagCompound.getBoolean(Constants.NBT.ALTAR_UPGRADED); - consumptionRate = tagCompound.getInteger(Constants.NBT.ALTAR_CONSUMPTION_RATE); - drainRate = tagCompound.getInteger(Constants.NBT.ALTAR_DRAIN_RATE); + 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); @@ -104,18 +104,18 @@ public class BloodAltar implements IFluidHandler { 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.getInteger(Constants.NBT.ALTAR_CAPACITY); - bufferCapacity = tagCompound.getInteger(Constants.NBT.ALTAR_BUFFER_CAPACITY); - progress = tagCompound.getInteger(Constants.NBT.ALTAR_PROGRESS); + 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.getInteger(Constants.NBT.ALTAR_LOCKDOWN_DURATION); - accelerationUpgrades = tagCompound.getInteger(Constants.NBT.ALTAR_ACCELERATION_UPGRADES); - demonBloodDuration = tagCompound.getInteger(Constants.NBT.ALTAR_DEMON_BLOOD_DURATION); - cooldownAfterCrafting = tagCompound.getInteger(Constants.NBT.ALTAR_COOLDOWN_AFTER_CRAFTING); - chargingRate = tagCompound.getInteger(Constants.NBT.ALTAR_CHARGE_RATE); - chargingFrequency = tagCompound.getInteger(Constants.NBT.ALTAR_CHARGE_FREQUENCY); - totalCharge = tagCompound.getInteger(Constants.NBT.ALTAR_TOTAL_CHARGE); - maxCharge = tagCompound.getInteger(Constants.NBT.ALTAR_MAX_CHARGE); + 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); } @@ -124,42 +124,42 @@ public class BloodAltar implements IFluidHandler { if (fluid != null) fluid.writeToNBT(tagCompound); else - tagCompound.setString(Constants.NBT.EMPTY, ""); + tagCompound.putString(Constants.NBT.EMPTY, ""); if (fluidOutput != null) - tagCompound.setInteger(Constants.NBT.OUTPUT_AMOUNT, fluidOutput.amount); + tagCompound.putInt(Constants.NBT.OUTPUT_AMOUNT, fluidOutput.amount); if (fluidInput != null) - tagCompound.setInteger(Constants.NBT.INPUT_AMOUNT, fluidInput.amount); + tagCompound.putInt(Constants.NBT.INPUT_AMOUNT, fluidInput.amount); - tagCompound.setInteger("internalCounter", internalCounter); - tagCompound.setString(Constants.NBT.ALTAR_TIER, altarTier.name()); - tagCompound.setBoolean(Constants.NBT.ALTAR_ACTIVE, isActive); - tagCompound.setInteger(Constants.NBT.ALTAR_LIQUID_REQ, liquidRequired); - tagCompound.setBoolean(Constants.NBT.ALTAR_FILLABLE, canBeFilled); - tagCompound.setBoolean(Constants.NBT.ALTAR_UPGRADED, isUpgraded); - tagCompound.setInteger(Constants.NBT.ALTAR_CONSUMPTION_RATE, consumptionRate); - tagCompound.setInteger(Constants.NBT.ALTAR_DRAIN_RATE, drainRate); - tagCompound.setFloat(Constants.NBT.ALTAR_CONSUMPTION_MULTIPLIER, consumptionMultiplier); - tagCompound.setFloat(Constants.NBT.ALTAR_EFFICIENCY_MULTIPLIER, efficiencyMultiplier); - tagCompound.setFloat(Constants.NBT.ALTAR_SACRIFICE_MULTIPLIER, sacrificeEfficiencyMultiplier); - tagCompound.setFloat(Constants.NBT.ALTAR_SELF_SACRIFICE_MULTIPLIER, selfSacrificeEfficiencyMultiplier); - tagCompound.setBoolean(Constants.NBT.ALTAR_IS_RESULT_BLOCK, isResultBlock); - tagCompound.setFloat(Constants.NBT.ALTAR_CAPACITY_MULTIPLIER, capacityMultiplier); - tagCompound.setFloat(Constants.NBT.ALTAR_ORB_CAPACITY_MULTIPLIER, orbCapacityMultiplier); - tagCompound.setFloat(Constants.NBT.ALTAR_DISLOCATION_MULTIPLIER, dislocationMultiplier); - tagCompound.setInteger(Constants.NBT.ALTAR_CAPACITY, capacity); - tagCompound.setInteger(Constants.NBT.ALTAR_PROGRESS, progress); - tagCompound.setInteger(Constants.NBT.ALTAR_BUFFER_CAPACITY, bufferCapacity); - tagCompound.setInteger(Constants.NBT.ALTAR_LOCKDOWN_DURATION, lockdownDuration); - tagCompound.setInteger(Constants.NBT.ALTAR_ACCELERATION_UPGRADES, accelerationUpgrades); - tagCompound.setInteger(Constants.NBT.ALTAR_DEMON_BLOOD_DURATION, demonBloodDuration); - tagCompound.setInteger(Constants.NBT.ALTAR_COOLDOWN_AFTER_CRAFTING, cooldownAfterCrafting); - tagCompound.setInteger(Constants.NBT.ALTAR_CHARGE_RATE, chargingRate); - tagCompound.setInteger(Constants.NBT.ALTAR_CHARGE_FREQUENCY, chargingFrequency); - tagCompound.setInteger(Constants.NBT.ALTAR_TOTAL_CHARGE, totalCharge); - tagCompound.setInteger(Constants.NBT.ALTAR_MAX_CHARGE, maxCharge); - tagCompound.setString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED, currentTierDisplayed.name()); + 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() { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java index cfa597dc..ebc22ba0 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java @@ -91,7 +91,7 @@ public class BlockBloodLight extends Block { @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random rand) { - ClientPlayerEntity player = Minecraft.getMinecraft().player; + 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); diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index a3bdfd77..b289bfd8 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -116,7 +116,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB if (bloodTank.getTank().getFluid() != null) { bloodTank.getTank().getFluid().writeToNBT(fluidTag); CompoundNBT dropTag = new CompoundNBT(); - dropTag.setTag("Fluid", fluidTag); + dropTag.put("Fluid", fluidTag); drop.setTagCompound(dropTag); } @@ -131,7 +131,7 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB TileBloodTank bloodTank = (TileBloodTank) tile; CompoundNBT tag = stack.getTagCompound(); if (stack.hasTagCompound() && stack.getTagCompound().hasKey("Fluid")) { - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag("Fluid")); + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompound("Fluid")); bloodTank.getTank().setFluid(fluidStack); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/Sprite.java b/src/main/java/WayofTime/bloodmagic/client/Sprite.java index cb92dcd1..f6e54ea6 100644 --- a/src/main/java/WayofTime/bloodmagic/client/Sprite.java +++ b/src/main/java/WayofTime/bloodmagic/client/Sprite.java @@ -43,7 +43,7 @@ public class Sprite { } public void draw(int x, int y) { - Minecraft.getMinecraft().renderEngine.bindTexture(textureLocation); + Minecraft.getInstance().renderEngine.bindTexture(textureLocation); float f = 0.00390625F; float f1 = 0.00390625F; Tessellator tessellator = Tessellator.getInstance(); diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java index b4f55629..a14c5710 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java @@ -27,7 +27,7 @@ public class GuiBloodMagicConfig extends GuiConfig { elements.addAll(ConfigElement.from(ConfigHandler.class).getChildElements()); elements.add(new ConfigElement(BloodMagic.RITUAL_MANAGER.getConfig().getCategory("rituals"))); - if (Minecraft.getMinecraft().world != null) + if (Minecraft.getInstance().world != null) elements.add(new DummyElementEditHUD(BloodMagic.NAME, "config." + BloodMagic.MODID + ".edit_hud")); return elements; diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java index 72ffef7b..edf65f6a 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -129,7 +129,7 @@ public class GuiItemRoutingNode extends ContainerScreen { super.drawScreen(mouseX, mouseY, partialTicks); this.renderHoveredToolTip(mouseX, mouseY); - Minecraft.getMinecraft().fontRenderer.drawString(inventory.getName(), xSize, ySize / 4, 4210752); + Minecraft.getInstance().fontRenderer.drawString(inventory.getName(), xSize, ySize / 4, 4210752); } /** diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java b/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java index 9c62ee31..642ea5e4 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java @@ -114,10 +114,10 @@ public class ElementRegistry { @SubscribeEvent public static void onRenderOverlay(RenderGameOverlayEvent.Pre event) { if (event.getType() == RenderGameOverlayEvent.ElementType.HOTBAR) { - ScaledResolution resolution = new ScaledResolution(Minecraft.getMinecraft()); + ScaledResolution resolution = new ScaledResolution(Minecraft.getInstance()); for (HUDElement element : HUD_ELEMENTS.values()) { - if (!element.shouldRender(Minecraft.getMinecraft())) + if (!element.shouldRender(Minecraft.getInstance())) continue; Vector2f position = ELEMENT_INFO.get(getKey(element)).getPosition(); diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java index c14d65c4..af605d69 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java @@ -47,7 +47,7 @@ public class GuiEditHUD extends Screen { drawDefaultBackground(); super.drawScreen(mouseX, mouseY, partialTicks); - ScaledResolution resolution = new ScaledResolution(Minecraft.getMinecraft()); + ScaledResolution resolution = new ScaledResolution(Minecraft.getInstance()); for (HUDElement element : ElementRegistry.getElements()) { if (dragged == element) continue; @@ -87,7 +87,7 @@ public class GuiEditHUD extends Screen { @Override protected void mouseReleased(int mouseX, int mouseY, int state) { if (dragged != null) { - ScaledResolution resolution = new ScaledResolution(Minecraft.getMinecraft()); + 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()); @@ -105,7 +105,7 @@ public class GuiEditHUD extends Screen { protected void actionPerformed(Button button) { switch (button.id) { case 0: { - Minecraft.getMinecraft().displayGuiScreen(parent); + Minecraft.getInstance().displayGuiScreen(parent); break; } case 1: { @@ -116,12 +116,12 @@ public class GuiEditHUD extends Screen { } case 2: { ElementRegistry.save(currentOverrides); - Minecraft.getMinecraft().displayGuiScreen(parent); + Minecraft.getInstance().displayGuiScreen(parent); break; } case 3: { currentOverrides.clear(); - Minecraft.getMinecraft().displayGuiScreen(parent); + Minecraft.getInstance().displayGuiScreen(parent); break; } } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java index a039b541..4a75a97e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java @@ -31,7 +31,7 @@ public class ElementDemonAura extends HUDElement { @Override public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { - Minecraft minecraft = Minecraft.getMinecraft(); + Minecraft minecraft = Minecraft.getInstance(); PlayerEntity player = minecraft.player; minecraft.getTextureManager().bindTexture(BAR_LOCATION); @@ -73,6 +73,6 @@ public class ElementDemonAura extends HUDElement { @Override public boolean shouldRender(Minecraft minecraft) { - return Utils.canPlayerSeeDemonWill(Minecraft.getMinecraft().player); + 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 index 4854f312..d461e8f9 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java @@ -21,7 +21,7 @@ public abstract class ElementDivinedInformation extends El @Override public boolean shouldRender(Minecraft minecraft) { - PlayerEntity player = Minecraft.getMinecraft().player; + PlayerEntity player = Minecraft.getInstance().player; ItemStack sigilStack = player.getHeldItem(Hand.MAIN_HAND); boolean flag = false; if (simple) { diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java index c83e9966..bd8fefe2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java @@ -28,7 +28,7 @@ public class ElementHolding extends HUDElement { GlStateManager.color(1.0F, 1.0F, 1.0F); HOLDING_BAR.draw(drawX, drawY); - Minecraft minecraft = Minecraft.getMinecraft(); + Minecraft minecraft = Minecraft.getInstance(); ItemStack sigilHolding = minecraft.player.getHeldItemMainhand(); // Check mainhand for Sigil of Holding if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) @@ -74,12 +74,12 @@ public class ElementHolding extends HUDElement { GlStateManager.translate((float) (-(x + 8)), (float) (-(y + 12)), 0.0F); } - Minecraft.getMinecraft().getRenderItem().renderItemAndEffectIntoGUI(player, stack, x, y); + Minecraft.getInstance().getRenderItem().renderItemAndEffectIntoGUI(player, stack, x, y); if (animation > 0.0F) GlStateManager.popMatrix(); - Minecraft.getMinecraft().getRenderItem().renderItemOverlays(Minecraft.getMinecraft().fontRenderer, stack, x, y); + 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 index 5f783e55..d7dee606 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java @@ -17,7 +17,7 @@ public class ElementItemStack extends HUDElement { @Override public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { RenderHelper.enableGUIStandardItemLighting(); - Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(stack, drawX, drawY); + Minecraft.getInstance().getRenderItem().renderItemIntoGUI(stack, drawX, drawY); RenderHelper.disableStandardItemLighting(); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java index 419ebe25..88016c2d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java @@ -10,14 +10,14 @@ public class ElementString extends HUDElement { private ITextComponent[] display; public ElementString(ITextComponent... display) { - super(getMaxStringWidth(display), (Minecraft.getMinecraft().fontRenderer.FONT_HEIGHT + 2) * display.length - 2); + 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.getMinecraft().fontRenderer; + FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; for (ITextComponent drawText : display) { fontRenderer.drawStringWithShadow(drawText.getFormattedText(), drawX, drawY, 14737632); drawY += fontRenderer.FONT_HEIGHT + 2; @@ -25,7 +25,7 @@ public class ElementString extends HUDElement { } private static int getMaxStringWidth(ITextComponent... display) { - FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; int maxWidth = 0; for (ITextComponent drawText : display) if (fontRenderer.getStringWidth(drawText.getFormattedText()) > 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 index f8092cf6..9b6f88fe 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementTileInformation.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementTileInformation.java @@ -31,24 +31,24 @@ public abstract class ElementTileInformation extends HUDEl @SuppressWarnings("unchecked") @Override public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { - T tile = (T) Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); + 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.getMinecraft().fontRenderer.drawStringWithShadow((tile != null && tile.getClass() == tileClass) ? sprite.getRight().apply(tile) : "?", drawX + sprite.getLeft().getTextureWidth() + 2, textY, Color.WHITE.getRGB()); + 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.getMinecraft().objectMouseOver; + RayTraceResult trace = Minecraft.getInstance().objectMouseOver; if (trace == null || trace.typeOfHit != RayTraceResult.Type.BLOCK) return false; - TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(trace.getBlockPos()); + TileEntity tile = Minecraft.getInstance().world.getTileEntity(trace.getBlockPos()); if (tile == null || !tileClass.isAssignableFrom(tile.getClass())) return false; diff --git a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java index 8d7b86d4..583f54da 100644 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java +++ b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java @@ -33,7 +33,7 @@ public enum KeyBindings { @SideOnly(Side.CLIENT) @Override public void handleKeybind() { - ClientPlayerEntity player = Minecraft.getMinecraft().player; + ClientPlayerEntity player = Minecraft.getInstance().player; if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, -1); } @@ -42,7 +42,7 @@ public enum KeyBindings { @SideOnly(Side.CLIENT) @Override public void handleKeybind() { - ClientPlayerEntity player = Minecraft.getMinecraft().player; + ClientPlayerEntity player = Minecraft.getInstance().player; if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, 1); } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java index 057ee09d..3131c610 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -69,7 +69,7 @@ public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer { float size = 1.0F * getSizeModifier(craftTime); // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.disableCull(); GlStateManager.enableBlend(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index 6fc89ccb..8f487060 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -99,7 +99,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer { float size = 3.0F; // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.disableCull(); GlStateManager.enableBlend(); @@ -159,7 +159,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer { for (int i = 0; i < 5; i++) { GlStateManager.pushMatrix(); - Minecraft.getMinecraft().renderEngine.bindTexture(arraysResources[i]); + Minecraft.getInstance().renderEngine.bindTexture(arraysResources[i]); float newSize = 1; float distance = BindingAlchemyCircleRenderer.getDistanceOfCircle(i, craftTime); float angle = BindingAlchemyCircleRenderer.getAngleOfCircle(i, craftTime); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java index ec483fc2..44661394 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java @@ -99,7 +99,7 @@ public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.pushMatrix(); GlStateManager.rotate(rot, 0, 0, 1); double var31 = 0.0D; @@ -119,7 +119,7 @@ public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.popMatrix(); // Bind the second texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(secondaryArrayResource); + Minecraft.getInstance().renderEngine.bindTexture(secondaryArrayResource); GlStateManager.pushMatrix(); GlStateManager.rotate(-rot, 0, 0, 1); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java index 8c84e8f1..62c3a02e 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java @@ -69,7 +69,7 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer { float size = 1.0F * getSizeModifier(craftTime); // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.disableCull(); GlStateManager.enableBlend(); @@ -126,14 +126,14 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer { for (int i = 1; i <= 3; i++) { GlStateManager.pushMatrix(); - Minecraft.getMinecraft().renderEngine.bindTexture(bottomArrayResource); + Minecraft.getInstance().renderEngine.bindTexture(bottomArrayResource); translateAndRotateFloatingArray(tessellator, wr, size, rot, craftTime, i); GlStateManager.popMatrix(); } //Render the main array. GlStateManager.pushMatrix(); - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); // GlStateManager.rotate(rot, 0, 0, 1); renderStandardCircle(tessellator, wr, 3); GlStateManager.popMatrix(); @@ -146,7 +146,7 @@ public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer { swirlSize = 3 * (craftTime - 40) / 60; } GlStateManager.pushMatrix(); - Minecraft.getMinecraft().renderEngine.bindTexture(mobSacrificeSwirlResource); + Minecraft.getInstance().renderEngine.bindTexture(mobSacrificeSwirlResource); GlStateManager.translate(0, 0, 0.1); GlStateManager.rotate(rot / 3, 0, 0, 1); renderStandardCircle(tessellator, wr, swirlSize); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java index 26472bb5..1e292998 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java @@ -97,7 +97,7 @@ public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.pushMatrix(); GlStateManager.rotate(rot, 0, 0, 1); double var31 = 0.0D; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java index 36652fc6..80d58a79 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java @@ -58,7 +58,7 @@ public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer { float size = 1.0F * getSizeModifier(craftTime); // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.disableCull(); GlStateManager.enableBlend(); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java index 0603abc8..77a72a3f 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java @@ -79,7 +79,7 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer { float size = 1.0F * getSizeModifier(craftTime); // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.disableCull(); GlStateManager.enableBlend(); @@ -135,21 +135,21 @@ public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer { GlStateManager.rotate((float) ((pitch + 90) * getStartupPitchYawRatio(craftTime)), 1, 0, 0); GlStateManager.pushMatrix(); - Minecraft.getMinecraft().renderEngine.bindTexture(bottomArrayResource); + 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.getMinecraft().renderEngine.bindTexture(middleArrayResource); + 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.getMinecraft().renderEngine.bindTexture(arrayResource); + Minecraft.getInstance().renderEngine.bindTexture(arrayResource); GlStateManager.rotate(rot, 0, 0, 1); GlStateManager.translate(0, 0, -topHeightOffset); renderStandardCircle(tessellator, wr, size); 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 5b8d2cc4..6a094932 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -54,11 +54,11 @@ public class RenderAltar extends TileEntityRenderer { float size = 0.8f; - TextureAtlasSprite fluidStillSprite = Minecraft.getMinecraft().getTextureMapBlocks().getTextureExtry(fluid.getStill().toString()); + TextureAtlasSprite fluidStillSprite = Minecraft.getInstance().getTextureMapBlocks().getTextureExtry(fluid.getStill().toString()); int fluidColor = fluid.getColor(fluidStack); - Minecraft.getMinecraft().renderEngine.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); + Minecraft.getInstance().renderEngine.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); setGLColorFromInt(fluidColor); double uMin = (double) fluidStillSprite.getMinU(); @@ -78,7 +78,7 @@ public class RenderAltar extends TileEntityRenderer { } private void renderItem(ItemStack stack) { - ItemRenderer itemRenderer = Minecraft.getMinecraft().getRenderItem(); + ItemRenderer itemRenderer = Minecraft.getInstance().getRenderItem(); if (!stack.isEmpty()) { GlStateManager.translate(0.5, 1, 0.5); GlStateManager.pushMatrix(); @@ -100,7 +100,7 @@ public class RenderAltar extends TileEntityRenderer { } private void renderHologram(TileAltar altar, AltarTier tier, float partialTicks) { - ClientPlayerEntity player = Minecraft.getMinecraft().player; + ClientPlayerEntity player = Minecraft.getInstance().player; World world = player.world; if (tier == AltarTier.ONE) diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java index 5dd1e340..1c384246 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java @@ -17,7 +17,7 @@ import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class RenderBloodTank extends TileEntityRenderer { - private static final Minecraft mc = Minecraft.getMinecraft(); + 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) { @@ -49,7 +49,7 @@ public class RenderBloodTank extends TileEntityRenderer { Tessellator tessellator = Tessellator.getInstance(); BufferBuilder buffer = tessellator.getBuffer(); - TextureAtlasSprite fluid = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(renderFluid.getStill().toString()); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java index a7fceec7..c69a2053 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java @@ -13,7 +13,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; public class RenderDemonCrucible extends TileEntityRenderer { - public static Minecraft mc = Minecraft.getMinecraft(); + 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; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderFakeBlocks.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderFakeBlocks.java index 62516e8f..331fc733 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderFakeBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderFakeBlocks.java @@ -18,7 +18,7 @@ public class RenderFakeBlocks { double maxZ = minZ + 1; Tessellator tessellator = Tessellator.getInstance(); BufferBuilder wr = tessellator.getBuffer(); - Minecraft.getMinecraft().renderEngine.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); + Minecraft.getInstance().renderEngine.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); wr.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java index 6f16f809..9fa0fccb 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java @@ -20,7 +20,7 @@ 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.getMinecraft(); + 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) { diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java index 45214ac1..8a6c56f2 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java @@ -12,7 +12,7 @@ import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.util.ResourceLocation; public class RenderEntityBloodLight extends EntityRenderer { - private final ItemRenderer renderItem = Minecraft.getMinecraft().getRenderItem(); + private final ItemRenderer renderItem = Minecraft.getInstance().getRenderItem(); public RenderEntityBloodLight(EntityRendererManager renderManagerIn) { super(renderManagerIn); diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java index 6cde4204..9ef06886 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java @@ -26,7 +26,7 @@ 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.getMinecraft(); + Minecraft minecraft = Minecraft.getInstance(); public RenderEntityMimic(EntityRendererManager renderManagerIn) { super(renderManagerIn, new ModelMimic(), 1.0F); @@ -49,7 +49,7 @@ public class RenderEntityMimic extends MobRenderer { ItemStack itemstack = mimic.getMimicItemStack(); Item item = itemstack.getItem(); - Minecraft minecraft = Minecraft.getMinecraft(); + Minecraft minecraft = Minecraft.getInstance(); GlStateManager.pushMatrix(); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); @@ -70,7 +70,7 @@ public class RenderEntityMimic extends MobRenderer { if (!StringUtils.isNullOrEmpty(s)) { gameprofile = SkullTileEntity.updateGameProfile(new GameProfile(null, s)); - nbttagcompound.setTag("SkullOwner", NBTUtil.writeGameProfile(new CompoundNBT(), gameprofile)); + nbttagcompound.putTag("SkullOwner", NBTUtil.writeGameProfile(new CompoundNBT(), gameprofile)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java index 106ec48e..783d68d4 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java @@ -13,7 +13,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; public class RenderEntitySoulSnare extends EntityRenderer { - private final ItemRenderer renderItem = Minecraft.getMinecraft().getRenderItem(); + private final ItemRenderer renderItem = Minecraft.getInstance().getRenderItem(); public RenderEntitySoulSnare(EntityRendererManager renderManagerIn) { super(renderManagerIn); 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 index 5e5da140..d818f024 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java @@ -37,7 +37,7 @@ public class LayerAlchemyCircle implements Layer float size = 3.0F; // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(ARRAY_TEXTURE); + Minecraft.getInstance().renderEngine.bindTexture(ARRAY_TEXTURE); GlStateManager.disableCull(); GlStateManager.enableBlend(); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java index 577e4f85..9ce5c229 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java @@ -28,7 +28,7 @@ public class EntryText extends EntryResourceLocation { @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.getMinecraft().getTextureManager().bindTexture(image); + Minecraft.getInstance().getTextureManager().bindTexture(image); GuiHelper.drawSizedIconWithoutColor(entryX + 4, entryY + 2, 8, 8, 1F); boolean startFlag = fontRendererObj.getUnicodeFlag(); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java index caa0df9a..b3325e86 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java @@ -51,13 +51,13 @@ public class PageAlchemyArray extends Page { int x = guiLeft + 65; int y = guiTop + 30; - Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/alchemyArrayCrafting.png")); + 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.getMinecraft().getTextureManager().bindTexture(arrayResource); + Minecraft.getInstance().getTextureManager().bindTexture(arrayResource); GlStateManager.pushMatrix(); GlStateManager.translate(x + 2, y + 28, 0); GlStateManager.scale(scale, scale, scale); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java index 2d661567..a2327e95 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java @@ -37,7 +37,7 @@ public class PageAltarRecipe extends Page { @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.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/altar.png")); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java index 64302417..7b3dad2b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java @@ -44,7 +44,7 @@ public class PageTartaricForgeRecipe extends Page { @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.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/soulForge.png")); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java index 46e16f45..3366cd65 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java @@ -4,18 +4,22 @@ 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.IWailaRegistrar; +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(IWailaRegistrar registrar) { - registrar.registerBodyProvider(DataProviderBloodAltar.INSTANCE, TileAltar.class); - registrar.registerNBTProvider(DataProviderBloodAltar.INSTANCE, TileAltar.class); - registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_ALTAR, true); + 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); diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java index 95109a73..31471c74 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java @@ -48,9 +48,9 @@ public class DataProviderAlchemyArray implements IWailaDataProvider { public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { TileAlchemyArray alchemyArray = (TileAlchemyArray) te; if (!alchemyArray.getStackInSlot(0).isEmpty()) - tag.setString("reagent", alchemyArray.getStackInSlot(0).getDisplayName()); + tag.putString("reagent", alchemyArray.getStackInSlot(0).getDisplayName()); if (!alchemyArray.getStackInSlot(1).isEmpty()) - tag.setString("catalyst", alchemyArray.getStackInSlot(1).getDisplayName()); + 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 index d144fb3f..95169561 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java @@ -1,23 +1,23 @@ package WayofTime.bloodmagic.compat.waila.provider; import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.util.Constants; +import WayofTime.bloodmagic.compat.waila.BloodMagicHwylaPlugin; import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; import WayofTime.bloodmagic.tile.TileAltar; -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 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.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; -import javax.annotation.Nonnull; import java.util.List; /** @@ -25,35 +25,31 @@ import java.util.List; * href="https://github.com/tterrag1098">tterrag1098. Originally implemented * in ImLookingAtBlood by Pokefenn. */ -public class DataProviderBloodAltar implements IWailaDataProvider { +public class DataProviderBloodAltar implements IComponentProvider, IServerDataProvider { - public static final IWailaDataProvider INSTANCE = new DataProviderBloodAltar(); + public static final DataProviderBloodAltar INSTANCE = new DataProviderBloodAltar(); - @Nonnull @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (!config.getConfig(Constants.Compat.WAILA_CONFIG_ALTAR)) - return currenttip; + public void appendBody(List tooltip, IDataAccessor accessor, IPluginConfig config) { + if (!config.get(BloodMagicHwylaPlugin.CONFIG_SHOW_ALTAR_STATS)) + return; - if (accessor.getNBTData().hasKey("altar")) { - CompoundNBT altarData = accessor.getNBTData().getCompoundTag("altar"); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarTier", altarData.getInteger("tier"))); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarCapacity", altarData.getInteger("capacity"))); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentEssence", altarData.getInteger("stored"))); + 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.hasKey("charge")) { - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent", altarData.getInteger("progress") + "%")); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.seer.currentCharge", altarData.getInteger("charge"))); + 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"))); } } - - return currenttip; } - @Nonnull @Override - public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { - TileAltar altar = (TileAltar) te; + public void appendServerData(CompoundNBT tag, ServerPlayerEntity player, World world, TileEntity tileEntity) { + TileAltar altar = (TileAltar) tileEntity; boolean hasSigil = false; boolean hasSeer = false; @@ -76,20 +72,18 @@ public class DataProviderBloodAltar implements IWailaDataProvider { } if (!hasSeer && !hasSigil) - return tag; + return; CompoundNBT altarData = new CompoundNBT(); - altarData.setInteger("tier", altar.getTier().toInt()); - altarData.setInteger("capacity", altar.getCapacity()); - altarData.setInteger("stored", altar.getCurrentBlood()); + altarData.putInt("tier", altar.getTier().toInt()); + altarData.putInt("capacity", altar.getCapacity()); + altarData.putInt("stored", altar.getCurrentBlood()); if (hasSeer) { - altarData.setInteger("progress", (int) (((double) altar.getProgress() / (double) altar.getLiquidRequired() * 100) / altar.getStackInSlot(0).getCount())); - altarData.setInteger("charge", altar.getTotalCharge()); + altarData.putInt("progress", (int) (((double) altar.getProgress() / (double) altar.getLiquidRequired() * 100) / altar.getStackInSlot(0).getCount())); + altarData.putInt("charge", altar.getTotalCharge()); } - tag.setTag("altar", altarData); - - return tag; + tag.put("altar", altarData); } public static boolean hasStack(ItemStack stack, PlayerEntity player) { diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index ed35e77b..6083ae52 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -42,10 +42,10 @@ public class DataProviderBloodTank implements IWailaDataProvider { @Override public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { TileBloodTank tank = (TileBloodTank) te; - tag.setInteger("tier", tank.getBlockMetadata() + 1); - tag.setInteger("capacity", tank.capacity); + tag.putInt("tier", tank.getBlockMetadata() + 1); + tag.putInt("capacity", tank.capacity); if (tank.getTank().getFluid() != null) - tag.setTag("fluid", tank.getTank().getFluid().writeToNBT(new CompoundNBT())); + 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 index 43d11f75..551fb29f 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java @@ -50,7 +50,7 @@ public class DataProviderMimic implements IWailaDataProvider { if (shareTag != null) item.setTag("nbt", shareTag); - tag.setTag("mimiced", item); + 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 index 4cf4ca0b..5d6bad56 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java @@ -57,21 +57,21 @@ public class DataProviderRitualController implements IWailaDataProvider { if (te instanceof TileMasterRitualStone) { TileMasterRitualStone mrs = (TileMasterRitualStone) te; - tag.setBoolean("master", true); + tag.putBoolean("master", true); if (mrs.getCurrentRitual() != null) { - tag.setString("ritual", mrs.getCurrentRitual().getTranslationKey()); - tag.setBoolean("active", mrs.isActive()); + tag.putString("ritual", mrs.getCurrentRitual().getTranslationKey()); + tag.putBoolean("active", mrs.isActive()); if (mrs.getOwner() != null) - tag.setString("owner", PlayerHelper.getUsernameFromUUID(mrs.getOwner())); - tag.setBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(mrs.getCurrentRitual()), false)); + tag.putString("owner", PlayerHelper.getUsernameFromUUID(mrs.getOwner())); + tag.putBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(mrs.getCurrentRitual()), false)); } } else { - tag.setBoolean("master", false); + tag.putBoolean("master", false); ImperfectRitual ritual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(world.getBlockState(pos.up())); if (ritual != null) { - tag.setString("ritual", ritual.getTranslationKey()); - tag.setBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(ritual), false)); + tag.putString("ritual", ritual.getTranslationKey()); + tag.putBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(ritual), false)); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java index d30b65d4..03b9611b 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java @@ -51,7 +51,7 @@ public class DataProviderTeleposer implements IWailaDataProvider { CompoundNBT focusData = new CompoundNBT(); focusData.setTag("pos", NBTUtil.createPosTag(focus.getBlockPos(contained))); focusData.setInteger("dim", contained.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID)); - tag.setTag("focus", focusData); + tag.put("focus", focusData); } return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java index c7de2d48..135aaabd 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java @@ -34,11 +34,11 @@ public class BMWorldSavedData extends WorldSavedData { } @Override - public void readFromNBT(CompoundNBT tagCompound) { - ListNBT networkData = tagCompound.getTagList("networkData", 10); + public void read(CompoundNBT tagCompound) { + ListNBT networkData = tagCompound.getList("networkData", 10); - for (int i = 0; i < networkData.tagCount(); i++) { - CompoundNBT data = networkData.getCompoundTagAt(i); + 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); @@ -46,12 +46,12 @@ public class BMWorldSavedData extends WorldSavedData { } @Override - public CompoundNBT writeToNBT(CompoundNBT tagCompound) { + public CompoundNBT write(CompoundNBT tagCompound) { ListNBT networkData = new ListNBT(); for (SoulNetwork soulNetwork : soulNetworks.values()) - networkData.appendTag(soulNetwork.serializeNBT()); + networkData.add(soulNetwork.serializeNBT()); - tagCompound.setTag("networkData", networkData); + tagCompound.put("networkData", networkData); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java index 4d107cef..3c2e9ed1 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java @@ -2,7 +2,7 @@ package WayofTime.bloodmagic.core.data; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.INBT; import net.minecraft.nbt.NBTUtil; import net.minecraftforge.common.util.INBTSerializable; @@ -26,14 +26,14 @@ public class Binding implements INBTSerializable { @Override public CompoundNBT serializeNBT() { CompoundNBT tag = new CompoundNBT(); - tag.setTag("id", NBTUtil.createUUIDTag(uuid)); - tag.setString("name", name); + tag.put("id", NBTUtil.writeUniqueId(uuid)); + tag.putString("name", name); return tag; } @Override public void deserializeNBT(CompoundNBT nbt) { - this.uuid = NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")); + this.uuid = NBTUtil.readUniqueId(nbt.getCompound("id")); this.name = nbt.getString("name"); } @@ -57,11 +57,11 @@ public class Binding implements INBTSerializable { @Nullable public static Binding fromStack(ItemStack stack) { - if (!stack.hasTagCompound()) // Definitely hasn't been bound yet. + if (!stack.hasTag()) // Definitely hasn't been bound yet. return null; - NBTBase 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. + 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(); diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index e4eacb8f..30ec5dea 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -150,13 +150,13 @@ public class SoulNetwork implements INBTSerializable { public void hurtPlayer(PlayerEntity user, float syphon) { if (user != null) { if (syphon < 100 && syphon > 0) { - if (!user.capabilities.isCreativeMode) { + if (!user.isCreative()) { user.hurtResistantTime = 0; user.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); } } else if (syphon >= 100) { - if (!user.capabilities.isCreativeMode) { + if (!user.isCreative()) { for (int i = 0; i < ((syphon + 99) / 100); i++) { user.hurtResistantTime = 0; user.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); @@ -228,17 +228,17 @@ public class SoulNetwork implements INBTSerializable { @Override public CompoundNBT serializeNBT() { CompoundNBT tagCompound = new CompoundNBT(); - tagCompound.setString("playerId", getPlayerId().toString()); - tagCompound.setInteger("currentEssence", getCurrentEssence()); - tagCompound.setInteger("orbTier", getOrbTier()); + 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.getInteger("currentEssence"); - this.orbTier = nbt.getInteger("orbTier"); + this.currentEssence = nbt.getInt("currentEssence"); + this.orbTier = nbt.getInt("orbTier"); } public static SoulNetwork fromNBT(CompoundNBT tagCompound) { diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java index 5c04038b..412048d9 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java @@ -1,6 +1,6 @@ package WayofTime.bloodmagic.core.data; -import net.minecraft.command.ICommandSender; +import net.minecraft.command.ICommandSource; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -40,21 +40,21 @@ public class SoulTicket { * @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.provider.getDimension() + "|" + pos.toLong()), amount); + return new SoulTicket(new StringTextComponent("block|" + world.dimension.getDimension() + "|" + 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.provider.getDimension() + "|" + entity.getPersistentID()), 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|pos */ public static SoulTicket item(ItemStack itemStack, World world, BlockPos pos, int amount) { - return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName() + "|" + world.provider.getDimension() + "|" + pos.toLong()), amount); + return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName() + "|" + world.dimension.getDimension() + "|" + pos.toLong()), amount); } /** @@ -64,8 +64,8 @@ public class SoulTicket { return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName()), amount); } - public static SoulTicket command(ICommandSender sender, String command, int amount) { - return new SoulTicket(new StringTextComponent("command|" + command + "|" + sender.getName()), 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?? diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java index 497d90fc..189ab880 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java @@ -51,7 +51,7 @@ public class OrbRegistry { public static ItemStack getOrbStack(BloodOrb orb) { ItemStack ret = new ItemStack(ORB_ITEM); CompoundNBT tag = new CompoundNBT(); - tag.setString("orb", orb.getRegistryName().toString()); + tag.putString("orb", orb.getRegistryName().toString()); ret.setTagCompound(tag); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java index d47c1e68..4200cf0d 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java @@ -185,7 +185,7 @@ public abstract class EntityAspectedDemonBase extends EntityDemonBase { public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); - tag.setString(Constants.NBT.WILL_TYPE, this.getType().toString()); + tag.putString(Constants.NBT.WILL_TYPE, this.getType().toString()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java index 1ea7e265..417d62d5 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java @@ -176,14 +176,14 @@ public class EntityCorruptedChicken extends EntityAspectedDemonBase { super.readEntityFromNBT(compound); if (compound.hasKey("EggLayTime")) { - this.timeUntilNextEgg = compound.getInteger("EggLayTime"); + this.timeUntilNextEgg = compound.getInt("EggLayTime"); } } @Override public void writeEntityToNBT(CompoundNBT compound) { super.writeEntityToNBT(compound); - compound.setInteger("EggLayTime", this.timeUntilNextEgg); + compound.putInt("EggLayTime", this.timeUntilNextEgg); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java index 621b1a63..5e4acc3b 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java @@ -214,9 +214,9 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh @Override public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); - tag.setBoolean("Sheared", this.getSheared()); - tag.setByte("Color", (byte) this.getFleeceColor().getMetadata()); - tag.setInteger("protection", this.protectionCooldown); + tag.putBoolean("Sheared", this.getSheared()); + tag.putByte("Color", (byte) this.getFleeceColor().getMetadata()); + tag.putInt("protection", this.protectionCooldown); } @Override @@ -224,7 +224,7 @@ public class EntityCorruptedSheep extends EntityAspectedDemonBase implements ISh super.readEntityFromNBT(tag); this.setSheared(tag.getBoolean("Sheared")); this.setFleeceColor(DyeColor.byMetadata(tag.getByte("Color"))); - this.protectionCooldown = tag.getInteger("protection"); + this.protectionCooldown = tag.getInt("protection"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java index 5f0d0245..c43c7b98 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java @@ -164,9 +164,9 @@ public class EntityDemonBase extends CreatureEntity implements IEntityOwnable { super.writeEntityToNBT(tag); if (this.getOwnerId() == null) { - tag.setString("OwnerUUID", ""); + tag.putString("OwnerUUID", ""); } else { - tag.setString("OwnerUUID", this.getOwnerId().toString()); + tag.putString("OwnerUUID", this.getOwnerId().toString()); } } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index 41361017..40ca056f 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -66,11 +66,11 @@ public class EntityMimic extends EntityDemonBase { public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); - tag.setBoolean("dropItemsOnBreak", dropItemsOnBreak); - tag.setTag("tileTag", tileTag); - tag.setInteger("metaOfReplacedBlock", metaOfReplacedBlock); - tag.setInteger("playerCheckRadius", playerCheckRadius); - tag.setString("stateOfReplacedBlock", stateOfReplacedBlock.toString()); + tag.putBoolean("dropItemsOnBreak", dropItemsOnBreak); + tag.put("tileTag", tileTag); + tag.putInt("metaOfReplacedBlock", metaOfReplacedBlock); + tag.putInt("playerCheckRadius", playerCheckRadius); + tag.putString("stateOfReplacedBlock", stateOfReplacedBlock.toString()); } @Override @@ -78,9 +78,9 @@ public class EntityMimic extends EntityDemonBase { super.readEntityFromNBT(tag); dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); - tileTag = tag.getCompoundTag("tileTag"); - metaOfReplacedBlock = tag.getInteger("metaOfReplacedBlock"); - playerCheckRadius = tag.getInteger("playerCheckRadius"); + tileTag = tag.getCompound("tileTag"); + metaOfReplacedBlock = tag.getInt("metaOfReplacedBlock"); + playerCheckRadius = tag.getInt("playerCheckRadius"); stateOfReplacedBlock = StateUtil.parseState(tag.getString("stateOfReplacedBlock")); } diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java index 6ec43ae9..f2b2f999 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -358,9 +358,9 @@ public class EntitySentientSpecter extends EntityDemonBase { public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - tag.setBoolean("sentientArmour", wasGivenSentientArmour); + tag.putBoolean("sentientArmour", wasGivenSentientArmour); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index 1ed0d6ef..bb8b8cab 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -142,15 +142,15 @@ public class EntityBloodLight extends ThrowableEntity implements IThrowableEntit @Override public void writeEntityToNBT(CompoundNBT nbt) { super.writeEntityToNBT(nbt); - nbt.setInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir); - nbt.setInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir); + 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.getInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR); - maxTicksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); + ticksInAir = nbt.getInt(Constants.NBT.PROJECTILE_TICKS_IN_AIR); + maxTicksInAir = nbt.getInt(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index 7fd8ae60..5a73d56e 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -88,22 +88,22 @@ public class EntityMeteor extends ThrowableEntity implements IThrowableEntity { @Override public void writeEntityToNBT(CompoundNBT nbt) { super.writeEntityToNBT(nbt); - nbt.setInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir); - nbt.setInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir); - nbt.setDouble("radiusModifier", radiusModifier); - nbt.setDouble("explosionModifier", explosionModifier); - nbt.setDouble("fillerChance", fillerChance); + 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.setBoolean("noItem", true); + nbt.putBoolean("noItem", true); } @Override public void readEntityFromNBT(CompoundNBT nbt) { super.readEntityFromNBT(nbt); - ticksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR); - maxTicksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); + 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"); diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java index 6fc72e52..baf6538f 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java @@ -260,9 +260,9 @@ public class EntitySentientArrow extends ArrowEntity { public void writeEntityToNBT(CompoundNBT tag) { super.writeEntityToNBT(tag); - tag.setDouble("reimbursement", reimbursedAmountOnHit); - tag.setInteger("currentLevel", currentLevel); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putDouble("reimbursement", reimbursedAmountOnHit); + tag.putInt("currentLevel", currentLevel); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); } @Override @@ -271,7 +271,7 @@ public class EntitySentientArrow extends ArrowEntity { reimbursedAmountOnHit = tag.getDouble("reimbursement"); type = EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - currentLevel = tag.getInteger("currentLevel"); + currentLevel = tag.getInt("currentLevel"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java index 0aae8212..2f27c0d0 100644 --- a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java @@ -4,8 +4,8 @@ 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.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; public class SoulNetworkEvent extends Event { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java index a343b514..7b15599a 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java @@ -46,7 +46,7 @@ public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { for (BloodOrb orb : RegistrarBloodMagic.BLOOD_ORBS) { ItemStack orbStack = new ItemStack(this); CompoundNBT tag = new CompoundNBT(); - tag.setString("orb", orb.getRegistryName().toString()); + tag.putString("orb", orb.getRegistryName().toString()); orbStack.setTagCompound(tag); list.add(orbStack); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 3ca9e276..426c4679 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -124,7 +124,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider { CompoundNBT tag = stack.getTagCompound(); - tag.setDouble("experience", exp); + tag.putDouble("experience", exp); } public static double getStoredExperience(ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java index 26f900c8..fda68ca5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java @@ -47,7 +47,7 @@ public class ItemInscriptionTool extends ItemEnum.Variant implemen ItemStack stack = new ItemStack(this, 1, runeType.ordinal()); CompoundNBT tag = new CompoundNBT(); - tag.setInteger(Constants.NBT.USES, 10); + tag.putInt(Constants.NBT.USES, 10); stack.setTagCompound(tag); list.add(stack); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java index 78ebbe37..78ad52d6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java @@ -16,7 +16,7 @@ import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Effects; import net.minecraft.util.*; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.INBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; @@ -74,12 +74,12 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide if (stack.getTagCompound() == null) // hasTagCompound doesn't work on empty stacks with tags return null; - NBTBase bindingTag = stack.getTagCompound().getTag("binding"); + 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.getCompoundTag("id")), nbt.getString("name")); + return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompound("id")), nbt.getString("name")); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index 6f2e534a..bb914f7e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -375,7 +375,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { CompoundNBT tag = stack.getTagCompound(); - tag.setInteger(Constants.NBT.DIRECTION, direction.getIndex()); + tag.putInt(Constants.NBT.DIRECTION, direction.getIndex()); } public Direction getDirection(ItemStack stack) { @@ -386,12 +386,12 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { CompoundNBT tag = stack.getTagCompound(); - int dir = tag.getInteger(Constants.NBT.DIRECTION); + int dir = tag.getInt(Constants.NBT.DIRECTION); if (dir == 0) { return Direction.NORTH; } - return Direction.VALUES[tag.getInteger(Constants.NBT.DIRECTION)]; + return Direction.VALUES[tag.getInt(Constants.NBT.DIRECTION)]; } /** @@ -464,7 +464,7 @@ public class ItemRitualDiviner extends Item implements IVariantProvider { CompoundNBT tag = stack.getTagCompound(); - tag.setString("current_ritual", key); + tag.putString("current_ritual", key); } public String getCurrentRitual(ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java index ae919cb9..9888fad3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java @@ -204,9 +204,9 @@ public class ItemRitualReader extends Item implements IVariantProvider { public ItemStack setBlockPos(ItemStack stack, BlockPos pos) { stack = NBTHelper.checkNBT(stack); CompoundNBT itemTag = stack.getTagCompound(); - itemTag.setInteger(Constants.NBT.X_COORD, pos.getX()); - itemTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); - itemTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + 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; } @@ -218,9 +218,9 @@ public class ItemRitualReader extends Item implements IVariantProvider { public ItemStack setMasterBlockPos(ItemStack stack, BlockPos pos) { stack = NBTHelper.checkNBT(stack); CompoundNBT itemTag = stack.getTagCompound(); - itemTag.setInteger(Constants.NBT.X_COORD + "master", pos.getX()); - itemTag.setInteger(Constants.NBT.Y_COORD + "master", pos.getY()); - itemTag.setInteger(Constants.NBT.Z_COORD + "master", pos.getZ()); + 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; } @@ -237,7 +237,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { CompoundNBT tag = stack.getTagCompound(); - tag.setString("range", range); + tag.putString("range", range); } public void cycleReader(ItemStack stack, PlayerEntity player) { @@ -259,7 +259,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { CompoundNBT tag = stack.getTagCompound(); - tag.setInteger(Constants.NBT.RITUAL_READER, state.ordinal()); + tag.putInt(Constants.NBT.RITUAL_READER, state.ordinal()); } public EnumRitualReaderState getState(ItemStack stack) { @@ -270,7 +270,7 @@ public class ItemRitualReader extends Item implements IVariantProvider { CompoundNBT tag = stack.getTagCompound(); - return EnumRitualReaderState.values()[tag.getInteger(Constants.NBT.RITUAL_READER)]; + return EnumRitualReaderState.values()[tag.getInt(Constants.NBT.RITUAL_READER)]; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java index 4f45001a..0bf4a0b3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java @@ -64,7 +64,7 @@ public class ItemTelepositionFocus extends ItemEnum.Variant enchantmentMap = EnchantmentHelper.getEnchantments(previousArmour); EnchantmentHelper.setEnchantments(enchantmentMap, newArmour); } @@ -349,7 +349,7 @@ public class ItemSentientArmour extends ArmorItem implements ISpecialArmor, IMes return null; } - CompoundNBT tag = omegaTag.getCompoundTag("armour"); + CompoundNBT tag = omegaTag.getCompound("armour"); return new ItemStack(tag); } @@ -380,7 +380,7 @@ public class ItemSentientArmour extends ArmorItem implements ISpecialArmor, IMes CompoundNBT tag = stack.getTagCompound(); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); } public void setAbilitiesOfArmour(EnumDemonWillType type, double willValue, ItemStack armourStack) { @@ -468,7 +468,7 @@ public class ItemSentientArmour extends ArmorItem implements ISpecialArmor, IMes CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); + tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } public double getKnockbackResistance(ItemStack stack) { @@ -483,7 +483,7 @@ public class ItemSentientArmour extends ArmorItem implements ISpecialArmor, IMes CompoundNBT tag = stack.getTagCompound(); - tag.setDouble("knockback", kb); + tag.putDouble("knockback", kb); } public double getSpeedBoost(ItemStack stack) { @@ -498,7 +498,7 @@ public class ItemSentientArmour extends ArmorItem implements ISpecialArmor, IMes CompoundNBT tag = stack.getTagCompound(); - tag.setDouble("speed", speed); + tag.putDouble("speed", speed); } public double getDamageBoost(ItemStack stack) { @@ -513,7 +513,7 @@ public class ItemSentientArmour extends ArmorItem implements ISpecialArmor, IMes CompoundNBT tag = stack.getTagCompound(); - tag.setDouble("damage", damage); + tag.putDouble("damage", damage); } public double getAttackSpeedBoost(ItemStack stack) { @@ -528,7 +528,7 @@ public class ItemSentientArmour extends ArmorItem implements ISpecialArmor, IMes CompoundNBT tag = stack.getTagCompound(); - tag.setDouble("attackSpeed", attackSpeed); + tag.putDouble("attackSpeed", attackSpeed); } public static void revertAllArmour(PlayerEntity player) { diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java index 242e2974..c3ef8980 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java @@ -59,9 +59,9 @@ public class ItemBlockMimic extends ItemBlockEnum { CompoundNBT tileTag = getTagFromTileEntity(tileReplaced); if (tileReplaced != null) { CompoundNBT voidTag = new CompoundNBT(); - voidTag.setInteger("x", pos.getX()); - voidTag.setInteger("y", pos.getY()); - voidTag.setInteger("z", pos.getZ()); + voidTag.putInt("x", pos.getX()); + voidTag.putInt("y", pos.getY()); + voidTag.putInt("z", pos.getZ()); tileReplaced.readFromNBT(voidTag); } diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java index a6eb1973..56c517c7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java @@ -49,8 +49,8 @@ public class InventoryHolding extends ItemInventory { nbtTagCompound = new CompoundNBT(); UUID uuid = UUID.randomUUID(); - nbtTagCompound.setLong(Constants.NBT.MOST_SIG, uuid.getMostSignificantBits()); - nbtTagCompound.setLong(Constants.NBT.LEAST_SIG, uuid.getLeastSignificantBits()); + nbtTagCompound.putLong(Constants.NBT.MOST_SIG, uuid.getMostSignificantBits()); + nbtTagCompound.putLong(Constants.NBT.LEAST_SIG, uuid.getLeastSignificantBits()); } writeToNBT(nbtTagCompound); diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java index 329f5aea..93c07286 100644 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java +++ b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java @@ -49,7 +49,7 @@ public class ItemInventory implements IInventory { for (int i = 0; i < tags.tagCount(); i++) { if (!isSyncedSlot(i)) { - CompoundNBT data = tags.getCompoundTagAt(i); + CompoundNBT data = tags.getCompound(i); byte j = data.getByte(Constants.NBT.SLOT); if (j >= 0 && j < inventory.size()) { @@ -71,14 +71,14 @@ public class ItemInventory implements IInventory { } } - tagCompound.setTag(Constants.NBT.ITEMS, tags); + tagCompound.putTag(Constants.NBT.ITEMS, tags); } public void readFromStack(ItemStack masterStack) { if (masterStack != null) { NBTHelper.checkNBT(masterStack); CompoundNBT tag = masterStack.getTagCompound(); - readFromNBT(tag.getCompoundTag(Constants.NBT.ITEM_INVENTORY)); + readFromNBT(tag.getCompound(Constants.NBT.ITEM_INVENTORY)); } } @@ -88,7 +88,7 @@ public class ItemInventory implements IInventory { CompoundNBT tag = masterStack.getTagCompound(); CompoundNBT invTag = new CompoundNBT(); writeToNBT(invTag); - tag.setTag(Constants.NBT.ITEM_INVENTORY, invTag); + tag.put(Constants.NBT.ITEM_INVENTORY, invTag); } } diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java index 6665b7fd..4d475a5f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -187,9 +187,9 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi public ItemStack setBlockPos(ItemStack stack, BlockPos pos) { NBTHelper.checkNBT(stack); CompoundNBT itemTag = stack.getTagCompound(); - itemTag.setInteger(Constants.NBT.X_COORD, pos.getX()); - itemTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); - itemTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + 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/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java index 18a8c3a8..425e9ee6 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java @@ -140,14 +140,14 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl for (int i = 0; i < inventorySize; i++) { if (!inventory.get(i).isEmpty()) { CompoundNBT tag = new CompoundNBT(); - tag.setByte(Constants.NBT.SLOT, (byte) i); + tag.putByte(Constants.NBT.SLOT, (byte) i); inventory.get(i).writeToNBT(tag); itemList.appendTag(tag); } } - inventoryTag.setTag(Constants.NBT.ITEMS, itemList); - itemTag.setTag(Constants.NBT.ITEM_INVENTORY, inventoryTag); + inventoryTag.put(Constants.NBT.ITEMS, itemList); + itemTag.put(Constants.NBT.ITEM_INVENTORY, inventoryTag); } @Override @@ -248,7 +248,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl } CompoundNBT inventoryTag = tagCompound.getCompoundTag(Constants.NBT.ITEM_INVENTORY); - ListNBT tagList = inventoryTag.getTagList(Constants.NBT.ITEMS, 10); + ListNBT tagList = inventoryTag.getList(Constants.NBT.ITEMS, 10); if (tagList.isEmpty()) { return NonNullList.withSize(inventorySize, ItemStack.EMPTY); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java index 4303d3fd..3950db3b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java @@ -117,7 +117,7 @@ public class ItemSigilTeleposition extends ItemSigilBase { else tagCompound = stack.getTagCompound(); - tagCompound.setTag("tplocation", location.serializeNBT()); + tagCompound.putTag("tplocation", location.serializeNBT()); } public static class TeleportLocation implements INBTSerializable { @@ -140,14 +140,14 @@ public class ItemSigilTeleposition extends ItemSigilBase { @Override public CompoundNBT serializeNBT() { CompoundNBT tag = new CompoundNBT(); - tag.setInteger("dim", dim); - tag.setLong("pos", pos.toLong()); + tag.putInt("dim", dim); + tag.putLong("pos", pos.toLong()); return tag; } @Override public void deserializeNBT(CompoundNBT nbt) { - this.dim = nbt.getInteger("dim"); + this.dim = nbt.getInt("dim"); this.pos = BlockPos.fromLong(nbt.getLong("pos")); } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java index a2dc3b3d..fa898cb9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java @@ -39,7 +39,7 @@ public class ItemSigilTransposition extends ItemSigilBase { if (tag.hasKey("stored")) { tooltip.add(" "); - tooltip.add(tag.getCompoundTag("stored").getString("display")); + tooltip.add(tag.getCompound("stored").getString("display")); } } @@ -51,7 +51,7 @@ public class ItemSigilTransposition extends ItemSigilBase { CompoundNBT tag = stack.getTagCompound(); if (tag.hasKey("stored")) - return super.getItemStackDisplayName(stack) + " (" + tag.getCompoundTag("stored").getString("display") + ")"; + return super.getItemStackDisplayName(stack) + " (" + tag.getCompound("stored").getString("display") + ")"; return super.getItemStackDisplayName(stack); } @@ -96,8 +96,8 @@ public class ItemSigilTransposition extends ItemSigilBase { } else if (stack.hasTagCompound() && stack.getTagCompound().hasKey("stored")) { BlockState worldState = world.getBlockState(blockPos); CompoundNBT storedTag = stack.getTagCompound().getCompoundTag("stored"); - BlockState storedState = NBTUtil.readBlockState(storedTag.getCompoundTag("state")); - CompoundNBT tileData = storedTag.hasKey("tileData") ? storedTag.getCompoundTag("tileData") : null; + 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); @@ -133,7 +133,7 @@ public class ItemSigilTransposition extends ItemSigilBase { return super.getNBTShareTag(stack); CompoundNBT shareTag = stack.getTagCompound().copy(); - CompoundNBT storedTag = shareTag.getCompoundTag("stored"); + CompoundNBT storedTag = shareTag.getCompound("stored"); storedTag.removeTag("state"); storedTag.removeTag("stored"); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java index c96bda23..3445bbe1 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java @@ -63,7 +63,7 @@ public class ItemMonsterSoul extends ItemEnum.Variant soulStack.setItemDamage(type.ordinal()); - tag.setDouble(Constants.NBT.SOULS, souls); + tag.putDouble(Constants.NBT.SOULS, souls); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java index a7c64efa..2406975f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java @@ -61,7 +61,7 @@ public class ItemSentientArmourGem extends Item implements IMeshProvider { public ItemMeshDefinition getMeshDefinition() { return stack -> { boolean flag = false; - NonNullList armourInventory = Minecraft.getMinecraft().player.inventory.armorInventory; + NonNullList armourInventory = Minecraft.getInstance().player.inventory.armorInventory; for (ItemStack armourStack : armourInventory) { if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) { flag = true; diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java index f6ca9758..5fcc00bb 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java @@ -232,7 +232,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); } @Override @@ -349,7 +349,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); + tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } public double getDrainOfActivatedSword(ItemStack stack) { @@ -364,7 +364,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); + tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } public double getStaticDropOfActivatedSword(ItemStack stack) { @@ -379,7 +379,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } public double getDropOfActivatedSword(ItemStack stack) { @@ -394,7 +394,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } public double getHealthBonusOfSword(ItemStack stack) { @@ -409,7 +409,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); + tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } public double getAttackSpeedOfSword(ItemStack stack) { @@ -424,7 +424,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } public double getSpeedOfSword(ItemStack stack) { @@ -439,7 +439,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } public double getDigSpeedOfSword(ItemStack stack) { @@ -454,7 +454,7 @@ public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshP CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java index 9516da29..d23b0a96 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java @@ -164,7 +164,7 @@ public class ItemSentientBow extends BowItem implements IMultiWillTool, ISentien CompoundNBT tag = stack.getTagCompound(); - tag.setDouble("damage", damage); + tag.putDouble("damage", damage); } public double getDamageAdded(ItemStack stack) { @@ -180,7 +180,7 @@ public class ItemSentientBow extends BowItem implements IMultiWillTool, ISentien CompoundNBT tag = stack.getTagCompound(); - tag.setFloat("velocity", velocity); + tag.putFloat("velocity", velocity); } public float getVelocityOfArrow(ItemStack stack) { @@ -200,7 +200,7 @@ public class ItemSentientBow extends BowItem implements IMultiWillTool, ISentien CompoundNBT tag = stack.getTagCompound(); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); } public double getDrainOfActivatedBow(ItemStack stack) { @@ -215,7 +215,7 @@ public class ItemSentientBow extends BowItem implements IMultiWillTool, ISentien CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); + tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } public double getStaticDropOfActivatedBow(ItemStack stack) { @@ -230,7 +230,7 @@ public class ItemSentientBow extends BowItem implements IMultiWillTool, ISentien CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } public double getDropOfActivatedBow(ItemStack stack) { @@ -245,7 +245,7 @@ public class ItemSentientBow extends BowItem implements IMultiWillTool, ISentien CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java index a2714804..a1556a5b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java @@ -232,7 +232,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); } @Override @@ -348,7 +348,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); + tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } public double getDrainOfActivatedSword(ItemStack stack) { @@ -363,7 +363,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); + tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } public double getStaticDropOfActivatedSword(ItemStack stack) { @@ -378,7 +378,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } public double getDropOfActivatedSword(ItemStack stack) { @@ -393,7 +393,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } public double getHealthBonusOfSword(ItemStack stack) { @@ -408,7 +408,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); + tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } public double getAttackSpeedOfSword(ItemStack stack) { @@ -423,7 +423,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } public double getSpeedOfSword(ItemStack stack) { @@ -438,7 +438,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } public double getDigSpeedOfSword(ItemStack stack) { @@ -453,7 +453,7 @@ public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java index 5bb7104f..d04beea9 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java @@ -232,7 +232,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); } @Override @@ -349,7 +349,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); + tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } public double getDrainOfActivatedSword(ItemStack stack) { @@ -364,7 +364,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); + tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } public double getStaticDropOfActivatedSword(ItemStack stack) { @@ -379,7 +379,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } public double getDropOfActivatedSword(ItemStack stack) { @@ -394,7 +394,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } public double getHealthBonusOfSword(ItemStack stack) { @@ -409,7 +409,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); + tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } public double getAttackSpeedOfSword(ItemStack stack) { @@ -424,7 +424,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } public double getSpeedOfSword(ItemStack stack) { @@ -439,7 +439,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } public double getDigSpeedOfSword(ItemStack stack) { @@ -454,7 +454,7 @@ public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index befbfd10..4953ba3b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -214,7 +214,7 @@ public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IM CompoundNBT tag = stack.getTagCompound(); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); } @Override @@ -330,7 +330,7 @@ public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IM CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); + tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); } public double getDrainOfActivatedSword(ItemStack stack) { @@ -345,7 +345,7 @@ public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IM CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); + tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); } public double getStaticDropOfActivatedSword(ItemStack stack) { @@ -360,7 +360,7 @@ public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IM CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); } public double getDropOfActivatedSword(ItemStack stack) { @@ -375,7 +375,7 @@ public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IM CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_DROP, drop); + tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); } public double getHealthBonusOfSword(ItemStack stack) { @@ -390,7 +390,7 @@ public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IM CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); + tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); } public double getAttackSpeedOfSword(ItemStack stack) { @@ -405,7 +405,7 @@ public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IM CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); } public double getSpeedOfSword(ItemStack stack) { @@ -420,7 +420,7 @@ public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IM CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); + tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index 2df52e4f..9cec0e42 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -176,7 +176,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I CompoundNBT tag = soulGemStack.getTagCompound(); - tag.setDouble(Constants.NBT.SOULS, souls); + tag.putDouble(Constants.NBT.SOULS, souls); } @Override @@ -244,7 +244,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I return; } - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java index de5180bf..47743536 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java +++ b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java @@ -18,7 +18,7 @@ public abstract class ItemSoulBreathContainer extends Item implements ISoulBreat public void setBreath(ItemStack stack, double amount) { CompoundNBT tag = stack.getTagCompound(); - tag.setDouble(Constants.NBT.BREATH, amount); + tag.putDouble(Constants.NBT.BREATH, amount); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java index 8144dbfd..ac8474d6 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -212,15 +212,15 @@ public class LivingArmour implements ILivingArmour { @Override public void readFromNBT(CompoundNBT tag) { - maxUpgradePoints = Math.max(100, tag.getInteger("maxUpgradePoints")); + maxUpgradePoints = Math.max(100, tag.getInt("maxUpgradePoints")); - ListNBT upgradeTags = tag.getTagList("upgrades", 10); + ListNBT upgradeTags = tag.getList("upgrades", 10); if (upgradeTags != null) { for (int i = 0; i < upgradeTags.tagCount(); i++) { - CompoundNBT upgradeTag = upgradeTags.getCompoundTagAt(i); + CompoundNBT upgradeTag = upgradeTags.getCompound(i); String key = upgradeTag.getString("key"); - int level = upgradeTag.getInteger("level"); - CompoundNBT nbtTag = upgradeTag.getCompoundTag("upgrade"); + int level = upgradeTag.getInt("level"); + CompoundNBT nbtTag = upgradeTag.getCompound("upgrade"); LivingArmourUpgrade upgrade = LivingArmourHandler.generateUpgradeFromKey(key, level, nbtTag); if (upgrade != null) { upgradeMap.put(key, upgrade); @@ -238,7 +238,7 @@ public class LivingArmour implements ILivingArmour { } StatTracker tracker = (StatTracker) obj; String key = tracker.getUniqueIdentifier(); - CompoundNBT trackerTag = tag.getCompoundTag(key); + CompoundNBT trackerTag = tag.getCompound(key); if (!trackerTag.isEmpty()) { tracker.readFromNBT(trackerTag); } @@ -251,7 +251,7 @@ public class LivingArmour implements ILivingArmour { @Override public void writeToNBT(CompoundNBT tag, boolean forceWrite) { - tag.setInteger("maxUpgradePoints", maxUpgradePoints); + tag.putInt("maxUpgradePoints", maxUpgradePoints); ListNBT tags = new ListNBT(); @@ -262,14 +262,14 @@ public class LivingArmour implements ILivingArmour { CompoundNBT nbtTag = new CompoundNBT(); upgrade.writeToNBT(nbtTag); - upgradeTag.setString("key", upgrade.getUniqueIdentifier()); - upgradeTag.setInteger("level", upgrade.getUpgradeLevel()); - upgradeTag.setTag("upgrade", nbtTag); + upgradeTag.putString("key", upgrade.getUniqueIdentifier()); + upgradeTag.putInt("level", upgrade.getUpgradeLevel()); + upgradeTag.put("upgrade", nbtTag); tags.appendTag(upgradeTag); } - tag.setTag("upgrades", tags); + tag.put("upgrades", tags); for (Entry entry : trackerMap.entrySet()) { StatTracker tracker = entry.getValue(); @@ -284,7 +284,7 @@ public class LivingArmour implements ILivingArmour { CompoundNBT trackerTag = new CompoundNBT(); tracker.writeToNBT(trackerTag); - tag.setTag(key, trackerTag); + tag.put(key, trackerTag); tracker.resetDirty(); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java index 37c20df3..868b5b27 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java @@ -51,12 +51,12 @@ public class LivingArmourUpgradeBattleHungry extends LivingArmourUpgrade { @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger("timer", timer); + tag.putInt("timer", timer); } @Override public void readFromNBT(CompoundNBT tag) { - timer = tag.getInteger("timer"); + timer = tag.getInt("timer"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java index 65f9706f..66aa6b7d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java @@ -31,12 +31,12 @@ public class StatTrackerArrowProtect extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.arrowProtect"); + totalDamage = tag.getInt(BloodMagic.MODID + ".tracker.arrowProtect"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.arrowProtect", totalDamage); + tag.putInt(BloodMagic.MODID + ".tracker.arrowProtect", totalDamage); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java index 1b9550f5..fb9c3932 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java @@ -31,12 +31,12 @@ public class StatTrackerArrowShot extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalShots = tag.getInteger(BloodMagic.MODID + ".tracker.trickShot"); + totalShots = tag.getInt(BloodMagic.MODID + ".tracker.trickShot"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.trickShot", totalShots); + tag.putInt(BloodMagic.MODID + ".tracker.trickShot", totalShots); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java index 9096e539..2d5f2e23 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java @@ -36,7 +36,7 @@ public class StatTrackerCriticalStrike extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.criticalStrike", totalDamageDealt); + tag.putDouble(BloodMagic.MODID + ".tracker.criticalStrike", totalDamageDealt); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java index 9b407907..fe324590 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java @@ -31,12 +31,12 @@ public class StatTrackerDigging extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalBlocksDug = tag.getInteger(BloodMagic.MODID + ".tracker.digging"); + totalBlocksDug = tag.getInt(BloodMagic.MODID + ".tracker.digging"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.digging", totalBlocksDug); + tag.putInt(BloodMagic.MODID + ".tracker.digging", totalBlocksDug); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java index 09f2c95e..6e334002 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java @@ -36,7 +36,7 @@ public class StatTrackerExperience extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.experienced", totalExperienceGained); + tag.putDouble(BloodMagic.MODID + ".tracker.experienced", totalExperienceGained); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java index 481a91f0..f40aaad7 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java @@ -31,12 +31,12 @@ public class StatTrackerFallProtect extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.fallProtect"); + totalDamage = tag.getInt(BloodMagic.MODID + ".tracker.fallProtect"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.fallProtect", totalDamage); + tag.putInt(BloodMagic.MODID + ".tracker.fallProtect", totalDamage); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java index fcbcd93c..becc5329 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java @@ -29,12 +29,12 @@ public class StatTrackerFireResist extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalFireTicks = tag.getInteger(BloodMagic.MODID + ".tracker.fire"); + totalFireTicks = tag.getInt(BloodMagic.MODID + ".tracker.fire"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.fire", totalFireTicks); + tag.putInt(BloodMagic.MODID + ".tracker.fire", totalFireTicks); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java index 757de371..06a2bd42 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java @@ -34,12 +34,12 @@ public class StatTrackerFood extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - foodEaten = tag.getInteger(BloodMagic.MODID + ".tracker.foodEaten"); + foodEaten = tag.getInt(BloodMagic.MODID + ".tracker.foodEaten"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.foodEaten", foodEaten); + tag.putInt(BloodMagic.MODID + ".tracker.foodEaten", foodEaten); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java index 0797ba9c..465d68a2 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java @@ -36,7 +36,7 @@ public class StatTrackerGraveDigger extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.graveDigger", totalDamageDealt); + tag.putDouble(BloodMagic.MODID + ".tracker.graveDigger", totalDamageDealt); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java index 9b2e087b..9fb78303 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java @@ -32,12 +32,12 @@ public class StatTrackerGrimReaperSprint extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalDeaths = tag.getInteger(BloodMagic.MODID + ".tracker.grimReaper"); + totalDeaths = tag.getInt(BloodMagic.MODID + ".tracker.grimReaper"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.grimReaper", totalDeaths); + tag.putInt(BloodMagic.MODID + ".tracker.grimReaper", totalDeaths); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java index 56aa43c5..04efda5f 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java @@ -36,7 +36,7 @@ public class StatTrackerHealthboost extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.health", totalHealthGenned); + tag.putDouble(BloodMagic.MODID + ".tracker.health", totalHealthGenned); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java index cd9ac778..155c8b70 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java @@ -32,12 +32,12 @@ public class StatTrackerJump extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalJumps = tag.getInteger(BloodMagic.MODID + ".tracker.jump"); + totalJumps = tag.getInt(BloodMagic.MODID + ".tracker.jump"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.jump", totalJumps); + tag.putInt(BloodMagic.MODID + ".tracker.jump", totalJumps); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java index 82b7ece1..54aafd31 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java @@ -36,7 +36,7 @@ public class StatTrackerMeleeDamage extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.meleeDamage", totalDamageDealt); + tag.putDouble(BloodMagic.MODID + ".tracker.meleeDamage", totalDamageDealt); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java index 0b68e699..ab355dbd 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java @@ -40,7 +40,7 @@ public class StatTrackerMovement extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.movement", totalMovement); + tag.putDouble(BloodMagic.MODID + ".tracker.movement", totalMovement); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java index 12791b42..85978584 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java @@ -36,13 +36,13 @@ public class StatTrackerNightSight extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.nightSight"); - totalNightVision = tag.getInteger(BloodMagic.MODID + ".tracker.nightSightVision"); + totalNightVision = tag.getInt(BloodMagic.MODID + ".tracker.nightSightVision"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.nightSight", totalDamageDealt); - tag.setInteger(BloodMagic.MODID + ".tracker.nightSightVision", totalNightVision); + tag.putDouble(BloodMagic.MODID + ".tracker.nightSight", totalDamageDealt); + tag.putInt(BloodMagic.MODID + ".tracker.nightSightVision", totalNightVision); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java index e60c6788..2cf5da7d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java @@ -31,12 +31,12 @@ public class StatTrackerPhysicalProtect extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalDamage = tag.getInteger(BloodMagic.MODID + ".tracker.physicalProtect"); + totalDamage = tag.getInt(BloodMagic.MODID + ".tracker.physicalProtect"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.physicalProtect", totalDamage); + tag.putInt(BloodMagic.MODID + ".tracker.physicalProtect", totalDamage); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java index 94c394d6..56d4b125 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java @@ -30,12 +30,12 @@ public class StatTrackerPoison extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalPoisonTicks = tag.getInteger(BloodMagic.MODID + ".tracker.poison"); + totalPoisonTicks = tag.getInt(BloodMagic.MODID + ".tracker.poison"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.poison", totalPoisonTicks); + tag.putInt(BloodMagic.MODID + ".tracker.poison", totalPoisonTicks); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java index 981f349f..4ab0bb17 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java @@ -36,7 +36,7 @@ public class StatTrackerRepairing extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.repair", totalDamage); + tag.putDouble(BloodMagic.MODID + ".tracker.repair", totalDamage); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java index d62f2f47..06712f6c 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java @@ -32,12 +32,12 @@ public class StatTrackerSelfSacrifice extends StatTracker { @Override public void readFromNBT(CompoundNBT tag) { - totalSacrifices = tag.getInteger(BloodMagic.MODID + ".tracker.selfSacrifice"); + totalSacrifices = tag.getInt(BloodMagic.MODID + ".tracker.selfSacrifice"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.selfSacrifice", totalSacrifices); + tag.putInt(BloodMagic.MODID + ".tracker.selfSacrifice", totalSacrifices); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java index 87be975d..6e738b1a 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java @@ -36,7 +36,7 @@ public class StatTrackerSolarPowered extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.solarPowered", totalHealthGenned); + tag.putDouble(BloodMagic.MODID + ".tracker.solarPowered", totalHealthGenned); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java index ae828d2e..3ab852ed 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java @@ -36,7 +36,7 @@ public class StatTrackerSprintAttack extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.sprintAttack", totalDamageDealt); + tag.putDouble(BloodMagic.MODID + ".tracker.sprintAttack", totalDamageDealt); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java index 657edb74..5a55d555 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java @@ -39,7 +39,7 @@ public class StatTrackerStepAssist extends StatTracker { @Override public void writeToNBT(CompoundNBT tag) { - tag.setDouble(BloodMagic.MODID + ".tracker.stepAssist", totalMovement); + tag.putDouble(BloodMagic.MODID + ".tracker.stepAssist", totalMovement); } diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java index 827bc8c8..ec34a3cc 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java @@ -54,12 +54,12 @@ public class LivingArmourUpgradeFireResist extends LivingArmourUpgrade { @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(Constants.NBT.UPGRADE_FIRE_TIMER, fireCooldown); + tag.putInt(Constants.NBT.UPGRADE_FIRE_TIMER, fireCooldown); } @Override public void readFromNBT(CompoundNBT tag) { - fireCooldown = tag.getInteger(Constants.NBT.UPGRADE_FIRE_TIMER); + fireCooldown = tag.getInt(Constants.NBT.UPGRADE_FIRE_TIMER); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java index 6e198169..ffea15d0 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java @@ -50,12 +50,12 @@ public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade { @Override public void readFromNBT(CompoundNBT tag) { - deathTimer = tag.getInteger(BloodMagic.MODID + ".tracker.grimReaper"); + deathTimer = tag.getInt(BloodMagic.MODID + ".tracker.grimReaper"); } @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.grimReaper", deathTimer); + tag.putInt(BloodMagic.MODID + ".tracker.grimReaper", deathTimer); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java index 23620d2a..87e2d273 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java @@ -55,12 +55,12 @@ public class LivingArmourUpgradePoisonResist extends LivingArmourUpgrade { @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(Constants.NBT.UPGRADE_POISON_TIMER, poisonCooldown); + tag.putInt(Constants.NBT.UPGRADE_POISON_TIMER, poisonCooldown); } @Override public void readFromNBT(CompoundNBT tag) { - poisonCooldown = tag.getInteger(Constants.NBT.UPGRADE_POISON_TIMER); + poisonCooldown = tag.getInt(Constants.NBT.UPGRADE_POISON_TIMER); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java index 71e0f1ff..36b8ad84 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java @@ -58,12 +58,12 @@ public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade { @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger("repairingDelay", delay); + tag.putInt("repairingDelay", delay); } @Override public void readFromNBT(CompoundNBT tag) { - delay = tag.getInteger("repairingDelay"); + delay = tag.getInt("repairingDelay"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java index 810a9673..81be945d 100644 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java @@ -64,12 +64,12 @@ public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { @Override public void writeToNBT(CompoundNBT tag) { - tag.setInteger(BloodMagic.MODID + ".tracker.solarPowered", counter); + tag.putInt(BloodMagic.MODID + ".tracker.solarPowered", counter); } @Override public void readFromNBT(CompoundNBT tag) { - counter = tag.getInteger(BloodMagic.MODID + ".tracker.solarPowered"); + counter = tag.getInt(BloodMagic.MODID + ".tracker.solarPowered"); } @Override diff --git a/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java index 5b5d1595..324c4d0f 100644 --- a/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java +++ b/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java @@ -51,7 +51,7 @@ public class PlayerVelocityPacketProcessor implements IMessage, IMessageHandler< @SideOnly(Side.CLIENT) public void onMessageFromServer() { - PlayerEntity player = Minecraft.getMinecraft().player; + PlayerEntity player = Minecraft.getInstance().player; player.motionX = motionX; player.motionY = motionY; player.motionZ = motionZ; diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java index 0c97612e..be6b60bf 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java @@ -88,7 +88,7 @@ public class BMPotionUtils { NBTHelper.checkNBT(flaskStack); CompoundNBT tag = flaskStack.getTagCompound(); - tag.setDouble(Constants.NBT.POTION_AUGMENT_LENGHT + potion.getName(), value); + tag.putDouble(Constants.NBT.POTION_AUGMENT_LENGHT + potion.getName(), value); } public static int getAugmentedLength(int originalLength, double lengthAugment, double powerAugment) { @@ -113,7 +113,7 @@ public class BMPotionUtils { nbttaglist.appendTag(potioneffect.writeCustomPotionEffectToNBT(new CompoundNBT())); } - nbttagcompound.setTag("CustomPotionEffects", nbttaglist); + nbttagcompound.putTag("CustomPotionEffects", nbttaglist); stack.setTagCompound(nbttagcompound); return stack; } diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java b/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java index 4aa8bb2c..cc29bc82 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java @@ -49,7 +49,7 @@ public class PotionBloodMagic extends Effect { @Override @SideOnly(Side.CLIENT) public int getStatusIconIndex() { - Minecraft.getMinecraft().renderEngine.bindTexture(texture); + Minecraft.getInstance().renderEngine.bindTexture(texture); return super.getStatusIconIndex(); } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 31c3d98e..4cd83fb9 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -87,7 +87,7 @@ public class ClientProxy extends CommonProxy { @Override public void init() { super.init(); - Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> + Minecraft.getInstance().getItemColors().registerItemColorHandler((stack, tintIndex) -> { try { if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.COLOR)) @@ -98,7 +98,7 @@ public class ClientProxy extends CommonProxy { } return -1; }, RegistrarBloodMagicItems.SIGIL_HOLDING); - Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> + Minecraft.getInstance().getItemColors().registerItemColorHandler((stack, tintIndex) -> { if (tintIndex != 0 && tintIndex != 2) return -1; @@ -108,7 +108,7 @@ public class ClientProxy extends CommonProxy { return PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromStack(stack)); }, RegistrarBloodMagicItems.POTION_FLASK); - Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> + Minecraft.getInstance().getItemColors().registerItemColorHandler((stack, tintIndex) -> { // if (tintIndex != 0 && tintIndex != 2) // return -1; @@ -127,7 +127,7 @@ public class ClientProxy extends CommonProxy { } private void addElytraLayer() { - EntityRendererManager renderManager = Minecraft.getMinecraft().getRenderManager(); + 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"))); diff --git a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java index cba24d19..a4117e2f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java @@ -206,18 +206,18 @@ public abstract class AreaDescriptor implements Iterator { @Override public void readFromNBT(CompoundNBT tag) { - minimumOffset = new BlockPos(tag.getInteger(Constants.NBT.X_COORD + "min"), tag.getInteger(Constants.NBT.Y_COORD + "min"), tag.getInteger(Constants.NBT.Z_COORD + "min")); - maximumOffset = new BlockPos(tag.getInteger(Constants.NBT.X_COORD + "max"), tag.getInteger(Constants.NBT.Y_COORD + "max"), tag.getInteger(Constants.NBT.Z_COORD + "max")); + 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.setInteger(Constants.NBT.X_COORD + "min", minimumOffset.getX()); - tag.setInteger(Constants.NBT.Y_COORD + "min", minimumOffset.getY()); - tag.setInteger(Constants.NBT.Z_COORD + "min", minimumOffset.getZ()); - tag.setInteger(Constants.NBT.X_COORD + "max", maximumOffset.getX()); - tag.setInteger(Constants.NBT.Y_COORD + "max", maximumOffset.getY()); - tag.setInteger(Constants.NBT.Z_COORD + "max", maximumOffset.getZ()); + 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 diff --git a/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java index cebfc676..1b47776e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java @@ -1,7 +1,7 @@ package WayofTime.bloodmagic.ritual; import net.minecraft.nbt.ByteNBT; -import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.INBT; import net.minecraft.util.Direction; import net.minecraftforge.common.capabilities.Capability; @@ -10,12 +10,12 @@ import java.util.concurrent.Callable; public final class CapabilityRuneType { public static class RuneTypeStorage implements Capability.IStorage { @Override - public NBTBase writeNBT(Capability capability, IRitualStone.Tile instance, Direction side) { + 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, NBTBase nbt) { + public void readNBT(Capability capability, IRitualStone.Tile instance, Direction side, INBT nbt) { instance.setRuneType(EnumRuneType.byMetadata(((ByteNBT) nbt).getByte())); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java index eb0734d6..585c1e33 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java @@ -48,7 +48,7 @@ public enum EnumRuneType implements IStringSerializable, ISubItem { public ItemStack getStack(int count) { ItemStack ret = new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, count, ordinal()); CompoundNBT tag = new CompoundNBT(); - tag.setInteger(Constants.NBT.USES, 10); + tag.putInt(Constants.NBT.USES, 10); ret.setTagCompound(tag); return ret; } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java index 26d7f834..f4a1f8d4 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java @@ -50,16 +50,16 @@ public abstract class Ritual { } public void readFromNBT(CompoundNBT tag) { - ListNBT tags = tag.getTagList("areas", 10); + ListNBT tags = tag.getList("areas", 10); if (tags.isEmpty()) { return; } - for (int i = 0; i < tags.tagCount(); i++) { - CompoundNBT newTag = tags.getCompoundTagAt(i); + for (int i = 0; i < tags.size(); i++) { + CompoundNBT newTag = tags.getCompound(i); String rangeKey = newTag.getString("key"); - CompoundNBT storedTag = newTag.getCompoundTag("area"); + CompoundNBT storedTag = newTag.getCompound("area"); AreaDescriptor desc = this.getBlockRange(rangeKey); if (desc != null) { desc.readFromNBT(storedTag); @@ -72,17 +72,17 @@ public abstract class Ritual { for (Entry entry : modableRangeMap.entrySet()) { CompoundNBT newTag = new CompoundNBT(); - newTag.setString("key", entry.getKey()); + newTag.putString("key", entry.getKey()); CompoundNBT storedTag = new CompoundNBT(); entry.getValue().writeToNBT(storedTag); - newTag.setTag("area", storedTag); + newTag.put("area", storedTag); - tags.appendTag(newTag); + tags.add(newTag); } - tag.setTag("areas", tags); + tag.put("areas", tags); } /** diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java index a5df2590..2cd14840 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java @@ -7,6 +7,6 @@ public abstract class RitualRenderer { public abstract void renderAt(IMasterRitualStone masterRitualStone, double x, double y, double z); protected void bindTexture(ResourceLocation resourceLocation) { - Minecraft.getMinecraft().getTextureManager().bindTexture(resourceLocation); + Minecraft.getInstance().getTextureManager().bindTexture(resourceLocation); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java index a77b9506..30dbc856 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java @@ -52,7 +52,7 @@ public class RitualForsakenSoul extends Ritual { for (int i = 0; i < MAX_UNIQUENESS; i++) { String key = "uniq" + i; if (tag.hasKey(key)) { - keyList.add(tag.getInteger(key)); + keyList.add(tag.getInt(key)); } } } @@ -61,12 +61,12 @@ public class RitualForsakenSoul extends Ritual { public void writeToNBT(CompoundNBT tag) { super.writeToNBT(tag); - tag.setDouble("willBuffer", willBuffer); - tag.setDouble("crystalBuffer", crystalBuffer); + 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.setInteger(key, keyList.get(i)); + tag.putInt(key, keyList.get(i)); } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java index dcf2d4d7..4fa5220c 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java @@ -128,14 +128,14 @@ public class RitualLivingArmourDowngrade extends Ritual { public void readFromNBT(CompoundNBT tag) { super.readFromNBT(tag); - this.internalTimer = tag.getInteger("internalTimer"); + this.internalTimer = tag.getInt("internalTimer"); } @Override public void writeToNBT(CompoundNBT tag) { super.writeToNBT(tag); - tag.setInteger("internalTimer", internalTimer); + tag.putInt("internalTimer", internalTimer); } public ItemStack getStackFromItemFrame(World world, BlockPos masterPos, Direction direction) { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java index c64a1713..1a85c233 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java @@ -88,7 +88,7 @@ public class RitualPortal extends Ritual { } if (LocationsHandler.getLocationsHandler().addLocation(name, new PortalLocation(x, y + 1, z, world.provider.getDimension()))) { - portalRitualTag.setString(PORTAL_ID_TAG, name); + portalRitualTag.putString(PORTAL_ID_TAG, name); return true; } } @@ -210,14 +210,14 @@ public class RitualPortal extends Ritual { public void readFromNBT(CompoundNBT tag) { super.readFromNBT(tag); - portalRitualTag = tag.getCompoundTag(PORTAL_NBT_TAG); + portalRitualTag = tag.getCompound(PORTAL_NBT_TAG); } @Override public void writeToNBT(CompoundNBT tag) { super.writeToNBT(tag); - tag.setTag(PORTAL_NBT_TAG, portalRitualTag); + tag.put(PORTAL_NBT_TAG, portalRitualTag); } public BlockState getBlockState(World world, int x, int y, int z) { diff --git a/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java index 84c06e33..884431b0 100644 --- a/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java +++ b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java @@ -54,7 +54,7 @@ public class DemonWillHolder { } public void readFromNBT(CompoundNBT tag, String key) { - CompoundNBT willTag = tag.getCompoundTag(key); + CompoundNBT willTag = tag.getCompound(key); willMap.clear(); @@ -69,10 +69,10 @@ public class DemonWillHolder { public void writeToNBT(CompoundNBT tag, String key) { CompoundNBT willTag = new CompoundNBT(); for (Entry entry : willMap.entrySet()) { - willTag.setDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); + willTag.putDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); } - tag.setTag(key, willTag); + tag.put(key, willTag); } public void clearWill() { diff --git a/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java b/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java index 8854afb6..86f5898f 100644 --- a/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java +++ b/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java @@ -41,6 +41,6 @@ public enum EnumDemonWillType implements IStringSerializable, ISubItem { @Nonnull @Override public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, count, ordinal()); + return new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, count); } } diff --git a/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java b/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java index 37460c8f..91e41cac 100644 --- a/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java +++ b/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java @@ -26,11 +26,11 @@ public class PortalLocation implements Serializable { public CompoundNBT writeToNBT(CompoundNBT tag) { CompoundNBT locationTag = new CompoundNBT(); - locationTag.setInteger(Constants.NBT.X_COORD, x); - locationTag.setInteger(Constants.NBT.Y_COORD, y); - locationTag.setInteger(Constants.NBT.Z_COORD, z); - locationTag.setInteger(Constants.NBT.DIMENSION_ID, dimension); - tag.setTag(Constants.NBT.PORTAL_LOCATION, locationTag); + 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; } @@ -82,8 +82,8 @@ public class PortalLocation implements Serializable { public static PortalLocation readFromNBT(CompoundNBT tag) { if (tag.hasKey(Constants.NBT.PORTAL_LOCATION)) { - CompoundNBT locationTag = tag.getCompoundTag(Constants.NBT.PORTAL_LOCATION); - return new PortalLocation(locationTag.getInteger(Constants.NBT.X_COORD), locationTag.getInteger(Constants.NBT.Y_COORD), locationTag.getInteger(Constants.NBT.Z_COORD), locationTag.getInteger(Constants.NBT.DIMENSION_ID)); + 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/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 8f753ecf..b4d528b1 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -41,7 +41,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche public void deserialize(CompoundNBT tagCompound) { super.deserialize(tagCompound); this.isActive = tagCompound.getBoolean("isActive"); - this.activeCounter = tagCompound.getInteger("activeCounter"); + this.activeCounter = tagCompound.getInt("activeCounter"); this.key = tagCompound.getString("key"); if (!tagCompound.hasKey("doDropIngredients")) //Check if the array is old { @@ -49,7 +49,7 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche } else { this.doDropIngredients = tagCompound.getBoolean("doDropIngredients"); } - this.rotation = Direction.HORIZONTALS[tagCompound.getInteger(Constants.NBT.DIRECTION)]; + this.rotation = Direction.HORIZONTALS[tagCompound.getInt(Constants.NBT.DIRECTION)]; CompoundNBT arrayTag = tagCompound.getCompoundTag("arrayTag"); arrayEffect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(key); @@ -61,17 +61,17 @@ public class TileAlchemyArray extends TileInventory implements ITickable, IAlche @Override public CompoundNBT serialize(CompoundNBT tagCompound) { super.serialize(tagCompound); - tagCompound.setBoolean("isActive", isActive); - tagCompound.setInteger("activeCounter", activeCounter); - tagCompound.setString("key", "".equals(key) ? "empty" : key); - tagCompound.setBoolean("doDropIngredients", doDropIngredients); - tagCompound.setInteger(Constants.NBT.DIRECTION, rotation.getHorizontalIndex()); + 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 = new CompoundNBT(); if (arrayEffect != null) { arrayEffect.writeToNBT(arrayTag); } - tagCompound.setTag("arrayTag", arrayTag); + tagCompound.putTag("arrayTag", arrayTag); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 9b9aec1a..fb5a286c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -73,11 +73,11 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, super.deserialize(tag); isSlave = tag.getBoolean("isSlave"); - direction = Direction.byIndex(tag.getInteger(Constants.NBT.DIRECTION)); - connectedPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD)); + 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.getInteger("burnTime"); - ticksRequired = tag.getInteger("ticksRequired"); + burnTime = tag.getInt("burnTime"); + ticksRequired = tag.getInt("ticksRequired"); byte[] array = tag.getByteArray("blockedSlots"); for (int i = 0; i < array.length; i++) @@ -88,20 +88,20 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); - tag.setBoolean("isSlave", isSlave); - tag.setInteger(Constants.NBT.DIRECTION, direction.getIndex()); - tag.setInteger(Constants.NBT.X_COORD, connectedPos.getX()); - tag.setInteger(Constants.NBT.Y_COORD, connectedPos.getY()); - tag.setInteger(Constants.NBT.Z_COORD, connectedPos.getZ()); + 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.setInteger("burnTime", burnTime); - tag.setInteger("ticksRequired", ticksRequired); + 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.setByteArray("blockedSlots", blockedSlotArray); + tag.putByteArray("blockedSlots", blockedSlotArray); return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java index 35dc8cdf..eb8eb4be 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java @@ -37,7 +37,7 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickable { CompoundNBT altarTag = new CompoundNBT(); this.bloodAltar.writeToNBT(altarTag); - tagCompound.setTag("bloodAltar", altarTag); + tagCompound.putTag("bloodAltar", altarTag); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java index 8a7cfe0d..a1ccbbeb 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java @@ -28,7 +28,7 @@ public class TileBloodTank extends TileBase { public void deserialize(CompoundNBT tagCompound) { super.deserialize(tagCompound); tank.readFromNBT(tagCompound.getCompoundTag(Constants.NBT.TANK)); - capacity = tagCompound.getInteger(Constants.NBT.ALTAR_CAPACITY); + capacity = tagCompound.getInt(Constants.NBT.ALTAR_CAPACITY); tank.setCapacity(capacity); } @@ -36,8 +36,8 @@ public class TileBloodTank extends TileBase { public CompoundNBT serialize(CompoundNBT tagCompound) { super.serialize(tagCompound); if (tank.getFluidAmount() != 0) - tagCompound.setTag(Constants.NBT.TANK, tank.writeToNBT(new CompoundNBT())); - tagCompound.setInteger(Constants.NBT.ALTAR_CAPACITY, capacity); + tagCompound.putTag(Constants.NBT.TANK, tank.writeToNBT(new CompoundNBT())); + tagCompound.putInt(Constants.NBT.ALTAR_CAPACITY, capacity); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index 6f4ba7f7..92c8721b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -107,7 +107,7 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo super.serialize(tag); for (Entry entry : willMap.entrySet()) { - tag.setDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); + tag.putDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); } return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java index 125d3557..22037b11 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java @@ -147,17 +147,17 @@ public class TileDemonCrystal extends TileTicking { @Override public void deserialize(CompoundNBT tag) { holder.readFromNBT(tag, "Will"); - crystalCount = tag.getInteger("crystalCount"); - placement = Direction.byIndex(tag.getInteger("placement")); + 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.setInteger("crystalCount", crystalCount); - tag.setInteger("placement", placement.getIndex()); - tag.setDouble("progress", progressToNextCrystal); + tag.putInt("crystalCount", crystalCount); + tag.putInt("placement", placement.getIndex()); + tag.putDouble("progress", progressToNextCrystal); return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java index fe9137c4..00e80f0b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java @@ -73,7 +73,7 @@ public class TileDemonCrystallizer extends TileTicking implements IDemonWillCond @Override public CompoundNBT serialize(CompoundNBT tag) { holder.writeToNBT(tag, "Will"); - tag.setDouble("internalCounter", internalCounter); + tag.putDouble("internalCounter", internalCounter); return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java index afabdfe7..f450095d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java @@ -15,17 +15,17 @@ public class TileDimensionalPortal extends TileBase { public void deserialize(CompoundNBT tagCompound) { portalID = tagCompound.getString(RitualPortal.PORTAL_ID_TAG); - masterStoneX = tagCompound.getInteger("masterStoneX"); - masterStoneY = tagCompound.getInteger("masterStoneY"); - masterStoneZ = tagCompound.getInteger("masterStoneZ"); + masterStoneX = tagCompound.getInt("masterStoneX"); + masterStoneY = tagCompound.getInt("masterStoneY"); + masterStoneZ = tagCompound.getInt("masterStoneZ"); } public CompoundNBT serialize(CompoundNBT tagCompound) { - tagCompound.setString(RitualPortal.PORTAL_ID_TAG, Strings.isNullOrEmpty(portalID) ? "" : portalID); + tagCompound.putString(RitualPortal.PORTAL_ID_TAG, Strings.isNullOrEmpty(portalID) ? "" : portalID); - tagCompound.setInteger("masterStoneX", masterStoneX); - tagCompound.setInteger("masterStoneY", masterStoneY); - tagCompound.setInteger("masterStoneZ", masterStoneZ); + tagCompound.putInt("masterStoneX", masterStoneX); + tagCompound.putInt("masterStoneY", masterStoneY); + tagCompound.putInt("masterStoneZ", masterStoneZ); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java index 1f645991..6a417023 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java @@ -70,8 +70,8 @@ public class TileIncenseAltar extends TileInventory implements ITickable { @Override public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); - tag.setDouble("tranquility", tranquility); - tag.setDouble("incenseAddition", incenseAddition); + tag.putDouble("tranquility", tranquility); + tag.putDouble("incenseAddition", incenseAddition); return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index 5d6607f0..dc3ae9da 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -57,7 +57,7 @@ public class TileInventory extends TileBase implements IInventory { for (int i = 0; i < tags.tagCount(); i++) { if (!isSyncedSlot(i)) { - CompoundNBT data = tags.getCompoundTagAt(i); + CompoundNBT data = tags.getCompound(i); byte j = data.getByte("Slot"); if (j >= 0 && j < inventory.size()) { @@ -81,7 +81,7 @@ public class TileInventory extends TileBase implements IInventory { } } - tagCompound.setTag("Items", tags); + tagCompound.putTag("Items", tags); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java index 41ee1d2f..491a7cb6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java @@ -203,8 +203,8 @@ public class TileInversionPillar extends TileTicking { type = EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); currentInversion = tag.getDouble("currentInversion"); - currentInfectionRadius = tag.getInteger("currentInfectionRadius"); - consecutiveFailedChecks = tag.getInteger("consecutiveFailedChecks"); + currentInfectionRadius = tag.getInt("currentInfectionRadius"); + consecutiveFailedChecks = tag.getInt("consecutiveFailedChecks"); animationOffsetValue = tag.getFloat("animationOffset"); animationOffset.setValue(animationOffsetValue); @@ -214,11 +214,11 @@ public class TileInversionPillar extends TileTicking { public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); - tag.setString(Constants.NBT.WILL_TYPE, type.toString()); - tag.setDouble("currentInversion", currentInversion); - tag.setInteger("currentInfectionRadius", currentInfectionRadius); - tag.setInteger("consecutiveFailedChecks", consecutiveFailedChecks); - tag.setFloat("animationOffset", animationOffsetValue); + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java index ac7531db..ce5a84c0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java @@ -79,14 +79,14 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS cachedNetwork = NetworkHelper.getSoulNetwork(owner); currentRitual = BloodMagic.RITUAL_MANAGER.getRitual(tag.getString(Constants.NBT.CURRENT_RITUAL)); if (currentRitual != null) { - CompoundNBT ritualTag = tag.getCompoundTag(Constants.NBT.CURRENT_RITUAL_TAG); + CompoundNBT ritualTag = tag.getCompound(Constants.NBT.CURRENT_RITUAL_TAG); if (!ritualTag.isEmpty()) { currentRitual.readFromNBT(ritualTag); } } active = tag.getBoolean(Constants.NBT.IS_RUNNING); - activeTime = tag.getInteger(Constants.NBT.RUNTIME); - direction = Direction.VALUES[tag.getInteger(Constants.NBT.DIRECTION)]; + 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()) { @@ -100,20 +100,20 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS public CompoundNBT serialize(CompoundNBT tag) { String ritualId = BloodMagic.RITUAL_MANAGER.getId(getCurrentRitual()); if (owner != null) - tag.setUniqueId("owner", owner); - tag.setString(Constants.NBT.CURRENT_RITUAL, Strings.isNullOrEmpty(ritualId) ? "" : ritualId); + 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.setTag(Constants.NBT.CURRENT_RITUAL_TAG, ritualTag); + tag.put(Constants.NBT.CURRENT_RITUAL_TAG, ritualTag); } - tag.setBoolean(Constants.NBT.IS_RUNNING, isActive()); - tag.setInteger(Constants.NBT.RUNTIME, getActiveTime()); - tag.setInteger(Constants.NBT.DIRECTION, direction.getIndex()); - tag.setBoolean(Constants.NBT.IS_REDSTONED, redstoned); + 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.setBoolean("EnumWill" + type, true); + tag.putBoolean("EnumWill" + type, true); } return tag; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index 88829e15..6e5fd68a 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -256,24 +256,24 @@ public class TileMimic extends TileInventory implements ITickable { super.deserialize(tag); dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); - tileTag = tag.getCompoundTag("tileTag"); + tileTag = tag.getCompound("tileTag"); stateOfReplacedBlock = StateUtil.parseState(tag.getString("stateOfReplacedBlock")); mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, stateOfReplacedBlock); - playerCheckRadius = tag.getInteger("playerCheckRadius"); - potionSpawnRadius = tag.getInteger("potionSpawnRadius"); - potionSpawnInterval = Math.max(1, tag.getInteger("potionSpawnInterval")); + 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.setBoolean("dropItemsOnBreak", dropItemsOnBreak); - tag.setTag("tileTag", tileTag); - tag.setInteger("playerCheckRadius", playerCheckRadius); - tag.setInteger("potionSpawnRadius", potionSpawnRadius); - tag.setInteger("potionSpawnInterval", potionSpawnInterval); - tag.setString("stateOfReplacedBlock", stateOfReplacedBlock.toString()); + 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; } @@ -320,9 +320,9 @@ public class TileMimic extends TileInventory implements ITickable { if (world.setBlockState(pos, state, 3)) { TileEntity tile = world.getTileEntity(pos); if (tile != null) { - tileTag.setInteger("x", pos.getX()); - tileTag.setInteger("y", pos.getY()); - tileTag.setInteger("z", pos.getZ()); + tileTag.putInt("x", pos.getX()); + tileTag.putInt("y", pos.getY()); + tileTag.putInt("z", pos.getZ()); tile.readFromNBT(tileTag); } @@ -346,9 +346,9 @@ public class TileMimic extends TileInventory implements ITickable { if (tag != null) { CompoundNBT copyTag = tag.copy(); - copyTag.setInteger("x", pos.getX()); - copyTag.setInteger("y", pos.getY()); - copyTag.setInteger("z", pos.getZ()); + copyTag.putInt("x", pos.getX()); + copyTag.putInt("y", pos.getY()); + copyTag.putInt("z", pos.getZ()); tile.readFromNBT(copyTag); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java index b9e2ad30..553fc9bf 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java @@ -18,12 +18,12 @@ public class TilePhantomBlock extends TileTicking { @Override public void deserialize(CompoundNBT tagCompound) { - this.ticksRemaining = tagCompound.getInteger(Constants.NBT.TICKS_REMAINING); + this.ticksRemaining = tagCompound.getInt(Constants.NBT.TICKS_REMAINING); } @Override public CompoundNBT serialize(CompoundNBT tagCompound) { - tagCompound.setInteger(Constants.NBT.TICKS_REMAINING, ticksRemaining); + tagCompound.putInt(Constants.NBT.TICKS_REMAINING, ticksRemaining); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java index e4a74df2..6710da46 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -74,9 +74,9 @@ public class TilePurificationAltar extends TileInventory implements ITickable { public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); - tag.setDouble("totalPurity", totalPurity); - tag.setDouble("maxPurity", maxPurity); - tag.setDouble("purityRate", purityRate); + 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 1ceab097..8d1b7807 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -37,14 +37,14 @@ public class TileSoulForge extends TileInventory implements ITickable, IDemonWil public void deserialize(CompoundNBT tag) { super.deserialize(tag); - burnTime = tag.getInteger(Constants.NBT.SOUL_FORGE_BURN); + burnTime = tag.getInt(Constants.NBT.SOUL_FORGE_BURN); } @Override public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); - tag.setInteger(Constants.NBT.SOUL_FORGE_BURN, burnTime); + tag.putInt(Constants.NBT.SOUL_FORGE_BURN, burnTime); return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java index 54475123..4d5d1eef 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java @@ -22,16 +22,16 @@ public class TileSpectralBlock extends TileTicking { @Override public void deserialize(CompoundNBT tagCompound) { - ticksRemaining = tagCompound.getInteger(Constants.NBT.TICKS_REMAINING); + ticksRemaining = tagCompound.getInt(Constants.NBT.TICKS_REMAINING); containedBlockName = tagCompound.getString(Constants.NBT.CONTAINED_BLOCK_NAME); - containedBlockMeta = tagCompound.getInteger(Constants.NBT.CONTAINED_BLOCK_META); + containedBlockMeta = tagCompound.getInt(Constants.NBT.CONTAINED_BLOCK_META); } @Override public CompoundNBT serialize(CompoundNBT tagCompound) { - tagCompound.setInteger(Constants.NBT.TICKS_REMAINING, ticksRemaining); - tagCompound.setString(Constants.NBT.CONTAINED_BLOCK_NAME, Strings.isNullOrEmpty(containedBlockName) ? "" : containedBlockName); - tagCompound.setInteger(Constants.NBT.CONTAINED_BLOCK_META, containedBlockMeta); + 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; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java index 30009812..a6d19da3 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java @@ -37,13 +37,13 @@ public class TileTeleposer extends TileInventory implements ITickable { @Override public void deserialize(CompoundNBT tagCompound) { super.deserialize(tagCompound); - previousInput = tagCompound.getInteger(Constants.NBT.PREVIOUS_INPUT); + previousInput = tagCompound.getInt(Constants.NBT.PREVIOUS_INPUT); } @Override public CompoundNBT serialize(CompoundNBT tagCompound) { super.serialize(tagCompound); - tagCompound.setInteger(Constants.NBT.PREVIOUS_INPUT, previousInput); + tagCompound.putInt(Constants.NBT.PREVIOUS_INPUT, previousInput); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java index 8a05ad0e..257b1487 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java @@ -16,22 +16,23 @@ import net.minecraftforge.fml.relauncher.SideOnly; * Handles data syncing and core data writing/reading. */ public class TileBase extends TileEntity { + @Override - public final void readFromNBT(CompoundNBT compound) { - super.readFromNBT(compound); - deserializeBase(compound); - deserialize(compound); + public final void deserializeNBT(CompoundNBT nbt) { + super.deserializeNBT(nbt); + deserializeBase(nbt); + deserialize(nbt); } @Override - public final CompoundNBT writeToNBT(CompoundNBT compound) { - super.writeToNBT(compound); - serializeBase(compound); - return serialize(compound); + public final CompoundNBT serializeNBT() { + CompoundNBT tag = super.serializeNBT(); + serializeBase(tag); + return serialize(tag); } /** - * Called by {@link #readFromNBT(CompoundNBT)} + * Called by {@link #deserializeNBT(CompoundNBT)} *

        * Internal data (such as coordinates) are handled for you. Just read the data you need. * @@ -52,7 +53,7 @@ public class TileBase extends TileEntity { } /** - * Called by {@link #writeToNBT(CompoundNBT)} + * Called by {@link #serializeNBT()} *

        * Internal data (such as coordinates) are handled for you. Just read the data you need. * @@ -89,14 +90,14 @@ public class TileBase extends TileEntity { @Override public final SUpdateTileEntityPacket getUpdatePacket() { - return new SUpdateTileEntityPacket(getPos(), -999, writeToNBT(new CompoundNBT())); + return new SUpdateTileEntityPacket(getPos(), -999, serializeNBT()); } @Override @SideOnly(Side.CLIENT) public final void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { super.onDataPacket(net, pkt); - readFromNBT(pkt.getNbtCompound()); + deserialize(pkt.getNbtCompound()); onDataPacketClientReceived(); } @@ -109,11 +110,11 @@ public class TileBase extends TileEntity { @Override public final CompoundNBT getUpdateTag() { - return writeToNBT(new CompoundNBT()); + return serializeNBT(); } @Override public final void handleUpdateTag(CompoundNBT tag) { - readFromNBT(tag); + deserializeNBT(tag); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java index 33c18025..85e3154d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java @@ -1,18 +1,18 @@ package WayofTime.bloodmagic.tile.base; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ITickable; +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 ITickable { +public abstract class TileTicking extends TileBase implements ITickableTileEntity { private int ticksExisted; private boolean shouldTick = true; @Override - public final void update() { + public final void tick() { if (shouldTick()) { ticksExisted++; onUpdate(); @@ -21,14 +21,14 @@ public abstract class TileTicking extends TileBase implements ITickable { @Override void deserializeBase(CompoundNBT tagCompound) { - this.ticksExisted = tagCompound.getInteger("ticksExisted"); + this.ticksExisted = tagCompound.getInt("ticksExisted"); this.shouldTick = tagCompound.getBoolean("shouldTick"); } @Override CompoundNBT serializeBase(CompoundNBT tagCompound) { - tagCompound.setInteger("ticksExisted", getTicksExisted()); - tagCompound.setBoolean("shouldTick", shouldTick()); + tagCompound.putInt("ticksExisted", getTicksExisted()); + tagCompound.putBoolean("shouldTick", shouldTick()); return tagCompound; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java index ccadc1e4..b22c997f 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java @@ -44,18 +44,18 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn @Override public void deserialize(CompoundNBT tag) { super.deserialize(tag); - currentActiveSlot = tag.getInteger("currentSlot"); + 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.getTagList("Items", 10); + 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.getCompoundTagAt(i); + CompoundNBT data = tags.getCompound(i); byte j = data.getByte("Slot"); if (j == 0) { @@ -73,9 +73,9 @@ public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedIn @Override public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); - tag.setInteger("currentSlot", currentActiveSlot); - tag.setIntArray(Constants.NBT.ROUTING_PRIORITY, priorities); - tag.setBoolean("updated", true); + tag.putInt("currentSlot", currentActiveSlot); + tag.putIntArray(Constants.NBT.ROUTING_PRIORITY, priorities); + tag.putBoolean("updated", true); return tag; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index a0457aee..5391ee41 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -191,32 +191,32 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti ListNBT tags = new ListNBT(); for (BlockPos pos : generalNodeList) { CompoundNBT posTag = new CompoundNBT(); - posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); - posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); - posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + 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.setTag(Constants.NBT.ROUTING_MASTER_GENERAL, tags); + tag.put(Constants.NBT.ROUTING_MASTER_GENERAL, tags); tags = new ListNBT(); for (BlockPos pos : inputNodeList) { CompoundNBT posTag = new CompoundNBT(); - posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); - posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); - posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + 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.setTag(Constants.NBT.ROUTING_MASTER_INPUT, tags); + tag.put(Constants.NBT.ROUTING_MASTER_INPUT, tags); tags = new ListNBT(); for (BlockPos pos : outputNodeList) { CompoundNBT posTag = new CompoundNBT(); - posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); - posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); - posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + 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.setTag(Constants.NBT.ROUTING_MASTER_OUTPUT, tags); + tag.put(Constants.NBT.ROUTING_MASTER_OUTPUT, tags); return tag; } @@ -224,24 +224,24 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti public void deserialize(CompoundNBT tag) { super.deserialize(tag); - ListNBT tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); + ListNBT tags = tag.getList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); for (int i = 0; i < tags.tagCount(); i++) { - CompoundNBT blockTag = tags.getCompoundTagAt(i); - BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); + 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.getTagList(Constants.NBT.ROUTING_MASTER_INPUT, 10); + tags = tag.getList(Constants.NBT.ROUTING_MASTER_INPUT, 10); for (int i = 0; i < tags.tagCount(); i++) { - CompoundNBT blockTag = tags.getCompoundTagAt(i); - BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); + 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.getTagList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); + tags = tag.getList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); for (int i = 0; i < tags.tagCount(); i++) { - CompoundNBT blockTag = tags.getCompoundTagAt(i); - BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); + 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); } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java index fb402861..3fa08545 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -39,20 +39,20 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte public CompoundNBT serialize(CompoundNBT tag) { super.serialize(tag); CompoundNBT masterTag = new CompoundNBT(); - masterTag.setInteger(Constants.NBT.X_COORD, masterPos.getX()); - masterTag.setInteger(Constants.NBT.Y_COORD, masterPos.getY()); - masterTag.setInteger(Constants.NBT.Z_COORD, masterPos.getZ()); - tag.setTag(Constants.NBT.ROUTING_MASTER, masterTag); + 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.setInteger(Constants.NBT.X_COORD, pos.getX()); - posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); - posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); - tags.appendTag(posTag); + 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.setTag(Constants.NBT.ROUTING_CONNECTION, tags); + tag.put(Constants.NBT.ROUTING_CONNECTION, tags); return tag; } @@ -60,13 +60,13 @@ public class TileRoutingNode extends TileInventory implements IRoutingNode, IIte public void deserialize(CompoundNBT tag) { super.deserialize(tag); connectionList.clear(); - CompoundNBT masterTag = tag.getCompoundTag(Constants.NBT.ROUTING_MASTER); - masterPos = new BlockPos(masterTag.getInteger(Constants.NBT.X_COORD), masterTag.getInteger(Constants.NBT.Y_COORD), masterTag.getInteger(Constants.NBT.Z_COORD)); + 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.getTagList(Constants.NBT.ROUTING_CONNECTION, 10); - for (int i = 0; i < tags.tagCount(); i++) { - CompoundNBT blockTag = tags.getCompoundTagAt(i); - BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(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); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java index 68428f47..8a792f99 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java @@ -20,7 +20,7 @@ public class ChatUtil { private static int lastAdded; private static void sendNoSpamMessages(ITextComponent[] messages) { - NewChatGui chat = Minecraft.getMinecraft().ingameGUI.getChatGUI(); + NewChatGui chat = Minecraft.getInstance().ingameGUI.getChatGUI(); for (int i = DELETION_ID + messages.length - 1; i <= lastAdded; i++) { chat.deleteChatLine(i); } @@ -219,7 +219,7 @@ public class ChatUtil { public static class Handler implements IMessageHandler { @Override public IMessage onMessage(final PacketNoSpamChat message, MessageContext ctx) { - Minecraft.getMinecraft().addScheduledTask(() -> sendNoSpamMessages(message.chatLines)); + Minecraft.getInstance().addScheduledTask(() -> sendNoSpamMessages(message.chatLines)); return null; } } diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java index cb1ef51b..5621e3f0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java @@ -9,14 +9,14 @@ public class GhostItemHelper { NBTHelper.checkNBT(stack); CompoundNBT tag = stack.getTagCompound(); - tag.setInteger(Constants.NBT.GHOST_STACK_SIZE, amount); + tag.putInt(Constants.NBT.GHOST_STACK_SIZE, amount); } public static int getItemGhostAmount(ItemStack stack) { NBTHelper.checkNBT(stack); CompoundNBT tag = stack.getTagCompound(); - return tag.getInteger(Constants.NBT.GHOST_STACK_SIZE); + return tag.getInt(Constants.NBT.GHOST_STACK_SIZE); } public static boolean hasGhostAmount(ItemStack stack) { diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index b8bddf1f..06fd87a4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -68,7 +68,7 @@ public class ClientHandler { public static TextureAtlasSprite bloodStoneBrick; public static TextureAtlasSprite beacon; public static TextureAtlasSprite crystalCluster; - public static Minecraft minecraft = Minecraft.getMinecraft(); + public static Minecraft minecraft = Minecraft.getInstance(); private static TileMasterRitualStone mrsHoloTile; private static Ritual mrsHoloRitual; private static Direction mrsHoloDirection; @@ -93,7 +93,7 @@ public class ClientHandler { @SubscribeEvent public static void onSoundEvent(PlaySoundEvent event) { - PlayerEntity player = Minecraft.getMinecraft().player; + PlayerEntity player = Minecraft.getInstance().player; if (player != null && player.isPotionActive(RegistrarBloodMagic.DEAFNESS)) { event.setResultSound(null); } @@ -146,7 +146,7 @@ public class ClientHandler { @SubscribeEvent public static void onMouseEvent(MouseEvent event) { - ClientPlayerEntity player = Minecraft.getMinecraft().player; + ClientPlayerEntity player = Minecraft.getInstance().player; if (event.getDwheel() != 0 && player != null && player.isSneaking()) { ItemStack stack = player.getHeldItemMainhand(); 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 acfda0d0..0380cf30 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -143,7 +143,7 @@ public class WillHandler { WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.x, loc.z); if (ac != null) { - nbt.setShort("base", ac.getBase()); + nbt.putShort("base", ac.getBase()); ac.getCurrentWill().writeToNBT(nbt, "current"); if (!event.getChunk().isLoaded()) WorldDemonWillHandler.removeWillChunk(dim, loc.x, loc.z); diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java index 760bf085..a0e53917 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java @@ -93,7 +93,7 @@ public class ItemHelper { NBTHelper.checkNBT(stack); CompoundNBT tag = stack.getTagCompound(); - tag.setString("key", key); + tag.putString("key", key); } } @@ -113,7 +113,7 @@ public class ItemHelper { NBTHelper.checkNBT(stack); CompoundNBT tag = stack.getTagCompound(); - tag.setInteger("level", level); + tag.putInt("level", level); } } @@ -122,7 +122,7 @@ public class ItemHelper { NBTHelper.checkNBT(stack); CompoundNBT tag = stack.getTagCompound(); - return tag.getInteger("level"); + return tag.getInt("level"); } return 0; From 0e02b983f101aded5976eb4f60ee0db39edbc318 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Wed, 30 Oct 2019 21:25:48 -0700 Subject: [PATCH 443/595] Add missing gradle file --- gradle/process_mod_info.gradle | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 gradle/process_mod_info.gradle diff --git a/gradle/process_mod_info.gradle b/gradle/process_mod_info.gradle new file mode 100644 index 00000000..bd9371de --- /dev/null +++ b/gradle/process_mod_info.gradle @@ -0,0 +1,28 @@ +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 From d617911d7a401e4eda08f23075e6523c588761f5 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 24 Oct 2020 08:59:04 -0400 Subject: [PATCH 444/595] 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 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 YQ11q9HCZqq5yS?3c7g?yQycc}zf%9XmjD0& delta 33455 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 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 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�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 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 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 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 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 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% Date: Sat, 24 Oct 2020 09:00:46 -0400 Subject: [PATCH 445/595] Readded the fancier README Readded the fancier README file so that TehNut wouldn't laugh at my ineptitude. --- README.md | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++ README.txt | 53 ----------------------- 2 files changed, 120 insertions(+), 53 deletions(-) create mode 100644 README.md delete mode 100644 README.txt diff --git a/README.md b/README.md new file mode 100644 index 00000000..c945030e --- /dev/null +++ b/README.md @@ -0,0 +1,120 @@ +# 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 deleted file mode 100644 index 6904b377..00000000 --- a/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -------------------------------------------- -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 From 1f0dcb608a4fc3daeba604e22e348147df951163 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 24 Oct 2020 14:50:25 -0400 Subject: [PATCH 446/595] Initial Work on Rituals Added the framework for Rituals, including the automatic registration of rituals using the annotation. This includes: - The Master Ritual Stone - The regular Ritual Stones (all 7 types) - The Ritual Registration system - The activation crystal items. - Reintroduction of the Demon Will Aura (changed saved Dimension ID from Integer to ResourceLocation) Localization needs to be completed, as well as the implementation of all the rituals. --- src/generated/resources/.cache/cache | 28 + .../blockstates/airritualstone.json | 7 + .../blockstates/duskritualstone.json | 7 + .../blockstates/earthritualstone.json | 7 + .../blockstates/fireritualstone.json | 7 + .../blockstates/lightritualstone.json | 7 + .../bloodmagic/blockstates/ritualstone.json | 7 + .../blockstates/waterritualstone.json | 7 + .../models/block/airritualstone.json | 6 + .../models/block/duskritualstone.json | 6 + .../models/block/earthritualstone.json | 6 + .../models/block/fireritualstone.json | 6 + .../models/block/lightritualstone.json | 6 + .../bloodmagic/models/block/ritualstone.json | 6 + .../models/block/waterritualstone.json | 6 + .../models/item/airritualstone.json | 3 + .../models/item/duskritualstone.json | 3 + .../models/item/earthritualstone.json | 3 + .../models/item/fireritualstone.json | 3 + .../models/item/lightritualstone.json | 3 + .../bloodmagic/models/item/ritualstone.json | 3 + .../models/item/waterritualstone.json | 3 + .../loot_tables/blocks/airritualstone.json | 19 + .../loot_tables/blocks/duskritualstone.json | 19 + .../loot_tables/blocks/earthritualstone.json | 19 + .../loot_tables/blocks/fireritualstone.json | 19 + .../loot_tables/blocks/lightritualstone.json | 19 + .../loot_tables/blocks/ritualstone.json | 19 + .../loot_tables/blocks/waterritualstone.json | 19 + .../java/WayofTime/bloodmagic/BloodMagic.java | 7 +- .../block/enums/EnumRitualController.java | 23 + .../common/block/BlockMasterRitualStone.java | 130 ++++ .../common/block/BlockRitualStone.java | 89 +++ .../common/block/BloodMagicBlocks.java | 11 + .../common/data/GeneratorBlockStates.java | 7 + .../common/data/GeneratorItemModels.java | 8 + .../common/data/GeneratorLootTable.java | 34 +- .../common/item/BloodMagicItems.java | 11 + .../common/item/ItemActivationCrystal.java | 72 ++ .../wayoftime/bloodmagic/demonaura/PosXY.java | 76 ++ .../bloodmagic/demonaura/WillChunk.java | 72 ++ .../bloodmagic/demonaura/WillWorld.java | 49 ++ .../demonaura/WorldDemonWillHandler.java | 218 ++++++ .../bloodmagic/event/RitualEvent.java | 151 ++++ .../bloodmagic/ritual/AreaDescriptor.java | 654 ++++++++++++++++++ .../bloodmagic/ritual/CapabilityRuneType.java | 58 ++ .../ritual/EnumReaderBoundaries.java | 22 + .../bloodmagic/ritual/EnumRuneType.java | 54 ++ .../bloodmagic/ritual/IMasterRitualStone.java | 81 +++ .../bloodmagic/ritual/IRitualStone.java | 20 + .../wayoftime/bloodmagic/ritual/Ritual.java | 427 ++++++++++++ .../bloodmagic/ritual/RitualComponent.java | 70 ++ .../bloodmagic/ritual/RitualManager.java | 177 +++++ .../bloodmagic/ritual/RitualRegister.java | 58 ++ .../bloodmagic/ritual/RitualRenderer.java | 14 + .../imperfect/IImperfectRitualStone.java | 20 + .../ritual/imperfect/ImperfectRitual.java | 108 +++ .../bloodmagic/ritual/types/RitualWater.java | 85 +++ .../tile/TileMasterRitualStone.java | 566 +++++++++++++++ .../bloodmagic/tile/base/TileTicking.java | 71 ++ .../bloodmagic/util/helper/RitualHelper.java | 253 +++++++ 61 files changed, 3943 insertions(+), 26 deletions(-) create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/airritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/duskritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/earthritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/fireritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/lightritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/ritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/waterritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/airritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/duskritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/earthritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/fireritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/lightritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/ritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/waterritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/airritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/duskritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/earthritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/fireritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/lightritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/ritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/waterritualstone.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/airritualstone.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/duskritualstone.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/earthritualstone.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/fireritualstone.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/lightritualstone.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/ritualstone.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/waterritualstone.json create mode 100644 src/main/java/wayoftime/bloodmagic/block/enums/EnumRitualController.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockRitualStone.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java create mode 100644 src/main/java/wayoftime/bloodmagic/demonaura/PosXY.java create mode 100644 src/main/java/wayoftime/bloodmagic/demonaura/WillChunk.java create mode 100644 src/main/java/wayoftime/bloodmagic/demonaura/WillWorld.java create mode 100644 src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java create mode 100644 src/main/java/wayoftime/bloodmagic/event/RitualEvent.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/AreaDescriptor.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/CapabilityRuneType.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/EnumReaderBoundaries.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/EnumRuneType.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/IMasterRitualStone.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/IRitualStone.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/Ritual.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/RitualComponent.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/RitualManager.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/RitualRegister.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/RitualRenderer.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/imperfect/ImperfectRitual.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/types/RitualWater.java create mode 100644 src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java create mode 100644 src/main/java/wayoftime/bloodmagic/tile/base/TileTicking.java create mode 100644 src/main/java/wayoftime/bloodmagic/util/helper/RitualHelper.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 3d4fa05e..79d86fc3 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1,27 +1,42 @@ cb435652c27b4978d8db83af2fd531ccaa82ada7 assets/bloodmagic/blockstates/accelerationrune.json +43be0406da1c9f7cf734427bea235a65cda073d2 assets/bloodmagic/blockstates/airritualstone.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 +ba1cd8a9475212843e3b26232c8a9943fa0d2d20 assets/bloodmagic/blockstates/duskritualstone.json +bb3db171734f511fc0c259d86e869b49aa1d0c77 assets/bloodmagic/blockstates/earthritualstone.json +e780d6d9e891082dc6ce83fde1697ce36281a02a assets/bloodmagic/blockstates/fireritualstone.json +002795212cc7bf2cad2a91f873d85e2204c6367d assets/bloodmagic/blockstates/lightritualstone.json 372ecd737f7082a4c2c70e46745f893b1179f885 assets/bloodmagic/blockstates/orbcapacityrune.json +90daa355e528ab8a6582f796951201882f3c56da assets/bloodmagic/blockstates/ritualstone.json 285618c1a8ec36e36d479f577190579ae7616529 assets/bloodmagic/blockstates/sacrificerune.json b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json 487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json +e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json f7a92ca94cbd68344d89b92dc6c26c15cd1b85b5 assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json +bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.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 +81313327125e6e7396df0408595228bf0f63e1c9 assets/bloodmagic/models/block/duskritualstone.json +c30064f4aa09c42d23e94d118ae5b148eadb3a6c assets/bloodmagic/models/block/earthritualstone.json +4ff1cab1014cd8f655e5f032ecf60dd371f421c3 assets/bloodmagic/models/block/fireritualstone.json +2e1a81c758bfeec2aee807b48239f23241302268 assets/bloodmagic/models/block/lightritualstone.json c3a813b735cd229f8597e41d04465926b2e65fe1 assets/bloodmagic/models/block/orbcapacityrune.json +9b2bf2a44b788cbaecbe63a3e085e8de76672e1b assets/bloodmagic/models/block/ritualstone.json a8a1d06fcc2f8395530c72d2846133fff37d5537 assets/bloodmagic/models/block/sacrificerune.json 791c9f2e27215ff0a45eed7efe385276bfc09aed assets/bloodmagic/models/block/selfsacrificerune.json 65fe5e01ed2660e45a5c329ff2389a87e4d791ec assets/bloodmagic/models/block/speedrune.json +6041f2e47f5437d90a58586e42d18dadc42df439 assets/bloodmagic/models/block/waterritualstone.json 9462d62d9bc9408359d30728de8651dc104aacf1 assets/bloodmagic/models/item/accelerationrune.json +fe8e3deb3ad0107ca3ebd70694c1fc55a987d912 assets/bloodmagic/models/item/airritualstone.json 17cbe9142ef3950ea1b6be11694b849f55e93f13 assets/bloodmagic/models/item/airsigil.json f150f178edf7d6d250bcfd84af1c28a21cff09c6 assets/bloodmagic/models/item/altarcapacityrune.json 866b8cdd3da56e2e82dbd5f16ab5117b5a503749 assets/bloodmagic/models/item/apprenticebloodorb.json @@ -40,11 +55,15 @@ f404148f9df3a61da3c18175885ffa56b2a85a6a assets/bloodmagic/models/item/daggerofs 9671199681493a396e07d7bcab20137c22d981d5 assets/bloodmagic/models/item/demonslate.json 7af07ab578bbd20e2f834b26d9cafb5fe23bc7d4 assets/bloodmagic/models/item/dislocationrune.json f4531e22aa1db1cff324db5ccb344d3b9fa85c8d assets/bloodmagic/models/item/divinationsigil.json +10aceefca3ad3f0da773cb317c4effc6c06051ea assets/bloodmagic/models/item/duskritualstone.json +4d56efd7fdbf430f49903ce201577047687c3804 assets/bloodmagic/models/item/earthritualstone.json 4c39378f6c14dc243a7d52564e5a21df94683415 assets/bloodmagic/models/item/etherealslate.json +c36bde4f98c0aeb3bf0f369ad3bc067e5f0dc916 assets/bloodmagic/models/item/fireritualstone.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 +5a76914a87fc9b99079bb6afed1d4cfe3e4a532e assets/bloodmagic/models/item/lightritualstone.json 15d8178b626da912334774142d40d1012fb21fa0 assets/bloodmagic/models/item/magicianbloodorb.json 0a3566d3c86403f24c22977dd32ffaec727a9ad3 assets/bloodmagic/models/item/masterbloodorb.json 7596826c5b40c2809eb0a42eb5f5f2089290e3e5 assets/bloodmagic/models/item/miningsigil.json @@ -58,6 +77,7 @@ baafdb5915c5fbc99b84a54670ed64a6f26cb0fe assets/bloodmagic/models/item/reagentma 95b2925e96a7df71d72568e0ed7b03290293cbe7 assets/bloodmagic/models/item/reagentvoid.json fd1447d943ddc4540a51a72dcbb245d77d45da71 assets/bloodmagic/models/item/reagentwater.json 50bf796adbed412488df48ed9250fc9b0ecd851f assets/bloodmagic/models/item/reinforcedslate.json +2722891c9c40b124d85bf9ff8eb885e175f5e6ff assets/bloodmagic/models/item/ritualstone.json db73abb3bcb1731b6fc389e3577910b6aab87b10 assets/bloodmagic/models/item/sacrificerune.json 9403d6195d4d38d5876c2a42f4edfb9bdcd05210 assets/bloodmagic/models/item/sacrificialdagger.json cc71421e98ee7ee047a4cfbb6cb69529c2b02d4e assets/bloodmagic/models/item/selfsacrificerune.json @@ -102,6 +122,7 @@ ec6f6bf7f520182b2044f3cc5a10f1d4c7a8d7ab assets/bloodmagic/models/item/variants/ 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 +a31019db55828cb937a071ac2f74b125a2d0c955 assets/bloodmagic/models/item/waterritualstone.json 7426fed5f833ce3d08602f727f1467dd3e107991 assets/bloodmagic/models/item/watersigil.json f72efc172699d43405019add97f455bd6b7f452b assets/bloodmagic/models/item/weakbloodorb.json 828c0f89e747d48d37c6a86030a8ec59ca5c29cb data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json @@ -116,6 +137,7 @@ e897d6f91e2a0bd12b0da0a50e5c897294989e7c data/bloodmagic/advancements/recipes/bl 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 +26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/airritualstone.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 @@ -124,11 +146,17 @@ e897d6f91e2a0bd12b0da0a50e5c897294989e7c data/bloodmagic/advancements/recipes/bl f1a8e3131d85077665563372cad868534a72fb31 data/bloodmagic/loot_tables/blocks/bloodlight.json 779b809a2a51e6dab46f9e6799249f2f14653ebb data/bloodmagic/loot_tables/blocks/chargingrune.json a9fcfc656fab957328c10ee1d9d33807e697b7f7 data/bloodmagic/loot_tables/blocks/dislocationrune.json +26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/duskritualstone.json +26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/earthritualstone.json +26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/fireritualstone.json +26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/lightritualstone.json 95442c1bb740fab2eb8ee051f7184813f6023afa data/bloodmagic/loot_tables/blocks/orbcapacityrune.json +26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/ritualstone.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 +26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/waterritualstone.json f41b0e9dfab608c42a85c3c5c5bbc050b03f02a1 data/bloodmagic/recipes/altar/apprenticebloodorb.json 2a67e37497a571b5ee944375d315fddccea87697 data/bloodmagic/recipes/altar/daggerofsacrifice.json c5a4a256a7437f2e13c574a6f0c4d75fc2e718cb data/bloodmagic/recipes/altar/demonicslate.json diff --git a/src/generated/resources/assets/bloodmagic/blockstates/airritualstone.json b/src/generated/resources/assets/bloodmagic/blockstates/airritualstone.json new file mode 100644 index 00000000..a64ce156 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/airritualstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/airritualstone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/duskritualstone.json b/src/generated/resources/assets/bloodmagic/blockstates/duskritualstone.json new file mode 100644 index 00000000..474324b4 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/duskritualstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/duskritualstone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/earthritualstone.json b/src/generated/resources/assets/bloodmagic/blockstates/earthritualstone.json new file mode 100644 index 00000000..75d2c5eb --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/earthritualstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/earthritualstone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/fireritualstone.json b/src/generated/resources/assets/bloodmagic/blockstates/fireritualstone.json new file mode 100644 index 00000000..33e7f1b2 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/fireritualstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/fireritualstone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/lightritualstone.json b/src/generated/resources/assets/bloodmagic/blockstates/lightritualstone.json new file mode 100644 index 00000000..d198280b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/lightritualstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/lightritualstone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/ritualstone.json b/src/generated/resources/assets/bloodmagic/blockstates/ritualstone.json new file mode 100644 index 00000000..8f09bcba --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/ritualstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/ritualstone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/waterritualstone.json b/src/generated/resources/assets/bloodmagic/blockstates/waterritualstone.json new file mode 100644 index 00000000..35b1d3aa --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/waterritualstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/waterritualstone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/airritualstone.json b/src/generated/resources/assets/bloodmagic/models/block/airritualstone.json new file mode 100644 index 00000000..428b9552 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/airritualstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/airritualstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/duskritualstone.json b/src/generated/resources/assets/bloodmagic/models/block/duskritualstone.json new file mode 100644 index 00000000..ecfcfa10 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/duskritualstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/duskritualstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/earthritualstone.json b/src/generated/resources/assets/bloodmagic/models/block/earthritualstone.json new file mode 100644 index 00000000..e0949faa --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/earthritualstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/earthritualstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/fireritualstone.json b/src/generated/resources/assets/bloodmagic/models/block/fireritualstone.json new file mode 100644 index 00000000..1661fe87 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/fireritualstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/fireritualstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/lightritualstone.json b/src/generated/resources/assets/bloodmagic/models/block/lightritualstone.json new file mode 100644 index 00000000..89bce579 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/lightritualstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/lightritualstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/ritualstone.json b/src/generated/resources/assets/bloodmagic/models/block/ritualstone.json new file mode 100644 index 00000000..ca5b7b23 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/ritualstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/ritualstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/waterritualstone.json b/src/generated/resources/assets/bloodmagic/models/block/waterritualstone.json new file mode 100644 index 00000000..1222a06c --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/waterritualstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/waterritualstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/airritualstone.json b/src/generated/resources/assets/bloodmagic/models/item/airritualstone.json new file mode 100644 index 00000000..a32ef885 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/airritualstone.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/airritualstone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/duskritualstone.json b/src/generated/resources/assets/bloodmagic/models/item/duskritualstone.json new file mode 100644 index 00000000..289ff1ee --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/duskritualstone.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/duskritualstone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/earthritualstone.json b/src/generated/resources/assets/bloodmagic/models/item/earthritualstone.json new file mode 100644 index 00000000..3758ede0 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/earthritualstone.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/earthritualstone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/fireritualstone.json b/src/generated/resources/assets/bloodmagic/models/item/fireritualstone.json new file mode 100644 index 00000000..6eef57c2 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/fireritualstone.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/fireritualstone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/lightritualstone.json b/src/generated/resources/assets/bloodmagic/models/item/lightritualstone.json new file mode 100644 index 00000000..96ca64a5 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/lightritualstone.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/lightritualstone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/ritualstone.json b/src/generated/resources/assets/bloodmagic/models/item/ritualstone.json new file mode 100644 index 00000000..4dea1d50 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/ritualstone.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/ritualstone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/waterritualstone.json b/src/generated/resources/assets/bloodmagic/models/item/waterritualstone.json new file mode 100644 index 00000000..4c02099f --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/waterritualstone.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/waterritualstone" +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/airritualstone.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/airritualstone.json new file mode 100644 index 00000000..e8935390 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/airritualstone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:ritualstone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/duskritualstone.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/duskritualstone.json new file mode 100644 index 00000000..e8935390 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/duskritualstone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:ritualstone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/earthritualstone.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/earthritualstone.json new file mode 100644 index 00000000..e8935390 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/earthritualstone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:ritualstone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/fireritualstone.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/fireritualstone.json new file mode 100644 index 00000000..e8935390 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/fireritualstone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:ritualstone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/lightritualstone.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/lightritualstone.json new file mode 100644 index 00000000..e8935390 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/lightritualstone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:ritualstone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/ritualstone.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/ritualstone.json new file mode 100644 index 00000000..e8935390 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/ritualstone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:ritualstone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/waterritualstone.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/waterritualstone.json new file mode 100644 index 00000000..e8935390 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/waterritualstone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:ritualstone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ 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 3ad54158..fb69752f 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -49,6 +49,7 @@ 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.ritual.RitualManager; import wayoftime.bloodmagic.tile.TileAlchemyArray; import wayoftime.bloodmagic.tile.TileAltar; import wayoftime.bloodmagic.tile.TileSoulForge; @@ -66,6 +67,7 @@ public class BloodMagic private static Gson GSON = null; public static final BloodMagicPacketHandler packetHandler = new BloodMagicPacketHandler(); + public static final RitualManager RITUAL_MANAGER = new RitualManager(); public BloodMagic() { @@ -134,8 +136,11 @@ public class BloodMagic public void onLoadComplete(FMLLoadCompleteEvent event) { OrbRegistry.tierMap.put(BloodMagicItems.ORB_WEAK.get().getTier(), new ItemStack(BloodMagicItems.WEAK_BLOOD_ORB.get())); + OrbRegistry.tierMap.put(BloodMagicItems.ORB_APPRENTICE.get().getTier(), new ItemStack(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())); + OrbRegistry.tierMap.put(BloodMagicItems.ORB_MAGICIAN.get().getTier(), new ItemStack(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())); + OrbRegistry.tierMap.put(BloodMagicItems.ORB_MASTER.get().getTier(), new ItemStack(BloodMagicItems.MASTER_BLOOD_ORB.get())); BloodMagicCorePlugin.INSTANCE.register(BloodMagicAPI.INSTANCE); - + RITUAL_MANAGER.discover(); } public void registerTileEntityTypes(RegistryEvent.Register> event) diff --git a/src/main/java/wayoftime/bloodmagic/block/enums/EnumRitualController.java b/src/main/java/wayoftime/bloodmagic/block/enums/EnumRitualController.java new file mode 100644 index 00000000..29948a7a --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/block/enums/EnumRitualController.java @@ -0,0 +1,23 @@ +package wayoftime.bloodmagic.block.enums; + +import java.util.Locale; + +import net.minecraft.util.IStringSerializable; + +//TODO: Will want to probably discontinue this due to The Flattening +public enum EnumRitualController implements IStringSerializable +{ + MASTER, IMPERFECT, INVERTED,; + + @Override + public String toString() + { + return name().toLowerCase(Locale.ENGLISH); + } + + @Override + public String getString() + { + return this.toString(); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java new file mode 100644 index 00000000..7fb09854 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java @@ -0,0 +1,130 @@ +package wayoftime.bloodmagic.common.block; + +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.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.util.math.BlockRayTraceResult; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.item.ItemActivationCrystal; +import wayoftime.bloodmagic.iface.IBindable; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.tile.TileMasterRitualStone; +import wayoftime.bloodmagic.util.helper.RitualHelper; + +public class BlockMasterRitualStone extends Block +{ + public final boolean isInverted; + + public BlockMasterRitualStone(boolean isInverted) + { + super(Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(2)); + this.isInverted = isInverted; + } + + @Override + public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) + { + ItemStack heldItem = player.getHeldItem(hand); + TileEntity tile = world.getTileEntity(pos); + + if (tile instanceof TileMasterRitualStone) + { + if (heldItem.getItem() instanceof ItemActivationCrystal) + { + if (((IBindable) heldItem.getItem()).getBinding(heldItem) == null) + return ActionResultType.FAIL; + + 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 (isInverted) + ((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); + } + } + } + + return ActionResultType.FAIL; + } + + @Override + public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) + { + TileMasterRitualStone tile = (TileMasterRitualStone) world.getTileEntity(blockPos); + if (tile != null) + ((TileMasterRitualStone) tile).stopRitual(Ritual.BreakType.BREAK_MRS); + + 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 tile = worldIn.getTileEntity(pos); + if (tile instanceof TileMasterRitualStone) + { + ((TileMasterRitualStone) tile).stopRitual(Ritual.BreakType.BREAK_MRS); + } + + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } + + @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(BlockState state, IBlockReader world) + { + return new TileMasterRitualStone(); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockRitualStone.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockRitualStone.java new file mode 100644 index 00000000..d76bfe60 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockRitualStone.java @@ -0,0 +1,89 @@ +package wayoftime.bloodmagic.common.block; + +import java.util.List; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +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.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.ritual.EnumRuneType; +import wayoftime.bloodmagic.ritual.IRitualStone; + +public class BlockRitualStone extends Block implements IRitualStone +{ + private final EnumRuneType type; + + public BlockRitualStone(EnumRuneType type) + { + super(Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.STONE).harvestTool(ToolType.PICKAXE).harvestLevel(2)); + this.type = 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); + } + +// @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 type.equals(runeType); + } + + @Override + public void setRuneType(World world, BlockPos pos, EnumRuneType runeType) + { + Block runeBlock = this; + switch (type) + { + case AIR: + runeBlock = BloodMagicBlocks.AIR_RITUAL_STONE.get(); + break; + case BLANK: + runeBlock = BloodMagicBlocks.BLANK_RITUAL_STONE.get(); + break; + case DAWN: + runeBlock = BloodMagicBlocks.DAWN_RITUAL_STONE.get(); + break; + case DUSK: + runeBlock = BloodMagicBlocks.DUSK_RITUAL_STONE.get(); + break; + case EARTH: + runeBlock = BloodMagicBlocks.EARTH_RITUAL_STONE.get(); + break; + case FIRE: + runeBlock = BloodMagicBlocks.FIRE_RITUAL_STONE.get(); + break; + case WATER: + runeBlock = BloodMagicBlocks.WATER_RITUAL_STONE.get(); + break; + } + + BlockState newState = runeBlock.getDefaultState(); + world.setBlockState(pos, newState); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java index 955b36b8..48e0dc40 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java @@ -18,6 +18,7 @@ import net.minecraftforge.registries.ForgeRegistries; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.block.enums.BloodRuneType; import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.ritual.EnumRuneType; import wayoftime.bloodmagic.tile.contailer.ContainerSoulForge; public class BloodMagicBlocks @@ -48,6 +49,16 @@ public class BloodMagicBlocks public static final RegistryObject BLOOD_ALTAR = BLOCKS.register("altar", () -> new BlockAltar()); public static final RegistryObject BLOOD_LIGHT = BLOCKS.register("bloodlight", () -> new BlockBloodLight()); + public static final RegistryObject BLANK_RITUAL_STONE = BLOCKS.register("ritualstone", () -> new BlockRitualStone(EnumRuneType.BLANK)); + public static final RegistryObject AIR_RITUAL_STONE = BLOCKS.register("airritualstone", () -> new BlockRitualStone(EnumRuneType.AIR)); + public static final RegistryObject WATER_RITUAL_STONE = BLOCKS.register("waterritualstone", () -> new BlockRitualStone(EnumRuneType.WATER)); + public static final RegistryObject FIRE_RITUAL_STONE = BLOCKS.register("fireritualstone", () -> new BlockRitualStone(EnumRuneType.FIRE)); + public static final RegistryObject EARTH_RITUAL_STONE = BLOCKS.register("earthritualstone", () -> new BlockRitualStone(EnumRuneType.EARTH)); + public static final RegistryObject DUSK_RITUAL_STONE = BLOCKS.register("duskritualstone", () -> new BlockRitualStone(EnumRuneType.DUSK)); + public static final RegistryObject DAWN_RITUAL_STONE = BLOCKS.register("lightritualstone", () -> new BlockRitualStone(EnumRuneType.DAWN)); + + public static final RegistryObject MASTER_RITUAL_STONE = BASICBLOCKS.register("masterritualstone", () -> new BlockMasterRitualStone(false)); + 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); diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java index cbb374ea..04b013f1 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java @@ -28,6 +28,13 @@ public class GeneratorBlockStates extends BlockStateProvider } buildCubeAll(BloodMagicBlocks.BLOOD_LIGHT.get()); + buildCubeAll(BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + buildCubeAll(BloodMagicBlocks.AIR_RITUAL_STONE.get()); + buildCubeAll(BloodMagicBlocks.WATER_RITUAL_STONE.get()); + buildCubeAll(BloodMagicBlocks.FIRE_RITUAL_STONE.get()); + buildCubeAll(BloodMagicBlocks.EARTH_RITUAL_STONE.get()); + buildCubeAll(BloodMagicBlocks.DUSK_RITUAL_STONE.get()); + buildCubeAll(BloodMagicBlocks.DAWN_RITUAL_STONE.get()); } private void buildCubeAll(Block block) diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java index 06c2f49c..77739743 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java @@ -36,6 +36,14 @@ public class GeneratorItemModels extends ItemModelProvider registerBlockModel(block.get()); } + registerBlockModel(BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerBlockModel(BloodMagicBlocks.AIR_RITUAL_STONE.get()); + registerBlockModel(BloodMagicBlocks.WATER_RITUAL_STONE.get()); + registerBlockModel(BloodMagicBlocks.FIRE_RITUAL_STONE.get()); + registerBlockModel(BloodMagicBlocks.EARTH_RITUAL_STONE.get()); + registerBlockModel(BloodMagicBlocks.DUSK_RITUAL_STONE.get()); + registerBlockModel(BloodMagicBlocks.DAWN_RITUAL_STONE.get()); + registerToggleableItem(BloodMagicItems.GREEN_GROVE_SIGIL.get()); registerToggleableItem(BloodMagicItems.FAST_MINER_SIGIL.get()); registerToggleableItem(BloodMagicItems.MAGNETISM_SIGIL.get()); diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java index 5c4092c7..4115ea9a 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java @@ -49,33 +49,17 @@ public class GeneratorLootTable extends LootTableProvider this.registerDropSelfLootTable(block.get()); } - this.registerDropSelfLootTable(BloodMagicBlocks.BLOOD_ALTAR.get()); + 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()); - + registerDropSelfLootTable(BloodMagicBlocks.SOUL_FORGE.get()); + registerDropSelfLootTable(BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerDropping(BloodMagicBlocks.AIR_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerDropping(BloodMagicBlocks.WATER_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerDropping(BloodMagicBlocks.FIRE_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerDropping(BloodMagicBlocks.EARTH_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerDropping(BloodMagicBlocks.DUSK_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerDropping(BloodMagicBlocks.DAWN_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); } private void registerNoDropLootTable(Block block) diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java index 69855511..f79ae7b2 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java @@ -54,6 +54,13 @@ public class BloodMagicItems 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 BLANK_RITUAL_STONE_ITEM = ITEMS.register("ritualstone", () -> new BlockItem(BloodMagicBlocks.BLANK_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject AIR_RITUAL_STONE_ITEM = ITEMS.register("airritualstone", () -> new BlockItem(BloodMagicBlocks.AIR_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject WATER_RITUAL_STONE_ITEM = ITEMS.register("waterritualstone", () -> new BlockItem(BloodMagicBlocks.WATER_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject FIRE_RITUAL_STONE_ITEM = ITEMS.register("fireritualstone", () -> new BlockItem(BloodMagicBlocks.FIRE_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject EARTH_RITUAL_STONE_ITEM = ITEMS.register("earthritualstone", () -> new BlockItem(BloodMagicBlocks.EARTH_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject DUSK_RITUAL_STONE_ITEM = ITEMS.register("duskritualstone", () -> new BlockItem(BloodMagicBlocks.DUSK_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject DAWN_RITUAL_STONE_ITEM = ITEMS.register("lightritualstone", () -> new BlockItem(BloodMagicBlocks.DAWN_RITUAL_STONE.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))); @@ -87,6 +94,10 @@ public class BloodMagicItems public static final RegistryObject ARCANE_ASHES = BASICITEMS.register("arcaneashes", () -> new ItemArcaneAshes()); public static final RegistryObject DAGGER_OF_SACRIFICE = BASICITEMS.register("daggerofsacrifice", () -> new ItemDaggerOfSacrifice()); + public static final RegistryObject WEAK_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalweak", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.WEAK)); + public static final RegistryObject AWAKENED_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalawakened", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.AWAKENED)); + public static final RegistryObject CREATIVE_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalcreative", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.CREATIVE)); + // 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()); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java new file mode 100644 index 00000000..83d97492 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java @@ -0,0 +1,72 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.List; + +import javax.annotation.Nonnull; + +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 ItemActivationCrystal extends Item implements IBindable +{ + final CrystalType type; + + public ItemActivationCrystal(CrystalType 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) + { + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.activation_crystal." + type.name().toLowerCase())); + + if (!stack.hasTag()) + return; + + Binding binding = getBinding(stack); + if (binding != null) + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); + + super.addInformation(stack, world, tooltip, flag); + } + + public int getCrystalLevel(ItemStack stack) + { + return this.type.equals(CrystalType.CREATIVE) ? Integer.MAX_VALUE : type.ordinal() + 1; + } + + public enum CrystalType + { + WEAK, AWAKENED, CREATIVE,; + + @Nonnull + public static ItemStack getStack(int level) + { + if (level < 0) + { + level = 0; + } + switch (level) + { + case 0: + return new ItemStack(BloodMagicItems.WEAK_ACTIVATION_CRYSTAL.get()); + case 1: + return new ItemStack(BloodMagicItems.AWAKENED_ACTIVATION_CRYSTAL.get()); + default: + return new ItemStack(BloodMagicItems.CREATIVE_ACTIVATION_CRYSTAL.get()); + } + } + } +} \ 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 new file mode 100644 index 00000000..2e2fd6da --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/demonaura/PosXY.java @@ -0,0 +1,76 @@ +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; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/demonaura/WillChunk.java b/src/main/java/wayoftime/bloodmagic/demonaura/WillChunk.java new file mode 100644 index 00000000..f93cfb8f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/demonaura/WillChunk.java @@ -0,0 +1,72 @@ +package wayoftime.bloodmagic.demonaura; + +import java.lang.ref.WeakReference; + +import net.minecraft.world.chunk.Chunk; +import wayoftime.bloodmagic.will.DemonWillHolder; + +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.getPos().x, chunk.getPos().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().isModified(); + } + + 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; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/demonaura/WillWorld.java b/src/main/java/wayoftime/bloodmagic/demonaura/WillWorld.java new file mode 100644 index 00000000..b1f92d9a --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/demonaura/WillWorld.java @@ -0,0 +1,49 @@ +package wayoftime.bloodmagic.demonaura; + +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.util.ResourceLocation; + +public class WillWorld +{ + // TODO: It was noted I may need to use RegistryKey instead. + ResourceLocation dim; + ConcurrentHashMap willChunks = new ConcurrentHashMap<>(); + +// private static ConcurrentHashMap nodeTickets = new ConcurrentHashMap(); + + public WillWorld(ResourceLocation resourceLocation) + { + this.dim = resourceLocation; + } + + 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; +// } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java b/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java new file mode 100644 index 00000000..c26cf624 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java @@ -0,0 +1,218 @@ +package wayoftime.bloodmagic.demonaura; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.annotation.Nullable; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import wayoftime.bloodmagic.util.BMLog; +import wayoftime.bloodmagic.will.DemonWillHolder; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +public class WorldDemonWillHandler +{ + public static ConcurrentHashMap> dirtyChunks = new ConcurrentHashMap<>(); + static ConcurrentHashMap containedWills = new ConcurrentHashMap<>(); + + @Nullable + public static DemonWillHolder getWillHolder(ResourceLocation resourceLocation, int x, int y) + { + WillChunk chunk = getWillChunk(resourceLocation, x, y); + if (chunk != null) + { + return chunk.getCurrentWill(); + } + + return null; + } + + public static DemonWillHolder getWillHolder(World world, BlockPos pos) + { + return getWillHolder(getDimensionResourceLocation(world), pos.getX() >> 4, pos.getZ() >> 4); + } + + public static WillWorld getWillWorld(int dim) + { + return containedWills.get(dim); + } + + @Nullable + public static WillChunk getWillChunk(ResourceLocation resourceLocation, int x, int y) + { + if (!containedWills.containsKey(resourceLocation)) + { + addWillWorld(resourceLocation); + } + + return (containedWills.get(resourceLocation)).getWillChunkAt(x, y); + } + + public static void addWillWorld(ResourceLocation resourceLocation) + { + if (!containedWills.containsKey(resourceLocation)) + { + containedWills.put(resourceLocation, new WillWorld(resourceLocation)); + BMLog.DEBUG.info("Creating demon will cache for world {}", resourceLocation); + } + } + + public static void removeWillWorld(int dim) + { + containedWills.remove(dim); + BMLog.DEBUG.info("Removing demon will cache for world {}", dim); + } + + public static void addWillChunk(ResourceLocation resourceLocation, Chunk chunk, short base, DemonWillHolder currentWill) + { + WillWorld aw = containedWills.get(resourceLocation); + if (aw == null) + { + aw = new WillWorld(resourceLocation); + } + aw.getWillChunks().put(new PosXY(chunk.getPos().x, chunk.getPos().z), new WillChunk(chunk, base, currentWill)); + + containedWills.put(resourceLocation, aw); + } + + public static void removeWillChunk(ResourceLocation resourceLocation, int x, int y) + { + WillWorld aw = containedWills.get(resourceLocation); + if (aw != null) + { + WillChunk chunk = aw.getWillChunks().remove(new PosXY(x, y)); + if (chunk != null) + { + markChunkAsDirty(chunk, resourceLocation); + } + } + } + + 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, getDimensionResourceLocation(world)); + + 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, getDimensionResourceLocation(world)); + + 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, getDimensionResourceLocation(world)); + + return amount; + } + + public static WillChunk getWillChunk(World world, BlockPos pos) + { + WillChunk willChunk = getWillChunk(getDimensionResourceLocation(world), pos.getX() >> 4, pos.getZ() >> 4); + if (willChunk == null) + { + Chunk chunk = world.getChunk(pos.getX() >> 4, pos.getZ() >> 4); + generateWill(chunk); + + willChunk = getWillChunk(getDimensionResourceLocation(world), 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, ResourceLocation resourceLocation) + { + if (chunk.isModified()) + { + return; + } + PosXY pos = new PosXY(chunk.loc.x, chunk.loc.y); + if (!dirtyChunks.containsKey(resourceLocation)) + { + dirtyChunks.put(resourceLocation, new CopyOnWriteArrayList<>()); + } + CopyOnWriteArrayList dc = dirtyChunks.get(resourceLocation); + if (!dc.contains(pos)) + { + dc.add(pos); + } + } + + public static void generateWill(Chunk chunk) + { + addWillChunk(chunk.getWorld().getDimensionKey().getLocation(), chunk, (short) 1, new DemonWillHolder()); + } + + private static ResourceLocation getDimensionResourceLocation(World world) + { + return world.getDimensionKey().getLocation(); + } +} \ 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 new file mode 100644 index 00000000..f5356ec8 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/event/RitualEvent.java @@ -0,0 +1,151 @@ +package wayoftime.bloodmagic.event; + +import java.util.UUID; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; +import wayoftime.bloodmagic.ritual.IMasterRitualStone; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.imperfect.IImperfectRitualStone; +import wayoftime.bloodmagic.ritual.imperfect.ImperfectRitual; + +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; + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/AreaDescriptor.java b/src/main/java/wayoftime/bloodmagic/ritual/AreaDescriptor.java new file mode 100644 index 00000000..b37eeb80 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/AreaDescriptor.java @@ -0,0 +1,654 @@ +package wayoftime.bloodmagic.ritual; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +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 wayoftime.bloodmagic.util.Constants; + +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; + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/CapabilityRuneType.java b/src/main/java/wayoftime/bloodmagic/ritual/CapabilityRuneType.java new file mode 100644 index 00000000..258867c4 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/CapabilityRuneType.java @@ -0,0 +1,58 @@ +package wayoftime.bloodmagic.ritual; + +import java.util.concurrent.Callable; + +import net.minecraft.nbt.ByteNBT; +import net.minecraft.nbt.INBT; +import net.minecraft.util.Direction; +import net.minecraftforge.common.capabilities.Capability; + +public final class CapabilityRuneType +{ + public static class RuneTypeStorage implements Capability.IStorage + { + @Override + public INBT writeNBT(Capability capability, IRitualStone.Tile instance, Direction side) + { + return ByteNBT.valueOf((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(); + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/EnumReaderBoundaries.java b/src/main/java/wayoftime/bloodmagic/ritual/EnumReaderBoundaries.java new file mode 100644 index 00000000..3e664671 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/EnumReaderBoundaries.java @@ -0,0 +1,22 @@ +package wayoftime.bloodmagic.ritual; + +import java.util.Locale; + +import net.minecraft.util.IStringSerializable; + +public enum EnumReaderBoundaries implements IStringSerializable +{ + SUCCESS, VOLUME_TOO_LARGE, NOT_WITHIN_BOUNDARIES; + + @Override + public String toString() + { + return name().toLowerCase(Locale.ROOT); + } + + @Override + public String getString() + { + return toString(); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/EnumRuneType.java b/src/main/java/wayoftime/bloodmagic/ritual/EnumRuneType.java new file mode 100644 index 00000000..959e771d --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/EnumRuneType.java @@ -0,0 +1,54 @@ +package wayoftime.bloodmagic.ritual; + +import java.util.Locale; + +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.text.TextFormatting; + +public enum EnumRuneType implements IStringSerializable +{ + 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 getString() + { + return this.toString(); + } + +// @Nonnull +// 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.setTag(tag); +// return ret; +// } + + public static EnumRuneType byMetadata(int meta) + { + if (meta < 0 || meta >= values().length) + meta = 0; + + return values()[meta]; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/wayoftime/bloodmagic/ritual/IMasterRitualStone.java new file mode 100644 index 00000000..e82e2deb --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/IMasterRitualStone.java @@ -0,0 +1,81 @@ +package wayoftime.bloodmagic.ritual; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +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 wayoftime.bloodmagic.core.data.SoulNetwork; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +/** + * 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 new file mode 100644 index 00000000..a4409fe9 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/IRitualStone.java @@ -0,0 +1,20 @@ +package wayoftime.bloodmagic.ritual; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +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 new file mode 100644 index 00000000..0ecd8c43 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/Ritual.java @@ -0,0 +1,427 @@ +package wayoftime.bloodmagic.ritual; + +import java.util.ArrayList; +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; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +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 wayoftime.bloodmagic.demonaura.WorldDemonWillHandler; +import wayoftime.bloodmagic.will.DemonWillHolder; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +/** + * 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, + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/RitualComponent.java b/src/main/java/wayoftime/bloodmagic/ritual/RitualComponent.java new file mode 100644 index 00000000..0f34813f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/RitualComponent.java @@ -0,0 +1,70 @@ +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; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/RitualManager.java b/src/main/java/wayoftime/bloodmagic/ritual/RitualManager.java new file mode 100644 index 00000000..92b29583 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/RitualManager.java @@ -0,0 +1,177 @@ +package wayoftime.bloodmagic.ritual; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +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.fml.ModList; +import wayoftime.bloodmagic.ritual.imperfect.ImperfectRitual; +import wayoftime.bloodmagic.util.BMLog; + +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() + { + 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) + public void discover() + { + ModList.get().getAllScanData().forEach(scan -> { + scan.getAnnotations().forEach(a -> { + if (a.getAnnotationType().getClassName().equals(RitualRegister.class.getName())) + { + try + { + + Class clazz = Class.forName(a.getClassType().getClassName()); + RitualRegister ritualRegister = clazz.getAnnotation(RitualRegister.class); + String id = ritualRegister.value(); + if (Ritual.class.isAssignableFrom(clazz)) + { + Ritual ritual = (Ritual) clazz.newInstance(); + rituals.put(id, ritual); + ritualsReverse.put(ritual, id); + BMLog.DEBUG.info("Registered ritual {}", id); + } else + { + BMLog.DEFAULT.error("Error creating ritual instance for {}.", id); + } + } catch (Exception e) + { + e.printStackTrace(); + } + } + }); + }); + + ModList.get().getAllScanData().forEach(scan -> { + scan.getAnnotations().forEach(a -> { + if (a.getAnnotationType().getClassName().equals(RitualRegister.Imperfect.class.getName())) + { + try + { + + Class clazz = Class.forName(a.getClassType().getClassName()); + RitualRegister.Imperfect ritualRegister = clazz.getAnnotation(RitualRegister.Imperfect.class); + String id = ritualRegister.value(); + if (ImperfectRitual.class.isAssignableFrom(clazz)) + { + ImperfectRitual ritual = (ImperfectRitual) clazz.newInstance(); + imperfectRituals.put(id, ritual); + imperfectRitualsReverse.put(ritual, id); + BMLog.DEBUG.info("Registered imperfect ritual {}", id); + } else + { + BMLog.DEFAULT.error("Error creating imperfect ritual instance for {}.", id); + } + } catch (Exception 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; +// 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); + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/RitualRegister.java b/src/main/java/wayoftime/bloodmagic/ritual/RitualRegister.java new file mode 100644 index 00000000..56527fa6 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/RitualRegister.java @@ -0,0 +1,58 @@ +package wayoftime.bloodmagic.ritual; + +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; + +import wayoftime.bloodmagic.ritual.imperfect.ImperfectRitual; + +@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 new file mode 100644 index 00000000..a2172c45 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/RitualRenderer.java @@ -0,0 +1,14 @@ +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/imperfect/IImperfectRitualStone.java b/src/main/java/wayoftime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java new file mode 100644 index 00000000..856f5c60 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java @@ -0,0 +1,20 @@ +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 new file mode 100644 index 00000000..6fe28e1f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/imperfect/ImperfectRitual.java @@ -0,0 +1,108 @@ +package wayoftime.bloodmagic.ritual.imperfect; + +import java.util.function.Predicate; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.World; + +/** + * 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; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualWater.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualWater.java new file mode 100644 index 00000000..aa7d230f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualWater.java @@ -0,0 +1,85 @@ +package wayoftime.bloodmagic.ritual.types; + +import java.util.function.Consumer; + +import net.minecraft.block.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.ritual.AreaDescriptor; +import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.ritual.IMasterRitualStone; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.RitualComponent; +import wayoftime.bloodmagic.ritual.RitualRegister; + +@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.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/tile/TileMasterRitualStone.java b/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java new file mode 100644 index 00000000..5e6083b7 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java @@ -0,0 +1,566 @@ +package wayoftime.bloodmagic.tile; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.annotation.Nullable; + +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.tileentity.TileEntityType; +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 net.minecraftforge.registries.ObjectHolder; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.item.ItemActivationCrystal; +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.ritual.AreaDescriptor; +import wayoftime.bloodmagic.ritual.EnumReaderBoundaries; +import wayoftime.bloodmagic.ritual.IMasterRitualStone; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.tile.base.TileTicking; +import wayoftime.bloodmagic.util.ChatUtil; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.BindableHelper; +import wayoftime.bloodmagic.util.helper.NBTHelper; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; +import wayoftime.bloodmagic.util.helper.RitualHelper; +import wayoftime.bloodmagic.will.DemonWillHolder; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone +{ + @ObjectHolder("bloodmagic:masterritualstone") + public static TileEntityType TYPE; + 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<>(); + + public TileMasterRitualStone(TileEntityType type) + { + super(type); + } + + public TileMasterRitualStone() + { + this(TYPE); + } + + @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(ItemActivationCrystal.CrystalType.getStack(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.isCreative())) + { + 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.isCreative())) + 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/base/TileTicking.java b/src/main/java/wayoftime/bloodmagic/tile/base/TileTicking.java new file mode 100644 index 00000000..545dec20 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/tile/base/TileTicking.java @@ -0,0 +1,71 @@ +package wayoftime.bloodmagic.tile.base; + +import net.minecraft.client.renderer.texture.ITickable; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; + +/** + * 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 ITickable +{ + private int ticksExisted; + private boolean shouldTick = true; + + public TileTicking(TileEntityType type) + { + super(type); + } + + @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; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/util/helper/RitualHelper.java b/src/main/java/wayoftime/bloodmagic/util/helper/RitualHelper.java new file mode 100644 index 00000000..3862d73a --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/util/helper/RitualHelper.java @@ -0,0 +1,253 @@ +package wayoftime.bloodmagic.util.helper; + +import java.util.List; + +import org.apache.commons.lang3.tuple.Pair; + +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 net.minecraftforge.common.util.LazyOptional; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BlockRitualStone; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.ritual.IRitualStone; +import wayoftime.bloodmagic.ritual.IRitualStone.Tile; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.RitualComponent; +import wayoftime.bloodmagic.tile.TileMasterRitualStone; + +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 Direction. + * + * @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 (int i = 0; i < 4; i++) + { + Direction direction = Direction.byHorizontalIndex(i); + + if (checkValidRitual(world, pos, ritual, direction)) + return BloodMagic.RITUAL_MANAGER.getId(ritual); + } + } + + return ""; + } + + public static Direction getDirectionOfRitual(World world, BlockPos pos, Ritual ritual) + { + for (int i = 0; i < 4; i++) + { + Direction direction = Direction.byHorizontalIndex(i); + 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.getCapability(RUNE_CAPABILITY, null).isPresent()) + return tile.getCapability(RUNE_CAPABILITY, null).resolve().get().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.getCapability(RUNE_CAPABILITY, null).isPresent(); + + } + + 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 + { + LazyOptional cap = tile.getCapability(RUNE_CAPABILITY, null); + if (cap.isPresent()) + { + cap.resolve().get().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 = BloodMagicBlocks.MASTER_RITUAL_STONE.get().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); + ((BlockRitualStone) BloodMagicBlocks.BLANK_RITUAL_STONE.get()).setRuneType(world, newPos, component.getRuneType()); + } + } + + 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 (int i = 0; i < 4; i++) + { + Direction direction = Direction.byHorizontalIndex(i); + 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); + } +} From 446fe9cef773b912dbf45825bafc7ef062847d09 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 24 Oct 2020 14:53:54 -0400 Subject: [PATCH 447/595] rooBooli Fixed the improper files in the main directory so that they are not the default files from Forge. --- CREDITS.txt | 65 -- LICENSE | 87 ++ LICENSE.txt | 520 ------------ changelog.txt | 2261 ++++++++++++++++++++++++++----------------------- 4 files changed, 1295 insertions(+), 1638 deletions(-) delete mode 100644 CREDITS.txt create mode 100644 LICENSE delete mode 100644 LICENSE.txt diff --git a/CREDITS.txt b/CREDITS.txt deleted file mode 100644 index a70c53d5..00000000 --- a/CREDITS.txt +++ /dev/null @@ -1,65 +0,0 @@ -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 new file mode 100644 index 00000000..264519f7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,87 @@ +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 deleted file mode 100644 index b0cbe2b3..00000000 --- a/LICENSE.txt +++ /dev/null @@ -1,520 +0,0 @@ -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/changelog.txt b/changelog.txt index 64fa0593..98c18c43 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,1053 +1,1208 @@ -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. +------------------------------------------------------ +Version 2.4.3 +------------------------------------------------------ + +- Fixed Lava Crystals causing crash when used while not yet bound +- Fixed Teleposers sending entities at the destination position the wrong way +- Fixed Speed Runes not working on Tier 2 altars +- Fixed crash when checking tasks for some entities +- Fixed crash when checking some entities for potion effects +- Re-implemented the Boost potion + - The PR still had TODOs in the description when I merged so this may not be complete yet + +------------------------------------------------------ +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 +- From 85e47dbfa8548220273e252d348b123cd9c1425f Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 24 Oct 2020 22:37:04 -0400 Subject: [PATCH 448/595] Part 1 of reimplementing Ritual Diviner Finished the placement of the Ritual Stones from the ItemRitualDiviner. Still need to finish the rendering system for the ghost blocks. --- src/generated/resources/.cache/cache | 24 +- .../blockstates/masterritualstone.json | 7 + .../assets/bloodmagic/lang/en_us.json | 61 ++ .../models/block/masterritualstone.json | 6 + .../item/activationcrystalawakened.json | 6 + .../item/activationcrystalcreative.json | 6 + .../models/item/activationcrystalweak.json | 6 + .../bloodmagic/models/item/airscribetool.json | 6 + .../models/item/duskscribetool.json | 6 + .../models/item/earthscribetool.json | 6 + .../models/item/firescribetool.json | 6 + .../models/item/masterritualstone.json | 3 + .../bloodmagic/models/item/ritualdiviner.json | 6 + .../models/item/waterscribetool.json | 6 + .../bloodmagictab/ritual_stone_blank.json | 32 + .../bloodmagictab/ritual_stone_master.json | 32 + .../loot_tables/blocks/masterritualstone.json | 19 + .../bloodmagic/recipes/altar/air_tool.json | 14 + .../bloodmagic/recipes/altar/dusk_tool.json | 14 + .../bloodmagic/recipes/altar/earth_tool.json | 14 + .../bloodmagic/recipes/altar/fire_tool.json | 14 + .../bloodmagic/recipes/altar/water_tool.json | 14 + .../recipes/ritual_stone_blank.json | 24 + .../recipes/ritual_stone_master.json | 23 + .../java/WayofTime/bloodmagic/BloodMagic.java | 2 + .../client/render/block/RenderAltar.java | 2 - .../java/WayofTime/bloodmagic/util/Utils.java | 7 + .../client/render/block/RenderFakeBlocks.java | 66 ++ .../common/block/BlockMasterRitualStone.java | 6 +- .../common/block/BlockRitualStone.java | 2 +- .../common/data/GeneratorBaseRecipes.java | 2 + .../common/data/GeneratorLanguage.java | 70 +++ .../common/item/BloodMagicItems.java | 12 + .../common/item/ItemActivationCrystal.java | 2 +- .../common/item/ItemInscriptionTool.java | 66 ++ .../common/item/ItemRitualDiviner.java | 591 ++++++++++++++++++ .../recipe/BloodAltarRecipeProvider.java | 5 + .../tile/TileMasterRitualStone.java | 2 +- .../bloodmagic/tile/base/TileTicking.java | 4 +- .../util/handler/event/ClientHandler.java | 303 +++++++++ 40 files changed, 1486 insertions(+), 11 deletions(-) create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/masterritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/masterritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/activationcrystalawakened.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/activationcrystalcreative.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/activationcrystalweak.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/airscribetool.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/duskscribetool.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/earthscribetool.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/firescribetool.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/masterritualstone.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/ritualdiviner.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/waterscribetool.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_blank.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_master.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/masterritualstone.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/air_tool.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/dusk_tool.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/earth_tool.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/fire_tool.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/water_tool.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/ritual_stone_blank.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/ritual_stone_master.json create mode 100644 src/main/java/wayoftime/bloodmagic/client/render/block/RenderFakeBlocks.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemInscriptionTool.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java create mode 100644 src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 79d86fc3..2564ed42 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -10,13 +10,14 @@ ba1cd8a9475212843e3b26232c8a9943fa0d2d20 assets/bloodmagic/blockstates/duskritua bb3db171734f511fc0c259d86e869b49aa1d0c77 assets/bloodmagic/blockstates/earthritualstone.json e780d6d9e891082dc6ce83fde1697ce36281a02a assets/bloodmagic/blockstates/fireritualstone.json 002795212cc7bf2cad2a91f873d85e2204c6367d assets/bloodmagic/blockstates/lightritualstone.json +e1a98bd53fca155e4bbb03c1e548341af0f84bd7 assets/bloodmagic/blockstates/masterritualstone.json 372ecd737f7082a4c2c70e46745f893b1179f885 assets/bloodmagic/blockstates/orbcapacityrune.json 90daa355e528ab8a6582f796951201882f3c56da assets/bloodmagic/blockstates/ritualstone.json 285618c1a8ec36e36d479f577190579ae7616529 assets/bloodmagic/blockstates/sacrificerune.json b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json 487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json -f7a92ca94cbd68344d89b92dc6c26c15cd1b85b5 assets/bloodmagic/lang/en_us.json +c2662c44f07cfb61b565f1918b4fee1d176ed6f7 assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json 3c98a88c2283ad54f0efb9d7194361bbc3e93c17 assets/bloodmagic/models/block/altarcapacityrune.json @@ -29,6 +30,7 @@ bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritua c30064f4aa09c42d23e94d118ae5b148eadb3a6c assets/bloodmagic/models/block/earthritualstone.json 4ff1cab1014cd8f655e5f032ecf60dd371f421c3 assets/bloodmagic/models/block/fireritualstone.json 2e1a81c758bfeec2aee807b48239f23241302268 assets/bloodmagic/models/block/lightritualstone.json +eab1713a8879decb2ae05258a6bcfa9da78ec67b assets/bloodmagic/models/block/masterritualstone.json c3a813b735cd229f8597e41d04465926b2e65fe1 assets/bloodmagic/models/block/orbcapacityrune.json 9b2bf2a44b788cbaecbe63a3e085e8de76672e1b assets/bloodmagic/models/block/ritualstone.json a8a1d06fcc2f8395530c72d2846133fff37d5537 assets/bloodmagic/models/block/sacrificerune.json @@ -36,7 +38,11 @@ a8a1d06fcc2f8395530c72d2846133fff37d5537 assets/bloodmagic/models/block/sacrific 65fe5e01ed2660e45a5c329ff2389a87e4d791ec assets/bloodmagic/models/block/speedrune.json 6041f2e47f5437d90a58586e42d18dadc42df439 assets/bloodmagic/models/block/waterritualstone.json 9462d62d9bc9408359d30728de8651dc104aacf1 assets/bloodmagic/models/item/accelerationrune.json +1aad9b00930b996e3680223cfcb631db2d9cb5ce assets/bloodmagic/models/item/activationcrystalawakened.json +5b8a9b260de9e5eccac525b3fa665ae973f5d23f assets/bloodmagic/models/item/activationcrystalcreative.json +80d2bbc93783663f605b360e6df25bd6497c704a assets/bloodmagic/models/item/activationcrystalweak.json fe8e3deb3ad0107ca3ebd70694c1fc55a987d912 assets/bloodmagic/models/item/airritualstone.json +0bcf230493163a43357cbee7c26b8756089cb548 assets/bloodmagic/models/item/airscribetool.json 17cbe9142ef3950ea1b6be11694b849f55e93f13 assets/bloodmagic/models/item/airsigil.json f150f178edf7d6d250bcfd84af1c28a21cff09c6 assets/bloodmagic/models/item/altarcapacityrune.json 866b8cdd3da56e2e82dbd5f16ab5117b5a503749 assets/bloodmagic/models/item/apprenticebloodorb.json @@ -56,9 +62,12 @@ f404148f9df3a61da3c18175885ffa56b2a85a6a assets/bloodmagic/models/item/daggerofs 7af07ab578bbd20e2f834b26d9cafb5fe23bc7d4 assets/bloodmagic/models/item/dislocationrune.json f4531e22aa1db1cff324db5ccb344d3b9fa85c8d assets/bloodmagic/models/item/divinationsigil.json 10aceefca3ad3f0da773cb317c4effc6c06051ea assets/bloodmagic/models/item/duskritualstone.json +5783901af844ab0a741958dbe684d668a9c293c4 assets/bloodmagic/models/item/duskscribetool.json 4d56efd7fdbf430f49903ce201577047687c3804 assets/bloodmagic/models/item/earthritualstone.json +98ee75786f9d0ab2a8c0835896d07d18df77de0f assets/bloodmagic/models/item/earthscribetool.json 4c39378f6c14dc243a7d52564e5a21df94683415 assets/bloodmagic/models/item/etherealslate.json c36bde4f98c0aeb3bf0f369ad3bc067e5f0dc916 assets/bloodmagic/models/item/fireritualstone.json +b5708a8cc7259fd36ffeabd155ea085b9fdef0fd assets/bloodmagic/models/item/firescribetool.json 44663089f348642bcca1c5020b5081c3ab172f92 assets/bloodmagic/models/item/growthsigil.json f68825f667ca73b4373fd5068a47f0d1ca9b2aad assets/bloodmagic/models/item/icesigil.json 109b5485c25d978af55b46682d5bfa7008909458 assets/bloodmagic/models/item/infusedslate.json @@ -66,6 +75,7 @@ f68825f667ca73b4373fd5068a47f0d1ca9b2aad assets/bloodmagic/models/item/icesigil. 5a76914a87fc9b99079bb6afed1d4cfe3e4a532e assets/bloodmagic/models/item/lightritualstone.json 15d8178b626da912334774142d40d1012fb21fa0 assets/bloodmagic/models/item/magicianbloodorb.json 0a3566d3c86403f24c22977dd32ffaec727a9ad3 assets/bloodmagic/models/item/masterbloodorb.json +9e377ab2c131993f96ab6fb544bda4dbba0ab87e assets/bloodmagic/models/item/masterritualstone.json 7596826c5b40c2809eb0a42eb5f5f2089290e3e5 assets/bloodmagic/models/item/miningsigil.json ff9b802098659824626dc90dbb5a0d8960234228 assets/bloodmagic/models/item/orbcapacityrune.json b4e1259784354b048cd7ec5ef888a182e3909dc6 assets/bloodmagic/models/item/reagentair.json @@ -77,6 +87,7 @@ baafdb5915c5fbc99b84a54670ed64a6f26cb0fe assets/bloodmagic/models/item/reagentma 95b2925e96a7df71d72568e0ed7b03290293cbe7 assets/bloodmagic/models/item/reagentvoid.json fd1447d943ddc4540a51a72dcbb245d77d45da71 assets/bloodmagic/models/item/reagentwater.json 50bf796adbed412488df48ed9250fc9b0ecd851f assets/bloodmagic/models/item/reinforcedslate.json +8b727eee7b06ffa735e6ba49f0c13042b73c45c0 assets/bloodmagic/models/item/ritualdiviner.json 2722891c9c40b124d85bf9ff8eb885e175f5e6ff assets/bloodmagic/models/item/ritualstone.json db73abb3bcb1731b6fc389e3577910b6aab87b10 assets/bloodmagic/models/item/sacrificerune.json 9403d6195d4d38d5876c2a42f4edfb9bdcd05210 assets/bloodmagic/models/item/sacrificialdagger.json @@ -123,6 +134,7 @@ ec6f6bf7f520182b2044f3cc5a10f1d4c7a8d7ab assets/bloodmagic/models/item/variants/ 0f5a3e1e5993a03ccda156eed855b71fbd0be0a2 assets/bloodmagic/models/item/variants/soulsword_vengeful_deactivated.json 836b5a7f19915af809795a72983a23f0d5f9c5b2 assets/bloodmagic/models/item/voidsigil.json a31019db55828cb937a071ac2f74b125a2d0c955 assets/bloodmagic/models/item/waterritualstone.json +4130e8907fe8fcf0a5de805f9c2b7ba9166323e9 assets/bloodmagic/models/item/waterscribetool.json 7426fed5f833ce3d08602f727f1467dd3e107991 assets/bloodmagic/models/item/watersigil.json f72efc172699d43405019add97f455bd6b7f452b assets/bloodmagic/models/item/weakbloodorb.json 828c0f89e747d48d37c6a86030a8ec59ca5c29cb data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json @@ -133,6 +145,8 @@ e897d6f91e2a0bd12b0da0a50e5c897294989e7c data/bloodmagic/advancements/recipes/bl 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 +c8e5cdac0e7328640ab1cb0eab0a46f0733b59b3 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_blank.json +1578416eb302aecb3fd61e481634c5c021541f51 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_master.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 @@ -150,6 +164,7 @@ a9fcfc656fab957328c10ee1d9d33807e697b7f7 data/bloodmagic/loot_tables/blocks/disl 26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/earthritualstone.json 26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/fireritualstone.json 26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/lightritualstone.json +72610188b4538d98ffcd015c2813d63d19889d5f data/bloodmagic/loot_tables/blocks/masterritualstone.json 95442c1bb740fab2eb8ee051f7184813f6023afa data/bloodmagic/loot_tables/blocks/orbcapacityrune.json 26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/ritualstone.json e0239eff7762a414a4e4faa0158d844dffb8c1f6 data/bloodmagic/loot_tables/blocks/sacrificerune.json @@ -157,13 +172,18 @@ e0239eff7762a414a4e4faa0158d844dffb8c1f6 data/bloodmagic/loot_tables/blocks/sacr f748a5ba8838b50de0502f132fe2a65f4726dae6 data/bloodmagic/loot_tables/blocks/soulforge.json 015e07226fd90935f7ec663f4bcf3873a57a82d1 data/bloodmagic/loot_tables/blocks/speedrune.json 26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/waterritualstone.json +3c9d829f7bff8a4d607c46fc3ff4f86dffa28fd5 data/bloodmagic/recipes/altar/air_tool.json f41b0e9dfab608c42a85c3c5c5bbc050b03f02a1 data/bloodmagic/recipes/altar/apprenticebloodorb.json 2a67e37497a571b5ee944375d315fddccea87697 data/bloodmagic/recipes/altar/daggerofsacrifice.json c5a4a256a7437f2e13c574a6f0c4d75fc2e718cb data/bloodmagic/recipes/altar/demonicslate.json +d79a96eb3eed597f1c18a8983764a6362a24748c data/bloodmagic/recipes/altar/dusk_tool.json +7272cdd4e1469cf83849e5444b4b93a7563a6bf2 data/bloodmagic/recipes/altar/earth_tool.json +37913b1babf9b8159332db09b114c919b1b49473 data/bloodmagic/recipes/altar/fire_tool.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 +926d4a0e165c87a15a609744d832d2f5f04a40d0 data/bloodmagic/recipes/altar/water_tool.json 7551501cf361667ec7454c307b9d2368536fbed6 data/bloodmagic/recipes/altar/weakbloodorb.json e1285ec51100f2336c1ea1a1a3057e74a0dd84d1 data/bloodmagic/recipes/array/airsigil.json d1ac23080f72f21adb5908befefe965ffb4efd4f data/bloodmagic/recipes/array/bloodlightsigil.json @@ -182,6 +202,8 @@ f905c1a8ca4d3a9f841ca6c44caa91de327fc29d data/bloodmagic/recipes/blood_rune_char 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 +7757e5fd52f71b0d21595e072593fc592210dd64 data/bloodmagic/recipes/ritual_stone_blank.json +8608f828f997b1a8015287bd9cd436e9d7dff2ff data/bloodmagic/recipes/ritual_stone_master.json aefbf1fd258f1cda8d04db7e0794b9612993e6bf data/bloodmagic/recipes/sacrificial_dagger.json d699e777c72a5f61c4e6cdfea8705628e1c2b855 data/bloodmagic/recipes/soul_forge.json 2455bf8c205c7244fef2b7d7afeef060e30520b7 data/bloodmagic/recipes/soul_snare.json diff --git a/src/generated/resources/assets/bloodmagic/blockstates/masterritualstone.json b/src/generated/resources/assets/bloodmagic/blockstates/masterritualstone.json new file mode 100644 index 00000000..c6276d28 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/masterritualstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/masterritualstone" + } + } +} \ 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 index bc3f1ecf..174a9763 100644 --- a/src/generated/resources/assets/bloodmagic/lang/en_us.json +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -1,16 +1,32 @@ { "block.bloodmagic.accelerationrune": "Acceleration Rune", + "block.bloodmagic.airritualstone": "Air Ritual Stone", "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.duskritualstone": "Dusk Ritual Stone", + "block.bloodmagic.earthritualstone": "Earth Ritual Stone", + "block.bloodmagic.fireritualstone": "Fire Ritual Stone", + "block.bloodmagic.lightritualstone": "Dawn Ritual Stone", + "block.bloodmagic.masterritualstone": "Master Ritual Stone", "block.bloodmagic.orbcapacityrune": "Rune of the Orb", + "block.bloodmagic.ritualstone": "Ritual Stone", "block.bloodmagic.sacrificerune": "Rune of Sacrifice", "block.bloodmagic.selfsacrificerune": "Rune of Self Sacrifice", "block.bloodmagic.soulforge": "Hellfire Forge", "block.bloodmagic.speedrune": "Speed Rune", + "block.bloodmagic.waterritualstone": "Water Ritual Stone", + "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.ritual.prevent": "The ritual is actively resisting you!", + "chat.bloodmagic.ritual.weak": "You feel a push, but are too weak to perform this ritual.", + "item.bloodmagic.activationcrystalawakened": "Awakened Activation Crystal", + "item.bloodmagic.activationcrystalcreative": "Creative Activation Crystal", + "item.bloodmagic.activationcrystalweak": "Weak Activation Crystal", + "item.bloodmagic.airscribetool": "Inscription Tool: Air", "item.bloodmagic.airsigil": "Air Sigil", "item.bloodmagic.apprenticebloodorb": "Apprentice Blood Orb", "item.bloodmagic.arcaneashes": "Arcane Ashes", @@ -24,7 +40,10 @@ "item.bloodmagic.daggerofsacrifice": "Dagger of Sacrifice", "item.bloodmagic.demonslate": "Demonic Slate", "item.bloodmagic.divinationsigil": "Divination Sigil", + "item.bloodmagic.duskscribetool": "Inscription Tool: Dusk", + "item.bloodmagic.earthscribetool": "Inscription Tool: Earth", "item.bloodmagic.etherealslate": "Ethereal Slate", + "item.bloodmagic.firescribetool": "Inscription Tool: Fire", "item.bloodmagic.growthsigil": "Sigil of the Green Grove", "item.bloodmagic.icesigil": "Sigil of the Frozen Lake", "item.bloodmagic.infusedslate": "Imbued Slate", @@ -50,6 +69,7 @@ "item.bloodmagic.soulsnare": "Soul Snare", "item.bloodmagic.soulsword": "Sentient Sword", "item.bloodmagic.voidsigil": "Void Sigil", + "item.bloodmagic.waterscribetool": "Inscription Tool: Water", "item.bloodmagic.watersigil": "Water Sigil", "item.bloodmagic.weakbloodorb": "Weak Blood Orb", "itemGroup.bloodmagic.creativeTab": "Blood Magic", @@ -63,7 +83,37 @@ "jei.bloodmagic.recipe.requiredtier": "Tier: %d", "jei.bloodmagic.recipe.soulforge": "Hellfire Forge", "jei.bloodmagic.recipe.soulsdrained": "Drained: %s Will", + "ritual.bloodmagic.altarBuilderRitual": "The Assembly of the High Altar", + "ritual.bloodmagic.animalGrowthRitual": "Ritual of the Shepherd", + "ritual.bloodmagic.armourEvolveRitual": "Ritual of Living Evolution", + "ritual.bloodmagic.cobblestoneRitual": "Le Vulcanos Frigius", + "ritual.bloodmagic.containmentRitual": "Ritual of Containment", + "ritual.bloodmagic.crushingRitual": "Ritual of the Crusher", + "ritual.bloodmagic.expulsionRitual": "Aura of Expulsion", + "ritual.bloodmagic.featheredKnifeRitual": "Ritual of the Feathered Knife", + "ritual.bloodmagic.fellingRitual": "The Timberman", + "ritual.bloodmagic.fullStomachRitual": "Ritual of the Satiated Stomach", + "ritual.bloodmagic.greenGroveRitual": "Ritual of the Green Grove", + "ritual.bloodmagic.harvestRitual": "Reap of the Harvest Moon", + "ritual.bloodmagic.interdictionRitual": "Ritual of Interdiction", + "ritual.bloodmagic.jumpRitual": "Ritual of the High Jump", + "ritual.bloodmagic.lavaRitual": "Serenade of the Nether", + "ritual.bloodmagic.magneticRitual": "Ritual of Magnetism", + "ritual.bloodmagic.placerRitual": "The Filler", + "ritual.bloodmagic.portalRitual": "The Gate of the Fold", + "ritual.bloodmagic.pumpRitual": "Hymn of Siphoning", + "ritual.bloodmagic.regenerationRitual": "Ritual of Regeneration", + "ritual.bloodmagic.speedRitual": "Ritual of Speed", + "ritual.bloodmagic.suppressionRitual": "Ritual of Suppression", + "ritual.bloodmagic.testRitual": "Test Ritual", + "ritual.bloodmagic.upgradeRemoveRitual": "Sound of the Cleansing Soul", + "ritual.bloodmagic.waterRitual": "Ritual of the Full Spring", + "ritual.bloodmagic.wellOfSufferingRitual": "Well of Suffering", + "ritual.bloodmagic.zephyrRitual": "Call of the Zephyr", "tile.bloodmagic.soulforge.name": "Hellfire Forge", + "tooltip.bloodmagic.activationcrystal.awakened": "Activates more powerful rituals", + "tooltip.bloodmagic.activationcrystal.creative": "Creative Only - Activates any ritual", + "tooltip.bloodmagic.activationcrystal.weak": "Activates low-level rituals", "tooltip.bloodmagic.arcaneAshes": "Ashes used to draw an alchemy circle", "tooltip.bloodmagic.config.disabled": "Currently disabled in the Config", "tooltip.bloodmagic.currentBaseType.corrosive": "Corrosive", @@ -80,6 +130,17 @@ "tooltip.bloodmagic.currentType.vengeful": "Contains: Vengeful Will", "tooltip.bloodmagic.decoration.notSafe": "Dangerous for decoration", "tooltip.bloodmagic.decoration.safe": "Safe for decoration", + "tooltip.bloodmagic.diviner.airRune": "Air Runes: %d", + "tooltip.bloodmagic.diviner.blankRune": "Blank Runes: %d", + "tooltip.bloodmagic.diviner.currentDirection": "Current Direction: %s", + "tooltip.bloodmagic.diviner.currentRitual": "Current Ritual: %s", + "tooltip.bloodmagic.diviner.dawnRune": "Dawn Runes: %d", + "tooltip.bloodmagic.diviner.duskRune": "Dusk Runes: %d", + "tooltip.bloodmagic.diviner.earthRune": "Earth Runes: %d", + "tooltip.bloodmagic.diviner.extraInfo": "Press shift for extra info", + "tooltip.bloodmagic.diviner.fireRune": "Fire Runes: %d", + "tooltip.bloodmagic.diviner.totalRune": "Total Runes: %d", + "tooltip.bloodmagic.diviner.waterRune": "Water Runes: %d", "tooltip.bloodmagic.extraInfo": "&9-Hold shift for more info-", "tooltip.bloodmagic.orb.desc": "Stores raw Life Essence", "tooltip.bloodmagic.orb.owner": "Added by: %s", diff --git a/src/generated/resources/assets/bloodmagic/models/block/masterritualstone.json b/src/generated/resources/assets/bloodmagic/models/block/masterritualstone.json new file mode 100644 index 00000000..cbb503be --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/masterritualstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/masterritualstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/activationcrystalawakened.json b/src/generated/resources/assets/bloodmagic/models/item/activationcrystalawakened.json new file mode 100644 index 00000000..649ad064 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/activationcrystalawakened.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/activationcrystalawakened" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/activationcrystalcreative.json b/src/generated/resources/assets/bloodmagic/models/item/activationcrystalcreative.json new file mode 100644 index 00000000..3492cbfa --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/activationcrystalcreative.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/activationcrystalcreative" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/activationcrystalweak.json b/src/generated/resources/assets/bloodmagic/models/item/activationcrystalweak.json new file mode 100644 index 00000000..ad573a49 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/activationcrystalweak.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/activationcrystalweak" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/airscribetool.json b/src/generated/resources/assets/bloodmagic/models/item/airscribetool.json new file mode 100644 index 00000000..a8fef50d --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/airscribetool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/airscribetool" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/duskscribetool.json b/src/generated/resources/assets/bloodmagic/models/item/duskscribetool.json new file mode 100644 index 00000000..4f2c111c --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/duskscribetool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/duskscribetool" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/earthscribetool.json b/src/generated/resources/assets/bloodmagic/models/item/earthscribetool.json new file mode 100644 index 00000000..6cb9308c --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/earthscribetool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/earthscribetool" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/firescribetool.json b/src/generated/resources/assets/bloodmagic/models/item/firescribetool.json new file mode 100644 index 00000000..f5e0d3af --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/firescribetool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/firescribetool" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/masterritualstone.json b/src/generated/resources/assets/bloodmagic/models/item/masterritualstone.json new file mode 100644 index 00000000..84e36366 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/masterritualstone.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/masterritualstone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/ritualdiviner.json b/src/generated/resources/assets/bloodmagic/models/item/ritualdiviner.json new file mode 100644 index 00000000..d0a26bd9 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/ritualdiviner.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/ritualdiviner" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/waterscribetool.json b/src/generated/resources/assets/bloodmagic/models/item/waterscribetool.json new file mode 100644 index 00000000..1c9aec5b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/waterscribetool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/waterscribetool" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_blank.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_blank.json new file mode 100644 index 00000000..ef6c9fdb --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_blank.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:ritual_stone_blank" + ] + }, + "criteria": { + "has_apprentice_orb": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:apprenticebloodorb" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:ritual_stone_blank" + } + } + }, + "requirements": [ + [ + "has_apprentice_orb", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_master.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_master.json new file mode 100644 index 00000000..878c9ebb --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_master.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:ritual_stone_master" + ] + }, + "criteria": { + "has_magician_orb": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:magicianbloodorb" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:ritual_stone_master" + } + } + }, + "requirements": [ + [ + "has_magician_orb", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/masterritualstone.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/masterritualstone.json new file mode 100644 index 00000000..8b9eb94d --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/masterritualstone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:masterritualstone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/air_tool.json b/src/generated/resources/data/bloodmagic/recipes/altar/air_tool.json new file mode 100644 index 00000000..a34cb046 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/air_tool.json @@ -0,0 +1,14 @@ +{ + "type": "bloodmagic:altar", + "input": { + "item": "minecraft:ghast_tear" + }, + "output": { + "item": "bloodmagic:airscribetool", + "nbt": "{Damage:0}" + }, + "upgradeLevel": 2, + "altarSyphon": 1000, + "consumptionRate": 5, + "drainRate": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/dusk_tool.json b/src/generated/resources/data/bloodmagic/recipes/altar/dusk_tool.json new file mode 100644 index 00000000..a8a08519 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/dusk_tool.json @@ -0,0 +1,14 @@ +{ + "type": "bloodmagic:altar", + "input": { + "tag": "forge:storage_blocks/coal" + }, + "output": { + "item": "bloodmagic:duskscribetool", + "nbt": "{Damage:0}" + }, + "upgradeLevel": 3, + "altarSyphon": 2000, + "consumptionRate": 20, + "drainRate": 10 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/earth_tool.json b/src/generated/resources/data/bloodmagic/recipes/altar/earth_tool.json new file mode 100644 index 00000000..72ddfcc8 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/earth_tool.json @@ -0,0 +1,14 @@ +{ + "type": "bloodmagic:altar", + "input": { + "tag": "forge:obsidian" + }, + "output": { + "item": "bloodmagic:earthscribetool", + "nbt": "{Damage:0}" + }, + "upgradeLevel": 2, + "altarSyphon": 1000, + "consumptionRate": 5, + "drainRate": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/fire_tool.json b/src/generated/resources/data/bloodmagic/recipes/altar/fire_tool.json new file mode 100644 index 00000000..859c6e17 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/fire_tool.json @@ -0,0 +1,14 @@ +{ + "type": "bloodmagic:altar", + "input": { + "item": "minecraft:magma_cream" + }, + "output": { + "item": "bloodmagic:firescribetool", + "nbt": "{Damage:0}" + }, + "upgradeLevel": 2, + "altarSyphon": 1000, + "consumptionRate": 5, + "drainRate": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/water_tool.json b/src/generated/resources/data/bloodmagic/recipes/altar/water_tool.json new file mode 100644 index 00000000..95508bc1 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/water_tool.json @@ -0,0 +1,14 @@ +{ + "type": "bloodmagic:altar", + "input": { + "tag": "forge:storage_blocks/lapis" + }, + "output": { + "item": "bloodmagic:waterscribetool", + "nbt": "{Damage:0}" + }, + "upgradeLevel": 2, + "altarSyphon": 1000, + "consumptionRate": 5, + "drainRate": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/ritual_stone_blank.json b/src/generated/resources/data/bloodmagic/recipes/ritual_stone_blank.json new file mode 100644 index 00000000..aa493752 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/ritual_stone_blank.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aba", + "bcb", + "aba" + ], + "key": { + "a": { + "tag": "forge:obsidian" + }, + "b": { + "item": "bloodmagic:reinforcedslate" + }, + "c": { + "type": "bloodmagic:bloodorb", + "orb_tier": 2 + } + }, + "result": { + "item": "bloodmagic:ritualstone", + "count": 4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/ritual_stone_master.json b/src/generated/resources/data/bloodmagic/recipes/ritual_stone_master.json new file mode 100644 index 00000000..4cdb269e --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/ritual_stone_master.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aba", + "bcb", + "aba" + ], + "key": { + "a": { + "tag": "forge:obsidian" + }, + "b": { + "item": "bloodmagic:ritualstone" + }, + "c": { + "type": "bloodmagic:bloodorb", + "orb_tier": 3 + } + }, + "result": { + "item": "bloodmagic:masterritualstone" + } +} \ 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 fb69752f..2fc39a67 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -52,6 +52,7 @@ import wayoftime.bloodmagic.potion.BloodMagicPotions; import wayoftime.bloodmagic.ritual.RitualManager; import wayoftime.bloodmagic.tile.TileAlchemyArray; import wayoftime.bloodmagic.tile.TileAltar; +import wayoftime.bloodmagic.tile.TileMasterRitualStone; import wayoftime.bloodmagic.tile.TileSoulForge; import wayoftime.bloodmagic.util.handler.event.GenericHandler; import wayoftime.bloodmagic.util.handler.event.WillHandler; @@ -149,6 +150,7 @@ public class BloodMagic 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")); + event.getRegistry().register(TileEntityType.Builder.create(TileMasterRitualStone::new, BloodMagicBlocks.MASTER_RITUAL_STONE.get()).build(null).setRegistryName("masterritualstone")); } @SubscribeEvent 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 e30c3cb1..ed85e794 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -3,7 +3,6 @@ package wayoftime.bloodmagic.client.render.block; 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.renderer.Atlases; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -40,7 +39,6 @@ public class RenderAltar extends TileEntityRenderer @Override public void render(TileAltar tileAltar, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffer, int combinedLightIn, int combinedOverlayIn) { - RedstoneBlock d; ItemStack inputStack = tileAltar.getStackInSlot(0); float level = ((float) tileAltar.getCurrentBlood()) / (float) tileAltar.getCapacity(); diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 4c78886f..061e85ea 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,5 +1,7 @@ package wayoftime.bloodmagic.util; +import java.util.Locale; + import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; @@ -48,4 +50,9 @@ public class Utils return false; } + + public static String toFancyCasing(String input) + { + return String.valueOf(input.charAt(0)).toUpperCase(Locale.ENGLISH) + input.substring(1); + } } diff --git a/src/main/java/wayoftime/bloodmagic/client/render/block/RenderFakeBlocks.java b/src/main/java/wayoftime/bloodmagic/client/render/block/RenderFakeBlocks.java new file mode 100644 index 00000000..50f5a5f2 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/render/block/RenderFakeBlocks.java @@ -0,0 +1,66 @@ +package wayoftime.bloodmagic.client.render.block; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +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.vertex.DefaultVertexFormats; + +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().getAtlasSpriteGetter(AtlasTexture.LOCATION_BLOCKS_TEXTURE).apply(texture.getName()); + + 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(); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java index 7fb09854..f1113705 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java @@ -66,15 +66,15 @@ public class BlockMasterRitualStone extends Block } } else { - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notvalid"), true); } } else { - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notvalid"), true); } } else { - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); + player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notvalid"), true); } } } diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockRitualStone.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockRitualStone.java index d76bfe60..e8600607 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BlockRitualStone.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockRitualStone.java @@ -58,7 +58,7 @@ public class BlockRitualStone extends Block implements IRitualStone public void setRuneType(World world, BlockPos pos, EnumRuneType runeType) { Block runeBlock = this; - switch (type) + switch (runeType) { case AIR: runeBlock = BloodMagicBlocks.AIR_RITUAL_STONE.get(); diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java index 60f56a5f..1d445664 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java @@ -45,6 +45,8 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider 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.BLANK_RITUAL_STONE.get(), 4).key('a', Tags.Items.OBSIDIAN).key('b', BloodMagicItems.REINFORCED_SLATE.get()).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_APPRENTICE.get())).patternLine("aba").patternLine("bcb").patternLine("aba").addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_stone_blank")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.MASTER_RITUAL_STONE.get()).key('a', Tags.Items.OBSIDIAN).key('b', BloodMagicBlocks.BLANK_RITUAL_STONE.get()).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MAGICIAN.get())).patternLine("aba").patternLine("bcb").patternLine("aba").addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_stone_master")); // 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/GeneratorLanguage.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java index e72dabd6..1f9f67dc 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java @@ -81,8 +81,54 @@ public class GeneratorLanguage extends LanguageProvider add("tooltip.bloodmagic.sigil.air.desc", "I feel lighter already..."); add("tooltip.bloodmagic.sigil.bloodlight.desc", "I see a light!"); + add("tooltip.bloodmagic.activationcrystal.weak", "Activates low-level rituals"); + add("tooltip.bloodmagic.activationcrystal.awakened", "Activates more powerful rituals"); + add("tooltip.bloodmagic.activationcrystal.creative", "Creative Only - Activates any ritual"); + add("itemGroup.bloodmagictab", "Blood Magic"); + // Ritual info + add("tooltip.bloodmagic.diviner.currentRitual", "Current Ritual: %s"); + add("tooltip.bloodmagic.diviner.blankRune", "Blank Runes: %d"); + add("tooltip.bloodmagic.diviner.waterRune", "Water Runes: %d"); + add("tooltip.bloodmagic.diviner.airRune", "Air Runes: %d"); + add("tooltip.bloodmagic.diviner.fireRune", "Fire Runes: %d"); + add("tooltip.bloodmagic.diviner.earthRune", "Earth Runes: %d"); + add("tooltip.bloodmagic.diviner.duskRune", "Dusk Runes: %d"); + add("tooltip.bloodmagic.diviner.dawnRune", "Dawn Runes: %d"); + add("tooltip.bloodmagic.diviner.totalRune", "Total Runes: %d"); + add("tooltip.bloodmagic.diviner.extraInfo", "Press shift for extra info"); + add("tooltip.bloodmagic.diviner.currentDirection", "Current Direction: %s"); + + add("ritual.bloodmagic.testRitual", "Test Ritual"); + add("ritual.bloodmagic.waterRitual", "Ritual of the Full Spring"); + add("ritual.bloodmagic.lavaRitual", "Serenade of the Nether"); + add("ritual.bloodmagic.greenGroveRitual", "Ritual of the Green Grove"); + add("ritual.bloodmagic.jumpRitual", "Ritual of the High Jump"); + add("ritual.bloodmagic.wellOfSufferingRitual", "Well of Suffering"); + add("ritual.bloodmagic.featheredKnifeRitual", "Ritual of the Feathered Knife"); + add("ritual.bloodmagic.regenerationRitual", "Ritual of Regeneration"); + add("ritual.bloodmagic.harvestRitual", "Reap of the Harvest Moon"); + add("ritual.bloodmagic.magneticRitual", "Ritual of Magnetism"); + add("ritual.bloodmagic.crushingRitual", "Ritual of the Crusher"); + add("ritual.bloodmagic.fullStomachRitual", "Ritual of the Satiated Stomach"); + add("ritual.bloodmagic.interdictionRitual", "Ritual of Interdiction"); + add("ritual.bloodmagic.containmentRitual", "Ritual of Containment"); + add("ritual.bloodmagic.speedRitual", "Ritual of Speed"); + add("ritual.bloodmagic.suppressionRitual", "Ritual of Suppression"); + add("ritual.bloodmagic.expulsionRitual", "Aura of Expulsion"); + add("ritual.bloodmagic.zephyrRitual", "Call of the Zephyr"); + add("ritual.bloodmagic.upgradeRemoveRitual", "Sound of the Cleansing Soul"); + add("ritual.bloodmagic.armourEvolveRitual", "Ritual of Living Evolution"); + add("ritual.bloodmagic.animalGrowthRitual", "Ritual of the Shepherd"); + + add("ritual.bloodmagic.cobblestoneRitual", "Le Vulcanos Frigius"); + add("ritual.bloodmagic.placerRitual", "The Filler"); + add("ritual.bloodmagic.fellingRitual", "The Timberman"); + add("ritual.bloodmagic.pumpRitual", "Hymn of Siphoning"); + add("ritual.bloodmagic.altarBuilderRitual", "The Assembly of the High Altar"); + add("ritual.bloodmagic.portalRitual", "The Gate of the Fold"); + // Block names addBlock(BloodMagicBlocks.BLANK_RUNE, "Blank Rune"); addBlock(BloodMagicBlocks.SPEED_RUNE, "Speed Rune"); @@ -96,6 +142,14 @@ public class GeneratorLanguage extends LanguageProvider addBlock(BloodMagicBlocks.CHARGING_RUNE, "Charging Rune"); addBlock(BloodMagicBlocks.BLOOD_ALTAR, "Blood Altar"); addBlock(BloodMagicBlocks.SOUL_FORGE, "Hellfire Forge"); + addBlock(BloodMagicBlocks.BLANK_RITUAL_STONE, "Ritual Stone"); + addBlock(BloodMagicBlocks.AIR_RITUAL_STONE, "Air Ritual Stone"); + addBlock(BloodMagicBlocks.WATER_RITUAL_STONE, "Water Ritual Stone"); + addBlock(BloodMagicBlocks.FIRE_RITUAL_STONE, "Fire Ritual Stone"); + addBlock(BloodMagicBlocks.EARTH_RITUAL_STONE, "Earth Ritual Stone"); + addBlock(BloodMagicBlocks.DUSK_RITUAL_STONE, "Dusk Ritual Stone"); + addBlock(BloodMagicBlocks.DAWN_RITUAL_STONE, "Dawn Ritual Stone"); + addBlock(BloodMagicBlocks.MASTER_RITUAL_STONE, "Master Ritual Stone"); // Item names addItem(BloodMagicItems.WEAK_BLOOD_ORB, "Weak Blood Orb"); @@ -144,6 +198,15 @@ public class GeneratorLanguage extends LanguageProvider addItem(BloodMagicItems.SOUL_SNARE, "Soul Snare"); addItem(BloodMagicItems.SENTIENT_SWORD, "Sentient Sword"); + addItem(BloodMagicItems.WEAK_ACTIVATION_CRYSTAL, "Weak Activation Crystal"); + addItem(BloodMagicItems.AWAKENED_ACTIVATION_CRYSTAL, "Awakened Activation Crystal"); + addItem(BloodMagicItems.CREATIVE_ACTIVATION_CRYSTAL, "Creative Activation Crystal"); + addItem(BloodMagicItems.WATER_INSCRIPTION_TOOL, "Inscription Tool: Water"); + addItem(BloodMagicItems.FIRE_INSCRIPTION_TOOL, "Inscription Tool: Fire"); + addItem(BloodMagicItems.EARTH_INSCRIPTION_TOOL, "Inscription Tool: Earth"); + addItem(BloodMagicItems.AIR_INSCRIPTION_TOOL, "Inscription Tool: Air"); + addItem(BloodMagicItems.DUSK_INSCRIPTION_TOOL, "Inscription Tool: Dusk"); + // addItem(BloodMagicItems , ""); // JEI @@ -157,5 +220,12 @@ public class GeneratorLanguage extends LanguageProvider add("jei.bloodmagic.recipe.altar", "Blood Altar"); add("jei.bloodmagic.recipe.soulforge", "Hellfire Forge"); add("jei.bloodmagic.recipe.alchemyarraycrafting", "Alchemy Array"); + + // Chat + add("chat.bloodmagic.ritual.weak", "You feel a push, but are too weak to perform this ritual."); + add("chat.bloodmagic.ritual.prevent", "The ritual is actively resisting you!"); + add("chat.bloodmagic.ritual.activate", "A rush of energy flows through the ritual!"); + add("chat.bloodmagic.ritual.notValid", "You feel that these runes are not configured correctly..."); + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java index f79ae7b2..86307df1 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java @@ -25,6 +25,7 @@ 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.ritual.EnumRuneType; import wayoftime.bloodmagic.will.EnumDemonWillType; public class BloodMagicItems @@ -62,6 +63,8 @@ public class BloodMagicItems public static final RegistryObject DUSK_RITUAL_STONE_ITEM = ITEMS.register("duskritualstone", () -> new BlockItem(BloodMagicBlocks.DUSK_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); public static final RegistryObject DAWN_RITUAL_STONE_ITEM = ITEMS.register("lightritualstone", () -> new BlockItem(BloodMagicBlocks.DAWN_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject MASTER_RITUAL_STONE_ITEM = ITEMS.register("masterritualstone", () -> new BlockItem(BloodMagicBlocks.MASTER_RITUAL_STONE.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 @@ -94,10 +97,19 @@ public class BloodMagicItems public static final RegistryObject ARCANE_ASHES = BASICITEMS.register("arcaneashes", () -> new ItemArcaneAshes()); public static final RegistryObject DAGGER_OF_SACRIFICE = BASICITEMS.register("daggerofsacrifice", () -> new ItemDaggerOfSacrifice()); + // Ritual stuffs public static final RegistryObject WEAK_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalweak", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.WEAK)); public static final RegistryObject AWAKENED_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalawakened", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.AWAKENED)); public static final RegistryObject CREATIVE_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalcreative", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.CREATIVE)); + public static final RegistryObject AIR_INSCRIPTION_TOOL = BASICITEMS.register("airscribetool", () -> new ItemInscriptionTool(EnumRuneType.AIR)); + public static final RegistryObject FIRE_INSCRIPTION_TOOL = BASICITEMS.register("firescribetool", () -> new ItemInscriptionTool(EnumRuneType.FIRE)); + public static final RegistryObject WATER_INSCRIPTION_TOOL = BASICITEMS.register("waterscribetool", () -> new ItemInscriptionTool(EnumRuneType.WATER)); + public static final RegistryObject EARTH_INSCRIPTION_TOOL = BASICITEMS.register("earthscribetool", () -> new ItemInscriptionTool(EnumRuneType.EARTH)); + public static final RegistryObject DUSK_INSCRIPTION_TOOL = BASICITEMS.register("duskscribetool", () -> new ItemInscriptionTool(EnumRuneType.DUSK)); + + public static final RegistryObject BASE_RITUAL_DIVINER = BASICITEMS.register("ritualdiviner", () -> new ItemRitualDiviner(0)); + // 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()); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java index 83d97492..f6df51f4 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java @@ -30,7 +30,7 @@ public class ItemActivationCrystal extends Item implements IBindable @OnlyIn(Dist.CLIENT) public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.activation_crystal." + type.name().toLowerCase())); + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.activationcrystal." + type.name().toLowerCase())); if (!stack.hasTag()) return; diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemInscriptionTool.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemInscriptionTool.java new file mode 100644 index 00000000..2b2c7f74 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemInscriptionTool.java @@ -0,0 +1,66 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.List; + +import net.minecraft.block.BlockState; +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.util.ActionResultType; +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.BlockRitualStone; +import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.util.helper.TextHelper; + +public class ItemInscriptionTool extends Item +{ + private final EnumRuneType type; + + public ItemInscriptionTool(EnumRuneType type) + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB).maxDamage(40)); + + this.type = type; + } + + @Override + public ActionResultType onItemUse(ItemUseContext context) + { + ItemStack stack = context.getItem(); + BlockPos pos = context.getPos(); + World world = context.getWorld(); + PlayerEntity player = context.getPlayer(); + BlockState state = world.getBlockState(pos); + + if (state.getBlock() instanceof BlockRitualStone + && !((BlockRitualStone) state.getBlock()).isRuneType(world, pos, type)) + { + ((BlockRitualStone) state.getBlock()).setRuneType(world, pos, type); + if (!player.isCreative()) + { + stack.damageItem(1, player, (entity) -> { + entity.sendBreakAnimation(EquipmentSlotType.MAINHAND); + }); + } + return ActionResultType.SUCCESS; + } + + return ActionResultType.FAIL; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + tooltip.add(new TranslationTextComponent(TextHelper.localizeEffect("tooltip.bloodmagic.inscriber.desc"))); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java new file mode 100644 index 00000000..f3ace9d3 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java @@ -0,0 +1,591 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.Collections; +import java.util.List; + +import com.google.common.collect.Lists; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResult; +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.RayTraceContext; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +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.BlockRitualStone; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.RitualComponent; +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 wayoftime.bloodmagic.will.EnumDemonWillType; + +public class ItemRitualDiviner extends Item +{ + final int type; + public static final String tooltipBase = "tooltip.bloodmagic.diviner."; + public static String[] names = + { "normal", "dusk", "dawn" }; + + public ItemRitualDiviner(int type) + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB)); + this.type = type; + } + +// @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 + public ActionResultType onItemUse(ItemUseContext context) + { + ItemStack stack = context.getPlayer().getHeldItem(context.getHand()); + if (context.getPlayer().isSneaking()) + { + if (context.getWorld().isRemote) + { + trySetDisplayedRitual(stack, context.getWorld(), context.getPos()); + } + + return ActionResultType.SUCCESS; + } else if (addRuneToRitual(stack, context.getWorld(), context.getPos(), context.getPlayer())) + { + if (context.getWorld().isRemote) + { + spawnParticles(context.getWorld(), context.getPos().offset(context.getFace()), 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; + } + ((BlockRitualStone) BloodMagicBlocks.BLANK_RITUAL_STONE.get()).setRuneType(world, newPos, component.getRuneType()); + return true; + } else + { + return false; // TODO: Possibly replace the block with a + // ritual stone + } + } + } + } + + return false; + } + + @OnlyIn(Dist.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); + } + } + } + + @OnlyIn(Dist.CLIENT) + public void undisplayHologram() + { + ClientHandler.setRitualHoloToNull(); + } + + // TODO: Make this work for any IRitualStone + public boolean consumeStone(ItemStack stack, World world, PlayerEntity player) + { + if (player.isCreative()) + { + 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 instanceof BlockRitualStone) + { + newStack.shrink(1); + return true; + } + } + } + + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + if (!stack.hasTag()) + return; + + Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(this.getCurrentRitual(stack)); + if (ritual != null) + { + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.diviner.currentRitual", new TranslationTextComponent(ritual.getTranslationKey()))); + + boolean sneaking = Screen.hasShiftDown(); +// boolean extraInfo = sneaking && Keyboard.isKeyDown(Keyboard.KEY_M); + boolean extraInfo = Screen.hasAltDown(); + + if (extraInfo) + { + tooltip.add(new StringTextComponent("")); + + for (EnumDemonWillType type : EnumDemonWillType.values()) + { + if (TextHelper.canTranslate(ritual.getTranslationKey() + "." + type.name().toLowerCase() + ".info")) + { + tooltip.add(new TranslationTextComponent(ritual.getTranslationKey() + "." + type.name().toLowerCase() + ".info")); + } + } + } else if (sneaking) + { + tooltip.add(new TranslationTextComponent(tooltipBase + "currentDirection", Utils.toFancyCasing(getDirection(stack).name()))); + tooltip.add(new StringTextComponent("")); + 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(new TranslationTextComponent(tooltipBase + "blankRune", blankRunes).mergeStyle(EnumRuneType.BLANK.colorCode)); + if (waterRunes > 0) + tooltip.add(new TranslationTextComponent(tooltipBase + "waterRune", waterRunes).mergeStyle(EnumRuneType.WATER.colorCode)); + if (airRunes > 0) + tooltip.add(new TranslationTextComponent(tooltipBase + "airRune", airRunes).mergeStyle(EnumRuneType.AIR.colorCode)); + if (fireRunes > 0) + tooltip.add(new TranslationTextComponent(tooltipBase + "fireRune", fireRunes).mergeStyle(EnumRuneType.FIRE.colorCode)); + if (earthRunes > 0) + tooltip.add(new TranslationTextComponent(tooltipBase + "earthRune", earthRunes).mergeStyle(EnumRuneType.EARTH.colorCode)); + if (duskRunes > 0) + tooltip.add(new TranslationTextComponent(tooltipBase + "duskRune", duskRunes).mergeStyle(EnumRuneType.DUSK.colorCode)); + if (dawnRunes > 0) + tooltip.add(new TranslationTextComponent(tooltipBase + "dawnRune", dawnRunes).mergeStyle(EnumRuneType.DAWN.colorCode)); + + tooltip.add(new StringTextComponent("")); + tooltip.add(new TranslationTextComponent(tooltipBase + "totalRune", totalRunes)); + } else + { + tooltip.add(new StringTextComponent("")); + if (TextHelper.canTranslate(ritual.getTranslationKey() + ".info")) + { + tooltip.add(new TranslationTextComponent(ritual.getTranslationKey() + ".info")); + tooltip.add(new StringTextComponent("")); + } + + tooltip.add(new TranslationTextComponent(tooltipBase + "extraInfo")); + tooltip.add(new TranslationTextComponent(tooltipBase + "extraExtraInfo")); + } + } + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + + RayTraceResult ray = rayTrace(world, player, RayTraceContext.FluidMode.NONE); + + if (ray != null && ray.getType() == 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 void onUse(World worldIn, LivingEntity entityLiving, ItemStack stack, int count) + { + if (!entityLiving.world.isRemote && entityLiving instanceof PlayerEntity) + { + PlayerEntity player = (PlayerEntity) entityLiving; + + RayTraceResult ray = rayTrace(player.world, player, RayTraceContext.FluidMode.NONE); + + if (ray != null && ray.getType() == RayTraceResult.Type.BLOCK) + { + return; +// return false; + } + + if (!player.isSwingInProgress) + { + if (player.isSneaking()) + { + cycleRitual(stack, player, true); + } else + { + cycleDirection(stack, player); + } + } + } + +// return false; + } + + 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.hasTag()) + { + stack.setTag(new CompoundNBT()); + } + + CompoundNBT tag = stack.getTag(); + + tag.putInt(Constants.NBT.DIRECTION, direction.getIndex()); + } + + public Direction getDirection(ItemStack stack) + { + if (!stack.hasTag()) + { + stack.setTag(new CompoundNBT()); + return Direction.NORTH; + } + + CompoundNBT tag = stack.getTag(); + + 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.hasTag()) + { + stack.setTag(new CompoundNBT()); + } + + CompoundNBT tag = stack.getTag(); + + tag.putString("current_ritual", key); + } + + public String getCurrentRitual(ItemStack stack) + { + if (!stack.hasTag()) + { + stack.setTag(new CompoundNBT()); + } + + CompoundNBT tag = stack.getTag(); + return tag.getString("current_ritual"); + } + + public boolean canPlaceRitualStone(EnumRuneType rune, ItemStack stack) + { + int meta = type; + 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 = random.nextGaussian() * 0.02D; + double d1 = random.nextGaussian() * 0.02D; + double d2 = random.nextGaussian() * 0.02D; + worldIn.addParticle(ParticleTypes.HAPPY_VILLAGER, (double) ((float) pos.getX() + + random.nextFloat()), (double) pos.getY() + + (double) random.nextFloat(), (double) ((float) pos.getZ() + + random.nextFloat()), d0, d1, d2); + } + } else + { + for (int i1 = 0; i1 < amount; ++i1) + { + double d0 = random.nextGaussian() * 0.02D; + double d1 = random.nextGaussian() * 0.02D; + double d2 = random.nextGaussian() * 0.02D; + worldIn.addParticle(ParticleTypes.HAPPY_VILLAGER, (double) ((float) pos.getX() + + random.nextFloat()), (double) pos.getY() + + (double) random.nextFloat() + * 1.0f, (double) ((float) pos.getZ() + random.nextFloat()), d0, d1, d2); + } + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java index 671843fa..05a898a3 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java @@ -33,9 +33,14 @@ public class BloodAltarRecipeProvider implements ISubRecipeProvider // 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")); + BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.OBSIDIAN), new ItemStack(BloodMagicItems.EARTH_INSCRIPTION_TOOL.get()), AltarTier.THREE.ordinal(), 1000, 5, 5).build(consumer, BloodMagic.rl(basePath + "earth_tool")); + BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_LAPIS), new ItemStack(BloodMagicItems.WATER_INSCRIPTION_TOOL.get()), AltarTier.THREE.ordinal(), 1000, 5, 5).build(consumer, BloodMagic.rl(basePath + "water_tool")); + BloodAltarRecipeBuilder.altar(Ingredient.fromItems(Items.MAGMA_CREAM), new ItemStack(BloodMagicItems.FIRE_INSCRIPTION_TOOL.get()), AltarTier.THREE.ordinal(), 1000, 5, 5).build(consumer, BloodMagic.rl(basePath + "fire_tool")); + BloodAltarRecipeBuilder.altar(Ingredient.fromItems(Items.GHAST_TEAR), new ItemStack(BloodMagicItems.AIR_INSCRIPTION_TOOL.get()), AltarTier.THREE.ordinal(), 1000, 5, 5).build(consumer, BloodMagic.rl(basePath + "air_tool")); // 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(Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_COAL), new ItemStack(BloodMagicItems.DUSK_INSCRIPTION_TOOL.get()), AltarTier.FOUR.ordinal(), 2000, 20, 10).build(consumer, BloodMagic.rl(basePath + "dusk_tool")); // BloodAltarRecipeBuilder.altar(input, output, minimumTier, syphon, consumeRate, drainRate).build(consumer, BloodMagic.rl(basePath + "")); diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java index 5e6083b7..790efcc4 100644 --- a/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java +++ b/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java @@ -220,7 +220,7 @@ public class TileMasterRitualStone extends TileTicking implements IMasterRitualS } else { if (activator != null) - activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); + activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notvalid"), true); } return false; diff --git a/src/main/java/wayoftime/bloodmagic/tile/base/TileTicking.java b/src/main/java/wayoftime/bloodmagic/tile/base/TileTicking.java index 545dec20..ffc70ebc 100644 --- a/src/main/java/wayoftime/bloodmagic/tile/base/TileTicking.java +++ b/src/main/java/wayoftime/bloodmagic/tile/base/TileTicking.java @@ -1,7 +1,7 @@ package wayoftime.bloodmagic.tile.base; -import net.minecraft.client.renderer.texture.ITickable; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntityType; /** @@ -9,7 +9,7 @@ import net.minecraft.tileentity.TileEntityType; * programmatically. */ // TODO - Move implementations that depend on existed ticks to new methods from here. -public abstract class TileTicking extends TileBase implements ITickable +public abstract class TileTicking extends TileBase implements ITickableTileEntity { private int ticksExisted; private boolean shouldTick = true; diff --git a/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java new file mode 100644 index 00000000..0f3f019c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java @@ -0,0 +1,303 @@ +package wayoftime.bloodmagic.util.handler.event; + +import java.util.List; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.IVertexBuilder; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.renderer.Atlases; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.texture.AtlasTexture; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +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.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.client.render.BloodMagicRenderer; +import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model3D; +import wayoftime.bloodmagic.client.render.RenderResizableCuboid; +import wayoftime.bloodmagic.client.render.block.RenderFakeBlocks; +import wayoftime.bloodmagic.common.item.ItemRitualDiviner; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.RitualComponent; +import wayoftime.bloodmagic.tile.TileMasterRitualStone; + +@Mod.EventBusSubscriber(modid = BloodMagic.MODID, value = Dist.CLIENT) +@OnlyIn(Dist.CLIENT) +public class ClientHandler +{ + public static final boolean SUPPRESS_ASSET_ERRORS = true; + public static ResourceLocation ritualStoneBlank = BloodMagic.rl("block/ritualstone");; + public static ResourceLocation ritualStoneWater = BloodMagic.rl("block/waterritualstone");; + public static ResourceLocation ritualStoneFire = BloodMagic.rl("block/fireritualstone");; + public static ResourceLocation ritualStoneEarth = BloodMagic.rl("block/earthritualstone");; + public static ResourceLocation ritualStoneAir = BloodMagic.rl("block/airritualstone");; + public static ResourceLocation ritualStoneDawn = BloodMagic.rl("block/dawnritualstone");; + public static ResourceLocation ritualStoneDusk = BloodMagic.rl("block/lightritualstone");; + 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 onTextureStitch(TextureStitchEvent.Pre event) + { + final String BLOCKS = "block/"; + +// ritualStoneBlank = Minecraft.getInstance().getAtlasSpriteGetter(AtlasTexture.LOCATION_BLOCKS_TEXTURE).apply(BloodMagic.rl(block//" + "blankrune")); +//// 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().getSprite(new ResourceLocation("minecraft:block/stonebrick")); + glowstone = event.getMap().getSprite(new ResourceLocation("minecraft:block/glowstone")); +// bloodStoneBrick = forName(event.getMap(), "BloodStoneBrick", BLOCKS); + beacon = event.getMap().getSprite(new ResourceLocation("minecraft:block/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) + { + IRenderTypeBuffer.Impl buffers = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource(); + MatrixStack stack = event.getMatrixStack(); + renderRitualStones(stack, buffers, mrsHoloTile, event.getPartialTicks()); + RenderSystem.disableDepthTest(); + buffers.finish(); + } else + ClientHandler.setRitualHoloToNull(); + } else + { + ClientHandler.setRitualHoloToNull(); + } + } + + if (minecraft.objectMouseOver == null || minecraft.objectMouseOver.getType() != RayTraceResult.Type.BLOCK) + return; + + TileEntity tileEntity = world.getTileEntity(((BlockRayTraceResult) minecraft.objectMouseOver).getPos()); + + if (tileEntity instanceof TileMasterRitualStone && !player.getHeldItemMainhand().isEmpty() + && player.getHeldItemMainhand().getItem() instanceof ItemRitualDiviner) + renderRitualStones(player, event.getPartialTicks()); + } + + private static TextureAtlasSprite forName(AtlasTexture textureMap, String name, String dir) + { + return textureMap.getSprite(new ResourceLocation(BloodMagic.MODID + dir + "/" + name)); + } + + 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.color4f(1F, 1F, 1F, 0.6125F); + + BlockPos vec3, vX; + vec3 = ((BlockRayTraceResult) minecraft.objectMouseOver).getPos(); + double posX = player.lastTickPosX + (player.getPosX() - player.lastTickPosX) * partialTicks; + double posY = player.lastTickPosY + (player.getPosY() - player.lastTickPosY) * partialTicks; + double posZ = player.lastTickPosZ + (player.getPosZ() - 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(world, vX)) + { + 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 renderRitualStones(MatrixStack stack, IRenderTypeBuffer renderer, TileMasterRitualStone masterRitualStone, float partialTicks) + { + IVertexBuilder buffer = renderer.getBuffer(Atlases.getTranslucentCullBlockType()); + System.out.println("Attempting to render stones"); + 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.color4f(1F, 1F, 1F, 0.5F); + + BlockPos vec3, vX; + vec3 = masterRitualStone.getPos(); + double posX = player.lastTickPosX + (player.getPosX() - player.lastTickPosX) * partialTicks; + double posY = player.lastTickPosY + (player.getPosY() - player.lastTickPosY) * partialTicks; + double posZ = player.lastTickPosZ + (player.getPosZ() - player.lastTickPosZ) * partialTicks; + + List components = Lists.newArrayList(); + ritual.gatherComponents(components::add); + for (RitualComponent ritualComponent : components) + { + stack.push(); + vX = vec3.add(ritualComponent.getOffset(direction)); + Vector3d eyePos = player.getEyePosition(partialTicks); + double minX = vX.getX() - eyePos.x; + double minY = vX.getY() - eyePos.y; + double minZ = vX.getZ() - eyePos.z; + + stack.translate(minX, minY, minZ); + + if (!world.getBlockState(vX).isOpaqueCube(world, vX)) + { + + ResourceLocation rl = null; + + switch (ritualComponent.getRuneType()) + { + case BLANK: + rl = ritualStoneBlank; + break; + case WATER: + rl = ritualStoneWater; + break; + case FIRE: + rl = ritualStoneFire; + break; + case EARTH: + rl = ritualStoneEarth; + break; + case AIR: + rl = ritualStoneAir; + break; + case DAWN: + rl = ritualStoneDawn; + break; + case DUSK: + rl = ritualStoneDusk; + break; + } + + Model3D model = getBlockModel(rl); + + RenderResizableCuboid.INSTANCE.renderCube(model, stack, buffer, 0xDDFFFFFF, 0x00F000F0, OverlayTexture.NO_OVERLAY); + +// RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ); + } + + stack.pop(); + } + +// GlStateManager.popMatrix(); + } + + private static Model3D getBlockModel(ResourceLocation rl) + { + Model3D model = new BloodMagicRenderer.Model3D(); + model.setTexture(Minecraft.getInstance().getAtlasSpriteGetter(AtlasTexture.LOCATION_BLOCKS_TEXTURE).apply(rl)); + model.minX = 0; + model.minY = 0; + model.minZ = 0; + model.maxX = 1; + model.maxY = 1; + model.maxZ = 1; + + return model; + } + + 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; + } +} From e254287a5e18847644b33d4026cf85486aa6f4ad Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 25 Oct 2020 10:55:38 -0400 Subject: [PATCH 449/595] Implemented RitualDiviner Finished fully implementing the Ritual Diviner item. Changed the `cycleDirection` method to occur when the player does not sneak + right clicks, because the method for when a player left clicks with an item seems to have dissapeared. --- src/generated/resources/.cache/cache | 3 +- .../assets/bloodmagic/lang/en_us.json | 3 + .../models/item/ritualdivinerdusk.json | 6 ++ .../common/data/GeneratorLanguage.java | 4 + .../common/item/BloodMagicItems.java | 1 + .../common/item/ItemRitualDiviner.java | 13 ++- .../util/handler/event/ClientHandler.java | 98 ++++++++++-------- .../textures/item/ritualdivinerdawn.png | Bin 0 -> 1366 bytes .../textures/item/ritualdivinerdusk.png | Bin 0 -> 1366 bytes 9 files changed, 78 insertions(+), 50 deletions(-) create mode 100644 src/generated/resources/assets/bloodmagic/models/item/ritualdivinerdusk.json create mode 100644 src/main/resources/assets/bloodmagic/textures/item/ritualdivinerdawn.png create mode 100644 src/main/resources/assets/bloodmagic/textures/item/ritualdivinerdusk.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 2564ed42..b3623613 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -17,7 +17,7 @@ e1a98bd53fca155e4bbb03c1e548341af0f84bd7 assets/bloodmagic/blockstates/masterrit b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json 487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json -c2662c44f07cfb61b565f1918b4fee1d176ed6f7 assets/bloodmagic/lang/en_us.json +770d87c47f343107732e9191d216803419324608 assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json 3c98a88c2283ad54f0efb9d7194361bbc3e93c17 assets/bloodmagic/models/block/altarcapacityrune.json @@ -88,6 +88,7 @@ baafdb5915c5fbc99b84a54670ed64a6f26cb0fe assets/bloodmagic/models/item/reagentma fd1447d943ddc4540a51a72dcbb245d77d45da71 assets/bloodmagic/models/item/reagentwater.json 50bf796adbed412488df48ed9250fc9b0ecd851f assets/bloodmagic/models/item/reinforcedslate.json 8b727eee7b06ffa735e6ba49f0c13042b73c45c0 assets/bloodmagic/models/item/ritualdiviner.json +42b96a7c792d1672d798b52fa1c9c4ba58d2df71 assets/bloodmagic/models/item/ritualdivinerdusk.json 2722891c9c40b124d85bf9ff8eb885e175f5e6ff assets/bloodmagic/models/item/ritualstone.json db73abb3bcb1731b6fc389e3577910b6aab87b10 assets/bloodmagic/models/item/sacrificerune.json 9403d6195d4d38d5876c2a42f4edfb9bdcd05210 assets/bloodmagic/models/item/sacrificialdagger.json diff --git a/src/generated/resources/assets/bloodmagic/lang/en_us.json b/src/generated/resources/assets/bloodmagic/lang/en_us.json index 174a9763..cd53036e 100644 --- a/src/generated/resources/assets/bloodmagic/lang/en_us.json +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -61,6 +61,8 @@ "item.bloodmagic.reagentvoid": "Void Reagent", "item.bloodmagic.reagentwater": "Water Reagent", "item.bloodmagic.reinforcedslate": "Reinforced Slate", + "item.bloodmagic.ritualdiviner": "Ritual Diviner", + "item.bloodmagic.ritualdivinerdusk": "Ritual Diviner [Dusk]", "item.bloodmagic.sacrificialdagger": "Sacrificial Knife", "item.bloodmagic.sigilofmagnetism": "Sigil of Magnetism", "item.bloodmagic.soulgemcommon": "Common Tartaric Gem", @@ -137,6 +139,7 @@ "tooltip.bloodmagic.diviner.dawnRune": "Dawn Runes: %d", "tooltip.bloodmagic.diviner.duskRune": "Dusk Runes: %d", "tooltip.bloodmagic.diviner.earthRune": "Earth Runes: %d", + "tooltip.bloodmagic.diviner.extraExtraInfo": "-Hold shift + alt for augmentation info-", "tooltip.bloodmagic.diviner.extraInfo": "Press shift for extra info", "tooltip.bloodmagic.diviner.fireRune": "Fire Runes: %d", "tooltip.bloodmagic.diviner.totalRune": "Total Runes: %d", diff --git a/src/generated/resources/assets/bloodmagic/models/item/ritualdivinerdusk.json b/src/generated/resources/assets/bloodmagic/models/item/ritualdivinerdusk.json new file mode 100644 index 00000000..7b855e6c --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/ritualdivinerdusk.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/ritualdivinerdusk" + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java index 1f9f67dc..f2299b04 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java @@ -98,6 +98,7 @@ public class GeneratorLanguage extends LanguageProvider add("tooltip.bloodmagic.diviner.dawnRune", "Dawn Runes: %d"); add("tooltip.bloodmagic.diviner.totalRune", "Total Runes: %d"); add("tooltip.bloodmagic.diviner.extraInfo", "Press shift for extra info"); + add("tooltip.bloodmagic.diviner.extraExtraInfo", "-Hold shift + alt for augmentation info-"); add("tooltip.bloodmagic.diviner.currentDirection", "Current Direction: %s"); add("ritual.bloodmagic.testRitual", "Test Ritual"); @@ -207,6 +208,9 @@ public class GeneratorLanguage extends LanguageProvider addItem(BloodMagicItems.AIR_INSCRIPTION_TOOL, "Inscription Tool: Air"); addItem(BloodMagicItems.DUSK_INSCRIPTION_TOOL, "Inscription Tool: Dusk"); + addItem(BloodMagicItems.BASE_RITUAL_DIVINER, "Ritual Diviner"); + addItem(BloodMagicItems.DUSK_RITUAL_DIVINER, "Ritual Diviner [Dusk]"); + // addItem(BloodMagicItems , ""); // JEI diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java index 86307df1..97f0a557 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java @@ -109,6 +109,7 @@ public class BloodMagicItems public static final RegistryObject DUSK_INSCRIPTION_TOOL = BASICITEMS.register("duskscribetool", () -> new ItemInscriptionTool(EnumRuneType.DUSK)); public static final RegistryObject BASE_RITUAL_DIVINER = BASICITEMS.register("ritualdiviner", () -> new ItemRitualDiviner(0)); + public static final RegistryObject DUSK_RITUAL_DIVINER = BASICITEMS.register("ritualdivinerdusk", () -> new ItemRitualDiviner(1)); // Reagents used to make the Sigils public static final RegistryObject REAGENT_WATER = BASICITEMS.register("reagentwater", () -> new ItemBase()); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java index f3ace9d3..3e20849f 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java @@ -28,6 +28,7 @@ import net.minecraft.util.math.RayTraceContext; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; @@ -232,7 +233,7 @@ public class ItemRitualDiviner extends Item boolean sneaking = Screen.hasShiftDown(); // boolean extraInfo = sneaking && Keyboard.isKeyDown(Keyboard.KEY_M); - boolean extraInfo = Screen.hasAltDown(); + boolean extraInfo = sneaking && Screen.hasAltDown(); if (extraInfo) { @@ -315,8 +316,8 @@ public class ItemRitualDiviner extends Item tooltip.add(new StringTextComponent("")); } - tooltip.add(new TranslationTextComponent(tooltipBase + "extraInfo")); - tooltip.add(new TranslationTextComponent(tooltipBase + "extraExtraInfo")); + tooltip.add(new TranslationTextComponent(tooltipBase + "extraInfo").mergeStyle(TextFormatting.BLUE)); + tooltip.add(new TranslationTextComponent(tooltipBase + "extraExtraInfo").mergeStyle(TextFormatting.BLUE)); } } } @@ -341,6 +342,12 @@ public class ItemRitualDiviner extends Item } return new ActionResult<>(ActionResultType.SUCCESS, stack); + } else + { + if (!world.isRemote) + { + cycleDirection(stack, player); + } } return new ActionResult<>(ActionResultType.PASS, stack); diff --git a/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java index 0f3f019c..16e61ecb 100644 --- a/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java @@ -4,7 +4,6 @@ import java.util.List; import com.google.common.collect.Lists; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.IVertexBuilder; @@ -33,7 +32,6 @@ import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.client.render.BloodMagicRenderer; import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model3D; import wayoftime.bloodmagic.client.render.RenderResizableCuboid; -import wayoftime.bloodmagic.client.render.block.RenderFakeBlocks; import wayoftime.bloodmagic.common.item.ItemRitualDiviner; import wayoftime.bloodmagic.ritual.Ritual; import wayoftime.bloodmagic.ritual.RitualComponent; @@ -117,7 +115,13 @@ public class ClientHandler if (tileEntity instanceof TileMasterRitualStone && !player.getHeldItemMainhand().isEmpty() && player.getHeldItemMainhand().getItem() instanceof ItemRitualDiviner) - renderRitualStones(player, event.getPartialTicks()); + { + IRenderTypeBuffer.Impl buffers = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource(); + MatrixStack stack = event.getMatrixStack(); + renderRitualStones(stack, buffers, player, event.getPartialTicks()); + RenderSystem.disableDepthTest(); + buffers.finish(); + } } private static TextureAtlasSprite forName(AtlasTexture textureMap, String name, String dir) @@ -125,8 +129,9 @@ public class ClientHandler return textureMap.getSprite(new ResourceLocation(BloodMagic.MODID + dir + "/" + name)); } - private static void renderRitualStones(ClientPlayerEntity player, float partialTicks) + private static void renderRitualStones(MatrixStack stack, IRenderTypeBuffer renderer, ClientPlayerEntity player, float partialTicks) { + IVertexBuilder buffer = renderer.getBuffer(Atlases.getTranslucentCullBlockType()); World world = player.getEntityWorld(); ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); Direction direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); @@ -135,11 +140,6 @@ public class ClientHandler if (ritual == null) return; - GlStateManager.pushMatrix(); - GlStateManager.enableBlend(); -// GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); -// GlStateManager.color4f(1F, 1F, 1F, 0.6125F); - BlockPos vec3, vX; vec3 = ((BlockRayTraceResult) minecraft.objectMouseOver).getPos(); double posX = player.lastTickPosX + (player.getPosX() - player.lastTickPosX) * partialTicks; @@ -150,51 +150,58 @@ public class ClientHandler ritual.gatherComponents(components::add); for (RitualComponent ritualComponent : components) { + stack.push(); vX = vec3.add(ritualComponent.getOffset(direction)); - double minX = vX.getX() - posX; - double minY = vX.getY() - posY; - double minZ = vX.getZ() - posZ; + Vector3d eyePos = player.getEyePosition(partialTicks); + double minX = vX.getX() - eyePos.x; + double minY = vX.getY() - eyePos.y; + double minZ = vX.getZ() - eyePos.z; +// double minX = vX.getX() - posX; +// double minY = vX.getY() - posY; +// double minZ = vX.getZ() - posZ; + + stack.translate(minX, minY, minZ); if (!world.getBlockState(vX).isOpaqueCube(world, vX)) { - TextureAtlasSprite texture = null; + ResourceLocation rl = 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; -// } + switch (ritualComponent.getRuneType()) + { + case BLANK: + rl = ritualStoneBlank; + break; + case WATER: + rl = ritualStoneWater; + break; + case FIRE: + rl = ritualStoneFire; + break; + case EARTH: + rl = ritualStoneEarth; + break; + case AIR: + rl = ritualStoneAir; + break; + case DAWN: + rl = ritualStoneDawn; + break; + case DUSK: + rl = ritualStoneDusk; + break; + } - RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ); + Model3D model = getBlockModel(rl); + + RenderResizableCuboid.INSTANCE.renderCube(model, stack, buffer, 0xDDFFFFFF, 0x00F000F0, OverlayTexture.NO_OVERLAY); } + stack.pop(); } - - GlStateManager.popMatrix(); } public static void renderRitualStones(MatrixStack stack, IRenderTypeBuffer renderer, TileMasterRitualStone masterRitualStone, float partialTicks) { IVertexBuilder buffer = renderer.getBuffer(Atlases.getTranslucentCullBlockType()); - System.out.println("Attempting to render stones"); ClientPlayerEntity player = minecraft.player; World world = player.getEntityWorld(); Direction direction = mrsHoloDirection; @@ -204,10 +211,6 @@ public class ClientHandler { return; } -// GlStateManager.pushMatrix(); -// GlStateManager.enableBlend(); -// GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); -// GlStateManager.color4f(1F, 1F, 1F, 0.5F); BlockPos vec3, vX; vec3 = masterRitualStone.getPos(); @@ -226,11 +229,14 @@ public class ClientHandler double minY = vX.getY() - eyePos.y; double minZ = vX.getZ() - eyePos.z; +// double minX = vX.getX() - posX; +// double minY = vX.getY() - posY; +// double minZ = vX.getZ() - posZ; + stack.translate(minX, minY, minZ); if (!world.getBlockState(vX).isOpaqueCube(world, vX)) { - ResourceLocation rl = null; switch (ritualComponent.getRuneType()) diff --git a/src/main/resources/assets/bloodmagic/textures/item/ritualdivinerdawn.png b/src/main/resources/assets/bloodmagic/textures/item/ritualdivinerdawn.png new file mode 100644 index 0000000000000000000000000000000000000000..e06871c720ab17407d9d310079e525f575d7e691 GIT binary patch literal 1366 zcmbVMZA=?w96um1HjCR_7P}>8mm@5iaJ{#_-AOs2$4kvx8>kt{jP!cL6Ky^0E8hs}WsI7z@R+D16+G(l9tBu-Emfny|%5(Hy+F@zIdc@Wc@ zDn^+mu71UqdGa7JT~9C=mP{sXNy?_EZ5Tn*G=`HHNunkK)w*S!Poc6_p4Y$uO;DwT zE-5mc)5u4ZF5QEeo-T(FPx$?-ie+sjQD(}p6raEd8;-@}xww|ln%)Hdbz@Dm7V1s_ ztO;mJmnxX`h?eKcX7289Cr||fYKE1K%)_Xk5X=j+eJn4de-9GsXDH%rk2CqZk!~1gV^xExS%IP9%O+lXP zlQo@}1(3HbnYLHB-urSHuL^iwQA3K-k?(?FOwkoBrX*mm7k+fNB#TN?dn{L><$yV$ zN_&A=uPSkPDaDMmhIxlT;7*a^QHmDrC{Ek$C@=67D!Lp54FurA-8izs7yobSFw-e4 z*C+q!o4m+u#@u#w3e3am90A!J9@U(ZvhMcH5LED-kE;o#eu~^P47RA^h2kOcbmp@0 zTV`M1JA>Z`swY0~Uq4jv%+X5AT7nBV>n^ci zzTv(ep3gD4u+uHD(N-FmKQY)BZ`Q zQc5N-^#+_fOC|^9M(b=Tk!8PrC4GHy&;C!34-b|#yz5(32CmF2nRD5p6MO&a73u!& zQs>nt&OH6=qOmZ;_AkthkySyhO}yy{hcABg;?#MAD?AOKof;2^Po2eY&6ZED+v6hf zqlG(%r&()g{7`nw)`JaV+8mm@5iaJ{#_-AOs2$4kvx8>kt{jP!cL6Ky^0E8hs}WsI7z@R+D16+G(l9tBu-Emfny|%5(Hy+F@zIdc@Wc@ zDn^+mu71UqdGa7JT~9C=mP{sXNy?_EZ5Tn*G=`HHNunkK)w*S!Poc6_p4Y$uO;DwT zE-5mc)5u4ZF5QEeo-T(FPx$?-ie+sjQD(}p6raEd8;-@}xww|ln%)Hdbz@Dm7V1s_ ztO;mJmnxX`h?eKcX7289Cr||fYKE1K%)_Xk5X=j+eJn4de-9GsXDH%rk2CqZk!~1gV^xExS%IP9%O+lXP zlQo@}1(3HbnYLHB-urSHuL^iwQA3K-k?(?FOwkoBrX*mm7k+fNB#TN?dn{L><$yV$ zN_&A=uPSkPDaDMmhIxlT;7*a^QHmDrC{Ek$C@=67D!Lp54FurA-8izs7yobSFw-e4 z*C+q!o4m+u#@u#w3e3am90A!J9@U(ZvhMcH5LED-kE;o#eu~^P47RA^h2kOcbmp@0 zTV`M1JA>Z`swY0~Uq4jv%+X5AT7nBV>n^ci zzTv(ep3gD4u+uHD(N-FmKQY)BZ`Q zQc5N-^#+_fOC|^9M(b=Tk!8PrC4GHy&;C!34-b|#yz5(32CmF2nRD5p6MO&a73u!& zQs>nt&OH6=qOmZ;_AkthkySyhO}yy{hcABg;?#MAD?AOKof;2^Po2eY&6ZED+v6hf zqlG(%r&()g{7`nw)`JaV+ Date: Sun, 25 Oct 2020 11:17:22 -0400 Subject: [PATCH 450/595] Added lava crystal Added the Lava Crystal and fixed a bug where it would take a lot of LP initially. Now correctly only draws LP when getContainer is called. --- src/generated/resources/.cache/cache | 1 + .../bloodmagic/models/item/lavacrystal.json | 6 + .../common/data/GeneratorBaseRecipes.java | 1 + .../common/data/GeneratorLanguage.java | 2 + .../common/item/BloodMagicItems.java | 1 + .../common/item/ItemLavaCrystal.java | 117 ++++++++++++++++++ 6 files changed, 128 insertions(+) create mode 100644 src/generated/resources/assets/bloodmagic/models/item/lavacrystal.json create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemLavaCrystal.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index b3623613..d848edd0 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -71,6 +71,7 @@ b5708a8cc7259fd36ffeabd155ea085b9fdef0fd assets/bloodmagic/models/item/firescrib 44663089f348642bcca1c5020b5081c3ab172f92 assets/bloodmagic/models/item/growthsigil.json f68825f667ca73b4373fd5068a47f0d1ca9b2aad assets/bloodmagic/models/item/icesigil.json 109b5485c25d978af55b46682d5bfa7008909458 assets/bloodmagic/models/item/infusedslate.json +413fa378c40dec89cb765a7d5c8bfc9cdef1d828 assets/bloodmagic/models/item/lavacrystal.json 588c5208e3f4ef941cd8375aeceeed44484d85d3 assets/bloodmagic/models/item/lavasigil.json 5a76914a87fc9b99079bb6afed1d4cfe3e4a532e assets/bloodmagic/models/item/lightritualstone.json 15d8178b626da912334774142d40d1012fb21fa0 assets/bloodmagic/models/item/magicianbloodorb.json diff --git a/src/generated/resources/assets/bloodmagic/models/item/lavacrystal.json b/src/generated/resources/assets/bloodmagic/models/item/lavacrystal.json new file mode 100644 index 00000000..59a62520 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/lavacrystal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/lavacrystal" + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java index 1d445664..ab91c09b 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java @@ -47,6 +47,7 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider 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.BLANK_RITUAL_STONE.get(), 4).key('a', Tags.Items.OBSIDIAN).key('b', BloodMagicItems.REINFORCED_SLATE.get()).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_APPRENTICE.get())).patternLine("aba").patternLine("bcb").patternLine("aba").addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_stone_blank")); ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.MASTER_RITUAL_STONE.get()).key('a', Tags.Items.OBSIDIAN).key('b', BloodMagicBlocks.BLANK_RITUAL_STONE.get()).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MAGICIAN.get())).patternLine("aba").patternLine("bcb").patternLine("aba").addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_stone_master")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.LAVA_CRYSTAL.get()).key('a', Tags.Items.GLASS).key('b', Items.LAVA_BUCKET).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).key('d', Tags.Items.OBSIDIAN).key('e', Tags.Items.GEMS_DIAMOND).patternLine("aba").patternLine("bcb").patternLine("ded").addCriterion("has_weak_orb", hasItem(BloodMagicItems.WEAK_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("lava_crystal")); // 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/GeneratorLanguage.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java index f2299b04..f1018ec5 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java @@ -71,6 +71,7 @@ public class GeneratorLanguage extends LanguageProvider 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.inscriber.desc", "The writing is on the wall..."); add("tooltip.bloodmagic.sigil.water.desc", "Infinite water, anyone?"); add("tooltip.bloodmagic.sigil.lava.desc", "HOT! DO NOT EAT"); @@ -178,6 +179,7 @@ public class GeneratorLanguage extends LanguageProvider addItem(BloodMagicItems.DAGGER_OF_SACRIFICE, "Dagger of Sacrifice"); addItem(BloodMagicItems.SACRIFICIAL_DAGGER, "Sacrificial Knife"); + addItem(BloodMagicItems.LAVA_CRYSTAL, "Lava Crystal"); addItem(BloodMagicItems.REAGENT_WATER, "Water Reagent"); addItem(BloodMagicItems.REAGENT_LAVA, "Lava Reagent"); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java index 97f0a557..30ae733e 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java @@ -96,6 +96,7 @@ public class BloodMagicItems public static final RegistryObject ARCANE_ASHES = BASICITEMS.register("arcaneashes", () -> new ItemArcaneAshes()); public static final RegistryObject DAGGER_OF_SACRIFICE = BASICITEMS.register("daggerofsacrifice", () -> new ItemDaggerOfSacrifice()); + public static final RegistryObject LAVA_CRYSTAL = BASICITEMS.register("lavacrystal", () -> new ItemLavaCrystal()); // Ritual stuffs public static final RegistryObject WEAK_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalweak", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.WEAK)); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemLavaCrystal.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemLavaCrystal.java new file mode 100644 index 00000000..8f1ce086 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemLavaCrystal.java @@ -0,0 +1,117 @@ +package wayoftime.bloodmagic.common.item; + +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.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effects; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +//TODO: Make some hook somewhere that attaches the pos to the ticket otherwise the tickets are basically useless lmao +public class ItemLavaCrystal extends ItemBindableBase +{ + public ItemLavaCrystal() + { + super(); + } + + @Override + public ItemStack getContainerItem(ItemStack stack) + { + Binding binding = getBinding(stack); + if (binding != null) + NetworkHelper.getSoulNetwork(binding.getOwnerId()).syphon(SoulTicket.item(stack, 50)); + + ItemStack returnStack = new ItemStack(this); + returnStack.setTag(stack.getTag()); + return returnStack; + } + + @Override + public boolean hasContainerItem(ItemStack stack) + { + return true; + } + + @Override + public int getBurnTime(ItemStack stack) + { + Binding binding = getBinding(stack); + if (binding == null) + return -1; + +// if (NetworkHelper.syphonFromContainer(stack, SoulTicket.item(stack, 25))) + if (NetworkHelper.canSyphonFromContainer(stack, 50)) + 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.getTag() == null) // hasTagCompound doesn't work on empty stacks with tags +// return null; +// +// NBTBase bindingTag = stack.getTag().get("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; +// +// NBTTagCompound nbt = (NBTTagCompound) bindingTag; +// return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompoundTag("id")), nbt.getString("name")); +// } + + @Override + public ActionResultType onItemUse(ItemUseContext context) + { + BlockPos pos = context.getPos(); + Direction facing = context.getFace(); + pos = pos.offset(facing); + PlayerEntity player = context.getPlayer(); + Hand hand = context.getHand(); + ItemStack itemstack = player.getHeldItem(hand); + + Binding binding = getBinding(player.getHeldItem(hand)); + + if (binding == null) + return ActionResultType.FAIL; + + if (!player.canPlayerEdit(pos, facing, itemstack)) + return ActionResultType.FAIL; + + if (context.getWorld().isAirBlock(pos) + && NetworkHelper.getSoulNetwork(binding).syphonAndDamage(player, SoulTicket.item(player.getHeldItem(hand), 100)).isSuccess()) + { + context.getWorld().playSound(player, pos, SoundEvents.ITEM_FIRECHARGE_USE, SoundCategory.BLOCKS, 1.0F, random.nextFloat() + * 0.4F + 0.8F); + context.getWorld().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; + } +} From 9a274186b75d761b4a41ab6ef558c04dbf33627d Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 25 Oct 2020 11:28:44 -0400 Subject: [PATCH 451/595] Ghost block fix Fixed the ClientHandler method for rendering the Ritual's ghost block. --- src/generated/resources/.cache/cache | 4 ++- .../assets/bloodmagic/lang/en_us.json | 2 ++ .../recipes/bloodmagictab/lava_crystal.json | 32 +++++++++++++++++++ .../data/bloodmagic/recipes/lava_crystal.json | 29 +++++++++++++++++ .../util/handler/event/ClientHandler.java | 21 ++++-------- 5 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/lava_crystal.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/lava_crystal.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index d848edd0..1a1bca55 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -17,7 +17,7 @@ e1a98bd53fca155e4bbb03c1e548341af0f84bd7 assets/bloodmagic/blockstates/masterrit b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json 487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json -770d87c47f343107732e9191d216803419324608 assets/bloodmagic/lang/en_us.json +af6eebbeef7c75844a0651065016fecb365595dd assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json 3c98a88c2283ad54f0efb9d7194361bbc3e93c17 assets/bloodmagic/models/block/altarcapacityrune.json @@ -147,6 +147,7 @@ e897d6f91e2a0bd12b0da0a50e5c897294989e7c data/bloodmagic/advancements/recipes/bl 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 +344567e6f5671131addcfebbd92d18e5cbd66ef5 data/bloodmagic/advancements/recipes/bloodmagictab/lava_crystal.json c8e5cdac0e7328640ab1cb0eab0a46f0733b59b3 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_blank.json 1578416eb302aecb3fd61e481634c5c021541f51 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_master.json 832301a424345b7ca70b43cb214faa104179f0fb data/bloodmagic/advancements/recipes/bloodmagictab/sacrificial_dagger.json @@ -204,6 +205,7 @@ f905c1a8ca4d3a9f841ca6c44caa91de327fc29d data/bloodmagic/recipes/blood_rune_char 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 +9dedad36e9d2ab6688e069c2e6df3851c395b583 data/bloodmagic/recipes/lava_crystal.json 7757e5fd52f71b0d21595e072593fc592210dd64 data/bloodmagic/recipes/ritual_stone_blank.json 8608f828f997b1a8015287bd9cd436e9d7dff2ff data/bloodmagic/recipes/ritual_stone_master.json aefbf1fd258f1cda8d04db7e0794b9612993e6bf data/bloodmagic/recipes/sacrificial_dagger.json diff --git a/src/generated/resources/assets/bloodmagic/lang/en_us.json b/src/generated/resources/assets/bloodmagic/lang/en_us.json index cd53036e..239385da 100644 --- a/src/generated/resources/assets/bloodmagic/lang/en_us.json +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -47,6 +47,7 @@ "item.bloodmagic.growthsigil": "Sigil of the Green Grove", "item.bloodmagic.icesigil": "Sigil of the Frozen Lake", "item.bloodmagic.infusedslate": "Imbued Slate", + "item.bloodmagic.lavacrystal": "Lava Crystal", "item.bloodmagic.lavasigil": "Lava Sigil", "item.bloodmagic.life_essence_bucket": "Bucket of Life", "item.bloodmagic.magicianbloodorb": "Magician Blood Orb", @@ -145,6 +146,7 @@ "tooltip.bloodmagic.diviner.totalRune": "Total Runes: %d", "tooltip.bloodmagic.diviner.waterRune": "Water Runes: %d", "tooltip.bloodmagic.extraInfo": "&9-Hold shift for more info-", + "tooltip.bloodmagic.inscriber.desc": "The writing is on the wall...", "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...", diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/lava_crystal.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/lava_crystal.json new file mode 100644 index 00000000..84bc8f36 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/lava_crystal.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:lava_crystal" + ] + }, + "criteria": { + "has_weak_orb": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:weakbloodorb" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:lava_crystal" + } + } + }, + "requirements": [ + [ + "has_weak_orb", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/lava_crystal.json b/src/generated/resources/data/bloodmagic/recipes/lava_crystal.json new file mode 100644 index 00000000..7a96e775 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/lava_crystal.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aba", + "bcb", + "ded" + ], + "key": { + "a": { + "tag": "forge:glass" + }, + "b": { + "item": "minecraft:lava_bucket" + }, + "c": { + "type": "bloodmagic:bloodorb", + "orb_tier": 1 + }, + "d": { + "tag": "forge:obsidian" + }, + "e": { + "tag": "forge:gems/diamond" + } + }, + "result": { + "item": "bloodmagic:lavacrystal" + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java index 16e61ecb..0ff8c4b0 100644 --- a/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java @@ -9,6 +9,7 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.Atlases; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.texture.AtlasTexture; @@ -131,6 +132,8 @@ public class ClientHandler private static void renderRitualStones(MatrixStack stack, IRenderTypeBuffer renderer, ClientPlayerEntity player, float partialTicks) { + ActiveRenderInfo activerenderinfo = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); + Vector3d eyePos = activerenderinfo.getProjectedView(); IVertexBuilder buffer = renderer.getBuffer(Atlases.getTranslucentCullBlockType()); World world = player.getEntityWorld(); ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); @@ -142,9 +145,6 @@ public class ClientHandler BlockPos vec3, vX; vec3 = ((BlockRayTraceResult) minecraft.objectMouseOver).getPos(); - double posX = player.lastTickPosX + (player.getPosX() - player.lastTickPosX) * partialTicks; - double posY = player.lastTickPosY + (player.getPosY() - player.lastTickPosY) * partialTicks; - double posZ = player.lastTickPosZ + (player.getPosZ() - player.lastTickPosZ) * partialTicks; List components = Lists.newArrayList(); ritual.gatherComponents(components::add); @@ -152,13 +152,9 @@ public class ClientHandler { stack.push(); vX = vec3.add(ritualComponent.getOffset(direction)); - Vector3d eyePos = player.getEyePosition(partialTicks); double minX = vX.getX() - eyePos.x; double minY = vX.getY() - eyePos.y; double minZ = vX.getZ() - eyePos.z; -// double minX = vX.getX() - posX; -// double minY = vX.getY() - posY; -// double minZ = vX.getZ() - posZ; stack.translate(minX, minY, minZ); @@ -201,6 +197,8 @@ public class ClientHandler public static void renderRitualStones(MatrixStack stack, IRenderTypeBuffer renderer, TileMasterRitualStone masterRitualStone, float partialTicks) { + ActiveRenderInfo activerenderinfo = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); + Vector3d eyePos = activerenderinfo.getProjectedView(); IVertexBuilder buffer = renderer.getBuffer(Atlases.getTranslucentCullBlockType()); ClientPlayerEntity player = minecraft.player; World world = player.getEntityWorld(); @@ -214,9 +212,6 @@ public class ClientHandler BlockPos vec3, vX; vec3 = masterRitualStone.getPos(); - double posX = player.lastTickPosX + (player.getPosX() - player.lastTickPosX) * partialTicks; - double posY = player.lastTickPosY + (player.getPosY() - player.lastTickPosY) * partialTicks; - double posZ = player.lastTickPosZ + (player.getPosZ() - player.lastTickPosZ) * partialTicks; List components = Lists.newArrayList(); ritual.gatherComponents(components::add); @@ -224,15 +219,11 @@ public class ClientHandler { stack.push(); vX = vec3.add(ritualComponent.getOffset(direction)); - Vector3d eyePos = player.getEyePosition(partialTicks); + double minX = vX.getX() - eyePos.x; double minY = vX.getY() - eyePos.y; double minZ = vX.getZ() - eyePos.z; -// double minX = vX.getX() - posX; -// double minY = vX.getY() - posY; -// double minZ = vX.getZ() - posZ; - stack.translate(minX, minY, minZ); if (!world.getBlockState(vX).isOpaqueCube(world, vX)) From 6e3f1b3a4e715e20b80113c1606e8d28ae0841cb Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 25 Oct 2020 11:51:58 -0400 Subject: [PATCH 452/595] RItual Recipes Finished adding the base recipes that are required for the Rituals. --- .../wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java | 3 +++ .../bloodmagic/common/recipe/BloodAltarRecipeProvider.java | 1 + 2 files changed, 4 insertions(+) diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java index ab91c09b..d2f11e9d 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java @@ -34,6 +34,8 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider 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")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.BASE_RITUAL_DIVINER.get()).key('a', BloodMagicItems.AIR_INSCRIPTION_TOOL.get()).key('s', Tags.Items.RODS_WOODEN).key('d', Tags.Items.GEMS_DIAMOND).key('e', BloodMagicItems.EARTH_INSCRIPTION_TOOL.get()).key('f', BloodMagicItems.FIRE_INSCRIPTION_TOOL.get()).key('w', BloodMagicItems.WATER_INSCRIPTION_TOOL.get()).addCriterion("has_scribe", hasItem(BloodMagicItems.AIR_INSCRIPTION_TOOL.get())).build(consumer, BloodMagic.rl("ritual_diviner_0")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.DUSK_RITUAL_DIVINER.get()).key('S', BloodMagicItems.DEMONIC_SLATE.get()).key('t', BloodMagicItems.DUSK_INSCRIPTION_TOOL.get()).key('d', BloodMagicItems.BASE_RITUAL_DIVINER.get()).patternLine(" S ").patternLine("tdt").patternLine(" S ").addCriterion("has_demon_slate", hasItem(BloodMagicItems.DEMONIC_SLATE.get())).build(consumer, BloodMagic.rl("ritual_diviner_1")); } private void addBloodOrbRecipes(Consumer consumer) @@ -47,6 +49,7 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider 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.BLANK_RITUAL_STONE.get(), 4).key('a', Tags.Items.OBSIDIAN).key('b', BloodMagicItems.REINFORCED_SLATE.get()).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_APPRENTICE.get())).patternLine("aba").patternLine("bcb").patternLine("aba").addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_stone_blank")); ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.MASTER_RITUAL_STONE.get()).key('a', Tags.Items.OBSIDIAN).key('b', BloodMagicBlocks.BLANK_RITUAL_STONE.get()).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MAGICIAN.get())).patternLine("aba").patternLine("bcb").patternLine("aba").addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_stone_master")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.LAVA_CRYSTAL.get()).key('a', Tags.Items.GLASS).key('b', Items.LAVA_BUCKET).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).key('d', Tags.Items.OBSIDIAN).key('e', Tags.Items.GEMS_DIAMOND).patternLine("aba").patternLine("bcb").patternLine("ded").addCriterion("has_weak_orb", hasItem(BloodMagicItems.WEAK_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("lava_crystal")); // 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/recipe/BloodAltarRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java index 05a898a3..ab71d3f8 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java @@ -37,6 +37,7 @@ public class BloodAltarRecipeProvider implements ISubRecipeProvider BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_LAPIS), new ItemStack(BloodMagicItems.WATER_INSCRIPTION_TOOL.get()), AltarTier.THREE.ordinal(), 1000, 5, 5).build(consumer, BloodMagic.rl(basePath + "water_tool")); BloodAltarRecipeBuilder.altar(Ingredient.fromItems(Items.MAGMA_CREAM), new ItemStack(BloodMagicItems.FIRE_INSCRIPTION_TOOL.get()), AltarTier.THREE.ordinal(), 1000, 5, 5).build(consumer, BloodMagic.rl(basePath + "fire_tool")); BloodAltarRecipeBuilder.altar(Ingredient.fromItems(Items.GHAST_TEAR), new ItemStack(BloodMagicItems.AIR_INSCRIPTION_TOOL.get()), AltarTier.THREE.ordinal(), 1000, 5, 5).build(consumer, BloodMagic.rl(basePath + "air_tool")); + BloodAltarRecipeBuilder.altar(Ingredient.fromItems(BloodMagicItems.LAVA_CRYSTAL.get()), new ItemStack(BloodMagicItems.WEAK_ACTIVATION_CRYSTAL.get()), AltarTier.THREE.ordinal(), 10000, 20, 10).build(consumer, BloodMagic.rl("weak_activation_crystal")); // 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")); From 4ac0f311249fae429e31d8cf0584676ff75563a5 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 25 Oct 2020 14:00:11 -0400 Subject: [PATCH 453/595] Additional Rituals Added Ritual of Magnetism and Ritual of Crushing. --- .../entity/projectile/EntitySoulSnare.java | 2 +- .../java/WayofTime/bloodmagic/util/Utils.java | 390 ++++++++++++++++++ .../util/handler/event/WillHandler.java | 4 +- .../bloodmagic/potion/BloodMagicPotions.java | 6 +- .../bloodmagic/potion/PotionFireFuse.java | 40 ++ .../ritual/types/RitualCrushing.java | 360 ++++++++++++++++ .../bloodmagic/ritual/types/RitualLava.java | 362 ++++++++++++++++ .../ritual/types/RitualMagnetic.java | 202 +++++++++ .../util/handler/event/ClientHandler.java | 2 +- 9 files changed, 1362 insertions(+), 6 deletions(-) create mode 100644 src/main/java/wayoftime/bloodmagic/potion/PotionFireFuse.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrushing.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/types/RitualLava.java create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/types/RitualMagnetic.java diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java index 4510f1ac..b19b87d7 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java @@ -58,7 +58,7 @@ public class EntitySoulSnare extends ProjectileItemEntity if (result.getEntity() instanceof LivingEntity) { - ((LivingEntity) result.getEntity()).addPotionEffect(new EffectInstance(BloodMagicPotions.soulSnare, 300, 0)); + ((LivingEntity) result.getEntity()).addPotionEffect(new EffectInstance(BloodMagicPotions.SOUL_SNARE, 300, 0)); result.getEntity().attackEntityFrom(DamageSource.causeThrownDamage(this, this.func_234616_v_()), (float) 0); } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 061e85ea..6f17f4d6 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -2,8 +2,31 @@ package wayoftime.bloodmagic.util; import java.util.Locale; +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.block.NetherPortalBlock; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.potion.Effects; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import wayoftime.bloodmagic.tile.TileInventory; @@ -55,4 +78,371 @@ public class Utils { return String.valueOf(input.charAt(0)).toUpperCase(Locale.ENGLISH) + input.substring(1); } + + public static boolean isImmuneToFireDamage(LivingEntity entity) + { + return entity.isImmuneToFire() || entity.isPotionActive(Effects.FIRE_RESISTANCE); + } + + public static boolean isBlockLiquid(BlockState state) + { + return (state instanceof IFluidBlock || state.getMaterial().isLiquid()); + } + + public static boolean isFlowingLiquid(World world, BlockPos pos, BlockState state) + { + Block block = state.getBlock(); + return ((block instanceof IFluidBlock && Math.abs(((IFluidBlock) block).getFilledPercentage(world, pos)) == 1) + || (block instanceof FlowingFluidBlock + && !((FlowingFluidBlock) block).getFluidState(state).isSource())); + } + + public static boolean spawnStackAtBlock(World world, BlockPos pos, @Nullable Direction pushDirection, ItemStack stack) + { + BlockPos spawnPos = new BlockPos(pos); + + double velX = 0; + double velY = 0; + double velZ = 0; + double velocity = 0.15D; + if (pushDirection != null) + { + spawnPos = spawnPos.offset(pushDirection); + + switch (pushDirection) + { + case DOWN: + { + velY = -velocity; + break; + } + case UP: + { + velY = velocity; + break; + } + case NORTH: + { + velZ = -velocity; + break; + } + case SOUTH: + { + velZ = velocity; + break; + } + case WEST: + { + velX = -velocity; + break; + } + case EAST: + { + velX = velocity; + break; + } + } + } + + double posX = spawnPos.getX() + 0.5; + double posY = spawnPos.getY() + 0.5; + double posZ = spawnPos.getZ() + 0.5; + + ItemEntity entityItem = new ItemEntity(world, posX, posY, posZ, stack); + entityItem.setVelocity(velX, velY, velZ); + + entityItem.setItem(stack); + return world.addEntity(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.write(initialTag); + if (finalTile != null) + finalTile.write(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_ENDERMAN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); + finalWorld.playSound(finalPos.getX(), finalPos.getY(), finalPos.getZ(), SoundEvents.ENTITY_ENDERMAN_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); + TileEntity newTileInitial = TileEntity.readTileEntity(finalBlockState, initialTag); + + finalWorld.setTileEntity(finalPos, newTileInitial); +// newTileInitial.setPos(finalPos); + newTileInitial.setWorldAndPos(finalWorld, finalPos); + } + + initialWorld.setBlockState(initialPos, finalBlockState, 3); + + if (finalTile != null) + { +// TileEntity newTileFinal = TileEntity.create(initialWorld, finalTag); + TileEntity newTileFinal = TileEntity.readTileEntity(initialBlockState, finalTag); + + initialWorld.setTileEntity(initialPos, newTileFinal); +// newTileFinal.setPos(initialPos); + newTileFinal.setWorldAndPos(initialWorld, initialPos); + } + + initialWorld.notifyNeighborsOfStateChange(initialPos, finalState.getBlock()); + finalWorld.notifyNeighborsOfStateChange(finalPos, initialState.getBlock()); + + return true; + } + + public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, Direction dir) + { + LazyOptional capability = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); + if (capability.isPresent()) + { + IItemHandler handler = capability.resolve().get(); + + return insertStackIntoTile(stack, handler); + } else if (tile instanceof IInventory) + { + return insertStackIntoInventory(stack, (IInventory) tile, dir); + } + + return stack; + } + + 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; + } + + public static int getNumberOfFreeSlots(TileEntity tile, Direction dir) + { + int slots = 0; + + LazyOptional capability = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); + if (capability.isPresent()) + { + IItemHandler handler = capability.resolve().get(); + + 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 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, 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 = ItemHandlerHelper.canItemStacksStack(stack, invStack); + if (canCombine) + { + if (invStack.isEmpty()) + { + itemsLeft = 0; + } else + { + itemsLeft -= (invStack.getMaxStackSize() - invStack.getCount()); + } + } + + if (itemsLeft <= 0) + { + return true; + } + } + + return false; + } + + /** + * @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.split(transferedAmount); + if (stack2.isEmpty()) + { + stack2 = copyStack; + } else + { + stack2.grow(transferedAmount); + } + } + } + + returned[0] = stack1; + returned[1] = stack2; + + return returned; + } } 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 6f01c0e6..c4fe0395 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -72,10 +72,10 @@ public class WillHandler DamageSource source = event.getSource(); Entity entity = source.getTrueSource(); - if (attackedEntity.isPotionActive(BloodMagicPotions.soulSnare) && (attackedEntity instanceof MobEntity + if (attackedEntity.isPotionActive(BloodMagicPotions.SOUL_SNARE) && (attackedEntity instanceof MobEntity || attackedEntity.getEntityWorld().getDifficulty() == Difficulty.PEACEFUL)) { - EffectInstance eff = attackedEntity.getActivePotionEffect(BloodMagicPotions.soulSnare); + EffectInstance eff = attackedEntity.getActivePotionEffect(BloodMagicPotions.SOUL_SNARE); int lvl = eff.getAmplifier(); double amountOfSouls = attackedEntity.getEntityWorld().rand.nextDouble() * (lvl + 1) * (lvl + 1) * 4 + 1; diff --git a/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java b/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java index 8e4cd60a..a47fe2b4 100644 --- a/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java +++ b/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java @@ -6,11 +6,13 @@ import net.minecraftforge.registries.IForgeRegistry; public class BloodMagicPotions { - public static final Effect soulSnare = new PotionSoulSnare(); + public static final Effect SOUL_SNARE = new PotionSoulSnare(); + public static final Effect FIRE_FUSE = new PotionFireFuse(); public static void registerPotions(RegistryEvent.Register evt) { IForgeRegistry reg = evt.getRegistry(); - reg.register(soulSnare.setRegistryName("soulsnare")); + reg.register(SOUL_SNARE.setRegistryName("soulsnare")); + reg.register(FIRE_FUSE.setRegistryName("firefuse")); } } diff --git a/src/main/java/wayoftime/bloodmagic/potion/PotionFireFuse.java b/src/main/java/wayoftime/bloodmagic/potion/PotionFireFuse.java new file mode 100644 index 00000000..639a6ed7 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/potion/PotionFireFuse.java @@ -0,0 +1,40 @@ +package wayoftime.bloodmagic.potion; + +import java.util.Random; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.potion.EffectType; +import net.minecraft.world.Explosion; + +public class PotionFireFuse extends PotionBloodMagic +{ + public PotionFireFuse() + { + super(EffectType.HARMFUL, 0xFF0000FF); + } + + @Override + public void performEffect(LivingEntity entity, int amplifier) + { + if (entity.world.isRemote) + { + return; + } + + Random random = entity.world.rand; + entity.getEntityWorld().addParticle(ParticleTypes.FLAME, entity.getPosX() + + random.nextDouble() * 0.3, entity.getPosY() + + random.nextDouble() * 0.3, entity.getPosZ() + random.nextDouble() * 0.3, 0, 0.06d, 0); + + int radius = amplifier + 1; + + if (entity.getActivePotionEffect(BloodMagicPotions.FIRE_FUSE).getDuration() <= 3) + { + Explosion.Mode explosion$mode = net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(entity.world, entity) + ? Explosion.Mode.DESTROY + : Explosion.Mode.NONE; + entity.getEntityWorld().createExplosion(null, entity.getPosX(), entity.getPosY(), entity.getPosZ(), radius, false, explosion$mode); + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrushing.java new file mode 100644 index 00000000..87c264bf --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrushing.java @@ -0,0 +1,360 @@ +package wayoftime.bloodmagic.ritual.types; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import com.mojang.authlib.GameProfile; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BlockMasterRitualStone; +import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler; +import wayoftime.bloodmagic.ritual.AreaDescriptor; +import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.ritual.IMasterRitualStone; +import wayoftime.bloodmagic.ritual.IRitualStone; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.RitualComponent; +import wayoftime.bloodmagic.ritual.RitualRegister; +import wayoftime.bloodmagic.util.Utils; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +@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; + + private static final ItemStack mockPick = new ItemStack(Items.DIAMOND_PICKAXE, 1); + static + { + mockPick.addEnchantment(Enchantments.SILK_TOUCH, 1); + } + + 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(); + if (world.isRemote) + { + return; + } + 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 instanceof BlockMasterRitualStone || block instanceof IRitualStone + || state.getBlockHardness(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; +// } +// +// } + + Blocks d; + if (!isBlockClaimed && isSilkTouch) + { + LootContext.Builder lootBuilder = new LootContext.Builder((ServerWorld) world); + Vector3d blockCenter = new Vector3d(newPos.getX() + 0.5, newPos.getY() + 0.5, newPos.getZ() + 0.5); + List silkDrops = state.getDrops(lootBuilder.withParameter(LootParameters.field_237457_g_, blockCenter).withParameter(LootParameters.TOOL, mockPick)); + + for (ItemStack item : silkDrops) + { + 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 (steadfastWill >= steadfastWillDrain) + { + WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastWillDrain, true); + steadfastWill -= steadfastWillDrain; + } else + { + continue; + } + + } else if (!isBlockClaimed) + { + if (fortune > 0 && destructiveWill < destructiveWillDrain) + { + fortune = 0; + } + + ItemStack mockFortunePick = new ItemStack(Items.DIAMOND_PICKAXE, 1); + mockFortunePick.addEnchantment(Enchantments.FORTUNE, fortune); + + LootContext.Builder lootBuilder = new LootContext.Builder((ServerWorld) world); + Vector3d blockCenter = new Vector3d(newPos.getX() + 0.5, newPos.getY() + 0.5, newPos.getZ() + 0.5); + List stackList = state.getDrops(lootBuilder.withParameter(LootParameters.field_237457_g_, blockCenter).withParameter(LootParameters.TOOL, mockFortunePick)); +// List stackList = Block.getDrops(state, world, newPos, world.getTileEntity(newPos)); + +// 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/RitualLava.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualLava.java new file mode 100644 index 00000000..ae29c08b --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualLava.java @@ -0,0 +1,362 @@ +package wayoftime.bloodmagic.ritual.types; + +import java.util.List; +import java.util.function.Consumer; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +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.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler; +import wayoftime.bloodmagic.potion.BloodMagicPotions; +import wayoftime.bloodmagic.ritual.AreaDescriptor; +import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.ritual.IMasterRitualStone; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.RitualComponent; +import wayoftime.bloodmagic.ritual.RitualRegister; +import wayoftime.bloodmagic.util.DamageSourceBloodMagic; +import wayoftime.bloodmagic.util.Utils; +import wayoftime.bloodmagic.will.DemonWillHolder; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +@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(world, newPos, state)) + { + int lpCost = getLPCostForRawWill(rawWill); + if (currentEssence < lpCost) + { + break; + } + world.setBlockState(newPos, Blocks.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) + { + LazyOptional capability = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null); + if (capability.isPresent()) + { + IFluidHandler handler = capability.resolve().get(); + double filled = handler.fill(new FluidStack(Fluids.LAVA, 1000), FluidAction.EXECUTE); + + 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(BloodMagicPotions.FIRE_FUSE)) + { + entity.addPotionEffect(new EffectInstance(BloodMagicPotions.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.isAlive() && 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/RitualMagnetic.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualMagnetic.java new file mode 100644 index 00000000..16aab5ef --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualMagnetic.java @@ -0,0 +1,202 @@ +package wayoftime.bloodmagic.ritual.types; + +import java.util.function.Consumer; + +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.BlockPos; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.ritual.AreaDescriptor; +import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.ritual.IMasterRitualStone; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.RitualComponent; +import wayoftime.bloodmagic.ritual.RitualRegister; +import wayoftime.bloodmagic.util.Utils; + +@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(); + Vector3d MRSpos = new Vector3d(masterRitualStone.getBlockPos().getX(), masterRitualStone.getBlockPos().getY(), masterRitualStone.getBlockPos().getZ()); + 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); + Vector3d newPosVector = new Vector3d(newPos.getX(), newPos.getY(), newPos.getZ()); + BlockState state = world.getBlockState(newPos); +// RayTraceResult fakeRayTrace = world.rayTraceBlocks(MRSpos, newPosVector, false); +// ItemStack checkStack = state.getBlock().getPickBlock(state, fakeRayTrace, world, newPos, getFakePlayer((ServerWorld) world)); + ItemStack checkStack = new ItemStack(state.getBlock()); + 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; + + return stack.getItem().isIn(Tags.Items.ORES); + +// for(ResourceLocation rl : stack.getItem().getTags()) +// { +// rl.getPath() +// } + +// 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/util/handler/event/ClientHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java index 0ff8c4b0..033cc947 100644 --- a/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java @@ -49,7 +49,7 @@ public class ClientHandler public static ResourceLocation ritualStoneEarth = BloodMagic.rl("block/earthritualstone");; public static ResourceLocation ritualStoneAir = BloodMagic.rl("block/airritualstone");; public static ResourceLocation ritualStoneDawn = BloodMagic.rl("block/dawnritualstone");; - public static ResourceLocation ritualStoneDusk = BloodMagic.rl("block/lightritualstone");; + public static ResourceLocation ritualStoneDusk = BloodMagic.rl("block/duskritualstone");; public static TextureAtlasSprite blankBloodRune; public static TextureAtlasSprite stoneBrick; public static TextureAtlasSprite glowstone; From 2a8143844aa6d7145c40acfe996c521386d7108b Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 25 Oct 2020 14:19:05 -0400 Subject: [PATCH 454/595] Crushing Ritual fix Fixed a crash on servers for the Crushing Ritual. Also added the Ritual of the Feathered Knife. --- .../java/WayofTime/bloodmagic/util/Utils.java | 2 +- .../bloodmagic/potion/BloodMagicPotions.java | 3 + .../ritual/types/RitualFeatheredKnife.java | 255 ++++++++++++++++++ 3 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 src/main/java/wayoftime/bloodmagic/ritual/types/RitualFeatheredKnife.java diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 6f17f4d6..69389827 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -149,7 +149,7 @@ public class Utils double posZ = spawnPos.getZ() + 0.5; ItemEntity entityItem = new ItemEntity(world, posX, posY, posZ, stack); - entityItem.setVelocity(velX, velY, velZ); + entityItem.setMotion(velX, velY, velZ); entityItem.setItem(stack); return world.addEntity(entityItem); diff --git a/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java b/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java index a47fe2b4..3f449a97 100644 --- a/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java +++ b/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java @@ -1,6 +1,7 @@ package wayoftime.bloodmagic.potion; import net.minecraft.potion.Effect; +import net.minecraft.potion.EffectType; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.registries.IForgeRegistry; @@ -8,11 +9,13 @@ public class BloodMagicPotions { public static final Effect SOUL_SNARE = new PotionSoulSnare(); public static final Effect FIRE_FUSE = new PotionFireFuse(); + public static final Effect SOUL_FRAY = new PotionBloodMagic(EffectType.HARMFUL, 0xFFFFFFFF); public static void registerPotions(RegistryEvent.Register evt) { IForgeRegistry reg = evt.getRegistry(); reg.register(SOUL_SNARE.setRegistryName("soulsnare")); reg.register(FIRE_FUSE.setRegistryName("firefuse")); + reg.register(SOUL_FRAY.setRegistryName("soulfray")); } } diff --git a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualFeatheredKnife.java new file mode 100644 index 00000000..ef6cf518 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualFeatheredKnife.java @@ -0,0 +1,255 @@ +package wayoftime.bloodmagic.ritual.types; + +import java.util.List; +import java.util.function.Consumer; + +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.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.ConfigHandler; +import wayoftime.bloodmagic.altar.IBloodAltar; +import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler; +import wayoftime.bloodmagic.potion.BloodMagicPotions; +import wayoftime.bloodmagic.ritual.AreaDescriptor; +import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.ritual.IMasterRitualStone; +import wayoftime.bloodmagic.ritual.Ritual; +import wayoftime.bloodmagic.ritual.RitualComponent; +import wayoftime.bloodmagic.ritual.RitualRegister; +import wayoftime.bloodmagic.util.helper.PlayerSacrificeHelper; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +@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(BloodMagicPotions.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(BloodMagicPotions.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; + } +} From ec1b0644cb3c523945244b38c8927a056b039c5c Mon Sep 17 00:00:00 2001 From: WayofTime Date: Mon, 26 Oct 2020 15:53:09 -0400 Subject: [PATCH 455/595] Framework for ARC Initial framework for the ARC block, including GUI, Container, Tile Entity, and Block. --- build.gradle | 2 +- src/generated/resources/.cache/cache | 9 + .../alchemicalreactionchamber.json | 34 +++ .../block/alchemicalreactionchamber.json | 9 + .../item/alchemicalreactionchamber.json | 3 + .../bloodmagictab/ritual_diviner_0.json | 32 +++ .../bloodmagictab/ritual_diviner_1.json | 32 +++ .../blocks/alchemicalreactionchamber.json | 19 ++ .../bloodmagic/recipes/ritual_diviner_0.json | 31 +++ .../bloodmagic/recipes/ritual_diviner_1.json | 22 ++ .../recipes/weak_activation_crystal.json | 13 ++ .../java/WayofTime/bloodmagic/BloodMagic.java | 2 + .../bloodmagic/tile/TileSoulForge.java | 42 ---- .../bloodmagic/client/ClientEvents.java | 2 + .../ScreenAlchemicalReactionChamber.java | 84 ++++++++ .../block/BlockAlchemicalReactionChamber.java | 162 ++++++++++++++ .../common/block/BlockSoulForge.java | 47 +++-- .../common/block/BloodMagicBlocks.java | 4 + .../common/data/GeneratorBaseRecipes.java | 2 +- .../common/data/GeneratorBlockStates.java | 25 +++ .../common/data/GeneratorItemModels.java | 1 + .../common/data/GeneratorLootTable.java | 1 + .../common/item/BloodMagicItems.java | 1 + .../bloodmagic/common/item/IARCTool.java | 6 + .../common/item/sigil/ItemSigilFluidBase.java | 5 +- .../tile/TileAlchemicalReactionChamber.java | 129 ++++++++++++ .../ContainerAlchemicalReactionChamber.java | 198 ++++++++++++++++++ .../bloodmagic/textures/block/arc_bottom.png | Bin 0 -> 915 bytes .../bloodmagic/textures/block/arc_front.png | Bin 0 -> 1283 bytes .../bloodmagic/textures/block/arc_side.png | Bin 0 -> 1200 bytes .../bloodmagic/textures/block/arc_top.png | Bin 0 -> 1317 bytes .../bloodmagic/textures/gui/arc_gui.png | Bin 0 -> 18575 bytes 32 files changed, 847 insertions(+), 70 deletions(-) create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/alchemicalreactionchamber.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/alchemicalreactionchamber.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/alchemicalreactionchamber.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/ritual_diviner_0.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/ritual_diviner_1.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/weak_activation_crystal.json create mode 100644 src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemicalReactionChamber.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/IARCTool.java create mode 100644 src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java create mode 100644 src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java create mode 100644 src/main/resources/assets/bloodmagic/textures/block/arc_bottom.png create mode 100644 src/main/resources/assets/bloodmagic/textures/block/arc_front.png create mode 100644 src/main/resources/assets/bloodmagic/textures/block/arc_side.png create mode 100644 src/main/resources/assets/bloodmagic/textures/block/arc_top.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/arc_gui.png diff --git a/build.gradle b/build.gradle index f06f3e9a..fa742ba4 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.16.3-3.0-0' +version = '1.16.3-3.0-1' group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'BloodMagic' diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1a1bca55..94f44db7 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1,5 +1,6 @@ cb435652c27b4978d8db83af2fd531ccaa82ada7 assets/bloodmagic/blockstates/accelerationrune.json 43be0406da1c9f7cf734427bea235a65cda073d2 assets/bloodmagic/blockstates/airritualstone.json +5ba8e1b2a7ef85028044056cc971b8fe02ab7e7f assets/bloodmagic/blockstates/alchemicalreactionchamber.json 4a60c54def00d68368ed0a0d4783979aa63d5f60 assets/bloodmagic/blockstates/altarcapacityrune.json 950fff9f06033741091aa8a66a62857da673efb9 assets/bloodmagic/blockstates/bettercapacityrune.json 8a5edb859a6f4d0adfbe2f608bab6b8c8addf01a assets/bloodmagic/blockstates/blankrune.json @@ -20,6 +21,7 @@ e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritu af6eebbeef7c75844a0651065016fecb365595dd assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json +adf6c0b1e25451609486dc8c8cfbd9cf0f8c67f4 assets/bloodmagic/models/block/alchemicalreactionchamber.json 3c98a88c2283ad54f0efb9d7194361bbc3e93c17 assets/bloodmagic/models/block/altarcapacityrune.json 7cd62092c6fb3109e016d42090cf89bfa3ab7fca assets/bloodmagic/models/block/bettercapacityrune.json 1fe0f89895addb7abcacf6ce7e39b6ddc87b0d85 assets/bloodmagic/models/block/blankrune.json @@ -44,6 +46,7 @@ a8a1d06fcc2f8395530c72d2846133fff37d5537 assets/bloodmagic/models/block/sacrific fe8e3deb3ad0107ca3ebd70694c1fc55a987d912 assets/bloodmagic/models/item/airritualstone.json 0bcf230493163a43357cbee7c26b8756089cb548 assets/bloodmagic/models/item/airscribetool.json 17cbe9142ef3950ea1b6be11694b849f55e93f13 assets/bloodmagic/models/item/airsigil.json +92cc51b70ce22796804d093e3fc21141658f85fd assets/bloodmagic/models/item/alchemicalreactionchamber.json f150f178edf7d6d250bcfd84af1c28a21cff09c6 assets/bloodmagic/models/item/altarcapacityrune.json 866b8cdd3da56e2e82dbd5f16ab5117b5a503749 assets/bloodmagic/models/item/apprenticebloodorb.json 719e38516b76596e177809508b4e2b28f05acfb0 assets/bloodmagic/models/item/arcaneashes.json @@ -148,6 +151,8 @@ e897d6f91e2a0bd12b0da0a50e5c897294989e7c data/bloodmagic/advancements/recipes/bl 263f7c251d2f163db5bd229f2ab8a222f23ae03a data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_self_sacrifice.json 7ca400d1141ff4be1b529cd060950b42cf3b9bfb data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_speed.json 344567e6f5671131addcfebbd92d18e5cbd66ef5 data/bloodmagic/advancements/recipes/bloodmagictab/lava_crystal.json +01e90bb9c59d44a52777ecc0cf28754295fda675 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json +836e1fc171dba197e02d6a9e3e61a3718cb5a482 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json c8e5cdac0e7328640ab1cb0eab0a46f0733b59b3 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_blank.json 1578416eb302aecb3fd61e481634c5c021541f51 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_master.json 832301a424345b7ca70b43cb214faa104179f0fb data/bloodmagic/advancements/recipes/bloodmagictab/sacrificial_dagger.json @@ -155,6 +160,7 @@ c8e5cdac0e7328640ab1cb0eab0a46f0733b59b3 data/bloodmagic/advancements/recipes/bl 7a7f9f995d2414289d07c0a145647c8e735a6b78 data/bloodmagic/advancements/recipes/bloodmagictab/soul_snare.json 639ebb2ccabb2eaece59be96c2e6f28c31f4d2f4 data/bloodmagic/loot_tables/blocks/accelerationrune.json 26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/airritualstone.json +1ed1f3cebe68450b6d5ca3ce69e4728a7d250b1c data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.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 @@ -206,6 +212,8 @@ b63d77c3762f86d4a91f62e192c3e9b26e3b52ca data/bloodmagic/recipes/blood_rune_sacr 7c4e247c1df6ef594bbb2fc2196afb102f45982b data/bloodmagic/recipes/blood_rune_self_sacrifice.json e2bcf2a6f951fbcef45554ec90ba28d14e261d18 data/bloodmagic/recipes/blood_rune_speed.json 9dedad36e9d2ab6688e069c2e6df3851c395b583 data/bloodmagic/recipes/lava_crystal.json +bfd7925ad30534463d7daf0f7dce03cf1502cbcf data/bloodmagic/recipes/ritual_diviner_0.json +2ec436681cdd169bae99d090bb889c2a45420b6c data/bloodmagic/recipes/ritual_diviner_1.json 7757e5fd52f71b0d21595e072593fc592210dd64 data/bloodmagic/recipes/ritual_stone_blank.json 8608f828f997b1a8015287bd9cd436e9d7dff2ff data/bloodmagic/recipes/ritual_stone_master.json aefbf1fd258f1cda8d04db7e0794b9612993e6bf data/bloodmagic/recipes/sacrificial_dagger.json @@ -222,3 +230,4 @@ e517023dc3e32929344ff5415397fc833bfbc29a data/bloodmagic/recipes/soulforge/reage c0e75e0e12290d191245c5b0b5b13bc739d2ff44 data/bloodmagic/recipes/soulforge/reagent_void.json a222d09abf1ea61feb684f2ac23d011c2034f526 data/bloodmagic/recipes/soulforge/reagent_water.json 7e281841a2953c1284d332c2bbf75097f8128241 data/bloodmagic/recipes/soulforge/sentientsword.json +d7d993bb729284a5201c164ea81fbe1d8e4e4750 data/bloodmagic/recipes/weak_activation_crystal.json diff --git a/src/generated/resources/assets/bloodmagic/blockstates/alchemicalreactionchamber.json b/src/generated/resources/assets/bloodmagic/blockstates/alchemicalreactionchamber.json new file mode 100644 index 00000000..05658c8b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/alchemicalreactionchamber.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=north,lit=false": { + "model": "bloodmagic:block/alchemicalreactionchamber" + }, + "facing=south,lit=false": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 180 + }, + "facing=west,lit=false": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 270 + }, + "facing=east,lit=false": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 90 + }, + "facing=north,lit=true": { + "model": "bloodmagic:block/alchemicalreactionchamber" + }, + "facing=south,lit=true": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 180 + }, + "facing=west,lit=true": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 270 + }, + "facing=east,lit=true": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/alchemicalreactionchamber.json b/src/generated/resources/assets/bloodmagic/models/block/alchemicalreactionchamber.json new file mode 100644 index 00000000..84690dfc --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/alchemicalreactionchamber.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "side": "bloodmagic:block/arc_side", + "front": "bloodmagic:block/arc_front", + "bottom": "bloodmagic:block/arc_bottom", + "top": "bloodmagic:block/arc_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/alchemicalreactionchamber.json b/src/generated/resources/assets/bloodmagic/models/item/alchemicalreactionchamber.json new file mode 100644 index 00000000..bb6ed1e2 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/alchemicalreactionchamber.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/alchemicalreactionchamber" +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json new file mode 100644 index 00000000..ac4dd373 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:ritual_diviner_0" + ] + }, + "criteria": { + "has_scribe": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:airscribetool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:ritual_diviner_0" + } + } + }, + "requirements": [ + [ + "has_scribe", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json new file mode 100644 index 00000000..b671e3bd --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:ritual_diviner_1" + ] + }, + "criteria": { + "has_demon_slate": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:demonslate" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:ritual_diviner_1" + } + } + }, + "requirements": [ + [ + "has_demon_slate", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json new file mode 100644 index 00000000..e3d6ee73 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:alchemicalreactionchamber" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_0.json b/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_0.json new file mode 100644 index 00000000..5806cf36 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_0.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "dfd", + "ase", + "dwd" + ], + "key": { + "a": { + "item": "bloodmagic:airscribetool" + }, + "s": { + "tag": "forge:rods/wooden" + }, + "d": { + "tag": "forge:gems/diamond" + }, + "e": { + "item": "bloodmagic:earthscribetool" + }, + "f": { + "item": "bloodmagic:firescribetool" + }, + "w": { + "item": "bloodmagic:waterscribetool" + } + }, + "result": { + "item": "bloodmagic:ritualdiviner" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_1.json b/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_1.json new file mode 100644 index 00000000..46a797ed --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_1.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "tdt", + " S " + ], + "key": { + "S": { + "item": "bloodmagic:demonslate" + }, + "t": { + "item": "bloodmagic:duskscribetool" + }, + "d": { + "item": "bloodmagic:ritualdiviner" + } + }, + "result": { + "item": "bloodmagic:ritualdivinerdusk" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/weak_activation_crystal.json b/src/generated/resources/data/bloodmagic/recipes/weak_activation_crystal.json new file mode 100644 index 00000000..ba19a174 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/weak_activation_crystal.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "item": "bloodmagic:lavacrystal" + }, + "output": { + "item": "bloodmagic:activationcrystalweak" + }, + "upgradeLevel": 2, + "altarSyphon": 10000, + "consumptionRate": 20, + "drainRate": 10 +} \ 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 2fc39a67..4b3aa5ce 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -50,6 +50,7 @@ import wayoftime.bloodmagic.core.registry.OrbRegistry; import wayoftime.bloodmagic.network.BloodMagicPacketHandler; import wayoftime.bloodmagic.potion.BloodMagicPotions; import wayoftime.bloodmagic.ritual.RitualManager; +import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; import wayoftime.bloodmagic.tile.TileAlchemyArray; import wayoftime.bloodmagic.tile.TileAltar; import wayoftime.bloodmagic.tile.TileMasterRitualStone; @@ -151,6 +152,7 @@ public class BloodMagic 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")); event.getRegistry().register(TileEntityType.Builder.create(TileMasterRitualStone::new, BloodMagicBlocks.MASTER_RITUAL_STONE.get()).build(null).setRegistryName("masterritualstone")); + event.getRegistry().register(TileEntityType.Builder.create(TileAlchemicalReactionChamber::new, BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()).build(null).setRegistryName("alchemicalreactionchamber")); } @SubscribeEvent diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 0dcdcc12..6f8fccde 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -231,48 +231,6 @@ public class TileSoulForge extends TileInventory return ((double) burnTime) / ticksRequired; } -// 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(); -// } -// } - public double getWill(EnumDemonWillType type) { ItemStack soulStack = getStackInSlot(soulSlot); diff --git a/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java b/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java index 8d3b6065..032df2a9 100644 --- a/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java +++ b/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java @@ -16,6 +16,7 @@ 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.ScreenAlchemicalReactionChamber; import wayoftime.bloodmagic.client.screens.ScreenSoulForge; import wayoftime.bloodmagic.common.block.BloodMagicBlocks; import wayoftime.bloodmagic.common.item.BloodMagicItems; @@ -39,6 +40,7 @@ public class ClientEvents public static void registerContainerScreens() { ScreenManager.registerFactory(BloodMagicBlocks.SOUL_FORGE_CONTAINER.get(), ScreenSoulForge::new); + ScreenManager.registerFactory(BloodMagicBlocks.ARC_CONTAINER.get(), ScreenAlchemicalReactionChamber::new); } public static void registerItemModelProperties(FMLClientSetupEvent event) diff --git a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java new file mode 100644 index 00000000..cc06b489 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java @@ -0,0 +1,84 @@ +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.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; +import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; + +public class ScreenAlchemicalReactionChamber extends ScreenBase +{ + private static final ResourceLocation background = new ResourceLocation(BloodMagic.MODID, "textures/gui/arc_gui.png"); + public TileAlchemicalReactionChamber tileARC; + + public ScreenAlchemicalReactionChamber(ContainerAlchemicalReactionChamber container, PlayerInventory playerInventory, ITextComponent title) + { + super(container, playerInventory, title); + tileARC = container.tileARC; + 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.arc.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/block/BlockAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemicalReactionChamber.java new file mode 100644 index 00000000..da151b5c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemicalReactionChamber.java @@ -0,0 +1,162 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.HorizontalBlock; +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.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.AbstractFurnaceTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.fml.network.NetworkHooks; +import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; + +public class BlockAlchemicalReactionChamber extends Block +{ + public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + public static final BooleanProperty LIT = BlockStateProperties.LIT; + + public BlockAlchemicalReactionChamber() + { + super(Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(2).sound(SoundType.STONE)); + this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH).with(LIT, Boolean.valueOf(false))); + } + + @Override + public boolean hasTileEntity(BlockState state) + { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) + { + return new TileAlchemicalReactionChamber(); + } + + @Override + public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) + { + TileAlchemicalReactionChamber arc = (TileAlchemicalReactionChamber) world.getTileEntity(blockPos); + if (arc != null) + arc.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 TileAlchemicalReactionChamber) + { + ((TileAlchemicalReactionChamber) tileentity).dropItems(); + worldIn.updateComparatorOutputLevel(pos, this); + } + + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } + + @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 TileAlchemicalReactionChamber)) + 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 BlockState getStateForPlacement(BlockItemUseContext context) + { + return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + /** + * Called by ItemBlocks after a block is set in the world, to allow post-place + * logic + */ + @Override + public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) + { + if (stack.hasDisplayName()) + { + TileEntity tileentity = worldIn.getTileEntity(pos); + if (tileentity instanceof AbstractFurnaceTileEntity) + { + ((AbstractFurnaceTileEntity) tileentity).setCustomName(stack.getDisplayName()); + } + } + + } + + /** + * Returns the blockstate with the given rotation from the passed blockstate. If + * inapplicable, returns the passed blockstate. + * + * @deprecated call via {@link IBlockState#withRotation(Rotation)} whenever + * possible. Implementing/overriding is fine. + */ + @Override + public BlockState rotate(BlockState state, Rotation rot) + { + return state.with(FACING, rot.rotate(state.get(FACING))); + } + + /** + * Returns the blockstate with the given mirror of the passed blockstate. If + * inapplicable, returns the passed blockstate. + * + * @deprecated call via {@link IBlockState#withMirror(Mirror)} whenever + * possible. Implementing/overriding is fine. + */ + @Override + public BlockState mirror(BlockState state, Mirror mirrorIn) + { + return state.rotate(mirrorIn.toRotation(state.get(FACING))); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) + { + builder.add(FACING, LIT); + } + + public boolean eventReceived(BlockState state, World worldIn, BlockPos pos, int id, int param) + { + super.eventReceived(state, worldIn, pos, id, param); + TileEntity tileentity = worldIn.getTileEntity(pos); + return tileentity == null ? false : tileentity.receiveClientEvent(id, param); + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java index 27f7b461..dba36a9a 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java @@ -15,6 +15,7 @@ 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 net.minecraftforge.fml.network.NetworkHooks; @@ -27,13 +28,6 @@ public class BlockSoulForge extends Block// implements IBMBlock 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 @@ -76,20 +70,29 @@ public class BlockSoulForge extends Block// implements IBMBlock 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 void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) + { + TileSoulForge forge = (TileSoulForge) world.getTileEntity(blockPos); + if (forge != null) + forge.dropItems(); -// -// @Override -// public BlockItem getItem() -// { -// return new BlockItem(this); -// } + 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 TileSoulForge) + { + ((TileSoulForge) tileentity).dropItems(); + worldIn.updateComparatorOutputLevel(pos, this); + } + + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java index 48e0dc40..af778e7d 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java @@ -19,6 +19,7 @@ import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.block.enums.BloodRuneType; import wayoftime.bloodmagic.common.item.BloodMagicItems; import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; import wayoftime.bloodmagic.tile.contailer.ContainerSoulForge; public class BloodMagicBlocks @@ -59,6 +60,8 @@ public class BloodMagicBlocks public static final RegistryObject MASTER_RITUAL_STONE = BASICBLOCKS.register("masterritualstone", () -> new BlockMasterRitualStone(false)); + public static final RegistryObject ALCHEMICAL_REACTION_CHAMBER = BLOCKS.register("alchemicalreactionchamber", () -> new BlockAlchemicalReactionChamber()); + 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); @@ -71,6 +74,7 @@ public class BloodMagicBlocks 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> ARC_CONTAINER = CONTAINERS.register("arc_container", () -> IForgeContainerType.create(ContainerAlchemicalReactionChamber::new)); // public static final RegistryObject BLOOD_STONE = registerNoItem("blood_stone", () -> new BloodstoneBlock()); // //// private static RegistryObject register(String name, Supplier sup, Function, Supplier> itemCreator) diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java index d2f11e9d..346be435 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java @@ -34,7 +34,7 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider 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")); - ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.BASE_RITUAL_DIVINER.get()).key('a', BloodMagicItems.AIR_INSCRIPTION_TOOL.get()).key('s', Tags.Items.RODS_WOODEN).key('d', Tags.Items.GEMS_DIAMOND).key('e', BloodMagicItems.EARTH_INSCRIPTION_TOOL.get()).key('f', BloodMagicItems.FIRE_INSCRIPTION_TOOL.get()).key('w', BloodMagicItems.WATER_INSCRIPTION_TOOL.get()).addCriterion("has_scribe", hasItem(BloodMagicItems.AIR_INSCRIPTION_TOOL.get())).build(consumer, BloodMagic.rl("ritual_diviner_0")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.BASE_RITUAL_DIVINER.get()).key('a', BloodMagicItems.AIR_INSCRIPTION_TOOL.get()).key('s', Tags.Items.RODS_WOODEN).key('d', Tags.Items.GEMS_DIAMOND).key('e', BloodMagicItems.EARTH_INSCRIPTION_TOOL.get()).key('f', BloodMagicItems.FIRE_INSCRIPTION_TOOL.get()).key('w', BloodMagicItems.WATER_INSCRIPTION_TOOL.get()).patternLine("dfd").patternLine("ase").patternLine("dwd").addCriterion("has_scribe", hasItem(BloodMagicItems.AIR_INSCRIPTION_TOOL.get())).build(consumer, BloodMagic.rl("ritual_diviner_0")); ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.DUSK_RITUAL_DIVINER.get()).key('S', BloodMagicItems.DEMONIC_SLATE.get()).key('t', BloodMagicItems.DUSK_INSCRIPTION_TOOL.get()).key('d', BloodMagicItems.BASE_RITUAL_DIVINER.get()).patternLine(" S ").patternLine("tdt").patternLine(" S ").addCriterion("has_demon_slate", hasItem(BloodMagicItems.DEMONIC_SLATE.get())).build(consumer, BloodMagic.rl("ritual_diviner_1")); } diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java index 04b013f1..38288795 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java @@ -2,11 +2,15 @@ package wayoftime.bloodmagic.common.data; import net.minecraft.block.Block; import net.minecraft.data.DataGenerator; +import net.minecraft.util.Direction; import net.minecraftforge.client.model.generators.BlockStateProvider; import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.VariantBlockStateBuilder; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.fml.RegistryObject; import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BlockAlchemicalReactionChamber; import wayoftime.bloodmagic.common.block.BloodMagicBlocks; public class GeneratorBlockStates extends BlockStateProvider @@ -35,6 +39,8 @@ public class GeneratorBlockStates extends BlockStateProvider buildCubeAll(BloodMagicBlocks.EARTH_RITUAL_STONE.get()); buildCubeAll(BloodMagicBlocks.DUSK_RITUAL_STONE.get()); buildCubeAll(BloodMagicBlocks.DAWN_RITUAL_STONE.get()); + + buildFurnace(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()); } private void buildCubeAll(Block block) @@ -42,4 +48,23 @@ public class GeneratorBlockStates extends BlockStateProvider getVariantBuilder(block).forAllStates(state -> ConfiguredModel.builder().modelFile(cubeAll(block)).build()); } + private void buildFurnace(Block block) + { +// ConfiguredModel[] furnaceModel = ConfiguredModel.builder().modelFile().build(); + ModelFile furnace_off = models().orientableWithBottom("alchemicalreactionchamber", BloodMagic.rl("block/arc_side"), BloodMagic.rl("block/arc_front"), BloodMagic.rl("block/arc_bottom"), BloodMagic.rl("block/arc_top")); +// getVariantBuilder(block).addModels(block.getDefaultState().with(BlockAlchemicalReactionChamber.FACING, Direction.NORTH).with(BlockAlchemicalReactionChamber.LIT, false), furnaceModel); + + VariantBlockStateBuilder builder = getVariantBuilder(block); + + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.NORTH).with(BlockAlchemicalReactionChamber.LIT, false).modelForState().modelFile(furnace_off).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.EAST).with(BlockAlchemicalReactionChamber.LIT, false).modelForState().modelFile(furnace_off).rotationY(90).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.SOUTH).with(BlockAlchemicalReactionChamber.LIT, false).modelForState().modelFile(furnace_off).rotationY(180).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.WEST).with(BlockAlchemicalReactionChamber.LIT, false).modelForState().modelFile(furnace_off).rotationY(270).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.NORTH).with(BlockAlchemicalReactionChamber.LIT, true).modelForState().modelFile(furnace_off).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.EAST).with(BlockAlchemicalReactionChamber.LIT, true).modelForState().modelFile(furnace_off).rotationY(90).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.SOUTH).with(BlockAlchemicalReactionChamber.LIT, true).modelForState().modelFile(furnace_off).rotationY(180).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.WEST).with(BlockAlchemicalReactionChamber.LIT, true).modelForState().modelFile(furnace_off).rotationY(270).addModel(); + +// getVariantBuilder(block). + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java index 77739743..35edebf5 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java @@ -43,6 +43,7 @@ public class GeneratorItemModels extends ItemModelProvider registerBlockModel(BloodMagicBlocks.EARTH_RITUAL_STONE.get()); registerBlockModel(BloodMagicBlocks.DUSK_RITUAL_STONE.get()); registerBlockModel(BloodMagicBlocks.DAWN_RITUAL_STONE.get()); + registerBlockModel(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()); registerToggleableItem(BloodMagicItems.GREEN_GROVE_SIGIL.get()); registerToggleableItem(BloodMagicItems.FAST_MINER_SIGIL.get()); diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java index 4115ea9a..5315c433 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java @@ -60,6 +60,7 @@ public class GeneratorLootTable extends LootTableProvider registerDropping(BloodMagicBlocks.EARTH_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); registerDropping(BloodMagicBlocks.DUSK_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); registerDropping(BloodMagicBlocks.DAWN_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerDropSelfLootTable(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()); } private void registerNoDropLootTable(Block block) diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java index 30ae733e..cd5a0ad0 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java @@ -62,6 +62,7 @@ public class BloodMagicItems public static final RegistryObject EARTH_RITUAL_STONE_ITEM = ITEMS.register("earthritualstone", () -> new BlockItem(BloodMagicBlocks.EARTH_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); public static final RegistryObject DUSK_RITUAL_STONE_ITEM = ITEMS.register("duskritualstone", () -> new BlockItem(BloodMagicBlocks.DUSK_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); public static final RegistryObject DAWN_RITUAL_STONE_ITEM = ITEMS.register("lightritualstone", () -> new BlockItem(BloodMagicBlocks.DAWN_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject ALCHEMICAL_REACTION_CHAMBER_ITEM = ITEMS.register("alchemicalreactionchamber", () -> new BlockItem(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get(), new Item.Properties().group(BloodMagic.TAB))); public static final RegistryObject MASTER_RITUAL_STONE_ITEM = ITEMS.register("masterritualstone", () -> new BlockItem(BloodMagicBlocks.MASTER_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/IARCTool.java b/src/main/java/wayoftime/bloodmagic/common/item/IARCTool.java new file mode 100644 index 00000000..11112588 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/IARCTool.java @@ -0,0 +1,6 @@ +package wayoftime.bloodmagic.common.item; + +public interface IARCTool +{ + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java index 53224f84..4a9319e9 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java @@ -5,7 +5,6 @@ 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; @@ -54,10 +53,8 @@ public abstract class ItemSigilFluidBase extends ItemSigilBase { 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) diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java new file mode 100644 index 00000000..06be3d0e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java @@ -0,0 +1,129 @@ +package wayoftime.bloodmagic.tile; + +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.nbt.CompoundNBT; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.minecraftforge.registries.ObjectHolder; +import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; +import wayoftime.bloodmagic.util.Constants; + +public class TileAlchemicalReactionChamber extends TileInventory implements ITickableTileEntity, INamedContainerProvider +{ + @ObjectHolder("bloodmagic:alchemicalreactionchamber") + public static TileEntityType TYPE; + + public static final int ARC_TOOL_SLOT = 0; + public static final int OUTPUT_SLOT = 1; + public static final int NUM_OUTPUTS = 5; + public static final int INPUT_SLOT = 6; + public static final int INPUT_BUCKET_SLOT = 7; + public static final int OUTPUT_BUCKET_SLOT = 8; + + public FluidTank inputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 2); + public FluidTank outputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 2); + +// Input slots are from 0 to 3. + + public int burnTime = 0; + + public TileAlchemicalReactionChamber(TileEntityType type) + { + super(type, 9, "alchemicalreactionchamber"); + } + + public TileAlchemicalReactionChamber() + { + this(TYPE); + } + + @Override + public void deserialize(CompoundNBT tag) + { + super.deserialize(tag); + + burnTime = tag.getInt(Constants.NBT.SOUL_FORGE_BURN); + } + + @Override + public CompoundNBT serialize(CompoundNBT tag) + { + super.serialize(tag); + + tag.putInt(Constants.NBT.SOUL_FORGE_BURN, burnTime); + return tag; + } + + @Override + public void tick() + { + + } + +// 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(); +// } +// } + + @Override + public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) + { + assert world != null; + return new ContainerAlchemicalReactionChamber(this, p_createMenu_1_, p_createMenu_2_); + } + + @Override + public ITextComponent getDisplayName() + { + return new StringTextComponent("Alchemical Reaction Chamber"); + } + + public double getProgressForGui() + { + return 0; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java new file mode 100644 index 00000000..8b600788 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java @@ -0,0 +1,198 @@ +package wayoftime.bloodmagic.tile.contailer; + +import java.util.Optional; + +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.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.IARCTool; +import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; + +public class ContainerAlchemicalReactionChamber extends Container +{ + public final TileAlchemicalReactionChamber tileARC; + +// public ContainerSoulForge(InventoryPlayer inventoryPlayer, IInventory tileARC) +// { +// this.tileARC = tileARC; +// +// } + + public ContainerAlchemicalReactionChamber(int windowId, PlayerInventory playerInventory, PacketBuffer extraData) + { + this((TileAlchemicalReactionChamber) playerInventory.player.world.getTileEntity(extraData.readBlockPos()), windowId, playerInventory); + } + + public ContainerAlchemicalReactionChamber(@Nullable TileAlchemicalReactionChamber tile, int windowId, PlayerInventory playerInventory) + { + super(BloodMagicBlocks.ARC_CONTAINER.get(), windowId); + this.tileARC = tile; + this.setup(playerInventory, tile); + } + + public void setup(PlayerInventory inventory, IInventory tileARC) + { + this.addSlot(new SlotARCTool(tileARC, TileAlchemicalReactionChamber.ARC_TOOL_SLOT, 35, 51)); + for (int i = 0; i < TileAlchemicalReactionChamber.NUM_OUTPUTS; i++) + { + this.addSlot(new SlotOutput(tileARC, TileAlchemicalReactionChamber.OUTPUT_SLOT + i, 116, 15 + i * 18)); + } + this.addSlot(new Slot(tileARC, TileAlchemicalReactionChamber.INPUT_SLOT, 71, 15)); + this.addSlot(new SlotBucket(tileARC, TileAlchemicalReactionChamber.INPUT_BUCKET_SLOT, 8, 15, true)); + this.addSlot(new SlotBucket(tileARC, TileAlchemicalReactionChamber.OUTPUT_BUCKET_SLOT, 152, 87, false)); + +// this.addSlot(new SlotSoul(tileARC, TileSoulForge.soulSlot, 152, 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 >= 1 && index < 1 + 5) || (index == 7 || index == 8))// Attempting to transfer from output slots + // or bucket slots + { + if (!this.mergeItemStack(itemstack1, 9, 9 + 36, true)) + { + return ItemStack.EMPTY; + } + + slot.onSlotChange(itemstack1, itemstack); + } else if (index > 9) // Attempting to transfer from main inventory + { + if (itemstack1.getItem() instanceof IARCTool) // Try the tool slot first + { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) + { + return ItemStack.EMPTY; + } + } else if (isBucket(itemstack1, true)) // If it's a full bucket, transfer to tank filler slot. + { + if (!this.mergeItemStack(itemstack1, 7, 8, false)) + { + return ItemStack.EMPTY; + } + } else if (isBucket(itemstack1, false)) // If it's an empty bucket, transfer to tank emptier slot. + { + if (!this.mergeItemStack(itemstack1, 8, 9, false)) + { + return ItemStack.EMPTY; + } + } else if (!this.mergeItemStack(itemstack1, 6, 7, false)) + { + return ItemStack.EMPTY; + } + } else if (!this.mergeItemStack(itemstack1, 9, 45, false)) // Attempting to transfer from input slots + { + 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.tileARC.isUsableByPlayer(playerIn); + } + + private class SlotARCTool extends Slot + { + public SlotARCTool(IInventory inventory, int slotIndex, int x, int y) + { + super(inventory, slotIndex, x, y); + } + + @Override + public boolean isItemValid(ItemStack itemStack) + { + return itemStack.getItem() instanceof IARCTool; + } + } + + private class SlotBucket extends Slot + { + private final boolean needsFullBucket; + + public SlotBucket(IInventory inventory, int slotIndex, int x, int y, boolean needsFullBucket) + { + super(inventory, slotIndex, x, y); + this.needsFullBucket = needsFullBucket; + } + + @Override + public boolean isItemValid(ItemStack itemStack) + { + Optional fluidStackOptional = FluidUtil.getFluidContained(itemStack); + + return fluidStackOptional.isPresent() && ((needsFullBucket && !fluidStackOptional.get().isEmpty()) + || (!needsFullBucket && fluidStackOptional.get().isEmpty())); + } + } + + private static boolean isBucket(ItemStack stack, boolean requiredFull) + { + Optional fluidStackOptional = FluidUtil.getFluidContained(stack); + + return fluidStackOptional.isPresent() && ((requiredFull && !fluidStackOptional.get().isEmpty()) + || (!requiredFull && fluidStackOptional.get().isEmpty())); + } + + 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; + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/textures/block/arc_bottom.png b/src/main/resources/assets/bloodmagic/textures/block/arc_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab0e1201fad97abad7c98afb7a6a959f242eb38 GIT binary patch literal 915 zcmV;E18n?>P)EX>4Tx04R}tkv&MmKpe$iQ$;D23U*L&$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0Yam~RI_UWP&La) z#baVNw<`9$B7h-;5kkMjOg)ia%)oPe-NVP%yC~1{KKJM7Q}QMQd?N82(+!JwgLr1s z(mC%FhgnHdh|h_~4Z0xlBiCh@-#8Z?7I5bWxZD8-pLEHP9LY~pC=`JAGy0|+FmMY5*4*A&`#607GSt=b4RCM> zj1?(+-Q(T8oxS~grq$mMVS;j?z&5&G00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00C=BL_t(I%T-fJlEW|vY!=z7-13h6|6@5MQ6wM-4~(sg zsw|pb!1Q=LqP2#Iz!(F)cg#6KM2HAP1X^ogX3ROk%m4sp#^>{a&N*?v-$6tmBA6M7 z2zi(p5dn9vd*64sJIoB+d#|o*EdW47)HgG$Vj{w}ZCGnnGftWAj`KO&U}kLF1|ljY z5dk6sn;8H=L@w+if`}*;2><|9g^0k+pa~+P3kX0dNLCTSS_>jlc2q#&{yor80Cj4?n&P}TCCbrAtoJ*Hr0m3|hUGs*W~P^&Lc2pxckK_ z=f=5v$r@vnB6mk?4enk9s`~%0wAP@i=)L3hdez)TqzV&6MA-NJvat#P&*!t|{C>aD pdxx1_WREd$yWKFxs3za<7eA3sKmqZ1tQ-IU002ovPDHLkV1mU`iJ$-g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/block/arc_front.png b/src/main/resources/assets/bloodmagic/textures/block/arc_front.png new file mode 100644 index 0000000000000000000000000000000000000000..7b6cffb4fdcd94907b07ea654d09b7986d97adea GIT binary patch literal 1283 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 literal 0 HcmV?d00001 From 152525bbe37d77daaf21473bc7025e81044561dc Mon Sep 17 00:00:00 2001 From: WayofTime Date: Mon, 26 Oct 2020 16:08:04 -0400 Subject: [PATCH 456/595] Fixed crash on death for servers Fixed an issue where the client would crash when you died by the Sacrificial Knife when on a server. --- build.gradle | 2 +- src/generated/resources/.cache/cache | 2 +- src/generated/resources/assets/bloodmagic/lang/en_us.json | 1 + .../WayofTime/bloodmagic/util/DamageSourceBloodMagic.java | 5 ++--- .../wayoftime/bloodmagic/common/data/GeneratorLanguage.java | 2 ++ .../bloodmagic/common/item/ItemSacrificialDagger.java | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index fa742ba4..cf634db2 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.16.3-3.0-1' +version = '1.16.3-3.0-2' group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'BloodMagic' diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 94f44db7..75896b7e 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -18,7 +18,7 @@ e1a98bd53fca155e4bbb03c1e548341af0f84bd7 assets/bloodmagic/blockstates/masterrit b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json 487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json -af6eebbeef7c75844a0651065016fecb365595dd assets/bloodmagic/lang/en_us.json +775f7c01fb20ba9b55ff5c46d7fef0acd5f591ae assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json adf6c0b1e25451609486dc8c8cfbd9cf0f8c67f4 assets/bloodmagic/models/block/alchemicalreactionchamber.json diff --git a/src/generated/resources/assets/bloodmagic/lang/en_us.json b/src/generated/resources/assets/bloodmagic/lang/en_us.json index 239385da..7525e488 100644 --- a/src/generated/resources/assets/bloodmagic/lang/en_us.json +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -19,6 +19,7 @@ "block.bloodmagic.soulforge": "Hellfire Forge", "block.bloodmagic.speedrune": "Speed Rune", "block.bloodmagic.waterritualstone": "Water Ritual Stone", + "chat.bloodmagic.damageSource": "%s's soul became too weak", "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.ritual.prevent": "The ritual is actively resisting you!", diff --git a/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java index 82d69ee7..19ff1231 100644 --- a/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java @@ -3,8 +3,7 @@ package wayoftime.bloodmagic.util; 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; +import net.minecraft.util.text.TranslationTextComponent; public class DamageSourceBloodMagic extends DamageSource { @@ -21,6 +20,6 @@ public class DamageSourceBloodMagic extends DamageSource @Override public ITextComponent getDeathMessage(LivingEntity livingBase) { - return new StringTextComponent(TextHelper.localizeEffect("chat.bloodmagic.damageSource", livingBase.getName())); + return new TranslationTextComponent("chat.bloodmagic.damageSource", livingBase.getName()); } } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java index f1018ec5..ca769d38 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java @@ -19,6 +19,8 @@ public class GeneratorLanguage extends LanguageProvider // Creative Tab add("itemGroup.bloodmagic.creativeTab", "Blood Magic"); + add("chat.bloodmagic.damageSource", "%s's soul became too weak"); + // Tile Entitites add("tile.bloodmagic.soulforge.name", "Hellfire Forge"); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemSacrificialDagger.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemSacrificialDagger.java index 5f807d6e..b6062592 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/ItemSacrificialDagger.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemSacrificialDagger.java @@ -102,7 +102,7 @@ public class ItemSacrificialDagger extends Item player.hurtResistantTime = 0; player.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 0.001F); player.setHealth(Math.max(player.getHealth() - 1.998F, 0.0001f)); - if (player.getHealth() <= 0.001f) + if (player.getHealth() <= 0.001f && !world.isRemote) { player.onDeath(DamageSourceBloodMagic.INSTANCE); player.setHealth(0); From f9327d8f5a58c2cbf92de93fec0e58248836c1c6 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Mon, 26 Oct 2020 21:48:53 -0400 Subject: [PATCH 457/595] ARC Recipe Framework Part 1 Added the serializers, deserializers, builders, etc, for the Alchemical Reaction Chamber recipe, ARCRecipe. The block does not currently have the functionality to use it yet. And only when I am currently writing this do I realize I forgot to add FluidStack functionality to the recipes. Welp. --- .settings/org.eclipse.jdt.core.prefs | 6 +- src/generated/resources/.cache/cache | 3 + .../data/bloodmagic/recipes/arc/test1.json | 20 +++ .../data/bloodmagic/recipes/arc/test2.json | 12 ++ .../data/bloodmagic/tags/items/arc_tool.json | 6 + .../java/WayofTime/bloodmagic/BloodMagic.java | 9 +- .../api/impl/recipe/RecipeBloodAltar.java | 1 - .../core/recipe/IngredientBloodOrb.java | 31 +---- .../WayofTime/bloodmagic/util/Constants.java | 3 + .../bloodmagic/api/impl/recipe/RecipeARC.java | 110 +++++++++++++++ .../common/data/GeneratorBlockTags.java | 40 ++++++ .../common/data/GeneratorItemTags.java | 48 +++++++ .../data/recipe/BloodMagicRecipeProvider.java | 3 +- .../data/recipe/builder/ARCRecipeBuilder.java | 89 ++++++++++++ .../common/recipe/ARCRecipeProvider.java | 23 ++++ .../common/recipe/BloodMagicRecipeType.java | 2 + .../serializer/ARCRecipeSerializer.java | 127 ++++++++++++++++++ .../BloodMagicRecipeSerializers.java | 4 + .../common/tags/BloodMagicTags.java | 12 ++ .../bloodmagic/recipe/IRecipeARC.java | 40 ++++++ .../ContainerAlchemicalReactionChamber.java | 6 +- 21 files changed, 556 insertions(+), 39 deletions(-) create mode 100644 src/generated/resources/data/bloodmagic/recipes/arc/test1.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/arc/test2.json create mode 100644 src/generated/resources/data/bloodmagic/tags/items/arc_tool.json create mode 100644 src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockTags.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemTags.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/tags/BloodMagicTags.java create mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index d06adbc3..9bc7a5fb 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -20,7 +20,7 @@ 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_enum_constant=0 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 @@ -31,7 +31,7 @@ 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_enum_constants=49 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 @@ -49,7 +49,7 @@ 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_enum_declaration=0 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.alignment_for_throws_clause_in_constructor_declaration=16 diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 75896b7e..58e9535a 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -194,6 +194,8 @@ f38355165034ce314a9f0344ebc3a6cad22c76c8 data/bloodmagic/recipes/altar/reinforce 584d01dff4d64bb88bd3783751a29723700f1728 data/bloodmagic/recipes/altar/slate.json 926d4a0e165c87a15a609744d832d2f5f04a40d0 data/bloodmagic/recipes/altar/water_tool.json 7551501cf361667ec7454c307b9d2368536fbed6 data/bloodmagic/recipes/altar/weakbloodorb.json +4f511cfb93faf65aa50fabd7e753e0759ed95a1c data/bloodmagic/recipes/arc/test1.json +14e7bce6990a346e36171564c29f93a14e50df44 data/bloodmagic/recipes/arc/test2.json e1285ec51100f2336c1ea1a1a3057e74a0dd84d1 data/bloodmagic/recipes/array/airsigil.json d1ac23080f72f21adb5908befefe965ffb4efd4f data/bloodmagic/recipes/array/bloodlightsigil.json 1890706e5b93cd6df764b0419483c348e0d7f277 data/bloodmagic/recipes/array/divinationsigil.json @@ -231,3 +233,4 @@ c0e75e0e12290d191245c5b0b5b13bc739d2ff44 data/bloodmagic/recipes/soulforge/reage a222d09abf1ea61feb684f2ac23d011c2034f526 data/bloodmagic/recipes/soulforge/reagent_water.json 7e281841a2953c1284d332c2bbf75097f8128241 data/bloodmagic/recipes/soulforge/sentientsword.json d7d993bb729284a5201c164ea81fbe1d8e4e4750 data/bloodmagic/recipes/weak_activation_crystal.json +94ff722e094a3479433cad0e4a1386f68f170e7b data/bloodmagic/tags/items/arc_tool.json diff --git a/src/generated/resources/data/bloodmagic/recipes/arc/test1.json b/src/generated/resources/data/bloodmagic/recipes/arc/test1.json new file mode 100644 index 00000000..8e9d5d69 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/arc/test1.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:arc", + "input": { + "tag": "forge:gems/diamond" + }, + "tool": { + "tag": "forge:bones" + }, + "addedoutput": [ + { + "chance": 0.5, + "type": { + "item": "minecraft:diamond" + } + } + ], + "output": { + "item": "bloodmagic:altar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/arc/test2.json b/src/generated/resources/data/bloodmagic/recipes/arc/test2.json new file mode 100644 index 00000000..8037c2b9 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/arc/test2.json @@ -0,0 +1,12 @@ +{ + "type": "bloodmagic:arc", + "input": { + "tag": "forge:gems/diamond" + }, + "tool": { + "item": "minecraft:acacia_boat" + }, + "output": { + "item": "bloodmagic:altar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/tags/items/arc_tool.json b/src/generated/resources/data/bloodmagic/tags/items/arc_tool.json new file mode 100644 index 00000000..a0b7317d --- /dev/null +++ b/src/generated/resources/data/bloodmagic/tags/items/arc_tool.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "minecraft:diamond" + ] +} \ 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 4b3aa5ce..491329e2 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -38,7 +38,9 @@ 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.GeneratorBlockTags; import wayoftime.bloodmagic.common.data.GeneratorItemModels; +import wayoftime.bloodmagic.common.data.GeneratorItemTags; import wayoftime.bloodmagic.common.data.GeneratorLanguage; import wayoftime.bloodmagic.common.data.GeneratorLootTable; import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeProvider; @@ -117,7 +119,7 @@ public class BloodMagic private void registerRecipes(RegistryEvent.Register> event) { - System.out.println("Registering IngredientBloodOrb Serializer."); +// System.out.println("Registering IngredientBloodOrb Serializer."); CraftingHelper.register(IngredientBloodOrb.NAME, IngredientBloodOrb.Serializer.INSTANCE); // event.getRegistry().registerAll( @@ -171,6 +173,11 @@ public class BloodMagic gen.addProvider(new BloodMagicRecipeProvider(gen)); gen.addProvider(new GeneratorBaseRecipes(gen)); gen.addProvider(new GeneratorLootTable(gen)); + + GeneratorBlockTags bmBlockTags = new GeneratorBlockTags(gen, event.getExistingFileHelper()); + gen.addProvider(bmBlockTags); + gen.addProvider(new GeneratorItemTags(gen, bmBlockTags, event.getExistingFileHelper())); + } } 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 8b8ab1c8..359c197b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java @@ -14,7 +14,6 @@ import wayoftime.bloodmagic.altar.AltarTier; public abstract class RecipeBloodAltar extends BloodMagicRecipe { - @Nonnull private final Ingredient input; @Nonnull diff --git a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java index 35962b33..ab607824 100644 --- a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java @@ -18,12 +18,6 @@ import wayoftime.bloodmagic.orb.BloodOrb; public class IngredientBloodOrb extends Ingredient { - -// 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 final int orbTier; @@ -61,14 +55,8 @@ public class IngredientBloodOrb extends Ingredient @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; } @@ -89,24 +77,7 @@ public class IngredientBloodOrb extends Ingredient @Override public Ingredient parse(JsonObject json) { - System.out.println("Parsing Blood Orb"); return new IngredientBloodOrb(JSONUtils.getInt(json, "orb_tier")); } } - -// -// @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; -// } - } diff --git a/src/main/java/WayofTime/bloodmagic/util/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java index 7821f745..f682b1f1 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -133,8 +133,10 @@ public class Constants public static class JSON { public static final String INPUT = "input"; + public static final String TOOL = "tool"; public static final String BASEINPUT = "baseinput"; public static final String ADDEDINPUT = "addedinput"; + public static final String ADDEDOUTPUT = "addedoutput"; public static final String OUTPUT = "output"; public static final String ITEM = "item"; public static final String COUNT = "count"; @@ -142,6 +144,7 @@ public class Constants public static final String TYPE = "type"; public static final String TEXTURE = "texture"; public static final String CONDITIONS = "conditions"; + public static final String CHANCE = "chance"; public static final String ALTAR_TIER = Constants.NBT.ALTAR_TIER; public static final String ALTAR_SYPHON = "altarSyphon"; diff --git a/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java b/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java new file mode 100644 index 00000000..343cb038 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java @@ -0,0 +1,110 @@ +package wayoftime.bloodmagic.api.impl.recipe; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import javax.annotation.Nonnull; + +import org.apache.commons.lang3.tuple.Pair; + +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; + +public abstract class RecipeARC extends BloodMagicRecipe +{ + public static final int MAX_RANDOM_OUTPUTS = 3; + + @Nonnull + private final Ingredient input; + @Nonnull + private final Ingredient arc_tool; + @Nonnull + private final ItemStack output; + + private final List> addedItems; + + protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, ItemStack output) + { + this(id, input, arc_tool, output, new ArrayList>()); + } + + protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, ItemStack output, List> addedItems) + { + super(id); + this.input = input; + this.arc_tool = arc_tool; + this.output = output; + this.addedItems = addedItems; + } + + public RecipeARC addRandomOutput(ItemStack stack, double chance) + { + if (addedItems.size() >= MAX_RANDOM_OUTPUTS) + { + return this; + } + + addedItems.add(Pair.of(stack, chance)); + + return this; + } + + @Nonnull + public final Ingredient getInput() + { + return input; + } + + @Override + public final NonNullList getIngredients() + { + NonNullList list = NonNullList.create(); + list.add(getInput()); + return list; + } + + public List getAllListedOutputs() + { + List list = new ArrayList(); + + list.add(output.copy()); + for (Pair pair : addedItems) + { + list.add(pair.getLeft().copy()); + } + + return list; + } + + public List getAllOutputs(Random rand) + { + List list = new ArrayList(); + + list.add(output.copy()); + for (Pair pair : addedItems) + { + if (rand.nextDouble() < pair.getRight()) + list.add(pair.getLeft().copy()); + } + + return list; + } + + @Override + public void write(PacketBuffer buffer) + { + input.write(buffer); + arc_tool.write(buffer); + buffer.writeItemStack(output); + buffer.writeInt(addedItems.size()); + for (Pair pair : addedItems) + { + buffer.writeItemStack(pair.getLeft()); + buffer.writeDouble(pair.getValue()); + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockTags.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockTags.java new file mode 100644 index 00000000..f861928c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockTags.java @@ -0,0 +1,40 @@ +package wayoftime.bloodmagic.common.data; + +import java.nio.file.Path; + +import net.minecraft.data.BlockTagsProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.data.ExistingFileHelper; +import wayoftime.bloodmagic.BloodMagic; + +public class GeneratorBlockTags extends BlockTagsProvider +{ + public GeneratorBlockTags(DataGenerator generatorIn, ExistingFileHelper exFileHelper) + { + super(generatorIn, BloodMagic.MODID, exFileHelper); + } + + @Override + public void registerTags() + { + } + + /** + * Resolves a Path for the location to save the given tag. + */ + @Override + protected Path makePath(ResourceLocation id) + { + return this.generator.getOutputFolder().resolve("data/" + id.getNamespace() + "/tags/blocks/" + id.getPath() + ".json"); + } + + /** + * Gets a name for this provider, to use in logging. + */ + @Override + public String getName() + { + return "Block Tags"; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemTags.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemTags.java new file mode 100644 index 00000000..7adb8e63 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemTags.java @@ -0,0 +1,48 @@ +package wayoftime.bloodmagic.common.data; + +import java.nio.file.Path; + +import net.minecraft.data.BlockTagsProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.ItemTagsProvider; +import net.minecraft.item.Items; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.data.ExistingFileHelper; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.tags.BloodMagicTags; + +public class GeneratorItemTags extends ItemTagsProvider +{ + public GeneratorItemTags(DataGenerator dataGenerator, BlockTagsProvider blockTagProvider, ExistingFileHelper existingFileHelper) + { + super(dataGenerator, blockTagProvider, BloodMagic.MODID, existingFileHelper); + } + + @Override + public void registerTags() + { + this.getOrCreateBuilder(BloodMagicTags.ARC_TOOL).add(Items.DIAMOND); +// this.getOrCreateBuilder(GOORESISTANT).addTag(BlockTags.DOORS); +// this.getOrCreateBuilder(GOORESISTANT).addTag(BlockTags.BEDS); +// this.getOrCreateBuilder(GOORESISTANT).add(Blocks.PISTON, Blocks.PISTON_HEAD, Blocks.STICKY_PISTON, Blocks.MOVING_PISTON); + + } + + /** + * Resolves a Path for the location to save the given tag. + */ + @Override + protected Path makePath(ResourceLocation id) + { + return this.generator.getOutputFolder().resolve("data/" + id.getNamespace() + "/tags/items/" + id.getPath() + ".json"); + } + + /** + * Gets a name for this provider, to use in logging. + */ + @Override + public String getName() + { + return "Item Tags"; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeProvider.java index 9bbf2eed..5a46c06b 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeProvider.java @@ -5,6 +5,7 @@ import java.util.List; import net.minecraft.data.DataGenerator; import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.recipe.ARCRecipeProvider; import wayoftime.bloodmagic.common.recipe.AlchemyArrayRecipeProvider; import wayoftime.bloodmagic.common.recipe.BloodAltarRecipeProvider; import wayoftime.bloodmagic.common.recipe.ISubRecipeProvider; @@ -20,6 +21,6 @@ public class BloodMagicRecipeProvider extends BaseRecipeProvider @Override protected List getSubRecipeProviders() { - return Arrays.asList(new BloodAltarRecipeProvider(), new AlchemyArrayRecipeProvider(), new TartaricForgeRecipeProvider()); + return Arrays.asList(new BloodAltarRecipeProvider(), new AlchemyArrayRecipeProvider(), new TartaricForgeRecipeProvider(), new ARCRecipeProvider()); } } diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java new file mode 100644 index 00000000..fac5b7ee --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java @@ -0,0 +1,89 @@ +package wayoftime.bloodmagic.common.data.recipe.builder; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import org.apache.commons.lang3.tuple.Pair; + +import com.google.gson.JsonArray; +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.api.impl.recipe.RecipeARC; +import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder; +import wayoftime.bloodmagic.util.Constants; + +public class ARCRecipeBuilder extends BloodMagicRecipeBuilder +{ + private final Ingredient input; + private final Ingredient arcTool; + private final ItemStack output; + private final List> addedItems = new ArrayList>(); + + protected ARCRecipeBuilder(Ingredient input, Ingredient arcTool, ItemStack output) + { + super(bmSerializer("arc")); + this.input = input; + this.arcTool = arcTool; + this.output = output; + } + + public static ARCRecipeBuilder arc(Ingredient input, Ingredient arcTool, ItemStack output) + { + return new ARCRecipeBuilder(input, arcTool, output); + } + + public ARCRecipeBuilder addRandomOutput(ItemStack stack, double chance) + { + if (addedItems.size() >= RecipeARC.MAX_RANDOM_OUTPUTS) + { + return this; + } + + addedItems.add(Pair.of(stack, chance)); + + return this; + } + + @Override + protected ARCRecipeResult getResult(ResourceLocation id) + { + return new ARCRecipeResult(id); + } + + public class ARCRecipeResult extends RecipeResult + { + protected ARCRecipeResult(ResourceLocation id) + { + super(id); + } + + @Override + public void serialize(@Nonnull JsonObject json) + { + json.add(Constants.JSON.INPUT, input.serialize()); + json.add(Constants.JSON.TOOL, arcTool.serialize()); + + if (addedItems.size() > 0) + { + JsonArray mainArray = new JsonArray(); + for (Pair pair : addedItems) + { + JsonObject jsonObj = new JsonObject(); + jsonObj.addProperty(Constants.JSON.CHANCE, pair.getValue().floatValue()); + jsonObj.add(Constants.JSON.TYPE, SerializerHelper.serializeItemStack(pair.getKey())); + mainArray.add(jsonObj); + } + + json.add(Constants.JSON.ADDEDOUTPUT, mainArray); + } + + json.add(Constants.JSON.OUTPUT, SerializerHelper.serializeItemStack(output)); + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java new file mode 100644 index 00000000..89dc4a5d --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java @@ -0,0 +1,23 @@ +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.minecraftforge.common.Tags; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.data.recipe.builder.ARCRecipeBuilder; + +public class ARCRecipeProvider implements ISubRecipeProvider +{ + @Override + public void addRecipes(Consumer consumer) + { + String basePath = "arc/"; + ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromTag(Tags.Items.BONES), new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get())).addRandomOutput(new ItemStack(Items.DIAMOND), 0.5).build(consumer, BloodMagic.rl(basePath + "test1")); + ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromItems(Items.ACACIA_BOAT), new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get())).build(consumer, BloodMagic.rl(basePath + "test2")); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java index e8a99239..87a30fe4 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java @@ -1,6 +1,7 @@ package wayoftime.bloodmagic.common.recipe; import net.minecraft.item.crafting.IRecipeType; +import wayoftime.bloodmagic.api.impl.recipe.RecipeARC; import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; @@ -10,4 +11,5 @@ 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"); + public static final IRecipeType ARC = IRecipeType.register("arc"); } diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java new file mode 100644 index 00000000..84481184 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java @@ -0,0 +1,127 @@ +package wayoftime.bloodmagic.common.recipe.serializer; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import org.apache.commons.lang3.tuple.Pair; + +import com.google.gson.JsonArray; +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.RecipeARC; +import wayoftime.bloodmagic.util.Constants; + +public class ARCRecipeSerializer extends ForgeRegistryEntry> + implements IRecipeSerializer +{ + private final IFactory factory; + + public ARCRecipeSerializer(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); + + JsonElement tool = JSONUtils.isJsonArray(json, Constants.JSON.TOOL) + ? JSONUtils.getJsonArray(json, Constants.JSON.TOOL) + : JSONUtils.getJsonObject(json, Constants.JSON.TOOL); + + Ingredient inputIng = Ingredient.deserialize(input); + Ingredient toolIng = Ingredient.deserialize(tool); + ItemStack output = SerializerHelper.getItemStack(json, Constants.JSON.OUTPUT); + + List> addedItems = new ArrayList>(); + if (json.has(Constants.JSON.ADDEDOUTPUT) && JSONUtils.isJsonArray(json, Constants.JSON.ADDEDOUTPUT)) + { + JsonArray mainArray = JSONUtils.getJsonArray(json, Constants.JSON.ADDEDOUTPUT); + + arrayLoop: for (JsonElement element : mainArray) + { + if (addedItems.size() >= RecipeARC.MAX_RANDOM_OUTPUTS) + { + break arrayLoop; + } + if (element.isJsonObject()) + { + JsonObject obj = element.getAsJsonObject(); + double chance = JSONUtils.getFloat(obj, Constants.JSON.CHANCE); + ItemStack extraDrop = SerializerHelper.getItemStack(obj, Constants.JSON.TYPE); + + addedItems.add(Pair.of(extraDrop, chance)); + } + } + } + + return this.factory.create(recipeId, inputIng, toolIng, output, addedItems); + } + + @Override + public RECIPE read(@Nonnull ResourceLocation recipeId, @Nonnull PacketBuffer buffer) + { + try + { + List> addedItems = new ArrayList>(); + Ingredient inputIng = Ingredient.read(buffer); + Ingredient toolIng = Ingredient.read(buffer); + ItemStack output = buffer.readItemStack(); + + int addedItemSize = buffer.readInt(); + for (int i = 0; i < addedItemSize; i++) + { + ItemStack stack = buffer.readItemStack(); + double chance = buffer.readDouble(); + addedItems.add(Pair.of(stack, chance)); + } + + buffer.writeInt(addedItems.size()); + for (Pair pair : addedItems) + { + buffer.writeItemStack(pair.getLeft()); + buffer.writeDouble(pair.getValue()); + } + + return this.factory.create(recipeId, inputIng, toolIng, output, addedItems); + } 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, Ingredient arcTool, ItemStack output, List> addedItems); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java b/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java index 53f454d7..3aee8ab2 100644 --- a/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java +++ b/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java @@ -1,14 +1,17 @@ package wayoftime.bloodmagic.common.registries; import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.api.impl.recipe.RecipeARC; 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.ARCRecipeSerializer; 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.IRecipeARC; import wayoftime.bloodmagic.recipe.IRecipeAlchemyArray; import wayoftime.bloodmagic.recipe.IRecipeBloodAltar; import wayoftime.bloodmagic.recipe.IRecipeTartaricForge; @@ -25,6 +28,7 @@ public class BloodMagicRecipeSerializers 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 IRecipeSerializerRegistryObject ARC = RECIPE_SERIALIZERS.register("arc", () -> new ARCRecipeSerializer<>(IRecipeARC::new)); // public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, BloodMagic.MODID); diff --git a/src/main/java/wayoftime/bloodmagic/common/tags/BloodMagicTags.java b/src/main/java/wayoftime/bloodmagic/common/tags/BloodMagicTags.java new file mode 100644 index 00000000..9953561f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/tags/BloodMagicTags.java @@ -0,0 +1,12 @@ +package wayoftime.bloodmagic.common.tags; + +import net.minecraft.item.Item; +import net.minecraft.tags.ITag; +import net.minecraft.tags.ItemTags; + +public class BloodMagicTags +{ + public static final ITag.INamedTag ARC_TOOL = ItemTags.makeWrapperTag("bloodmagic:arc_tool"); + public static final ITag.INamedTag ARC_TOOL_FURNACE = ItemTags.makeWrapperTag("bloodmagic:arc_tool_furnace"); + public static final ITag.INamedTag ARC_TOOL_SIEVE = ItemTags.makeWrapperTag("bloodmagic:arc_tool_sieve"); +} diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java new file mode 100644 index 00000000..6a388181 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java @@ -0,0 +1,40 @@ +package wayoftime.bloodmagic.recipe; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.tuple.Pair; + +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.RecipeARC; +import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType; +import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers; + +public class IRecipeARC extends RecipeARC +{ + public IRecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, ItemStack output) + { + super(id, input, arc_tool, output, new ArrayList>()); + } + + public IRecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, ItemStack output, List> addedItems) + { + super(id, input, arc_tool, output, addedItems); + } + + @Override + public IRecipeSerializer getSerializer() + { + return BloodMagicRecipeSerializers.ARC.getRecipeSerializer(); + } + + @Override + public IRecipeType getType() + { + return BloodMagicRecipeType.ARC; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java index 8b600788..01bd3506 100644 --- a/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java +++ b/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java @@ -14,7 +14,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import wayoftime.bloodmagic.common.block.BloodMagicBlocks; -import wayoftime.bloodmagic.common.item.IARCTool; +import wayoftime.bloodmagic.common.tags.BloodMagicTags; import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; public class ContainerAlchemicalReactionChamber extends Container @@ -88,7 +88,7 @@ public class ContainerAlchemicalReactionChamber extends Container slot.onSlotChange(itemstack1, itemstack); } else if (index > 9) // Attempting to transfer from main inventory { - if (itemstack1.getItem() instanceof IARCTool) // Try the tool slot first + if (itemstack1.getItem().isIn(BloodMagicTags.ARC_TOOL)) // Try the tool slot first { if (!this.mergeItemStack(itemstack1, 0, 1, false)) { @@ -150,7 +150,7 @@ public class ContainerAlchemicalReactionChamber extends Container @Override public boolean isItemValid(ItemStack itemStack) { - return itemStack.getItem() instanceof IARCTool; + return itemStack.getItem().isIn(BloodMagicTags.ARC_TOOL); } } From f0d62b997a88ac2ae49d1d34175c41cf706dbe95 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 27 Oct 2020 10:40:39 -0400 Subject: [PATCH 458/595] Part 2 of ARC Recipe Implementation Added the ability for FluidStacks to be used as inputs and outputs, with a bit of cribbing off of how Mekanism handled their FluidStackIngredient. --- src/generated/resources/.cache/cache | 2 +- .../data/bloodmagic/recipes/arc/test2.json | 8 + .../WayofTime/bloodmagic/util/Constants.java | 5 + .../bloodmagic/api/SerializerHelper.java | 69 ++++ .../event/recipes/FluidStackIngredient.java | 385 ++++++++++++++++++ .../api/event/recipes/InputIngredient.java | 52 +++ .../api/event/recipes/TagResolverHelper.java | 32 ++ .../bloodmagic/api/impl/recipe/RecipeARC.java | 24 +- .../data/recipe/builder/ARCRecipeBuilder.java | 18 +- .../common/recipe/ARCRecipeProvider.java | 7 +- .../serializer/ARCRecipeSerializer.java | 38 +- .../bloodmagic/recipe/IRecipeARC.java | 10 +- 12 files changed, 634 insertions(+), 16 deletions(-) create mode 100644 src/main/java/wayoftime/bloodmagic/api/event/recipes/FluidStackIngredient.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/event/recipes/InputIngredient.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/event/recipes/TagResolverHelper.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 58e9535a..63e83907 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -195,7 +195,7 @@ f38355165034ce314a9f0344ebc3a6cad22c76c8 data/bloodmagic/recipes/altar/reinforce 926d4a0e165c87a15a609744d832d2f5f04a40d0 data/bloodmagic/recipes/altar/water_tool.json 7551501cf361667ec7454c307b9d2368536fbed6 data/bloodmagic/recipes/altar/weakbloodorb.json 4f511cfb93faf65aa50fabd7e753e0759ed95a1c data/bloodmagic/recipes/arc/test1.json -14e7bce6990a346e36171564c29f93a14e50df44 data/bloodmagic/recipes/arc/test2.json +5e735ea45bb2a49b43803c53a586ecbd5f3cbfe1 data/bloodmagic/recipes/arc/test2.json e1285ec51100f2336c1ea1a1a3057e74a0dd84d1 data/bloodmagic/recipes/array/airsigil.json d1ac23080f72f21adb5908befefe965ffb4efd4f data/bloodmagic/recipes/array/bloodlightsigil.json 1890706e5b93cd6df764b0419483c348e0d7f277 data/bloodmagic/recipes/array/divinationsigil.json diff --git a/src/generated/resources/data/bloodmagic/recipes/arc/test2.json b/src/generated/resources/data/bloodmagic/recipes/arc/test2.json index 8037c2b9..ebb8cc3d 100644 --- a/src/generated/resources/data/bloodmagic/recipes/arc/test2.json +++ b/src/generated/resources/data/bloodmagic/recipes/arc/test2.json @@ -6,6 +6,14 @@ "tool": { "item": "minecraft:acacia_boat" }, + "inputfluid": { + "amount": 1000, + "fluid": "minecraft:lava" + }, + "outputfluid": { + "fluid": "minecraft:water", + "amount": 100 + }, "output": { "item": "bloodmagic:altar" } diff --git a/src/main/java/WayofTime/bloodmagic/util/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java index f682b1f1..19a600b0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -141,10 +141,15 @@ public class Constants public static final String ITEM = "item"; public static final String COUNT = "count"; public static final String NBT = "nbt"; + public static final String TAG = "tag"; public static final String TYPE = "type"; public static final String TEXTURE = "texture"; public static final String CONDITIONS = "conditions"; public static final String CHANCE = "chance"; + public static final String FLUID = "fluid"; + public static final String AMOUNT = "amount"; + public static final String INPUT_FLUID = "inputfluid"; + public static final String OUTPUT_FLUID = "outputfluid"; public static final String ALTAR_TIER = Constants.NBT.ALTAR_TIER; public static final String ALTAR_SYPHON = "altarSyphon"; diff --git a/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java b/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java index c2840718..b61fec48 100644 --- a/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java +++ b/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java @@ -7,10 +7,18 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSyntaxException; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.JsonToNBT; import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.registries.ForgeRegistries; import wayoftime.bloodmagic.util.Constants; /** @@ -57,4 +65,65 @@ public class SerializerHelper } return json; } + + public static FluidStack getFluidStack(@Nonnull JsonObject json, @Nonnull String key) + { + validateKey(json, key); + return deserializeFluid(JSONUtils.getJsonObject(json, key)); + } + + public static FluidStack deserializeFluid(@Nonnull JsonObject json) + { + if (!json.has(Constants.JSON.AMOUNT)) + { + throw new JsonSyntaxException("Expected to receive a amount that is greater than zero"); + } + JsonElement count = json.get(Constants.JSON.AMOUNT); + if (!JSONUtils.isNumber(count)) + { + throw new JsonSyntaxException("Expected amount to be a number greater than zero."); + } + int amount = count.getAsJsonPrimitive().getAsInt(); + if (amount < 1) + { + throw new JsonSyntaxException("Expected amount to be greater than zero."); + } + ResourceLocation resourceLocation = new ResourceLocation(JSONUtils.getString(json, Constants.JSON.FLUID)); + Fluid fluid = ForgeRegistries.FLUIDS.getValue(resourceLocation); + if (fluid == null || fluid == Fluids.EMPTY) + { + throw new JsonSyntaxException("Invalid fluid type '" + resourceLocation + "'"); + } + CompoundNBT nbt = null; + if (json.has(Constants.JSON.NBT)) + { + JsonElement jsonNBT = json.get(Constants.JSON.NBT); + try + { + if (jsonNBT.isJsonObject()) + { + nbt = JsonToNBT.getTagFromJson(GSON.toJson(jsonNBT)); + } else + { + nbt = JsonToNBT.getTagFromJson(JSONUtils.getString(jsonNBT, Constants.JSON.NBT)); + } + } catch (CommandSyntaxException e) + { + throw new JsonSyntaxException("Invalid NBT entry for fluid '" + resourceLocation + "'"); + } + } + return new FluidStack(fluid, amount, nbt); + } + + public static JsonElement serializeFluidStack(@Nonnull FluidStack stack) + { + JsonObject json = new JsonObject(); + json.addProperty(Constants.JSON.FLUID, stack.getFluid().getRegistryName().toString()); + json.addProperty(Constants.JSON.AMOUNT, stack.getAmount()); + if (stack.hasTag()) + { + json.addProperty(Constants.JSON.NBT, stack.getTag().toString()); + } + return json; + } } diff --git a/src/main/java/wayoftime/bloodmagic/api/event/recipes/FluidStackIngredient.java b/src/main/java/wayoftime/bloodmagic/api/event/recipes/FluidStackIngredient.java new file mode 100644 index 00000000..cdcecea2 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/event/recipes/FluidStackIngredient.java @@ -0,0 +1,385 @@ +package wayoftime.bloodmagic.api.event.recipes; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSyntaxException; + +import net.minecraft.fluid.Fluid; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tags.FluidTags; +import net.minecraft.tags.ITag; +import net.minecraft.tags.TagCollectionManager; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.util.Constants; + +/** + * Created by Thiakil on 12/07/2019. + */ +public abstract class FluidStackIngredient implements InputIngredient +{ + + public static FluidStackIngredient from(@Nonnull Fluid instance, int amount) + { + return from(new FluidStack(instance, amount)); + } + + public static FluidStackIngredient from(@Nonnull FluidStack instance) + { + return new Single(instance); + } + + public static FluidStackIngredient from(@Nonnull ITag fluidTag, int minAmount) + { + return new Tagged(fluidTag, minAmount); + } + + public static FluidStackIngredient read(PacketBuffer buffer) + { + // TODO: Allow supporting serialization of different types than just the ones we + // implement? + IngredientType type = buffer.readEnumValue(IngredientType.class); + if (type == IngredientType.SINGLE) + { + return Single.read(buffer); + } else if (type == IngredientType.TAGGED) + { + return Tagged.read(buffer); + } + return Multi.read(buffer); + } + + public static FluidStackIngredient deserialize(@Nullable JsonElement json) + { + if (json == null || json.isJsonNull()) + { + throw new JsonSyntaxException("Ingredient cannot be null"); + } + if (json.isJsonArray()) + { + JsonArray jsonArray = json.getAsJsonArray(); + int size = jsonArray.size(); + if (size == 0) + { + throw new JsonSyntaxException("Ingredient array cannot be empty, at least one ingredient must be defined"); + } else if (size > 1) + { + FluidStackIngredient[] ingredients = new FluidStackIngredient[size]; + for (int i = 0; i < size; i++) + { + // Read all the ingredients + ingredients[i] = deserialize(jsonArray.get(i)); + } + return createMulti(ingredients); + } + // If we only have a single element, just set our json as that so that we don't + // have to use Multi for efficiency reasons + json = jsonArray.get(0); + } + if (!json.isJsonObject()) + { + throw new JsonSyntaxException("Expected fluid to be object or array of objects"); + } + JsonObject jsonObject = json.getAsJsonObject(); + if (jsonObject.has(Constants.JSON.FLUID) && jsonObject.has(Constants.JSON.TAG)) + { + throw new JsonParseException("An ingredient entry is either a tag or an fluid, not both"); + } else if (jsonObject.has(Constants.JSON.FLUID)) + { + return from(SerializerHelper.deserializeFluid(jsonObject)); + } else if (jsonObject.has(Constants.JSON.TAG)) + { + if (!jsonObject.has(Constants.JSON.AMOUNT)) + { + throw new JsonSyntaxException("Expected to receive a amount that is greater than zero"); + } + JsonElement count = jsonObject.get(Constants.JSON.AMOUNT); + if (!JSONUtils.isNumber(count)) + { + throw new JsonSyntaxException("Expected amount to be a number greater than zero."); + } + int amount = count.getAsJsonPrimitive().getAsInt(); + if (amount < 1) + { + throw new JsonSyntaxException("Expected amount to be greater than zero."); + } + ResourceLocation resourceLocation = new ResourceLocation(JSONUtils.getString(jsonObject, Constants.JSON.TAG)); + ITag tag = TagCollectionManager.getManager().getFluidTags().get(resourceLocation); + if (tag == null) + { + throw new JsonSyntaxException("Unknown fluid tag '" + resourceLocation + "'"); + } + return from(tag, amount); + } + throw new JsonSyntaxException("Expected to receive a resource location representing either a tag or a fluid."); + } + + public static FluidStackIngredient createMulti(FluidStackIngredient... ingredients) + { + if (ingredients.length == 0) + { + // TODO: Throw error + } else if (ingredients.length == 1) + { + return ingredients[0]; + } + List cleanedIngredients = new ArrayList<>(); + for (FluidStackIngredient ingredient : ingredients) + { + if (ingredient instanceof Multi) + { + // Don't worry about if our inner ingredients are multi as well, as if this is + // the only external method for + // creating a multi ingredient, then we are certified they won't be of a higher + // depth + cleanedIngredients.addAll(Arrays.asList(((Multi) ingredient).ingredients)); + } else + { + cleanedIngredients.add(ingredient); + } + } + // There should be more than a single fluid or we would have split out earlier + return new Multi(cleanedIngredients.toArray(new FluidStackIngredient[0])); + } + + public static class Single extends FluidStackIngredient + { + + @Nonnull + private final FluidStack fluidInstance; + + public Single(@Nonnull FluidStack fluidInstance) + { + this.fluidInstance = Objects.requireNonNull(fluidInstance); + } + + @Override + public boolean test(@Nonnull FluidStack fluidStack) + { + return testType(fluidStack) && fluidStack.getAmount() >= fluidInstance.getAmount(); + } + + @Override + public boolean testType(@Nonnull FluidStack fluidStack) + { + return Objects.requireNonNull(fluidStack).isFluidEqual(fluidInstance); + } + + @Nonnull + @Override + public FluidStack getMatchingInstance(@Nonnull FluidStack fluidStack) + { + return test(fluidStack) ? fluidInstance : FluidStack.EMPTY; + } + + @Nonnull + @Override + public List getRepresentations() + { + return Collections.singletonList(fluidInstance); + } + + @Override + public void write(PacketBuffer buffer) + { + buffer.writeEnumValue(IngredientType.SINGLE); + fluidInstance.writeToPacket(buffer); + } + + @Nonnull + @Override + public JsonElement serialize() + { + JsonObject json = new JsonObject(); + json.addProperty(Constants.JSON.AMOUNT, fluidInstance.getAmount()); + json.addProperty(Constants.JSON.FLUID, fluidInstance.getFluid().getRegistryName().toString()); + if (fluidInstance.hasTag()) + { + json.addProperty(Constants.JSON.NBT, fluidInstance.getTag().toString()); + } + return json; + } + + public static Single read(PacketBuffer buffer) + { + return new Single(FluidStack.readFromPacket(buffer)); + } + } + + public static class Tagged extends FluidStackIngredient + { + + @Nonnull + private final ITag tag; + private final int amount; + + public Tagged(@Nonnull ITag tag, int amount) + { + this.tag = tag; + this.amount = amount; + } + + @Override + public boolean test(@Nonnull FluidStack fluidStack) + { + return testType(fluidStack) && fluidStack.getAmount() >= amount; + } + + @Override + public boolean testType(@Nonnull FluidStack fluidStack) + { + return Objects.requireNonNull(fluidStack).getFluid().isIn(tag); + } + + @Nonnull + @Override + public FluidStack getMatchingInstance(@Nonnull FluidStack fluidStack) + { + if (test(fluidStack)) + { + // Our fluid is in the tag so we make a new stack with the given amount + return new FluidStack(fluidStack, amount); + } + return FluidStack.EMPTY; + } + + @Nonnull + @Override + public List getRepresentations() + { + // TODO: Can this be cached some how + List representations = new ArrayList<>(); + for (Fluid fluid : TagResolverHelper.getRepresentations(tag)) + { + representations.add(new FluidStack(fluid, amount)); + } + return representations; + } + + @Override + public void write(PacketBuffer buffer) + { + buffer.writeEnumValue(IngredientType.TAGGED); + buffer.writeResourceLocation(TagCollectionManager.getManager().getFluidTags().getValidatedIdFromTag(tag)); + buffer.writeVarInt(amount); + } + + @Nonnull + @Override + public JsonElement serialize() + { + JsonObject json = new JsonObject(); + json.addProperty(Constants.JSON.AMOUNT, amount); + json.addProperty(Constants.JSON.TAG, TagCollectionManager.getManager().getFluidTags().getValidatedIdFromTag(tag).toString()); + return json; + } + + public static Tagged read(PacketBuffer buffer) + { + return new Tagged(FluidTags.makeWrapperTag(buffer.readResourceLocation().toString()), buffer.readVarInt()); + } + } + + public static class Multi extends FluidStackIngredient + { + + private final FluidStackIngredient[] ingredients; + + protected Multi(@Nonnull FluidStackIngredient... ingredients) + { + this.ingredients = ingredients; + } + + @Override + public boolean test(@Nonnull FluidStack stack) + { + return Arrays.stream(ingredients).anyMatch(ingredient -> ingredient.test(stack)); + } + + @Override + public boolean testType(@Nonnull FluidStack stack) + { + return Arrays.stream(ingredients).anyMatch(ingredient -> ingredient.testType(stack)); + } + + @Nonnull + @Override + public FluidStack getMatchingInstance(@Nonnull FluidStack stack) + { + for (FluidStackIngredient ingredient : ingredients) + { + FluidStack matchingInstance = ingredient.getMatchingInstance(stack); + if (!matchingInstance.isEmpty()) + { + return matchingInstance; + } + } + return FluidStack.EMPTY; + } + + @Nonnull + @Override + public List getRepresentations() + { + List representations = new ArrayList<>(); + for (FluidStackIngredient ingredient : ingredients) + { + representations.addAll(ingredient.getRepresentations()); + } + return representations; + } + + @Override + public void write(PacketBuffer buffer) + { + buffer.writeEnumValue(IngredientType.MULTI); + buffer.writeVarInt(ingredients.length); + for (FluidStackIngredient ingredient : ingredients) + { + ingredient.write(buffer); + } + } + + @Nonnull + @Override + public JsonElement serialize() + { + JsonArray json = new JsonArray(); + for (FluidStackIngredient ingredient : ingredients) + { + json.add(ingredient.serialize()); + } + return json; + } + + public static FluidStackIngredient read(PacketBuffer buffer) + { + FluidStackIngredient[] ingredients = new FluidStackIngredient[buffer.readVarInt()]; + for (int i = 0; i < ingredients.length; i++) + { + ingredients[i] = FluidStackIngredient.read(buffer); + } + return createMulti(ingredients); + } + } + + private enum IngredientType + { + SINGLE, + TAGGED, + MULTI + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/event/recipes/InputIngredient.java b/src/main/java/wayoftime/bloodmagic/api/event/recipes/InputIngredient.java new file mode 100644 index 00000000..9e7f8e52 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/event/recipes/InputIngredient.java @@ -0,0 +1,52 @@ +package wayoftime.bloodmagic.api.event.recipes; + +import java.util.List; +import java.util.function.Predicate; + +import javax.annotation.Nonnull; + +import com.google.gson.JsonElement; + +import net.minecraft.network.PacketBuffer; + +public interface InputIngredient extends Predicate +{ + + /** + * Evaluates this predicate on the given argument, ignoring any size data. + * + * @param type the input argument + * + * @return {@code true} if the input argument matches the predicate, otherwise + * {@code false} + */ + boolean testType(@Nonnull TYPE type); + + TYPE getMatchingInstance(TYPE type); + + /** + * Primarily for JEI, a list of valid instances of the type + * + * @return List (empty means no valid registrations found and recipe is to be + * hidden) + * + * @apiNote Do not modify any of the values returned by the representations + */ + @Nonnull + List getRepresentations(); + + /** + * Writes this ingredient to a PacketBuffer. + * + * @param buffer The buffer to write to. + */ + void write(PacketBuffer buffer); + + /** + * Serializes this ingredient to a JsonElement + * + * @return JsonElement representation of this ingredient. + */ + @Nonnull + JsonElement serialize(); +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/event/recipes/TagResolverHelper.java b/src/main/java/wayoftime/bloodmagic/api/event/recipes/TagResolverHelper.java new file mode 100644 index 00000000..e66237e5 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/event/recipes/TagResolverHelper.java @@ -0,0 +1,32 @@ +package wayoftime.bloodmagic.api.event.recipes; + +import java.util.Collections; +import java.util.List; + +import net.minecraft.tags.ITag; + +/** + * Copied from Mekanism, including the author's rant about tags. + */ +public class TagResolverHelper +{ + + public static List getRepresentations(ITag tag) + { + try + { + return tag.getAllElements(); + } catch (IllegalStateException e) + { + // Why do tags have to be such an annoyance in 1.16 + // This is needed so that we can ensure we give JEI an empty list of + // representations + // instead of crashing on the first run, as recipes get "initialized" before + // tags are + // done initializing, and we don't want to spam the log with errors. JEI and + // things + // still work fine regardless of this + return Collections.emptyList(); + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java b/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java index 343cb038..632d44ca 100644 --- a/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java +++ b/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java @@ -13,6 +13,8 @@ import net.minecraft.item.crafting.Ingredient; import net.minecraft.network.PacketBuffer; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient; public abstract class RecipeARC extends BloodMagicRecipe { @@ -22,23 +24,27 @@ public abstract class RecipeARC extends BloodMagicRecipe private final Ingredient input; @Nonnull private final Ingredient arc_tool; + private final FluidStackIngredient inputFluid; @Nonnull private final ItemStack output; + private final FluidStack outputFluid; private final List> addedItems; - protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, ItemStack output) + protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid) { - this(id, input, arc_tool, output, new ArrayList>()); + this(id, input, arc_tool, inputFluid, output, new ArrayList>(), outputFluid); } - protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, ItemStack output, List> addedItems) + protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, List> addedItems, FluidStack outputFluid) { super(id); this.input = input; this.arc_tool = arc_tool; + this.inputFluid = inputFluid; this.output = output; this.addedItems = addedItems; + this.outputFluid = outputFluid; } public RecipeARC addRandomOutput(ItemStack stack, double chance) @@ -106,5 +112,17 @@ public abstract class RecipeARC extends BloodMagicRecipe buffer.writeItemStack(pair.getLeft()); buffer.writeDouble(pair.getValue()); } + + buffer.writeBoolean(inputFluid != null); + if (inputFluid != null) + { + inputFluid.write(buffer); + } + + buffer.writeBoolean(outputFluid != null); + if (outputFluid != null) + { + outputFluid.writeToPacket(buffer); + } } } diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java index fac5b7ee..01f7d53a 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java @@ -13,7 +13,9 @@ import com.google.gson.JsonObject; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient; import wayoftime.bloodmagic.api.impl.recipe.RecipeARC; import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder; import wayoftime.bloodmagic.util.Constants; @@ -22,20 +24,24 @@ public class ARCRecipeBuilder extends BloodMagicRecipeBuilder { private final Ingredient input; private final Ingredient arcTool; + private final FluidStackIngredient inputFluid; private final ItemStack output; + private final FluidStack outputFluid; private final List> addedItems = new ArrayList>(); - protected ARCRecipeBuilder(Ingredient input, Ingredient arcTool, ItemStack output) + protected ARCRecipeBuilder(Ingredient input, Ingredient arcTool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid) { super(bmSerializer("arc")); this.input = input; this.arcTool = arcTool; + this.inputFluid = inputFluid; this.output = output; + this.outputFluid = outputFluid; } - public static ARCRecipeBuilder arc(Ingredient input, Ingredient arcTool, ItemStack output) + public static ARCRecipeBuilder arc(Ingredient input, Ingredient arcTool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid) { - return new ARCRecipeBuilder(input, arcTool, output); + return new ARCRecipeBuilder(input, arcTool, inputFluid, output, outputFluid); } public ARCRecipeBuilder addRandomOutput(ItemStack stack, double chance) @@ -69,6 +75,9 @@ public class ARCRecipeBuilder extends BloodMagicRecipeBuilder json.add(Constants.JSON.INPUT, input.serialize()); json.add(Constants.JSON.TOOL, arcTool.serialize()); + if (inputFluid != null) + json.add(Constants.JSON.INPUT_FLUID, inputFluid.serialize()); + if (addedItems.size() > 0) { JsonArray mainArray = new JsonArray(); @@ -83,6 +92,9 @@ public class ARCRecipeBuilder extends BloodMagicRecipeBuilder json.add(Constants.JSON.ADDEDOUTPUT, mainArray); } + if (outputFluid != null) + json.add(Constants.JSON.OUTPUT_FLUID, SerializerHelper.serializeFluidStack(outputFluid)); + json.add(Constants.JSON.OUTPUT, SerializerHelper.serializeItemStack(output)); } } diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java index 89dc4a5d..a06d5cf0 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java @@ -3,11 +3,14 @@ package wayoftime.bloodmagic.common.recipe; import java.util.function.Consumer; import net.minecraft.data.IFinishedRecipe; +import net.minecraft.fluid.Fluids; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.crafting.Ingredient; import net.minecraftforge.common.Tags; +import net.minecraftforge.fluids.FluidStack; import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient; import wayoftime.bloodmagic.common.block.BloodMagicBlocks; import wayoftime.bloodmagic.common.data.recipe.builder.ARCRecipeBuilder; @@ -17,7 +20,7 @@ public class ARCRecipeProvider implements ISubRecipeProvider public void addRecipes(Consumer consumer) { String basePath = "arc/"; - ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromTag(Tags.Items.BONES), new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get())).addRandomOutput(new ItemStack(Items.DIAMOND), 0.5).build(consumer, BloodMagic.rl(basePath + "test1")); - ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromItems(Items.ACACIA_BOAT), new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get())).build(consumer, BloodMagic.rl(basePath + "test2")); + ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromTag(Tags.Items.BONES), null, new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), null).addRandomOutput(new ItemStack(Items.DIAMOND), 0.5).build(consumer, BloodMagic.rl(basePath + "test1")); + ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromItems(Items.ACACIA_BOAT), FluidStackIngredient.from(Fluids.LAVA, 1000), new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), new FluidStack(Fluids.WATER, 100)).build(consumer, BloodMagic.rl(basePath + "test2")); } } diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java index 84481184..b42ab927 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java @@ -17,8 +17,10 @@ import net.minecraft.item.crafting.Ingredient; import net.minecraft.network.PacketBuffer; import net.minecraft.util.JSONUtils; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.registries.ForgeRegistryEntry; import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient; import wayoftime.bloodmagic.api.impl.recipe.RecipeARC; import wayoftime.bloodmagic.util.Constants; @@ -70,7 +72,24 @@ public class ARCRecipeSerializer extends ForgeRegistry } } - return this.factory.create(recipeId, inputIng, toolIng, output, addedItems); + FluidStackIngredient inputFluidIng = null; + + if (json.has(Constants.JSON.INPUT_FLUID)) + { + JsonElement inputFluid = JSONUtils.isJsonArray(json, Constants.JSON.INPUT_FLUID) + ? JSONUtils.getJsonArray(json, Constants.JSON.INPUT_FLUID) + : JSONUtils.getJsonObject(json, Constants.JSON.INPUT_FLUID); + inputFluidIng = FluidStackIngredient.deserialize(inputFluid); + } + + FluidStack outputFluid = null; + + if (json.has(Constants.JSON.OUTPUT_FLUID)) + { + outputFluid = SerializerHelper.deserializeFluid(json); + } + + return this.factory.create(recipeId, inputIng, toolIng, inputFluidIng, output, addedItems, outputFluid); } @Override @@ -98,7 +117,20 @@ public class ARCRecipeSerializer extends ForgeRegistry buffer.writeDouble(pair.getValue()); } - return this.factory.create(recipeId, inputIng, toolIng, output, addedItems); + FluidStackIngredient inputFluid = null; + FluidStack outputFluid = null; + + if (buffer.readBoolean()) + { + inputFluid = FluidStackIngredient.read(buffer); + } + + if (buffer.readBoolean()) + { + outputFluid = FluidStack.readFromPacket(buffer); + } + + return this.factory.create(recipeId, inputIng, toolIng, inputFluid, output, addedItems, outputFluid); } catch (Exception e) { // Mekanism.logger.error("Error reading electrolysis recipe from packet.", e); @@ -122,6 +154,6 @@ public class ARCRecipeSerializer extends ForgeRegistry @FunctionalInterface public interface IFactory { - RECIPE create(ResourceLocation id, Ingredient input, Ingredient arcTool, ItemStack output, List> addedItems); + RECIPE create(ResourceLocation id, Ingredient input, Ingredient arcTool, FluidStackIngredient inputFluid, ItemStack output, List> addedItems, FluidStack outputFluid); } } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java index 6a388181..d2ead3c8 100644 --- a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java +++ b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java @@ -10,20 +10,22 @@ import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.IRecipeType; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient; import wayoftime.bloodmagic.api.impl.recipe.RecipeARC; import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType; import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers; public class IRecipeARC extends RecipeARC { - public IRecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, ItemStack output) + public IRecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid) { - super(id, input, arc_tool, output, new ArrayList>()); + super(id, input, arc_tool, inputFluid, output, new ArrayList>(), outputFluid); } - public IRecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, ItemStack output, List> addedItems) + public IRecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, List> addedItems, FluidStack outputFluid) { - super(id, input, arc_tool, output, addedItems); + super(id, input, arc_tool, inputFluid, output, addedItems, outputFluid); } @Override From ab230b7af47ba9590ae14a9c5f447e11677d132e Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 27 Oct 2020 14:49:26 -0400 Subject: [PATCH 459/595] Fixed recipes and System messages I'm stupid rooDerp --- src/generated/resources/.cache/cache | 2 +- .../assets/bloodmagic/lang/en_us.json | 3 + .../bloodmagic/altar/BloodAltar.java | 2 - .../bloodmagic/tile/TileInventory.java | 10 +- .../ScreenAlchemicalReactionChamber.java | 33 +- .../client/utils/BMRenderTypes.java | 153 +++++++++ .../common/data/GeneratorLanguage.java | 6 + .../recipe/BloodAltarRecipeProvider.java | 2 +- .../tile/TileAlchemicalReactionChamber.java | 59 +++- .../bloodmagic/util/MultiSlotItemHandler.java | 291 ++++++++++++++++++ .../util/handler/event/ClientHandler.java | 179 +++++++++++ 11 files changed, 720 insertions(+), 20 deletions(-) create mode 100644 src/main/java/wayoftime/bloodmagic/client/utils/BMRenderTypes.java create mode 100644 src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 63e83907..64f2dcbc 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -18,7 +18,7 @@ e1a98bd53fca155e4bbb03c1e548341af0f84bd7 assets/bloodmagic/blockstates/masterrit b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json 487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json -775f7c01fb20ba9b55ff5c46d7fef0acd5f591ae assets/bloodmagic/lang/en_us.json +2fd83f690f0a9af248196620b528a4f9717962a1 assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json adf6c0b1e25451609486dc8c8cfbd9cf0f8c67f4 assets/bloodmagic/models/block/alchemicalreactionchamber.json diff --git a/src/generated/resources/assets/bloodmagic/lang/en_us.json b/src/generated/resources/assets/bloodmagic/lang/en_us.json index 7525e488..7647403e 100644 --- a/src/generated/resources/assets/bloodmagic/lang/en_us.json +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -24,6 +24,7 @@ "chat.bloodmagic.ritual.notValid": "You feel that these runes are not configured correctly...", "chat.bloodmagic.ritual.prevent": "The ritual is actively resisting you!", "chat.bloodmagic.ritual.weak": "You feel a push, but are too weak to perform this ritual.", + "gui.bloodmagic.empty": "Empty", "item.bloodmagic.activationcrystalawakened": "Awakened Activation Crystal", "item.bloodmagic.activationcrystalcreative": "Creative Activation Crystal", "item.bloodmagic.activationcrystalweak": "Weak Activation Crystal", @@ -114,6 +115,7 @@ "ritual.bloodmagic.waterRitual": "Ritual of the Full Spring", "ritual.bloodmagic.wellOfSufferingRitual": "Well of Suffering", "ritual.bloodmagic.zephyrRitual": "Call of the Zephyr", + "tile.bloodmagic.arc.name": "Alchemical Reaction Chamber", "tile.bloodmagic.soulforge.name": "Hellfire Forge", "tooltip.bloodmagic.activationcrystal.awakened": "Activates more powerful rituals", "tooltip.bloodmagic.activationcrystal.creative": "Creative Only - Activates any ritual", @@ -147,6 +149,7 @@ "tooltip.bloodmagic.diviner.totalRune": "Total Runes: %d", "tooltip.bloodmagic.diviner.waterRune": "Water Runes: %d", "tooltip.bloodmagic.extraInfo": "&9-Hold shift for more info-", + "tooltip.bloodmagic.holdShiftForInfo": "Press shift for extra info", "tooltip.bloodmagic.inscriber.desc": "The writing is on the wall...", "tooltip.bloodmagic.orb.desc": "Stores raw Life Essence", "tooltip.bloodmagic.orb.owner": "Added by: %s", diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 34b6a77d..a93e82d3 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -178,7 +178,6 @@ public class BloodAltar// implements IFluidHandler 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); @@ -332,7 +331,6 @@ public class BloodAltar// implements IFluidHandler } 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()); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index a737e704..961fc1fd 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -264,11 +264,11 @@ public class TileInventory extends TileBase implements IInventory 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)); + handlerUp = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.UP)); + handlerNorth = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.NORTH)); + handlerSouth = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.SOUTH)); + handlerWest = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.WEST)); + handlerEast = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.EAST)); } else { handlerDown = LazyOptional.of(() -> new InvWrapper(this)); diff --git a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java index cc06b489..26c23ad7 100644 --- a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java +++ b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java @@ -1,5 +1,8 @@ package wayoftime.bloodmagic.client.screens; +import java.util.ArrayList; +import java.util.List; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; @@ -7,9 +10,11 @@ import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.fml.client.gui.GuiUtils; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; +import wayoftime.bloodmagic.util.handler.event.ClientHandler; public class ScreenAlchemicalReactionChamber extends ScreenBase { @@ -40,13 +45,21 @@ public class ScreenAlchemicalReactionChamber extends ScreenBase tooltip = new ArrayList<>(); +// FluidTank inputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 2); +// inputTank.fill(new FluidStack(Fluids.WATER, 1000), FluidAction.EXECUTE); + + ClientHandler.handleGuiTank(stack, tileARC.inputTank, this.guiLeft + 8, this.guiTop + + 40, 16, 63, 194, 0, 16, 64, mouseX, mouseY, background.toString(), tooltip); + + if (!tooltip.isEmpty()) + GuiUtils.drawHoveringText(stack, tooltip, mouseX, mouseY, width, height, -1, font); + } + // @Override protected void drawGuiContainerForegroundLayer(MatrixStack stack, int mouseX, int mouseY) @@ -65,6 +78,12 @@ public class ScreenAlchemicalReactionChamber extends ScreenBase { + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + }, RenderSystem::disableBlend); + protected static final RenderState.TransparencyState NO_TRANSPARENCY = new RenderState.TransparencyState("no_transparency", RenderSystem::disableBlend, () -> { + }); + protected static final RenderState.DepthTestState DEPTH_ALWAYS = new RenderState.DepthTestState("", GL11.GL_ALWAYS); + + static + { + RenderType.State fullbrightSolidState = RenderType.State.getBuilder().shadeModel(SHADE_ENABLED).lightmap(LIGHTMAP_DISABLED).texture(BLOCK_SHEET_MIPPED).build(true); + SOLID_FULLBRIGHT = RenderType.makeType(BloodMagic.MODID + ":block_fullbright", DefaultVertexFormats.BLOCK, GL11.GL_QUADS, 256, fullbrightSolidState); + RenderType.State translucentNoDepthState = RenderType.State.getBuilder().transparency(TRANSLUCENT_TRANSPARENCY).line(new LineState(OptionalDouble.of(2))).texture(new TextureState()).depthTest(DEPTH_ALWAYS).build(false); + RenderType.State translucentNoTextureState = RenderType.State.getBuilder().transparency(TRANSLUCENT_TRANSPARENCY).texture(new TextureState()).build(false); + TRANSLUCENT_LINES = RenderType.makeType(BloodMagic.MODID + ":translucent_lines", DefaultVertexFormats.POSITION_COLOR, GL11.GL_LINES, 256, translucentNoDepthState); + LINES = RenderType.makeType(BloodMagic.MODID + ":lines", DefaultVertexFormats.POSITION_COLOR, GL11.GL_LINES, 256, RenderType.State.getBuilder().build(false)); + TRANSLUCENT_TRIANGLES = RenderType.makeType(BloodMagic.MODID + ":translucent_triangle_fan", DefaultVertexFormats.POSITION_COLOR, GL11.GL_TRIANGLES, 256, translucentNoDepthState); + TRANSLUCENT_POSITION_COLOR = RenderType.makeType(BloodMagic.MODID + ":translucent_pos_color", DefaultVertexFormats.POSITION_COLOR, GL11.GL_QUADS, 256, translucentNoTextureState); + TRANSLUCENT_NO_DEPTH = RenderType.makeType(BloodMagic.MODID + ":translucent_no_depth", DefaultVertexFormats.POSITION_COLOR, GL11.GL_QUADS, 256, translucentNoDepthState); + RenderType.State chunkMarkerState = RenderType.State.getBuilder().texture(new TextureState()).transparency(TRANSLUCENT_TRANSPARENCY).cull(new CullState(false)).shadeModel(new ShadeModelState(true)).line(new LineState(OptionalDouble.of(5))).build(false); + CHUNK_MARKER = RenderType.makeType(BloodMagic.MODID + ":chunk_marker", DefaultVertexFormats.POSITION_COLOR, GL11.GL_LINES, 256, chunkMarkerState); + VEIN_MARKER = RenderType.makeType(BloodMagic.MODID + ":vein_marker", DefaultVertexFormats.POSITION_COLOR, GL11.GL_LINE_LOOP, 256, chunkMarkerState); + POSITION_COLOR_TEX_LIGHTMAP = RenderType.makeType(BloodMagic.MODID + ":pos_color_tex_lightmap", DefaultVertexFormats.POSITION_COLOR_TEX_LIGHTMAP, GL11.GL_QUADS, 256, RenderType.State.getBuilder().texture(new TextureState(PlayerContainer.LOCATION_BLOCKS_TEXTURE, false, false)).lightmap(new LightmapState(true)).build(false)); + POSITION_COLOR_LIGHTMAP = RenderType.makeType(BloodMagic.MODID + ":pos_color_lightmap", DefaultVertexFormats.POSITION_COLOR_LIGHTMAP, GL11.GL_QUADS, 256, RenderType.State.getBuilder().texture(new TextureState()).lightmap(new LightmapState(true)).build(false)); + ITEM_DAMAGE_BAR = RenderType.makeType(BloodMagic.MODID + ":item_damage_bar", DefaultVertexFormats.POSITION_COLOR, GL11.GL_QUADS, 256, RenderType.State.getBuilder().depthTest(DEPTH_ALWAYS).texture(new TextureState()).alpha(new AlphaState(0)).transparency(NO_TRANSPARENCY).build(false)); + } + + public static RenderType getGui(ResourceLocation texture) + { + return RenderType.makeType("gui_" + texture, DefaultVertexFormats.POSITION_COLOR_TEX, GL11.GL_QUADS, 256, RenderType.State.getBuilder().texture(new TextureState(texture, false, false)).alpha(new AlphaState(0.5F)).build(false)); + } + + public static RenderType getLines(float lineWidth) + { + return RenderType.makeType("lines_color_pos_" + lineWidth, DefaultVertexFormats.POSITION_COLOR, GL11.GL_LINES, 256, RenderType.State.getBuilder().line(new LineState(OptionalDouble.of(lineWidth))).texture(new TextureState()).build(false)); + } + + public static RenderType getPoints(float pointSize) + { + // Not really a fog state, but using it like this makes using RenderType.State + // with custom states possible + FogState setPointSize = new FogState(BloodMagic.MODID + ":pointsize_" + pointSize, () -> GL11.glPointSize(pointSize), () -> { + GL11.glPointSize(1); + }); + return RenderType.makeType("point_pos_color_" + pointSize, DefaultVertexFormats.POSITION_COLOR, GL11.GL_POINTS, 256, RenderType.State.getBuilder().fog(setPointSize).texture(new TextureState()).build(false)); + } + + public static RenderType getPositionTex(ResourceLocation texture) + { + return RenderType.makeType(BloodMagic.MODID + ":pos_tex_" + texture, DefaultVertexFormats.POSITION_TEX, GL11.GL_QUADS, 256, RenderType.State.getBuilder().texture(new TextureState(texture, false, false)).build(false)); + } + + public static RenderType getFullbrightTranslucent(ResourceLocation resourceLocation) + { + RenderType.State glState = RenderType.State.getBuilder().transparency(TRANSLUCENT_TRANSPARENCY).texture(new TextureState(resourceLocation, false, false)).lightmap(new LightmapState(false)).build(false); + return RenderType.makeType("BloodMagic:fullbright_translucent_" + resourceLocation, DefaultVertexFormats.BLOCK, GL11.GL_QUADS, 256, glState); + } + + public static IRenderTypeBuffer wrapWithStencil(IRenderTypeBuffer in, Consumer setupStencilArea, String name, int ref) + { + return wrapWithAdditional(in, "stencil_" + name + "_" + ref, () -> { + GL11.glEnable(GL11.GL_STENCIL_TEST); + RenderSystem.colorMask(false, false, false, false); + RenderSystem.depthMask(false); + GL11.glStencilFunc(GL11.GL_NEVER, 1, 0xFF); + GL11.glStencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); + + GL11.glStencilMask(0xFF); + RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, true); + RenderSystem.disableTexture(); + Tessellator tes = Tessellator.getInstance(); + BufferBuilder bb = tes.getBuffer(); + bb.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); + setupStencilArea.accept(bb); + tes.draw(); + RenderSystem.enableTexture(); + RenderSystem.colorMask(true, true, true, true); + RenderSystem.depthMask(true); + GL11.glStencilMask(0x00); + GL11.glStencilFunc(GL11.GL_EQUAL, ref, 0xFF); + }, () -> GL11.glDisable(GL11.GL_STENCIL_TEST)); + } + + public static IRenderTypeBuffer disableLighting(IRenderTypeBuffer in) + { + return wrapWithAdditional(in, "no_lighting", RenderSystem::disableLighting, () -> { + }); + } + + public static IRenderTypeBuffer disableCull(IRenderTypeBuffer in) + { + return wrapWithAdditional(in, "no_cull", RenderSystem::disableCull, RenderSystem::enableCull); + } + + private static IRenderTypeBuffer wrapWithAdditional(IRenderTypeBuffer in, String name, Runnable setup, Runnable teardown) + { + return type -> { + return in.getBuffer(new RenderType(BloodMagic.MODID + ":" + type + "_" + name, type.getVertexFormat(), type.getDrawMode(), type.getBufferSize(), type.isUseDelegate(), false, () -> { + type.setupRenderState(); + setup.run(); + }, () -> { + teardown.run(); + type.clearRenderState(); + }) + { + }); + }; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java index ca769d38..c08a3baf 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java @@ -23,6 +23,7 @@ public class GeneratorLanguage extends LanguageProvider // Tile Entitites add("tile.bloodmagic.soulforge.name", "Hellfire Forge"); + add("tile.bloodmagic.arc.name", "Alchemical Reaction Chamber"); // Blood Orb tooltips add("tooltip.bloodmagic.extraInfo", "&9-Hold shift for more info-"); @@ -104,6 +105,8 @@ public class GeneratorLanguage extends LanguageProvider add("tooltip.bloodmagic.diviner.extraExtraInfo", "-Hold shift + alt for augmentation info-"); add("tooltip.bloodmagic.diviner.currentDirection", "Current Direction: %s"); + add("tooltip.bloodmagic.holdShiftForInfo", "Press shift for extra info"); + add("ritual.bloodmagic.testRitual", "Test Ritual"); add("ritual.bloodmagic.waterRitual", "Ritual of the Full Spring"); add("ritual.bloodmagic.lavaRitual", "Serenade of the Nether"); @@ -235,5 +238,8 @@ public class GeneratorLanguage extends LanguageProvider add("chat.bloodmagic.ritual.activate", "A rush of energy flows through the ritual!"); add("chat.bloodmagic.ritual.notValid", "You feel that these runes are not configured correctly..."); + // GUI + add("gui.bloodmagic.empty", "Empty"); + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java index ab71d3f8..6e6e86cf 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java @@ -26,7 +26,7 @@ public class BloodAltarRecipeProvider implements ISubRecipeProvider 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.fromItems(BloodMagicItems.SLATE.get()), new ItemStack(BloodMagicItems.REINFORCED_SLATE.get()), AltarTier.TWO.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")); diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java index 06be3d0e..059d643a 100644 --- a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java +++ b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java @@ -1,19 +1,26 @@ package wayoftime.bloodmagic.tile; +import java.util.ArrayList; +import java.util.List; + 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.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.fluids.FluidActionResult; import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.registries.ObjectHolder; import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.MultiSlotItemHandler; public class TileAlchemicalReactionChamber extends TileInventory implements ITickableTileEntity, INamedContainerProvider { @@ -27,10 +34,8 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic public static final int INPUT_BUCKET_SLOT = 7; public static final int OUTPUT_BUCKET_SLOT = 8; - public FluidTank inputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 2); - public FluidTank outputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 2); - -// Input slots are from 0 to 3. + public FluidTank inputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 20); + public FluidTank outputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 20); public int burnTime = 0; @@ -50,6 +55,12 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic super.deserialize(tag); burnTime = tag.getInt(Constants.NBT.SOUL_FORGE_BURN); + + CompoundNBT inputTankTag = tag.getCompound("inputtank"); + inputTank.readFromNBT(inputTankTag); + + CompoundNBT outputTankTag = tag.getCompound("outputtank"); + inputTank.readFromNBT(outputTankTag); } @Override @@ -58,13 +69,53 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic super.serialize(tag); tag.putInt(Constants.NBT.SOUL_FORGE_BURN, burnTime); + + CompoundNBT inputTankTag = new CompoundNBT(); + inputTank.writeToNBT(inputTankTag); + tag.put("inputtank", inputTankTag); + + CompoundNBT outputTankTag = new CompoundNBT(); + inputTank.writeToNBT(outputTankTag); + tag.put("outputtank", outputTankTag); + return tag; } @Override public void tick() { + if (world.isRemote) + { + return; + } + ItemStack bucketStack = this.getStackInSlot(INPUT_BUCKET_SLOT); + ItemStack[] outputInventory = new ItemStack[] + { getStackInSlot(1), getStackInSlot(2), getStackInSlot(3), getStackInSlot(4), getStackInSlot(5) }; + + MultiSlotItemHandler outputSlotHandler = new MultiSlotItemHandler(outputInventory, 64); +// FluidActionResult res = FluidUtil.tryEmptyContainerAndStow(bucketStack, inputTank, outputSlotHandler, 1000, null, false); + FluidActionResult res = FluidUtil.tryEmptyContainerAndStow(bucketStack, inputTank, outputSlotHandler, 1000, null, true); + if (res.isSuccess()) + { +// FluidUtil.tryEmptyContainerAndStow(bucketStack, inputTank, outputSlotHandler, 1000, null, true); + this.setInventorySlotContents(INPUT_BUCKET_SLOT, ItemStack.EMPTY); + + if (!res.getResult().isEmpty()) + { + List arrayList = new ArrayList<>(); + arrayList.add(res.getResult()); + + outputSlotHandler.canTransferAllItemsToSlots(arrayList, false); + } + } + + for (int i = 0; i < NUM_OUTPUTS; i++) + { + this.setInventorySlotContents(OUTPUT_SLOT + i, outputSlotHandler.getStackInSlot(i)); + } + +// FluidUtil.tryEmptyContainer(container, fluidDestination, maxAmount, player, doDrain) } // private boolean canCraft(RecipeTartaricForge recipe) diff --git a/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java b/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java new file mode 100644 index 00000000..65e41136 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java @@ -0,0 +1,291 @@ +package wayoftime.bloodmagic.util; + +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; + +public class MultiSlotItemHandler implements IItemHandler +{ + private ItemStack[] items; + + private final int invLimit; + + public MultiSlotItemHandler(int size, int invLimit) + { + items = new ItemStack[size]; + for (int i = 0; i < size; i++) + { + items[i] = ItemStack.EMPTY; + } + + this.invLimit = invLimit; + } + + public MultiSlotItemHandler(ItemStack[] items, int invLimit) + { + this.items = items; + this.invLimit = invLimit; + } + + @Override + public int getSlots() + { + return items.length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return items[slot]; + } + + public boolean isItemValid(int slot, ItemStack stack) + { + return true; + } + + public void setInventorySlotContents(int slot, ItemStack stack) + { + items[slot] = stack; + } + + @Override + @Nonnull + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) + { + if (stack.isEmpty()) + return ItemStack.EMPTY; + + ItemStack stackInSlot = getStackInSlot(slot); + + int m; + if (!stackInSlot.isEmpty()) + { + if (stackInSlot.getCount() >= Math.min(stackInSlot.getMaxStackSize(), getSlotLimit(slot))) + return stack; + + if (!ItemHandlerHelper.canItemStacksStack(stack, stackInSlot)) + return stack; + + if (!isItemValid(slot, stack)) + return stack; + + m = Math.min(stack.getMaxStackSize(), getSlotLimit(slot)) - stackInSlot.getCount(); + + if (stack.getCount() <= m) + { + if (!simulate) + { + ItemStack copy = stack.copy(); + copy.grow(stackInSlot.getCount()); + setInventorySlotContents(slot, copy); + } + + return ItemStack.EMPTY; + } else + { + // copy the stack to not modify the original one + stack = stack.copy(); + if (!simulate) + { + ItemStack copy = stack.split(m); + copy.grow(stackInSlot.getCount()); + setInventorySlotContents(slot, copy); + return stack; + } else + { + stack.shrink(m); + return stack; + } + } + } else + { + if (!isItemValid(slot, stack)) + return stack; + + m = Math.min(stack.getMaxStackSize(), getSlotLimit(slot)); + if (m < stack.getCount()) + { + // copy the stack to not modify the original one + stack = stack.copy(); + if (!simulate) + { + setInventorySlotContents(slot, stack.split(m)); + return stack; + } else + { + stack.shrink(m); + return stack; + } + } else + { + if (!simulate) + { + setInventorySlotContents(slot, stack); + } + return ItemStack.EMPTY; + } + } + } + + public boolean canTransferAllItemsToSlots(List stackList, boolean simulate) + { + ItemStack[] copyList = new ItemStack[items.length]; + for (int i = 0; i < copyList.length; i++) + { + copyList[i] = items[i].copy(); + } + + for (ItemStack stack : stackList) + { + if (stack.isEmpty()) + { + continue; + } + + slots: for (int slot = 0; slot < copyList.length; slot++) + { + ItemStack stackInSlot = copyList[slot]; + + int m; + if (!stackInSlot.isEmpty()) + { + if (stackInSlot.getCount() >= Math.min(stackInSlot.getMaxStackSize(), getSlotLimit(slot))) + continue; + + if (!ItemHandlerHelper.canItemStacksStack(stack, stackInSlot)) + continue; + + if (!isItemValid(slot, stack)) + continue; + + m = Math.min(stack.getMaxStackSize(), getSlotLimit(slot)) - stackInSlot.getCount(); + + if (stack.getCount() <= m) + { + if (!simulate) + { + ItemStack copy = stack.copy(); + copy.grow(stackInSlot.getCount()); + copyList[slot] = copy; + } + + break slots; + } else + { + // copy the stack to not modify the original one + stack = stack.copy(); + if (!simulate) + { + ItemStack copy = stack.split(m); + copy.grow(stackInSlot.getCount()); + copyList[slot] = copy; + } else + { + stack.shrink(m); + } + } + } else + { + if (!isItemValid(slot, stack)) + continue; + + m = Math.min(stack.getMaxStackSize(), getSlotLimit(slot)); + if (m < stack.getCount()) + { + // copy the stack to not modify the original one + stack = stack.copy(); + if (!simulate) + { + copyList[slot] = stack.split(m); + } else + { + stack.shrink(m); + } + } else + { + if (!simulate) + { + copyList[slot] = stack; + } + + stack = ItemStack.EMPTY; + } + } + } + + if (!stack.isEmpty()) + { + break; + } + } + + if (!simulate) + { + items = copyList; + } + + return false; + } + + @Override + @Nonnull + public ItemStack extractItem(int slot, int amount, boolean simulate) + { + if (amount == 0) + return ItemStack.EMPTY; + + ItemStack stackInSlot = getStackInSlot(slot); + + if (stackInSlot.isEmpty()) + return ItemStack.EMPTY; + + if (simulate) + { + if (stackInSlot.getCount() < amount) + { + return stackInSlot.copy(); + } else + { + ItemStack copy = stackInSlot.copy(); + copy.setCount(amount); + return copy; + } + } else + { + int m = Math.min(stackInSlot.getCount(), amount); + + ItemStack decrStackSize = decrStackSize(slot, m); + return decrStackSize; + } + } + + public ItemStack decrStackSize(int slot, int amount) + { + if (!getStackInSlot(slot).isEmpty()) + { + if (getStackInSlot(slot).getCount() <= amount) + { + ItemStack itemStack = getStackInSlot(slot); + setInventorySlotContents(slot, ItemStack.EMPTY); + return itemStack; + } + + ItemStack itemStack = getStackInSlot(slot).split(amount); + return itemStack; + } + + return ItemStack.EMPTY; + } + + @Override + public int getSlotLimit(int slot) + { + return invLimit; + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java index 033cc947..68976382 100644 --- a/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/ClientHandler.java @@ -1,5 +1,6 @@ package wayoftime.bloodmagic.util.handler.event; +import java.util.HashMap; import java.util.List; import com.google.common.collect.Lists; @@ -9,30 +10,44 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.Atlases; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.inventory.container.PlayerContainer; 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.BlockRayTraceResult; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.text.IFormattableTextComponent; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextFormatting; +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.client.event.RenderWorldLastEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fml.common.Mod; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.client.render.BloodMagicRenderer; import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model3D; import wayoftime.bloodmagic.client.render.RenderResizableCuboid; +import wayoftime.bloodmagic.client.utils.BMRenderTypes; import wayoftime.bloodmagic.common.item.ItemRitualDiviner; import wayoftime.bloodmagic.ritual.Ritual; import wayoftime.bloodmagic.ritual.RitualComponent; @@ -62,6 +77,36 @@ public class ClientHandler private static Direction mrsHoloDirection; private static boolean mrsHoloDisplay; + static HashMap resourceMap = new HashMap(); + + public static Minecraft mc() + { + return Minecraft.getInstance(); + } + + public static void bindTexture(String path) + { + mc().getTextureManager().bindTexture(getResource(path)); + } + + public static void bindAtlas() + { + mc().getTextureManager().bindTexture(PlayerContainer.LOCATION_BLOCKS_TEXTURE); + } + + public static ResourceLocation getResource(String path) + { + ResourceLocation rl = resourceMap.containsKey(path) ? resourceMap.get(path) : new ResourceLocation(path); + if (!resourceMap.containsKey(path)) + resourceMap.put(path, rl); + return rl; + } + + public static TextureAtlasSprite getSprite(ResourceLocation rl) + { + return mc().getModelManager().getAtlasTexture(PlayerContainer.LOCATION_BLOCKS_TEXTURE).getSprite(rl); + } + @SubscribeEvent public static void onTextureStitch(TextureStitchEvent.Pre event) { @@ -297,4 +342,138 @@ public class ClientHandler mrsHoloRitual = null; mrsHoloDirection = Direction.NORTH; } + + public static void handleGuiTank(MatrixStack transform, IFluidTank tank, int x, int y, int w, int h, int oX, int oY, int oW, int oH, int mX, int mY, String originalTexture, List tooltip) + { + handleGuiTank(transform, tank.getFluid(), tank.getCapacity(), x, y, w, h, oX, oY, oW, oH, mX, mY, originalTexture, tooltip); + } + + public static void handleGuiTank(MatrixStack transform, FluidStack fluid, int capacity, int x, int y, int w, int h, int oX, int oY, int oW, int oH, int mX, int mY, String originalTexture, List tooltip) + { + if (tooltip == null) + { + transform.push(); + IRenderTypeBuffer.Impl buffer = IRenderTypeBuffer.getImpl(Tessellator.getInstance().getBuffer()); + if (fluid != null && fluid.getFluid() != null) + { + int fluidHeight = (int) (h * (fluid.getAmount() / (float) capacity)); + drawRepeatedFluidSpriteGui(buffer, transform, fluid, x, y + h - fluidHeight, w, fluidHeight); + RenderSystem.color3f(1, 1, 1); + } + int xOff = (w - oW) / 2; + int yOff = (h - oH) / 2; + RenderType renderType = BMRenderTypes.getGui(new ResourceLocation(originalTexture)); + drawTexturedRect(buffer.getBuffer(renderType), transform, x + xOff, y + yOff, oW, oH, 256f, oX, oX + + oW, oY, oY + oH); + buffer.finish(renderType); + transform.pop(); + } else + { + if (mX >= x && mX < x + w && mY >= y && mY < y + h) + addFluidTooltip(fluid, tooltip, capacity); + } + } + + public static void drawRepeatedFluidSpriteGui(IRenderTypeBuffer buffer, MatrixStack transform, FluidStack fluid, float x, float y, float w, float h) + { + RenderType renderType = BMRenderTypes.getGui(PlayerContainer.LOCATION_BLOCKS_TEXTURE); + IVertexBuilder builder = buffer.getBuffer(renderType); + drawRepeatedFluidSprite(builder, transform, fluid, x, y, w, h); + } + + public static void drawRepeatedFluidSprite(IVertexBuilder builder, MatrixStack transform, FluidStack fluid, float x, float y, float w, float h) + { + TextureAtlasSprite sprite = getSprite(fluid.getFluid().getAttributes().getStillTexture(fluid)); + int col = fluid.getFluid().getAttributes().getColor(fluid); + int iW = sprite.getWidth(); + int iH = sprite.getHeight(); + if (iW > 0 && iH > 0) + drawRepeatedSprite(builder, transform, x, y, w, h, iW, iH, sprite.getMinU(), sprite.getMaxU(), sprite.getMinV(), sprite.getMaxV(), (col >> 16 + & 255) / 255.0f, (col >> 8 & 255) / 255.0f, (col & 255) / 255.0f, 1); + } + + public static void drawRepeatedSprite(IVertexBuilder builder, MatrixStack transform, float x, float y, float w, float h, int iconWidth, int iconHeight, float uMin, float uMax, float vMin, float vMax, float r, float g, float b, float alpha) + { + int iterMaxW = (int) (w / iconWidth); + int iterMaxH = (int) (h / iconHeight); + float leftoverW = w % iconWidth; + float leftoverH = h % iconHeight; + float leftoverWf = leftoverW / (float) iconWidth; + float leftoverHf = leftoverH / (float) iconHeight; + float iconUDif = uMax - uMin; + float iconVDif = vMax - vMin; + for (int ww = 0; ww < iterMaxW; ww++) + { + for (int hh = 0; hh < iterMaxH; hh++) drawTexturedRect(builder, transform, x + ww * iconWidth, y + + hh * iconHeight, iconWidth, iconHeight, r, g, b, alpha, uMin, uMax, vMin, vMax); + drawTexturedRect(builder, transform, x + ww * iconWidth, y + + iterMaxH * iconHeight, iconWidth, leftoverH, r, g, b, alpha, uMin, uMax, vMin, (vMin + + iconVDif * leftoverHf)); + } + if (leftoverW > 0) + { + for (int hh = 0; hh < iterMaxH; hh++) drawTexturedRect(builder, transform, x + iterMaxW * iconWidth, y + + hh * iconHeight, leftoverW, iconHeight, r, g, b, alpha, uMin, (uMin + + iconUDif * leftoverWf), vMin, vMax); + drawTexturedRect(builder, transform, x + iterMaxW * iconWidth, y + + iterMaxH * iconHeight, leftoverW, leftoverH, r, g, b, alpha, uMin, (uMin + + iconUDif * leftoverWf), vMin, (vMin + iconVDif * leftoverHf)); + } + } + + public static void drawTexturedRect(IVertexBuilder builder, MatrixStack transform, float x, float y, float w, float h, float r, float g, float b, float alpha, float u0, float u1, float v0, float v1) + { + Matrix4f mat = transform.getLast().getMatrix(); + builder.pos(mat, x, y + + h, 0).color(r, g, b, alpha).tex(u0, v1).overlay(OverlayTexture.NO_OVERLAY).lightmap(0xf000f0).normal(1, 1, 1).endVertex(); + builder.pos(mat, x + w, y + + h, 0).color(r, g, b, alpha).tex(u1, v1).overlay(OverlayTexture.NO_OVERLAY).lightmap(15728880).normal(1, 1, 1).endVertex(); + builder.pos(mat, x + + w, y, 0).color(r, g, b, alpha).tex(u1, v0).overlay(OverlayTexture.NO_OVERLAY).lightmap(15728880).normal(1, 1, 1).endVertex(); + builder.pos(mat, x, y, 0).color(r, g, b, alpha).tex(u0, v0).overlay(OverlayTexture.NO_OVERLAY).lightmap(15728880).normal(1, 1, 1).endVertex(); + } + + public static void drawTexturedRect(IVertexBuilder builder, MatrixStack transform, int x, int y, int w, int h, float picSize, int u0, int u1, int v0, int v1) + { + drawTexturedRect(builder, transform, x, y, w, h, 1, 1, 1, 1, u0 / picSize, u1 / picSize, v0 / picSize, v1 + / picSize); + } + + public static void addFluidTooltip(FluidStack fluid, List tooltip, int tankCapacity) + { + if (!fluid.isEmpty()) + tooltip.add(applyFormat(fluid.getDisplayName(), fluid.getFluid().getAttributes().getRarity(fluid).color)); + else + tooltip.add(new TranslationTextComponent("gui.bloodmagic.empty")); +// if (fluid.getFluid() instanceof IEFluid) +// ((IEFluid) fluid.getFluid()).addTooltipInfo(fluid, null, tooltip); + + if (mc().gameSettings.advancedItemTooltips && !fluid.isEmpty()) + { + if (!Screen.hasShiftDown()) + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.holdShiftForInfo")); + else + { + // TODO translation keys + tooltip.add(applyFormat(new StringTextComponent("Fluid Registry: " + fluid.getFluid().getRegistryName()), TextFormatting.DARK_GRAY)); + tooltip.add(applyFormat(new StringTextComponent("Density: " + fluid.getFluid().getAttributes().getDensity(fluid)), TextFormatting.DARK_GRAY)); + tooltip.add(applyFormat(new StringTextComponent("Temperature: " + fluid.getFluid().getAttributes().getTemperature(fluid)), TextFormatting.DARK_GRAY)); + tooltip.add(applyFormat(new StringTextComponent("Viscosity: " + fluid.getFluid().getAttributes().getViscosity(fluid)), TextFormatting.DARK_GRAY)); + tooltip.add(applyFormat(new StringTextComponent("NBT Data: " + fluid.getTag()), TextFormatting.DARK_GRAY)); + } + } + + if (tankCapacity > 0) + tooltip.add(applyFormat(new StringTextComponent(fluid.getAmount() + "/" + tankCapacity + "mB"), TextFormatting.GRAY)); + else + tooltip.add(applyFormat(new StringTextComponent(fluid.getAmount() + "mB"), TextFormatting.GRAY)); + } + + public static IFormattableTextComponent applyFormat(ITextComponent component, TextFormatting... color) + { + Style style = component.getStyle(); + for (TextFormatting format : color) style = style.applyFormatting(format); + return component.deepCopy().setStyle(style); + } + } From 6f6f2049c1e11753850f54c8bb0bb71c5d6d86d3 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 27 Oct 2020 14:55:48 -0400 Subject: [PATCH 460/595] Update TartaricForgeRecipeProvider.java Updated the recipes so that the Air Reagent is craftable. --- .../bloodmagic/common/recipe/TartaricForgeRecipeProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/TartaricForgeRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/TartaricForgeRecipeProvider.java index 43344e81..57241d8e 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/TartaricForgeRecipeProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/TartaricForgeRecipeProvider.java @@ -24,6 +24,7 @@ public class TartaricForgeRecipeProvider implements ISubRecipeProvider 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.REAGENT_AIR.get()), 128, 20, Ingredient.fromItems(Items.GHAST_TEAR), Ingredient.fromTag(Tags.Items.FEATHERS), Ingredient.fromTag(Tags.Items.FEATHERS)).build(consumer, BloodMagic.rl(basePath + "reagent_air")); 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")); From bacaf114fb01172ae3682338110f72b570b000e2 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 27 Oct 2020 18:32:03 -0400 Subject: [PATCH 461/595] Fixed Sentient Sword Fixed the sentient sword so that it now extends `SwordItem` --- .../bloodmagic/common/item/BMItemTier.java | 62 +++++++++++++++++++ .../common/item/soul/ItemSentientSword.java | 6 +- 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/BMItemTier.java diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BMItemTier.java b/src/main/java/wayoftime/bloodmagic/common/item/BMItemTier.java new file mode 100644 index 00000000..9da76ed4 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/BMItemTier.java @@ -0,0 +1,62 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.function.Supplier; + +import net.minecraft.item.IItemTier; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.LazyValue; + +public enum BMItemTier implements IItemTier +{ + SENTIENT(4, 512, 6.0F, 2.0F, 50, () -> { + return Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get()); + }); + + private final int harvestLevel; + private final int maxUses; + private final float efficiency; + private final float attackDamage; + private final int enchantability; + private final LazyValue repairMaterial; + + private BMItemTier(int harvestLevelIn, int maxUsesIn, float efficiencyIn, float attackDamageIn, int enchantabilityIn, Supplier repairMaterialIn) + { + this.harvestLevel = harvestLevelIn; + this.maxUses = maxUsesIn; + this.efficiency = efficiencyIn; + this.attackDamage = attackDamageIn; + this.enchantability = enchantabilityIn; + this.repairMaterial = new LazyValue<>(repairMaterialIn); + } + + public int getMaxUses() + { + return this.maxUses; + } + + public float getEfficiency() + { + return this.efficiency; + } + + public float getAttackDamage() + { + return this.attackDamage; + } + + public int getHarvestLevel() + { + return this.harvestLevel; + } + + public int getEnchantability() + { + return this.enchantability; + } + + public Ingredient getRepairMaterial() + { + return this.repairMaterial.getValue(); + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java index 8e59bcd2..a19c1d7e 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java @@ -20,6 +20,7 @@ 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.SwordItem; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; @@ -30,6 +31,7 @@ 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.BMItemTier; import wayoftime.bloodmagic.common.item.BloodMagicItems; import wayoftime.bloodmagic.iface.IMultiWillTool; import wayoftime.bloodmagic.util.Constants; @@ -39,7 +41,7 @@ import wayoftime.bloodmagic.will.IDemonWill; import wayoftime.bloodmagic.will.IDemonWillWeapon; import wayoftime.bloodmagic.will.PlayerDemonWillHandler; -public class ItemSentientSword extends Item implements IDemonWillWeapon, IMultiWillTool +public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IMultiWillTool { public static int[] soulBracket = new int[] { 16, 60, 200, 400, 1000, 2000, 4000 }; @@ -81,7 +83,7 @@ public class ItemSentientSword extends Item implements IDemonWillWeapon, IMultiW public ItemSentientSword() { // super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); - super(new Item.Properties().maxDamage(520).group(BloodMagic.TAB)); + super(BMItemTier.SENTIENT, 6, -2.6f, new Item.Properties().maxDamage(520).group(BloodMagic.TAB)); } // @Override From 4dfa414a56938388420885775e403c7ef0afdb76 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 27 Oct 2020 18:32:43 -0400 Subject: [PATCH 462/595] Fixed the ARC Serialization --- build.gradle | 2 +- src/generated/resources/.cache/cache | 3 ++- .../recipes/altar/reinforcedslate.json | 2 +- .../recipes/soulforge/reagent_air.json | 17 +++++++++++++++++ .../java/WayofTime/bloodmagic/BloodMagic.java | 2 +- .../recipe/serializer/ARCRecipeSerializer.java | 15 +++++---------- 6 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_air.json diff --git a/build.gradle b/build.gradle index cf634db2..0efa9fd7 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.16.3-3.0-2' +version = '1.16.3-3.0-3' group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'BloodMagic' diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 64f2dcbc..5c45ea61 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -190,7 +190,7 @@ d79a96eb3eed597f1c18a8983764a6362a24748c data/bloodmagic/recipes/altar/dusk_tool 37913b1babf9b8159332db09b114c919b1b49473 data/bloodmagic/recipes/altar/fire_tool.json 9aeb0d2d33d839eedb2d9bbdaf76fc73e0b39941 data/bloodmagic/recipes/altar/imbuedslate.json 2643d1516f6dae79128fdc8c48c4cfe23453f171 data/bloodmagic/recipes/altar/magicianbloodorb.json -f38355165034ce314a9f0344ebc3a6cad22c76c8 data/bloodmagic/recipes/altar/reinforcedslate.json +30d84c946ad9235f6e59f1046edbe8d44acc799e data/bloodmagic/recipes/altar/reinforcedslate.json 584d01dff4d64bb88bd3783751a29723700f1728 data/bloodmagic/recipes/altar/slate.json 926d4a0e165c87a15a609744d832d2f5f04a40d0 data/bloodmagic/recipes/altar/water_tool.json 7551501cf361667ec7454c307b9d2368536fbed6 data/bloodmagic/recipes/altar/weakbloodorb.json @@ -225,6 +225,7 @@ f4763a58a8f471ec1aaa997cbd36eac8c7d51a12 data/bloodmagic/recipes/soulforge/arcan 8b64af8453c60b6b1ae55bd0dd1a68fe95e8ba19 data/bloodmagic/recipes/soulforge/commontartaricgem.json d46b61779b3c8382862d4e66c3909a1241ecca18 data/bloodmagic/recipes/soulforge/lessertartaricgem.json d6e06747c75fc06e708a15358911f1c63eee86b1 data/bloodmagic/recipes/soulforge/pettytartaricgem.json +42f6af3a4c723c6a6b2a6e1d680a875e15664e4f data/bloodmagic/recipes/soulforge/reagent_air.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 diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/reinforcedslate.json b/src/generated/resources/data/bloodmagic/recipes/altar/reinforcedslate.json index 9e16f279..52a37c81 100644 --- a/src/generated/resources/data/bloodmagic/recipes/altar/reinforcedslate.json +++ b/src/generated/resources/data/bloodmagic/recipes/altar/reinforcedslate.json @@ -6,7 +6,7 @@ "output": { "item": "bloodmagic:reinforcedslate" }, - "upgradeLevel": 2, + "upgradeLevel": 1, "altarSyphon": 2000, "consumptionRate": 5, "drainRate": 5 diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_air.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_air.json new file mode 100644 index 00000000..59453b27 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_air.json @@ -0,0 +1,17 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "item": "minecraft:ghast_tear" + }, + "input1": { + "tag": "forge:feathers" + }, + "input2": { + "tag": "forge:feathers" + }, + "output": { + "item": "bloodmagic:reagentair" + }, + "minimumDrain": 128.0, + "drain": 20.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 491329e2..3466744f 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -66,7 +66,7 @@ public class BloodMagic { public static final String MODID = "bloodmagic"; // Directly reference a log4j logger. - private static final Logger LOGGER = LogManager.getLogger(); + public static final Logger LOGGER = LogManager.getLogger(); private static Gson GSON = null; diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java index b42ab927..9ec58585 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java @@ -11,6 +11,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import net.minecraft.fluid.Fluids; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.Ingredient; @@ -19,6 +20,7 @@ import net.minecraft.util.JSONUtils; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.registries.ForgeRegistryEntry; +import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.api.SerializerHelper; import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient; import wayoftime.bloodmagic.api.impl.recipe.RecipeARC; @@ -110,15 +112,8 @@ public class ARCRecipeSerializer extends ForgeRegistry addedItems.add(Pair.of(stack, chance)); } - buffer.writeInt(addedItems.size()); - for (Pair pair : addedItems) - { - buffer.writeItemStack(pair.getLeft()); - buffer.writeDouble(pair.getValue()); - } - FluidStackIngredient inputFluid = null; - FluidStack outputFluid = null; + FluidStack outputFluid = new FluidStack(Fluids.EMPTY, 1000); if (buffer.readBoolean()) { @@ -133,7 +128,7 @@ public class ARCRecipeSerializer extends ForgeRegistry return this.factory.create(recipeId, inputIng, toolIng, inputFluid, output, addedItems, outputFluid); } catch (Exception e) { -// Mekanism.logger.error("Error reading electrolysis recipe from packet.", e); + BloodMagic.LOGGER.error("Error reading ARC recipe from packet.", e); throw e; } } @@ -146,7 +141,7 @@ public class ARCRecipeSerializer extends ForgeRegistry recipe.write(buffer); } catch (Exception e) { -// Mekanism.logger.error("Error writing electrolysis recipe to packet.", e); + BloodMagic.LOGGER.error("Error writing ARC recipe to packet.", e); throw e; } } From fea894a2b25ab7d1e40eee5e5ea15e0f2a9b1f67 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 27 Oct 2020 19:54:46 -0400 Subject: [PATCH 463/595] Work on the ARC Properly implemented the fluid handling for the input/output buckets. --- .../ScreenAlchemicalReactionChamber.java | 6 +- .../tile/TileAlchemicalReactionChamber.java | 83 +++++++++++++++---- .../bloodmagic/util/MultiSlotItemHandler.java | 9 +- 3 files changed, 81 insertions(+), 17 deletions(-) diff --git a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java index 26c23ad7..4fe9ccfb 100644 --- a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java +++ b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java @@ -54,7 +54,9 @@ public class ScreenAlchemicalReactionChamber extends ScreenBase= 1000) { -// FluidUtil.tryEmptyContainerAndStow(bucketStack, inputTank, outputSlotHandler, 1000, null, true); - this.setInventorySlotContents(INPUT_BUCKET_SLOT, ItemStack.EMPTY); - - if (!res.getResult().isEmpty()) + ItemStack testFullBucketStack = ItemHandlerHelper.copyStackWithSize(fullBucketStack, 1); + LazyOptional fluidHandlerWrapper = FluidUtil.getFluidHandler(testFullBucketStack); + if (fluidHandlerWrapper.isPresent()) { - List arrayList = new ArrayList<>(); - arrayList.add(res.getResult()); + IFluidHandlerItem fluidHandler = fluidHandlerWrapper.resolve().get(); + FluidStack transferedStack = FluidUtil.tryFluidTransfer(inputTank, fluidHandler, 1000, false); + if (!transferedStack.isEmpty()) + { + fluidHandler.drain(transferedStack, FluidAction.EXECUTE); + List arrayList = new ArrayList<>(); + arrayList.add(fluidHandler.getContainer()); + if (outputSlotHandler.canTransferAllItemsToSlots(arrayList, true)) + { + inputTank.fill(transferedStack, FluidAction.EXECUTE); + outputSlotHandler.canTransferAllItemsToSlots(arrayList, false); + if (fullBucketStack.getCount() > 1) + { + fullBucketStack.setCount(fullBucketStack.getCount() - 1); + } else + { + setInventorySlotContents(INPUT_BUCKET_SLOT, ItemStack.EMPTY); + } + } + } + } + } - outputSlotHandler.canTransferAllItemsToSlots(arrayList, false); + if (!emptyBucketStack.isEmpty() && outputTank.getFluidAmount() >= 1000) + { + ItemStack testEmptyBucketStack = ItemHandlerHelper.copyStackWithSize(emptyBucketStack, 1); + LazyOptional fluidHandlerWrapper = FluidUtil.getFluidHandler(testEmptyBucketStack); + if (fluidHandlerWrapper.isPresent()) + { + IFluidHandlerItem fluidHandler = fluidHandlerWrapper.resolve().get(); + FluidStack transferedStack = FluidUtil.tryFluidTransfer(fluidHandler, outputTank, 1000, false); + if (!transferedStack.isEmpty()) + { + fluidHandler.fill(transferedStack, FluidAction.EXECUTE); + List arrayList = new ArrayList<>(); + arrayList.add(fluidHandler.getContainer()); + if (outputSlotHandler.canTransferAllItemsToSlots(arrayList, true)) + { + outputTank.drain(transferedStack, FluidAction.EXECUTE); + outputSlotHandler.canTransferAllItemsToSlots(arrayList, false); + if (emptyBucketStack.getCount() > 1) + { + emptyBucketStack.setCount(emptyBucketStack.getCount() - 1); + } else + { + setInventorySlotContents(OUTPUT_BUCKET_SLOT, ItemStack.EMPTY); + } + } + } } } diff --git a/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java b/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java index 65e41136..b902207e 100644 --- a/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java +++ b/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java @@ -140,6 +140,8 @@ public class MultiSlotItemHandler implements IItemHandler copyList[i] = items[i].copy(); } + boolean hasStashedAll = true; + for (ItemStack stack : stackList) { if (stack.isEmpty()) @@ -167,12 +169,14 @@ public class MultiSlotItemHandler implements IItemHandler if (stack.getCount() <= m) { + ItemStack copy = stack.copy(); if (!simulate) { - ItemStack copy = stack.copy(); copy.grow(stackInSlot.getCount()); copyList[slot] = copy; } + stack = ItemStack.EMPTY; +// System.out.println("Count: " + stack.getCount() + ", m: " + m); break slots; } else @@ -220,6 +224,7 @@ public class MultiSlotItemHandler implements IItemHandler if (!stack.isEmpty()) { + hasStashedAll = false; break; } } @@ -229,7 +234,7 @@ public class MultiSlotItemHandler implements IItemHandler items = copyList; } - return false; + return hasStashedAll; } @Override From c159828248aeedeb74e19f7724fff2d67a66f837 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Thu, 29 Oct 2020 15:45:38 -0400 Subject: [PATCH 464/595] Initial work on the Sanguine Scientiem Downloaded patchouli and, after lots of remorse, managed to get the beginnings of a guide. --- build.gradle | 13 ++ gradle.properties | 3 +- runClient.launch | 2 +- runData.launch | 11 +- runServer.launch | 12 +- src/generated/resources/.cache/cache | 2 +- .../assets/bloodmagic/lang/en_us.json | 2 + .../api/impl/BloodMagicRecipeRegistrar.java | 36 +++++ .../WayofTime/bloodmagic/util/Constants.java | 2 + .../bloodmagic/api/impl/recipe/RecipeARC.java | 17 +++ .../common/data/GeneratorLanguage.java | 4 + .../tile/TileAlchemicalReactionChamber.java | 124 +++++++++++------- .../bloodmagic/util/MultiSlotItemHandler.java | 1 - .../alchemyarray/divination_array_1.png | Bin 0 -> 30510 bytes .../alchemyarray/divination_array_2.png | Bin 0 -> 39863 bytes .../entries/alchemyarray/simple_array.png | Bin 0 -> 27736 bytes .../images/entries/demonwill/demonwill.png | Bin 0 -> 59181 bytes .../entries/demonwill/snare_particles.png | Bin 0 -> 48876 bytes .../assets/bloodmagic/models/item/book.json | 6 + .../patchouli_books/guide/book.json | 9 ++ .../guide/en_us/categories/alchemyarray.json | 6 + .../guide/en_us/categories/altar.json | 6 + .../guide/en_us/categories/demonwill.json | 6 + .../guide/en_us/categories/sigil.json | 6 + .../en_us/entries/alchemyarray/arcaneash.json | 30 +++++ .../entries/alchemyarray/craftingarray.json | 15 +++ .../guide/en_us/entries/altar/bloodaltar.json | 15 +++ .../en_us/entries/demonwill/demonwill.json | 27 ++++ .../entries/demonwill/sentientsword.json | 15 +++ .../en_us/entries/demonwill/soulforge.json | 15 +++ .../en_us/entries/demonwill/soulsnare.json | 24 ++++ .../guide/en_us/entries/sigil/divination.json | 11 ++ 32 files changed, 352 insertions(+), 68 deletions(-) create mode 100644 src/main/resources/assets/bloodmagic/images/entries/alchemyarray/divination_array_1.png create mode 100644 src/main/resources/assets/bloodmagic/images/entries/alchemyarray/divination_array_2.png create mode 100644 src/main/resources/assets/bloodmagic/images/entries/alchemyarray/simple_array.png create mode 100644 src/main/resources/assets/bloodmagic/images/entries/demonwill/demonwill.png create mode 100644 src/main/resources/assets/bloodmagic/images/entries/demonwill/snare_particles.png create mode 100644 src/main/resources/assets/bloodmagic/models/item/book.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/book.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/categories/alchemyarray.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/categories/altar.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/categories/demonwill.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/categories/sigil.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/entries/alchemyarray/arcaneash.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/entries/alchemyarray/craftingarray.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/entries/altar/bloodaltar.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/entries/demonwill/demonwill.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/entries/demonwill/sentientsword.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/entries/demonwill/soulforge.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/entries/demonwill/soulsnare.json create mode 100644 src/main/resources/data/bloodmagic/patchouli_books/guide/en_us/entries/sigil/divination.json diff --git a/build.gradle b/build.gradle index 0efa9fd7..96ae1bf5 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,8 @@ minecraft { runs { client { workingDirectory project.file('run') + + properties 'mixin.env.disableRefMap': 'true' // Recommended logging data for a userdev environment property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' @@ -52,6 +54,8 @@ minecraft { server { workingDirectory project.file('run') + + properties 'mixin.env.disableRefMap': 'true' // Recommended logging data for a userdev environment property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' @@ -68,6 +72,8 @@ minecraft { data { workingDirectory project.file('run') + + properties 'mixin.env.disableRefMap': 'true' // Recommended logging data for a userdev environment property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' @@ -90,6 +96,10 @@ repositories { maven { url "http://dvs1.progwml6.com/files/maven/" } + maven { + name = "The Loader" + url = "https://maven.blamejared.com" + } } dependencies { @@ -105,6 +115,9 @@ dependencies { 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") + + compileOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}:api") + runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}") // 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" diff --git a/gradle.properties b/gradle.properties index 6d57271b..fba356f5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,5 @@ org.gradle.daemon=false minecraft_version=1.16.3 #Mod dependencies -jei_version=7.6.0.49 \ No newline at end of file +jei_version=7.6.0.49 +patchouli_version=1.16.2-47-SNAPSHOT \ No newline at end of file diff --git a/runClient.launch b/runClient.launch index 664cf9fe..24823cb8 100644 --- a/runClient.launch +++ b/runClient.launch @@ -16,6 +16,6 @@ - + diff --git a/runData.launch b/runData.launch index 296ac5fd..c9e117f3 100644 --- a/runData.launch +++ b/runData.launch @@ -1,11 +1,5 @@ - - - - - - @@ -15,13 +9,10 @@ - - - - + diff --git a/runServer.launch b/runServer.launch index 581f8b9c..72cf747b 100644 --- a/runServer.launch +++ b/runServer.launch @@ -1,11 +1,5 @@ - - - - - - @@ -15,12 +9,10 @@ - - - + - + diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 5c45ea61..152c3d51 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -18,7 +18,7 @@ e1a98bd53fca155e4bbb03c1e548341af0f84bd7 assets/bloodmagic/blockstates/masterrit b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json 487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json -2fd83f690f0a9af248196620b528a4f9717962a1 assets/bloodmagic/lang/en_us.json +fb7a615c3c1cf62b3a9c4a3ef701d22e7b45108c assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json adf6c0b1e25451609486dc8c8cfbd9cf0f8c67f4 assets/bloodmagic/models/block/alchemicalreactionchamber.json diff --git a/src/generated/resources/assets/bloodmagic/lang/en_us.json b/src/generated/resources/assets/bloodmagic/lang/en_us.json index 7647403e..3a855484 100644 --- a/src/generated/resources/assets/bloodmagic/lang/en_us.json +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -25,6 +25,8 @@ "chat.bloodmagic.ritual.prevent": "The ritual is actively resisting you!", "chat.bloodmagic.ritual.weak": "You feel a push, but are too weak to perform this ritual.", "gui.bloodmagic.empty": "Empty", + "guide.bloodmagic.landing_text": "\"It is my dear hope that by holding this tome in your hands, I may impart the knowledge of the lost art that is Blood Magic\"$(br)$(o)- Magus Arcana$()", + "guide.bloodmagic.name": "Sanguine Scientiem", "item.bloodmagic.activationcrystalawakened": "Awakened Activation Crystal", "item.bloodmagic.activationcrystalcreative": "Creative Activation Crystal", "item.bloodmagic.activationcrystalweak": "Weak Activation Crystal", diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index bb0652a8..aedd730b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -15,7 +15,9 @@ import com.google.common.collect.ImmutableSet; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; import wayoftime.bloodmagic.api.IBloodMagicRecipeRegistrar; +import wayoftime.bloodmagic.api.impl.recipe.RecipeARC; import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; @@ -250,6 +252,40 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar return null; } + public RecipeARC getARC(World world, @Nonnull ItemStack input, @Nonnull ItemStack arcToolInput, @Nonnull FluidStack inputFluid) + { + Preconditions.checkNotNull(input, "input cannot be null."); + Preconditions.checkNotNull(arcToolInput, "tool cannot be null."); + if (input.isEmpty() || arcToolInput.isEmpty()) + return null; + + List arcRecipes = world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARC); + + for (RecipeARC recipe : arcRecipes) + { + if (recipe.getInput().test(input) && recipe.getTool().test(arcToolInput)) + { + if (recipe.getFluidIngredient() == null) + { + return recipe; + } else if (recipe.getFluidIngredient().test(inputFluid)) + { + return recipe; + } + } + } + +// 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) // { diff --git a/src/main/java/WayofTime/bloodmagic/util/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java index 19a600b0..d60f0b13 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -103,6 +103,8 @@ public class Constants public static final String SOUL_FORGE_BURN = "burnTime"; public static final String SOUL_FORGE_CONSUMED = "consumedSouls"; + public static final String ARC_PROGRESS = "progress"; + public static final String ROUTING_MASTER = "master"; public static final String ROUTING_CONNECTION = "connections"; public static final String ROUTING_PRIORITY = "prioritiesPeople"; diff --git a/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java b/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java index 632d44ca..73c04fb9 100644 --- a/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java +++ b/src/main/java/wayoftime/bloodmagic/api/impl/recipe/RecipeARC.java @@ -65,11 +65,28 @@ public abstract class RecipeARC extends BloodMagicRecipe return input; } + @Nonnull + public final Ingredient getTool() + { + return arc_tool; + } + + public final FluidStackIngredient getFluidIngredient() + { + return inputFluid; + } + + public final FluidStack getFluidOutput() + { + return outputFluid; + } + @Override public final NonNullList getIngredients() { NonNullList list = NonNullList.create(); list.add(getInput()); + list.add(getTool()); return list; } diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java index c08a3baf..84159772 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java @@ -136,6 +136,10 @@ public class GeneratorLanguage extends LanguageProvider add("ritual.bloodmagic.altarBuilderRitual", "The Assembly of the High Altar"); add("ritual.bloodmagic.portalRitual", "The Gate of the Fold"); + // Guide + add("guide.bloodmagic.name", "Sanguine Scientiem"); + add("guide.bloodmagic.landing_text", "\"It is my dear hope that by holding this tome in your hands, I may impart the knowledge of the lost art that is Blood Magic\"$(br)$(o)- Magus Arcana$()"); + // Block names addBlock(BloodMagicBlocks.BLANK_RUNE, "Blank Rune"); addBlock(BloodMagicBlocks.SPEED_RUNE, "Speed Rune"); diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java index 13fe2f74..0f6f57b1 100644 --- a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java +++ b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java @@ -23,6 +23,8 @@ import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.registries.ObjectHolder; +import wayoftime.bloodmagic.api.impl.BloodMagicAPI; +import wayoftime.bloodmagic.api.impl.recipe.RecipeARC; import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; import wayoftime.bloodmagic.util.Constants; import wayoftime.bloodmagic.util.MultiSlotItemHandler; @@ -42,7 +44,7 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic public FluidTank inputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 20); public FluidTank outputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 20); - public int burnTime = 0; + public double currentProgress = 0; public TileAlchemicalReactionChamber(TileEntityType type) { @@ -59,7 +61,7 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic { super.deserialize(tag); - burnTime = tag.getInt(Constants.NBT.SOUL_FORGE_BURN); + currentProgress = tag.getDouble(Constants.NBT.ARC_PROGRESS); CompoundNBT inputTankTag = tag.getCompound("inputtank"); inputTank.readFromNBT(inputTankTag); @@ -73,7 +75,7 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic { super.serialize(tag); - tag.putInt(Constants.NBT.SOUL_FORGE_BURN, burnTime); + tag.putDouble(Constants.NBT.ARC_PROGRESS, currentProgress); CompoundNBT inputTankTag = new CompoundNBT(); inputTank.writeToNBT(inputTankTag); @@ -165,6 +167,15 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic } } + ItemStack inputStack = this.getStackInSlot(INPUT_SLOT); + ItemStack toolStack = this.getStackInSlot(ARC_TOOL_SLOT); + RecipeARC recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getARC(world, inputStack, toolStack, inputTank.getFluid()); + if (recipe != null && outputSlotHandler.canTransferAllItemsToSlots(recipe.getAllListedOutputs(), true)) + { + // We have enough fluid (if applicable) and the theoretical outputs can fit. + + } + for (int i = 0; i < NUM_OUTPUTS; i++) { this.setInventorySlotContents(OUTPUT_SLOT + i, outputSlotHandler.getStackInSlot(i)); @@ -173,47 +184,72 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic // FluidUtil.tryEmptyContainer(container, fluidDestination, maxAmount, player, doDrain) } -// 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(); -// } -// } + private boolean canCraft(RecipeARC recipe, MultiSlotItemHandler outputSlotHandler) + { + if (recipe == null) + return false; + + if (outputSlotHandler.canTransferAllItemsToSlots(recipe.getAllListedOutputs(), true)) + { + FluidStack outputStack = recipe.getFluidOutput(); + return outputStack.isEmpty() ? true + : outputTank.fill(outputStack, FluidAction.SIMULATE) >= outputStack.getAmount(); + } + + return false; + } + + public void craftItem(RecipeARC recipe, MultiSlotItemHandler outputSlotHandler) + { + if (this.canCraft(recipe, outputSlotHandler)) + { + outputSlotHandler.canTransferAllItemsToSlots(recipe.getAllOutputs(world.rand), false); + outputTank.fill(recipe.getFluidOutput().copy(), FluidAction.EXECUTE); + consumeInventory(); + } + } + + public void consumeInventory() + { + ItemStack inputStack = getStackInSlot(INPUT_SLOT); + if (!inputStack.isEmpty()) + { + if (inputStack.getItem().hasContainerItem(inputStack)) + { + setInventorySlotContents(INPUT_SLOT, inputStack.getItem().getContainerItem(inputStack)); + } else + { + inputStack.shrink(1); + if (inputStack.isEmpty()) + { + setInventorySlotContents(INPUT_SLOT, ItemStack.EMPTY); + } + } + } + + ItemStack toolStack = getStackInSlot(ARC_TOOL_SLOT); + if (!toolStack.isEmpty()) + { + if (toolStack.isDamageable()) + { + toolStack.setDamage(toolStack.getDamage() + 1); + if (toolStack.getDamage() >= toolStack.getMaxDamage()) + { + setInventorySlotContents(ARC_TOOL_SLOT, ItemStack.EMPTY); + } + } else if (toolStack.getItem().hasContainerItem(toolStack)) + { + setInventorySlotContents(ARC_TOOL_SLOT, toolStack.getItem().getContainerItem(inputStack)); + } else + { + toolStack.shrink(1); + if (toolStack.isEmpty()) + { + setInventorySlotContents(ARC_TOOL_SLOT, ItemStack.EMPTY); + } + } + } + } @Override public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) diff --git a/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java b/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java index b902207e..5125c26f 100644 --- a/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java +++ b/src/main/java/wayoftime/bloodmagic/util/MultiSlotItemHandler.java @@ -176,7 +176,6 @@ public class MultiSlotItemHandler implements IItemHandler copyList[slot] = copy; } stack = ItemStack.EMPTY; -// System.out.println("Count: " + stack.getCount() + ", m: " + m); break slots; } else diff --git a/src/main/resources/assets/bloodmagic/images/entries/alchemyarray/divination_array_1.png b/src/main/resources/assets/bloodmagic/images/entries/alchemyarray/divination_array_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e4c7c4b92f7bb5548a68fb73d05b8642ae658e GIT binary patch literal 30510 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 OxAb+4wCgn;qy7iVg#FO~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/images/entries/alchemyarray/simple_array.png b/src/main/resources/assets/bloodmagic/images/entries/alchemyarray/simple_array.png new file mode 100644 index 0000000000000000000000000000000000000000..04771848ec43f63759c5dddabe64dfc5beb55097 GIT binary patch literal 27736 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

      =l9w(n_q?bH8So{hxGH_uKT!4kFQJj@3n8~? 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/jump.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/jump.png new file mode 100644 index 0000000000000000000000000000000000000000..117643c7c94303e48c2c912ed3cab15b1a3f6983 GIT binary patch literal 60507 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 Ef~$+yM*si- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/lava.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/lava.png new file mode 100644 index 0000000000000000000000000000000000000000..98eec256574e5c1fe5985d0b3d0648b5052d4b1e GIT binary patch literal 33923 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 TAVo;l00000NkvXXu0mjf84l0Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/magnetism.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/magnetism.png new file mode 100644 index 0000000000000000000000000000000000000000..1c864edce4ba3a37c09275bd482546f57b1d8f3c GIT binary patch literal 74168 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⋚f_(&O&`d5QUO8gnWZV;AI9vL|99)-j?#7*2=? zKZgP$Cc;@Aq1TwR{d+9Yg$BuZ>;-)4Ua&`q5)ROLgLCl1D#X;$tkzerTe1cw7sGg&Fo5G$ z;Yr@BR;PHx6lJAo?x=IzlX%yN+2tq_G#XH9wrsOmbgFxq1*}2K9!(dT5g4~V3UAh zUSgr(A?H`TJ;6fA7DVJ(N42r(%`oOt0^&9T9%5ERJJy4~uhIC`X(?x)sR&AI0A~Ro zp75{U0!r7ivQ2Ib_W%WR4fE-K2+LzTamfKYjv-+3@S0qe_5CaR*%vR6Ov-1`ykE3+7MevU+z3ls!66>&$B>k&~GUlXMlu!H<0K0LBdE z6J5%#g6RaI)I<_uT13QT(37D7Pll$Ep+02h3ZAExz@i!Ny+qH0>`)UeECaJp#2*te z0WpTT8uJ-37Rg5fy&frg%Fs1YdHkAI=|ZxCsUtJh+H5OW-8G6fgXmen8RlCep$4HC&%zIPSep0!ykYAlP2fmSTY-ScWXfR z^yBkpEJnC}LI}WZs>4oeVD@V!GgY`8qH|o|X;Qq4HfF-?pJZZbcDE#HQJKmNf9gBu z8ak@MqN;S<(9U}O`uYl?Z6C6NO5`<`ZO0AUZajzURF-Z?QYl@lS?It!ShV3q+f~+N zNK)@jY=i;ims?3 zPna@291FRmzR>3EL{R6Gam-|hW*~(V>0JJ#5PCQ}@h1ZDf=3LX=ultSC)g!~W$KQw zBpl!+m(iHNP9JksWXu=!Q~}aV{lnj`uNjigH_8~mml~$iuL9)UoQTZjCHj#qf?2rO zUw`r9Ykr`QxU}|LeF}D*gIxy7YF0B#^AD{_g$qGJg2^N`VPXEv>D&G}T`ft5C`}2` zajDGZNG_cB={sy~Nh%D$2|zO%!Kfg?i<)T4qDt;%c9AUe!ATvk`N|-uxS*dVVmh=%k@F?a_(6v{wwnQusEFC|UK7gZPb{$@^ z?%E=nsLac^7g3zd!Df@A5~M2>`pmF{XS7czMI8+J_h36&GuysSKIYfB5g*>=!(ahf zklf1$y{44~hueGRLd2*8Ro%2z#Q7n?mT#L6Sr3pDshyNbT>tM-5TG__O|H;i>uTo2^Nn30u zw$%7{MaM-$@5>v}e!IT9xtafZrls1a{Wiaj?Kf{j_5kw(tVmc^ew4fq^RU>(HA-U@ zC2YFvIerU}wA^N$i!F$Z?fB5-VI-mefltRgq(wv7PlP4Fh{!pS7{U^wf~i4|2)Zi) ztl&g8AS-y52!~?+_KBIugzA%m`{bk(*hD6?WFv1XR}zEUEqrPRs8p-MV$C#6>2TJ@eπf`4?W+Q+wN4UR|TNhmf7sF=2-JG)?5|7;{J(c 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/phantomhands.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/phantomhands.png new file mode 100644 index 0000000000000000000000000000000000000000..2044d3e403bf67d3a0eb788ff39f274188384743 GIT binary patch literal 90184 zcmV(*K;FNJP)94{;^RZ>!1FA-W-S3^HP zqH7pG&NFBP&*a2jAtA$KOLxdEHWx2Q%+8y za3*10UMdv`9t&N3Tp%_Nu~{q;H5&_EF&2$tCKVGA7zs*}YAqoPXl!a~LNF0iIu$G+ z977@yD-MTG4HPF0dTb9FDI`2+Nf;j+FLqBEKPoC`V`DckPk~@Ab#!z)9i*L|oyp0` zRBkg>Z!}YEGg50ZPG&Gxa5YV3FHvbRR&g~?XE0ZCHdu2uP-rnsV=qo+FiK%AS#&pB zb~s#lI9hc#Uwk@VdO1m7El6H0V17GCT`WjlEMb2!pfb5sJzL@E?zl%%5ll)r36=-v9FfGhdLkz&g;GjN zTw|o3T#b>Y{$%f*)1d4z;mOe>mU(uixc=lGYl>J}EFzj(EJCu!NL_K4SS%LNSn5O5 zbrlikoFL{sjVt2f9QF7eqg&S^GFxn^JP?Pg*`HiA5(&&nW2A(4Moba{xG;1u9R%Va)Y;j?h)Z>(Dy2nI> z^b-%Lya<-rJFPt>Tl^NUt9V}!OTBjjoY3${xaR@vU z1=r)}Gvtgl{lr96N_jq?pBU%*6c=Xt#3Hz$@g|5FF{QMM&?&}x?6K4XDLt+i*eo(U zan#Hy5%Xt_i^wM?ViBc>I2>c5gabUr=W=q5opV->_x=;}IexuD&c4RUIn+b!y}VxB zW1_Tb%wD9$3Gu9P2rFXt-k)O;;XUU1jCn`yO{DXGSZ_v8D-bC3J+_4sz!8mE6% z4boZvKF6ydcZzGyEI-5|EH#f&q!f$ib1Y@=rs*8J7WXb&uJPmAWfOm5?+-EeHoM2- zEIxE4>0L?g&Fa*C=^mdOE#ls2XK0V>we05=;XSsabImU%#N`@Wjn-jL&JbOXAtg!aE#h+4=pKjQNs9Lrj_p)5mKrnX zW88bPxL|7Gv_5W{Cg1|s=r#3bT~%q|3W z5n3tjCCu&VJwC~Z@5fvcpOxVr$Ea~w7K!E^l4~AgB%)%JklpJS^~U+Lx3XHz<~-*SwZ(X6ds z$+=|WczMn~1WG9~uXxk0OSYsfo@c}%*wYoB3&i78$z3GEJ+3w~@A>Oh zV+cle4vSE`p5-BgkBBR$PdtWD4snd}^?K#g(>+m$k*xV@ZasOPSIt+EALCVH&i>kz zy;$D5FWN7+K8u*naR|Ymp6>bBnm)bB^44fCu^i)DUmm(b?IvOhMRYMMyxN@O;!xd1 zkmEfs_5H3F^HD~+jTFRZ?a;X8!8v6pq?8($8u#3nQsdH^FEhs&OV80x&++}~-p87^ zUM;6)?VOi$vtBQG-{hX#a^FAy+RBihTbcW*m-PmWeWm%+Z(ilfWn15K+4Ek;KbI%> z@=iG(wzqHJZ??IQ(K@&t>?y|6xj)@KuXzYHernmVc3H>Ye-d{9Hxe zt9y&(u#0&mxo{d;b0ITOu`?THWVdR;SJw$P#Ntmha){HdL3cN4rLjyjs4+{GpKgY8A+R>UpO=iJm~T+S}CjBu1;YCBJv~x+$(P({&5|;_Du|ZKCh_&kgOC5C6rq zF8O@`ax5XZA96k#iubG5aL?D(^1IR86$R=NB9Tc4fXRsWT=VaHp7YQ7=Y4$5_qObP z2|H-&W4i>=dY98--1+jwKR$SGCf0ehsd~W0N?{hTl(@eh)^?%O$RKNGM z`>y-r~Jh6;Ym)AK3LjW$wX)@TeN zee!(BGxGDS!BYq}CipGy4c;0*-^UHeOUp5DxJ~;*%b9x~TD!Zo!QsDJ%Wv9pkvM=p zL=pL+-jMxo;&RIWt-098b~JSv1|b@^jh3b5bIk`L+O};Npm+A;M5N`aDVm1{>P&$Y z8@T0t*idS&iZI@X5WQnB%ReXww!L-dXJ@B4J*G!M4Cu$F&RvVYPRyMK{? z_nA{!zl%#yVJW5PpC}i3v0PndHy33W;Jr81DM!`O7kF+3=3G@r3rQCT0vJO|03vQ2&1u-a_kRVK=3joX0_*-=BNhY04Mb_X^**^U z59;82qhaWirzSI}kyJ7eyqqk}!0-B&KY#&#@|ZUVj zw=X#Zxq(|Dp=PzPNL#(edK z?gd?gx-e+k!O?dbXd*Q9In~{AQrDmQn2$EoZSQJz_k!}Lpa}&{c5V)pYDC^|ZA8;S z6Plyw2s0bd@0B*xSwy}SXtb`Y{%NYyKz=*|9OweR`QtzjXW%430Q(%18))snfvAt~ z@9!g+dz*jp4w@Joh2iQ)@rMye7o-mQEeHbx{`{r~_;NO9Q^j(ZO|Y zcGUa7fx>qSDrY_VXALp~xQLU0bO7I(Pl5z8G_k#|G!Yp{-2u;YEq5Py;n;q+z+Ptq zq9IP1fmTij&4Aig52S$*LN^_Nra%oSp`#l~fCIIcbU8Bcv7-j?Gu>UA8gM@=Lj&iV zHy3Ac7iYK+M}83`5INn#8Jh3f@JiYR(DVnu$bGEU9IzMT@2=;McG!#QW<(^V1Op(; zvRau$O?2GLz-nbyVC41EG7TUyV&G+NQ?NeOYVEWspw$90hEpwgNvj3c zc$C0(MJE}JD6rdXM6@|{C3P44DYMkB|8&}d}vem+QW zyM1Sif4HxAzOh%2Ycz87AAeE6J|Htt8lhU`L*=LuA!1bDh=DQ+h(_pMn{J?BCyg*` zq+r#nP{j$vCdzCi#;8P>+Q4YU@qa_Ze*%Muo>hs9XpQ4aJ-#ZC7pC>q(>`WSNpq?2Z+gG zC2RyGUbImSnZCZhvOTQE;(a5Oa||JeofNO26THU!urxdRBHAZMJHgt6m{9%dO-G`j z7~v*PAg8g?)hO=fbajoJQ$=&Cu1-T+_%=&B&dmB^#M(|y2BdW9f-tdP!XXyhu5 zL<)AB3Y8RmW;#J3VJ8K|dj)WXYy@8njl{S*CvGR*r$FLSo0djkM;DDUkyS?Y5gqg*)p;7ZID#kddKj@p;Df z(~zwV(~id6B@^U{%6+TPNULJ$%6O4UXG9|y$Ys>FVv|wHgjvZ>WSUlH@1v6JrYWmW zI}mZxc%ad%Nf|*4*699|n!H5&4i^ zC3j&=My!bSSl;fEAgHeqYGmUNkx3C9HFK*1Iy#V%gp?4Ya`>b#ATs8O8Dwi@nCnMX zO;;>qu0pkKqn0a9yb=6w&J7@AiHCB`@9s_^^<^_eiACE#8Aw~ zshw~BNm@VWklD?SSV`nDQ~?!QfifpI6N?g>LeN+rSyA0^&qN|V#%ap*QP7xj-bHiq zYnetd4T~yUxuPapKs#|p0xdve^DrPYG$1oH@rIgI^>0kn4RV=m0U5dKNQo6WrP6Ni z4WHHa$JJ)a+@`-p+NRAY_z%Eu4DN%_OwIoMtN=lk%)@2l2K(2}%bJs9MPF7;7NP^-u zuDgecC;~Z5@2q)Io9h7?af)`;G}Pu-ZL-y7UWT6LTc6n;36S((aB8a3$9_X!>o%0^ zh8T&8 zR75E$3c)i{!vUE>Q@H6Wr8^tUw;fiDOpe%uRt}{r197a7t$PLDL!u$V4pU z{Lw9uDMow>c9d;?W%dR~D@Bow{B|UU+RzKggv<18q=q0DKxQOOV~Qcohl7+ZSn2D4 zv$-b_12y+-+FdF_HZ~-NaQK!@TC;hn)f}6B0^xM*X!S&9pV`&pcTGPhPppVXm}#Eo zq7@Vz#B-do1Rs}W;-D?|QHw4qDVnC7Lj(%p@y<#FC^&vjTM&*Vs{hdR*iZfDxQbYS zXDS*6?_g*n1|oup0hy!8#nE67*I8g2`SoES8QL0>hPX}2t^+aJZ3Vhgk?d%gk5byy zb8M5(!KAw*G1RPd+M22B6T6mLVZ5!;`z$~sw0i?0MFjiYy)^fl4GkDwOc2umF{SO# zALc5ih6D)xoI*uXv@m69^^#;AACovm+na-wzy6y3Y~u)&6p1(o^yUJz0VU1+4C@Mk zw)e=<|9L;2io6r&6*(Y&yeDi}6it&NGqEOV@giyX^UIK04JmTdWKL3+iZbq^Dta7l zmM)6Ef$aXONl8QBmtk2S2o6}~kCZ<8;M2N0vq~xR9hsH(q3ASq=?1!LX>HK=l1J%Y z8Wfp*eohpz_wztNE@KD+`~BMc}0jFLfyad72an0j)6-XP#Xm7NAGwDExPI)`i9#W+`g}EAq*Nb|RJqpUFuPt;{ig&^XcpRDgK( zidL7T3S3qc58fINZWsDZ2j9dM)&q2PT58CY#cbv@Ni!4`4Sh^}T>aWpsSQ5+>W{mN z->0R%82ZuEQI#PStVs5PaV{LW{amCZIVl=B+C6wj2^W7wM5(S2)E3C4RH9b_%!zqU z1P6-4y7)OJPIL6Ul$;XBlpKq5gI|1!krP!#%Go&}M^sM+5EB7WAQ!zNA!tG@Fejnt zBvqkZy&{GT;O7IGww?@bUB$ewfK?P^pCCq{)s)aih`Bkfa}||RQJa^!*YSSs<%X>? zt#3U~iQAZ%u4~^^mK2FZyUtBzo3Ne*9`)i>te<+tc@(wwdc9XBLRc7*TCXyQ%o_1! z7#$U?yRtPYqwFAQMTQ|dhO=g@VM>e-iZbZzhE*v=uv+YZ=P|kGD<;{tIIu4=W(6(@ zR5GdRzM#5m{lMhR?8p&Z7b^Bj5ZZO|U{z>GnnH4wVVbl?!48QzfQ`Y7)~1dgwrdJ! z4%h5%TG#4uA%EtMBFcc2G2>IIOl*iKX0Fbrh-)*N(4cm#>a?U2qdSg!c}G_ zUK#w;UHlykCD~u;BJhlm^$1c$c4L0QUOqEpIcTaMxbJUV3AH;zS;3$PP}cOFl;u2+ z4$jIGvC8LrE{Z(ZOD$^3eu=~5LFvt0%k>^>_R{iQSQga-wC%97A;E&jZ4ARQFYCml zuFLhrm%&^&OQZ^9W%tFHNX=CE8>U$7%wjZjE z9$n`VLS@4cLakP$&PyMT1SdW?O2ePbETghN1HAN+SVn%#nP?mSj6r1E)LoY)d5>co zG4Q0k{qx}PXB+jYqVui0+9C(c}3^-=x^tlu+kDon=g z17=d&Z;aPR9`IB8qSp(8-ZpR+X78)YDhuyi*+Ur&GGG|3KO7gtK8=<~5-<*3>_>=w zrt^7N>^x*;BXa-?bBP*c6%0i#XNm#_(+CMa5KN@9sEkbfgDPl&{DN@;b0g(UK2cV- z$U94Ptc-jdz~;)52ZL8ABf^zmh1Qz`EY)=dLQAV(X0TKqU|n{JqOz2;D4UoUu*sB` z`6I#(wo5QPFvn|SsoP({rq;3d)#{vNyI~GinhN`N#~i{LPLo=<4sDBbTyke73r3aE zYW=w~z?G+b7)IyHW?Y}OoDd-IU_K^e5c@-^1hL0{Km@0Vmqpp*QCSGe{G7qko56gV zAIxEnUMnbR4!KC;H*xe}?^KL=pNcYOei9U2SxTj(+_nlMJ%3;#Tl*( z4_;Y#8viCcBX!8E&nNsu)(=1#^^qsJ5FR!U|UpGc*&v>8@W*|LDU? zXDironptNqy9>MK!b6ec^xC;LzK%A&c8!U*`L#2)IKlv1qF<8}>?0hpixr{}R2orf zQ+{VGGJ#Q{tSlxwWYtGy3p<6JX3COQuZ+O_Qv9$iiD+^2Orxaey)ygdz%qa(n!!kd zv3F&&44W}2IVp3V6FuzKI#^^@Hp6upEKQR!*;e!5v9cr_;K(Ywm6-_V%;G4CZP>ul zKG`j$G8Ar1A7;X~qc{I!_@7fG-3?=?Y~*pS-e}BwBCu+j7$hDhzbk|nCy3g}Tl%%| z!nVl9*L|`b@GP(>VyvL&?Z07Qv+WlchT9%2h$EL!Xh_&ZROOHCOC4{6VLOm*JCF!x z$SWMH^Eq}^moa@9lX(U!2)>oM zFhYBM9QYwAWqzhI!-Hp+TprWpvR{-DC%9T=9^D)wJO*r}AcA1}z^C6#7}JwD8+&I! zm~aXh2ya=2SQbA*0P{tK1LUxHKZ-yfW@>}qvkTkg_c-5GhRsD=?JiUcs`kRBuU3Cha1&9+MhTXeN^Y$MI^q8UzePO~BHZ$Sv zug#{u&60x)hq3Pjwu(Zv!=}m1KB^vWHu!}Ln;!CJli#Y2x`rA$d=|uHSRXbA9qN?d zf2RDlgV+ui!cdAS=Oaur<3jku%rx0#yV&nsJjQ_bsLxg?vKdSXWeV0OIKtk6gOs{a z7;p~K^&HGw-6@Q=Q^4`bm~zHBz%JrH_~#g-0J=B+%5EFg$5Q;iXZ{*;#tY{qzGrf2 z%x-*A-jXii*YM1|tSK$}!Wmbhz7Un`+JAlN+Xp`-I7LeCS%?1&5q>_aB*$WsoJ^7@ zv)%XjjiK+H9ZYy*_rf`QJ~8zrj4K}1Xl?BKdSUFVDjb<)fLEG%n>f^ zWSYGX2Y1ZD+>xASw1gV1Eozif`K{

      @J8%UKr=XpitZAHy-3fYTea`tRL(?o=uW%P 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 z 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 QHUIzs07*qoM6N<$g4kDfwg3PC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/expulsion.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/expulsion.png new file mode 100644 index 0000000000000000000000000000000000000000..c85964fc781952c7d2721bbde3dcbfd5c77f3113 GIT binary patch literal 41196 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/featheredearth.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/featheredearth.png new file mode 100644 index 0000000000000000000000000000000000000000..26bff791054aa5f3317a2d705244b396b93e3960 GIT binary patch literal 85440 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/featheredknife.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/featheredknife.png new file mode 100644 index 0000000000000000000000000000000000000000..89a0e261e0fd08113ba6fc6fe6f13420e0895ed6 GIT binary patch literal 57026 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 b#MS=+4FnM5ZQnqd00000NkvXXu0mjf#`d(4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/gaia.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/gaia.png new file mode 100644 index 0000000000000000000000000000000000000000..3efc61bec4affee2d6d8e676ef9033eef235ea05 GIT binary patch literal 73058 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

    2. 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/ellipsoid.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/ellipsoid.png new file mode 100644 index 0000000000000000000000000000000000000000..139bf18125df970605dd8a876ab152d33fdf9e0c GIT binary patch literal 89596 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 uA?Is*V-bP{ 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

    =l9w(n_q?bH8So{hxGH_uKT!4kFQJj@3n8~? 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Jump.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Jump.png deleted file mode 100644 index 117643c7c94303e48c2c912ed3cab15b1a3f6983..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60507 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 Ef~$+yM*si- diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Lava.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Lava.png deleted file mode 100644 index 98eec256574e5c1fe5985d0b3d0648b5052d4b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33923 zcmV)hK%>8jP)Y)Y{qQVo>WQC5rLxnv{dKw=jUO!JD;1Ts{a11s^d|l>$>Oj zd_J8-_WQ1D+g+ieZko+z^L$?WujBFY*lhm({d>K3-T8dE>~@>Y;XsO~{*U9)DYjcx zG(U>Ndfjy*@_5|u$75A}f7kVXUscuRvfZ9eRds;ka;a;lxL!TQY85E-yA{z79yS~O z#?R;Dv271^*L9c6^Z9s;ib@sh^{A-pUUI+dHx?*XtESPvn%ix&+1&59+x^~ktJVE} zI_-8l5fS$t%vL;~t5sdE*G*H`syTgsUoO|H{^xpa+y1{)aXdPOw5`ae`)jDGw!Ph| zs@iO}TaoozY3cW`usy|Xs;ELmD^k}Y?w=`ZQ9}3ox&Ipe_Vw3&#Yq))Ju3E49FN2E zPp7(8*aK^Y-E|}EmjfOTDEdcv3YCP4=b#v19}d0T!EW0Tb{E(|9TONvCBCJ;Uy2d- zKpU{(7`4M$zq-y-zz=n;iZv7twntm0vP zxv1iNy+YB$Pze-+1h5YQY&ga#R04%Qz*G1Gq=yaK4)!%WKsxJpis$vuYVoALM2~cFGVluQLa`mI{@}7gsloVMhWVKcqvrU zGNfM6fQ37`0ho|p{qmw`(`fH=YGnI&787S=Jx`3ot9PgvV-7mtO z<7m74#SiV;zk+n#^}12Xey@^?)VE>U-c{4KI){67y7^SU)35p^+3$OQJISDM5-4sS z?BmgcUDq$z`;AKUNjiu3`~9CkDj5_`vfn$!D8YCD?7?A#?EOgHL+}+O$!g{ze&>4%U*ReRMaB@izI_r(KPbwmmzE3{09vC&vB0 z+4Ke$Y5T9?Po|uzN+pf{mMYn9RU!Aglk8p+hCM9D5qAH3DD2BcCG9BDKkZW`x0_0C zPIA4f$}h0quuRyPdaE1S}$$sv%; zq22lm!`>;$YrLteIbr|%BE*HJp>JKj>KjVM6i#JVDqOcw9%SB-~dkr+6vpz9wabC|J_3J0SP<<+F!pjguoE0Q3=t`Plz2PCrDaI^f9~- zuDPx91xMUdQ{?3cTr-q5t{K3+*Lz0hW~z6t>-BKZb=eDaR1XXM@8A3V@%a4gZwz() zk|@eQe+Jki?O|9Pj}Erdc9OslqXdRf%_#Yyy)|e%4Nr(sa)+b=?UrdPZeAIdX>dU( z7!e6ajFN~WfO`$x{gTC1#9cg95?(w%rRzRE^snLP9bkhOiT&@W7t>>N9ck-L`lv^I zfIZT#mG(=b8Yelz5T7u__?QCPs!<6{(<4eNEd#!xfIFdaSNBedY{n8(wdw3)5n`#CLX;kvk+((T?8>U&qG?5W8 z8tb7N8WH7=U}MFWMs`NPHTUGGDZmZad!_Cck_bcXqSD61aP^ zvkv%4<5<`7lOR+V=~#+ecAGEnyFmjE44x;ug+=5C)BLQL#ozQa)HY++&1Tu6dzEY!n#)s zEy1^qn^>BPG`L)5M}T3_BJh3^@1j8wy33hDwqfY! zLLPeU50U>;pRxfj3Nk!FBLJen6O<{>nG+N%&lo0iXFz(vut?pNT^@Alm~Dz)G8qCQ zUIx}3-`1%^PO2$Q11q`+nn zysQr+p2;iTTT~QgdSQe^F^?@8(*cZpngL~lB5R880#oesqOwWBx6D;aMC&7S&6M!v zZJ7CmZ+KOOj3@EBUU{cPs!BL#<@4r2F@{0qrm%;=N5P~(8>w(JWOfV|kv%Hf+^7&Q z6%0cl_wx3F7xCa-JKjy0@hmk3c$ZHKq(MN5^v~K1EMn^fC{ZM$;z;p4Nlk%rS13fh z${WL*@Kt>@;Rz!iRpm^fBx9z?^G037&w|27mGCaHPSF&wt%FAu056&q5~g`U28=iL z;2mau;VXatQ3brqtV6s@Mn%>Y$tkd8fvBng__f446X4d3ZBTLB*y{3oirm7#_O@w#S z6(_?Ls-h`Cvw~bP(>sI`L9QS6@))pG``-Z1tPrRQw}bdE>7#G*9Z62=DD$7If_Id+ zpZkZwKk_o@v&1EQ zJ&)J5L2ygSEy5PWbR5Yb%nO5?DDV!z{W6&09vT;nlE=kweL+VY1s`LL*z*F!kEO&_ z<-R(ktxA$JIv2GNa0+BNk!g-0@MO&kGJ!AR;{u_+F$glgu-AyOAW--K@$cF8`6Y2< z-5^4t_wLm1pu|7OV<>=wFJ!SVtjV997lwU+l1INi31A<{HjpuK9vHbrg4zcgV=@ZH zx9(m_Phm{>a()C(NedD9cVtT|Uhu!izRx$N8`apfF7oCM{vC`w)=B%5Un8U-Luqri~yU;**? zj!3T((HHXwS&*M_%7QFrACqw=>*8HL;`vGN8I^^>EQ~RtTx5(kDwA_^6g1I^QAK6X zs7xxLv~C4(hGZ|5E@DB(!tn`0mR(FXzM2nnwWu-v{N5Ogh+|@O(TO2^DX@10Mf+?Z zCsUNhrIKbrfq}qsK!orFaV&zEFk?}Y$XX}FGsajajp0YP2J!DCaX*R2j+i_yg%TqJ z#LGtpq5P#Y&QWKWTS5*e1T20!rzB-cviejQOq>(=FndGC!|5#IoYiLybe%j7D9IT# zGP2It$DCmua%-6wGea=`%a99_6UxdEuvCXQaZcXC#~Ek5$`H4maR>3YJ41DZJnoDH z^3WOVpd9kEjhu%Dk}?D*2-J|TkdE?qgZKhxAa1ptQ9d&mWdU;AK{j%>29TTUB$x(> z(~z4WPxIoHN=YIdEhKL1P{r|4^2{jF!5IO{&$3})>kQ;&(}1lpZyHFLnj}dQ@!#pf zY#q*^to3)gMZ>_>EkSPUQpnpZaxj+zLX%0z8s=p4b;w4MnWKlZ+!~9JvkrUWC0sNO zY~9R7QSJ>vcp9dsVI^alxgjS*Vjc#l%dFw|Bz$YUZE84_?^_h)q2=Qs=Z)A86yj&< zVL%U(VO~CsPhHANy2i4GpN7L4zncc|5FThCPmc}u5bN}T1>@jX-Y8rFq9iH&3Ntc9 zX(4hBSykvi@GZ#yWIRO3fzlWo^ES$!j`?D5gby@UK*>CiG5SJ6#t|7s?+`Y>Mt;e9 z2tq~4$TQx!7J9=z=Io8xb3=vE6<{$pO$6cVoFgEk0tQN)E37hXo>lOhFBzOEr1fGDO&u-=rC+# z9P|b55F}n+GDe~488IiAOP;v|%qc7Xm_BkYb6x^uqtxh#q0CJL+AFp@=%5?!DBKsS zOhA_*BpFE}{-%)gG>bW6Q%cllo^t_n^eD2U1MZ+A)cf55l(-fq_eJ`Skh^J?Lw8E? zBTkA!k#YLL7=@u{{5Tw8PUVOe%%SW|cg&jzs7O$I2Ho4_>;OtYznW{n9trT#r3kt` zJg`~>K`0VV#9}VuJUf!ioN{ee+U{^l9ADHP;0|}tv$MnYQD>mEM}oaDmO^JGkD0_w zkSnrk1e^$~{e-hr33qtMcNLTws1Gw$p64qKlz?t4&k1D&dbvHU`-EIe76Fukc$4x? z)Ey9nk`n(4G?Z7+ct{*{R{qT^anK26N6?c>!ybju?U~TAGQ9}wl_8`Is+8hVP^6oP zK{={MjREB+gxUvIqU3`3o9%&`3;HYXw1-X)LTR3K^P0dbgKvCj%F*^W?g>dJZBy%C zkW(YjMo=9l+K9dpX(RhartR4yfS$Amb>kR%Zh8=OFWSg$TK!G+=&|W%${uzgUp9x)JPWnng&n<#0K{uR~845sY4TZ!-0se>` zb@E5)((oQCrwd|lM4Oe8L~R9mHgywB=#WkynmFkg?+P822h?0j#)pBj$REk|!qm%_ z2B>2yu$2tzin67U8Ywl!*?^AVn+q;{(zTI-8Ut!g3;baWg#v$M=7){aUIn(5Qq=9U z4yho^){L5hO=?IjfLjl(H$HMGoAPA_rzJOW+vTW5xrQC2tJ#7NrkmjZW zRzVIWwuV7HWe}h=&w82EzAV^RfW&P088_8Aw29dlH`&SmlDuK;f^ed4q>~cl~|4KRA3NL z&rFasb^8Wj?+x@K=UxHQx5-&%Qj~lL$p2&@sG)Fo0p$e>vT=UVTTD@Z%%iSSdMs1t zvtFM9Yu-8&Ml0mx!B+IEgDfbs zM#$PgxzHgPH#qFL`2l;$<^cBCg))a-4q?pz*)&=xXe30MEkSufQRb*?XN4Ui(AMmb zBbS;4C}}PfIHZ|4gl9+!CD#~v9h3|PoM2!#ZUH<*1Z5Qz7lvpWA$EfnN{0Fq)J3JF zJy;H*0}SeMhs0-y?IuELtb?+_fYniS3*ggkT`6Ia0A(AN45(UyJ_59BXfJ7P`~ah; z6xLO3?FQOo&{e`=w+F)#?YaQ_A}xN(y7LC+DU4)Tj*fm43Bxoo-QraD~8)$22RSc9@prpaD z+#>J7Zch<=$YXir?*XBfZk5U7?od8YlP(czC1C?4T|qgcVi+`!P-J#!%Pew@Sp?V@ zoc2j;^$IPPM`Fn1_GjD!RGhn2!cW$5pLJ;vFO#PJ3A#k8cGRg?LfC6yKgF?+T09uo z%O*oj*y9TU4JwU}gMrQaaecX#YV&5xYM_803>SI(Y3Hv8oXi+QS21=#cQtW)% zshfs!TJYf6D0wvO%0`2A+>`e|>t0C@Zi~nKQBWyC485F5vx?tipCj9UZ5bc7SLq4?U+4qDXAs2#-hF~uH;B@iE|Yvy~zKf%@H z1lt}#;fxw*JVyeQPXi?#ce*vuY=B2_gpDy@%AE(vh6NoFss@FHBkG=nm7{<=pWp!HHX}Ym9Ceh6jWNG~I}Zn-H0}a4 z=dGo{8)QWJr2cvC=I|q4g>4d)h)^91yJJ)%qV^cL&ov1u!ZhZWa;M=?h*BUKqR8QY&{0CBR43y99VvOKsiYyJ^JDyR3Jk-{`5f2ASp7r*Tmq`uGCmAnyF?d!( zPU^5GYJo35@#vMZs|dV-5^_>Qo^)00DrgM|$nRx7>HmrN&8}1p3_UO>XSK?y%vlcp zo&?ViPYv%hN>bb71ad-29(N_o_@=#532G1xNJj*Zh ze3Cfwgwi_lERXucIK+GzEFllM^dzaqi4qvvK=Jk;%SV(s@Icuu^~t2bz39mEB4IgQ z>y0g6M4sgad9YNJw@IxF9WZ4RB^gEO)V4hB6GBPgbFkho;+IIHjaF`96l*TY0D)q56`@Tl8jO=CzLUk;+MMk{{avqnLwEWpCiw5 z8zmokn|xZHJ@YpC@>>D1WR${PDK<(QJgvibLa(quCVooCZ9)g9!l01%1cqQzEEC@lJ%wXx1bN@21;sh&XhZSDf#94Qu2%S z7W(%Oi6nYKn+x6UNx56ml%QO$kE47)dFcNYdg$Lj@B@-SiEeirRx)k!(Els)(3hfI zuK#D~p--Xz;$GgQm}jD-T7MyW*8eN?(El^^&?ix*cD=z~43bpHgx>tXKSK}wzd(jNn%mm*KJX^=MIU$%`l1gk zKlbHbNw8NkuOS>Maxuy>^yMEAnSuV@V*+IA=jXeRec}U4M?QbRp-hmBc6QAV%ty~C z%hCUQU;)ZsuLwT&Z@3*8W=XOaD&)Pom?@M7$?^|C->phfLSOm;=og?={qL>^Bbfy^ zL;3)tIvMfJ`~c-+!Q-{c^M9*h{2{sbHcgGbHPR4@Aw9ImI?g ze4xlI+ai?ZW{D4q49dbK5yF>rrs;uhFUZNa9=g`-vb7}@%LKhGpb6a{& zBkbp(95~+B0|X=UX`Oy)(Ik?ZORXujUeA>y1s)99768cLA-`i&YoO4LJ& zY;mL?AJXeLMN(x?t;OBSsjo_4AeTMV=l9t{*{em#zK#;&{fOd|{Gy3ClMDa-9g3}` zY+nV+j|KXb@UXC`!1qupNk5_1x0pK?xwUw1T&be)>nI8f7v&VU@pR0)>0~r{k1}}W zSE8&A6Mk2r78y(h{*j)aEt(>wvOk?RCt(UnFE3tD9%m5_ve)r5$}vPjyeGMY_G-^7 zM~+t-N_>QU#^7H6Sopq$IC6b*&;*iBO1zU9eYk}+mxCN%QSyw*(zI`ZcZ(KwdHsEq zQ`}B*n~s2znnY*(0`dL=3LWddx;(!!PKZSW<3?`>$9we%u_N8yOQtPQ*4)_1rS|gZ zz3gk61eEvtDEWd#>xL3XNsNe4Bt#j_yOe> zqXNDH_JS?{QVAu@GfMWSqZ5b^3zT7k32`TGC@DV29gH!c;O$osp5qY~1jfMRpgfN#)5c3G4Vv7*7X_s= z>`SEJ^e~Z2C4QGU5jx1E$tkg#4_)TMOLDsuHWc*vdSP;Wg9#`%3FXdE?w|rCoWxfD;p(xRA4hR)Ax~Ri-0nJP zYfAmRPj1 zJ^U#ZTCw~nY8r~fb|}-=vW9H4$Tr$y=Fz6=$R)}MkSI;q(^k0ft52xup2pNEl)BMb zBpJ?<%q|V(q(r&&Qc#W!<&5IiA|9g7p;PY1Yy*^(hNNN}`L)9kloG`KQ~006 zEsbSDnMwMEOhsDzhipjlK<6jQW*;TLJ-=!=TSA)HW}oJu1fx!rwnz(noTUWfy^{iE8kkL#OJ^k3;qw z{QmQYXJPRV-)Fa5&D#YKV2qs@%=S^v=yIeO7_~twU%i4xS(so#Z`^fcDB+jvy?52l zp96*tGPSWkqZ}6c>107|q?*B)t5a^u+7!81K|lWaaQqv^pHNbUa@C0ve-p|H1(Z`j zG#N^W6HlT9z^t%#kWjAI%XkhS0T7-Lr8D+R7*`MdG+g|s`~ivRA(CdF5)y6(z>W z|J`h=UB=IjIb3D%m)Nf!FM5;3%s)|a>rk~a1v&)38TER9#giXNvPC)XKpAri@ZKfL zsf9IT+Y)sZWnC}SuB-FO3|g&#k}NT0-84Yy4CK|=&$)^LjcTr3oB3(%-$<2-)TKx@ zL#Cqm-8!SA+KhD>4KqP-7#6J(<_@?IFia|YqV!1Wfwc@b&~1v~^P zUU^lboQhXMivSaY5`8m_M-TJL=&!N=$N1O%A1e4;U4oRcv6?7X?@caox@r?kq z#RF=ys}?1E&qX;ZQNB?&h1+a+tXMdk9 z?$;z~T?%xdk#x#+luM8-QQ{pEN_rtkPOgS}B~_q&j3_rtOQ|MG>Hn*P1~kCPs5s%j z_T_#D&`5PrS51o6FnOM=<_p9ww>Y+z{oqMR^uco)M*qOXTek zIigbDWLx>uX2>c^WZT-h{T6qYgEWV(Q>Rf!Sr7l~L8IRR6mF>~@4E|3v{Vc_iobNq zN1&WXls6n5Aq244@9g#L%-p9%30@9LzEYxO?kf_S4do?ufB$O>ln`>iu&mB;605Sr zd-SN`P^nGjbpGcxfJVwo_DdJby02U+b|8O9`D=Rno9a|YHQNj$5Naow&D9O@`8i!2)Xa$zT8$bh+T3e*0LQ;~_RgOk0 zfpVxTYpX#e0gRYCfIEzq$l!UwIv%*L+X)z*6?jjeQ;O4&K!(t+sFc!dL#Cj7gD`Z` zEe)kb+!h#fnrX?5IPYB;g%qoz4F3C880Kk zEuj_@q3;ZD`wHP0aDJP|irX_~X%;qggQz-h@l{V31(ypm3N%9n2q<(4R4BFbyB zj3`$U0_ufmByf<4nLh{67|_gmBgaOogi<|1c1o=g)RI4I0J%(1te|YA%|;u*wUI1Q z?tGN%h%$R7lutHOmr$;+q;gRZbb5jt_u-PmYW2F^CX|mr36@}kM~po%Y7(HJ^kYE1 zB!xtd5;@f8b5KTUB&9%5%F3jwP|L)uOao;a&=dt?QcA9MMbRni4WL9B=dsoyP`Lr*YeUeC45L-L2*L9+ zV8^3+SoWh#n&LK_MDa+XVro|irbg1P*25bqD$4L$5VuUJ0wvym$xjFzalgQHZO1@U2-QSD9wyy zwFMZ<0_C+9dX~kZS|6Cr%qc6r{41fvOC$-=tUwt<*|^Yx;~~oMmDzr%7YN&l58}%< zmF6>i(goGlf}BHvWmH!O>v-iW6tdrM@qj0vi2&`1hl@Xei}au3N^(PD^ZG=f->kpk zG}$SoY_BZZ)dI0>W^&Br!VoEcBi>;nNgB#$G-AACL}?_~*b&wg8FDeeg#E+2T2UT0 z7|8-<@IA|0HgFeq$pPN>Wfqub{+oKGUh-n^EmvTT<*l)VYrLLe6@g=i7YADO@F>>` zu@+F7o_jL^*Q~MWiIxYIm44=wkUC{12|2zj*Z3$e@?qEgEU)33uNTSD@tz-qf5H30 zl#-JWSo8B)Ux_H>J<4;6Bq!69S2s&2Taw@LFQWv>^MI1PY?*))*w6{Qa2UttTVn~7 zXJJ9;?j9_i*_j^*=9z#KKdw5=h|-_cHMwR_iuQ`?FsTkK&59NvDA~VX7uWdUjwX^+ zl;;GAzxmRiR7;3k-nb>$(%>8QF9>&gC~dSf9pIHWf!7)QZq0@h`t!yFqSwElpE*T= zbCNGmGJ4SPp*}ya&Fa*feY56&6{jT0vSM4SHtQ`wuJHi@w4KWNKW%5D-L{QHVN#0z zj$>OVjTQIANq-zCjyK-KKG{8O?e~AK#T^XiayTF;HrrupOR|}$`fvdZ$hk0-XML1( zaov|uo*PPFF_iY;E#d+p4{$IJ>GyiC^i(ObM4u`wpT2-4!cZo9-@pG?QxrT)vOIPs z=$${JTgZ>7xnaR(s10(Jq4b2v9qZf{pm)h(rlO0ChElIe5hX}cl|;EKqZEmap~OLy zhjhrF10K1sQ{JZ-w618}jp@(_yMZH3=>|+{Q$eCEt9e!qL0LAg$}3d)xiUXjnQf@ zD7x0=k^vwIOlGXn)SJM-*kw|biaxY}+Ie(qQI8KeCYi~{i9@+^C=ml=QXU>^W}OGB}oEhIIrFWXz?MXb$!2O_WiU z#s#8WQs@&j@vOK{#Z&j6u3d(Jv)8}d~ z+m|-4dHDcSyW)AVXQnJ0)@rg?&sS^ua!p^a=?gZ;L`k=nj1uodi&#LCD3v8hW@lxD zHTxG10nn5A9MdGDW*j z{hdYZDzwj4lz2r*wxhki4&X;mBZDkw%DEYMJFvdj)oMpk&TIlg^7c9hNSa;CRze-J z*LXmiopS{8%e}66)A78Z%B!o?!yXX8x6EHom!};_kTjOdtV+4s3|i7%W{hvsL6kYz z>u+PPUwBuHtG}DvO}2r7EE^VG5+zG@U9F}s)^sO^CNL1CL-|OQsV7#D+wBG+Bt6PR z(ooWncW(=P;#&6;L;z6=ty6^Hs;LqWK{Bhd9akksaCxt8I7YH9~vD2>ugI_2t2%n-JC}l1vLNy_?Yn8kStL zP}5iHI&%-A45A!W^S$%kaVQ@j1>-_|l^5b$PgSyiJ&P!JqDlM^zeH66B~?lFL4IJF zQF0oK07YSm-#B@Tuvrb-7v5Ir_O;*lD5*-qjC1>Xrp^q1stxc&LkSEd>1u9SbUUoN zJ?_Ma@+(l{S$=QQxmwdVe^xVA=AAb}m_j&vR#`slr4CgkD4pUkk~%1+NU%DTIH*b} z5-`Erp={+hw(Kl=-F|3c2wUUh+xpr|3f$y=cB)=KQA_*kqVz?#ETAUJc%rx6q3_N| z{PW04@-mQ-#8;wxCQ4YFmr#NtB45+UBoCKM3!x;#AwooHs-UD!7`H!#q%uFWSyq3xiyr=m!b?Eb0+!M?`EMy z;~i=FoF!6}L5jf?QwT~daY}a=UXV_dS$nJ(MjC&pk@SC6)*{FV&HfX=FwwaMzG!r^_uLF-qS9H%a>7WFXbi)#qi*5sgl}FhMGkgWf z9!k81i%CS;5+ztF$~9pQQR0yB)cMjy3hnqi_uuk#46=+U5l)q7HkF9e$x6BomU9|G zqxE^L&@75Fmcjcv_?ny%G{d5W66!wl0)fsO=#b6XB0E^~#x_+3lvn8h3kQ-U*WlP; z#8E+cakBWO)LpbAJ%8(a{!W%Fxy;E4{t-!DJ<$(qHk4(;dHfUrWY1b zel<5Nmdr6g<^;jzR-)|YA$yQ4s#4flP^6ZO5Tt~Sn$q(UrMwmP7jwFP_WeW&kGyK0 z_nj%bTehiX2i_~M38D-I@IcuRWkZxxjexE@wA~@f#|~w22ZDv7lu}oO8?Evudgk^a z&?}WrmL%yr*rikDx`-0(YxXE!?)zb^R?iL$2!be?=mkNCY`@9H&#q=V@SvGNa5G>d zpbLVx!cs3Rbji*P3sp6$%7BupWYsdC0i^V2n0Rm>0^Fs1STA|>V`G75o}zyB9juMw zlx1}k7nVhohzd&P>>)jQ+`BM z8d#vrlEtcgMoEsPVH`!Zp_yr%A+iq;BGn?~yK`)oA5uMCf1!C@HEU<*Oq5nIZDqDm zl)sIOvZ80Yni1u%&J1gS((NTdl(GfE!W=;v&*$mD?+28`sj^%$>0q`Zc)cp+cQ2{R z*!lCl?F&5ymisurJv-51yv=rp^gE0R0u9e z^7hIS3>6KOuJYYbPKq+xlEhX(D=hWGf<)+q+|M;}WP+ccB5wJXHY7S=nBkSjNt|F*7S?V!+b( zU}HcZgMc!$0+6Ju8Ewr_gC0@prTT5yOd{+IvgoDZ=3Re*z_W}Jgp?yyDTvcEqKu2} zlx6HPbQ~`aGgd^wyvaiWepL?OYZmAg_Jk5yjt}Ik(fPGnSDJU_?bnd+(Il&!C2(r#S7DT8;~WgU zg+VBMcRm)1a!kz*MW85J9mgE<}}~|5s5?pu{X_M3$Jsnh)tmq6{e?-3zC)cb=;# zNz(Zj5M@J@&X6S7SkT8p3<@7V^$b8gN(;>QhWX{$Sq0^^D$&83D)ESnyH|TCm*`s~ zN_HB%FqBuCS}RR0p!||;NK;_Igjp9BGp83~rqg$2*~}AVLy|NkiOqlph1iT4S48k% z`e$Xl$YzlXwEj+DC^H>$inqXSI!%^UxdztfB~rV2b+ zND?JU(p1FR7dSf-o*bHi^sht-l4B^_x++&=s>BDh1p!`Bl*^n#5w2x~s+$tc*k}ed^hJrp6 z_tT<`il*13kR(ba=}>NMryg$AgE-^1APDL)mlmHta~rMy3(8GKxfWF(!T>ODF#kyh zbCwUOGlWO^@t6#rR+P1zQBjhlL)js0f)`0PBMB$>QQk+CABHFwK*^nYrcp{6s)$kw zrOtsM&k(N=J%AqS#-rR6J6O9)R29yT3+V=%XFBljB_Wlkq$ds8@&;^P=k{Q9zNCe~LQZzrP01>>S@ zf+)SOOhox_hw|x92s4qiXxmJ3hAJV-S41f@5Q=iiq!A=DR$)h!z@|*iHX^^o8@0k{ zKK2fyDmj`f%l#1LHBc%`k5XC2bRjMPcr(g|ZX&@>MEyj(sf>4(NoN;3XOhe)9~C7< zX~7R`$2%-|x4v`Xh^j1!QZo&x((X_f9TFv3%HIHzqDtNgdvO?y=F|NKI}VQKY;Cf3 zS3*gaL>YZ$CsMx@O%SC+Ns<92NRGAxdQA%1Y(kKdsRGJh7DE|Jb{-`r7yF>f zjaTIrP&$&(*_0}KF!5Ia<>6vD255y|wYeeo?0VV5iY%YR3GODPA@@1Km)R&xt8Xfc zYxN}=vLwo~C{sj|5oJ94!8yRHZ)n!6SPA{rSTl5ekl@4Wl5Ab)7c+$24NXdI%A;Uo1zCv5v3;? zQ7TEIymlxF6DWU`iZaMD_8bvq z$C4=Lq<>5ra5hmok`AT!lW~SJp&?lBY@#$@W{?z=AW4v57gb4;R3#3NGT;A<-v}s8 zdrKZP@;xcpO0W$adh6*&jOS!o9?z}oxcl}p1$f>9Wt3$ZC0UN41j~jjB1%uPjB@Pk z#%x0$y>IBB>F)INxOrA)xe~Hblt78td6fC~xAT%JjU^3!moyHcdC!J?WsS$V5xDIz zi{rU}m!e9Kl0B@T{DvKcfHK8L$T0;z&5+8w{I4cUqKq~o%A$&rB5CdLI#I4CHKM14@&$kc=pEU?Du9)GGgO6N;UoB*~t=_HMsZPgsGd zd%;-PQ!5bBv64Ni8cgs-sUM=TIp=sz&AiOa&fI(7NL)EQzSe}a0O)tOdVF#dxyt(YYvfga$B%_1X4rXN zb?Mp+yy{+~0-vK;tfmnL=p4ZFdws`!vfYchayUAjN0NN2pX;+33~ij7&m1dP9+9N0 z!y9D!@>FcKXKRV>fcb6~@0Zsz4Vdoj%7_7zx4O!jMWXPbLbT)1_{EH@8zB$Rjv>tnNYS~fdvm=^~Zem z6KEBNw_M&RA_ajdfPB=6$yS&HiN6WhsC}Gr`6mwW(P77kOe-P`jm-uh5#O6ozbe#b z4v3=?jYVWCQxNk){gG_G^g7}%3#*&vBMSu!(XE;9Nlc*uP*9y2S-iceSniU1EVF`<+M;+x4k`DSZ93QalUT? zzD@Fb2Gr?&3Z`rXD#ax>v=D^c5m_E?{B2rbihNHd;@LC39fWP6=MTy$xj2E=a{y*y z!ImMs9C3s2;eC+)ud`4SKT#%Jj?@n^CWH;uJxoXu=A-YIkj#%pLc43(#^|@jVs*sa z5oX}vKVF;-rtUSPUGCoU-Cay*(klBVqIlaOSV7 z%cB1cFbqogi;su<`5&?}-Fsdby>de@AZ!br#33n)s6Gn>?;gr4I$DoC;3^OedSV}| zpsEjYY4BWmlXdg!Wt0c=6=l=hY*Z3)THG_g|8BFUQ!x91q2QCdg#Ax1ZiJ+mP!bxz zQsX_Ut?iA=7oJoUCeR$S<`5O1sfSCIZ?e~2H2y9O^c*FgHt#?a;+PN@t zr9driigmFY9yYh$_3-vgB z+c0hvXUQ_IvAN*YTFHYbt-OC%;ES?T`PM5DGcL9kpkp=Pzn#(A_t-&ZxEbiwVL&mp zr(8z?uahm`eDvXS6~-)dN3k2{r@NZiyA`Up;HS+jlWL-Q>Vm%Dgm3)_{<{W+c}1Mi zFNGLA0A7`+|94&+;ye#rd{Zj)=ndD+6Wn(}#Fn`>HtzE+8rPUm4@BuOY-==Fi^1q= z;yrrK>If?g3zo3}-=SS~dQg!9FfuUIoG|zkQH4H*YgjO zMgN}y{|sMsDxzQdK6<&I3G|VYgDjw+@xd+|lS07zP8DGI-iiMY8VEVtnM?*cn8+TYw z8K>v*RT3u;TE0cgTW&34?Bha~oSS<8ovNst2t$xxAWuDWC?{w>XllYi9<;!Eikku# z0&KY1{N$WdmhxKIk`l8y;7 zb^f`Mus8+2`H~gI1>kh7VGWD9dFaWzRY?C~cw0)bhqwP@CHi(&N#Al2` z!<#U~6eS3DNH9c#Ky{S$!>`(&o7J5`yhnC7?Sg;5O)@d0k9$QSKa756mS#s6azh!6 z7Hf)^4uuH4tqNkHw9#v|at7Hd3WcM_FnxTd5$+T5PMjFt@<`PIhh78n8_FZW$S3HN z>zOvrT#zEF>&+ z_eEjkn+YLlMN$PH!3l%vpHqQO%J&aAMk8$?@8yjgOf(DVWpTWtYx{Jj4ynvb)!jcM z6NnuDt}4Tp6?7wUW_4$k0$~v0}$zN1BzAa3*l0XQg%`Q?}>a%&aS_Tn@=%vCH3Rloc=qP6( z7Y|pzeGAX|BC*<7aPk8Y#4?ZM>Y#;tQ!MGhO73Ap-z>5MindCQledq7qujDzqrx!u zlhK1=$LriR((sn5dZAm*c=pi>C>~+cDDUVq{$F%nPyU&g6kWHNWsITm=>}l^u9cNT zO{MO4ODhC&Z8s_Wm8mT;%g**!9g|aE@gqpUK<*;_qj5MlWeqvUv$_JMD(vylim_i4 za|p{ghajbo*1#+GW8{hN0(2X8g0yKoD)^~WHac*6z^)=A^aPINk_QeBw6m>5mKtC8 zBL#`I)AI>|vky^68FJ0Uc_tsLI4%zTM1T#!54@iQHL?wH>vs$iY)Im;GlUOERaG(nPgl!=E~SqZ+v2 z*H6n>XyBHAKjZjjb7%SeahS$r==tHxLOg<(ozT$Fj4u~=$;n=oRbo<*fIB>7i#!6b zz9Fk*YLiAS`i1>ET1y5ghn`p2oM_QPIaLXi7b5?Jk2!QWoH|^1rsKO78uI25dThf==BVgwbZwWKFi0w zMyG>DqMS7^k;nwNmv{5`UAOc$QAYSSb~=?RVxiXAdleB9h*la|C^2SPm$vdViF9BVH{De&@!{x9TW!!RLutED`0w!U8gF z^)Dn^=RZY4Ou7S_j7d`MyG4K+d>T$YELQOk}SXpca)i&8+(cyT{U`p zM2|a&#amsheP#|xwr=vJlDBkN3w+8+xIg>iYa5Ebcf6=yXCbrZ{LJ~EAWRy2+MfOy zjrhrA&Vd3DCjXsXz!kBYP9zG~yN!^fDVeXi+?8w3{Vj5|0>-E)SDy{faG!GHjH$ufFO7dQ5ZiU?$EK1cQfa5-$nrD{Vg z<`M#gv5nx0z1L{YC!NPH3hmEpx8P^8y0B<}ZDKG3cFi>z_eEz{;amp3wSGEE2+9?d ztcaI*7L8)T&f_cgw$6rv?x6PvlJ@aQNq;bB&WY&z+elehxvS->81Bk`>D)yA7VYjM z(tp#}GKwEf`l>_h1XXksIrXEAPHMiFh}=U(GgY-%MJ@MewQQ-q6oWPF<1<@&2!(A@ zNtt5y>i9?c_|4rnN`T_v#lR`jRFB#;krSfPTO)F7%lpkkRyvukeq)P+d$|(Yt+$-+ zYs}t`7k>4|D1?`wn<6{r$*)^dxvMatA^=IH5z6n zRF)UB7`5S54$+Y>7lUEeCy??VgXUnDr^AIj z)1#$4RiP9c(aP|%p!S!Qqa_n2MuquBC~W)9MSog@*DzQapDe3?s?O`?Xoblmo- z9mx4tFG2XVVcEs(5a=O2SE}LErmXx0IT1trTps_X{D_jCekwmVuyj{oF|1*P@~K4` z?#k1l+<5=^(_0cV8n1IQOn!Pq#w>Rdd0;WvIFa-8*I3@XA2O)5 zss4d^DM#a=&CdwSk{Z4^!Gz|(`Nzt>QWN;|Lj_JBdF{@ki-D^f_{Sss^BSu@%)4V9E|la2 zs?62KnMm33?N)E-8h3y^`H@4+Ao&;FM5`Fth7mcp(P|^)Ypc+~n@aPkEw>K+yWVF% z_mOzshC-2}oc98&=Hz(td?cu2tH|3Q1Q4FBaf}t!*lskI=7qrnF;uS%Otw8GcI>{c zDgKckuS-XfktWeFr#XNR4&s7@uD0j4E##sMi`H{JRC{LuftvGR1gFu@?8h?~ zLL9gSjO=UT+4-FFnlO7h-2my<7YCk27TTSc-}zC8H0C#bH?oFNYc=V(#_c6m|aaJ*+~ z1aWdmXLHU*hO}(G*Q#nqCoTGQxE+GSo&!uVLqhGeAS>KdQd2u8tJY3K7L>Q_ubvz>5d z78_X1$DdaSuX|uh2~I=ih-0JchCbo8U3f(A26t1sOj>1wlUI{E&3W%YF7P}8&KQUK ziK{g@zl?Q5w2fxYcM5q|Mhb^5QgwOXOQA8vjDfz9-xLgNX=%Hmy2?7tAYx&oyQNM zw;OJ?f12^#hdXmrOWGG0<~7lcuv%rdRsp?q;O*I>wF>`8xRA_sHwASCrbiBGExfBV z;1W#9to+Rqpkrep;5(WO^6Aq)wh4RxRh;qss0 ziGA}~E;amNq;@>3)i(S_OBo%C%({zcP*5ik3@Q@dwN9}xlS>2F1u2U<_NU69C{}P| zIgoQiz3Yy&KSt-iMl3KPFvqaW$IIu{OntB&$>b{ zQ&tQi5-Dbp?P>AIhU-@x-l`4Ax*rj0iWvX_In=HX^qk}GMFB$OVQFv98|8O?PgJz`298B|MYV=Tc7Asgl3+<@%l{i-ds-o2J@h?=k z#k?ChD>^DR;CZDT-|r=*S7IVu5W}Uji*Wf~UM|p%4w6*;ul48HL}K1702jh(DhpN1 z|EW5%GPn!XI8ZwKloZhSsZ+DQ$t>^DrwbAI?R19?O@KL!C-T7e&|z35)(mpHLG zlM^;cw=m1|=9rmLE6(vr8!?byz!dxRXr!0>#ND-|#eIz$z<-K-Re>ew4+-n1h>;V5 z5R44Md{jn72`3daSs7JwaT`HH;4K6Z90fk4m%Pp}5V%U|Rle6n)$qPDj3P571I@_T z0)skg4kPtC{MzRU2b8rnZ(r!Afq%rve|dVT}0f zww1CFt~=gfdvOr>CZ6^tA%e}s&8B_DFiFA)gvs)xy!b4ev~x6@9Z>a>L;ZeWI9EYs zu`K9pgjiLDw-X-ycdfA^qE2GOKx_e%C%Nc5Z0RBf^y_iGqthP9y{KRYuj`LERI2}Y zJ`sb>`R*2p)^jdgRmRnC!lOB09@L}0;14)|6yvs=y2ni?+L2zlJlTo_Zpg$y$_<=< zvZ@22^sgR^ZVAj5<1IJfFi|Inn5`Z|^48V8CrMs4EQb7dcm;h>evh;?ddA{l5UO7* ziOQmcTNV0b+3>Y$r!Y&~aRA3xnrNE_^QGWlG+tu|PeQ?x_AF6ot>pd*G?6*4Q)kYo zm;Lir1nOlqw1dMrOoEZ@|86?Iutj!6&MXR1tPLU#{i~#_N2))K3<;_{yF#|>A zFDB`}Y1{9a`_`2{jwmYd83RZvno)%eSq!e{H?1`pp9sb*aP$6=o;rTE0cR3+KHoY7 z()1oAsf`?1BJ@)Bx0#gTE*yZ+fHd&s8g5jKTlXAcPLYXzk2Jiw;y-LTZS_>kD$^2O zsTw09y#19fwbc@Yxs=BXZy7%*R*f)L{Pag#8J<~GKLq(yS0!W%R0Tp7Lm>DjpOF4N za5IuO>}pqx`${E>HMZ*aM*UXjq74&iu2m5c`7rcl^<8u(F*?1fvb%ZiE1v92O++py zLB{ip5;qv6<4Pk;dxvfZ&aFZ!!o)bhsvtc6=CW!Uku&cWLPu8a2N}|+GSZ1?EvKh; z3+$;_PU6_ebdUm`LSehjJIGAt80NfJi;M5$@}Km``=s-~<8c1cBn$DnZ=E0Jhm6wS zav(f*jUQ2bmpQvzuvh=$b_(GeP$mb)ni8Eq#l9#G|Bu#2JG?))-GJoy!IZ^b@y98I zw-SE_a)UDOt$5ymsFdm!NVU5G8HAy;a*m6*Rt3_@C>Cd|tIUqu z;)d+8LLSz;PODm`nHV}ef_NeR)3+~h@^aa3+LQFYZm8a&JJNyXMSv{*Ca*&{J+c`% zB5u}eb1*%UMu@xxzHs86y_Z0wGGw?;KRQ{TAffBbx1aX(Csav#1%!Z?zJ}s(s+1|J zR?(tUW+4qr;JT*DN~K*}cIkHq|GZpXF7V5)HEj#u4wd&e?lle3h3CPjuZQO@t7n?s zCBFVk28{8Z%uK2%7$saIcXw0ZcuoEQ^`H=E)O@jkWZ z$d5A>xAOxahAKEivO&QTZiuy)jw}im-x>;r_sFx^dGoy_Dz&0a?*R9ypS!YQA7}KA zrvSEwQ~sVZkUyBm0|7BfoZVX6dyeT|Dd_0uOvD5*((OoYa$es?Etru18iC8A2$fViK2YWK1FgF)$~T_iO-#ZQLAZg zPeD0`JarNUI55U^{2Qul@K(|tJZ9=|>>$0jy!N*6J`Jvbs!P@Xn{nDzg114d+FSwt zz3%m#CgPb2PxY6WaimUkwY|2}sLS-7QCP7v$LF*Iq-^^z6HJFXi5Q}FI|h|@-G?kF zP#PWpN`(I{loT5Ngs-f9iO-L86MXOS-tfh}3soE{nfu+D0RUsLBm)P&{4O5|pG_J^ z{wJT%T72Z;Kx^uz&uAxHP%&ow^;sHcxL`7~JLDgE z!2DL~zS+nGHACk`T<-Y8KN-?sQ|*n_n8KR8Z z=)LfA4Xf4!y1#dL0IVkU^sK1&>&b2jHb?)ykz6JSrKrwP_08acT%W(pqfWpn6M-2h z;wBhpKw!Eq0E03- zbUXHW-S|gFrF+u}asvibm^EEq!-;buCJOE>n316_F%p`Tb-VNb`p=v>Vx0%a4YCdE zrz2PCbLR^l>H8G9Rt9e!i3xvKo7Fbv~k#&)|x?N21T?3(sHJ6<@5D6;ZXHwD1a zOycYIdAYkg>ZvL7n_JzQ8MN;(W;?FL9Oyni6nvf6>-{j0TwQMY^9 z5%UyynqJ0V(Vf=Gh*D=FSH_Xd+-i)9!e6wAuf7o5LIyST-EZuupfI8{RVa#QmYgF8 zH5VL@8?PI&j6DxDD;$3P{dek{a=L7RE{xf`t{wP&uvI3$Skhh$JY@mOD$Mcpfhi|u z%0_J3uG?yuORacc8dDu%vfk zlF9n{(B9hYsWDI>)FQ#1tW_*Kkrzjj*6?$pgKPrklO~i>BPPJ;@28Q|b9TIrTS#Md z=9hCcICC`J^y6HN2cjZWXJyVnkW5B93pE@0t7?{`>B?ud3bx8AK25As#9i zKnbxLDE*{&iyJ2Y6*icIt=Z-?4%I}gPiDN5j4~q zO&1G|P30F4OA^(4EfhBtBsicTZ<>da6I0W$!*JVDC|lc3Y^aGdQWu8PXGlbHO^gQ5SKO~`8UulKpo@<9u+XVr??g~K%P zWT1iux6-lETV0UWOo?lKaR-^%gFL^-uL;%p(N@auZ`K{!P;RIEcLFKBfK>$h*5~3S zHu8HM*x};P^Xq*;>ETlstmLzood8e!OPBmN{{)oQuAue8i?wQ91m9}c>n+qNZL{KJ zxu%XNp`%ZPNi(uc;_#Tl5J@Xuccc6cE#lu`e(+0Cxyk4K9=z`;&AzzV%us;9H;rNGC{vhGa}tO>y*qQoos zzzBq9$3Hgiw@;K!1-iHii(Tqtbf0^ZyX1T!`E2YKId)=svRJzg_D+)r*^j(rigkEc z_w0JPQKF!$Sl=GM`uCmB)#`+qp&(H(m+Fs&b_WhYd@5W}X*TnvoB7(^$09>Zb`^t> zPUxSk)e@omC}-NMGGsIK)mwYl?P?pep>y||Igh_VrVj2^Rh{+ zw%hR8*TvlZSH69SJj3?6p}ji9crMBoW{U@TosO?A=W0-6@|eCd<4EoVbQiM5cY!W4 z!jI3l>%El8%l&W-S6-g9Ju`x$B79)#X#ZY z0S`;KaN>-EU=WKC%N=rsn1bv(-T$86FEf4S$4Q415TbNZOVzXtwLE@c549$JZUJ$q zl-9Avj3)4E)L>s8V074T0F0_ZkzL%eCt8Bg~?7v z$jH_6zXea$jRrk*8|Q;)^SewvZj5SqO8Vy9^1UpSdW1%pu|I|3;PF+FGYJFgw%ZH@)(FWIwV}r;Rd9^ZpCZxJkVJAkc%5XM#7`#-{6|c@i@2%p7T_ z!9mu}Pn5amq94eE_v36p%^upPi4j+V8!1B*5s67F43Fof$Aa`IN4l%i^Rvc{u0lNv z2m0t0IwZE^9DzO~AeRp?zfe_8oaaJ>TObNT^ zqS4=PoE#(suyDPn1s|JQ&iI0&pO6kbR{YSch?Hh$e{Cw_1=qLUOS@o26HMf)N+Y?dH;1s|l z%g@}+(cA*r2mZ;eX1ZqMlv{fQJV0?%a~&>VI-i7TwW$xGSGBlcAg3sSiYy7p|bsYTkG zV8^Z5iJ4u@odnPKtwK8{8iGEX%XuZf2bqR&trPMHG-QL3QN(CyM~|8scjvv>Ogrv~ zLHMQmRBkXu<=+|zQIL7{Q>2ZIK=%EF`RG|UOwM%9`~a3AI{I_qi~gvb@Odg39thuw zh!|8Ehd>i99TI&vJTC2xPE;7FJ(Aqy??P_(dfx+ z_UDV_jED<04iDp(uRT2y=bmM^h^Q_$-b_!}Q;scxA~0Uue4 z(7r*j`zQK8t=_}}uX1mI@1%tiC!*Vt27m8B!@lTf@n7eRS)079pIYKFM z>$U86e$~A9hn(4FDJFm3ayP%JE;lpQrvV+g&1B<=DYp6jYk_^jM zv>Yoa3@C4DmfdMr6<({Y3R@LPuqIMi5z4~KLw=tvvXWx64g}Xuhnz7W!&Xh?oDZ)qhN9g?Np z%C|O^w!NEc^(4LdTk2n<@CP59!c&o{DQQfQ_gAs(CijZ-nkQ4%w0>w>mOhNQ21X__ z3;WC9VgS=x;I6Zh62gt19%Pppg5Y*bfCK^?n@jl^c=pPK2EeLriLzZlaei9cg5ax+ zx!vTpOXlcun%%)8*Kb1X&d<|3$#I%rY}vKWg`mnPpdWn@?SdhW}1f9OV zYs3!&^Qj=Vca}OE+T`hKEMJIRLi`;klE zJi~e$;FgBva-GY7wOm${XHNpOl-<{qaqSe?7cJ??Og-z`7rj!56V>(l6ugf_pHwvQ zdJ{bA{hvEb7`i_8-p{8o!aXMUkn1m^KZW07b2)$Tc2(O{@lRfLGSL|PWky2C@9!s! z9oWhm>79OPrK0^{DKlaY-un=P7oP}`jT=8Mso7S$k3D-bvf(XbQPiFQJ=aTEI;!Es z@)wjxaMD~m%P*Ld1PyJZ-$61b5U~tB%s}(}IQ?}-)Lo}M1pOf-A1NDFe~$(E{cfqt zw4hHrhMILW*wjmXHU$%9>s#|C(H_&i<}HWY5XUjbK6h=^xl*;CiK0eXLE1HT3*uWjBdGPs;ih2$R0XAluIp&B}1$FNU(e z$$65;lntmSw8SJ+nCXSC(bIyRqUl!YCe0b-d)g(S(PYjmS*WsSJOu9C@k+@p-)yk0 z<8da@{VGI3o*#}LL$1!MMHG7RN@Efg!C^HxsI7!jr&O-sC2b6QYfS!jt}623*suo) zLLrlf$eJ#EiA}u-Y7xefca?p7r33povFdY66t`4;1_!qyfiD(3kXCxg7nTuP zZGtk7ijh%dkhkvJxgJ-9y#Y}fOoZNs^g$XYT)C)xjIzl5yJh+VzI2_JNK>(QN?g0Z zRBlah*zFs?->O?Z1?M`NRvB<68qObdl|+_Jw`6OY|8P>~wj%F;LJCIZAqFTp427Dz z-2gF6X$7mT_W3{|JaB>mH26|T`AZg#7RKp$mFz0ien?_CK@?oyz3gR-?hJ4O6;hZ( z-E%855S?_`7ioJ<*9?PlbLJ1_NM2>~;Al)~b<`zk;Q{?YEqKLxufj=I2_b(dTI~M@ z8ybzTISZZOGD4hCf>$1!=f$;x3~JQ8?yKsp){$j^kiQh>s6F*X9Z_lJI4*+&aK47K zI=t&g$*(V@(veUOsl+2=m4?uuCg(HWirk{VmU;vJ&iAd^q$gVD8oe_UqP6 ztA@KM&Q$cUgwcWU+r;n!9afSRRU!}9L)WvHXB|9oe*{_++ z%?W2->0NngUqh<&`y7u#DOUJT(qBj686^e}ZuA2A9^OhH5?Uo{JW zhkdqzr=lgLz`vET%#uler=nB`9tm6Pz|eXy^^bap=ZzeuHLO^&gLncHaQiCcU5qdi z_caoL`{=n>3Ul~f7ak(}yVk-(AYs^-TNBZeDfo%K46e#(S;2zJF~je`N6A~0ZXbA2 zw-7X=jJN*IjLD{?nq(?b1S`P90&e0Mo6qIh+%Z2N@j$o~5uBlHm8&<~4Ztk*-!obZ ztA*VM5??<`-c)Urk8{t&4bTd>hu#CsYR{j4Qnl~H`kr`+ChmO*G?!ETssn3w{kI7? zOE`p+;#64*Q3nJEo830PJ6UJ6KtK;*k56tr;Bx472qhQ-=OVbSvX_0UrOj>0;VhM0 zO(C)(>R6YwJ_gG~=!C7!4dW$vkm$#;%)#ZCL%(?1kKp;8SUbmf;)`(_;=;qmd#3db zgOXjvuGA>OG?y;;=ET0(^?Ce^^n*c#>q@*KZr`ODx!yOKPxn>89nKGC{B*yZ%v+ z?uI^yPWwVgHZi=3jDD)+v`6+SC%eD5^&ND9uC%zObmoMva~=O4 zc4%VD<-g5EWROYDV?s|da~TZ~2+(h|`7ay%L3^)r0ZXGVH9W3dF)%N_A*IRSo7$|5 zi`1Y859Dx27?8*#u_Mw^DR(Qbgv(S$c)M*YW>5m8#zs5fTO!e&~9?2t} zUV#A%#CPG3^UDP~sYVceml_|MIjwVguw?EE@%GR)@Szx7zT7qNt>qMG^!khv-ZW8} zV@aw6>6_ok5i>lwi$+&kP0=?1u~eA(Sa(O>b47~R?n`HkN4 zKZEKSeqZ*tuYSj*lD|C4XN z{D=H5yo6i~yJjf+C7bpF>h=2Z_N}C~wNIpzuk!sA;nFYPpRRsvD-ZE-@;j&qJWpq3 zx&0rVZaQ(JPv`u!q_w9fP>+e>z&DUA?bE5WVx;>JghS@(`?s0h3j1U3{7Ts(oa??IF#LJDTN zqJY7!a(4TBv(LpYa0AJkf^XGRr@FZvsD~g9K-fb@7O0g{f>NTpp9{&jWFdZzBJw7$ z43HFOHJ+gDs%BG)|3<%NQ9!8VokXV)TXocHLIpE@z|*`_)4-h{OLimk|K#99y6^2k zhL%FD+QFQwZ{zn7Hq>DLWVznkmmd=az$aQor%FG6BP?zbUelq@2bVwP&DmKen`GUh zwFPu%Si?ox)IneRAxXX0d(drOj9$MqI=fagz6r|fYr5%dplCjt?L{pt6Q z)M3Pp$b;27D9jjmcPiy|m0fi9%`Z{GkfD{u2U|)l-YCOz*CFGUa5{*Ug}M>96!PZe zRTC>tZP{e>sDWz9AkAB2XVV>kkD8im3ZBhf(a>}^Nz3!Aiq5t$Z-J-2a+~h?2Z6vs z(vhU)dsb0Ys1ac;jG5u;@&hV}L_Sk~oU5>lH#L{hmp-KQb#O-d8$2-+vq>v8x76>y zN9upw0z41v3KNJfhaC}MY*nmDuyQ_Y*^j3@IBXVix?=fDt|<`Mu!+I=Jey7*&#BD% z(fe@}Wfc>2ALJ8{9I`HKxU732%SYJnk46^VUM0g#lx0@U+%7jG({Tp#gs22KHma?B zwjh|;3E7pr@AeW(yt#=lC2}t>oQqfpb3-&)Z(ZtAXdD#j8jJ7fG0Dv`gR{ATpqg^q zMlugh0;!T`3%KhjR=yU7i$-BNli)tLwkn2e%j+dyD+?_$ag(+OiS@WJr$Vm|qx!Hy z;P2L<*kyz-|4GO)u@j4EDzB0XHrT&NH!c@8V&Uh|^&B+$d4-~fuib*^J(&As$l-nA zNt`M;Cxh$C!lwXCv%1@FFu!ONxTVJ)ydypkgcmsHc7zZ&?Zn=&&w!=?pJJA9{7E_# zu?>Qr*u-`3( z5bJw_aI|FB<1T$fEJQ&s@EaFUqLgvlAcf~f1s$}ZfsE4<&@IZjVvoh8$zMC<#YKs>WlKn%&O^d4yl2Qr}I zJ*(t=;~kC_nx-IjwA}{Z_2jQx6UP_<=Zfwo{FsVzXC4K-d?1k-vUPVenrr;kt@*7o z3Q*Mf2p|~=c_si~G|60=awl7Z*|S1m#+A!j1`X`{n(>&hTp1Ah({q07Ag{rK7e0*k ze-3oa3!ac!+C=g1QL;#n9=|7Xb;^t?X~BWK-+_NF&y~|Q0zq>|2<#eCMNC6<dh% zoVW?}%RaTqFK~__b%&F`YSQ4?mV4xv6XJ+nICE=Ko8KboDoXJR8Yt;LEuS5hN&D+E z{d4{X1FH0kIoQRH8|dUn$|i?*nq<>qj_Rfi8ipCx*tW~jtCqT+zS|^@sGcZJ%KhWA zBIbyAfA>uok;E3y+{pirk)V*wj0Q*ou^bAo{46Ydwa2dDp0c9Y^sTiA88ubkAhY~J zc5xr52-@YF>qpm!M355GX{%{&x~`msyUK_BZa%Tj@u+XO>_I*LlElv8Qs;rhCmq^|+R20~hex_F z!2wE$t_3qh7=cDD-c7$Dh}gltE)|a7KQZ+eyi z{MbA2ojJr!dX{xl)fPHTcOv2^!Q|4IH*JX8|LgvMJz)!}qnBdcnZzt}7d*@TLoheL zMO!WjUnBrqllVwbSPa=F02*PIuV7gevOX5i{Dp(3&iOxZZ)2I8ACF5T*WDOz83sQ2 znmMckUVth+bhvU6^}bSFfU6S?v}dPN-ya^+^5nSF-|MI7qs)b6Lwr}_VK%;w^G}hj z|BSV?)b+qX8K6`V;(WaM;@%3Dk=VMvvoj<1A5M zOb8Jn_#IZRrp3_StsGm-@8hWI8*cmQP&viKriaJ2$KN7`D2B|tUw2F_(6UZID3B2x zF-MDaydfQ*$}5^ocAve>d6Y#uUp!q)9eit=g|Ax!A2R8sJX_zOAJ{o4&#|`Er}hNi z5;<7)YPT%WM~GQ6loY~^5*2m-=d%55V`y4G)&z;r(D)mE{g%Qv4Y-QSDZe7M(m946am}t6g0I0Im&A`>TZs87wyi; zG!0BF*rIW6@*X=18=9*RJX7@W{>T3If{Ym;p>bAgE9l(z6^h?-y$cfbHUgjgGg-A> z9IatYd;6?>W=GDRa8Sngfa>2Ma-|}lC9|`>ZCq>nNT|Vq!NR{So6765+>vLr_-e#q z`Z$dsM;>sCj6gF`edbOXXlc}i+dFj8z{%;=m)1Jx3asP~?8w_&XPT5*Y=QO$Kr>&=1&Nm+f{DWI%Py!0;F!10b+l9G;xCsN;aBr-HvDGU$O^F(ma_FDWy={$cmW zB6*IU@ECkNqSWp}5GPzOQMt|xj(@}D*UxT}3h4|aekUFGX8*2UiO$G`2`O^cx2wR_ z`-YIx?x(fF0_3iq z{2|v0bzG_}SoC=M8mDau@}K^>-q(cvNK2E)BMDg@%xEM@XNbcb+97X2$H{jZS^oMi zn}f2U1l(~XZJ|Aqw%HCr`iG{&1kfJHehs6R+N%GG%C2$Fq2bBDBDRXp>5`wT ztZ-}Yn$?M=ZidRpK#2gGGhZtJa=I*-2y>k~E+0_PX%PVDBIUr_=6MHt8 zxm!)DI4w`U;i1Xh3`vf2I1i2jJm)49t%v%?U4hssbD?~%p`1ZGb+}Ah*e8==S)ul? z&L`Kf;jO&?z=tzPoVW3ocj;z?I<#OIfouKM$-Fe90Z2J<5V{i3M%vU1W0W&VKKV;~ z#~bfHPpCh48-bLMWmwY`Y55v_cwzA|M0_$zm>_Xa3{xcow)()gJ9J||fP1)56?oTZz(|L0 z_wQEZ&A;l@J}{l$LSXGd_9ZQv%TU~{JuEp<*6-x8`*k=)JMoe`ND7c*PI>blpgUiEzz6eEEL?SOcg0PDj}&O1N?= zO0Vv3B6j;I%I5NI&25&ds`cB~Zj{MF88>?P;I>g-<@OF``9_(6vbhtnb0ri% z7XQCktBkhbct4PJNkJKO`~2QcHD8~mEI&ZW#q;++ErrChmUROtFY4_i zm{Q7DE|KI`Ndo1{bwDZWVvAhu%Gc{ob)}uKJxZ8z4oc{j*cQ3gmGgD&@sBQOmeiRi zkgp2LsN0d-k}jsHSGv+aaRX&dZe@}O%JGCH{FNU^SaENw6!NtQTO{Om2-^=l*_HDr zd4G%yp=@t|_BT0+NMCUoWij3ELFw%6_TJOSo(bpRS0y)4F5;bR0!rdqxSB6Qd^{?1 zDdxE5+2Y<@@YO>lcGxc%dlza#iZc}EkD z+T9W+N4{Dpi3=oM!pq`Vaql?g7cMh|_Z=(lXqM#Z?hqy^U)2>yzUnBw!qy&nA<6>b zsNHvEmUqoP_H0b>PPkQqq>Ym1?GaXXpo}DUyt~8h_Si5o8zW)AnmfZ)g<%*9=UE2q z!resKoZ#O7!DJ1Xl4xUg>S}-Kpi%lY=bQ?gGz>ibc>}hRLEI|wJ%YD;2&HXzJaaE% z!WGVCb2?(5UZc$JrDr-kC40GUV{&A$kb2so^uO`}DDAJ@m4)O=!&E>y8kA|I_qQ~% z2ODq8>!cpH-Erl%DDmC5_arOFH0Lthl!A&8A5|3&&&*Mk4ZpcuQM%ihUO#Cm6)Zl!97i%1W)C2T8D&4-n zJ19d74xsd;guJF?l%!FfHA?<0o+#Fxl@6e6DBbb>2cZ-j#Z8OtB-O~C=V+AqbTvxA+vk{^beYq TAVo;l00000NkvXXu0mjf84l0Z diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Magnetism.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Magnetism.png deleted file mode 100644 index 1c864edce4ba3a37c09275bd482546f57b1d8f3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74168 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⋚f_(&O&`d5QUO8gnWZV;AI9vL|99)-j?#7*2=? zKZgP$Cc;@Aq1TwR{d+9Yg$BuZ>;-)4Ua&`q5)ROLgLCl1D#X;$tkzerTe1cw7sGg&Fo5G$ z;Yr@BR;PHx6lJAo?x=IzlX%yN+2tq_G#XH9wrsOmbgFxq1*}2K9!(dT5g4~V3UAh zUSgr(A?H`TJ;6fA7DVJ(N42r(%`oOt0^&9T9%5ERJJy4~uhIC`X(?x)sR&AI0A~Ro zp75{U0!r7ivQ2Ib_W%WR4fE-K2+LzTamfKYjv-+3@S0qe_5CaR*%vR6Ov-1`ykE3+7MevU+z3ls!66>&$B>k&~GUlXMlu!H<0K0LBdE z6J5%#g6RaI)I<_uT13QT(37D7Pll$Ep+02h3ZAExz@i!Ny+qH0>`)UeECaJp#2*te z0WpTT8uJ-37Rg5fy&frg%Fs1YdHkAI=|ZxCsUtJh+H5OW-8G6fgXmen8RlCep$4HC&%zIPSep0!ykYAlP2fmSTY-ScWXfR z^yBkpEJnC}LI}WZs>4oeVD@V!GgY`8qH|o|X;Qq4HfF-?pJZZbcDE#HQJKmNf9gBu z8ak@MqN;S<(9U}O`uYl?Z6C6NO5`<`ZO0AUZajzURF-Z?QYl@lS?It!ShV3q+f~+N zNK)@jY=i;ims?3 zPna@291FRmzR>3EL{R6Gam-|hW*~(V>0JJ#5PCQ}@h1ZDf=3LX=ultSC)g!~W$KQw zBpl!+m(iHNP9JksWXu=!Q~}aV{lnj`uNjigH_8~mml~$iuL9)UoQTZjCHj#qf?2rO zUw`r9Ykr`QxU}|LeF}D*gIxy7YF0B#^AD{_g$qGJg2^N`VPXEv>D&G}T`ft5C`}2` zajDGZNG_cB={sy~Nh%D$2|zO%!Kfg?i<)T4qDt;%c9AUe!ATvk`N|-uxS*dVVmh=%k@F?a_(6v{wwnQusEFC|UK7gZPb{$@^ z?%E=nsLac^7g3zd!Df@A5~M2>`pmF{XS7czMI8+J_h36&GuysSKIYfB5g*>=!(ahf zklf1$y{44~hueGRLd2*8Ro%2z#Q7n?mT#L6Sr3pDshyNbT>tM-5TG__O|H;i>uTo2^Nn30u zw$%7{MaM-$@5>v}e!IT9xtafZrls1a{Wiaj?Kf{j_5kw(tVmc^ew4fq^RU>(HA-U@ zC2YFvIerU}wA^N$i!F$Z?fB5-VI-mefltRgq(wv7PlP4Fh{!pS7{U^wf~i4|2)Zi) ztl&g8AS-y52!~?+_KBIugzA%m`{bk(*hD6?WFv1XR}zEUEqrPRs8p-MV$C#6>2TJ@eπf`4?W+Q+wN4UR|TNhmf7sF=2-JG)?5|7;{J(c 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/PhantomHands.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/PhantomHands.png deleted file mode 100644 index 2044d3e403bf67d3a0eb788ff39f274188384743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90184 zcmV(*K;FNJP)94{;^RZ>!1FA-W-S3^HP zqH7pG&NFBP&*a2jAtA$KOLxdEHWx2Q%+8y za3*10UMdv`9t&N3Tp%_Nu~{q;H5&_EF&2$tCKVGA7zs*}YAqoPXl!a~LNF0iIu$G+ z977@yD-MTG4HPF0dTb9FDI`2+Nf;j+FLqBEKPoC`V`DckPk~@Ab#!z)9i*L|oyp0` zRBkg>Z!}YEGg50ZPG&Gxa5YV3FHvbRR&g~?XE0ZCHdu2uP-rnsV=qo+FiK%AS#&pB zb~s#lI9hc#Uwk@VdO1m7El6H0V17GCT`WjlEMb2!pfb5sJzL@E?zl%%5ll)r36=-v9FfGhdLkz&g;GjN zTw|o3T#b>Y{$%f*)1d4z;mOe>mU(uixc=lGYl>J}EFzj(EJCu!NL_K4SS%LNSn5O5 zbrlikoFL{sjVt2f9QF7eqg&S^GFxn^JP?Pg*`HiA5(&&nW2A(4Moba{xG;1u9R%Va)Y;j?h)Z>(Dy2nI> z^b-%Lya<-rJFPt>Tl^NUt9V}!OTBjjoY3${xaR@vU z1=r)}Gvtgl{lr96N_jq?pBU%*6c=Xt#3Hz$@g|5FF{QMM&?&}x?6K4XDLt+i*eo(U zan#Hy5%Xt_i^wM?ViBc>I2>c5gabUr=W=q5opV->_x=;}IexuD&c4RUIn+b!y}VxB zW1_Tb%wD9$3Gu9P2rFXt-k)O;;XUU1jCn`yO{DXGSZ_v8D-bC3J+_4sz!8mE6% z4boZvKF6ydcZzGyEI-5|EH#f&q!f$ib1Y@=rs*8J7WXb&uJPmAWfOm5?+-EeHoM2- zEIxE4>0L?g&Fa*C=^mdOE#ls2XK0V>we05=;XSsabImU%#N`@Wjn-jL&JbOXAtg!aE#h+4=pKjQNs9Lrj_p)5mKrnX zW88bPxL|7Gv_5W{Cg1|s=r#3bT~%q|3W z5n3tjCCu&VJwC~Z@5fvcpOxVr$Ea~w7K!E^l4~AgB%)%JklpJS^~U+Lx3XHz<~-*SwZ(X6ds z$+=|WczMn~1WG9~uXxk0OSYsfo@c}%*wYoB3&i78$z3GEJ+3w~@A>Oh zV+cle4vSE`p5-BgkBBR$PdtWD4snd}^?K#g(>+m$k*xV@ZasOPSIt+EALCVH&i>kz zy;$D5FWN7+K8u*naR|Ymp6>bBnm)bB^44fCu^i)DUmm(b?IvOhMRYMMyxN@O;!xd1 zkmEfs_5H3F^HD~+jTFRZ?a;X8!8v6pq?8($8u#3nQsdH^FEhs&OV80x&++}~-p87^ zUM;6)?VOi$vtBQG-{hX#a^FAy+RBihTbcW*m-PmWeWm%+Z(ilfWn15K+4Ek;KbI%> z@=iG(wzqHJZ??IQ(K@&t>?y|6xj)@KuXzYHernmVc3H>Ye-d{9Hxe zt9y&(u#0&mxo{d;b0ITOu`?THWVdR;SJw$P#Ntmha){HdL3cN4rLjyjs4+{GpKgY8A+R>UpO=iJm~T+S}CjBu1;YCBJv~x+$(P({&5|;_Du|ZKCh_&kgOC5C6rq zF8O@`ax5XZA96k#iubG5aL?D(^1IR86$R=NB9Tc4fXRsWT=VaHp7YQ7=Y4$5_qObP z2|H-&W4i>=dY98--1+jwKR$SGCf0ehsd~W0N?{hTl(@eh)^?%O$RKNGM z`>y-r~Jh6;Ym)AK3LjW$wX)@TeN zee!(BGxGDS!BYq}CipGy4c;0*-^UHeOUp5DxJ~;*%b9x~TD!Zo!QsDJ%Wv9pkvM=p zL=pL+-jMxo;&RIWt-098b~JSv1|b@^jh3b5bIk`L+O};Npm+A;M5N`aDVm1{>P&$Y z8@T0t*idS&iZI@X5WQnB%ReXww!L-dXJ@B4J*G!M4Cu$F&RvVYPRyMK{? z_nA{!zl%#yVJW5PpC}i3v0PndHy33W;Jr81DM!`O7kF+3=3G@r3rQCT0vJO|03vQ2&1u-a_kRVK=3joX0_*-=BNhY04Mb_X^**^U z59;82qhaWirzSI}kyJ7eyqqk}!0-B&KY#&#@|ZUVj zw=X#Zxq(|Dp=PzPNL#(edK z?gd?gx-e+k!O?dbXd*Q9In~{AQrDmQn2$EoZSQJz_k!}Lpa}&{c5V)pYDC^|ZA8;S z6Plyw2s0bd@0B*xSwy}SXtb`Y{%NYyKz=*|9OweR`QtzjXW%430Q(%18))snfvAt~ z@9!g+dz*jp4w@Joh2iQ)@rMye7o-mQEeHbx{`{r~_;NO9Q^j(ZO|Y zcGUa7fx>qSDrY_VXALp~xQLU0bO7I(Pl5z8G_k#|G!Yp{-2u;YEq5Py;n;q+z+Ptq zq9IP1fmTij&4Aig52S$*LN^_Nra%oSp`#l~fCIIcbU8Bcv7-j?Gu>UA8gM@=Lj&iV zHy3Ac7iYK+M}83`5INn#8Jh3f@JiYR(DVnu$bGEU9IzMT@2=;McG!#QW<(^V1Op(; zvRau$O?2GLz-nbyVC41EG7TUyV&G+NQ?NeOYVEWspw$90hEpwgNvj3c zc$C0(MJE}JD6rdXM6@|{C3P44DYMkB|8&}d}vem+QW zyM1Sif4HxAzOh%2Ycz87AAeE6J|Htt8lhU`L*=LuA!1bDh=DQ+h(_pMn{J?BCyg*` zq+r#nP{j$vCdzCi#;8P>+Q4YU@qa_Ze*%Muo>hs9XpQ4aJ-#ZC7pC>q(>`WSNpq?2Z+gG zC2RyGUbImSnZCZhvOTQE;(a5Oa||JeofNO26THU!urxdRBHAZMJHgt6m{9%dO-G`j z7~v*PAg8g?)hO=fbajoJQ$=&Cu1-T+_%=&B&dmB^#M(|y2BdW9f-tdP!XXyhu5 zL<)AB3Y8RmW;#J3VJ8K|dj)WXYy@8njl{S*CvGR*r$FLSo0djkM;DDUkyS?Y5gqg*)p;7ZID#kddKj@p;Df z(~zwV(~id6B@^U{%6+TPNULJ$%6O4UXG9|y$Ys>FVv|wHgjvZ>WSUlH@1v6JrYWmW zI}mZxc%ad%Nf|*4*699|n!H5&4i^ zC3j&=My!bSSl;fEAgHeqYGmUNkx3C9HFK*1Iy#V%gp?4Ya`>b#ATs8O8Dwi@nCnMX zO;;>qu0pkKqn0a9yb=6w&J7@AiHCB`@9s_^^<^_eiACE#8Aw~ zshw~BNm@VWklD?SSV`nDQ~?!QfifpI6N?g>LeN+rSyA0^&qN|V#%ap*QP7xj-bHiq zYnetd4T~yUxuPapKs#|p0xdve^DrPYG$1oH@rIgI^>0kn4RV=m0U5dKNQo6WrP6Ni z4WHHa$JJ)a+@`-p+NRAY_z%Eu4DN%_OwIoMtN=lk%)@2l2K(2}%bJs9MPF7;7NP^-u zuDgecC;~Z5@2q)Io9h7?af)`;G}Pu-ZL-y7UWT6LTc6n;36S((aB8a3$9_X!>o%0^ zh8T&8 zR75E$3c)i{!vUE>Q@H6Wr8^tUw;fiDOpe%uRt}{r197a7t$PLDL!u$V4pU z{Lw9uDMow>c9d;?W%dR~D@Bow{B|UU+RzKggv<18q=q0DKxQOOV~Qcohl7+ZSn2D4 zv$-b_12y+-+FdF_HZ~-NaQK!@TC;hn)f}6B0^xM*X!S&9pV`&pcTGPhPppVXm}#Eo zq7@Vz#B-do1Rs}W;-D?|QHw4qDVnC7Lj(%p@y<#FC^&vjTM&*Vs{hdR*iZfDxQbYS zXDS*6?_g*n1|oup0hy!8#nE67*I8g2`SoES8QL0>hPX}2t^+aJZ3Vhgk?d%gk5byy zb8M5(!KAw*G1RPd+M22B6T6mLVZ5!;`z$~sw0i?0MFjiYy)^fl4GkDwOc2umF{SO# zALc5ih6D)xoI*uXv@m69^^#;AACovm+na-wzy6y3Y~u)&6p1(o^yUJz0VU1+4C@Mk zw)e=<|9L;2io6r&6*(Y&yeDi}6it&NGqEOV@giyX^UIK04JmTdWKL3+iZbq^Dta7l zmM)6Ef$aXONl8QBmtk2S2o6}~kCZ<8;M2N0vq~xR9hsH(q3ASq=?1!LX>HK=l1J%Y z8Wfp*eohpz_wztNE@KD+`~BMc}0jFLfyad72an0j)6-XP#Xm7NAGwDExPI)`i9#W+`g}EAq*Nb|RJqpUFuPt;{ig&^XcpRDgK( zidL7T3S3qc58fINZWsDZ2j9dM)&q2PT58CY#cbv@Ni!4`4Sh^}T>aWpsSQ5+>W{mN z->0R%82ZuEQI#PStVs5PaV{LW{amCZIVl=B+C6wj2^W7wM5(S2)E3C4RH9b_%!zqU z1P6-4y7)OJPIL6Ul$;XBlpKq5gI|1!krP!#%Go&}M^sM+5EB7WAQ!zNA!tG@Fejnt zBvqkZy&{GT;O7IGww?@bUB$ewfK?P^pCCq{)s)aih`Bkfa}||RQJa^!*YSSs<%X>? zt#3U~iQAZ%u4~^^mK2FZyUtBzo3Ne*9`)i>te<+tc@(wwdc9XBLRc7*TCXyQ%o_1! z7#$U?yRtPYqwFAQMTQ|dhO=g@VM>e-iZbZzhE*v=uv+YZ=P|kGD<;{tIIu4=W(6(@ zR5GdRzM#5m{lMhR?8p&Z7b^Bj5ZZO|U{z>GnnH4wVVbl?!48QzfQ`Y7)~1dgwrdJ! z4%h5%TG#4uA%EtMBFcc2G2>IIOl*iKX0Fbrh-)*N(4cm#>a?U2qdSg!c}G_ zUK#w;UHlykCD~u;BJhlm^$1c$c4L0QUOqEpIcTaMxbJUV3AH;zS;3$PP}cOFl;u2+ z4$jIGvC8LrE{Z(ZOD$^3eu=~5LFvt0%k>^>_R{iQSQga-wC%97A;E&jZ4ARQFYCml zuFLhrm%&^&OQZ^9W%tFHNX=CE8>U$7%wjZjE z9$n`VLS@4cLakP$&PyMT1SdW?O2ePbETghN1HAN+SVn%#nP?mSj6r1E)LoY)d5>co zG4Q0k{qx}PXB+jYqVui0+9C(c}3^-=x^tlu+kDon=g z17=d&Z;aPR9`IB8qSp(8-ZpR+X78)YDhuyi*+Ur&GGG|3KO7gtK8=<~5-<*3>_>=w zrt^7N>^x*;BXa-?bBP*c6%0i#XNm#_(+CMa5KN@9sEkbfgDPl&{DN@;b0g(UK2cV- z$U94Ptc-jdz~;)52ZL8ABf^zmh1Qz`EY)=dLQAV(X0TKqU|n{JqOz2;D4UoUu*sB` z`6I#(wo5QPFvn|SsoP({rq;3d)#{vNyI~GinhN`N#~i{LPLo=<4sDBbTyke73r3aE zYW=w~z?G+b7)IyHW?Y}OoDd-IU_K^e5c@-^1hL0{Km@0Vmqpp*QCSGe{G7qko56gV zAIxEnUMnbR4!KC;H*xe}?^KL=pNcYOei9U2SxTj(+_nlMJ%3;#Tl*( z4_;Y#8viCcBX!8E&nNsu)(=1#^^qsJ5FR!U|UpGc*&v>8@W*|LDU? zXDironptNqy9>MK!b6ec^xC;LzK%A&c8!U*`L#2)IKlv1qF<8}>?0hpixr{}R2orf zQ+{VGGJ#Q{tSlxwWYtGy3p<6JX3COQuZ+O_Qv9$iiD+^2Orxaey)ygdz%qa(n!!kd zv3F&&44W}2IVp3V6FuzKI#^^@Hp6upEKQR!*;e!5v9cr_;K(Ywm6-_V%;G4CZP>ul zKG`j$G8Ar1A7;X~qc{I!_@7fG-3?=?Y~*pS-e}BwBCu+j7$hDhzbk|nCy3g}Tl%%| z!nVl9*L|`b@GP(>VyvL&?Z07Qv+WlchT9%2h$EL!Xh_&ZROOHCOC4{6VLOm*JCF!x z$SWMH^Eq}^moa@9lX(U!2)>oM zFhYBM9QYwAWqzhI!-Hp+TprWpvR{-DC%9T=9^D)wJO*r}AcA1}z^C6#7}JwD8+&I! zm~aXh2ya=2SQbA*0P{tK1LUxHKZ-yfW@>}qvkTkg_c-5GhRsD=?JiUcs`kRBuU3Cha1&9+MhTXeN^Y$MI^q8UzePO~BHZ$Sv zug#{u&60x)hq3Pjwu(Zv!=}m1KB^vWHu!}Ln;!CJli#Y2x`rA$d=|uHSRXbA9qN?d zf2RDlgV+ui!cdAS=Oaur<3jku%rx0#yV&nsJjQ_bsLxg?vKdSXWeV0OIKtk6gOs{a z7;p~K^&HGw-6@Q=Q^4`bm~zHBz%JrH_~#g-0J=B+%5EFg$5Q;iXZ{*;#tY{qzGrf2 z%x-*A-jXii*YM1|tSK$}!Wmbhz7Un`+JAlN+Xp`-I7LeCS%?1&5q>_aB*$WsoJ^7@ zv)%XjjiK+H9ZYy*_rf`QJ~8zrj4K}1Xl?BKdSUFVDjb<)fLEG%n>f^ zWSYGX2Y1ZD+>xASw1gV1Eozif`K{

    @J8%UKr=XpitZAHy-3fYTea`tRL(?o=uW%P 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 z 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 QHUIzs07*qoM6N<$g4kDfwg3PC diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Expulsion.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Expulsion.png deleted file mode 100644 index c85964fc781952c7d2721bbde3dcbfd5c77f3113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41196 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/FeatheredEarth.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/FeatheredEarth.png deleted file mode 100644 index 26bff791054aa5f3317a2d705244b396b93e3960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85440 zcmV(*K;FNJP)(UDPVm&K~*S9U@a1UrzImJDJLgoggz`PDrAB^As-)XjY2+A zCOAnVFfA=%e>^%&BQh{CKT{_afvP-DC0i~LHANsB85ue@HZ?LbGD03VH8n3j9XKf* zP(CGON-AiFK&hN;KRG!P5fND|5PMoRUN94Ci$M%SSVc4;3`}HQMJg*e8e~l_UJDhS zk6V&64`qfQH${W`#cwSafNL zKxtq?baQi3Ycf-9GgNLgRc|y;XE0G}GEiwTPG&GoWG_~6HBDtNSaUX6bT=A#o={Cq zOk*!qQBp@jLP|$RU3ocKb2eIbH(OX(OJXiWKtNbkRab7I4{Q? z&JF*c4}u^N4N|sVJgV5DJghP%018I$Jwt(|p%qUyyCSgNeN`l-MnB{=as7pb=cYs-r&!|xrs6pnzr)%k@)Cw@m z4uG=uB{zCA%Th=dk_GiBuq>_hewVGWgi`p1&{7*cN10FqKuTkX%p`k9nNg;k0n$L3 zW=T5d4N#2HJ4)C~)EV#?lnjtN0NNrG%hdd5q~1;PUt#|lFw#Ix5=^4TtK0o+Oa*3{ zw@YsnqSSK&)FfdiFRcMkh*CniUY3?r!cC6e5*jF13egxhnN>DA&a&WXP7TS`q+BlL zmKqI}mlh(;n3tLw{^#NpdHF;#p)4r-fTshQBodudlp!@3ljPGGb*p~P3MIbW~6H(*(cNQyNi=mk(~iW0{}CG>P2s-f~iGWFg_TV>J| z&4udXDw9;Iv~4B^m1*McGEmce~mUdbAX82>i3GbkHSB$6ov$p%&=cVLi zP7be@Vv^0r*2~eg_QhJ5t@!a}mA+JJib`=r&85L-l(q6@ksHdamnk+VIW{>r))E_( z7BWeZPgPf>GNwTEC?<~)n_7;wsY5qumq8hO3e|+No8;O%S3=U|@$G9#s>g70R~eP? zx$bJ8rB<{SJCTxct9|=g*arAo*tix-P^I|s zOQl@yD(BF`F0^?YR{KhEwU4!{eaSA9l+suhSQ_dL^$p~$l|q#zsfOESL}+O+Om{=7 z5Vo{58pkNc$`}e-tXOx?RMo4NAG>VTDKgeWRkeqzX``qsyn1gNG)&vQBhLlksEg?l zLV4Z?T4faJFK5vxtrS{mgghFs?72c!Og04s9V=4Q0@X-S(~)$l!QIvaGu|fo zLg)ke=K)o1iF{c3q7KLu{r&ra9=XCM2t|3KIY`3Lp$v^ojnF*RC<8>J9!F5sp5IY5 zuq(U$STE>VjAF3*VGxI74`N&TatQ6 z&Z&-bX;B?Z)=3S@8TBbet;>H*RWK5VLE?neGCI&#tVE2XLyT*j9SGTmM2N$K*P-x< z&c#>0oV`{?K3x(qGELeT8lZ_X&Y{28t=CY5{!BY+PMCbGbryAlLCmnYICFDHFFtZFA>Vx6RF=L33ra zY`N&1Ley3mX=z%P{Kms;#is7QJkTHlPp}F448mhK%(h zvUsHD^;(Ow!Xso_9n7~v`6;D6BA=f28o(F{FecrrWhEt-ouETjq7MC7(4L}aRF&|= z*8ca*gR@E1A1)*6uuKcuM=@^K&ev;xHrVz^TumDi9U?Cmxm)&(+`7{~8?_#2$_n(# z{Z$S97U{=33N1Y6g$ZEl-E+_pYNj2;!rTyU=C$1{?m!$7Lo(xb&5r`-WiA~eaZxQu z!1pL3P5&Vy@de5(B@~qQTnP8`_nWy4%PPK?l#+q){0uW8p(dkyY zODp9hn30I4jeygE{1}-d1thXQA1k+I*)cMYy4Mv`j0Zw^f?-S21Q5uv%pG{y9omQpisArg#Gn^d2*^Zp@GGfio6yVF2dd!Gm7pY&?1BN0_gSi<(~ zxbvS8xm{S#NE{m-@Ql<0#>fjEdWF>(N#{Hx^9eLVdPG}#JS6c_+**^ATb#vH&EHq|8>g+Bg-i{YW6AoEh)O_L)W`^kJVIg>1fo%P%tQmq#K>~Y$jcEl zH9p%ePIFp@&zCPob&bVnYR~1sVZS~vCV;gq9+Y)A1FGkrF4E$|rQ=SmL-Gbd03eSx zfslVp#L*@rEsHN|q&*VlfEsOPWUb0b(ckOljf%$O4oi%F)N;kuy{ksmRU_ZP^N!0{ zc81NvY0r)@AbSL4aNO4BA zxWtkMZYVS(5>Sn8^GGb)LP!h->e5r@c!;40ETMxkCdReHwmD;Jp>i}?(*?GjG528L49C9!MB|+p;G25oofwBRp&8R671Eu6pV62Jc)9G26%9h7 z5D=;}EH90XzBd*hpy2}ql$Z0p!`zY&-;#^b%t*FqXyNA&+B2Q49**WgHGIeA2f~N^ z+oel;dNt;eFaq#qOaO#cftNcQIcr{eUm@=a*qMM!ZcC9hFYF9J2jKJF-~f@45{9;= zQp{-FF+w6Zy)Htm=e*Fw1^)j0yCWzrJl z_6kyR#Lya~P+Rtf{k~xt?gtODI8eiF60)uqfbgfj9(0d+4p&$*|Cy1R3!l%L8v5Lj zjIb0{qZsedm;nf86yqHOj{(>&!nb}i*4ETWsn=@8(l<0PA7tcK&A=Flp*2VX!--Kt zTP8(dscPihlNs7`&t18+NMg*-ZZKyJieRl~Y1KkiAgeD=tI zgMK~iL^pu-ZX}%mtMZNwq1nwayb;z7fHH3b83H^t5O`(`HZEj9OJ?9}ZvYtp%_0Tv5X{QFX%Da)7aUkJ*lX(jXjz`@TWGgmw={zSvZ!G#lN22` zBp_;Vi$n(aEBE-~__Pra)FKu11( zO8TZ-A7yVsLtAk*x*8O#Kszf$Pp&!l8_z!1s(!Ck4tLe&J1$m&JB3+Kf;TZd@A3_R zoAHh#!v=Rq7d5nHLPuIA%Mcm(iW#Dg$aURfK=E4wHf&5w)0$x4G%acjYntrgp41LD zLf0gl1E_ie4Ly;puaXSq#V?~2f7%}Tn1$Y44Cqg{g=gDWrezxMw0N;0bo01FN9d-J zAwwghyjxc`Br++H!I8!Sn zZE~dRcz2^484z(tj?#@_24WOG0>-<#fjGuHF>FU5jznf%!1qj{MWPUCA<`a6LzKd! z7loN-#(E@q7<0I~v`v!@|Jk~xrlT6G9#-LKSQ9mD6&2W)m*Ym965_X+d)k5RH-}cL zv4DQd*YfYbSBy~uK!ZS53LlX-ph3>t+v}?sLyl~3 zoDkPDWeX8!hI3{u5?F|82R@>0w%aq!JrX|$1{KGtQ zKm+8S<{kCny1QgYGZwa)R+qLt+-|f}xPigV_5s2&#ht*-a91vukLY~(@b&ArUxK@J zRk~f}cWi9DynOqnJyTmLMAkDwd(a}ip<`_}IlDGH+n#Cak@lqskL^oQzg(ni5_;LL zGB!z<-Db&;`+$y|-aQJI)B5PwjsEs9F9TFt2DsHF=0_XzQ3Km<_>(GR>i~LLgH*+_ z2Fb>M4>#tYvMed?e*N|LfBy6S{g*G=AyKTfA!6sRzv#fPFXC8clC?-5_bDp-6s28? z@a5J@bVPe3t30+>Qhb$SmB-<$?D3W2uqL5Vpt;o&$R)pIl7wMc$gwXI2UQU z*^z{;psP!XkFrhcRPUZ`3@&zT+ifTd`|n3^OANQ=`Q_!ukAMDo_wLuPFJH*XE%EOl z=*V~Ke_mdG{rLNzmv=9}{{50JHifSLfQR+FSCtNHVkFrG)9>?+s~iR&(H7Pef#$A-G>j)&p&@&-{?OB z6~`f=x#Ec*c;d^u7e2ue;f_cm($7K@w@6ZH#F5hTM=ep=t&Pr_Btx3@L}8sRjxLUX z{45tze6DMYZqAo&HVpY{Hp%>`r-ZmprF_D_4RtyhUo43^XLD5#RGCej$k6BMFI_tbwub`M}&^X z$aVe&wrM=e`fP2tIN}Gm!Z3DV!6J(}}r%qM1{`vOp<>ehu z+H(2#@@lieCrasNzkhp^tg-&Y-^=|H!N!Rvp5PIqnKjHKEm;%t$h3z>`XrCU0EN9; zutY*cYe4*@vAb$>-T{F`&8{t6PwEVgLJ@O9qE1gA`H^+lxXrqCj0)2bMwz7P>w~?H zJaGW6#y@4x@^&(qV}+xz>=^5FrY zeEs|G?}vvazFBUTuZTDf-17i}xqO!sd^*?5`t|zkvqmA4>#WIzq|BPbj3^ML8geuw zD#Bt-2vedxB|3~6!)mQPCOY)=uDy*FA{HnNtbJ2Y64j`+UkgKQD~&#Y)}BN{(&N6~ z2|;v7ya0JK9R#QZk+Rk4?4zc$FGC|Qgl5MR2a*U`gx)@@Dw5y-`F3AFmk7$;!^7r% z`MO+h9`^gqX1$9y+xPf?zkU10Xyd>u4&brHk zk)%xmB6{{cAKj6k*$?E$_gebI6ImfBQJsEF9hI@H-PKD&7PXsr0;3w@NW5{@3CW51 zIo2OfTx)6#B3>snX+;s-Pph*J?q}x97D*^%Vs=2vny|0@1Szf6+s)hE-SQ4$qNlmP ze@DNurFy=;j>mC4h)40@?d=XPo_K$Iz=>Bmv3*_R#AdS5+9GYrL)u7^lp$@rj}9bT zEFy1-!c0g=TWuW3zv)k?TGD>8YIWyChD3#V^l2B*7r(csP5f!rw9Jn=B1-ZoJzDEi ze~uO%X&}zKpO*fpQ~k+|ZpxPSg-nB3AwVF*$$IntCjH0L-^=BGzuj!{Ekm{K^#{XV zZxG+TBh);CSTEmkg0Xyk#iw{U+|+4PU#&5QN%9HcEYgO-)gT0AO`H=VgT<4XkQRdP zge-)}Xpvb`6J|-PY?aKC)>J6*b0T{f3w16ab=!Cm*sQ5|;ldgTlSYUU5|XCdehKL= z@%=>lRDQx5pPpHW^zp1wB(lc|Uw8XGPvA68Y=^_i&RWH~rL|;|mAp~R8yhmob_J*_ zH!eSFzrs*RlXM-BD3GjHNobQvq)LVRN9|3SNzJnG0vME5N3&yLN*$Y$D8f#-v}Nb zG& z@xGaBr!>)xe|gj=~gZw-35JGkhCsflZ4SB2@Ow}K+{S@VX>N9d(^QX zt>?2OwCs)2m>*?KLE=cf_~ar!jnuF!72C`}TXR7fdxtOPOM?BLK`agak2 z$9;(8?daq7{%Or%#_Ox~RsXto@y7+8$6g<=UavR2>5p#ic?9(_zQXHzFu3jy;>l>@ zQwcRp>$5Xv2@r@kK$@s-fk+~z(t>kC5@--fsWphmi!WW?0nNMv3VtVC9Xc97i%<4# zdUqr5x2e8%3E`_dGmO-UWmczFr!_UC(u9Nw)8~*dL1{X@7Ev0mb!b28(Z2nX5*7WM z*~yfAktgx6KN^m1N2A;Ej*-NfpCr!XA#oxxK(@ron;RY?S#>8_f^Y4AHvtOT>8|GNc5!^p-&*+aQQuH*qqkW z<5-R}<>%A&vmII)sTN^%KlLSiMCyyO6hnuPYs+EdBVVdZtwUv+C0 zkm>H*eP2!$>g?B#M}>z)MWk(GjwLl_k{Tqw83zFhi*|6J?-(23XlZLhTP0H*YrUw{ zlIg0(*_4gWcxUs7aujM-BsJ@>k(lvNc^1qLkyNPZ6rtQPl<@?i{QY;t@$&NGk3K`m zm|kBakceZ9P$H7?4o4W`>mfslf_W2$J0WwTqs&o$-UB3>i9>~`5H-hdMO*zhpDpECnC9M7_81|S0ysTH1RT{ zMP@$5+30_BHlZJ%&r2d4j9A4=>&;F|WXya%w{|}N_?X_}sod@$u-lir?bFN4O~jSxPp3?(CZjnrZ0cyHsAsU)(gBdRk8h=fQKrV@n#63qc3 zDZRpczri9>&UWsOow}RQnRjj+=3zD3x?-QVeNC{&oe?ro*s2?!DnvgvHiBql#1RvT zjj=?INarnQqdLyUiXiJlfzo*SJkcr9LVpSZi9SAVZzmIm@_o4-->ujG{DVOK(UU-4 zLT?$&exIQn#>?e+%p<)XA6EQi^k3uV^Oh-I-~$lz#HUU~^!R9r4t6Io74z$CUIBGQ z=dmIY#5}Qn3)->8f=VDMPJW%0-N5B2|G<9fOY&Ug)NCYuC6OkAv5(5-e zCkz3D>XcL+-I)S%p4_Qdx;+LI6nyc?98lH{MA3JBjjvAKMDg=tA|_dJ?+S}cH+(^^tz`tdOu?e^#A+wJ|^w{K5(=tsVMc|#Bp z%!|uEuHj$leTKtxo_WI=%->)C`SPU)icr#FF?F1iY>KP}Qc4jqby6ZL$O&>$BFMG- zDXRsE#-u@Gj;4SvG*qlbZC@-SQt7*cyYa1f=f3>m9!4a-#$Olwfv;&_I~5mG9#3p) zW78HCF*e;r15s$bPi%}7BSF@7oJ}Z3tVYZ|A}h#&OmA;TOEmu5^Ygd2mzSsa_w(~R zOy?L%YV5`JHN|#-N&D{n3!{xQuQ>DeHb5w^uWg<8;);FqBq(Zf$98UfsRHOkb}*45 zO1ce|nBeSSf(2PYhDeH$>R1_BdkV_J-l6jri`Eb)644Fsp9q&u^Wb=!@eGl6KweM2 z=VA;I37hJJv57=tq!!ia-)&4Os1&4$P{3!-;;c`GH1AlJzfedv|G?_#pk zHro*qiC zV4`eZ^URko_ph(}^WAQ{KVQDzBmU<&(;G5(Yym??sS@C4Mp9Vni+ZEjX!6!Se3)9s6ZR7+rrfVwW` zXg*W7*;bJ0wAl(sA+AKB6bZ6K+G=q&$P5is3IZe2MD-u|pKot?QB@yaUN}zQzr3G+ z!BG8Wzr0^wTta7iIKy=a&mg`GGQRtQLkRr+y`r@#nJKz!WEP7P;UO|aloVB~4D%_N z;8ywA?DM2aF|NdUz^}ywU_t)hEuX|v{ z{Qiz>J@Vahd3njpKmXk0g;>76B9u4;amA09FTDP_lKK3F9_Z{ zul8*5v~9PWhjF~!-rezT&pqSaoRPad&E=lWc+4|}Wu~Oe6ica9Ocf%eoYt!Tv#Xp) zj0})cHIi;g8Yn?I(W&Jn(t@PZ4yd#E78~qNY;c$b%S2CyDNQ8V;CD>nLQN?sG({Gu zaV)K6!DG-8L9O;Z+U)3z)rQAC6iLsSx_L`Kj`l{SiuMS>H}i-L%b z)k@hRDu(fTj|Y)~M6mAP_Is>Gw!1YP&2o*!WFOr|58Gwj?ZFF&?(P`Yhg}_SAe@Ou z16af`Bi!wDD53eTc>6g3pW^;c2Wmy|l26GEvGwAm?uETFkgLYqdsGbAi&77fqBJzPL=jQ&yuJbvnMYrz ze7Ehy;m#kcuIUwrd#GJ5TyLll;H@66iG@~9i>1_9}9*gh+IO6P%#5B-E0`Z^?J95+#*hVNC(%rpf$v1 zxj)1xeXzTQ%5HdQxqp#EFtDSW(O|e6Pi&@;8qTN%b0ty86-wMs0sf z#D+;^#X3Q84y9|$yk0IzpZFeGuh3JgPcRvR4 zZ;OW45e?LJEI~9v%>fc~+ZwaXQHM-XfQ9s#mjD<5OW3jL+L1@ic%9%;8Uw8HP(8m0kd9e$gHxIA4L{gYYWshxGFT#WZm9c`#JB4 z!)*_G4UlzU?W+u-_xThghQ)+=f7hK5&HX)?<31UT0YBXqnWj-DvWGI%)Er$DXRC@# zSsbR5og1XjSw$4#m`;eq-Fkl#j|TBDo=!ggT=Sg-xP7(8YdE~dKC;Kfa*x+T26!}Y zhok8fZ@=6uH@L}#b60pGdA9)B5SK1_l;%hwS4wB{!ZClym_Oxr{B6@6dDHThjL`^M zqgn=66Lk%)5jPu3mFmoSi%_ag94?vPCXx9x2(vh_Ll%GmIU=$k8IGU6=T5?Ah>1aE z`Sb`3D3qMW+*;e2$0dr)8S7^%^dcFM#<40PT5)EK#IQ;mTd8O`ieo%(+mGp*Jtn$- z7@E=UjmPFIwRumSXvQ?L=qfVNPDAXzyY8B9r9j>xu#hBp7<8fh_=Jd$nc6Uc)rSFDXlbDF{4mqIyzjMHM#KGHA9YjRBEir3|rjsY5Vd3np zRdLjz;>eRvwvhbcV`3EN_p~B;nroF5i4FDyIi+-#PNxXvdb;1#px=$x>^X zK%eY|Osg_2$eI3=}A*v6d5flYap2eQ;ls^V7aBvswg!s)9ULptq2&b zh=M&)V9!MarqhopRC8R1lAYqyXxQUzI$qqNz#@_tL&S1~`|H~Y?u}gSHm^@l!@7vx zOh(s(A%1*Q8`oSXh0U!~3G0E}Yf&mC%T&Y!GGb;`ZDs+Ka+DFUL<^I?nM?+_U^tTn zH+x!|%21lfQn0Wol5!R1F5xCaYG`q#9g0r8Nr-lPSLj)2e#7Lg){C~0r8u&FHly3UR(vqyU_cJ6akEiWXl2!DZ3^?+ zU}s&hvtZp_5t(F0B)3+io$2`4@AbZ94Vs5#VM{JbGD~I*80T!EkhF#;WY!m#GH;5D z0xLNeI3xRM{`^SWst|Qrk(EinstWETi%PKM>?g3Zv-0fY1CD3BS>vhP?%!YDFM0#| zoIxE*Y@89wQ6EP2whrZFyn9%_+#!rO!%*Vc9gcn*WL2h~ku5G?AcG`<(kx@PB*>sz z0LxS%gXm9eVhb=fLo~BwOoPIS!Bu3)U|Tc>H}ZPJHo57XEx9jF)}9upRFR!JndaU? za57*~Zcm47-MyeNOV-})xS$L_FtPttz^c@)_;~Y>Jyb@d%;ZqF=;Yo)O39JwGgzxYBd^#|;Z(AMN9K0^74* zzq}xn7re_nVwC?o`t1hUvU2IqW!?B>nSD%LA{q2E#APPhQX1+FKh&(O%LKlyG&Lxx z^(H~avcjC{W-XN4@-Ssd^!(A7iam{ItU8Zc+wWAT6zJ5>hB-@Xi5MZ$-)m<4L`|nh z8{{x$3q}?K;;%D>F5=)4$R2-ewLMVOTy?x$YvTW z*NWNEavR!W42jQYeDpXk%t7Gc>afN&;pI<4lr~IbDxt zlcrD3q6o~GR-c@3&O&t&##(f`269%fR*jwY^~rXpv!>-{PUBpi9paoGn%oxiYaEdU zV>G4038F(qs%j&Q4wX#JOYd404rU6BWh4PJMk!N5oWIhdT3ZjHz_bHXFd|XKM>ukk z*j9&hA=8>H(KDAJ@CeToB`_XuVP&^h4}2)EXyrPMjqB}v4& zW-?Sss6u|IlC>LUjhBp&vgQhIS)N!|VV&u07^~Q((}`@WYe~bxX0;-d9ycM=1sGK! zQVoMtG^W)muu_v5BeDR-)X-4^CRK!$C6TLXXO+<LgY$E zK}M09yE)ls29|;qMuV-=S(f!j<9H159Bs#JOCItfWE5rE)G(YyblcXo4A%8WekSq_%E`V)hOc1le%9KK zX)VY~n@}kdD#eP-Peg3Rf)R>HslZrfofg;nj2;JxY-b2N*vi=A=dvmtOb3ShiE=0) zCOrddZ0j6Gqymd*TdT}kvN>3PFh($UW5kjV=B5Y1>@k!*25|rfE1`@r)xn2&`sZZR zqpCt&`-mm25AVAeBgU2TjvRufE{x8QLum%%N|u5_O0uj3gO;c)A`^KjDK9h13*0Q2 z15?IjO1fgOG-^6!m2l|;CQF}$8mwyT8ZA(wY;9ewu&?1-N-!_ShK7(X#9v2h4_b3; z$?$>?0;3sC$h;^xJ~@iafF+*^n2{cr*JdFKU@{RgDvMY|i~~bqp=&h=&Wx<87N5W1 z4E%)#gGHt1$l*DhekLnb!z%M^k`k;)z#LeSRYtjF(2wy{Znkl}n{4;fDS{-Sq<>{7 zdkp9h;yU7oc(eKQ&zl=Yv9`H`30BipnH7>R8S}-RVpeA7tOoQ4i_xvK50};^#1yEPC-Peh={=g`tp?pLBU#sVU^;{g8DM& zACmf_oQ7`X#n1B!76Ht+#hlQ~hDYjAGqp! zWiwMqgu}{LMaX_KM6KERf>mNr@wk)GpoZCpFBdE!3n?L5gL&5q2SbO7x{`5$tHEF| zP*?IKOW{z94560!nc;&Crr|@3Q8Zjd2IaF0o54M5v!ZOwAbbvN8^gTD)6H&&9oByI zF`#-fiamH9l*&tnb}$;?-CmGbTBG5Zf_shd4zGtX1a@e31`9pcd1SP5#iG6kEzvQmF5&> z#sB79J(gs)N_;`m^eR%2!WE|G5{e>AIvYVTHH|-gM9{Ttd=FFAISnesRhR+;ER8lr zR}t!RNpa=u1G_1Xc>|P*zYaRD=NYPe+HUQC3hwAZB(UB?Ly%skY@no@qYQ zwdF`F*w#cbi4aVc0NNBulqIQ}CA)ZsQ0{kA)WIo3$vVh5UNeXs1t4+=wn#W<;N`gDH$RFx?qFTNtu1bz=)t zca8?I@u$X$KRw#`a!!_lMPOo3bu9?xzZq16hQ_dhB;4&uwFngiRb^4mH561FsvniX za)@iqXgS!(SUwmTEowHipNM8HYlYFXnb_9PXGq+v0xNZLwHe1#4qpvuPXlt5Q zr?D`y6ATxMxNo5sU9`Pu?N1ZxL2{%A^~x?xIiBYP{Uh+(lX^45AtVI+avEl^T{qRj?r|SPngNNd~Wrgi)%>pgpDzv}Xr z9qcod1BP-qK%as)bWMf>Y(*y1@%RCylC`ookWh{%?m0ykeP&FKEVD&@H)OSn6s#RCYC#n8vw=d3;ln z4C_?tJ&Z}n02hU2Tk{`ySbcu3_&=2+mlYgl ziQ4pkR$w_E++sDEuJ_a3!|OWU^g<{{!(S)yc#Kfu!DJ|J$D4=EXoE98l#_7;?I@8P zKRe}+OBJ$mVOykRr#H6jR#xz|GIv5Un zI5aYVd?%!0{h?Aavc}2OM1A#b4WR<`Elgy^#3aGQ05-9eTdrY%YB(%KOme@R6E%qN z3s9bXMAQ)Su23l>RPNl320T3Z`6B`dtfhXWDTiYD+$3ysoL!U#P>Z<$ghO>jq>Zqdnh8P)7ke8c zl=1Fi3ysB@CX{8C+q0Q+CPH#l`RY?aESNE~I%8I@Dwr{4!3TB@NfbG$o8XcSjD?&i znp8~V8##f-KzEXg%bU=_lx$M6Gj=fDsR@gc227GxQNn~(hp~yjHv-{<1k%OirBh+d zCf#YuaLXb$3{V@3DPoY+I&E!df?6oZ3?QmPJ>#G+ff-E`j!OwyDsq_7T+FDOOew;%BINAT6@Y1NF0z%W=t2x2N(u4_(CQ4%2@)F_ji(ax z^wADR2b~B*`JZ10h~;pCw{rd8-o>wz-EJCV1UuZ;ZD$?I8FJMX>hqV(MTJUCrtvFJ zOD!3LG%5|mNb6aSFDNHSqh~}brP(IB3l3E8t8Sb}(Pj!4R%cm7JBT zBx4g}i`8RYm9kKk*uu=cjUkjjV=70LKp+v@l>+6%k5K*m3kAgi<|&{SZ=o}*SkNtf1m~Y9f_26u3NW>e;h2?C zVKb&y1&9nt76vd|EFfTj2)cF2Y+`k(*&O20FRG48<(@7MqNpWA6X z-fRaufI5=;|Iu|eJ8~OY7LKfvkl?god*OoNg(Y~`4^Y4WUd%rD6F~-pFg?y>)8fFk zY$50Uck`WyV6sZ?K{pzu)0u??zyN4C*Ik=7`%0Of zsMuefa@)f$jV;G0!D;0+)%I=BgN zFn}#!aKHWX!~1_~jo=&l=kqg1$+i6QTQ23--*c4D&tL!V?|;4j@(&q$9A&Bw&$V{V z9J)F(oqetjl}z1GGLe#T4s6&D3a0G^`qmpKxgbynBEIT% zyb~h`>?)7sg@h?fMs+bx1U6|U4KT0F1Ge@v4P)}L9$x9jVl$^(sAx{yvRP_e0cB?N z4{_VMXe@4NUFF!ece?c=5U2K){S_zi&J(<|kkP3<$Y=%~AE8|Uop*C|fHACYotm&n zy?8yLORT0auYgMdRSZhQx$IN@%OCHVg9Kb(KBN7gb(EMvUw{3dI?88G@cH-O-+%K5 zm-5>$H|mFm;7)nMmSco{w?y|RKSKjqS^3r9j-4zU=-N9Ny zM9ohUCdYVfqq$T}lBSp>jqAobZy6cpxZJnSTAK+FvpA&%2$u8aPujL@4nObnOtFO5K+n?t8f5Hl^?Q!<@L-E!{10}ktivS^EfvAcq40F87o z3dYsaydAC7Y8HCH4X|GU(_nHhB+Ss{9IugF(O}X>kwO?i$s#8Bu~Kwsn1i;|(hyOH z+P^5+Xdce3KR#u4>i&z1ayp6R-!ORbPM?v4FHsg>mF#<-wwU=6H(h%|*LNUC|U>GmV zn|(65Jef)e6C_svW4O|HiiXJ{Z*Z}VnYR?ZB6`{=%-2pxpE)bHd(Fvx9}*P>JX{Mx zPd>8eEo$zXbG}OsMbo4_KXK8i(dY*B!6y>IM1XgOAh4tI05k8T652-bJ%!>$Mti`z z26TWH$<+Y*Zf4S(7LG|@;@q1gY>bGfeR9D7wty|KjM^%?J^An+4Z>OKFKKalu-E5* z{3k@`Su*84(reM;;K=b$=C+Kj%431SP#z%wMrvjd*bdh$Rye2Fl$r@$r;g%n2&&8i z4#o}R~%?QL@SNg&P{r$6V5WsBd}{f9%?k0t8geJRLRDge+DDOCg1k z+mOK_HhW7MOG|O??`ox)`rK#QEv=PBVP5MML)Q#Bx8Jt~?dPnsq^=?R6R~l;Ru>*BYKt%00x~3!st4^1O!*pquQ{52k`dcxuR@@>(nRu=muA$2a4|3Q;vK-0^HpRx7ior-T-8S1S!*jf6>gOV6z1{gS49IDWIc(xe6CjjPjV;r)lwM~C*q|FkgM%JvnPze zNvW&f@4G+`*tUS4`dKBED;s8qP-&B>@YIiJXUw#7nqG2mB}p^+WZgG@lXcE0 z9GK3gs~vqGLJEj3p=fyiJZW*LQZ%%EU(dGl(F`-7J9^5TdJ0-*S1WE;E7%N;HMys_ z63}^17oaD;m_v8DG8MVf2k{SwTB#06Rd$zo0JB zPIsrBfIO?P#mNKCX?#=j#cfktMXpb!~m)RrcoT4wh1&Q`*jkiR7qGxg8cyR^qF_M zH=>wkrf7y`nS5Azm0PRuFff9>;nywy^D7oQ7Qy%FAKlh~iH@gdDGKVN@(65xgdtD~ zsvqiOr9RBC)um{LZb7y(L@B(brmO%xA`j4IVPgE!-MJN6>K++ z$VcdQWs>Ad%#+A@!22Z9%9yPI;Us&2E4|V*AZ2OnNN{VfC?)1J{@P@BTu@SS@B{SS$PBS7LqsQr^`jGw3 zakz<#ie&?~Zs4{^l`K!eT*8&|l0@g$sy>#dcH#EH16xr{`a@quH!(IKqXSeIS~PfV z>bvRJUw`=ai}&Auj}XDPg$!d7yXdNDD#szNfTr7ZNu)l8H`GU81Paav%fN=-I>ksgFytDkPzKYiO42~IcJ91 za-yrY6EefJT1a|osgE@pc&Cq`77byaP$1*zsZM5j^xY%_)B^qw%ddE{UxsMs$x=0l zl@MTWqvm_CbI~QpC3{03893O&F*2X2nwF|rsG1;Q(&IDPO7%9y=7pFY`qWkI(NzLn zWw1*Ps>lQbgsOqlaG|p@sYE0gMRQaG>W}rX?y)+_3vxDVY;EvPWr>81=Z!I z3Zp2PWXUCjEK6t%-1r~JDik>f+;ReKsRA_ zFm^&<7BO~uhB3ixjN5etwToIZXI!|-;gDH7I#3EEQuN~zbHML=dPq-3{8Q#Y7k;^ju5$ z!C(3ty`rt=6XZt@uvOZK3ZG_ERdXs3&l93RE=8A63!Vb;nisa+b*uM!=CxG^6}o0& z(yWdt>}17R+R8m-3leKV6;@j%Ou#jDw!0l|qrM{bj&hyldvzR9nLB$j3wqDl5-}MA zZxdTNg0?2S@W_xn7;ck^FU^L1MOZ7Jpv&dLjV|}x1rzV4Hy^394qJ2PGsLwX7T%r( z2=9VWFOe!+P#~?*qnbzW&yB(4AF4&G94L^^o(IpNnvMj%rrz4y4NZV90X3&ix7cxF zw?NTRAf;@IFbUMk-dA?vYCL_VD;gw(+*gL9uV@-IHuV*1At{q%@YF8{PsiYKiqw>| z4UW%4*<|TTc<*DOE08L{k(Uj;2f8vS&X?fqQ6EOD7Khg`r2UKJdE0DI>6#BEPLHis z#D8!3=P+HM54_z@Zj5&alR*Gc4L7?C{WT0?3gI)RFwfRI7j29+RB}15OFJ4_+?`7T z1oTZfuYq&#vH*#q3T}m94v9+*93~NCl@-V%)Ev}+E?vFikNbJ99=X-yr8ChXJ*lHh z%>nz;_4dI_ z4vi!Ha@QYs+k1scA~i;&28eX;G{F==DWj06q=!n*iv&oVBtXy_pmr$)6EuPv2*A>p&=qt5Rb#QKu{^4=tp46uj2g?F8VhsBNTh}h(7AC=B6SL@T@|Ud^`5w1 zL|122YU6VZ>(cs2j1IH~4Xvsi6(a5GAuMH)G~~TN6L!m6Hy0W}KTE3?18A#D{>q9X zs6c+u(sIMs?r-t8L9>C0(tw0?p!Auo1$B3#(CtLQizsB8^H0vpX zYVMB^3(9BaRQuD3?sHTKMZ0)}E7LJL&IT`&^?9?Lm!QrfX5-=^QuF8; z?A_Y%oc%gyWr7ItNu^p};xonF#Soihh?NaMF&0o5OI`s49s82ggL=ail`QuN4QE!} z=9dw9nF5YG?t?w-?YxNtC4_*P@s+>LKuC)f$-s2E;m<{XOm1F_{?Me4I2)NsW~ot# z0+)UTjR=qy)O#wV8zn%{8nXW>>s&WsKx=^Zy~Y{EPTg!vh@e!+h-mLoAPU+yCx;2N zs;0;Xs-d@)bP0XG<9hd2y1dR60@F)%Gj>9KJT&T)N)qMj#iT&@&SH`1>MWMdvgFRP zNTi1AXh0W-wV@GvD~anddzi+-f~Lq7lpMBa+-k-IQ#JrY-VYtdvI3|sC>5d*$BAgA zpx)p!EXQT`PCW8OLJq1<+k-Zswm4B<_VzA6tfJ+;-&g%%Rq_HYR+y@cw5Z`0P@K=f zi+6%{krCyVLF-VUGP&kCqvJHda!pW(uyK4#LMX-}Jd}0gAOdFzPDyTAf(ApwX zbE-y(ph(UAE)h|6MGnEA76j+-gBXC_)1xYH#<$lATJ2(pa+6*!L=m{y=!P zZiziK!FEfyBqj~i8H#2Np_5Kq42~$YmM4R z+h?t@&E|BP189ss@-#iwKXC~u2F4j|&J+33H`GL&QD_B+>y0cgduY_FG^(vJ@N?l* zMIh5E-2ys#>tBdeTFc>LphtV9ATEWg5!8VuJ?i_SQWc*`rS2s%GJU$d?6*mp%nm`S z{OpjaF3VI5^1MDQdla+-)vD_mUOqT^SLTSq^-e!HIZm&H2BUu*bGLs0T@N&QlAy)O zp2MLu)=UU05dvre)q>K8GCpo11fX#0E#AFsP)UuM;e;lsT~0u}1jrWGrqX>jKB1_J zCrt2I4X1@cVp7_1PH5dnv<45ZZO=SwbEb);Whqd!neERseUn3w`auS=(HXYwtP<(E zR3hDr5&@k}Tcr{S!E1ltx0|?^SwS1n+VdaH{@l*So`JVNkIrw3H2m+;zk%aqY9pfP71Z;(Eq<}<0$K7x*PB+w<5 z2zsGHYc$Q+MbHkdF;X~()|eO=)VjfPRf+UhJo4=_Q8%5}D(L`*puO$B`}|0wBEFVyGWas*|bplp--RrMa!-Q(3| z&|Y5^K>t2|+A@ADigdbXWvv`F6e$g>ISf)plsPi*vRvb`-(*3dkuGo71fMkVX!li# zItvXC8pgXNX`55N*8(3`ZV+QGhJ6S1;$*5MnK$mRp0B1TCK zOW2X5#yo>^=UjA@%;_|2PfuH2E0b#ISg4BNq%|68ja3WQ8`K*Vbzt7AJtlPC>J9X9 zi++CFJg#D$)XcW%cRg;q9Bq>vjmy@75|Rg`>x^{0cyqxQ@OI@>9eUKnE$LCqXHP-u ztRNNiZ$1WsbU6fRa=PLwr_1k7m!dMzJ_qpO2;ikiK~nId=2Bf=P z<{1N!O&A{9ww<@rXzM4-CBFpZsD!5vXLlN?5h{m6S}A83kfMajg09q)ksj@(M>!Lz zjdtB~8(FfCk)>yNkdI+X8&Q%fR8H3+NQ+EW)NV`zXR( zMvX{$PQf=+j%uV|`>aQkW6{XDTQ}86yj~G{x24jmR}!Ql3sRJw1nICOK{|LH@(Zgg zypmM_tnXH%(u8~KWJAwclw}C?~3&( zp)q8kp{={tZ(GhZszGdkt|vB-H3gbrE=r@$o;Aa~qH;P=Xkbn?B+W8ooHeqecw{9} zk);M&ZboWUs3N3BXgV{1syN}cnor9jd*6)Ih^73Z?XLW;VVN5Xd#Xf?mG}%-YDDR_ zwdYbJ(Z-`j>`^086NnnQ>rv%osu3p7*j=SZb067qA8AS-`CO3NBuHBc(jzqm4V<&X z)xzt#?uyhLigcL5Ym$<;Jg+WE(nWS?nzRI`pKh(vU)QjKZu%&DJM zBhe!&;D$GeiYzr6pGAdM*luEhZavMs#K9IUG}DEkYM^m}HZB_D9K*sUlq&Hwf54Yjuf7!nm0RJ+&xSVTp;iwZ5lK5#=OW2lC)6}j3rEq6Zz(l)e4 zwEUuVkgBLd5}x%GnanT+Pc=+)T~iIgJEpfyr4vAVcj!@T?|O7~pq(rWl}^=Dm#Mwv zM&g2#AYHTctcvu6adD=cavCrkXFE7EY!O_TFkXi6wF#XwW;8R^*OHDF-6 zBv*JyilY5YQBZn5$i9p9!U1H9kux%~b)$_byg*Vc?dOuh!3EYl^>yX5Iqlt>Bfj`I znnD{?UirmA7}0u{Zo2qIgL}N)R66~fMa8X%iaCjj%QROH+s*M`)s7zaS6>A>5(T(n z`#LAGp(p%RXta3#PYQFgxWHfhJ^Gr61_9S;=Gq<~Ek@L}0?bJ!Qr8aev26l^rpyhTgigYMDn$n&n zAfxjkc>PlKFB`fH8$@vxW2aFj(`IrAgdKa34k=CK;R$6vaSAw3zsNqTnoD3pLS1WXGYtbxIFarxZ0JZ|Q-IWlyc!_WXF$su}3@PLt}G_;7% zZYkpPh(iYmst?BIiyCT;ifPImQd?5FUGwKppZHtfeCtu0+quu}JRW;eFah9&TKL4F z|MlUwIA#;tmn2J@Qog^&TEwth^Qu(LK}C))u+@0nbU_oIvZioJQ%rYF@zgQp2?2ES z)8u_A5=4b3bPv$W4xi9dznw%y^l(DYOGH2_@f>RBt0s0x2#T(^TRq>FhCaCjl;=|` zRo%b=!z7E#uA1;mW52NFf%m4nm1b!pCphHpSJ8-NGs)?U2XE3Whm0&zRa+P z6sgBId{GWxG571Qe2=F+6h+n!dpEC=>Wshq^67{44QByt||rilk`Z z`c~p0MG`|IhJBo&wjzd0ghHINrr?4^n{?-}Wc4tLd1_yDfQO540+3Mpb{;jc}__oJSpEyh9SZ$k{xyk+_ zH)ZQ@Szqc#{_xXJzv`tarpP0|D!(6o~<%aSgo&g%UDdTysznGhGzrP&v5O z!yPLp^&q_~xRQFvnj)H{9y+TRI~CQknrf>0tzRBi$O2Ns!PWTGrUUN#rGl$J0e7R{ z`YI0H#EhA->n)?Px>w1hDj8HI=UgRpVVjcBEIrrtExcT6y2a8LfDnZ0t-0AePO3;|s>s}>I zpQ{AeGIxO&Nl%Q3G4+ylec4NHX8639WVb4;s*(`sC4xu3YZDHVR3`V?v@$4mqq7d6 z$98W2>8Bq*eAw4>AzL;(oj%_8b32nRX~>t1KK7Q0|`FdBq7K(jIvJ=AC&I>D1+Feq}aPdzvh-Wr4 z7dw?if}BF|<$A47_2$s1Sv<_}!g?1Ea{HgSSLO^{8;AtLN$YbBO|l?CM%vwv+qv4f_(_M2izWgE*!av9VCld#F&~onDqu43H*5~aB zhHH@1SxCrl+TSiRbJ+KDYu8>xUQNi#fjfHq%?mBC@Wrg}{^PsvbdtaE1Pf@ zh=;8<{hNSzSoMvqfZ_ z=EtQYTRMBeXD*3pZ}X&Wu3m&iRkEIW=BA-c5XzKE1H58HoOx=de;7vCm9e88o?1yY z`4jzJWX2*gk7few?cJ`LvR$Q-6KP&~9x=Jf$SKjHsAt9e zZ`+V4jLe7$S12viv>N7Mc*3E{GzrcNT3C^INFg3l!3wjn3Ug>3JUz9oQV@z1Uup5A zI&uPq>|83^k~L_@cwsH279vzNaK_WB=h>*RPIIN3plPW)n~t(zjX7(xTx)AYjQxOR zQUPH(qh->`ji_NcY~W#)Rlyu^x!gGsa!6)4yE0@~rM0!I2HOKimDjK$NM*{VP`E+y z<-|fRfDn?XThKB|kvxmhnwmq!rl#bW#L4)MQz0{Rq3sr%w8FovlGF!x?1%+2VX;>Z zXJ?Nd-637#KD%`HTzq{7Z0y}V-$||0!p>e$Z;DR6!^wQ=N5G1Zya4QUu0&Cz_IPEu z^H7qKM7@W!DDdAVC4nhyLxQwJUl;s#XoH;aBWR(Avob3l_`IuR|Lhz=stIuU}O9yyzk$fRsi+ia5SZj-WK<&a;+Dznv= zhTK{j0v_^giKnM7c;B(BsdYmw&SAK@SjkDfM8r0%Fx!F@CaDB`!P9kvXn?z4w9q(6 zL3nz!;=xpTQ>(g7pbSe->0!1+NT&FcN-4+$ufx-U9#W_WnGFhsP1^Oq8k3jFa%iwl z=6Kp{m&pcBL`6;nr45Ij2(mCY+5P z&j2Ldoc{cLo5nY&j8|VM`!ecCvpDyf&N!dWy=EoZ2(xWGvaCQ|F=R zHAzXU9R`FAYll(~ZPq5s#L5AQ&`=v8N;)@7maG!MDBJh7+JJjNG}fx}l1wPy?@e8# zB260QBioqTOIp!LJgtg!mL|YXU@f!)f0;ZO)|gF$Qmw&NTS(rl#G1;5td?_G7l`+| z=WQOsdJb4VppMAmG}!~6n!DY?qi%PNZgCN0$QUfR*nZOhxC7L?tll4ptg=@XE@rJ{$w^bS?> z)hpZ&5(yJa1K?a;UtFAD$&tKcA#v{2)h)x$sN+;%iJ$poiz)XVq(&y7FCvceP~rIdOF3QAWEF4hHt#|1i7(`V3pM2xLDL+70xXC`+~+l4Y%|@}Q38 zCWG{(bYhmN5m)zr!?3ak@Z5)ql02>g^UdnWSeQC&Ot zTnE~K{bsN%y1<-ki zTeSk(3*dRddztuLtgCb6Q!JFLD?M@cfBa=T(|GnGL%#F|vhZym z3L1g>P$MG5bBaoll&l~nStR5+i-bff5(xq#VaYeF@il8nMJ+a|F6gPR z{UD!+a^KkIe8MJFmT{M$lf>=r{G)!BEyc; zEUtK$IQ8so--T*wC`p;3P>L zCQGFh5=S8^Uuvazoh0czmr^@R_8f9ws-jQm(0MMDviU^%Qrg6k=rlJo#ioNRxv|}X zlC^9?spP%hc~h!oF7kz=YT_c76Bl_l@r(1lg=xtMUICI!M(~v==#IEtb937|-S7$7 z`YSehTixD5xiCvY+D2`CcaH3NeRqeofDpqyb#d1KVEF`JK76=E7N%ke^srFQ2zDf7 z+};d-7Z~D?66^pL+>ex`C3)Rf+)oX2GdM;RQb1o+vaPt`q;_IJf;D7KYBfR{IgX+6 z2-)bm%SQEHheInaWSj^#wk3+Ewkz>eGjbjUWZ%^W{9p@x>=kYy{bhr++gC zI&!x)2`FChfhB{-jO-m9_?eRD4Izo^QPCX$pot)E$)uZ3CfKj+x%^k|2=_zWU+~86 zVS}WYB%`33-VU~tAesA(;040#Aqm<6G_Ik%)Urm9J1M#B8kHmm36LKpIahrJGEy&5 z@HG085beIw9*tCq+60M6BY%;Pp%k$R;;0FYSC&zcJ5jNMsN5tzFmVN<4W!5$TGp6> zsapXtY3d;xQ@c=HMw9lc*!7#3^lz#jQnK&MYAYohs~PM5J!u5|l9V*UI0qwUF+ifxaac=+rY}d7 zf9fn6;fq8^d1=CUMQJO`uq-^~DoOBljxhn;dsMKc9I#MIER@8|q>#1VEfl4OgM-d- zTq#A}fmLk^7c0|K(YAvP=!UeivT@hKRy%uvH#!t#FK}IAI&!|HBbR?eN3^kYvi6|Oh^+rpF_WX%36i_8`P(^;Q3f(Xa>NZqO z5QT1*XC|v9g1AhSk}#Wcl?kZEMi%e$QVeOzo$7fj<+gzhAqiY4qvUh=!+AGll*~NL zD3Fafti4e0?1kmv!B@Y$WIA%r_3~okBbR$Vg1iTen2((OH6LLj`GAj{5bkF{ka~EV zlx$#7jS+$oSr}j-3F86FOQcIYLDcEy#@?)qkp!TJTz&CJ@SV*eoNWKrBRUx;F_gG0 znHI849#TB+D;c*alV+lL+AK1_NE!FEKw4~EXo1c(n}k*bntndA?6#A2bGtHf%d{G(n8caT7|w}Xr+H3=J4{xi(4vN zsFzoq{VX4u2nk~B=Gqbx&S_6TNWe$_H$sAwk9!x~P0^IgkUJIklvD+;9+0EXUR>Nx z4ji7i0jP9$E4tt~pnS}E_P^maef)^G1gXP?oX$l&67D}79@2@pV=pCHr7go7sM=^> zmSBE`m5gGUOzkEs1zNgFs!WmEz{YhVJk>xmriQeDSeK)=s-2041|(xQ2NSuq^deW*9I&bH-V;6 zuA2f!l)A3N0wdL!6gWqT4KJ+HbZj>*Yhmq$BOsY_~MvG5iJGV(10d zI#;H%Jt0BWyxI~H1jY?B5_?M)jkq5Fz&BPt#7)omCWGa&thj$v zFvHtPM$7P)ODh@oQeZhr0osOarGS&*FeVoQe1cbmu`2?eBcx>JEvq4OMHLD!6hYWi5H6!^gT&P7N=mW*1r#*F<=GMXh*ex=>ka9>FR zdG0f22P6fQYo$O{Qn3|FA(Ml=p3(D8Q|PpstHPB2$W!r&pFvcbAdE!YMse(yWgJDZ z|8%j65T}vviCCjz%C_dqqDDrmc0<2fh#VpXE2W{866{wBIM#g19UcmHnWn9jsL;qA z5B#Q7xA%Pnjm4rQKMx4;nWG$4$2iXmyO0^rd zQYxS#Wvi4-LC{$W6d`h((mGI^7Ibr%)k==06q+`qdLHb7GK^|u>nIN6I9SK!Dgks0 zu{KAA6INLOVJQ^&k64mDTKi!*AZ#kalU7Or$y3jaLILU^bkcb#n<`!M4FzgrD0%R{ z*1422WxuJGyX1jrUs@kwyLq8tf8hnf2i4}}n%6M`5%Aa#LHKwryoH`Uw!ip!ttL3;p^87 zRiNDbtavsQsYLvud$0Vc0~mKqQ*NuL7}nD*Q#X zUdK;YzF7H@7wa;wbr`G?%8q^%v9F|3^alC*@Zmg@nKoLn6CK6z!ss~g!IBV3apksh-aAzQzHCO5>3)OcvGKDA0@KuDS}K`>GZ+r< zWfqx)lZT@wA7OLPM`*2&P!HpnY8`;X<;o~LZxkrQA%Ho>(uP3$4fl&bn^*}Ejfs_9 zl1cCrfW$wF8AkK)$G1NopPgMYE3rL_d#ohw-cMT<93!i#mFP&mrUnf$eK?1PVfg|e z@f!gg)kgll!}Omx{tYZYe6arcCC(;tOX(OGa#&g<30kIiW>4?FmWI4#Rck!%Br*P4 zWkmya4JBY1e=+7oSdo>LO9JaC>$>?k?v~1um&!mR;Pq1ajT*`~ z-H>?JM;NS+u+1LzK6`B57YK4MRfB`)9q}ur)^dLL`N;IyR8ai;gqSXdCrYmiMpOziRVzG5TAqvaw}s;zxOdA zXd{xLM7cahilrROmH?0>D4|5Aumq6!f$oo0h_sN^V2TYZ#uAEA4Pqw^O}5EsZ)&2P z3ITwE*bB?}H_5!LMFJC{+qfIu|#5Y5(bbu6IkNk$sNrQ9vECu_RSK zRCTj~T*}2)K0?nv0y3MJ41=5ugS>0(HihihUw=J0xjQ83@PeR(iMZ7C||gykRIYK0Bnmz z6s^3Y*sP8qMdG6v%;yN2L^VEw*63OoglFM-mG(WYO3iD<%STyxLMEwUzW{5+^D^rf zjHAf=Y+l|^A1>0wU!)J+3sD+ljf7XPPU!~I0FpX?zx~DrHIRfn`QyXIj+lHTB893A(N8Ty1Bd@-{6Y()C9lL@0Tq6t z|8M|E`p#IsxV7O+P~)U07RpJ2^1FEa`1o)@My=*hhC9ALKIHpN%4PuyDDiz(E2)?_ zt^(ngO~MnTO7}^LI2H38(2mOirBj-)sZ^U&6ERdW?&DIZMd%-`p9ZT%9IV#f3Ng8; zsu(3Rir6j)Tv-Hyj2M$GVZDjO@s(+jQAO)icC8%Xy%dhHenGW$mde&3O%$RLB|qP1 z&Pc8y>XS~~?S2H*|19G*K_=v@yTfCE`5SIddwKFKJ1wZkRj5sLVq4lprfi{oP`-oq#0pS3K;Ce?D;X4c(#zcI7fFq<{Sj_+rB zrj@%PzTeHN5?m*B#azD0@|o^k*YCOl|2TiRt}Bx_Sv_uyA6C8bS}_VY^gU-CM@}4S zpt+94`sgUGs`YvuH4Ugx?EC8|jw%tFK!!^Z0Fzmd8Y#mNB5)wWlekXq9hk9x;1@J~ z(mHuDH%Uw5)1KLyjYzz3b>{O2h5;p)-pI79kzB!gfE-dQ4&2NC#S5fYK*M03Pt@cm zE|mNsA~3l)Q93(4%+cZ-eptQBuiFW9H&kuzcWe)hx`Up^Z zM?$$mAFUSaRkV6qtzj1w3$-W~Y3tR4k<#uuP;cJANbEf?NIGe{;-D;5f1KK_;B5rzpv37Zw1=Pmho z$1hHSTlPMi}QB=z% z&r|X&1BWFJK*A69Sn^?`^4n>efq=tv6o&*Q4m`pC9+RRXLUx!+PZF)~_R5gkgSD)E zzSdz^%g$Hj@Fp1(cHIrMQHo167$9a0e1Vx#1)y|`xnvizR~sMZGF(MP*o#6)7zX*Q?_J;Ts){@$`uuLozNLsnro|VYw*itrF~bCgK#~Fh0dYu&Etto2U?tq$5jnB$5>|`ls%mt$oxvg* z*ec-hgcl!al!2g`Fx%^o{lT^LVh6kpUCODfEBW2<@dO)4NRS*JaxZ8;SG80Ewg?pC zrZ349xKHQxN8H~HEApwiQalmm|0#*g^F1%4B!ih5< zs8#+-JzcNdBo?4N>-Et(IC2+$w2ojGz!1_cyxPUe2Zi-LvVQ%{Yyuq*FU^>Xz|lLu zz#Z^j;<#kOhVpIdF`H>5kl}w$AUc3msb*|99@D+SPEaX{LJ;veMu@&WwE=nwDDNN^ zIVSn|24HSKx_d~HO~mfs9ZtVRQL)=ms_p(Zr`-)ER#Ifsbb=j{{KVifkU(-Oll!2= zfewrvq@}YNNzSN*Ghu3vC&w1b$A_0tWX$#pkCmZ2PmMsq8=HpNeg-nx7p>~ubTEjq zF;`Vp&vjNS&n=KWdkKnS3!@KG>TrK3$+-gp_adMRM* z_sr^@Dosi0Y2AAwk*xHRgW9?RV_$-&kXs-iSaj(pAhas%k?e%j#zUQ?IdGT*0CDy7 zslnF;KqajyR_;o#qbhdY*sDCH^~@CrCr?UREd5Zrm6Wtt#<^~5mAmk5$SF1sG>JdS$3MA zWU2`y8BR9UIlI|LiLI2!!187yrV>TbjN7ej&a@XWfseYMNZE~~oK3lvn5>2L_4N21 z+BEy=*y;SqqW$Nzrbvod9`@wLlcs*y1l*E(bC1+FJ-iV|N)mL&pi&y$LW{JHs?0`~ zlCfu{XY`~1D{B1mP2e?bSLp?Svswu!3<*MyY=Onm`Y0Ah(bK1H7|56`^#DpUT)|au z{7qN}l%8QB`La*aGLeppL~DGXaD+%2M>p@&w3O0Osv5NqfP1f?Od;|lo!62wMc3iI z>w+_dpbN6j=d}=(cL~^lgoP3{l4T-c0x<$CDbe2Tui}8BHX+H8@D0B6!L;X)kGs1) zL9ydccH@a-_xwE=NZC!KTp`-n2(ZCvzcH2o{sc2A`{`KjzntA#1q%E)*HUI+D6#ko zaQb{^dZm0v6&fO}p~3d0lnJ8~ zqr0vPxmzu%5K8OZt3+;BOPL7H6plz#m*rkBI8$s>i0d|0Ie7Ps0Zt)g7C|v0oLF-} zQF3TfcLd*<#3I;Eh;rQRCt_SY%dIO9GU0D_2XbJ#Z9=5N-5*PG4G1pW=mCk91|a zB}{>WO#u@BJE0eJQg#Kq0_2v;msPeDgVI4_r0L{ArIA*~&`7D1G77`c^^R z$iiL3;VSr#qxEWGB0LeS-3Y`dYn?zl!o(V+si(ek?`6^#uoaC;TWLaB(rQsdxp6Z2 z#*ht_roLfcF>RFsxphiTAqAxnrQ5tpMcY*OjYUVmM?XF}rN#){9)uwwX_+aoL>ayP z{E%}1K?;YR5lZ1{y*#8he3;mFevg|rrD&?E5yHu`VLM`SW@k)pc%%WaScu3z$3ZY! zEVsk4x4WjxvwNpw+XyFnemCr>!+COvx@TF0C7kEB*Ee?AEaP5ZldG6GJ-BtF!Rb58 z>F2G=8e>AqLa$3}2tAEb8y=)8Q=|aV6Wr*4s zLt8pgBwcZ2p2`HiPvrZa=aKEBm*7xs8;EcaO_#`0l{)h%Ra99k*cTYJG0vMejn>(c zQUwB6NTso8v?-l~DOE_-mNr$8v1pRr<`UD?p1ixX(fAvp5^;D4f10s;@fH9fApU}M zfG_T`WCDpM6K|Iywt0DXkDMaa8`Vpvu@ffveP6yFcb#TT7)VBvkI#(!ekOW16g`b1 zy|x>FIL|T%`=QUedfxauN)PStw*I93mBI_d@NyhWACKI2G==Gu7PVolgCS)>FUj!G))yjIf#*7Fs2}ks{@(7%oLnoFTe}3TXGJm z_BljR4k?NbHcZ3Gg$hVs(=H1j`S#TvXzN?>AS74fK##xq(UOkyTP7)6(t*r|1WO0J z(jVv>u!ooTpnG0g>Ju!FJCGB6_)Bd%p@Ivh_A=ZRHj7Sxu+UmSy5Q21G3-gs;n9s)m z)RwO;6wH;|w80>&)(nZ)$DUU&mk6iDB3!K`8kS10*1_6)y8aIn*M%RV*R_geX8b7e zBM{NJT(k|A06aj$zl854#vqEarRjUG>o%&6O=)EA+Wi6@UdXfuV-fO$48#pRfc^*0 zC=f+RW|1bdsNYy;Q5Q2s&f=U3h%v~kfDfV)HaayT-!kiY{P@dXvyL;al~!KjEBT&> z^ytTT_Xef`#`gTg$sL+6+07O02237KnCv2QJBIXZHxrH1zaB)g1|Oj0_i(S%H_+x% z!`eSnWwF)%c!8KZYkz6AzcGl`2Rbj!1nE2jotJq-Jy6jdYOfmcLLrf5b0MG}pw>Mv ztE;%rAT}0s1x!(_f<`Q26if|pYl9b7v>8RV;|%t^YIQMy1T8hX%6?ZQy&7}F%cb~z z9I6n@#cjD6-88w@fu>vm12J$K*Gx&o%ZE*n$HU$fG9wV&Y}{ekG&!vbYB+=V9CJLL zJ|Rfo0!e&^e?vPMNltN3xNXQ)^J{*(yL3ygo!wXwPrKUrlKr^rH17&5aqtw<6;9ue z7TH1Pi!Jh37I}t}vD98R5%$(WW2oH>+dK?S?E3W(CZ*>_wO4zs zX#3o+I)~*yl1Pi1j9g)ti|bAXVlr=$E3%=fb)}M_7L-I9$`$jigIHDxn?g%^!3-&v z7B!WYk;MmVkUPl3(-RcRM}OuWOgMQ28c=eT@&Az2K& zVJMWM%UJ8U@D@RMzP&Hukt){un4LmG*Or(j#q?b?#sd-M^o~)fDDlL^1T}T zbPy%f>S(I6nAZmK9}IdJ25;{m7L-M5N){5PkYZDavq-^iQPYsEJg7!)>QlIOL|WOi zft>i}j3=P~mUnyvcn|@+CxavOj43BX-+h95HBnB7`qH~0=lxjGJ02_I40?lY@!x*C zoh$l!u;}71CW|iEAb7l;BTm~!^*i2P8z;TjtUXd!HIs@7< zh=jnWxf{W&LW!j7Qa{)@H2=C<`C5lYhBESn2{WTt)j~w5jz=pU_@N()Rp`2?qm?jG zBz%7pN42bwI1}0$ZF*3xVsHz`owZ)>q;Fc1{|GvE5C;@hA=>x3&H3@{Who~gI9aN>=~5?1yZ%69B0gEz0~#6u9wuc>jfOkr!3;tGey3@fK)8K zbTWlXv(r#@+BixlzKoG{N=O?kZDE%NTz&CaLG=f-Jc`0(QirpX+4UiIHDoSI#<-Dje zA!xmrO;V+}8e%o{lGe*k{+kWSf4q@_yq}iSh|6ijuqpH)jku{o4bikL@|@Gi-W38w z$L!Z3E|_!vJ@c?5(5RKROTr&Mjy*|zKsucVbIYHnF`)-@LZ`OtdAlEPzut|vKbUXd z4!GaEz)#32`2&Stcf~SGb$GDr@%BRP#avb$9FUk(LMf6T#7a$B0OQJg)BK)h3K)B# z7@M(MN>+28@2lT`hxxZ@K}y^3=gbXVL5gySTsaqVh+z#J1&h@>igTP2AUOs`3z3D9 z58Ol)x$Zdnv0n`{ZOT?|LQf)%lmhF{f0_AOAX{kN%KJ{C@9#|^-vcXF08^gndv8muj8^bdG0!nPD#ue(`&DL&tk4J zGViUJ1864GI)Y7IOJhR5Op~H6FL2H>6}{P{y3uYdOdWncd;UkQV%X!26pLlyNzaFg zSFTnmCiDOJBa8s0?~RC%!VPQa%c$OjX^rlZF*H!2R@) zcOC)Mv8fR`Nk1uk|AE3UtCwKyVy?*d5na(|Dxd2h(B<$u-9bf(YEs!^b$7oWd-{`}LY)Vz<%gv7sJu0wAfiDD64e7-}|!C$#W zxJEto#X4Aop5wr+6`wzUhi;MdR9q)UN+ZIe>+#0Mv=(DwkS%Dzq>{X!VGw#bj!Pkm z60eXc^n0q7WD13pM>=V^R(RfleEBk4vMUsfQg%{udGWZ4pu8OavYTaR+6e&fbC0V( zlaF71`I*l@$ME|Dn!4ki&R4TxUk!)RK^sh%4?i3advxEe7J|!=&)5 z;(@{+Sh7`Jx@+YsXt|-*S|xogzyPV2+l@)qjyfab#}p_(wV02j*~KV0#Apv4BHj>h(F89@aQvn&v2fjB8s#Eef7a>!rJrJBKmys-P!Z+ zKV^Pc_HCH2y6V47Rsm)s1T7c=JHOk2q^_#U6uGM%Wsokc_Y-wJrHd+*vPWo|ZMx85 z_+F{TZY%56Ql+RO-E!w3HwqX4$-g2Wh_%0BAOHFn^Um{6%$5GkI}x4Ey>ay~_vh7l z2HlPnp%a4#K-5l$?MK$9@v!}Tm~E;8NNSf;BiFNy+;r4EQ}apTQ_M}$Kby21B-^Cr z|;*U48f6?Jd3b{KE&|jaxTGMU+FGcw<9Wp&SnmTCFpG z;BAt9hfp4^_fsBZtv(>{r=&#E32$DLgN#JNWrWQiBoZWL^q}3wH=W~T4P1jU&@>8; ze&g*!`oYZeFX_jB;sBWN(D%%9KhS<<&v!5wMsRFL&CKQY31bYEAx5P;0!RTyImwG!k?B{c{{w-#@1--+<{rmNbni-2shN zxLj;a@>Tv;VzH7^M~hB05OUvre|!5qu0j1Auf=gzrk)7Wl$Me|6QY!qNoxG1q1kA7 zKb@PDeltV9kmUW;%AfLu9FQ-h%mkS~2d38aN<9pd`O~ra!;J;1BiPCefKCt-mVYq) z_*?$LNd8|7=AW*tbi1dj&cji!{RsMG6-~vG#|~bj^>TG@Htg#DwFINmc5<(^=Nx7s*cZ$t*lS#3?C%s;HN;t}7xj*<0 zDpa)i;|zFw`SSev&CU1E@s^%He|K%N7(;kbMMf82>hA`o3j8qWu{_Q*yyCe5mH=L( zCGh?C7qkSvv{hWU74n6fks~OEz6OBEB;K;EYv<+5wsqP28QA;DD3c6rtsUeG!I{Lc z`7>mNbKfbhynCLY@_OEF1%ZEk{e}6**VOa>(RDREX{_sZm=AC+RM@K3oN@bwH6AYN zt~*g}ayd0ICNRJ-1H`dVIyxMxt)>4zNs_zP^UeVE^t|ns!I52cJzs0R&-?I8>51q{ zCesW>o! zdoh6((+Ink*EV1=z6O@$qV5h_(0)v%{XpW;eNT%_u_fepZ{5)2I+fx^LzH5(sl*>Y zlS8o48hl$F&v&5-8l$kqMAF^kk|v$+K#m27xKDaM{dEB{K0PIt0%rO2^yU8k>uiw0 zV)3cn&rhJwM-MEk<`RV^;S?aHlafaQ2k2iIKggLtg+0Env;igQcEB|XCD1ZY?{*Ix zEX;M?vRIhc)56^7lCZ5KJ%vKpruD-)VY~G{f7U~+w#{ICcnBv&4(dYRY4xe^=s}d# zKYXiJ!Lb1+c6Gq6t5xtY2jMcC&8~i91e!oenQ)FAi8Ke=-cQ0+%lJkUm;gjEfkBlo zbewxDW9Y?>=YoYaMB#z<)2~OK9rI}aEdz$@+7e2fT72kpuWyKi&8NR z1K7qvZVfo@Nk0IhEN}pR|MTC9PlEaP-=_;;;`*L1Sgbx(R@CYsHsi&EUfiu#ku}9q zE`V==SpFYK?R@%xEW##ZW&kCZLQ-DmhMv`L_=>N^kaxh>*1;oD%lo8dVZ)CSd1oCX z)a`Z)fEnJ6-#BjgMcX%q7CGM3#~siQNHn}deJ2~NxQ%~(sDhc@JJqj_!zuyLIGio! z3EzMA;6q00IU>Nxg$mQV(M0iw>mXdV|s*rQ+ApA9oPy=;lEsS&$YH9vb-g z5%t(F)#uA%^+^O5uq3Vk@Hf?`<~{y$z>l$!zzGZC1+nBKRX_+xNSBYlP9FfG$_1Cx z5X(md*-{C9Dl|S&b-6TfL`hwq^0lRid~L)#jR2NwyCXk~JJ==$Eo+V7vSEXCy;!8a zlkM|OiS<;`3 zulvRjt4v_vRL8v7b}EBAJ!4}yOcWj;H~PgmG(u}?vu;Dgh}td>|Ikx)9e3JE!~msa zCh3NfN%XKqskm(?nZ#9@1b4(R&z^>#87gxL2t<95Ytg zdHV2SDS}pC3^Wbag|_OUZ5KmCj7*CW!}AV(O2x&@EMj!$5rg6nrN20l{yM5j&@j67 zTepW)qK67QS$lieJ} zkaV%X13j?##QcaKqC|4YI%OcllAj{3dH6U<8Rsu>$akG04&ee_qliOR7DYh1U+aX}i?q2l*fnv-a{>QNZW`&4Ze$vRiYRp~S)B<(Wfc|7gHs(im8Xk~ z!bM?Y2OtagM#;``Rs7vhi(D&Qly~kN2i^!90I1&y<#<37pnYt5*u-q&&t}w$T5has zVdUDmsar(E(6jv!1wJn;Ru@v@nMI67I7=lVQ%R7dlB}c>-?set2=Jv~l7R!sogMu8 zKhBDf#RBwImgI%317OL1gBkdU#Tr{Qxc4Pa4`a@&#_}1KDpwLn=>n4zlDn-ayhFOyCSCJ7#iDIP-Z6*W;Sg+n z*sJSpAFQk`Y#sVey`O1Y*({a1JGdl7$q6vIN8N%{NBgQg0mgnMBZ&0F&T(!?xi3I(Qf3MY3H!5c3yN^- z7!+Bz!U!P)5|2F!5i&+r5N<;HYc_RDiz1{}mtrv$zERLw@~r6N(Zp7J>!4_;NE8n@SYT#o`BARv^&CDC+AAZLp)m#f5Pj~Vvr zOYkwllCMNy7HHw(yya(jB2~NbDB}3@4S5l9K*~thMBd3wV@1j`Efn~@eyACZhMur> z&yy|rj+G7SfD%gGbE?!aZNM1;=8J<;VKM-cg>yC+ZR|ju8h@1;nlA`OEC~zjcdC{0 z<(d_s7^fw284{8--V2}OGy}~w?ile zNiGS}T;ewq?eBKu<44K^3QUYW#shwn-w7q0@pT1CA0(K{5#^d_CVqNwaLN*NHkCq? z0_*u1AP9xT5;#PvgO{mZcQ#`JVu`oXxP!W>AS*#~W8*J=D2OpAV7cUg?0i3-B94aq z7Z|NLpon8a-f8HNcU(P0T|c#g0LZmkkasvkholVRvfrgm#Kd(6>^W=_d)&sK%Cmc<#uW_$*RYO%*UK1ODJ68EWpkPHE z4~@l$y4-owH=}CxlNBoiVjtVCy!9ab{&@Fn}88EGTso#7cyj zr;2klF63+Zb0GQW-<( zdQqz|kj+iL?Ut1&JP>}t38NqeeKcZ`gby1%osw|Qj@yAqJS`)RnM_3CV=`f42#U7s z6~vwXP!25vHBkumu(ltBa}Y^&+HRo+UCfelt=3}7#Pxj61T-l*gaO|pf`F_rD|hfg zwUwj?#nc2Bgjk+h5iez7n{0ut$x4sN%6AF_!PVHPyN2w#$03hmWc!^KMV$7q9oJnY z;>3xF(}5P<_afv;v}1IR>-8qL3=Q9gJ#^ZZZ|U0RoikVJCQ7Nh2d_9f0xn1J$=Z4C zoKRj~FK_%fIoW0gg4M!w1PkipMjWi#l} zrjnRpshHt;A!0`Go0ySl`BeBI@f`L<`-3Y|;)|J0biLQ-CX=EcYg}ly*rWT61<3?U zl`*$PmK@TQZnN=l*~;;oURgaI_wvQ7)wg-n^9(3jQ!~IXOeZF z?+T*pUmmNDQtB#7sdGfB`{H1Y*8maz5=pux#b!J* zK`6`R?MJ+jHt=wFS9yMAAe&~!Zde#3?IC8^Nz8!m&v4R3%wW*ap$Ruo-56B()>DNK zcXXH8#GabWCfpM6*7fBAA{Vzh6qbOCPDvzrlo^YB@ZqPL8nGzyyatokNy=o#R8^>^ zTWSZbtE&WNthHrIU%lNwX3mI+zi&5@P5>?N-vE@@ z0z{BSj@($|P=bdCxaJX@64$JFfGlz!%g}^OmQyL61&_K;z*GpUYbirH9C^y#`NKnn zR5B|PkZ~#eX41Lk zrkf#Xw89}WC=Ad_gGRKd@KNG3>wrD8m`-F*AR3NYUaYZ%fDi8Q<9C@4vUhZZNfEgI ziAE1{T)p#~BTzh238 zxZn~oeWv$tu1Of``badKQAni*8V(tm>*-lCvRuaPkaxM{UEyYniBZ=z8w-rwwrMoL zKUmT26%_O6Yyy<%pm4rc9Z};dW4aUy+REMc!bPcs_?oBFm6FL9dB(Ky!{oWJEN1y9 z#;N?1M_}N(AfM&()5GcDnHGW^MJe~IvJlz^qwT=ZGaZb}iyD6*Xy`)(jrKGQr|qy# zZO$-M&=@I&uMLH7+P-ZgpST8-#&N6PH;gcpd?H$!>;cNzXGxC98TM^rsrDI(J6Og|YlDtawSGt<=OMEB7)G5?-f=HkgBoi#* zp!4Y@`0hZv5)H?7Nyu`3;ISnXV%VFIN$A>bAEpYWYI#T$~bMoox}z%R>GK%8O4gEYB_r z3gIo@IsqjrLo6Q5oOlF=>GzxiLNPNsE0-eAnJ&8}a;&U!ML)ugg9&oUC@811_ z8DN})xlq1}yQ;dV=V_WflFoVVo_Z;ezz#@?vr+e9Ju7~>!R^z?ZBeM{L#PqtNk>v& z7D6c@8s9ezx9z*saLBqy$YK(*P!TfHt~O{F30dS?LnuH)A>`=6(tHqrsrRPWvv0tb z+|V*JXsN3>lW%t~&VVeWDuSCRb)vbhq2wu`;<-4NqUY_|{w}-{b!guQQ7p0is66O`=8*3STyI zV{Xd1HnWD!tTANPK#0vEYv2xg_`v@dNu}`N5K2)y5no08K>>vF1r-;Oq$gs{6+5c0 zX_n-@d0nfZJv`L9UQX9pS+m#1_u)+fr64m)lgmkrl{OqXQb7qv({AL;meY``X0j!2 ziMEQ@tV`$H@Q2iJ>eO(^t%Em#4bw2KQEwOx&BjnC{<#JSdGAdo6L_JOwKIXMy#PsR zsY4)i1{B=5Z9E3UuQ*T3$a_+~qMRX==exUaS6BD{MAf*E?IY3cDC8kgBVWGbN~7xBF%_0c z#Kl!A1UlN6!I#_rn4^BL`(PB zR>4Lb^05f4tA!tP-E7A7L+~-OZf_csb;mrNWf&aGqut(8!!w(?T+BCu9O9p=oBd{^ zm3^)_6k;flPVOGyKU@^tsGBaAcQ!7-C@%Wu@cf zZ0LAM8`$8AhqiGuW!mtVHhN4OIp0Itpv0Gj#K*J&D3xya@I>tu@q`-ewm9bY(Gg0Y z@;h1YQ^(|o-}91r#$>Uf#Ut*J-rP`(kzO0P7#8Wjl5$ck)!upC%cwRS;Q#q^y$;j} zykt{;;1hg~LQS1Qjm@@-rXpSFW;DSt438R4NDaq=hBq{z;kDLrE7puws^Qt><0NUe zJFjK4>ui-v*P#;>c253%0!mpb z!7H~`0p#k|{_a^xump^tB+I}Ol5A=s5g2n#k?9$2|iPrMaHtn=nSf5IUY|;51&OnWE#F zMvjT4Cq2KWIbz;0kvAyu`AjLD;0?nmGN$NtC~5^mDtLHAKl;0OWh}tBSiAo3`}dU6 z1<6Ine6OC!j-kdLcwbs=lCu%(aiYW)(uL>Uy3%P_SI?SlOh8qP1$gmDcq0HU{6(QA z^O|$DT3+l~mgZX!nwz-QH#@epRiM(rt&yjN7D+er4{jk?X!Rg4qR)4O3R>eFSyi;n zp*4>Aay+KqcC=iOatF!)_ywz11lQfI-7SE&is4Id-(GV9*@@`LtJ&REYinyCU$6zh zcPYc}l?f$i-s#Q}CE3(O1~bhbnk?;Sn1zzx?zB2aQ+^3ns{P}TvuVb4ttFj$Oeyg~ zO6f7BBtkCS1uF`Y(c9mNA;Ya;_^`GHP{#)cNRug+a7?LXx#|2~@RRjA%Jw3PyxMwT z3!U@OYLlL%Qna!#lL)-Sq}K*IjWyS4lCASR7yURFX3okA=NXt2#SBWMGUk5n`N>PQ7~DpH)*Nh#WK0liS-*j z0*5>m3dY^a1*Sv+;W$bN@=9vTnW~F5g+nIP6irRZ8ko{9O0G?yP1+E_BD^f)9S&4y z892=ncDJV=aG-`8y$o*89(ht*|wOR2GU!mBey< zY|HQPt;cmO8t;o(h>hPuq-T!lr{VsGRogPE&R+J2zfL$TzhQY?Ka|INrd2h!#<+C9lSB1j#Eu1*fx2F&}iT~Ngcf0 zF11r=FKBm_GM#ajxnc*}19N42B&p-+4F8MPwSEOto}7#>Bly?L*q_9~cpPzzC-{2) z^+~>wL&Q7^&NrBdAwBSA2z#E-elQMt_G)&Hq-2j|Kfv1J6wT z5;93+(z9A)nt>3ArAjK}p~ht^(Oji{i-3denppd`p9cFMxQ(vO?S83;qL!_W>!ZzP z-Ebkkjql{LneUT;rwgojh1;;Z+Uk(pJkQZ-5plH>RZI z9(DmPFc8FCn5xQ9*Ft2aVXjyyY>xcxi|)w(vCQ=ZOVaS2uMoUWr_{;GXf#oiAj0cV zkK-tuI6?F+Phg5hay)j0@)TC?bUH+O8B8Y6QQm|t&(CKw^i3Hgdyg(zGFkZ6&w%!S zw#nWVn~kr0)h?bo&Jzz24G1ka6>2I+wpWfE%F(q(Ia(^m1(hSAaxBuEqC%4EuK)KA zxX0|9W256UL_M(L-j;uVuq7@q@Nz)u41Y{TWWP#lmIm3b>0~+kY0P%1eLsz5G1ihc zs7{iG{Z#PDRV7TTl`Whj;lD|cXJppyTAIcQc2qq{j*e~;WL#NRAOh%wH&`yQ>>ET` zj_#3hfx%|=%XQz00Bl56zHE5XS--pi9&7X6#YI=SA4$|6nCqSGjIx*eDg^B^tV}h`ewznm{Vma5Nr|CVmj%KSYWd!P$OwMG8M7W|)1t z1(N;!N5f<-wEy0=$&$&kO;!P>rx$M=?QAwODEeLqz&ZpzhfwRL3c*zR*(#^pFh7TDh*q;w-(U!4LFt3-PJuuCr_k^IWyE zTpOZhn)-aw_1ou=NV?Ul6Jtq(>Y|A^j9C(leAyf!mQtAgFW%`= zSWd@h;WMieHmhp2QVS2MzS0f8w5zjZk>srkKG4dl?QlD%TCcsdZ3l_u!SX(s3jU-h z%T}KPxjtg9|MMqvMQU&R1?)JPL_~FPuOS>PPrkjIjHJlBe-SW6GXCbvCm)q>-}@vC40v<*;_gT%Vcj&tMrN|_IsZ1w@vr-Y42>} zSPLb$kPf-qYGjZ*zYV+mDfqh#C>>SrI6_c5s2wruKdA{hwAM&o(K?BU1R?Fr5}t#X zg)Qwh49D-&m?pz~uqDiTv8=fvTNP=ubGVPio^FD7x?^cPe<*+}X6buOCxPiiW_lwE zvY4dg(#;AsRFw^zBgp9vNmV1o(k4~w^-W%aC+G!MeX!+1gg7dd@Jx-Hi&C+PtLZ${ zzk#P0xuZO2C2Vk3#DSQdnjS|qK(aaVz+CT-uYqWofml19Ob@7T90$?+_c$l_-~W!H zJRkD8YDhh#(Cx@|<2V%W|AX1P!1JPLIvIl&M3+O8(p=48%b7*8Z%wB(!Nj3W);NPx z(Jyx10O+R7T&Q7JN*;%SRS4d*ae8V;U8m3v%1S)Y%hqT|?(DUr2FZPDJ2GpDxB|%t zJQ{%P!J8gz$zc`q6)!kp5==%vHhkT0$Zj))R6A!&6oZ%M(GHh1Su$+a44cK`%woF5 z7E_YF5zC_2iS3QRoR@tphrZ}7ol$M}+{ZUR&{ zn&5O*6rQnTT}Dd#Ln>xWFPr#)1|d)GpMS#a2mo)wj3k;ymtTGLfMm~clK{ycI;AlV ztSSJJP%z3}m^YcIcIGb&WS!DQbt+m9lhimJBR(L6Qqz zd*l?ZmtnP^!p(9CT3bFgCV#{0{UyfZ7OhwPO0zoHm=1r(?1;-+^h|lCXUa8O;<%3m z{SRrH0K zy2w|43Tvu`&U6E2r?8;;9CN?cc@f0gMV=2^{spKVUz1xPay{9Xm@mgzj`1GV-C@J} z@AHrIx9^Eg^$@Y^ScDVh#ZK&nK2G|dW4y;~JQ)vRON6$QApVLN@7Zj2yhpO=l*aBV zQ-HC83GaG!dX=lZ*yzkxDDvpFS}c^xmEZSXny*#~#Y3qraV?@;hzE6LOs zS=K4}l}9zLYjJavr|UwjGha&&CSSvpq7xl(#B!jutCf3o3?KU#s9{aAg9pr&G0!(x zlT&8=F~U)U>gIDEu4;CyzkNH0DShn@iGbi|!(e`AXIY&5_;Cc}GY%Lnff#&sb&O74 zyqwOSof5CJ8~V^H{RyqoEWQ-JOk$l1byg{e$Hk`P6Kt$_@G*YghT@Sp%t6YM;sJ|p z^DV_gIu67G8G-k5SxG3`%JSOw-8*YGyD)KybmTE4FxPv){>Yf6Njy9d7>vAeOv}_^ z-&>2t<6RUliRn5M7xe|_-YjS}Iry^wp|9P3UB6^M-3oU={WztPLZs=%h4xV+IjXe4 zN-Sf)6{4zJ1U5Pxf#?qbP&#>{!)B4+L%dZyfTVA~(wu>D~p8n_6p8BY(yB3+}xfz??fqauuB zM%52=(`heDQ#i~#aIpf@qob+{WVo%ADz$>aRSUBPBEQgS>2F>BvprWf>CKI3RZ*8^ z5UVTN((p6`)Q*Yi45P!v9JWLXG9}WXJ@wo7_mIiY@9*J4X)5kYhXakrBWU6@Wpgup z>+kcs`5kBHpT~$|Nn|h81Oql{6xxT7Q6G9^f2O2o`9yB})C%;jSiSLJMfNcZgz3Fe+WvHO?^>^f+(2{YBHvaU-TESw z(T=8MP4T1cbNv@vKF}+`8Z(TFhATkxOSsl}GKq&{9OMWiVn_G=^ZD(2u1OwcG{KUc zcmO?b-`-;yvoPnw?Ck_qO+#eI;c!ZG&G6$4k_Cn*utPiaf598T2f&g;UwJZFKkh6(^Btn2e_CMjk{A-7&4)9q-S7U(=5(B#&O$KxpX4whTf(KRI7qEFIPq9Z=^q} zmO#^y&@rDY;G(d-NStkt;84k7t4E^~W6O8sX>hFwb*@gxcaD#LIHpWuRgOkeUj>0O zry0$ELrbtZ$L|g+kL`2sCgCUqW5=!D<3uGgCPWXt*_+5@>&KLFF0V! zS1_BkleMLxuO_dw_~&3t!XIsVZxi<3Haw0a-#P}xl@`Ti7R4PkWu@~&hl5jiW)qWT zaT`7fVZjy$ePdKt^m&T8J5`usT_Tzk!)M@Fr9g=QY3@`#Vg za0I=ZL_GZu=Mr#yZ_qnBneE{NBlur4i*)}EM?Bi22@o06(02+!kw2wu2E)nMUteGI z^L&Q!?0jYx<~_Wt$zS7Slz}SvRWCcrM?v}UgBx*ik*1W7APiyVvQ%fSgn|T6O+ooM zgMPR{-gr```pv%5r{I}U&im;nYfBh&Z%exx&3LdM_0k&CS~9hD;KcUccHCa?5XHe~ z?@^qFag;JK5xN1Zh2)%T=G>~(>~N@h-M1a*j*cA8F)gkLjGG=vPHS*FsQ}}&^fz65 zmMuH)tgFOY`<`AVX#mvj0=^_GPu6AC_uHLlYaw#vJ>FojRBaV(E4k2tBS#r>iIBFO zoj>QE9#dZCqGTRu>Qvqoo)vi|j~@7Dj`QEW74WR8~KB)Q`sMhxm(rcm~QQ;I%CEy?F7{Pd~kW{o>bOY0KGz2R+#G!I+0@T+|E3 zo{~|{x_32Gj78z>w>Ij`ptvMk+P#gn_h!k0u-pgCRmtkKr#dR4#}*fecYQ_zR6QwO z&{)jXebX?X$`I}F-pI8+Q^>ts5tneZE2Ut2S1tn~Voxpc4^Dlr2urz!0=ZR^DAl={ z^jclYU0%nbm(`vc4q?k{P*t?;@Ga$lo1GBWV2no)N+Edk08DuY+o1r)%<&%fyhjp= zZKQ8`I3OR#K-1p-##v+Xe_;zndS6{#l9C z#SfA;4vO3(h+C|^HT7d#N+*h-AG%ltt@7I-hkgXbQjWsq%3HQV#KP)_OJ3Uy1bJ#w+YAOjeGS(x^k3l_oWQwE>iM)rzL{>g2?2b~6$)h-_IK6z4c^ zD%0PvIx=%@(_l`@4<9i1@@2)&xYa{v9On{Gen85!P#0^mIDgToZBdcGXKfm+5+tB) zsC5{6a-aegOA44k z6p&g*6p&yYLqL`e1jJ8_fLw@!fNTL}rQB*lS>srZEn(9a_yxr@DdwTZg?Q&n;4>44 z2$Nejw2eO9-Z5=)#BD@zRW%r7nc5J=WfsM)m)gwrvdZdgpuD1Ce}nCCNnGD&XB>B` z)q{b@`*c&(($Q|-c^~4+sViUU-0RkHzSKxiRjk1i*6TD%gJ8XmB|?I1oq3x9NG3eH zzhL_lVycA>72XyteN-F^aMMqqs^7qn%s>ouC32fE`JYa3@$CG$IWvq606Z@24-9si zvw!%PUvOwAjuZn{{RBh9=69T>RI*|GTV$S|H;KUgE+bY;5XTgGYdZgAN zLRf`4Sr)l&wZ9f(lY1rN9qEliMn~Dummv*@vUFmdEsc&q z5_<{nLkB_+k_c;)s@3oypz|3$h?U-hfSn}F)=kxo+yoDDBFc&{zXXI|(oGUfUQEJy zQatIg{KFkA(S0#CX5h-5-Lf;IWoJe-%59`Wx9DHpuXbuRSD&(kA+TlNjK+8A9=;Gf z=u@Q77gZ>5iMI=?vD0+PcdT%!s%aypD+bN&s_wPvda=N%my)_iqP4J@wJsBcQi?>H zOeSe$8dz7QVp+x8dTp~P>*q6LNPD;-l}3}gDf_Tc9$8K-EbKD`lR3C2#hm=n`O~ME z+wymC8>$0uKfn({dk2#D?y;`z`uc|-fF)mlc>d#COcHy}A}P*JP)vD2!1Gya=zm_4 z4Rw4J-)RrZ!j`!dGD`~4SQDpa7d*)H#DnP3gP75S*x*5uDDfUdFTDp@4jDaQ2QWth z3seCme=49Bu>443ulKLne!+d&_~_V~u|b#-MSiK(bjjMc&eui8G=5)w)u?nqDbClh zY?IoTFo+f2L0{w!-k`YFwJ|l-SkH)8dNtEpCb!d#5D?yFwn*1?JB@WZkDN$#aVrzq zWLZ*hg^Nj~Xx7F=Q52`>W9%B1#8y%Z6|Ga5W*r<&k!F?~QoX3k=}`db|4?)-VOm)q znXx_+iDa8Uc!KUEhKdl{n)1HS+D`QNUuetYmarm8%7a(&GtiYl?dYEX$#P|Z94?i|&%+?$J2gavl6=JgWk&O|Du%sQ1-lia|Ah;F0$Ix#!X z^7ct%tx~aCE%6w-%)Yl4-L~uc;c})Gq@mk`C`$l6f%RDOit>{WKqJQ?(K%uXT_mI^PpCM(vyv4({e3|gOYfkfX=8_4U3iGt#a`WD~9 zEPAoW5$OAP89hErW54^@7%7uQYVgQn9~*1Qs%#cpo0g2Vmr7+)3g+`2^d5CajXgvJ6@sNd0?P7 zZ6787*VkAl$oWU)LPNV5R#(G~K15w4YCRSWpqZsny%u6!?Qi4z7-fQt9KsB*xPCgL z8hc+tjn(nl{T`!{R+$h=xkhXfNf*+?hpcs{R&iCq7fn@w@bqHB zYyS1G{{hcQeD7G+040p39&-K_S!QyJXaZp?+MO5GS%eye&Mt%C8jVe=am=|vn6Q&> zY+viXn%{O&pZbQg`vSda#_*lz!}t&DI{xdegdRTyak8)5N~W>YnT%VbwtA7aS*F{J zmmA0yhGx;)WtO#VG;6ixi`w=UC#9~%t(mE;u&a5tJPdT@$Q_oWa>E8Bwk(LQ1)r?! z@y*;%IKe7jYCN!@7<}``;3kLJ(NCY?xq9~lh88`Co5YBtw-=xJ(KSx73@F#6us9!b zERyBsGe7eOk2eUm&y_50GcoTXRnIkjNS%5gvIst8AACp>e27W}eMmAhAWF&fVYjY> z4`JrkL-*0e1dPXvIr5x?tWKJF=4qy6q!Fu{LOzvwL1jKVWAST)ZZn$pzJ(wq#2~ox zRCShO>{%^M)JwTL6Z2Z^dNJRNt)}8iIxHp5fCL?$;o2kEq8vX<3;(artWLGHeN>5s zOKeg0LKIo%Y?+y+ws>MBy216jwRCPaOJpjPb26!{ouhq~cX1r(I!<)`C3{BEwZPTM zVH2&(R#Rix0*d*i_nu((4Y(=BNL*h%0+Q5i{Adn8jqmCTQ;r6tS+Nc@FH8c$jJsF> zQZp3EPRcCoXXP9@Zrq^&|H&uq#^M1RR7uxBcg<*R+Ekd>2)73vu+IAs9a~$L#%h*Q z1Rv7jG;8`0N$uSdu+cqI9{`p_GQdmEi2!XtlE3G>?+(EvuneI_Ob#jo&#d7jZ$6z4 z%6x>e@Fyh-ElU*6_Dc$`*segq6^?qpk7H(1o1Frx^&Ieh!9j}^&%nNp%@_U*$bAFl zU4R?GRQiayl{lWpWUih%13Tmj)#t2UOtXz!nxagsb#^vSm6-yKww>EqQ3$DYTDgSV zad0It(DlQhk8?8$5d}+u=vrn>e@ zSaR4RkcMduNS+(k$QDwTN+>+^z|VY|1?#Uqd}I*{r63GsF)rTy*US10jDSwWXwq$I z5*wU|4o<`dCt`yW(W+kFT0wf${(*o6du07@Jkcc2B+=Zj zZq@uG)`&oK@T_;92z5~qTwi;^b-oXR>+S7N=&?E@;br;j>y1}j_xykl-v1O+jcsCu zbJ9!~xAGy@-NdjiDvf5wZgFExQB;+&s$NIarg6?XXLM&>+1l6`h+8U|_HDD*TdF3D z$LV6Ka;T<=0kIziyW?1mirKt?=-mg(rk=u8oJ-2wm9B8kSe55Ti@-$6(IV8kWpzXGII8Q~ zI}xHeI1#0@OlrMpwKh69ksO%=Lnji;RHwCfBCl&;a}WhaIsMBJS<<=&CwdxVE|QSi zkG4qyqR9x{2OEg`L$HBRe+M3vBs7gxl01G)-F0(+6kI!yBGo`}jj9y|*HyLN+!vw+ z5!e0fLkzDOg9XeXSK-W)JWJCTSrkrRjW*$DhlV)UJzh#f+Cs1 zW!Fo+UvD=N^jL*V7jF+2s&J*okG?XU`}=-jY5H5proy=#H&b%4I@fotfvRISDCb99 zVj{@(^)+V4eeUOB1}HHkB=c>aTbBs*zxJ3*YIOD0l+ zMPMT3)FdF!vaF2m8a*GqNFTh2g%^>d7ZIfjUPKjc^dh}6!HW=`BbI}lKF}bzOz6=>wL5!5N&%R z=m&Z?QepY<&fLRQ?F;#{h8tMfcbRAI`Q zP6}gkSyir9z3Eq}71n|;RmxH{aZmpdM)QW*yeurn9+g2g#eJL58oEN)I#&u2Vd_Mp zEj%Abyg@d_t>l1P(j6LCPBsmHzkKxa>g5H2B$Q<)Q}E5+#X_mFl+Ll(>%TAwEKuhP z$e+>{RDO%D|CAkFv)XRAeQHeMDq|Gf$TaUtms!`Ex-+h{u`{)^bG4f44crJ=3?u*+ zodZLU*IxkYp#A&>P#*0rsnGu<)!ZU--!t6Eh$d9=A>25d-)FcX_S*<7h%M|9?j!|Q zOwys?x|w=Wbrf8slz|E3s_yrANujlA!WqEBGXVao>Yeg+O2)_*a44-~XRYR+Pm+zz4!9m5Gz8 zh|_`xBuy05)5P}@`ZUT_*c-qwgt{G2#O)-SFJEG#+OWO4gv)iZcYW?m$}*o^ID{de zpPGbFppNxAoa4+y%H_t^wO(hN;6|e0MkL*cu9@`UB^6rdbR(T`qZ^q;YFoE@&k)fU zdJxMIFy7EZSc32P&0jr|J0;HQo#&e3u?}1l5R#9{#^jhq=H`SkilJUlXP#4>{FWv<-~i+<3Nv_IR|;1kpb65!CL0d<#M8xwRvu} z%d5PkP%wcH4CUwlyt?vMl}LsO#QgV&}FA;?L2LXSwWq+pmQ+t(a}pB2#H5lEm3*65L3kLqWU}aq3*((T&(dszgtJ+S+Cf z>pEb`7M~F?%IN{jBj@pY0Vl1T?OzA7`FOu3*_?W^`9({zIRqT(7tvQiQ++sc-DKdp z)KoR4eB9mnuIJ0tZ0m?GQxajl!Wj?|UIt;^U?&Xs|4NBkPr#YLw@LxURpps0gf?1B zQ)DS+RVQ0xjJ8U-+-6P+rQoo1tW+BJI0P}{k@xT4V+9B6in)QoPlf-R-xS8^@xiOy z7OBB??0ab{09vvY7D~{?q5S;nniDcF8H5De%Fy!V%klN|&%lGrys!Cd=!M0lGKF!X zRG7~98>X4lB%CBtaH?>QV6v@&3F#W6(ONv_=Rjx`;3LA>u%A z5Gc?#!FZB;H;~q(EWyoKxU6)5eu6EOV;1etom(X9Krm_ zt9yK2y?Eud9;K|#r70{JV^Ne&PMAg+%g?W_2qNw5rQd(@;8!r7p$!4AbMz)8g`*~K zgtromFKsS3q3<^gIppt5liSIl3Uo2cF}VKaV)IWOP9ls&`e}D zPt!>$t&OrIE9gf+3G&*Q6@o;MqG>?Nq~%G2O(MqT|rX|O&!>nW^HgXr!L0bi;e_qob@pMMWZFj4+Ga0+<-Z7F z7{N>nhcU~X@bwB%Dh8F-TFnz;`V@A%e3ra>hcwEe{QTI1pVh-BDA$?EvMxJ?QG@Q?IM{Qm-NW_?Hi*7uNCeQyzk8 z^H6f8l$4J_w)WBpX(R*4O{QDpsyuahU-o^`^>x8NGs0RrueF0VSYW$oRq_)LK@tn; z+QM2*EDuwb-_dWrc){tsukdm1oIfGXrN-iZnz90vzRh45>%nB!703_C&ZydrjRq9R z-~9Z%C;=tSL{_$i=~P^pq;y}udjFJ@A-_J_1fD3itGsye!gYy^(`BXOjoQR?Btl4` zSz!Jq|wsB%6P*2%?d*x;BN1D2$< zJ6uY`BMS4vo+)QjaP^|oHGF4PXzgq{H+Uee=VlriL))>}Iu_dWE@3(I`HLs;mwwUI zCH3!5UcJDBNlLFcy~JqFodNBqe$;hvm7&exw9kM^uFFFh@-n;+8MEha@EVFhZp~uh zaF$e8QR#8+5e7DW4f*}+Q=9OPm~x(MS!kuEkq~{~fyy=+K$?mM_fA+_%FH^O=mH$f zJS(z%G6j?ZnDW&12k`KDie=D#zC0y8u(s1E#1&Lt7h@qu9M>b^lz7RwVyNVZ>g6tI zsyb+@6j_6&dct!B-R&*3^FV@AnR;P;w>=8$4Mq-3J5^N@Hg{_pW0!U2>Lx9c$%L5@ zo#xIIc)DI!xfXCNQWS}uWF}XLxD*GF_(QPk!5n-!^ZEC{lJdCUG;|Nw5mV|go%bF! zI>R0<@Q<{hP+ZleVxK`MraSf-TwjM38=ku2ejna@s6WV@G}G`=u>Q0Y5RCr(>iw&y zfByPCMz8-6Qf7Yi`imF$zE5Yx(l{+*W3+-1NtC81nOUd3%up7tNL;~jGS51PTuW(U z={<=}fgV8&;Eg%~N|wFR<$VlT@*6Orfm1TD2!wNf69Nl8RC3Jc{bGnZ7+6Gs=6>-J z%{^-a&8=TkSO0=9sjCNJz4yhkzVJ+(FuF3ukT zOFaMY{nt-_Kqdvf2F#@JPF`5+mfFn<)1nS-FLe)4C1cS{wd`9GlCf$6qa9|Hl+KnN z@NF}l`r3fdt>v3Qg5w-NPXbCtCqZ1@1yVUya#VtmMPQu!P|9&LmU2XQS#BRR)w7_h zulKKo*VXmDBhC$Qj^vpa*70+QLU>f>S4zonZsUWJ0NJNQu4sVdyiszP`F-sn!8%rp!(|4T_{ut3t=1QDoJ~i6Pc`ae4Xv z{VOar@KII=imSSA+fqiA}KkYq{Fa}hr zh$5B$Gpsl~?K5~Y^cet3XsXo5L!-f%G9#-YqH)YbaT>cq_eESfVoAaF5<~PcRc*+b zc_d3YnHXaMo>iSv39SgAgvrgroT|JPp*r02jYO$aU4QX;g7LoG)yL-*VmTC7>KvyV7703?^v`QGd5z%Y>9L01>^ zpq)o#z*1B}Sg-uBzA@ApN}1Jqt@UoF(-d&_vCz86`;1A9(xkZou&%*Zrz(|eWl8m7 zu&KhVrg6%)wq?is_SRaQ^Ca(C&YXPz{gbEv@VUhc4(0{4FD}ll6@^NR9=2P`Ja3w@ zkpMO4cl!*O662i&)X$-h9~uopOG%LC_zN%)X>_!1oXaxK_j?Z=;t`iyg`C+ry>!Z| zX3UX{<|<)MMz;$ce2J5=rM!^^PN{<=&nltJu(;O1(k5jBm_m~eupIS)Q!Im#4MN_0 zq?Ju$_NVn4GSq9Zn1d>M2s}b;QANIpHPkBar=kC|bU)gIw>)NN8G|pN{i@D!ab*${B1@jQoRZE)3 zNlz}(fKnC(ivn4d>A-7C@YBD131Z3~pHS8s24%5Pi#>N^ctRcTSg%1|Nm|)uB%PGN zqd+?6hu~t2Jo+d|=kc*tS+ZF9NO42Gdflw1@~EAkjlz1xQxHm-*M540h#R%dnmS9S zu2N~M4M^(}W-(`3HA>H5s7GA%S%aLKxYXU66w z%R5W}q`?oa0YHwc4m*dPGu*8{IU3GLztgSz#!l1X)bG z0*+M&;nc2zsGcNFNkC~5xQA`FuC2r=U}ZWExXj!HL$5LQ8e2oSSAs~w8|7uHOCiXa zG9vJV`uCxcAWUoe@z6=Y)qNplMphJhMowEwE-!7GC|2g+5=pI@)P98rLF|)1Gim+u zCGI3GC~NJqB}iOEGh((&jZ0E*dz)%N7Z*zAidg2raboE)OT}R9OKJc?GG{vZsHhW6 z|D%83^(%i>M7r@=7VSTcv4z?MLp z27ZY$rXYiL=5NEIN+OBW)b|t>1g#hAE&Lf#xx?M@DY3ha1V1t-Mu~tM5a0a1rG)PR zC59}H+NlAF)umOg%U}4lPx$iS0cSRSHt_}OiIfr?QLL?@+sIU>Vv%h~+mUh~bk+vSNcGIx9BXV|amvo1tW53@<=C$MAx| zN2FH*&#J#Go!3D+?^b;4BbmElj!Ehv%;DQv zvZ#cn+9<0yCzL5Mwu~Gb31DEk)YI?W#JUlrI)2wu!r&i?uSO|a3ZzCg{UW@V$S^`Y$!!LQrV8a;QAWA#b?mf8+T(NIG4h-p zBPT5*=L}*#W5Mg?p=aa`$&P14csNr7=<=;;%e)TVyg*P0A?|KK3(RxKy z#8#M^F5za4bGNF}XvGM($blWrYwicrx^FpW_)Ack5c&_|DmW0)8^Vylf_%4gv>Ymw zS7!sYl;VzvzJZ9&x3`A?V=UZ(O&-gUkJ9-p8tCm9$2`PaUP@%PPKwg~Tb_bYl^%tv z^tu*%vtYTvVs2*B)+T^e>l}|WZDy(}?Kxw&0-lvJI4?$YcALQpyiON$Yn9eTvT}5? zGmgIx^UJwY^5^Gh_$k@)!Wb{K}AJ71u#O(R9z3k9FRYJsLplax|EevXW@ z&Rw-&o;m}BMl?3H4`uzDr(m9Bvm!%f`nq#|d^r*sf8x$jE_E@^p@EBmn$~6R_?Ibb zW>^^1Uta#MCj_R|?`^`vf8x3S$&l&@-=9;?wQ&i{pB2(MI=5$CQ6h)U<9KoLZdi-) z26o}+Eapt7#1xsGEjUPPW>V!=iHJpSSW+S<4nb;{<9WtO6-1KAg}Vqy$8G`|*}+pD zlO>0`jKz^#oOLGi7}IBhqV}Q{9X*$V6#cAwP}9?IzgW>XC_1$WeQW+Y_iN?Q76Vaav%2iK_~}$ zyo(gceGU2utQQ8pIb^!@P@FR#$R%a+kz6u}X#V>UBVyG#rE>-`l+MSp^XXWVeu!e` zy{{8mpB4)77$}&7ZKz6DRADyp{hJ#h$y8xaXPM9$XiU){qLgmZ+nX$r^oiD5SmKUt zd0Mxd1)CG_MyDwmtW(@%FpMw9mEYNZoY)uf+t7G262jvkLUDH?o5f5D< zrFo`IaYRVBDb2fyDb*wgns@91CsDpb5iHJVYvC$m9Qqp6Kw1kUo4e_%>$|=z1C-^r z>RD-@0VSdZELj*C3YUjT5}}n~OqK+8c_NcjL_cAd z7^Xj#op-aL5=d;036vp6;*Y_qYHod1x=gDrb{Hgy1SHeWv@Pq@lLVR;US+LXb`;Mu z;MQkuJL_U)vbGhXUTxK5G$-Kvu#bAWvRV7{ag)KgKK4&xe=Oz_f|&4+X`*uSDQok- zbj}jXCy$=8C4@OKq&M#oNjw+dUNDgHSU%-uY(S0YL1-H}PcXU1feUBEktr%;a?R;4 zSZi=xHG41&vX*TYSIQP`q>?mNiUhbO`!&8|Kv1*;l;E*&f+2Wh%`$jT(8~GMV~J1F z9iaX2Aqb=#TOL;oBTjoBkM%i2wqz91j|Dn_a;O6uLl`fe4=IvkfU^k+lrcv#ybZ@- z*|g}!Ua`RdRCz0IOk8i8j`NxOR0zeybR3i3)5+G>)Kw=lIoD|)3)$Z8H8i5QvY1*x zHEtR;()rz>@q&OOeLc$_1jqMhi?Mk^!i~)S5 zCUcdN9>6*7i^_*__84t86ukPV64x_Spz~(}mT8~%Gcd?gdYO)K#I27q9)1*MFk7Ne zJ71$yaXf@Dj9?CB=e`c;J(^oPQ9U=#Llq|7yM;% zGz>)Z)G$<)R;g(_wkv@Z&eT4d8dFAvE`6t9X*0wkAh29B!7@pP|DoPBU>R`bN9ZJI z5<6we_bkZdz1W|~6cnsAu+hd;RhCKXKx^VeZg*X0E$fe3Gf(HMWV2DKs&EYO zeP{P+b9DuAhkJle2GNg`=((2S4K|5bTp-qHWzOHw#6y{T9{UullJ7kLZg@PB7Z=3x z*>Eo}?)~}>yOePwJ(7;8DUr*ZX*YN|Q|5%h-8BqcQE_4zV5h)4*sjE81Fei?`C!y* zTd+;jlq`=nb}0Y&#$yR48_He%7?6;d9P7^;VPB^wwdRz`Nic6IlaB;56yXTI9kM0I zI3vXq{rdoBdkkPgj${a6;=4JLWg!Zj8h)>9T~B4*b!uVM zoSj=zDm+xYVyz*QtQe${E8!Td+K!DTde})Zu6aFdr5GmBzkG=>(1Jl)CLYSd=Shq< z$dlY7_j&sPPV$_bl}H|+&j=mf-}~jAzmj-Z3N5A5yyQ;%rI!=KXkv2LFpMiI-VTO= zqd7TI%UTg_^up-6j&;s5U-nNM<#%NGV%Gsna@22tACU9#;YNm5Ss=;si-f}j?-t=a z4xO)KB=K<-4n_21wgl%O3gUQl6vuCUcLB2?{b8O!jFI0VNq^=jwM<6G>l;2|Z7Mv$uJ^lON@Rdjw zRO3snS!dTc7*zm}v5{xvWPy#eG(u&jYrTKT^%Q1`{b0lgFd%9cJ!=RcKrA(R( zIg4Vdqj;i78VLea$W*yAn=U$y*vQ5zTcmYg-7KWsZmCO4`8YHgJi@T+yDJ68odR6> zOl=*|;7&46LJUeT87OOkC7LLK6dmOR*AY;L2az5crTvc02cP@*oDyL>63#s2LMVZA z){EoC50-(K@nm1kXc>NWD$15(2Zo{9Y>@KzW-i=G*b9a0<{*(Dm*Mo0;-K}hhxPZ_l4CFth3G~87tza@BkA5jlBBUv3{4nIM9P%VuDaAx+G-ICR0k8y67`j!Kr5`YgYl%Bq z8laRvx_API%1ddi0hBo#*AKanvZS~C*I`3A*VWK895+Dwg*BG~P}*g`OWCz1`V_QI z<#?E5RnHLA_&Cy+egMY6dyt=`?+i|oU*R^5PPcSTR50O_$Ra~9apag|FfnFJ0@8$*^ONgs)fWm<;1!0l90Ey%BrAekz6xP}ghf=7ReQ z)<}{_8~O>Tl*WA4c4u+Z@5gm}rhgLJu6If#yIS0DWUoc)rQX|HIFcq)81h2BCm!2@Y6- z@F)Z4vus&`kx1Ef^WT-)G}Dn}-iapoIv_pFj+EUhViKeu3xI}7uQ7N@PqQF+%^3D~ zL9A&oD_x`y{jhZ9hux-}cDrPfB+){0$ifav`%gEFL3HW|^Z;X`E!UxlKcs6w=FU_0iE}l2dYlg}^qT@yP}b z2!sg38NTKLQQpzGr4eLFr(6C1007)q&F2hfwE&I?^5WVuwyN3n)vq4p2s$nF>M=}d z75*Zj9@f66psTndSkluHmLJK9eJdv{qg{FkGMvma)GjRr=}Wz?+ddMVw6oH&02jm3 zvyIOsrlqsQr%qtsr>rXXDp6pk{;tF^S3!b^$%KG@b=Wfd(uN--eCzK#%~`nDT+ROc zw`RWxVGQ#trGNvyJsqaNy%xxtldyQA3@3?YyiguCk5<|f6GXWIP<|Mh6HH+*%_RJ{ zyWif=^BRS)0SgJI0@2ZsY9Z`7{WSdj>S~5EA0a%?_F>VY5MLK=Af%mJn*Iss#{K2_ zFaN~BB$Q=xu%;l3O6yQqXAUOG5{GL_nWuB@JzjQ-M^dl-LMZSh)GOK z4SD3plGarw%!}@;h^{?~CB>A+8JZIu;VDunAKo`bj;IZgrhB51N`PX`_Xg7EeMOmgj7F}9G zlOtf5zGt)K`f{)R9*2zd#E6IZT}4)-CoI3$CIgLHHxOJKjoMR?Qy8|U%NYu#z`eL! zXtQIC{trMBzLUOFZtZ7Ch)~$dg-Af7DUfzqo}1U(?W0HZ7f5N_oGSG_$FnjKIH}Sh zQ?qZ(ZV0m+qF%n-Z|`pKB`!AlY{Hs~bLGbY2jXzRyx62J6Boct#DHU^LLNpm2AK3M zX%I@3@;J0{C|w24!s+ibq*}GCB@5Ps^F6s1ok>qh@bqLMyd8eS7Z=niD}*2MaHT{V zspro-TT=8xU)F!%-;6C`Q4`MoC5l!nas>NPPUSQSzvPw9nr`I^dZOzoFulz8P6b7F zDkw^81VQQsf>mG1)l(4CsJ((UueGL$q;&sMNib!d?qy~Q({Af0C9|Dkv$6Q)HZPec z{q4rTNRxwWUYDiqoB5>-*DpDOz<1lyB5^kGZ7GA8dKs9FX*#~J99|2U^t?iW^WAb9%?qn zG}G{fYbD%;TLKhrH@kyx)8E|@QS=<9gfYpMh*8mz-qbA9xaHcGIHTEIioTP(O~uz%i$fYk(SxsX(ba`M;bK;&OvZ&=y>PMe>QI!H$rUz467jri=mL?pw_x$X@b8u&bziHvy*E=C9O=m;~ z;3@9idd20DnTzNa2PK3eA+)Kbha0V| zOn-8ultCe$B4B1hPuknx((ZQgI{C|+-`bDEZ1ye9Rah6hYp4Q8U7B(D!h>hzLNXqi zY{mD+mcRV`9LD_RXG-vxyV95uwUU34c<7(Cf+sljP<;A0?RLjFWF#q$3#*8H4Y`;_ z5abAR)I*l;^$=wEdI-Z_^)xKc>1J(C;hv_Xa=u(yPVPO+mfWRA1p22WF}u%d9M->P zMS(&DhM$^e)K%$n6&0mT>9|?F=A(xc|K8zCf)s{Q(3nVR)ID=dI?rVBCC#r8HB`=V|i`u<1Q(p;E7Hy37iSE4IV>g_%QwT_g_IN$DxOY9E_V0TBMq!4=0 zJaVcj*ho`Ydp3d~ZKKFgpt56u+R?Da(z?nm=UP}xGlgk=VP9N$-o8#`Xj(Kxs_g_3sKuja?0U_(XaT(;$O8b|4FtqX8aF2om|qCi8O<)E;37N4o9Y6 z0mYJI;6a+A2{k)S(Z3#YF{_g$5TIjy3e{5U)A4JgPdi7b?4-JOtOTZ9ts35ipoX^# z4(!}L$oZnS^rc;1P|AuHky5bbYdFGA=9#dUvS1s*mr+#tGKfOh@)%OQB}j3MFA>p5 z)gZ4)tPsn14fEohDvT8u6A^I{d3F?fH3|vUq(vc-AQTck#nH!DyZ-18sn$FCIN(g0 zw2;)f%#`OZfPG2_hp{LfY9$P4gV^z3`wiCT`^PEhX+8a7kG7zv0+43JlNI{GOru_Tc7E)lV z{!<)DLS7NciIA9=Zkbo0gbL|k;_P|UuPl2MQiVZmmW#v^4FUg+qi=BccLcRss)e)v zmX0Xp3=#3fk)(zM?VCZqsql2=;kSxYnWyWjX(;s>Ba46E+7bs71zINfL3Y3f`hgY_ zEDL;FBjX9okd`Y1lgTRYdB=&WXl27#RrKV`B2hAI1*zIuT4Q-imQK&VPPQDcx9hBE zcvsq_F<53LzCE9FNXpHtdft{pMI`&Q(6q@Sql}ehbM3gxy!1<%+tiBV2_fjxG`9Tk zqQ{pnPx0k@%qE=1fh0LWCDSYA*wN;0<|9m7XtPX;-v}>eJ-LX3DX_#?@Q{LsK zEG@*`R83Metw@AM=t%+US~Pfw?$nefwFRA%Rhr&egR*8 zLdzZvJ168dty_aQb&T-@rsOgbgsdpQHC-W6Q4eK{LQr*VI+WoK-3ER9DIM?b0p*?9 z6X5~t;3!5BfS?~RpNZUa{M2FxndXvNs^SZ2&Bru|dB+`yXC@_YMxz14>wu%A5l! z1%XjIGQO{c?`6JY=^dwC#z|08OR0jtnATBgZ22Ps+1i%BP@aq4$kb&DG)NZ46C4UB z-8P);g~M1^iJ1G%glQ?0Fy|`6nF2;*Lq-Ay?Nkiq}`) zb@&oMYKXkT$r1Cqy84sZ-$TVf4y&VF(BT$^C`it$mQS{4|2sXG+SDIu(-Yohjd+*4EAByiRk?V)g{9Z9 zG+pM7bMM~u^<|&0${#eSFyie4zB%yKaw`;C@)>ROpq@iS)JQ zQzPEdwuiLJp|7JmRTkG))6YJZrib&=bf8UJOLv|ibZQ-#pZU%lcj(T#$NGF!LH9?R z9u7X9`Fz>ut6*t(Lg~98Ui%GaJHDy5l}bfs?z10Q6whW4fhfA&_BcH>h4QN9Q8kbP zWe$Fr2p$ia*KnT~S>B*fj?lSL(yG+RViC4-GwvKx3pQZV9S+@bdj z?<*#DTjL3SCG0Zac&y}JDJm;>vrzJ|{ua*6YWsG#J#+~PzMeIR5YZva$?oW*=*(9vyGPgX>C+(*N9@~FR zx5K5`4y#{f`{zcMyLiLCC{lXn&tCGeO4v!yS z@3b}@mtvj=N=nBKVAZeLbw~6V^?`9h4i?+c> ziH2(ZdX`VV9@Z|9B`1`{jTj4+B`tqjh?PwOd0jkvl+FJzuQcZyThN%zy|=JdLb)Dn z$wDtQwtSvtx+2}1=TcH7n?tqezHtTn@ktx`D5AWnlJ10jSuo3aVTy{(n}umxu{o^C zEOmy(GY*P#mzj1rQW(Y8$sk8jX@E?J(B|@7whA&EiCR)pH1bddnUJ;!nR2EQY@cjN zpFcyJ{{HWO!>4b|qdvy~T4Be$J`XlAHM`la`UW3EwLbqk=9A`7cV5ULX_M#uDHAq6Rn9Wrd)kBjK zNb_?2>=~r?eBD=2_0zJxpe;IaF*LQ+^Q`m2v#-b;z8`|k(mTt$%JN?Ko(}yH+H{~TnWq#oM2Xg8^c_PupZmX2`O zu)AxVf;cY8OzG20f0ju`oq7Un%=LvyR+S@HK)*uHivz8Swp}l^ve1(;>3(WhMB3*K z5emSjx37VtK%(33%a%uB2qExg)8<8+*;B;#s5SuCXlb-w$2EkWHY=o03sCyl*|h zLLL@obPfeodHWU*r6kx$o0f26f7RNI;q>dkbduWYMDWkFy#ZYR13|vVMqr5&Gb(W`J_3HV79yCrz;u*BNFswx?5SiT0~420|EnUse^ zx#q5v2-|g@HLh@LP}!UMX8mB@tU6CsX>aQD35fPR1x@tcb%*cC6*^Npj>$!hU11I4 zWfzbmD$>4ys#J)Q^73Zxk++U?ZpmuexlK|Wqm z{l~|qG~ww}@X5Y3!8imSbNT@&NqVY@qL%hZn)1AWZwp@1#%{)z!~3B+9P-qpLMjh} zYq8(UQcJPA*xB8OEr|w>Y8q)VyAES} z-*hN?8rLhe20OL-rCO%$>MBst)21}x6Zt`3n$S1|_#{q0EJ>m3lm@iLYLW{#QrrzF zoxCZxOMiJtjxPw8BPbPYUkcxLi+w45&B49a4dJvc={vT>U+h)dPc9Q?)v-huHueJH zb^$?XYZx|KW6e3#q=sCc_HT{JCf+xmkZVGhjj3-&n>V^bnkE)w)DPv`o`^!ZHk)*) zt%JHAdlKE^C|HvAHoe6EHaLn3VDPs@t4EL{+ZYVsixGY_s z`#WYOH{K9-o>HqR&F)JJ>d#*Ss>~f<65=cbV^!)N#Ju)}V^?S;!tD}bOfg4_^F)y% zyKsB<0q@VF&5`{4y{&~7~%A|$gPt(^~h_s(o~7Y;G>gO5#Z!u!S{U`Zru0ko+mkJEZ; zw({U_T$BZ8)bFww(~ACvuxZhpZ?CAn#dT%GJ!a?9*MvB8$2GpNXu($N3%3WBV~E)Y zj_rWE6U8~^S(JM?XX>#l;7;sKJ$8lW{iw!z;0hVSv*m)yaCjaKW>kg9;kBuCJkWtx zSRDdWzJMu#u|8t>>+H^xZ-4sfE~dlcG3(LV@vpC&or$pIf6ZpIZ(dxz8~VY=rZ%BL z%{Y@VC0*1J2g(kF3SULE37@8&dfc{0u%f*od>T6CGv3s<_`2cpvUNP>na;Hhg9OmV`U86qA^?uDUggAS~PqUy|flFhlhSe5IWq6LZutd&Uhc<7`Lydf)w4ERT zU(bY)0ml=v$OkcoBH>8KqA}I0Npb+v}C>q^qht2eyne+$<9K7a^uK%q$Gart|%9a5$u@U{p1OKcHg#+@TqZx*EMR!nKVNvOkJ(59e-V@$P-*L z9r*H|lRwT*?vU{v0ff1I<%uAmutzK$@4|OA*SWYBz}1h3zHn>kIEI+>Vd&U=82S++ zN08!6OTe3_y`2u|9OTGYKX-$2o9xW@HPT4!;aV6mzQHpbIpNanq57-a}lV z3;G3V4;qdBJFM{lhcb@Imd*0Z2koXiDm-}i6Sjq5YWKGv@IYa<3$JIE2+asE5(DDN0F)Fn9d&Hd5?!o z@*AEP6t9{}fd~JIAE5iPUVe$Sw1z#_>o2iZ3y1cHc;pCIjUyo0153uS$qmGmE(~Q9 zd5Yz^y^;S%+SmQWbu8cR`Gf%s1Y;ObY~tU;k?%uZuKZy95?QhUZa|U0jx;mO7ho~N z5Ih(JLm>G7f4f!H)q8by?@h@4b&k*AXoDhFb?@q0t5(fBM8ADI{`Qi5VPX_6m&{f_ zH7J1@wf}S4$-q%YvG8xN33woj>k5++$!sCi`oN$x7M`y{{aGFhlUD!F)2!LP=yC7c z>*YynpN0t3nZ0cP#^nFr9>4geQ-|aaVma<;F~av$;rs3FArIN3hs5dkYT?IUvdPx| z|9vJ9W+ap3VA{2cBm}Kods-657 zUM~xKNm|!)S}U}sv>cK@faKX3Yg>8Z6Ja@>-LUY$jlU!$H|ccUdM*&CG{7_cctXfz zr_No}0~)5;9`9`R>b2geem!_qd-Ht4;9n9n2l8S-iR*|oqomXR*6g<$RL`k*u4^WF zL@@k|i$od>nO-$*Spm#tY2BfWrT(+L##B;oTq@?V*;17LW7~}*g0k7J4VyW8=}1U= z4emKGZf~h1OHiy36py^aUT^)+)~4*sA8ux$4lQJpt>4l>pcMoHQ<>bXKw;CU)4Q^B zQln7XuN@s#pZeX4GFl1=K`e3EdQ%@R*Lv+H@mi;Y%2W1Lv&*uK;l(5+qbUz?Fl13x zp^TX-h6X898);ZIWvDVIDV>>a+D<+$D;Hx4TemM22s@^t|~lVVX`bW z9zZad2a1LC>AoM=Iuj~Y9UrxaugBGWVhdS_`WtC>NVM~g8ZY^nyuZJ?VwU-qcxEmM z(Bk_eNujHUyf3f3lP`^gWh8%Hi333w?^6u~+W1OP@?dtF@03;BJka@Rsa`vZ5`tP8 zS0Nd}#A#eExgD77a4+9%fUZtC$|M-dNJ>o)Z7^j1qFGo}&;n9ib@(?GCR7uH2TIC~ zv1Fm1k$E*wk)|%@3XA0EzWI8E)&ng%3h()AF1ryrx16%j@~F_ayyks*bM9Q5S7lHB zMuD)B1_DI_|4qJ|>wRq{DBHxz5R^o)^4z9QmUXkPyaYT|QAkUL838md&G8A*)s(0r zBcKOLh^rEkvgE3uM}sLql`xaV1*Ty^)uE84R;=y5FOe+RU>G&1BV$xQK5A8{S!2Rl z!Lu`m<^A;R?);}fxmf)C$>$}*;I17k$6~XW!^3sL(oHgTNa}YZ5NQ3RwTDQU(Z6;C z<$x#Rva`wjh=kdEI>@2Dqqb$R|+m>vRan?KrnV^*k( zE~zP`EOlI9k_QTD>cU`vB%wGM`V|tXFB1>lZdJGqb(vDlGscgO#_9PTAxLXMOHaq! zM_Pg;Ep}YuH1_81{+^NCeA{TAX(Uh}uoka85*$IfwMD(@n!uR=<1ZCEao7K639ZGBV86UWusnDQs4)Q>q}`c0PBAUhF(!H;ACi321m=4 z#{O`~^~?%iI%o@Vf^yG$i8E2=lKGS8$WEsYNzrAENQAz{sm~Q5$s-eYb`S~E`@8dJ zBf%4t)FZM*mZv9|*Mm-1S*aH)+ZbzkPju<%I&pOMaUc0%DMu*}q$FjbgNtHKU}vVH zP{d58mOmbAOHB@5z)jAJij8T<1Y@lyLu+{K2kbOPd~NXW#T7=97H2U0c}I)oJPt{b z*3sP1t;VNMge4*Qc5{E`KV<@VE)9UOVk^&XBTFMfst5PxR|#_ct6| zJY`+0UF+bofTSVSITn$W8;RyMOZ#o830(qbcsXm;Ot zYIjL}$XCGIJX>{0ayCl8d0Gw&!dQ?LWU2h!*jXhk2}#tdT(?8p;wxc_1aEH5xLlCnN=hl!R8S zO?4@@lLgi&FQv6cyYcyfl&H2uG+jux{^AN-aC2}-vhK=ZdCL&f%8{H-f1MCBw)Xem zhkOh9*O9=|%>h-Us9e!)O}-T|lxc#P3YwITZZtqqGS+FmWZxVvHSZOLFsOSoTo5)KUw7}Sk7iZl1o3c zDJx!o%^1tKZ$~2^3G(ePi-ak8Uh&SXjsG*Bl8P-rV6iTusZAk~i%Tg_ZLppr8cNE_^N@%p zk+NXPwYKS$bIrXyJ`?Zm92R$X4vTX}m5)(^k|CXucNUuf>9@1e=bj;cER2LS6ee^F z-*`p8w$3x!wK#1^8Ay3k1ksSDh>$Xt@zL{tAfz)?6JoN7iN)vi?}D`vz+383u|{#J zkcYNJby`;DXt=)o{F$*7nKFSXO612oUH(Mmtx5+aqr%C}j4`3F=N0lq(r-VTYA6&% z0=FWhp-`W5Q)H!Fu!J{7Ns0*P4T**{D~P3xDIaY~$|Og0;gFfaQA|SH$`LF)4)Kc^0en~ z47Es{V77kY;V{ThH!`(^SlnLDJf=0}S5Y)1JhX|1M1Nw>2B|6&l7EqGWBQj~C>)lz zw+_l%g>u0V5-9x17si7HErN183I%zd7X$Z#PMipj5KNVB=L$lol+PCyBpA z;sjh7fjm)EMg+qU6_s5$e7~1u=et}j zIZ1KkB4IIg4Ig(8TuUV=c`xyPdpK}dZqp>hb=uVb-=T0+qDX?XMj};&X36N&p34$j z<#&cO929ID4w+PqObsz29?Qx`Xn@5Nrld?@2bu&^MJ(4Gqzr?Ao!!%Vq;*E?j@Ak- z{+ifGhb0kL3+5vE4aa9E{hhI7Bv%H9@C`bW-xsaEH!lE0zE6kgqOsgnQq+&&c!!wr# zfL$P0Y=z-)VZwpH{%VRwm$rn6E(TPMtl~hPu+7i}HY5kOsl^r%{nk$fD3Rzu!+}AV z=>n2&uMv{Kk`GVXO@ai0xO#Z_<#26#S3==&COS#PLU|}CmKRmq4f}kWC{Gk62E}Z1 zw^)0S-WtmD#4J}IWEj+8F2nA)+09z5jw{MkSqxWiUo({uvWk|<5duA zl8T!kixq11V(r0kX6a@HTb{6db7rp%ncy4*Mg=(Tt`jWjld;r2xk*a(FYAKkqvWa@3tGl23Wb@5!hx`h zmTN|ym-oF;{~MB3hl}nh}9rEIDY} z7FYpW!@;r#CL9E8ttcl2V+n^xYQ_^JMNl=RmGh1tXk96kR|+K~DdH@TC4nZns>Xtp z@q$nwC>2W$g@c})4#ir;);Ja;f^rH4Xh-FVqSYRRbTfn|^n|%LFxd8Z@V9~t-LIi) z9eM&T8QE%aVG~2lGFO9eFrDuadw_5-4NUzaGHHX5oGOyDTdu(69P-Kv*HW*p+=g>V zta>DGHa7*!U4nATyINJ21Y{lyD@C!Od=j{3kcT!=6tMlsHNp~v>h$s)Xvb4W7l^nbZD~Jkq+|puNRi$!PWx5TYH`xaW(6iF z7hAbea6E8>4ncXN9U?O?FUPs)uw*0;1xZ>52aM&HPqZ%)3*1G^i<97@Sojn&$pO2_ zQf{K zh=;@`DKix3>XGGuZ+P@3rOkBtvD0s(4f8Dy>&g`Fs;359HHgABIikmJVo zQ6ecY@gQJZO##ja-TXEl=8v?(c8^D1azrXNj3kfC-=w{`PNyt$BM-C=3CnfD^8V2V z10#u85Isnm96)qb%pC^FqM&V(MUDrPEHc`fKlt4rbvHwQirs$^2~e%LAk$J%W=n&E zsFRr~)!EAhyp^+>78t-t$!`oc)kX54k}N&etJvM*QHcw2rsOM+n$2E*5-rIVC8v`lhw zb^wW4EI+kevXvH~d3mn8KhhQ?S4Ar>Xh}e1To^n~`%rA7azr6pyS!o2ieej+OlMNV zJrWjzEl-46u@D3N2pZAc?r&Xi!}4s#wmW=*xMEuI13~$LkZ^mFyVrMj8A<-&KkMs^ z<)=f3<+H(1&AJyCCwO5b)S>XidA8Wevqf-+b0`Z0?MQKGxMW7#rUzA<9-L~r=+UM} zitdV;6oOC%Hcjic11)YuL1j>A0m~s96N9uR@yPZhS|5XmCxWOz6(p@rgROmUbX_s6 zNM*M>`U51_2|q%TfqYM2uG3;D8Ou+CWqB~rVbHvw-A`)_g&C+rIqTg40g2flOb>d` zqz8mH0s;b5bh0BL1a0>SbVXKt?jDitpDASs26^1`fq+rr>c)V3~KI6ZOWuD(LT*CE>H&YJtnpY3{oKRMYMVWc?4Bp zD;Ti)5i2J$0+N^}f`f_j0(8C)8YcwhcY@NfTj%r-{cm-X*IPz%O^~F;NYaNOxxM{< zd)r~TyDP!qqahE5!^;LiIaf`QJ0Xw^8rcBygG62$xg5zOP!vKqP#`ch$^qM{ZhP7F zx~OQ=BU#vR1j7nOpzeifJl`CnYkWV{kdd}nUwr|6$mxp zNh%j0w8NI8k<|-WQUC!F3kFhF05%1t|1=DUVJIk~Um6dI94pM#Gd*Xcu$Tqi8qFm{))q+pmyF!*R_TwfDdZ#Me<=zTCQcpsRyWF!cw zZom-5HbH>Gl+cbE)rUbkm?%lo`(lO?uoi)Q$GaF%bQ-6_3Lg=L3bIr- z07HU+Cx&xPd_M>?gwt4J3O#Y69KeMUBGc%Ckf8!>x`~X{so{rB3D`6ndQL#lw*6&G zX@i+p3t{^kN>CLfsvd(}==a}$pU*3mEPJzbs!+aDBtJ2dTnt#HrAV%_z(;c)fpU9| z@jYB8EO*}@_-GJmdYf|Qap(GUR2g0b7DmVr%3lb*XI=fpg6vS##98w;RONu zavu@U4GppXv!$fqhYGOKh8TW0qy(0%AH{M=06`t1oPeTj8q6RM0Vxnug6KH>eK2?P zzL%OUepk|1kO#LX4+%-F)~!laKtNriKMu-m!E1p8ki0{g$0>V_C@itd084C&#a zG6KHf2W?1N0T#4D3D6S|3q2(zU=;jg7Xn2aHUyca1XVsZ7!9laENhIGzg7s!dur6# zU}5x z!|IgLw*0X2KdARZETm|I05X22RvrQdNFyTEhe$-wWOp9uF=~H39-fm3;N2!ILGnOv zkd)%+dy?}Xf{wA2QY@uGv`_i3hihLL%Y{b6VgJn=YMO6c$hd#m|6m1;2evUO@-65P zi6jD2G@;Yx4i%)60SqWo*^v5?z__aPif}O$xHFXdtnoSM;lOMnEC4S-9Ab^`IU-VZ z2%5)y1vr(590!abBEsrJC?dKWbf%EKX#1Gn`vm1CZAw9siUG1Kx3@i#Ys^=ElrKD# zeCDpx+Fhk>xlLF~G#rjvtww{cdz=z(Y{>qH1-7!p@f+bu-w3II)Y?x#K^k5WCh-*k zvLR%Iu%NIy5vas+;ZUY*AbiaOEr2ce!P-0#hiJLKhjM=j|1&Dt{~&;j)p4K?K}2-B zG}`@7nyGVnNmw$Hn-0l$R1T0AVxGG)W}CD{`77nRKGLQXBzJQx?`hSEbgH)7^OFmj zB|dM_ta#f0p)HNk1Za+61*BFK0Q-s1s3?_?xSA>&I`a!1HT#ipSkL!S_e{YDD_ z>&hjq|EAS`&_9R>s|GOq5B5LgA&7`;=tCIoF~nigYb>MNFE1+;sZ^P1cXdzxpSKSW zgd{E5d%QKd5KD(GuMo=BZ4c!dVY&XEv8-p^oqe)|uAFpeJJ6o5bmffz!Jy^{X@5CH zB340~8V(TLC3l34;sd~lNRbj6pE8(GP!wsgFE=TL76A4Fw%Qkq0R-)^+CNFv0BT%Y zRPNV^Kp$}=4g&!s{4ag$__9Nk38f>~?a!Y#9g^I8B}fvM1fEM*x7R+pg?A;_d<08L zb!lG`mc2IR3{)NaZ{?{&Ww16u=>&ry1ux+?08N0vZABt!N*Jj`kP^bAEbyf=B2p;G zp%UX~;93{>&t!0=M4QkU#XiIRqSzma0Z`k86i6c?uJ*%E0*!($BGPg{I!8mhnLh2* zjn2_UZG))H&t(4Lkd!t$*1Qs8u0}^Yk)d0a3Z8?KkmXcX?kRF@Ib_Flqp3fl%$|XMCd|#6aMG4E^g5fHCjK+EKUG z8j{TC^XDH^LXtF(+7c;P`u8P+xGGr60qaUX+j`@aYYXMEpD7+Hd{Jvv`+YjWt6#q! z2UY^Go#8_wrhtuJ7>4G7C?Ir~=piQzRRNfPG>0hY0tORsn9z`jG~^NznJM){_<_nU z%ma#Q{q?}dUY=3uM_lYrv_OA??6ZBN-cbULqc{MB{~1sC-7@G>K1cGZKbYWn%bLgc z?-fhll|XWhD+KPuU3E~dN@l9W>(g;)C2-o(4B)gdCwxLq z_ykFiz7ryaXlgG(aPu><3mH^m-jps*3LzSHA(5#R0L|i-`c2FOP}!Ad5-CvNCc)1n zTA;MpFK|N)lpg?S8V~8;>wcfNKYPZFA8EZ~Q>ERTs~aXJ6-!3YBPnUD!;-HdZkO^E zg+FMkuIi|0iuT%NwKb>F+XHg&ody`q2}nL3!>k(U z`nu2W3BGoXbtWv2mN*n7cXuBiL^9xz+-4||#&QjB-9brgreH~Du6R{YIQ%%eq)2ZK zXb%ng!^ZrL(T9peOy3DFO$y;U1uKz2A__l&STiheW1ay-AT}#}in7AY)^%;AAMK#S zTB`g&VOM(uZG$idRLC<7H$UUGALt2H_Gch%f-oUY$vz2*>*nP#<$(14ekSY#tIHWl z74rD^Bz*{$`nl?AvHZ!*^rpk|k(UdHPIcJ)$~T-ERd{=m0Hl`)Lqg2koWAj-~n%?+`FM@{HyB zV(|x>ghBRoj~XM|JM42OXDW}E`0Fo+q)0y8u3YmN0?9Q8r55xU%NZl7;c$C79CE@_ zt97Xyt|QjtbfrGB;C??r2kTp zlu|5zMKDv5-9brMYB*3lT=Id%zqB6l2}5Tuc05c3fiM^|3J`_6o(RON@Q#pY9NdtA zK?72d7UEurv=DwGPz7egtUrN~EO>smsoz8?u+rh4ofAnL_45R?kbW59Ye`!kGqL%^3rL~@2_;+bDuQ?lREwO zD1%hG-wQxsFb2Lqa2SJCz_V!~jAI}XhXw>1u-HC=;Z8*2*WWO>raH_Vs|%lq7K9%# ziU6$>C_j|wNAs@@39I~SX{Dc)KIsVn=O9%B8LybCVRpWK8w^IAs}RR%#`{v4hhdbJ zBe{E^NUnM;*8ycd^*fJ;<33-WMm5@mDgd!*Va)fd0z?^L46?F>e??uT=s8HlJGmqn zRw2j>p#e+t!eM#@@KqtJHQ_28u{zcjWXZSwT3W}!&Cl5J6Af!FEO66`+kasdQ$Xy1 z*$q2@PfiAI%Jbr3VaEG@(tL+^r6Ng-{zB045-1f(hLXSUfx;n-hyN0k*@#Z^3g~{X z2gX~$^8G#gRzMQ)TweHOHR7=b%z6w)H^Zm+W+*X{X$23Bo?Pa)G9T3N(fWG?osTzy z$Y~uYzv_7rKkxoEypAPy(GL!(k1>l8xEqZV_PgVr)(4FDy=5GN8V`_^Et(_g5+cD; zr+&Mi^62A%UX2;KXmq=Ekh_I>;V{Yz;R_K=Et^}yU!5Uh6R}7GcDezt5SR?2Cm>A> zMFo~o0S|*GQkjqE`2lwyt)9jg#P)jTw&D}G0zvwfD19uiW2HW}0hkVqds>Sd`sW@K zyFHdpJ>cqeQo&nalham_WR&%z!ouCvf={3$bS4sjxx?kmfiGf(X1;53f)7=P*ZF|M%R4<$!iUgDNj&s=D$xfY7|=RU`lUyJC3ZU};|)Kj`Nj`w zo(7Ye_YNfWkvAgyPKqu|j#$q`ue!CjCtDlwFx7aVfFPoDJ|D?4lDGrgJu4AM*zpf z*w1NROclxRKh7|zc~ADCW;cSQ>b1P6z}0+K#T&%O!&w*)91sj;7IV9>e4tgg>JH5e zaSr6coDpb#yu?fDxv8iF^?TpL=~W#|s_Mv19#FtH zvJPVio^W^?6PP2EOZ{RJPhw*3Vxq}*bnh^7JDj<_BIA5G17a*W$@!Qp{FbWD0u?df!moag976qVi+KuhDl2-jMtnftR|z zSk1pGyzGP_xeKVCCy{uyjxtxOeWMZ{_`AduK0V|#JTL>dvM$UCQCSDagr)F&(=H}Z z|En`VN3Ub#_WhL%F*MWHX|2c^>lSA`zR0cuSRW88VL%X)b{v1LI1liKFR+8NRDKJV zFVJ_Xx&0g!hpldpDg@N>{<5g0Ki$sr{Fu!Gc~C`|+)=ZOx1%k&WN5-(c*5Xe-* zV;KBi4SpU`dnOuodo^qIt>yciu%(BJ>6*Hp0q}T&&5QCi92Dr9qU0cifcn&%%c z1EaD-z}r4yW(-80Sy-sG_6^6z=bP|`(YGo#5)qHGH5dw`jy@a|2JefQu2IGo6kg=& zGxW35AErD;AJfx=@#(Y2eBLaJD1EV2n%Py8wVDUS^o+24J|Hv^7?&gh5O^b7D839l z`O5$VUV^tezM;n>lJme55`zT`Zv*mB1__VhYD}T_s0O!=l&mo#9_`P@1fZC$frSe_ z6zcfU#f{+)5b~YT68LBY!99)9$MkghLUt0{o2}^R-~(E2Ke`SeT7skxh^*PGFILb#ES42!bET)9CHS&6q*^OWBPyvRE=0feFtdLCl~m>EZRt<#os zH6qx6Sx?Zf&v<*XChE_&DxS$8(eYUsPc>m|YgNAX33`-t-rwEv^z;=sJ$=Dn+%c3~ z5%)-*-#ILKCvs=Il+zhW#d1mkArT>1NynJn?lPGp*S}p=zvR%Lq1lo~zjaS7Q|$5)|NT;o!n}TMHL?$Q}ZH z-?MKIfgiMf(vqa}=iRw;uIDs#!Cw%zGT?xb)KU0%f~Dssd3*97uIae_M^N4ol;;u= z5)c{@)7(##BO=NK-YnTn0Cp~_-LifzRZS0J@26@WRrLPTbs&oseX*X$NcyrsuYuNV zlxa;_zIAEF#jAUh<7%MU!pIl(ZxXTwqOF*$DIsj(;q)Yv3jG-T6+e$cZWQPFBz)Rv z1ONu8@3LnP%XmbWC5vl1ax{x&Iw7eML0HnKj|fH5MTFOF=&-<8&ufGmwQ71Du&F>d zQ1jSSK-F7Nc|+9y(o-OVQxEhSRF%g(=n}~mKa^5)o~|8YWISB_!Od9*r+!5pdm!Xf za;_qH`ziQ8^#Z9#Vh}zi;RDIL>EU~VQp>TjDwan@!dv%5dftnY zRA5q=3P8D`{yot27vBeJWv77k@G-LftP{Ak$9j#js=RgZ|0U9FEsqQ}XZ(85jgJvO zE#MvMHr1dh8-ABbg?_DI4n79q-}#yB0g}@xOJkYbQg?|UBKE?Fc;_R6cjYvRh&&a5 zcTcG3x7w}J`vAmSm;)t(J}c@E9ejp31?+_Yqrc3BAX9U0A?BdiLQ%dBYZi3kC(N8` zwrnr{aA2u9b@2y1-&cB`9tu@kmY=6durdYz*4x$RbMSwDxKS+mE{OT*cYYK;Yh%}F ziMs?xgb4^mlCTUTVyY2AOCzGzF-|Qo=74!msNGTlx6$-Nyp{X+Jbxij2QN%|vaGUU?XMbl!bw43(fceHD^zOYS50ar+^N@KO-a+OP-U? zU;NZL_&02!1SD@{RH;CDyGv`$sRlSAWOE}T7(Iyy59Q2nZXn4Ez8v1lF-voSPMQnU zl3W1uACU_O9j$^BjXec7f{ZDcLSD|+|n+YTg4En*$<Lj$OIM&mzS`O4Z59N#(kkrDPJnVMm<|ZLYSZYMv<`Hp@h#)Mb z(o+->grxE1ID&4&=yZ&EU#j398~Z-J5!CFBz-zdTp(~R8z5{$IYhpm<8 zpzAuE+GT3;D$#=#kD4>NsPGy+FmvUnKuXWQs?!jB2c&+ zmd?PZUMs$Dkd&FA)a8)WLHKfBG9Hqo&U73%O_bf;+$@d=`Z?j|_7Sn?BjVOa#O(|+ z9r$t}8Ng`ABpG19Vc%!OdhwOOsP&%GW1tos1B3J!sARsw-Za=AgO&?>?9pN?cw2oA ztaw+>w>}~$Bs3X-T9=kh1|ppf0gfvHym?F)hqY^j zQU@Y#7&dy*J`B1PaNG$puC;52J^yI9tXp|b&|@DCXlv`B<04*nr9vjO;G+pKx#y2Ncf1jlZfyk zAzSg>dr|)6#S9b?xDdoBi?p90|i7#Lb<7Ka7=m@;%zLy4iTOFDAL5->V;!%Fnb7^c8^ z34@rx!&*U>4q{VLrcPq>L@XismuOV^BEhvg#ZtEppMAP37Yo^p1P6a16`X?wErxQ( zhlJnUKLmV55+QNtL*m?rgj5fFNLWP%Q9ly^^$0T`>uo>VBm`&$N% zLHbhlG0Wctr+eSxEmd zw-vf9HQw^RJH2o`n-T5f7T7Y%te2hxnF?>lPobfTRbyF01$Ei-EG%rc&_53X2DE!P zXk|FIf~=5-HMR=0Deq<6Jzww7^m^dtG!q6>r_iFcpe03B{zCTJfkL_1`SsV@AG*11 zNDz`9%c79D@gbpD=B|5CWI&dst~iCgFjZ0(7M2R39_y8%-PJ=wjsXdaF(z*@-~kUyNV;+Nu6D=2ZXKk5 zc23YJmeh{5kfJJ|hH`8=10P1RKl*iRivUDO$oKf&ea2Xtkof6C;>L%>4gXE2G9n#F z6d5{-O8|d){-@rXqR!-}V8>cD@=VjFq0%g?&&CST zcgqg+A#tuhhC@Pkx4a-tNG!a;irDT+{-?4mqtC8l^b!MZ1=fpgR`lSp)Pw)2 zJRdMU8b*g_B{=j{AjEsoJrD!fv`+&AdxKuBEHATLrvzc!puU5HmU<-=(QSV^4=rn= zC1Fv*x25L*=BRiTE+I)E(vtrJl6vqy5|Rp~P9l|KQjy$hw_m>=Z}FaSA@QgoftZkx zm==eGfP278^8q+&Iem7ZzcLOgWkxO;(-+^K%R8@MPqygv=@XLf2T5Q6Nq_PRl)!T4VnU&e1vs%De~>D0hLNdOsK|#94;Mj` z0Y0S};4iTr7YBh_@Me+jW&pAc!W+k~s)H8TwjS6vGd?XK-J!oTbXy|8g9=vw-v|_V zr@WbDBPo*nhT~GI%n+3`@WThTYf&h#t~`|0MzglF!-NYtI`1fyvaq|S`N{iWwl_n$ zpe0E1`ymnFVCE_W`KrJ%I=nxFt{ipMvO+x7T;XC6EAhgcU?RnX;cDiK?5-)k#pJ3Q zB_!%Q&?+rCB+PIWcqPCaBh=qvVvYcw(rs#w0l$RYH|>$uorhA=PL^%RIM{PqgyaW8 z(qnn$u^et~Rcp2V9r|rmD)ky+sWCD0F`-b(SlM&Gy{}e$Oyt}9#Tj5QWfLB1>a-}5 ztI%r|Ef{|AGBo+267R|Aag7vj6x<95O6aVl$UcT!68zG_uK1w<4zdk^n^_p@m}J>D z(5ps(SMehhLwgJiQKVn=bgHj6xk5}uw&BG&D@<)Ll!VZpQz-Kq?(c6ks_p$=x3yF0 z59w@|OxVPPFeN@F9yBIAmRBCjc_6s@6ZT2I0R#R?$33sezYcVGnN0zYlN1n|e3hMjjCk&)7~TalAz{wV3d2>h~a3x*M14k5V;EwiA!Oz(o| z!T{oW5XcWW>T*crF(H~}zrAPJ-e|yp z;7Y~U=)h3VOi1#h9B^2W17fVQ%>mUm50jN4y#(UsGN_1WhEn+@rd9_SdIC9h4rp31;Eh!GimOfya{F+GHkvRPalH&q zqRSwB^U{+5E@{qVI~$n!79$uTSxQAM5S$f~6I#Io0c1LqRvvI2g;_$bLR+UUc@S9` zc6H7U0Sx7hZ!@1ck&a?{mA~1fCy&CjHlO$D=hiy(BX_jHztVCs!H-KSt4Q+x)|k*; zx$s!Fys}28DXo<9rAM>7wmRyY$mpyy*lh*@bDMi+m73rR1BsqC`R4k=%%77g1 z*Jx3mNp&v%ilA(@_V<_CZHj2Wy{{xD6iF3S`k){r70WiMLDAa=POuV7;06NRq-iz0?2;5MpnxW(%;wG)i(X-@6f%hvA@idpDr^t01@ET zR)k|hf0T#vW}!hLVtXWkvD!XX*a7hiG~HOez3I9MBv-cW#@Hk#S)eycME4yB20>Yk zb#=9XP+7_iFTkuC=PN(a1j;&iUzy2=kk-NZ#*pba37+&Muxz?`3KConIM&`Ml!~QS zJl=LM+DDY_H1;dicDvaoEa{rvXb?{%V}t4(69W95#DoULjDD12DY77r37q{9*u~14 zSYd~z8|dxJv%my#$pX=L6N~KP#+$GJkU>ymbam=)VhI&UsJ1|*gF=JFiF#kDz}8CZ zV1NfQJvj;HUSf+$Rvj+ZcqFexMWsmQuQ{n7uzSYQQM*l-kK<#)uiK@%N`)3_GurLz zwm|vFP--fxLGkE=A{R!l=-IEHN5}$uWm%xH!ZKYqkl3Nk3VFZL*ufGn64{M$A1pcw zGA2qafi{}!JVWDiW`%W(xG-o5m5wo&DzFu=Gs~qLEu}gg>8wkT>4dmB`#UH32E3y6 zlh-3J|C*E3^Y(=PBbyX3?c@FC^6_Pp?p>$Nc7@o4W^2@L&)XY>WgHY9O8r3^6q*G> zSOY&yR@NZzhr&*i0_6RY23k#}rh#geY|=m=o;F$)9R()w&(zo;5Y)igKnb+m+5k*C zybV+{2Zs|&rNiqCb`}Yj9!RR;azcm)XFnq@GGyLJgyh2mA$j#kYav{t-(aIwrCMuJ z@wIY#)TH}a!yhJBXt03w8AFN0{{+)5;e!lOC13S)SKG`#b8LzmK>{O-SV4tph3antB_%x;6KIf9mLYD;?IbYf-suQpO1Rp1#B&pm z2U@sG=0cHAwQhH3r&ZaiQMev2FHa_o=7e_R@$vZNqIuHo(S|*xO<$M&twF(1ra>|L z_Dx^+IQ-FH0bz}8u#jQL=%|S`m6&eXd_E8KmY1g03SP)#Qv=Y`KLbr-=rb#%go3J& zKf`b;Lj1HGacCzXo(-w=_$au>QQ#0KB*l}N&6W8wedww->uarc zIjT4)X^}$oWK?ZZdf06Cxl-NkA}Dl!UkQ|XP|PkaU~>nHt9eh9R7oC)jvAO=BM%%e zLsJPKWYbfl8arhEu)DLpbvO%RS!Gr&5Kx6eO3-IeP>GTfh+FRZa6W>9P8&{OXT-kKu{;Zv7d#j_kQVS_{s(wLrP%nGZ0N0+qXQChDG{UmB>h zXrHk;A>7$8!3gSvi!kz?bP$*B1h>+iML+ZWjy)|9Nk;kY8@>1TAG?l++Zqz=R=TJC zb7R)~&8?&VzkaE1w`;ZG+bPQ(5x)^}?v>%GuwETM5O&;>FueYm)&EUw{rx3{Ql)Y; z7LexxsdBXGhHk0`!*xFA7-Kb~&g}hz>t=3%n`kM$r{JPjLMUvse-%yL2rvjG} z>V%ak{pC|7>{%aY2zTOfCIa+hPYe8>6G_7OjZqfWsT*&a|GH6YBFWzk(BYYX-AvQh zo4xUSrl*CGH_iF8e=2_UPX+&p_8&0kLY1Cf$yA+t-D7wnapyL;l+tAzLY~X+{h`rf ztOj#b`L6-2A&G9Oi>ZMz=kAWrRB6WEpqgV7mG<%71&5 zzkK^b|Ka~ORaI@bS~ny8X#OIE7Qyo{@)w6@AiL+b*&B0EOnf^M@v$J1gwhsF_f%Mk zfJl0C4l2DDsV+X;l-0S=rN>S%E%*l%{6wB}V^q*3g+|+NUC=SaX-2-Z{QDM(iz|q_ zrM^FYL4Q0Ujz3A>d&ozK;J zd%doXBQIrD*Ny9bpt4eoeZOXuYEzq1sWTJ5+6p$>sV;oL>4C6M#!vbhm~#(N@G(4r zX1W?Y5i8 z_4+&zf<3R_4Xw9~{CH%Pcq;e>Vt~A;|Qa}O;M+Dsafi**i@24e;l!t-jd8W z$l=PQ%l~IaY27R$`SBn9Y>sbln-x7#>vhE_c@}subxr?Xv}-D_FE8{~(Ef*!)8ojm zYsQX{6H50~xY6lAmx(NSX-Lho;$PGPatzG43nyVqVvs6DJ_EVj{wK)c%16y{8$W|A zIw%2646^f*zB?|ZSbiN6XncDdlBB;!bb4mcj8T8w-yA#E!izQVXS*@s^l=I7}KA3)HPgPzgtgL-*y)wNu2u9)D=;w?nPZ2MoFL~ za(*oA)`>shYyQ`aRLOE_{ojP^KT3XP`;X0Fj2xqLZbk~aWI803?*F|j@5d#TXoyKC zRy4=?bv}KNkx#Na?yXq7{qOQ6Uk=OwIVNV36JHof zxV--t$b~N%jZ0pYOBoTp@x_Li4x8h$2MQ||$c>8}inUm4Np=t-;KfF%LqNW?{x?MO zcTRn{(ce|qv_;ft0cotqPkn?J=xc*l}@^@m%*9G^A)~8;#?cCBYw)HfvKNa2S(Tr5X>kI$Z z%U43)Gx9z{PRvj0i+?P*Btuz0DwF_03eqhr+myy zen0c6XFCiX&>&^b-w(Xr2o=ty526JM9RkhqFmO_6u|O`p*c3TI59KI_-0G`aL;aw> zn&-AJ+qP)i?e?{<*K5u1i)|m+Q~YXck@t+eXXGs-uh$N_dn^nJK(HEM5=It){A9$^ z0RYH-%|{;fnUNoXT%P$5Mw>X%y+7s?N<>Y{c32Ph5gkz25cE2a99Kd^fJu-mBu*yC z;l(m?tOh3t5fb?adi%#63m+5jVEVEw3MxRauXQ!)Rnav2{WwikcOA}ex2-V|@;*eq zA1%tSyc)oW%NGFHvDumrCl0qo19@mfV@e7q04UKO`2;5#6(BqTFiM09B4o~)a3WR) z$b|;oKl4TJxcE;Z4|8WT28=+C)gYrn|E>t-JWpn#&)B1=R>jOw4_(!DtF~#(-b@4i z*Bum67vy5GR1-&<8;_ zcj(JkfLew9Pv^wu-N!0Mj$9c=zU)B@0mkbP{!@POm;Xr<`VJpLDlqOA&|0bUPsKc! z=CLJ}YgbiN1Xrt$e+Zd#wCK;I+Vs$IKCv-rc5Jy zJe-9QqY;S{mp}CR%Yjw29Eg1$Vn=(1i&Gz#124jD4zm9_EV_@ILxTM8=y?kd8c{+( z-T`^2LlAOlz`%!CL|)f#=b|X=R~=eEc6)kn_WQEz$m7v%LlujT;%q?H-;tjgxn|@K zMp-g)&B!}LEGIu0fs{dC0pLI`7yT(I`q&SS%SAucAoHibqd4{9pzlZHoCY7ZKQ&T> z&3JkQJeX`Y79=8$5Zp(JT(-P5BZvP25gN)F5Tbe>}Q zJqVJc$Fyw~pH5B$x7Noa@!#!~Qo}$MfR-Uw^tan{+s`v2uL$}6K*;+YBOe&~jZuoC zKP@cfO2{csLV!VxT&4ne`eJTo6K8<#ov zsg07dYjsE)-f$n08ztJGdE~-)!j0}o4~6oCxUi=HQ%UEEn2(|T-txLfljd>-8^IePKaL@fC5R`E#F%&VBLx zs~d+@XnvyK?Ng(wDaZ{SlJ4g#l0$7{9MPfBU!?CkJ#Td1r2b2)JSF1}^AtKy(A>y? zt*WxT-I(C{Y>RHw-1*sn=hpN+At&ZW6Z1k5bABPC{G+P>NUDCHlmN^>S?00#ijg;* z`>JRHD%|M}V2*1gEb}T-U*m&c#V8w>8XC#2$O}YR3~X1V#i08c1OzpV{Ed(c-&Gn< z2n&1O-wovnjO4Duw6yJ+ebt~cio7Fw-BC?6($sCA-PG%Sz2z8oKN%per1%8BdyZfm#8S&d3L{AM?m?mX3ph;*5_u#vKqC8!1mxa-Qay-U{0xuw}4q z?ZZq4Ulq-`IOZiYKQZ&xF^BZ}V)U1tbFUDywnEc;e- zW9GGEUNiHvW$t4E9dpzGB!o)QEx*;37mi!%I7_YlASCCaV3LOReMP~a$_tB)4cCA~bE`XM zzH!Vi%)I%dtsd&W{%ds~%nR7<^g;|by^Hxfih%NwKeh`N`wfWy!i9_ULg_R{A+SCH z42FYaUV?cjwclqb4p9;;9A~Muz-x?{x8^{PYB9Gh{fQy-uOai!Gv^IFJzZd)ulpxa z_aV9kqfPH(E{2avvGx4(VTs(gMGsfYTTW4shC$0G5+l zSaC)W?2^?2$JuG^%U)yanA^|6%s&^$T-JRse}v36mpkrG2 zp|^v1?z|rh?i*Dm{mc%28~o--X~7MfQQ}+Vw8LqE$C{T~m^rL=SS`@nL*|2+WMJm} zbrC%~dbZ5lC9%=ZHBHQ1&+`xVdYK|n7CGkcFZ|DWHZk24PBefy{B|+j8Vl~q8I5RR zqn|01Mp&${n7~{~ryUv-1P3rb$~gvaILJW;gn)xN(tp9cn5LoYv%dyQ0=C~IiaT~GOlR>~peBIoG z5k`HG6AeOQp0D}Jj{s=;6~$XxAM|;PBvxlP$QE`B=JdiP=GBuqlD+PyMdrx%q8AG0 zQfi5q3$LA-9|p2Jh7DBK+$;kZETx(G!NSXI_AuHM*sNVR&E~^D;Wi@gwPWV_$`6NG zR(`SD6Dz{JFvaM;Ob9JV^%Bfsv`FSXEG8%|V4l^OV&)%I;xR>1i}%_+b7~+E z?qR6Bye4NEyx7>%JHJ{n^A$0V=2zlr1~wZpzyh@q6D%;8!^)3@U+nf=>c8CW-66E% ngN`9aCo#(@Mtso2Bme#XI%FS9sbacP00000NkvXXu0mjfxjKaL diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/FeatheredKnife.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/FeatheredKnife.png deleted file mode 100644 index 89a0e261e0fd08113ba6fc6fe6f13420e0895ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57026 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 b#MS=+4FnM5ZQnqd00000NkvXXu0mjf#`d(4 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Gaia.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Gaia.png deleted file mode 100644 index 3efc61bec4affee2d6d8e676ef9033eef235ea05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73058 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

  • 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 diff --git a/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Ellipsoid.png b/src/main/resources/assets/bloodmagic/textures/misc/screenshots/rituals/Ellipsoid.png deleted file mode 100644 index 139bf18125df970605dd8a876ab152d33fdf9e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89596 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 uA?Is*V-bP{ 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